@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 @@
|
|
|
1
|
+
{"version":3,"file":"store.test.js","sourceRoot":"","sources":["../../../src/checkpoint/__tests__/store.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Content-addressed blob storage for checkpoint outputs.
|
|
3
|
+
*
|
|
4
|
+
* Agent outputs (plan JSON, diffs, review findings, test code, etc.) are
|
|
5
|
+
* written here by sha256 of their bytes. A CheckpointRecord references the
|
|
6
|
+
* blob via `outputRef` (the sha hex). Two checkpoints that produce the same
|
|
7
|
+
* output share a single blob on disk (dedup).
|
|
8
|
+
*
|
|
9
|
+
* Writes are atomic: we write to `<path>.tmp` then `renameSync` into place,
|
|
10
|
+
* which is a single filesystem operation on POSIX and NTFS. `gc` enumerates
|
|
11
|
+
* every blob under `_blobs/` and deletes those not present in the supplied
|
|
12
|
+
* reference set.
|
|
13
|
+
*/
|
|
14
|
+
export interface BlobWriteResult {
|
|
15
|
+
sha: string;
|
|
16
|
+
path: string;
|
|
17
|
+
bytes: number;
|
|
18
|
+
}
|
|
19
|
+
export interface BlobGcResult {
|
|
20
|
+
deleted: number;
|
|
21
|
+
bytes: number;
|
|
22
|
+
}
|
|
23
|
+
export declare class BlobStore {
|
|
24
|
+
private readonly anvilHome;
|
|
25
|
+
constructor(anvilHome: string);
|
|
26
|
+
/**
|
|
27
|
+
* Write content to the blob store. Returns the sha and path even when the
|
|
28
|
+
* blob already existed (dedup — same bytes → same sha, skip the write).
|
|
29
|
+
*/
|
|
30
|
+
write(content: string | Buffer): BlobWriteResult;
|
|
31
|
+
/** Return blob bytes, or null if missing / unreadable. */
|
|
32
|
+
read(sha: string): Buffer | null;
|
|
33
|
+
/** Cheap existence check without reading the bytes. */
|
|
34
|
+
exists(sha: string): boolean;
|
|
35
|
+
/**
|
|
36
|
+
* Garbage-collect blobs not in `referencedShas`. Walks every fan-out
|
|
37
|
+
* directory and unlinks orphans. Reports bytes freed.
|
|
38
|
+
*/
|
|
39
|
+
gc(referencedShas: Set<string>): BlobGcResult;
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=blob-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"blob-store.d.ts","sourceRoot":"","sources":["../../src/checkpoint/blob-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAiBH,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACf;AAUD,qBAAa,SAAS;IACpB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;gBAEvB,SAAS,EAAE,MAAM;IAI7B;;;OAGG;IACH,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,eAAe;IA0BhD,0DAA0D;IAC1D,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAShC,uDAAuD;IACvD,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAI5B;;;OAGG;IACH,EAAE,CAAC,cAAc,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,YAAY;CAuC9C"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Content-addressed blob storage for checkpoint outputs.
|
|
3
|
+
*
|
|
4
|
+
* Agent outputs (plan JSON, diffs, review findings, test code, etc.) are
|
|
5
|
+
* written here by sha256 of their bytes. A CheckpointRecord references the
|
|
6
|
+
* blob via `outputRef` (the sha hex). Two checkpoints that produce the same
|
|
7
|
+
* output share a single blob on disk (dedup).
|
|
8
|
+
*
|
|
9
|
+
* Writes are atomic: we write to `<path>.tmp` then `renameSync` into place,
|
|
10
|
+
* which is a single filesystem operation on POSIX and NTFS. `gc` enumerates
|
|
11
|
+
* every blob under `_blobs/` and deletes those not present in the supplied
|
|
12
|
+
* reference set.
|
|
13
|
+
*/
|
|
14
|
+
import { existsSync, mkdirSync, readFileSync, readdirSync, renameSync, statSync, unlinkSync, writeFileSync, } from 'node:fs';
|
|
15
|
+
import { createHash } from 'node:crypto';
|
|
16
|
+
import { dirname, join } from 'node:path';
|
|
17
|
+
import { blobPath, blobRoot } from './key.js';
|
|
18
|
+
function ensureDir(dir) {
|
|
19
|
+
if (!existsSync(dir))
|
|
20
|
+
mkdirSync(dir, { recursive: true });
|
|
21
|
+
}
|
|
22
|
+
function sha256Hex(buf) {
|
|
23
|
+
return createHash('sha256').update(buf).digest('hex');
|
|
24
|
+
}
|
|
25
|
+
export class BlobStore {
|
|
26
|
+
anvilHome;
|
|
27
|
+
constructor(anvilHome) {
|
|
28
|
+
this.anvilHome = anvilHome;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Write content to the blob store. Returns the sha and path even when the
|
|
32
|
+
* blob already existed (dedup — same bytes → same sha, skip the write).
|
|
33
|
+
*/
|
|
34
|
+
write(content) {
|
|
35
|
+
const buf = typeof content === 'string' ? Buffer.from(content, 'utf-8') : content;
|
|
36
|
+
const sha = sha256Hex(buf);
|
|
37
|
+
const path = blobPath(this.anvilHome, sha);
|
|
38
|
+
if (existsSync(path)) {
|
|
39
|
+
return { sha, path, bytes: buf.byteLength };
|
|
40
|
+
}
|
|
41
|
+
ensureDir(dirname(path));
|
|
42
|
+
// Atomic write: tmp + rename. Tmp name includes pid + random to avoid
|
|
43
|
+
// collisions between concurrent writers of the same sha.
|
|
44
|
+
const tmp = `${path}.${process.pid}.${Math.random().toString(36).slice(2)}.tmp`;
|
|
45
|
+
try {
|
|
46
|
+
writeFileSync(tmp, buf);
|
|
47
|
+
renameSync(tmp, path);
|
|
48
|
+
}
|
|
49
|
+
catch (err) {
|
|
50
|
+
// Clean up tmp file if rename failed.
|
|
51
|
+
try {
|
|
52
|
+
unlinkSync(tmp);
|
|
53
|
+
}
|
|
54
|
+
catch { /* ignore */ }
|
|
55
|
+
throw err;
|
|
56
|
+
}
|
|
57
|
+
return { sha, path, bytes: buf.byteLength };
|
|
58
|
+
}
|
|
59
|
+
/** Return blob bytes, or null if missing / unreadable. */
|
|
60
|
+
read(sha) {
|
|
61
|
+
const path = blobPath(this.anvilHome, sha);
|
|
62
|
+
try {
|
|
63
|
+
return readFileSync(path);
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
return null;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
/** Cheap existence check without reading the bytes. */
|
|
70
|
+
exists(sha) {
|
|
71
|
+
return existsSync(blobPath(this.anvilHome, sha));
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Garbage-collect blobs not in `referencedShas`. Walks every fan-out
|
|
75
|
+
* directory and unlinks orphans. Reports bytes freed.
|
|
76
|
+
*/
|
|
77
|
+
gc(referencedShas) {
|
|
78
|
+
const root = blobRoot(this.anvilHome);
|
|
79
|
+
if (!existsSync(root))
|
|
80
|
+
return { deleted: 0, bytes: 0 };
|
|
81
|
+
let deleted = 0;
|
|
82
|
+
let bytes = 0;
|
|
83
|
+
let prefixes;
|
|
84
|
+
try {
|
|
85
|
+
prefixes = readdirSync(root);
|
|
86
|
+
}
|
|
87
|
+
catch {
|
|
88
|
+
return { deleted: 0, bytes: 0 };
|
|
89
|
+
}
|
|
90
|
+
for (const prefix of prefixes) {
|
|
91
|
+
const prefixDir = join(root, prefix);
|
|
92
|
+
let entries;
|
|
93
|
+
try {
|
|
94
|
+
entries = readdirSync(prefixDir);
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
continue;
|
|
98
|
+
}
|
|
99
|
+
for (const sha of entries) {
|
|
100
|
+
if (referencedShas.has(sha))
|
|
101
|
+
continue;
|
|
102
|
+
const file = join(prefixDir, sha);
|
|
103
|
+
try {
|
|
104
|
+
const st = statSync(file);
|
|
105
|
+
if (!st.isFile())
|
|
106
|
+
continue;
|
|
107
|
+
unlinkSync(file);
|
|
108
|
+
deleted += 1;
|
|
109
|
+
bytes += st.size;
|
|
110
|
+
}
|
|
111
|
+
catch {
|
|
112
|
+
// Best-effort gc — skip files that vanish mid-walk.
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
return { deleted, bytes };
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=blob-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"blob-store.js","sourceRoot":"","sources":["../../src/checkpoint/blob-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `@esankhan3/anvil-agent-core/checkpoint` — barrel exports for the per-call agent
|
|
3
|
+
* checkpoint cache (Phase 3 of the agent-manager consolidation).
|
|
4
|
+
*
|
|
5
|
+
* Lifted verbatim from dashboard's `dashboard/server/checkpoint-*.ts` +
|
|
6
|
+
* `agent-runner-wrapper.ts` cluster. On-disk format unchanged
|
|
7
|
+
* (`~/.anvil/checkpoints/<project>/<runFamily>/`); only the writer's owning
|
|
8
|
+
* package moved.
|
|
9
|
+
*/
|
|
10
|
+
export { BlobStore, type BlobWriteResult, type BlobGcResult } from './blob-store.js';
|
|
11
|
+
export { CheckpointStore, type CheckpointStoreOpts, type CheckpointStatus, } from './store.js';
|
|
12
|
+
export { computeFingerprint, computeKey, checkpointPath, checkpointRoot, blobPath, blobRoot, } from './key.js';
|
|
13
|
+
export { runWithCheckpoint, type WrappedAgentOpts, } from './runner.js';
|
|
14
|
+
export type { CheckpointStage, CheckpointInputs, CheckpointKey, CheckpointRecord, CheckpointStats, } from './types.js';
|
|
15
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/checkpoint/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,SAAS,EAAE,KAAK,eAAe,EAAE,KAAK,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAErF,OAAO,EACL,eAAe,EACf,KAAK,mBAAmB,EACxB,KAAK,gBAAgB,GACtB,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,kBAAkB,EAClB,UAAU,EACV,cAAc,EACd,cAAc,EACd,QAAQ,EACR,QAAQ,GACT,MAAM,UAAU,CAAC;AAElB,OAAO,EACL,iBAAiB,EACjB,KAAK,gBAAgB,GACtB,MAAM,aAAa,CAAC;AAErB,YAAY,EACV,eAAe,EACf,gBAAgB,EAChB,aAAa,EACb,gBAAgB,EAChB,eAAe,GAChB,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `@esankhan3/anvil-agent-core/checkpoint` — barrel exports for the per-call agent
|
|
3
|
+
* checkpoint cache (Phase 3 of the agent-manager consolidation).
|
|
4
|
+
*
|
|
5
|
+
* Lifted verbatim from dashboard's `dashboard/server/checkpoint-*.ts` +
|
|
6
|
+
* `agent-runner-wrapper.ts` cluster. On-disk format unchanged
|
|
7
|
+
* (`~/.anvil/checkpoints/<project>/<runFamily>/`); only the writer's owning
|
|
8
|
+
* package moved.
|
|
9
|
+
*/
|
|
10
|
+
export { BlobStore } from './blob-store.js';
|
|
11
|
+
export { CheckpointStore, } from './store.js';
|
|
12
|
+
export { computeFingerprint, computeKey, checkpointPath, checkpointRoot, blobPath, blobRoot, } from './key.js';
|
|
13
|
+
export { runWithCheckpoint, } from './runner.js';
|
|
14
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/checkpoint/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,SAAS,EAA2C,MAAM,iBAAiB,CAAC;AAErF,OAAO,EACL,eAAe,GAGhB,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,kBAAkB,EAClB,UAAU,EACV,cAAc,EACd,cAAc,EACd,QAAQ,EACR,QAAQ,GACT,MAAM,UAAU,CAAC;AAElB,OAAO,EACL,iBAAiB,GAElB,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Checkpoint key + path helpers.
|
|
3
|
+
*
|
|
4
|
+
* `computeFingerprint` produces a stable sha256 hex digest of any JSON-ish
|
|
5
|
+
* value. Object keys are sorted recursively so ordering differences are
|
|
6
|
+
* irrelevant. `undefined` is omitted entirely (matches `JSON.stringify`
|
|
7
|
+
* semantics for object values). Functions / Dates are serialized via
|
|
8
|
+
* `.toString()` so they have deterministic fingerprints.
|
|
9
|
+
*
|
|
10
|
+
* `computeKey` concatenates the fingerprints of every field from a
|
|
11
|
+
* CheckpointInputs into a single byte-stable string and sha256's it.
|
|
12
|
+
*/
|
|
13
|
+
import type { CheckpointInputs, CheckpointKey, CheckpointStage } from './types.js';
|
|
14
|
+
/** sha256 hex digest of a stable JSON serialization of `value`. */
|
|
15
|
+
export declare function computeFingerprint(value: unknown): string;
|
|
16
|
+
/**
|
|
17
|
+
* Produce a CheckpointKey from inputs. The hash is deterministic: same
|
|
18
|
+
* inputs → same hash, any drift in any tracked field → different hash.
|
|
19
|
+
*/
|
|
20
|
+
export declare function computeKey(runFamily: string, inputs: CheckpointInputs): CheckpointKey;
|
|
21
|
+
/**
|
|
22
|
+
* Per-record path:
|
|
23
|
+
* <anvilHome>/checkpoints/<project>/<runFamily>/<stage>/<hash>.json
|
|
24
|
+
*/
|
|
25
|
+
export declare function checkpointPath(anvilHome: string, project: string, runFamily: string, stage: CheckpointStage, hash: string): string;
|
|
26
|
+
/**
|
|
27
|
+
* Content-addressed blob path:
|
|
28
|
+
* <anvilHome>/checkpoints/_blobs/<sha[0:2]>/<sha>
|
|
29
|
+
*
|
|
30
|
+
* Fanning out by the first two hex chars keeps directory sizes reasonable
|
|
31
|
+
* (max 256 sub-dirs, each holding ~N/256 blobs). Mirrors git's objects
|
|
32
|
+
* layout.
|
|
33
|
+
*/
|
|
34
|
+
export declare function blobPath(anvilHome: string, sha: string): string;
|
|
35
|
+
/** Root directory for all checkpoint state in a given Anvil home. */
|
|
36
|
+
export declare function checkpointRoot(anvilHome: string): string;
|
|
37
|
+
/** Root directory for content-addressed blobs. */
|
|
38
|
+
export declare function blobRoot(anvilHome: string): string;
|
|
39
|
+
//# sourceMappingURL=key.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"key.d.ts","sourceRoot":"","sources":["../../src/checkpoint/key.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAKH,OAAO,KAAK,EACV,gBAAgB,EAChB,aAAa,EACb,eAAe,EAChB,MAAM,YAAY,CAAC;AA6CpB,mEAAmE;AACnE,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAGzD;AAID;;;GAGG;AACH,wBAAgB,UAAU,CACxB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,gBAAgB,GACvB,aAAa,CAaf;AAID;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,eAAe,EACtB,IAAI,EAAE,MAAM,GACX,MAAM,CASR;AAED;;;;;;;GAOG;AACH,wBAAgB,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAG/D;AAED,qEAAqE;AACrE,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAExD;AAED,kDAAkD;AAClD,wBAAgB,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAElD"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Checkpoint key + path helpers.
|
|
3
|
+
*
|
|
4
|
+
* `computeFingerprint` produces a stable sha256 hex digest of any JSON-ish
|
|
5
|
+
* value. Object keys are sorted recursively so ordering differences are
|
|
6
|
+
* irrelevant. `undefined` is omitted entirely (matches `JSON.stringify`
|
|
7
|
+
* semantics for object values). Functions / Dates are serialized via
|
|
8
|
+
* `.toString()` so they have deterministic fingerprints.
|
|
9
|
+
*
|
|
10
|
+
* `computeKey` concatenates the fingerprints of every field from a
|
|
11
|
+
* CheckpointInputs into a single byte-stable string and sha256's it.
|
|
12
|
+
*/
|
|
13
|
+
import { createHash } from 'node:crypto';
|
|
14
|
+
import { join } from 'node:path';
|
|
15
|
+
// ── Stable JSON serialization ────────────────────────────────────────────
|
|
16
|
+
function stableStringify(value) {
|
|
17
|
+
if (value === null)
|
|
18
|
+
return 'null';
|
|
19
|
+
if (value === undefined)
|
|
20
|
+
return 'undefined';
|
|
21
|
+
const t = typeof value;
|
|
22
|
+
if (t === 'string')
|
|
23
|
+
return JSON.stringify(value);
|
|
24
|
+
if (t === 'number') {
|
|
25
|
+
// Handle -0, NaN, Infinity explicitly (JSON.stringify renders them as null).
|
|
26
|
+
if (Number.isNaN(value))
|
|
27
|
+
return '"__NaN__"';
|
|
28
|
+
if (!Number.isFinite(value)) {
|
|
29
|
+
return value > 0 ? '"__Infinity__"' : '"__-Infinity__"';
|
|
30
|
+
}
|
|
31
|
+
return JSON.stringify(value);
|
|
32
|
+
}
|
|
33
|
+
if (t === 'boolean')
|
|
34
|
+
return JSON.stringify(value);
|
|
35
|
+
if (t === 'bigint')
|
|
36
|
+
return `"bigint:${value.toString()}"`;
|
|
37
|
+
if (t === 'function')
|
|
38
|
+
return JSON.stringify(`[function:${value.toString()}]`);
|
|
39
|
+
if (value instanceof Date)
|
|
40
|
+
return JSON.stringify(`[date:${value.toISOString()}]`);
|
|
41
|
+
if (Array.isArray(value)) {
|
|
42
|
+
const parts = value.map((v) => stableStringify(v));
|
|
43
|
+
return `[${parts.join(',')}]`;
|
|
44
|
+
}
|
|
45
|
+
if (t === 'object') {
|
|
46
|
+
const obj = value;
|
|
47
|
+
// Include Symbol-typed keys? No — our inputs are plain JSON. Skip them.
|
|
48
|
+
const keys = Object.keys(obj).sort();
|
|
49
|
+
const parts = [];
|
|
50
|
+
for (const k of keys) {
|
|
51
|
+
const v = obj[k];
|
|
52
|
+
if (v === undefined)
|
|
53
|
+
continue;
|
|
54
|
+
parts.push(`${JSON.stringify(k)}:${stableStringify(v)}`);
|
|
55
|
+
}
|
|
56
|
+
return `{${parts.join(',')}}`;
|
|
57
|
+
}
|
|
58
|
+
return JSON.stringify(String(value));
|
|
59
|
+
}
|
|
60
|
+
/** sha256 hex digest of a stable JSON serialization of `value`. */
|
|
61
|
+
export function computeFingerprint(value) {
|
|
62
|
+
const serialized = stableStringify(value);
|
|
63
|
+
return createHash('sha256').update(serialized).digest('hex');
|
|
64
|
+
}
|
|
65
|
+
// ── Checkpoint key computation ───────────────────────────────────────────
|
|
66
|
+
/**
|
|
67
|
+
* Produce a CheckpointKey from inputs. The hash is deterministic: same
|
|
68
|
+
* inputs → same hash, any drift in any tracked field → different hash.
|
|
69
|
+
*/
|
|
70
|
+
export function computeKey(runFamily, inputs) {
|
|
71
|
+
const parts = [
|
|
72
|
+
`runFamily:${runFamily}`,
|
|
73
|
+
`stage:${inputs.stage}`,
|
|
74
|
+
`taskId:${inputs.taskId}`,
|
|
75
|
+
`promptVersion:${computeFingerprint(inputs.promptVersion)}`,
|
|
76
|
+
`model:${computeFingerprint(inputs.model ?? null)}`,
|
|
77
|
+
`toolVersions:${computeFingerprint(inputs.toolVersions ?? {})}`,
|
|
78
|
+
`inputs:${computeFingerprint(inputs.inputs)}`,
|
|
79
|
+
];
|
|
80
|
+
const combined = parts.join('|');
|
|
81
|
+
const hash = createHash('sha256').update(combined).digest('hex');
|
|
82
|
+
return { hash, runFamily, stage: inputs.stage, taskId: inputs.taskId };
|
|
83
|
+
}
|
|
84
|
+
// ── Filesystem layout ────────────────────────────────────────────────────
|
|
85
|
+
/**
|
|
86
|
+
* Per-record path:
|
|
87
|
+
* <anvilHome>/checkpoints/<project>/<runFamily>/<stage>/<hash>.json
|
|
88
|
+
*/
|
|
89
|
+
export function checkpointPath(anvilHome, project, runFamily, stage, hash) {
|
|
90
|
+
return join(anvilHome, 'checkpoints', project, runFamily, stage, `${hash}.json`);
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Content-addressed blob path:
|
|
94
|
+
* <anvilHome>/checkpoints/_blobs/<sha[0:2]>/<sha>
|
|
95
|
+
*
|
|
96
|
+
* Fanning out by the first two hex chars keeps directory sizes reasonable
|
|
97
|
+
* (max 256 sub-dirs, each holding ~N/256 blobs). Mirrors git's objects
|
|
98
|
+
* layout.
|
|
99
|
+
*/
|
|
100
|
+
export function blobPath(anvilHome, sha) {
|
|
101
|
+
const prefix = sha.slice(0, 2);
|
|
102
|
+
return join(anvilHome, 'checkpoints', '_blobs', prefix, sha);
|
|
103
|
+
}
|
|
104
|
+
/** Root directory for all checkpoint state in a given Anvil home. */
|
|
105
|
+
export function checkpointRoot(anvilHome) {
|
|
106
|
+
return join(anvilHome, 'checkpoints');
|
|
107
|
+
}
|
|
108
|
+
/** Root directory for content-addressed blobs. */
|
|
109
|
+
export function blobRoot(anvilHome) {
|
|
110
|
+
return join(anvilHome, 'checkpoints', '_blobs');
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=key.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"key.js","sourceRoot":"","sources":["../../src/checkpoint/key.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* agent-runner-wrapper — higher-order wrapper that gates any agent call
|
|
3
|
+
* through a CheckpointStore.
|
|
4
|
+
*
|
|
5
|
+
* Usage:
|
|
6
|
+
* const plan = await runWithCheckpoint(store, blobs, {
|
|
7
|
+
* project, runFamily,
|
|
8
|
+
* inputs: { stage: 'plan', taskId: 'plan:root', promptVersion, inputs: ... },
|
|
9
|
+
* run: () => plannerAgent.generate(...),
|
|
10
|
+
* serialize: (p) => JSON.stringify(p),
|
|
11
|
+
* deserialize: (b) => JSON.parse(b.toString('utf-8')),
|
|
12
|
+
* });
|
|
13
|
+
*
|
|
14
|
+
* Behavior:
|
|
15
|
+
* 1. Compute the cache key from `inputs`.
|
|
16
|
+
* 2. If `store.get` returns a completed record whose blob exists, call
|
|
17
|
+
* `onHit` and return `deserialize(blob)` — no agent invocation.
|
|
18
|
+
* 3. Otherwise `store.begin(...)` (claim the record as `running`), install
|
|
19
|
+
* SIGTERM/SIGINT handlers that `store.interrupt` the record, then run
|
|
20
|
+
* the agent.
|
|
21
|
+
* 4. On success → `store.complete(...)`. On error → `store.fail(...)` and
|
|
22
|
+
* rethrow.
|
|
23
|
+
* 5. Always remove the signal handlers in `finally`.
|
|
24
|
+
*
|
|
25
|
+
* ── Signal-handler hygiene ──────────────────────────────────────────────
|
|
26
|
+
*
|
|
27
|
+
* Node's `process.on('SIGTERM', fn)` adds a new listener every call. When
|
|
28
|
+
* many wrappers run concurrently (parallel implement + review personas), a
|
|
29
|
+
* naive approach would either:
|
|
30
|
+
* (a) register N listeners that each handle the same signal (leak), or
|
|
31
|
+
* (b) share a single listener that only knows about one in-flight record.
|
|
32
|
+
*
|
|
33
|
+
* We take a middle path:
|
|
34
|
+
* - Each `runWithCheckpoint` call registers its own `onSignal` closure via
|
|
35
|
+
* `process.on` (not `process.once`, because multiple concurrent wrappers
|
|
36
|
+
* need each of their closures to fire — `process.once` on a shared event
|
|
37
|
+
* removes ALL listeners after the first handler runs).
|
|
38
|
+
* - Each wrapper tracks its own registered closures in a local array and
|
|
39
|
+
* calls `process.off(...)` in `finally`, guaranteeing cleanup.
|
|
40
|
+
* - A module-level `registeredWrappers` WeakSet tracks active wrappers
|
|
41
|
+
* purely for debugging / leak detection; it does not affect behavior.
|
|
42
|
+
*
|
|
43
|
+
* We never call `process.exit` from the signal handler — that's the
|
|
44
|
+
* caller's responsibility (e.g. the cost-reject flow in pipeline-runner
|
|
45
|
+
* decides whether to propagate the signal). We only persist `interrupted`
|
|
46
|
+
* state so the next resume sees it.
|
|
47
|
+
*/
|
|
48
|
+
import type { BlobStore } from './blob-store.js';
|
|
49
|
+
import type { CheckpointStore } from './store.js';
|
|
50
|
+
import type { CheckpointInputs, CheckpointRecord } from './types.js';
|
|
51
|
+
export interface WrappedAgentOpts<I, O> {
|
|
52
|
+
project: string;
|
|
53
|
+
runFamily: string;
|
|
54
|
+
inputs: CheckpointInputs & {
|
|
55
|
+
inputs: I;
|
|
56
|
+
};
|
|
57
|
+
run: () => Promise<O>;
|
|
58
|
+
serialize: (o: O) => string | Buffer;
|
|
59
|
+
deserialize: (b: Buffer) => O;
|
|
60
|
+
cost?: CheckpointRecord['cost'];
|
|
61
|
+
onHit?: (record: CheckpointRecord) => void;
|
|
62
|
+
onMiss?: () => void;
|
|
63
|
+
onInterrupt?: (signal: NodeJS.Signals) => void;
|
|
64
|
+
/**
|
|
65
|
+
* Test-only hook. When set, the wrapper uses this instead of
|
|
66
|
+
* `process.on(...)`. Tests can invoke the handler directly without
|
|
67
|
+
* actually sending a signal to the process.
|
|
68
|
+
*/
|
|
69
|
+
__signalHook?: {
|
|
70
|
+
on: (sig: NodeJS.Signals, fn: (s: NodeJS.Signals) => void) => void;
|
|
71
|
+
off: (sig: NodeJS.Signals, fn: (s: NodeJS.Signals) => void) => void;
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Execute an agent call, caching its output in the checkpoint store.
|
|
76
|
+
* On cache hit, `opts.run` is never called. On SIGTERM / SIGINT during the
|
|
77
|
+
* run, the record is transitioned to `interrupted` before the handler
|
|
78
|
+
* returns.
|
|
79
|
+
*/
|
|
80
|
+
export declare function runWithCheckpoint<I, O>(store: CheckpointStore, blobs: BlobStore, opts: WrappedAgentOpts<I, O>): Promise<O>;
|
|
81
|
+
/** Test helper — number of currently-registered wrappers (best-effort). */
|
|
82
|
+
export declare function __activeWrapperCount(): number;
|
|
83
|
+
//# sourceMappingURL=runner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/checkpoint/runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8CG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,KAAK,EACV,gBAAgB,EAChB,gBAAgB,EACjB,MAAM,YAAY,CAAC;AAMpB,MAAM,WAAW,gBAAgB,CAAC,CAAC,EAAE,CAAC;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,gBAAgB,GAAG;QAAE,MAAM,EAAE,CAAC,CAAA;KAAE,CAAC;IACzC,GAAG,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,CAAC;IACtB,SAAS,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,MAAM,GAAG,MAAM,CAAC;IACrC,WAAW,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,CAAC,CAAC;IAC9B,IAAI,CAAC,EAAE,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAChC,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,gBAAgB,KAAK,IAAI,CAAC;IAC3C,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,WAAW,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,OAAO,KAAK,IAAI,CAAC;IAC/C;;;;OAIG;IACH,YAAY,CAAC,EAAE;QACb,EAAE,EAAE,CAAC,GAAG,EAAE,MAAM,CAAC,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,OAAO,KAAK,IAAI,KAAK,IAAI,CAAC;QACnE,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,CAAC,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,OAAO,KAAK,IAAI,KAAK,IAAI,CAAC;KACrE,CAAC;CACH;AAED;;;;;GAKG;AACH,wBAAsB,iBAAiB,CAAC,CAAC,EAAE,CAAC,EAC1C,KAAK,EAAE,eAAe,EACtB,KAAK,EAAE,SAAS,EAChB,IAAI,EAAE,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC,GAC3B,OAAO,CAAC,CAAC,CAAC,CAyFZ;AAED,2EAA2E;AAC3E,wBAAgB,oBAAoB,IAAI,MAAM,CAI7C"}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* agent-runner-wrapper — higher-order wrapper that gates any agent call
|
|
3
|
+
* through a CheckpointStore.
|
|
4
|
+
*
|
|
5
|
+
* Usage:
|
|
6
|
+
* const plan = await runWithCheckpoint(store, blobs, {
|
|
7
|
+
* project, runFamily,
|
|
8
|
+
* inputs: { stage: 'plan', taskId: 'plan:root', promptVersion, inputs: ... },
|
|
9
|
+
* run: () => plannerAgent.generate(...),
|
|
10
|
+
* serialize: (p) => JSON.stringify(p),
|
|
11
|
+
* deserialize: (b) => JSON.parse(b.toString('utf-8')),
|
|
12
|
+
* });
|
|
13
|
+
*
|
|
14
|
+
* Behavior:
|
|
15
|
+
* 1. Compute the cache key from `inputs`.
|
|
16
|
+
* 2. If `store.get` returns a completed record whose blob exists, call
|
|
17
|
+
* `onHit` and return `deserialize(blob)` — no agent invocation.
|
|
18
|
+
* 3. Otherwise `store.begin(...)` (claim the record as `running`), install
|
|
19
|
+
* SIGTERM/SIGINT handlers that `store.interrupt` the record, then run
|
|
20
|
+
* the agent.
|
|
21
|
+
* 4. On success → `store.complete(...)`. On error → `store.fail(...)` and
|
|
22
|
+
* rethrow.
|
|
23
|
+
* 5. Always remove the signal handlers in `finally`.
|
|
24
|
+
*
|
|
25
|
+
* ── Signal-handler hygiene ──────────────────────────────────────────────
|
|
26
|
+
*
|
|
27
|
+
* Node's `process.on('SIGTERM', fn)` adds a new listener every call. When
|
|
28
|
+
* many wrappers run concurrently (parallel implement + review personas), a
|
|
29
|
+
* naive approach would either:
|
|
30
|
+
* (a) register N listeners that each handle the same signal (leak), or
|
|
31
|
+
* (b) share a single listener that only knows about one in-flight record.
|
|
32
|
+
*
|
|
33
|
+
* We take a middle path:
|
|
34
|
+
* - Each `runWithCheckpoint` call registers its own `onSignal` closure via
|
|
35
|
+
* `process.on` (not `process.once`, because multiple concurrent wrappers
|
|
36
|
+
* need each of their closures to fire — `process.once` on a shared event
|
|
37
|
+
* removes ALL listeners after the first handler runs).
|
|
38
|
+
* - Each wrapper tracks its own registered closures in a local array and
|
|
39
|
+
* calls `process.off(...)` in `finally`, guaranteeing cleanup.
|
|
40
|
+
* - A module-level `registeredWrappers` WeakSet tracks active wrappers
|
|
41
|
+
* purely for debugging / leak detection; it does not affect behavior.
|
|
42
|
+
*
|
|
43
|
+
* We never call `process.exit` from the signal handler — that's the
|
|
44
|
+
* caller's responsibility (e.g. the cost-reject flow in pipeline-runner
|
|
45
|
+
* decides whether to propagate the signal). We only persist `interrupted`
|
|
46
|
+
* state so the next resume sees it.
|
|
47
|
+
*/
|
|
48
|
+
import { computeKey } from './key.js';
|
|
49
|
+
// Module-level registry for leak detection. A WeakSet means entries are
|
|
50
|
+
// collected automatically when the wrapper object becomes unreachable.
|
|
51
|
+
const registeredWrappers = new WeakSet();
|
|
52
|
+
/**
|
|
53
|
+
* Execute an agent call, caching its output in the checkpoint store.
|
|
54
|
+
* On cache hit, `opts.run` is never called. On SIGTERM / SIGINT during the
|
|
55
|
+
* run, the record is transitioned to `interrupted` before the handler
|
|
56
|
+
* returns.
|
|
57
|
+
*/
|
|
58
|
+
export async function runWithCheckpoint(store, blobs, opts) {
|
|
59
|
+
const key = computeKey(opts.runFamily, opts.inputs);
|
|
60
|
+
// Cache lookup.
|
|
61
|
+
const existing = store.get(opts.project, opts.runFamily, key);
|
|
62
|
+
if (existing &&
|
|
63
|
+
existing.status === 'completed' &&
|
|
64
|
+
existing.outputRef &&
|
|
65
|
+
blobs.exists(existing.outputRef)) {
|
|
66
|
+
const bytes = blobs.read(existing.outputRef);
|
|
67
|
+
if (bytes) {
|
|
68
|
+
opts.onHit?.(existing);
|
|
69
|
+
return opts.deserialize(bytes);
|
|
70
|
+
}
|
|
71
|
+
// Blob vanished — fall through to a fresh run.
|
|
72
|
+
}
|
|
73
|
+
opts.onMiss?.();
|
|
74
|
+
store.begin(opts.project, opts.runFamily, opts.inputs, opts.cost);
|
|
75
|
+
// Install signal handlers for this invocation only. Each wrapper gets its
|
|
76
|
+
// own closure so concurrent wrappers don't step on each other.
|
|
77
|
+
const registry = {};
|
|
78
|
+
registeredWrappers.add(registry);
|
|
79
|
+
const signals = ['SIGTERM', 'SIGINT'];
|
|
80
|
+
const handlers = [];
|
|
81
|
+
let interrupted = false;
|
|
82
|
+
const handleSignal = (sig) => {
|
|
83
|
+
if (interrupted)
|
|
84
|
+
return;
|
|
85
|
+
interrupted = true;
|
|
86
|
+
try {
|
|
87
|
+
// `partialOutput` is not available here — the agent promise hasn't
|
|
88
|
+
// resolved. Callers wanting to stream partial output should pass a
|
|
89
|
+
// custom `run` that stashes progress somewhere the wrapper can read.
|
|
90
|
+
store.interrupt(opts.project, opts.runFamily, key, undefined, `signal:${sig}`);
|
|
91
|
+
opts.onInterrupt?.(sig);
|
|
92
|
+
}
|
|
93
|
+
catch (err) {
|
|
94
|
+
process.stderr.write(`[runWithCheckpoint] failed to persist interrupt: ${err instanceof Error ? err.message : String(err)}\n`);
|
|
95
|
+
}
|
|
96
|
+
};
|
|
97
|
+
const hook = opts.__signalHook;
|
|
98
|
+
for (const sig of signals) {
|
|
99
|
+
const fn = (s) => handleSignal(s);
|
|
100
|
+
if (hook)
|
|
101
|
+
hook.on(sig, fn);
|
|
102
|
+
else
|
|
103
|
+
process.on(sig, fn);
|
|
104
|
+
handlers.push({ sig, fn });
|
|
105
|
+
}
|
|
106
|
+
try {
|
|
107
|
+
const out = await opts.run();
|
|
108
|
+
if (interrupted) {
|
|
109
|
+
// The signal fired during `run`; keep the `interrupted` record and
|
|
110
|
+
// return the fresh output to the caller. The caller decides whether
|
|
111
|
+
// to honor the interrupt (e.g. cost-reject flow aborts anyway).
|
|
112
|
+
return out;
|
|
113
|
+
}
|
|
114
|
+
const payload = opts.serialize(out);
|
|
115
|
+
store.complete(opts.project, opts.runFamily, key, payload, opts.cost);
|
|
116
|
+
return out;
|
|
117
|
+
}
|
|
118
|
+
catch (err) {
|
|
119
|
+
if (!interrupted) {
|
|
120
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
121
|
+
try {
|
|
122
|
+
store.fail(opts.project, opts.runFamily, key, msg);
|
|
123
|
+
}
|
|
124
|
+
catch (persistErr) {
|
|
125
|
+
process.stderr.write(`[runWithCheckpoint] failed to persist failure: ${persistErr instanceof Error ? persistErr.message : String(persistErr)}\n`);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
throw err;
|
|
129
|
+
}
|
|
130
|
+
finally {
|
|
131
|
+
for (const { sig, fn } of handlers) {
|
|
132
|
+
if (hook)
|
|
133
|
+
hook.off(sig, fn);
|
|
134
|
+
else
|
|
135
|
+
process.off(sig, fn);
|
|
136
|
+
}
|
|
137
|
+
registeredWrappers.delete(registry);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
/** Test helper — number of currently-registered wrappers (best-effort). */
|
|
141
|
+
export function __activeWrapperCount() {
|
|
142
|
+
// WeakSet doesn't expose size. Tests assert behavior, not count;
|
|
143
|
+
// this exists purely as a documentation anchor.
|
|
144
|
+
return 0;
|
|
145
|
+
}
|
|
146
|
+
//# sourceMappingURL=runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/checkpoint/runner.ts"],"names":[],"mappings":"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"}
|