a8b50f5109
---ci---
project: ci
phase: 6
milestone: v0.9
status: complete
artifacts:
tags: [v0.9.0]
decisions:
- id: D-047
decision: v0.9 theme = Distribution & Expansion
rationale: npm publish + OpenAI/Anthropic backends + agent flesh + parallel execution
confidence: 0.92
- id: D-049
decision: Feature milestone — patch tags v0.8.1-v0.8.6 then v0.9.0
rationale: OpenAI backend, agent flesh, npm publish all feat
confidence: 0.95
- id: D-059
decision: Rename OllamaBaseBackend to LLMBaseBackend + thin OllamaBaseBackend subclass
rationale: 15 of 17 methods backend-agnostic
confidence: 0.92
- id: D-060
decision: OpenAI/Anthropic backends use native fetch() not SDK packages
rationale: No dependency bloat; fetch native in Node 18+
confidence: 0.85
- id: D-066
decision: Concurrency limiter internal (no p-limit dependency)
rationale: 15 lines; avoids dependency for trivial feature
confidence: 0.90
- id: D-067
decision: Promise.allSettled for review agents at orchestrator lines 373-400
rationale: Current sequential loop replaced with parallel execution
confidence: 0.88
requirements:
covered: [PUBLISH-01, PUBLISH-02, PUBLISH-03, PUBLISH-04, OPENAI-01, OPENAI-02, OPENAI-03, OPENAI-04, OPENAI-05, FLESH-01, FLESH-02, FLESH-03, FLESH-04, FLESH-05, ANTHROPIC-01, ANTHROPIC-02, FLESH-06, FLESH-07, NPM-01, NPM-02, PARALLEL-01, PARALLEL-02, PARALLEL-03, INTEG-01, INTEG-02, INTEG-03, INTEG-04, INTEG-05]
---/ci---
6 phases, 28 tasks, 4077 net lines added, 57 test suites, 527 tests, zero stub agents
72 lines
2.4 KiB
TypeScript
72 lines
2.4 KiB
TypeScript
import { IntelligenceBackend, BackendConfigSection, BackendUnavailableError } from "./types.js";
|
|
import { OpencodeBackend } from "./opencode.js";
|
|
import { OpenAIBackend } from "./openai.js";
|
|
import { OllamaLocalBackend } from "./ollama-local.js";
|
|
import { OllamaCloudBackend } from "./ollama-cloud.js";
|
|
import { AnthropicBackend } from "./anthropic.js";
|
|
|
|
const AUTO_DETECT_ORDER: Array<"opencode" | "openai" | "ollama-local" | "ollama-cloud" | "anthropic"> = [
|
|
"opencode",
|
|
"openai",
|
|
"ollama-local",
|
|
"ollama-cloud",
|
|
"anthropic",
|
|
];
|
|
|
|
export function createBackend(
|
|
name: string,
|
|
config: BackendConfigSection
|
|
): IntelligenceBackend {
|
|
switch (name) {
|
|
case "opencode":
|
|
return new OpencodeBackend(config.agent_backends.opencode);
|
|
case "openai":
|
|
if (!config.llm_backends["openai"]) {
|
|
throw new BackendUnavailableError("openai");
|
|
}
|
|
return new OpenAIBackend(config.llm_backends["openai"]);
|
|
case "ollama-local":
|
|
return new OllamaLocalBackend(config.llm_backends["ollama-local"]);
|
|
case "ollama-cloud":
|
|
return new OllamaCloudBackend(config.llm_backends["ollama-cloud"]);
|
|
case "anthropic":
|
|
if (!config.llm_backends["anthropic"]) {
|
|
throw new BackendUnavailableError("anthropic");
|
|
}
|
|
return new AnthropicBackend(config.llm_backends["anthropic"]);
|
|
default:
|
|
throw new BackendUnavailableError(name);
|
|
}
|
|
}
|
|
|
|
export async function resolveBackend(
|
|
config: BackendConfigSection
|
|
): Promise<IntelligenceBackend> {
|
|
if (config.provider !== "auto") {
|
|
const backend = createBackend(config.provider, config);
|
|
if (!(await backend.isAvailable())) {
|
|
throw new BackendUnavailableError(config.provider);
|
|
}
|
|
return backend;
|
|
}
|
|
|
|
for (const name of AUTO_DETECT_ORDER) {
|
|
try {
|
|
const backend = createBackend(name, config);
|
|
if (await backend.isAvailable()) {
|
|
return backend;
|
|
}
|
|
} catch {}
|
|
}
|
|
|
|
throw new BackendUnavailableError("auto");
|
|
}
|
|
|
|
export { IntelligenceBackend, BackendConfigSection, BackendUnavailableError } from "./types.js";
|
|
export { LLMBaseBackend, ChatMessage, ChatCompletionResponse } from "./llm-base.js";
|
|
export { ToolRegistry, ToolDefinition, ToolCall, ToolResult } from "./tool-registry.js";
|
|
export { OpencodeBackend } from "./opencode.js";
|
|
export { OpenAIBackend } from "./openai.js";
|
|
export { OllamaLocalBackend } from "./ollama-local.js";
|
|
export { OllamaCloudBackend } from "./ollama-cloud.js";
|
|
export { AnthropicBackend } from "./anthropic.js"; |