@code-yeongyu/senpi 2026.7.20 → 2026.7.22
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 +41 -0
- package/README.md +1 -0
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +1 -0
- package/dist/cli/args.js.map +1 -1
- package/dist/core/agent-session.d.ts +32 -0
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +409 -68
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/auth-storage.js +1 -1
- package/dist/core/auth-storage.js.map +1 -1
- package/dist/core/compaction/compaction.d.ts +2 -2
- package/dist/core/compaction/compaction.d.ts.map +1 -1
- package/dist/core/compaction/compaction.js +67 -16
- package/dist/core/compaction/compaction.js.map +1 -1
- package/dist/core/compaction/stream-watchdog.d.ts +31 -0
- package/dist/core/compaction/stream-watchdog.d.ts.map +1 -0
- package/dist/core/compaction/stream-watchdog.js +78 -0
- package/dist/core/compaction/stream-watchdog.js.map +1 -0
- package/dist/core/extensions/builtin/btw/index.d.ts +3 -0
- package/dist/core/extensions/builtin/btw/index.d.ts.map +1 -0
- package/dist/core/extensions/builtin/btw/index.js +120 -0
- package/dist/core/extensions/builtin/btw/index.js.map +1 -0
- package/dist/core/extensions/builtin/btw/panel.d.ts +21 -0
- package/dist/core/extensions/builtin/btw/panel.d.ts.map +1 -0
- package/dist/core/extensions/builtin/btw/panel.js +61 -0
- package/dist/core/extensions/builtin/btw/panel.js.map +1 -0
- package/dist/core/extensions/builtin/btw/side-query.d.ts +31 -0
- package/dist/core/extensions/builtin/btw/side-query.d.ts.map +1 -0
- package/dist/core/extensions/builtin/btw/side-query.js +68 -0
- package/dist/core/extensions/builtin/btw/side-query.js.map +1 -0
- package/dist/core/extensions/builtin/compaction/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/compaction/index.js +47 -11
- package/dist/core/extensions/builtin/compaction/index.js.map +1 -1
- package/dist/core/extensions/builtin/compaction/openai-remote.d.ts.map +1 -1
- package/dist/core/extensions/builtin/compaction/openai-remote.js +3 -1
- package/dist/core/extensions/builtin/compaction/openai-remote.js.map +1 -1
- package/dist/core/extensions/builtin/compaction/speculative.d.ts +17 -0
- package/dist/core/extensions/builtin/compaction/speculative.d.ts.map +1 -1
- package/dist/core/extensions/builtin/compaction/speculative.js +93 -26
- package/dist/core/extensions/builtin/compaction/speculative.js.map +1 -1
- package/dist/core/extensions/builtin/config-reload/index.d.ts +39 -0
- package/dist/core/extensions/builtin/config-reload/index.d.ts.map +1 -0
- package/dist/core/extensions/builtin/config-reload/index.js +659 -0
- package/dist/core/extensions/builtin/config-reload/index.js.map +1 -0
- package/dist/core/extensions/builtin/config-reload/log.d.ts +55 -0
- package/dist/core/extensions/builtin/config-reload/log.d.ts.map +1 -0
- package/dist/core/extensions/builtin/config-reload/log.js +128 -0
- package/dist/core/extensions/builtin/config-reload/log.js.map +1 -0
- package/dist/core/extensions/builtin/config-reload/protocol.d.ts +71 -0
- package/dist/core/extensions/builtin/config-reload/protocol.d.ts.map +1 -0
- package/dist/core/extensions/builtin/config-reload/protocol.js +83 -0
- package/dist/core/extensions/builtin/config-reload/protocol.js.map +1 -0
- package/dist/core/extensions/builtin/config-reload/watch-engine.d.ts +43 -0
- package/dist/core/extensions/builtin/config-reload/watch-engine.d.ts.map +1 -0
- package/dist/core/extensions/builtin/config-reload/watch-engine.js +298 -0
- package/dist/core/extensions/builtin/config-reload/watch-engine.js.map +1 -0
- package/dist/core/extensions/builtin/goal/command-registration.d.ts +2 -2
- package/dist/core/extensions/builtin/goal/command-registration.d.ts.map +1 -1
- package/dist/core/extensions/builtin/goal/command-registration.js +3 -4
- package/dist/core/extensions/builtin/goal/command-registration.js.map +1 -1
- package/dist/core/extensions/builtin/goal/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/goal/index.js +11 -27
- package/dist/core/extensions/builtin/goal/index.js.map +1 -1
- package/dist/core/extensions/builtin/goal/tool-registration.d.ts +2 -2
- package/dist/core/extensions/builtin/goal/tool-registration.d.ts.map +1 -1
- package/dist/core/extensions/builtin/goal/tool-registration.js +2 -3
- package/dist/core/extensions/builtin/goal/tool-registration.js.map +1 -1
- package/dist/core/extensions/builtin/goal/turn-usage.d.ts +20 -0
- package/dist/core/extensions/builtin/goal/turn-usage.d.ts.map +1 -0
- package/dist/core/extensions/builtin/goal/turn-usage.js +61 -0
- package/dist/core/extensions/builtin/goal/turn-usage.js.map +1 -0
- package/dist/core/extensions/builtin/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/index.js +9 -0
- package/dist/core/extensions/builtin/index.js.map +1 -1
- package/dist/core/extensions/builtin/look-at/arguments.d.ts +27 -0
- package/dist/core/extensions/builtin/look-at/arguments.d.ts.map +1 -0
- package/dist/core/extensions/builtin/look-at/arguments.js +109 -0
- package/dist/core/extensions/builtin/look-at/arguments.js.map +1 -0
- package/dist/core/extensions/builtin/look-at/commands.d.ts +9 -0
- package/dist/core/extensions/builtin/look-at/commands.d.ts.map +1 -0
- package/dist/core/extensions/builtin/look-at/commands.js +102 -0
- package/dist/core/extensions/builtin/look-at/commands.js.map +1 -0
- package/dist/core/extensions/builtin/look-at/image-input.d.ts +21 -0
- package/dist/core/extensions/builtin/look-at/image-input.d.ts.map +1 -0
- package/dist/core/extensions/builtin/look-at/image-input.js +151 -0
- package/dist/core/extensions/builtin/look-at/image-input.js.map +1 -0
- package/dist/core/extensions/builtin/look-at/index.d.ts +3 -0
- package/dist/core/extensions/builtin/look-at/index.d.ts.map +1 -0
- package/dist/core/extensions/builtin/look-at/index.js +58 -0
- package/dist/core/extensions/builtin/look-at/index.js.map +1 -0
- package/dist/core/extensions/builtin/look-at/model-selector.d.ts +9 -0
- package/dist/core/extensions/builtin/look-at/model-selector.d.ts.map +1 -0
- package/dist/core/extensions/builtin/look-at/model-selector.js +77 -0
- package/dist/core/extensions/builtin/look-at/model-selector.js.map +1 -0
- package/dist/core/extensions/builtin/look-at/prompts.d.ts +5 -0
- package/dist/core/extensions/builtin/look-at/prompts.d.ts.map +1 -0
- package/dist/core/extensions/builtin/look-at/prompts.js +19 -0
- package/dist/core/extensions/builtin/look-at/prompts.js.map +1 -0
- package/dist/core/extensions/builtin/look-at/render.d.ts +26 -0
- package/dist/core/extensions/builtin/look-at/render.d.ts.map +1 -0
- package/dist/core/extensions/builtin/look-at/render.js +70 -0
- package/dist/core/extensions/builtin/look-at/render.js.map +1 -0
- package/dist/core/extensions/builtin/look-at/runner.d.ts +16 -0
- package/dist/core/extensions/builtin/look-at/runner.d.ts.map +1 -0
- package/dist/core/extensions/builtin/look-at/runner.js +108 -0
- package/dist/core/extensions/builtin/look-at/runner.js.map +1 -0
- package/dist/core/extensions/builtin/look-at/settings.d.ts +13 -0
- package/dist/core/extensions/builtin/look-at/settings.d.ts.map +1 -0
- package/dist/core/extensions/builtin/look-at/settings.js +20 -0
- package/dist/core/extensions/builtin/look-at/settings.js.map +1 -0
- package/dist/core/extensions/builtin/mcp/commands.d.ts.map +1 -1
- package/dist/core/extensions/builtin/mcp/commands.js +2 -0
- package/dist/core/extensions/builtin/mcp/commands.js.map +1 -1
- package/dist/core/extensions/builtin/mcp/config-schema.d.ts +6 -0
- package/dist/core/extensions/builtin/mcp/config-schema.d.ts.map +1 -1
- package/dist/core/extensions/builtin/mcp/config-schema.js +1 -0
- package/dist/core/extensions/builtin/mcp/config-schema.js.map +1 -1
- package/dist/core/extensions/builtin/mcp/config.d.ts.map +1 -1
- package/dist/core/extensions/builtin/mcp/config.js +9 -1
- package/dist/core/extensions/builtin/mcp/config.js.map +1 -1
- package/dist/core/extensions/builtin/mcp/service.d.ts.map +1 -1
- package/dist/core/extensions/builtin/mcp/service.js +22 -6
- package/dist/core/extensions/builtin/mcp/service.js.map +1 -1
- package/dist/core/extensions/builtin/mcp/startup-race.d.ts +10 -0
- package/dist/core/extensions/builtin/mcp/startup-race.d.ts.map +1 -1
- package/dist/core/extensions/builtin/mcp/startup-race.js +18 -1
- package/dist/core/extensions/builtin/mcp/startup-race.js.map +1 -1
- package/dist/core/extensions/builtin/model-fallback/index.d.ts +4 -0
- package/dist/core/extensions/builtin/model-fallback/index.d.ts.map +1 -0
- package/dist/core/extensions/builtin/model-fallback/index.js +55 -0
- package/dist/core/extensions/builtin/model-fallback/index.js.map +1 -0
- package/dist/core/extensions/builtin/model-fallback/settings.d.ts +6 -0
- package/dist/core/extensions/builtin/model-fallback/settings.d.ts.map +1 -0
- package/dist/core/extensions/builtin/model-fallback/settings.js +11 -0
- package/dist/core/extensions/builtin/model-fallback/settings.js.map +1 -0
- package/dist/core/extensions/builtin/model-fallback/ui.d.ts +12 -0
- package/dist/core/extensions/builtin/model-fallback/ui.d.ts.map +1 -0
- package/dist/core/extensions/builtin/model-fallback/ui.js +72 -0
- package/dist/core/extensions/builtin/model-fallback/ui.js.map +1 -0
- package/dist/core/extensions/builtin/nested-agents-md/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/nested-agents-md/index.js +4 -1
- package/dist/core/extensions/builtin/nested-agents-md/index.js.map +1 -1
- package/dist/core/extensions/builtin/rules/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/rules/index.js +4 -1
- package/dist/core/extensions/builtin/rules/index.js.map +1 -1
- package/dist/core/extensions/builtin/terminal/output-format.d.ts +28 -0
- package/dist/core/extensions/builtin/terminal/output-format.d.ts.map +1 -0
- package/dist/core/extensions/builtin/terminal/output-format.js +74 -0
- package/dist/core/extensions/builtin/terminal/output-format.js.map +1 -0
- package/dist/core/extensions/builtin/terminal/runtime-session.d.ts +3 -0
- package/dist/core/extensions/builtin/terminal/runtime-session.d.ts.map +1 -1
- package/dist/core/extensions/builtin/terminal/runtime-session.js +22 -2
- package/dist/core/extensions/builtin/terminal/runtime-session.js.map +1 -1
- package/dist/core/extensions/builtin/terminal/shared.d.ts +7 -0
- package/dist/core/extensions/builtin/terminal/shared.d.ts.map +1 -1
- package/dist/core/extensions/builtin/terminal/shared.js +14 -0
- package/dist/core/extensions/builtin/terminal/shared.js.map +1 -1
- package/dist/core/extensions/builtin/terminal/tools/bash-output.d.ts +5 -1
- package/dist/core/extensions/builtin/terminal/tools/bash-output.d.ts.map +1 -1
- package/dist/core/extensions/builtin/terminal/tools/bash-output.js +88 -6
- package/dist/core/extensions/builtin/terminal/tools/bash-output.js.map +1 -1
- package/dist/core/extensions/builtin/terminal/tools/bash.d.ts +12 -1
- package/dist/core/extensions/builtin/terminal/tools/bash.d.ts.map +1 -1
- package/dist/core/extensions/builtin/terminal/tools/bash.js +82 -8
- package/dist/core/extensions/builtin/terminal/tools/bash.js.map +1 -1
- package/dist/core/extensions/builtin/terminal/tools/render.d.ts +16 -0
- package/dist/core/extensions/builtin/terminal/tools/render.d.ts.map +1 -0
- package/dist/core/extensions/builtin/terminal/tools/render.js +30 -0
- package/dist/core/extensions/builtin/terminal/tools/render.js.map +1 -0
- package/dist/core/extensions/builtin/terminal/tools/spawn.d.ts +2 -0
- package/dist/core/extensions/builtin/terminal/tools/spawn.d.ts.map +1 -1
- package/dist/core/extensions/builtin/terminal/tools/spawn.js +1 -1
- package/dist/core/extensions/builtin/terminal/tools/spawn.js.map +1 -1
- package/dist/core/extensions/builtin/todotools/tools/todo.d.ts.map +1 -1
- package/dist/core/extensions/builtin/todotools/tools/todo.js +22 -6
- package/dist/core/extensions/builtin/todotools/tools/todo.js.map +1 -1
- package/dist/core/extensions/builtin/webfetch/webfetch/fetcher.d.ts +1 -0
- package/dist/core/extensions/builtin/webfetch/webfetch/fetcher.d.ts.map +1 -1
- package/dist/core/extensions/builtin/webfetch/webfetch/fetcher.js +13 -4
- package/dist/core/extensions/builtin/webfetch/webfetch/fetcher.js.map +1 -1
- package/dist/core/extensions/builtin/webfetch/webfetch/renderers.d.ts.map +1 -1
- package/dist/core/extensions/builtin/webfetch/webfetch/renderers.js +17 -2
- package/dist/core/extensions/builtin/webfetch/webfetch/renderers.js.map +1 -1
- package/dist/core/extensions/builtin/webfetch/webfetch/tool.d.ts +8 -1
- package/dist/core/extensions/builtin/webfetch/webfetch/tool.d.ts.map +1 -1
- package/dist/core/extensions/builtin/webfetch/webfetch/tool.js +45 -3
- package/dist/core/extensions/builtin/webfetch/webfetch/tool.js.map +1 -1
- package/dist/core/extensions/builtin/websearch/websearch/renderers.d.ts.map +1 -1
- package/dist/core/extensions/builtin/websearch/websearch/renderers.js +13 -4
- package/dist/core/extensions/builtin/websearch/websearch/renderers.js.map +1 -1
- package/dist/core/extensions/builtin/websearch/websearch/search.d.ts +3 -2
- package/dist/core/extensions/builtin/websearch/websearch/search.d.ts.map +1 -1
- package/dist/core/extensions/builtin/websearch/websearch/search.js +2 -1
- package/dist/core/extensions/builtin/websearch/websearch/search.js.map +1 -1
- package/dist/core/extensions/builtin/websearch/websearch/tool.d.ts.map +1 -1
- package/dist/core/extensions/builtin/websearch/websearch/tool.js +17 -1
- package/dist/core/extensions/builtin/websearch/websearch/tool.js.map +1 -1
- package/dist/core/extensions/builtin/websearch/websearch/types.d.ts +2 -0
- package/dist/core/extensions/builtin/websearch/websearch/types.d.ts.map +1 -1
- package/dist/core/extensions/builtin/websearch/websearch/types.js.map +1 -1
- package/dist/core/extensions/runner.d.ts +6 -0
- package/dist/core/extensions/runner.d.ts.map +1 -1
- package/dist/core/extensions/runner.js +71 -3
- package/dist/core/extensions/runner.js.map +1 -1
- package/dist/core/extensions/types.d.ts +96 -10
- package/dist/core/extensions/types.d.ts.map +1 -1
- package/dist/core/extensions/types.js.map +1 -1
- package/dist/core/model-config-schema.d.ts +1942 -0
- package/dist/core/model-config-schema.d.ts.map +1 -0
- package/dist/core/model-config-schema.js +197 -0
- package/dist/core/model-config-schema.js.map +1 -0
- package/dist/core/model-config.d.ts +2 -578
- package/dist/core/model-config.d.ts.map +1 -1
- package/dist/core/model-config.js +1 -194
- package/dist/core/model-config.js.map +1 -1
- package/dist/core/model-resolver.d.ts.map +1 -1
- package/dist/core/model-resolver.js +1 -0
- package/dist/core/model-resolver.js.map +1 -1
- package/dist/core/model-runtime.d.ts.map +1 -1
- package/dist/core/model-runtime.js +9 -3
- package/dist/core/model-runtime.js.map +1 -1
- package/dist/core/provider-composer.d.ts +1 -0
- package/dist/core/provider-composer.d.ts.map +1 -1
- package/dist/core/provider-composer.js +3 -2
- package/dist/core/provider-composer.js.map +1 -1
- package/dist/core/provider-display-names.d.ts.map +1 -1
- package/dist/core/provider-display-names.js +1 -0
- package/dist/core/provider-display-names.js.map +1 -1
- package/dist/core/retry-fallback/chains.d.ts +29 -0
- package/dist/core/retry-fallback/chains.d.ts.map +1 -0
- package/dist/core/retry-fallback/chains.js +109 -0
- package/dist/core/retry-fallback/chains.js.map +1 -0
- package/dist/core/retry-fallback/controller.d.ts +77 -0
- package/dist/core/retry-fallback/controller.d.ts.map +1 -0
- package/dist/core/retry-fallback/controller.js +157 -0
- package/dist/core/retry-fallback/controller.js.map +1 -0
- package/dist/core/retry-fallback/cooldown.d.ts +21 -0
- package/dist/core/retry-fallback/cooldown.d.ts.map +1 -0
- package/dist/core/retry-fallback/cooldown.js +49 -0
- package/dist/core/retry-fallback/cooldown.js.map +1 -0
- package/dist/core/retry-fallback/log.d.ts +10 -0
- package/dist/core/retry-fallback/log.d.ts.map +1 -0
- package/dist/core/retry-fallback/log.js +128 -0
- package/dist/core/retry-fallback/log.js.map +1 -0
- package/dist/core/retry-fallback/validate.d.ts +8 -0
- package/dist/core/retry-fallback/validate.d.ts.map +1 -0
- package/dist/core/retry-fallback/validate.js +63 -0
- package/dist/core/retry-fallback/validate.js.map +1 -0
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +1 -0
- package/dist/core/sdk.js.map +1 -1
- package/dist/core/session-manager.d.ts +39 -3
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +125 -16
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/settings-manager.d.ts +33 -0
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +153 -6
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/modes/interactive/components/footer.d.ts +2 -1
- package/dist/modes/interactive/components/footer.d.ts.map +1 -1
- package/dist/modes/interactive/components/footer.js +30 -20
- package/dist/modes/interactive/components/footer.js.map +1 -1
- package/dist/modes/interactive/components/todo-strike.d.ts +8 -0
- package/dist/modes/interactive/components/todo-strike.d.ts.map +1 -0
- package/dist/modes/interactive/components/todo-strike.js +35 -0
- package/dist/modes/interactive/components/todo-strike.js.map +1 -0
- package/dist/modes/interactive/components/tool-execution-renderer.d.ts.map +1 -1
- package/dist/modes/interactive/components/tool-execution-renderer.js +8 -1
- package/dist/modes/interactive/components/tool-execution-renderer.js.map +1 -1
- package/dist/modes/interactive/components/tool-execution.d.ts +4 -0
- package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/dist/modes/interactive/components/tool-execution.js +51 -2
- package/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts +6 -0
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +124 -4
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/interactive/tool-progress.d.ts +8 -0
- package/dist/modes/interactive/tool-progress.d.ts.map +1 -0
- package/dist/modes/interactive/tool-progress.js +26 -0
- package/dist/modes/interactive/tool-progress.js.map +1 -0
- package/dist/modes/interactive/tool-result-reveal.d.ts +18 -0
- package/dist/modes/interactive/tool-result-reveal.d.ts.map +1 -0
- package/dist/modes/interactive/tool-result-reveal.js +155 -0
- package/dist/modes/interactive/tool-result-reveal.js.map +1 -0
- package/dist/utils/fs-watch.d.ts +2 -2
- package/dist/utils/fs-watch.d.ts.map +1 -1
- package/dist/utils/fs-watch.js +2 -2
- package/dist/utils/fs-watch.js.map +1 -1
- package/docs/extensions.md +79 -1
- package/docs/mcp.md +10 -1
- package/docs/models.md +102 -1
- package/docs/providers.md +3 -1
- package/docs/settings.md +35 -0
- package/node_modules/@code-yeongyu/senpi-codemode/CHANGELOG.md +24 -0
- package/node_modules/@code-yeongyu/senpi-codemode/package.json +3 -3
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/cell-handler.ts +13 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.js +76 -8
- package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/agent.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/agent.js +26 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/agent.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/agent-harness.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/agent-harness.js +24 -2
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/agent-harness.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/types.d.ts +5 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/types.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/types.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/package.json +2 -2
- package/node_modules/@earendil-works/pi-ai/README.md +2 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.js +68 -25
- package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/lazy.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/lazy.js +33 -6
- package/node_modules/@earendil-works/pi-ai/dist/api/lazy.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses-shared.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses-shared.js +6 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses-shared.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/transform-messages.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/transform-messages.js +62 -52
- package/node_modules/@earendil-works/pi-ai/dist/api/transform-messages.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api-registry.d.ts +19 -0
- package/node_modules/@earendil-works/pi-ai/dist/api-registry.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/api-registry.js +50 -0
- package/node_modules/@earendil-works/pi-ai/dist/api-registry.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/compat.d.ts +2 -17
- package/node_modules/@earendil-works/pi-ai/dist/compat.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/compat.js +3 -52
- package/node_modules/@earendil-works/pi-ai/dist/compat.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/env-api-keys.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/env-api-keys.js +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/env-api-keys.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.d.ts +45 -0
- package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.js +45 -0
- package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/index.d.ts +5 -0
- package/node_modules/@earendil-works/pi-ai/dist/index.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/index.js +5 -0
- package/node_modules/@earendil-works/pi-ai/dist/index.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/model.d.ts +27 -0
- package/node_modules/@earendil-works/pi-ai/dist/model.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/model.js +2 -0
- package/node_modules/@earendil-works/pi-ai/dist/model.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/models.generated.d.ts +1178 -1072
- package/node_modules/@earendil-works/pi-ai/dist/models.generated.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/models.generated.js +2 -0
- package/node_modules/@earendil-works/pi-ai/dist/models.generated.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/alibaba-token-plan.d.ts +3 -0
- package/node_modules/@earendil-works/pi-ai/dist/providers/alibaba-token-plan.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/providers/alibaba-token-plan.js +15 -0
- package/node_modules/@earendil-works/pi-ai/dist/providers/alibaba-token-plan.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/providers/alibaba-token-plan.models.d.ts +64 -0
- package/node_modules/@earendil-works/pi-ai/dist/providers/alibaba-token-plan.models.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/providers/alibaba-token-plan.models.js +5 -0
- package/node_modules/@earendil-works/pi-ai/dist/providers/alibaba-token-plan.models.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/providers/all.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/all.js +2 -0
- package/node_modules/@earendil-works/pi-ai/dist/providers/all.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/alibaba-token-plan.json +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/google.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/kimi-coding.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/opencode.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/openrouter.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/vercel-ai-gateway.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/faux.d.ts +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/providers/faux.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/faux.js +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/providers/faux.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/google.models.d.ts +8 -0
- package/node_modules/@earendil-works/pi-ai/dist/providers/google.models.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/google.models.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/kimi-coding.models.d.ts +0 -4
- package/node_modules/@earendil-works/pi-ai/dist/providers/kimi-coding.models.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/kimi-coding.models.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/opencode.models.d.ts +12 -4
- package/node_modules/@earendil-works/pi-ai/dist/providers/opencode.models.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/opencode.models.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/openrouter.models.d.ts +20 -4
- package/node_modules/@earendil-works/pi-ai/dist/providers/openrouter.models.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/openrouter.models.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/vercel-ai-gateway.models.d.ts +16 -0
- package/node_modules/@earendil-works/pi-ai/dist/providers/vercel-ai-gateway.models.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/vercel-ai-gateway.models.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/index.d.ts +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/index.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/index.js +8 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/index.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/invoke-stream-helpers.d.ts +20 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/invoke-stream-helpers.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/invoke-stream-helpers.js +79 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/invoke-stream-helpers.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/invoke-tag-scanner.d.ts +2 -18
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/invoke-tag-scanner.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/invoke-tag-scanner.js +4 -218
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/invoke-tag-scanner.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/invoke-tag-syntax.d.ts +38 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/invoke-tag-syntax.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/invoke-tag-syntax.js +210 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/invoke-tag-syntax.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/recovery-stream.d.ts +9 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/recovery-stream.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/recovery-stream.js +231 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/recovery-stream.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/recovery-wrapper-state.d.ts +38 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/recovery-wrapper-state.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/recovery-wrapper-state.js +84 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/recovery-wrapper-state.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/stream-boundary.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/stream-boundary.js +20 -57
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/stream-boundary.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/stream.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/stream.js +16 -99
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/stream.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/antml/index.d.ts +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/antml/index.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/antml/index.js +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/antml/index.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/antml/recovery-stream.d.ts +5 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/antml/recovery-stream.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/antml/recovery-stream.js +6 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/antml/recovery-stream.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-code-mask.d.ts +19 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-code-mask.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-code-mask.js +185 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-code-mask.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-content-lifecycle.d.ts +11 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-content-lifecycle.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-content-lifecycle.js +24 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-content-lifecycle.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-diagnostics.d.ts +4 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-diagnostics.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-diagnostics.js +13 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-diagnostics.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-event-stream.d.ts +15 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-event-stream.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-event-stream.js +37 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-event-stream.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-message-snapshot.d.ts +4 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-message-snapshot.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-message-snapshot.js +61 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-message-snapshot.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-native-projection.d.ts +29 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-native-projection.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-native-projection.js +148 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-native-projection.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-stream-failure.d.ts +5 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-stream-failure.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-stream-failure.js +36 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-stream-failure.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-stream-terminal.d.ts +15 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-stream-terminal.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-stream-terminal.js +88 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-stream-terminal.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-stream-wrapper.d.ts +3 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-stream-wrapper.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-stream-wrapper.js +233 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-stream-wrapper.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-text-projection.d.ts +23 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-text-projection.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-text-projection.js +77 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-text-projection.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/stream-message-metadata.d.ts +5 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/stream-message-metadata.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/stream-message-metadata.js +63 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/stream-message-metadata.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/stream-thinking-projection.d.ts +13 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/stream-thinking-projection.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/stream-thinking-projection.js +52 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/stream-thinking-projection.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/stream-wrapper-shared.d.ts +41 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/stream-wrapper-shared.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/stream-wrapper-shared.js +209 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/stream-wrapper-shared.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/stream-wrapper.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/stream-wrapper.js +70 -346
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/stream-wrapper.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/types.d.ts +18 -23
- package/node_modules/@earendil-works/pi-ai/dist/types.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/types.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/retry.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/retry.js +5 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/retry.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/stop-details.d.ts +4 -0
- package/node_modules/@earendil-works/pi-ai/dist/utils/stop-details.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/utils/stop-details.js +6 -0
- package/node_modules/@earendil-works/pi-ai/dist/utils/stop-details.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/package.json +1 -1
- package/node_modules/@earendil-works/pi-pty/package.json +1 -1
- package/node_modules/@earendil-works/pi-tui/package.json +1 -1
- package/package.json +6 -6
package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-native-projection.js
ADDED
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
function cloneContentBlock(block) {
|
|
2
|
+
if (block.type === "toolCall")
|
|
3
|
+
return { ...block, arguments: { ...block.arguments } };
|
|
4
|
+
return { ...block };
|
|
5
|
+
}
|
|
6
|
+
function cloneToolCall(toolCall) {
|
|
7
|
+
return { ...toolCall, arguments: { ...toolCall.arguments } };
|
|
8
|
+
}
|
|
9
|
+
/** Maintains source-index order and native/recovered ID ownership for recovery streams. */
|
|
10
|
+
export class RecoveryNativeProjection {
|
|
11
|
+
constructor(stream, message) {
|
|
12
|
+
this.rangesByInnerIndex = new Map();
|
|
13
|
+
this.nativeLifecycleByInnerIndex = new Map();
|
|
14
|
+
this.reservedIds = new Set();
|
|
15
|
+
this.recoveredIds = new Set();
|
|
16
|
+
this.recoveredIdByParserIndex = new Map();
|
|
17
|
+
this.highestProjectedInnerIndex = -1;
|
|
18
|
+
this.nextRecoveredId = 0;
|
|
19
|
+
this.stream = stream;
|
|
20
|
+
this.message = message;
|
|
21
|
+
}
|
|
22
|
+
reserveVisibleIds(source) {
|
|
23
|
+
for (const block of source.content) {
|
|
24
|
+
if (block.type === "toolCall")
|
|
25
|
+
this.reservedIds.add(block.id);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
synchronizeLower(source, contentIndex) {
|
|
29
|
+
for (let innerIndex = 0; innerIndex < contentIndex && innerIndex < source.content.length; innerIndex += 1) {
|
|
30
|
+
if (this.rangesByInnerIndex.has(innerIndex))
|
|
31
|
+
continue;
|
|
32
|
+
if (!this.appendUnannounced(source, innerIndex))
|
|
33
|
+
return false;
|
|
34
|
+
}
|
|
35
|
+
return true;
|
|
36
|
+
}
|
|
37
|
+
synchronizeRemaining(source) {
|
|
38
|
+
for (let innerIndex = 0; innerIndex < source.content.length; innerIndex += 1) {
|
|
39
|
+
if (this.rangesByInnerIndex.has(innerIndex))
|
|
40
|
+
continue;
|
|
41
|
+
if (!this.appendUnannounced(source, innerIndex))
|
|
42
|
+
return false;
|
|
43
|
+
}
|
|
44
|
+
return true;
|
|
45
|
+
}
|
|
46
|
+
startText(innerIndex, outerIndex) {
|
|
47
|
+
if (!this.recordRange(innerIndex, { start: outerIndex, end: this.message.content.length }))
|
|
48
|
+
return false;
|
|
49
|
+
return true;
|
|
50
|
+
}
|
|
51
|
+
recordProjectedBlock(innerIndex, outerIndex) {
|
|
52
|
+
return this.recordRange(innerIndex, { start: outerIndex, end: outerIndex + 1 });
|
|
53
|
+
}
|
|
54
|
+
extendText(innerIndex) {
|
|
55
|
+
const range = this.rangesByInnerIndex.get(innerIndex);
|
|
56
|
+
if (range)
|
|
57
|
+
range.end = this.message.content.length;
|
|
58
|
+
}
|
|
59
|
+
projectNativeStart(source, innerIndex) {
|
|
60
|
+
if (this.nativeLifecycleByInnerIndex.has(innerIndex) || this.rangesByInnerIndex.has(innerIndex))
|
|
61
|
+
return "invalid";
|
|
62
|
+
const block = source.content[innerIndex];
|
|
63
|
+
if (block?.type !== "toolCall" || innerIndex <= this.highestProjectedInnerIndex)
|
|
64
|
+
return "invalid";
|
|
65
|
+
if (this.recoveredIds.has(block.id))
|
|
66
|
+
return "collision";
|
|
67
|
+
this.reservedIds.add(block.id);
|
|
68
|
+
const outerIndex = this.message.content.length;
|
|
69
|
+
this.message.content.push(cloneContentBlock(block));
|
|
70
|
+
if (!this.recordRange(innerIndex, { start: outerIndex, end: outerIndex + 1 }))
|
|
71
|
+
return "invalid";
|
|
72
|
+
this.nativeLifecycleByInnerIndex.set(innerIndex, "started");
|
|
73
|
+
this.stream.push({ type: "toolcall_start", contentIndex: outerIndex, partial: this.message });
|
|
74
|
+
return "projected";
|
|
75
|
+
}
|
|
76
|
+
projectNativeDelta(source, innerIndex, delta) {
|
|
77
|
+
if (this.nativeLifecycleByInnerIndex.get(innerIndex) !== "started")
|
|
78
|
+
return false;
|
|
79
|
+
const outerIndex = this.rangesByInnerIndex.get(innerIndex)?.start;
|
|
80
|
+
const block = source.content[innerIndex];
|
|
81
|
+
if (outerIndex == null || block?.type !== "toolCall")
|
|
82
|
+
return false;
|
|
83
|
+
this.message.content[outerIndex] = cloneContentBlock(block);
|
|
84
|
+
this.stream.push({ type: "toolcall_delta", contentIndex: outerIndex, delta, partial: this.message });
|
|
85
|
+
return true;
|
|
86
|
+
}
|
|
87
|
+
projectNativeEnd(innerIndex, toolCall) {
|
|
88
|
+
if (this.nativeLifecycleByInnerIndex.get(innerIndex) !== "started")
|
|
89
|
+
return false;
|
|
90
|
+
const outerIndex = this.rangesByInnerIndex.get(innerIndex)?.start;
|
|
91
|
+
if (outerIndex == null)
|
|
92
|
+
return false;
|
|
93
|
+
const finalToolCall = cloneToolCall(toolCall);
|
|
94
|
+
this.message.content[outerIndex] = finalToolCall;
|
|
95
|
+
this.nativeLifecycleByInnerIndex.set(innerIndex, "ended");
|
|
96
|
+
this.stream.push({
|
|
97
|
+
type: "toolcall_end",
|
|
98
|
+
contentIndex: outerIndex,
|
|
99
|
+
toolCall: finalToolCall,
|
|
100
|
+
partial: this.message,
|
|
101
|
+
});
|
|
102
|
+
return true;
|
|
103
|
+
}
|
|
104
|
+
assignRecoveredIds(events) {
|
|
105
|
+
return events.map((event) => {
|
|
106
|
+
if (event.type === "toolcall_start") {
|
|
107
|
+
const id = this.allocateRecoveredId();
|
|
108
|
+
this.recoveredIdByParserIndex.set(event.index, id);
|
|
109
|
+
return { ...event, id };
|
|
110
|
+
}
|
|
111
|
+
if (event.type === "toolcall_end") {
|
|
112
|
+
const id = this.recoveredIdByParserIndex.get(event.index) ?? event.id;
|
|
113
|
+
this.recoveredIdByParserIndex.delete(event.index);
|
|
114
|
+
return { ...event, id };
|
|
115
|
+
}
|
|
116
|
+
return event;
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
appendUnannounced(source, innerIndex) {
|
|
120
|
+
const block = source.content[innerIndex];
|
|
121
|
+
if (!block || innerIndex <= this.highestProjectedInnerIndex)
|
|
122
|
+
return false;
|
|
123
|
+
if (block.type === "toolCall" && this.recoveredIds.has(block.id))
|
|
124
|
+
return false;
|
|
125
|
+
const outerIndex = this.message.content.length;
|
|
126
|
+
this.message.content.push(cloneContentBlock(block));
|
|
127
|
+
return this.recordRange(innerIndex, { start: outerIndex, end: outerIndex + 1 });
|
|
128
|
+
}
|
|
129
|
+
recordRange(innerIndex, range) {
|
|
130
|
+
if (this.rangesByInnerIndex.has(innerIndex) || innerIndex <= this.highestProjectedInnerIndex)
|
|
131
|
+
return false;
|
|
132
|
+
this.rangesByInnerIndex.set(innerIndex, range);
|
|
133
|
+
this.highestProjectedInnerIndex = innerIndex;
|
|
134
|
+
return true;
|
|
135
|
+
}
|
|
136
|
+
allocateRecoveredId() {
|
|
137
|
+
for (;;) {
|
|
138
|
+
const id = `recovered-antml-${this.nextRecoveredId}`;
|
|
139
|
+
this.nextRecoveredId += 1;
|
|
140
|
+
if (this.reservedIds.has(id))
|
|
141
|
+
continue;
|
|
142
|
+
this.reservedIds.add(id);
|
|
143
|
+
this.recoveredIds.add(id);
|
|
144
|
+
return id;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
//# sourceMappingURL=recovery-native-projection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recovery-native-projection.js","sourceRoot":"","sources":["../../src/tool-call-middleware/recovery-native-projection.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AssistantMessage, AssistantMessageEventStream, ToolCall } from \"../types.ts\";\nimport type { StreamParserEvent } from \"./types.ts\";\n\ntype ContentBlock = AssistantMessage[\"content\"][number];\ntype ContentRange = { start: number; end: number };\ntype NativeLifecycle = \"started\" | \"ended\";\n\nfunction cloneContentBlock(block: ContentBlock): ContentBlock {\n\tif (block.type === \"toolCall\") return { ...block, arguments: { ...block.arguments } };\n\treturn { ...block };\n}\n\nfunction cloneToolCall(toolCall: ToolCall): ToolCall {\n\treturn { ...toolCall, arguments: { ...toolCall.arguments } };\n}\n\n/** Maintains source-index order and native/recovered ID ownership for recovery streams. */\nexport class RecoveryNativeProjection {\n\tprivate readonly stream: AssistantMessageEventStream;\n\tprivate readonly message: AssistantMessage;\n\tprivate readonly rangesByInnerIndex = new Map<number, ContentRange>();\n\tprivate readonly nativeLifecycleByInnerIndex = new Map<number, NativeLifecycle>();\n\tprivate readonly reservedIds = new Set<string>();\n\tprivate readonly recoveredIds = new Set<string>();\n\tprivate readonly recoveredIdByParserIndex = new Map<number, string>();\n\tprivate highestProjectedInnerIndex = -1;\n\tprivate nextRecoveredId = 0;\n\n\tconstructor(stream: AssistantMessageEventStream, message: AssistantMessage) {\n\t\tthis.stream = stream;\n\t\tthis.message = message;\n\t}\n\n\treserveVisibleIds(source: AssistantMessage): void {\n\t\tfor (const block of source.content) {\n\t\t\tif (block.type === \"toolCall\") this.reservedIds.add(block.id);\n\t\t}\n\t}\n\n\tsynchronizeLower(source: AssistantMessage, contentIndex: number): boolean {\n\t\tfor (let innerIndex = 0; innerIndex < contentIndex && innerIndex < source.content.length; innerIndex += 1) {\n\t\t\tif (this.rangesByInnerIndex.has(innerIndex)) continue;\n\t\t\tif (!this.appendUnannounced(source, innerIndex)) return false;\n\t\t}\n\t\treturn true;\n\t}\n\n\tsynchronizeRemaining(source: AssistantMessage): boolean {\n\t\tfor (let innerIndex = 0; innerIndex < source.content.length; innerIndex += 1) {\n\t\t\tif (this.rangesByInnerIndex.has(innerIndex)) continue;\n\t\t\tif (!this.appendUnannounced(source, innerIndex)) return false;\n\t\t}\n\t\treturn true;\n\t}\n\n\tstartText(innerIndex: number, outerIndex: number): boolean {\n\t\tif (!this.recordRange(innerIndex, { start: outerIndex, end: this.message.content.length })) return false;\n\t\treturn true;\n\t}\n\n\trecordProjectedBlock(innerIndex: number, outerIndex: number): boolean {\n\t\treturn this.recordRange(innerIndex, { start: outerIndex, end: outerIndex + 1 });\n\t}\n\n\textendText(innerIndex: number): void {\n\t\tconst range = this.rangesByInnerIndex.get(innerIndex);\n\t\tif (range) range.end = this.message.content.length;\n\t}\n\n\tprojectNativeStart(source: AssistantMessage, innerIndex: number): \"projected\" | \"collision\" | \"invalid\" {\n\t\tif (this.nativeLifecycleByInnerIndex.has(innerIndex) || this.rangesByInnerIndex.has(innerIndex)) return \"invalid\";\n\t\tconst block = source.content[innerIndex];\n\t\tif (block?.type !== \"toolCall\" || innerIndex <= this.highestProjectedInnerIndex) return \"invalid\";\n\t\tif (this.recoveredIds.has(block.id)) return \"collision\";\n\t\tthis.reservedIds.add(block.id);\n\t\tconst outerIndex = this.message.content.length;\n\t\tthis.message.content.push(cloneContentBlock(block));\n\t\tif (!this.recordRange(innerIndex, { start: outerIndex, end: outerIndex + 1 })) return \"invalid\";\n\t\tthis.nativeLifecycleByInnerIndex.set(innerIndex, \"started\");\n\t\tthis.stream.push({ type: \"toolcall_start\", contentIndex: outerIndex, partial: this.message });\n\t\treturn \"projected\";\n\t}\n\n\tprojectNativeDelta(source: AssistantMessage, innerIndex: number, delta: string): boolean {\n\t\tif (this.nativeLifecycleByInnerIndex.get(innerIndex) !== \"started\") return false;\n\t\tconst outerIndex = this.rangesByInnerIndex.get(innerIndex)?.start;\n\t\tconst block = source.content[innerIndex];\n\t\tif (outerIndex == null || block?.type !== \"toolCall\") return false;\n\t\tthis.message.content[outerIndex] = cloneContentBlock(block);\n\t\tthis.stream.push({ type: \"toolcall_delta\", contentIndex: outerIndex, delta, partial: this.message });\n\t\treturn true;\n\t}\n\n\tprojectNativeEnd(innerIndex: number, toolCall: ToolCall): boolean {\n\t\tif (this.nativeLifecycleByInnerIndex.get(innerIndex) !== \"started\") return false;\n\t\tconst outerIndex = this.rangesByInnerIndex.get(innerIndex)?.start;\n\t\tif (outerIndex == null) return false;\n\t\tconst finalToolCall = cloneToolCall(toolCall);\n\t\tthis.message.content[outerIndex] = finalToolCall;\n\t\tthis.nativeLifecycleByInnerIndex.set(innerIndex, \"ended\");\n\t\tthis.stream.push({\n\t\t\ttype: \"toolcall_end\",\n\t\t\tcontentIndex: outerIndex,\n\t\t\ttoolCall: finalToolCall,\n\t\t\tpartial: this.message,\n\t\t});\n\t\treturn true;\n\t}\n\n\tassignRecoveredIds(events: readonly StreamParserEvent[]): StreamParserEvent[] {\n\t\treturn events.map((event) => {\n\t\t\tif (event.type === \"toolcall_start\") {\n\t\t\t\tconst id = this.allocateRecoveredId();\n\t\t\t\tthis.recoveredIdByParserIndex.set(event.index, id);\n\t\t\t\treturn { ...event, id };\n\t\t\t}\n\t\t\tif (event.type === \"toolcall_end\") {\n\t\t\t\tconst id = this.recoveredIdByParserIndex.get(event.index) ?? event.id;\n\t\t\t\tthis.recoveredIdByParserIndex.delete(event.index);\n\t\t\t\treturn { ...event, id };\n\t\t\t}\n\t\t\treturn event;\n\t\t});\n\t}\n\n\tprivate appendUnannounced(source: AssistantMessage, innerIndex: number): boolean {\n\t\tconst block = source.content[innerIndex];\n\t\tif (!block || innerIndex <= this.highestProjectedInnerIndex) return false;\n\t\tif (block.type === \"toolCall\" && this.recoveredIds.has(block.id)) return false;\n\t\tconst outerIndex = this.message.content.length;\n\t\tthis.message.content.push(cloneContentBlock(block));\n\t\treturn this.recordRange(innerIndex, { start: outerIndex, end: outerIndex + 1 });\n\t}\n\n\tprivate recordRange(innerIndex: number, range: ContentRange): boolean {\n\t\tif (this.rangesByInnerIndex.has(innerIndex) || innerIndex <= this.highestProjectedInnerIndex) return false;\n\t\tthis.rangesByInnerIndex.set(innerIndex, range);\n\t\tthis.highestProjectedInnerIndex = innerIndex;\n\t\treturn true;\n\t}\n\n\tprivate allocateRecoveredId(): string {\n\t\tfor (;;) {\n\t\t\tconst id = `recovered-antml-${this.nextRecoveredId}`;\n\t\t\tthis.nextRecoveredId += 1;\n\t\t\tif (this.reservedIds.has(id)) continue;\n\t\t\tthis.reservedIds.add(id);\n\t\t\tthis.recoveredIds.add(id);\n\t\t\treturn id;\n\t\t}\n\t}\n}\n"]}
|
package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-stream-failure.d.ts
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { AssistantMessage, AssistantMessageEventStream } from "../types.ts";
|
|
2
|
+
import type { StreamMessageProjection } from "./stream-wrapper-shared.ts";
|
|
3
|
+
export type RecoveryStreamFailure = "collision" | "invalid_content_event_order" | "invalid_native_event_order";
|
|
4
|
+
export declare function terminateRecoveryStreamForFailure(stream: AssistantMessageEventStream, projection: StreamMessageProjection, source: AssistantMessage, failure: RecoveryStreamFailure): void;
|
|
5
|
+
//# sourceMappingURL=recovery-stream-failure.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recovery-stream-failure.d.ts","sourceRoot":"","sources":["../../src/tool-call-middleware/recovery-stream-failure.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,2BAA2B,EAAE,MAAM,aAAa,CAAC;AACjF,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AAE1E,MAAM,MAAM,qBAAqB,GAAG,WAAW,GAAG,6BAA6B,GAAG,4BAA4B,CAAC;AAqB/G,wBAAgB,iCAAiC,CAChD,MAAM,EAAE,2BAA2B,EACnC,UAAU,EAAE,uBAAuB,EACnC,MAAM,EAAE,gBAAgB,EACxB,OAAO,EAAE,qBAAqB,GAC5B,IAAI,CAiBN"}
|
package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-stream-failure.js
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
const failureDetails = {
|
|
2
|
+
collision: {
|
|
3
|
+
diagnosticType: "text_tool_call_recovery_collision",
|
|
4
|
+
errorMessage: "Tool call ID collision in provider stream",
|
|
5
|
+
status: "collision",
|
|
6
|
+
},
|
|
7
|
+
invalid_content_event_order: {
|
|
8
|
+
diagnosticType: "text_tool_call_recovery_invalid_content_event",
|
|
9
|
+
errorMessage: "Invalid assistant content event order",
|
|
10
|
+
status: "invalid_content_event_order",
|
|
11
|
+
},
|
|
12
|
+
invalid_native_event_order: {
|
|
13
|
+
diagnosticType: "text_tool_call_recovery_invalid_native_event",
|
|
14
|
+
errorMessage: "Invalid native tool call event order",
|
|
15
|
+
status: "invalid_native_event_order",
|
|
16
|
+
},
|
|
17
|
+
};
|
|
18
|
+
export function terminateRecoveryStreamForFailure(stream, projection, source, failure) {
|
|
19
|
+
const details = failureDetails[failure];
|
|
20
|
+
projection.sync(source);
|
|
21
|
+
const message = projection.finalize(source, false);
|
|
22
|
+
message.content = message.content.filter((block) => block.type !== "toolCall");
|
|
23
|
+
message.stopReason = "error";
|
|
24
|
+
message.errorMessage = details.errorMessage;
|
|
25
|
+
message.diagnostics = [
|
|
26
|
+
...(source.diagnostics ?? []),
|
|
27
|
+
{
|
|
28
|
+
type: details.diagnosticType,
|
|
29
|
+
timestamp: Date.now(),
|
|
30
|
+
details: { protocol: "antml", status: details.status },
|
|
31
|
+
},
|
|
32
|
+
];
|
|
33
|
+
stream.push({ type: "error", reason: "error", error: message });
|
|
34
|
+
stream.end(message);
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=recovery-stream-failure.js.map
|
package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-stream-failure.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recovery-stream-failure.js","sourceRoot":"","sources":["../../src/tool-call-middleware/recovery-stream-failure.ts"],"names":[],"mappings":"AAKA,MAAM,cAAc,GACnB;IACC,SAAS,EAAE;QACV,cAAc,EAAE,mCAAmC;QACnD,YAAY,EAAE,2CAA2C;QACzD,MAAM,EAAE,WAAW;KACnB;IACD,2BAA2B,EAAE;QAC5B,cAAc,EAAE,+CAA+C;QAC/D,YAAY,EAAE,uCAAuC;QACrD,MAAM,EAAE,6BAA6B;KACrC;IACD,0BAA0B,EAAE;QAC3B,cAAc,EAAE,8CAA8C;QAC9D,YAAY,EAAE,sCAAsC;QACpD,MAAM,EAAE,4BAA4B;KACpC;CACD,CAAC;AAEH,MAAM,UAAU,iCAAiC,CAChD,MAAmC,EACnC,UAAmC,EACnC,MAAwB,EACxB,OAA8B;IAE9B,MAAM,OAAO,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;IACxC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACxB,MAAM,OAAO,GAAG,UAAU,CAAC,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IACnD,OAAO,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC;IAC/E,OAAO,CAAC,UAAU,GAAG,OAAO,CAAC;IAC7B,OAAO,CAAC,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;IAC5C,OAAO,CAAC,WAAW,GAAG;QACrB,GAAG,CAAC,MAAM,CAAC,WAAW,IAAI,EAAE,CAAC;QAC7B;YACC,IAAI,EAAE,OAAO,CAAC,cAAc;YAC5B,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;YACrB,OAAO,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE;SACtD;KACD,CAAC;IACF,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;IAChE,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AACrB,CAAC","sourcesContent":["import type { AssistantMessage, AssistantMessageEventStream } from \"../types.ts\";\nimport type { StreamMessageProjection } from \"./stream-wrapper-shared.ts\";\n\nexport type RecoveryStreamFailure = \"collision\" | \"invalid_content_event_order\" | \"invalid_native_event_order\";\n\nconst failureDetails: Record<RecoveryStreamFailure, { diagnosticType: string; errorMessage: string; status: string }> =\n\t{\n\t\tcollision: {\n\t\t\tdiagnosticType: \"text_tool_call_recovery_collision\",\n\t\t\terrorMessage: \"Tool call ID collision in provider stream\",\n\t\t\tstatus: \"collision\",\n\t\t},\n\t\tinvalid_content_event_order: {\n\t\t\tdiagnosticType: \"text_tool_call_recovery_invalid_content_event\",\n\t\t\terrorMessage: \"Invalid assistant content event order\",\n\t\t\tstatus: \"invalid_content_event_order\",\n\t\t},\n\t\tinvalid_native_event_order: {\n\t\t\tdiagnosticType: \"text_tool_call_recovery_invalid_native_event\",\n\t\t\terrorMessage: \"Invalid native tool call event order\",\n\t\t\tstatus: \"invalid_native_event_order\",\n\t\t},\n\t};\n\nexport function terminateRecoveryStreamForFailure(\n\tstream: AssistantMessageEventStream,\n\tprojection: StreamMessageProjection,\n\tsource: AssistantMessage,\n\tfailure: RecoveryStreamFailure,\n): void {\n\tconst details = failureDetails[failure];\n\tprojection.sync(source);\n\tconst message = projection.finalize(source, false);\n\tmessage.content = message.content.filter((block) => block.type !== \"toolCall\");\n\tmessage.stopReason = \"error\";\n\tmessage.errorMessage = details.errorMessage;\n\tmessage.diagnostics = [\n\t\t...(source.diagnostics ?? []),\n\t\t{\n\t\t\ttype: details.diagnosticType,\n\t\t\ttimestamp: Date.now(),\n\t\t\tdetails: { protocol: \"antml\", status: details.status },\n\t\t},\n\t];\n\tstream.push({ type: \"error\", reason: \"error\", error: message });\n\tstream.end(message);\n}\n"]}
|
package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-stream-terminal.d.ts
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { AssistantMessage, AssistantMessageEventStream, StopReason } from "../types.ts";
|
|
2
|
+
import type { StreamMessageProjection } from "./stream-wrapper-shared.ts";
|
|
3
|
+
/** Emits one terminal event after recovery projection state has been flushed. */
|
|
4
|
+
export declare class RecoveryStreamTerminal {
|
|
5
|
+
private emitted;
|
|
6
|
+
private readonly stream;
|
|
7
|
+
constructor(stream: AssistantMessageEventStream);
|
|
8
|
+
done(projection: StreamMessageProjection, source: AssistantMessage, sawToolCall: boolean, reason: Extract<StopReason, "stop" | "length" | "toolUse">): void;
|
|
9
|
+
sourceError(projection: StreamMessageProjection, source: AssistantMessage, sawToolCall: boolean, reason: Extract<StopReason, "aborted" | "error">): void;
|
|
10
|
+
iteratorFailure(projection: StreamMessageProjection | null, error: unknown): void;
|
|
11
|
+
exhausted(projection: StreamMessageProjection | null): void;
|
|
12
|
+
cancelled(projection: StreamMessageProjection | null): void;
|
|
13
|
+
private emit;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=recovery-stream-terminal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recovery-stream-terminal.d.ts","sourceRoot":"","sources":["../../src/tool-call-middleware/recovery-stream-terminal.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,2BAA2B,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC7F,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AAM1E,iFAAiF;AACjF,qBAAa,sBAAsB;IAClC,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA8B;IAErD,YAAY,MAAM,EAAE,2BAA2B,EAE9C;IAED,IAAI,CACH,UAAU,EAAE,uBAAuB,EACnC,MAAM,EAAE,gBAAgB,EACxB,WAAW,EAAE,OAAO,EACpB,MAAM,EAAE,OAAO,CAAC,UAAU,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS,CAAC,GACxD,IAAI,CAON;IAED,WAAW,CACV,UAAU,EAAE,uBAAuB,EACnC,MAAM,EAAE,gBAAgB,EACxB,WAAW,EAAE,OAAO,EACpB,MAAM,EAAE,OAAO,CAAC,UAAU,EAAE,SAAS,GAAG,OAAO,CAAC,GAC9C,IAAI,CAkBN;IAED,eAAe,CAAC,UAAU,EAAE,uBAAuB,GAAG,IAAI,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAYhF;IAED,SAAS,CAAC,UAAU,EAAE,uBAAuB,GAAG,IAAI,GAAG,IAAI,CAW1D;IAED,SAAS,CAAC,UAAU,EAAE,uBAAuB,GAAG,IAAI,GAAG,IAAI,CAY1D;IAED,OAAO,CAAC,IAAI;CAMZ"}
|
package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-stream-terminal.js
ADDED
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
function errorText(error) {
|
|
2
|
+
return error instanceof Error ? error.message : String(error);
|
|
3
|
+
}
|
|
4
|
+
/** Emits one terminal event after recovery projection state has been flushed. */
|
|
5
|
+
export class RecoveryStreamTerminal {
|
|
6
|
+
constructor(stream) {
|
|
7
|
+
this.emitted = false;
|
|
8
|
+
this.stream = stream;
|
|
9
|
+
}
|
|
10
|
+
done(projection, source, sawToolCall, reason) {
|
|
11
|
+
if (this.emitted)
|
|
12
|
+
return;
|
|
13
|
+
projection.finalizeDanglingToolCalls();
|
|
14
|
+
const message = projection.finalize(source, sawToolCall);
|
|
15
|
+
const recovered = sawToolCall || message.content.some((block) => block.type === "toolCall");
|
|
16
|
+
const finalReason = recovered && (reason === "stop" || reason === "length") ? "toolUse" : reason;
|
|
17
|
+
this.emit({ type: "done", reason: finalReason, message });
|
|
18
|
+
}
|
|
19
|
+
sourceError(projection, source, sawToolCall, reason) {
|
|
20
|
+
if (this.emitted)
|
|
21
|
+
return;
|
|
22
|
+
projection.finalizeDanglingToolCalls();
|
|
23
|
+
const message = projection.finalize(source, sawToolCall);
|
|
24
|
+
if (reason === "aborted") {
|
|
25
|
+
message.content = message.content.filter((block) => block.type !== "toolCall");
|
|
26
|
+
message.stopReason = "aborted";
|
|
27
|
+
message.errorMessage ??= "Request was aborted";
|
|
28
|
+
this.emit({ type: "error", reason: "aborted", error: message });
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
if (projection.hasFinalizedToolCallContent()) {
|
|
32
|
+
message.stopReason = "toolUse";
|
|
33
|
+
this.emit({ type: "done", reason: "toolUse", message });
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
message.stopReason = "error";
|
|
37
|
+
this.emit({ type: "error", reason: "error", error: message });
|
|
38
|
+
}
|
|
39
|
+
iteratorFailure(projection, error) {
|
|
40
|
+
if (this.emitted)
|
|
41
|
+
return;
|
|
42
|
+
if (!projection) {
|
|
43
|
+
this.emitted = true;
|
|
44
|
+
this.stream.fail(error);
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
projection.finalizeDanglingToolCalls();
|
|
48
|
+
const message = projection.finalize(projection.message, false);
|
|
49
|
+
message.stopReason = "error";
|
|
50
|
+
message.errorMessage = errorText(error) || "Assistant message stream failed";
|
|
51
|
+
this.emit({ type: "error", reason: "error", error: message });
|
|
52
|
+
}
|
|
53
|
+
exhausted(projection) {
|
|
54
|
+
if (this.emitted)
|
|
55
|
+
return;
|
|
56
|
+
if (!projection) {
|
|
57
|
+
this.iteratorFailure(null, new Error("Assistant message stream ended without a terminal event"));
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
projection.finalizeDanglingToolCalls();
|
|
61
|
+
const message = projection.finalize(projection.message, false);
|
|
62
|
+
message.stopReason = "error";
|
|
63
|
+
message.errorMessage = "Assistant message stream ended without a terminal event";
|
|
64
|
+
this.emit({ type: "error", reason: "error", error: message });
|
|
65
|
+
}
|
|
66
|
+
cancelled(projection) {
|
|
67
|
+
if (this.emitted)
|
|
68
|
+
return;
|
|
69
|
+
if (!projection) {
|
|
70
|
+
this.iteratorFailure(null, new Error("Assistant message stream consumption was cancelled"));
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
projection.finalizeDanglingToolCalls();
|
|
74
|
+
const message = projection.finalize(projection.message, false);
|
|
75
|
+
message.content = message.content.filter((block) => block.type !== "toolCall");
|
|
76
|
+
message.stopReason = "error";
|
|
77
|
+
message.errorMessage = "Assistant message stream consumption was cancelled";
|
|
78
|
+
this.emit({ type: "error", reason: "error", error: message });
|
|
79
|
+
}
|
|
80
|
+
emit(event) {
|
|
81
|
+
if (this.emitted)
|
|
82
|
+
return;
|
|
83
|
+
this.emitted = true;
|
|
84
|
+
this.stream.push(event);
|
|
85
|
+
this.stream.end();
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=recovery-stream-terminal.js.map
|
package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-stream-terminal.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recovery-stream-terminal.js","sourceRoot":"","sources":["../../src/tool-call-middleware/recovery-stream-terminal.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AssistantMessage, AssistantMessageEventStream, StopReason } from \"../types.ts\";\nimport type { StreamMessageProjection } from \"./stream-wrapper-shared.ts\";\n\nfunction errorText(error: unknown): string {\n\treturn error instanceof Error ? error.message : String(error);\n}\n\n/** Emits one terminal event after recovery projection state has been flushed. */\nexport class RecoveryStreamTerminal {\n\tprivate emitted = false;\n\tprivate readonly stream: AssistantMessageEventStream;\n\n\tconstructor(stream: AssistantMessageEventStream) {\n\t\tthis.stream = stream;\n\t}\n\n\tdone(\n\t\tprojection: StreamMessageProjection,\n\t\tsource: AssistantMessage,\n\t\tsawToolCall: boolean,\n\t\treason: Extract<StopReason, \"stop\" | \"length\" | \"toolUse\">,\n\t): void {\n\t\tif (this.emitted) return;\n\t\tprojection.finalizeDanglingToolCalls();\n\t\tconst message = projection.finalize(source, sawToolCall);\n\t\tconst recovered = sawToolCall || message.content.some((block) => block.type === \"toolCall\");\n\t\tconst finalReason = recovered && (reason === \"stop\" || reason === \"length\") ? \"toolUse\" : reason;\n\t\tthis.emit({ type: \"done\", reason: finalReason, message });\n\t}\n\n\tsourceError(\n\t\tprojection: StreamMessageProjection,\n\t\tsource: AssistantMessage,\n\t\tsawToolCall: boolean,\n\t\treason: Extract<StopReason, \"aborted\" | \"error\">,\n\t): void {\n\t\tif (this.emitted) return;\n\t\tprojection.finalizeDanglingToolCalls();\n\t\tconst message = projection.finalize(source, sawToolCall);\n\t\tif (reason === \"aborted\") {\n\t\t\tmessage.content = message.content.filter((block) => block.type !== \"toolCall\");\n\t\t\tmessage.stopReason = \"aborted\";\n\t\t\tmessage.errorMessage ??= \"Request was aborted\";\n\t\t\tthis.emit({ type: \"error\", reason: \"aborted\", error: message });\n\t\t\treturn;\n\t\t}\n\t\tif (projection.hasFinalizedToolCallContent()) {\n\t\t\tmessage.stopReason = \"toolUse\";\n\t\t\tthis.emit({ type: \"done\", reason: \"toolUse\", message });\n\t\t\treturn;\n\t\t}\n\t\tmessage.stopReason = \"error\";\n\t\tthis.emit({ type: \"error\", reason: \"error\", error: message });\n\t}\n\n\titeratorFailure(projection: StreamMessageProjection | null, error: unknown): void {\n\t\tif (this.emitted) return;\n\t\tif (!projection) {\n\t\t\tthis.emitted = true;\n\t\t\tthis.stream.fail(error);\n\t\t\treturn;\n\t\t}\n\t\tprojection.finalizeDanglingToolCalls();\n\t\tconst message = projection.finalize(projection.message, false);\n\t\tmessage.stopReason = \"error\";\n\t\tmessage.errorMessage = errorText(error) || \"Assistant message stream failed\";\n\t\tthis.emit({ type: \"error\", reason: \"error\", error: message });\n\t}\n\n\texhausted(projection: StreamMessageProjection | null): void {\n\t\tif (this.emitted) return;\n\t\tif (!projection) {\n\t\t\tthis.iteratorFailure(null, new Error(\"Assistant message stream ended without a terminal event\"));\n\t\t\treturn;\n\t\t}\n\t\tprojection.finalizeDanglingToolCalls();\n\t\tconst message = projection.finalize(projection.message, false);\n\t\tmessage.stopReason = \"error\";\n\t\tmessage.errorMessage = \"Assistant message stream ended without a terminal event\";\n\t\tthis.emit({ type: \"error\", reason: \"error\", error: message });\n\t}\n\n\tcancelled(projection: StreamMessageProjection | null): void {\n\t\tif (this.emitted) return;\n\t\tif (!projection) {\n\t\t\tthis.iteratorFailure(null, new Error(\"Assistant message stream consumption was cancelled\"));\n\t\t\treturn;\n\t\t}\n\t\tprojection.finalizeDanglingToolCalls();\n\t\tconst message = projection.finalize(projection.message, false);\n\t\tmessage.content = message.content.filter((block) => block.type !== \"toolCall\");\n\t\tmessage.stopReason = \"error\";\n\t\tmessage.errorMessage = \"Assistant message stream consumption was cancelled\";\n\t\tthis.emit({ type: \"error\", reason: \"error\", error: message });\n\t}\n\n\tprivate emit(event: Extract<Parameters<AssistantMessageEventStream[\"push\"]>[0], { type: \"done\" | \"error\" }>): void {\n\t\tif (this.emitted) return;\n\t\tthis.emitted = true;\n\t\tthis.stream.push(event);\n\t\tthis.stream.end();\n\t}\n}\n"]}
|
package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-stream-wrapper.d.ts
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { AssistantMessageEventStream, Tool } from "../types.ts";
|
|
2
|
+
export declare function wrapStreamWithInvokeRecovery(innerStream: AssistantMessageEventStream, tools: readonly Tool[]): AssistantMessageEventStream;
|
|
3
|
+
//# sourceMappingURL=recovery-stream-wrapper.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recovery-stream-wrapper.d.ts","sourceRoot":"","sources":["../../src/tool-call-middleware/recovery-stream-wrapper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAA2C,2BAA2B,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAS9G,wBAAgB,4BAA4B,CAC3C,WAAW,EAAE,2BAA2B,EACxC,KAAK,EAAE,SAAS,IAAI,EAAE,GACpB,2BAA2B,CAwN7B"}
|
package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-stream-wrapper.js
ADDED
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
import { RecoveryContentLifecycle } from "./recovery-content-lifecycle.js";
|
|
2
|
+
import { RecoveryAssistantMessageEventStream } from "./recovery-event-stream.js";
|
|
3
|
+
import { RecoveryNativeProjection } from "./recovery-native-projection.js";
|
|
4
|
+
import { terminateRecoveryStreamForFailure } from "./recovery-stream-failure.js";
|
|
5
|
+
import { RecoveryStreamTerminal } from "./recovery-stream-terminal.js";
|
|
6
|
+
import { RecoveryTextProjection } from "./recovery-text-projection.js";
|
|
7
|
+
import { StreamMessageProjection } from "./stream-wrapper-shared.js";
|
|
8
|
+
export function wrapStreamWithInvokeRecovery(innerStream, tools) {
|
|
9
|
+
const outerStream = new RecoveryAssistantMessageEventStream();
|
|
10
|
+
void (async () => {
|
|
11
|
+
const innerIterator = innerStream[Symbol.asyncIterator]();
|
|
12
|
+
const innerEvents = { [Symbol.asyncIterator]: () => innerIterator };
|
|
13
|
+
let projection = null;
|
|
14
|
+
let nativeProjection = null;
|
|
15
|
+
let textProjection = null;
|
|
16
|
+
let sawToolCall = false;
|
|
17
|
+
let cancellationRequested = false;
|
|
18
|
+
const contentLifecycle = new RecoveryContentLifecycle();
|
|
19
|
+
const terminal = new RecoveryStreamTerminal(outerStream);
|
|
20
|
+
const finishText = () => {
|
|
21
|
+
if (!textProjection)
|
|
22
|
+
return;
|
|
23
|
+
sawToolCall = textProjection.finish() || sawToolCall;
|
|
24
|
+
textProjection = null;
|
|
25
|
+
};
|
|
26
|
+
outerStream.setCancellationHandler(async () => {
|
|
27
|
+
cancellationRequested = true;
|
|
28
|
+
try {
|
|
29
|
+
await innerIterator.return?.();
|
|
30
|
+
finishText();
|
|
31
|
+
terminal.cancelled(projection);
|
|
32
|
+
}
|
|
33
|
+
catch (error) {
|
|
34
|
+
finishText();
|
|
35
|
+
terminal.iteratorFailure(projection, error);
|
|
36
|
+
throw error;
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
const terminateForFailure = (source, failure) => {
|
|
40
|
+
if (!projection || !outerStream.markSourceClosed())
|
|
41
|
+
return;
|
|
42
|
+
finishText();
|
|
43
|
+
terminateRecoveryStreamForFailure(outerStream, projection, source, failure);
|
|
44
|
+
};
|
|
45
|
+
const prepareContentEvent = (source, contentIndex) => {
|
|
46
|
+
if (!projection || !nativeProjection)
|
|
47
|
+
return false;
|
|
48
|
+
if (!Number.isSafeInteger(contentIndex) || contentIndex < 0 || contentIndex >= source.content.length) {
|
|
49
|
+
terminateForFailure(source, "invalid_native_event_order");
|
|
50
|
+
return false;
|
|
51
|
+
}
|
|
52
|
+
projection.sync(source);
|
|
53
|
+
nativeProjection.reserveVisibleIds(source);
|
|
54
|
+
if (nativeProjection.synchronizeLower(source, contentIndex))
|
|
55
|
+
return true;
|
|
56
|
+
terminateForFailure(source, "collision");
|
|
57
|
+
return false;
|
|
58
|
+
};
|
|
59
|
+
const canStart = (source, contentIndex, kind, failure = "invalid_content_event_order") => {
|
|
60
|
+
if (!Number.isSafeInteger(contentIndex) || contentIndex < 0 || contentIndex >= source.content.length) {
|
|
61
|
+
terminateForFailure(source, failure);
|
|
62
|
+
return false;
|
|
63
|
+
}
|
|
64
|
+
const block = source.content[contentIndex];
|
|
65
|
+
const blockMatches = (kind === "text" && block?.type === "text") ||
|
|
66
|
+
(kind === "thinking" && block?.type === "thinking") ||
|
|
67
|
+
(kind === "toolCall" && block?.type === "toolCall");
|
|
68
|
+
if (blockMatches && contentLifecycle.canStart(contentIndex))
|
|
69
|
+
return true;
|
|
70
|
+
terminateForFailure(source, failure);
|
|
71
|
+
return false;
|
|
72
|
+
};
|
|
73
|
+
const isActive = (source, contentIndex, kind, failure = "invalid_content_event_order") => {
|
|
74
|
+
if (contentLifecycle.isActive(contentIndex, kind))
|
|
75
|
+
return true;
|
|
76
|
+
terminateForFailure(source, failure);
|
|
77
|
+
return false;
|
|
78
|
+
};
|
|
79
|
+
const synchronizeTerminal = (source) => {
|
|
80
|
+
projection ??= new StreamMessageProjection(outerStream, source, { preserveSourceMetadata: true });
|
|
81
|
+
nativeProjection ??= new RecoveryNativeProjection(outerStream, projection.message);
|
|
82
|
+
projection.sync(source);
|
|
83
|
+
nativeProjection.reserveVisibleIds(source);
|
|
84
|
+
finishText();
|
|
85
|
+
if (nativeProjection.synchronizeRemaining(source))
|
|
86
|
+
return true;
|
|
87
|
+
terminateForFailure(source, "collision");
|
|
88
|
+
return false;
|
|
89
|
+
};
|
|
90
|
+
try {
|
|
91
|
+
for await (const event of innerEvents) {
|
|
92
|
+
if (cancellationRequested)
|
|
93
|
+
continue;
|
|
94
|
+
switch (event.type) {
|
|
95
|
+
case "start":
|
|
96
|
+
projection = new StreamMessageProjection(outerStream, event.partial, {
|
|
97
|
+
preserveSourceMetadata: true,
|
|
98
|
+
});
|
|
99
|
+
nativeProjection = new RecoveryNativeProjection(outerStream, projection.message);
|
|
100
|
+
nativeProjection.reserveVisibleIds(event.partial);
|
|
101
|
+
outerStream.push({ type: "start", partial: projection.message });
|
|
102
|
+
break;
|
|
103
|
+
case "text_start": {
|
|
104
|
+
if (!canStart(event.partial, event.contentIndex, "text"))
|
|
105
|
+
return;
|
|
106
|
+
if (!prepareContentEvent(event.partial, event.contentIndex) || !projection || !nativeProjection)
|
|
107
|
+
return;
|
|
108
|
+
const nextText = new RecoveryTextProjection(tools, projection, nativeProjection, event.contentIndex);
|
|
109
|
+
if (!nextText.start(event.partial)) {
|
|
110
|
+
terminateForFailure(event.partial, "invalid_native_event_order");
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
textProjection = nextText;
|
|
114
|
+
contentLifecycle.start(event.contentIndex, "text");
|
|
115
|
+
break;
|
|
116
|
+
}
|
|
117
|
+
case "text_delta":
|
|
118
|
+
if (!isActive(event.partial, event.contentIndex, "text"))
|
|
119
|
+
return;
|
|
120
|
+
if (!prepareContentEvent(event.partial, event.contentIndex) || !textProjection)
|
|
121
|
+
return;
|
|
122
|
+
sawToolCall = textProjection.feed(event.delta) || sawToolCall;
|
|
123
|
+
break;
|
|
124
|
+
case "text_end":
|
|
125
|
+
if (!isActive(event.partial, event.contentIndex, "text"))
|
|
126
|
+
return;
|
|
127
|
+
if (!prepareContentEvent(event.partial, event.contentIndex))
|
|
128
|
+
return;
|
|
129
|
+
finishText();
|
|
130
|
+
contentLifecycle.end(event.contentIndex, "text");
|
|
131
|
+
break;
|
|
132
|
+
case "done":
|
|
133
|
+
if (!synchronizeTerminal(event.message) || !projection)
|
|
134
|
+
return;
|
|
135
|
+
if (!outerStream.markSourceClosed())
|
|
136
|
+
return;
|
|
137
|
+
terminal.done(projection, event.message, sawToolCall, event.reason);
|
|
138
|
+
return;
|
|
139
|
+
case "error":
|
|
140
|
+
if (!projection) {
|
|
141
|
+
if (!outerStream.markSourceClosed())
|
|
142
|
+
return;
|
|
143
|
+
outerStream.push(event);
|
|
144
|
+
outerStream.end();
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
if (!synchronizeTerminal(event.error))
|
|
148
|
+
return;
|
|
149
|
+
if (!outerStream.markSourceClosed())
|
|
150
|
+
return;
|
|
151
|
+
terminal.sourceError(projection, event.error, sawToolCall, event.reason);
|
|
152
|
+
return;
|
|
153
|
+
case "toolcall_start": {
|
|
154
|
+
if (!canStart(event.partial, event.contentIndex, "toolCall", "invalid_native_event_order"))
|
|
155
|
+
return;
|
|
156
|
+
if (!prepareContentEvent(event.partial, event.contentIndex) || !nativeProjection)
|
|
157
|
+
return;
|
|
158
|
+
const status = nativeProjection.projectNativeStart(event.partial, event.contentIndex);
|
|
159
|
+
if (status !== "projected") {
|
|
160
|
+
terminateForFailure(event.partial, status === "collision" ? "collision" : "invalid_native_event_order");
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
contentLifecycle.start(event.contentIndex, "toolCall");
|
|
164
|
+
sawToolCall = true;
|
|
165
|
+
break;
|
|
166
|
+
}
|
|
167
|
+
case "toolcall_delta":
|
|
168
|
+
if (!isActive(event.partial, event.contentIndex, "toolCall", "invalid_native_event_order"))
|
|
169
|
+
return;
|
|
170
|
+
if (!prepareContentEvent(event.partial, event.contentIndex) || !nativeProjection)
|
|
171
|
+
return;
|
|
172
|
+
if (!nativeProjection.projectNativeDelta(event.partial, event.contentIndex, event.delta)) {
|
|
173
|
+
terminateForFailure(event.partial, "invalid_native_event_order");
|
|
174
|
+
return;
|
|
175
|
+
}
|
|
176
|
+
break;
|
|
177
|
+
case "toolcall_end":
|
|
178
|
+
if (!isActive(event.partial, event.contentIndex, "toolCall", "invalid_native_event_order"))
|
|
179
|
+
return;
|
|
180
|
+
if (!prepareContentEvent(event.partial, event.contentIndex) || !nativeProjection)
|
|
181
|
+
return;
|
|
182
|
+
if (!nativeProjection.projectNativeEnd(event.contentIndex, event.toolCall)) {
|
|
183
|
+
terminateForFailure(event.partial, "invalid_native_event_order");
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
186
|
+
contentLifecycle.end(event.contentIndex, "toolCall");
|
|
187
|
+
sawToolCall = true;
|
|
188
|
+
break;
|
|
189
|
+
case "thinking_start": {
|
|
190
|
+
if (!canStart(event.partial, event.contentIndex, "thinking"))
|
|
191
|
+
return;
|
|
192
|
+
if (!prepareContentEvent(event.partial, event.contentIndex) || !projection || !nativeProjection)
|
|
193
|
+
return;
|
|
194
|
+
const outerIndex = projection.startThinking(event.contentIndex, event.partial);
|
|
195
|
+
if (!nativeProjection.recordProjectedBlock(event.contentIndex, outerIndex)) {
|
|
196
|
+
terminateForFailure(event.partial, "invalid_native_event_order");
|
|
197
|
+
return;
|
|
198
|
+
}
|
|
199
|
+
contentLifecycle.start(event.contentIndex, "thinking");
|
|
200
|
+
break;
|
|
201
|
+
}
|
|
202
|
+
case "thinking_delta":
|
|
203
|
+
if (!isActive(event.partial, event.contentIndex, "thinking"))
|
|
204
|
+
return;
|
|
205
|
+
if (!prepareContentEvent(event.partial, event.contentIndex) || !projection)
|
|
206
|
+
return;
|
|
207
|
+
projection.projectThinkingDelta(event.contentIndex, event.delta, event.partial);
|
|
208
|
+
break;
|
|
209
|
+
case "thinking_end":
|
|
210
|
+
if (!isActive(event.partial, event.contentIndex, "thinking"))
|
|
211
|
+
return;
|
|
212
|
+
if (!prepareContentEvent(event.partial, event.contentIndex) || !projection)
|
|
213
|
+
return;
|
|
214
|
+
projection.finishThinking(event.contentIndex, event.content, event.partial);
|
|
215
|
+
contentLifecycle.end(event.contentIndex, "thinking");
|
|
216
|
+
break;
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
if (cancellationRequested || !outerStream.markSourceClosed())
|
|
220
|
+
return;
|
|
221
|
+
finishText();
|
|
222
|
+
terminal.exhausted(projection);
|
|
223
|
+
}
|
|
224
|
+
catch (error) {
|
|
225
|
+
if (cancellationRequested || !outerStream.markSourceClosed())
|
|
226
|
+
return;
|
|
227
|
+
finishText();
|
|
228
|
+
terminal.iteratorFailure(projection, error);
|
|
229
|
+
}
|
|
230
|
+
})();
|
|
231
|
+
return outerStream;
|
|
232
|
+
}
|
|
233
|
+
//# sourceMappingURL=recovery-stream-wrapper.js.map
|