@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
package/dist/index.js
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @esankhan3/anvil-agent-core — public barrel.
|
|
3
|
+
*
|
|
4
|
+
* What lives here today (Phase 1):
|
|
5
|
+
* - Shared LLM types: `LanguageModel`, `ModelAdapter`, `ProviderName`,
|
|
6
|
+
* `ProviderTier`, `StreamEvent`, `InvokeResult`, etc.
|
|
7
|
+
* - VERSION constant.
|
|
8
|
+
*
|
|
9
|
+
* What will land in subsequent phases:
|
|
10
|
+
* - Phase 2: stream-format types (NDJSON event shapes)
|
|
11
|
+
* - Phase 3: ProviderRegistry singleton
|
|
12
|
+
* - Phase 4: 7 provider adapters
|
|
13
|
+
* - Phase 5: single-shot wrapper (runLLM / runClaude / runGemini)
|
|
14
|
+
* - Phase 6: agent subprocess machinery (AgentManager, spawn, etc.)
|
|
15
|
+
* - Phase 7: cost table loader
|
|
16
|
+
*/
|
|
17
|
+
export * from './types.js';
|
|
18
|
+
export * from './stream-format.js';
|
|
19
|
+
export * from './registry.js';
|
|
20
|
+
export { ClaudeAdapter } from './claude-adapter.js';
|
|
21
|
+
export { OpenAIAdapter } from './openai-adapter.js';
|
|
22
|
+
export { GeminiAdapter } from './gemini-adapter.js';
|
|
23
|
+
export { OpenRouterAdapter } from './openrouter-adapter.js';
|
|
24
|
+
export { OllamaAdapter } from './ollama-adapter.js';
|
|
25
|
+
export { GeminiCliAdapter } from './gemini-cli-adapter.js';
|
|
26
|
+
export { AdkAdapter } from './adk-adapter.js';
|
|
27
|
+
export { OpenCodeAdapter } from './opencode-adapter.js';
|
|
28
|
+
export { FallbackAdapter } from './fallback-adapter.js';
|
|
29
|
+
export * from './single-shot.js';
|
|
30
|
+
export * from './agent/index.js';
|
|
31
|
+
export * from './checkpoint/index.js';
|
|
32
|
+
export * from './cost.js';
|
|
33
|
+
export * from './telemetry/index.js';
|
|
34
|
+
export * from './skills/index.js';
|
|
35
|
+
export * from './mcp/index.js';
|
|
36
|
+
export * from './router/index.js';
|
|
37
|
+
export * from './tools/index.js';
|
|
38
|
+
export { VERSION } from './version.js';
|
|
39
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,cAAc,YAAY,CAAC;AAC3B,cAAc,oBAAoB,CAAC;AACnC,cAAc,eAAe,CAAC;AAC9B,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,uBAAuB,CAAC;AACtC,cAAc,WAAW,CAAC;AAC1B,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `McpAgentClient` — wraps the official MCP TypeScript SDK with the lifecycle
|
|
3
|
+
* Anvil's agent layer needs (lazy connect, tool listing with namespacing,
|
|
4
|
+
* tool dispatch, clean close).
|
|
5
|
+
*
|
|
6
|
+
* One instance per configured MCP server. The agent's tool-call loop owns
|
|
7
|
+
* close() so subprocesses don't leak between invocations.
|
|
8
|
+
*/
|
|
9
|
+
import type { ToolSchema } from '../types.js';
|
|
10
|
+
import type { McpServerConfig } from './types.js';
|
|
11
|
+
export declare class McpAgentClient {
|
|
12
|
+
readonly config: McpServerConfig;
|
|
13
|
+
private client;
|
|
14
|
+
private connected;
|
|
15
|
+
constructor(config: McpServerConfig);
|
|
16
|
+
connect(): Promise<void>;
|
|
17
|
+
/**
|
|
18
|
+
* Returns the server's tools, namespaced as `<serverName>/<toolName>` so
|
|
19
|
+
* multiple MCP servers exposing identically-named tools don't collide in
|
|
20
|
+
* the agent's flat tool registry.
|
|
21
|
+
*/
|
|
22
|
+
listTools(): Promise<ToolSchema[]>;
|
|
23
|
+
/**
|
|
24
|
+
* Dispatch a tool call. Accepts either the namespaced form
|
|
25
|
+
* (`<server>/<tool>`) or the bare tool name; strips the server prefix
|
|
26
|
+
* before forwarding to the SDK.
|
|
27
|
+
*/
|
|
28
|
+
callTool(toolName: string, args: Record<string, unknown>): Promise<unknown>;
|
|
29
|
+
close(): Promise<void>;
|
|
30
|
+
isConnected(): boolean;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/mcp/client.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAKlD,qBAAa,cAAc;aAIG,MAAM,EAAE,eAAe;IAHnD,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,SAAS,CAAS;gBAEE,MAAM,EAAE,eAAe;IAO7C,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IA4B9B;;;;OAIG;IACG,SAAS,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;IAUxC;;;;OAIG;IACG,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;IAW3E,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAS5B,WAAW,IAAI,OAAO;CAGvB"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `McpAgentClient` — wraps the official MCP TypeScript SDK with the lifecycle
|
|
3
|
+
* Anvil's agent layer needs (lazy connect, tool listing with namespacing,
|
|
4
|
+
* tool dispatch, clean close).
|
|
5
|
+
*
|
|
6
|
+
* One instance per configured MCP server. The agent's tool-call loop owns
|
|
7
|
+
* close() so subprocesses don't leak between invocations.
|
|
8
|
+
*/
|
|
9
|
+
import { Client } from '@modelcontextprotocol/sdk/client/index.js';
|
|
10
|
+
import { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js';
|
|
11
|
+
import { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js';
|
|
12
|
+
import { VERSION } from '../version.js';
|
|
13
|
+
const CLIENT_NAME = 'anvil-agent';
|
|
14
|
+
export class McpAgentClient {
|
|
15
|
+
config;
|
|
16
|
+
client;
|
|
17
|
+
connected = false;
|
|
18
|
+
constructor(config) {
|
|
19
|
+
this.config = config;
|
|
20
|
+
this.client = new Client({ name: CLIENT_NAME, version: VERSION }, { capabilities: {} });
|
|
21
|
+
}
|
|
22
|
+
async connect() {
|
|
23
|
+
if (this.connected)
|
|
24
|
+
return;
|
|
25
|
+
if (this.config.transport === 'stdio') {
|
|
26
|
+
if (!this.config.command) {
|
|
27
|
+
throw new Error(`MCP server "${this.config.name}" has stdio transport but no command`);
|
|
28
|
+
}
|
|
29
|
+
const transport = new StdioClientTransport({
|
|
30
|
+
command: this.config.command,
|
|
31
|
+
args: this.config.args ?? [],
|
|
32
|
+
env: this.config.env,
|
|
33
|
+
});
|
|
34
|
+
await this.client.connect(transport);
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
if (!this.config.url) {
|
|
38
|
+
throw new Error(`MCP server "${this.config.name}" has streamable-http transport but no url`);
|
|
39
|
+
}
|
|
40
|
+
const transport = new StreamableHTTPClientTransport(new URL(this.config.url), {
|
|
41
|
+
requestInit: { headers: this.config.headers },
|
|
42
|
+
});
|
|
43
|
+
await this.client.connect(transport);
|
|
44
|
+
}
|
|
45
|
+
this.connected = true;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Returns the server's tools, namespaced as `<serverName>/<toolName>` so
|
|
49
|
+
* multiple MCP servers exposing identically-named tools don't collide in
|
|
50
|
+
* the agent's flat tool registry.
|
|
51
|
+
*/
|
|
52
|
+
async listTools() {
|
|
53
|
+
if (!this.connected)
|
|
54
|
+
await this.connect();
|
|
55
|
+
const result = await this.client.listTools();
|
|
56
|
+
return result.tools.map((t) => ({
|
|
57
|
+
name: `${this.config.name}/${t.name}`,
|
|
58
|
+
description: t.description ?? '',
|
|
59
|
+
inputSchema: t.inputSchema ?? {},
|
|
60
|
+
}));
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Dispatch a tool call. Accepts either the namespaced form
|
|
64
|
+
* (`<server>/<tool>`) or the bare tool name; strips the server prefix
|
|
65
|
+
* before forwarding to the SDK.
|
|
66
|
+
*/
|
|
67
|
+
async callTool(toolName, args) {
|
|
68
|
+
if (!this.connected)
|
|
69
|
+
await this.connect();
|
|
70
|
+
const prefix = `${this.config.name}/`;
|
|
71
|
+
const stripped = toolName.startsWith(prefix) ? toolName.slice(prefix.length) : toolName;
|
|
72
|
+
const result = await this.client.callTool({
|
|
73
|
+
name: stripped,
|
|
74
|
+
arguments: args,
|
|
75
|
+
});
|
|
76
|
+
return result;
|
|
77
|
+
}
|
|
78
|
+
async close() {
|
|
79
|
+
if (!this.connected)
|
|
80
|
+
return;
|
|
81
|
+
try {
|
|
82
|
+
await this.client.close();
|
|
83
|
+
}
|
|
84
|
+
finally {
|
|
85
|
+
this.connected = false;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
isConnected() {
|
|
89
|
+
return this.connected;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/mcp/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `mcp.json` discovery + parsing.
|
|
3
|
+
*
|
|
4
|
+
* Search order (locked in ADR §4.3):
|
|
5
|
+
* 1. process.env.ANVIL_MCP_CONFIG (full path)
|
|
6
|
+
* 2. <workspaceRoot>/mcp.json
|
|
7
|
+
* 3. <workspaceRoot>/.mcp/servers.json
|
|
8
|
+
* 4. <workspaceRoot>/.claude/mcp.json
|
|
9
|
+
* 5. $HOME/.claude/mcp.json
|
|
10
|
+
*
|
|
11
|
+
* The first existing file wins; configs do not merge.
|
|
12
|
+
*
|
|
13
|
+
* Each entry's transport is inferred from shape (`command` → stdio,
|
|
14
|
+
* `url` → streamable-http). Entries with both or neither are dropped with a
|
|
15
|
+
* stderr warning.
|
|
16
|
+
*
|
|
17
|
+
* `${env:VAR}` substitutions in env/headers values are expanded against
|
|
18
|
+
* `process.env` (or the provided env override).
|
|
19
|
+
*/
|
|
20
|
+
import type { McpServerConfig } from './types.js';
|
|
21
|
+
export interface LoadMcpServersOptions {
|
|
22
|
+
/** Absolute workspace root used for ranks 2–4. */
|
|
23
|
+
workspaceRoot?: string;
|
|
24
|
+
/** Override `process.env`; supports both `ANVIL_MCP_CONFIG` and `${env:VAR}` substitution. */
|
|
25
|
+
env?: NodeJS.ProcessEnv;
|
|
26
|
+
/** Override `$HOME` (test seam). */
|
|
27
|
+
homeDir?: string;
|
|
28
|
+
}
|
|
29
|
+
/** Returns the path of the canonical `mcp.json` for the workspace, or undefined. */
|
|
30
|
+
export declare function findMcpConfigPath(opts?: LoadMcpServersOptions): string | undefined;
|
|
31
|
+
/**
|
|
32
|
+
* Read and parse the `mcp.json` for `workspaceRoot`. Returns `[]` when no
|
|
33
|
+
* config is found (graceful no-op for projects without MCP).
|
|
34
|
+
*/
|
|
35
|
+
export declare function loadMcpServers(opts?: LoadMcpServersOptions): McpServerConfig[];
|
|
36
|
+
//# sourceMappingURL=config-loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-loader.d.ts","sourceRoot":"","sources":["../../src/mcp/config-loader.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAKH,OAAO,KAAK,EACV,eAAe,EAGhB,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,qBAAqB;IACpC,kDAAkD;IAClD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,8FAA8F;IAC9F,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,oCAAoC;IACpC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,oFAAoF;AACpF,wBAAgB,iBAAiB,CAAC,IAAI,GAAE,qBAA0B,GAAG,MAAM,GAAG,SAAS,CAmBtF;AAuDD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,IAAI,GAAE,qBAA0B,GAAG,eAAe,EAAE,CA+ClF"}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `mcp.json` discovery + parsing.
|
|
3
|
+
*
|
|
4
|
+
* Search order (locked in ADR §4.3):
|
|
5
|
+
* 1. process.env.ANVIL_MCP_CONFIG (full path)
|
|
6
|
+
* 2. <workspaceRoot>/mcp.json
|
|
7
|
+
* 3. <workspaceRoot>/.mcp/servers.json
|
|
8
|
+
* 4. <workspaceRoot>/.claude/mcp.json
|
|
9
|
+
* 5. $HOME/.claude/mcp.json
|
|
10
|
+
*
|
|
11
|
+
* The first existing file wins; configs do not merge.
|
|
12
|
+
*
|
|
13
|
+
* Each entry's transport is inferred from shape (`command` → stdio,
|
|
14
|
+
* `url` → streamable-http). Entries with both or neither are dropped with a
|
|
15
|
+
* stderr warning.
|
|
16
|
+
*
|
|
17
|
+
* `${env:VAR}` substitutions in env/headers values are expanded against
|
|
18
|
+
* `process.env` (or the provided env override).
|
|
19
|
+
*/
|
|
20
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
21
|
+
import { join } from 'node:path';
|
|
22
|
+
import { homedir } from 'node:os';
|
|
23
|
+
/** Returns the path of the canonical `mcp.json` for the workspace, or undefined. */
|
|
24
|
+
export function findMcpConfigPath(opts = {}) {
|
|
25
|
+
const env = opts.env ?? process.env;
|
|
26
|
+
const home = opts.homeDir ?? homedir();
|
|
27
|
+
const candidates = [];
|
|
28
|
+
if (env.ANVIL_MCP_CONFIG)
|
|
29
|
+
candidates.push(env.ANVIL_MCP_CONFIG);
|
|
30
|
+
if (opts.workspaceRoot) {
|
|
31
|
+
candidates.push(join(opts.workspaceRoot, 'mcp.json'), join(opts.workspaceRoot, '.mcp', 'servers.json'), join(opts.workspaceRoot, '.claude', 'mcp.json'));
|
|
32
|
+
}
|
|
33
|
+
candidates.push(join(home, '.claude', 'mcp.json'));
|
|
34
|
+
for (const c of candidates) {
|
|
35
|
+
if (existsSync(c))
|
|
36
|
+
return c;
|
|
37
|
+
}
|
|
38
|
+
return undefined;
|
|
39
|
+
}
|
|
40
|
+
const ENV_VAR_RE = /\$\{env:([A-Z_][A-Z0-9_]*)\}/g;
|
|
41
|
+
function substituteEnvVars(value, env, fieldDesc, warn) {
|
|
42
|
+
return value.replace(ENV_VAR_RE, (_match, name) => {
|
|
43
|
+
const v = env[name];
|
|
44
|
+
if (v === undefined || v === '') {
|
|
45
|
+
warn(`[anvil-mcp] WARN: env var \${env:${name}} unset — ${fieldDesc} resolves to empty`);
|
|
46
|
+
return '';
|
|
47
|
+
}
|
|
48
|
+
return v;
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
function expandEntryStrings(obj, env, fieldDesc, warn) {
|
|
52
|
+
if (!obj)
|
|
53
|
+
return undefined;
|
|
54
|
+
const out = {};
|
|
55
|
+
for (const [k, v] of Object.entries(obj)) {
|
|
56
|
+
if (typeof v !== 'string') {
|
|
57
|
+
warn(`[anvil-mcp] WARN: ${fieldDesc}.${k} is not a string; skipping`);
|
|
58
|
+
continue;
|
|
59
|
+
}
|
|
60
|
+
out[k] = substituteEnvVars(v, env, `${fieldDesc}.${k}`, warn);
|
|
61
|
+
}
|
|
62
|
+
return out;
|
|
63
|
+
}
|
|
64
|
+
function inferTransport(entry, name, warn) {
|
|
65
|
+
const hasCmd = typeof entry.command === 'string' && entry.command.length > 0;
|
|
66
|
+
const hasUrl = typeof entry.url === 'string' && entry.url.length > 0;
|
|
67
|
+
if (hasCmd && hasUrl) {
|
|
68
|
+
warn(`[anvil-mcp] WARN: server "${name}" has both command and url; dropping`);
|
|
69
|
+
return undefined;
|
|
70
|
+
}
|
|
71
|
+
if (hasCmd)
|
|
72
|
+
return 'stdio';
|
|
73
|
+
if (hasUrl)
|
|
74
|
+
return 'streamable-http';
|
|
75
|
+
warn(`[anvil-mcp] WARN: server "${name}" has neither command nor url; dropping`);
|
|
76
|
+
return undefined;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Read and parse the `mcp.json` for `workspaceRoot`. Returns `[]` when no
|
|
80
|
+
* config is found (graceful no-op for projects without MCP).
|
|
81
|
+
*/
|
|
82
|
+
export function loadMcpServers(opts = {}) {
|
|
83
|
+
const env = opts.env ?? process.env;
|
|
84
|
+
const path = findMcpConfigPath({ ...opts, env });
|
|
85
|
+
if (!path)
|
|
86
|
+
return [];
|
|
87
|
+
let raw;
|
|
88
|
+
try {
|
|
89
|
+
raw = readFileSync(path, 'utf-8');
|
|
90
|
+
}
|
|
91
|
+
catch (err) {
|
|
92
|
+
process.stderr.write(`[anvil-mcp] WARN: cannot read ${path}: ${err.message}\n`);
|
|
93
|
+
return [];
|
|
94
|
+
}
|
|
95
|
+
let parsed;
|
|
96
|
+
try {
|
|
97
|
+
parsed = JSON.parse(raw);
|
|
98
|
+
}
|
|
99
|
+
catch (err) {
|
|
100
|
+
process.stderr.write(`[anvil-mcp] WARN: ${path} is not valid JSON: ${err.message}\n`);
|
|
101
|
+
return [];
|
|
102
|
+
}
|
|
103
|
+
if (!parsed.mcpServers || typeof parsed.mcpServers !== 'object') {
|
|
104
|
+
process.stderr.write(`[anvil-mcp] WARN: ${path} missing top-level "mcpServers" object\n`);
|
|
105
|
+
return [];
|
|
106
|
+
}
|
|
107
|
+
const warn = (msg) => process.stderr.write(msg + '\n');
|
|
108
|
+
const out = [];
|
|
109
|
+
for (const [name, entry] of Object.entries(parsed.mcpServers)) {
|
|
110
|
+
if (!entry || typeof entry !== 'object') {
|
|
111
|
+
warn(`[anvil-mcp] WARN: server "${name}" entry is not an object; dropping`);
|
|
112
|
+
continue;
|
|
113
|
+
}
|
|
114
|
+
const transport = inferTransport(entry, name, warn);
|
|
115
|
+
if (!transport)
|
|
116
|
+
continue;
|
|
117
|
+
out.push({
|
|
118
|
+
name,
|
|
119
|
+
transport,
|
|
120
|
+
command: entry.command,
|
|
121
|
+
args: Array.isArray(entry.args) ? [...entry.args] : undefined,
|
|
122
|
+
env: expandEntryStrings(entry.env, env, `mcpServers.${name}.env`, warn),
|
|
123
|
+
url: entry.url,
|
|
124
|
+
headers: expandEntryStrings(entry.headers, env, `mcpServers.${name}.headers`, warn),
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
return out;
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=config-loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-loader.js","sourceRoot":"","sources":["../../src/mcp/config-loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @esankhan3/anvil-agent-core/mcp — Model Context Protocol *client*-side helpers.
|
|
3
|
+
*
|
|
4
|
+
* Companion to `code-search-mcp` (which is the MCP *server* Anvil already
|
|
5
|
+
* publishes). The client side lets Anvil's agent connect to OTHER MCP
|
|
6
|
+
* servers configured per project.
|
|
7
|
+
*/
|
|
8
|
+
export type { McpTransport, McpServerConfig, McpServerEntry, McpServersFile, } from './types.js';
|
|
9
|
+
export { loadMcpServers, findMcpConfigPath, type LoadMcpServersOptions, } from './config-loader.js';
|
|
10
|
+
export { McpAgentClient } from './client.js';
|
|
11
|
+
export { buildAgentToolset, type AgentToolset, } from './tool-merger.js';
|
|
12
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,YAAY,EACV,YAAY,EACZ,eAAe,EACf,cAAc,EACd,cAAc,GACf,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,cAAc,EACd,iBAAiB,EACjB,KAAK,qBAAqB,GAC3B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EACL,iBAAiB,EACjB,KAAK,YAAY,GAClB,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @esankhan3/anvil-agent-core/mcp — Model Context Protocol *client*-side helpers.
|
|
3
|
+
*
|
|
4
|
+
* Companion to `code-search-mcp` (which is the MCP *server* Anvil already
|
|
5
|
+
* publishes). The client side lets Anvil's agent connect to OTHER MCP
|
|
6
|
+
* servers configured per project.
|
|
7
|
+
*/
|
|
8
|
+
export { loadMcpServers, findMcpConfigPath, } from './config-loader.js';
|
|
9
|
+
export { McpAgentClient } from './client.js';
|
|
10
|
+
export { buildAgentToolset, } from './tool-merger.js';
|
|
11
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAQH,OAAO,EACL,cAAc,EACd,iBAAiB,GAElB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EACL,iBAAiB,GAElB,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `buildAgentToolset` — merge built-in tools with MCP-discovered tools into a
|
|
3
|
+
* single `ToolSchema[]` registered with the LLM provider, plus a dispatch
|
|
4
|
+
* map from namespaced tool name → owning MCP client.
|
|
5
|
+
*
|
|
6
|
+
* Per ADR §H7, the provider doesn't know MCP exists; the agent layer routes
|
|
7
|
+
* tool calls based on whether the name is in `mcpDispatch`.
|
|
8
|
+
*/
|
|
9
|
+
import type { ToolSchema } from '../types.js';
|
|
10
|
+
import type { McpAgentClient } from './client.js';
|
|
11
|
+
export interface AgentToolset {
|
|
12
|
+
/** Flat list of tools to pass to `LanguageModel.invokeStream({ tools })`. */
|
|
13
|
+
tools: ToolSchema[];
|
|
14
|
+
/** Maps namespaced tool name to the MCP client that owns it. */
|
|
15
|
+
mcpDispatch: Map<string, McpAgentClient>;
|
|
16
|
+
}
|
|
17
|
+
export declare function buildAgentToolset(builtIn: ToolSchema[], mcpClients: McpAgentClient[]): Promise<AgentToolset>;
|
|
18
|
+
//# sourceMappingURL=tool-merger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-merger.d.ts","sourceRoot":"","sources":["../../src/mcp/tool-merger.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAElD,MAAM,WAAW,YAAY;IAC3B,6EAA6E;IAC7E,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,gEAAgE;IAChE,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;CAC1C;AAED,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,UAAU,EAAE,EACrB,UAAU,EAAE,cAAc,EAAE,GAC3B,OAAO,CAAC,YAAY,CAAC,CA4BvB"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `buildAgentToolset` — merge built-in tools with MCP-discovered tools into a
|
|
3
|
+
* single `ToolSchema[]` registered with the LLM provider, plus a dispatch
|
|
4
|
+
* map from namespaced tool name → owning MCP client.
|
|
5
|
+
*
|
|
6
|
+
* Per ADR §H7, the provider doesn't know MCP exists; the agent layer routes
|
|
7
|
+
* tool calls based on whether the name is in `mcpDispatch`.
|
|
8
|
+
*/
|
|
9
|
+
export async function buildAgentToolset(builtIn, mcpClients) {
|
|
10
|
+
const tools = [...builtIn];
|
|
11
|
+
const mcpDispatch = new Map();
|
|
12
|
+
const seen = new Set(builtIn.map((t) => t.name));
|
|
13
|
+
for (const client of mcpClients) {
|
|
14
|
+
let mcpTools;
|
|
15
|
+
try {
|
|
16
|
+
mcpTools = await client.listTools();
|
|
17
|
+
}
|
|
18
|
+
catch (err) {
|
|
19
|
+
process.stderr.write(`[anvil-mcp] WARN: server "${client.config.name}" listTools failed: ${err.message}\n`);
|
|
20
|
+
continue;
|
|
21
|
+
}
|
|
22
|
+
for (const t of mcpTools) {
|
|
23
|
+
if (seen.has(t.name)) {
|
|
24
|
+
process.stderr.write(`[anvil-mcp] WARN: tool name collision "${t.name}"; ignoring duplicate from "${client.config.name}"\n`);
|
|
25
|
+
continue;
|
|
26
|
+
}
|
|
27
|
+
tools.push(t);
|
|
28
|
+
mcpDispatch.set(t.name, client);
|
|
29
|
+
seen.add(t.name);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return { tools, mcpDispatch };
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=tool-merger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-merger.js","sourceRoot":"","sources":["../../src/mcp/tool-merger.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAYH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,OAAqB,EACrB,UAA4B;IAE5B,MAAM,KAAK,GAAiB,CAAC,GAAG,OAAO,CAAC,CAAC;IACzC,MAAM,WAAW,GAAG,IAAI,GAAG,EAA0B,CAAC;IACtD,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAEjD,KAAK,MAAM,MAAM,IAAI,UAAU,EAAE,CAAC;QAChC,IAAI,QAAsB,CAAC;QAC3B,IAAI,CAAC;YACH,QAAQ,GAAG,MAAM,MAAM,CAAC,SAAS,EAAE,CAAC;QACtC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,6BAA6B,MAAM,CAAC,MAAM,CAAC,IAAI,uBAAwB,GAAa,CAAC,OAAO,IAAI,CACjG,CAAC;YACF,SAAS;QACX,CAAC;QACD,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;YACzB,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;gBACrB,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,0CAA0C,CAAC,CAAC,IAAI,+BAA+B,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CACvG,CAAC;gBACF,SAAS;YACX,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACd,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YAChC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACnB,CAAC;IACH,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC;AAChC,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP client types — agent-layer abstractions over the official SDK's
|
|
3
|
+
* stdio/streamable-http transports.
|
|
4
|
+
*
|
|
5
|
+
* See AGENT-HARNESS-ADR.md §4 for the locked mcp.json schema. Transport is
|
|
6
|
+
* inferred from shape: `command` present → 'stdio'; `url` present →
|
|
7
|
+
* 'streamable-http'; never both.
|
|
8
|
+
*/
|
|
9
|
+
export type McpTransport = 'stdio' | 'streamable-http';
|
|
10
|
+
export interface McpServerConfig {
|
|
11
|
+
/** Logical name of the server (used to namespace tools as `<name>/<tool>`). */
|
|
12
|
+
name: string;
|
|
13
|
+
/** Inferred from {command, url} presence at parse time. */
|
|
14
|
+
transport: McpTransport;
|
|
15
|
+
/** stdio: spawn `command args[]` with `env`. */
|
|
16
|
+
command?: string;
|
|
17
|
+
args?: string[];
|
|
18
|
+
env?: Record<string, string>;
|
|
19
|
+
/** streamable-http: POST to `url` with `headers`. */
|
|
20
|
+
url?: string;
|
|
21
|
+
headers?: Record<string, string>;
|
|
22
|
+
}
|
|
23
|
+
/** Raw shape of an `mcp.json` file. */
|
|
24
|
+
export interface McpServersFile {
|
|
25
|
+
mcpServers: Record<string, McpServerEntry>;
|
|
26
|
+
}
|
|
27
|
+
/** Raw shape of one entry inside `mcpServers`. */
|
|
28
|
+
export interface McpServerEntry {
|
|
29
|
+
command?: string;
|
|
30
|
+
args?: string[];
|
|
31
|
+
env?: Record<string, string>;
|
|
32
|
+
url?: string;
|
|
33
|
+
headers?: Record<string, string>;
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/mcp/types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,iBAAiB,CAAC;AAEvD,MAAM,WAAW,eAAe;IAC9B,+EAA+E;IAC/E,IAAI,EAAE,MAAM,CAAC;IACb,2DAA2D;IAC3D,SAAS,EAAE,YAAY,CAAC;IACxB,gDAAgD;IAChD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,qDAAqD;IACrD,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAED,uCAAuC;AACvC,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;CAC5C;AAED,kDAAkD;AAClD,MAAM,WAAW,cAAc;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP client types — agent-layer abstractions over the official SDK's
|
|
3
|
+
* stdio/streamable-http transports.
|
|
4
|
+
*
|
|
5
|
+
* See AGENT-HARNESS-ADR.md §4 for the locked mcp.json schema. Transport is
|
|
6
|
+
* inferred from shape: `command` present → 'stdio'; `url` present →
|
|
7
|
+
* 'streamable-http'; never both.
|
|
8
|
+
*/
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/mcp/types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}
|
|
@@ -0,0 +1,95 @@
|
|
|
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 type { ModelAdapter, ModelAdapterConfig, ModelAdapterResult, ProviderCapabilities } from './types.js';
|
|
25
|
+
import { LocalExecutor } from './router/local-executor.js';
|
|
26
|
+
/** Thrown when the conversation history can't be trimmed below num_ctx
|
|
27
|
+
* (e.g. one tool result alone exceeds the window). The dashboard
|
|
28
|
+
* resolver catches this and re-runs the stage with an escalation chain
|
|
29
|
+
* that skips local. */
|
|
30
|
+
export declare class ContextExhaustedError extends Error {
|
|
31
|
+
readonly model: string;
|
|
32
|
+
readonly numCtx: number;
|
|
33
|
+
readonly historyTokens: number;
|
|
34
|
+
constructor(model: string, numCtx: number, historyTokens: number);
|
|
35
|
+
}
|
|
36
|
+
interface OllamaToolCall {
|
|
37
|
+
function: {
|
|
38
|
+
name: string;
|
|
39
|
+
arguments: Record<string, unknown> | string;
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
interface ChatMessage {
|
|
43
|
+
role: 'system' | 'user' | 'assistant' | 'tool';
|
|
44
|
+
content: string;
|
|
45
|
+
tool_calls?: OllamaToolCall[];
|
|
46
|
+
tool_call_id?: string;
|
|
47
|
+
}
|
|
48
|
+
export declare class OllamaAdapter implements ModelAdapter {
|
|
49
|
+
private readonly executor;
|
|
50
|
+
readonly provider: "ollama";
|
|
51
|
+
readonly capabilities: ProviderCapabilities;
|
|
52
|
+
/**
|
|
53
|
+
* In-flight AbortControllers — one per concurrent run() invocation.
|
|
54
|
+
* The adapter is a singleton, but per-repo stages (build/validate/
|
|
55
|
+
* specs/tasks) run multiple repos in parallel against it. A single
|
|
56
|
+
* instance-level field would let one call's `finally` block null out
|
|
57
|
+
* the controller while another is still mid-fetch, causing
|
|
58
|
+
* "Cannot read properties of null (reading 'signal')". The Set lets
|
|
59
|
+
* concurrent calls each own their own controller; kill() aborts all.
|
|
60
|
+
*/
|
|
61
|
+
private activeControllers;
|
|
62
|
+
/**
|
|
63
|
+
* @param executor — Single-slot FIFO queue used when a call sets
|
|
64
|
+
* `config.exclusiveSlot === true`. Defaults to the process-wide
|
|
65
|
+
* singleton; tests inject a fresh instance for isolation.
|
|
66
|
+
*/
|
|
67
|
+
constructor(executor?: LocalExecutor);
|
|
68
|
+
supportsModel(_modelId: string): boolean;
|
|
69
|
+
getModelPricing(_modelId: string): [number, number] | null;
|
|
70
|
+
checkAvailability(): Promise<{
|
|
71
|
+
available: boolean;
|
|
72
|
+
version?: string;
|
|
73
|
+
error?: string;
|
|
74
|
+
}>;
|
|
75
|
+
kill(): void;
|
|
76
|
+
run(config: ModelAdapterConfig, output: NodeJS.WritableStream): Promise<ModelAdapterResult>;
|
|
77
|
+
private runInner;
|
|
78
|
+
/**
|
|
79
|
+
* One round-trip with Ollama: send messages + tools, drain the NDJSON
|
|
80
|
+
* stream, return the assistant's text accumulator + any tool_calls
|
|
81
|
+
* the model emitted in the final chunk.
|
|
82
|
+
*/
|
|
83
|
+
private runOneTurn;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Drop the oldest tool-role messages until the history fits below
|
|
87
|
+
* SOFT_TRIM_RATIO × numCtx. Keeps system + user prompts intact (they
|
|
88
|
+
* carry the original task framing) and keeps the most recent turns
|
|
89
|
+
* intact (where the active state of the loop lives). If we can't trim
|
|
90
|
+
* enough — e.g. a single tool_result is bigger than the window —
|
|
91
|
+
* escalate via ContextExhaustedError.
|
|
92
|
+
*/
|
|
93
|
+
export declare function trimHistoryIfNeeded(messages: ChatMessage[], numCtx: number, model: string): void;
|
|
94
|
+
export {};
|
|
95
|
+
//# sourceMappingURL=ollama-adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ollama-adapter.d.ts","sourceRoot":"","sources":["../src/ollama-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAGH,OAAO,KAAK,EACV,YAAY,EACZ,kBAAkB,EAClB,kBAAkB,EAClB,oBAAoB,EAIrB,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,aAAa,EAAiB,MAAM,4BAA4B,CAAC;AAmB1E;;;wBAGwB;AACxB,qBAAa,qBAAsB,SAAQ,KAAK;IAC9C,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;gBACnB,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM;CAUjE;AAuBD,UAAU,cAAc;IACtB,QAAQ,EAAE;QACR,IAAI,EAAE,MAAM,CAAC;QACb,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC;KAC7C,CAAC;CACH;AAWD,UAAU,WAAW;IACnB,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,WAAW,GAAG,MAAM,CAAC;IAC/C,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,cAAc,EAAE,CAAC;IAC9B,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAMD,qBAAa,aAAc,YAAW,YAAY;IA+BpC,OAAO,CAAC,QAAQ,CAAC,QAAQ;IA9BrC,QAAQ,CAAC,QAAQ,EAAG,QAAQ,CAAU;IAEtC,QAAQ,CAAC,YAAY,EAAE,oBAAoB,CAUzC;IAEF;;;;;;;;OAQG;IACH,OAAO,CAAC,iBAAiB,CAA8B;IAEvD;;;;OAIG;gBAC0B,QAAQ,GAAE,aAA6B;IAEpE,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAKxC,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI;IAIpD,iBAAiB,IAAI,OAAO,CAAC;QAAE,SAAS,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAY5F,IAAI,IAAI,IAAI;IAON,GAAG,CACP,MAAM,EAAE,kBAAkB,EAC1B,MAAM,EAAE,MAAM,CAAC,cAAc,GAC5B,OAAO,CAAC,kBAAkB,CAAC;YAOhB,QAAQ;IAsGtB;;;;OAIG;YACW,UAAU;CAuGzB;AAwED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,WAAW,EAAE,EACvB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,GACZ,IAAI,CAgBN"}
|