@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,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CheckpointStore — persistence for CheckpointRecord JSON files.
|
|
3
|
+
*
|
|
4
|
+
* Storage layout:
|
|
5
|
+
* <anvilHome>/checkpoints/<project>/<runFamily>/<stage>/<hash>.json
|
|
6
|
+
* <anvilHome>/checkpoints/_blobs/<sha[0:2]>/<sha> (via BlobStore)
|
|
7
|
+
*
|
|
8
|
+
* All writes go through tmp + renameSync for atomicity. Missing or corrupt
|
|
9
|
+
* JSON files are treated as absent (get returns null and logs to stderr).
|
|
10
|
+
*
|
|
11
|
+
* ── Stats accounting (approximate) ───────────────────────────────────────
|
|
12
|
+
*
|
|
13
|
+
* `stats()` mixes two data sources:
|
|
14
|
+
* - On-disk counts (total/completed/interrupted/failed) are authoritative.
|
|
15
|
+
* - `hits` is an in-memory counter incremented inside `get()` every time a
|
|
16
|
+
* caller observes a `completed` record. `misses` counts `begin()` calls.
|
|
17
|
+
*
|
|
18
|
+
* This means `hits` resets across process restarts — it reflects *this*
|
|
19
|
+
* process's cache-reuse activity, not lifetime reuse. `hitRate` is computed
|
|
20
|
+
* as hits / (hits + misses). The costSavedUsd estimate sums the cost of
|
|
21
|
+
* each observed hit (i.e. the cost Anvil would have paid to re-run it).
|
|
22
|
+
* Misses before a restart are not retroactively credited.
|
|
23
|
+
*
|
|
24
|
+
* This approximation is documented here and referenced by the integration
|
|
25
|
+
* notes. It's intentional: we don't need a durable hit counter for the
|
|
26
|
+
* main goal (skip already-done work); the metric is informational.
|
|
27
|
+
*/
|
|
28
|
+
import { BlobStore } from './blob-store.js';
|
|
29
|
+
import type { CheckpointInputs, CheckpointKey, CheckpointRecord, CheckpointStage, CheckpointStats, CheckpointStatus } from './types.js';
|
|
30
|
+
export interface CheckpointStoreOpts {
|
|
31
|
+
anvilHome: string;
|
|
32
|
+
blobStore: BlobStore;
|
|
33
|
+
}
|
|
34
|
+
export declare class CheckpointStore {
|
|
35
|
+
private readonly anvilHome;
|
|
36
|
+
private readonly blobStore;
|
|
37
|
+
/** In-memory hit/miss counters; see file header for semantics. */
|
|
38
|
+
private hitCount;
|
|
39
|
+
private missCount;
|
|
40
|
+
private hitCostUsd;
|
|
41
|
+
constructor(opts: CheckpointStoreOpts);
|
|
42
|
+
/**
|
|
43
|
+
* Look up a checkpoint by key. Returns null when missing or corrupt. If the
|
|
44
|
+
* returned record is `completed` and its blob exists, increments the hit
|
|
45
|
+
* counter (and adds its recorded cost to costSavedUsd).
|
|
46
|
+
*/
|
|
47
|
+
get(project: string, runFamily: string, key: CheckpointKey): CheckpointRecord | null;
|
|
48
|
+
/** Persist a record to disk atomically. */
|
|
49
|
+
write(project: string, record: CheckpointRecord): void;
|
|
50
|
+
/**
|
|
51
|
+
* Claim a checkpoint: write `status: 'running'` with startedAt. Used
|
|
52
|
+
* before the agent executes so interrupted runs can be detected on
|
|
53
|
+
* resume. Counts as a cache miss.
|
|
54
|
+
*/
|
|
55
|
+
begin(project: string, runFamily: string, inputs: CheckpointInputs, cost?: CheckpointRecord['cost']): CheckpointRecord;
|
|
56
|
+
/**
|
|
57
|
+
* Mark a checkpoint completed with its serialized output. Writes the blob
|
|
58
|
+
* first (so a subsequent `get` that sees the record always finds bytes).
|
|
59
|
+
*/
|
|
60
|
+
complete(project: string, runFamily: string, key: CheckpointKey, output: string | Buffer, cost?: CheckpointRecord['cost']): CheckpointRecord;
|
|
61
|
+
/**
|
|
62
|
+
* Mark a checkpoint as interrupted (SIGTERM / cost-reject / user cancel).
|
|
63
|
+
* If a partial output is provided, it is stored as a blob so the next
|
|
64
|
+
* resume can inspect it.
|
|
65
|
+
*/
|
|
66
|
+
interrupt(project: string, runFamily: string, key: CheckpointKey, partialOutput?: string | Buffer, reason?: string): CheckpointRecord;
|
|
67
|
+
/** Mark a checkpoint as failed with the error message. */
|
|
68
|
+
fail(project: string, runFamily: string, key: CheckpointKey, err: string): CheckpointRecord;
|
|
69
|
+
/**
|
|
70
|
+
* Enumerate every checkpoint record for a given run family across all
|
|
71
|
+
* stages. Skips corrupt files silently.
|
|
72
|
+
*/
|
|
73
|
+
listForRun(project: string, runFamily: string): CheckpointRecord[];
|
|
74
|
+
/**
|
|
75
|
+
* Delete on-disk records for a stage within a run. Does NOT touch blobs
|
|
76
|
+
* (those are content-addressed; use `BlobStore.gc` for that).
|
|
77
|
+
*/
|
|
78
|
+
invalidateStage(project: string, runFamily: string, stage: CheckpointStage): number;
|
|
79
|
+
/** Aggregate stats for a run family. See file header for approximation notes. */
|
|
80
|
+
stats(project: string, runFamily: string): CheckpointStats;
|
|
81
|
+
/** Visible for tests: reset in-memory hit/miss accounting. */
|
|
82
|
+
resetCounters(): void;
|
|
83
|
+
/** Visible for tests: current in-memory counters. */
|
|
84
|
+
getCounters(): {
|
|
85
|
+
hits: number;
|
|
86
|
+
misses: number;
|
|
87
|
+
hitCostUsd: number;
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
export type { CheckpointStatus };
|
|
91
|
+
//# sourceMappingURL=store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/checkpoint/store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAaH,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,OAAO,KAAK,EACV,gBAAgB,EAChB,aAAa,EACb,gBAAgB,EAChB,eAAe,EACf,eAAe,EACf,gBAAgB,EACjB,MAAM,YAAY,CAAC;AA2CpB,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,SAAS,CAAC;CACtB;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAY;IAEtC,kEAAkE;IAClE,OAAO,CAAC,QAAQ,CAAK;IACrB,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,UAAU,CAAK;gBAEX,IAAI,EAAE,mBAAmB;IAKrC;;;;OAIG;IACH,GAAG,CACD,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,aAAa,GACjB,gBAAgB,GAAG,IAAI;IAqB1B,2CAA2C;IAC3C,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,gBAAgB,GAAG,IAAI;IAWtD;;;;OAIG;IACH,KAAK,CACH,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,gBAAgB,EACxB,IAAI,CAAC,EAAE,gBAAgB,CAAC,MAAM,CAAC,GAC9B,gBAAgB;IAcnB;;;OAGG;IACH,QAAQ,CACN,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,aAAa,EAClB,MAAM,EAAE,MAAM,GAAG,MAAM,EACvB,IAAI,CAAC,EAAE,gBAAgB,CAAC,MAAM,CAAC,GAC9B,gBAAgB;IA2BnB;;;;OAIG;IACH,SAAS,CACP,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,aAAa,EAClB,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,EAC/B,MAAM,CAAC,EAAE,MAAM,GACd,gBAAgB;IA+BnB,0DAA0D;IAC1D,IAAI,CACF,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,aAAa,EAClB,GAAG,EAAE,MAAM,GACV,gBAAgB;IA0BnB;;;OAGG;IACH,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,gBAAgB,EAAE;IA4BlE;;;OAGG;IACH,eAAe,CACb,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,eAAe,GACrB,MAAM;IA2BT,iFAAiF;IACjF,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,eAAe;IAkB1D,8DAA8D;IAC9D,aAAa,IAAI,IAAI;IAMrB,qDAAqD;IACrD,WAAW,IAAI;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE;CAGpE;AAED,YAAY,EAAE,gBAAgB,EAAE,CAAC"}
|
|
@@ -0,0 +1,292 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CheckpointStore — persistence for CheckpointRecord JSON files.
|
|
3
|
+
*
|
|
4
|
+
* Storage layout:
|
|
5
|
+
* <anvilHome>/checkpoints/<project>/<runFamily>/<stage>/<hash>.json
|
|
6
|
+
* <anvilHome>/checkpoints/_blobs/<sha[0:2]>/<sha> (via BlobStore)
|
|
7
|
+
*
|
|
8
|
+
* All writes go through tmp + renameSync for atomicity. Missing or corrupt
|
|
9
|
+
* JSON files are treated as absent (get returns null and logs to stderr).
|
|
10
|
+
*
|
|
11
|
+
* ── Stats accounting (approximate) ───────────────────────────────────────
|
|
12
|
+
*
|
|
13
|
+
* `stats()` mixes two data sources:
|
|
14
|
+
* - On-disk counts (total/completed/interrupted/failed) are authoritative.
|
|
15
|
+
* - `hits` is an in-memory counter incremented inside `get()` every time a
|
|
16
|
+
* caller observes a `completed` record. `misses` counts `begin()` calls.
|
|
17
|
+
*
|
|
18
|
+
* This means `hits` resets across process restarts — it reflects *this*
|
|
19
|
+
* process's cache-reuse activity, not lifetime reuse. `hitRate` is computed
|
|
20
|
+
* as hits / (hits + misses). The costSavedUsd estimate sums the cost of
|
|
21
|
+
* each observed hit (i.e. the cost Anvil would have paid to re-run it).
|
|
22
|
+
* Misses before a restart are not retroactively credited.
|
|
23
|
+
*
|
|
24
|
+
* This approximation is documented here and referenced by the integration
|
|
25
|
+
* notes. It's intentional: we don't need a durable hit counter for the
|
|
26
|
+
* main goal (skip already-done work); the metric is informational.
|
|
27
|
+
*/
|
|
28
|
+
import { existsSync, mkdirSync, readdirSync, readFileSync, renameSync, unlinkSync, writeFileSync, } from 'node:fs';
|
|
29
|
+
import { dirname, join } from 'node:path';
|
|
30
|
+
import { checkpointPath, checkpointRoot, computeKey } from './key.js';
|
|
31
|
+
const STAGES = [
|
|
32
|
+
'plan',
|
|
33
|
+
'implement',
|
|
34
|
+
'review',
|
|
35
|
+
'test',
|
|
36
|
+
'ship',
|
|
37
|
+
'kb-grounding',
|
|
38
|
+
'mutation',
|
|
39
|
+
];
|
|
40
|
+
function ensureDir(dir) {
|
|
41
|
+
if (!existsSync(dir))
|
|
42
|
+
mkdirSync(dir, { recursive: true });
|
|
43
|
+
}
|
|
44
|
+
function atomicWriteFileSync(filePath, data) {
|
|
45
|
+
ensureDir(dirname(filePath));
|
|
46
|
+
const tmp = `${filePath}.${process.pid}.${Math.random().toString(36).slice(2)}.tmp`;
|
|
47
|
+
try {
|
|
48
|
+
writeFileSync(tmp, data, 'utf-8');
|
|
49
|
+
renameSync(tmp, filePath);
|
|
50
|
+
}
|
|
51
|
+
catch (err) {
|
|
52
|
+
try {
|
|
53
|
+
unlinkSync(tmp);
|
|
54
|
+
}
|
|
55
|
+
catch { /* ignore */ }
|
|
56
|
+
throw err;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
function readRecord(filePath) {
|
|
60
|
+
try {
|
|
61
|
+
const raw = readFileSync(filePath, 'utf-8');
|
|
62
|
+
return JSON.parse(raw);
|
|
63
|
+
}
|
|
64
|
+
catch (err) {
|
|
65
|
+
if (err.code === 'ENOENT')
|
|
66
|
+
return null;
|
|
67
|
+
process.stderr.write(`[checkpoint-store] skipping corrupt record ${filePath}: ${err instanceof Error ? err.message : String(err)}\n`);
|
|
68
|
+
return null;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
export class CheckpointStore {
|
|
72
|
+
anvilHome;
|
|
73
|
+
blobStore;
|
|
74
|
+
/** In-memory hit/miss counters; see file header for semantics. */
|
|
75
|
+
hitCount = 0;
|
|
76
|
+
missCount = 0;
|
|
77
|
+
hitCostUsd = 0;
|
|
78
|
+
constructor(opts) {
|
|
79
|
+
this.anvilHome = opts.anvilHome;
|
|
80
|
+
this.blobStore = opts.blobStore;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Look up a checkpoint by key. Returns null when missing or corrupt. If the
|
|
84
|
+
* returned record is `completed` and its blob exists, increments the hit
|
|
85
|
+
* counter (and adds its recorded cost to costSavedUsd).
|
|
86
|
+
*/
|
|
87
|
+
get(project, runFamily, key) {
|
|
88
|
+
const path = checkpointPath(this.anvilHome, project, runFamily, key.stage, key.hash);
|
|
89
|
+
const record = readRecord(path);
|
|
90
|
+
if (!record)
|
|
91
|
+
return null;
|
|
92
|
+
if (record.status === 'completed' &&
|
|
93
|
+
record.outputRef &&
|
|
94
|
+
this.blobStore.exists(record.outputRef)) {
|
|
95
|
+
this.hitCount += 1;
|
|
96
|
+
if (record.cost?.usd)
|
|
97
|
+
this.hitCostUsd += record.cost.usd;
|
|
98
|
+
}
|
|
99
|
+
return record;
|
|
100
|
+
}
|
|
101
|
+
/** Persist a record to disk atomically. */
|
|
102
|
+
write(project, record) {
|
|
103
|
+
const path = checkpointPath(this.anvilHome, project, record.key.runFamily, record.key.stage, record.key.hash);
|
|
104
|
+
atomicWriteFileSync(path, JSON.stringify(record, null, 2));
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Claim a checkpoint: write `status: 'running'` with startedAt. Used
|
|
108
|
+
* before the agent executes so interrupted runs can be detected on
|
|
109
|
+
* resume. Counts as a cache miss.
|
|
110
|
+
*/
|
|
111
|
+
begin(project, runFamily, inputs, cost) {
|
|
112
|
+
const key = computeKey(runFamily, inputs);
|
|
113
|
+
const record = {
|
|
114
|
+
key,
|
|
115
|
+
project,
|
|
116
|
+
status: 'running',
|
|
117
|
+
startedAt: new Date().toISOString(),
|
|
118
|
+
...(cost ? { cost } : {}),
|
|
119
|
+
};
|
|
120
|
+
this.write(project, record);
|
|
121
|
+
this.missCount += 1;
|
|
122
|
+
return record;
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Mark a checkpoint completed with its serialized output. Writes the blob
|
|
126
|
+
* first (so a subsequent `get` that sees the record always finds bytes).
|
|
127
|
+
*/
|
|
128
|
+
complete(project, runFamily, key, output, cost) {
|
|
129
|
+
const blob = this.blobStore.write(output);
|
|
130
|
+
const path = checkpointPath(this.anvilHome, project, runFamily, key.stage, key.hash);
|
|
131
|
+
const existing = readRecord(path);
|
|
132
|
+
const startedAt = existing?.startedAt ?? new Date().toISOString();
|
|
133
|
+
const completedAt = new Date().toISOString();
|
|
134
|
+
const durationMs = new Date(completedAt).getTime() - new Date(startedAt).getTime();
|
|
135
|
+
const record = {
|
|
136
|
+
key,
|
|
137
|
+
project,
|
|
138
|
+
status: 'completed',
|
|
139
|
+
outputRef: blob.sha,
|
|
140
|
+
startedAt,
|
|
141
|
+
completedAt,
|
|
142
|
+
durationMs,
|
|
143
|
+
...(cost ? { cost } : existing?.cost ? { cost: existing.cost } : {}),
|
|
144
|
+
};
|
|
145
|
+
this.write(project, record);
|
|
146
|
+
return record;
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Mark a checkpoint as interrupted (SIGTERM / cost-reject / user cancel).
|
|
150
|
+
* If a partial output is provided, it is stored as a blob so the next
|
|
151
|
+
* resume can inspect it.
|
|
152
|
+
*/
|
|
153
|
+
interrupt(project, runFamily, key, partialOutput, reason) {
|
|
154
|
+
const path = checkpointPath(this.anvilHome, project, runFamily, key.stage, key.hash);
|
|
155
|
+
const existing = readRecord(path);
|
|
156
|
+
const startedAt = existing?.startedAt ?? new Date().toISOString();
|
|
157
|
+
const completedAt = new Date().toISOString();
|
|
158
|
+
const durationMs = new Date(completedAt).getTime() - new Date(startedAt).getTime();
|
|
159
|
+
let outputRef;
|
|
160
|
+
if (partialOutput !== undefined) {
|
|
161
|
+
outputRef = this.blobStore.write(partialOutput).sha;
|
|
162
|
+
}
|
|
163
|
+
const record = {
|
|
164
|
+
key,
|
|
165
|
+
project,
|
|
166
|
+
status: 'interrupted',
|
|
167
|
+
startedAt,
|
|
168
|
+
completedAt,
|
|
169
|
+
durationMs,
|
|
170
|
+
...(outputRef ? { outputRef } : {}),
|
|
171
|
+
...(reason ? { errorMessage: reason } : {}),
|
|
172
|
+
...(existing?.cost ? { cost: existing.cost } : {}),
|
|
173
|
+
};
|
|
174
|
+
this.write(project, record);
|
|
175
|
+
return record;
|
|
176
|
+
}
|
|
177
|
+
/** Mark a checkpoint as failed with the error message. */
|
|
178
|
+
fail(project, runFamily, key, err) {
|
|
179
|
+
const path = checkpointPath(this.anvilHome, project, runFamily, key.stage, key.hash);
|
|
180
|
+
const existing = readRecord(path);
|
|
181
|
+
const startedAt = existing?.startedAt ?? new Date().toISOString();
|
|
182
|
+
const completedAt = new Date().toISOString();
|
|
183
|
+
const durationMs = new Date(completedAt).getTime() - new Date(startedAt).getTime();
|
|
184
|
+
const record = {
|
|
185
|
+
key,
|
|
186
|
+
project,
|
|
187
|
+
status: 'failed',
|
|
188
|
+
startedAt,
|
|
189
|
+
completedAt,
|
|
190
|
+
durationMs,
|
|
191
|
+
errorMessage: err,
|
|
192
|
+
...(existing?.cost ? { cost: existing.cost } : {}),
|
|
193
|
+
};
|
|
194
|
+
this.write(project, record);
|
|
195
|
+
return record;
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Enumerate every checkpoint record for a given run family across all
|
|
199
|
+
* stages. Skips corrupt files silently.
|
|
200
|
+
*/
|
|
201
|
+
listForRun(project, runFamily) {
|
|
202
|
+
const runDir = join(checkpointRoot(this.anvilHome), project, runFamily);
|
|
203
|
+
if (!existsSync(runDir))
|
|
204
|
+
return [];
|
|
205
|
+
const out = [];
|
|
206
|
+
let stageDirs;
|
|
207
|
+
try {
|
|
208
|
+
stageDirs = readdirSync(runDir);
|
|
209
|
+
}
|
|
210
|
+
catch {
|
|
211
|
+
return [];
|
|
212
|
+
}
|
|
213
|
+
for (const stage of stageDirs) {
|
|
214
|
+
if (!STAGES.includes(stage))
|
|
215
|
+
continue;
|
|
216
|
+
const stageDir = join(runDir, stage);
|
|
217
|
+
let files;
|
|
218
|
+
try {
|
|
219
|
+
files = readdirSync(stageDir);
|
|
220
|
+
}
|
|
221
|
+
catch {
|
|
222
|
+
continue;
|
|
223
|
+
}
|
|
224
|
+
for (const file of files) {
|
|
225
|
+
if (!file.endsWith('.json'))
|
|
226
|
+
continue;
|
|
227
|
+
const rec = readRecord(join(stageDir, file));
|
|
228
|
+
if (rec)
|
|
229
|
+
out.push(rec);
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
return out;
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* Delete on-disk records for a stage within a run. Does NOT touch blobs
|
|
236
|
+
* (those are content-addressed; use `BlobStore.gc` for that).
|
|
237
|
+
*/
|
|
238
|
+
invalidateStage(project, runFamily, stage) {
|
|
239
|
+
const stageDir = join(checkpointRoot(this.anvilHome), project, runFamily, stage);
|
|
240
|
+
if (!existsSync(stageDir))
|
|
241
|
+
return 0;
|
|
242
|
+
let count = 0;
|
|
243
|
+
let files;
|
|
244
|
+
try {
|
|
245
|
+
files = readdirSync(stageDir);
|
|
246
|
+
}
|
|
247
|
+
catch {
|
|
248
|
+
return 0;
|
|
249
|
+
}
|
|
250
|
+
for (const file of files) {
|
|
251
|
+
if (!file.endsWith('.json'))
|
|
252
|
+
continue;
|
|
253
|
+
try {
|
|
254
|
+
unlinkSync(join(stageDir, file));
|
|
255
|
+
count += 1;
|
|
256
|
+
}
|
|
257
|
+
catch {
|
|
258
|
+
// best effort
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
return count;
|
|
262
|
+
}
|
|
263
|
+
/** Aggregate stats for a run family. See file header for approximation notes. */
|
|
264
|
+
stats(project, runFamily) {
|
|
265
|
+
const records = this.listForRun(project, runFamily);
|
|
266
|
+
const total = records.length;
|
|
267
|
+
const interrupted = records.filter((r) => r.status === 'interrupted').length;
|
|
268
|
+
const hits = this.hitCount;
|
|
269
|
+
const misses = this.missCount;
|
|
270
|
+
const denom = hits + misses;
|
|
271
|
+
const hitRate = denom === 0 ? 0 : hits / denom;
|
|
272
|
+
return {
|
|
273
|
+
total,
|
|
274
|
+
hits,
|
|
275
|
+
misses,
|
|
276
|
+
interrupted,
|
|
277
|
+
hitRate,
|
|
278
|
+
costSavedUsd: this.hitCostUsd,
|
|
279
|
+
};
|
|
280
|
+
}
|
|
281
|
+
/** Visible for tests: reset in-memory hit/miss accounting. */
|
|
282
|
+
resetCounters() {
|
|
283
|
+
this.hitCount = 0;
|
|
284
|
+
this.missCount = 0;
|
|
285
|
+
this.hitCostUsd = 0;
|
|
286
|
+
}
|
|
287
|
+
/** Visible for tests: current in-memory counters. */
|
|
288
|
+
getCounters() {
|
|
289
|
+
return { hits: this.hitCount, misses: this.missCount, hitCostUsd: this.hitCostUsd };
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
//# sourceMappingURL=store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/checkpoint/store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Phase 9 — Deterministic agent checkpoints.
|
|
3
|
+
*
|
|
4
|
+
* Types shared across the checkpoint subsystem: the key/fingerprint
|
|
5
|
+
* computation (`checkpoint-key.ts`), the content-addressed blob store
|
|
6
|
+
* (`checkpoint-blob-store.ts`), the record store (`checkpoint-store.ts`),
|
|
7
|
+
* and the higher-order agent wrapper (`agent-runner-wrapper.ts`).
|
|
8
|
+
*
|
|
9
|
+
* A checkpoint is a per-(project, runFamily, stage, hash) record of whether
|
|
10
|
+
* a particular agent invocation has already produced output, so that a
|
|
11
|
+
* resumed run can skip it. The hash is a sha256 derived from a stable
|
|
12
|
+
* fingerprint of every input that should invalidate the cache on drift
|
|
13
|
+
* (prompt version, tool versions, model id, and the input payload).
|
|
14
|
+
*/
|
|
15
|
+
/** Logical pipeline stages that emit checkpoints. */
|
|
16
|
+
export type CheckpointStage = 'plan' | 'implement' | 'review' | 'test' | 'ship' | 'kb-grounding' | 'mutation';
|
|
17
|
+
/** Lifecycle state of a single checkpoint record. */
|
|
18
|
+
export type CheckpointStatus = 'pending' | 'running' | 'completed' | 'interrupted' | 'failed';
|
|
19
|
+
/**
|
|
20
|
+
* The inputs that go into computing a checkpoint key.
|
|
21
|
+
*
|
|
22
|
+
* Any field here drifts → different hash → cache miss → fresh run. Fields
|
|
23
|
+
* are intentionally denormalized so callers don't forget to include
|
|
24
|
+
* promptVersion / model etc.
|
|
25
|
+
*/
|
|
26
|
+
export interface CheckpointInputs {
|
|
27
|
+
stage: CheckpointStage;
|
|
28
|
+
/** Stable task identifier within a stage (e.g. "impl:src/foo.ts"). */
|
|
29
|
+
taskId: string;
|
|
30
|
+
/** Arbitrary JSON-serializable input payload; fingerprinted recursively. */
|
|
31
|
+
inputs: unknown;
|
|
32
|
+
/** Persona / prompt version string — bump to invalidate cached outputs. */
|
|
33
|
+
promptVersion: string;
|
|
34
|
+
/** Tool versions that materially affect output (e.g. { tsc: '5.3.3' }). */
|
|
35
|
+
toolVersions?: Record<string, string>;
|
|
36
|
+
/** Model identifier used for the invocation. */
|
|
37
|
+
model?: string;
|
|
38
|
+
}
|
|
39
|
+
/** Identifier for a checkpoint, computed from CheckpointInputs. */
|
|
40
|
+
export interface CheckpointKey {
|
|
41
|
+
/** sha256 hex string uniquely identifying the input set. */
|
|
42
|
+
hash: string;
|
|
43
|
+
/** Groups re-runs of the same logical run across retries / resumes. */
|
|
44
|
+
runFamily: string;
|
|
45
|
+
stage: CheckpointStage;
|
|
46
|
+
taskId: string;
|
|
47
|
+
}
|
|
48
|
+
/** On-disk record for one checkpoint. */
|
|
49
|
+
export interface CheckpointRecord {
|
|
50
|
+
key: CheckpointKey;
|
|
51
|
+
project: string;
|
|
52
|
+
status: CheckpointStatus;
|
|
53
|
+
/** Content-addressed blob sha (hex) for the serialized output. */
|
|
54
|
+
outputRef?: string;
|
|
55
|
+
cost?: {
|
|
56
|
+
usd: number;
|
|
57
|
+
tokensIn: number;
|
|
58
|
+
tokensOut: number;
|
|
59
|
+
};
|
|
60
|
+
startedAt: string;
|
|
61
|
+
completedAt?: string;
|
|
62
|
+
durationMs?: number;
|
|
63
|
+
errorMessage?: string;
|
|
64
|
+
}
|
|
65
|
+
/** Aggregate metrics for a run family. */
|
|
66
|
+
export interface CheckpointStats {
|
|
67
|
+
total: number;
|
|
68
|
+
hits: number;
|
|
69
|
+
misses: number;
|
|
70
|
+
interrupted: number;
|
|
71
|
+
hitRate: number;
|
|
72
|
+
costSavedUsd: number;
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/checkpoint/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,qDAAqD;AACrD,MAAM,MAAM,eAAe,GACvB,MAAM,GACN,WAAW,GACX,QAAQ,GACR,MAAM,GACN,MAAM,GACN,cAAc,GACd,UAAU,CAAC;AAEf,qDAAqD;AACrD,MAAM,MAAM,gBAAgB,GACxB,SAAS,GACT,SAAS,GACT,WAAW,GACX,aAAa,GACb,QAAQ,CAAC;AAEb;;;;;;GAMG;AACH,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,eAAe,CAAC;IACvB,sEAAsE;IACtE,MAAM,EAAE,MAAM,CAAC;IACf,4EAA4E;IAC5E,MAAM,EAAE,OAAO,CAAC;IAChB,2EAA2E;IAC3E,aAAa,EAAE,MAAM,CAAC;IACtB,2EAA2E;IAC3E,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,gDAAgD;IAChD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,mEAAmE;AACnE,MAAM,WAAW,aAAa;IAC5B,4DAA4D;IAC5D,IAAI,EAAE,MAAM,CAAC;IACb,uEAAuE;IACvE,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,eAAe,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,yCAAyC;AACzC,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,aAAa,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,gBAAgB,CAAC;IACzB,kEAAkE;IAClE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;IAC5D,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,0CAA0C;AAC1C,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;CACtB"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Phase 9 — Deterministic agent checkpoints.
|
|
3
|
+
*
|
|
4
|
+
* Types shared across the checkpoint subsystem: the key/fingerprint
|
|
5
|
+
* computation (`checkpoint-key.ts`), the content-addressed blob store
|
|
6
|
+
* (`checkpoint-blob-store.ts`), the record store (`checkpoint-store.ts`),
|
|
7
|
+
* and the higher-order agent wrapper (`agent-runner-wrapper.ts`).
|
|
8
|
+
*
|
|
9
|
+
* A checkpoint is a per-(project, runFamily, stage, hash) record of whether
|
|
10
|
+
* a particular agent invocation has already produced output, so that a
|
|
11
|
+
* resumed run can skip it. The hash is a sha256 derived from a stable
|
|
12
|
+
* fingerprint of every input that should invalidate the cache on drift
|
|
13
|
+
* (prompt version, tool versions, model id, and the input payload).
|
|
14
|
+
*/
|
|
15
|
+
export {};
|
|
16
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/checkpoint/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Claude CLI ModelAdapter.
|
|
3
|
+
*
|
|
4
|
+
* The simplest adapter — Claude CLI already outputs Anvil Stream Format
|
|
5
|
+
* natively (`--output-format stream-json`), so we just pipe stdout through
|
|
6
|
+
* with zero transformation.
|
|
7
|
+
*/
|
|
8
|
+
import type { ModelAdapter, ModelAdapterConfig, ModelAdapterResult, ProviderCapabilities, ProviderName } from './types.js';
|
|
9
|
+
export declare class ClaudeAdapter implements ModelAdapter {
|
|
10
|
+
readonly provider: ProviderName;
|
|
11
|
+
readonly capabilities: ProviderCapabilities;
|
|
12
|
+
private child;
|
|
13
|
+
supportsModel(modelId: string): boolean;
|
|
14
|
+
getModelPricing(modelId: string): [number, number] | null;
|
|
15
|
+
checkAvailability(): Promise<{
|
|
16
|
+
available: boolean;
|
|
17
|
+
version?: string;
|
|
18
|
+
error?: string;
|
|
19
|
+
}>;
|
|
20
|
+
run(config: ModelAdapterConfig, output: NodeJS.WritableStream): Promise<ModelAdapterResult>;
|
|
21
|
+
kill(): void;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=claude-adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-adapter.d.ts","sourceRoot":"","sources":["../src/claude-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,KAAK,EACV,YAAY,EACZ,kBAAkB,EAClB,kBAAkB,EAClB,oBAAoB,EACpB,YAAY,EACb,MAAM,YAAY,CAAC;AAuCpB,qBAAa,aAAc,YAAW,YAAY;IAChD,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAY;IAE3C,QAAQ,CAAC,YAAY,EAAE,oBAAoB,CAczC;IAEF,OAAO,CAAC,KAAK,CAA6B;IAE1C,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAUvC,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI;IAKnD,iBAAiB,IAAI,OAAO,CAAC;QAAE,SAAS,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAUtF,GAAG,CAAC,MAAM,EAAE,kBAAkB,EAAE,MAAM,EAAE,MAAM,CAAC,cAAc,GAAG,OAAO,CAAC,kBAAkB,CAAC;IA+JjG,IAAI,IAAI,IAAI;CAMb"}
|