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:
parent
d8d7ad16f3
commit
1efcb13869
27 changed files with 276 additions and 49 deletions
20
v2/src/lib/providers/claude.ts
Normal file
20
v2/src/lib/providers/claude.ts
Normal 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',
|
||||
};
|
||||
26
v2/src/lib/providers/registry.svelte.ts
Normal file
26
v2/src/lib/providers/registry.svelte.ts
Normal 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);
|
||||
}
|
||||
34
v2/src/lib/providers/types.ts
Normal file
34
v2/src/lib/providers/types.ts
Normal 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>;
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue