@ai-agent-forge/agent-forge 0.85.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +5969 -0
- package/README.md +629 -0
- package/dist/artifacts/artifact-store.d.ts +51 -0
- package/dist/artifacts/artifact-store.d.ts.map +1 -0
- package/dist/artifacts/artifact-store.js +87 -0
- package/dist/artifacts/artifact-store.js.map +1 -0
- package/dist/artifacts/paged-read.d.ts +51 -0
- package/dist/artifacts/paged-read.d.ts.map +1 -0
- package/dist/artifacts/paged-read.js +55 -0
- package/dist/artifacts/paged-read.js.map +1 -0
- package/dist/bun/cli.d.ts +3 -0
- package/dist/bun/cli.d.ts.map +1 -0
- package/dist/bun/cli.js +11 -0
- package/dist/bun/cli.js.map +1 -0
- package/dist/bun/register-bedrock.d.ts +2 -0
- package/dist/bun/register-bedrock.d.ts.map +1 -0
- package/dist/bun/register-bedrock.js +4 -0
- package/dist/bun/register-bedrock.js.map +1 -0
- package/dist/bun/restore-sandbox-env.d.ts +17 -0
- package/dist/bun/restore-sandbox-env.d.ts.map +1 -0
- package/dist/bun/restore-sandbox-env.js +36 -0
- package/dist/bun/restore-sandbox-env.js.map +1 -0
- package/dist/bundle/.build-manifest.json +3566 -0
- package/dist/bundle/chunks/anthropic-messages-RJYU4TCY.js +6 -0
- package/dist/bundle/chunks/anthropic.js +75 -0
- package/dist/bundle/chunks/azure-openai-responses-LESTCUL7.js +2 -0
- package/dist/bundle/chunks/bedrock-converse-stream.js +78 -0
- package/dist/bundle/chunks/chunk-3QKHSPQL.js +8 -0
- package/dist/bundle/chunks/chunk-4L3WN2XY.js +2 -0
- package/dist/bundle/chunks/chunk-4NKZMFSZ.js +1579 -0
- package/dist/bundle/chunks/chunk-6CYCI3EJ.js +12 -0
- package/dist/bundle/chunks/chunk-6R7UI4IY.js +2 -0
- package/dist/bundle/chunks/chunk-7ZC4UXSL.js +2 -0
- package/dist/bundle/chunks/chunk-7ZY7IXZD.js +4 -0
- package/dist/bundle/chunks/chunk-DRQDKNXA.js +2 -0
- package/dist/bundle/chunks/chunk-DTD7JQ7Y.js +42 -0
- package/dist/bundle/chunks/chunk-EWXX34QG.js +2 -0
- package/dist/bundle/chunks/chunk-GMWCTUPB.js +2 -0
- package/dist/bundle/chunks/chunk-JUUC5AZY.js +2 -0
- package/dist/bundle/chunks/chunk-KQEGUM34.js +2 -0
- package/dist/bundle/chunks/chunk-L2ZPNLYD.js +2 -0
- package/dist/bundle/chunks/chunk-MDOTREMR.js +11 -0
- package/dist/bundle/chunks/chunk-NUHFSC37.js +25 -0
- package/dist/bundle/chunks/chunk-PGXDEOVV.js +2 -0
- package/dist/bundle/chunks/chunk-PJACZCIR.js +2 -0
- package/dist/bundle/chunks/chunk-PRRNXB7S.js +2 -0
- package/dist/bundle/chunks/chunk-SER2HCLE.js +38 -0
- package/dist/bundle/chunks/chunk-TEPMHNKQ.js +2 -0
- package/dist/bundle/chunks/chunk-V46XUTK3.js +2 -0
- package/dist/bundle/chunks/chunk-WGLBM2BP.js +2 -0
- package/dist/bundle/chunks/chunk-WW3LMV3F.js +2 -0
- package/dist/bundle/chunks/chunk-XDUWOHPL.js +6 -0
- package/dist/bundle/chunks/github-copilot.js +2 -0
- package/dist/bundle/chunks/google-generative-ai-NZ66X6K7.js +2 -0
- package/dist/bundle/chunks/google-vertex-2ZZOFBNQ.js +2 -0
- package/dist/bundle/chunks/https-proxy-agent-UDEHOBGS.js +13 -0
- package/dist/bundle/chunks/image-resize-worker.js +2 -0
- package/dist/bundle/chunks/kimi-coding.js +2 -0
- package/dist/bundle/chunks/lib-HGQMNYVT.js +9 -0
- package/dist/bundle/chunks/mistral-conversations-B6DZRMEK.js +5 -0
- package/dist/bundle/chunks/multipart-parser-SQ6GDJL7.js +3 -0
- package/dist/bundle/chunks/node-O3RIBJRH.js +16 -0
- package/dist/bundle/chunks/node-TWVVAGPO.js +2 -0
- package/dist/bundle/chunks/openai-codex-responses-UFH6O5K6.js +10 -0
- package/dist/bundle/chunks/openai-codex.js +75 -0
- package/dist/bundle/chunks/openai-completions-A55GHA4O.js +7 -0
- package/dist/bundle/chunks/openai-responses-TJLXRAXR.js +2 -0
- package/dist/bundle/chunks/openrouter-images-G3GT5BVT.js +2 -0
- package/dist/bundle/chunks/openrouter.js +75 -0
- package/dist/bundle/chunks/pi-messages-SLF355GF.js +8 -0
- package/dist/bundle/chunks/radius.js +75 -0
- package/dist/bundle/chunks/src-UK77SYZE.js +4 -0
- package/dist/bundle/chunks/xai.js +2 -0
- package/dist/bundle/cli.js +3 -0
- package/dist/bundle/client.js +2 -0
- package/dist/bundle/index.js +8 -0
- package/dist/bundle/rpc-entry.js +3 -0
- package/dist/capabilities/builtin.d.ts +46 -0
- package/dist/capabilities/builtin.d.ts.map +1 -0
- package/dist/capabilities/builtin.js +68 -0
- package/dist/capabilities/builtin.js.map +1 -0
- package/dist/cli/args.d.ts +102 -0
- package/dist/cli/args.d.ts.map +1 -0
- package/dist/cli/args.js +712 -0
- package/dist/cli/args.js.map +1 -0
- package/dist/cli/auth-check.d.ts +19 -0
- package/dist/cli/auth-check.d.ts.map +1 -0
- package/dist/cli/auth-check.js +50 -0
- package/dist/cli/auth-check.js.map +1 -0
- package/dist/cli/auth-command.d.ts +24 -0
- package/dist/cli/auth-command.d.ts.map +1 -0
- package/dist/cli/auth-command.js +102 -0
- package/dist/cli/auth-command.js.map +1 -0
- package/dist/cli/config-selector.d.ts +23 -0
- package/dist/cli/config-selector.d.ts.map +1 -0
- package/dist/cli/config-selector.js +51 -0
- package/dist/cli/config-selector.js.map +1 -0
- package/dist/cli/credential-print.d.ts +13 -0
- package/dist/cli/credential-print.d.ts.map +1 -0
- package/dist/cli/credential-print.js +76 -0
- package/dist/cli/credential-print.js.map +1 -0
- package/dist/cli/experimental/auth.d.ts +16 -0
- package/dist/cli/experimental/auth.d.ts.map +1 -0
- package/dist/cli/experimental/auth.js +13 -0
- package/dist/cli/experimental/auth.js.map +1 -0
- package/dist/cli/experimental/cli.d.ts +6 -0
- package/dist/cli/experimental/cli.d.ts.map +1 -0
- package/dist/cli/experimental/cli.js +5 -0
- package/dist/cli/experimental/cli.js.map +1 -0
- package/dist/cli/experimental/command-options.d.ts +17 -0
- package/dist/cli/experimental/command-options.d.ts.map +1 -0
- package/dist/cli/experimental/command-options.js +35 -0
- package/dist/cli/experimental/command-options.js.map +1 -0
- package/dist/cli/experimental/command.d.ts +63 -0
- package/dist/cli/experimental/command.d.ts.map +1 -0
- package/dist/cli/experimental/command.js +130 -0
- package/dist/cli/experimental/command.js.map +1 -0
- package/dist/cli/experimental/commands/client.d.ts +13 -0
- package/dist/cli/experimental/commands/client.d.ts.map +1 -0
- package/dist/cli/experimental/commands/client.js +25 -0
- package/dist/cli/experimental/commands/client.js.map +1 -0
- package/dist/cli/experimental/commands/pi.d.ts +15 -0
- package/dist/cli/experimental/commands/pi.d.ts.map +1 -0
- package/dist/cli/experimental/commands/pi.js +26 -0
- package/dist/cli/experimental/commands/pi.js.map +1 -0
- package/dist/cli/experimental/commands/server.d.ts +13 -0
- package/dist/cli/experimental/commands/server.d.ts.map +1 -0
- package/dist/cli/experimental/commands/server.js +25 -0
- package/dist/cli/experimental/commands/server.js.map +1 -0
- package/dist/cli/experimental/transport-address.d.ts +10 -0
- package/dist/cli/experimental/transport-address.d.ts.map +1 -0
- package/dist/cli/experimental/transport-address.js +38 -0
- package/dist/cli/experimental/transport-address.js.map +1 -0
- package/dist/cli/file-processor.d.ts +15 -0
- package/dist/cli/file-processor.d.ts.map +1 -0
- package/dist/cli/file-processor.js +71 -0
- package/dist/cli/file-processor.js.map +1 -0
- package/dist/cli/initial-message.d.ts +18 -0
- package/dist/cli/initial-message.d.ts.map +1 -0
- package/dist/cli/initial-message.js +22 -0
- package/dist/cli/initial-message.js.map +1 -0
- package/dist/cli/list-models.d.ts +9 -0
- package/dist/cli/list-models.d.ts.map +1 -0
- package/dist/cli/list-models.js +98 -0
- package/dist/cli/list-models.js.map +1 -0
- package/dist/cli/plugin-command.d.ts +50 -0
- package/dist/cli/plugin-command.d.ts.map +1 -0
- package/dist/cli/plugin-command.js +85 -0
- package/dist/cli/plugin-command.js.map +1 -0
- package/dist/cli/plugin-manager-controller.d.ts +59 -0
- package/dist/cli/plugin-manager-controller.d.ts.map +1 -0
- package/dist/cli/plugin-manager-controller.js +183 -0
- package/dist/cli/plugin-manager-controller.js.map +1 -0
- package/dist/cli/plugin-selection-controller.d.ts +57 -0
- package/dist/cli/plugin-selection-controller.d.ts.map +1 -0
- package/dist/cli/plugin-selection-controller.js +159 -0
- package/dist/cli/plugin-selection-controller.js.map +1 -0
- package/dist/cli/serve.d.ts +39 -0
- package/dist/cli/serve.d.ts.map +1 -0
- package/dist/cli/serve.js +124 -0
- package/dist/cli/serve.js.map +1 -0
- package/dist/cli/session-picker.d.ts +30 -0
- package/dist/cli/session-picker.d.ts.map +1 -0
- package/dist/cli/session-picker.js +62 -0
- package/dist/cli/session-picker.js.map +1 -0
- package/dist/cli/startup-ui.d.ts +20 -0
- package/dist/cli/startup-ui.d.ts.map +1 -0
- package/dist/cli/startup-ui.js +185 -0
- package/dist/cli/startup-ui.js.map +1 -0
- package/dist/cli/trace-view.d.ts +86 -0
- package/dist/cli/trace-view.d.ts.map +1 -0
- package/dist/cli/trace-view.js +263 -0
- package/dist/cli/trace-view.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +19 -0
- package/dist/cli.js.map +1 -0
- package/dist/client/index.d.ts +3 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +3 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/remote-session.d.ts +53 -0
- package/dist/client/remote-session.d.ts.map +1 -0
- package/dist/client/remote-session.js +340 -0
- package/dist/client/remote-session.js.map +1 -0
- package/dist/client/transcript.d.ts +12 -0
- package/dist/client/transcript.d.ts.map +1 -0
- package/dist/client/transcript.js +98 -0
- package/dist/client/transcript.js.map +1 -0
- package/dist/config.d.ts +95 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +459 -0
- package/dist/config.js.map +1 -0
- package/dist/core/agent-capability-contract.d.ts +322 -0
- package/dist/core/agent-capability-contract.d.ts.map +1 -0
- package/dist/core/agent-capability-contract.js +1154 -0
- package/dist/core/agent-capability-contract.js.map +1 -0
- package/dist/core/agent-session-bash.d.ts +51 -0
- package/dist/core/agent-session-bash.d.ts.map +1 -0
- package/dist/core/agent-session-bash.js +138 -0
- package/dist/core/agent-session-bash.js.map +1 -0
- package/dist/core/agent-session-compaction.d.ts +188 -0
- package/dist/core/agent-session-compaction.d.ts.map +1 -0
- package/dist/core/agent-session-compaction.js +1071 -0
- package/dist/core/agent-session-compaction.js.map +1 -0
- package/dist/core/agent-session-context.d.ts +43 -0
- package/dist/core/agent-session-context.d.ts.map +1 -0
- package/dist/core/agent-session-context.js +170 -0
- package/dist/core/agent-session-context.js.map +1 -0
- package/dist/core/agent-session-extensions.d.ts +30 -0
- package/dist/core/agent-session-extensions.d.ts.map +1 -0
- package/dist/core/agent-session-extensions.js +74 -0
- package/dist/core/agent-session-extensions.js.map +1 -0
- package/dist/core/agent-session-internal.d.ts +290 -0
- package/dist/core/agent-session-internal.d.ts.map +1 -0
- package/dist/core/agent-session-internal.js +40 -0
- package/dist/core/agent-session-internal.js.map +1 -0
- package/dist/core/agent-session-lifecycle.d.ts +242 -0
- package/dist/core/agent-session-lifecycle.d.ts.map +1 -0
- package/dist/core/agent-session-lifecycle.js +699 -0
- package/dist/core/agent-session-lifecycle.js.map +1 -0
- package/dist/core/agent-session-loop-runner.d.ts +52 -0
- package/dist/core/agent-session-loop-runner.d.ts.map +1 -0
- package/dist/core/agent-session-loop-runner.js +168 -0
- package/dist/core/agent-session-loop-runner.js.map +1 -0
- package/dist/core/agent-session-loop.d.ts +39 -0
- package/dist/core/agent-session-loop.d.ts.map +1 -0
- package/dist/core/agent-session-loop.js +155 -0
- package/dist/core/agent-session-loop.js.map +1 -0
- package/dist/core/agent-session-model.d.ts +49 -0
- package/dist/core/agent-session-model.d.ts.map +1 -0
- package/dist/core/agent-session-model.js +155 -0
- package/dist/core/agent-session-model.js.map +1 -0
- package/dist/core/agent-session-paths.d.ts +3 -0
- package/dist/core/agent-session-paths.d.ts.map +1 -0
- package/dist/core/agent-session-paths.js +14 -0
- package/dist/core/agent-session-paths.js.map +1 -0
- package/dist/core/agent-session-projection.d.ts +53 -0
- package/dist/core/agent-session-projection.d.ts.map +1 -0
- package/dist/core/agent-session-projection.js +195 -0
- package/dist/core/agent-session-projection.js.map +1 -0
- package/dist/core/agent-session-retry.d.ts +28 -0
- package/dist/core/agent-session-retry.d.ts.map +1 -0
- package/dist/core/agent-session-retry.js +141 -0
- package/dist/core/agent-session-retry.js.map +1 -0
- package/dist/core/agent-session-runtime.d.ts +181 -0
- package/dist/core/agent-session-runtime.d.ts.map +1 -0
- package/dist/core/agent-session-runtime.js +297 -0
- package/dist/core/agent-session-runtime.js.map +1 -0
- package/dist/core/agent-session-services.d.ts +281 -0
- package/dist/core/agent-session-services.d.ts.map +1 -0
- package/dist/core/agent-session-services.js +680 -0
- package/dist/core/agent-session-services.js.map +1 -0
- package/dist/core/agent-session-store.d.ts +47 -0
- package/dist/core/agent-session-store.d.ts.map +1 -0
- package/dist/core/agent-session-store.js +155 -0
- package/dist/core/agent-session-store.js.map +1 -0
- package/dist/core/agent-session-tools.d.ts +36 -0
- package/dist/core/agent-session-tools.d.ts.map +1 -0
- package/dist/core/agent-session-tools.js +305 -0
- package/dist/core/agent-session-tools.js.map +1 -0
- package/dist/core/agent-session.d.ts +1156 -0
- package/dist/core/agent-session.d.ts.map +1 -0
- package/dist/core/agent-session.js +2550 -0
- package/dist/core/agent-session.js.map +1 -0
- package/dist/core/auth-guidance.d.ts +5 -0
- package/dist/core/auth-guidance.d.ts.map +1 -0
- package/dist/core/auth-guidance.js +21 -0
- package/dist/core/auth-guidance.js.map +1 -0
- package/dist/core/auth-storage.d.ts +72 -0
- package/dist/core/auth-storage.d.ts.map +1 -0
- package/dist/core/auth-storage.js +426 -0
- package/dist/core/auth-storage.js.map +1 -0
- package/dist/core/bash-executor.d.ts +32 -0
- package/dist/core/bash-executor.d.ts.map +1 -0
- package/dist/core/bash-executor.js +111 -0
- package/dist/core/bash-executor.js.map +1 -0
- package/dist/core/cache-stats.d.ts +49 -0
- package/dist/core/cache-stats.d.ts.map +1 -0
- package/dist/core/cache-stats.js +101 -0
- package/dist/core/cache-stats.js.map +1 -0
- package/dist/core/compaction/branch-summarization.d.ts +88 -0
- package/dist/core/compaction/branch-summarization.d.ts.map +1 -0
- package/dist/core/compaction/branch-summarization.js +220 -0
- package/dist/core/compaction/branch-summarization.js.map +1 -0
- package/dist/core/compaction/compaction.d.ts +178 -0
- package/dist/core/compaction/compaction.d.ts.map +1 -0
- package/dist/core/compaction/compaction.js +608 -0
- package/dist/core/compaction/compaction.js.map +1 -0
- package/dist/core/compaction/index.d.ts +7 -0
- package/dist/core/compaction/index.d.ts.map +1 -0
- package/dist/core/compaction/index.js +7 -0
- package/dist/core/compaction/index.js.map +1 -0
- package/dist/core/compaction/utils.d.ts +49 -0
- package/dist/core/compaction/utils.d.ts.map +1 -0
- package/dist/core/compaction/utils.js +170 -0
- package/dist/core/compaction/utils.js.map +1 -0
- package/dist/core/defaults.d.ts +4 -0
- package/dist/core/defaults.d.ts.map +1 -0
- package/dist/core/defaults.js +11 -0
- package/dist/core/defaults.js.map +1 -0
- package/dist/core/diagnostics.d.ts +15 -0
- package/dist/core/diagnostics.d.ts.map +1 -0
- package/dist/core/diagnostics.js +2 -0
- package/dist/core/diagnostics.js.map +1 -0
- package/dist/core/embedded-sdk.d.ts +96 -0
- package/dist/core/embedded-sdk.d.ts.map +1 -0
- package/dist/core/embedded-sdk.js +395 -0
- package/dist/core/embedded-sdk.js.map +1 -0
- package/dist/core/event-bus.d.ts +9 -0
- package/dist/core/event-bus.d.ts.map +1 -0
- package/dist/core/event-bus.js +25 -0
- package/dist/core/event-bus.js.map +1 -0
- package/dist/core/exec.d.ts +29 -0
- package/dist/core/exec.d.ts.map +1 -0
- package/dist/core/exec.js +75 -0
- package/dist/core/exec.js.map +1 -0
- package/dist/core/experimental.d.ts +2 -0
- package/dist/core/experimental.d.ts.map +1 -0
- package/dist/core/experimental.js +6 -0
- package/dist/core/experimental.js.map +1 -0
- package/dist/core/export-html/ansi-to-html.d.ts +22 -0
- package/dist/core/export-html/ansi-to-html.d.ts.map +1 -0
- package/dist/core/export-html/ansi-to-html.js +249 -0
- package/dist/core/export-html/ansi-to-html.js.map +1 -0
- package/dist/core/export-html/index.d.ts +37 -0
- package/dist/core/export-html/index.d.ts.map +1 -0
- package/dist/core/export-html/index.js +226 -0
- package/dist/core/export-html/index.js.map +1 -0
- package/dist/core/export-html/template.css +1066 -0
- package/dist/core/export-html/template.html +55 -0
- package/dist/core/export-html/template.js +1864 -0
- package/dist/core/export-html/tool-renderer.d.ts +34 -0
- package/dist/core/export-html/tool-renderer.d.ts.map +1 -0
- package/dist/core/export-html/tool-renderer.js +108 -0
- package/dist/core/export-html/tool-renderer.js.map +1 -0
- package/dist/core/export-html/vendor/highlight.min.js +1213 -0
- package/dist/core/export-html/vendor/marked.min.js +78 -0
- package/dist/core/extensions/agent-composition.d.ts +67 -0
- package/dist/core/extensions/agent-composition.d.ts.map +1 -0
- package/dist/core/extensions/agent-composition.js +785 -0
- package/dist/core/extensions/agent-composition.js.map +1 -0
- package/dist/core/extensions/bootstrap-agent-loop.d.ts +203 -0
- package/dist/core/extensions/bootstrap-agent-loop.d.ts.map +1 -0
- package/dist/core/extensions/bootstrap-agent-loop.js +565 -0
- package/dist/core/extensions/bootstrap-agent-loop.js.map +1 -0
- package/dist/core/extensions/bootstrap-branch-summary-policy.d.ts +7 -0
- package/dist/core/extensions/bootstrap-branch-summary-policy.d.ts.map +1 -0
- package/dist/core/extensions/bootstrap-branch-summary-policy.js +28 -0
- package/dist/core/extensions/bootstrap-branch-summary-policy.js.map +1 -0
- package/dist/core/extensions/bootstrap-compaction-policy.d.ts +7 -0
- package/dist/core/extensions/bootstrap-compaction-policy.d.ts.map +1 -0
- package/dist/core/extensions/bootstrap-compaction-policy.js +81 -0
- package/dist/core/extensions/bootstrap-compaction-policy.js.map +1 -0
- package/dist/core/extensions/bootstrap-lifecycle.d.ts +26 -0
- package/dist/core/extensions/bootstrap-lifecycle.d.ts.map +1 -0
- package/dist/core/extensions/bootstrap-lifecycle.js +181 -0
- package/dist/core/extensions/bootstrap-lifecycle.js.map +1 -0
- package/dist/core/extensions/bootstrap-overflow-policy.d.ts +7 -0
- package/dist/core/extensions/bootstrap-overflow-policy.d.ts.map +1 -0
- package/dist/core/extensions/bootstrap-overflow-policy.js +29 -0
- package/dist/core/extensions/bootstrap-overflow-policy.js.map +1 -0
- package/dist/core/extensions/bootstrap-retry-policy.d.ts +7 -0
- package/dist/core/extensions/bootstrap-retry-policy.d.ts.map +1 -0
- package/dist/core/extensions/bootstrap-retry-policy.js +28 -0
- package/dist/core/extensions/bootstrap-retry-policy.js.map +1 -0
- package/dist/core/extensions/bootstrap-skills.d.ts +16 -0
- package/dist/core/extensions/bootstrap-skills.d.ts.map +1 -0
- package/dist/core/extensions/bootstrap-skills.js +119 -0
- package/dist/core/extensions/bootstrap-skills.js.map +1 -0
- package/dist/core/extensions/bootstrap-tools.d.ts +20 -0
- package/dist/core/extensions/bootstrap-tools.d.ts.map +1 -0
- package/dist/core/extensions/bootstrap-tools.js +35 -0
- package/dist/core/extensions/bootstrap-tools.js.map +1 -0
- package/dist/core/extensions/capability-exports.d.ts +5 -0
- package/dist/core/extensions/capability-exports.d.ts.map +1 -0
- package/dist/core/extensions/capability-exports.js +4 -0
- package/dist/core/extensions/capability-exports.js.map +1 -0
- package/dist/core/extensions/capability-plugin.d.ts +69 -0
- package/dist/core/extensions/capability-plugin.d.ts.map +1 -0
- package/dist/core/extensions/capability-plugin.js +485 -0
- package/dist/core/extensions/capability-plugin.js.map +1 -0
- package/dist/core/extensions/capability-runtime-events.d.ts +22 -0
- package/dist/core/extensions/capability-runtime-events.d.ts.map +1 -0
- package/dist/core/extensions/capability-runtime-events.js +381 -0
- package/dist/core/extensions/capability-runtime-events.js.map +1 -0
- package/dist/core/extensions/capability-runtime-guards.d.ts +93 -0
- package/dist/core/extensions/capability-runtime-guards.d.ts.map +1 -0
- package/dist/core/extensions/capability-runtime-guards.js +800 -0
- package/dist/core/extensions/capability-runtime-guards.js.map +1 -0
- package/dist/core/extensions/capability-runtime-inspect.d.ts +12 -0
- package/dist/core/extensions/capability-runtime-inspect.d.ts.map +1 -0
- package/dist/core/extensions/capability-runtime-inspect.js +106 -0
- package/dist/core/extensions/capability-runtime-inspect.js.map +1 -0
- package/dist/core/extensions/capability-runtime-manifest.d.ts +19 -0
- package/dist/core/extensions/capability-runtime-manifest.d.ts.map +1 -0
- package/dist/core/extensions/capability-runtime-manifest.js +218 -0
- package/dist/core/extensions/capability-runtime-manifest.js.map +1 -0
- package/dist/core/extensions/capability-runtime-operation.d.ts +26 -0
- package/dist/core/extensions/capability-runtime-operation.d.ts.map +1 -0
- package/dist/core/extensions/capability-runtime-operation.js +88 -0
- package/dist/core/extensions/capability-runtime-operation.js.map +1 -0
- package/dist/core/extensions/capability-runtime-snapshot.d.ts +11 -0
- package/dist/core/extensions/capability-runtime-snapshot.d.ts.map +1 -0
- package/dist/core/extensions/capability-runtime-snapshot.js +81 -0
- package/dist/core/extensions/capability-runtime-snapshot.js.map +1 -0
- package/dist/core/extensions/capability-runtime-store.d.ts +34 -0
- package/dist/core/extensions/capability-runtime-store.d.ts.map +1 -0
- package/dist/core/extensions/capability-runtime-store.js +153 -0
- package/dist/core/extensions/capability-runtime-store.js.map +1 -0
- package/dist/core/extensions/capability-runtime-tool.d.ts +10 -0
- package/dist/core/extensions/capability-runtime-tool.d.ts.map +1 -0
- package/dist/core/extensions/capability-runtime-tool.js +10 -0
- package/dist/core/extensions/capability-runtime-tool.js.map +1 -0
- package/dist/core/extensions/capability-runtime-types.d.ts +303 -0
- package/dist/core/extensions/capability-runtime-types.d.ts.map +1 -0
- package/dist/core/extensions/capability-runtime-types.js +2 -0
- package/dist/core/extensions/capability-runtime-types.js.map +1 -0
- package/dist/core/extensions/capability-runtime-validation.d.ts +35 -0
- package/dist/core/extensions/capability-runtime-validation.d.ts.map +1 -0
- package/dist/core/extensions/capability-runtime-validation.js +380 -0
- package/dist/core/extensions/capability-runtime-validation.js.map +1 -0
- package/dist/core/extensions/capability-runtime.d.ts +7 -0
- package/dist/core/extensions/capability-runtime.d.ts.map +1 -0
- package/dist/core/extensions/capability-runtime.js +2170 -0
- package/dist/core/extensions/capability-runtime.js.map +1 -0
- package/dist/core/extensions/compaction-memory-failure-mode.d.ts +43 -0
- package/dist/core/extensions/compaction-memory-failure-mode.d.ts.map +1 -0
- package/dist/core/extensions/compaction-memory-failure-mode.js +31 -0
- package/dist/core/extensions/compaction-memory-failure-mode.js.map +1 -0
- package/dist/core/extensions/context-strategy-binding.d.ts +12 -0
- package/dist/core/extensions/context-strategy-binding.d.ts.map +1 -0
- package/dist/core/extensions/context-strategy-binding.js +54 -0
- package/dist/core/extensions/context-strategy-binding.js.map +1 -0
- package/dist/core/extensions/index.d.ts +19 -0
- package/dist/core/extensions/index.d.ts.map +1 -0
- package/dist/core/extensions/index.js +18 -0
- package/dist/core/extensions/index.js.map +1 -0
- package/dist/core/extensions/lifecycle-catalog.d.ts +584 -0
- package/dist/core/extensions/lifecycle-catalog.d.ts.map +1 -0
- package/dist/core/extensions/lifecycle-catalog.js +1903 -0
- package/dist/core/extensions/lifecycle-catalog.js.map +1 -0
- package/dist/core/extensions/lifecycle-delivery-queue.d.ts +48 -0
- package/dist/core/extensions/lifecycle-delivery-queue.d.ts.map +1 -0
- package/dist/core/extensions/lifecycle-delivery-queue.js +164 -0
- package/dist/core/extensions/lifecycle-delivery-queue.js.map +1 -0
- package/dist/core/extensions/microcompact.d.ts +71 -0
- package/dist/core/extensions/microcompact.d.ts.map +1 -0
- package/dist/core/extensions/microcompact.js +123 -0
- package/dist/core/extensions/microcompact.js.map +1 -0
- package/dist/core/extensions/public-api.d.ts +10 -0
- package/dist/core/extensions/public-api.d.ts.map +1 -0
- package/dist/core/extensions/public-api.js +9 -0
- package/dist/core/extensions/public-api.js.map +1 -0
- package/dist/core/facade/coding-agent-facade.d.ts +338 -0
- package/dist/core/facade/coding-agent-facade.d.ts.map +1 -0
- package/dist/core/facade/coding-agent-facade.js +115 -0
- package/dist/core/facade/coding-agent-facade.js.map +1 -0
- package/dist/core/facade/coding-agent-runtime-facade.d.ts +115 -0
- package/dist/core/facade/coding-agent-runtime-facade.d.ts.map +1 -0
- package/dist/core/facade/coding-agent-runtime-facade.js +63 -0
- package/dist/core/facade/coding-agent-runtime-facade.js.map +1 -0
- package/dist/core/facade/index.d.ts +6 -0
- package/dist/core/facade/index.d.ts.map +1 -0
- package/dist/core/facade/index.js +3 -0
- package/dist/core/facade/index.js.map +1 -0
- package/dist/core/footer-data-provider.d.ts +57 -0
- package/dist/core/footer-data-provider.d.ts.map +1 -0
- package/dist/core/footer-data-provider.js +323 -0
- package/dist/core/footer-data-provider.js.map +1 -0
- package/dist/core/http-dispatcher.d.ts +22 -0
- package/dist/core/http-dispatcher.d.ts.map +1 -0
- package/dist/core/http-dispatcher.js +98 -0
- package/dist/core/http-dispatcher.js.map +1 -0
- package/dist/core/index.d.ts +19 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +13 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/input-source.d.ts +9 -0
- package/dist/core/input-source.d.ts.map +1 -0
- package/dist/core/input-source.js +2 -0
- package/dist/core/input-source.js.map +1 -0
- package/dist/core/keybindings.d.ts +442 -0
- package/dist/core/keybindings.d.ts.map +1 -0
- package/dist/core/keybindings.js +329 -0
- package/dist/core/keybindings.js.map +1 -0
- package/dist/core/logger.d.ts +107 -0
- package/dist/core/logger.d.ts.map +1 -0
- package/dist/core/logger.js +246 -0
- package/dist/core/logger.js.map +1 -0
- package/dist/core/messages.d.ts +85 -0
- package/dist/core/messages.d.ts.map +1 -0
- package/dist/core/messages.js +146 -0
- package/dist/core/messages.js.map +1 -0
- package/dist/core/model-config.d.ts +586 -0
- package/dist/core/model-config.d.ts.map +1 -0
- package/dist/core/model-config.js +258 -0
- package/dist/core/model-config.js.map +1 -0
- package/dist/core/model-registry.d.ts +49 -0
- package/dist/core/model-registry.d.ts.map +1 -0
- package/dist/core/model-registry.js +115 -0
- package/dist/core/model-registry.js.map +1 -0
- package/dist/core/model-resolver.d.ts +124 -0
- package/dist/core/model-resolver.d.ts.map +1 -0
- package/dist/core/model-resolver.js +590 -0
- package/dist/core/model-resolver.js.map +1 -0
- package/dist/core/model-runtime.d.ts +100 -0
- package/dist/core/model-runtime.d.ts.map +1 -0
- package/dist/core/model-runtime.js +598 -0
- package/dist/core/model-runtime.js.map +1 -0
- package/dist/core/models-store.d.ts +22 -0
- package/dist/core/models-store.d.ts.map +1 -0
- package/dist/core/models-store.js +115 -0
- package/dist/core/models-store.js.map +1 -0
- package/dist/core/output-guard.d.ts +7 -0
- package/dist/core/output-guard.d.ts.map +1 -0
- package/dist/core/output-guard.js +90 -0
- package/dist/core/output-guard.js.map +1 -0
- package/dist/core/package-install-host.d.ts +23 -0
- package/dist/core/package-install-host.d.ts.map +1 -0
- package/dist/core/package-install-host.js +202 -0
- package/dist/core/package-install-host.js.map +1 -0
- package/dist/core/package-manager.d.ts +93 -0
- package/dist/core/package-manager.d.ts.map +1 -0
- package/dist/core/package-manager.js +947 -0
- package/dist/core/package-manager.js.map +1 -0
- package/dist/core/package-process-runner.d.ts +4 -0
- package/dist/core/package-process-runner.d.ts.map +1 -0
- package/dist/core/package-process-runner.js +47 -0
- package/dist/core/package-process-runner.js.map +1 -0
- package/dist/core/package-resource-collection.d.ts +16 -0
- package/dist/core/package-resource-collection.d.ts.map +1 -0
- package/dist/core/package-resource-collection.js +300 -0
- package/dist/core/package-resource-collection.js.map +1 -0
- package/dist/core/package-resource-discovery.d.ts +33 -0
- package/dist/core/package-resource-discovery.d.ts.map +1 -0
- package/dist/core/package-resource-discovery.js +449 -0
- package/dist/core/package-resource-discovery.js.map +1 -0
- package/dist/core/package-source.d.ts +157 -0
- package/dist/core/package-source.d.ts.map +1 -0
- package/dist/core/package-source.js +179 -0
- package/dist/core/package-source.js.map +1 -0
- package/dist/core/pi-manifest.d.ts +7 -0
- package/dist/core/pi-manifest.d.ts.map +1 -0
- package/dist/core/pi-manifest.js +26 -0
- package/dist/core/pi-manifest.js.map +1 -0
- package/dist/core/prompt-templates.d.ts +54 -0
- package/dist/core/prompt-templates.d.ts.map +1 -0
- package/dist/core/prompt-templates.js +236 -0
- package/dist/core/prompt-templates.js.map +1 -0
- package/dist/core/provider-composer.d.ts +58 -0
- package/dist/core/provider-composer.d.ts.map +1 -0
- package/dist/core/provider-composer.js +403 -0
- package/dist/core/provider-composer.js.map +1 -0
- package/dist/core/radius.d.ts +2 -0
- package/dist/core/radius.d.ts.map +1 -0
- package/dist/core/radius.js +2 -0
- package/dist/core/radius.js.map +1 -0
- package/dist/core/remote-catalog-provider.d.ts +5 -0
- package/dist/core/remote-catalog-provider.d.ts.map +1 -0
- package/dist/core/remote-catalog-provider.js +121 -0
- package/dist/core/remote-catalog-provider.js.map +1 -0
- package/dist/core/resolve-config-value.d.ts +30 -0
- package/dist/core/resolve-config-value.d.ts.map +1 -0
- package/dist/core/resolve-config-value.js +247 -0
- package/dist/core/resolve-config-value.js.map +1 -0
- package/dist/core/resource-loader.d.ts +211 -0
- package/dist/core/resource-loader.d.ts.map +1 -0
- package/dist/core/resource-loader.js +687 -0
- package/dist/core/resource-loader.js.map +1 -0
- package/dist/core/runtime-credentials.d.ts +15 -0
- package/dist/core/runtime-credentials.d.ts.map +1 -0
- package/dist/core/runtime-credentials.js +39 -0
- package/dist/core/runtime-credentials.js.map +1 -0
- package/dist/core/sdk.d.ts +395 -0
- package/dist/core/sdk.d.ts.map +1 -0
- package/dist/core/sdk.js +1112 -0
- package/dist/core/sdk.js.map +1 -0
- package/dist/core/session-cwd.d.ts +19 -0
- package/dist/core/session-cwd.d.ts.map +1 -0
- package/dist/core/session-cwd.js +38 -0
- package/dist/core/session-cwd.js.map +1 -0
- package/dist/core/session-export.d.ts +7 -0
- package/dist/core/session-export.d.ts.map +1 -0
- package/dist/core/session-export.js +48 -0
- package/dist/core/session-export.js.map +1 -0
- package/dist/core/session-manager.d.ts +463 -0
- package/dist/core/session-manager.d.ts.map +1 -0
- package/dist/core/session-manager.js +1583 -0
- package/dist/core/session-manager.js.map +1 -0
- package/dist/core/session-start.d.ts +12 -0
- package/dist/core/session-start.d.ts.map +1 -0
- package/dist/core/session-start.js +2 -0
- package/dist/core/session-start.js.map +1 -0
- package/dist/core/session-storage.d.ts +130 -0
- package/dist/core/session-storage.d.ts.map +1 -0
- package/dist/core/session-storage.js +386 -0
- package/dist/core/session-storage.js.map +1 -0
- package/dist/core/settings-diagnostics.d.ts +9 -0
- package/dist/core/settings-diagnostics.d.ts.map +1 -0
- package/dist/core/settings-diagnostics.js +21 -0
- package/dist/core/settings-diagnostics.js.map +1 -0
- package/dist/core/settings-manager.d.ts +352 -0
- package/dist/core/settings-manager.d.ts.map +1 -0
- package/dist/core/settings-manager.js +987 -0
- package/dist/core/settings-manager.js.map +1 -0
- package/dist/core/skills.d.ts +60 -0
- package/dist/core/skills.d.ts.map +1 -0
- package/dist/core/skills.js +382 -0
- package/dist/core/skills.js.map +1 -0
- package/dist/core/slash-commands.d.ts +15 -0
- package/dist/core/slash-commands.d.ts.map +1 -0
- package/dist/core/slash-commands.js +33 -0
- package/dist/core/slash-commands.js.map +1 -0
- package/dist/core/source-info.d.ts +18 -0
- package/dist/core/source-info.d.ts.map +1 -0
- package/dist/core/source-info.js +19 -0
- package/dist/core/source-info.js.map +1 -0
- package/dist/core/system-prompt.d.ts +8 -0
- package/dist/core/system-prompt.d.ts.map +1 -0
- package/dist/core/system-prompt.js +137 -0
- package/dist/core/system-prompt.js.map +1 -0
- package/dist/core/timings.d.ts +11 -0
- package/dist/core/timings.d.ts.map +1 -0
- package/dist/core/timings.js +46 -0
- package/dist/core/timings.js.map +1 -0
- package/dist/core/tools/bash.d.ts +87 -0
- package/dist/core/tools/bash.d.ts.map +1 -0
- package/dist/core/tools/bash.js +409 -0
- package/dist/core/tools/bash.js.map +1 -0
- package/dist/core/tools/edit-diff.d.ts +110 -0
- package/dist/core/tools/edit-diff.d.ts.map +1 -0
- package/dist/core/tools/edit-diff.js +425 -0
- package/dist/core/tools/edit-diff.js.map +1 -0
- package/dist/core/tools/edit.d.ts +55 -0
- package/dist/core/tools/edit.d.ts.map +1 -0
- package/dist/core/tools/edit.js +305 -0
- package/dist/core/tools/edit.js.map +1 -0
- package/dist/core/tools/file-mutation-queue.d.ts +6 -0
- package/dist/core/tools/file-mutation-queue.d.ts.map +1 -0
- package/dist/core/tools/file-mutation-queue.js +52 -0
- package/dist/core/tools/file-mutation-queue.js.map +1 -0
- package/dist/core/tools/find.d.ts +42 -0
- package/dist/core/tools/find.d.ts.map +1 -0
- package/dist/core/tools/find.js +303 -0
- package/dist/core/tools/find.js.map +1 -0
- package/dist/core/tools/grep.d.ts +41 -0
- package/dist/core/tools/grep.d.ts.map +1 -0
- package/dist/core/tools/grep.js +309 -0
- package/dist/core/tools/grep.js.map +1 -0
- package/dist/core/tools/index.d.ts +44 -0
- package/dist/core/tools/index.d.ts.map +1 -0
- package/dist/core/tools/index.js +129 -0
- package/dist/core/tools/index.js.map +1 -0
- package/dist/core/tools/ls.d.ts +41 -0
- package/dist/core/tools/ls.d.ts.map +1 -0
- package/dist/core/tools/ls.js +173 -0
- package/dist/core/tools/ls.js.map +1 -0
- package/dist/core/tools/output-accumulator.d.ts +52 -0
- package/dist/core/tools/output-accumulator.d.ts.map +1 -0
- package/dist/core/tools/output-accumulator.js +184 -0
- package/dist/core/tools/output-accumulator.js.map +1 -0
- package/dist/core/tools/path-utils.d.ts +10 -0
- package/dist/core/tools/path-utils.d.ts.map +1 -0
- package/dist/core/tools/path-utils.js +99 -0
- package/dist/core/tools/path-utils.js.map +1 -0
- package/dist/core/tools/powershell.d.ts +16 -0
- package/dist/core/tools/powershell.d.ts.map +1 -0
- package/dist/core/tools/powershell.js +39 -0
- package/dist/core/tools/powershell.js.map +1 -0
- package/dist/core/tools/read.d.ts +39 -0
- package/dist/core/tools/read.d.ts.map +1 -0
- package/dist/core/tools/read.js +282 -0
- package/dist/core/tools/read.js.map +1 -0
- package/dist/core/tools/render-utils.d.ts +24 -0
- package/dist/core/tools/render-utils.d.ts.map +1 -0
- package/dist/core/tools/render-utils.js +65 -0
- package/dist/core/tools/render-utils.js.map +1 -0
- package/dist/core/tools/tool-definition-wrapper.d.ts +15 -0
- package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -0
- package/dist/core/tools/tool-definition-wrapper.js +36 -0
- package/dist/core/tools/tool-definition-wrapper.js.map +1 -0
- package/dist/core/tools/tool-definition.d.ts +123 -0
- package/dist/core/tools/tool-definition.d.ts.map +1 -0
- package/dist/core/tools/tool-definition.js +20 -0
- package/dist/core/tools/tool-definition.js.map +1 -0
- package/dist/core/tools/tool-search.d.ts +30 -0
- package/dist/core/tools/tool-search.d.ts.map +1 -0
- package/dist/core/tools/tool-search.js +99 -0
- package/dist/core/tools/tool-search.js.map +1 -0
- package/dist/core/tools/truncate.d.ts +70 -0
- package/dist/core/tools/truncate.d.ts.map +1 -0
- package/dist/core/tools/truncate.js +215 -0
- package/dist/core/tools/truncate.js.map +1 -0
- package/dist/core/tools/write.d.ts +30 -0
- package/dist/core/tools/write.d.ts.map +1 -0
- package/dist/core/tools/write.js +202 -0
- package/dist/core/tools/write.js.map +1 -0
- package/dist/core/trace-retention.d.ts +19 -0
- package/dist/core/trace-retention.d.ts.map +1 -0
- package/dist/core/trace-retention.js +91 -0
- package/dist/core/trace-retention.js.map +1 -0
- package/dist/core/usage-totals.d.ts +21 -0
- package/dist/core/usage-totals.d.ts.map +1 -0
- package/dist/core/usage-totals.js +53 -0
- package/dist/core/usage-totals.js.map +1 -0
- package/dist/durable/durable-service.d.ts +136 -0
- package/dist/durable/durable-service.d.ts.map +1 -0
- package/dist/durable/durable-service.js +710 -0
- package/dist/durable/durable-service.js.map +1 -0
- package/dist/e2e/stdio-launcher.d.ts +25 -0
- package/dist/e2e/stdio-launcher.d.ts.map +1 -0
- package/dist/e2e/stdio-launcher.js +244 -0
- package/dist/e2e/stdio-launcher.js.map +1 -0
- package/dist/host/agent-retry-scheduler.d.ts +65 -0
- package/dist/host/agent-retry-scheduler.d.ts.map +1 -0
- package/dist/host/agent-retry-scheduler.js +52 -0
- package/dist/host/agent-retry-scheduler.js.map +1 -0
- package/dist/host/auto-compaction.d.ts +56 -0
- package/dist/host/auto-compaction.d.ts.map +1 -0
- package/dist/host/auto-compaction.js +62 -0
- package/dist/host/auto-compaction.js.map +1 -0
- package/dist/host/branch-reload.d.ts +56 -0
- package/dist/host/branch-reload.d.ts.map +1 -0
- package/dist/host/branch-reload.js +39 -0
- package/dist/host/branch-reload.js.map +1 -0
- package/dist/host/channel-adapter.d.ts +25 -0
- package/dist/host/channel-adapter.d.ts.map +1 -0
- package/dist/host/channel-adapter.js +45 -0
- package/dist/host/channel-adapter.js.map +1 -0
- package/dist/host/checkpoint-commit.d.ts +74 -0
- package/dist/host/checkpoint-commit.d.ts.map +1 -0
- package/dist/host/checkpoint-commit.js +76 -0
- package/dist/host/checkpoint-commit.js.map +1 -0
- package/dist/host/manual-compaction.d.ts +43 -0
- package/dist/host/manual-compaction.d.ts.map +1 -0
- package/dist/host/manual-compaction.js +63 -0
- package/dist/host/manual-compaction.js.map +1 -0
- package/dist/host/output-projection.d.ts +61 -0
- package/dist/host/output-projection.d.ts.map +1 -0
- package/dist/host/output-projection.js +74 -0
- package/dist/host/output-projection.js.map +1 -0
- package/dist/host/output-reducer.d.ts +43 -0
- package/dist/host/output-reducer.d.ts.map +1 -0
- package/dist/host/output-reducer.js +77 -0
- package/dist/host/output-reducer.js.map +1 -0
- package/dist/host/output-serializer.d.ts +31 -0
- package/dist/host/output-serializer.d.ts.map +1 -0
- package/dist/host/output-serializer.js +120 -0
- package/dist/host/output-serializer.js.map +1 -0
- package/dist/host/overflow-recovery.d.ts +55 -0
- package/dist/host/overflow-recovery.d.ts.map +1 -0
- package/dist/host/overflow-recovery.js +89 -0
- package/dist/host/overflow-recovery.js.map +1 -0
- package/dist/host/retry-common.d.ts +29 -0
- package/dist/host/retry-common.d.ts.map +1 -0
- package/dist/host/retry-common.js +12 -0
- package/dist/host/retry-common.js.map +1 -0
- package/dist/host/session-event-translation.d.ts +26 -0
- package/dist/host/session-event-translation.d.ts.map +1 -0
- package/dist/host/session-event-translation.js +61 -0
- package/dist/host/session-event-translation.js.map +1 -0
- package/dist/host/summary-retry.d.ts +54 -0
- package/dist/host/summary-retry.d.ts.map +1 -0
- package/dist/host/summary-retry.js +66 -0
- package/dist/host/summary-retry.js.map +1 -0
- package/dist/index.d.ts +105 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +176 -0
- package/dist/index.js.map +1 -0
- package/dist/main.d.ts +36 -0
- package/dist/main.d.ts.map +1 -0
- package/dist/main.js +1630 -0
- package/dist/main.js.map +1 -0
- package/dist/migration/migration-tool.d.ts +56 -0
- package/dist/migration/migration-tool.d.ts.map +1 -0
- package/dist/migration/migration-tool.js +72 -0
- package/dist/migration/migration-tool.js.map +1 -0
- package/dist/migrations.d.ts +33 -0
- package/dist/migrations.d.ts.map +1 -0
- package/dist/migrations.js +272 -0
- package/dist/migrations.js.map +1 -0
- package/dist/modes/index.d.ts +10 -0
- package/dist/modes/index.d.ts.map +1 -0
- package/dist/modes/index.js +8 -0
- package/dist/modes/index.js.map +1 -0
- package/dist/modes/interactive/assets/clankolas.png +0 -0
- package/dist/modes/interactive/components/armin.d.ts +34 -0
- package/dist/modes/interactive/components/armin.d.ts.map +1 -0
- package/dist/modes/interactive/components/armin.js +336 -0
- package/dist/modes/interactive/components/armin.js.map +1 -0
- package/dist/modes/interactive/components/assistant-message.d.ts +25 -0
- package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -0
- package/dist/modes/interactive/components/assistant-message.js +151 -0
- package/dist/modes/interactive/components/assistant-message.js.map +1 -0
- package/dist/modes/interactive/components/bash-execution.d.ts +34 -0
- package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -0
- package/dist/modes/interactive/components/bash-execution.js +176 -0
- package/dist/modes/interactive/components/bash-execution.js.map +1 -0
- package/dist/modes/interactive/components/bordered-loader.d.ts +16 -0
- package/dist/modes/interactive/components/bordered-loader.d.ts.map +1 -0
- package/dist/modes/interactive/components/bordered-loader.js +56 -0
- package/dist/modes/interactive/components/bordered-loader.js.map +1 -0
- package/dist/modes/interactive/components/branch-summary-message.d.ts +16 -0
- package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -0
- package/dist/modes/interactive/components/branch-summary-message.js +44 -0
- package/dist/modes/interactive/components/branch-summary-message.js.map +1 -0
- package/dist/modes/interactive/components/compaction-summary-message.d.ts +16 -0
- package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -0
- package/dist/modes/interactive/components/compaction-summary-message.js +45 -0
- package/dist/modes/interactive/components/compaction-summary-message.js.map +1 -0
- package/dist/modes/interactive/components/config-selector.d.ts +113 -0
- package/dist/modes/interactive/components/config-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/config-selector.js +857 -0
- package/dist/modes/interactive/components/config-selector.js.map +1 -0
- package/dist/modes/interactive/components/countdown-timer.d.ts +14 -0
- package/dist/modes/interactive/components/countdown-timer.d.ts.map +1 -0
- package/dist/modes/interactive/components/countdown-timer.js +33 -0
- package/dist/modes/interactive/components/countdown-timer.js.map +1 -0
- package/dist/modes/interactive/components/custom-editor.d.ts +19 -0
- package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -0
- package/dist/modes/interactive/components/custom-editor.js +71 -0
- package/dist/modes/interactive/components/custom-editor.js.map +1 -0
- package/dist/modes/interactive/components/custom-entry.d.ts +19 -0
- package/dist/modes/interactive/components/custom-entry.d.ts.map +1 -0
- package/dist/modes/interactive/components/custom-entry.js +52 -0
- package/dist/modes/interactive/components/custom-entry.js.map +1 -0
- package/dist/modes/interactive/components/custom-message.d.ts +22 -0
- package/dist/modes/interactive/components/custom-message.d.ts.map +1 -0
- package/dist/modes/interactive/components/custom-message.js +87 -0
- package/dist/modes/interactive/components/custom-message.js.map +1 -0
- package/dist/modes/interactive/components/daxnuts.d.ts +23 -0
- package/dist/modes/interactive/components/daxnuts.d.ts.map +1 -0
- package/dist/modes/interactive/components/daxnuts.js +141 -0
- package/dist/modes/interactive/components/daxnuts.js.map +1 -0
- package/dist/modes/interactive/components/dialog-editor.d.ts +21 -0
- package/dist/modes/interactive/components/dialog-editor.d.ts.map +1 -0
- package/dist/modes/interactive/components/dialog-editor.js +98 -0
- package/dist/modes/interactive/components/dialog-editor.js.map +1 -0
- package/dist/modes/interactive/components/dialog-input.d.ts +23 -0
- package/dist/modes/interactive/components/dialog-input.d.ts.map +1 -0
- package/dist/modes/interactive/components/dialog-input.js +61 -0
- package/dist/modes/interactive/components/dialog-input.js.map +1 -0
- package/dist/modes/interactive/components/dialog-selector.d.ts +26 -0
- package/dist/modes/interactive/components/dialog-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/dialog-selector.js +83 -0
- package/dist/modes/interactive/components/dialog-selector.js.map +1 -0
- package/dist/modes/interactive/components/diff.d.ts +12 -0
- package/dist/modes/interactive/components/diff.d.ts.map +1 -0
- package/dist/modes/interactive/components/diff.js +133 -0
- package/dist/modes/interactive/components/diff.js.map +1 -0
- package/dist/modes/interactive/components/dynamic-border.d.ts +15 -0
- package/dist/modes/interactive/components/dynamic-border.d.ts.map +1 -0
- package/dist/modes/interactive/components/dynamic-border.js +21 -0
- package/dist/modes/interactive/components/dynamic-border.js.map +1 -0
- package/dist/modes/interactive/components/first-time-setup.d.ts +25 -0
- package/dist/modes/interactive/components/first-time-setup.d.ts.map +1 -0
- package/dist/modes/interactive/components/first-time-setup.js +103 -0
- package/dist/modes/interactive/components/first-time-setup.js.map +1 -0
- package/dist/modes/interactive/components/footer.d.ts +33 -0
- package/dist/modes/interactive/components/footer.d.ts.map +1 -0
- package/dist/modes/interactive/components/footer.js +248 -0
- package/dist/modes/interactive/components/footer.js.map +1 -0
- package/dist/modes/interactive/components/index.d.ts +34 -0
- package/dist/modes/interactive/components/index.d.ts.map +1 -0
- package/dist/modes/interactive/components/index.js +35 -0
- package/dist/modes/interactive/components/index.js.map +1 -0
- package/dist/modes/interactive/components/keybinding-hints.d.ts +13 -0
- package/dist/modes/interactive/components/keybinding-hints.d.ts.map +1 -0
- package/dist/modes/interactive/components/keybinding-hints.js +36 -0
- package/dist/modes/interactive/components/keybinding-hints.js.map +1 -0
- package/dist/modes/interactive/components/login-dialog.d.ts +52 -0
- package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -0
- package/dist/modes/interactive/components/login-dialog.js +188 -0
- package/dist/modes/interactive/components/login-dialog.js.map +1 -0
- package/dist/modes/interactive/components/markdown-transform.d.ts +3 -0
- package/dist/modes/interactive/components/markdown-transform.d.ts.map +1 -0
- package/dist/modes/interactive/components/markdown-transform.js +19 -0
- package/dist/modes/interactive/components/markdown-transform.js.map +1 -0
- package/dist/modes/interactive/components/mermaid.d.ts +11 -0
- package/dist/modes/interactive/components/mermaid.d.ts.map +1 -0
- package/dist/modes/interactive/components/mermaid.js +75 -0
- package/dist/modes/interactive/components/mermaid.js.map +1 -0
- package/dist/modes/interactive/components/model-selector.d.ts +67 -0
- package/dist/modes/interactive/components/model-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/model-selector.js +381 -0
- package/dist/modes/interactive/components/model-selector.js.map +1 -0
- package/dist/modes/interactive/components/oauth-selector.d.ts +33 -0
- package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/oauth-selector.js +165 -0
- package/dist/modes/interactive/components/oauth-selector.js.map +1 -0
- package/dist/modes/interactive/components/plugin-manager-entry.d.ts +62 -0
- package/dist/modes/interactive/components/plugin-manager-entry.d.ts.map +1 -0
- package/dist/modes/interactive/components/plugin-manager-entry.js +294 -0
- package/dist/modes/interactive/components/plugin-manager-entry.js.map +1 -0
- package/dist/modes/interactive/components/plugin-selection-entry.d.ts +82 -0
- package/dist/modes/interactive/components/plugin-selection-entry.d.ts.map +1 -0
- package/dist/modes/interactive/components/plugin-selection-entry.js +228 -0
- package/dist/modes/interactive/components/plugin-selection-entry.js.map +1 -0
- package/dist/modes/interactive/components/render-types.d.ts +26 -0
- package/dist/modes/interactive/components/render-types.d.ts.map +1 -0
- package/dist/modes/interactive/components/render-types.js +7 -0
- package/dist/modes/interactive/components/render-types.js.map +1 -0
- package/dist/modes/interactive/components/scoped-models-selector.d.ts +46 -0
- package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/scoped-models-selector.js +328 -0
- package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -0
- package/dist/modes/interactive/components/session-selector-search.d.ts +23 -0
- package/dist/modes/interactive/components/session-selector-search.d.ts.map +1 -0
- package/dist/modes/interactive/components/session-selector-search.js +158 -0
- package/dist/modes/interactive/components/session-selector-search.js.map +1 -0
- package/dist/modes/interactive/components/session-selector.d.ts +143 -0
- package/dist/modes/interactive/components/session-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/session-selector.js +1053 -0
- package/dist/modes/interactive/components/session-selector.js.map +1 -0
- package/dist/modes/interactive/components/settings-selector.d.ts +88 -0
- package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/settings-selector.js +677 -0
- package/dist/modes/interactive/components/settings-selector.js.map +1 -0
- package/dist/modes/interactive/components/settings-submenu.d.ts +72 -0
- package/dist/modes/interactive/components/settings-submenu.d.ts.map +1 -0
- package/dist/modes/interactive/components/settings-submenu.js +165 -0
- package/dist/modes/interactive/components/settings-submenu.js.map +1 -0
- package/dist/modes/interactive/components/show-images-selector.d.ts +10 -0
- package/dist/modes/interactive/components/show-images-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/show-images-selector.js +39 -0
- package/dist/modes/interactive/components/show-images-selector.js.map +1 -0
- package/dist/modes/interactive/components/skill-invocation-message.d.ts +17 -0
- package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -0
- package/dist/modes/interactive/components/skill-invocation-message.js +47 -0
- package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -0
- package/dist/modes/interactive/components/status-indicator.d.ts +34 -0
- package/dist/modes/interactive/components/status-indicator.d.ts.map +1 -0
- package/dist/modes/interactive/components/status-indicator.js +60 -0
- package/dist/modes/interactive/components/status-indicator.js.map +1 -0
- package/dist/modes/interactive/components/theme-selector.d.ts +11 -0
- package/dist/modes/interactive/components/theme-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/theme-selector.js +50 -0
- package/dist/modes/interactive/components/theme-selector.js.map +1 -0
- package/dist/modes/interactive/components/thinking-selector.d.ts +23 -0
- package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/thinking-selector.js +109 -0
- package/dist/modes/interactive/components/thinking-selector.js.map +1 -0
- package/dist/modes/interactive/components/tool-execution.d.ts +59 -0
- package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -0
- package/dist/modes/interactive/components/tool-execution.js +335 -0
- package/dist/modes/interactive/components/tool-execution.js.map +1 -0
- package/dist/modes/interactive/components/tree-list.d.ts +67 -0
- package/dist/modes/interactive/components/tree-list.d.ts.map +1 -0
- package/dist/modes/interactive/components/tree-list.js +710 -0
- package/dist/modes/interactive/components/tree-list.js.map +1 -0
- package/dist/modes/interactive/components/tree-render.d.ts +17 -0
- package/dist/modes/interactive/components/tree-render.d.ts.map +1 -0
- package/dist/modes/interactive/components/tree-render.js +316 -0
- package/dist/modes/interactive/components/tree-render.js.map +1 -0
- package/dist/modes/interactive/components/tree-selector.d.ts +25 -0
- package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/tree-selector.js +235 -0
- package/dist/modes/interactive/components/tree-selector.js.map +1 -0
- package/dist/modes/interactive/components/tree-types.d.ts +35 -0
- package/dist/modes/interactive/components/tree-types.d.ts.map +1 -0
- package/dist/modes/interactive/components/tree-types.js +2 -0
- package/dist/modes/interactive/components/tree-types.js.map +1 -0
- package/dist/modes/interactive/components/user-message-selector.d.ts +30 -0
- package/dist/modes/interactive/components/user-message-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/user-message-selector.js +114 -0
- package/dist/modes/interactive/components/user-message-selector.js.map +1 -0
- package/dist/modes/interactive/components/user-message.d.ts +16 -0
- package/dist/modes/interactive/components/user-message.d.ts.map +1 -0
- package/dist/modes/interactive/components/user-message.js +49 -0
- package/dist/modes/interactive/components/user-message.js.map +1 -0
- package/dist/modes/interactive/components/visual-truncate.d.ts +24 -0
- package/dist/modes/interactive/components/visual-truncate.d.ts.map +1 -0
- package/dist/modes/interactive/components/visual-truncate.js +33 -0
- package/dist/modes/interactive/components/visual-truncate.js.map +1 -0
- package/dist/modes/interactive/external-editor.d.ts +12 -0
- package/dist/modes/interactive/external-editor.d.ts.map +1 -0
- package/dist/modes/interactive/external-editor.js +38 -0
- package/dist/modes/interactive/external-editor.js.map +1 -0
- package/dist/modes/interactive/interactive-auth.d.ts +90 -0
- package/dist/modes/interactive/interactive-auth.d.ts.map +1 -0
- package/dist/modes/interactive/interactive-auth.js +492 -0
- package/dist/modes/interactive/interactive-auth.js.map +1 -0
- package/dist/modes/interactive/interactive-commands.d.ts +68 -0
- package/dist/modes/interactive/interactive-commands.d.ts.map +1 -0
- package/dist/modes/interactive/interactive-commands.js +157 -0
- package/dist/modes/interactive/interactive-commands.js.map +1 -0
- package/dist/modes/interactive/interactive-dialog-ui.d.ts +73 -0
- package/dist/modes/interactive/interactive-dialog-ui.d.ts.map +1 -0
- package/dist/modes/interactive/interactive-dialog-ui.js +189 -0
- package/dist/modes/interactive/interactive-dialog-ui.js.map +1 -0
- package/dist/modes/interactive/interactive-format.d.ts +65 -0
- package/dist/modes/interactive/interactive-format.d.ts.map +1 -0
- package/dist/modes/interactive/interactive-format.js +268 -0
- package/dist/modes/interactive/interactive-format.js.map +1 -0
- package/dist/modes/interactive/interactive-helpers.d.ts +25 -0
- package/dist/modes/interactive/interactive-helpers.d.ts.map +1 -0
- package/dist/modes/interactive/interactive-helpers.js +73 -0
- package/dist/modes/interactive/interactive-helpers.js.map +1 -0
- package/dist/modes/interactive/interactive-mode.d.ts +640 -0
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -0
- package/dist/modes/interactive/interactive-mode.js +4107 -0
- package/dist/modes/interactive/interactive-mode.js.map +1 -0
- package/dist/modes/interactive/interactive-selectors.d.ts +95 -0
- package/dist/modes/interactive/interactive-selectors.d.ts.map +1 -0
- package/dist/modes/interactive/interactive-selectors.js +356 -0
- package/dist/modes/interactive/interactive-selectors.js.map +1 -0
- package/dist/modes/interactive/model-catalog-refresh.d.ts +11 -0
- package/dist/modes/interactive/model-catalog-refresh.d.ts.map +1 -0
- package/dist/modes/interactive/model-catalog-refresh.js +35 -0
- package/dist/modes/interactive/model-catalog-refresh.js.map +1 -0
- package/dist/modes/interactive/model-search.d.ts +12 -0
- package/dist/modes/interactive/model-search.d.ts.map +1 -0
- package/dist/modes/interactive/model-search.js +15 -0
- package/dist/modes/interactive/model-search.js.map +1 -0
- package/dist/modes/interactive/theme/dark.json +90 -0
- package/dist/modes/interactive/theme/light.json +89 -0
- package/dist/modes/interactive/theme/theme-controller.d.ts +40 -0
- package/dist/modes/interactive/theme/theme-controller.d.ts.map +1 -0
- package/dist/modes/interactive/theme/theme-controller.js +126 -0
- package/dist/modes/interactive/theme/theme-controller.js.map +1 -0
- package/dist/modes/interactive/theme/theme-schema.json +352 -0
- package/dist/modes/interactive/theme/theme.d.ts +122 -0
- package/dist/modes/interactive/theme/theme.d.ts.map +1 -0
- package/dist/modes/interactive/theme/theme.js +1093 -0
- package/dist/modes/interactive/theme/theme.js.map +1 -0
- package/dist/modes/json-event.d.ts +34 -0
- package/dist/modes/json-event.d.ts.map +1 -0
- package/dist/modes/json-event.js +29 -0
- package/dist/modes/json-event.js.map +1 -0
- package/dist/modes/print-mode.d.ts +32 -0
- package/dist/modes/print-mode.d.ts.map +1 -0
- package/dist/modes/print-mode.js +205 -0
- package/dist/modes/print-mode.js.map +1 -0
- package/dist/modes/rpc/jsonl.d.ts +17 -0
- package/dist/modes/rpc/jsonl.d.ts.map +1 -0
- package/dist/modes/rpc/jsonl.js +49 -0
- package/dist/modes/rpc/jsonl.js.map +1 -0
- package/dist/modes/rpc/rpc-client.d.ts +254 -0
- package/dist/modes/rpc/rpc-client.d.ts.map +1 -0
- package/dist/modes/rpc/rpc-client.js +496 -0
- package/dist/modes/rpc/rpc-client.js.map +1 -0
- package/dist/modes/rpc/rpc-mode.d.ts +53 -0
- package/dist/modes/rpc/rpc-mode.d.ts.map +1 -0
- package/dist/modes/rpc/rpc-mode.js +540 -0
- package/dist/modes/rpc/rpc-mode.js.map +1 -0
- package/dist/modes/rpc/rpc-types.d.ts +486 -0
- package/dist/modes/rpc/rpc-types.d.ts.map +1 -0
- package/dist/modes/rpc/rpc-types.js +8 -0
- package/dist/modes/rpc/rpc-types.js.map +1 -0
- package/dist/package-manager-cli.d.ts +18 -0
- package/dist/package-manager-cli.d.ts.map +1 -0
- package/dist/package-manager-cli.js +944 -0
- package/dist/package-manager-cli.js.map +1 -0
- package/dist/plugins/ecosystem/active-bindings.d.ts +92 -0
- package/dist/plugins/ecosystem/active-bindings.d.ts.map +1 -0
- package/dist/plugins/ecosystem/active-bindings.js +198 -0
- package/dist/plugins/ecosystem/active-bindings.js.map +1 -0
- package/dist/plugins/ecosystem/bootstrap-factory-manifest.d.ts +32 -0
- package/dist/plugins/ecosystem/bootstrap-factory-manifest.d.ts.map +1 -0
- package/dist/plugins/ecosystem/bootstrap-factory-manifest.js +32 -0
- package/dist/plugins/ecosystem/bootstrap-factory-manifest.js.map +1 -0
- package/dist/plugins/ecosystem/catalog.d.ts +38 -0
- package/dist/plugins/ecosystem/catalog.d.ts.map +1 -0
- package/dist/plugins/ecosystem/catalog.js +90 -0
- package/dist/plugins/ecosystem/catalog.js.map +1 -0
- package/dist/plugins/ecosystem/cli.d.ts +102 -0
- package/dist/plugins/ecosystem/cli.d.ts.map +1 -0
- package/dist/plugins/ecosystem/cli.js +970 -0
- package/dist/plugins/ecosystem/cli.js.map +1 -0
- package/dist/plugins/ecosystem/default-active-bindings.d.ts +33 -0
- package/dist/plugins/ecosystem/default-active-bindings.d.ts.map +1 -0
- package/dist/plugins/ecosystem/default-active-bindings.js +105 -0
- package/dist/plugins/ecosystem/default-active-bindings.js.map +1 -0
- package/dist/plugins/ecosystem/default-plugin-market.d.ts +68 -0
- package/dist/plugins/ecosystem/default-plugin-market.d.ts.map +1 -0
- package/dist/plugins/ecosystem/default-plugin-market.js +146 -0
- package/dist/plugins/ecosystem/default-plugin-market.js.map +1 -0
- package/dist/plugins/ecosystem/distribution.d.ts +113 -0
- package/dist/plugins/ecosystem/distribution.d.ts.map +1 -0
- package/dist/plugins/ecosystem/distribution.js +371 -0
- package/dist/plugins/ecosystem/distribution.js.map +1 -0
- package/dist/plugins/ecosystem/index.d.ts +56 -0
- package/dist/plugins/ecosystem/index.d.ts.map +1 -0
- package/dist/plugins/ecosystem/index.js +31 -0
- package/dist/plugins/ecosystem/index.js.map +1 -0
- package/dist/plugins/ecosystem/installer.d.ts +130 -0
- package/dist/plugins/ecosystem/installer.d.ts.map +1 -0
- package/dist/plugins/ecosystem/installer.js +316 -0
- package/dist/plugins/ecosystem/installer.js.map +1 -0
- package/dist/plugins/ecosystem/node-disk-registry-source.d.ts +47 -0
- package/dist/plugins/ecosystem/node-disk-registry-source.d.ts.map +1 -0
- package/dist/plugins/ecosystem/node-disk-registry-source.js +208 -0
- package/dist/plugins/ecosystem/node-disk-registry-source.js.map +1 -0
- package/dist/plugins/ecosystem/node-distribution-host.d.ts +55 -0
- package/dist/plugins/ecosystem/node-distribution-host.d.ts.map +1 -0
- package/dist/plugins/ecosystem/node-distribution-host.js +423 -0
- package/dist/plugins/ecosystem/node-distribution-host.js.map +1 -0
- package/dist/plugins/ecosystem/node-local-package-source.d.ts +10 -0
- package/dist/plugins/ecosystem/node-local-package-source.d.ts.map +1 -0
- package/dist/plugins/ecosystem/node-local-package-source.js +97 -0
- package/dist/plugins/ecosystem/node-local-package-source.js.map +1 -0
- package/dist/plugins/ecosystem/node-npm-registry-source.d.ts +58 -0
- package/dist/plugins/ecosystem/node-npm-registry-source.d.ts.map +1 -0
- package/dist/plugins/ecosystem/node-npm-registry-source.js +326 -0
- package/dist/plugins/ecosystem/node-npm-registry-source.js.map +1 -0
- package/dist/plugins/ecosystem/node-package-install-host.d.ts +91 -0
- package/dist/plugins/ecosystem/node-package-install-host.d.ts.map +1 -0
- package/dist/plugins/ecosystem/node-package-install-host.js +857 -0
- package/dist/plugins/ecosystem/node-package-install-host.js.map +1 -0
- package/dist/plugins/ecosystem/node-package-install-persistence.d.ts +34 -0
- package/dist/plugins/ecosystem/node-package-install-persistence.d.ts.map +1 -0
- package/dist/plugins/ecosystem/node-package-install-persistence.js +221 -0
- package/dist/plugins/ecosystem/node-package-install-persistence.js.map +1 -0
- package/dist/plugins/ecosystem/node-package-install-stack.d.ts +28 -0
- package/dist/plugins/ecosystem/node-package-install-stack.d.ts.map +1 -0
- package/dist/plugins/ecosystem/node-package-install-stack.js +65 -0
- package/dist/plugins/ecosystem/node-package-install-stack.js.map +1 -0
- package/dist/plugins/ecosystem/node-package-media.d.ts +14 -0
- package/dist/plugins/ecosystem/node-package-media.d.ts.map +1 -0
- package/dist/plugins/ecosystem/node-package-media.js +36 -0
- package/dist/plugins/ecosystem/node-package-media.js.map +1 -0
- package/dist/plugins/ecosystem/node-plugin-acquisition-host.d.ts +83 -0
- package/dist/plugins/ecosystem/node-plugin-acquisition-host.d.ts.map +1 -0
- package/dist/plugins/ecosystem/node-plugin-acquisition-host.js +423 -0
- package/dist/plugins/ecosystem/node-plugin-acquisition-host.js.map +1 -0
- package/dist/plugins/ecosystem/node-plugin-bootstrap.d.ts +48 -0
- package/dist/plugins/ecosystem/node-plugin-bootstrap.d.ts.map +1 -0
- package/dist/plugins/ecosystem/node-plugin-bootstrap.js +191 -0
- package/dist/plugins/ecosystem/node-plugin-bootstrap.js.map +1 -0
- package/dist/plugins/ecosystem/node-plugin-trust-root.d.ts +26 -0
- package/dist/plugins/ecosystem/node-plugin-trust-root.d.ts.map +1 -0
- package/dist/plugins/ecosystem/node-plugin-trust-root.js +120 -0
- package/dist/plugins/ecosystem/node-plugin-trust-root.js.map +1 -0
- package/dist/plugins/ecosystem/node-registry-source.d.ts +35 -0
- package/dist/plugins/ecosystem/node-registry-source.d.ts.map +1 -0
- package/dist/plugins/ecosystem/node-registry-source.js +286 -0
- package/dist/plugins/ecosystem/node-registry-source.js.map +1 -0
- package/dist/plugins/ecosystem/node-release-package-source.d.ts +47 -0
- package/dist/plugins/ecosystem/node-release-package-source.d.ts.map +1 -0
- package/dist/plugins/ecosystem/node-release-package-source.js +336 -0
- package/dist/plugins/ecosystem/node-release-package-source.js.map +1 -0
- package/dist/plugins/ecosystem/node-tar-package.d.ts +11 -0
- package/dist/plugins/ecosystem/node-tar-package.d.ts.map +1 -0
- package/dist/plugins/ecosystem/node-tar-package.js +294 -0
- package/dist/plugins/ecosystem/node-tar-package.js.map +1 -0
- package/dist/plugins/ecosystem/node-tar-writer.d.ts +16 -0
- package/dist/plugins/ecosystem/node-tar-writer.d.ts.map +1 -0
- package/dist/plugins/ecosystem/node-tar-writer.js +134 -0
- package/dist/plugins/ecosystem/node-tar-writer.js.map +1 -0
- package/dist/plugins/ecosystem/node-url-package-source.d.ts +31 -0
- package/dist/plugins/ecosystem/node-url-package-source.d.ts.map +1 -0
- package/dist/plugins/ecosystem/node-url-package-source.js +159 -0
- package/dist/plugins/ecosystem/node-url-package-source.js.map +1 -0
- package/dist/plugins/ecosystem/plugin-acquisition.d.ts +88 -0
- package/dist/plugins/ecosystem/plugin-acquisition.d.ts.map +1 -0
- package/dist/plugins/ecosystem/plugin-acquisition.js +197 -0
- package/dist/plugins/ecosystem/plugin-acquisition.js.map +1 -0
- package/dist/plugins/ecosystem/plugin-bootstrap.d.ts +87 -0
- package/dist/plugins/ecosystem/plugin-bootstrap.d.ts.map +1 -0
- package/dist/plugins/ecosystem/plugin-bootstrap.js +134 -0
- package/dist/plugins/ecosystem/plugin-bootstrap.js.map +1 -0
- package/dist/plugins/ecosystem/registry-cli-adapter.d.ts +8 -0
- package/dist/plugins/ecosystem/registry-cli-adapter.d.ts.map +1 -0
- package/dist/plugins/ecosystem/registry-cli-adapter.js +16 -0
- package/dist/plugins/ecosystem/registry-cli-adapter.js.map +1 -0
- package/dist/plugins/ecosystem/registry.d.ts +121 -0
- package/dist/plugins/ecosystem/registry.d.ts.map +1 -0
- package/dist/plugins/ecosystem/registry.js +324 -0
- package/dist/plugins/ecosystem/registry.js.map +1 -0
- package/dist/plugins/ecosystem/resolver.d.ts +32 -0
- package/dist/plugins/ecosystem/resolver.d.ts.map +1 -0
- package/dist/plugins/ecosystem/resolver.js +325 -0
- package/dist/plugins/ecosystem/resolver.js.map +1 -0
- package/dist/plugins/ecosystem/selection-store.d.ts +66 -0
- package/dist/plugins/ecosystem/selection-store.d.ts.map +1 -0
- package/dist/plugins/ecosystem/selection-store.js +241 -0
- package/dist/plugins/ecosystem/selection-store.js.map +1 -0
- package/dist/plugins/ecosystem/selection.d.ts +54 -0
- package/dist/plugins/ecosystem/selection.d.ts.map +1 -0
- package/dist/plugins/ecosystem/selection.js +116 -0
- package/dist/plugins/ecosystem/selection.js.map +1 -0
- package/dist/plugins/ecosystem/state.d.ts +96 -0
- package/dist/plugins/ecosystem/state.d.ts.map +1 -0
- package/dist/plugins/ecosystem/state.js +346 -0
- package/dist/plugins/ecosystem/state.js.map +1 -0
- package/dist/plugins/ecosystem/types.d.ts +90 -0
- package/dist/plugins/ecosystem/types.d.ts.map +1 -0
- package/dist/plugins/ecosystem/types.js +8 -0
- package/dist/plugins/ecosystem/types.js.map +1 -0
- package/dist/plugins/ecosystem/updates.d.ts +30 -0
- package/dist/plugins/ecosystem/updates.d.ts.map +1 -0
- package/dist/plugins/ecosystem/updates.js +148 -0
- package/dist/plugins/ecosystem/updates.js.map +1 -0
- package/dist/plugins/integrity-adapter.d.ts +58 -0
- package/dist/plugins/integrity-adapter.d.ts.map +1 -0
- package/dist/plugins/integrity-adapter.js +70 -0
- package/dist/plugins/integrity-adapter.js.map +1 -0
- package/dist/plugins/mcp-http.d.ts +78 -0
- package/dist/plugins/mcp-http.d.ts.map +1 -0
- package/dist/plugins/mcp-http.js +176 -0
- package/dist/plugins/mcp-http.js.map +1 -0
- package/dist/plugins/observability-types.d.ts +9 -0
- package/dist/plugins/observability-types.d.ts.map +1 -0
- package/dist/plugins/observability-types.js +9 -0
- package/dist/plugins/observability-types.js.map +1 -0
- package/dist/plugins/plugin-host.d.ts +46 -0
- package/dist/plugins/plugin-host.d.ts.map +1 -0
- package/dist/plugins/plugin-host.js +80 -0
- package/dist/plugins/plugin-host.js.map +1 -0
- package/dist/plugins/plugin-supervisor.d.ts +77 -0
- package/dist/plugins/plugin-supervisor.d.ts.map +1 -0
- package/dist/plugins/plugin-supervisor.js +82 -0
- package/dist/plugins/plugin-supervisor.js.map +1 -0
- package/dist/plugins/subagent-task/runner-entry.d.ts +35 -0
- package/dist/plugins/subagent-task/runner-entry.d.ts.map +1 -0
- package/dist/plugins/subagent-task/runner-entry.js +39 -0
- package/dist/plugins/subagent-task/runner-entry.js.map +1 -0
- package/dist/plugins/subagent-task/session-factory.d.ts +57 -0
- package/dist/plugins/subagent-task/session-factory.d.ts.map +1 -0
- package/dist/plugins/subagent-task/session-factory.js +51 -0
- package/dist/plugins/subagent-task/session-factory.js.map +1 -0
- package/dist/profile/child-facade.d.ts +44 -0
- package/dist/profile/child-facade.d.ts.map +1 -0
- package/dist/profile/child-facade.js +56 -0
- package/dist/profile/child-facade.js.map +1 -0
- package/dist/profile/dependency-wiring.d.ts +48 -0
- package/dist/profile/dependency-wiring.d.ts.map +1 -0
- package/dist/profile/dependency-wiring.js +56 -0
- package/dist/profile/dependency-wiring.js.map +1 -0
- package/dist/profile/domain-recovery.d.ts +60 -0
- package/dist/profile/domain-recovery.d.ts.map +1 -0
- package/dist/profile/domain-recovery.js +94 -0
- package/dist/profile/domain-recovery.js.map +1 -0
- package/dist/profile/first-roles.d.ts +30 -0
- package/dist/profile/first-roles.d.ts.map +1 -0
- package/dist/profile/first-roles.js +74 -0
- package/dist/profile/first-roles.js.map +1 -0
- package/dist/profile/goal-plugin.d.ts +38 -0
- package/dist/profile/goal-plugin.d.ts.map +1 -0
- package/dist/profile/goal-plugin.js +113 -0
- package/dist/profile/goal-plugin.js.map +1 -0
- package/dist/profile/identity.d.ts +58 -0
- package/dist/profile/identity.d.ts.map +1 -0
- package/dist/profile/identity.js +100 -0
- package/dist/profile/identity.js.map +1 -0
- package/dist/profile/lock.d.ts +59 -0
- package/dist/profile/lock.d.ts.map +1 -0
- package/dist/profile/lock.js +59 -0
- package/dist/profile/lock.js.map +1 -0
- package/dist/profile/plan-plugin.d.ts +44 -0
- package/dist/profile/plan-plugin.d.ts.map +1 -0
- package/dist/profile/plan-plugin.js +144 -0
- package/dist/profile/plan-plugin.js.map +1 -0
- package/dist/profile/plugin-profiles.d.ts +56 -0
- package/dist/profile/plugin-profiles.d.ts.map +1 -0
- package/dist/profile/plugin-profiles.js +192 -0
- package/dist/profile/plugin-profiles.js.map +1 -0
- package/dist/profile/policy-manifest.d.ts +53 -0
- package/dist/profile/policy-manifest.d.ts.map +1 -0
- package/dist/profile/policy-manifest.js +52 -0
- package/dist/profile/policy-manifest.js.map +1 -0
- package/dist/profile/profile-assembly.d.ts +74 -0
- package/dist/profile/profile-assembly.d.ts.map +1 -0
- package/dist/profile/profile-assembly.js +90 -0
- package/dist/profile/profile-assembly.js.map +1 -0
- package/dist/profile/profile-migration.d.ts +56 -0
- package/dist/profile/profile-migration.d.ts.map +1 -0
- package/dist/profile/profile-migration.js +60 -0
- package/dist/profile/profile-migration.js.map +1 -0
- package/dist/profile/profile-registry.d.ts +58 -0
- package/dist/profile/profile-registry.d.ts.map +1 -0
- package/dist/profile/profile-registry.js +74 -0
- package/dist/profile/profile-registry.js.map +1 -0
- package/dist/profile/role-assembly.d.ts +47 -0
- package/dist/profile/role-assembly.d.ts.map +1 -0
- package/dist/profile/role-assembly.js +31 -0
- package/dist/profile/role-assembly.js.map +1 -0
- package/dist/profile/role-catalog.d.ts +44 -0
- package/dist/profile/role-catalog.d.ts.map +1 -0
- package/dist/profile/role-catalog.js +130 -0
- package/dist/profile/role-catalog.js.map +1 -0
- package/dist/profile/role-orchestrator.d.ts +123 -0
- package/dist/profile/role-orchestrator.d.ts.map +1 -0
- package/dist/profile/role-orchestrator.js +194 -0
- package/dist/profile/role-orchestrator.js.map +1 -0
- package/dist/profile/role-runner.d.ts +99 -0
- package/dist/profile/role-runner.d.ts.map +1 -0
- package/dist/profile/role-runner.js +78 -0
- package/dist/profile/role-runner.js.map +1 -0
- package/dist/profile/root-facade.d.ts +36 -0
- package/dist/profile/root-facade.d.ts.map +1 -0
- package/dist/profile/root-facade.js +48 -0
- package/dist/profile/root-facade.js.map +1 -0
- package/dist/profile/skill-discovery-wiring.d.ts +58 -0
- package/dist/profile/skill-discovery-wiring.d.ts.map +1 -0
- package/dist/profile/skill-discovery-wiring.js +75 -0
- package/dist/profile/skill-discovery-wiring.js.map +1 -0
- package/dist/profile/state-store.d.ts +62 -0
- package/dist/profile/state-store.d.ts.map +1 -0
- package/dist/profile/state-store.js +140 -0
- package/dist/profile/state-store.js.map +1 -0
- package/dist/profile/todo-plugin.d.ts +37 -0
- package/dist/profile/todo-plugin.d.ts.map +1 -0
- package/dist/profile/todo-plugin.js +132 -0
- package/dist/profile/todo-plugin.js.map +1 -0
- package/dist/profiles/builtin-suites.d.ts +142 -0
- package/dist/profiles/builtin-suites.d.ts.map +1 -0
- package/dist/profiles/builtin-suites.js +395 -0
- package/dist/profiles/builtin-suites.js.map +1 -0
- package/dist/profiles/resolved-agent-profile.d.ts +83 -0
- package/dist/profiles/resolved-agent-profile.d.ts.map +1 -0
- package/dist/profiles/resolved-agent-profile.js +75 -0
- package/dist/profiles/resolved-agent-profile.js.map +1 -0
- package/dist/profiles/suite-lifecycle.d.ts +158 -0
- package/dist/profiles/suite-lifecycle.d.ts.map +1 -0
- package/dist/profiles/suite-lifecycle.js +447 -0
- package/dist/profiles/suite-lifecycle.js.map +1 -0
- package/dist/profiles/suite-loader.d.ts +410 -0
- package/dist/profiles/suite-loader.d.ts.map +1 -0
- package/dist/profiles/suite-loader.js +823 -0
- package/dist/profiles/suite-loader.js.map +1 -0
- package/dist/remote/server-assembly.d.ts +230 -0
- package/dist/remote/server-assembly.d.ts.map +1 -0
- package/dist/remote/server-assembly.js +1189 -0
- package/dist/remote/server-assembly.js.map +1 -0
- package/dist/remote/server-entry.d.ts +112 -0
- package/dist/remote/server-entry.d.ts.map +1 -0
- package/dist/remote/server-entry.js +239 -0
- package/dist/remote/server-entry.js.map +1 -0
- package/dist/remote/session-source.d.ts +101 -0
- package/dist/remote/session-source.d.ts.map +1 -0
- package/dist/remote/session-source.js +173 -0
- package/dist/remote/session-source.js.map +1 -0
- package/dist/rpc-entry.d.ts +3 -0
- package/dist/rpc-entry.d.ts.map +1 -0
- package/dist/rpc-entry.js +11 -0
- package/dist/rpc-entry.js.map +1 -0
- package/dist/server/create-harness.d.ts +26 -0
- package/dist/server/create-harness.d.ts.map +1 -0
- package/dist/server/create-harness.js +106 -0
- package/dist/server/create-harness.js.map +1 -0
- package/dist/share/session-share.d.ts +98 -0
- package/dist/share/session-share.d.ts.map +1 -0
- package/dist/share/session-share.js +89 -0
- package/dist/share/session-share.js.map +1 -0
- package/dist/share/share-viewer.d.ts +43 -0
- package/dist/share/share-viewer.d.ts.map +1 -0
- package/dist/share/share-viewer.js +103 -0
- package/dist/share/share-viewer.js.map +1 -0
- package/dist/testing/index.d.ts +4 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +6 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/testing/mock-ai-server.d.ts +77 -0
- package/dist/testing/mock-ai-server.d.ts.map +1 -0
- package/dist/testing/mock-ai-server.js +69 -0
- package/dist/testing/mock-ai-server.js.map +1 -0
- package/dist/testing/plugin-testkit.d.ts +148 -0
- package/dist/testing/plugin-testkit.d.ts.map +1 -0
- package/dist/testing/plugin-testkit.js +493 -0
- package/dist/testing/plugin-testkit.js.map +1 -0
- package/dist/testing/runtime-delivery-queue.d.ts +47 -0
- package/dist/testing/runtime-delivery-queue.d.ts.map +1 -0
- package/dist/testing/runtime-delivery-queue.js +158 -0
- package/dist/testing/runtime-delivery-queue.js.map +1 -0
- package/dist/testing/session-plugin-testkit.d.ts +144 -0
- package/dist/testing/session-plugin-testkit.d.ts.map +1 -0
- package/dist/testing/session-plugin-testkit.js +444 -0
- package/dist/testing/session-plugin-testkit.js.map +1 -0
- package/dist/utils/abort.d.ts +5 -0
- package/dist/utils/abort.d.ts.map +1 -0
- package/dist/utils/abort.js +53 -0
- package/dist/utils/abort.js.map +1 -0
- package/dist/utils/agent-forge-user-agent.d.ts +2 -0
- package/dist/utils/agent-forge-user-agent.d.ts.map +1 -0
- package/dist/utils/agent-forge-user-agent.js +5 -0
- package/dist/utils/agent-forge-user-agent.js.map +1 -0
- package/dist/utils/ansi.d.ts +2 -0
- package/dist/utils/ansi.d.ts.map +1 -0
- package/dist/utils/ansi.js +53 -0
- package/dist/utils/ansi.js.map +1 -0
- package/dist/utils/changelog.d.ts +22 -0
- package/dist/utils/changelog.d.ts.map +1 -0
- package/dist/utils/changelog.js +165 -0
- package/dist/utils/changelog.js.map +1 -0
- package/dist/utils/child-process.d.ts +18 -0
- package/dist/utils/child-process.d.ts.map +1 -0
- package/dist/utils/child-process.js +107 -0
- package/dist/utils/child-process.js.map +1 -0
- package/dist/utils/clipboard-image.d.ts +11 -0
- package/dist/utils/clipboard-image.d.ts.map +1 -0
- package/dist/utils/clipboard-image.js +246 -0
- package/dist/utils/clipboard-image.js.map +1 -0
- package/dist/utils/clipboard-native.d.ts +11 -0
- package/dist/utils/clipboard-native.d.ts.map +1 -0
- package/dist/utils/clipboard-native.js +22 -0
- package/dist/utils/clipboard-native.js.map +1 -0
- package/dist/utils/clipboard.d.ts +4 -0
- package/dist/utils/clipboard.d.ts.map +1 -0
- package/dist/utils/clipboard.js +161 -0
- package/dist/utils/clipboard.js.map +1 -0
- package/dist/utils/deprecation.d.ts +4 -0
- package/dist/utils/deprecation.d.ts.map +1 -0
- package/dist/utils/deprecation.js +13 -0
- package/dist/utils/deprecation.js.map +1 -0
- package/dist/utils/exif-orientation.d.ts +5 -0
- package/dist/utils/exif-orientation.d.ts.map +1 -0
- package/dist/utils/exif-orientation.js +158 -0
- package/dist/utils/exif-orientation.js.map +1 -0
- package/dist/utils/frontmatter.d.ts +8 -0
- package/dist/utils/frontmatter.d.ts.map +1 -0
- package/dist/utils/frontmatter.js +27 -0
- package/dist/utils/frontmatter.js.map +1 -0
- package/dist/utils/fs-watch.d.ts +5 -0
- package/dist/utils/fs-watch.d.ts.map +1 -0
- package/dist/utils/fs-watch.js +25 -0
- package/dist/utils/fs-watch.js.map +1 -0
- package/dist/utils/git.d.ts +26 -0
- package/dist/utils/git.d.ts.map +1 -0
- package/dist/utils/git.js +201 -0
- package/dist/utils/git.js.map +1 -0
- package/dist/utils/html.d.ts +7 -0
- package/dist/utils/html.d.ts.map +1 -0
- package/dist/utils/html.js +40 -0
- package/dist/utils/html.js.map +1 -0
- package/dist/utils/image-convert.d.ts +10 -0
- package/dist/utils/image-convert.d.ts.map +1 -0
- package/dist/utils/image-convert.js +45 -0
- package/dist/utils/image-convert.js.map +1 -0
- package/dist/utils/image-process.d.ts +18 -0
- package/dist/utils/image-process.d.ts.map +1 -0
- package/dist/utils/image-process.js +84 -0
- package/dist/utils/image-process.js.map +1 -0
- package/dist/utils/image-resize-core.d.ts +30 -0
- package/dist/utils/image-resize-core.d.ts.map +1 -0
- package/dist/utils/image-resize-core.js +125 -0
- package/dist/utils/image-resize-core.js.map +1 -0
- package/dist/utils/image-resize-worker.d.ts +2 -0
- package/dist/utils/image-resize-worker.d.ts.map +1 -0
- package/dist/utils/image-resize-worker.js +31 -0
- package/dist/utils/image-resize-worker.js.map +1 -0
- package/dist/utils/image-resize.d.ts +16 -0
- package/dist/utils/image-resize.d.ts.map +1 -0
- package/dist/utils/image-resize.js +100 -0
- package/dist/utils/image-resize.js.map +1 -0
- package/dist/utils/json.d.ts +3 -0
- package/dist/utils/json.d.ts.map +1 -0
- package/dist/utils/json.js +8 -0
- package/dist/utils/json.js.map +1 -0
- package/dist/utils/management-http.d.ts +25 -0
- package/dist/utils/management-http.d.ts.map +1 -0
- package/dist/utils/management-http.js +54 -0
- package/dist/utils/management-http.js.map +1 -0
- package/dist/utils/mime.d.ts +3 -0
- package/dist/utils/mime.d.ts.map +1 -0
- package/dist/utils/mime.js +115 -0
- package/dist/utils/mime.js.map +1 -0
- package/dist/utils/open-browser.d.ts +9 -0
- package/dist/utils/open-browser.d.ts.map +1 -0
- package/dist/utils/open-browser.js +22 -0
- package/dist/utils/open-browser.js.map +1 -0
- package/dist/utils/paths.d.ts +34 -0
- package/dist/utils/paths.d.ts.map +1 -0
- package/dist/utils/paths.js +114 -0
- package/dist/utils/paths.js.map +1 -0
- package/dist/utils/photon.d.ts +21 -0
- package/dist/utils/photon.d.ts.map +1 -0
- package/dist/utils/photon.js +124 -0
- package/dist/utils/photon.js.map +1 -0
- package/dist/utils/shell.d.ts +34 -0
- package/dist/utils/shell.d.ts.map +1 -0
- package/dist/utils/shell.js +216 -0
- package/dist/utils/shell.js.map +1 -0
- package/dist/utils/sleep.d.ts +5 -0
- package/dist/utils/sleep.d.ts.map +1 -0
- package/dist/utils/sleep.js +17 -0
- package/dist/utils/sleep.js.map +1 -0
- package/dist/utils/sync-sleep.d.ts +2 -0
- package/dist/utils/sync-sleep.d.ts.map +1 -0
- package/dist/utils/sync-sleep.js +11 -0
- package/dist/utils/sync-sleep.js.map +1 -0
- package/dist/utils/syntax-highlight.d.ts +13 -0
- package/dist/utils/syntax-highlight.d.ts.map +1 -0
- package/dist/utils/syntax-highlight.js +177 -0
- package/dist/utils/syntax-highlight.js.map +1 -0
- package/dist/utils/text.d.ts +8 -0
- package/dist/utils/text.d.ts.map +1 -0
- package/dist/utils/text.js +9 -0
- package/dist/utils/text.js.map +1 -0
- package/dist/utils/tool-result-images.d.ts +19 -0
- package/dist/utils/tool-result-images.d.ts.map +1 -0
- package/dist/utils/tool-result-images.js +45 -0
- package/dist/utils/tool-result-images.js.map +1 -0
- package/dist/utils/tools-manager.d.ts +24 -0
- package/dist/utils/tools-manager.d.ts.map +1 -0
- package/dist/utils/tools-manager.js +437 -0
- package/dist/utils/tools-manager.js.map +1 -0
- package/dist/utils/version-check.d.ts +21 -0
- package/dist/utils/version-check.d.ts.map +1 -0
- package/dist/utils/version-check.js +86 -0
- package/dist/utils/version-check.js.map +1 -0
- package/dist/utils/windows-self-update.d.ts +3 -0
- package/dist/utils/windows-self-update.d.ts.map +1 -0
- package/dist/utils/windows-self-update.js +77 -0
- package/dist/utils/windows-self-update.js.map +1 -0
- package/docs/compaction.md +348 -0
- package/docs/containerization.md +114 -0
- package/docs/development.md +71 -0
- package/docs/docs.json +148 -0
- package/docs/environment-variables.md +96 -0
- package/docs/images/exy.png +0 -0
- package/docs/images/interactive-mode.png +0 -0
- package/docs/images/tree-view.png +0 -0
- package/docs/index.md +76 -0
- package/docs/json.md +98 -0
- package/docs/keybindings.md +245 -0
- package/docs/llama-cpp.md +101 -0
- package/docs/models.md +576 -0
- package/docs/packages.md +205 -0
- package/docs/prompt-templates.md +96 -0
- package/docs/providers.md +317 -0
- package/docs/quickstart.md +167 -0
- package/docs/rpc.md +1487 -0
- package/docs/sdk.md +1146 -0
- package/docs/security.md +24 -0
- package/docs/session-format.md +438 -0
- package/docs/sessions.md +145 -0
- package/docs/settings.md +355 -0
- package/docs/shell-aliases.md +13 -0
- package/docs/skills.md +231 -0
- package/docs/terminal-setup.md +192 -0
- package/docs/termux.md +127 -0
- package/docs/themes.md +320 -0
- package/docs/tmux.md +63 -0
- package/docs/tui.md +478 -0
- package/docs/usage.md +291 -0
- package/docs/windows.md +39 -0
- package/examples/README.md +21 -0
- package/examples/extensions/README.md +163 -0
- package/examples/extensions/bash-spawn-hook/index.ts +37 -0
- package/examples/extensions/bash-spawn-hook/plugin.json +10 -0
- package/examples/extensions/bookmark/index.ts +67 -0
- package/examples/extensions/bookmark/plugin.json +11 -0
- package/examples/extensions/built-in-tool-renderer/index.ts +262 -0
- package/examples/extensions/built-in-tool-renderer/plugin.json +10 -0
- package/examples/extensions/claude-rules/index.ts +119 -0
- package/examples/extensions/claude-rules/plugin.json +8 -0
- package/examples/extensions/cli-bridge/README.md +27 -0
- package/examples/extensions/cli-bridge/index.ts +320 -0
- package/examples/extensions/cli-bridge/plugin.json +10 -0
- package/examples/extensions/dynamic-resources/SKILL.md +8 -0
- package/examples/extensions/dynamic-resources/dynamic.json +79 -0
- package/examples/extensions/dynamic-resources/dynamic.md +5 -0
- package/examples/extensions/dynamic-resources/index.ts +53 -0
- package/examples/extensions/dynamic-resources/plugin.json +8 -0
- package/examples/extensions/dynamic-tools/index.ts +102 -0
- package/examples/extensions/dynamic-tools/plugin.json +14 -0
- package/examples/extensions/event-bus/index.ts +75 -0
- package/examples/extensions/event-bus/plugin.json +13 -0
- package/examples/extensions/file-trigger/index.ts +65 -0
- package/examples/extensions/file-trigger/plugin.json +13 -0
- package/examples/extensions/goal/README.md +16 -0
- package/examples/extensions/goal/index.ts +134 -0
- package/examples/extensions/goal/plugin.json +12 -0
- package/examples/extensions/hello/index.ts +29 -0
- package/examples/extensions/hello/plugin.json +10 -0
- package/examples/extensions/kimi-deferred-tools/index.ts +93 -0
- package/examples/extensions/kimi-deferred-tools/plugin.json +11 -0
- package/examples/extensions/mcp-stdio/README.md +19 -0
- package/examples/extensions/mcp-stdio/index.d.ts +64 -0
- package/examples/extensions/mcp-stdio/index.d.ts.map +1 -0
- package/examples/extensions/mcp-stdio/index.js +292 -0
- package/examples/extensions/mcp-stdio/index.js.map +1 -0
- package/examples/extensions/mcp-stdio/index.ts +381 -0
- package/examples/extensions/mcp-stdio/plugin.json +10 -0
- package/examples/extensions/memory-backend/index.ts +120 -0
- package/examples/extensions/memory-backend/plugin.json +10 -0
- package/examples/extensions/minimal-mode/index.ts +447 -0
- package/examples/extensions/minimal-mode/plugin.json +10 -0
- package/examples/extensions/multi-agent/README.md +7 -0
- package/examples/extensions/multi-agent/index.ts +592 -0
- package/examples/extensions/multi-agent/plugin.json +13 -0
- package/examples/extensions/notify/index.ts +70 -0
- package/examples/extensions/notify/plugin.json +8 -0
- package/examples/extensions/permission-gate/index.ts +55 -0
- package/examples/extensions/permission-gate/plugin.json +11 -0
- package/examples/extensions/pirate/index.ts +75 -0
- package/examples/extensions/pirate/plugin.json +8 -0
- package/examples/extensions/plan/README.md +16 -0
- package/examples/extensions/plan/index.ts +136 -0
- package/examples/extensions/plan/plugin.json +12 -0
- package/examples/extensions/prompt-customizer/index.ts +117 -0
- package/examples/extensions/prompt-customizer/plugin.json +8 -0
- package/examples/extensions/protected-paths/index.ts +44 -0
- package/examples/extensions/protected-paths/plugin.json +11 -0
- package/examples/extensions/provider-attribution/README.md +12 -0
- package/examples/extensions/provider-attribution/index.ts +86 -0
- package/examples/extensions/provider-attribution/plugin.json +10 -0
- package/examples/extensions/send-user-message/index.ts +118 -0
- package/examples/extensions/send-user-message/plugin.json +11 -0
- package/examples/extensions/session-name/index.ts +31 -0
- package/examples/extensions/session-name/plugin.json +11 -0
- package/examples/extensions/session-share/README.md +15 -0
- package/examples/extensions/session-share/index.ts +170 -0
- package/examples/extensions/session-share/plugin.json +15 -0
- package/examples/extensions/structured-output/index.ts +68 -0
- package/examples/extensions/structured-output/plugin.json +10 -0
- package/examples/extensions/subagent/README.md +177 -0
- package/examples/extensions/subagent/agents/planner.md +37 -0
- package/examples/extensions/subagent/agents/reviewer.md +35 -0
- package/examples/extensions/subagent/agents/scout.md +50 -0
- package/examples/extensions/subagent/agents/worker.md +24 -0
- package/examples/extensions/subagent/agents.ts +157 -0
- package/examples/extensions/subagent/index.ts +1057 -0
- package/examples/extensions/subagent/plugin.json +13 -0
- package/examples/extensions/subagent/prompts/implement-and-review.md +10 -0
- package/examples/extensions/subagent/prompts/implement.md +10 -0
- package/examples/extensions/subagent/prompts/scout-and-plan.md +9 -0
- package/examples/extensions/suite-manager/README.md +45 -0
- package/examples/extensions/suite-manager/index.ts +182 -0
- package/examples/extensions/suite-manager/plugin.json +13 -0
- package/examples/extensions/timed-confirm/index.ts +93 -0
- package/examples/extensions/timed-confirm/plugin.json +13 -0
- package/examples/extensions/todo-set/README.md +18 -0
- package/examples/extensions/todo-set/index.ts +133 -0
- package/examples/extensions/todo-set/plugin.json +12 -0
- package/examples/extensions/tool-override/index.ts +159 -0
- package/examples/extensions/tool-override/plugin.json +11 -0
- package/examples/extensions/trigger-compact/index.ts +76 -0
- package/examples/extensions/trigger-compact/plugin.json +14 -0
- package/examples/extensions/truncated-tool/index.ts +204 -0
- package/examples/extensions/truncated-tool/plugin.json +10 -0
- package/examples/extensions/with-deps/index.ts +42 -0
- package/examples/extensions/with-deps/package-lock.json +31 -0
- package/examples/extensions/with-deps/package.json +22 -0
- package/examples/extensions/with-deps/plugin.json +10 -0
- package/examples/remote-client.ts +66 -0
- package/examples/rpc-extension-ui.ts +641 -0
- package/examples/sdk/01-minimal.ts +26 -0
- package/examples/sdk/02-custom-model.ts +49 -0
- package/examples/sdk/03-custom-prompt.ts +70 -0
- package/examples/sdk/04-skills.ts +55 -0
- package/examples/sdk/05-tools.ts +48 -0
- package/examples/sdk/07-context-files.ts +42 -0
- package/examples/sdk/08-prompt-templates.ts +51 -0
- package/examples/sdk/09-api-keys-and-oauth.ts +34 -0
- package/examples/sdk/10-settings.ts +53 -0
- package/examples/sdk/11-sessions.ts +52 -0
- package/examples/sdk/12-full-control.ts +72 -0
- package/examples/sdk/13-session-runtime.ts +71 -0
- package/examples/sdk/14-custom-session-storage.ts +132 -0
- package/examples/sdk/README.md +139 -0
- package/package.json +111 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"durable-service.js","sourceRoot":"","sources":["../../src/durable/durable-service.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Durable service MVP (7.4b) — in-memory persistence for session, operation,\n * and artifact records with a single-writer lease, crash recovery, and a\n * readiness gate.\n *\n * Scope: this is the durable *contract* slice. Storage is an in-memory Map;\n * `exportState`/`importState` are the snapshot restart boundary, and a\n * {@link DurableStoreBackend} is the log restart boundary: when one is passed\n * to {@link createDurableService}, every committed record is appended to the\n * backend log (write-ahead) and the log is replayed at construction to\n * restore state. Without a backend the service stays purely in-memory — the\n * original MVP behavior. {@link createFileDurableStoreBackend} is the JSONL\n * append-only file backend (ledger.ts pattern). Rules frozen here:\n * - Writes require the writer lease: `persist*` with any writerId other than\n * the current holder fails with `not_writer` — before the first claim,\n * while another writer holds the lease, and after a crash (until\n * `recoverWriter` takes it over).\n * - A writer recorded in an imported snapshot belonged to the process that\n * produced the snapshot and cannot be alive in this one: import enters a\n * crash-pending state where the lease stays held by the dead writer, reads\n * still work, and only `recoverWriter` can take the lease over. Readiness\n * stays `false` until it does.\n * - File writes through {@link createFileDurableStoreBackend} are\n * cross-process mutually exclusive: every persist serializes through a\n * `.lock` sibling file (same protocol as the memory ledger — exclusive\n * create, poll, stale-lock stealing, token-guarded release; wall-clock\n * timeout and staleness configurable, defaults 5 s / 60 s). The lock\n * guarantees concurrent appends do not interleave.\n * - Store-level writer lease (D-067 phase 2 S2): backends may expose an\n * optional {@link DurableStoreLeaseV1} — a TTL-based, cross-process\n * mutually-exclusive lease over the store. The file backend implements it\n * with a `.lease` sibling file (write heartbeat on every persist); the\n * service's claim/recover/release then resolve against the store, so a\n * second process observes a live foreign writer (`held`) and a crashed\n * writer's lease becomes recoverable once its TTL lapses. Without a\n * backend lease the writer lease stays process-local memory (unchanged).\n */\nimport {\n\tcloseSync,\n\tfsyncSync,\n\tmkdirSync,\n\topenSync,\n\treadFileSync,\n\tstatSync,\n\tunlinkSync,\n\twriteFileSync,\n\twriteSync,\n} from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport { sleepSync } from \"../utils/sync-sleep.ts\";\n\n// D-075 S4 third batch: the pure contract types moved to @agent-forge/plugin-sdk\n// (`durable.ts` is the plugin-facing authority); this module re-exports them so\n// the host's historical import paths and public export face keep resolving.\n// The implementation below (writer lease, file backend, store lease) stays here.\nexport type {\n\tDurableArtifactRecordV1,\n\tDurableOperationRecordV1,\n\tDurableReadinessV1,\n\tDurableReplayDiagnosticsV1,\n\tDurableServiceV1,\n\tDurableSessionRecordV1,\n\tDurableSnapshotV1,\n\tDurableWriterClaimV1,\n\tDurableWriterRecoveryV1,\n} from \"@agent-forge/plugin-sdk\";\n\nimport type {\n\tDurableArtifactRecordV1,\n\tDurableOperationRecordV1,\n\tDurableReplayDiagnosticsV1,\n\tDurableServiceV1,\n\tDurableSessionRecordV1,\n} from \"@agent-forge/plugin-sdk\";\n\nexport type DurableServiceErrorCodeV1 = \"not_writer\";\n\nexport class DurableServiceErrorV1 extends Error {\n\treadonly code: DurableServiceErrorCodeV1;\n\n\tconstructor(code: DurableServiceErrorCodeV1, message: string) {\n\t\tsuper(message);\n\t\tthis.name = \"DurableServiceErrorV1\";\n\t\tthis.code = code;\n\t}\n}\n\n// ---------------------------------------------------------------------------\n// Store backend (durable 落盘): JSONL append-only log contract\n// ---------------------------------------------------------------------------\n\n/** One committed record as carried in a {@link DurableStoreBackend} log. */\nexport type DurableStoreOperationV1 =\n\t| { readonly kind: \"session\"; readonly record: DurableSessionRecordV1 }\n\t| { readonly kind: \"operation\"; readonly record: DurableOperationRecordV1 }\n\t| { readonly kind: \"artifact\"; readonly record: DurableArtifactRecordV1 };\n/** Result of {@link DurableStoreBackend.load}: replayable operations plus skip diagnostics. */\nexport interface DurableStoreLoadResultV1 {\n\t/** Valid operations in log order — replay these into a fresh service. */\n\treadonly operations: readonly DurableStoreOperationV1[];\n\t/** Malformed lines (invalid JSON or invalid records) skipped during load. */\n\treadonly corruptedLines: number;\n\t/** True when the file existed but could not be read (permissions, IO error). */\n\treadonly unreadable: boolean;\n}\n\n/**\n * Durable log backend for {@link createDurableService}. The write path\n * appends every committed record; the read path `load()`s the log at\n * construction and replays it into the fresh in-memory maps (last write per\n * id wins, matching live persist semantics). The default\n * {@link FileDurableStoreBackend} never throws on load — corruption is\n * skipped and counted — and the append path runs under a cross-process\n * `.lock` file mutex and fsyncs, so hard crashes cannot lose the most recent\n * appends and concurrent processes cannot interleave lines (a torn trailing\n * line is still skipped by the loader's corruption tolerance). The lock\n * covers file writes only: the writer lease stays process-local memory.\n */\nexport interface DurableStoreBackend {\n\t/** Appends committed operations to the durable log, in order. */\n\tpersist(operations: readonly DurableStoreOperationV1[]): void;\n\t/**\n\t * Reads the whole log and returns the replayable operations plus skip\n\t * diagnostics. A missing log is an empty backend, not an error; malformed\n\t * lines are skipped and counted — load NEVER throws.\n\t */\n\tload(): DurableStoreLoadResultV1;\n\t/** Releases backend resources. Idempotent; a no-op for the file backend. */\n\tclose(): void;\n\t/**\n\t * Optional store-level writer lease (D-067 phase 2 S2). When present, the\n\t * service resolves its claim/recover/release against it, giving\n\t * cross-process lease mutual exclusion and crash recovery by TTL; when\n\t * absent, the writer lease stays process-local memory.\n\t */\n\treadonly lease?: DurableStoreLeaseV1;\n}\n\n/** Result of {@link DurableStoreLeaseV1.claim}. */\nexport type DurableStoreLeaseClaimV1 =\n\t| { readonly status: \"claimed\" }\n\t| { readonly status: \"held\"; readonly by: string };\n\n/** Result of {@link DurableStoreLeaseV1.recover}. */\nexport type DurableStoreLeaseRecoverV1 =\n\t| { readonly status: \"recovered\"; readonly previousWriter?: string }\n\t| { readonly status: \"held\" };\n\n/**\n * Store-level writer lease: a TTL-based mutual-exclusion token over the whole\n * store, visible across processes. `renew` is the heartbeat — the holder\n * extends its TTL on every persist — and doubles as the liveness check: a\n * writer whose lease expired (or was recovered by another process) fails its\n * next renew with `not_writer`, so stale writes fail closed. All methods may\n * throw `DurableServiceErrorV1` with code `not_writer`.\n */\nexport interface DurableStoreLeaseV1 {\n\t/** Takes the lease; fails while a live foreign holder exists. Re-claim by the live holder refreshes it. */\n\tclaim(writerId: string): DurableStoreLeaseClaimV1;\n\t/** Releases the lease when held by `writerId`; free/expired leases release idempotently; a foreign holder throws. */\n\trelease(writerId: string): { readonly status: \"released\" };\n\t/** Takes over the lease of a holder whose TTL lapsed (dead process); a live foreign holder is reported as `held`. */\n\trecover(writerId: string): DurableStoreLeaseRecoverV1;\n\t/** Heartbeat: extends the holder's TTL; throws `not_writer` when the lease was lost or expired. */\n\trenew(writerId: string): void;\n}\n\n/** The standard durable log path: `<agentDir>/durable/<sessionId>.jsonl`. */\nexport function durableLogPath(agentDir: string, sessionId: string): string {\n\treturn join(agentDir, \"durable\", `${sessionId}.jsonl`);\n}\n\nfunction assertNonEmptyString(value: unknown, label: string): asserts value is string {\n\tif (typeof value !== \"string\" || value.trim().length === 0) throw new Error(`${label} must be a non-empty string`);\n}\n\n/**\n * Writes every byte of `data` to the fd, looping over partial `writeSync`\n * results (a short write would silently break the fsync durability promise:\n * the caller fsyncs and closes only after the full payload is handed to the\n * OS). Same pattern as the memory ledger's write path, implemented here with\n * plain node:fs primitives so the file backend needs no ledger dependency.\n */\nconst writeAllSync = (fd: number, data: string): void => {\n\tconst buffer = Buffer.from(data, \"utf8\");\n\tlet written = 0;\n\twhile (written < buffer.length) {\n\t\twritten += writeSync(fd, buffer, written, buffer.length - written);\n\t}\n};\n\n// ---------------------------------------------------------------------------\n// Cross-process persist lock (ledger.ts lock protocol, no ledger import —\n// the two implementations must stay behaviorally identical)\n// ---------------------------------------------------------------------------\n\n/** Suffix of the persistence lock sibling file (`<logPath>.lock`). */\nconst LOCK_FILE_SUFFIX = \".lock\";\n/** Suffix of the store-level writer lease sibling file (`<logPath>.lease`). */\nconst LEASE_FILE_SUFFIX = \".lease\";\n/**\n * Wall-clock wait between lock acquisition attempts. Kept as a per-file\n * constant even though the memory ledger currently uses the same 25 ms value:\n * the two lock protocols stay independent.\n */\nconst LOCK_POLL_INTERVAL_MS = 25;\n/** Default ceiling on waiting for a competing writer's lock. */\nconst DEFAULT_LOCK_TIMEOUT_MS = 5000;\n/**\n * Default age at which a lock counts as abandoned (its writer crashed while\n * holding it). Deliberately far above any live hold time (milliseconds of a\n * bounded append) and above the wait timeout, so a waiter fails loudly at the\n * timeout instead of stealing a lock that might still be held.\n */\nconst DEFAULT_STALE_LOCK_MS = 60_000;\n/**\n * Default writer-lease TTL. The holder renews on every persist (heartbeat);\n * an idle-but-alive process that never persists loses the lease after this\n * window and must `recoverWriter` before writing again. Deliberately far\n * above any test-relevant hold so production never sees surprise expiries\n * within a single persist burst; tests pass small values explicitly.\n */\nconst DEFAULT_LEASE_TTL_MS = 30_000;\n\n/**\n * Takes the cross-process persist lock shared by every durable store file\n * write: exclusive create (`wx`) is the mutex; an existing lock is polled\n * until released, stolen once its mtime exceeds `staleLockMs` (crashed\n * writer), or turned into a thrown error at the wait deadline. The lock file\n * carries a per-acquisition token so a stale-steal victim releasing late can\n * never delete the thief's fresh lock. Same protocol as the memory ledger's\n * append lock (now the memory plugin package's ledger, plugins/memory), reimplemented here to avoid module\n * coupling; the wall-clock lock is a real-time mechanism, deliberately not\n * driven by any injected deterministic `now`.\n */\nfunction acquirePersistLock(lockPath: string, lockTimeoutMs: number, staleLockMs: number): string {\n\tconst deadline = Date.now() + lockTimeoutMs;\n\tfor (;;) {\n\t\tmkdirSync(dirname(lockPath), { recursive: true });\n\t\tconst token = `${process.pid}:${Date.now()}`;\n\t\ttry {\n\t\t\tconst fd = openSync(lockPath, \"wx\");\n\t\t\ttry {\n\t\t\t\twriteFileSync(fd, token);\n\t\t\t} finally {\n\t\t\t\tcloseSync(fd);\n\t\t\t}\n\t\t\treturn token;\n\t\t} catch (error) {\n\t\t\t// POSIX maps a lost create race to EEXIST; Windows/libuv maps the\n\t\t\t// same concurrent-create sharing violation to EPERM. Both mean the\n\t\t\t// lock file existed when we tried to create it — contend (poll /\n\t\t\t// stale-steal below). For EPERM the existence check re-stats: a\n\t\t\t// lock still there is contention, while ENOENT means the holder\n\t\t\t// released and deleted it between the failed open and this stat\n\t\t\t// (or Windows briefly left a delete-pending name that has now\n\t\t\t// gone) — the same vanished-lock window the EEXIST path tolerates,\n\t\t\t// so retry too. A stat error other than ENOENT means the EPERM was\n\t\t\t// a genuine permission failure and propagates, and the vanish path\n\t\t\t// still rethrows the original EPERM at the wait deadline: a\n\t\t\t// persistent EPERM with no lock file ever appearing is a genuine\n\t\t\t// permission failure, not a held lock.\n\t\t\tconst code = (error as NodeJS.ErrnoException).code;\n\t\t\tif (code === \"EPERM\") {\n\t\t\t\tlet vanished = false;\n\t\t\t\ttry {\n\t\t\t\t\tstatSync(lockPath);\n\t\t\t\t} catch (statError) {\n\t\t\t\t\tif ((statError as NodeJS.ErrnoException).code !== \"ENOENT\") throw error;\n\t\t\t\t\tvanished = true;\n\t\t\t\t}\n\t\t\t\tif (vanished) {\n\t\t\t\t\tif (Date.now() >= deadline) throw error;\n\t\t\t\t\tsleepSync(LOCK_POLL_INTERVAL_MS);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t} else if (code !== \"EEXIST\") {\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t\tlet stale = false;\n\t\t\ttry {\n\t\t\t\tstale = Date.now() - statSync(lockPath).mtimeMs > staleLockMs;\n\t\t\t} catch {\n\t\t\t\t// The holder released the lock between the failed open and the\n\t\t\t\t// stat — retry the exclusive create immediately.\n\t\t\t}\n\t\t\tif (stale) {\n\t\t\t\t// A crashed writer left the lock behind: steal it. A competing\n\t\t\t\t// waiter may steal first — the next exclusive create resolves that.\n\t\t\t\ttry {\n\t\t\t\t\tunlinkSync(lockPath);\n\t\t\t\t} catch {\n\t\t\t\t\t// Already stolen — retry.\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (Date.now() >= deadline) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`durable store persist lock timeout after ${lockTimeoutMs} ms: ${lockPath} is held by another writer`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tsleepSync(LOCK_POLL_INTERVAL_MS);\n\t\t}\n\t}\n}\n\n/** Releases the persist lock, but only if our own token still owns it. */\nfunction releasePersistLock(lockPath: string, token: string): void {\n\ttry {\n\t\tif (readFileSync(lockPath, \"utf8\") === token) unlinkSync(lockPath);\n\t} catch {\n\t\t// The lock is already gone (or unreadable) — nothing to release.\n\t}\n}\n\n/**\n * Creates a JSONL append-only file backend at `path`\n * (ledger.ts pattern: one committed record per line, trailing newline so a\n * crash-truncated tail stays well-formed for the loader). Every persist\n * serializes against other processes through a `<path>.lock` sibling using\n * the memory ledger's lock protocol (exclusive create + 25 ms poll + mtime\n * stale-lock stealing + token-guarded release): `lockTimeoutMs` bounds the\n * wall-clock wait (default 5 s) and `staleLockMs` the abandoned-lock age\n * (default 60 s) — both exist so tests can exercise the timeout and steal\n * paths quickly. The lock makes concurrent appends non-interleaving.\n *\n * The backend also exposes the store-level writer lease (`<path>.lease`\n * sibling, D-067 phase 2 S2): a `{ writerId, expiresAt }` JSON file guarded\n * by the same lock protocol, with a TTL the holder renews on every persist\n * (`leaseTtlMs`, default 30 s — small values exist for tests). A crashed\n * writer's lease becomes recoverable once its TTL lapses; a live foreign\n * holder makes `claim`/`recover` report `held` and the holder's next `renew`\n * (i.e. its next persist) fail closed with `not_writer`.\n */\nexport function createFileDurableStoreBackend(options: {\n\treadonly path: string;\n\t/** Wall-clock ceiling on waiting for a competing writer's lock; default 5 s. */\n\treadonly lockTimeoutMs?: number;\n\t/** Age at which a lock counts as abandoned and is stolen; default 60 s. */\n\treadonly staleLockMs?: number;\n\t/** Writer-lease TTL; the holder renews on every persist. Default 30 s. */\n\treadonly leaseTtlMs?: number;\n}): DurableStoreBackend {\n\tassertNonEmptyString(options.path, \"Durable store path\");\n\tif (options.lockTimeoutMs !== undefined && (!Number.isFinite(options.lockTimeoutMs) || options.lockTimeoutMs <= 0)) {\n\t\tthrow new Error(\"Durable store lockTimeoutMs must be a positive number\");\n\t}\n\tif (options.staleLockMs !== undefined && (!Number.isFinite(options.staleLockMs) || options.staleLockMs <= 0)) {\n\t\tthrow new Error(\"Durable store staleLockMs must be a positive number\");\n\t}\n\tif (options.leaseTtlMs !== undefined && (!Number.isFinite(options.leaseTtlMs) || options.leaseTtlMs <= 0)) {\n\t\tthrow new Error(\"Durable store leaseTtlMs must be a positive number\");\n\t}\n\tconst path = options.path;\n\tconst lockTimeoutMs = options.lockTimeoutMs ?? DEFAULT_LOCK_TIMEOUT_MS;\n\tconst staleLockMs = options.staleLockMs ?? DEFAULT_STALE_LOCK_MS;\n\tconst leaseTtlMs = options.leaseTtlMs ?? DEFAULT_LEASE_TTL_MS;\n\tconst lockPath = `${path}${LOCK_FILE_SUFFIX}`;\n\tconst leasePath = `${path}${LEASE_FILE_SUFFIX}`;\n\n\t/** Reads the lease file; missing, unreadable, or malformed content = no lease. */\n\tconst readLease = (): { readonly writerId: string; readonly expiresAt: number } | undefined => {\n\t\ttry {\n\t\t\tconst value: unknown = JSON.parse(readFileSync(leasePath, \"utf8\"));\n\t\t\tif (typeof value !== \"object\" || value === null || Array.isArray(value)) return undefined;\n\t\t\tconst writerId = (value as { writerId?: unknown }).writerId;\n\t\t\tconst expiresAt = (value as { expiresAt?: unknown }).expiresAt;\n\t\t\tif (typeof writerId !== \"string\" || writerId.length === 0) return undefined;\n\t\t\tif (typeof expiresAt !== \"number\" || !Number.isFinite(expiresAt)) return undefined;\n\t\t\treturn { writerId, expiresAt };\n\t\t} catch {\n\t\t\treturn undefined;\n\t\t}\n\t};\n\n\t/**\n\t * Overwrites the lease file (caller holds the persist lock). Deliberately\n\t * NOT fsynced: the lease is a liveness token, not data — the worst case of\n\t * a torn post-crash write is a free lease, which the recover path handles.\n\t */\n\tconst writeLease = (writerId: string, expiresAt: number): void => {\n\t\tconst fd = openSync(leasePath, \"w\");\n\t\ttry {\n\t\t\twriteAllSync(fd, JSON.stringify({ writerId, expiresAt }));\n\t\t} finally {\n\t\t\tcloseSync(fd);\n\t\t}\n\t};\n\n\t/** True when `current` names a different writer whose TTL has not lapsed. */\n\tconst liveForeign = (\n\t\tcurrent: { readonly writerId: string; readonly expiresAt: number },\n\t\twriterId: string,\n\t): boolean => current.writerId !== writerId && Date.now() <= current.expiresAt;\n\n\tconst lease: DurableStoreLeaseV1 = {\n\t\tclaim(writerId) {\n\t\t\tconst token = acquirePersistLock(lockPath, lockTimeoutMs, staleLockMs);\n\t\t\ttry {\n\t\t\t\tconst current = readLease();\n\t\t\t\tif (current !== undefined && liveForeign(current, writerId))\n\t\t\t\t\treturn { status: \"held\", by: current.writerId };\n\t\t\t\twriteLease(writerId, Date.now() + leaseTtlMs);\n\t\t\t\treturn { status: \"claimed\" };\n\t\t\t} finally {\n\t\t\t\treleasePersistLock(lockPath, token);\n\t\t\t}\n\t\t},\n\t\trelease(writerId) {\n\t\t\tconst token = acquirePersistLock(lockPath, lockTimeoutMs, staleLockMs);\n\t\t\ttry {\n\t\t\t\tconst current = readLease();\n\t\t\t\tif (current === undefined || current.writerId === writerId) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tunlinkSync(leasePath);\n\t\t\t\t\t} catch {\n\t\t\t\t\t\t// Already gone (or vanished between the read and the unlink).\n\t\t\t\t\t}\n\t\t\t\t\treturn { status: \"released\" };\n\t\t\t\t}\n\t\t\t\tthrow new DurableServiceErrorV1(\n\t\t\t\t\t\"not_writer\",\n\t\t\t\t\t`Writer ${writerId} does not hold the store lease (held by ${current.writerId})`,\n\t\t\t\t);\n\t\t\t} finally {\n\t\t\t\treleasePersistLock(lockPath, token);\n\t\t\t}\n\t\t},\n\t\trecover(writerId) {\n\t\t\tconst token = acquirePersistLock(lockPath, lockTimeoutMs, staleLockMs);\n\t\t\ttry {\n\t\t\t\tconst current = readLease();\n\t\t\t\tif (current !== undefined && liveForeign(current, writerId)) return { status: \"held\" };\n\t\t\t\tconst previousWriter =\n\t\t\t\t\tcurrent !== undefined && current.writerId !== writerId ? current.writerId : undefined;\n\t\t\t\twriteLease(writerId, Date.now() + leaseTtlMs);\n\t\t\t\treturn previousWriter === undefined ? { status: \"recovered\" } : { status: \"recovered\", previousWriter };\n\t\t\t} finally {\n\t\t\t\treleasePersistLock(lockPath, token);\n\t\t\t}\n\t\t},\n\t\trenew(writerId) {\n\t\t\tconst token = acquirePersistLock(lockPath, lockTimeoutMs, staleLockMs);\n\t\t\ttry {\n\t\t\t\tconst current = readLease();\n\t\t\t\tif (current === undefined || current.writerId !== writerId || Date.now() > current.expiresAt) {\n\t\t\t\t\tthrow new DurableServiceErrorV1(\n\t\t\t\t\t\t\"not_writer\",\n\t\t\t\t\t\t`Writer ${writerId} lost the store lease (expired or recovered by another writer)`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\twriteLease(writerId, Date.now() + leaseTtlMs);\n\t\t\t} finally {\n\t\t\t\treleasePersistLock(lockPath, token);\n\t\t\t}\n\t\t},\n\t};\n\n\treturn {\n\t\tpersist(operations) {\n\t\t\tif (operations.length === 0) return;\n\t\t\tconst lines = operations.map((operation) => `${JSON.stringify(storeOperationEnvelope(operation))}\\n`);\n\t\t\t// Competing writers — including another server process — serialize\n\t\t\t// through the `.lock` sibling before the fsynced append, so lines from\n\t\t\t// concurrent processes never interleave (ledger.ts lock protocol).\n\t\t\t// Lock acquisition creates the parent directory, as in the ledger.\n\t\t\tconst token = acquirePersistLock(lockPath, lockTimeoutMs, staleLockMs);\n\t\t\ttry {\n\t\t\t\t// Append is fsynced before close: once persist returns, a hard\n\t\t\t\t// crash cannot lose the appended lines (open → write → fsync →\n\t\t\t\t// close, the same durability pattern as the memory ledger). A\n\t\t\t\t// failure inside the lock releases it and propagates; no\n\t\t\t\t// in-memory state of the service is touched (write-ahead).\n\t\t\t\tconst fd = openSync(path, \"a\");\n\t\t\t\ttry {\n\t\t\t\t\twriteAllSync(fd, lines.join(\"\"));\n\t\t\t\t\tfsyncSync(fd);\n\t\t\t\t} finally {\n\t\t\t\t\tcloseSync(fd);\n\t\t\t\t}\n\t\t\t} finally {\n\t\t\t\treleasePersistLock(lockPath, token);\n\t\t\t}\n\t\t},\n\t\tload() {\n\t\t\tlet raw: string;\n\t\t\ttry {\n\t\t\t\traw = readFileSync(path, \"utf8\");\n\t\t\t} catch (error) {\n\t\t\t\tif ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n\t\t\t\t\treturn { operations: [], corruptedLines: 0, unreadable: false };\n\t\t\t\t}\n\t\t\t\treturn { operations: [], corruptedLines: 0, unreadable: true };\n\t\t\t}\n\t\t\tconst operations: DurableStoreOperationV1[] = [];\n\t\t\tlet corruptedLines = 0;\n\t\t\tfor (const line of raw.split(\"\\n\")) {\n\t\t\t\tif (line.trim() === \"\") continue;\n\t\t\t\tconst operation = parseStoreOperationLine(line);\n\t\t\t\tif (operation === undefined) {\n\t\t\t\t\tcorruptedLines += 1;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\toperations.push(operation);\n\t\t\t}\n\t\t\treturn { operations, corruptedLines, unreadable: false };\n\t\t},\n\t\tclose() {\n\t\t\t// Files are opened per append; nothing persistent to release. The\n\t\t\t// hook exists for backends that hold resources (handles, sockets).\n\t\t},\n\t\tlease,\n\t};\n}\n\n/** Flat one-line envelope: the kind discriminator plus the record fields. */\nfunction storeOperationEnvelope(operation: DurableStoreOperationV1): Record<string, unknown> {\n\treturn { kind: operation.kind, ...operation.record };\n}\n\n/** Parses one log line; undefined when it is malformed (skipped and counted). */\nfunction parseStoreOperationLine(line: string): DurableStoreOperationV1 | undefined {\n\ttry {\n\t\tconst value: unknown = JSON.parse(line);\n\t\tif (typeof value !== \"object\" || value === null || Array.isArray(value)) return undefined;\n\t\tconst record = value as Record<string, unknown>;\n\t\tswitch (record.kind) {\n\t\t\tcase \"session\": {\n\t\t\t\tconst base = importRecordBase(record, \"sessionId\", \"Durable store session record\");\n\t\t\t\treturn {\n\t\t\t\t\tkind: \"session\",\n\t\t\t\t\trecord: { sessionId: base.id, data: base.data, persistedAt: base.persistedAt },\n\t\t\t\t};\n\t\t\t}\n\t\t\tcase \"operation\": {\n\t\t\t\tconst base = importRecordBase(record, \"operationId\", \"Durable store operation record\");\n\t\t\t\treturn {\n\t\t\t\t\tkind: \"operation\",\n\t\t\t\t\trecord: {\n\t\t\t\t\t\toperationId: base.id,\n\t\t\t\t\t\tsessionId: importOwningSessionId(record, \"Durable store operation record\"),\n\t\t\t\t\t\tdata: base.data,\n\t\t\t\t\t\tpersistedAt: base.persistedAt,\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t}\n\t\t\tcase \"artifact\": {\n\t\t\t\tconst base = importRecordBase(record, \"artifactId\", \"Durable store artifact record\");\n\t\t\t\treturn {\n\t\t\t\t\tkind: \"artifact\",\n\t\t\t\t\trecord: {\n\t\t\t\t\t\tartifactId: base.id,\n\t\t\t\t\t\tsessionId: importOwningSessionId(record, \"Durable store artifact record\"),\n\t\t\t\t\t\tdata: base.data,\n\t\t\t\t\t\tpersistedAt: base.persistedAt,\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t}\n\t\t\tdefault:\n\t\t\t\treturn undefined;\n\t\t}\n\t} catch {\n\t\t// Corruption tolerance: a malformed line is skipped and counted — a\n\t\t// damaged log must never fail the startup replay.\n\t\treturn undefined;\n\t}\n}\n\nexport interface DurableServiceOptionsV1 {\n\t/** Deterministic clock for `persistedAt`/`exportedAt`; defaults to `Date.now`. */\n\treadonly now?: () => number;\n\t/**\n\t * Optional durable log backend. Without it the service stays purely\n\t * in-memory (backward-compatible MVP behavior); with it every committed\n\t * record is appended to the backend log before the in-memory maps update\n\t * (write-ahead: an append failure leaves memory untouched) and the log is\n\t * replayed at construction to restore state.\n\t */\n\treadonly backend?: DurableStoreBackend;\n}\n\nfunction assertObject(value: unknown, label: string): asserts value is Record<string, unknown> {\n\tif (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n\t\tthrow new Error(`${label} must be an object`);\n\t}\n}\n\ninterface ImportedRecordV1 {\n\treadonly id: string;\n\treadonly data: unknown;\n\treadonly persistedAt: number;\n}\n\nfunction importRecordBase(\n\tvalue: Record<string, unknown>,\n\tidField: \"sessionId\" | \"operationId\" | \"artifactId\",\n\tlabel: string,\n): ImportedRecordV1 {\n\tconst id = value[idField];\n\tif (typeof id !== \"string\" || id.length === 0) throw new Error(`${label} ${idField} must be a non-empty string`);\n\tconst persistedAt = value.persistedAt;\n\tif (typeof persistedAt !== \"number\" || !Number.isFinite(persistedAt)) {\n\t\tthrow new Error(`${label} persistedAt must be a finite number`);\n\t}\n\t// Legacy (pre-单机收敛) log lines and snapshots may carry a `tenantId` key\n\t// from the removed multi-tenant machinery; it is tolerated as an ignored\n\t// extra key (D-068 增补 1), so it is simply never read here.\n\treturn { id, data: value.data, persistedAt };\n}\n\nfunction importOwningSessionId(value: Record<string, unknown>, label: string): string {\n\tconst sessionId = value.sessionId;\n\tif (typeof sessionId !== \"string\" || sessionId.length === 0) {\n\t\tthrow new Error(`${label} sessionId must be a non-empty string`);\n\t}\n\treturn sessionId;\n}\n\nexport function createDurableService(options: DurableServiceOptionsV1 = {}): DurableServiceV1 {\n\tconst now = options.now ?? (() => Date.now());\n\tconst sessions = new Map<string, DurableSessionRecordV1>();\n\tconst operations = new Map<string, DurableOperationRecordV1>();\n\tconst artifacts = new Map<string, DurableArtifactRecordV1>();\n\n\t/** Current lease holder; `null` when unclaimed or crash-pending. */\n\tlet holder: string | null = null;\n\t/** Writer found dead in a restored snapshot; blocks claims and writes until recovered. */\n\tlet crashPending: string | null = null;\n\n\t// Startup replay (durable 落盘): with a backend, the log is the source of\n\t// truth for records — replay restores the maps with last-write-wins, the\n\t// same semantics as live persists. With a backend lease (D-067 phase 2\n\t// S2) the writer lease resolves against the store (cross-process mutual\n\t// exclusion, TTL crash recovery); without one it stays process-local.\n\tconst backend = options.backend;\n\tconst backendLease = backend?.lease;\n\tlet replay: DurableReplayDiagnosticsV1 = { corruptedLines: 0, unreadable: false };\n\tif (backend) {\n\t\tconst loaded = backend.load();\n\t\tfor (const operation of loaded.operations) {\n\t\t\tswitch (operation.kind) {\n\t\t\t\tcase \"session\":\n\t\t\t\t\tsessions.set(operation.record.sessionId, operation.record);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"operation\":\n\t\t\t\t\toperations.set(operation.record.operationId, operation.record);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"artifact\":\n\t\t\t\t\tartifacts.set(operation.record.artifactId, operation.record);\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\treplay = { corruptedLines: loaded.corruptedLines, unreadable: loaded.unreadable };\n\t}\n\n\t/** Write-ahead log append; an append failure leaves the maps untouched. */\n\tconst logOperation = (operation: DurableStoreOperationV1): void => {\n\t\tif (backend) backend.persist([operation]);\n\t};\n\n\tfunction requireWriter(writerId: string): void {\n\t\tif (holder !== writerId) {\n\t\t\tthrow new DurableServiceErrorV1(\"not_writer\", `Writer ${writerId} does not hold the writer lease`);\n\t\t}\n\t\t// Store-level heartbeat + liveness check (D-067 phase 2 S2): another\n\t\t// process recovering our expired lease fail-closes this write instead\n\t\t// of letting a stale writer interleave records.\n\t\tbackendLease?.renew(writerId);\n\t}\n\n\treturn {\n\t\tpersistSession(input) {\n\t\t\trequireWriter(input.writerId);\n\t\t\tconst record: DurableSessionRecordV1 = {\n\t\t\t\tsessionId: input.sessionId,\n\t\t\t\tdata: input.data,\n\t\t\t\tpersistedAt: now(),\n\t\t\t};\n\t\t\tlogOperation({ kind: \"session\", record });\n\t\t\tsessions.set(input.sessionId, record);\n\t\t\treturn record;\n\t\t},\n\t\tloadSession(input) {\n\t\t\treturn sessions.get(input.sessionId);\n\t\t},\n\t\tpersistOperation(input) {\n\t\t\trequireWriter(input.writerId);\n\t\t\tconst record: DurableOperationRecordV1 = {\n\t\t\t\toperationId: input.operationId,\n\t\t\t\tsessionId: input.sessionId,\n\t\t\t\tdata: input.data,\n\t\t\t\tpersistedAt: now(),\n\t\t\t};\n\t\t\tlogOperation({ kind: \"operation\", record });\n\t\t\toperations.set(input.operationId, record);\n\t\t\treturn record;\n\t\t},\n\t\tloadOperation(input) {\n\t\t\treturn operations.get(input.operationId);\n\t\t},\n\t\tpersistArtifact(input) {\n\t\t\trequireWriter(input.writerId);\n\t\t\tconst record: DurableArtifactRecordV1 = {\n\t\t\t\tartifactId: input.artifactId,\n\t\t\t\tsessionId: input.sessionId,\n\t\t\t\tdata: input.data,\n\t\t\t\tpersistedAt: now(),\n\t\t\t};\n\t\t\tlogOperation({ kind: \"artifact\", record });\n\t\t\tartifacts.set(input.artifactId, record);\n\t\t\treturn record;\n\t\t},\n\t\tloadArtifact(input) {\n\t\t\treturn artifacts.get(input.artifactId);\n\t\t},\n\t\tlistSessions() {\n\t\t\treturn (\n\t\t\t\t[...sessions.values()]\n\t\t\t\t\t// v8 ignore next -- sessionId 是 Map 键恒唯一,相等比较路径不可达\n\t\t\t\t\t.sort((a, b) => (a.sessionId < b.sessionId ? -1 : a.sessionId > b.sessionId ? 1 : 0))\n\t\t\t);\n\t\t},\n\t\tclaimWriter(writerId) {\n\t\t\tif (crashPending !== null) return { status: \"held\", by: crashPending };\n\t\t\tif (backendLease === undefined) {\n\t\t\t\tif (holder !== null && holder !== writerId) return { status: \"held\", by: holder };\n\t\t\t\tholder = writerId;\n\t\t\t\treturn { status: \"claimed\" };\n\t\t\t}\n\t\t\tconst result = backendLease.claim(writerId);\n\t\t\tif (result.status === \"claimed\") {\n\t\t\t\tholder = writerId;\n\t\t\t\treturn { status: \"claimed\" };\n\t\t\t}\n\t\t\treturn { status: \"held\", by: result.by };\n\t\t},\n\t\treleaseWriter(writerId) {\n\t\t\tif (crashPending !== null) {\n\t\t\t\tthrow new DurableServiceErrorV1(\n\t\t\t\t\t\"not_writer\",\n\t\t\t\t\t`Writer ${writerId} cannot release a crashed lease; recover it instead`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (backendLease === undefined) {\n\t\t\t\tif (holder !== null && holder !== writerId) {\n\t\t\t\t\tthrow new DurableServiceErrorV1(\n\t\t\t\t\t\t\"not_writer\",\n\t\t\t\t\t\t`Writer ${writerId} does not hold the writer lease (held by ${holder})`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tholder = null;\n\t\t\t\treturn { status: \"released\" };\n\t\t\t}\n\t\t\tconst result = backendLease.release(writerId);\n\t\t\tholder = null;\n\t\t\treturn result;\n\t\t},\n\t\trecoverWriter(writerId) {\n\t\t\tif (crashPending !== null) {\n\t\t\t\tconst previousWriter = crashPending;\n\t\t\t\tcrashPending = null;\n\t\t\t\tholder = writerId;\n\t\t\t\treturn { status: \"recovered\", previousWriter };\n\t\t\t}\n\t\t\tif (backendLease === undefined) {\n\t\t\t\tif (holder !== null && holder !== writerId) return { status: \"held\" };\n\t\t\t\tholder = writerId;\n\t\t\t\treturn { status: \"recovered\" };\n\t\t\t}\n\t\t\tconst result = backendLease.recover(writerId);\n\t\t\tif (result.status === \"recovered\") {\n\t\t\t\tholder = writerId;\n\t\t\t\treturn result.previousWriter === undefined\n\t\t\t\t\t? { status: \"recovered\" }\n\t\t\t\t\t: { status: \"recovered\", previousWriter: result.previousWriter };\n\t\t\t}\n\t\t\treturn { status: \"held\" };\n\t\t},\n\t\treadiness() {\n\t\t\tif (crashPending !== null) {\n\t\t\t\treturn { ready: false, reason: `writer crash is pending recovery: ${crashPending}` };\n\t\t\t}\n\t\t\tif (holder === null) {\n\t\t\t\treturn { ready: false, reason: \"no writer has claimed the lease\" };\n\t\t\t}\n\t\t\treturn { ready: true };\n\t\t},\n\t\texportState() {\n\t\t\treturn {\n\t\t\t\tversion: 1 as const,\n\t\t\t\texportedAt: now(),\n\t\t\t\tsessions: [...sessions.values()],\n\t\t\t\toperations: [...operations.values()],\n\t\t\t\tartifacts: [...artifacts.values()],\n\t\t\t\twriter: { holder, crashPending },\n\t\t\t};\n\t\t},\n\t\timportState(snapshot) {\n\t\t\tassertObject(snapshot, \"Durable snapshot\");\n\t\t\tif (snapshot.version !== 1) {\n\t\t\t\tthrow new Error(`Unsupported durable snapshot version: ${String(snapshot.version)}`);\n\t\t\t}\n\t\t\tfor (const field of [\"sessions\", \"operations\", \"artifacts\"] as const) {\n\t\t\t\tif (!Array.isArray(snapshot[field])) throw new Error(`Durable snapshot ${field} must be an array`);\n\t\t\t}\n\t\t\tconst writer = snapshot.writer;\n\t\t\tassertObject(writer, \"Durable snapshot writer\");\n\t\t\tconst snapshotHolder = writer.holder;\n\t\t\tconst snapshotCrashPending = writer.crashPending;\n\t\t\tif (snapshotHolder !== null && typeof snapshotHolder !== \"string\") {\n\t\t\t\tthrow new Error(\"Durable snapshot writer holder must be a string or null\");\n\t\t\t}\n\t\t\tif (snapshotCrashPending !== null && typeof snapshotCrashPending !== \"string\") {\n\t\t\t\tthrow new Error(\"Durable snapshot writer crashPending must be a string or null\");\n\t\t\t}\n\n\t\t\tconst importedSessions = new Map<string, DurableSessionRecordV1>();\n\t\t\tfor (const raw of snapshot.sessions as unknown[]) {\n\t\t\t\tassertObject(raw, \"Durable snapshot session\");\n\t\t\t\tconst record = importRecordBase(raw, \"sessionId\", \"Durable snapshot session\");\n\t\t\t\timportedSessions.set(record.id, {\n\t\t\t\t\tsessionId: record.id,\n\t\t\t\t\tdata: record.data,\n\t\t\t\t\tpersistedAt: record.persistedAt,\n\t\t\t\t});\n\t\t\t}\n\t\t\tconst importedOperations = new Map<string, DurableOperationRecordV1>();\n\t\t\tfor (const raw of snapshot.operations as unknown[]) {\n\t\t\t\tassertObject(raw, \"Durable snapshot operation\");\n\t\t\t\tconst record = importRecordBase(raw, \"operationId\", \"Durable snapshot operation\");\n\t\t\t\timportedOperations.set(record.id, {\n\t\t\t\t\toperationId: record.id,\n\t\t\t\t\tsessionId: importOwningSessionId(raw, \"Durable snapshot operation\"),\n\t\t\t\t\tdata: record.data,\n\t\t\t\t\tpersistedAt: record.persistedAt,\n\t\t\t\t});\n\t\t\t}\n\t\t\tconst importedArtifacts = new Map<string, DurableArtifactRecordV1>();\n\t\t\tfor (const raw of snapshot.artifacts as unknown[]) {\n\t\t\t\tassertObject(raw, \"Durable snapshot artifact\");\n\t\t\t\tconst record = importRecordBase(raw, \"artifactId\", \"Durable snapshot artifact\");\n\t\t\t\timportedArtifacts.set(record.id, {\n\t\t\t\t\tartifactId: record.id,\n\t\t\t\t\tsessionId: importOwningSessionId(raw, \"Durable snapshot artifact\"),\n\t\t\t\t\tdata: record.data,\n\t\t\t\t\tpersistedAt: record.persistedAt,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tsessions.clear();\n\t\t\tfor (const [id, record] of importedSessions) sessions.set(id, record);\n\t\t\toperations.clear();\n\t\t\tfor (const [id, record] of importedOperations) operations.set(id, record);\n\t\t\tartifacts.clear();\n\t\t\tfor (const [id, record] of importedArtifacts) artifacts.set(id, record);\n\n\t\t\t// A writer recorded in the snapshot belonged to the process that\n\t\t\t// produced it; it cannot be alive in this one, so its lease needs\n\t\t\t// recovery before anyone may write again.\n\t\t\tholder = null;\n\t\t\tcrashPending = snapshotHolder ?? snapshotCrashPending;\n\t\t},\n\t\treplayDiagnostics() {\n\t\t\treturn replay;\n\t\t},\n\t};\n}\n"]}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { ProtocolTestClient } from "../../../server/src/testing/client.ts";
|
|
2
|
+
export interface StdioChildExit {
|
|
3
|
+
readonly code: number | null;
|
|
4
|
+
readonly signal: string | null;
|
|
5
|
+
/** Set when the child could not be spawned at all (carries the message). */
|
|
6
|
+
readonly spawnError?: string;
|
|
7
|
+
}
|
|
8
|
+
export interface StdioE2EServerHandle {
|
|
9
|
+
/** Protocol test client wired to the child's stdin/stdout pipes. */
|
|
10
|
+
readonly client: ProtocolTestClient;
|
|
11
|
+
/** Resolves once the child process has exited (or failed to spawn). */
|
|
12
|
+
readonly exited: Promise<StdioChildExit>;
|
|
13
|
+
/** Child stderr collected so far; useful in failure diagnostics. */
|
|
14
|
+
stderrText(): string;
|
|
15
|
+
/** Forcefully terminates the child if it is still running, then reaps it. */
|
|
16
|
+
kill(): Promise<StdioChildExit>;
|
|
17
|
+
/** Best-effort cleanup: close the pipe, reap the child, remove temp files. */
|
|
18
|
+
dispose(): Promise<void>;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Launches a real child process serving a deterministic PiServer over stdio
|
|
22
|
+
* and returns a protocol test client connected to its pipes.
|
|
23
|
+
*/
|
|
24
|
+
export declare function launchStdioE2EServer(): Promise<StdioE2EServerHandle>;
|
|
25
|
+
//# sourceMappingURL=stdio-launcher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stdio-launcher.d.ts","sourceRoot":"","sources":["../../src/e2e/stdio-launcher.ts"],"names":[],"mappings":"AA0BA,OAAO,EAAE,kBAAkB,EAAoB,MAAM,uCAAuC,CAAC;AAU7F,MAAM,WAAW,cAAc;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,4EAA4E;IAC5E,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,oBAAoB;IACpC,oEAAoE;IACpE,QAAQ,CAAC,MAAM,EAAE,kBAAkB,CAAC;IACpC,uEAAuE;IACvE,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC;IACzC,oEAAoE;IACpE,UAAU,IAAI,MAAM,CAAC;IACrB,6EAA6E;IAC7E,IAAI,IAAI,OAAO,CAAC,cAAc,CAAC,CAAC;IAChC,8EAA8E;IAC9E,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACzB;AAWD;;;GAGG;AACH,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,oBAAoB,CAAC,CA0E1E","sourcesContent":["/**\n * Stdio transport E2E launcher (slice 3.2).\n *\n * Topology: the vitest process (protocol client) talks to a real child process\n * over real stdio pipes. The child runs this same file as its entry point\n * (plain `node`, which strips the erasable TypeScript itself), hosts a\n * `PiServer` wired to `process.stdin`/`process.stdout` through a\n * `ByteConnection` adapter, and serves connections via `PiServer.accept`.\n * Nothing here fakes the transport: every protocol frame crosses an OS pipe\n * boundary twice, and connection close means the child process actually exits.\n *\n * Determinism: the child server uses a fixed server id, a fixed injected clock,\n * and one pre-seeded session id; the only random value on the wire is the\n * server-generated `connectionId`, which tests must normalize. The launcher\n * also generates a module-resolution hook so the child resolves\n * `@agent-forge/protocol` to workspace *source* (the workspace `dist` build\n * can be stale); both ends of the wire therefore always run the same protocol\n * implementation the test process sees.\n */\nimport { type ChildProcessWithoutNullStreams, spawn } from \"node:child_process\";\nimport { mkdtemp, rm, writeFile } from \"node:fs/promises\";\nimport { tmpdir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { fileURLToPath, pathToFileURL } from \"node:url\";\nimport type { ByteConnection } from \"../../../server/src/connection.ts\";\nimport { PiServer } from \"../../../server/src/server.ts\";\nimport { ProtocolTestClient, type WireChannel } from \"../../../server/src/testing/client.ts\";\nimport { TestServerService } from \"../../../server/src/testing/service.ts\";\n\n/** Argv marker that switches this module into child-server mode. */\nconst STDIO_E2E_CHILD_FLAG = \"--agent-forge-stdio-e2e-server\";\nconst STDIO_E2E_SERVER_ID = \"stdio-e2e-server\";\nconst STDIO_E2E_SESSION_ID = \"session-1\";\nconst STDIO_E2E_FIXED_NOW_MS = 1_000;\nconst PROTOCOL_SRC_ENV = \"AGENT_FORGE_E2E_PROTOCOL_SRC\";\n\nexport interface StdioChildExit {\n\treadonly code: number | null;\n\treadonly signal: string | null;\n\t/** Set when the child could not be spawned at all (carries the message). */\n\treadonly spawnError?: string;\n}\n\nexport interface StdioE2EServerHandle {\n\t/** Protocol test client wired to the child's stdin/stdout pipes. */\n\treadonly client: ProtocolTestClient;\n\t/** Resolves once the child process has exited (or failed to spawn). */\n\treadonly exited: Promise<StdioChildExit>;\n\t/** Child stderr collected so far; useful in failure diagnostics. */\n\tstderrText(): string;\n\t/** Forcefully terminates the child if it is still running, then reaps it. */\n\tkill(): Promise<StdioChildExit>;\n\t/** Best-effort cleanup: close the pipe, reap the child, remove temp files. */\n\tdispose(): Promise<void>;\n}\n\nconst launcherPath = fileURLToPath(import.meta.url);\nconst protocolSrcPath = fileURLToPath(new URL(\"../../../protocol/src/index.ts\", import.meta.url));\n\n// v8 ignore next -- 子进程入口分支只在真实子进程中为真,父进程覆盖统计无法归因\nif (process.argv[2] === STDIO_E2E_CHILD_FLAG) {\n\t// v8 ignore next -- 仅在子进程模式下执行,父进程 V8 覆盖不归因子进程\n\trunStdioE2EServerChild();\n}\n\n/**\n * Launches a real child process serving a deterministic PiServer over stdio\n * and returns a protocol test client connected to its pipes.\n */\nexport async function launchStdioE2EServer(): Promise<StdioE2EServerHandle> {\n\tconst hookDir = await mkdtemp(join(tmpdir(), \"af-stdio-e2e-\"));\n\tconst hookFile = join(hookDir, \"protocol-src-hook.mjs\");\n\tconst registerFile = join(hookDir, \"register-hooks.mjs\");\n\tawait writeFile(hookFile, protocolSrcHookSource, \"utf8\");\n\tawait writeFile(registerFile, registerHooksSource, \"utf8\");\n\n\t// `--import` treats its value as a module specifier, which on Windows must\n\t// be a file:// URL, not a drive-letter path.\n\tconst child = spawn(\n\t\tprocess.execPath,\n\t\t[\n\t\t\t\"--disable-warning=ExperimentalWarning\",\n\t\t\t\"--import\",\n\t\t\tpathToFileURL(registerFile).href,\n\t\t\tlauncherPath,\n\t\t\tSTDIO_E2E_CHILD_FLAG,\n\t\t],\n\t\t{\n\t\t\tstdio: [\"pipe\", \"pipe\", \"pipe\"],\n\t\t\tenv: {\n\t\t\t\t...process.env,\n\t\t\t\t[PROTOCOL_SRC_ENV]: protocolSrcPath,\n\t\t\t},\n\t\t},\n\t);\n\n\tconst stderrChunks: Buffer[] = [];\n\tchild.stderr.on(\"data\", (chunk: Buffer) => {\n\t\t// v8 ignore next -- 仅当子进程输出 stderr 时触发\n\t\tstderrChunks.push(chunk);\n\t});\n\n\tlet exitSettled = false;\n\tconst exited = new Promise<StdioChildExit>((resolve) => {\n\t\tchild.once(\"error\", (error) => {\n\t\t\texitSettled = true;\n\t\t\tresolve({ code: null, signal: null, spawnError: error.message });\n\t\t});\n\t\tchild.once(\"exit\", (code, signal) => {\n\t\t\texitSettled = true;\n\t\t\tresolve({ code, signal });\n\t\t});\n\t});\n\n\tconst client = new ProtocolTestClient(createStdioWireChannel(child));\n\tchild.stdout.on(\"data\", (chunk: Buffer) => {\n\t\tclient.receive(new Uint8Array(chunk.buffer, chunk.byteOffset, chunk.byteLength));\n\t});\n\tchild.stdout.once(\"end\", () => {\n\t\tclient.markClosed();\n\t});\n\tchild.stdout.on(\"error\", (error) => {\n\t\t// v8 ignore next -- 子进程 stdout 错误事件无法在测试中制造\n\t\tclient.fail(error);\n\t});\n\n\treturn {\n\t\tclient,\n\t\texited,\n\t\tstderrText: () => Buffer.concat(stderrChunks).toString(\"utf8\"),\n\t\tasync kill() {\n\t\t\tif (!exitSettled && child.exitCode === null && child.signalCode === null) child.kill(\"SIGKILL\");\n\t\t\treturn exited;\n\t\t},\n\t\tasync dispose() {\n\t\t\tcloseStdin(child);\n\t\t\tconst exit = await Promise.race([exited, childExitWatchdog()]);\n\t\t\tif (exit === undefined) child.kill(\"SIGKILL\");\n\t\t\t// v8 ignore next -- exited 永远不会 reject,该 catch 回调不可达\n\t\t\tawait exited.catch(() => undefined);\n\t\t\tawait rm(hookDir, { recursive: true, force: true });\n\t\t},\n\t};\n}\n\nfunction createStdioWireChannel(child: ChildProcessWithoutNullStreams): WireChannel {\n\treturn {\n\t\tsend(chunk) {\n\t\t\treturn writeChunk(child, chunk);\n\t\t},\n\t\tasync sendFragmented(chunk, splitAt) {\n\t\t\tawait writeChunk(child, chunk.subarray(0, splitAt));\n\t\t\tawait writeChunk(child, chunk.subarray(splitAt));\n\t\t},\n\t\tasync close() {\n\t\t\tawait new Promise<void>((resolve) => {\n\t\t\t\tif (child.stdin.writableEnded || child.stdin.destroyed) {\n\t\t\t\t\tresolve();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tchild.stdin.end(() => resolve());\n\t\t\t});\n\t\t},\n\t};\n}\n\nfunction writeChunk(child: ChildProcessWithoutNullStreams, chunk: Uint8Array): Promise<void> {\n\treturn new Promise<void>((resolve, reject) => {\n\t\tif (child.stdin.destroyed || child.stdin.writableEnded) {\n\t\t\treject(new Error(\"stdio e2e child stdin is closed\"));\n\t\t\treturn;\n\t\t}\n\t\tchild.stdin.write(chunk, (error) => {\n\t\t\tif (error) reject(error);\n\t\t\telse resolve();\n\t\t});\n\t});\n}\n\nfunction closeStdin(child: ChildProcessWithoutNullStreams): void {\n\ttry {\n\t\tif (!child.stdin.destroyed && !child.stdin.writableEnded) child.stdin.end();\n\t} catch {\n\t\t// The pipe may already be gone if the child exited; nothing to clean up.\n\t}\n}\n\nfunction childExitWatchdog(): Promise<undefined> {\n\treturn new Promise((resolve) => {\n\t\tsetTimeout(() => resolve(undefined), 5_000).unref();\n\t});\n}\n\n/**\n * Child-process body: serves one PiServer connection over this process's\n * stdin/stdout. Exits cleanly once both pipe directions are closed.\n */\n// v8 ignore start -- 以下函数仅在 spawn 出去的子进程中执行,父进程 V8 覆盖不归因子进程\nfunction runStdioE2EServerChild(): void {\n\tconst service = new TestServerService();\n\tservice.seed(STDIO_E2E_SESSION_ID);\n\tconst server = new PiServer(service, {\n\t\tlisteners: [],\n\t\tserverId: STDIO_E2E_SERVER_ID,\n\t\tnow: () => STDIO_E2E_FIXED_NOW_MS,\n\t});\n\n\tconst state = { closed: false };\n\tconst endStdoutAndStdin = () => {\n\t\tprocess.stdout.end(() => {\n\t\t\tprocess.stdin.destroy();\n\t\t});\n\t};\n\tconst connection: ByteConnection = {\n\t\tget closed() {\n\t\t\treturn state.closed;\n\t\t},\n\t\tsend(chunk) {\n\t\t\tif (state.closed) return Promise.reject(new Error(\"stdio e2e connection is closed\"));\n\t\t\treturn new Promise((resolve, reject) => {\n\t\t\t\tprocess.stdout.write(chunk, (error) => {\n\t\t\t\t\tif (error) reject(error);\n\t\t\t\t\telse resolve();\n\t\t\t\t});\n\t\t\t});\n\t\t},\n\t\tclose(finalChunk) {\n\t\t\tif (state.closed) return;\n\t\t\tstate.closed = true;\n\t\t\tif (finalChunk === undefined) {\n\t\t\t\tendStdoutAndStdin();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tprocess.stdout.write(finalChunk, () => {\n\t\t\t\tendStdoutAndStdin();\n\t\t\t});\n\t\t},\n\t};\n\n\tconst handler = server.accept(connection);\n\tprocess.stdin.on(\"data\", (chunk: Buffer) => {\n\t\tif (state.closed) return;\n\t\thandler.onData(new Uint8Array(chunk.buffer, chunk.byteOffset, chunk.byteLength));\n\t});\n\tprocess.stdin.once(\"end\", () => {\n\t\tif (state.closed) return;\n\t\tstate.closed = true;\n\t\thandler.onClose();\n\t\tendStdoutAndStdin();\n\t});\n\tprocess.stdin.on(\"error\", (error) => {\n\t\thandler.onError(error);\n\t});\n\tprocess.stdout.on(\"error\", (error) => {\n\t\thandler.onError(error);\n\t});\n}\n// v8 ignore stop\n\nconst protocolSrcHookSource = `\\\nimport { pathToFileURL } from \"node:url\";\nconst target = pathToFileURL(process.env.${PROTOCOL_SRC_ENV} ?? \"\").href;\nexport async function resolve(specifier, context, nextResolve) {\n\tif (specifier === \"@agent-forge/protocol\") {\n\t\treturn { url: target, shortCircuit: true };\n\t}\n\treturn nextResolve(specifier, context);\n}\n`;\n\nconst registerHooksSource = `\\\nimport { register } from \"node:module\";\nregister(\"./protocol-src-hook.mjs\", import.meta.url);\n`;\n"]}
|
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stdio transport E2E launcher (slice 3.2).
|
|
3
|
+
*
|
|
4
|
+
* Topology: the vitest process (protocol client) talks to a real child process
|
|
5
|
+
* over real stdio pipes. The child runs this same file as its entry point
|
|
6
|
+
* (plain `node`, which strips the erasable TypeScript itself), hosts a
|
|
7
|
+
* `PiServer` wired to `process.stdin`/`process.stdout` through a
|
|
8
|
+
* `ByteConnection` adapter, and serves connections via `PiServer.accept`.
|
|
9
|
+
* Nothing here fakes the transport: every protocol frame crosses an OS pipe
|
|
10
|
+
* boundary twice, and connection close means the child process actually exits.
|
|
11
|
+
*
|
|
12
|
+
* Determinism: the child server uses a fixed server id, a fixed injected clock,
|
|
13
|
+
* and one pre-seeded session id; the only random value on the wire is the
|
|
14
|
+
* server-generated `connectionId`, which tests must normalize. The launcher
|
|
15
|
+
* also generates a module-resolution hook so the child resolves
|
|
16
|
+
* `@agent-forge/protocol` to workspace *source* (the workspace `dist` build
|
|
17
|
+
* can be stale); both ends of the wire therefore always run the same protocol
|
|
18
|
+
* implementation the test process sees.
|
|
19
|
+
*/
|
|
20
|
+
import { spawn } from "node:child_process";
|
|
21
|
+
import { mkdtemp, rm, writeFile } from "node:fs/promises";
|
|
22
|
+
import { tmpdir } from "node:os";
|
|
23
|
+
import { join } from "node:path";
|
|
24
|
+
import { fileURLToPath, pathToFileURL } from "node:url";
|
|
25
|
+
import { PiServer } from "../../../server/src/server.js";
|
|
26
|
+
import { ProtocolTestClient } from "../../../server/src/testing/client.js";
|
|
27
|
+
import { TestServerService } from "../../../server/src/testing/service.js";
|
|
28
|
+
/** Argv marker that switches this module into child-server mode. */
|
|
29
|
+
const STDIO_E2E_CHILD_FLAG = "--agent-forge-stdio-e2e-server";
|
|
30
|
+
const STDIO_E2E_SERVER_ID = "stdio-e2e-server";
|
|
31
|
+
const STDIO_E2E_SESSION_ID = "session-1";
|
|
32
|
+
const STDIO_E2E_FIXED_NOW_MS = 1_000;
|
|
33
|
+
const PROTOCOL_SRC_ENV = "AGENT_FORGE_E2E_PROTOCOL_SRC";
|
|
34
|
+
const launcherPath = fileURLToPath(import.meta.url);
|
|
35
|
+
const protocolSrcPath = fileURLToPath(new URL("../../../protocol/src/index.ts", import.meta.url));
|
|
36
|
+
// v8 ignore next -- 子进程入口分支只在真实子进程中为真,父进程覆盖统计无法归因
|
|
37
|
+
if (process.argv[2] === STDIO_E2E_CHILD_FLAG) {
|
|
38
|
+
// v8 ignore next -- 仅在子进程模式下执行,父进程 V8 覆盖不归因子进程
|
|
39
|
+
runStdioE2EServerChild();
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Launches a real child process serving a deterministic PiServer over stdio
|
|
43
|
+
* and returns a protocol test client connected to its pipes.
|
|
44
|
+
*/
|
|
45
|
+
export async function launchStdioE2EServer() {
|
|
46
|
+
const hookDir = await mkdtemp(join(tmpdir(), "af-stdio-e2e-"));
|
|
47
|
+
const hookFile = join(hookDir, "protocol-src-hook.mjs");
|
|
48
|
+
const registerFile = join(hookDir, "register-hooks.mjs");
|
|
49
|
+
await writeFile(hookFile, protocolSrcHookSource, "utf8");
|
|
50
|
+
await writeFile(registerFile, registerHooksSource, "utf8");
|
|
51
|
+
// `--import` treats its value as a module specifier, which on Windows must
|
|
52
|
+
// be a file:// URL, not a drive-letter path.
|
|
53
|
+
const child = spawn(process.execPath, [
|
|
54
|
+
"--disable-warning=ExperimentalWarning",
|
|
55
|
+
"--import",
|
|
56
|
+
pathToFileURL(registerFile).href,
|
|
57
|
+
launcherPath,
|
|
58
|
+
STDIO_E2E_CHILD_FLAG,
|
|
59
|
+
], {
|
|
60
|
+
stdio: ["pipe", "pipe", "pipe"],
|
|
61
|
+
env: {
|
|
62
|
+
...process.env,
|
|
63
|
+
[PROTOCOL_SRC_ENV]: protocolSrcPath,
|
|
64
|
+
},
|
|
65
|
+
});
|
|
66
|
+
const stderrChunks = [];
|
|
67
|
+
child.stderr.on("data", (chunk) => {
|
|
68
|
+
// v8 ignore next -- 仅当子进程输出 stderr 时触发
|
|
69
|
+
stderrChunks.push(chunk);
|
|
70
|
+
});
|
|
71
|
+
let exitSettled = false;
|
|
72
|
+
const exited = new Promise((resolve) => {
|
|
73
|
+
child.once("error", (error) => {
|
|
74
|
+
exitSettled = true;
|
|
75
|
+
resolve({ code: null, signal: null, spawnError: error.message });
|
|
76
|
+
});
|
|
77
|
+
child.once("exit", (code, signal) => {
|
|
78
|
+
exitSettled = true;
|
|
79
|
+
resolve({ code, signal });
|
|
80
|
+
});
|
|
81
|
+
});
|
|
82
|
+
const client = new ProtocolTestClient(createStdioWireChannel(child));
|
|
83
|
+
child.stdout.on("data", (chunk) => {
|
|
84
|
+
client.receive(new Uint8Array(chunk.buffer, chunk.byteOffset, chunk.byteLength));
|
|
85
|
+
});
|
|
86
|
+
child.stdout.once("end", () => {
|
|
87
|
+
client.markClosed();
|
|
88
|
+
});
|
|
89
|
+
child.stdout.on("error", (error) => {
|
|
90
|
+
// v8 ignore next -- 子进程 stdout 错误事件无法在测试中制造
|
|
91
|
+
client.fail(error);
|
|
92
|
+
});
|
|
93
|
+
return {
|
|
94
|
+
client,
|
|
95
|
+
exited,
|
|
96
|
+
stderrText: () => Buffer.concat(stderrChunks).toString("utf8"),
|
|
97
|
+
async kill() {
|
|
98
|
+
if (!exitSettled && child.exitCode === null && child.signalCode === null)
|
|
99
|
+
child.kill("SIGKILL");
|
|
100
|
+
return exited;
|
|
101
|
+
},
|
|
102
|
+
async dispose() {
|
|
103
|
+
closeStdin(child);
|
|
104
|
+
const exit = await Promise.race([exited, childExitWatchdog()]);
|
|
105
|
+
if (exit === undefined)
|
|
106
|
+
child.kill("SIGKILL");
|
|
107
|
+
// v8 ignore next -- exited 永远不会 reject,该 catch 回调不可达
|
|
108
|
+
await exited.catch(() => undefined);
|
|
109
|
+
await rm(hookDir, { recursive: true, force: true });
|
|
110
|
+
},
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
function createStdioWireChannel(child) {
|
|
114
|
+
return {
|
|
115
|
+
send(chunk) {
|
|
116
|
+
return writeChunk(child, chunk);
|
|
117
|
+
},
|
|
118
|
+
async sendFragmented(chunk, splitAt) {
|
|
119
|
+
await writeChunk(child, chunk.subarray(0, splitAt));
|
|
120
|
+
await writeChunk(child, chunk.subarray(splitAt));
|
|
121
|
+
},
|
|
122
|
+
async close() {
|
|
123
|
+
await new Promise((resolve) => {
|
|
124
|
+
if (child.stdin.writableEnded || child.stdin.destroyed) {
|
|
125
|
+
resolve();
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
child.stdin.end(() => resolve());
|
|
129
|
+
});
|
|
130
|
+
},
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
function writeChunk(child, chunk) {
|
|
134
|
+
return new Promise((resolve, reject) => {
|
|
135
|
+
if (child.stdin.destroyed || child.stdin.writableEnded) {
|
|
136
|
+
reject(new Error("stdio e2e child stdin is closed"));
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
child.stdin.write(chunk, (error) => {
|
|
140
|
+
if (error)
|
|
141
|
+
reject(error);
|
|
142
|
+
else
|
|
143
|
+
resolve();
|
|
144
|
+
});
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
function closeStdin(child) {
|
|
148
|
+
try {
|
|
149
|
+
if (!child.stdin.destroyed && !child.stdin.writableEnded)
|
|
150
|
+
child.stdin.end();
|
|
151
|
+
}
|
|
152
|
+
catch {
|
|
153
|
+
// The pipe may already be gone if the child exited; nothing to clean up.
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
function childExitWatchdog() {
|
|
157
|
+
return new Promise((resolve) => {
|
|
158
|
+
setTimeout(() => resolve(undefined), 5_000).unref();
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Child-process body: serves one PiServer connection over this process's
|
|
163
|
+
* stdin/stdout. Exits cleanly once both pipe directions are closed.
|
|
164
|
+
*/
|
|
165
|
+
// v8 ignore start -- 以下函数仅在 spawn 出去的子进程中执行,父进程 V8 覆盖不归因子进程
|
|
166
|
+
function runStdioE2EServerChild() {
|
|
167
|
+
const service = new TestServerService();
|
|
168
|
+
service.seed(STDIO_E2E_SESSION_ID);
|
|
169
|
+
const server = new PiServer(service, {
|
|
170
|
+
listeners: [],
|
|
171
|
+
serverId: STDIO_E2E_SERVER_ID,
|
|
172
|
+
now: () => STDIO_E2E_FIXED_NOW_MS,
|
|
173
|
+
});
|
|
174
|
+
const state = { closed: false };
|
|
175
|
+
const endStdoutAndStdin = () => {
|
|
176
|
+
process.stdout.end(() => {
|
|
177
|
+
process.stdin.destroy();
|
|
178
|
+
});
|
|
179
|
+
};
|
|
180
|
+
const connection = {
|
|
181
|
+
get closed() {
|
|
182
|
+
return state.closed;
|
|
183
|
+
},
|
|
184
|
+
send(chunk) {
|
|
185
|
+
if (state.closed)
|
|
186
|
+
return Promise.reject(new Error("stdio e2e connection is closed"));
|
|
187
|
+
return new Promise((resolve, reject) => {
|
|
188
|
+
process.stdout.write(chunk, (error) => {
|
|
189
|
+
if (error)
|
|
190
|
+
reject(error);
|
|
191
|
+
else
|
|
192
|
+
resolve();
|
|
193
|
+
});
|
|
194
|
+
});
|
|
195
|
+
},
|
|
196
|
+
close(finalChunk) {
|
|
197
|
+
if (state.closed)
|
|
198
|
+
return;
|
|
199
|
+
state.closed = true;
|
|
200
|
+
if (finalChunk === undefined) {
|
|
201
|
+
endStdoutAndStdin();
|
|
202
|
+
return;
|
|
203
|
+
}
|
|
204
|
+
process.stdout.write(finalChunk, () => {
|
|
205
|
+
endStdoutAndStdin();
|
|
206
|
+
});
|
|
207
|
+
},
|
|
208
|
+
};
|
|
209
|
+
const handler = server.accept(connection);
|
|
210
|
+
process.stdin.on("data", (chunk) => {
|
|
211
|
+
if (state.closed)
|
|
212
|
+
return;
|
|
213
|
+
handler.onData(new Uint8Array(chunk.buffer, chunk.byteOffset, chunk.byteLength));
|
|
214
|
+
});
|
|
215
|
+
process.stdin.once("end", () => {
|
|
216
|
+
if (state.closed)
|
|
217
|
+
return;
|
|
218
|
+
state.closed = true;
|
|
219
|
+
handler.onClose();
|
|
220
|
+
endStdoutAndStdin();
|
|
221
|
+
});
|
|
222
|
+
process.stdin.on("error", (error) => {
|
|
223
|
+
handler.onError(error);
|
|
224
|
+
});
|
|
225
|
+
process.stdout.on("error", (error) => {
|
|
226
|
+
handler.onError(error);
|
|
227
|
+
});
|
|
228
|
+
}
|
|
229
|
+
// v8 ignore stop
|
|
230
|
+
const protocolSrcHookSource = `\
|
|
231
|
+
import { pathToFileURL } from "node:url";
|
|
232
|
+
const target = pathToFileURL(process.env.${PROTOCOL_SRC_ENV} ?? "").href;
|
|
233
|
+
export async function resolve(specifier, context, nextResolve) {
|
|
234
|
+
if (specifier === "@agent-forge/protocol") {
|
|
235
|
+
return { url: target, shortCircuit: true };
|
|
236
|
+
}
|
|
237
|
+
return nextResolve(specifier, context);
|
|
238
|
+
}
|
|
239
|
+
`;
|
|
240
|
+
const registerHooksSource = `\
|
|
241
|
+
import { register } from "node:module";
|
|
242
|
+
register("./protocol-src-hook.mjs", import.meta.url);
|
|
243
|
+
`;
|
|
244
|
+
//# sourceMappingURL=stdio-launcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stdio-launcher.js","sourceRoot":"","sources":["../../src/e2e/stdio-launcher.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Stdio transport E2E launcher (slice 3.2).\n *\n * Topology: the vitest process (protocol client) talks to a real child process\n * over real stdio pipes. The child runs this same file as its entry point\n * (plain `node`, which strips the erasable TypeScript itself), hosts a\n * `PiServer` wired to `process.stdin`/`process.stdout` through a\n * `ByteConnection` adapter, and serves connections via `PiServer.accept`.\n * Nothing here fakes the transport: every protocol frame crosses an OS pipe\n * boundary twice, and connection close means the child process actually exits.\n *\n * Determinism: the child server uses a fixed server id, a fixed injected clock,\n * and one pre-seeded session id; the only random value on the wire is the\n * server-generated `connectionId`, which tests must normalize. The launcher\n * also generates a module-resolution hook so the child resolves\n * `@agent-forge/protocol` to workspace *source* (the workspace `dist` build\n * can be stale); both ends of the wire therefore always run the same protocol\n * implementation the test process sees.\n */\nimport { type ChildProcessWithoutNullStreams, spawn } from \"node:child_process\";\nimport { mkdtemp, rm, writeFile } from \"node:fs/promises\";\nimport { tmpdir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { fileURLToPath, pathToFileURL } from \"node:url\";\nimport type { ByteConnection } from \"../../../server/src/connection.ts\";\nimport { PiServer } from \"../../../server/src/server.ts\";\nimport { ProtocolTestClient, type WireChannel } from \"../../../server/src/testing/client.ts\";\nimport { TestServerService } from \"../../../server/src/testing/service.ts\";\n\n/** Argv marker that switches this module into child-server mode. */\nconst STDIO_E2E_CHILD_FLAG = \"--agent-forge-stdio-e2e-server\";\nconst STDIO_E2E_SERVER_ID = \"stdio-e2e-server\";\nconst STDIO_E2E_SESSION_ID = \"session-1\";\nconst STDIO_E2E_FIXED_NOW_MS = 1_000;\nconst PROTOCOL_SRC_ENV = \"AGENT_FORGE_E2E_PROTOCOL_SRC\";\n\nexport interface StdioChildExit {\n\treadonly code: number | null;\n\treadonly signal: string | null;\n\t/** Set when the child could not be spawned at all (carries the message). */\n\treadonly spawnError?: string;\n}\n\nexport interface StdioE2EServerHandle {\n\t/** Protocol test client wired to the child's stdin/stdout pipes. */\n\treadonly client: ProtocolTestClient;\n\t/** Resolves once the child process has exited (or failed to spawn). */\n\treadonly exited: Promise<StdioChildExit>;\n\t/** Child stderr collected so far; useful in failure diagnostics. */\n\tstderrText(): string;\n\t/** Forcefully terminates the child if it is still running, then reaps it. */\n\tkill(): Promise<StdioChildExit>;\n\t/** Best-effort cleanup: close the pipe, reap the child, remove temp files. */\n\tdispose(): Promise<void>;\n}\n\nconst launcherPath = fileURLToPath(import.meta.url);\nconst protocolSrcPath = fileURLToPath(new URL(\"../../../protocol/src/index.ts\", import.meta.url));\n\n// v8 ignore next -- 子进程入口分支只在真实子进程中为真,父进程覆盖统计无法归因\nif (process.argv[2] === STDIO_E2E_CHILD_FLAG) {\n\t// v8 ignore next -- 仅在子进程模式下执行,父进程 V8 覆盖不归因子进程\n\trunStdioE2EServerChild();\n}\n\n/**\n * Launches a real child process serving a deterministic PiServer over stdio\n * and returns a protocol test client connected to its pipes.\n */\nexport async function launchStdioE2EServer(): Promise<StdioE2EServerHandle> {\n\tconst hookDir = await mkdtemp(join(tmpdir(), \"af-stdio-e2e-\"));\n\tconst hookFile = join(hookDir, \"protocol-src-hook.mjs\");\n\tconst registerFile = join(hookDir, \"register-hooks.mjs\");\n\tawait writeFile(hookFile, protocolSrcHookSource, \"utf8\");\n\tawait writeFile(registerFile, registerHooksSource, \"utf8\");\n\n\t// `--import` treats its value as a module specifier, which on Windows must\n\t// be a file:// URL, not a drive-letter path.\n\tconst child = spawn(\n\t\tprocess.execPath,\n\t\t[\n\t\t\t\"--disable-warning=ExperimentalWarning\",\n\t\t\t\"--import\",\n\t\t\tpathToFileURL(registerFile).href,\n\t\t\tlauncherPath,\n\t\t\tSTDIO_E2E_CHILD_FLAG,\n\t\t],\n\t\t{\n\t\t\tstdio: [\"pipe\", \"pipe\", \"pipe\"],\n\t\t\tenv: {\n\t\t\t\t...process.env,\n\t\t\t\t[PROTOCOL_SRC_ENV]: protocolSrcPath,\n\t\t\t},\n\t\t},\n\t);\n\n\tconst stderrChunks: Buffer[] = [];\n\tchild.stderr.on(\"data\", (chunk: Buffer) => {\n\t\t// v8 ignore next -- 仅当子进程输出 stderr 时触发\n\t\tstderrChunks.push(chunk);\n\t});\n\n\tlet exitSettled = false;\n\tconst exited = new Promise<StdioChildExit>((resolve) => {\n\t\tchild.once(\"error\", (error) => {\n\t\t\texitSettled = true;\n\t\t\tresolve({ code: null, signal: null, spawnError: error.message });\n\t\t});\n\t\tchild.once(\"exit\", (code, signal) => {\n\t\t\texitSettled = true;\n\t\t\tresolve({ code, signal });\n\t\t});\n\t});\n\n\tconst client = new ProtocolTestClient(createStdioWireChannel(child));\n\tchild.stdout.on(\"data\", (chunk: Buffer) => {\n\t\tclient.receive(new Uint8Array(chunk.buffer, chunk.byteOffset, chunk.byteLength));\n\t});\n\tchild.stdout.once(\"end\", () => {\n\t\tclient.markClosed();\n\t});\n\tchild.stdout.on(\"error\", (error) => {\n\t\t// v8 ignore next -- 子进程 stdout 错误事件无法在测试中制造\n\t\tclient.fail(error);\n\t});\n\n\treturn {\n\t\tclient,\n\t\texited,\n\t\tstderrText: () => Buffer.concat(stderrChunks).toString(\"utf8\"),\n\t\tasync kill() {\n\t\t\tif (!exitSettled && child.exitCode === null && child.signalCode === null) child.kill(\"SIGKILL\");\n\t\t\treturn exited;\n\t\t},\n\t\tasync dispose() {\n\t\t\tcloseStdin(child);\n\t\t\tconst exit = await Promise.race([exited, childExitWatchdog()]);\n\t\t\tif (exit === undefined) child.kill(\"SIGKILL\");\n\t\t\t// v8 ignore next -- exited 永远不会 reject,该 catch 回调不可达\n\t\t\tawait exited.catch(() => undefined);\n\t\t\tawait rm(hookDir, { recursive: true, force: true });\n\t\t},\n\t};\n}\n\nfunction createStdioWireChannel(child: ChildProcessWithoutNullStreams): WireChannel {\n\treturn {\n\t\tsend(chunk) {\n\t\t\treturn writeChunk(child, chunk);\n\t\t},\n\t\tasync sendFragmented(chunk, splitAt) {\n\t\t\tawait writeChunk(child, chunk.subarray(0, splitAt));\n\t\t\tawait writeChunk(child, chunk.subarray(splitAt));\n\t\t},\n\t\tasync close() {\n\t\t\tawait new Promise<void>((resolve) => {\n\t\t\t\tif (child.stdin.writableEnded || child.stdin.destroyed) {\n\t\t\t\t\tresolve();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tchild.stdin.end(() => resolve());\n\t\t\t});\n\t\t},\n\t};\n}\n\nfunction writeChunk(child: ChildProcessWithoutNullStreams, chunk: Uint8Array): Promise<void> {\n\treturn new Promise<void>((resolve, reject) => {\n\t\tif (child.stdin.destroyed || child.stdin.writableEnded) {\n\t\t\treject(new Error(\"stdio e2e child stdin is closed\"));\n\t\t\treturn;\n\t\t}\n\t\tchild.stdin.write(chunk, (error) => {\n\t\t\tif (error) reject(error);\n\t\t\telse resolve();\n\t\t});\n\t});\n}\n\nfunction closeStdin(child: ChildProcessWithoutNullStreams): void {\n\ttry {\n\t\tif (!child.stdin.destroyed && !child.stdin.writableEnded) child.stdin.end();\n\t} catch {\n\t\t// The pipe may already be gone if the child exited; nothing to clean up.\n\t}\n}\n\nfunction childExitWatchdog(): Promise<undefined> {\n\treturn new Promise((resolve) => {\n\t\tsetTimeout(() => resolve(undefined), 5_000).unref();\n\t});\n}\n\n/**\n * Child-process body: serves one PiServer connection over this process's\n * stdin/stdout. Exits cleanly once both pipe directions are closed.\n */\n// v8 ignore start -- 以下函数仅在 spawn 出去的子进程中执行,父进程 V8 覆盖不归因子进程\nfunction runStdioE2EServerChild(): void {\n\tconst service = new TestServerService();\n\tservice.seed(STDIO_E2E_SESSION_ID);\n\tconst server = new PiServer(service, {\n\t\tlisteners: [],\n\t\tserverId: STDIO_E2E_SERVER_ID,\n\t\tnow: () => STDIO_E2E_FIXED_NOW_MS,\n\t});\n\n\tconst state = { closed: false };\n\tconst endStdoutAndStdin = () => {\n\t\tprocess.stdout.end(() => {\n\t\t\tprocess.stdin.destroy();\n\t\t});\n\t};\n\tconst connection: ByteConnection = {\n\t\tget closed() {\n\t\t\treturn state.closed;\n\t\t},\n\t\tsend(chunk) {\n\t\t\tif (state.closed) return Promise.reject(new Error(\"stdio e2e connection is closed\"));\n\t\t\treturn new Promise((resolve, reject) => {\n\t\t\t\tprocess.stdout.write(chunk, (error) => {\n\t\t\t\t\tif (error) reject(error);\n\t\t\t\t\telse resolve();\n\t\t\t\t});\n\t\t\t});\n\t\t},\n\t\tclose(finalChunk) {\n\t\t\tif (state.closed) return;\n\t\t\tstate.closed = true;\n\t\t\tif (finalChunk === undefined) {\n\t\t\t\tendStdoutAndStdin();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tprocess.stdout.write(finalChunk, () => {\n\t\t\t\tendStdoutAndStdin();\n\t\t\t});\n\t\t},\n\t};\n\n\tconst handler = server.accept(connection);\n\tprocess.stdin.on(\"data\", (chunk: Buffer) => {\n\t\tif (state.closed) return;\n\t\thandler.onData(new Uint8Array(chunk.buffer, chunk.byteOffset, chunk.byteLength));\n\t});\n\tprocess.stdin.once(\"end\", () => {\n\t\tif (state.closed) return;\n\t\tstate.closed = true;\n\t\thandler.onClose();\n\t\tendStdoutAndStdin();\n\t});\n\tprocess.stdin.on(\"error\", (error) => {\n\t\thandler.onError(error);\n\t});\n\tprocess.stdout.on(\"error\", (error) => {\n\t\thandler.onError(error);\n\t});\n}\n// v8 ignore stop\n\nconst protocolSrcHookSource = `\\\nimport { pathToFileURL } from \"node:url\";\nconst target = pathToFileURL(process.env.${PROTOCOL_SRC_ENV} ?? \"\").href;\nexport async function resolve(specifier, context, nextResolve) {\n\tif (specifier === \"@agent-forge/protocol\") {\n\t\treturn { url: target, shortCircuit: true };\n\t}\n\treturn nextResolve(specifier, context);\n}\n`;\n\nconst registerHooksSource = `\\\nimport { register } from \"node:module\";\nregister(\"./protocol-src-hook.mjs\", import.meta.url);\n`;\n"]}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent retry scheduler (2A.4b) — the general retry scheduler for Agent
|
|
3
|
+
* operations, with cancellable waits, duplicate suppression, and replayable
|
|
4
|
+
* terminal states.
|
|
5
|
+
*
|
|
6
|
+
* Policy is per-operation: exponential backoff with a cap, an attempt limit,
|
|
7
|
+
* and an AbortSignal for cancellation (checked before every attempt and
|
|
8
|
+
* after every wait). Tasks classify their own failures as retryable or
|
|
9
|
+
* terminal — a terminal failure stops immediately with no wait. Scheduling
|
|
10
|
+
* the same operationId twice returns the recorded terminal state instead of
|
|
11
|
+
* re-running (duplicates are marked, never re-executed). Every outcome
|
|
12
|
+
* carries the full attempt trace so backoff, waits, and terminal states are
|
|
13
|
+
* replayable.
|
|
14
|
+
*
|
|
15
|
+
* Policy bounds, the attempt-trace record, and the backoff formula come from
|
|
16
|
+
* the shared retry kernel (`retry-common.ts`); this facade owns only the
|
|
17
|
+
* failure classification, cancellation, and duplicate-suppression semantics.
|
|
18
|
+
*/
|
|
19
|
+
import type { JsonValue } from "@agent-forge/ai";
|
|
20
|
+
import type { RetryAttemptRecordV1, RetryWaitPolicyV1 } from "./retry-common.ts";
|
|
21
|
+
export type AgentRetryPolicyV1 = RetryWaitPolicyV1;
|
|
22
|
+
export type AgentRetryAttemptV1 = RetryAttemptRecordV1;
|
|
23
|
+
export type AgentRetryOutcomeV1 = {
|
|
24
|
+
readonly status: "succeeded";
|
|
25
|
+
readonly operationId: string;
|
|
26
|
+
readonly result: JsonValue;
|
|
27
|
+
readonly attempts: readonly AgentRetryAttemptV1[];
|
|
28
|
+
} | {
|
|
29
|
+
readonly status: "failed_terminal";
|
|
30
|
+
readonly operationId: string;
|
|
31
|
+
readonly reason: string;
|
|
32
|
+
readonly attempts: readonly AgentRetryAttemptV1[];
|
|
33
|
+
} | {
|
|
34
|
+
readonly status: "exhausted";
|
|
35
|
+
readonly operationId: string;
|
|
36
|
+
readonly attempts: readonly AgentRetryAttemptV1[];
|
|
37
|
+
} | {
|
|
38
|
+
readonly status: "cancelled";
|
|
39
|
+
readonly operationId: string;
|
|
40
|
+
readonly attempts: readonly AgentRetryAttemptV1[];
|
|
41
|
+
};
|
|
42
|
+
export interface AgentRetrySchedulerV1 {
|
|
43
|
+
schedule(input: {
|
|
44
|
+
readonly operationId: string;
|
|
45
|
+
readonly policy: AgentRetryPolicyV1;
|
|
46
|
+
readonly task: (attempt: number) => {
|
|
47
|
+
readonly ok: true;
|
|
48
|
+
readonly result: JsonValue;
|
|
49
|
+
} | {
|
|
50
|
+
readonly ok: false;
|
|
51
|
+
readonly retryable: boolean;
|
|
52
|
+
readonly reason: string;
|
|
53
|
+
};
|
|
54
|
+
readonly signal?: AbortSignal;
|
|
55
|
+
readonly now?: () => number;
|
|
56
|
+
readonly sleep?: (ms: number) => void;
|
|
57
|
+
}): AgentRetryOutcomeV1 & {
|
|
58
|
+
readonly duplicate?: boolean;
|
|
59
|
+
};
|
|
60
|
+
terminalOf(operationId: string): (AgentRetryOutcomeV1 & {
|
|
61
|
+
readonly duplicate?: boolean;
|
|
62
|
+
}) | undefined;
|
|
63
|
+
}
|
|
64
|
+
export declare function createAgentRetryScheduler(): AgentRetrySchedulerV1;
|
|
65
|
+
//# sourceMappingURL=agent-retry-scheduler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-retry-scheduler.d.ts","sourceRoot":"","sources":["../../src/host/agent-retry-scheduler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,KAAK,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAGjF,MAAM,MAAM,kBAAkB,GAAG,iBAAiB,CAAC;AAEnD,MAAM,MAAM,mBAAmB,GAAG,oBAAoB,CAAC;AAEvD,MAAM,MAAM,mBAAmB,GAC5B;IACA,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,SAAS,mBAAmB,EAAE,CAAC;CACjD,GACD;IACA,QAAQ,CAAC,MAAM,EAAE,iBAAiB,CAAC;IACnC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,SAAS,mBAAmB,EAAE,CAAC;CACjD,GACD;IAAE,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,SAAS,mBAAmB,EAAE,CAAA;CAAE,GACjH;IAAE,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,SAAS,mBAAmB,EAAE,CAAA;CAAE,CAAC;AAErH,MAAM,WAAW,qBAAqB;IACrC,QAAQ,CAAC,KAAK,EAAE;QACf,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;QAC7B,QAAQ,CAAC,MAAM,EAAE,kBAAkB,CAAC;QACpC,QAAQ,CAAC,IAAI,EAAE,CACd,OAAO,EAAE,MAAM,KAEb;YAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;YAAC,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAA;SAAE,GACjD;YAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;YAAC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;YAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;SAAE,CAAC;QAChF,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;QAC9B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;QAC5B,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;KACtC,GAAG,mBAAmB,GAAG;QAAE,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;IAC3D,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,CAAC,mBAAmB,GAAG;QAAE,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC,GAAG,SAAS,CAAC;CACtG;AAED,wBAAgB,yBAAyB,IAAI,qBAAqB,CAmDjE","sourcesContent":["/**\n * Agent retry scheduler (2A.4b) — the general retry scheduler for Agent\n * operations, with cancellable waits, duplicate suppression, and replayable\n * terminal states.\n *\n * Policy is per-operation: exponential backoff with a cap, an attempt limit,\n * and an AbortSignal for cancellation (checked before every attempt and\n * after every wait). Tasks classify their own failures as retryable or\n * terminal — a terminal failure stops immediately with no wait. Scheduling\n * the same operationId twice returns the recorded terminal state instead of\n * re-running (duplicates are marked, never re-executed). Every outcome\n * carries the full attempt trace so backoff, waits, and terminal states are\n * replayable.\n *\n * Policy bounds, the attempt-trace record, and the backoff formula come from\n * the shared retry kernel (`retry-common.ts`); this facade owns only the\n * failure classification, cancellation, and duplicate-suppression semantics.\n */\nimport type { JsonValue } from \"@agent-forge/ai\";\nimport type { RetryAttemptRecordV1, RetryWaitPolicyV1 } from \"./retry-common.ts\";\nimport { retryBackoffMs } from \"./retry-common.ts\";\n\nexport type AgentRetryPolicyV1 = RetryWaitPolicyV1;\n\nexport type AgentRetryAttemptV1 = RetryAttemptRecordV1;\n\nexport type AgentRetryOutcomeV1 =\n\t| {\n\t\t\treadonly status: \"succeeded\";\n\t\t\treadonly operationId: string;\n\t\t\treadonly result: JsonValue;\n\t\t\treadonly attempts: readonly AgentRetryAttemptV1[];\n\t }\n\t| {\n\t\t\treadonly status: \"failed_terminal\";\n\t\t\treadonly operationId: string;\n\t\t\treadonly reason: string;\n\t\t\treadonly attempts: readonly AgentRetryAttemptV1[];\n\t }\n\t| { readonly status: \"exhausted\"; readonly operationId: string; readonly attempts: readonly AgentRetryAttemptV1[] }\n\t| { readonly status: \"cancelled\"; readonly operationId: string; readonly attempts: readonly AgentRetryAttemptV1[] };\n\nexport interface AgentRetrySchedulerV1 {\n\tschedule(input: {\n\t\treadonly operationId: string;\n\t\treadonly policy: AgentRetryPolicyV1;\n\t\treadonly task: (\n\t\t\tattempt: number,\n\t\t) =>\n\t\t\t| { readonly ok: true; readonly result: JsonValue }\n\t\t\t| { readonly ok: false; readonly retryable: boolean; readonly reason: string };\n\t\treadonly signal?: AbortSignal;\n\t\treadonly now?: () => number;\n\t\treadonly sleep?: (ms: number) => void;\n\t}): AgentRetryOutcomeV1 & { readonly duplicate?: boolean };\n\tterminalOf(operationId: string): (AgentRetryOutcomeV1 & { readonly duplicate?: boolean }) | undefined;\n}\n\nexport function createAgentRetryScheduler(): AgentRetrySchedulerV1 {\n\tconst terminalStates = new Map<string, AgentRetryOutcomeV1 & { readonly duplicate?: boolean }>();\n\n\treturn {\n\t\tschedule(input) {\n\t\t\tconst existing = terminalStates.get(input.operationId);\n\t\t\tif (existing) return { ...existing, duplicate: true };\n\t\t\tconst signal = input.signal;\n\t\t\tconst now = input.now ?? (() => 0);\n\t\t\tconst sleep = input.sleep ?? (() => undefined);\n\t\t\tconst attempts: AgentRetryAttemptV1[] = [];\n\n\t\t\tconst finish = (outcome: AgentRetryOutcomeV1): AgentRetryOutcomeV1 & { readonly duplicate?: boolean } => {\n\t\t\t\tterminalStates.set(input.operationId, outcome);\n\t\t\t\treturn outcome;\n\t\t\t};\n\n\t\t\tfor (let attempt = 1; attempt <= input.policy.attemptLimit; attempt += 1) {\n\t\t\t\tif (signal?.aborted) {\n\t\t\t\t\treturn finish({ status: \"cancelled\", operationId: input.operationId, attempts });\n\t\t\t\t}\n\t\t\t\tconst at = now();\n\t\t\t\tconst step = input.task(attempt);\n\t\t\t\tif (step.ok) {\n\t\t\t\t\tattempts.push({ attempt, at, ok: true, waitedMs: 0 });\n\t\t\t\t\treturn finish({ status: \"succeeded\", operationId: input.operationId, result: step.result, attempts });\n\t\t\t\t}\n\t\t\t\tif (!step.retryable) {\n\t\t\t\t\tattempts.push({ attempt, at, ok: false, failure: step.reason, retryable: false, waitedMs: 0 });\n\t\t\t\t\treturn finish({\n\t\t\t\t\t\tstatus: \"failed_terminal\",\n\t\t\t\t\t\toperationId: input.operationId,\n\t\t\t\t\t\treason: step.reason,\n\t\t\t\t\t\tattempts,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tconst waitedMs = retryBackoffMs(input.policy, attempt);\n\t\t\t\tattempts.push({ attempt, at, ok: false, failure: step.reason, retryable: true, waitedMs });\n\t\t\t\tif (attempt < input.policy.attemptLimit) {\n\t\t\t\t\tsleep(waitedMs);\n\t\t\t\t\tif (signal?.aborted) {\n\t\t\t\t\t\treturn finish({ status: \"cancelled\", operationId: input.operationId, attempts });\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn finish({ status: \"exhausted\", operationId: input.operationId, attempts });\n\t\t},\n\t\tterminalOf(operationId) {\n\t\t\treturn terminalStates.get(operationId);\n\t\t},\n\t};\n}\n"]}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { retryBackoffMs } from "./retry-common.js";
|
|
2
|
+
export function createAgentRetryScheduler() {
|
|
3
|
+
const terminalStates = new Map();
|
|
4
|
+
return {
|
|
5
|
+
schedule(input) {
|
|
6
|
+
const existing = terminalStates.get(input.operationId);
|
|
7
|
+
if (existing)
|
|
8
|
+
return { ...existing, duplicate: true };
|
|
9
|
+
const signal = input.signal;
|
|
10
|
+
const now = input.now ?? (() => 0);
|
|
11
|
+
const sleep = input.sleep ?? (() => undefined);
|
|
12
|
+
const attempts = [];
|
|
13
|
+
const finish = (outcome) => {
|
|
14
|
+
terminalStates.set(input.operationId, outcome);
|
|
15
|
+
return outcome;
|
|
16
|
+
};
|
|
17
|
+
for (let attempt = 1; attempt <= input.policy.attemptLimit; attempt += 1) {
|
|
18
|
+
if (signal?.aborted) {
|
|
19
|
+
return finish({ status: "cancelled", operationId: input.operationId, attempts });
|
|
20
|
+
}
|
|
21
|
+
const at = now();
|
|
22
|
+
const step = input.task(attempt);
|
|
23
|
+
if (step.ok) {
|
|
24
|
+
attempts.push({ attempt, at, ok: true, waitedMs: 0 });
|
|
25
|
+
return finish({ status: "succeeded", operationId: input.operationId, result: step.result, attempts });
|
|
26
|
+
}
|
|
27
|
+
if (!step.retryable) {
|
|
28
|
+
attempts.push({ attempt, at, ok: false, failure: step.reason, retryable: false, waitedMs: 0 });
|
|
29
|
+
return finish({
|
|
30
|
+
status: "failed_terminal",
|
|
31
|
+
operationId: input.operationId,
|
|
32
|
+
reason: step.reason,
|
|
33
|
+
attempts,
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
const waitedMs = retryBackoffMs(input.policy, attempt);
|
|
37
|
+
attempts.push({ attempt, at, ok: false, failure: step.reason, retryable: true, waitedMs });
|
|
38
|
+
if (attempt < input.policy.attemptLimit) {
|
|
39
|
+
sleep(waitedMs);
|
|
40
|
+
if (signal?.aborted) {
|
|
41
|
+
return finish({ status: "cancelled", operationId: input.operationId, attempts });
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return finish({ status: "exhausted", operationId: input.operationId, attempts });
|
|
46
|
+
},
|
|
47
|
+
terminalOf(operationId) {
|
|
48
|
+
return terminalStates.get(operationId);
|
|
49
|
+
},
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=agent-retry-scheduler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-retry-scheduler.js","sourceRoot":"","sources":["../../src/host/agent-retry-scheduler.ts"],"names":[],"mappings":"AAoBA,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAsCnD,MAAM,UAAU,yBAAyB,GAA0B;IAClE,MAAM,cAAc,GAAG,IAAI,GAAG,EAAkE,CAAC;IAEjG,OAAO;QACN,QAAQ,CAAC,KAAK,EAAE;YACf,MAAM,QAAQ,GAAG,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;YACvD,IAAI,QAAQ;gBAAE,OAAO,EAAE,GAAG,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;YACtD,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;YAC5B,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;YACnC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,IAAI,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;YAC/C,MAAM,QAAQ,GAA0B,EAAE,CAAC;YAE3C,MAAM,MAAM,GAAG,CAAC,OAA4B,EAA0D,EAAE,CAAC;gBACxG,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;gBAC/C,OAAO,OAAO,CAAC;YAAA,CACf,CAAC;YAEF,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,KAAK,CAAC,MAAM,CAAC,YAAY,EAAE,OAAO,IAAI,CAAC,EAAE,CAAC;gBAC1E,IAAI,MAAM,EAAE,OAAO,EAAE,CAAC;oBACrB,OAAO,MAAM,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE,QAAQ,EAAE,CAAC,CAAC;gBAClF,CAAC;gBACD,MAAM,EAAE,GAAG,GAAG,EAAE,CAAC;gBACjB,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBACjC,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC;oBACb,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC;oBACtD,OAAO,MAAM,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;gBACvG,CAAC;gBACD,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;oBACrB,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC;oBAC/F,OAAO,MAAM,CAAC;wBACb,MAAM,EAAE,iBAAiB;wBACzB,WAAW,EAAE,KAAK,CAAC,WAAW;wBAC9B,MAAM,EAAE,IAAI,CAAC,MAAM;wBACnB,QAAQ;qBACR,CAAC,CAAC;gBACJ,CAAC;gBACD,MAAM,QAAQ,GAAG,cAAc,CAAC,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;gBACvD,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;gBAC3F,IAAI,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;oBACzC,KAAK,CAAC,QAAQ,CAAC,CAAC;oBAChB,IAAI,MAAM,EAAE,OAAO,EAAE,CAAC;wBACrB,OAAO,MAAM,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE,QAAQ,EAAE,CAAC,CAAC;oBAClF,CAAC;gBACF,CAAC;YACF,CAAC;YACD,OAAO,MAAM,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE,QAAQ,EAAE,CAAC,CAAC;QAAA,CACjF;QACD,UAAU,CAAC,WAAW,EAAE;YACvB,OAAO,cAAc,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QAAA,CACvC;KACD,CAAC;AAAA,CACF","sourcesContent":["/**\n * Agent retry scheduler (2A.4b) — the general retry scheduler for Agent\n * operations, with cancellable waits, duplicate suppression, and replayable\n * terminal states.\n *\n * Policy is per-operation: exponential backoff with a cap, an attempt limit,\n * and an AbortSignal for cancellation (checked before every attempt and\n * after every wait). Tasks classify their own failures as retryable or\n * terminal — a terminal failure stops immediately with no wait. Scheduling\n * the same operationId twice returns the recorded terminal state instead of\n * re-running (duplicates are marked, never re-executed). Every outcome\n * carries the full attempt trace so backoff, waits, and terminal states are\n * replayable.\n *\n * Policy bounds, the attempt-trace record, and the backoff formula come from\n * the shared retry kernel (`retry-common.ts`); this facade owns only the\n * failure classification, cancellation, and duplicate-suppression semantics.\n */\nimport type { JsonValue } from \"@agent-forge/ai\";\nimport type { RetryAttemptRecordV1, RetryWaitPolicyV1 } from \"./retry-common.ts\";\nimport { retryBackoffMs } from \"./retry-common.ts\";\n\nexport type AgentRetryPolicyV1 = RetryWaitPolicyV1;\n\nexport type AgentRetryAttemptV1 = RetryAttemptRecordV1;\n\nexport type AgentRetryOutcomeV1 =\n\t| {\n\t\t\treadonly status: \"succeeded\";\n\t\t\treadonly operationId: string;\n\t\t\treadonly result: JsonValue;\n\t\t\treadonly attempts: readonly AgentRetryAttemptV1[];\n\t }\n\t| {\n\t\t\treadonly status: \"failed_terminal\";\n\t\t\treadonly operationId: string;\n\t\t\treadonly reason: string;\n\t\t\treadonly attempts: readonly AgentRetryAttemptV1[];\n\t }\n\t| { readonly status: \"exhausted\"; readonly operationId: string; readonly attempts: readonly AgentRetryAttemptV1[] }\n\t| { readonly status: \"cancelled\"; readonly operationId: string; readonly attempts: readonly AgentRetryAttemptV1[] };\n\nexport interface AgentRetrySchedulerV1 {\n\tschedule(input: {\n\t\treadonly operationId: string;\n\t\treadonly policy: AgentRetryPolicyV1;\n\t\treadonly task: (\n\t\t\tattempt: number,\n\t\t) =>\n\t\t\t| { readonly ok: true; readonly result: JsonValue }\n\t\t\t| { readonly ok: false; readonly retryable: boolean; readonly reason: string };\n\t\treadonly signal?: AbortSignal;\n\t\treadonly now?: () => number;\n\t\treadonly sleep?: (ms: number) => void;\n\t}): AgentRetryOutcomeV1 & { readonly duplicate?: boolean };\n\tterminalOf(operationId: string): (AgentRetryOutcomeV1 & { readonly duplicate?: boolean }) | undefined;\n}\n\nexport function createAgentRetryScheduler(): AgentRetrySchedulerV1 {\n\tconst terminalStates = new Map<string, AgentRetryOutcomeV1 & { readonly duplicate?: boolean }>();\n\n\treturn {\n\t\tschedule(input) {\n\t\t\tconst existing = terminalStates.get(input.operationId);\n\t\t\tif (existing) return { ...existing, duplicate: true };\n\t\t\tconst signal = input.signal;\n\t\t\tconst now = input.now ?? (() => 0);\n\t\t\tconst sleep = input.sleep ?? (() => undefined);\n\t\t\tconst attempts: AgentRetryAttemptV1[] = [];\n\n\t\t\tconst finish = (outcome: AgentRetryOutcomeV1): AgentRetryOutcomeV1 & { readonly duplicate?: boolean } => {\n\t\t\t\tterminalStates.set(input.operationId, outcome);\n\t\t\t\treturn outcome;\n\t\t\t};\n\n\t\t\tfor (let attempt = 1; attempt <= input.policy.attemptLimit; attempt += 1) {\n\t\t\t\tif (signal?.aborted) {\n\t\t\t\t\treturn finish({ status: \"cancelled\", operationId: input.operationId, attempts });\n\t\t\t\t}\n\t\t\t\tconst at = now();\n\t\t\t\tconst step = input.task(attempt);\n\t\t\t\tif (step.ok) {\n\t\t\t\t\tattempts.push({ attempt, at, ok: true, waitedMs: 0 });\n\t\t\t\t\treturn finish({ status: \"succeeded\", operationId: input.operationId, result: step.result, attempts });\n\t\t\t\t}\n\t\t\t\tif (!step.retryable) {\n\t\t\t\t\tattempts.push({ attempt, at, ok: false, failure: step.reason, retryable: false, waitedMs: 0 });\n\t\t\t\t\treturn finish({\n\t\t\t\t\t\tstatus: \"failed_terminal\",\n\t\t\t\t\t\toperationId: input.operationId,\n\t\t\t\t\t\treason: step.reason,\n\t\t\t\t\t\tattempts,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tconst waitedMs = retryBackoffMs(input.policy, attempt);\n\t\t\t\tattempts.push({ attempt, at, ok: false, failure: step.reason, retryable: true, waitedMs });\n\t\t\t\tif (attempt < input.policy.attemptLimit) {\n\t\t\t\t\tsleep(waitedMs);\n\t\t\t\t\tif (signal?.aborted) {\n\t\t\t\t\t\treturn finish({ status: \"cancelled\", operationId: input.operationId, attempts });\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn finish({ status: \"exhausted\", operationId: input.operationId, attempts });\n\t\t},\n\t\tterminalOf(operationId) {\n\t\t\treturn terminalStates.get(operationId);\n\t\t},\n\t};\n}\n"]}
|