@esankhan3/anvil-agent-core 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +142 -0
- package/dist/__tests__/adapter-enrichment.test.d.ts +12 -0
- package/dist/__tests__/adapter-enrichment.test.d.ts.map +1 -0
- package/dist/__tests__/adapter-enrichment.test.js +199 -0
- package/dist/__tests__/adapter-enrichment.test.js.map +1 -0
- package/dist/__tests__/adk-anthropic-llm.test.d.ts +18 -0
- package/dist/__tests__/adk-anthropic-llm.test.d.ts.map +1 -0
- package/dist/__tests__/adk-anthropic-llm.test.js +124 -0
- package/dist/__tests__/adk-anthropic-llm.test.js.map +1 -0
- package/dist/__tests__/cost-breakdown.test.d.ts +11 -0
- package/dist/__tests__/cost-breakdown.test.d.ts.map +1 -0
- package/dist/__tests__/cost-breakdown.test.js +163 -0
- package/dist/__tests__/cost-breakdown.test.js.map +1 -0
- package/dist/__tests__/mcp.test.d.ts +13 -0
- package/dist/__tests__/mcp.test.d.ts.map +1 -0
- package/dist/__tests__/mcp.test.js +413 -0
- package/dist/__tests__/mcp.test.js.map +1 -0
- package/dist/__tests__/ollama-adapter-agentic.test.d.ts +15 -0
- package/dist/__tests__/ollama-adapter-agentic.test.d.ts.map +1 -0
- package/dist/__tests__/ollama-adapter-agentic.test.js +268 -0
- package/dist/__tests__/ollama-adapter-agentic.test.js.map +1 -0
- package/dist/__tests__/ollama-adapter-executor.test.d.ts +10 -0
- package/dist/__tests__/ollama-adapter-executor.test.d.ts.map +1 -0
- package/dist/__tests__/ollama-adapter-executor.test.js +95 -0
- package/dist/__tests__/ollama-adapter-executor.test.js.map +1 -0
- package/dist/__tests__/openai-adapter-output.test.d.ts +17 -0
- package/dist/__tests__/openai-adapter-output.test.d.ts.map +1 -0
- package/dist/__tests__/openai-adapter-output.test.js +127 -0
- package/dist/__tests__/openai-adapter-output.test.js.map +1 -0
- package/dist/__tests__/opencode-adapter.test.d.ts +7 -0
- package/dist/__tests__/opencode-adapter.test.d.ts.map +1 -0
- package/dist/__tests__/opencode-adapter.test.js +141 -0
- package/dist/__tests__/opencode-adapter.test.js.map +1 -0
- package/dist/__tests__/openrouter-adapter-agentic.test.d.ts +11 -0
- package/dist/__tests__/openrouter-adapter-agentic.test.d.ts.map +1 -0
- package/dist/__tests__/openrouter-adapter-agentic.test.js +297 -0
- package/dist/__tests__/openrouter-adapter-agentic.test.js.map +1 -0
- package/dist/__tests__/router-circuit-breaker.test.d.ts +6 -0
- package/dist/__tests__/router-circuit-breaker.test.d.ts.map +1 -0
- package/dist/__tests__/router-circuit-breaker.test.js +253 -0
- package/dist/__tests__/router-circuit-breaker.test.js.map +1 -0
- package/dist/__tests__/router-config-loader.test.d.ts +8 -0
- package/dist/__tests__/router-config-loader.test.d.ts.map +1 -0
- package/dist/__tests__/router-config-loader.test.js +172 -0
- package/dist/__tests__/router-config-loader.test.js.map +1 -0
- package/dist/__tests__/router-discovery.test.d.ts +5 -0
- package/dist/__tests__/router-discovery.test.d.ts.map +1 -0
- package/dist/__tests__/router-discovery.test.js +129 -0
- package/dist/__tests__/router-discovery.test.js.map +1 -0
- package/dist/__tests__/router-fallback.test.d.ts +9 -0
- package/dist/__tests__/router-fallback.test.d.ts.map +1 -0
- package/dist/__tests__/router-fallback.test.js +283 -0
- package/dist/__tests__/router-fallback.test.js.map +1 -0
- package/dist/__tests__/router-local-executor.test.d.ts +6 -0
- package/dist/__tests__/router-local-executor.test.d.ts.map +1 -0
- package/dist/__tests__/router-local-executor.test.js +193 -0
- package/dist/__tests__/router-local-executor.test.js.map +1 -0
- package/dist/__tests__/router-model-registry.test.d.ts +8 -0
- package/dist/__tests__/router-model-registry.test.d.ts.map +1 -0
- package/dist/__tests__/router-model-registry.test.js +389 -0
- package/dist/__tests__/router-model-registry.test.js.map +1 -0
- package/dist/__tests__/router-rate-limiter.test.d.ts +8 -0
- package/dist/__tests__/router-rate-limiter.test.d.ts.map +1 -0
- package/dist/__tests__/router-rate-limiter.test.js +128 -0
- package/dist/__tests__/router-rate-limiter.test.js.map +1 -0
- package/dist/__tests__/router-resolver.test.d.ts +7 -0
- package/dist/__tests__/router-resolver.test.d.ts.map +1 -0
- package/dist/__tests__/router-resolver.test.js +110 -0
- package/dist/__tests__/router-resolver.test.js.map +1 -0
- package/dist/__tests__/router-retry.test.d.ts +7 -0
- package/dist/__tests__/router-retry.test.d.ts.map +1 -0
- package/dist/__tests__/router-retry.test.js +302 -0
- package/dist/__tests__/router-retry.test.js.map +1 -0
- package/dist/__tests__/router-scaffold.test.d.ts +11 -0
- package/dist/__tests__/router-scaffold.test.d.ts.map +1 -0
- package/dist/__tests__/router-scaffold.test.js +103 -0
- package/dist/__tests__/router-scaffold.test.js.map +1 -0
- package/dist/__tests__/router-spend-ledger.test.d.ts +8 -0
- package/dist/__tests__/router-spend-ledger.test.d.ts.map +1 -0
- package/dist/__tests__/router-spend-ledger.test.js +227 -0
- package/dist/__tests__/router-spend-ledger.test.js.map +1 -0
- package/dist/__tests__/router-telemetry.test.d.ts +11 -0
- package/dist/__tests__/router-telemetry.test.d.ts.map +1 -0
- package/dist/__tests__/router-telemetry.test.js +173 -0
- package/dist/__tests__/router-telemetry.test.js.map +1 -0
- package/dist/__tests__/single-shot.test.d.ts +12 -0
- package/dist/__tests__/single-shot.test.d.ts.map +1 -0
- package/dist/__tests__/single-shot.test.js +204 -0
- package/dist/__tests__/single-shot.test.js.map +1 -0
- package/dist/__tests__/skills-prompt.test.d.ts +11 -0
- package/dist/__tests__/skills-prompt.test.d.ts.map +1 -0
- package/dist/__tests__/skills-prompt.test.js +208 -0
- package/dist/__tests__/skills-prompt.test.js.map +1 -0
- package/dist/__tests__/skills.test.d.ts +11 -0
- package/dist/__tests__/skills.test.d.ts.map +1 -0
- package/dist/__tests__/skills.test.js +161 -0
- package/dist/__tests__/skills.test.js.map +1 -0
- package/dist/__tests__/telemetry-integration.test.d.ts +12 -0
- package/dist/__tests__/telemetry-integration.test.d.ts.map +1 -0
- package/dist/__tests__/telemetry-integration.test.js +153 -0
- package/dist/__tests__/telemetry-integration.test.js.map +1 -0
- package/dist/__tests__/telemetry.test.d.ts +13 -0
- package/dist/__tests__/telemetry.test.d.ts.map +1 -0
- package/dist/__tests__/telemetry.test.js +161 -0
- package/dist/__tests__/telemetry.test.js.map +1 -0
- package/dist/__tests__/upstream-error.test.d.ts +8 -0
- package/dist/__tests__/upstream-error.test.d.ts.map +1 -0
- package/dist/__tests__/upstream-error.test.js +186 -0
- package/dist/__tests__/upstream-error.test.js.map +1 -0
- package/dist/adk-adapter.d.ts +45 -0
- package/dist/adk-adapter.d.ts.map +1 -0
- package/dist/adk-adapter.js +403 -0
- package/dist/adk-adapter.js.map +1 -0
- package/dist/adk-anthropic-llm.d.ts +59 -0
- package/dist/adk-anthropic-llm.d.ts.map +1 -0
- package/dist/adk-anthropic-llm.js +397 -0
- package/dist/adk-anthropic-llm.js.map +1 -0
- package/dist/agent/index.d.ts +14 -0
- package/dist/agent/index.d.ts.map +1 -0
- package/dist/agent/index.js +14 -0
- package/dist/agent/index.js.map +1 -0
- package/dist/agent/session/__tests__/bridge-tool-executor.test.d.ts +10 -0
- package/dist/agent/session/__tests__/bridge-tool-executor.test.d.ts.map +1 -0
- package/dist/agent/session/__tests__/bridge-tool-executor.test.js +152 -0
- package/dist/agent/session/__tests__/bridge-tool-executor.test.js.map +1 -0
- package/dist/agent/session/__tests__/collect-trajectory.test.d.ts +18 -0
- package/dist/agent/session/__tests__/collect-trajectory.test.d.ts.map +1 -0
- package/dist/agent/session/__tests__/collect-trajectory.test.js +208 -0
- package/dist/agent/session/__tests__/collect-trajectory.test.js.map +1 -0
- package/dist/agent/session/__tests__/run-with-agent.test.d.ts +8 -0
- package/dist/agent/session/__tests__/run-with-agent.test.d.ts.map +1 -0
- package/dist/agent/session/__tests__/run-with-agent.test.js +98 -0
- package/dist/agent/session/__tests__/run-with-agent.test.js.map +1 -0
- package/dist/agent/session/__tests__/runtime.test.d.ts +7 -0
- package/dist/agent/session/__tests__/runtime.test.d.ts.map +1 -0
- package/dist/agent/session/__tests__/runtime.test.js +361 -0
- package/dist/agent/session/__tests__/runtime.test.js.map +1 -0
- package/dist/agent/session/__tests__/skills-mcp-spawn.test.d.ts +15 -0
- package/dist/agent/session/__tests__/skills-mcp-spawn.test.d.ts.map +1 -0
- package/dist/agent/session/__tests__/skills-mcp-spawn.test.js +160 -0
- package/dist/agent/session/__tests__/skills-mcp-spawn.test.js.map +1 -0
- package/dist/agent/session/__tests__/spawn-telemetry.test.d.ts +13 -0
- package/dist/agent/session/__tests__/spawn-telemetry.test.d.ts.map +1 -0
- package/dist/agent/session/__tests__/spawn-telemetry.test.js +135 -0
- package/dist/agent/session/__tests__/spawn-telemetry.test.js.map +1 -0
- package/dist/agent/session/__tests__/types.test.d.ts +9 -0
- package/dist/agent/session/__tests__/types.test.d.ts.map +1 -0
- package/dist/agent/session/__tests__/types.test.js +220 -0
- package/dist/agent/session/__tests__/types.test.js.map +1 -0
- package/dist/agent/session/adapter.d.ts +108 -0
- package/dist/agent/session/adapter.d.ts.map +1 -0
- package/dist/agent/session/adapter.js +39 -0
- package/dist/agent/session/adapter.js.map +1 -0
- package/dist/agent/session/collect-trajectory.d.ts +36 -0
- package/dist/agent/session/collect-trajectory.d.ts.map +1 -0
- package/dist/agent/session/collect-trajectory.js +193 -0
- package/dist/agent/session/collect-trajectory.js.map +1 -0
- package/dist/agent/session/default-adapter-factory.d.ts +48 -0
- package/dist/agent/session/default-adapter-factory.d.ts.map +1 -0
- package/dist/agent/session/default-adapter-factory.js +227 -0
- package/dist/agent/session/default-adapter-factory.js.map +1 -0
- package/dist/agent/session/headless-types.d.ts +85 -0
- package/dist/agent/session/headless-types.d.ts.map +1 -0
- package/dist/agent/session/headless-types.js +16 -0
- package/dist/agent/session/headless-types.js.map +1 -0
- package/dist/agent/session/index.d.ts +18 -0
- package/dist/agent/session/index.d.ts.map +1 -0
- package/dist/agent/session/index.js +20 -0
- package/dist/agent/session/index.js.map +1 -0
- package/dist/agent/session/language-model-bridge.d.ts +84 -0
- package/dist/agent/session/language-model-bridge.d.ts.map +1 -0
- package/dist/agent/session/language-model-bridge.js +454 -0
- package/dist/agent/session/language-model-bridge.js.map +1 -0
- package/dist/agent/session/legacy-adapter-types.d.ts +63 -0
- package/dist/agent/session/legacy-adapter-types.d.ts.map +1 -0
- package/dist/agent/session/legacy-adapter-types.js +11 -0
- package/dist/agent/session/legacy-adapter-types.js.map +1 -0
- package/dist/agent/session/run-with-agent.d.ts +36 -0
- package/dist/agent/session/run-with-agent.d.ts.map +1 -0
- package/dist/agent/session/run-with-agent.js +81 -0
- package/dist/agent/session/run-with-agent.js.map +1 -0
- package/dist/agent/session/session-registry.d.ts +71 -0
- package/dist/agent/session/session-registry.d.ts.map +1 -0
- package/dist/agent/session/session-registry.js +209 -0
- package/dist/agent/session/session-registry.js.map +1 -0
- package/dist/agent/session/session.d.ts +76 -0
- package/dist/agent/session/session.d.ts.map +1 -0
- package/dist/agent/session/session.js +327 -0
- package/dist/agent/session/session.js.map +1 -0
- package/dist/agent/session/types.d.ts +230 -0
- package/dist/agent/session/types.d.ts.map +1 -0
- package/dist/agent/session/types.js +44 -0
- package/dist/agent/session/types.js.map +1 -0
- package/dist/checkpoint/__tests__/blob-store.test.d.ts +5 -0
- package/dist/checkpoint/__tests__/blob-store.test.d.ts.map +1 -0
- package/dist/checkpoint/__tests__/blob-store.test.js +82 -0
- package/dist/checkpoint/__tests__/blob-store.test.js.map +1 -0
- package/dist/checkpoint/__tests__/key.test.d.ts +7 -0
- package/dist/checkpoint/__tests__/key.test.d.ts.map +1 -0
- package/dist/checkpoint/__tests__/key.test.js +130 -0
- package/dist/checkpoint/__tests__/key.test.js.map +1 -0
- package/dist/checkpoint/__tests__/runner.test.d.ts +12 -0
- package/dist/checkpoint/__tests__/runner.test.d.ts.map +1 -0
- package/dist/checkpoint/__tests__/runner.test.js +201 -0
- package/dist/checkpoint/__tests__/runner.test.js.map +1 -0
- package/dist/checkpoint/__tests__/store.test.d.ts +6 -0
- package/dist/checkpoint/__tests__/store.test.d.ts.map +1 -0
- package/dist/checkpoint/__tests__/store.test.js +150 -0
- package/dist/checkpoint/__tests__/store.test.js.map +1 -0
- package/dist/checkpoint/blob-store.d.ts +41 -0
- package/dist/checkpoint/blob-store.d.ts.map +1 -0
- package/dist/checkpoint/blob-store.js +119 -0
- package/dist/checkpoint/blob-store.js.map +1 -0
- package/dist/checkpoint/index.d.ts +15 -0
- package/dist/checkpoint/index.d.ts.map +1 -0
- package/dist/checkpoint/index.js +14 -0
- package/dist/checkpoint/index.js.map +1 -0
- package/dist/checkpoint/key.d.ts +39 -0
- package/dist/checkpoint/key.d.ts.map +1 -0
- package/dist/checkpoint/key.js +112 -0
- package/dist/checkpoint/key.js.map +1 -0
- package/dist/checkpoint/runner.d.ts +83 -0
- package/dist/checkpoint/runner.d.ts.map +1 -0
- package/dist/checkpoint/runner.js +146 -0
- package/dist/checkpoint/runner.js.map +1 -0
- package/dist/checkpoint/store.d.ts +91 -0
- package/dist/checkpoint/store.d.ts.map +1 -0
- package/dist/checkpoint/store.js +292 -0
- package/dist/checkpoint/store.js.map +1 -0
- package/dist/checkpoint/types.d.ts +74 -0
- package/dist/checkpoint/types.d.ts.map +1 -0
- package/dist/checkpoint/types.js +16 -0
- package/dist/checkpoint/types.js.map +1 -0
- package/dist/claude-adapter.d.ts +23 -0
- package/dist/claude-adapter.d.ts.map +1 -0
- package/dist/claude-adapter.js +233 -0
- package/dist/claude-adapter.js.map +1 -0
- package/dist/cost.d.ts +67 -0
- package/dist/cost.d.ts.map +1 -0
- package/dist/cost.js +148 -0
- package/dist/cost.js.map +1 -0
- package/dist/data/model-prices.json +39681 -0
- package/dist/fallback-adapter.d.ts +51 -0
- package/dist/fallback-adapter.d.ts.map +1 -0
- package/dist/fallback-adapter.js +116 -0
- package/dist/fallback-adapter.js.map +1 -0
- package/dist/gemini-adapter.d.ts +22 -0
- package/dist/gemini-adapter.d.ts.map +1 -0
- package/dist/gemini-adapter.js +185 -0
- package/dist/gemini-adapter.js.map +1 -0
- package/dist/gemini-cli-adapter.d.ts +24 -0
- package/dist/gemini-cli-adapter.d.ts.map +1 -0
- package/dist/gemini-cli-adapter.js +169 -0
- package/dist/gemini-cli-adapter.js.map +1 -0
- package/dist/index.d.ts +39 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +39 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/client.d.ts +32 -0
- package/dist/mcp/client.d.ts.map +1 -0
- package/dist/mcp/client.js +92 -0
- package/dist/mcp/client.js.map +1 -0
- package/dist/mcp/config-loader.d.ts +36 -0
- package/dist/mcp/config-loader.d.ts.map +1 -0
- package/dist/mcp/config-loader.js +129 -0
- package/dist/mcp/config-loader.js.map +1 -0
- package/dist/mcp/index.d.ts +12 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +11 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/tool-merger.d.ts +18 -0
- package/dist/mcp/tool-merger.d.ts.map +1 -0
- package/dist/mcp/tool-merger.js +34 -0
- package/dist/mcp/tool-merger.js.map +1 -0
- package/dist/mcp/types.d.ts +35 -0
- package/dist/mcp/types.d.ts.map +1 -0
- package/dist/mcp/types.js +10 -0
- package/dist/mcp/types.js.map +1 -0
- package/dist/ollama-adapter.d.ts +95 -0
- package/dist/ollama-adapter.d.ts.map +1 -0
- package/dist/ollama-adapter.js +404 -0
- package/dist/ollama-adapter.js.map +1 -0
- package/dist/openai-adapter.d.ts +40 -0
- package/dist/openai-adapter.d.ts.map +1 -0
- package/dist/openai-adapter.js +81 -0
- package/dist/openai-adapter.js.map +1 -0
- package/dist/opencode-adapter.d.ts +39 -0
- package/dist/opencode-adapter.d.ts.map +1 -0
- package/dist/opencode-adapter.js +105 -0
- package/dist/opencode-adapter.js.map +1 -0
- package/dist/openrouter-adapter.d.ts +69 -0
- package/dist/openrouter-adapter.d.ts.map +1 -0
- package/dist/openrouter-adapter.js +481 -0
- package/dist/openrouter-adapter.js.map +1 -0
- package/dist/registry.d.ts +55 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +191 -0
- package/dist/registry.js.map +1 -0
- package/dist/router/circuit-breaker.d.ts +57 -0
- package/dist/router/circuit-breaker.d.ts.map +1 -0
- package/dist/router/circuit-breaker.js +110 -0
- package/dist/router/circuit-breaker.js.map +1 -0
- package/dist/router/config-loader.d.ts +43 -0
- package/dist/router/config-loader.d.ts.map +1 -0
- package/dist/router/config-loader.js +155 -0
- package/dist/router/config-loader.js.map +1 -0
- package/dist/router/discovery.d.ts +37 -0
- package/dist/router/discovery.d.ts.map +1 -0
- package/dist/router/discovery.js +54 -0
- package/dist/router/discovery.js.map +1 -0
- package/dist/router/errors.d.ts +39 -0
- package/dist/router/errors.d.ts.map +1 -0
- package/dist/router/errors.js +103 -0
- package/dist/router/errors.js.map +1 -0
- package/dist/router/index.d.ts +31 -0
- package/dist/router/index.d.ts.map +1 -0
- package/dist/router/index.js +20 -0
- package/dist/router/index.js.map +1 -0
- package/dist/router/local-executor.d.ts +62 -0
- package/dist/router/local-executor.d.ts.map +1 -0
- package/dist/router/local-executor.js +161 -0
- package/dist/router/local-executor.js.map +1 -0
- package/dist/router/model-registry.d.ts +90 -0
- package/dist/router/model-registry.d.ts.map +1 -0
- package/dist/router/model-registry.js +242 -0
- package/dist/router/model-registry.js.map +1 -0
- package/dist/router/rate-limiter.d.ts +63 -0
- package/dist/router/rate-limiter.d.ts.map +1 -0
- package/dist/router/rate-limiter.js +136 -0
- package/dist/router/rate-limiter.js.map +1 -0
- package/dist/router/resolver.d.ts +45 -0
- package/dist/router/resolver.d.ts.map +1 -0
- package/dist/router/resolver.js +71 -0
- package/dist/router/resolver.js.map +1 -0
- package/dist/router/retry.d.ts +58 -0
- package/dist/router/retry.d.ts.map +1 -0
- package/dist/router/retry.js +119 -0
- package/dist/router/retry.js.map +1 -0
- package/dist/router/router.d.ts +100 -0
- package/dist/router/router.d.ts.map +1 -0
- package/dist/router/router.js +306 -0
- package/dist/router/router.js.map +1 -0
- package/dist/router/spend-ledger.d.ts +69 -0
- package/dist/router/spend-ledger.d.ts.map +1 -0
- package/dist/router/spend-ledger.js +191 -0
- package/dist/router/spend-ledger.js.map +1 -0
- package/dist/router/telemetry.d.ts +48 -0
- package/dist/router/telemetry.d.ts.map +1 -0
- package/dist/router/telemetry.js +112 -0
- package/dist/router/telemetry.js.map +1 -0
- package/dist/router/types.d.ts +95 -0
- package/dist/router/types.d.ts.map +1 -0
- package/dist/router/types.js +16 -0
- package/dist/router/types.js.map +1 -0
- package/dist/single-shot.d.ts +60 -0
- package/dist/single-shot.d.ts.map +1 -0
- package/dist/single-shot.js +385 -0
- package/dist/single-shot.js.map +1 -0
- package/dist/skills/activator.d.ts +17 -0
- package/dist/skills/activator.d.ts.map +1 -0
- package/dist/skills/activator.js +24 -0
- package/dist/skills/activator.js.map +1 -0
- package/dist/skills/compose.d.ts +43 -0
- package/dist/skills/compose.d.ts.map +1 -0
- package/dist/skills/compose.js +53 -0
- package/dist/skills/compose.js.map +1 -0
- package/dist/skills/index.d.ts +17 -0
- package/dist/skills/index.d.ts.map +1 -0
- package/dist/skills/index.js +16 -0
- package/dist/skills/index.js.map +1 -0
- package/dist/skills/loader.d.ts +9 -0
- package/dist/skills/loader.d.ts.map +1 -0
- package/dist/skills/loader.js +49 -0
- package/dist/skills/loader.js.map +1 -0
- package/dist/skills/parser.d.ts +13 -0
- package/dist/skills/parser.d.ts.map +1 -0
- package/dist/skills/parser.js +60 -0
- package/dist/skills/parser.js.map +1 -0
- package/dist/skills/render.d.ts +11 -0
- package/dist/skills/render.d.ts.map +1 -0
- package/dist/skills/render.js +21 -0
- package/dist/skills/render.js.map +1 -0
- package/dist/skills/resolve-dir.d.ts +20 -0
- package/dist/skills/resolve-dir.d.ts.map +1 -0
- package/dist/skills/resolve-dir.js +30 -0
- package/dist/skills/resolve-dir.js.map +1 -0
- package/dist/skills/tool-policy.d.ts +26 -0
- package/dist/skills/tool-policy.d.ts.map +1 -0
- package/dist/skills/tool-policy.js +33 -0
- package/dist/skills/tool-policy.js.map +1 -0
- package/dist/skills/types.d.ts +42 -0
- package/dist/skills/types.d.ts.map +1 -0
- package/dist/skills/types.js +8 -0
- package/dist/skills/types.js.map +1 -0
- package/dist/stream-format.d.ts +100 -0
- package/dist/stream-format.d.ts.map +1 -0
- package/dist/stream-format.js +90 -0
- package/dist/stream-format.js.map +1 -0
- package/dist/telemetry/attributes.d.ts +38 -0
- package/dist/telemetry/attributes.d.ts.map +1 -0
- package/dist/telemetry/attributes.js +39 -0
- package/dist/telemetry/attributes.js.map +1 -0
- package/dist/telemetry/config.d.ts +30 -0
- package/dist/telemetry/config.d.ts.map +1 -0
- package/dist/telemetry/config.js +54 -0
- package/dist/telemetry/config.js.map +1 -0
- package/dist/telemetry/exporters.d.ts +10 -0
- package/dist/telemetry/exporters.d.ts.map +1 -0
- package/dist/telemetry/exporters.js +46 -0
- package/dist/telemetry/exporters.js.map +1 -0
- package/dist/telemetry/index.d.ts +15 -0
- package/dist/telemetry/index.d.ts.map +1 -0
- package/dist/telemetry/index.js +12 -0
- package/dist/telemetry/index.js.map +1 -0
- package/dist/telemetry/instrument.d.ts +36 -0
- package/dist/telemetry/instrument.d.ts.map +1 -0
- package/dist/telemetry/instrument.js +215 -0
- package/dist/telemetry/instrument.js.map +1 -0
- package/dist/telemetry/metrics.d.ts +45 -0
- package/dist/telemetry/metrics.d.ts.map +1 -0
- package/dist/telemetry/metrics.js +186 -0
- package/dist/telemetry/metrics.js.map +1 -0
- package/dist/telemetry/tracer.d.ts +33 -0
- package/dist/telemetry/tracer.d.ts.map +1 -0
- package/dist/telemetry/tracer.js +162 -0
- package/dist/telemetry/tracer.js.map +1 -0
- package/dist/tools/__tests__/builtin.test.d.ts +7 -0
- package/dist/tools/__tests__/builtin.test.d.ts.map +1 -0
- package/dist/tools/__tests__/builtin.test.js +242 -0
- package/dist/tools/__tests__/builtin.test.js.map +1 -0
- package/dist/tools/builtin.d.ts +29 -0
- package/dist/tools/builtin.d.ts.map +1 -0
- package/dist/tools/builtin.js +367 -0
- package/dist/tools/builtin.js.map +1 -0
- package/dist/tools/index.d.ts +4 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +3 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/path-guard.d.ts +23 -0
- package/dist/tools/path-guard.d.ts.map +1 -0
- package/dist/tools/path-guard.js +66 -0
- package/dist/tools/path-guard.js.map +1 -0
- package/dist/tools/types.d.ts +45 -0
- package/dist/tools/types.d.ts.map +1 -0
- package/dist/tools/types.js +11 -0
- package/dist/tools/types.js.map +1 -0
- package/dist/types.d.ts +249 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +22 -0
- package/dist/types.js.map +1 -0
- package/dist/upstream-error.d.ts +64 -0
- package/dist/upstream-error.d.ts.map +1 -0
- package/dist/upstream-error.js +105 -0
- package/dist/upstream-error.js.map +1 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +2 -0
- package/dist/version.js.map +1 -0
- package/package.json +49 -0
|
@@ -0,0 +1,404 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ollama adapter — HTTP API for local Ollama server, no npm dependencies.
|
|
3
|
+
*
|
|
4
|
+
* Base URL: OLLAMA_HOST env var or http://localhost:11434
|
|
5
|
+
* Streaming: NDJSON (not SSE) from POST /api/chat
|
|
6
|
+
*
|
|
7
|
+
* Two modes, picked at runtime by the presence of `config.toolExecutor`:
|
|
8
|
+
*
|
|
9
|
+
* 1. Single-shot chat — no tool executor. Drains one /api/chat
|
|
10
|
+
* response, emits text + result. Backwards-compatible with every
|
|
11
|
+
* caller that existed before agentic support landed.
|
|
12
|
+
*
|
|
13
|
+
* 2. Agentic loop — tool executor present. Each turn the adapter
|
|
14
|
+
* sends `tools: [...]` (OpenAI-compatible JSON Schema), parses
|
|
15
|
+
* `message.tool_calls` from the response, executes each call via
|
|
16
|
+
* the executor, appends the assistant + tool messages to history,
|
|
17
|
+
* and re-POSTs. Loops until the model returns no tool_calls or
|
|
18
|
+
* the `maxToolIterations` cap fires.
|
|
19
|
+
*
|
|
20
|
+
* Capabilities flip to `tier: 'agentic'` because the adapter now drives
|
|
21
|
+
* a full agentic loop. Stage-policy.yaml's build/validate/ship preferences
|
|
22
|
+
* for `local` are real — the adapter can hold its end of those stages.
|
|
23
|
+
*/
|
|
24
|
+
import { randomUUID } from 'node:crypto';
|
|
25
|
+
import { emitContent, emitResult, emitToolResult, emitToolUse } from './stream-format.js';
|
|
26
|
+
import { localExecutor } from './router/local-executor.js';
|
|
27
|
+
import { UpstreamError } from './upstream-error.js';
|
|
28
|
+
const DEFAULT_MAX_ITERATIONS = 32;
|
|
29
|
+
const DEFAULT_CONTEXT_WINDOW = 16_384;
|
|
30
|
+
/**
|
|
31
|
+
* Crude tokens-per-byte heuristic. Real tokenizer counts vary by model
|
|
32
|
+
* but for the purposes of OVERFLOW DETECTION (i.e. "are we about to
|
|
33
|
+
* blow num_ctx?") a 4-bytes-per-token approximation is conservative
|
|
34
|
+
* enough — we trim before we'd hit the wall, never after.
|
|
35
|
+
*/
|
|
36
|
+
const BYTES_PER_TOKEN = 4;
|
|
37
|
+
/**
|
|
38
|
+
* Soft trim threshold — when accumulated history reaches this fraction
|
|
39
|
+
* of num_ctx, drop oldest tool_result blocks. Keeps a safety margin so
|
|
40
|
+
* the prompt still has room to grow within one turn.
|
|
41
|
+
*/
|
|
42
|
+
const SOFT_TRIM_RATIO = 0.85;
|
|
43
|
+
/** Thrown when the conversation history can't be trimmed below num_ctx
|
|
44
|
+
* (e.g. one tool result alone exceeds the window). The dashboard
|
|
45
|
+
* resolver catches this and re-runs the stage with an escalation chain
|
|
46
|
+
* that skips local. */
|
|
47
|
+
export class ContextExhaustedError extends Error {
|
|
48
|
+
model;
|
|
49
|
+
numCtx;
|
|
50
|
+
historyTokens;
|
|
51
|
+
constructor(model, numCtx, historyTokens) {
|
|
52
|
+
super(`Conversation history (${historyTokens} tokens) exceeds num_ctx=${numCtx} for model "${model}" ` +
|
|
53
|
+
`even after trimming. Escalate to a model with a larger context window.`);
|
|
54
|
+
this.name = 'ContextExhaustedError';
|
|
55
|
+
this.model = model;
|
|
56
|
+
this.numCtx = numCtx;
|
|
57
|
+
this.historyTokens = historyTokens;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
function getBaseUrl() {
|
|
61
|
+
return (process.env.OLLAMA_HOST || 'http://localhost:11434').replace(/\/+$/, '');
|
|
62
|
+
}
|
|
63
|
+
// ───────────────────────────────────────────────────────────────────────
|
|
64
|
+
// Adapter
|
|
65
|
+
// ───────────────────────────────────────────────────────────────────────
|
|
66
|
+
export class OllamaAdapter {
|
|
67
|
+
executor;
|
|
68
|
+
provider = 'ollama';
|
|
69
|
+
capabilities = {
|
|
70
|
+
tier: 'agentic',
|
|
71
|
+
streaming: true,
|
|
72
|
+
toolUse: true,
|
|
73
|
+
fileSystem: true,
|
|
74
|
+
shellExecution: true,
|
|
75
|
+
sessionResume: false,
|
|
76
|
+
cache: 'none',
|
|
77
|
+
structuredOutput: 'best-effort',
|
|
78
|
+
maxOutputTokens: false,
|
|
79
|
+
};
|
|
80
|
+
/**
|
|
81
|
+
* In-flight AbortControllers — one per concurrent run() invocation.
|
|
82
|
+
* The adapter is a singleton, but per-repo stages (build/validate/
|
|
83
|
+
* specs/tasks) run multiple repos in parallel against it. A single
|
|
84
|
+
* instance-level field would let one call's `finally` block null out
|
|
85
|
+
* the controller while another is still mid-fetch, causing
|
|
86
|
+
* "Cannot read properties of null (reading 'signal')". The Set lets
|
|
87
|
+
* concurrent calls each own their own controller; kill() aborts all.
|
|
88
|
+
*/
|
|
89
|
+
activeControllers = new Set();
|
|
90
|
+
/**
|
|
91
|
+
* @param executor — Single-slot FIFO queue used when a call sets
|
|
92
|
+
* `config.exclusiveSlot === true`. Defaults to the process-wide
|
|
93
|
+
* singleton; tests inject a fresh instance for isolation.
|
|
94
|
+
*/
|
|
95
|
+
constructor(executor = localExecutor) {
|
|
96
|
+
this.executor = executor;
|
|
97
|
+
}
|
|
98
|
+
supportsModel(_modelId) {
|
|
99
|
+
// Only used when explicitly configured; auto-detection is via registry rules.
|
|
100
|
+
return false;
|
|
101
|
+
}
|
|
102
|
+
getModelPricing(_modelId) {
|
|
103
|
+
return [0, 0]; // local = free
|
|
104
|
+
}
|
|
105
|
+
async checkAvailability() {
|
|
106
|
+
const baseUrl = getBaseUrl();
|
|
107
|
+
try {
|
|
108
|
+
const res = await fetch(`${baseUrl}/api/tags`, { method: 'GET' });
|
|
109
|
+
if (res.ok)
|
|
110
|
+
return { available: true };
|
|
111
|
+
return { available: false, error: `Ollama returned ${res.status}` };
|
|
112
|
+
}
|
|
113
|
+
catch (err) {
|
|
114
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
115
|
+
return { available: false, error: `Cannot reach Ollama at ${baseUrl}: ${msg}` };
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
kill() {
|
|
119
|
+
for (const ac of this.activeControllers) {
|
|
120
|
+
try {
|
|
121
|
+
ac.abort();
|
|
122
|
+
}
|
|
123
|
+
catch { /* already aborted */ }
|
|
124
|
+
}
|
|
125
|
+
this.activeControllers.clear();
|
|
126
|
+
}
|
|
127
|
+
async run(config, output) {
|
|
128
|
+
if (config.exclusiveSlot) {
|
|
129
|
+
return this.executor.withModel(config.model, () => this.runInner(config, output));
|
|
130
|
+
}
|
|
131
|
+
return this.runInner(config, output);
|
|
132
|
+
}
|
|
133
|
+
async runInner(config, output) {
|
|
134
|
+
const abortController = new AbortController();
|
|
135
|
+
this.activeControllers.add(abortController);
|
|
136
|
+
const startMs = Date.now();
|
|
137
|
+
const messages = [];
|
|
138
|
+
if (config.projectPrompt)
|
|
139
|
+
messages.push({ role: 'system', content: config.projectPrompt });
|
|
140
|
+
messages.push({ role: 'user', content: config.userPrompt });
|
|
141
|
+
const tools = config.toolExecutor ? mapSchemasToOllama(config.toolExecutor.listSchemas()) : undefined;
|
|
142
|
+
const numCtx = config.contextWindow ?? DEFAULT_CONTEXT_WINDOW;
|
|
143
|
+
const maxIter = config.maxToolIterations ?? DEFAULT_MAX_ITERATIONS;
|
|
144
|
+
let aggregatedText = '';
|
|
145
|
+
let totalIn = 0;
|
|
146
|
+
let totalOut = 0;
|
|
147
|
+
let totalDurMs = 0;
|
|
148
|
+
let stopReason;
|
|
149
|
+
try {
|
|
150
|
+
for (let iter = 0; iter < maxIter; iter++) {
|
|
151
|
+
// Bound conversation history before each turn. Drops oldest
|
|
152
|
+
// tool_result blocks (least informative — the model already saw
|
|
153
|
+
// them once) keeping the system + user + recent turns intact.
|
|
154
|
+
// If trimming can't bring history below num_ctx, escalate.
|
|
155
|
+
trimHistoryIfNeeded(messages, numCtx, config.model);
|
|
156
|
+
const turn = await this.runOneTurn(messages, tools, numCtx, config, output, abortController.signal);
|
|
157
|
+
aggregatedText += turn.text;
|
|
158
|
+
totalIn += turn.inputTokens;
|
|
159
|
+
totalOut += turn.outputTokens;
|
|
160
|
+
totalDurMs += turn.durationMs;
|
|
161
|
+
if (turn.toolCalls.length === 0 || !config.toolExecutor) {
|
|
162
|
+
stopReason = turn.toolCalls.length === 0 ? 'end_turn' : 'tools_unsupported';
|
|
163
|
+
break;
|
|
164
|
+
}
|
|
165
|
+
// Append the assistant's tool-call turn to history so the model
|
|
166
|
+
// sees its own request when we re-prompt with results.
|
|
167
|
+
messages.push({
|
|
168
|
+
role: 'assistant',
|
|
169
|
+
content: turn.text,
|
|
170
|
+
tool_calls: turn.toolCalls,
|
|
171
|
+
});
|
|
172
|
+
// Execute every tool call. Sequential — parallel exec via the
|
|
173
|
+
// builtin executor is safe today (each tool is independent),
|
|
174
|
+
// but bash/edit ordering matters when the model chains them,
|
|
175
|
+
// so we serialize.
|
|
176
|
+
for (const toolCall of turn.toolCalls) {
|
|
177
|
+
const callId = randomUUID();
|
|
178
|
+
const args = normalizeArgs(toolCall.function.arguments);
|
|
179
|
+
const call = { id: callId, name: toolCall.function.name, arguments: args };
|
|
180
|
+
emitToolUse(output, call.name, args, callId);
|
|
181
|
+
const result = await invokeTool(config.toolExecutor, call, config.workingDir, abortController.signal);
|
|
182
|
+
emitToolResult(output, { toolUseId: callId, content: result.content, isError: result.isError });
|
|
183
|
+
messages.push({
|
|
184
|
+
role: 'tool',
|
|
185
|
+
content: result.content,
|
|
186
|
+
tool_call_id: callId,
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
if (abortController.signal.aborted) {
|
|
190
|
+
stopReason = 'aborted';
|
|
191
|
+
break;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
if (stopReason === undefined)
|
|
195
|
+
stopReason = 'iteration_limit';
|
|
196
|
+
}
|
|
197
|
+
finally {
|
|
198
|
+
this.activeControllers.delete(abortController);
|
|
199
|
+
}
|
|
200
|
+
const durationMs = totalDurMs > 0 ? totalDurMs : Date.now() - startMs;
|
|
201
|
+
emitResult(output, {
|
|
202
|
+
text: aggregatedText,
|
|
203
|
+
costUsd: 0,
|
|
204
|
+
inputTokens: totalIn,
|
|
205
|
+
outputTokens: totalOut,
|
|
206
|
+
durationMs,
|
|
207
|
+
});
|
|
208
|
+
return {
|
|
209
|
+
output: aggregatedText,
|
|
210
|
+
inputTokens: totalIn,
|
|
211
|
+
outputTokens: totalOut,
|
|
212
|
+
costUsd: 0,
|
|
213
|
+
durationMs,
|
|
214
|
+
provider: 'ollama',
|
|
215
|
+
model: config.model,
|
|
216
|
+
stopReason,
|
|
217
|
+
toolCallCount: countToolCalls(messages),
|
|
218
|
+
};
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* One round-trip with Ollama: send messages + tools, drain the NDJSON
|
|
222
|
+
* stream, return the assistant's text accumulator + any tool_calls
|
|
223
|
+
* the model emitted in the final chunk.
|
|
224
|
+
*/
|
|
225
|
+
async runOneTurn(messages, tools, numCtx, config, output, signal) {
|
|
226
|
+
const baseUrl = getBaseUrl();
|
|
227
|
+
const body = {
|
|
228
|
+
model: config.model,
|
|
229
|
+
messages,
|
|
230
|
+
stream: true,
|
|
231
|
+
options: { num_ctx: numCtx },
|
|
232
|
+
};
|
|
233
|
+
if (tools && tools.length > 0)
|
|
234
|
+
body.tools = tools;
|
|
235
|
+
if (typeof config.maxOutputTokens === 'number' && config.maxOutputTokens > 0) {
|
|
236
|
+
body.options.num_predict = config.maxOutputTokens;
|
|
237
|
+
}
|
|
238
|
+
const response = await fetch(`${baseUrl}/api/chat`, {
|
|
239
|
+
method: 'POST',
|
|
240
|
+
headers: { 'Content-Type': 'application/json' },
|
|
241
|
+
body: JSON.stringify(body),
|
|
242
|
+
signal,
|
|
243
|
+
});
|
|
244
|
+
if (!response.ok) {
|
|
245
|
+
const errBody = await response.text();
|
|
246
|
+
throw new UpstreamError(response.status, errBody, { provider: 'ollama' });
|
|
247
|
+
}
|
|
248
|
+
if (!response.body)
|
|
249
|
+
throw new UpstreamError(0, 'Ollama API returned no response body', { provider: 'ollama' });
|
|
250
|
+
const reader = response.body.getReader();
|
|
251
|
+
const decoder = new TextDecoder();
|
|
252
|
+
let buffer = '';
|
|
253
|
+
let text = '';
|
|
254
|
+
const toolCalls = [];
|
|
255
|
+
let inputTokens = 0;
|
|
256
|
+
let outputTokens = 0;
|
|
257
|
+
let durationMs = 0;
|
|
258
|
+
// Buffer text deltas and flush at line breaks (or every ~80 chars)
|
|
259
|
+
// so each activity card holds a readable chunk instead of one
|
|
260
|
+
// word per row.
|
|
261
|
+
let pendingText = '';
|
|
262
|
+
const FLUSH_THRESHOLD = 80;
|
|
263
|
+
while (true) {
|
|
264
|
+
const { done, value } = await reader.read();
|
|
265
|
+
if (done)
|
|
266
|
+
break;
|
|
267
|
+
buffer += decoder.decode(value, { stream: true });
|
|
268
|
+
const lines = buffer.split('\n');
|
|
269
|
+
buffer = lines.pop() ?? '';
|
|
270
|
+
for (const line of lines) {
|
|
271
|
+
const trimmed = line.trim();
|
|
272
|
+
if (!trimmed)
|
|
273
|
+
continue;
|
|
274
|
+
let chunk;
|
|
275
|
+
try {
|
|
276
|
+
chunk = JSON.parse(trimmed);
|
|
277
|
+
}
|
|
278
|
+
catch {
|
|
279
|
+
continue;
|
|
280
|
+
}
|
|
281
|
+
const msg = chunk.message;
|
|
282
|
+
if (msg?.content) {
|
|
283
|
+
text += msg.content;
|
|
284
|
+
pendingText += msg.content;
|
|
285
|
+
while (pendingText.includes('\n')) {
|
|
286
|
+
const nl = pendingText.indexOf('\n');
|
|
287
|
+
const lineOut = pendingText.slice(0, nl + 1);
|
|
288
|
+
emitContent(output, lineOut);
|
|
289
|
+
pendingText = pendingText.slice(nl + 1);
|
|
290
|
+
}
|
|
291
|
+
if (pendingText.length >= FLUSH_THRESHOLD) {
|
|
292
|
+
emitContent(output, pendingText);
|
|
293
|
+
pendingText = '';
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
if (msg?.tool_calls && msg.tool_calls.length > 0) {
|
|
297
|
+
toolCalls.push(...msg.tool_calls);
|
|
298
|
+
}
|
|
299
|
+
if (chunk.done === true) {
|
|
300
|
+
if (typeof chunk.prompt_eval_count === 'number')
|
|
301
|
+
inputTokens = chunk.prompt_eval_count;
|
|
302
|
+
if (typeof chunk.eval_count === 'number')
|
|
303
|
+
outputTokens = chunk.eval_count;
|
|
304
|
+
if (typeof chunk.total_duration === 'number')
|
|
305
|
+
durationMs = chunk.total_duration / 1_000_000;
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
// Flush trailing content not ending on a newline.
|
|
310
|
+
if (pendingText.length > 0) {
|
|
311
|
+
emitContent(output, pendingText);
|
|
312
|
+
}
|
|
313
|
+
return { text, toolCalls, inputTokens, outputTokens, durationMs };
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
// ───────────────────────────────────────────────────────────────────────
|
|
317
|
+
// Helpers
|
|
318
|
+
// ───────────────────────────────────────────────────────────────────────
|
|
319
|
+
function mapSchemasToOllama(schemas) {
|
|
320
|
+
return schemas.map((s) => ({
|
|
321
|
+
type: 'function',
|
|
322
|
+
function: {
|
|
323
|
+
name: s.name,
|
|
324
|
+
description: s.description,
|
|
325
|
+
parameters: s.inputSchema,
|
|
326
|
+
},
|
|
327
|
+
}));
|
|
328
|
+
}
|
|
329
|
+
function normalizeArgs(args) {
|
|
330
|
+
if (typeof args === 'object' && args !== null)
|
|
331
|
+
return args;
|
|
332
|
+
if (typeof args === 'string') {
|
|
333
|
+
try {
|
|
334
|
+
const parsed = JSON.parse(args);
|
|
335
|
+
return typeof parsed === 'object' && parsed !== null ? parsed : {};
|
|
336
|
+
}
|
|
337
|
+
catch {
|
|
338
|
+
return { _raw: args };
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
return {};
|
|
342
|
+
}
|
|
343
|
+
async function invokeTool(executor, call, workingDir, abortSignal) {
|
|
344
|
+
try {
|
|
345
|
+
return await executor.execute(call, { workingDir, abortSignal });
|
|
346
|
+
}
|
|
347
|
+
catch (err) {
|
|
348
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
349
|
+
return { content: `Tool execution threw: ${msg}`, isError: true };
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
function countToolCalls(messages) {
|
|
353
|
+
let n = 0;
|
|
354
|
+
for (const m of messages) {
|
|
355
|
+
if (m.role === 'assistant' && m.tool_calls)
|
|
356
|
+
n += m.tool_calls.length;
|
|
357
|
+
}
|
|
358
|
+
return n;
|
|
359
|
+
}
|
|
360
|
+
/**
|
|
361
|
+
* Crude tokens approximation — bytes / 4. Used only to decide when to
|
|
362
|
+
* trim, never as a billing input.
|
|
363
|
+
*/
|
|
364
|
+
function estimateTokens(messages) {
|
|
365
|
+
let bytes = 0;
|
|
366
|
+
for (const m of messages) {
|
|
367
|
+
bytes += m.content.length;
|
|
368
|
+
if (m.tool_calls) {
|
|
369
|
+
for (const tc of m.tool_calls) {
|
|
370
|
+
bytes += tc.function.name.length;
|
|
371
|
+
bytes += typeof tc.function.arguments === 'string'
|
|
372
|
+
? tc.function.arguments.length
|
|
373
|
+
: JSON.stringify(tc.function.arguments).length;
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
return Math.ceil(bytes / BYTES_PER_TOKEN);
|
|
378
|
+
}
|
|
379
|
+
/**
|
|
380
|
+
* Drop the oldest tool-role messages until the history fits below
|
|
381
|
+
* SOFT_TRIM_RATIO × numCtx. Keeps system + user prompts intact (they
|
|
382
|
+
* carry the original task framing) and keeps the most recent turns
|
|
383
|
+
* intact (where the active state of the loop lives). If we can't trim
|
|
384
|
+
* enough — e.g. a single tool_result is bigger than the window —
|
|
385
|
+
* escalate via ContextExhaustedError.
|
|
386
|
+
*/
|
|
387
|
+
export function trimHistoryIfNeeded(messages, numCtx, model) {
|
|
388
|
+
const cap = Math.floor(numCtx * SOFT_TRIM_RATIO);
|
|
389
|
+
if (estimateTokens(messages) <= cap)
|
|
390
|
+
return;
|
|
391
|
+
// Walk forward from the start, skipping system/user, drop the FIRST
|
|
392
|
+
// tool message we find. Repeat until under cap or no more droppable
|
|
393
|
+
// tool messages exist.
|
|
394
|
+
while (estimateTokens(messages) > cap) {
|
|
395
|
+
const dropIndex = messages.findIndex((m) => m.role === 'tool');
|
|
396
|
+
if (dropIndex === -1)
|
|
397
|
+
break;
|
|
398
|
+
messages.splice(dropIndex, 1);
|
|
399
|
+
}
|
|
400
|
+
if (estimateTokens(messages) > numCtx) {
|
|
401
|
+
throw new ContextExhaustedError(model, numCtx, estimateTokens(messages));
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
//# sourceMappingURL=ollama-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ollama-adapter.js","sourceRoot":"","sources":["../src/ollama-adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenAI HTTP API adapter — agentic, inherits the OpenAI-compatible
|
|
3
|
+
* SSE loop from `OpenRouterAdapter`.
|
|
4
|
+
*
|
|
5
|
+
* OpenRouter / OpenCode Go / OpenAI all speak the same `/v1/chat/completions`
|
|
6
|
+
* protocol. We use OpenRouter as the canonical implementation (SSE
|
|
7
|
+
* `tool_calls` reassembly by `index`, `reasoning` + `reasoning_details`
|
|
8
|
+
* echo-back for o-series / thinking models, `UpstreamError` with
|
|
9
|
+
* retryable classification, per-call `AbortController` set, buffered
|
|
10
|
+
* emitContent). This adapter just overrides the config knobs:
|
|
11
|
+
*
|
|
12
|
+
* - `provider` flips to `'openai'`
|
|
13
|
+
* - API key reads from `OPENAI_API_KEY`
|
|
14
|
+
* - Base URL defaults to `https://api.openai.com/v1` (override with
|
|
15
|
+
* `OPENAI_BASE_URL` for proxies / Azure-OpenAI / etc.)
|
|
16
|
+
* - Drops OpenRouter's attribution headers (`HTTP-Referer`, `X-Title`)
|
|
17
|
+
* - Pricing fallback table maps the bare OpenAI ids
|
|
18
|
+
*
|
|
19
|
+
* Capability tier flips from `'function-calling'` → `'agentic'` because
|
|
20
|
+
* the inherited SSE consumer drives a real `BuiltinToolExecutor` loop.
|
|
21
|
+
* o1 / o3 / o4 reasoning models work out-of-the-box — the parent
|
|
22
|
+
* captures `delta.reasoning` / `delta.reasoning_details` and replays
|
|
23
|
+
* them on the next assistant turn (same protocol upstream uses).
|
|
24
|
+
*/
|
|
25
|
+
import type { ProviderName } from './types.js';
|
|
26
|
+
import { OpenRouterAdapter } from './openrouter-adapter.js';
|
|
27
|
+
export declare class OpenAIAdapter extends OpenRouterAdapter {
|
|
28
|
+
readonly provider: ProviderName;
|
|
29
|
+
protected getApiKey(): string | undefined;
|
|
30
|
+
protected getBaseUrl(): string;
|
|
31
|
+
protected getExtraHeaders(): Record<string, string>;
|
|
32
|
+
supportsModel(modelId: string): boolean;
|
|
33
|
+
getModelPricing(modelId: string): [number, number] | null;
|
|
34
|
+
checkAvailability(): Promise<{
|
|
35
|
+
available: boolean;
|
|
36
|
+
version?: string;
|
|
37
|
+
error?: string;
|
|
38
|
+
}>;
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=openai-adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai-adapter.d.ts","sourceRoot":"","sources":["../src/openai-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAwB5D,qBAAa,aAAc,SAAQ,iBAAiB;IAClD,SAAkB,QAAQ,EAAE,YAAY,CAAY;cAIjC,SAAS,IAAI,MAAM,GAAG,SAAS;cAI/B,UAAU,IAAI,MAAM;cAOpB,eAAe,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAOnD,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAOvC,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI;IAMnD,iBAAiB,IAAI,OAAO,CAAC;QAAE,SAAS,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAKtG"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenAI HTTP API adapter — agentic, inherits the OpenAI-compatible
|
|
3
|
+
* SSE loop from `OpenRouterAdapter`.
|
|
4
|
+
*
|
|
5
|
+
* OpenRouter / OpenCode Go / OpenAI all speak the same `/v1/chat/completions`
|
|
6
|
+
* protocol. We use OpenRouter as the canonical implementation (SSE
|
|
7
|
+
* `tool_calls` reassembly by `index`, `reasoning` + `reasoning_details`
|
|
8
|
+
* echo-back for o-series / thinking models, `UpstreamError` with
|
|
9
|
+
* retryable classification, per-call `AbortController` set, buffered
|
|
10
|
+
* emitContent). This adapter just overrides the config knobs:
|
|
11
|
+
*
|
|
12
|
+
* - `provider` flips to `'openai'`
|
|
13
|
+
* - API key reads from `OPENAI_API_KEY`
|
|
14
|
+
* - Base URL defaults to `https://api.openai.com/v1` (override with
|
|
15
|
+
* `OPENAI_BASE_URL` for proxies / Azure-OpenAI / etc.)
|
|
16
|
+
* - Drops OpenRouter's attribution headers (`HTTP-Referer`, `X-Title`)
|
|
17
|
+
* - Pricing fallback table maps the bare OpenAI ids
|
|
18
|
+
*
|
|
19
|
+
* Capability tier flips from `'function-calling'` → `'agentic'` because
|
|
20
|
+
* the inherited SSE consumer drives a real `BuiltinToolExecutor` loop.
|
|
21
|
+
* o1 / o3 / o4 reasoning models work out-of-the-box — the parent
|
|
22
|
+
* captures `delta.reasoning` / `delta.reasoning_details` and replays
|
|
23
|
+
* them on the next assistant turn (same protocol upstream uses).
|
|
24
|
+
*/
|
|
25
|
+
import { OpenRouterAdapter } from './openrouter-adapter.js';
|
|
26
|
+
/**
|
|
27
|
+
* Pricing fallbacks for known bare OpenAI ids.
|
|
28
|
+
* `[inputPer1MTokens, outputPer1MTokens]`. The chat-completions response
|
|
29
|
+
* doesn't echo `usage.cost`, so the inherited base class falls back to
|
|
30
|
+
* this table when computing per-call cost.
|
|
31
|
+
*/
|
|
32
|
+
const OPENAI_PRICING = {
|
|
33
|
+
// Current generation
|
|
34
|
+
'gpt-4o': [2.5, 10.0],
|
|
35
|
+
'gpt-4o-mini': [0.15, 0.60],
|
|
36
|
+
'gpt-4-turbo': [10.0, 30.0],
|
|
37
|
+
'gpt-4': [30.0, 60.0],
|
|
38
|
+
'chatgpt-4o-latest': [5.0, 15.0],
|
|
39
|
+
// o-series reasoning models
|
|
40
|
+
'o1': [15.0, 60.0],
|
|
41
|
+
'o1-mini': [3.0, 12.0],
|
|
42
|
+
'o1-preview': [15.0, 60.0],
|
|
43
|
+
'o3': [10.0, 40.0],
|
|
44
|
+
'o3-mini': [1.1, 4.4],
|
|
45
|
+
'o4-mini': [1.1, 4.4],
|
|
46
|
+
};
|
|
47
|
+
export class OpenAIAdapter extends OpenRouterAdapter {
|
|
48
|
+
provider = 'openai';
|
|
49
|
+
// -- Configuration overrides ----------------------------------------------
|
|
50
|
+
getApiKey() {
|
|
51
|
+
return process.env.OPENAI_API_KEY;
|
|
52
|
+
}
|
|
53
|
+
getBaseUrl() {
|
|
54
|
+
// Default to api.openai.com. `OPENAI_BASE_URL` overrides for proxies,
|
|
55
|
+
// Azure-OpenAI, or self-hosted OpenAI-compatible endpoints (vLLM,
|
|
56
|
+
// LocalAI, etc.).
|
|
57
|
+
return (process.env.OPENAI_BASE_URL ?? 'https://api.openai.com/v1').replace(/\/+$/, '');
|
|
58
|
+
}
|
|
59
|
+
getExtraHeaders() {
|
|
60
|
+
// OpenAI's API doesn't use the OpenRouter attribution headers.
|
|
61
|
+
return {};
|
|
62
|
+
}
|
|
63
|
+
// -- Model id handling ----------------------------------------------------
|
|
64
|
+
supportsModel(modelId) {
|
|
65
|
+
// Match bare OpenAI ids — `gpt-*`, `chatgpt-*`, and the o-series.
|
|
66
|
+
// OpenRouter slugs (`openai/gpt-4o`) deliberately fall through to
|
|
67
|
+
// OpenRouterAdapter via the slash-routing in default-adapter-factory.
|
|
68
|
+
return /^(gpt-|chatgpt-|o[134](-|$))/.test(modelId);
|
|
69
|
+
}
|
|
70
|
+
getModelPricing(modelId) {
|
|
71
|
+
return OPENAI_PRICING[modelId] ?? null;
|
|
72
|
+
}
|
|
73
|
+
// -- Availability ---------------------------------------------------------
|
|
74
|
+
async checkAvailability() {
|
|
75
|
+
const key = this.getApiKey();
|
|
76
|
+
if (!key)
|
|
77
|
+
return { available: false, error: 'OPENAI_API_KEY is not set' };
|
|
78
|
+
return { available: true };
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=openai-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai-adapter.js","sourceRoot":"","sources":["../src/openai-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAGH,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAE5D;;;;;GAKG;AACH,MAAM,cAAc,GAAqC;IACvD,qBAAqB;IACrB,QAAQ,EAAkB,CAAC,GAAG,EAAE,IAAI,CAAC;IACrC,aAAa,EAAa,CAAC,IAAI,EAAE,IAAI,CAAC;IACtC,aAAa,EAAa,CAAC,IAAI,EAAE,IAAI,CAAC;IACtC,OAAO,EAAmB,CAAC,IAAI,EAAE,IAAI,CAAC;IACtC,mBAAmB,EAAO,CAAC,GAAG,EAAE,IAAI,CAAC;IACrC,4BAA4B;IAC5B,IAAI,EAAsB,CAAC,IAAI,EAAE,IAAI,CAAC;IACtC,SAAS,EAAiB,CAAC,GAAG,EAAE,IAAI,CAAC;IACrC,YAAY,EAAc,CAAC,IAAI,EAAE,IAAI,CAAC;IACtC,IAAI,EAAsB,CAAC,IAAI,EAAE,IAAI,CAAC;IACtC,SAAS,EAAiB,CAAC,GAAG,EAAE,GAAG,CAAC;IACpC,SAAS,EAAiB,CAAC,GAAG,EAAE,GAAG,CAAC;CACrC,CAAC;AAEF,MAAM,OAAO,aAAc,SAAQ,iBAAiB;IAChC,QAAQ,GAAiB,QAAQ,CAAC;IAEpD,4EAA4E;IAEzD,SAAS;QAC1B,OAAO,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;IACpC,CAAC;IAEkB,UAAU;QAC3B,sEAAsE;QACtE,kEAAkE;QAClE,kBAAkB;QAClB,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,2BAA2B,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAC1F,CAAC;IAEkB,eAAe;QAChC,+DAA+D;QAC/D,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,4EAA4E;IAEnE,aAAa,CAAC,OAAe;QACpC,kEAAkE;QAClE,kEAAkE;QAClE,sEAAsE;QACtE,OAAO,8BAA8B,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACtD,CAAC;IAEQ,eAAe,CAAC,OAAe;QACtC,OAAO,cAAc,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC;IACzC,CAAC;IAED,4EAA4E;IAEnE,KAAK,CAAC,iBAAiB;QAC9B,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;QAC7B,IAAI,CAAC,GAAG;YAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,2BAA2B,EAAE,CAAC;QAC1E,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IAC7B,CAAC;CACF"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenCode Go adapter — agentic HTTPS proxy for OpenCode's subscription
|
|
3
|
+
* service (https://opencode.ai/docs/go).
|
|
4
|
+
*
|
|
5
|
+
* OpenCode Go is a $10/month subscription that exposes a curated set of
|
|
6
|
+
* open coding models (Qwen3.5/3.6 Plus, Kimi K2.5/K2.6, GLM-5/5.1,
|
|
7
|
+
* DeepSeek V4, MiniMax M2.5/M2.7, MiMo …) via an OpenAI-compatible API
|
|
8
|
+
* at `https://opencode.ai/zen/go/v1/`. From our perspective it's just
|
|
9
|
+
* another OpenAI-compatible endpoint — same SSE format, same tool-call
|
|
10
|
+
* delta protocol — so we inherit `OpenRouterAdapter`'s agentic loop
|
|
11
|
+
* and override the config.
|
|
12
|
+
*
|
|
13
|
+
* Models in the registry are addressed as `opencode/<model>` (e.g.
|
|
14
|
+
* `opencode/qwen3.5-plus`). The adapter strips the `opencode/` prefix
|
|
15
|
+
* before sending to the upstream API. No binary, no daemon, no local
|
|
16
|
+
* SDK — just HTTP + an API key from the user's Go subscription.
|
|
17
|
+
*
|
|
18
|
+
* Replaces Ollama as the cheap local-tier provider when the user has
|
|
19
|
+
* a Go subscription: VRAM cost drops from ~12 GB (Ollama hosting
|
|
20
|
+
* qwen3:14b) to 0 GB, RAM cost stays nominal. Inference happens on
|
|
21
|
+
* OpenCode's hosted infrastructure.
|
|
22
|
+
*/
|
|
23
|
+
import type { ModelAdapterConfig, ModelAdapterResult, ProviderName } from './types.js';
|
|
24
|
+
import { OpenRouterAdapter } from './openrouter-adapter.js';
|
|
25
|
+
export declare class OpenCodeAdapter extends OpenRouterAdapter {
|
|
26
|
+
readonly provider: ProviderName;
|
|
27
|
+
protected getApiKey(): string | undefined;
|
|
28
|
+
protected getBaseUrl(): string;
|
|
29
|
+
protected getExtraHeaders(): Record<string, string>;
|
|
30
|
+
supportsModel(modelId: string): boolean;
|
|
31
|
+
getModelPricing(modelId: string): [number, number] | null;
|
|
32
|
+
run(config: ModelAdapterConfig, output: NodeJS.WritableStream): Promise<ModelAdapterResult>;
|
|
33
|
+
checkAvailability(): Promise<{
|
|
34
|
+
available: boolean;
|
|
35
|
+
version?: string;
|
|
36
|
+
error?: string;
|
|
37
|
+
}>;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=opencode-adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"opencode-adapter.d.ts","sourceRoot":"","sources":["../src/opencode-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AACvF,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAkC5D,qBAAa,eAAgB,SAAQ,iBAAiB;IACpD,SAAkB,QAAQ,EAAE,YAAY,CAAc;cAInC,SAAS,IAAI,MAAM,GAAG,SAAS;cAI/B,UAAU,IAAI,MAAM;cAOpB,eAAe,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAUnD,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAOvC,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI;IAOnD,GAAG,CAChB,MAAM,EAAE,kBAAkB,EAC1B,MAAM,EAAE,MAAM,CAAC,cAAc,GAC5B,OAAO,CAAC,kBAAkB,CAAC;IAef,iBAAiB,IAAI,OAAO,CAAC;QAAE,SAAS,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAKtG"}
|