feat(provider-adapter): implement multi-provider abstraction layer (Phase 1)

Add provider types, registry, capabilities, and message adapter registry.
Rename sdk-messages→claude-messages, agent-runner→claude-runner,
ClaudeSession→AgentSession. Update Rust AgentQueryOptions with provider
and provider_config fields. Capability-driven AgentPane rendering.
This commit is contained in:
Hibryda 2026-03-11 02:08:45 +01:00
parent d8d7ad16f3
commit 1efcb13869
27 changed files with 276 additions and 49 deletions

View file

@ -0,0 +1,20 @@
// Claude Provider — metadata and capabilities for Claude Code
import type { ProviderMeta } from './types';
export const CLAUDE_PROVIDER: ProviderMeta = {
id: 'claude',
name: 'Claude Code',
description: 'Anthropic Claude Code agent via SDK',
capabilities: {
hasProfiles: true,
hasSkills: true,
hasModelSelection: true,
hasSandbox: false,
supportsSubagents: true,
supportsCost: true,
supportsResume: true,
},
sidecarRunner: 'claude-runner.mjs',
defaultModel: 'claude-sonnet-4-20250514',
};

View file

@ -0,0 +1,26 @@
// Provider Registry — singleton registry of available providers (Svelte 5 runes)
import type { ProviderId, ProviderMeta } from './types';
const providers = $state(new Map<ProviderId, ProviderMeta>());
export function registerProvider(meta: ProviderMeta): void {
providers.set(meta.id, meta);
}
export function getProvider(id: ProviderId): ProviderMeta | undefined {
return providers.get(id);
}
export function getProviders(): ProviderMeta[] {
return Array.from(providers.values());
}
export function getDefaultProviderId(): ProviderId {
return 'claude';
}
/** Check if a specific provider is registered */
export function hasProvider(id: ProviderId): boolean {
return providers.has(id);
}

View file

@ -0,0 +1,34 @@
// Provider abstraction types — defines the interface for multi-provider agent support
export type ProviderId = 'claude' | 'codex' | 'ollama';
/** What a provider can do — UI gates features on these flags */
export interface ProviderCapabilities {
hasProfiles: boolean;
hasSkills: boolean;
hasModelSelection: boolean;
hasSandbox: boolean;
supportsSubagents: boolean;
supportsCost: boolean;
supportsResume: boolean;
}
/** Static metadata about a provider */
export interface ProviderMeta {
id: ProviderId;
name: string;
description: string;
capabilities: ProviderCapabilities;
/** Name of the sidecar runner file (e.g. 'claude-runner.mjs') */
sidecarRunner: string;
/** Default model identifier, if applicable */
defaultModel?: string;
}
/** Per-provider configuration (stored in settings) */
export interface ProviderSettings {
enabled: boolean;
defaultModel?: string;
/** Provider-specific config blob */
config: Record<string, unknown>;
}