export interface ProviderDef { name: string; label: string; transport: 'native' | 'acp' | 'pty'; modelSource: 'llama-swap' | 'static' | 'probe'; staticModels?: Array<{ id: string; label: string }>; /** Merge llama-swap models into probed list (OpenCode). */ mergeLlamaSwap?: boolean; } /** * Model discovery rules (see provider-snapshot.ts): * - boocode: llama-swap only * - opencode: ACP probe + mergeLlamaSwap (prefixed llama-swap/* ids) * - qwen: ACP probe + merge ~/.qwen/settings.json; PTY fallback reads settings only * - cursor: ACP probe + cursor-agent models CLI fallback * - goose / copilot: ACP probe only * - claude: static manifest models + thinking options */ export const PROVIDERS: ProviderDef[] = [ { name: 'boocode', label: 'BooCoder', transport: 'native', modelSource: 'llama-swap', }, { name: 'cursor', label: 'Cursor Agent', transport: 'acp', modelSource: 'probe', }, { name: 'opencode', label: 'OpenCode', transport: 'acp', modelSource: 'probe', mergeLlamaSwap: true, }, { name: 'goose', label: 'Goose', transport: 'acp', modelSource: 'probe', }, { name: 'claude', label: 'Claude Code', transport: 'pty', modelSource: 'static', staticModels: [ { id: 'claude-opus-4-20250514', label: 'Opus 4' }, { id: 'claude-sonnet-4-20250514', label: 'Sonnet 4' }, ], }, { name: 'qwen', label: 'Qwen Code', transport: 'acp', modelSource: 'probe', }, { name: 'copilot', label: 'GitHub Copilot', transport: 'acp', modelSource: 'probe', }, ]; export const PROVIDERS_BY_NAME = new Map(PROVIDERS.map((p) => [p.name, p])); /** External agents probed on host (excludes native boocode). */ export const PROBED_AGENT_NAMES = PROVIDERS.filter((p) => p.name !== 'boocode').map((p) => p.name);