3.3 KiB
3.3 KiB
Agent Provider Adapter — Progress
Session Log
2026-03-11 — Planning Phase
Duration: ~30 min
What happened:
- Explored 13+ files across Rust backend, TypeScript bridges, Svelte UI, and JS sidecar to map Claude-specific coupling
- Classified coupling into 4 severity levels (CRITICAL/HIGH/MEDIUM/LOW)
- Ran /ultra-think for deep architectural analysis — evaluated 3 design options for sidecar routing, message adapters, and settings UI
- Made 6 architecture decisions (PA-1 through PA-6)
- Created 3-phase implementation plan (16 + 5 + 3 tasks)
- Created planning files: task_plan.md, findings.md, progress.md
Architecture decisions made:
- PA-1: Per-provider sidecar binaries (not single multi-SDK bundle)
- PA-2: Generic provider_config blob in AgentQueryOptions
- PA-3: Per-provider message adapter files → common AgentMessage type
- PA-4: Provider selection per-project with global default
- PA-5: Capability flags drive UI rendering (not provider ID checks)
- PA-6: Providers section in SettingsTab scroll (not inner tabs)
Status: Planning complete. Ready for Phase 1 implementation.
2026-03-11 — Implementation (All 3 Phases)
Duration: ~60 min
What happened:
Phase 1 — Core Abstraction Layer (16 tasks):
- Created provider types (ProviderId, ProviderCapabilities, ProviderMeta, ProviderSettings)
- Created Svelte 5 rune-based provider registry (registry.svelte.ts)
- Created Claude provider meta constant (claude.ts)
- Renamed sdk-messages.ts → claude-messages.ts, updated 13+ import references
- Created message adapter registry (message-adapters.ts) with per-provider routing
- Updated Rust AgentQueryOptions with
providerandprovider_configfields (serde defaults for backward compat) - Updated agent-bridge.ts TypeScript options
- Renamed agent-runner.ts → claude-runner.ts, rebuilt dist bundle
- Added provider field to ProjectConfig (groups.ts)
- Renamed ClaudeSession.svelte → AgentSession.svelte with provider awareness
- Updated agent-dispatcher.ts with sessionProviderMap for provider-based message routing
- Updated AgentPane.svelte with capability-driven rendering (hasProfiles, hasSkills, supportsResume gates)
- Created provider-bridge.ts (generic adapter delegating to provider-specific bridges)
- Registered CLAUDE_PROVIDER in App.svelte onMount
- Updated all test mocks (dispatcher test: adaptMessage mock with provider param)
- Verified: 202 vitest + 42 cargo tests pass
Phase 2 — Settings UI (5 tasks):
- Added "Providers" section to SettingsTab with collapsible per-provider config panels
- Each panel: enabled toggle, default model input, capabilities badge display
- Added per-project provider dropdown in project cards (conditional on >1 provider)
- Provider settings persisted as JSON blob via
provider_settingssettings key - AgentPane already capability-aware from Phase 1
Phase 3 — Sidecar Routing (3 tasks):
- Refactored resolve_sidecar_command() → resolve_sidecar_for_provider(provider) — looks for
{provider}-runner.mjs - query() validates provider runner exists before sending message
- Extracted strip_provider_env_var() — strips CLAUDE*/CODEX*/OLLAMA* env vars (whitelists CLAUDE_CODE_EXPERIMENTAL_*)
Status: All 3 phases complete. 202 vitest + 42 cargo tests pass. Zero regression.