feat: Agent Orchestrator — multi-project agent dashboard
Tauri + Svelte 5 + Rust application for orchestrating multiple AI coding agents. Includes Claude, Aider, Codex, and Ollama provider support, multi-agent communication (btmsg/bttask), session anchors, plugin sandbox, FTS5 search, Landlock sandboxing, and 507 vitest + 110 cargo tests.
This commit is contained in:
commit
3672e92b7e
272 changed files with 68600 additions and 0 deletions
32
src/lib/providers/aider.ts
Normal file
32
src/lib/providers/aider.ts
Normal file
|
|
@ -0,0 +1,32 @@
|
|||
// Aider Provider — metadata and capabilities for Aider (OpenRouter / multi-model agent)
|
||||
|
||||
import type { ProviderMeta } from './types';
|
||||
|
||||
export const AIDER_PROVIDER: ProviderMeta = {
|
||||
id: 'aider',
|
||||
name: 'Aider',
|
||||
description: 'Aider AI coding agent — supports OpenRouter, OpenAI, Anthropic and local models',
|
||||
capabilities: {
|
||||
hasProfiles: false,
|
||||
hasSkills: false,
|
||||
hasModelSelection: true,
|
||||
hasSandbox: false,
|
||||
supportsSubagents: false,
|
||||
supportsCost: false,
|
||||
supportsResume: false,
|
||||
},
|
||||
sidecarRunner: 'aider-runner.mjs',
|
||||
defaultModel: 'openrouter/anthropic/claude-sonnet-4',
|
||||
models: [
|
||||
{ id: 'openrouter/anthropic/claude-sonnet-4', label: 'Claude Sonnet 4 (OpenRouter)' },
|
||||
{ id: 'openrouter/anthropic/claude-haiku-4', label: 'Claude Haiku 4 (OpenRouter)' },
|
||||
{ id: 'openrouter/openai/gpt-4.1', label: 'GPT-4.1 (OpenRouter)' },
|
||||
{ id: 'openrouter/openai/o3', label: 'o3 (OpenRouter)' },
|
||||
{ id: 'openrouter/google/gemini-2.5-pro', label: 'Gemini 2.5 Pro (OpenRouter)' },
|
||||
{ id: 'openrouter/deepseek/deepseek-r1', label: 'DeepSeek R1 (OpenRouter)' },
|
||||
{ id: 'openrouter/meta-llama/llama-4-maverick', label: 'Llama 4 Maverick (OpenRouter)' },
|
||||
{ id: 'anthropic/claude-sonnet-4-5-20250514', label: 'Claude Sonnet 4.5 (direct)' },
|
||||
{ id: 'o3', label: 'o3 (OpenAI direct)' },
|
||||
{ id: 'ollama/qwen3:8b', label: 'Qwen3 8B (Ollama)' },
|
||||
],
|
||||
};
|
||||
25
src/lib/providers/claude.ts
Normal file
25
src/lib/providers/claude.ts
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
// 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-opus-4-6',
|
||||
models: [
|
||||
{ id: 'claude-opus-4-6', label: 'Opus 4.6' },
|
||||
{ id: 'claude-sonnet-4-6', label: 'Sonnet 4.6' },
|
||||
{ id: 'claude-haiku-4-5-20251001', label: 'Haiku 4.5' },
|
||||
],
|
||||
};
|
||||
25
src/lib/providers/codex.ts
Normal file
25
src/lib/providers/codex.ts
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
// Codex Provider — metadata and capabilities for OpenAI Codex CLI
|
||||
|
||||
import type { ProviderMeta } from './types';
|
||||
|
||||
export const CODEX_PROVIDER: ProviderMeta = {
|
||||
id: 'codex',
|
||||
name: 'Codex CLI',
|
||||
description: 'OpenAI Codex CLI agent via SDK',
|
||||
capabilities: {
|
||||
hasProfiles: false,
|
||||
hasSkills: false,
|
||||
hasModelSelection: true,
|
||||
hasSandbox: true,
|
||||
supportsSubagents: false,
|
||||
supportsCost: false,
|
||||
supportsResume: true,
|
||||
},
|
||||
sidecarRunner: 'codex-runner.mjs',
|
||||
defaultModel: 'gpt-5.4',
|
||||
models: [
|
||||
{ id: 'gpt-5.4', label: 'GPT-5.4' },
|
||||
{ id: 'o3', label: 'o3' },
|
||||
{ id: 'o4-mini', label: 'o4-mini' },
|
||||
],
|
||||
};
|
||||
27
src/lib/providers/ollama.ts
Normal file
27
src/lib/providers/ollama.ts
Normal file
|
|
@ -0,0 +1,27 @@
|
|||
// Ollama Provider — metadata and capabilities for local Ollama models
|
||||
|
||||
import type { ProviderMeta } from './types';
|
||||
|
||||
export const OLLAMA_PROVIDER: ProviderMeta = {
|
||||
id: 'ollama',
|
||||
name: 'Ollama',
|
||||
description: 'Local Ollama models via REST API',
|
||||
capabilities: {
|
||||
hasProfiles: false,
|
||||
hasSkills: false,
|
||||
hasModelSelection: true,
|
||||
hasSandbox: false,
|
||||
supportsSubagents: false,
|
||||
supportsCost: false,
|
||||
supportsResume: false,
|
||||
},
|
||||
sidecarRunner: 'ollama-runner.mjs',
|
||||
defaultModel: 'qwen3:8b',
|
||||
models: [
|
||||
{ id: 'qwen3:8b', label: 'Qwen3 8B' },
|
||||
{ id: 'qwen3:32b', label: 'Qwen3 32B' },
|
||||
{ id: 'llama3.3:70b', label: 'Llama 3.3 70B' },
|
||||
{ id: 'deepseek-r1:14b', label: 'DeepSeek R1 14B' },
|
||||
{ id: 'codellama:13b', label: 'Code Llama 13B' },
|
||||
],
|
||||
};
|
||||
26
src/lib/providers/registry.svelte.ts
Normal file
26
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);
|
||||
}
|
||||
36
src/lib/providers/types.ts
Normal file
36
src/lib/providers/types.ts
Normal file
|
|
@ -0,0 +1,36 @@
|
|||
// Provider abstraction types — defines the interface for multi-provider agent support
|
||||
|
||||
export type ProviderId = 'claude' | 'codex' | 'ollama' | 'aider';
|
||||
|
||||
/** 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;
|
||||
/** Available model presets for dropdown selection */
|
||||
models?: { id: string; label: 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