agenticreplay 0.1.0 → 0.1.2
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 +14 -13
- package/bin/agenticreplay.js +2 -0
- package/node_modules/@agenticreplay/adapters/dist/claude-code.d.ts +37 -0
- package/node_modules/@agenticreplay/adapters/dist/claude-code.d.ts.map +1 -0
- package/node_modules/@agenticreplay/adapters/dist/claude-code.js +103 -0
- package/node_modules/@agenticreplay/adapters/dist/claude-code.js.map +1 -0
- package/node_modules/@agenticreplay/adapters/dist/codex.d.ts +36 -0
- package/node_modules/@agenticreplay/adapters/dist/codex.d.ts.map +1 -0
- package/node_modules/@agenticreplay/adapters/dist/codex.js +130 -0
- package/node_modules/@agenticreplay/adapters/dist/codex.js.map +1 -0
- package/node_modules/@agenticreplay/adapters/dist/contract.d.ts +65 -0
- package/node_modules/@agenticreplay/adapters/dist/contract.d.ts.map +1 -0
- package/node_modules/@agenticreplay/adapters/dist/contract.js +460 -0
- package/node_modules/@agenticreplay/adapters/dist/contract.js.map +1 -0
- package/node_modules/@agenticreplay/adapters/dist/cursor.d.ts +40 -0
- package/node_modules/@agenticreplay/adapters/dist/cursor.d.ts.map +1 -0
- package/node_modules/@agenticreplay/adapters/dist/cursor.js +71 -0
- package/node_modules/@agenticreplay/adapters/dist/cursor.js.map +1 -0
- package/node_modules/@agenticreplay/adapters/dist/detect.d.ts +47 -0
- package/node_modules/@agenticreplay/adapters/dist/detect.d.ts.map +1 -0
- package/node_modules/@agenticreplay/adapters/dist/detect.js +123 -0
- package/node_modules/@agenticreplay/adapters/dist/detect.js.map +1 -0
- package/node_modules/@agenticreplay/adapters/dist/env.d.ts +60 -0
- package/node_modules/@agenticreplay/adapters/dist/env.d.ts.map +1 -0
- package/node_modules/@agenticreplay/adapters/dist/env.js +99 -0
- package/node_modules/@agenticreplay/adapters/dist/env.js.map +1 -0
- package/node_modules/@agenticreplay/adapters/dist/exec.d.ts +25 -0
- package/node_modules/@agenticreplay/adapters/dist/exec.d.ts.map +1 -0
- package/node_modules/@agenticreplay/adapters/dist/exec.js +51 -0
- package/node_modules/@agenticreplay/adapters/dist/exec.js.map +1 -0
- package/node_modules/@agenticreplay/adapters/dist/generic-openai.d.ts +8 -0
- package/node_modules/@agenticreplay/adapters/dist/generic-openai.d.ts.map +1 -0
- package/node_modules/@agenticreplay/adapters/dist/generic-openai.js +31 -0
- package/node_modules/@agenticreplay/adapters/dist/generic-openai.js.map +1 -0
- package/node_modules/@agenticreplay/adapters/dist/goose.d.ts +39 -0
- package/node_modules/@agenticreplay/adapters/dist/goose.d.ts.map +1 -0
- package/node_modules/@agenticreplay/adapters/dist/goose.js +81 -0
- package/node_modules/@agenticreplay/adapters/dist/goose.js.map +1 -0
- package/node_modules/@agenticreplay/adapters/dist/grok.d.ts +23 -0
- package/node_modules/@agenticreplay/adapters/dist/grok.d.ts.map +1 -0
- package/node_modules/@agenticreplay/adapters/dist/grok.js +50 -0
- package/node_modules/@agenticreplay/adapters/dist/grok.js.map +1 -0
- package/node_modules/@agenticreplay/adapters/dist/hermes.d.ts +70 -0
- package/node_modules/@agenticreplay/adapters/dist/hermes.d.ts.map +1 -0
- package/node_modules/@agenticreplay/adapters/dist/hermes.js +88 -0
- package/node_modules/@agenticreplay/adapters/dist/hermes.js.map +1 -0
- package/node_modules/@agenticreplay/adapters/dist/index.d.ts +25 -0
- package/node_modules/@agenticreplay/adapters/dist/index.d.ts.map +1 -0
- package/node_modules/@agenticreplay/adapters/dist/index.js +25 -0
- package/node_modules/@agenticreplay/adapters/dist/index.js.map +1 -0
- package/node_modules/@agenticreplay/adapters/dist/indexrag.d.ts +27 -0
- package/node_modules/@agenticreplay/adapters/dist/indexrag.d.ts.map +1 -0
- package/node_modules/@agenticreplay/adapters/dist/indexrag.js +236 -0
- package/node_modules/@agenticreplay/adapters/dist/indexrag.js.map +1 -0
- package/node_modules/@agenticreplay/adapters/dist/kilo.d.ts +21 -0
- package/node_modules/@agenticreplay/adapters/dist/kilo.d.ts.map +1 -0
- package/node_modules/@agenticreplay/adapters/dist/kilo.js +35 -0
- package/node_modules/@agenticreplay/adapters/dist/kilo.js.map +1 -0
- package/node_modules/@agenticreplay/adapters/dist/mcode.d.ts +81 -0
- package/node_modules/@agenticreplay/adapters/dist/mcode.d.ts.map +1 -0
- package/node_modules/@agenticreplay/adapters/dist/mcode.js +368 -0
- package/node_modules/@agenticreplay/adapters/dist/mcode.js.map +1 -0
- package/node_modules/@agenticreplay/adapters/dist/mcp-config.d.ts +17 -0
- package/node_modules/@agenticreplay/adapters/dist/mcp-config.d.ts.map +1 -0
- package/node_modules/@agenticreplay/adapters/dist/mcp-config.js +62 -0
- package/node_modules/@agenticreplay/adapters/dist/mcp-config.js.map +1 -0
- package/node_modules/@agenticreplay/adapters/dist/mimo.d.ts +26 -0
- package/node_modules/@agenticreplay/adapters/dist/mimo.d.ts.map +1 -0
- package/node_modules/@agenticreplay/adapters/dist/mimo.js +40 -0
- package/node_modules/@agenticreplay/adapters/dist/mimo.js.map +1 -0
- package/node_modules/@agenticreplay/adapters/dist/node.d.ts +19 -0
- package/node_modules/@agenticreplay/adapters/dist/node.d.ts.map +1 -0
- package/node_modules/@agenticreplay/adapters/dist/node.js +59 -0
- package/node_modules/@agenticreplay/adapters/dist/node.js.map +1 -0
- package/node_modules/@agenticreplay/adapters/dist/openclaw.d.ts +19 -0
- package/node_modules/@agenticreplay/adapters/dist/openclaw.d.ts.map +1 -0
- package/node_modules/@agenticreplay/adapters/dist/openclaw.js +43 -0
- package/node_modules/@agenticreplay/adapters/dist/openclaw.js.map +1 -0
- package/node_modules/@agenticreplay/adapters/dist/opencode-api-bases.d.ts +2 -0
- package/node_modules/@agenticreplay/adapters/dist/opencode-api-bases.d.ts.map +1 -0
- package/node_modules/@agenticreplay/adapters/dist/opencode-api-bases.js +201 -0
- package/node_modules/@agenticreplay/adapters/dist/opencode-api-bases.js.map +1 -0
- package/node_modules/@agenticreplay/adapters/dist/opencode-capture.d.ts +26 -0
- package/node_modules/@agenticreplay/adapters/dist/opencode-capture.d.ts.map +1 -0
- package/node_modules/@agenticreplay/adapters/dist/opencode-capture.js +132 -0
- package/node_modules/@agenticreplay/adapters/dist/opencode-capture.js.map +1 -0
- package/node_modules/@agenticreplay/adapters/dist/opencode-catalog.d.ts +5 -0
- package/node_modules/@agenticreplay/adapters/dist/opencode-catalog.d.ts.map +1 -0
- package/node_modules/@agenticreplay/adapters/dist/opencode-catalog.js +43 -0
- package/node_modules/@agenticreplay/adapters/dist/opencode-catalog.js.map +1 -0
- package/node_modules/@agenticreplay/adapters/dist/opencode-config.d.ts +40 -0
- package/node_modules/@agenticreplay/adapters/dist/opencode-config.d.ts.map +1 -0
- package/node_modules/@agenticreplay/adapters/dist/opencode-config.js +185 -0
- package/node_modules/@agenticreplay/adapters/dist/opencode-config.js.map +1 -0
- package/node_modules/@agenticreplay/adapters/dist/opencode.d.ts +10 -0
- package/node_modules/@agenticreplay/adapters/dist/opencode.d.ts.map +1 -0
- package/node_modules/@agenticreplay/adapters/dist/opencode.js +243 -0
- package/node_modules/@agenticreplay/adapters/dist/opencode.js.map +1 -0
- package/node_modules/@agenticreplay/adapters/dist/qwen.d.ts +51 -0
- package/node_modules/@agenticreplay/adapters/dist/qwen.d.ts.map +1 -0
- package/node_modules/@agenticreplay/adapters/dist/qwen.js +105 -0
- package/node_modules/@agenticreplay/adapters/dist/qwen.js.map +1 -0
- package/node_modules/@agenticreplay/adapters/dist/registry.d.ts +19 -0
- package/node_modules/@agenticreplay/adapters/dist/registry.d.ts.map +1 -0
- package/node_modules/@agenticreplay/adapters/dist/registry.js +110 -0
- package/node_modules/@agenticreplay/adapters/dist/registry.js.map +1 -0
- package/node_modules/@agenticreplay/adapters/dist/scaffold.d.ts +26 -0
- package/node_modules/@agenticreplay/adapters/dist/scaffold.d.ts.map +1 -0
- package/node_modules/@agenticreplay/adapters/dist/scaffold.js +125 -0
- package/node_modules/@agenticreplay/adapters/dist/scaffold.js.map +1 -0
- package/node_modules/@agenticreplay/adapters/dist/session.d.ts +47 -0
- package/node_modules/@agenticreplay/adapters/dist/session.d.ts.map +1 -0
- package/node_modules/@agenticreplay/adapters/dist/session.js +112 -0
- package/node_modules/@agenticreplay/adapters/dist/session.js.map +1 -0
- package/node_modules/@agenticreplay/adapters/dist/zcode.d.ts +60 -0
- package/node_modules/@agenticreplay/adapters/dist/zcode.d.ts.map +1 -0
- package/node_modules/@agenticreplay/adapters/dist/zcode.js +424 -0
- package/node_modules/@agenticreplay/adapters/dist/zcode.js.map +1 -0
- package/node_modules/@agenticreplay/adapters/package.json +29 -0
- package/node_modules/@agenticreplay/core/dist/blobs.d.ts +21 -0
- package/node_modules/@agenticreplay/core/dist/blobs.d.ts.map +1 -0
- package/node_modules/@agenticreplay/core/dist/blobs.js +102 -0
- package/node_modules/@agenticreplay/core/dist/blobs.js.map +1 -0
- package/node_modules/@agenticreplay/core/dist/fetch.d.ts +38 -0
- package/node_modules/@agenticreplay/core/dist/fetch.d.ts.map +1 -0
- package/node_modules/@agenticreplay/core/dist/fetch.js +47 -0
- package/node_modules/@agenticreplay/core/dist/fetch.js.map +1 -0
- package/node_modules/@agenticreplay/core/dist/graph.d.ts +106 -0
- package/node_modules/@agenticreplay/core/dist/graph.d.ts.map +1 -0
- package/node_modules/@agenticreplay/core/dist/graph.js +394 -0
- package/node_modules/@agenticreplay/core/dist/graph.js.map +1 -0
- package/node_modules/@agenticreplay/core/dist/index.d.ts +9 -0
- package/node_modules/@agenticreplay/core/dist/index.d.ts.map +1 -0
- package/node_modules/@agenticreplay/core/dist/index.js +9 -0
- package/node_modules/@agenticreplay/core/dist/index.js.map +1 -0
- package/node_modules/@agenticreplay/core/dist/paths.d.ts +45 -0
- package/node_modules/@agenticreplay/core/dist/paths.d.ts.map +1 -0
- package/node_modules/@agenticreplay/core/dist/paths.js +149 -0
- package/node_modules/@agenticreplay/core/dist/paths.js.map +1 -0
- package/node_modules/@agenticreplay/core/dist/private-files.d.ts +37 -0
- package/node_modules/@agenticreplay/core/dist/private-files.d.ts.map +1 -0
- package/node_modules/@agenticreplay/core/dist/private-files.js +353 -0
- package/node_modules/@agenticreplay/core/dist/private-files.js.map +1 -0
- package/node_modules/@agenticreplay/core/dist/reader.d.ts +45 -0
- package/node_modules/@agenticreplay/core/dist/reader.d.ts.map +1 -0
- package/node_modules/@agenticreplay/core/dist/reader.js +152 -0
- package/node_modules/@agenticreplay/core/dist/reader.js.map +1 -0
- package/node_modules/@agenticreplay/core/dist/redaction.d.ts +69 -0
- package/node_modules/@agenticreplay/core/dist/redaction.d.ts.map +1 -0
- package/node_modules/@agenticreplay/core/dist/redaction.js +768 -0
- package/node_modules/@agenticreplay/core/dist/redaction.js.map +1 -0
- package/node_modules/@agenticreplay/core/dist/writer.d.ts +75 -0
- package/node_modules/@agenticreplay/core/dist/writer.d.ts.map +1 -0
- package/node_modules/@agenticreplay/core/dist/writer.js +368 -0
- package/node_modules/@agenticreplay/core/dist/writer.js.map +1 -0
- package/node_modules/@agenticreplay/core/package.json +26 -0
- package/node_modules/@agenticreplay/fs-capture/dist/capture.d.ts +84 -0
- package/node_modules/@agenticreplay/fs-capture/dist/capture.d.ts.map +1 -0
- package/node_modules/@agenticreplay/fs-capture/dist/capture.js +147 -0
- package/node_modules/@agenticreplay/fs-capture/dist/capture.js.map +1 -0
- package/node_modules/@agenticreplay/fs-capture/dist/git.d.ts +25 -0
- package/node_modules/@agenticreplay/fs-capture/dist/git.d.ts.map +1 -0
- package/node_modules/@agenticreplay/fs-capture/dist/git.js +108 -0
- package/node_modules/@agenticreplay/fs-capture/dist/git.js.map +1 -0
- package/node_modules/@agenticreplay/fs-capture/dist/index.d.ts +4 -0
- package/node_modules/@agenticreplay/fs-capture/dist/index.d.ts.map +1 -0
- package/node_modules/@agenticreplay/fs-capture/dist/index.js +4 -0
- package/node_modules/@agenticreplay/fs-capture/dist/index.js.map +1 -0
- package/node_modules/@agenticreplay/fs-capture/dist/shadow.d.ts +271 -0
- package/node_modules/@agenticreplay/fs-capture/dist/shadow.d.ts.map +1 -0
- package/node_modules/@agenticreplay/fs-capture/dist/shadow.js +668 -0
- package/node_modules/@agenticreplay/fs-capture/dist/shadow.js.map +1 -0
- package/node_modules/@agenticreplay/fs-capture/package.json +25 -0
- package/node_modules/@agenticreplay/mcp-shim/dist/cli.d.ts +100 -0
- package/node_modules/@agenticreplay/mcp-shim/dist/cli.d.ts.map +1 -0
- package/node_modules/@agenticreplay/mcp-shim/dist/cli.js +334 -0
- package/node_modules/@agenticreplay/mcp-shim/dist/cli.js.map +1 -0
- package/node_modules/@agenticreplay/mcp-shim/dist/framing.d.ts +41 -0
- package/node_modules/@agenticreplay/mcp-shim/dist/framing.d.ts.map +1 -0
- package/node_modules/@agenticreplay/mcp-shim/dist/framing.js +94 -0
- package/node_modules/@agenticreplay/mcp-shim/dist/framing.js.map +1 -0
- package/node_modules/@agenticreplay/mcp-shim/dist/index.d.ts +5 -0
- package/node_modules/@agenticreplay/mcp-shim/dist/index.d.ts.map +1 -0
- package/node_modules/@agenticreplay/mcp-shim/dist/index.js +5 -0
- package/node_modules/@agenticreplay/mcp-shim/dist/index.js.map +1 -0
- package/node_modules/@agenticreplay/mcp-shim/dist/mock.d.ts +70 -0
- package/node_modules/@agenticreplay/mcp-shim/dist/mock.d.ts.map +1 -0
- package/node_modules/@agenticreplay/mcp-shim/dist/mock.js +138 -0
- package/node_modules/@agenticreplay/mcp-shim/dist/mock.js.map +1 -0
- package/node_modules/@agenticreplay/mcp-shim/dist/shim.d.ts +24 -0
- package/node_modules/@agenticreplay/mcp-shim/dist/shim.d.ts.map +1 -0
- package/node_modules/@agenticreplay/mcp-shim/dist/shim.js +105 -0
- package/node_modules/@agenticreplay/mcp-shim/dist/shim.js.map +1 -0
- package/node_modules/@agenticreplay/mcp-shim/package.json +26 -0
- package/node_modules/@agenticreplay/node-instrument/dist/capture.d.ts +58 -0
- package/node_modules/@agenticreplay/node-instrument/dist/capture.d.ts.map +1 -0
- package/node_modules/@agenticreplay/node-instrument/dist/capture.js +404 -0
- package/node_modules/@agenticreplay/node-instrument/dist/capture.js.map +1 -0
- package/node_modules/@agenticreplay/node-instrument/dist/index.d.ts +4 -0
- package/node_modules/@agenticreplay/node-instrument/dist/index.d.ts.map +1 -0
- package/node_modules/@agenticreplay/node-instrument/dist/index.js +4 -0
- package/node_modules/@agenticreplay/node-instrument/dist/index.js.map +1 -0
- package/node_modules/@agenticreplay/node-instrument/dist/install.d.ts +47 -0
- package/node_modules/@agenticreplay/node-instrument/dist/install.d.ts.map +1 -0
- package/node_modules/@agenticreplay/node-instrument/dist/install.js +174 -0
- package/node_modules/@agenticreplay/node-instrument/dist/install.js.map +1 -0
- package/node_modules/@agenticreplay/node-instrument/dist/rewrite.d.ts +33 -0
- package/node_modules/@agenticreplay/node-instrument/dist/rewrite.d.ts.map +1 -0
- package/node_modules/@agenticreplay/node-instrument/dist/rewrite.js +61 -0
- package/node_modules/@agenticreplay/node-instrument/dist/rewrite.js.map +1 -0
- package/node_modules/@agenticreplay/node-instrument/package.json +23 -0
- package/node_modules/@agenticreplay/plugin-api/dist/canonical.d.ts +87 -0
- package/node_modules/@agenticreplay/plugin-api/dist/canonical.d.ts.map +1 -0
- package/node_modules/@agenticreplay/plugin-api/dist/canonical.js +10 -0
- package/node_modules/@agenticreplay/plugin-api/dist/canonical.js.map +1 -0
- package/node_modules/@agenticreplay/plugin-api/dist/index.d.ts +3 -0
- package/node_modules/@agenticreplay/plugin-api/dist/index.d.ts.map +1 -0
- package/node_modules/@agenticreplay/plugin-api/dist/index.js +3 -0
- package/node_modules/@agenticreplay/plugin-api/dist/index.js.map +1 -0
- package/node_modules/@agenticreplay/plugin-api/dist/plugins.d.ts +258 -0
- package/node_modules/@agenticreplay/plugin-api/dist/plugins.d.ts.map +1 -0
- package/node_modules/@agenticreplay/plugin-api/dist/plugins.js +2 -0
- package/node_modules/@agenticreplay/plugin-api/dist/plugins.js.map +1 -0
- package/node_modules/@agenticreplay/plugin-api/package.json +22 -0
- package/node_modules/@agenticreplay/providers/dist/index.d.ts +34 -0
- package/node_modules/@agenticreplay/providers/dist/index.d.ts.map +1 -0
- package/node_modules/@agenticreplay/providers/dist/index.js +34 -0
- package/node_modules/@agenticreplay/providers/dist/index.js.map +1 -0
- package/node_modules/@agenticreplay/providers/dist/pricing.d.ts +44 -0
- package/node_modules/@agenticreplay/providers/dist/pricing.d.ts.map +1 -0
- package/node_modules/@agenticreplay/providers/dist/pricing.js +126 -0
- package/node_modules/@agenticreplay/providers/dist/pricing.js.map +1 -0
- package/node_modules/@agenticreplay/providers/dist/translate/anthropic.d.ts +66 -0
- package/node_modules/@agenticreplay/providers/dist/translate/anthropic.d.ts.map +1 -0
- package/node_modules/@agenticreplay/providers/dist/translate/anthropic.js +569 -0
- package/node_modules/@agenticreplay/providers/dist/translate/anthropic.js.map +1 -0
- package/node_modules/@agenticreplay/providers/dist/translate/openai-responses.d.ts +51 -0
- package/node_modules/@agenticreplay/providers/dist/translate/openai-responses.d.ts.map +1 -0
- package/node_modules/@agenticreplay/providers/dist/translate/openai-responses.js +574 -0
- package/node_modules/@agenticreplay/providers/dist/translate/openai-responses.js.map +1 -0
- package/node_modules/@agenticreplay/providers/dist/translate/openai.d.ts +60 -0
- package/node_modules/@agenticreplay/providers/dist/translate/openai.d.ts.map +1 -0
- package/node_modules/@agenticreplay/providers/dist/translate/openai.js +577 -0
- package/node_modules/@agenticreplay/providers/dist/translate/openai.js.map +1 -0
- package/node_modules/@agenticreplay/providers/dist/translate/sse.d.ts +29 -0
- package/node_modules/@agenticreplay/providers/dist/translate/sse.d.ts.map +1 -0
- package/node_modules/@agenticreplay/providers/dist/translate/sse.js +97 -0
- package/node_modules/@agenticreplay/providers/dist/translate/sse.js.map +1 -0
- package/node_modules/@agenticreplay/providers/dist/translate/util.d.ts +34 -0
- package/node_modules/@agenticreplay/providers/dist/translate/util.d.ts.map +1 -0
- package/node_modules/@agenticreplay/providers/dist/translate/util.js +106 -0
- package/node_modules/@agenticreplay/providers/dist/translate/util.js.map +1 -0
- package/node_modules/@agenticreplay/providers/package.json +26 -0
- package/node_modules/@agenticreplay/proxy/dist/ca.d.ts +45 -0
- package/node_modules/@agenticreplay/proxy/dist/ca.d.ts.map +1 -0
- package/node_modules/@agenticreplay/proxy/dist/ca.js +264 -0
- package/node_modules/@agenticreplay/proxy/dist/ca.js.map +1 -0
- package/node_modules/@agenticreplay/proxy/dist/der.d.ts +51 -0
- package/node_modules/@agenticreplay/proxy/dist/der.d.ts.map +1 -0
- package/node_modules/@agenticreplay/proxy/dist/der.js +144 -0
- package/node_modules/@agenticreplay/proxy/dist/der.js.map +1 -0
- package/node_modules/@agenticreplay/proxy/dist/dialects.d.ts +81 -0
- package/node_modules/@agenticreplay/proxy/dist/dialects.d.ts.map +1 -0
- package/node_modules/@agenticreplay/proxy/dist/dialects.js +329 -0
- package/node_modules/@agenticreplay/proxy/dist/dialects.js.map +1 -0
- package/node_modules/@agenticreplay/proxy/dist/forward.d.ts +34 -0
- package/node_modules/@agenticreplay/proxy/dist/forward.d.ts.map +1 -0
- package/node_modules/@agenticreplay/proxy/dist/forward.js +44 -0
- package/node_modules/@agenticreplay/proxy/dist/forward.js.map +1 -0
- package/node_modules/@agenticreplay/proxy/dist/index.d.ts +9 -0
- package/node_modules/@agenticreplay/proxy/dist/index.d.ts.map +1 -0
- package/node_modules/@agenticreplay/proxy/dist/index.js +9 -0
- package/node_modules/@agenticreplay/proxy/dist/index.js.map +1 -0
- package/node_modules/@agenticreplay/proxy/dist/intercept.d.ts +234 -0
- package/node_modules/@agenticreplay/proxy/dist/intercept.d.ts.map +1 -0
- package/node_modules/@agenticreplay/proxy/dist/intercept.js +1258 -0
- package/node_modules/@agenticreplay/proxy/dist/intercept.js.map +1 -0
- package/node_modules/@agenticreplay/proxy/dist/matching.d.ts +109 -0
- package/node_modules/@agenticreplay/proxy/dist/matching.d.ts.map +1 -0
- package/node_modules/@agenticreplay/proxy/dist/matching.js +928 -0
- package/node_modules/@agenticreplay/proxy/dist/matching.js.map +1 -0
- package/node_modules/@agenticreplay/proxy/dist/retrieval.d.ts +93 -0
- package/node_modules/@agenticreplay/proxy/dist/retrieval.d.ts.map +1 -0
- package/node_modules/@agenticreplay/proxy/dist/retrieval.js +233 -0
- package/node_modules/@agenticreplay/proxy/dist/retrieval.js.map +1 -0
- package/node_modules/@agenticreplay/proxy/dist/server.d.ts +327 -0
- package/node_modules/@agenticreplay/proxy/dist/server.d.ts.map +1 -0
- package/node_modules/@agenticreplay/proxy/dist/server.js +2291 -0
- package/node_modules/@agenticreplay/proxy/dist/server.js.map +1 -0
- package/node_modules/@agenticreplay/proxy/dist/tls-hosts.d.ts +54 -0
- package/node_modules/@agenticreplay/proxy/dist/tls-hosts.d.ts.map +1 -0
- package/node_modules/@agenticreplay/proxy/dist/tls-hosts.js +178 -0
- package/node_modules/@agenticreplay/proxy/dist/tls-hosts.js.map +1 -0
- package/node_modules/@agenticreplay/proxy/package.json +28 -0
- package/node_modules/@agenticreplay/schema/dist/constants.d.ts +30 -0
- package/node_modules/@agenticreplay/schema/dist/constants.d.ts.map +1 -0
- package/node_modules/@agenticreplay/schema/dist/constants.js +66 -0
- package/node_modules/@agenticreplay/schema/dist/constants.js.map +1 -0
- package/node_modules/@agenticreplay/schema/dist/index.d.ts +4 -0
- package/node_modules/@agenticreplay/schema/dist/index.d.ts.map +1 -0
- package/node_modules/@agenticreplay/schema/dist/index.js +4 -0
- package/node_modules/@agenticreplay/schema/dist/index.js.map +1 -0
- package/node_modules/@agenticreplay/schema/dist/types.d.ts +97 -0
- package/node_modules/@agenticreplay/schema/dist/types.d.ts.map +1 -0
- package/node_modules/@agenticreplay/schema/dist/types.js +7 -0
- package/node_modules/@agenticreplay/schema/dist/types.js.map +1 -0
- package/node_modules/@agenticreplay/schema/dist/validate.d.ts +13 -0
- package/node_modules/@agenticreplay/schema/dist/validate.d.ts.map +1 -0
- package/node_modules/@agenticreplay/schema/dist/validate.js +44 -0
- package/node_modules/@agenticreplay/schema/dist/validate.js.map +1 -0
- package/node_modules/@agenticreplay/schema/package.json +28 -0
- package/node_modules/@agenticreplay/shell-shim/dist/index.d.ts +4 -0
- package/node_modules/@agenticreplay/shell-shim/dist/index.d.ts.map +1 -0
- package/node_modules/@agenticreplay/shell-shim/dist/index.js +4 -0
- package/node_modules/@agenticreplay/shell-shim/dist/index.js.map +1 -0
- package/node_modules/@agenticreplay/shell-shim/dist/install.d.ts +75 -0
- package/node_modules/@agenticreplay/shell-shim/dist/install.d.ts.map +1 -0
- package/node_modules/@agenticreplay/shell-shim/dist/install.js +353 -0
- package/node_modules/@agenticreplay/shell-shim/dist/install.js.map +1 -0
- package/node_modules/@agenticreplay/shell-shim/dist/resolve.d.ts +2 -0
- package/node_modules/@agenticreplay/shell-shim/dist/resolve.d.ts.map +1 -0
- package/node_modules/@agenticreplay/shell-shim/dist/resolve.js +97 -0
- package/node_modules/@agenticreplay/shell-shim/dist/resolve.js.map +1 -0
- package/node_modules/@agenticreplay/shell-shim/dist/runner-bin.d.ts +3 -0
- package/node_modules/@agenticreplay/shell-shim/dist/runner-bin.d.ts.map +1 -0
- package/node_modules/@agenticreplay/shell-shim/dist/runner-bin.js +4 -0
- package/node_modules/@agenticreplay/shell-shim/dist/runner-bin.js.map +1 -0
- package/node_modules/@agenticreplay/shell-shim/dist/runner.d.ts +45 -0
- package/node_modules/@agenticreplay/shell-shim/dist/runner.d.ts.map +1 -0
- package/node_modules/@agenticreplay/shell-shim/dist/runner.js +105 -0
- package/node_modules/@agenticreplay/shell-shim/dist/runner.js.map +1 -0
- package/node_modules/@agenticreplay/shell-shim/package.json +26 -0
- package/node_modules/@agenticreplay/viewer/dist/bundle.d.ts +11 -0
- package/node_modules/@agenticreplay/viewer/dist/bundle.d.ts.map +1 -0
- package/node_modules/@agenticreplay/viewer/dist/bundle.js +36 -0
- package/node_modules/@agenticreplay/viewer/dist/bundle.js.map +1 -0
- package/node_modules/@agenticreplay/viewer/dist/client/main.d.ts +12 -0
- package/node_modules/@agenticreplay/viewer/dist/client/main.d.ts.map +1 -0
- package/node_modules/@agenticreplay/viewer/dist/client/main.js +249 -0
- package/node_modules/@agenticreplay/viewer/dist/client/main.js.map +1 -0
- package/node_modules/@agenticreplay/viewer/dist/credit.d.ts +22 -0
- package/node_modules/@agenticreplay/viewer/dist/credit.d.ts.map +1 -0
- package/node_modules/@agenticreplay/viewer/dist/credit.js +22 -0
- package/node_modules/@agenticreplay/viewer/dist/credit.js.map +1 -0
- package/node_modules/@agenticreplay/viewer/dist/css.d.ts +11 -0
- package/node_modules/@agenticreplay/viewer/dist/css.d.ts.map +1 -0
- package/node_modules/@agenticreplay/viewer/dist/css.js +410 -0
- package/node_modules/@agenticreplay/viewer/dist/css.js.map +1 -0
- package/node_modules/@agenticreplay/viewer/dist/export.d.ts +21 -0
- package/node_modules/@agenticreplay/viewer/dist/export.d.ts.map +1 -0
- package/node_modules/@agenticreplay/viewer/dist/export.js +22 -0
- package/node_modules/@agenticreplay/viewer/dist/export.js.map +1 -0
- package/node_modules/@agenticreplay/viewer/dist/html.d.ts +32 -0
- package/node_modules/@agenticreplay/viewer/dist/html.d.ts.map +1 -0
- package/node_modules/@agenticreplay/viewer/dist/html.js +252 -0
- package/node_modules/@agenticreplay/viewer/dist/html.js.map +1 -0
- package/node_modules/@agenticreplay/viewer/dist/index.d.ts +16 -0
- package/node_modules/@agenticreplay/viewer/dist/index.d.ts.map +1 -0
- package/node_modules/@agenticreplay/viewer/dist/index.js +16 -0
- package/node_modules/@agenticreplay/viewer/dist/index.js.map +1 -0
- package/node_modules/@agenticreplay/viewer/dist/render.d.ts +126 -0
- package/node_modules/@agenticreplay/viewer/dist/render.d.ts.map +1 -0
- package/node_modules/@agenticreplay/viewer/dist/render.js +699 -0
- package/node_modules/@agenticreplay/viewer/dist/render.js.map +1 -0
- package/node_modules/@agenticreplay/viewer/dist/serve.d.ts +21 -0
- package/node_modules/@agenticreplay/viewer/dist/serve.d.ts.map +1 -0
- package/node_modules/@agenticreplay/viewer/dist/serve.js +122 -0
- package/node_modules/@agenticreplay/viewer/dist/serve.js.map +1 -0
- package/node_modules/@agenticreplay/viewer/dist/trace-dir.d.ts +28 -0
- package/node_modules/@agenticreplay/viewer/dist/trace-dir.d.ts.map +1 -0
- package/node_modules/@agenticreplay/viewer/dist/trace-dir.js +120 -0
- package/node_modules/@agenticreplay/viewer/dist/trace-dir.js.map +1 -0
- package/node_modules/@agenticreplay/viewer/package.json +25 -0
- package/node_modules/ajv/.runkit_example.js +23 -0
- package/node_modules/ajv/LICENSE +22 -0
- package/node_modules/ajv/README.md +207 -0
- package/node_modules/ajv/dist/2019.d.ts +19 -0
- package/node_modules/ajv/dist/2019.js +61 -0
- package/node_modules/ajv/dist/2019.js.map +1 -0
- package/node_modules/ajv/dist/2020.d.ts +19 -0
- package/node_modules/ajv/dist/2020.js +55 -0
- package/node_modules/ajv/dist/2020.js.map +1 -0
- package/node_modules/ajv/dist/ajv.d.ts +18 -0
- package/node_modules/ajv/dist/ajv.js +50 -0
- package/node_modules/ajv/dist/ajv.js.map +1 -0
- package/node_modules/ajv/dist/compile/codegen/code.d.ts +40 -0
- package/node_modules/ajv/dist/compile/codegen/code.js +156 -0
- package/node_modules/ajv/dist/compile/codegen/code.js.map +1 -0
- package/node_modules/ajv/dist/compile/codegen/index.d.ts +79 -0
- package/node_modules/ajv/dist/compile/codegen/index.js +697 -0
- package/node_modules/ajv/dist/compile/codegen/index.js.map +1 -0
- package/node_modules/ajv/dist/compile/codegen/scope.d.ts +79 -0
- package/node_modules/ajv/dist/compile/codegen/scope.js +143 -0
- package/node_modules/ajv/dist/compile/codegen/scope.js.map +1 -0
- package/node_modules/ajv/dist/compile/errors.d.ts +13 -0
- package/node_modules/ajv/dist/compile/errors.js +123 -0
- package/node_modules/ajv/dist/compile/errors.js.map +1 -0
- package/node_modules/ajv/dist/compile/index.d.ts +80 -0
- package/node_modules/ajv/dist/compile/index.js +242 -0
- package/node_modules/ajv/dist/compile/index.js.map +1 -0
- package/node_modules/ajv/dist/compile/jtd/parse.d.ts +4 -0
- package/node_modules/ajv/dist/compile/jtd/parse.js +350 -0
- package/node_modules/ajv/dist/compile/jtd/parse.js.map +1 -0
- package/node_modules/ajv/dist/compile/jtd/serialize.d.ts +4 -0
- package/node_modules/ajv/dist/compile/jtd/serialize.js +236 -0
- package/node_modules/ajv/dist/compile/jtd/serialize.js.map +1 -0
- package/node_modules/ajv/dist/compile/jtd/types.d.ts +6 -0
- package/node_modules/ajv/dist/compile/jtd/types.js +14 -0
- package/node_modules/ajv/dist/compile/jtd/types.js.map +1 -0
- package/node_modules/ajv/dist/compile/names.d.ts +20 -0
- package/node_modules/ajv/dist/compile/names.js +28 -0
- package/node_modules/ajv/dist/compile/names.js.map +1 -0
- package/node_modules/ajv/dist/compile/ref_error.d.ts +6 -0
- package/node_modules/ajv/dist/compile/ref_error.js +12 -0
- package/node_modules/ajv/dist/compile/ref_error.js.map +1 -0
- package/node_modules/ajv/dist/compile/resolve.d.ts +12 -0
- package/node_modules/ajv/dist/compile/resolve.js +155 -0
- package/node_modules/ajv/dist/compile/resolve.js.map +1 -0
- package/node_modules/ajv/dist/compile/rules.d.ts +28 -0
- package/node_modules/ajv/dist/compile/rules.js +26 -0
- package/node_modules/ajv/dist/compile/rules.js.map +1 -0
- package/node_modules/ajv/dist/compile/util.d.ts +40 -0
- package/node_modules/ajv/dist/compile/util.js +178 -0
- package/node_modules/ajv/dist/compile/util.js.map +1 -0
- package/node_modules/ajv/dist/compile/validate/applicability.d.ts +6 -0
- package/node_modules/ajv/dist/compile/validate/applicability.js +19 -0
- package/node_modules/ajv/dist/compile/validate/applicability.js.map +1 -0
- package/node_modules/ajv/dist/compile/validate/boolSchema.d.ts +4 -0
- package/node_modules/ajv/dist/compile/validate/boolSchema.js +50 -0
- package/node_modules/ajv/dist/compile/validate/boolSchema.js.map +1 -0
- package/node_modules/ajv/dist/compile/validate/dataType.d.ts +17 -0
- package/node_modules/ajv/dist/compile/validate/dataType.js +203 -0
- package/node_modules/ajv/dist/compile/validate/dataType.js.map +1 -0
- package/node_modules/ajv/dist/compile/validate/defaults.d.ts +2 -0
- package/node_modules/ajv/dist/compile/validate/defaults.js +35 -0
- package/node_modules/ajv/dist/compile/validate/defaults.js.map +1 -0
- package/node_modules/ajv/dist/compile/validate/index.d.ts +42 -0
- package/node_modules/ajv/dist/compile/validate/index.js +520 -0
- package/node_modules/ajv/dist/compile/validate/index.js.map +1 -0
- package/node_modules/ajv/dist/compile/validate/keyword.d.ts +8 -0
- package/node_modules/ajv/dist/compile/validate/keyword.js +124 -0
- package/node_modules/ajv/dist/compile/validate/keyword.js.map +1 -0
- package/node_modules/ajv/dist/compile/validate/subschema.d.ts +47 -0
- package/node_modules/ajv/dist/compile/validate/subschema.js +81 -0
- package/node_modules/ajv/dist/compile/validate/subschema.js.map +1 -0
- package/node_modules/ajv/dist/core.d.ts +174 -0
- package/node_modules/ajv/dist/core.js +618 -0
- package/node_modules/ajv/dist/core.js.map +1 -0
- package/node_modules/ajv/dist/jtd.d.ts +47 -0
- package/node_modules/ajv/dist/jtd.js +72 -0
- package/node_modules/ajv/dist/jtd.js.map +1 -0
- package/node_modules/ajv/dist/refs/data.json +13 -0
- package/node_modules/ajv/dist/refs/json-schema-2019-09/index.d.ts +2 -0
- package/node_modules/ajv/dist/refs/json-schema-2019-09/index.js +28 -0
- package/node_modules/ajv/dist/refs/json-schema-2019-09/index.js.map +1 -0
- package/node_modules/ajv/dist/refs/json-schema-2019-09/meta/applicator.json +53 -0
- package/node_modules/ajv/dist/refs/json-schema-2019-09/meta/content.json +17 -0
- package/node_modules/ajv/dist/refs/json-schema-2019-09/meta/core.json +57 -0
- package/node_modules/ajv/dist/refs/json-schema-2019-09/meta/format.json +14 -0
- package/node_modules/ajv/dist/refs/json-schema-2019-09/meta/meta-data.json +37 -0
- package/node_modules/ajv/dist/refs/json-schema-2019-09/meta/validation.json +90 -0
- package/node_modules/ajv/dist/refs/json-schema-2019-09/schema.json +39 -0
- package/node_modules/ajv/dist/refs/json-schema-2020-12/index.d.ts +2 -0
- package/node_modules/ajv/dist/refs/json-schema-2020-12/index.js +30 -0
- package/node_modules/ajv/dist/refs/json-schema-2020-12/index.js.map +1 -0
- package/node_modules/ajv/dist/refs/json-schema-2020-12/meta/applicator.json +48 -0
- package/node_modules/ajv/dist/refs/json-schema-2020-12/meta/content.json +17 -0
- package/node_modules/ajv/dist/refs/json-schema-2020-12/meta/core.json +51 -0
- package/node_modules/ajv/dist/refs/json-schema-2020-12/meta/format-annotation.json +14 -0
- package/node_modules/ajv/dist/refs/json-schema-2020-12/meta/meta-data.json +37 -0
- package/node_modules/ajv/dist/refs/json-schema-2020-12/meta/unevaluated.json +15 -0
- package/node_modules/ajv/dist/refs/json-schema-2020-12/meta/validation.json +90 -0
- package/node_modules/ajv/dist/refs/json-schema-2020-12/schema.json +55 -0
- package/node_modules/ajv/dist/refs/json-schema-draft-06.json +137 -0
- package/node_modules/ajv/dist/refs/json-schema-draft-07.json +151 -0
- package/node_modules/ajv/dist/refs/json-schema-secure.json +88 -0
- package/node_modules/ajv/dist/refs/jtd-schema.d.ts +3 -0
- package/node_modules/ajv/dist/refs/jtd-schema.js +118 -0
- package/node_modules/ajv/dist/refs/jtd-schema.js.map +1 -0
- package/node_modules/ajv/dist/runtime/equal.d.ts +6 -0
- package/node_modules/ajv/dist/runtime/equal.js +7 -0
- package/node_modules/ajv/dist/runtime/equal.js.map +1 -0
- package/node_modules/ajv/dist/runtime/parseJson.d.ts +18 -0
- package/node_modules/ajv/dist/runtime/parseJson.js +185 -0
- package/node_modules/ajv/dist/runtime/parseJson.js.map +1 -0
- package/node_modules/ajv/dist/runtime/quote.d.ts +5 -0
- package/node_modules/ajv/dist/runtime/quote.js +30 -0
- package/node_modules/ajv/dist/runtime/quote.js.map +1 -0
- package/node_modules/ajv/dist/runtime/re2.d.ts +6 -0
- package/node_modules/ajv/dist/runtime/re2.js +6 -0
- package/node_modules/ajv/dist/runtime/re2.js.map +1 -0
- package/node_modules/ajv/dist/runtime/timestamp.d.ts +5 -0
- package/node_modules/ajv/dist/runtime/timestamp.js +42 -0
- package/node_modules/ajv/dist/runtime/timestamp.js.map +1 -0
- package/node_modules/ajv/dist/runtime/ucs2length.d.ts +5 -0
- package/node_modules/ajv/dist/runtime/ucs2length.js +24 -0
- package/node_modules/ajv/dist/runtime/ucs2length.js.map +1 -0
- package/node_modules/ajv/dist/runtime/uri.d.ts +6 -0
- package/node_modules/ajv/dist/runtime/uri.js +6 -0
- package/node_modules/ajv/dist/runtime/uri.js.map +1 -0
- package/node_modules/ajv/dist/runtime/validation_error.d.ts +7 -0
- package/node_modules/ajv/dist/runtime/validation_error.js +11 -0
- package/node_modules/ajv/dist/runtime/validation_error.js.map +1 -0
- package/node_modules/ajv/dist/standalone/index.d.ts +6 -0
- package/node_modules/ajv/dist/standalone/index.js +90 -0
- package/node_modules/ajv/dist/standalone/index.js.map +1 -0
- package/node_modules/ajv/dist/standalone/instance.d.ts +12 -0
- package/node_modules/ajv/dist/standalone/instance.js +35 -0
- package/node_modules/ajv/dist/standalone/instance.js.map +1 -0
- package/node_modules/ajv/dist/types/index.d.ts +183 -0
- package/node_modules/ajv/dist/types/index.js +3 -0
- package/node_modules/ajv/dist/types/index.js.map +1 -0
- package/node_modules/ajv/dist/types/json-schema.d.ts +125 -0
- package/node_modules/ajv/dist/types/json-schema.js +3 -0
- package/node_modules/ajv/dist/types/json-schema.js.map +1 -0
- package/node_modules/ajv/dist/types/jtd-schema.d.ts +174 -0
- package/node_modules/ajv/dist/types/jtd-schema.js +3 -0
- package/node_modules/ajv/dist/types/jtd-schema.js.map +1 -0
- package/node_modules/ajv/dist/vocabularies/applicator/additionalItems.d.ts +8 -0
- package/node_modules/ajv/dist/vocabularies/applicator/additionalItems.js +49 -0
- package/node_modules/ajv/dist/vocabularies/applicator/additionalItems.js.map +1 -0
- package/node_modules/ajv/dist/vocabularies/applicator/additionalProperties.d.ts +6 -0
- package/node_modules/ajv/dist/vocabularies/applicator/additionalProperties.js +106 -0
- package/node_modules/ajv/dist/vocabularies/applicator/additionalProperties.js.map +1 -0
- package/node_modules/ajv/dist/vocabularies/applicator/allOf.d.ts +3 -0
- package/node_modules/ajv/dist/vocabularies/applicator/allOf.js +23 -0
- package/node_modules/ajv/dist/vocabularies/applicator/allOf.js.map +1 -0
- package/node_modules/ajv/dist/vocabularies/applicator/anyOf.d.ts +4 -0
- package/node_modules/ajv/dist/vocabularies/applicator/anyOf.js +12 -0
- package/node_modules/ajv/dist/vocabularies/applicator/anyOf.js.map +1 -0
- package/node_modules/ajv/dist/vocabularies/applicator/contains.d.ts +7 -0
- package/node_modules/ajv/dist/vocabularies/applicator/contains.js +95 -0
- package/node_modules/ajv/dist/vocabularies/applicator/contains.js.map +1 -0
- package/node_modules/ajv/dist/vocabularies/applicator/dependencies.d.ts +21 -0
- package/node_modules/ajv/dist/vocabularies/applicator/dependencies.js +85 -0
- package/node_modules/ajv/dist/vocabularies/applicator/dependencies.js.map +1 -0
- package/node_modules/ajv/dist/vocabularies/applicator/dependentSchemas.d.ts +3 -0
- package/node_modules/ajv/dist/vocabularies/applicator/dependentSchemas.js +11 -0
- package/node_modules/ajv/dist/vocabularies/applicator/dependentSchemas.js.map +1 -0
- package/node_modules/ajv/dist/vocabularies/applicator/if.d.ts +6 -0
- package/node_modules/ajv/dist/vocabularies/applicator/if.js +66 -0
- package/node_modules/ajv/dist/vocabularies/applicator/if.js.map +1 -0
- package/node_modules/ajv/dist/vocabularies/applicator/index.d.ts +13 -0
- package/node_modules/ajv/dist/vocabularies/applicator/index.js +44 -0
- package/node_modules/ajv/dist/vocabularies/applicator/index.js.map +1 -0
- package/node_modules/ajv/dist/vocabularies/applicator/items.d.ts +5 -0
- package/node_modules/ajv/dist/vocabularies/applicator/items.js +52 -0
- package/node_modules/ajv/dist/vocabularies/applicator/items.js.map +1 -0
- package/node_modules/ajv/dist/vocabularies/applicator/items2020.d.ts +6 -0
- package/node_modules/ajv/dist/vocabularies/applicator/items2020.js +30 -0
- package/node_modules/ajv/dist/vocabularies/applicator/items2020.js.map +1 -0
- package/node_modules/ajv/dist/vocabularies/applicator/not.d.ts +4 -0
- package/node_modules/ajv/dist/vocabularies/applicator/not.js +26 -0
- package/node_modules/ajv/dist/vocabularies/applicator/not.js.map +1 -0
- package/node_modules/ajv/dist/vocabularies/applicator/oneOf.d.ts +6 -0
- package/node_modules/ajv/dist/vocabularies/applicator/oneOf.js +60 -0
- package/node_modules/ajv/dist/vocabularies/applicator/oneOf.js.map +1 -0
- package/node_modules/ajv/dist/vocabularies/applicator/patternProperties.d.ts +3 -0
- package/node_modules/ajv/dist/vocabularies/applicator/patternProperties.js +75 -0
- package/node_modules/ajv/dist/vocabularies/applicator/patternProperties.js.map +1 -0
- package/node_modules/ajv/dist/vocabularies/applicator/prefixItems.d.ts +3 -0
- package/node_modules/ajv/dist/vocabularies/applicator/prefixItems.js +12 -0
- package/node_modules/ajv/dist/vocabularies/applicator/prefixItems.js.map +1 -0
- package/node_modules/ajv/dist/vocabularies/applicator/properties.d.ts +3 -0
- package/node_modules/ajv/dist/vocabularies/applicator/properties.js +54 -0
- package/node_modules/ajv/dist/vocabularies/applicator/properties.js.map +1 -0
- package/node_modules/ajv/dist/vocabularies/applicator/propertyNames.d.ts +6 -0
- package/node_modules/ajv/dist/vocabularies/applicator/propertyNames.js +38 -0
- package/node_modules/ajv/dist/vocabularies/applicator/propertyNames.js.map +1 -0
- package/node_modules/ajv/dist/vocabularies/applicator/thenElse.d.ts +3 -0
- package/node_modules/ajv/dist/vocabularies/applicator/thenElse.js +13 -0
- package/node_modules/ajv/dist/vocabularies/applicator/thenElse.js.map +1 -0
- package/node_modules/ajv/dist/vocabularies/code.d.ts +17 -0
- package/node_modules/ajv/dist/vocabularies/code.js +131 -0
- package/node_modules/ajv/dist/vocabularies/code.js.map +1 -0
- package/node_modules/ajv/dist/vocabularies/core/id.d.ts +3 -0
- package/node_modules/ajv/dist/vocabularies/core/id.js +10 -0
- package/node_modules/ajv/dist/vocabularies/core/id.js.map +1 -0
- package/node_modules/ajv/dist/vocabularies/core/index.d.ts +3 -0
- package/node_modules/ajv/dist/vocabularies/core/index.js +16 -0
- package/node_modules/ajv/dist/vocabularies/core/index.js.map +1 -0
- package/node_modules/ajv/dist/vocabularies/core/ref.d.ts +8 -0
- package/node_modules/ajv/dist/vocabularies/core/ref.js +122 -0
- package/node_modules/ajv/dist/vocabularies/core/ref.js.map +1 -0
- package/node_modules/ajv/dist/vocabularies/discriminator/index.d.ts +5 -0
- package/node_modules/ajv/dist/vocabularies/discriminator/index.js +104 -0
- package/node_modules/ajv/dist/vocabularies/discriminator/index.js.map +1 -0
- package/node_modules/ajv/dist/vocabularies/discriminator/types.d.ts +10 -0
- package/node_modules/ajv/dist/vocabularies/discriminator/types.js +9 -0
- package/node_modules/ajv/dist/vocabularies/discriminator/types.js.map +1 -0
- package/node_modules/ajv/dist/vocabularies/draft2020.d.ts +3 -0
- package/node_modules/ajv/dist/vocabularies/draft2020.js +23 -0
- package/node_modules/ajv/dist/vocabularies/draft2020.js.map +1 -0
- package/node_modules/ajv/dist/vocabularies/draft7.d.ts +3 -0
- package/node_modules/ajv/dist/vocabularies/draft7.js +17 -0
- package/node_modules/ajv/dist/vocabularies/draft7.js.map +1 -0
- package/node_modules/ajv/dist/vocabularies/dynamic/dynamicAnchor.d.ts +5 -0
- package/node_modules/ajv/dist/vocabularies/dynamic/dynamicAnchor.js +30 -0
- package/node_modules/ajv/dist/vocabularies/dynamic/dynamicAnchor.js.map +1 -0
- package/node_modules/ajv/dist/vocabularies/dynamic/dynamicRef.d.ts +5 -0
- package/node_modules/ajv/dist/vocabularies/dynamic/dynamicRef.js +51 -0
- package/node_modules/ajv/dist/vocabularies/dynamic/dynamicRef.js.map +1 -0
- package/node_modules/ajv/dist/vocabularies/dynamic/index.d.ts +3 -0
- package/node_modules/ajv/dist/vocabularies/dynamic/index.js +9 -0
- package/node_modules/ajv/dist/vocabularies/dynamic/index.js.map +1 -0
- package/node_modules/ajv/dist/vocabularies/dynamic/recursiveAnchor.d.ts +3 -0
- package/node_modules/ajv/dist/vocabularies/dynamic/recursiveAnchor.js +16 -0
- package/node_modules/ajv/dist/vocabularies/dynamic/recursiveAnchor.js.map +1 -0
- package/node_modules/ajv/dist/vocabularies/dynamic/recursiveRef.d.ts +3 -0
- package/node_modules/ajv/dist/vocabularies/dynamic/recursiveRef.js +10 -0
- package/node_modules/ajv/dist/vocabularies/dynamic/recursiveRef.js.map +1 -0
- package/node_modules/ajv/dist/vocabularies/errors.d.ts +9 -0
- package/node_modules/ajv/dist/vocabularies/errors.js +3 -0
- package/node_modules/ajv/dist/vocabularies/errors.js.map +1 -0
- package/node_modules/ajv/dist/vocabularies/format/format.d.ts +8 -0
- package/node_modules/ajv/dist/vocabularies/format/format.js +92 -0
- package/node_modules/ajv/dist/vocabularies/format/format.js.map +1 -0
- package/node_modules/ajv/dist/vocabularies/format/index.d.ts +3 -0
- package/node_modules/ajv/dist/vocabularies/format/index.js +6 -0
- package/node_modules/ajv/dist/vocabularies/format/index.js.map +1 -0
- package/node_modules/ajv/dist/vocabularies/jtd/discriminator.d.ts +6 -0
- package/node_modules/ajv/dist/vocabularies/jtd/discriminator.js +71 -0
- package/node_modules/ajv/dist/vocabularies/jtd/discriminator.js.map +1 -0
- package/node_modules/ajv/dist/vocabularies/jtd/elements.d.ts +5 -0
- package/node_modules/ajv/dist/vocabularies/jtd/elements.js +24 -0
- package/node_modules/ajv/dist/vocabularies/jtd/elements.js.map +1 -0
- package/node_modules/ajv/dist/vocabularies/jtd/enum.d.ts +6 -0
- package/node_modules/ajv/dist/vocabularies/jtd/enum.js +43 -0
- package/node_modules/ajv/dist/vocabularies/jtd/enum.js.map +1 -0
- package/node_modules/ajv/dist/vocabularies/jtd/error.d.ts +9 -0
- package/node_modules/ajv/dist/vocabularies/jtd/error.js +20 -0
- package/node_modules/ajv/dist/vocabularies/jtd/error.js.map +1 -0
- package/node_modules/ajv/dist/vocabularies/jtd/index.d.ts +10 -0
- package/node_modules/ajv/dist/vocabularies/jtd/index.js +29 -0
- package/node_modules/ajv/dist/vocabularies/jtd/index.js.map +1 -0
- package/node_modules/ajv/dist/vocabularies/jtd/metadata.d.ts +5 -0
- package/node_modules/ajv/dist/vocabularies/jtd/metadata.js +25 -0
- package/node_modules/ajv/dist/vocabularies/jtd/metadata.js.map +1 -0
- package/node_modules/ajv/dist/vocabularies/jtd/nullable.d.ts +4 -0
- package/node_modules/ajv/dist/vocabularies/jtd/nullable.js +22 -0
- package/node_modules/ajv/dist/vocabularies/jtd/nullable.js.map +1 -0
- package/node_modules/ajv/dist/vocabularies/jtd/optionalProperties.d.ts +3 -0
- package/node_modules/ajv/dist/vocabularies/jtd/optionalProperties.js +15 -0
- package/node_modules/ajv/dist/vocabularies/jtd/optionalProperties.js.map +1 -0
- package/node_modules/ajv/dist/vocabularies/jtd/properties.d.ts +22 -0
- package/node_modules/ajv/dist/vocabularies/jtd/properties.js +149 -0
- package/node_modules/ajv/dist/vocabularies/jtd/properties.js.map +1 -0
- package/node_modules/ajv/dist/vocabularies/jtd/ref.d.ts +4 -0
- package/node_modules/ajv/dist/vocabularies/jtd/ref.js +67 -0
- package/node_modules/ajv/dist/vocabularies/jtd/ref.js.map +1 -0
- package/node_modules/ajv/dist/vocabularies/jtd/type.d.ts +10 -0
- package/node_modules/ajv/dist/vocabularies/jtd/type.js +69 -0
- package/node_modules/ajv/dist/vocabularies/jtd/type.js.map +1 -0
- package/node_modules/ajv/dist/vocabularies/jtd/union.d.ts +3 -0
- package/node_modules/ajv/dist/vocabularies/jtd/union.js +12 -0
- package/node_modules/ajv/dist/vocabularies/jtd/union.js.map +1 -0
- package/node_modules/ajv/dist/vocabularies/jtd/values.d.ts +5 -0
- package/node_modules/ajv/dist/vocabularies/jtd/values.js +51 -0
- package/node_modules/ajv/dist/vocabularies/jtd/values.js.map +1 -0
- package/node_modules/ajv/dist/vocabularies/metadata.d.ts +3 -0
- package/node_modules/ajv/dist/vocabularies/metadata.js +18 -0
- package/node_modules/ajv/dist/vocabularies/metadata.js.map +1 -0
- package/node_modules/ajv/dist/vocabularies/next.d.ts +3 -0
- package/node_modules/ajv/dist/vocabularies/next.js +8 -0
- package/node_modules/ajv/dist/vocabularies/next.js.map +1 -0
- package/node_modules/ajv/dist/vocabularies/unevaluated/index.d.ts +3 -0
- package/node_modules/ajv/dist/vocabularies/unevaluated/index.js +7 -0
- package/node_modules/ajv/dist/vocabularies/unevaluated/index.js.map +1 -0
- package/node_modules/ajv/dist/vocabularies/unevaluated/unevaluatedItems.d.ts +6 -0
- package/node_modules/ajv/dist/vocabularies/unevaluated/unevaluatedItems.js +40 -0
- package/node_modules/ajv/dist/vocabularies/unevaluated/unevaluatedItems.js.map +1 -0
- package/node_modules/ajv/dist/vocabularies/unevaluated/unevaluatedProperties.d.ts +6 -0
- package/node_modules/ajv/dist/vocabularies/unevaluated/unevaluatedProperties.js +65 -0
- package/node_modules/ajv/dist/vocabularies/unevaluated/unevaluatedProperties.js.map +1 -0
- package/node_modules/ajv/dist/vocabularies/validation/const.d.ts +6 -0
- package/node_modules/ajv/dist/vocabularies/validation/const.js +25 -0
- package/node_modules/ajv/dist/vocabularies/validation/const.js.map +1 -0
- package/node_modules/ajv/dist/vocabularies/validation/dependentRequired.d.ts +5 -0
- package/node_modules/ajv/dist/vocabularies/validation/dependentRequired.js +12 -0
- package/node_modules/ajv/dist/vocabularies/validation/dependentRequired.js.map +1 -0
- package/node_modules/ajv/dist/vocabularies/validation/enum.d.ts +8 -0
- package/node_modules/ajv/dist/vocabularies/validation/enum.js +48 -0
- package/node_modules/ajv/dist/vocabularies/validation/enum.js.map +1 -0
- package/node_modules/ajv/dist/vocabularies/validation/index.d.ts +16 -0
- package/node_modules/ajv/dist/vocabularies/validation/index.js +33 -0
- package/node_modules/ajv/dist/vocabularies/validation/index.js.map +1 -0
- package/node_modules/ajv/dist/vocabularies/validation/limitContains.d.ts +3 -0
- package/node_modules/ajv/dist/vocabularies/validation/limitContains.js +15 -0
- package/node_modules/ajv/dist/vocabularies/validation/limitContains.js.map +1 -0
- package/node_modules/ajv/dist/vocabularies/validation/limitItems.d.ts +3 -0
- package/node_modules/ajv/dist/vocabularies/validation/limitItems.js +24 -0
- package/node_modules/ajv/dist/vocabularies/validation/limitItems.js.map +1 -0
- package/node_modules/ajv/dist/vocabularies/validation/limitLength.d.ts +3 -0
- package/node_modules/ajv/dist/vocabularies/validation/limitLength.js +27 -0
- package/node_modules/ajv/dist/vocabularies/validation/limitLength.js.map +1 -0
- package/node_modules/ajv/dist/vocabularies/validation/limitNumber.d.ts +11 -0
- package/node_modules/ajv/dist/vocabularies/validation/limitNumber.js +27 -0
- package/node_modules/ajv/dist/vocabularies/validation/limitNumber.js.map +1 -0
- package/node_modules/ajv/dist/vocabularies/validation/limitProperties.d.ts +3 -0
- package/node_modules/ajv/dist/vocabularies/validation/limitProperties.js +24 -0
- package/node_modules/ajv/dist/vocabularies/validation/limitProperties.js.map +1 -0
- package/node_modules/ajv/dist/vocabularies/validation/multipleOf.d.ts +8 -0
- package/node_modules/ajv/dist/vocabularies/validation/multipleOf.js +26 -0
- package/node_modules/ajv/dist/vocabularies/validation/multipleOf.js.map +1 -0
- package/node_modules/ajv/dist/vocabularies/validation/pattern.d.ts +8 -0
- package/node_modules/ajv/dist/vocabularies/validation/pattern.js +33 -0
- package/node_modules/ajv/dist/vocabularies/validation/pattern.js.map +1 -0
- package/node_modules/ajv/dist/vocabularies/validation/required.d.ts +8 -0
- package/node_modules/ajv/dist/vocabularies/validation/required.js +79 -0
- package/node_modules/ajv/dist/vocabularies/validation/required.js.map +1 -0
- package/node_modules/ajv/dist/vocabularies/validation/uniqueItems.d.ts +9 -0
- package/node_modules/ajv/dist/vocabularies/validation/uniqueItems.js +64 -0
- package/node_modules/ajv/dist/vocabularies/validation/uniqueItems.js.map +1 -0
- package/node_modules/ajv/lib/2019.ts +81 -0
- package/node_modules/ajv/lib/2020.ts +75 -0
- package/node_modules/ajv/lib/ajv.ts +70 -0
- package/node_modules/ajv/lib/compile/codegen/code.ts +169 -0
- package/node_modules/ajv/lib/compile/codegen/index.ts +852 -0
- package/node_modules/ajv/lib/compile/codegen/scope.ts +215 -0
- package/node_modules/ajv/lib/compile/errors.ts +184 -0
- package/node_modules/ajv/lib/compile/index.ts +324 -0
- package/node_modules/ajv/lib/compile/jtd/parse.ts +411 -0
- package/node_modules/ajv/lib/compile/jtd/serialize.ts +277 -0
- package/node_modules/ajv/lib/compile/jtd/types.ts +16 -0
- package/node_modules/ajv/lib/compile/names.ts +27 -0
- package/node_modules/ajv/lib/compile/ref_error.ts +13 -0
- package/node_modules/ajv/lib/compile/resolve.ts +149 -0
- package/node_modules/ajv/lib/compile/rules.ts +50 -0
- package/node_modules/ajv/lib/compile/util.ts +213 -0
- package/node_modules/ajv/lib/compile/validate/applicability.ts +22 -0
- package/node_modules/ajv/lib/compile/validate/boolSchema.ts +47 -0
- package/node_modules/ajv/lib/compile/validate/dataType.ts +230 -0
- package/node_modules/ajv/lib/compile/validate/defaults.ts +32 -0
- package/node_modules/ajv/lib/compile/validate/index.ts +582 -0
- package/node_modules/ajv/lib/compile/validate/keyword.ts +171 -0
- package/node_modules/ajv/lib/compile/validate/subschema.ts +135 -0
- package/node_modules/ajv/lib/core.ts +892 -0
- package/node_modules/ajv/lib/jtd.ts +132 -0
- package/node_modules/ajv/lib/refs/data.json +13 -0
- package/node_modules/ajv/lib/refs/json-schema-2019-09/index.ts +28 -0
- package/node_modules/ajv/lib/refs/json-schema-2019-09/meta/applicator.json +53 -0
- package/node_modules/ajv/lib/refs/json-schema-2019-09/meta/content.json +17 -0
- package/node_modules/ajv/lib/refs/json-schema-2019-09/meta/core.json +57 -0
- package/node_modules/ajv/lib/refs/json-schema-2019-09/meta/format.json +14 -0
- package/node_modules/ajv/lib/refs/json-schema-2019-09/meta/meta-data.json +37 -0
- package/node_modules/ajv/lib/refs/json-schema-2019-09/meta/validation.json +90 -0
- package/node_modules/ajv/lib/refs/json-schema-2019-09/schema.json +39 -0
- package/node_modules/ajv/lib/refs/json-schema-2020-12/index.ts +30 -0
- package/node_modules/ajv/lib/refs/json-schema-2020-12/meta/applicator.json +48 -0
- package/node_modules/ajv/lib/refs/json-schema-2020-12/meta/content.json +17 -0
- package/node_modules/ajv/lib/refs/json-schema-2020-12/meta/core.json +51 -0
- package/node_modules/ajv/lib/refs/json-schema-2020-12/meta/format-annotation.json +14 -0
- package/node_modules/ajv/lib/refs/json-schema-2020-12/meta/meta-data.json +37 -0
- package/node_modules/ajv/lib/refs/json-schema-2020-12/meta/unevaluated.json +15 -0
- package/node_modules/ajv/lib/refs/json-schema-2020-12/meta/validation.json +90 -0
- package/node_modules/ajv/lib/refs/json-schema-2020-12/schema.json +55 -0
- package/node_modules/ajv/lib/refs/json-schema-draft-06.json +137 -0
- package/node_modules/ajv/lib/refs/json-schema-draft-07.json +151 -0
- package/node_modules/ajv/lib/refs/json-schema-secure.json +88 -0
- package/node_modules/ajv/lib/refs/jtd-schema.ts +130 -0
- package/node_modules/ajv/lib/runtime/equal.ts +7 -0
- package/node_modules/ajv/lib/runtime/parseJson.ts +177 -0
- package/node_modules/ajv/lib/runtime/quote.ts +31 -0
- package/node_modules/ajv/lib/runtime/re2.ts +6 -0
- package/node_modules/ajv/lib/runtime/timestamp.ts +46 -0
- package/node_modules/ajv/lib/runtime/ucs2length.ts +20 -0
- package/node_modules/ajv/lib/runtime/uri.ts +6 -0
- package/node_modules/ajv/lib/runtime/validation_error.ts +13 -0
- package/node_modules/ajv/lib/standalone/index.ts +100 -0
- package/node_modules/ajv/lib/standalone/instance.ts +36 -0
- package/node_modules/ajv/lib/types/index.ts +244 -0
- package/node_modules/ajv/lib/types/json-schema.ts +187 -0
- package/node_modules/ajv/lib/types/jtd-schema.ts +273 -0
- package/node_modules/ajv/lib/vocabularies/applicator/additionalItems.ts +56 -0
- package/node_modules/ajv/lib/vocabularies/applicator/additionalProperties.ts +118 -0
- package/node_modules/ajv/lib/vocabularies/applicator/allOf.ts +22 -0
- package/node_modules/ajv/lib/vocabularies/applicator/anyOf.ts +14 -0
- package/node_modules/ajv/lib/vocabularies/applicator/contains.ts +109 -0
- package/node_modules/ajv/lib/vocabularies/applicator/dependencies.ts +112 -0
- package/node_modules/ajv/lib/vocabularies/applicator/dependentSchemas.ts +11 -0
- package/node_modules/ajv/lib/vocabularies/applicator/if.ts +80 -0
- package/node_modules/ajv/lib/vocabularies/applicator/index.ts +53 -0
- package/node_modules/ajv/lib/vocabularies/applicator/items.ts +59 -0
- package/node_modules/ajv/lib/vocabularies/applicator/items2020.ts +36 -0
- package/node_modules/ajv/lib/vocabularies/applicator/not.ts +38 -0
- package/node_modules/ajv/lib/vocabularies/applicator/oneOf.ts +82 -0
- package/node_modules/ajv/lib/vocabularies/applicator/patternProperties.ts +91 -0
- package/node_modules/ajv/lib/vocabularies/applicator/prefixItems.ts +12 -0
- package/node_modules/ajv/lib/vocabularies/applicator/properties.ts +57 -0
- package/node_modules/ajv/lib/vocabularies/applicator/propertyNames.ts +50 -0
- package/node_modules/ajv/lib/vocabularies/applicator/thenElse.ts +13 -0
- package/node_modules/ajv/lib/vocabularies/code.ts +168 -0
- package/node_modules/ajv/lib/vocabularies/core/id.ts +10 -0
- package/node_modules/ajv/lib/vocabularies/core/index.ts +16 -0
- package/node_modules/ajv/lib/vocabularies/core/ref.ts +129 -0
- package/node_modules/ajv/lib/vocabularies/discriminator/index.ts +113 -0
- package/node_modules/ajv/lib/vocabularies/discriminator/types.ts +12 -0
- package/node_modules/ajv/lib/vocabularies/draft2020.ts +23 -0
- package/node_modules/ajv/lib/vocabularies/draft7.ts +17 -0
- package/node_modules/ajv/lib/vocabularies/dynamic/dynamicAnchor.ts +31 -0
- package/node_modules/ajv/lib/vocabularies/dynamic/dynamicRef.ts +51 -0
- package/node_modules/ajv/lib/vocabularies/dynamic/index.ts +9 -0
- package/node_modules/ajv/lib/vocabularies/dynamic/recursiveAnchor.ts +14 -0
- package/node_modules/ajv/lib/vocabularies/dynamic/recursiveRef.ts +10 -0
- package/node_modules/ajv/lib/vocabularies/errors.ts +18 -0
- package/node_modules/ajv/lib/vocabularies/format/format.ts +120 -0
- package/node_modules/ajv/lib/vocabularies/format/index.ts +6 -0
- package/node_modules/ajv/lib/vocabularies/jtd/discriminator.ts +89 -0
- package/node_modules/ajv/lib/vocabularies/jtd/elements.ts +32 -0
- package/node_modules/ajv/lib/vocabularies/jtd/enum.ts +45 -0
- package/node_modules/ajv/lib/vocabularies/jtd/error.ts +23 -0
- package/node_modules/ajv/lib/vocabularies/jtd/index.ts +37 -0
- package/node_modules/ajv/lib/vocabularies/jtd/metadata.ts +24 -0
- package/node_modules/ajv/lib/vocabularies/jtd/nullable.ts +21 -0
- package/node_modules/ajv/lib/vocabularies/jtd/optionalProperties.ts +15 -0
- package/node_modules/ajv/lib/vocabularies/jtd/properties.ts +184 -0
- package/node_modules/ajv/lib/vocabularies/jtd/ref.ts +76 -0
- package/node_modules/ajv/lib/vocabularies/jtd/type.ts +75 -0
- package/node_modules/ajv/lib/vocabularies/jtd/union.ts +12 -0
- package/node_modules/ajv/lib/vocabularies/jtd/values.ts +58 -0
- package/node_modules/ajv/lib/vocabularies/metadata.ts +17 -0
- package/node_modules/ajv/lib/vocabularies/next.ts +8 -0
- package/node_modules/ajv/lib/vocabularies/unevaluated/index.ts +7 -0
- package/node_modules/ajv/lib/vocabularies/unevaluated/unevaluatedItems.ts +47 -0
- package/node_modules/ajv/lib/vocabularies/unevaluated/unevaluatedProperties.ts +85 -0
- package/node_modules/ajv/lib/vocabularies/validation/const.ts +28 -0
- package/node_modules/ajv/lib/vocabularies/validation/dependentRequired.ts +23 -0
- package/node_modules/ajv/lib/vocabularies/validation/enum.ts +54 -0
- package/node_modules/ajv/lib/vocabularies/validation/index.ts +49 -0
- package/node_modules/ajv/lib/vocabularies/validation/limitContains.ts +16 -0
- package/node_modules/ajv/lib/vocabularies/validation/limitItems.ts +26 -0
- package/node_modules/ajv/lib/vocabularies/validation/limitLength.ts +30 -0
- package/node_modules/ajv/lib/vocabularies/validation/limitNumber.ts +42 -0
- package/node_modules/ajv/lib/vocabularies/validation/limitProperties.ts +26 -0
- package/node_modules/ajv/lib/vocabularies/validation/multipleOf.ts +34 -0
- package/node_modules/ajv/lib/vocabularies/validation/pattern.ts +39 -0
- package/node_modules/ajv/lib/vocabularies/validation/required.ts +98 -0
- package/node_modules/ajv/lib/vocabularies/validation/uniqueItems.ts +79 -0
- package/node_modules/ajv/package.json +126 -0
- package/node_modules/ajv-formats/LICENSE +21 -0
- package/node_modules/ajv-formats/README.md +125 -0
- package/node_modules/ajv-formats/dist/formats.d.ts +9 -0
- package/node_modules/ajv-formats/dist/formats.js +208 -0
- package/node_modules/ajv-formats/dist/formats.js.map +1 -0
- package/node_modules/ajv-formats/dist/index.d.ts +15 -0
- package/node_modules/ajv-formats/dist/index.js +37 -0
- package/node_modules/ajv-formats/dist/index.js.map +1 -0
- package/node_modules/ajv-formats/dist/limit.d.ts +10 -0
- package/node_modules/ajv-formats/dist/limit.js +69 -0
- package/node_modules/ajv-formats/dist/limit.js.map +1 -0
- package/node_modules/ajv-formats/package.json +74 -0
- package/node_modules/ajv-formats/src/formats.ts +269 -0
- package/node_modules/ajv-formats/src/index.ts +62 -0
- package/node_modules/ajv-formats/src/limit.ts +99 -0
- package/node_modules/fast-deep-equal/LICENSE +21 -0
- package/node_modules/fast-deep-equal/README.md +96 -0
- package/node_modules/fast-deep-equal/es6/index.d.ts +2 -0
- package/node_modules/fast-deep-equal/es6/index.js +72 -0
- package/node_modules/fast-deep-equal/es6/react.d.ts +2 -0
- package/node_modules/fast-deep-equal/es6/react.js +79 -0
- package/node_modules/fast-deep-equal/index.d.ts +4 -0
- package/node_modules/fast-deep-equal/index.js +46 -0
- package/node_modules/fast-deep-equal/package.json +61 -0
- package/node_modules/fast-deep-equal/react.d.ts +2 -0
- package/node_modules/fast-deep-equal/react.js +53 -0
- package/node_modules/fast-uri/.gitattributes +2 -0
- package/node_modules/fast-uri/.github/dependabot.yml +13 -0
- package/node_modules/fast-uri/.github/workflows/ci.yml +106 -0
- package/node_modules/fast-uri/.github/workflows/lock-threads.yml +19 -0
- package/node_modules/fast-uri/.github/workflows/package-manager-ci.yml +24 -0
- package/node_modules/fast-uri/LICENSE +30 -0
- package/node_modules/fast-uri/README.md +152 -0
- package/node_modules/fast-uri/benchmark/benchmark.mjs +159 -0
- package/node_modules/fast-uri/benchmark/equal.mjs +51 -0
- package/node_modules/fast-uri/benchmark/non-simple-domain.mjs +22 -0
- package/node_modules/fast-uri/benchmark/package.json +17 -0
- package/node_modules/fast-uri/benchmark/string-array-to-hex-stripped.mjs +24 -0
- package/node_modules/fast-uri/benchmark/ws-is-secure.mjs +65 -0
- package/node_modules/fast-uri/eslint.config.js +6 -0
- package/node_modules/fast-uri/index.js +631 -0
- package/node_modules/fast-uri/lib/schemes.js +272 -0
- package/node_modules/fast-uri/lib/utils.js +747 -0
- package/node_modules/fast-uri/package.json +68 -0
- package/node_modules/fast-uri/test/ajv.test.js +43 -0
- package/node_modules/fast-uri/test/component-safe-serialization.test.js +163 -0
- package/node_modules/fast-uri/test/equal.test.js +145 -0
- package/node_modules/fast-uri/test/fixtures/uri-js-parse.json +503 -0
- package/node_modules/fast-uri/test/fixtures/uri-js-serialize.json +120 -0
- package/node_modules/fast-uri/test/ipv6-canonical.test.js +34 -0
- package/node_modules/fast-uri/test/ipv6-validation.test.js +124 -0
- package/node_modules/fast-uri/test/malformed-percent.test.js +77 -0
- package/node_modules/fast-uri/test/malformed-urn.test.js +61 -0
- package/node_modules/fast-uri/test/parse.test.js +327 -0
- package/node_modules/fast-uri/test/query-fragment-normalization.test.js +33 -0
- package/node_modules/fast-uri/test/reserved-path-normalization.test.js +109 -0
- package/node_modules/fast-uri/test/resolve.test.js +87 -0
- package/node_modules/fast-uri/test/rfc-3986.test.js +90 -0
- package/node_modules/fast-uri/test/scheme-validation.test.js +124 -0
- package/node_modules/fast-uri/test/security-normalization.test.js +178 -0
- package/node_modules/fast-uri/test/security.test.js +431 -0
- package/node_modules/fast-uri/test/serialize.test.js +151 -0
- package/node_modules/fast-uri/test/uri-js-compatibility.test.js +33 -0
- package/node_modules/fast-uri/test/uri-js.test.js +912 -0
- package/node_modules/fast-uri/test/urn-full-input.test.js +29 -0
- package/node_modules/fast-uri/test/util.test.js +38 -0
- package/node_modules/fast-uri/test/websocket-query-preservation.test.js +24 -0
- package/node_modules/fast-uri/tsconfig.json +9 -0
- package/node_modules/fast-uri/types/index.d.ts +60 -0
- package/node_modules/fast-uri/types/index.test-d.ts +17 -0
- package/node_modules/json-schema-traverse/.eslintrc.yml +27 -0
- package/node_modules/json-schema-traverse/.github/FUNDING.yml +2 -0
- package/node_modules/json-schema-traverse/.github/workflows/build.yml +28 -0
- package/node_modules/json-schema-traverse/.github/workflows/publish.yml +27 -0
- package/node_modules/json-schema-traverse/LICENSE +21 -0
- package/node_modules/json-schema-traverse/README.md +95 -0
- package/node_modules/json-schema-traverse/index.d.ts +40 -0
- package/node_modules/json-schema-traverse/index.js +93 -0
- package/node_modules/json-schema-traverse/package.json +43 -0
- package/node_modules/json-schema-traverse/spec/.eslintrc.yml +6 -0
- package/node_modules/json-schema-traverse/spec/fixtures/schema.js +125 -0
- package/node_modules/json-schema-traverse/spec/index.spec.js +171 -0
- package/node_modules/require-from-string/index.js +34 -0
- package/node_modules/require-from-string/license +21 -0
- package/node_modules/require-from-string/package.json +28 -0
- package/node_modules/require-from-string/readme.md +56 -0
- package/package.json +49 -2
- package/packages/cli/dist/agent-spans.d.ts +238 -0
- package/packages/cli/dist/agent-spans.d.ts.map +1 -0
- package/packages/cli/dist/agent-spans.js +677 -0
- package/packages/cli/dist/agent-spans.js.map +1 -0
- package/packages/cli/dist/api.d.ts +127 -0
- package/packages/cli/dist/api.d.ts.map +1 -0
- package/packages/cli/dist/api.js +159 -0
- package/packages/cli/dist/api.js.map +1 -0
- package/packages/cli/dist/archive.d.ts +24 -0
- package/packages/cli/dist/archive.d.ts.map +1 -0
- package/packages/cli/dist/archive.js +230 -0
- package/packages/cli/dist/archive.js.map +1 -0
- package/packages/cli/dist/args.d.ts +57 -0
- package/packages/cli/dist/args.d.ts.map +1 -0
- package/packages/cli/dist/args.js +180 -0
- package/packages/cli/dist/args.js.map +1 -0
- package/packages/cli/dist/attach.d.ts +48 -0
- package/packages/cli/dist/attach.d.ts.map +1 -0
- package/packages/cli/dist/attach.js +153 -0
- package/packages/cli/dist/attach.js.map +1 -0
- package/packages/cli/dist/capture-limits.d.ts +7 -0
- package/packages/cli/dist/capture-limits.d.ts.map +1 -0
- package/packages/cli/dist/capture-limits.js +13 -0
- package/packages/cli/dist/capture-limits.js.map +1 -0
- package/packages/cli/dist/cli.d.ts +3 -0
- package/packages/cli/dist/cli.d.ts.map +1 -0
- package/packages/cli/dist/cli.js +4 -0
- package/packages/cli/dist/cli.js.map +1 -0
- package/packages/cli/dist/commands/attach.d.ts +49 -0
- package/packages/cli/dist/commands/attach.d.ts.map +1 -0
- package/packages/cli/dist/commands/attach.js +350 -0
- package/packages/cli/dist/commands/attach.js.map +1 -0
- package/packages/cli/dist/commands/compare.d.ts +27 -0
- package/packages/cli/dist/commands/compare.d.ts.map +1 -0
- package/packages/cli/dist/commands/compare.js +187 -0
- package/packages/cli/dist/commands/compare.js.map +1 -0
- package/packages/cli/dist/commands/doctor.d.ts +24 -0
- package/packages/cli/dist/commands/doctor.d.ts.map +1 -0
- package/packages/cli/dist/commands/doctor.js +402 -0
- package/packages/cli/dist/commands/doctor.js.map +1 -0
- package/packages/cli/dist/commands/gc.d.ts +24 -0
- package/packages/cli/dist/commands/gc.d.ts.map +1 -0
- package/packages/cli/dist/commands/gc.js +326 -0
- package/packages/cli/dist/commands/gc.js.map +1 -0
- package/packages/cli/dist/commands/inspect.d.ts +45 -0
- package/packages/cli/dist/commands/inspect.d.ts.map +1 -0
- package/packages/cli/dist/commands/inspect.js +375 -0
- package/packages/cli/dist/commands/inspect.js.map +1 -0
- package/packages/cli/dist/commands/quickstart.d.ts +48 -0
- package/packages/cli/dist/commands/quickstart.d.ts.map +1 -0
- package/packages/cli/dist/commands/quickstart.js +413 -0
- package/packages/cli/dist/commands/quickstart.js.map +1 -0
- package/packages/cli/dist/commands/record.d.ts +31 -0
- package/packages/cli/dist/commands/record.d.ts.map +1 -0
- package/packages/cli/dist/commands/record.js +958 -0
- package/packages/cli/dist/commands/record.js.map +1 -0
- package/packages/cli/dist/commands/replay.d.ts +184 -0
- package/packages/cli/dist/commands/replay.d.ts.map +1 -0
- package/packages/cli/dist/commands/replay.js +2014 -0
- package/packages/cli/dist/commands/replay.js.map +1 -0
- package/packages/cli/dist/commands/scrub.d.ts +34 -0
- package/packages/cli/dist/commands/scrub.d.ts.map +1 -0
- package/packages/cli/dist/commands/scrub.js +765 -0
- package/packages/cli/dist/commands/scrub.js.map +1 -0
- package/packages/cli/dist/commands/setup.d.ts +23 -0
- package/packages/cli/dist/commands/setup.d.ts.map +1 -0
- package/packages/cli/dist/commands/setup.js +239 -0
- package/packages/cli/dist/commands/setup.js.map +1 -0
- package/packages/cli/dist/commands/sync.d.ts +236 -0
- package/packages/cli/dist/commands/sync.d.ts.map +1 -0
- package/packages/cli/dist/commands/sync.js +1270 -0
- package/packages/cli/dist/commands/sync.js.map +1 -0
- package/packages/cli/dist/config.d.ts +69 -0
- package/packages/cli/dist/config.d.ts.map +1 -0
- package/packages/cli/dist/config.js +144 -0
- package/packages/cli/dist/config.js.map +1 -0
- package/packages/cli/dist/exchange-events.d.ts +80 -0
- package/packages/cli/dist/exchange-events.d.ts.map +1 -0
- package/packages/cli/dist/exchange-events.js +296 -0
- package/packages/cli/dist/exchange-events.js.map +1 -0
- package/packages/cli/dist/flags.d.ts +41 -0
- package/packages/cli/dist/flags.d.ts.map +1 -0
- package/packages/cli/dist/flags.js +292 -0
- package/packages/cli/dist/flags.js.map +1 -0
- package/packages/cli/dist/fs-events.d.ts +19 -0
- package/packages/cli/dist/fs-events.d.ts.map +1 -0
- package/packages/cli/dist/fs-events.js +89 -0
- package/packages/cli/dist/fs-events.js.map +1 -0
- package/packages/cli/dist/index.d.ts +18 -0
- package/packages/cli/dist/index.d.ts.map +1 -0
- package/packages/cli/dist/index.js +18 -0
- package/packages/cli/dist/index.js.map +1 -0
- package/packages/cli/dist/main.d.ts +2 -0
- package/packages/cli/dist/main.d.ts.map +1 -0
- package/packages/cli/dist/main.js +404 -0
- package/packages/cli/dist/main.js.map +1 -0
- package/packages/cli/dist/mcp-server.d.ts +44 -0
- package/packages/cli/dist/mcp-server.d.ts.map +1 -0
- package/packages/cli/dist/mcp-server.js +250 -0
- package/packages/cli/dist/mcp-server.js.map +1 -0
- package/packages/cli/dist/mcp.d.ts +126 -0
- package/packages/cli/dist/mcp.d.ts.map +1 -0
- package/packages/cli/dist/mcp.js +290 -0
- package/packages/cli/dist/mcp.js.map +1 -0
- package/packages/cli/dist/out.d.ts +107 -0
- package/packages/cli/dist/out.d.ts.map +1 -0
- package/packages/cli/dist/out.js +280 -0
- package/packages/cli/dist/out.js.map +1 -0
- package/packages/cli/dist/rasterize.d.ts +62 -0
- package/packages/cli/dist/rasterize.d.ts.map +1 -0
- package/packages/cli/dist/rasterize.js +154 -0
- package/packages/cli/dist/rasterize.js.map +1 -0
- package/packages/cli/dist/serial.d.ts +19 -0
- package/packages/cli/dist/serial.d.ts.map +1 -0
- package/packages/cli/dist/serial.js +34 -0
- package/packages/cli/dist/serial.js.map +1 -0
- package/packages/cli/dist/share-card.d.ts +73 -0
- package/packages/cli/dist/share-card.d.ts.map +1 -0
- package/packages/cli/dist/share-card.js +413 -0
- package/packages/cli/dist/share-card.js.map +1 -0
- package/packages/cli/dist/snapshot.d.ts +39 -0
- package/packages/cli/dist/snapshot.d.ts.map +1 -0
- package/packages/cli/dist/snapshot.js +43 -0
- package/packages/cli/dist/snapshot.js.map +1 -0
- package/packages/cli/dist/tls-capture.d.ts +135 -0
- package/packages/cli/dist/tls-capture.d.ts.map +1 -0
- package/packages/cli/dist/tls-capture.js +586 -0
- package/packages/cli/dist/tls-capture.js.map +1 -0
- package/packages/cli/dist/upstream.d.ts +29 -0
- package/packages/cli/dist/upstream.d.ts.map +1 -0
- package/packages/cli/dist/upstream.js +41 -0
- package/packages/cli/dist/upstream.js.map +1 -0
- package/packages/cli/dist/version.d.ts +2 -0
- package/packages/cli/dist/version.d.ts.map +1 -0
- package/packages/cli/dist/version.js +18 -0
- package/packages/cli/dist/version.js.map +1 -0
- package/packages/cli/package.json +11 -11
- package/.dockerignore +0 -11
- package/.gitattributes +0 -19
- package/.github/workflows/ci.yml +0 -146
- package/.grok-plugin/plugin.json +0 -12
- package/.mcp.json +0 -8
- package/.prettierignore +0 -4
- package/.prettierrc.json +0 -1
- package/CONTRIBUTING.md +0 -106
- package/Dockerfile +0 -30
- package/MAINTAINERS.md +0 -24
- package/RELEASING.md +0 -183
- package/SECURITY.md +0 -149
- package/capture/CAPTURE-RUNBOOK.md +0 -271
- package/capture/CURSOR-HTTP2.md +0 -226
- package/capture/README.md +0 -349
- package/capture/capture-run.gif +0 -0
- package/capture/capture.mjs +0 -1883
- package/capture/fable-capture.gif +0 -0
- package/capture/fable-capture.mp4 +0 -0
- package/capture/muse-shim.mjs +0 -114
- package/capture/render-run.mjs +0 -125
- package/capture/render.mjs +0 -228
- package/companion-kiokuko-dsh.patch +0 -7806
- package/docs/agenticreplay-acceptance.md +0 -135
- package/docs/architecture.md +0 -160
- package/docs/chain-card.png +0 -0
- package/docs/compare-card.png +0 -0
- package/docs/demo-cli.gif +0 -0
- package/docs/demo-viewer.gif +0 -0
- package/docs/fidelity.md +0 -16
- package/docs/good-first-issues.md +0 -78
- package/docs/graph-card.png +0 -0
- package/docs/how-to/compare-models-on-the-same-failure.md +0 -58
- package/docs/how-to/debug-a-failing-agent-run.md +0 -127
- package/docs/how-to/why-did-my-agent-delete-my-file.md +0 -92
- package/docs/i18n/README.ar.md +0 -597
- package/docs/i18n/README.de.md +0 -648
- package/docs/i18n/README.es.md +0 -642
- package/docs/i18n/README.fr.md +0 -649
- package/docs/i18n/README.ja.md +0 -608
- package/docs/i18n/README.ko.md +0 -598
- package/docs/i18n/README.zh-CN.md +0 -574
- package/docs/integrations.md +0 -628
- package/docs/launch-path.md +0 -215
- package/docs/media/README.md +0 -101
- package/docs/media/sync-transcript.txt +0 -18
- package/docs/media/transcript.txt +0 -29
- package/docs/opencode-capture.md +0 -137
- package/docs/plugins.md +0 -250
- package/docs/proposals/action-graph-and-reasoning.md +0 -354
- package/docs/sync-card.png +0 -0
- package/docs/validation.md +0 -52
- package/docs/viewer-timeline.png +0 -0
- package/examples/traces/README.md +0 -50
- package/examples/traces/run_9f2c14a03b71/blobs/1b/1b694f32b8c582ace6b35ad64050e532fb3ee3ecc1a2763a82cf42ad0f2a3dd0 +0 -10
- package/examples/traces/run_9f2c14a03b71/blobs/51/517b5b8ec6c3b13121dbaec61784e2a024247c7c4efd9ba068b582ee57bd2764 +0 -4
- package/examples/traces/run_9f2c14a03b71/blobs/5b/5bba1bd069013d86363f69c00c1ae77c84c4e113aeeb7431c8141af4fed76860 +0 -7
- package/examples/traces/run_9f2c14a03b71/blobs/84/84247e7b385fd5f99a6728a509838e52ef963af92f44ef6eccbed6910de1438d +0 -10
- package/examples/traces/run_9f2c14a03b71/blobs/ac/ac9b4be9bdf7fe63c7b5135e2d14c4c0745a48771e733804869790590455f8e8 +0 -7
- package/examples/traces/run_9f2c14a03b71/events.jsonl +0 -31
- package/examples/traces/run_9f2c14a03b71/manifest.json +0 -46
- package/examples/traces/run_9f2c14a03b71/redactions.json +0 -17
- package/llms.txt +0 -26
- package/packages/adapters/fixtures/harness/claude-code.json +0 -12
- package/packages/adapters/fixtures/harness/codex.json +0 -10
- package/packages/adapters/fixtures/harness/cursor.json +0 -10
- package/packages/adapters/fixtures/harness/exec.json +0 -10
- package/packages/adapters/fixtures/harness/generic-openai.json +0 -14
- package/packages/adapters/fixtures/harness/goose.json +0 -14
- package/packages/adapters/fixtures/harness/grok.json +0 -18
- package/packages/adapters/fixtures/harness/hermes.json +0 -10
- package/packages/adapters/fixtures/harness/indexrag.json +0 -21
- package/packages/adapters/fixtures/harness/kilo.json +0 -10
- package/packages/adapters/fixtures/harness/mcode.json +0 -10
- package/packages/adapters/fixtures/harness/mimo.json +0 -10
- package/packages/adapters/fixtures/harness/node.json +0 -22
- package/packages/adapters/fixtures/harness/openclaw.json +0 -21
- package/packages/adapters/fixtures/harness/opencode.json +0 -20
- package/packages/adapters/fixtures/harness/qwen.json +0 -20
- package/packages/adapters/fixtures/harness/zcode.json +0 -10
- package/packages/adapters/package.json +0 -29
- package/packages/adapters/src/claude-code.ts +0 -109
- package/packages/adapters/src/codex.ts +0 -135
- package/packages/adapters/src/contract.ts +0 -531
- package/packages/adapters/src/cursor.ts +0 -76
- package/packages/adapters/src/detect.ts +0 -132
- package/packages/adapters/src/env.ts +0 -118
- package/packages/adapters/src/exec.ts +0 -59
- package/packages/adapters/src/generic-openai.ts +0 -36
- package/packages/adapters/src/goose.ts +0 -87
- package/packages/adapters/src/grok.ts +0 -60
- package/packages/adapters/src/hermes.ts +0 -92
- package/packages/adapters/src/index.ts +0 -24
- package/packages/adapters/src/indexrag.ts +0 -254
- package/packages/adapters/src/kilo.ts +0 -39
- package/packages/adapters/src/mcode.ts +0 -392
- package/packages/adapters/src/mcp-config.ts +0 -84
- package/packages/adapters/src/mimo.ts +0 -44
- package/packages/adapters/src/node.ts +0 -71
- package/packages/adapters/src/openclaw.ts +0 -50
- package/packages/adapters/src/opencode-api-bases.ts +0 -200
- package/packages/adapters/src/opencode-capture.ts +0 -164
- package/packages/adapters/src/opencode-catalog.ts +0 -44
- package/packages/adapters/src/opencode-config.ts +0 -209
- package/packages/adapters/src/opencode.ts +0 -257
- package/packages/adapters/src/qwen.ts +0 -113
- package/packages/adapters/src/registry.ts +0 -121
- package/packages/adapters/src/scaffold.ts +0 -173
- package/packages/adapters/src/session.ts +0 -138
- package/packages/adapters/src/zcode.ts +0 -440
- package/packages/adapters/test/adapters.test.ts +0 -666
- package/packages/adapters/test/contract.test.ts +0 -601
- package/packages/adapters/test/exec-adapter.test.ts +0 -114
- package/packages/adapters/test/harness-versions.test.ts +0 -220
- package/packages/adapters/test/indexrag.test.ts +0 -192
- package/packages/adapters/test/mcode.test.ts +0 -678
- package/packages/adapters/test/mcp-config.test.ts +0 -118
- package/packages/adapters/test/named-agents.test.ts +0 -262
- package/packages/adapters/test/node-adapter.test.ts +0 -98
- package/packages/adapters/test/opencode-capture.test.ts +0 -137
- package/packages/adapters/test/opencode-catalog.test.ts +0 -178
- package/packages/adapters/test/opencode-config.test.ts +0 -63
- package/packages/adapters/test/scaffold.test.ts +0 -156
- package/packages/adapters/test/session.test.ts +0 -368
- package/packages/adapters/test/zcode.test.ts +0 -497
- package/packages/adapters/tsconfig.json +0 -16
- package/packages/cli/README.md +0 -92
- package/packages/cli/src/agent-spans.ts +0 -752
- package/packages/cli/src/api.ts +0 -275
- package/packages/cli/src/archive.ts +0 -264
- package/packages/cli/src/args.ts +0 -207
- package/packages/cli/src/attach.ts +0 -178
- package/packages/cli/src/capture-limits.ts +0 -21
- package/packages/cli/src/cli.ts +0 -4
- package/packages/cli/src/commands/attach.ts +0 -441
- package/packages/cli/src/commands/compare.ts +0 -218
- package/packages/cli/src/commands/doctor.ts +0 -447
- package/packages/cli/src/commands/gc.ts +0 -372
- package/packages/cli/src/commands/inspect.ts +0 -482
- package/packages/cli/src/commands/quickstart.ts +0 -479
- package/packages/cli/src/commands/record.ts +0 -1069
- package/packages/cli/src/commands/replay.ts +0 -2289
- package/packages/cli/src/commands/scrub.ts +0 -865
- package/packages/cli/src/commands/setup.ts +0 -294
- package/packages/cli/src/commands/sync.ts +0 -1429
- package/packages/cli/src/config.ts +0 -182
- package/packages/cli/src/exchange-events.ts +0 -369
- package/packages/cli/src/flags.ts +0 -316
- package/packages/cli/src/fs-events.ts +0 -103
- package/packages/cli/src/index.ts +0 -17
- package/packages/cli/src/main.ts +0 -419
- package/packages/cli/src/mcp-server.ts +0 -314
- package/packages/cli/src/mcp.ts +0 -350
- package/packages/cli/src/out.ts +0 -350
- package/packages/cli/src/rasterize.ts +0 -205
- package/packages/cli/src/serial.ts +0 -38
- package/packages/cli/src/share-card.ts +0 -514
- package/packages/cli/src/snapshot.ts +0 -80
- package/packages/cli/src/tls-capture.ts +0 -688
- package/packages/cli/src/upstream.ts +0 -75
- package/packages/cli/src/version.ts +0 -21
- package/packages/cli/test/agent-spans-drain.test.ts +0 -157
- package/packages/cli/test/agent-spans-race.test.ts +0 -97
- package/packages/cli/test/agent-spans.test.ts +0 -1032
- package/packages/cli/test/api.test.ts +0 -178
- package/packages/cli/test/archive.test.ts +0 -143
- package/packages/cli/test/args.test.ts +0 -164
- package/packages/cli/test/attach-command.test.ts +0 -356
- package/packages/cli/test/attach.test.ts +0 -198
- package/packages/cli/test/capture-oracle.test.ts +0 -160
- package/packages/cli/test/capture-warning.test.ts +0 -215
- package/packages/cli/test/chain-card.test.ts +0 -190
- package/packages/cli/test/claude-capture.test.ts +0 -242
- package/packages/cli/test/compare.test.ts +0 -329
- package/packages/cli/test/config-permission-failure.test.ts +0 -41
- package/packages/cli/test/config.test.ts +0 -239
- package/packages/cli/test/declared-inside-replay.test.ts +0 -170
- package/packages/cli/test/doctor.test.ts +0 -276
- package/packages/cli/test/e2e.test.ts +0 -1230
- package/packages/cli/test/exchange-events.test.ts +0 -345
- package/packages/cli/test/failure-lines.test.ts +0 -47
- package/packages/cli/test/fixtures/deaf-agent.mjs +0 -11
- package/packages/cli/test/fixtures/embedding-agent.mjs +0 -32
- package/packages/cli/test/fixtures/fake-agent.mjs +0 -114
- package/packages/cli/test/fixtures/fake-model.mjs +0 -105
- package/packages/cli/test/fixtures/gateway-agent.mjs +0 -20
- package/packages/cli/test/fixtures/ide-parent.mjs +0 -34
- package/packages/cli/test/fixtures/mcp-agent.mjs +0 -64
- package/packages/cli/test/fixtures/proxy-call.mjs +0 -105
- package/packages/cli/test/fixtures/responses-agent.mjs +0 -82
- package/packages/cli/test/fixtures/responses-model.mjs +0 -94
- package/packages/cli/test/fixtures/tls-agent.mjs +0 -35
- package/packages/cli/test/fixtures/vercel-agent.mjs +0 -81
- package/packages/cli/test/flag-values.test.ts +0 -162
- package/packages/cli/test/flags.test.ts +0 -313
- package/packages/cli/test/fork-provenance.test.ts +0 -224
- package/packages/cli/test/fork-tls.test.ts +0 -190
- package/packages/cli/test/gateway-e2e.test.ts +0 -110
- package/packages/cli/test/gc.test.ts +0 -531
- package/packages/cli/test/generated-esm.test.ts +0 -87
- package/packages/cli/test/graph-card.test.ts +0 -249
- package/packages/cli/test/graph-command.test.ts +0 -258
- package/packages/cli/test/grok-bot-e2e.test.ts +0 -349
- package/packages/cli/test/inspect.test.ts +0 -412
- package/packages/cli/test/intercept-failures.test.ts +0 -74
- package/packages/cli/test/json-only.test.ts +0 -88
- package/packages/cli/test/json-output.test.ts +0 -221
- package/packages/cli/test/list-gateway.test.ts +0 -770
- package/packages/cli/test/mcp-capture.test.ts +0 -498
- package/packages/cli/test/mcp-server.test.ts +0 -315
- package/packages/cli/test/nested-repo-replay.test.ts +0 -972
- package/packages/cli/test/no-credential-in-attrs.test.ts +0 -255
- package/packages/cli/test/opencode-capture.test.ts +0 -422
- package/packages/cli/test/opencode-catalog-capture.test.ts +0 -175
- package/packages/cli/test/out.test.ts +0 -491
- package/packages/cli/test/pinned-fetch.test.ts +0 -154
- package/packages/cli/test/prompt-scrub.test.ts +0 -132
- package/packages/cli/test/publish-order.test.ts +0 -87
- package/packages/cli/test/quickstart.test.ts +0 -579
- package/packages/cli/test/rasterize.test.ts +0 -86
- package/packages/cli/test/record-detection.test.ts +0 -156
- package/packages/cli/test/record-teardown.test.ts +0 -203
- package/packages/cli/test/replay-putback.test.ts +0 -242
- package/packages/cli/test/replay-spill.test.ts +0 -116
- package/packages/cli/test/replay-teardown.test.ts +0 -143
- package/packages/cli/test/replay-trace.test.ts +0 -199
- package/packages/cli/test/replay-transport.test.ts +0 -113
- package/packages/cli/test/reset-roots.test.ts +0 -67
- package/packages/cli/test/responses-e2e.test.ts +0 -119
- package/packages/cli/test/retrieval-context.test.ts +0 -168
- package/packages/cli/test/review-regressions.test.ts +0 -168
- package/packages/cli/test/route-decision.test.ts +0 -134
- package/packages/cli/test/run-dir-sidecars.test.ts +0 -779
- package/packages/cli/test/scrub.test.ts +0 -936
- package/packages/cli/test/serial.test.ts +0 -65
- package/packages/cli/test/setup.test.ts +0 -535
- package/packages/cli/test/share-card.test.ts +0 -135
- package/packages/cli/test/shell-capture.test.ts +0 -184
- package/packages/cli/test/shell-frames-drain.test.ts +0 -91
- package/packages/cli/test/snapshot-retry.test.ts +0 -54
- package/packages/cli/test/support-claims.test.ts +0 -127
- package/packages/cli/test/sync-credentials.test.ts +0 -177
- package/packages/cli/test/sync.test.ts +0 -1709
- package/packages/cli/test/tls-intercept.test.ts +0 -548
- package/packages/cli/test/upstream-visible.test.ts +0 -314
- package/packages/cli/test/vercel-sdk-e2e.test.ts +0 -105
- package/packages/cli/test/version.test.ts +0 -20
- package/packages/cli/tsconfig.json +0 -40
- package/packages/core/package.json +0 -26
- package/packages/core/src/blobs.ts +0 -109
- package/packages/core/src/fetch.ts +0 -48
- package/packages/core/src/graph.ts +0 -450
- package/packages/core/src/index.ts +0 -8
- package/packages/core/src/paths.ts +0 -180
- package/packages/core/src/private-files.ts +0 -394
- package/packages/core/src/reader.ts +0 -175
- package/packages/core/src/redaction.ts +0 -826
- package/packages/core/src/writer.ts +0 -467
- package/packages/core/test/blobs.test.ts +0 -170
- package/packages/core/test/capture-contract.test.ts +0 -179
- package/packages/core/test/data-uri-redaction.test.ts +0 -758
- package/packages/core/test/graph.test.ts +0 -520
- package/packages/core/test/integration.test.ts +0 -148
- package/packages/core/test/paths-permission-failure.test.ts +0 -53
- package/packages/core/test/paths.test.ts +0 -339
- package/packages/core/test/private-files-owner.test.ts +0 -77
- package/packages/core/test/private-files-scratch-race.test.ts +0 -62
- package/packages/core/test/private-files.test.ts +0 -251
- package/packages/core/test/reader.test.ts +0 -271
- package/packages/core/test/redaction.test.ts +0 -525
- package/packages/core/test/writer.test.ts +0 -531
- package/packages/core/tsconfig.json +0 -6
- package/packages/fs-capture/package.json +0 -25
- package/packages/fs-capture/src/capture.ts +0 -193
- package/packages/fs-capture/src/git.ts +0 -131
- package/packages/fs-capture/src/index.ts +0 -3
- package/packages/fs-capture/src/shadow.ts +0 -751
- package/packages/fs-capture/test/capture.test.ts +0 -241
- package/packages/fs-capture/test/git.test.ts +0 -118
- package/packages/fs-capture/test/helpers.ts +0 -28
- package/packages/fs-capture/test/shadow.test.ts +0 -1058
- package/packages/fs-capture/tsconfig.json +0 -6
- package/packages/mcp-shim/package.json +0 -26
- package/packages/mcp-shim/src/cli.ts +0 -372
- package/packages/mcp-shim/src/framing.ts +0 -106
- package/packages/mcp-shim/src/index.ts +0 -4
- package/packages/mcp-shim/src/mock.ts +0 -194
- package/packages/mcp-shim/src/shim.ts +0 -126
- package/packages/mcp-shim/test/cli.test.ts +0 -489
- package/packages/mcp-shim/test/framing.test.ts +0 -143
- package/packages/mcp-shim/test/mock.test.ts +0 -200
- package/packages/mcp-shim/test/shim.test.ts +0 -287
- package/packages/mcp-shim/tsconfig.json +0 -5
- package/packages/node-instrument/package.json +0 -23
- package/packages/node-instrument/src/capture.ts +0 -505
- package/packages/node-instrument/src/index.ts +0 -3
- package/packages/node-instrument/src/install.ts +0 -186
- package/packages/node-instrument/src/rewrite.ts +0 -66
- package/packages/node-instrument/test/capture.test.ts +0 -423
- package/packages/node-instrument/test/install.test.ts +0 -427
- package/packages/node-instrument/test/rewrite.test.ts +0 -85
- package/packages/node-instrument/tsconfig.json +0 -9
- package/packages/plugin-api/package.json +0 -22
- package/packages/plugin-api/src/canonical.ts +0 -73
- package/packages/plugin-api/src/index.ts +0 -2
- package/packages/plugin-api/src/plugins.ts +0 -265
- package/packages/plugin-api/test/canonical.test.ts +0 -58
- package/packages/plugin-api/tsconfig.json +0 -5
- package/packages/providers/package.json +0 -26
- package/packages/providers/src/index.ts +0 -34
- package/packages/providers/src/pricing.ts +0 -140
- package/packages/providers/src/translate/anthropic.ts +0 -620
- package/packages/providers/src/translate/openai-responses.ts +0 -638
- package/packages/providers/src/translate/openai.ts +0 -630
- package/packages/providers/src/translate/sse.ts +0 -99
- package/packages/providers/src/translate/util.ts +0 -111
- package/packages/providers/test/anthropic-translate.test.ts +0 -687
- package/packages/providers/test/openai-responses-translate.test.ts +0 -377
- package/packages/providers/test/openai-translate.test.ts +0 -884
- package/packages/providers/test/pricing.test.ts +0 -171
- package/packages/providers/tsconfig.json +0 -6
- package/packages/proxy/package.json +0 -28
- package/packages/proxy/src/ca.ts +0 -376
- package/packages/proxy/src/der.ts +0 -152
- package/packages/proxy/src/dialects.ts +0 -413
- package/packages/proxy/src/forward.ts +0 -64
- package/packages/proxy/src/index.ts +0 -8
- package/packages/proxy/src/intercept.ts +0 -1554
- package/packages/proxy/src/matching.ts +0 -1056
- package/packages/proxy/src/retrieval.ts +0 -290
- package/packages/proxy/src/server.ts +0 -2875
- package/packages/proxy/src/tls-hosts.ts +0 -205
- package/packages/proxy/test/beta-headers.test.ts +0 -39
- package/packages/proxy/test/ca.test.ts +0 -146
- package/packages/proxy/test/forward.test.ts +0 -306
- package/packages/proxy/test/hop-by-hop.test.ts +0 -118
- package/packages/proxy/test/image-matching.test.ts +0 -129
- package/packages/proxy/test/indexing-concurrency.test.ts +0 -224
- package/packages/proxy/test/lookahead.test.ts +0 -160
- package/packages/proxy/test/malformed-body.test.ts +0 -73
- package/packages/proxy/test/matching.test.ts +0 -822
- package/packages/proxy/test/passthrough.test.ts +0 -599
- package/packages/proxy/test/recorded-upstream.test.ts +0 -253
- package/packages/proxy/test/responses-dialect.test.ts +0 -239
- package/packages/proxy/test/retrieval.test.ts +0 -589
- package/packages/proxy/test/server.test.ts +0 -1281
- package/packages/proxy/test/tls-hosts.test.ts +0 -190
- package/packages/proxy/test/tls-intercept.test.ts +0 -1769
- package/packages/proxy/tsconfig.json +0 -22
- package/packages/schema/package.json +0 -28
- package/packages/schema/src/constants.ts +0 -73
- package/packages/schema/src/index.ts +0 -3
- package/packages/schema/src/types.ts +0 -103
- package/packages/schema/src/validate.ts +0 -60
- package/packages/schema/test/schema-parity.test.ts +0 -116
- package/packages/schema/tsconfig.json +0 -5
- package/packages/shell-shim/package.json +0 -26
- package/packages/shell-shim/src/index.ts +0 -3
- package/packages/shell-shim/src/install.ts +0 -406
- package/packages/shell-shim/src/resolve.ts +0 -98
- package/packages/shell-shim/src/runner-bin.ts +0 -4
- package/packages/shell-shim/src/runner.ts +0 -149
- package/packages/shell-shim/test/resolve.test.ts +0 -125
- package/packages/shell-shim/test/shim.test.ts +0 -548
- package/packages/shell-shim/test/transport-race.test.ts +0 -109
- package/packages/shell-shim/tsconfig.json +0 -13
- package/packages/viewer/package.json +0 -25
- package/packages/viewer/src/bundle.ts +0 -36
- package/packages/viewer/src/client/main.ts +0 -248
- package/packages/viewer/src/credit.ts +0 -24
- package/packages/viewer/src/css.ts +0 -409
- package/packages/viewer/src/export.ts +0 -38
- package/packages/viewer/src/html.ts +0 -356
- package/packages/viewer/src/index.ts +0 -16
- package/packages/viewer/src/render.ts +0 -791
- package/packages/viewer/src/serve.ts +0 -150
- package/packages/viewer/src/trace-dir.ts +0 -140
- package/packages/viewer/test/bundle.test.ts +0 -47
- package/packages/viewer/test/client.test.ts +0 -378
- package/packages/viewer/test/export.test.ts +0 -131
- package/packages/viewer/test/fixtures.ts +0 -69
- package/packages/viewer/test/html.test.ts +0 -453
- package/packages/viewer/test/playback.test.ts +0 -54
- package/packages/viewer/test/render.test.ts +0 -714
- package/packages/viewer/test/serve.test.ts +0 -125
- package/packages/viewer/tsconfig.json +0 -6
- package/prompt/AIDER/deepseek-v4-1-flash-system-prompt.md +0 -29
- package/prompt/CLAUDECODE/claude-fable-5-1-print-system-prompt.md +0 -127
- package/prompt/CLAUDECODE/claude-fable-5-1-system-prompt.md +0 -169
- package/prompt/CLAUDECODE/claude-opus-4-8-system-prompt.md +0 -131
- package/prompt/CLAUDECODE/claude-opus-5-system-prompt.md +0 -149
- package/prompt/CLINE/openai-gpt-4o-mini-system-prompt.md +0 -37
- package/prompt/CODEX/gpt-5-6-luna-system-prompt.md +0 -183
- package/prompt/CODEX/gpt-5-6-sol-system-prompt.md +0 -218
- package/prompt/CODEX/gpt-6-1-sol-system-prompt.md +0 -242
- package/prompt/CODEX/gpt-6-astra-system-prompt.md +0 -170
- package/prompt/CODEX/gpt-6-luna-system-prompt.md +0 -223
- package/prompt/CODEX/gpt-6-sol-system-prompt.md +0 -226
- package/prompt/CRUSH/deepseek-v4-1-flash-system-prompt.md +0 -472
- package/prompt/CURSOR/grok-4-5-high-system-prompt.md +0 -40
- package/prompt/DSH/deepseek-flash-system-prompt.md +0 -31
- package/prompt/GEMINICLI/gemini-3-5-flash-system-prompt.md +0 -168
- package/prompt/GOOSE/deepseek-v4-1-flash-system-prompt.md +0 -180
- package/prompt/HACKERAI/openai-gpt-4o-mini-system-prompt.md +0 -70
- package/prompt/HERMES/nemotron-3-5-lightning-free-system-prompt.md +0 -111
- package/prompt/KILOCODE/kilo-auto-free-system-prompt.md +0 -129
- package/prompt/MCODE/deepseek-deepseek-v4-flash-free-coding-system-prompt.md +0 -128
- package/prompt/MCODE/deepseek-deepseek-v4-flash-free-tui-system-prompt.md +0 -119
- package/prompt/MCODE/deepseek-deepseek-v4-flash-free-work-system-prompt.md +0 -140
- package/prompt/MIMOCODE/mimo-v2-5-pro-system-prompt.md +0 -411
- package/prompt/MIMOCODE/mimo-v2-5-system-prompt.md +0 -411
- package/prompt/MUSECODE/muse-spark-1-3-system-prompt.md +0 -78
- package/prompt/OPENCLAW/gpt-5-6-sol-system-prompt.md +0 -333
- package/prompt/OPENCODE/big-pickle-system-prompt.md +0 -114
- package/prompt/OPENCODE/gpt-5-6-sol-system-prompt.md +0 -126
- package/prompt/OPENCODE/ling-3-0-flash-fin-free-system-prompt.md +0 -114
- package/prompt/OPENCODE/mimo-v2-5-free-system-prompt.md +0 -114
- package/prompt/OPENCODE/muse-spark-1-2-contributor-free-system-prompt.md +0 -84
- package/prompt/OPENCODE/nemotron-3-5-lightning-free-system-prompt.md +0 -114
- package/prompt/OPENCODE/nemotron-3-ultra-free-system-prompt.md +0 -114
- package/prompt/PI/openai-gpt-4o-mini-system-prompt.md +0 -31
- package/prompt/QWENCODE/gpt-5-6-sol-system-prompt.md +0 -290
- package/prompt/ZCODE/glm-4-6-system-prompt.md +0 -91
- package/python/README.md +0 -132
- package/python/agenticreplay_trace/__init__.py +0 -58
- package/python/agenticreplay_trace/graph.py +0 -137
- package/python/agenticreplay_trace/models.py +0 -491
- package/python/agenticreplay_trace/py.typed +0 -0
- package/python/agenticreplay_trace/reader.py +0 -295
- package/python/conftest.py +0 -12
- package/python/examples/analyze.py +0 -114
- package/python/pyproject.toml +0 -45
- package/python/tests/conftest.py +0 -102
- package/python/tests/test_capture_contract.py +0 -24
- package/python/tests/test_conformance.py +0 -235
- package/python/tests/test_examples.py +0 -60
- package/python/tests/test_graph.py +0 -247
- package/python/tests/test_models.py +0 -342
- package/python/tests/test_reader.py +0 -423
- package/python-langgraph/README.md +0 -159
- package/python-langgraph/agenticreplay_langgraph/__init__.py +0 -21
- package/python-langgraph/agenticreplay_langgraph/handler.py +0 -317
- package/python-langgraph/agenticreplay_langgraph/hook.py +0 -168
- package/python-langgraph/pyproject.toml +0 -35
- package/python-langgraph/tests/test_handler.py +0 -370
- package/python-langgraph/tests/test_integration.py +0 -484
- package/python-openai-agents/README.md +0 -145
- package/python-openai-agents/agenticreplay_openai_agents/__init__.py +0 -11
- package/python-openai-agents/agenticreplay_openai_agents/processor.py +0 -331
- package/python-openai-agents/pyproject.toml +0 -34
- package/python-openai-agents/tests/test_processor.py +0 -457
- package/scripts/check-neutrality.mjs +0 -62
- package/scripts/codex-client-acceptance.mjs +0 -133
- package/scripts/conformance.mjs +0 -245
- package/scripts/fidelity.mjs +0 -170
- package/scripts/hermes-client-acceptance.mjs +0 -158
- package/scripts/host-client-acceptance.mjs +0 -732
- package/scripts/installed-smoke.mjs +0 -316
- package/scripts/publish-order.mjs +0 -96
- package/scripts/regenerate-quickstart.mjs +0 -79
- package/scripts/render-cards.mjs +0 -178
- package/scripts/render-demo.mjs +0 -139
- package/scripts/render-sync-card.mjs +0 -96
- package/scripts/set-version.mjs +0 -152
- package/scripts/set-version.test.ts +0 -220
- package/scripts/sync-server-json.mjs +0 -13
- package/scripts/update-opencode-api-bases.mjs +0 -29
- package/server.json +0 -28
- package/skills/agenticreplay-replay/SKILL.md +0 -211
- package/spec/agenticreplay-trace-v0.md +0 -223
- package/test/integrations/README.md +0 -133
- package/test/integrations/agents/ai_sdk_openai.mjs +0 -24
- package/test/integrations/agents/anthropic_sdk.py +0 -10
- package/test/integrations/agents/browser_use_agent.py +0 -24
- package/test/integrations/agents/crewai_agent.py +0 -44
- package/test/integrations/agents/crewai_model_names.py +0 -72
- package/test/integrations/agents/hardcoded_origin.mjs +0 -13
- package/test/integrations/agents/haystack_pipeline.py +0 -28
- package/test/integrations/agents/haystack_rag.py +0 -35
- package/test/integrations/agents/langgraph_agent.py +0 -54
- package/test/integrations/agents/langgraph_nodes.py +0 -62
- package/test/integrations/agents/litellm_agent.py +0 -11
- package/test/integrations/agents/llama_index_agent.py +0 -27
- package/test/integrations/agents/llama_index_model_names.py +0 -67
- package/test/integrations/agents/mastra_agent.mjs +0 -20
- package/test/integrations/agents/mcp_agent.py +0 -44
- package/test/integrations/agents/mcp_server.py +0 -20
- package/test/integrations/agents/openai_agents_handoff.py +0 -52
- package/test/integrations/agents/openai_agents_sdk.py +0 -29
- package/test/integrations/agents/openai_async.py +0 -17
- package/test/integrations/agents/openai_sdk.py +0 -10
- package/test/integrations/agents/openhands_agent.py +0 -34
- package/test/integrations/agents/rag_pipeline.py +0 -79
- package/test/integrations/agents/vision_agent.py +0 -63
- package/test/integrations/run.mjs +0 -719
- package/test/integrations/stub-origin.mjs +0 -229
- package/tsconfig.base.json +0 -20
- package/tsconfig.json +0 -41
- package/vitest.config.ts +0 -39
- package/vitest.setup.ts +0 -25
- /package/{packages → node_modules/@agenticreplay}/schema/schema/event.schema.json +0 -0
- /package/{packages → node_modules/@agenticreplay}/schema/schema/manifest.schema.json +0 -0
|
@@ -1,1230 +0,0 @@
|
|
|
1
|
-
import { execFile } from 'node:child_process';
|
|
2
|
-
import { mkdtemp, readFile, readdir, rm, symlink, unlink, writeFile } from 'node:fs/promises';
|
|
3
|
-
import { tmpdir } from 'node:os';
|
|
4
|
-
import { dirname, join } from 'node:path';
|
|
5
|
-
import { fileURLToPath } from 'node:url';
|
|
6
|
-
import { promisify } from 'node:util';
|
|
7
|
-
import { afterEach, beforeEach, describe, expect, it } from 'vitest';
|
|
8
|
-
import {
|
|
9
|
-
TraceReader,
|
|
10
|
-
deriveCheckpoints,
|
|
11
|
-
listRuns,
|
|
12
|
-
resolveRunSelector,
|
|
13
|
-
runGraph,
|
|
14
|
-
chainTo,
|
|
15
|
-
} from '@agenticreplay/core';
|
|
16
|
-
import { isBlobRef, validateEvent, validateManifest } from '@agenticreplay/schema';
|
|
17
|
-
import { parseArgs } from '../src/args.js';
|
|
18
|
-
import { Output } from '../src/out.js';
|
|
19
|
-
import { recordCommand } from '../src/commands/record.js';
|
|
20
|
-
import { replayCommand } from '../src/commands/replay.js';
|
|
21
|
-
import { startFakeModel } from './fixtures/fake-model.mjs';
|
|
22
|
-
import { existsSync, mkdirSync, symlinkSync, unlinkSync } from 'node:fs';
|
|
23
|
-
|
|
24
|
-
const run = promisify(execFile);
|
|
25
|
-
const here = dirname(fileURLToPath(import.meta.url));
|
|
26
|
-
const FAKE_AGENT = join(here, 'fixtures', 'fake-agent.mjs');
|
|
27
|
-
|
|
28
|
-
/**
|
|
29
|
-
* Run `body` with the temp directory pointed somewhere only this test can reach, and hand back
|
|
30
|
-
* what was left in it.
|
|
31
|
-
*
|
|
32
|
-
* A replay's safety scratch goes to `os.tmpdir()`, so asserting on what it leaves there means
|
|
33
|
-
* asserting on a directory the whole machine shares — the other suites replay too, and a test
|
|
34
|
-
* that diffed the real `$TMPDIR` failed under `vitest run` while passing on its own. Moving the
|
|
35
|
-
* directory for the duration makes "nothing was left behind" a statement about this replay.
|
|
36
|
-
*/
|
|
37
|
-
async function withIsolatedTmp<T>(
|
|
38
|
-
body: () => Promise<T>,
|
|
39
|
-
): Promise<{ result: T; leftBehind: string[] }> {
|
|
40
|
-
const isolated = await mkdtemp(join(tmpdir(), 'agenticreplay-tmproot-'));
|
|
41
|
-
const saved = { TMPDIR: process.env.TMPDIR, TMP: process.env.TMP, TEMP: process.env.TEMP };
|
|
42
|
-
process.env.TMPDIR = isolated;
|
|
43
|
-
process.env.TMP = isolated;
|
|
44
|
-
process.env.TEMP = isolated;
|
|
45
|
-
try {
|
|
46
|
-
const result = await body();
|
|
47
|
-
return { result, leftBehind: await readdir(isolated) };
|
|
48
|
-
} finally {
|
|
49
|
-
for (const [key, value] of Object.entries(saved)) {
|
|
50
|
-
if (value === undefined) delete process.env[key];
|
|
51
|
-
else process.env[key] = value;
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
/**
|
|
57
|
-
* The acceptance test for the whole project.
|
|
58
|
-
*
|
|
59
|
-
* agenticreplay record <agent>
|
|
60
|
-
* agenticreplay replay last
|
|
61
|
-
* agenticreplay replay last --from N --model <other>
|
|
62
|
-
*
|
|
63
|
-
* If these three work against a real child process, a real proxy and a real trace on disk, the
|
|
64
|
-
* mechanism is proven. Everything else is refinement.
|
|
65
|
-
*/
|
|
66
|
-
describe('end to end: record → replay → fork', () => {
|
|
67
|
-
let workspace: string;
|
|
68
|
-
let model: Awaited<ReturnType<typeof startFakeModel>>;
|
|
69
|
-
let out: Output;
|
|
70
|
-
let lines: string[];
|
|
71
|
-
|
|
72
|
-
beforeEach(async () => {
|
|
73
|
-
workspace = await mkdtemp(join(tmpdir(), 'agenticreplay-e2e-'));
|
|
74
|
-
model = await startFakeModel();
|
|
75
|
-
lines = [];
|
|
76
|
-
out = new Output({ write: (s) => void lines.push(s), isTTY: false });
|
|
77
|
-
// A git repo so the shadow index has something to work with.
|
|
78
|
-
await run('git', ['init', '-q'], { cwd: workspace });
|
|
79
|
-
await run('git', ['config', 'user.email', 'test@example.com'], { cwd: workspace });
|
|
80
|
-
await run('git', ['config', 'user.name', 'Test'], { cwd: workspace });
|
|
81
|
-
await writeFile(join(workspace, 'auth.ts'), 'export const fixed = false;\n');
|
|
82
|
-
});
|
|
83
|
-
|
|
84
|
-
afterEach(async () => {
|
|
85
|
-
await model.close();
|
|
86
|
-
await rm(workspace, { recursive: true, force: true });
|
|
87
|
-
});
|
|
88
|
-
|
|
89
|
-
async function record(turns = 3) {
|
|
90
|
-
const args = parseArgs([
|
|
91
|
-
'record',
|
|
92
|
-
'generic-openai',
|
|
93
|
-
'--upstream-anthropic',
|
|
94
|
-
model.url,
|
|
95
|
-
'--',
|
|
96
|
-
'node',
|
|
97
|
-
FAKE_AGENT,
|
|
98
|
-
]);
|
|
99
|
-
process.env.FAKE_AGENT_TURNS = String(turns);
|
|
100
|
-
delete process.env.FAKE_AGENT_CWD;
|
|
101
|
-
return recordCommand(args, out, workspace);
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
it('records a run that validates against the normative schema', async () => {
|
|
105
|
-
const result = await record();
|
|
106
|
-
|
|
107
|
-
expect(result.events).toBeGreaterThan(4);
|
|
108
|
-
|
|
109
|
-
const reader = await TraceReader.open(result.runDir);
|
|
110
|
-
expect(validateManifest(reader.manifest()).valid).toBe(true);
|
|
111
|
-
for (const event of await reader.events()) {
|
|
112
|
-
const r = validateEvent(event);
|
|
113
|
-
expect(r.valid, `seq ${event.seq}: ${r.errors.join(', ')}`).toBe(true);
|
|
114
|
-
}
|
|
115
|
-
});
|
|
116
|
-
|
|
117
|
-
it('captures the tool loop the agent actually ran', async () => {
|
|
118
|
-
const result = await record();
|
|
119
|
-
const reader = await TraceReader.open(result.runDir);
|
|
120
|
-
const events = await reader.events();
|
|
121
|
-
const types = events.map((e) => e.type);
|
|
122
|
-
|
|
123
|
-
expect(types).toContain('model.request');
|
|
124
|
-
expect(types).toContain('model.response');
|
|
125
|
-
// The whole thesis: a proxy that only sees model traffic still recovers the tool loop.
|
|
126
|
-
expect(types).toContain('tool.call');
|
|
127
|
-
expect(types).toContain('tool.result');
|
|
128
|
-
|
|
129
|
-
const call = events.find((e) => e.type === 'tool.call');
|
|
130
|
-
expect(call?.attrs?.name).toBe('edit_file');
|
|
131
|
-
});
|
|
132
|
-
|
|
133
|
-
it('captures the filesystem change the agent made', async () => {
|
|
134
|
-
const result = await record();
|
|
135
|
-
const events = await (await TraceReader.open(result.runDir)).events();
|
|
136
|
-
const changes = events.filter((e) => e.type === 'fs.change');
|
|
137
|
-
expect(changes.some((c) => String(c.attrs?.path).endsWith('auth.ts'))).toBe(true);
|
|
138
|
-
expect(await readFile(join(workspace, 'auth.ts'), 'utf8')).toContain('fixed = true');
|
|
139
|
-
});
|
|
140
|
-
|
|
141
|
-
it('verifies its own integrity digest', async () => {
|
|
142
|
-
const result = await record();
|
|
143
|
-
expect((await (await TraceReader.open(result.runDir)).verifyIntegrity()).ok).toBe(true);
|
|
144
|
-
});
|
|
145
|
-
|
|
146
|
-
it('replays exactly, with the model server never contacted again', async () => {
|
|
147
|
-
await record();
|
|
148
|
-
const callsAfterRecording = model.calls.length;
|
|
149
|
-
expect(callsAfterRecording).toBeGreaterThan(0);
|
|
150
|
-
|
|
151
|
-
const result = await replayCommand(parseArgs(['replay', 'last']), out, workspace);
|
|
152
|
-
|
|
153
|
-
expect(result.mode).toBe('exact');
|
|
154
|
-
expect(result.canonicalExact).toBeGreaterThan(0);
|
|
155
|
-
expect(result.divergences).toBe(0);
|
|
156
|
-
expect(result.liveCalls).toBe(0);
|
|
157
|
-
expect(model.calls.length, 'exact replay must not reach the network at all').toBe(
|
|
158
|
-
callsAfterRecording,
|
|
159
|
-
);
|
|
160
|
-
});
|
|
161
|
-
|
|
162
|
-
it('replays exactly when the recorded bodies are large enough to spill to blobs', async () => {
|
|
163
|
-
// The size is the test. Under the inline limit a body is stored as itself; over it, the writer
|
|
164
|
-
// spills `JSON.stringify(payload)` and the body becomes a quoted, escaped JSON string literal.
|
|
165
|
-
// Replay read those bytes back without undoing the encoding, so it canonicalized an escaped
|
|
166
|
-
// copy — `model: ''`, `messages: []` — and matched nothing against any real harness, which all
|
|
167
|
-
// send a system prompt big enough to spill on turn one. Every other test here stayed under the
|
|
168
|
-
// limit, so all of them passed while replay was completely broken in practice.
|
|
169
|
-
process.env.FAKE_AGENT_PAD = '400';
|
|
170
|
-
try {
|
|
171
|
-
const recorded = await record();
|
|
172
|
-
const events = await (await TraceReader.open(recorded.runDir)).events();
|
|
173
|
-
const request = events.find((e) => e.type === 'model.request');
|
|
174
|
-
expect(isBlobRef(request?.payload), 'fixture must cross the spill boundary').toBe(true);
|
|
175
|
-
|
|
176
|
-
const result = await replayCommand(parseArgs(['replay', 'last']), out, workspace);
|
|
177
|
-
|
|
178
|
-
expect(result.canonicalExact).toBeGreaterThan(0);
|
|
179
|
-
expect(result.divergences).toBe(0);
|
|
180
|
-
expect(result.liveCalls).toBe(0);
|
|
181
|
-
} finally {
|
|
182
|
-
delete process.env.FAKE_AGENT_PAD;
|
|
183
|
-
}
|
|
184
|
-
});
|
|
185
|
-
|
|
186
|
-
it('halts with a reason, not a hang, when the agent asks something else', async () => {
|
|
187
|
-
await record();
|
|
188
|
-
|
|
189
|
-
// Same recording, different question: nothing can match, and the operator has to be told why.
|
|
190
|
-
process.env.FAKE_AGENT_PROMPT = 'do something completely different';
|
|
191
|
-
try {
|
|
192
|
-
const result = await replayCommand(parseArgs(['replay', 'last']), out, workspace);
|
|
193
|
-
|
|
194
|
-
expect(result.canonicalExact).toBe(0);
|
|
195
|
-
expect(result.exitCode, 'a halted replay must not look like a clean run').not.toBe(0);
|
|
196
|
-
const halt = lines.find((l) => l.includes('replay.unmatched'));
|
|
197
|
-
expect(halt, `no halt reason in output:\n${lines.join('\n')}`).toBeDefined();
|
|
198
|
-
expect(halt).toContain('does not match the recording');
|
|
199
|
-
} finally {
|
|
200
|
-
delete process.env.FAKE_AGENT_PROMPT;
|
|
201
|
-
}
|
|
202
|
-
});
|
|
203
|
-
|
|
204
|
-
it('replays a run that changed the files it depends on', async () => {
|
|
205
|
-
// The one that made exact replay useless on a real agent. The recording reads auth.ts into the
|
|
206
|
-
// conversation and then edits it, so by the time you replay, the working tree no longer holds
|
|
207
|
-
// what the recorded request contains. Replaying in place re-reads the mutated file, the
|
|
208
|
-
// trailing message differs, and the run halts at rung 4 — correctly, but uselessly: nothing
|
|
209
|
-
// about the recording changed, only the directory it ran in.
|
|
210
|
-
//
|
|
211
|
-
// Replay therefore restores the filesystem the run started from, the same way a fork does.
|
|
212
|
-
process.env.FAKE_AGENT_READ = 'auth.ts';
|
|
213
|
-
try {
|
|
214
|
-
await record();
|
|
215
|
-
const mutated = await readFile(join(workspace, 'auth.ts'), 'utf8');
|
|
216
|
-
expect(
|
|
217
|
-
mutated,
|
|
218
|
-
'the recording must have changed the file for this test to mean anything',
|
|
219
|
-
).not.toBe('export const fixed = false;\n');
|
|
220
|
-
|
|
221
|
-
const result = await replayCommand(parseArgs(['replay', 'last']), out, workspace);
|
|
222
|
-
|
|
223
|
-
expect(result.canonicalExact).toBeGreaterThan(0);
|
|
224
|
-
expect(result.exitCode).toBe(0);
|
|
225
|
-
expect(lines.join('\n')).not.toContain('replay.unmatched');
|
|
226
|
-
} finally {
|
|
227
|
-
delete process.env.FAKE_AGENT_READ;
|
|
228
|
-
}
|
|
229
|
-
});
|
|
230
|
-
|
|
231
|
-
it('leaves the working tree exactly as it found it', async () => {
|
|
232
|
-
// Replay restores the recorded state over the working tree, because a harness bakes absolute
|
|
233
|
-
// paths into its tool calls and a copy somewhere else gets a permission refusal where the
|
|
234
|
-
// recording has file contents. That is only acceptable because it is reversible: the current
|
|
235
|
-
// state is snapshotted first and put back afterwards, so a replay is observationally a no-op
|
|
236
|
-
// on your checkout.
|
|
237
|
-
process.env.FAKE_AGENT_READ = 'auth.ts';
|
|
238
|
-
try {
|
|
239
|
-
await record();
|
|
240
|
-
const before = await readFile(join(workspace, 'auth.ts'), 'utf8');
|
|
241
|
-
await replayCommand(parseArgs(['replay', 'last']), out, workspace);
|
|
242
|
-
expect(await readFile(join(workspace, 'auth.ts'), 'utf8')).toBe(before);
|
|
243
|
-
} finally {
|
|
244
|
-
delete process.env.FAKE_AGENT_READ;
|
|
245
|
-
}
|
|
246
|
-
});
|
|
247
|
-
|
|
248
|
-
it('replays in the directory the run was recorded in, not a copy of it', async () => {
|
|
249
|
-
// The property the whole restore exists for. Harnesses record absolute paths, so the replay
|
|
250
|
-
// has to happen at the same path or the agent is reading somewhere it was never given.
|
|
251
|
-
process.env.FAKE_AGENT_READ = 'auth.ts';
|
|
252
|
-
try {
|
|
253
|
-
await record();
|
|
254
|
-
await replayCommand(parseArgs(['replay', 'last']), out, workspace);
|
|
255
|
-
const replaying = lines.find((l) => l.includes('info replaying')) ?? '';
|
|
256
|
-
expect(replaying).toContain(`cwd=${workspace}`);
|
|
257
|
-
} finally {
|
|
258
|
-
delete process.env.FAKE_AGENT_READ;
|
|
259
|
-
}
|
|
260
|
-
});
|
|
261
|
-
|
|
262
|
-
/**
|
|
263
|
-
* A refusal must not cost you your working tree.
|
|
264
|
-
*
|
|
265
|
-
* `upstreamPlan` rejects an upstream that is not an origin, and it used to be resolved *after*
|
|
266
|
-
* `replayWorkspace` had already replaced the checkout with the recording — so the throw escaped
|
|
267
|
-
* the `finally` that puts the tree back, which only begins at the child's launch. The operator's
|
|
268
|
-
* own files were left in an `agenticreplay-safety-*` scratch nothing pointed at, on a command that had
|
|
269
|
-
* just printed "your files are restored when the replay ends".
|
|
270
|
-
*
|
|
271
|
-
* Asserted on the file rather than on the error, because the error was never the problem.
|
|
272
|
-
*/
|
|
273
|
-
it('leaves the working tree alone when it refuses the upstream', async () => {
|
|
274
|
-
await record();
|
|
275
|
-
await writeFile(join(workspace, 'auth.ts'), 'MY UNCOMMITTED WORK\n');
|
|
276
|
-
|
|
277
|
-
await expect(
|
|
278
|
-
replayCommand(
|
|
279
|
-
parseArgs(['replay', 'last', '--upstream-openai', 'myuser:PASSWORD@gw.example/v1']),
|
|
280
|
-
out,
|
|
281
|
-
workspace,
|
|
282
|
-
),
|
|
283
|
-
).rejects.toThrow(/is not an origin agenticreplay can use/);
|
|
284
|
-
|
|
285
|
-
expect(
|
|
286
|
-
await readFile(join(workspace, 'auth.ts'), 'utf8'),
|
|
287
|
-
'a refused replay must not have touched the checkout',
|
|
288
|
-
).toBe('MY UNCOMMITTED WORK\n');
|
|
289
|
-
// And it never claimed to have: the restore line belongs to a replay that got that far.
|
|
290
|
-
expect(lines.join('\n')).not.toContain('replay.restored');
|
|
291
|
-
});
|
|
292
|
-
|
|
293
|
-
/**
|
|
294
|
-
* Nor may a refusal leave a run behind.
|
|
295
|
-
*
|
|
296
|
-
* The same misordering as above, in its quiet form. `upstreamPlan` throws for an upstream that is
|
|
297
|
-
* not an origin, and every command resolved it *after* creating the run directory — `record`,
|
|
298
|
-
* `attach`, and the fork path, which also restores a temp worktree first. So a typo in
|
|
299
|
-
* `--upstream-*` left an empty run for `agenticreplay list` to show, reading `FROM <parent>@<n>` on a fork
|
|
300
|
-
* as though it had run, plus a restored tree abandoned in `$TMPDIR`. Nothing was lost, which is
|
|
301
|
-
* why it went unnoticed; it is the same rule, and the rule is that an invocation which cannot
|
|
302
|
-
* work decides so before it touches anything.
|
|
303
|
-
*/
|
|
304
|
-
it('leaves no run behind when it refuses the upstream', async () => {
|
|
305
|
-
const BAD = 'myuser:PASSWORD@gw.example/v1';
|
|
306
|
-
|
|
307
|
-
const before = (await listRuns(workspace)).length;
|
|
308
|
-
await expect(
|
|
309
|
-
recordCommand(
|
|
310
|
-
parseArgs(['record', 'generic-openai', '--upstream-openai', BAD, '--', 'node', FAKE_AGENT]),
|
|
311
|
-
out,
|
|
312
|
-
workspace,
|
|
313
|
-
),
|
|
314
|
-
).rejects.toThrow(/is not an origin agenticreplay can use/);
|
|
315
|
-
expect((await listRuns(workspace)).length, 'a refused record must not have created a run').toBe(
|
|
316
|
-
before,
|
|
317
|
-
);
|
|
318
|
-
|
|
319
|
-
// The fork path gets there by a different route: a checkpoint restored into a temp worktree and
|
|
320
|
-
// a second run directory, both made before the upstream was ever looked at.
|
|
321
|
-
await record();
|
|
322
|
-
const afterGood = (await listRuns(workspace)).length;
|
|
323
|
-
await expect(
|
|
324
|
-
replayCommand(
|
|
325
|
-
parseArgs([
|
|
326
|
-
'replay',
|
|
327
|
-
'last',
|
|
328
|
-
'--from',
|
|
329
|
-
'1',
|
|
330
|
-
'--model',
|
|
331
|
-
'gpt-5.2',
|
|
332
|
-
'--upstream-openai',
|
|
333
|
-
BAD,
|
|
334
|
-
]),
|
|
335
|
-
out,
|
|
336
|
-
workspace,
|
|
337
|
-
),
|
|
338
|
-
).rejects.toThrow(/is not an origin agenticreplay can use/);
|
|
339
|
-
expect((await listRuns(workspace)).length, 'a refused fork must not have created a run').toBe(
|
|
340
|
-
afterGood,
|
|
341
|
-
);
|
|
342
|
-
});
|
|
343
|
-
|
|
344
|
-
/**
|
|
345
|
-
* The same rule, for the other refusal in the same window.
|
|
346
|
-
*
|
|
347
|
-
* `--tls-hosts` is refused by `resolveTlsHosts`/`HostPolicy.from`, and that happened inside
|
|
348
|
-
* `setupTlsCapture` — reached after `replayWorkspace` had already written the recording over the
|
|
349
|
-
* checkout, and after the replay's own run directory existed. The throw escaped the `finally`
|
|
350
|
-
* that puts the tree back for the same reason the upstream one did: that `finally` only begins
|
|
351
|
-
* at the child's launch. So the operator was left holding the recording's files, with their own
|
|
352
|
-
* work in an `agenticreplay-safety-*` scratch whose path nothing prints.
|
|
353
|
-
*
|
|
354
|
-
* `planTlsCapture` is the refusing half on its own and mints nothing; `attach` already calls it
|
|
355
|
-
* before its run directory for exactly this reason.
|
|
356
|
-
*/
|
|
357
|
-
it('leaves the working tree alone when it refuses the tls host list', async () => {
|
|
358
|
-
await record();
|
|
359
|
-
await writeFile(join(workspace, 'auth.ts'), 'MY UNCOMMITTED WORK\n');
|
|
360
|
-
const before = (await listRuns(workspace)).length;
|
|
361
|
-
|
|
362
|
-
await expect(
|
|
363
|
-
replayCommand(
|
|
364
|
-
parseArgs(['replay', 'last', '--tls-intercept', '--tls-hosts', '*']),
|
|
365
|
-
out,
|
|
366
|
-
workspace,
|
|
367
|
-
),
|
|
368
|
-
).rejects.toThrow(/would intercept every host/);
|
|
369
|
-
|
|
370
|
-
expect(
|
|
371
|
-
await readFile(join(workspace, 'auth.ts'), 'utf8'),
|
|
372
|
-
'a refused replay must not have touched the checkout',
|
|
373
|
-
).toBe('MY UNCOMMITTED WORK\n');
|
|
374
|
-
// And it never claimed to have: the restore line belongs to a replay that got that far.
|
|
375
|
-
expect(lines.join('\n')).not.toContain('replay.restored');
|
|
376
|
-
expect((await listRuns(workspace)).length, 'nor created a run for it').toBe(before);
|
|
377
|
-
});
|
|
378
|
-
|
|
379
|
-
/**
|
|
380
|
-
* The refusal that hoisting alone would still have missed.
|
|
381
|
-
*
|
|
382
|
-
* `AGENTICREPLAY_TLS_UPSTREAM_CA` is read from disk, so it cannot be decided from the arguments the way
|
|
383
|
-
* a host list can — `setupTlsCapture` opens it, past the restore. Two things now stand between
|
|
384
|
-
* that and the operator's checkout: `planTlsCapture` reads the roots too, so the refusal
|
|
385
|
-
* happens before `replayWorkspace`; and the release is armed for the whole restored span, so a
|
|
386
|
-
* throw that gets past the first still puts the tree back.
|
|
387
|
-
*
|
|
388
|
-
* Worth its own test because it is the one that proves the rule generalises. `createProxy`,
|
|
389
|
-
* `RunCa.create` and `adapter.prepare` all sit in the same window and are not on any list.
|
|
390
|
-
*/
|
|
391
|
-
it('leaves the working tree alone when the upstream CA cannot be read', async () => {
|
|
392
|
-
await record();
|
|
393
|
-
await writeFile(join(workspace, 'auth.ts'), 'MY UNCOMMITTED WORK\n');
|
|
394
|
-
|
|
395
|
-
process.env.AGENTICREPLAY_TLS_UPSTREAM_CA = join(workspace, 'no-such-root.pem');
|
|
396
|
-
try {
|
|
397
|
-
await expect(
|
|
398
|
-
replayCommand(
|
|
399
|
-
parseArgs(['replay', 'last', '--tls-intercept', '--tls-hosts', 'api.openai.com']),
|
|
400
|
-
out,
|
|
401
|
-
workspace,
|
|
402
|
-
),
|
|
403
|
-
).rejects.toThrow(/ENOENT|no such file/);
|
|
404
|
-
} finally {
|
|
405
|
-
delete process.env.AGENTICREPLAY_TLS_UPSTREAM_CA;
|
|
406
|
-
}
|
|
407
|
-
|
|
408
|
-
expect(
|
|
409
|
-
await readFile(join(workspace, 'auth.ts'), 'utf8'),
|
|
410
|
-
'a refused replay must not have touched the checkout',
|
|
411
|
-
).toBe('MY UNCOMMITTED WORK\n');
|
|
412
|
-
expect(lines.join('\n')).not.toContain('replay.restored');
|
|
413
|
-
});
|
|
414
|
-
|
|
415
|
-
/**
|
|
416
|
-
* And the same on the two paths where only scratch is at stake.
|
|
417
|
-
*
|
|
418
|
-
* A fork restores its checkpoint into a temp worktree and opens its own run before it reaches
|
|
419
|
-
* `setupTlsCapture`, and `record` opens its run first too — so a refused host list left an empty
|
|
420
|
-
* run for `agenticreplay list` to show, plus a worktree in `$TMPDIR` that `agenticreplay gc` will not reclaim
|
|
421
|
-
* because no manifest points at it. Cheaper than the checkout, the same rule.
|
|
422
|
-
*/
|
|
423
|
-
it('leaves no run behind when it refuses the tls host list', async () => {
|
|
424
|
-
const before = (await listRuns(workspace)).length;
|
|
425
|
-
await expect(
|
|
426
|
-
recordCommand(
|
|
427
|
-
parseArgs([
|
|
428
|
-
'record',
|
|
429
|
-
'generic-openai',
|
|
430
|
-
'--tls-intercept',
|
|
431
|
-
'--tls-hosts',
|
|
432
|
-
'*',
|
|
433
|
-
'--',
|
|
434
|
-
'node',
|
|
435
|
-
FAKE_AGENT,
|
|
436
|
-
]),
|
|
437
|
-
out,
|
|
438
|
-
workspace,
|
|
439
|
-
),
|
|
440
|
-
).rejects.toThrow(/would intercept every host/);
|
|
441
|
-
expect((await listRuns(workspace)).length, 'a refused record must not have created a run').toBe(
|
|
442
|
-
before,
|
|
443
|
-
);
|
|
444
|
-
|
|
445
|
-
await record();
|
|
446
|
-
const afterGood = (await listRuns(workspace)).length;
|
|
447
|
-
await expect(
|
|
448
|
-
replayCommand(
|
|
449
|
-
parseArgs([
|
|
450
|
-
'replay',
|
|
451
|
-
'last',
|
|
452
|
-
'--from',
|
|
453
|
-
'1',
|
|
454
|
-
'--model',
|
|
455
|
-
'gpt-5.2',
|
|
456
|
-
'--tls-intercept',
|
|
457
|
-
'--tls-hosts',
|
|
458
|
-
'*',
|
|
459
|
-
]),
|
|
460
|
-
out,
|
|
461
|
-
workspace,
|
|
462
|
-
),
|
|
463
|
-
).rejects.toThrow(/would intercept every host/);
|
|
464
|
-
expect((await listRuns(workspace)).length, 'a refused fork must not have created a run').toBe(
|
|
465
|
-
afterGood,
|
|
466
|
-
);
|
|
467
|
-
});
|
|
468
|
-
|
|
469
|
-
/**
|
|
470
|
-
* The restore is inside the thing that undoes it, so the caller cannot guard it.
|
|
471
|
-
*
|
|
472
|
-
* `replayWorkspace` snapshots the checkout, then overwrites it, then returns the `release` that
|
|
473
|
-
* puts it back — so a `materialize` that fails rejects before its caller has anything to call.
|
|
474
|
-
* The guard in `replayExact` is armed on the next line and never ran; the scratch holding the
|
|
475
|
-
* only copy of the operator's tree was abandoned in `$TMPDIR` with nothing printing its path.
|
|
476
|
-
*
|
|
477
|
-
* The store is emptied of its objects rather than deleted, so `FsCapture.start` still opens it
|
|
478
|
-
* and the failure lands where it matters: on `read-tree`, inside the restore. `agenticreplay gc` on a
|
|
479
|
-
* half-copied trace gets there the same way.
|
|
480
|
-
*/
|
|
481
|
-
it('puts the working tree back when the restore itself fails', async () => {
|
|
482
|
-
const recorded = await record();
|
|
483
|
-
await writeFile(join(workspace, 'auth.ts'), 'MY UNCOMMITTED WORK\n');
|
|
484
|
-
|
|
485
|
-
// A shadow store that opens and holds nothing: every loose-object directory removed.
|
|
486
|
-
const objects = join(recorded.runDir, 'fs', 'objects');
|
|
487
|
-
for (const entry of await readdir(objects)) {
|
|
488
|
-
if (/^[0-9a-f]{2}$/.test(entry)) await rm(join(objects, entry), { recursive: true });
|
|
489
|
-
}
|
|
490
|
-
|
|
491
|
-
const { leftBehind } = await withIsolatedTmp(async () => {
|
|
492
|
-
await expect(replayCommand(parseArgs(['replay', 'last']), out, workspace)).rejects.toThrow();
|
|
493
|
-
});
|
|
494
|
-
|
|
495
|
-
expect(
|
|
496
|
-
await readFile(join(workspace, 'auth.ts'), 'utf8'),
|
|
497
|
-
'a replay whose restore failed must not have kept the operator out of their own tree',
|
|
498
|
-
).toBe('MY UNCOMMITTED WORK\n');
|
|
499
|
-
// The release ran, which is the whole assertion: it is the only thing that removes the
|
|
500
|
-
// scratch, and it removes it only once the tree is back.
|
|
501
|
-
expect(leftBehind, 'nor left the only copy of it in a temp directory nothing names').toEqual(
|
|
502
|
-
[],
|
|
503
|
-
);
|
|
504
|
-
});
|
|
505
|
-
|
|
506
|
-
/**
|
|
507
|
-
* A replay that dies after minting a certificate authority must take the key with it.
|
|
508
|
-
*
|
|
509
|
-
* `tls-capture.ts` puts it in writing — "the caller owns the CA's lifetime and must dispose it
|
|
510
|
-
* on every exit path" — and `replayCommand` had no equivalent of the `minted` wrapper that
|
|
511
|
-
* `recordCommand` and `attachCommand` use. Between `RunCa.create` and the child's launch sit
|
|
512
|
-
* `createProxy`, `mcpForReplay` and `adapter.prepare`, and a throw from any of them left
|
|
513
|
-
* `tls/ca.key` on disk.
|
|
514
|
-
*
|
|
515
|
-
* The throw here is a trace naming an adapter this build does not have, which is what replaying
|
|
516
|
-
* a newer agenticreplay's recording looks like. It also pins the other half: the proxy is listening by
|
|
517
|
-
* then, and a proxy that is not closed keeps Node's event loop alive — so a regression shows up
|
|
518
|
-
* as this test timing out rather than as a hang nobody notices until a user reports it.
|
|
519
|
-
*/
|
|
520
|
-
it('takes the run CA with it when the replay dies after minting one', async () => {
|
|
521
|
-
const recorded = await record();
|
|
522
|
-
const manifestPath = join(recorded.runDir, 'manifest.json');
|
|
523
|
-
const manifest = JSON.parse(await readFile(manifestPath, 'utf8')) as {
|
|
524
|
-
adapter: { id: string };
|
|
525
|
-
};
|
|
526
|
-
manifest.adapter.id = 'agent-from-the-future';
|
|
527
|
-
await writeFile(manifestPath, JSON.stringify(manifest));
|
|
528
|
-
|
|
529
|
-
await expect(
|
|
530
|
-
replayCommand(
|
|
531
|
-
parseArgs(['replay', 'last', '--tls-intercept', '--tls-hosts', 'api.openai.com']),
|
|
532
|
-
out,
|
|
533
|
-
workspace,
|
|
534
|
-
),
|
|
535
|
-
).rejects.toThrow(/unknown adapter/);
|
|
536
|
-
|
|
537
|
-
const withKey: string[] = [];
|
|
538
|
-
const runsRoot = join(workspace, '.agenticreplay', 'runs');
|
|
539
|
-
for (const run of await readdir(runsRoot)) {
|
|
540
|
-
const entries = await readdir(join(runsRoot, run)).catch(() => [] as string[]);
|
|
541
|
-
if (entries.includes('tls')) withKey.push(run);
|
|
542
|
-
}
|
|
543
|
-
expect(withKey, 'a replay that refused after minting must not leave the key').toEqual([]);
|
|
544
|
-
});
|
|
545
|
-
|
|
546
|
-
/**
|
|
547
|
-
* The one line a reader checks to know whether a run can spend money.
|
|
548
|
-
*
|
|
549
|
-
* `egress` was a literal, so `--loose` — which answers an unmatched request from the provider —
|
|
550
|
-
* still announced `blocked`. Asserted on both spellings rather than only the flag's, because the
|
|
551
|
-
* bug was that one value was printed for two behaviours; a test that only pins `--loose` would
|
|
552
|
-
* pass again the moment someone hardcoded the other way round.
|
|
553
|
-
*/
|
|
554
|
-
it('says egress is blocked only when it is, and says so differently under --loose', async () => {
|
|
555
|
-
process.env.FAKE_AGENT_READ = 'auth.ts';
|
|
556
|
-
try {
|
|
557
|
-
await record();
|
|
558
|
-
|
|
559
|
-
await replayCommand(parseArgs(['replay', 'last']), out, workspace);
|
|
560
|
-
const strict = lines.find((l) => l.includes('info replaying')) ?? '';
|
|
561
|
-
expect(strict).toContain('egress=blocked');
|
|
562
|
-
|
|
563
|
-
lines.length = 0;
|
|
564
|
-
await replayCommand(parseArgs(['replay', 'last', '--loose']), out, workspace);
|
|
565
|
-
const loose = lines.find((l) => l.includes('info replaying')) ?? '';
|
|
566
|
-
expect(loose, `no replaying line in:\n${lines.join('\n')}`).not.toContain('egress=blocked');
|
|
567
|
-
expect(loose).toContain('egress=live-on-unmatched');
|
|
568
|
-
} finally {
|
|
569
|
-
delete process.env.FAKE_AGENT_READ;
|
|
570
|
-
}
|
|
571
|
-
});
|
|
572
|
-
|
|
573
|
-
it('names the snapshot it can restore from if a replay dies halfway', async () => {
|
|
574
|
-
// The safety net has to be visible before it is needed. If the process is killed between the
|
|
575
|
-
// restore and the put-back, this id is the only way back to the tree you had.
|
|
576
|
-
process.env.FAKE_AGENT_READ = 'auth.ts';
|
|
577
|
-
try {
|
|
578
|
-
await record();
|
|
579
|
-
await replayCommand(parseArgs(['replay', 'last']), out, workspace);
|
|
580
|
-
const line = lines.find((l) => l.includes('replay.restored')) ?? '';
|
|
581
|
-
expect(line, `no restore line in:\n${lines.join('\n')}`).toMatch(/[0-9a-f]{40}/);
|
|
582
|
-
} finally {
|
|
583
|
-
delete process.env.FAKE_AGENT_READ;
|
|
584
|
-
}
|
|
585
|
-
});
|
|
586
|
-
|
|
587
|
-
/**
|
|
588
|
-
* "Your files are restored when the replay ends" has two halves, and the put-back kept neither
|
|
589
|
-
* where the recorded tree and the working tree disagree about what exists. It is undone from an
|
|
590
|
-
* ordinary snapshot, which honours `.gitignore`, so a file the recording tracked and the
|
|
591
|
-
* workspace ignores now was overwritten with no copy to restore it from. And a snapshot restore
|
|
592
|
-
* writes files without removing any, so a file the recording had and the operator has deleted
|
|
593
|
-
* since came back, and stayed.
|
|
594
|
-
*/
|
|
595
|
-
it('puts back exactly the tree it found: nothing lost, nothing added', async () => {
|
|
596
|
-
await writeFile(join(workspace, 'settings.json'), '{"endpoint":"recorded"}\n');
|
|
597
|
-
mkdirSync(join(workspace, 'legacy'));
|
|
598
|
-
await writeFile(join(workspace, 'legacy', 'old-config.env'), 'OLD CONFIG\n');
|
|
599
|
-
const recorded = await record(2);
|
|
600
|
-
|
|
601
|
-
// Since the recording: the legacy directory is gone, and settings.json became a local file.
|
|
602
|
-
await rm(join(workspace, 'legacy'), { recursive: true, force: true });
|
|
603
|
-
await writeFile(join(workspace, '.gitignore'), 'settings.json\n');
|
|
604
|
-
await writeFile(join(workspace, 'settings.json'), '{"endpoint":"MY LOCAL SETTINGS"}\n');
|
|
605
|
-
await writeFile(join(workspace, 'auth.ts'), 'MY UNCOMMITTED WORK\n');
|
|
606
|
-
|
|
607
|
-
const { leftBehind } = await withIsolatedTmp(async () => {
|
|
608
|
-
await expect(
|
|
609
|
-
replayCommand(parseArgs(['replay', recorded.runId]), out, workspace),
|
|
610
|
-
).rejects.toThrow(/would overwrite settings\.json/);
|
|
611
|
-
});
|
|
612
|
-
expect(
|
|
613
|
-
await readFile(join(workspace, 'settings.json'), 'utf8'),
|
|
614
|
-
'an ignored file the copy does not hold must not be overwritten',
|
|
615
|
-
).toBe('{"endpoint":"MY LOCAL SETTINGS"}\n');
|
|
616
|
-
expect(await readFile(join(workspace, 'auth.ts'), 'utf8')).toBe('MY UNCOMMITTED WORK\n');
|
|
617
|
-
expect(leftBehind, 'a refused replay must not leave its copy behind').toEqual([]);
|
|
618
|
-
|
|
619
|
-
// Moved aside, the replay runs, and hands back the tree it found — without the files the
|
|
620
|
-
// recording had and this tree does not, and without the directory it made for them.
|
|
621
|
-
await rm(join(workspace, 'settings.json'));
|
|
622
|
-
await replayCommand(parseArgs(['replay', recorded.runId]), out, workspace);
|
|
623
|
-
expect(existsSync(join(workspace, 'legacy')), 'a deleted directory came back').toBe(false);
|
|
624
|
-
expect(existsSync(join(workspace, 'settings.json')), 'a removed file came back').toBe(false);
|
|
625
|
-
expect(await readFile(join(workspace, 'auth.ts'), 'utf8')).toBe('MY UNCOMMITTED WORK\n');
|
|
626
|
-
expect(await readFile(join(workspace, '.gitignore'), 'utf8')).toBe('settings.json\n');
|
|
627
|
-
});
|
|
628
|
-
|
|
629
|
-
/**
|
|
630
|
-
* The same promise, for what the replayed agent writes rather than what the restore does. An exact
|
|
631
|
-
* replay makes the recorded agent do what it did, so a file it created during the recording is
|
|
632
|
-
* created again — and the put-back, whose copy never had it, left it in the operator's tree.
|
|
633
|
-
*/
|
|
634
|
-
it('takes away what the replayed agent created, as well as what the restore wrote', async () => {
|
|
635
|
-
await rm(join(workspace, 'auth.ts'));
|
|
636
|
-
const recorded = await record(2);
|
|
637
|
-
expect(existsSync(join(workspace, 'auth.ts')), 'fixture: the agent creates auth.ts').toBe(true);
|
|
638
|
-
await rm(join(workspace, 'auth.ts'));
|
|
639
|
-
await writeFile(join(workspace, 'notes.txt'), 'MY NOTES\n');
|
|
640
|
-
|
|
641
|
-
const replayed = await replayCommand(parseArgs(['replay', recorded.runId]), out, workspace);
|
|
642
|
-
expect(replayed.canonicalExact, 'the agent must actually have run').toBe(2);
|
|
643
|
-
expect(existsSync(join(workspace, 'auth.ts')), 'the replayed agent left its file').toBe(false);
|
|
644
|
-
expect(await readFile(join(workspace, 'notes.txt'), 'utf8')).toBe('MY NOTES\n');
|
|
645
|
-
});
|
|
646
|
-
|
|
647
|
-
/**
|
|
648
|
-
* A file standing where the recording had a directory is in the way of every path under it, and
|
|
649
|
-
* the restore deletes it to make the directory. `lstat` answers ENOTDIR for those paths, which
|
|
650
|
-
* read as "nothing there" — so an ignored file at such a path was destroyed without a copy.
|
|
651
|
-
*/
|
|
652
|
-
it('counts a file where the recording had a directory as something it would overwrite', async () => {
|
|
653
|
-
mkdirSync(join(workspace, 'cfg'));
|
|
654
|
-
await writeFile(join(workspace, 'cfg', 'app.json'), '{"recorded":true}\n');
|
|
655
|
-
const recorded = await record(2);
|
|
656
|
-
await rm(join(workspace, 'cfg'), { recursive: true, force: true });
|
|
657
|
-
await writeFile(join(workspace, '.gitignore'), 'cfg\n');
|
|
658
|
-
await writeFile(join(workspace, 'cfg'), 'MY LOCAL CFG FILE\n');
|
|
659
|
-
|
|
660
|
-
await expect(
|
|
661
|
-
replayCommand(parseArgs(['replay', recorded.runId]), out, workspace),
|
|
662
|
-
).rejects.toThrow(/would overwrite cfg:/);
|
|
663
|
-
expect(await readFile(join(workspace, 'cfg'), 'utf8')).toBe('MY LOCAL CFG FILE\n');
|
|
664
|
-
});
|
|
665
|
-
|
|
666
|
-
/**
|
|
667
|
-
* A junction is a directory as far as git is concerned: the copy holds what is inside it as
|
|
668
|
-
* ordinary files, and the restore writes through it. Judged by `lstat`, which calls it a link,
|
|
669
|
-
* a file deleted from under one refused the whole replay — "would overwrite data" — when the
|
|
670
|
-
* restore would only have written that file back and the put-back taken it away again. On POSIX
|
|
671
|
-
* git records a symlink as itself, so there this holds trivially; on Windows it is the case.
|
|
672
|
-
*/
|
|
673
|
-
it('treats a directory link git walks into as the directory it is', async () => {
|
|
674
|
-
const outside = await mkdtemp(join(tmpdir(), 'agenticreplay-outside-'));
|
|
675
|
-
const link = join(workspace, 'data');
|
|
676
|
-
symlinkSync(outside, link, process.platform === 'win32' ? 'junction' : 'dir');
|
|
677
|
-
try {
|
|
678
|
-
await writeFile(join(outside, 'a.csv'), 'A\n');
|
|
679
|
-
await writeFile(join(outside, 'b.csv'), 'B\n');
|
|
680
|
-
const recorded = await record(2);
|
|
681
|
-
await rm(join(outside, 'b.csv'));
|
|
682
|
-
await writeFile(join(workspace, 'auth.ts'), 'MY UNCOMMITTED WORK\n');
|
|
683
|
-
|
|
684
|
-
const replayed = await replayCommand(parseArgs(['replay', recorded.runId]), out, workspace);
|
|
685
|
-
expect(replayed.canonicalExact).toBe(2);
|
|
686
|
-
expect(await readdir(outside), 'the deleted file must stay deleted').toEqual(['a.csv']);
|
|
687
|
-
expect(await readFile(join(workspace, 'auth.ts'), 'utf8')).toBe('MY UNCOMMITTED WORK\n');
|
|
688
|
-
} finally {
|
|
689
|
-
// The link first and on its own, so nothing recursive ever walks through it.
|
|
690
|
-
unlinkSync(link);
|
|
691
|
-
await rm(outside, { recursive: true, force: true });
|
|
692
|
-
}
|
|
693
|
-
});
|
|
694
|
-
|
|
695
|
-
/**
|
|
696
|
-
* The other half of the case above: a file where the recording had a directory, and one the copy
|
|
697
|
-
* DOES hold. The restore deletes it to make the directory; the put-back writes it back, and
|
|
698
|
-
* `checkout-index -f` clears the directory it made to do so. So this replays, rather than being
|
|
699
|
-
* refused — and the operator's uncommitted edit survives it. Pinned because it was disputed: the
|
|
700
|
-
* claim was that the put-back skips a file over a non-empty directory, which git 2.43 (Linux) and
|
|
701
|
-
* 2.55 (Windows) both do not.
|
|
702
|
-
*/
|
|
703
|
-
it('puts back a held file where the recording had a directory', async () => {
|
|
704
|
-
mkdirSync(join(workspace, 'cfg'));
|
|
705
|
-
await writeFile(join(workspace, 'cfg', 'app.json'), '{"recorded":true}\n');
|
|
706
|
-
const recorded = await record(2);
|
|
707
|
-
await rm(join(workspace, 'cfg'), { recursive: true, force: true });
|
|
708
|
-
await writeFile(join(workspace, 'cfg'), 'MY UNCOMMITTED EDIT\n');
|
|
709
|
-
|
|
710
|
-
const replayed = await replayCommand(parseArgs(['replay', recorded.runId]), out, workspace);
|
|
711
|
-
expect(replayed.canonicalExact).toBe(2);
|
|
712
|
-
expect(await readFile(join(workspace, 'cfg'), 'utf8')).toBe('MY UNCOMMITTED EDIT\n');
|
|
713
|
-
});
|
|
714
|
-
|
|
715
|
-
it('does not leave a copy of the working tree in the temp directory', async () => {
|
|
716
|
-
// The safety snapshot is a shadow git store holding the whole workspace, and it was never
|
|
717
|
-
// removed — one per `agenticreplay replay`, growing with the size of your checkout, in a directory
|
|
718
|
-
// `agenticreplay gc` deliberately will not sweep because it only reclaims fork worktrees. Replay owns
|
|
719
|
-
// it, so replay has to clean it up.
|
|
720
|
-
//
|
|
721
|
-
// Watched in a temp directory of this test's own, not in the machine's. Diffing a listing of
|
|
722
|
-
// the whole OS temp dir before and after cannot tell a directory *this* replay created from
|
|
723
|
-
// one another test's replay created in the same window, so under the parallel suite it failed
|
|
724
|
-
// with nothing wrong. `replay.ts` calls `tmpdir()` at the moment it mkdtemps, so redirecting
|
|
725
|
-
// it here is enough, and leaves the product's own output alone.
|
|
726
|
-
const isolatedTmp = await mkdtemp(join(tmpdir(), 'agenticreplay-e2e-tmp-'));
|
|
727
|
-
const outerTmp = { TEMP: process.env.TEMP, TMP: process.env.TMP, TMPDIR: process.env.TMPDIR };
|
|
728
|
-
process.env.TEMP = isolatedTmp;
|
|
729
|
-
process.env.TMP = isolatedTmp;
|
|
730
|
-
process.env.TMPDIR = isolatedTmp;
|
|
731
|
-
process.env.FAKE_AGENT_READ = 'auth.ts';
|
|
732
|
-
try {
|
|
733
|
-
await record();
|
|
734
|
-
await replayCommand(parseArgs(['replay', 'last']), out, workspace);
|
|
735
|
-
const leaked = (await readdir(isolatedTmp)).filter((e) =>
|
|
736
|
-
e.startsWith('agenticreplay-safety-'),
|
|
737
|
-
);
|
|
738
|
-
expect(leaked, 'the pre-replay snapshot store must not outlive the replay').toEqual([]);
|
|
739
|
-
} finally {
|
|
740
|
-
delete process.env.FAKE_AGENT_READ;
|
|
741
|
-
for (const [key, value] of Object.entries(outerTmp)) {
|
|
742
|
-
if (value === undefined) delete process.env[key];
|
|
743
|
-
else process.env[key] = value;
|
|
744
|
-
}
|
|
745
|
-
await rm(isolatedTmp, { recursive: true, force: true });
|
|
746
|
-
}
|
|
747
|
-
});
|
|
748
|
-
|
|
749
|
-
/**
|
|
750
|
-
* `--worktree` promises never to touch your files, and two branches ahead of the one that reads
|
|
751
|
-
* it broke the promise: `--in-place` given beside it won without a word, and a run recorded with
|
|
752
|
-
* --no-fs fell through to the in-place warning and ran the agent over the working tree anyway —
|
|
753
|
-
* the recorded edit landed on uncommitted work.
|
|
754
|
-
*/
|
|
755
|
-
it('never replays in your directory once asked for a scratch copy', async () => {
|
|
756
|
-
const withFs = await record(2);
|
|
757
|
-
await writeFile(join(workspace, 'auth.ts'), 'MY UNCOMMITTED WORK\n');
|
|
758
|
-
await expect(
|
|
759
|
-
replayCommand(
|
|
760
|
-
parseArgs(['replay', withFs.runId, '--worktree', '--in-place']),
|
|
761
|
-
out,
|
|
762
|
-
workspace,
|
|
763
|
-
),
|
|
764
|
-
).rejects.toThrow(/cannot both apply/);
|
|
765
|
-
expect(await readFile(join(workspace, 'auth.ts'), 'utf8')).toBe('MY UNCOMMITTED WORK\n');
|
|
766
|
-
|
|
767
|
-
const noFs = await recordCommand(
|
|
768
|
-
parseArgs([
|
|
769
|
-
'record',
|
|
770
|
-
'generic-openai',
|
|
771
|
-
'--no-fs',
|
|
772
|
-
'--upstream-anthropic',
|
|
773
|
-
model.url,
|
|
774
|
-
'--',
|
|
775
|
-
'node',
|
|
776
|
-
FAKE_AGENT,
|
|
777
|
-
]),
|
|
778
|
-
out,
|
|
779
|
-
workspace,
|
|
780
|
-
);
|
|
781
|
-
await writeFile(join(workspace, 'auth.ts'), 'MY UNCOMMITTED WORK\n');
|
|
782
|
-
const { leftBehind } = await withIsolatedTmp(async () => {
|
|
783
|
-
await expect(
|
|
784
|
-
replayCommand(parseArgs(['replay', noFs.runId, '--worktree']), out, workspace),
|
|
785
|
-
).rejects.toThrow(/no workspace snapshot to copy/);
|
|
786
|
-
});
|
|
787
|
-
expect(
|
|
788
|
-
await readFile(join(workspace, 'auth.ts'), 'utf8'),
|
|
789
|
-
'a replay asked for a scratch copy must not have written into the checkout',
|
|
790
|
-
).toBe('MY UNCOMMITTED WORK\n');
|
|
791
|
-
expect(leftBehind).toEqual([]);
|
|
792
|
-
const warned = lines.find((l) => l.includes('replay.no_snapshot')) ?? '';
|
|
793
|
-
expect(warned, `no diagnosis in:\n${lines.join('\n')}`).toContain('--in-place');
|
|
794
|
-
expect(lines.join('\n')).not.toContain('replay.in-place');
|
|
795
|
-
|
|
796
|
-
// Unchanged without the flag: a run with no snapshot still replays where it is, and says so.
|
|
797
|
-
const inPlace = await replayCommand(parseArgs(['replay', noFs.runId]), out, workspace);
|
|
798
|
-
expect(inPlace.canonicalExact).toBe(2);
|
|
799
|
-
expect(lines.join('\n')).toContain('replay.in-place');
|
|
800
|
-
});
|
|
801
|
-
|
|
802
|
-
it('does not touch the working tree when asked to replay in a scratch copy', async () => {
|
|
803
|
-
process.env.FAKE_AGENT_READ = 'auth.ts';
|
|
804
|
-
try {
|
|
805
|
-
await record();
|
|
806
|
-
await replayCommand(parseArgs(['replay', 'last', '--worktree']), out, workspace);
|
|
807
|
-
const replaying = lines.find((l) => l.includes('info replaying')) ?? '';
|
|
808
|
-
expect(replaying).not.toContain(`cwd=${workspace}`);
|
|
809
|
-
expect(lines.join('\n')).not.toContain('replay.restored');
|
|
810
|
-
} finally {
|
|
811
|
-
delete process.env.FAKE_AGENT_READ;
|
|
812
|
-
}
|
|
813
|
-
});
|
|
814
|
-
|
|
815
|
-
/**
|
|
816
|
-
* A RUN CAN BE WITHOUT THE STORE ITS OWN EVENTS POINT AT: pulled from a gateway it was pushed to
|
|
817
|
-
* without `--fs`, or put through `agenticreplay scrub --drop-fs`. Either way its `fs.snapshot` events name
|
|
818
|
-
* trees that are nowhere on this machine, and a restore of one died inside git — "failed to
|
|
819
|
-
* unpack tree object <40 hex>" — on `agenticreplay replay` and `--worktree` alike, while only the fork
|
|
820
|
-
* path said what had happened. Each refusal also left an empty directory in `$TMPDIR` that
|
|
821
|
-
* nothing named and `agenticreplay gc` never reclaims.
|
|
822
|
-
*/
|
|
823
|
-
it('says why it cannot restore a run whose snapshots are gone, and leaves nothing behind', async () => {
|
|
824
|
-
const recorded = await record(2);
|
|
825
|
-
const from = deriveCheckpoints(await (await TraceReader.open(recorded.runDir)).events())[0]!
|
|
826
|
-
.seq;
|
|
827
|
-
await rm(join(recorded.runDir, 'fs'), { recursive: true, force: true });
|
|
828
|
-
await writeFile(join(workspace, 'auth.ts'), 'MY UNCOMMITTED WORK\n');
|
|
829
|
-
|
|
830
|
-
const { leftBehind } = await withIsolatedTmp(async () => {
|
|
831
|
-
for (const extra of [[], ['--worktree']]) {
|
|
832
|
-
await expect(
|
|
833
|
-
replayCommand(parseArgs(['replay', recorded.runId, ...extra]), out, workspace),
|
|
834
|
-
).rejects.toThrow(/no workspace snapshot to restore/);
|
|
835
|
-
}
|
|
836
|
-
await expect(
|
|
837
|
-
replayCommand(
|
|
838
|
-
parseArgs([
|
|
839
|
-
'replay',
|
|
840
|
-
recorded.runId,
|
|
841
|
-
'--from',
|
|
842
|
-
String(from),
|
|
843
|
-
'--model',
|
|
844
|
-
'claude-sonnet-5',
|
|
845
|
-
'--upstream-anthropic',
|
|
846
|
-
model.url,
|
|
847
|
-
]),
|
|
848
|
-
out,
|
|
849
|
-
workspace,
|
|
850
|
-
),
|
|
851
|
-
).rejects.toThrow(/no workspace snapshot for the checkpoint/);
|
|
852
|
-
});
|
|
853
|
-
|
|
854
|
-
// Both causes named, because nothing on disk says which it was — and the first one has a way
|
|
855
|
-
// back that the old wording ("never the filesystem snapshots") said did not exist.
|
|
856
|
-
const warned = lines.filter((l) => /(replay|fork)\.no_snapshot/.test(l));
|
|
857
|
-
expect(warned, `expected three diagnoses in:\n${lines.join('\n')}`).toHaveLength(3);
|
|
858
|
-
for (const line of warned) {
|
|
859
|
-
expect(line).toContain('pushed with --fs');
|
|
860
|
-
expect(line).toContain('--drop-fs');
|
|
861
|
-
}
|
|
862
|
-
expect(warned.slice(0, 2).every((l) => l.includes('--in-place'))).toBe(true);
|
|
863
|
-
expect(warned[2]).toContain('--no-fs');
|
|
864
|
-
|
|
865
|
-
expect(leftBehind, 'a refusal must not leave a worktree in the temp directory').toEqual([]);
|
|
866
|
-
expect(
|
|
867
|
-
await readFile(join(workspace, 'auth.ts'), 'utf8'),
|
|
868
|
-
'a refused replay must not have touched the checkout',
|
|
869
|
-
).toBe('MY UNCOMMITTED WORK\n');
|
|
870
|
-
|
|
871
|
-
// And the way out it names has to work, or the diagnosis is just a nicer dead end.
|
|
872
|
-
const inPlace = await replayCommand(
|
|
873
|
-
parseArgs(['replay', recorded.runId, '--in-place']),
|
|
874
|
-
out,
|
|
875
|
-
workspace,
|
|
876
|
-
);
|
|
877
|
-
expect(inPlace.unmatched).toBe(0);
|
|
878
|
-
expect(inPlace.canonicalExact).toBe(2);
|
|
879
|
-
});
|
|
880
|
-
|
|
881
|
-
it('says where the recording ran and where the replay ran when it halts', async () => {
|
|
882
|
-
// A halt reason like "distance 205343" is true and useless. The most common cause by far is
|
|
883
|
-
// that the recorded conversation contains absolute paths from the directory the run was made
|
|
884
|
-
// in and the replay is somewhere else, so the harness refuses the read and the tool result
|
|
885
|
-
// comes back as a permission error instead of the file. Both directories on the line is what
|
|
886
|
-
// turns the number into something an operator can act on — including confirming they match.
|
|
887
|
-
await record();
|
|
888
|
-
// Set *after* recording: the replay has to ask something the recording cannot answer.
|
|
889
|
-
process.env.FAKE_AGENT_PROMPT = 'ask something else entirely';
|
|
890
|
-
try {
|
|
891
|
-
await replayCommand(parseArgs(['replay', 'last']), out, workspace);
|
|
892
|
-
|
|
893
|
-
const halt = lines.find((l) => l.includes('replay.unmatched')) ?? '';
|
|
894
|
-
expect(halt).toContain(`recorded_in=${workspace}`);
|
|
895
|
-
expect(halt).toContain(`replayed_in=${workspace}`);
|
|
896
|
-
expect(halt).toContain('--loose');
|
|
897
|
-
} finally {
|
|
898
|
-
delete process.env.FAKE_AGENT_PROMPT;
|
|
899
|
-
}
|
|
900
|
-
});
|
|
901
|
-
|
|
902
|
-
it('points at the recording directory when the replay is somewhere else', async () => {
|
|
903
|
-
await record();
|
|
904
|
-
const elsewhere = await mkdtemp(join(tmpdir(), 'agenticreplay-elsewhere-'));
|
|
905
|
-
process.env.FAKE_AGENT_PROMPT = 'ask something else entirely';
|
|
906
|
-
try {
|
|
907
|
-
// Copy the trace, not the files: this is someone replaying a colleague's run.
|
|
908
|
-
await run('cp', ['-r', join(workspace, '.agenticreplay'), elsewhere]);
|
|
909
|
-
await replayCommand(parseArgs(['replay', 'last']), out, elsewhere);
|
|
910
|
-
|
|
911
|
-
const warned = lines.find((l) => l.includes('replay.elsewhere')) ?? '';
|
|
912
|
-
expect(warned, `no elsewhere warning in:\n${lines.join('\n')}`).toContain(workspace);
|
|
913
|
-
expect(warned).toContain('--worktree');
|
|
914
|
-
} finally {
|
|
915
|
-
delete process.env.FAKE_AGENT_PROMPT;
|
|
916
|
-
await rm(elsewhere, { recursive: true, force: true });
|
|
917
|
-
}
|
|
918
|
-
});
|
|
919
|
-
|
|
920
|
-
/**
|
|
921
|
-
* The directory a run was recorded in is that directory however the path to it is spelled.
|
|
922
|
-
*
|
|
923
|
-
* Windows hands a process its working directory as typed — `C:\…` from PowerShell, `c:\…` from
|
|
924
|
-
* cmd — and a junction or symlink names the same folder differently again. Compared as strings,
|
|
925
|
-
* the replay called it "elsewhere", skipped the safety copy, and the recorded edit replaced
|
|
926
|
-
* uncommitted work in the very directory the run was made in.
|
|
927
|
-
*/
|
|
928
|
-
it('restores and puts back where it was recorded, however that path is spelled', async () => {
|
|
929
|
-
await record(2);
|
|
930
|
-
const aliasRoot = await mkdtemp(join(tmpdir(), 'agenticreplay-alias-'));
|
|
931
|
-
const alias = join(aliasRoot, 'same');
|
|
932
|
-
await symlink(workspace, alias, process.platform === 'win32' ? 'junction' : 'dir');
|
|
933
|
-
const spellings = [alias];
|
|
934
|
-
if (process.platform === 'win32') {
|
|
935
|
-
spellings.push(workspace.replace(/^[A-Z]:/, (drive) => drive.toLowerCase()));
|
|
936
|
-
}
|
|
937
|
-
try {
|
|
938
|
-
for (const cwd of spellings) {
|
|
939
|
-
await writeFile(join(workspace, 'auth.ts'), 'MY UNCOMMITTED WORK\n');
|
|
940
|
-
await replayCommand(parseArgs(['replay', 'last']), out, cwd);
|
|
941
|
-
expect(
|
|
942
|
-
await readFile(join(workspace, 'auth.ts'), 'utf8'),
|
|
943
|
-
`replayed from ${cwd}: the checkout must come back as it was`,
|
|
944
|
-
).toBe('MY UNCOMMITTED WORK\n');
|
|
945
|
-
}
|
|
946
|
-
expect(lines.join('\n')).not.toContain('replay.elsewhere');
|
|
947
|
-
expect(lines.filter((l) => l.includes('replay.restored'))).toHaveLength(spellings.length);
|
|
948
|
-
} finally {
|
|
949
|
-
// The link first and on its own, so nothing recursive ever walks into the workspace.
|
|
950
|
-
await unlink(alias);
|
|
951
|
-
await rm(aliasRoot, { recursive: true, force: true });
|
|
952
|
-
}
|
|
953
|
-
});
|
|
954
|
-
|
|
955
|
-
it('records the commit the run started from', async () => {
|
|
956
|
-
// `manifest.git` is in the schema, the Python reader parses it, and nothing ever wrote it — so
|
|
957
|
-
// every trace was missing the single most useful piece of provenance for "why did my agent
|
|
958
|
-
// delete my file": which commit it was looking at.
|
|
959
|
-
// The shared fixture inits a repo but never commits, so HEAD is unborn there. Commit here
|
|
960
|
-
// rather than in `beforeEach`: other tests assert on a dirty tree and should keep doing so.
|
|
961
|
-
await run('git', ['add', '-A'], { cwd: workspace });
|
|
962
|
-
await run('git', ['commit', '-qm', 'initial'], { cwd: workspace });
|
|
963
|
-
|
|
964
|
-
const result = await record();
|
|
965
|
-
const manifest = (await TraceReader.open(result.runDir)).manifest();
|
|
966
|
-
const head = (await run('git', ['rev-parse', 'HEAD'], { cwd: workspace })).stdout.trim();
|
|
967
|
-
|
|
968
|
-
expect(manifest.git?.head).toBe(head);
|
|
969
|
-
expect(manifest.git?.branch).toBeDefined();
|
|
970
|
-
// The agent edits a file, so by the end the tree is dirty — but `git` describes the state the
|
|
971
|
-
// run *started* from, which is what makes it a reproduction instruction.
|
|
972
|
-
expect(manifest.git?.dirty).toBe(false);
|
|
973
|
-
});
|
|
974
|
-
|
|
975
|
-
it('closes the proxy and seals the trace when the agent will not start', async () => {
|
|
976
|
-
// Two bugs, one cause. `recordCommand` had no `try/finally`, so a throw skipped both
|
|
977
|
-
// `proxy.close()` and `writer.close()`.
|
|
978
|
-
//
|
|
979
|
-
// The proxy is the visible one: a listening server keeps Node's event loop alive, so
|
|
980
|
-
// `agenticreplay record generic-openai -- /nonexistent` printed its error and then **hung** — verified
|
|
981
|
-
// against the built CLI, killed at 12s. Mistyping an agent name is the first thing a new user
|
|
982
|
-
// does.
|
|
983
|
-
//
|
|
984
|
-
// The trace is the quieter one: everything the agent did is on disk, but with no `ended_at`,
|
|
985
|
-
// no `counts` and no `integrity`, so `verifyIntegrity` reports the run as tampered rather than
|
|
986
|
-
// as unfinished. The same shape loses a complete recording to one failed write.
|
|
987
|
-
const args = parseArgs([
|
|
988
|
-
'record',
|
|
989
|
-
'generic-openai',
|
|
990
|
-
'--upstream-anthropic',
|
|
991
|
-
model.url,
|
|
992
|
-
'--',
|
|
993
|
-
join(workspace, 'no-such-binary'),
|
|
994
|
-
]);
|
|
995
|
-
|
|
996
|
-
await expect(recordCommand(args, out, workspace)).rejects.toThrow();
|
|
997
|
-
|
|
998
|
-
const runs = await listRuns(workspace);
|
|
999
|
-
expect(runs, 'the run directory should still exist').toHaveLength(1);
|
|
1000
|
-
const manifest = (await TraceReader.open(runs[0]!.dir)).manifest();
|
|
1001
|
-
expect(manifest.ended_at, 'a failed run must still be sealed').toBeDefined();
|
|
1002
|
-
expect(manifest.integrity?.events_sha256).toBeDefined();
|
|
1003
|
-
});
|
|
1004
|
-
|
|
1005
|
-
it('derives checkpoints you can fork from', async () => {
|
|
1006
|
-
const result = await record();
|
|
1007
|
-
const events = await (await TraceReader.open(result.runDir)).events();
|
|
1008
|
-
const checkpoints = deriveCheckpoints(events);
|
|
1009
|
-
expect(checkpoints.length).toBeGreaterThan(0);
|
|
1010
|
-
expect(checkpoints[0]!.fsTree).toBeTruthy();
|
|
1011
|
-
});
|
|
1012
|
-
|
|
1013
|
-
it('forks from a checkpoint and continues live on a different model', async () => {
|
|
1014
|
-
const first = await record();
|
|
1015
|
-
const events = await (await TraceReader.open(first.runDir)).events();
|
|
1016
|
-
const checkpoint = deriveCheckpoints(events)[0]!;
|
|
1017
|
-
const callsBefore = model.calls.length;
|
|
1018
|
-
|
|
1019
|
-
const result = await replayCommand(
|
|
1020
|
-
parseArgs([
|
|
1021
|
-
'replay',
|
|
1022
|
-
'last',
|
|
1023
|
-
'--from',
|
|
1024
|
-
String(checkpoint.seq),
|
|
1025
|
-
'--model',
|
|
1026
|
-
'glm-5.3-flash',
|
|
1027
|
-
'--upstream-anthropic',
|
|
1028
|
-
model.url,
|
|
1029
|
-
]),
|
|
1030
|
-
out,
|
|
1031
|
-
workspace,
|
|
1032
|
-
);
|
|
1033
|
-
|
|
1034
|
-
expect(result.mode).toBe('fork');
|
|
1035
|
-
expect(result.forkRunId).toBeTruthy();
|
|
1036
|
-
expect(result.forkRunId).not.toBe(first.runId);
|
|
1037
|
-
// Live calls happened past the fork point — that is what makes it a fork rather than a replay.
|
|
1038
|
-
expect(result.liveCalls).toBeGreaterThan(0);
|
|
1039
|
-
expect(model.calls.length).toBeGreaterThan(callsBefore);
|
|
1040
|
-
|
|
1041
|
-
// And the substituted model actually reached the upstream.
|
|
1042
|
-
const forkedCalls = model.calls.slice(callsBefore);
|
|
1043
|
-
expect(forkedCalls.some((c) => c.body?.model === 'glm-5.3-flash')).toBe(true);
|
|
1044
|
-
});
|
|
1045
|
-
|
|
1046
|
-
it('records the fork with provenance pointing back at its parent', async () => {
|
|
1047
|
-
const first = await record();
|
|
1048
|
-
const events = await (await TraceReader.open(first.runDir)).events();
|
|
1049
|
-
const checkpoint = deriveCheckpoints(events)[0]!;
|
|
1050
|
-
|
|
1051
|
-
const result = await replayCommand(
|
|
1052
|
-
parseArgs([
|
|
1053
|
-
'replay',
|
|
1054
|
-
'last',
|
|
1055
|
-
'--from',
|
|
1056
|
-
String(checkpoint.seq),
|
|
1057
|
-
'--model',
|
|
1058
|
-
'glm-5.3-flash',
|
|
1059
|
-
'--upstream-anthropic',
|
|
1060
|
-
model.url,
|
|
1061
|
-
]),
|
|
1062
|
-
out,
|
|
1063
|
-
workspace,
|
|
1064
|
-
);
|
|
1065
|
-
|
|
1066
|
-
const forkDir = (await resolveRunSelector(workspace, result.forkRunId!)).dir;
|
|
1067
|
-
const forkEvents = await (await TraceReader.open(forkDir)).events();
|
|
1068
|
-
const forkEvent = forkEvents.find((e) => e.type === 'fork');
|
|
1069
|
-
expect(forkEvent?.attrs?.parent_run).toBe(first.runId);
|
|
1070
|
-
expect(forkEvent?.attrs?.fork_point).toBe(checkpoint.seq);
|
|
1071
|
-
});
|
|
1072
|
-
|
|
1073
|
-
it('records the filesystem as a fork runs, so a fork can be forked again', async () => {
|
|
1074
|
-
// A fork used to record only the conversation. A checkpoint is derived from a snapshot
|
|
1075
|
-
// (spec §3), so a fork had no checkpoints and could not be forked — and `agenticreplay compare last`
|
|
1076
|
-
// straight after a fork failed with "this run has no checkpoints", because `last` resolves to
|
|
1077
|
-
// the fork. A branch you cannot branch again is a dead end one step in.
|
|
1078
|
-
const recorded = await record();
|
|
1079
|
-
const checkpoints = deriveCheckpoints(await (await TraceReader.open(recorded.runDir)).events());
|
|
1080
|
-
const first = await replayCommand(
|
|
1081
|
-
parseArgs([
|
|
1082
|
-
'replay',
|
|
1083
|
-
'last',
|
|
1084
|
-
'--from',
|
|
1085
|
-
String(checkpoints[0]!.seq),
|
|
1086
|
-
'--model',
|
|
1087
|
-
'glm-5.3-flash',
|
|
1088
|
-
'--upstream-anthropic',
|
|
1089
|
-
model.url,
|
|
1090
|
-
]),
|
|
1091
|
-
out,
|
|
1092
|
-
workspace,
|
|
1093
|
-
);
|
|
1094
|
-
|
|
1095
|
-
const forkDir = (await resolveRunSelector(workspace, first.forkRunId!)).dir;
|
|
1096
|
-
const forkEvents = await (await TraceReader.open(forkDir)).events();
|
|
1097
|
-
expect(
|
|
1098
|
-
forkEvents.filter((e) => e.type === 'fs.snapshot').length,
|
|
1099
|
-
'the fork recorded no filesystem snapshot',
|
|
1100
|
-
).toBeGreaterThan(0);
|
|
1101
|
-
|
|
1102
|
-
const forkCheckpoints = deriveCheckpoints(forkEvents);
|
|
1103
|
-
expect(forkCheckpoints.length, 'a fork with no checkpoints cannot be forked').toBeGreaterThan(
|
|
1104
|
-
0,
|
|
1105
|
-
);
|
|
1106
|
-
|
|
1107
|
-
// And the property that actually matters: forking it works.
|
|
1108
|
-
const second = await replayCommand(
|
|
1109
|
-
parseArgs([
|
|
1110
|
-
'replay',
|
|
1111
|
-
first.forkRunId!,
|
|
1112
|
-
'--from',
|
|
1113
|
-
String(forkCheckpoints[0]!.seq),
|
|
1114
|
-
'--model',
|
|
1115
|
-
'claude-haiku-4-5',
|
|
1116
|
-
'--upstream-anthropic',
|
|
1117
|
-
model.url,
|
|
1118
|
-
]),
|
|
1119
|
-
out,
|
|
1120
|
-
workspace,
|
|
1121
|
-
);
|
|
1122
|
-
expect(second.forkRunId).toBeDefined();
|
|
1123
|
-
expect(second.forkRunId).not.toBe(first.forkRunId);
|
|
1124
|
-
expect(second.exitCode, 'the twice-forked agent must actually run').toBe(0);
|
|
1125
|
-
});
|
|
1126
|
-
|
|
1127
|
-
it('lists both runs afterwards, newest first', async () => {
|
|
1128
|
-
await record();
|
|
1129
|
-
const before = (await listRuns(workspace)).length;
|
|
1130
|
-
const events = await (await TraceReader.open((await listRuns(workspace))[0]!.dir)).events();
|
|
1131
|
-
await replayCommand(
|
|
1132
|
-
parseArgs([
|
|
1133
|
-
'replay',
|
|
1134
|
-
'last',
|
|
1135
|
-
'--from',
|
|
1136
|
-
String(deriveCheckpoints(events)[0]!.seq),
|
|
1137
|
-
'--upstream-anthropic',
|
|
1138
|
-
model.url,
|
|
1139
|
-
]),
|
|
1140
|
-
out,
|
|
1141
|
-
workspace,
|
|
1142
|
-
);
|
|
1143
|
-
expect((await listRuns(workspace)).length).toBe(before + 1);
|
|
1144
|
-
});
|
|
1145
|
-
|
|
1146
|
-
it('never writes the agent api key into the trace', async () => {
|
|
1147
|
-
process.env.ANTHROPIC_API_KEY = 'sk-e2e-secret-key-should-never-appear-anywhere';
|
|
1148
|
-
try {
|
|
1149
|
-
const result = await record();
|
|
1150
|
-
const raw = await readFile(join(result.runDir, 'events.jsonl'), 'utf8');
|
|
1151
|
-
expect(raw).not.toContain('sk-e2e-secret-key-should-never-appear-anywhere');
|
|
1152
|
-
const manifest = await readFile(join(result.runDir, 'manifest.json'), 'utf8');
|
|
1153
|
-
expect(manifest).not.toContain('sk-e2e-secret-key-should-never-appear-anywhere');
|
|
1154
|
-
} finally {
|
|
1155
|
-
delete process.env.ANTHROPIC_API_KEY;
|
|
1156
|
-
}
|
|
1157
|
-
});
|
|
1158
|
-
|
|
1159
|
-
/**
|
|
1160
|
-
* The edges that make a run answerable in one hop rather than by reading every line. Asserted
|
|
1161
|
-
* against a real recording rather than a fixture, because the seq resolution happens in the
|
|
1162
|
-
* recorder and a unit test of the deriver cannot see it.
|
|
1163
|
-
*/
|
|
1164
|
-
describe('causal edges', () => {
|
|
1165
|
-
it('points each tool.call at the model.response that emitted it', async () => {
|
|
1166
|
-
const result = await record();
|
|
1167
|
-
const events = await (await TraceReader.open(result.runDir)).events();
|
|
1168
|
-
const bySeq = new Map(events.map((e) => [e.seq, e]));
|
|
1169
|
-
const calls = events.filter((e) => e.type === 'tool.call');
|
|
1170
|
-
|
|
1171
|
-
expect(calls.length).toBeGreaterThan(0);
|
|
1172
|
-
for (const call of calls) {
|
|
1173
|
-
expect(call.causes, `tool.call seq ${call.seq} names no cause`).toHaveLength(1);
|
|
1174
|
-
expect(bySeq.get(call.causes![0]!)?.type).toBe('model.response');
|
|
1175
|
-
}
|
|
1176
|
-
});
|
|
1177
|
-
|
|
1178
|
-
it('points a model.request at the tool.result it carried back', async () => {
|
|
1179
|
-
const result = await record();
|
|
1180
|
-
const events = await (await TraceReader.open(result.runDir)).events();
|
|
1181
|
-
const bySeq = new Map(events.map((e) => [e.seq, e]));
|
|
1182
|
-
const carrying = events.filter((e) => e.type === 'model.request' && e.causes?.length);
|
|
1183
|
-
|
|
1184
|
-
expect(carrying.length).toBeGreaterThan(0);
|
|
1185
|
-
for (const request of carrying) {
|
|
1186
|
-
for (const cause of request.causes ?? []) {
|
|
1187
|
-
expect(bySeq.get(cause)?.type).toBe('tool.result');
|
|
1188
|
-
}
|
|
1189
|
-
}
|
|
1190
|
-
});
|
|
1191
|
-
|
|
1192
|
-
it('keeps every edge pointing backwards, as spec §2.1 requires of causes', async () => {
|
|
1193
|
-
const result = await record();
|
|
1194
|
-
const events = await (await TraceReader.open(result.runDir)).events();
|
|
1195
|
-
for (const event of events) {
|
|
1196
|
-
for (const cause of event.causes ?? []) expect(cause).toBeLessThan(event.seq);
|
|
1197
|
-
}
|
|
1198
|
-
});
|
|
1199
|
-
|
|
1200
|
-
it('derives the tool call behind a file change without writing that edge to the trace', async () => {
|
|
1201
|
-
const result = await record();
|
|
1202
|
-
const events = await (await TraceReader.open(result.runDir)).events();
|
|
1203
|
-
|
|
1204
|
-
// The recorder must not have written it: a snapshot is per turn, so this is a guess.
|
|
1205
|
-
for (const change of events.filter((e) => e.type === 'fs.change')) {
|
|
1206
|
-
expect(change.causes).toBeUndefined();
|
|
1207
|
-
}
|
|
1208
|
-
|
|
1209
|
-
// The reader derives it anyway, and says that it did.
|
|
1210
|
-
const inferred = runGraph(events).edges.filter((e) => e.kind === 'inferred');
|
|
1211
|
-
expect(inferred.length).toBeGreaterThan(0);
|
|
1212
|
-
const bySeq = new Map(events.map((e) => [e.seq, e]));
|
|
1213
|
-
for (const edge of inferred) {
|
|
1214
|
-
expect(bySeq.get(edge.from)?.type).toBe('tool.call');
|
|
1215
|
-
expect(edge.rule).not.toBe('');
|
|
1216
|
-
}
|
|
1217
|
-
});
|
|
1218
|
-
|
|
1219
|
-
it('walks from a file change back to the model turn that caused it', async () => {
|
|
1220
|
-
const result = await record();
|
|
1221
|
-
const events = await (await TraceReader.open(result.runDir)).events();
|
|
1222
|
-
const change = events.find((e) => e.type === 'fs.change');
|
|
1223
|
-
expect(change).toBeDefined();
|
|
1224
|
-
|
|
1225
|
-
const chain = chainTo(runGraph(events), change!.seq).nodes.map((n) => n.type);
|
|
1226
|
-
expect(chain).toContain('tool.call');
|
|
1227
|
-
expect(chain).toContain('model.response');
|
|
1228
|
-
});
|
|
1229
|
-
});
|
|
1230
|
-
});
|