@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,155 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `llm-router.yaml` discovery + parsing.
|
|
3
|
+
*
|
|
4
|
+
* Search order (locked in ADR R5):
|
|
5
|
+
* 1. process.env.ANVIL_ROUTER_CONFIG (full path)
|
|
6
|
+
* 2. <workspaceRoot>/.anvil/llm-router.yaml
|
|
7
|
+
* 3. $HOME/.anvil/llm-router.yaml (or $ANVIL_HOME/llm-router.yaml)
|
|
8
|
+
* 4. compiled-in defaults (router still works without any config file)
|
|
9
|
+
*
|
|
10
|
+
* `${env:VAR}` expansions inside string values are resolved against
|
|
11
|
+
* `process.env` — same convention as the MCP config-loader.
|
|
12
|
+
*/
|
|
13
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
14
|
+
import { join } from 'node:path';
|
|
15
|
+
import { homedir } from 'node:os';
|
|
16
|
+
import * as YAML from 'yaml';
|
|
17
|
+
import { DEFAULT_RETRY_POLICY } from './retry.js';
|
|
18
|
+
import { DEFAULT_RATE_LIMITS } from './rate-limiter.js';
|
|
19
|
+
import { DEFAULT_CIRCUIT_BREAKER } from './circuit-breaker.js';
|
|
20
|
+
/** Returns the path of the canonical `llm-router.yaml`, or undefined. */
|
|
21
|
+
export function findRouterConfigPath(opts = {}) {
|
|
22
|
+
const env = opts.env ?? process.env;
|
|
23
|
+
const home = opts.homeDir ?? homedir();
|
|
24
|
+
const anvilHome = env.ANVIL_HOME ?? join(home, '.anvil');
|
|
25
|
+
const candidates = [];
|
|
26
|
+
if (env.ANVIL_ROUTER_CONFIG)
|
|
27
|
+
candidates.push(env.ANVIL_ROUTER_CONFIG);
|
|
28
|
+
if (opts.workspaceRoot) {
|
|
29
|
+
candidates.push(join(opts.workspaceRoot, '.anvil', 'llm-router.yaml'));
|
|
30
|
+
}
|
|
31
|
+
candidates.push(join(anvilHome, 'llm-router.yaml'));
|
|
32
|
+
for (const c of candidates) {
|
|
33
|
+
if (existsSync(c))
|
|
34
|
+
return c;
|
|
35
|
+
}
|
|
36
|
+
return undefined;
|
|
37
|
+
}
|
|
38
|
+
const ENV_VAR_RE = /\$\{env:([A-Z_][A-Z0-9_]*)\}/g;
|
|
39
|
+
function expandEnv(value, env) {
|
|
40
|
+
if (typeof value === 'string') {
|
|
41
|
+
return value.replace(ENV_VAR_RE, (_m, name) => env[name] ?? '');
|
|
42
|
+
}
|
|
43
|
+
if (Array.isArray(value))
|
|
44
|
+
return value.map((v) => expandEnv(v, env));
|
|
45
|
+
if (value && typeof value === 'object') {
|
|
46
|
+
const out = {};
|
|
47
|
+
for (const [k, v] of Object.entries(value))
|
|
48
|
+
out[k] = expandEnv(v, env);
|
|
49
|
+
return out;
|
|
50
|
+
}
|
|
51
|
+
return value;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Compiled-in defaults that ensure the router functions out-of-the-box
|
|
55
|
+
* when no YAML file is found. Routes default to common Anthropic +
|
|
56
|
+
* OpenAI tags — callers can still pin via `opts.model` if they don't
|
|
57
|
+
* have a matching tag.
|
|
58
|
+
*/
|
|
59
|
+
export function defaultRouterConfig() {
|
|
60
|
+
const routes = [
|
|
61
|
+
{
|
|
62
|
+
tag: 'planner',
|
|
63
|
+
primary: 'claude-sonnet-4-6',
|
|
64
|
+
fallbacks: [
|
|
65
|
+
{ model: 'claude-haiku-4-5-20251001', on: ['rate_limit', 'server_5xx', 'timeout'] },
|
|
66
|
+
{ model: 'gpt-4o', on: ['server_5xx', 'timeout'] },
|
|
67
|
+
],
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
tag: 'code-gen',
|
|
71
|
+
primary: 'claude-sonnet-4-6',
|
|
72
|
+
fallbacks: [
|
|
73
|
+
{ model: 'claude-haiku-4-5-20251001', on: ['rate_limit', 'server_5xx', 'timeout'] },
|
|
74
|
+
],
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
tag: 'reviewer',
|
|
78
|
+
primary: 'claude-sonnet-4-6',
|
|
79
|
+
fallbacks: [
|
|
80
|
+
{ model: 'gpt-4o', on: ['server_5xx', 'timeout', 'rate_limit'] },
|
|
81
|
+
],
|
|
82
|
+
},
|
|
83
|
+
];
|
|
84
|
+
return {
|
|
85
|
+
routes,
|
|
86
|
+
retryPolicy: { ...DEFAULT_RETRY_POLICY },
|
|
87
|
+
rateLimit: { ...DEFAULT_RATE_LIMITS },
|
|
88
|
+
circuitBreaker: { ...DEFAULT_CIRCUIT_BREAKER },
|
|
89
|
+
onRateLimit: 'wait',
|
|
90
|
+
maxFallbackCostUsd: 1.0,
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Load + parse the active router config. Returns compiled-in defaults
|
|
95
|
+
* if no YAML file is found (unless `requireFile: true`).
|
|
96
|
+
*/
|
|
97
|
+
export function loadRouterConfig(opts = {}) {
|
|
98
|
+
const env = opts.env ?? process.env;
|
|
99
|
+
const path = findRouterConfigPath(opts);
|
|
100
|
+
if (!path) {
|
|
101
|
+
if (opts.requireFile) {
|
|
102
|
+
throw new Error('LlmRouter: no router config file found and requireFile=true');
|
|
103
|
+
}
|
|
104
|
+
return defaultRouterConfig();
|
|
105
|
+
}
|
|
106
|
+
const raw = readFileSync(path, 'utf8');
|
|
107
|
+
const parsed = YAML.parse(raw);
|
|
108
|
+
if (!parsed || typeof parsed !== 'object') {
|
|
109
|
+
throw new Error(`LlmRouter: ${path} is empty or invalid YAML`);
|
|
110
|
+
}
|
|
111
|
+
const expanded = expandEnv(parsed, env);
|
|
112
|
+
return mergeWithDefaults(expanded);
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Merge a user config object over the compiled-in defaults. Top-level
|
|
116
|
+
* fields (`routes`, `retryPolicy`, etc.) replace; sub-fields layer.
|
|
117
|
+
*/
|
|
118
|
+
export function mergeWithDefaults(input) {
|
|
119
|
+
const defaults = defaultRouterConfig();
|
|
120
|
+
const out = { ...defaults };
|
|
121
|
+
if (Array.isArray(input.routes)) {
|
|
122
|
+
out.routes = input.routes;
|
|
123
|
+
}
|
|
124
|
+
if (input.retryPolicy && typeof input.retryPolicy === 'object') {
|
|
125
|
+
out.retryPolicy = {
|
|
126
|
+
...defaults.retryPolicy,
|
|
127
|
+
...input.retryPolicy,
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
if (input.rateLimit && typeof input.rateLimit === 'object') {
|
|
131
|
+
out.rateLimit = {
|
|
132
|
+
...defaults.rateLimit,
|
|
133
|
+
...input.rateLimit,
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
if (input.circuitBreaker && typeof input.circuitBreaker === 'object') {
|
|
137
|
+
out.circuitBreaker = {
|
|
138
|
+
...(defaults.circuitBreaker ?? DEFAULT_CIRCUIT_BREAKER),
|
|
139
|
+
...input.circuitBreaker,
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
if (input.budgets && typeof input.budgets === 'object') {
|
|
143
|
+
out.budgets = input.budgets;
|
|
144
|
+
}
|
|
145
|
+
if (typeof input.maxFallbackCostUsd === 'number') {
|
|
146
|
+
out.maxFallbackCostUsd = input.maxFallbackCostUsd;
|
|
147
|
+
}
|
|
148
|
+
if (input.onRateLimit === 'wait' ||
|
|
149
|
+
input.onRateLimit === 'fail' ||
|
|
150
|
+
input.onRateLimit === 'fallback') {
|
|
151
|
+
out.onRateLimit = input.onRateLimit;
|
|
152
|
+
}
|
|
153
|
+
return out;
|
|
154
|
+
}
|
|
155
|
+
//# sourceMappingURL=config-loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-loader.js","sourceRoot":"","sources":["../../src/router/config-loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Discovery — boot-time pass that pings each model's provider for liveness
|
|
3
|
+
* and writes the result into `registry.availability`. The resolver later
|
|
4
|
+
* consults this map to filter unavailable models.
|
|
5
|
+
*
|
|
6
|
+
* Mutates the registry in place. Idempotent — re-running just refreshes
|
|
7
|
+
* the timestamps. Capability metadata is NEVER changed by this pass; only
|
|
8
|
+
* `availability` is touched.
|
|
9
|
+
*/
|
|
10
|
+
import type { ProviderName } from '../types.js';
|
|
11
|
+
import type { ModelRegistry } from './model-registry.js';
|
|
12
|
+
export interface DiscoveryAdapter {
|
|
13
|
+
checkAvailability(): Promise<{
|
|
14
|
+
available: boolean;
|
|
15
|
+
version?: string;
|
|
16
|
+
error?: string;
|
|
17
|
+
}>;
|
|
18
|
+
}
|
|
19
|
+
export interface DiscoveryDeps {
|
|
20
|
+
/** Resolve a provider name to an adapter that can `checkAvailability`. */
|
|
21
|
+
getAdapter(provider: ProviderName): DiscoveryAdapter | undefined;
|
|
22
|
+
now?: () => number;
|
|
23
|
+
}
|
|
24
|
+
export interface DiscoveryOptions {
|
|
25
|
+
/** Per-provider timeout for `checkAvailability`. Default 3000ms. */
|
|
26
|
+
timeoutMs?: number;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Walks the registry, probes each model's provider, and writes the result
|
|
30
|
+
* into `registry.availability`. One probe per UNIQUE provider — adapters
|
|
31
|
+
* report at the provider level, so the result is replicated across all
|
|
32
|
+
* registry entries that share that provider.
|
|
33
|
+
*
|
|
34
|
+
* Returns the same registry reference (mutation), so callers can chain.
|
|
35
|
+
*/
|
|
36
|
+
export declare function discoverAvailability(registry: ModelRegistry, deps: DiscoveryDeps, opts?: DiscoveryOptions): Promise<ModelRegistry>;
|
|
37
|
+
//# sourceMappingURL=discovery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../../src/router/discovery.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEzD,MAAM,WAAW,gBAAgB;IAC/B,iBAAiB,IAAI,OAAO,CAAC;QAAE,SAAS,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACxF;AAED,MAAM,WAAW,aAAa;IAC5B,0EAA0E;IAC1E,UAAU,CAAC,QAAQ,EAAE,YAAY,GAAG,gBAAgB,GAAG,SAAS,CAAC;IACjE,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC/B,oEAAoE;IACpE,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;GAOG;AACH,wBAAsB,oBAAoB,CACxC,QAAQ,EAAE,aAAa,EACvB,IAAI,EAAE,aAAa,EACnB,IAAI,GAAE,gBAAqB,GAC1B,OAAO,CAAC,aAAa,CAAC,CAyCxB"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Walks the registry, probes each model's provider, and writes the result
|
|
3
|
+
* into `registry.availability`. One probe per UNIQUE provider — adapters
|
|
4
|
+
* report at the provider level, so the result is replicated across all
|
|
5
|
+
* registry entries that share that provider.
|
|
6
|
+
*
|
|
7
|
+
* Returns the same registry reference (mutation), so callers can chain.
|
|
8
|
+
*/
|
|
9
|
+
export async function discoverAvailability(registry, deps, opts = {}) {
|
|
10
|
+
const timeoutMs = opts.timeoutMs ?? 3000;
|
|
11
|
+
const now = deps.now ?? Date.now;
|
|
12
|
+
if (!registry.availability)
|
|
13
|
+
registry.availability = new Map();
|
|
14
|
+
const map = registry.availability;
|
|
15
|
+
const providersInUse = new Set();
|
|
16
|
+
for (const m of registry.models)
|
|
17
|
+
providersInUse.add(m.provider);
|
|
18
|
+
const probes = Array.from(providersInUse).map(async (provider) => {
|
|
19
|
+
const adapter = deps.getAdapter(provider);
|
|
20
|
+
if (!adapter) {
|
|
21
|
+
return { provider, result: { available: false, error: 'no adapter registered' } };
|
|
22
|
+
}
|
|
23
|
+
try {
|
|
24
|
+
const result = await raceWithTimeout(adapter.checkAvailability(), timeoutMs);
|
|
25
|
+
return { provider, result };
|
|
26
|
+
}
|
|
27
|
+
catch (err) {
|
|
28
|
+
const error = err instanceof Error ? err.message : String(err);
|
|
29
|
+
return { provider, result: { available: false, error } };
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
const settled = await Promise.all(probes);
|
|
33
|
+
const byProvider = new Map();
|
|
34
|
+
for (const { provider, result } of settled) {
|
|
35
|
+
byProvider.set(provider, { available: result.available, error: result.error });
|
|
36
|
+
}
|
|
37
|
+
const ts = now();
|
|
38
|
+
for (const m of registry.models) {
|
|
39
|
+
const probe = byProvider.get(m.provider);
|
|
40
|
+
map.set(m.id, {
|
|
41
|
+
available: probe?.available === true,
|
|
42
|
+
lastChecked: ts,
|
|
43
|
+
error: probe?.error,
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
return registry;
|
|
47
|
+
}
|
|
48
|
+
function raceWithTimeout(p, ms) {
|
|
49
|
+
return new Promise((resolve, reject) => {
|
|
50
|
+
const t = setTimeout(() => reject(new Error(`timeout after ${ms}ms`)), ms);
|
|
51
|
+
p.then((v) => { clearTimeout(t); resolve(v); }, (e) => { clearTimeout(t); reject(e); });
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=discovery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discovery.js","sourceRoot":"","sources":["../../src/router/discovery.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Router error classification + RouterError type.
|
|
3
|
+
*
|
|
4
|
+
* `classifyError` is a best-effort heuristic over (status, code, message).
|
|
5
|
+
* Per ADR R2, providers can register adapter-specific overrides via
|
|
6
|
+
* `RouterConfig.errorClassifiers[provider]` (Phase 2+).
|
|
7
|
+
*/
|
|
8
|
+
import type { ErrorClass, RouteAttempt } from './types.js';
|
|
9
|
+
/**
|
|
10
|
+
* Error thrown when the entire route walk fails. Carries the full
|
|
11
|
+
* attempt history so callers can introspect what was tried.
|
|
12
|
+
*/
|
|
13
|
+
export declare class RouterError extends Error {
|
|
14
|
+
readonly attempts: ReadonlyArray<RouteAttempt>;
|
|
15
|
+
readonly cause?: Error;
|
|
16
|
+
constructor(message: string, opts: {
|
|
17
|
+
attempts: ReadonlyArray<RouteAttempt>;
|
|
18
|
+
cause?: Error;
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Map a raw error to an `ErrorClass`.
|
|
23
|
+
*
|
|
24
|
+
* Recognizes:
|
|
25
|
+
* - 429 → rate_limit
|
|
26
|
+
* - 5xx → server_5xx
|
|
27
|
+
* - 401/403 → auth
|
|
28
|
+
* - 400 + content/safety hints → content_policy
|
|
29
|
+
* - 400 → invalid_request
|
|
30
|
+
* - timeout/abort/etimedout/econnreset/socket-hang-up → timeout
|
|
31
|
+
* - otherwise → unknown
|
|
32
|
+
*/
|
|
33
|
+
export declare function classifyError(err: unknown): ErrorClass;
|
|
34
|
+
/**
|
|
35
|
+
* Parse a `Retry-After` header value (seconds-since-now or HTTP-date)
|
|
36
|
+
* into a millisecond delay. Returns `null` if absent or unparseable.
|
|
37
|
+
*/
|
|
38
|
+
export declare function parseRetryAfterMs(headers?: Record<string, string | undefined>): number | null;
|
|
39
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/router/errors.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE3D;;;GAGG;AACH,qBAAa,WAAY,SAAQ,KAAK;IACpC,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC,YAAY,CAAC,CAAC;IAC/C,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC;gBAGrB,OAAO,EAAE,MAAM,EACf,IAAI,EAAE;QAAE,QAAQ,EAAE,aAAa,CAAC,YAAY,CAAC,CAAC;QAAC,KAAK,CAAC,EAAE,KAAK,CAAA;KAAE;CAOjE;AAcD;;;;;;;;;;;GAWG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,OAAO,GAAG,UAAU,CAkDtD;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,GAAG,MAAM,GAAG,IAAI,CAY7F"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Router error classification + RouterError type.
|
|
3
|
+
*
|
|
4
|
+
* `classifyError` is a best-effort heuristic over (status, code, message).
|
|
5
|
+
* Per ADR R2, providers can register adapter-specific overrides via
|
|
6
|
+
* `RouterConfig.errorClassifiers[provider]` (Phase 2+).
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Error thrown when the entire route walk fails. Carries the full
|
|
10
|
+
* attempt history so callers can introspect what was tried.
|
|
11
|
+
*/
|
|
12
|
+
export class RouterError extends Error {
|
|
13
|
+
attempts;
|
|
14
|
+
cause;
|
|
15
|
+
constructor(message, opts) {
|
|
16
|
+
super(message);
|
|
17
|
+
this.name = 'RouterError';
|
|
18
|
+
this.attempts = opts.attempts;
|
|
19
|
+
this.cause = opts.cause;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Map a raw error to an `ErrorClass`.
|
|
24
|
+
*
|
|
25
|
+
* Recognizes:
|
|
26
|
+
* - 429 → rate_limit
|
|
27
|
+
* - 5xx → server_5xx
|
|
28
|
+
* - 401/403 → auth
|
|
29
|
+
* - 400 + content/safety hints → content_policy
|
|
30
|
+
* - 400 → invalid_request
|
|
31
|
+
* - timeout/abort/etimedout/econnreset/socket-hang-up → timeout
|
|
32
|
+
* - otherwise → unknown
|
|
33
|
+
*/
|
|
34
|
+
export function classifyError(err) {
|
|
35
|
+
if (!err)
|
|
36
|
+
return 'unknown';
|
|
37
|
+
const e = err;
|
|
38
|
+
// Network / timeout heuristics first — these can co-exist with no status.
|
|
39
|
+
const codeStr = typeof e.code === 'string' ? e.code.toUpperCase() : '';
|
|
40
|
+
if (codeStr === 'ETIMEDOUT' || codeStr === 'ECONNRESET' || codeStr === 'ECONNABORTED') {
|
|
41
|
+
return 'timeout';
|
|
42
|
+
}
|
|
43
|
+
if (e.name === 'AbortError' || e.name === 'TimeoutError')
|
|
44
|
+
return 'timeout';
|
|
45
|
+
const message = (e.message ?? '').toLowerCase();
|
|
46
|
+
if (message.includes('timeout') || message.includes('timed out') || message.includes('socket hang up')) {
|
|
47
|
+
return 'timeout';
|
|
48
|
+
}
|
|
49
|
+
const status = e.status ?? e.statusCode;
|
|
50
|
+
if (typeof status === 'number') {
|
|
51
|
+
if (status === 429)
|
|
52
|
+
return 'rate_limit';
|
|
53
|
+
if (status >= 500 && status < 600)
|
|
54
|
+
return 'server_5xx';
|
|
55
|
+
if (status === 401 || status === 403)
|
|
56
|
+
return 'auth';
|
|
57
|
+
if (status === 400) {
|
|
58
|
+
// Content-policy filter signals
|
|
59
|
+
const innerType = e.error?.type?.toLowerCase() ?? '';
|
|
60
|
+
const innerCode = e.error?.code?.toLowerCase() ?? '';
|
|
61
|
+
if (innerType.includes('content') ||
|
|
62
|
+
innerType.includes('safety') ||
|
|
63
|
+
innerCode.includes('content_policy') ||
|
|
64
|
+
innerCode.includes('safety') ||
|
|
65
|
+
message.includes('content policy') ||
|
|
66
|
+
message.includes('safety filter') ||
|
|
67
|
+
message.includes('refused')) {
|
|
68
|
+
return 'content_policy';
|
|
69
|
+
}
|
|
70
|
+
return 'invalid_request';
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
// Non-status providers (e.g. SDK throws with content_filter type)
|
|
74
|
+
const innerType = e.error?.type?.toLowerCase() ?? '';
|
|
75
|
+
if (innerType.includes('content') || innerType.includes('safety')) {
|
|
76
|
+
return 'content_policy';
|
|
77
|
+
}
|
|
78
|
+
if (e.type && /content|safety/i.test(e.type)) {
|
|
79
|
+
return 'content_policy';
|
|
80
|
+
}
|
|
81
|
+
return 'unknown';
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Parse a `Retry-After` header value (seconds-since-now or HTTP-date)
|
|
85
|
+
* into a millisecond delay. Returns `null` if absent or unparseable.
|
|
86
|
+
*/
|
|
87
|
+
export function parseRetryAfterMs(headers) {
|
|
88
|
+
if (!headers)
|
|
89
|
+
return null;
|
|
90
|
+
const raw = headers['retry-after'] ?? headers['Retry-After'];
|
|
91
|
+
if (!raw)
|
|
92
|
+
return null;
|
|
93
|
+
const seconds = Number(raw);
|
|
94
|
+
if (Number.isFinite(seconds) && seconds >= 0)
|
|
95
|
+
return Math.round(seconds * 1000);
|
|
96
|
+
const dateMs = Date.parse(raw);
|
|
97
|
+
if (!Number.isNaN(dateMs)) {
|
|
98
|
+
const delta = dateMs - Date.now();
|
|
99
|
+
return delta > 0 ? delta : 0;
|
|
100
|
+
}
|
|
101
|
+
return null;
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/router/errors.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `@esankhan3/anvil-agent-core/router` — barrel.
|
|
3
|
+
*
|
|
4
|
+
* Public surface for the LLM router subsystem. See
|
|
5
|
+
* `AGENT-CORE-LLM-ROUTER-PLAN.md` for the phased rollout.
|
|
6
|
+
*/
|
|
7
|
+
export type { ErrorClass, RetryPolicy, RouteFallback, RouteConfig, BudgetConfig, CircuitBreakerConfig, RateLimitProviderConfig, RouterConfig, InvokeOpts, RouteAttempt, RouteOutcome, } from './types.js';
|
|
8
|
+
export { ALL_ERROR_CLASSES } from './types.js';
|
|
9
|
+
export { LlmRouter } from './router.js';
|
|
10
|
+
export type { LlmRouterDeps, AdapterResolver } from './router.js';
|
|
11
|
+
export { RouterError, classifyError, parseRetryAfterMs } from './errors.js';
|
|
12
|
+
export { runWithRetry, DEFAULT_RETRY_POLICY } from './retry.js';
|
|
13
|
+
export type { RetryAttempt, RunWithRetryDeps, RunWithRetryResult } from './retry.js';
|
|
14
|
+
export { TokenBucketRateLimiter, RateLimitedError, DEFAULT_RATE_LIMITS, } from './rate-limiter.js';
|
|
15
|
+
export type { RateLimiterDeps } from './rate-limiter.js';
|
|
16
|
+
export { SpendLedger, SPEND_LEDGER_SCHEMA_SQL, defaultSpendLedgerPath, } from './spend-ledger.js';
|
|
17
|
+
export type { SpendRow, SpendQueryOpts } from './spend-ledger.js';
|
|
18
|
+
export { CircuitBreaker, DEFAULT_CIRCUIT_BREAKER } from './circuit-breaker.js';
|
|
19
|
+
export type { CircuitBreakerDeps, CircuitState } from './circuit-breaker.js';
|
|
20
|
+
export { loadRouterConfig, findRouterConfigPath, defaultRouterConfig, mergeWithDefaults, } from './config-loader.js';
|
|
21
|
+
export type { LoadRouterConfigOptions } from './config-loader.js';
|
|
22
|
+
export { invokeWithSpans, ROUTER_INVOKE_SPAN, ROUTER_ATTEMPT_SPAN, RouterAttr, } from './telemetry.js';
|
|
23
|
+
export { loadModelRegistry, parseModelRegistry, findModelsConfigPath, DEFAULT_WALKER_CONFIG, ModelRegistryParseError, ModelRegistryValidationError, } from './model-registry.js';
|
|
24
|
+
export type { ModelEntry, ModelRegistry, ModelAvailability, ModelCapability, ModelComplexity, ModelTier, ModelConsumer, WalkerConfig, LoadModelRegistryOptions, } from './model-registry.js';
|
|
25
|
+
export { resolveModel, ModelResolutionError } from './resolver.js';
|
|
26
|
+
export type { ResolveModelOptions, ResolvedChain, ResolutionDiagnostic, } from './resolver.js';
|
|
27
|
+
export { LocalExecutor, localExecutor } from './local-executor.js';
|
|
28
|
+
export type { LocalExecutorDeps, LocalExecutorInspection, } from './local-executor.js';
|
|
29
|
+
export { discoverAvailability } from './discovery.js';
|
|
30
|
+
export type { DiscoveryAdapter, DiscoveryDeps, DiscoveryOptions, } from './discovery.js';
|
|
31
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/router/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,YAAY,EACV,UAAU,EACV,WAAW,EACX,aAAa,EACb,WAAW,EACX,YAAY,EACZ,oBAAoB,EACpB,uBAAuB,EACvB,YAAY,EACZ,UAAU,EACV,YAAY,EACZ,YAAY,GACb,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,YAAY,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAClE,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAC5E,OAAO,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAChE,YAAY,EAAE,YAAY,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AACrF,OAAO,EACL,sBAAsB,EACtB,gBAAgB,EAChB,mBAAmB,GACpB,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EACL,WAAW,EACX,uBAAuB,EACvB,sBAAsB,GACvB,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAClE,OAAO,EAAE,cAAc,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAC/E,YAAY,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAC7E,OAAO,EACL,gBAAgB,EAChB,oBAAoB,EACpB,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAClE,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,mBAAmB,EACnB,UAAU,GACX,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,oBAAoB,EACpB,qBAAqB,EACrB,uBAAuB,EACvB,4BAA4B,GAC7B,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EACV,UAAU,EACV,aAAa,EACb,iBAAiB,EACjB,eAAe,EACf,eAAe,EACf,SAAS,EACT,aAAa,EACb,YAAY,EACZ,wBAAwB,GACzB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACnE,YAAY,EACV,mBAAmB,EACnB,aAAa,EACb,oBAAoB,GACrB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACnE,YAAY,EACV,iBAAiB,EACjB,uBAAuB,GACxB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AACtD,YAAY,EACV,gBAAgB,EAChB,aAAa,EACb,gBAAgB,GACjB,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `@esankhan3/anvil-agent-core/router` — barrel.
|
|
3
|
+
*
|
|
4
|
+
* Public surface for the LLM router subsystem. See
|
|
5
|
+
* `AGENT-CORE-LLM-ROUTER-PLAN.md` for the phased rollout.
|
|
6
|
+
*/
|
|
7
|
+
export { ALL_ERROR_CLASSES } from './types.js';
|
|
8
|
+
export { LlmRouter } from './router.js';
|
|
9
|
+
export { RouterError, classifyError, parseRetryAfterMs } from './errors.js';
|
|
10
|
+
export { runWithRetry, DEFAULT_RETRY_POLICY } from './retry.js';
|
|
11
|
+
export { TokenBucketRateLimiter, RateLimitedError, DEFAULT_RATE_LIMITS, } from './rate-limiter.js';
|
|
12
|
+
export { SpendLedger, SPEND_LEDGER_SCHEMA_SQL, defaultSpendLedgerPath, } from './spend-ledger.js';
|
|
13
|
+
export { CircuitBreaker, DEFAULT_CIRCUIT_BREAKER } from './circuit-breaker.js';
|
|
14
|
+
export { loadRouterConfig, findRouterConfigPath, defaultRouterConfig, mergeWithDefaults, } from './config-loader.js';
|
|
15
|
+
export { invokeWithSpans, ROUTER_INVOKE_SPAN, ROUTER_ATTEMPT_SPAN, RouterAttr, } from './telemetry.js';
|
|
16
|
+
export { loadModelRegistry, parseModelRegistry, findModelsConfigPath, DEFAULT_WALKER_CONFIG, ModelRegistryParseError, ModelRegistryValidationError, } from './model-registry.js';
|
|
17
|
+
export { resolveModel, ModelResolutionError } from './resolver.js';
|
|
18
|
+
export { LocalExecutor, localExecutor } from './local-executor.js';
|
|
19
|
+
export { discoverAvailability } from './discovery.js';
|
|
20
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/router/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAeH,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAC5E,OAAO,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAEhE,OAAO,EACL,sBAAsB,EACtB,gBAAgB,EAChB,mBAAmB,GACpB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,WAAW,EACX,uBAAuB,EACvB,sBAAsB,GACvB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,cAAc,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAE/E,OAAO,EACL,gBAAgB,EAChB,oBAAoB,EACpB,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,mBAAmB,EACnB,UAAU,GACX,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,oBAAoB,EACpB,qBAAqB,EACrB,uBAAuB,EACvB,4BAA4B,GAC7B,MAAM,qBAAqB,CAAC;AAY7B,OAAO,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAMnE,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAKnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LocalExecutor — process-local FIFO single-slot queue for exclusive
|
|
3
|
+
* local models (Ollama big-model slots that can't co-reside on a 16GB
|
|
4
|
+
* GPU). Embedding + reranker models bypass this entirely.
|
|
5
|
+
*
|
|
6
|
+
* Contract:
|
|
7
|
+
* • At most ONE exclusive model is loaded at a time.
|
|
8
|
+
* • Concurrent callers are serialized in FIFO order — no deadlock,
|
|
9
|
+
* no priority inversion.
|
|
10
|
+
* • Switching from model A → model B triggers a synchronous eviction
|
|
11
|
+
* of A via Ollama's `POST /api/generate {model: A, prompt: '',
|
|
12
|
+
* keep_alive: 0}`, then polls `/api/ps` until A is no longer
|
|
13
|
+
* resident before letting B's call go through. Confirmed eviction
|
|
14
|
+
* prevents the GPU from briefly holding both.
|
|
15
|
+
* • Before every load, the executor probes `/api/ps` for OUT-OF-BAND
|
|
16
|
+
* resident exclusive models (e.g. an Ollama CLI session on the
|
|
17
|
+
* host loaded one independently). Intruders are evicted before B
|
|
18
|
+
* loads, so no two exclusive models are ever resident at once.
|
|
19
|
+
* • If `fn` throws, the slot is released and the queue keeps moving.
|
|
20
|
+
* • Same-id consecutive calls do NOT trigger eviction.
|
|
21
|
+
*/
|
|
22
|
+
export interface LocalExecutorDeps {
|
|
23
|
+
/** Override the eviction call (used by tests; defaults to `fetch` to Ollama). */
|
|
24
|
+
evict?: (modelId: string) => Promise<void>;
|
|
25
|
+
/** Returns the model ids Ollama currently has resident. Tests inject
|
|
26
|
+
* to assert intruder-detection. Default = hits /api/ps. */
|
|
27
|
+
probeResident?: () => Promise<string[]>;
|
|
28
|
+
/** Returns true when modelId is an exclusive-slot model (i.e. should
|
|
29
|
+
* NOT co-reside with another exclusive model). Default returns true
|
|
30
|
+
* for every input — the legacy executor cared only about its own
|
|
31
|
+
* internal `loaded`. New callers can wire it to the model registry
|
|
32
|
+
* for correct intruder filtering. */
|
|
33
|
+
isExclusive?: (modelId: string) => boolean;
|
|
34
|
+
/** Override now() for deterministic tests. */
|
|
35
|
+
now?: () => number;
|
|
36
|
+
}
|
|
37
|
+
export interface LocalExecutorInspection {
|
|
38
|
+
loaded: string | null;
|
|
39
|
+
queueDepth: number;
|
|
40
|
+
}
|
|
41
|
+
export declare class LocalExecutor {
|
|
42
|
+
private loaded;
|
|
43
|
+
private queue;
|
|
44
|
+
private busy;
|
|
45
|
+
private readonly deps;
|
|
46
|
+
constructor(deps?: LocalExecutorDeps);
|
|
47
|
+
withModel<T>(modelId: string, fn: () => Promise<T>): Promise<T>;
|
|
48
|
+
inspect(): LocalExecutorInspection;
|
|
49
|
+
private pump;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Process-local singleton. Modules that wrap exclusive-slot calls
|
|
53
|
+
* import this directly; tests construct their own instance to avoid
|
|
54
|
+
* cross-test pollution.
|
|
55
|
+
*
|
|
56
|
+
* The singleton is wired with the real Ollama probe so production
|
|
57
|
+
* intruder-detection works; per-test instances default to a no-op
|
|
58
|
+
* probe so they don't pay for a network round-trip they don't care
|
|
59
|
+
* about.
|
|
60
|
+
*/
|
|
61
|
+
export declare const localExecutor: LocalExecutor;
|
|
62
|
+
//# sourceMappingURL=local-executor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-executor.d.ts","sourceRoot":"","sources":["../../src/router/local-executor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,MAAM,WAAW,iBAAiB;IAChC,iFAAiF;IACjF,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3C;gEAC4D;IAC5D,aAAa,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACxC;;;;0CAIsC;IACtC,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC;IAC3C,8CAA8C;IAC9C,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;CACpB;AASD,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,KAAK,CAAmB;IAChC,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAA8B;gBAEvC,IAAI,GAAE,iBAAsB;IAaxC,SAAS,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAY/D,OAAO,IAAI,uBAAuB;YAIpB,IAAI;CAwCnB;AAwDD;;;;;;;;;GASG;AACH,eAAO,MAAM,aAAa,eAExB,CAAC"}
|