@code-yeongyu/senpi 2026.9.15 → 2026.9.16-2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +73 -0
- package/README.md +1 -1
- package/dist/core/agent-session.d.ts +28 -0
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +111 -13
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/compaction/compaction.d.ts.map +1 -1
- package/dist/core/compaction/compaction.js +4 -2
- package/dist/core/compaction/compaction.js.map +1 -1
- package/dist/core/compaction/stream-watchdog.d.ts +56 -2
- package/dist/core/compaction/stream-watchdog.d.ts.map +1 -1
- package/dist/core/compaction/stream-watchdog.js +93 -15
- package/dist/core/compaction/stream-watchdog.js.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-binding.d.ts +6 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-binding.d.ts.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-binding.js +17 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-binding.js.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-continuity.d.ts +4 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-continuity.d.ts.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-continuity.js +31 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-continuity.js.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-reattach.d.ts +2 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-reattach.d.ts.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-reattach.js +16 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-reattach.js.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry-wiring.d.ts.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry-wiring.js +19 -8
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry-wiring.js.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-stream.d.ts.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-stream.js +2 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-stream.js.map +1 -1
- package/dist/core/extensions/builtin/compaction/deterministic-fallback.d.ts +13 -1
- package/dist/core/extensions/builtin/compaction/deterministic-fallback.d.ts.map +1 -1
- package/dist/core/extensions/builtin/compaction/deterministic-fallback.js +66 -2
- package/dist/core/extensions/builtin/compaction/deterministic-fallback.js.map +1 -1
- package/dist/core/extensions/builtin/compaction/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/compaction/index.js +16 -10
- package/dist/core/extensions/builtin/compaction/index.js.map +1 -1
- package/dist/core/extensions/builtin/compaction/speculative-summary.d.ts.map +1 -1
- package/dist/core/extensions/builtin/compaction/speculative-summary.js +4 -2
- package/dist/core/extensions/builtin/compaction/speculative-summary.js.map +1 -1
- package/dist/core/extensions/builtin/compaction/speculative.d.ts +8 -1
- package/dist/core/extensions/builtin/compaction/speculative.d.ts.map +1 -1
- package/dist/core/extensions/builtin/compaction/speculative.js +31 -7
- package/dist/core/extensions/builtin/compaction/speculative.js.map +1 -1
- package/dist/core/extensions/builtin/compaction/transient-failure.d.ts.map +1 -1
- package/dist/core/extensions/builtin/compaction/transient-failure.js +6 -3
- package/dist/core/extensions/builtin/compaction/transient-failure.js.map +1 -1
- package/dist/core/extensions/builtin/config-reload/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/config-reload/index.js +25 -8
- package/dist/core/extensions/builtin/config-reload/index.js.map +1 -1
- package/dist/core/extensions/builtin/config-reload/watch-engine.d.ts +4 -5
- package/dist/core/extensions/builtin/config-reload/watch-engine.d.ts.map +1 -1
- package/dist/core/extensions/builtin/config-reload/watch-engine.js +14 -18
- package/dist/core/extensions/builtin/config-reload/watch-engine.js.map +1 -1
- package/dist/core/extensions/builtin/config-reload/watch-event-source.d.ts.map +1 -1
- package/dist/core/extensions/builtin/config-reload/watch-event-source.js +32 -9
- package/dist/core/extensions/builtin/config-reload/watch-event-source.js.map +1 -1
- package/dist/core/extensions/builtin/cursor-cli-oauth/catalog-refresh.d.ts +23 -0
- package/dist/core/extensions/builtin/cursor-cli-oauth/catalog-refresh.d.ts.map +1 -0
- package/dist/core/extensions/builtin/cursor-cli-oauth/catalog-refresh.js +48 -0
- package/dist/core/extensions/builtin/cursor-cli-oauth/catalog-refresh.js.map +1 -0
- package/dist/core/extensions/builtin/cursor-cli-oauth/environment.d.ts +13 -0
- package/dist/core/extensions/builtin/cursor-cli-oauth/environment.d.ts.map +1 -0
- package/dist/core/extensions/builtin/cursor-cli-oauth/environment.js +24 -0
- package/dist/core/extensions/builtin/cursor-cli-oauth/environment.js.map +1 -0
- package/dist/core/extensions/builtin/cursor-cli-oauth/executable.d.ts +1 -0
- package/dist/core/extensions/builtin/cursor-cli-oauth/executable.d.ts.map +1 -1
- package/dist/core/extensions/builtin/cursor-cli-oauth/executable.js +7 -1
- package/dist/core/extensions/builtin/cursor-cli-oauth/executable.js.map +1 -1
- package/dist/core/extensions/builtin/cursor-cli-oauth/index.d.ts +2 -0
- package/dist/core/extensions/builtin/cursor-cli-oauth/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/cursor-cli-oauth/index.js +11 -9
- package/dist/core/extensions/builtin/cursor-cli-oauth/index.js.map +1 -1
- package/dist/core/extensions/builtin/cursor-cli-oauth/models-probe.d.ts +18 -0
- package/dist/core/extensions/builtin/cursor-cli-oauth/models-probe.d.ts.map +1 -0
- package/dist/core/extensions/builtin/cursor-cli-oauth/models-probe.js +61 -0
- package/dist/core/extensions/builtin/cursor-cli-oauth/models-probe.js.map +1 -0
- package/dist/core/extensions/builtin/cursor-cli-oauth/models.d.ts +4 -1
- package/dist/core/extensions/builtin/cursor-cli-oauth/models.d.ts.map +1 -1
- package/dist/core/extensions/builtin/cursor-cli-oauth/models.js +1 -44
- package/dist/core/extensions/builtin/cursor-cli-oauth/models.js.map +1 -1
- package/dist/core/extensions/builtin/cursor-cli-oauth/oauth-login.d.ts +22 -0
- package/dist/core/extensions/builtin/cursor-cli-oauth/oauth-login.d.ts.map +1 -1
- package/dist/core/extensions/builtin/cursor-cli-oauth/oauth-login.js +1 -1
- package/dist/core/extensions/builtin/cursor-cli-oauth/oauth-login.js.map +1 -1
- package/dist/core/extensions/builtin/cursor-cli-oauth/transport.d.ts.map +1 -1
- package/dist/core/extensions/builtin/cursor-cli-oauth/transport.js +2 -13
- package/dist/core/extensions/builtin/cursor-cli-oauth/transport.js.map +1 -1
- package/dist/core/extensions/builtin/terminal/monitor-file-digest.d.ts +3 -0
- package/dist/core/extensions/builtin/terminal/monitor-file-digest.d.ts.map +1 -0
- package/dist/core/extensions/builtin/terminal/monitor-file-digest.js +25 -0
- package/dist/core/extensions/builtin/terminal/monitor-file-digest.js.map +1 -0
- package/dist/core/extensions/builtin/terminal/monitor-file-watch.d.ts +9 -0
- package/dist/core/extensions/builtin/terminal/monitor-file-watch.d.ts.map +1 -0
- package/dist/core/extensions/builtin/terminal/monitor-file-watch.js +33 -0
- package/dist/core/extensions/builtin/terminal/monitor-file-watch.js.map +1 -0
- package/dist/core/extensions/builtin/terminal/monitor-line-buffer.d.ts +6 -0
- package/dist/core/extensions/builtin/terminal/monitor-line-buffer.d.ts.map +1 -0
- package/dist/core/extensions/builtin/terminal/monitor-line-buffer.js +22 -0
- package/dist/core/extensions/builtin/terminal/monitor-line-buffer.js.map +1 -0
- package/dist/core/extensions/builtin/terminal/monitor-registry.d.ts.map +1 -1
- package/dist/core/extensions/builtin/terminal/monitor-registry.js +14 -35
- package/dist/core/extensions/builtin/terminal/monitor-registry.js.map +1 -1
- package/dist/core/extensions/kernel-tools-context.d.ts +13 -0
- package/dist/core/extensions/kernel-tools-context.d.ts.map +1 -0
- package/dist/core/extensions/kernel-tools-context.js +3 -0
- package/dist/core/extensions/kernel-tools-context.js.map +1 -0
- package/dist/core/extensions/runner.d.ts +19 -0
- package/dist/core/extensions/runner.d.ts.map +1 -1
- package/dist/core/extensions/runner.js +103 -1
- package/dist/core/extensions/runner.js.map +1 -1
- package/dist/core/extensions/types.d.ts +21 -0
- package/dist/core/extensions/types.d.ts.map +1 -1
- package/dist/core/extensions/types.js.map +1 -1
- package/dist/core/keybindings.d.ts +5 -0
- package/dist/core/keybindings.d.ts.map +1 -1
- package/dist/core/keybindings.js +1 -0
- package/dist/core/keybindings.js.map +1 -1
- package/dist/core/resource-loader.d.ts.map +1 -1
- package/dist/core/resource-loader.js +9 -17
- package/dist/core/resource-loader.js.map +1 -1
- package/dist/core/retry-fallback/settings.d.ts +3 -0
- package/dist/core/retry-fallback/settings.d.ts.map +1 -1
- package/dist/core/retry-fallback/settings.js.map +1 -1
- 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 +30 -1
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +92 -5
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/session-resident-store.d.ts +33 -7
- package/dist/core/session-resident-store.d.ts.map +1 -1
- package/dist/core/session-resident-store.js +163 -14
- package/dist/core/session-resident-store.js.map +1 -1
- package/dist/core/session-write-reservation.d.ts +6 -0
- package/dist/core/session-write-reservation.d.ts.map +1 -1
- package/dist/core/session-write-reservation.js +19 -0
- package/dist/core/session-write-reservation.js.map +1 -1
- package/dist/core/settings-manager.d.ts +35 -1
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +62 -0
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/slash-commands.d.ts.map +1 -1
- package/dist/core/slash-commands.js +2 -1
- package/dist/core/slash-commands.js.map +1 -1
- package/dist/core/tools/index.d.ts +1 -1
- package/dist/core/tools/index.d.ts.map +1 -1
- package/dist/core/tools/index.js +4 -3
- package/dist/core/tools/index.js.map +1 -1
- package/dist/core/tools/read.d.ts +3 -1
- package/dist/core/tools/read.d.ts.map +1 -1
- package/dist/core/tools/read.js +16 -2
- package/dist/core/tools/read.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/modes/interactive/components/assistant-render-descriptors.d.ts.map +1 -1
- package/dist/modes/interactive/components/assistant-render-descriptors.js +12 -5
- package/dist/modes/interactive/components/assistant-render-descriptors.js.map +1 -1
- package/dist/modes/interactive/components/extension-input.d.ts +2 -0
- package/dist/modes/interactive/components/extension-input.d.ts.map +1 -1
- package/dist/modes/interactive/components/extension-input.js +5 -0
- package/dist/modes/interactive/components/extension-input.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts +19 -2
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +69 -17
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/interactive/tips/catalog/session-tips.js +1 -1
- package/dist/modes/interactive/tips/catalog/session-tips.js.map +1 -1
- package/dist/modes/interactive/working-status.d.ts +3 -2
- package/dist/modes/interactive/working-status.d.ts.map +1 -1
- package/dist/modes/interactive/working-status.js +17 -4
- package/dist/modes/interactive/working-status.js.map +1 -1
- package/dist/modes/print-mode.d.ts +1 -1
- package/dist/modes/print-mode.d.ts.map +1 -1
- package/dist/modes/print-mode.js +5 -1
- package/dist/modes/print-mode.js.map +1 -1
- package/dist/modes/rpc/host-watchdog.d.ts.map +1 -1
- package/dist/modes/rpc/host-watchdog.js +5 -24
- package/dist/modes/rpc/host-watchdog.js.map +1 -1
- package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-mode.js +3 -8
- package/dist/modes/rpc/rpc-mode.js.map +1 -1
- package/dist/modes/rpc/session-command-router.d.ts.map +1 -1
- package/dist/modes/rpc/session-command-router.js +3 -0
- package/dist/modes/rpc/session-command-router.js.map +1 -1
- package/dist/modes/rpc/session-worker-client.d.ts +3 -0
- package/dist/modes/rpc/session-worker-client.d.ts.map +1 -1
- package/dist/modes/rpc/session-worker-client.js +17 -6
- package/dist/modes/rpc/session-worker-client.js.map +1 -1
- package/dist/modes/rpc/shutdown.d.ts +3 -0
- package/dist/modes/rpc/shutdown.d.ts.map +1 -0
- package/dist/modes/rpc/shutdown.js +17 -0
- package/dist/modes/rpc/shutdown.js.map +1 -0
- package/docs/extensions.md +5 -2
- package/docs/keybindings.md +1 -0
- package/docs/session-format.md +1 -1
- package/docs/sessions.md +3 -3
- package/docs/settings.md +31 -1
- package/docs/usage.md +1 -1
- package/node_modules/@code-yeongyu/senpi-codemode/CHANGELOG.md +50 -0
- package/node_modules/@code-yeongyu/senpi-codemode/README.md +24 -0
- package/node_modules/@code-yeongyu/senpi-codemode/package.json +4 -4
- package/node_modules/@code-yeongyu/senpi-codemode/src/bridge/http-server.ts +7 -1
- package/node_modules/@code-yeongyu/senpi-codemode/src/bridge/kernel-tools-protocol.ts +85 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/bridge/protocol.ts +6 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/bridges/agent-bridge.ts +30 -11
- package/node_modules/@code-yeongyu/senpi-codemode/src/extension/session-manager.ts +11 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/index.ts +10 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/jl/prelude.jl +46 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/jl/runner.jl +1 -1
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/context-manager.ts +58 -10
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/kernel-contract.ts +12 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/kernel-tools-context.d.ts +13 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/kernel-tools-context.js +7 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/kernel-tools-define.d.ts +10 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/kernel-tools-define.js +12 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/kernel-tools-errors.js +22 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/kernel-tools-errors.ts +26 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/kernel-tools-host.ts +134 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/kernel-tools-naming.js +28 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/kernel-tools-parse.d.ts +5 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/kernel-tools-parse.js +255 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/kernel-tools-pump.js +105 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/kernel-tools-registry.d.ts +27 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/kernel-tools-registry.js +127 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/kernel-tools-schema.js +69 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/kernel-tools-types.ts +42 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/prelude.ts +2 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/worker-core.js +26 -3
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/worker-runtime.js +20 -8
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/worker-slot.ts +6 -1
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/worker-startup.ts +9 -7
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/workpool.js +37 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/kernel-tools-unavailable.ts +5 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/py/kernel.ts +13 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/py/prelude.py +57 -3
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/rb/prelude.rb +13 -2
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/rb/workpool.rb +38 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/shared/subprocess-kernel.ts +13 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/shared/subprocess-queue.ts +9 -1
- package/node_modules/@code-yeongyu/senpi-codemode/src/prompt/eval-prompt-template.ts +4 -2
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/cell-handler.ts +31 -3
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/detached-cell-manager.ts +36 -71
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/image-resize.ts +52 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/image.ts +37 -72
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/managed-cell.ts +78 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/render.ts +30 -5
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/run-eval-cell.ts +52 -30
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/terminal-snapshot-store.ts +35 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/tool-result-marshal.ts +23 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/types.ts +2 -0
- 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 +30 -3
- 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 +5 -0
- 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 +2 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/agent.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/empty-assistant-recovery.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/empty-assistant-recovery.js +51 -12
- package/node_modules/@earendil-works/pi-agent-core/dist/empty-assistant-recovery.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/read.d.ts +3 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/read.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/read.js +18 -3
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/read.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/brace-scanner.d.ts +4 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/brace-scanner.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/brace-scanner.js +268 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/brace-scanner.js.map +1 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/header-protection.d.ts +18 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/header-protection.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/header-protection.js +69 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/header-protection.js.map +1 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/index.d.ts +27 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/index.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/index.js +118 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/index.js.map +1 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/lexical-context.d.ts +21 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/lexical-context.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/lexical-context.js +24 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/lexical-context.js.map +1 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/lexical-spans.d.ts +12 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/lexical-spans.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/lexical-spans.js +92 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/lexical-spans.js.map +1 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/types.d.ts +47 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/types.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/types.js +8 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/types.js.map +1 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/segmented-read-view.d.ts +52 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/segmented-read-view.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/segmented-read-view.js +155 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/segmented-read-view.js.map +1 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/index.d.ts +4 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/index.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/index.js +3 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/index.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/stream-throughput-watchdog.d.ts +101 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/stream-throughput-watchdog.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/stream-throughput-watchdog.js +178 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/stream-throughput-watchdog.js.map +1 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/types.d.ts +9 -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 +3 -3
- package/node_modules/@earendil-works/pi-ai/dist/index.d.ts +1 -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 +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/index.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/.manifest.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/alibaba-token-plan.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/amazon-bedrock.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/fireworks.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/qwen-token-plan.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/utils/empty-response-errors.d.ts +15 -0
- package/node_modules/@earendil-works/pi-ai/dist/utils/empty-response-errors.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/utils/empty-response-errors.js +15 -0
- package/node_modules/@earendil-works/pi-ai/dist/utils/empty-response-errors.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/utils/retry.d.ts +24 -0
- 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 +92 -0
- package/node_modules/@earendil-works/pi-ai/dist/utils/retry.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/package.json +2 -2
- package/node_modules/@earendil-works/pi-pty/package.json +1 -1
- package/node_modules/@earendil-works/pi-telemetry/package.json +1 -1
- package/node_modules/@earendil-works/pi-tui/package.json +1 -1
- package/package.json +7 -7
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import type { AgentToolResult } from "@code-yeongyu/senpi";
|
|
2
|
+
import { type CellDeadlineExpiry, CellDeadlines } from "./cell-deadlines.ts";
|
|
3
|
+
import type { EvalDetachedCellSnapshot, EvalDetachedCellState } from "./detached-cell-contract.ts";
|
|
4
|
+
import { detachedNotificationSpillPath } from "./detached-cell-notification.ts";
|
|
5
|
+
import type { EvalKernel, EvalToolDetails, EvalToolInput } from "./types.ts";
|
|
6
|
+
|
|
7
|
+
export type LiveResultProvider = () => AgentToolResult<EvalToolDetails>;
|
|
8
|
+
|
|
9
|
+
export type ManagedCell = {
|
|
10
|
+
readonly cellId: string;
|
|
11
|
+
readonly input: EvalToolInput;
|
|
12
|
+
readonly spillPath: string | undefined;
|
|
13
|
+
readonly startedAtMs: number;
|
|
14
|
+
readonly terminal: PromiseWithResolvers<EvalDetachedCellSnapshot>;
|
|
15
|
+
state: EvalDetachedCellState;
|
|
16
|
+
canDetach: boolean;
|
|
17
|
+
wasDetached: boolean;
|
|
18
|
+
kernel: EvalKernel | undefined;
|
|
19
|
+
stateRetained: boolean | undefined;
|
|
20
|
+
interruptNote: string | undefined;
|
|
21
|
+
/** Holds the completion notification until the interrupt has reported whether kernel state survived. */
|
|
22
|
+
interruptOutcome: PromiseWithResolvers<void> | undefined;
|
|
23
|
+
liveResult: LiveResultProvider | undefined;
|
|
24
|
+
terminalResult: AgentToolResult<EvalToolDetails> | undefined;
|
|
25
|
+
notificationQueued: boolean;
|
|
26
|
+
readonly deadlines: CellDeadlines;
|
|
27
|
+
readonly hardLimitSeconds: number;
|
|
28
|
+
readonly runBudgetSeconds: number;
|
|
29
|
+
hardLimited: boolean;
|
|
30
|
+
runBudgetExhausted: boolean;
|
|
31
|
+
/** Foreground killer: the still-awaited CellExecution owns interrupting and rejecting its own call; bound from creation so a deadline firing during kernel boot still ends it. */
|
|
32
|
+
onKill: ((error: Error) => void) | undefined;
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
export interface ManagedCellInit {
|
|
36
|
+
readonly cellId: string;
|
|
37
|
+
readonly input: EvalToolInput;
|
|
38
|
+
readonly artifactsDir: string | undefined;
|
|
39
|
+
readonly now: () => number;
|
|
40
|
+
readonly defaultHardLimitSeconds: number;
|
|
41
|
+
readonly defaultRunBudgetSeconds: number;
|
|
42
|
+
readonly onKill: ((error: Error) => void) | undefined;
|
|
43
|
+
readonly onExpire: (cellId: string, expiry: CellDeadlineExpiry) => void;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export function createManagedCell(init: ManagedCellInit): ManagedCell {
|
|
47
|
+
// An explicit longer per-call timeout raises the deadline, mirroring bash keeping explicit timeouts.
|
|
48
|
+
const hardLimitSeconds = Math.max(init.defaultHardLimitSeconds, init.input.timeout ?? 0);
|
|
49
|
+
const runBudgetSeconds = init.input.timeout ?? init.defaultRunBudgetSeconds;
|
|
50
|
+
return {
|
|
51
|
+
cellId: init.cellId,
|
|
52
|
+
input: init.input,
|
|
53
|
+
spillPath: detachedNotificationSpillPath(init.artifactsDir, init.cellId),
|
|
54
|
+
startedAtMs: init.now(),
|
|
55
|
+
state: "running",
|
|
56
|
+
canDetach: false,
|
|
57
|
+
wasDetached: false,
|
|
58
|
+
kernel: undefined,
|
|
59
|
+
stateRetained: undefined,
|
|
60
|
+
interruptNote: undefined,
|
|
61
|
+
interruptOutcome: undefined,
|
|
62
|
+
liveResult: undefined,
|
|
63
|
+
terminalResult: undefined,
|
|
64
|
+
notificationQueued: false,
|
|
65
|
+
deadlines: new CellDeadlines({
|
|
66
|
+
cellId: init.cellId,
|
|
67
|
+
hardLimitSeconds,
|
|
68
|
+
runBudgetSeconds,
|
|
69
|
+
onExpire: (expiry) => init.onExpire(init.cellId, expiry),
|
|
70
|
+
}),
|
|
71
|
+
hardLimitSeconds,
|
|
72
|
+
runBudgetSeconds,
|
|
73
|
+
hardLimited: false,
|
|
74
|
+
runBudgetExhausted: false,
|
|
75
|
+
onKill: init.onKill,
|
|
76
|
+
terminal: Promise.withResolvers<EvalDetachedCellSnapshot>(),
|
|
77
|
+
};
|
|
78
|
+
}
|
|
@@ -71,10 +71,15 @@ const TOOL_CALL_COLLAPSED_VISUAL_LINES = 4;
|
|
|
71
71
|
const TOOL_CALL_COLLAPSED_ERROR_CODE_POINTS = 512;
|
|
72
72
|
const TOOL_ERROR_OMISSION_MARKER = "[tool error omitted]";
|
|
73
73
|
const LIVE_ELAPSED_TICK_MS = 1_000;
|
|
74
|
+
// A live row repaints on every tick, so this many ticks without a render means the row is gone.
|
|
75
|
+
const LIVE_TICKER_MAX_IDLE_TICKS = 60;
|
|
74
76
|
|
|
75
77
|
class PlainTextComponent implements EvalRenderComponent {
|
|
76
78
|
#blocks: readonly RenderBlock[] = [];
|
|
77
79
|
#ticker: ReturnType<typeof setInterval> | undefined;
|
|
80
|
+
#live = false;
|
|
81
|
+
#invalidate: (() => void) | undefined;
|
|
82
|
+
#idleTicks = 0;
|
|
78
83
|
|
|
79
84
|
setBlocks(blocks: readonly RenderBlock[]): void {
|
|
80
85
|
this.#blocks = blocks;
|
|
@@ -84,16 +89,19 @@ class PlainTextComponent implements EvalRenderComponent {
|
|
|
84
89
|
* The host only animates tool rows for streaming args, `task`, and results carrying
|
|
85
90
|
* `details.progress`; an eval row matches none of them, so nothing repaints it between
|
|
86
91
|
* update events. While a cell is non-terminal this drives the repaint itself so the
|
|
87
|
-
* header's elapsed time advances, and it emits no tool updates or RPC traffic.
|
|
92
|
+
* header's elapsed time advances, and it emits no tool updates or RPC traffic. Detached
|
|
93
|
+
* and terminal cards never arm it, and a ticker whose row stopped rendering (transcript
|
|
94
|
+
* rebuild, session switch) stops itself after LIVE_TICKER_MAX_IDLE_TICKS and rearms on
|
|
95
|
+
* the next render, so dropped rows cannot accumulate intervals.
|
|
88
96
|
*/
|
|
89
97
|
syncLiveTicker(isLive: boolean, invalidate: () => void): void {
|
|
98
|
+
this.#live = isLive;
|
|
99
|
+
this.#invalidate = invalidate;
|
|
90
100
|
if (!isLive) {
|
|
91
101
|
this.stopLiveTicker();
|
|
92
102
|
return;
|
|
93
103
|
}
|
|
94
|
-
|
|
95
|
-
this.#ticker = setInterval(invalidate, LIVE_ELAPSED_TICK_MS);
|
|
96
|
-
this.#ticker.unref?.();
|
|
104
|
+
this.#armTicker();
|
|
97
105
|
}
|
|
98
106
|
|
|
99
107
|
stopLiveTicker(): void {
|
|
@@ -102,7 +110,24 @@ class PlainTextComponent implements EvalRenderComponent {
|
|
|
102
110
|
this.#ticker = undefined;
|
|
103
111
|
}
|
|
104
112
|
|
|
113
|
+
#armTicker(): void {
|
|
114
|
+
if (this.#ticker !== undefined || this.#invalidate === undefined) return;
|
|
115
|
+
this.#ticker = setInterval(() => this.#tick(), LIVE_ELAPSED_TICK_MS);
|
|
116
|
+
this.#ticker.unref?.();
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
#tick(): void {
|
|
120
|
+
this.#idleTicks += 1;
|
|
121
|
+
if (this.#idleTicks >= LIVE_TICKER_MAX_IDLE_TICKS) {
|
|
122
|
+
this.stopLiveTicker();
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
this.#invalidate?.();
|
|
126
|
+
}
|
|
127
|
+
|
|
105
128
|
render(width: number): string[] {
|
|
129
|
+
this.#idleTicks = 0;
|
|
130
|
+
if (this.#live) this.#armTicker();
|
|
106
131
|
const lines: string[] = [];
|
|
107
132
|
for (const block of this.#blocks) {
|
|
108
133
|
switch (block.kind) {
|
|
@@ -269,7 +294,7 @@ function spinner(frame: number | undefined): string {
|
|
|
269
294
|
}
|
|
270
295
|
|
|
271
296
|
function isLiveCellStatus(status: CellStatus): boolean {
|
|
272
|
-
return status === "pending" || status === "running"
|
|
297
|
+
return status === "pending" || status === "running";
|
|
273
298
|
}
|
|
274
299
|
|
|
275
300
|
function cellPresentation(status: CellStatus, spinnerFrame: number | undefined): StatusPresentation {
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { randomUUID } from "node:crypto";
|
|
2
2
|
import { join } from "node:path";
|
|
3
|
-
import type
|
|
3
|
+
import { type AgentToolResult, type ExtensionContext, kernelToolsStorage } from "@code-yeongyu/senpi";
|
|
4
4
|
import { DEFAULT_FOREGROUND_WINDOW_SECONDS, defaultCodemodeSettings } from "../config/settings.ts";
|
|
5
|
+
import type { KernelToolsCapability } from "../kernels/js/kernel-tools-types.ts";
|
|
5
6
|
import { TIMEOUT_PAUSE_OP, TIMEOUT_RESUME_OP } from "../timeouts/bridge-timeout.ts";
|
|
6
7
|
import { abortError, CellExecution, defaultTimeoutFactory } from "./cell-execution.ts";
|
|
7
8
|
import { CellHandler, type CellState } from "./cell-handler.ts";
|
|
@@ -11,7 +12,7 @@ import { buildEvalExecutionEventPayload, type EvalExecutionSettleOutcome } from
|
|
|
11
12
|
import { evalTimeoutBehavior } from "./eval-request.ts";
|
|
12
13
|
import type { CreateEvalToolOptions, EvalCellInvocation } from "./eval-tool-options.ts";
|
|
13
14
|
import { describeTimeoutState } from "./interrupt-note.ts";
|
|
14
|
-
import type { EvalToolDetails } from "./types.ts";
|
|
15
|
+
import type { EvalKernel, EvalToolDetails } from "./types.ts";
|
|
15
16
|
|
|
16
17
|
export async function runEvalCell(
|
|
17
18
|
options: CreateEvalToolOptions,
|
|
@@ -166,34 +167,42 @@ async function executeCell(
|
|
|
166
167
|
void pending.catch((error: unknown) => execution.cancel(error));
|
|
167
168
|
}),
|
|
168
169
|
);
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
: {
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
170
|
+
// Computed before the handler so the cell's capability can be entered per host tool call from the
|
|
171
|
+
// worker's message loop, which runs outside the `kernelToolsStorage.run` context below (#1754).
|
|
172
|
+
const kernelTools = jsKernelTools(kernel, invocation.input.language);
|
|
173
|
+
const runBound = async (): Promise<AgentToolResult<EvalToolDetails>> => {
|
|
174
|
+
execution.setKernel(kernel);
|
|
175
|
+
const activeHandler = new CellHandler(kernel, state, {
|
|
176
|
+
executeTool: options.executeTool,
|
|
177
|
+
...(options.listTools === undefined ? {} : { listTools: options.listTools }),
|
|
178
|
+
settings: options.settings ?? defaultCodemodeSettings,
|
|
179
|
+
...(options.complete === undefined ? {} : { complete: options.complete }),
|
|
180
|
+
ctx: bridgeContext,
|
|
181
|
+
...(options.artifactsDir === undefined
|
|
182
|
+
? {}
|
|
183
|
+
: { artifactPath: join(options.artifactsDir, `eval-${randomUUID()}.log`) }),
|
|
184
|
+
...(options.imageResizer === undefined ? {} : { imageResizer: options.imageResizer }),
|
|
185
|
+
...(kernelTools === undefined ? {} : { kernelTools }),
|
|
186
|
+
});
|
|
187
|
+
handler = activeHandler;
|
|
188
|
+
cellManager.markRunning(
|
|
189
|
+
cell,
|
|
190
|
+
kernel,
|
|
191
|
+
() => activeHandler.liveResult(),
|
|
192
|
+
(error) => execution.cancel(error),
|
|
193
|
+
);
|
|
194
|
+
// Includes a steer already queued at execute start or received while acquiring the kernel.
|
|
195
|
+
onReady();
|
|
196
|
+
if ("setContext" in options.kernelManager && typeof options.kernelManager.setContext === "function") {
|
|
197
|
+
options.kernelManager.setContext(bridgeContext);
|
|
198
|
+
}
|
|
199
|
+
if (invocation.input.reset) await execution.wait(kernel.reset());
|
|
200
|
+
const result = await execution.wait(kernel.run({ cellId: invocation.cellId, code: invocation.input.code }));
|
|
201
|
+
if (result.ok && state.pendingBridgeCalls.length > 0)
|
|
202
|
+
await execution.wait(Promise.all(state.pendingBridgeCalls));
|
|
203
|
+
return await handler.finalize(result);
|
|
204
|
+
};
|
|
205
|
+
return kernelTools ? await kernelToolsStorage.run(kernelTools, runBound) : await runBound();
|
|
197
206
|
} catch (error) {
|
|
198
207
|
if (handler && error instanceof Error && error.name === "CodemodeSessionDisposedError")
|
|
199
208
|
return await handler.finalizeCancellation(error);
|
|
@@ -206,3 +215,16 @@ async function executeCell(
|
|
|
206
215
|
if (handler) await handler.flushOutput();
|
|
207
216
|
}
|
|
208
217
|
}
|
|
218
|
+
|
|
219
|
+
function jsKernelTools(kernel: EvalKernel, language: string): KernelToolsCapability | undefined {
|
|
220
|
+
if (language !== "js") return undefined;
|
|
221
|
+
if (!("describeKernelTools" in kernel) || typeof kernel.describeKernelTools !== "function") return undefined;
|
|
222
|
+
const js = kernel as EvalKernel & {
|
|
223
|
+
describeKernelTools: KernelToolsCapability["describe"];
|
|
224
|
+
invokeKernelTool: KernelToolsCapability["invoke"];
|
|
225
|
+
};
|
|
226
|
+
return {
|
|
227
|
+
describe: (names) => js.describeKernelTools(names),
|
|
228
|
+
invoke: (request, signal) => js.invokeKernelTool(request, signal),
|
|
229
|
+
};
|
|
230
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { EvalDetachedCellSnapshot } from "./detached-cell-contract.ts";
|
|
2
|
+
|
|
3
|
+
export const TERMINAL_SNAPSHOT_CAP = 32;
|
|
4
|
+
|
|
5
|
+
/** Bounded LRU of settled-cell snapshots; without it every settled cell pins its result and closures for the session lifetime (#1695). */
|
|
6
|
+
export class TerminalSnapshotStore {
|
|
7
|
+
readonly #snapshots = new Map<string, EvalDetachedCellSnapshot>();
|
|
8
|
+
readonly #cap: number;
|
|
9
|
+
|
|
10
|
+
constructor(cap = TERMINAL_SNAPSHOT_CAP) {
|
|
11
|
+
this.#cap = cap;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
remember(snapshot: EvalDetachedCellSnapshot): void {
|
|
15
|
+
this.#snapshots.delete(snapshot.cellId);
|
|
16
|
+
this.#snapshots.set(snapshot.cellId, snapshot);
|
|
17
|
+
while (this.#snapshots.size > this.#cap) {
|
|
18
|
+
const oldest = this.#snapshots.keys().next();
|
|
19
|
+
if (oldest.done === true) break;
|
|
20
|
+
this.#snapshots.delete(oldest.value);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
get(cellId: string): EvalDetachedCellSnapshot | undefined {
|
|
25
|
+
return this.#snapshots.get(cellId);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
delete(cellId: string): void {
|
|
29
|
+
this.#snapshots.delete(cellId);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
clear(): void {
|
|
33
|
+
this.#snapshots.clear();
|
|
34
|
+
}
|
|
35
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { AgentToolResult } from "@code-yeongyu/senpi";
|
|
2
|
+
|
|
3
|
+
export function marshalToolResult(result: AgentToolResult<unknown>) {
|
|
4
|
+
const texts = result.content.filter((part) => part.type === "text").map((part) => part.text);
|
|
5
|
+
const images = result.content
|
|
6
|
+
.filter((part) => part.type === "image")
|
|
7
|
+
.map((part) => ({ mimeType: part.mimeType, dataBase64: part.data }));
|
|
8
|
+
const details =
|
|
9
|
+
typeof result.details === "object" &&
|
|
10
|
+
result.details !== null &&
|
|
11
|
+
!Array.isArray(result.details) &&
|
|
12
|
+
Object.keys(result.details).length === 0
|
|
13
|
+
? undefined
|
|
14
|
+
: result.details;
|
|
15
|
+
const hasError = toolResultIsError(result);
|
|
16
|
+
const text = texts.join("\n");
|
|
17
|
+
return images.length === 0 && details === undefined && !hasError ? { text } : { text, details, images, hasError };
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export function toolResultIsError(result: AgentToolResult<unknown>): boolean {
|
|
21
|
+
const details = result.details;
|
|
22
|
+
return typeof details === "object" && details !== null && "isError" in details && details.isError === true;
|
|
23
|
+
}
|
|
@@ -132,6 +132,8 @@ export interface EvalKernel {
|
|
|
132
132
|
deliverToolReply(message: Extract<HostToKernelMessage, { type: "tool-reply" }>): void;
|
|
133
133
|
reset(): Promise<void>;
|
|
134
134
|
close(): Promise<void>;
|
|
135
|
+
/** Names this kernel has registered; JS collides with other languages in the same session. */
|
|
136
|
+
listKernelToolNames?(): readonly string[];
|
|
135
137
|
}
|
|
136
138
|
|
|
137
139
|
export interface EvalKernelManager {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-loop.d.ts","sourceRoot":"","sources":["../src/agent-loop.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAIN,KAAK,OAAO,EAEZ,WAAW,EAIX,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"agent-loop.d.ts","sourceRoot":"","sources":["../src/agent-loop.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAIN,KAAK,OAAO,EAEZ,WAAW,EAIX,MAAM,uBAAuB,CAAC;AAgB/B,OAAO,KAAK,EACX,YAAY,EACZ,UAAU,EACV,eAAe,EAEf,YAAY,EACZ,SAAS,EACT,aAAa,EAEb,QAAQ,EACR,MAAM,YAAY,CAAC;AAEpB,MAAM,MAAM,cAAc,GAAG,CAAC,KAAK,EAAE,UAAU,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AAEzE;;;GAGG;AACH,wBAAgB,SAAS,CACxB,OAAO,EAAE,YAAY,EAAE,EACvB,OAAO,EAAE,YAAY,EACrB,MAAM,EAAE,eAAe,EACvB,MAAM,EAAE,WAAW,GAAG,SAAS,EAC/B,QAAQ,EAAE,QAAQ,GAChB,WAAW,CAAC,UAAU,EAAE,YAAY,EAAE,CAAC,CAiBzC;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAChC,OAAO,EAAE,YAAY,EACrB,MAAM,EAAE,eAAe,EACvB,MAAM,EAAE,WAAW,GAAG,SAAS,EAC/B,QAAQ,EAAE,QAAQ,GAChB,WAAW,CAAC,UAAU,EAAE,YAAY,EAAE,CAAC,CAwBzC;AAED,wBAAsB,YAAY,CACjC,OAAO,EAAE,YAAY,EAAE,EACvB,OAAO,EAAE,YAAY,EACrB,MAAM,EAAE,eAAe,EACvB,IAAI,EAAE,cAAc,EACpB,MAAM,EAAE,WAAW,GAAG,SAAS,EAC/B,QAAQ,EAAE,QAAQ,GAChB,OAAO,CAAC,YAAY,EAAE,CAAC,CAgBzB;AAED,wBAAsB,oBAAoB,CACzC,OAAO,EAAE,YAAY,EACrB,MAAM,EAAE,eAAe,EACvB,IAAI,EAAE,cAAc,EACpB,MAAM,EAAE,WAAW,GAAG,SAAS,EAC/B,QAAQ,EAAE,QAAQ,GAChB,OAAO,CAAC,YAAY,EAAE,CAAC,CAiBzB;AAmBD,qBAAa,uBAAwB,SAAQ,KAAK;IACjD,YAAY,SAAS,EAAE,MAAM,EAK5B;CACD;AA2ND,uGAAuG;AACvG,wBAAsB,oBAAoB,CACzC,OAAO,EAAE,YAAY,EACrB,MAAM,EAAE,IAAI,CAAC,eAAe,EAAE,cAAc,GAAG,kBAAkB,CAAC,EAClE,MAAM,CAAC,EAAE,WAAW,GAClB,OAAO,CAAC,OAAO,CAAC,CAIlB;AA2oBD,MAAM,WAAW,qBAAqB;IACrC,QAAQ,EAAE,aAAa,CAAC;IACxB,IAAI,EAAE,SAAS,CAAC;IAChB,IAAI,EAAE,OAAO,CAAC;CACd;AAED,wBAAgB,6BAA6B,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,aAAa,GAAG,aAAa,CAYrG;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,aAAa,GAAG,qBAAqB,CAOpG"}
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
import { EventStream, isCursorExecResolved, validateToolArguments, } from "@earendil-works/pi-ai";
|
|
6
6
|
import { createTerminalFailureAssistantMessage, demoteToolUseWithoutToolCalls, isStreamIdleTimeoutError, normalizeTerminalAssistantMessage, promoteStopWithPendingToolCalls, shouldFinalizeIdleAsStop, shouldTerminateAssistantTurn, } from "./assistant-terminal-state.js";
|
|
7
7
|
import { getDefaultStreamFn, withEmptyAssistantRecovery } from "./stream-fn.js";
|
|
8
|
+
import { createStreamThroughputWatchdog, estimateStreamedUnits, } from "./stream-throughput-watchdog.js";
|
|
8
9
|
/**
|
|
9
10
|
* Start an agent loop with a new prompt message.
|
|
10
11
|
* The prompt is added to the context and events are emitted for it.
|
|
@@ -346,7 +347,7 @@ async function streamAssistantResponse(context, config, signal, emit, streamFunc
|
|
|
346
347
|
: {}),
|
|
347
348
|
});
|
|
348
349
|
const iterator = response[Symbol.asyncIterator]();
|
|
349
|
-
const eventReader = createAssistantEventReader(iterator, streamIdleTimeoutMs, requestAbortController.signal, (error) => requestAbortController.abort(error), config.streamStartTimeoutMs, response);
|
|
350
|
+
const eventReader = createAssistantEventReader(iterator, streamIdleTimeoutMs, requestAbortController.signal, (error) => requestAbortController.abort(error), config.streamStartTimeoutMs, response, createStreamThroughputWatchdog(config.streamThroughput));
|
|
350
351
|
try {
|
|
351
352
|
while (true) {
|
|
352
353
|
const next = await eventReader.next();
|
|
@@ -496,7 +497,13 @@ function closeAssistantIterator(iterator) {
|
|
|
496
497
|
function normalizeTimeoutMs(timeoutMs) {
|
|
497
498
|
return typeof timeoutMs === "number" && Number.isFinite(timeoutMs) && timeoutMs > 0 ? timeoutMs : undefined;
|
|
498
499
|
}
|
|
499
|
-
|
|
500
|
+
/** Streamed units carried by one assistant event; only text and thinking count. */
|
|
501
|
+
function streamedUnitsOf(event) {
|
|
502
|
+
if (event.type === "text_delta" || event.type === "thinking_delta")
|
|
503
|
+
return estimateStreamedUnits(event.delta);
|
|
504
|
+
return 0;
|
|
505
|
+
}
|
|
506
|
+
function createAssistantEventReader(iterator, timeoutMs, signal, onIdleTimeout, streamStartTimeoutMs, stream, throughput) {
|
|
500
507
|
const idleTimeoutMs = normalizeTimeoutMs(timeoutMs);
|
|
501
508
|
const startTimeoutMs = normalizeTimeoutMs(streamStartTimeoutMs);
|
|
502
509
|
let sawFirstEvent = false;
|
|
@@ -527,9 +534,29 @@ function createAssistantEventReader(iterator, timeoutMs, signal, onIdleTimeout,
|
|
|
527
534
|
const makeTimeoutError = useStartBound
|
|
528
535
|
? (ms) => new StreamStartTimeoutError(ms)
|
|
529
536
|
: (ms) => new StreamIdleTimeoutError(ms);
|
|
537
|
+
// A provider executing a server-requested tool locally (Cursor's exec
|
|
538
|
+
// channel) is not streaming; that span must not count against the rate.
|
|
539
|
+
const localWorkPending = throughput !== undefined && stream?.hasPendingLocalWork?.() === true;
|
|
540
|
+
const waitStartedAt = localWorkPending ? Date.now() : 0;
|
|
530
541
|
const result = await readNextAssistantEvent(iterator, readTimeoutMs, makeTimeoutError, abortPromise, onIdleTimeout, stream, signal);
|
|
531
|
-
if (
|
|
542
|
+
if (localWorkPending)
|
|
543
|
+
throughput?.exclude(Date.now() - waitStartedAt);
|
|
544
|
+
if (!result.done) {
|
|
532
545
|
sawFirstEvent = true;
|
|
546
|
+
if (throughput !== undefined) {
|
|
547
|
+
// The rate clock starts at the first event, exactly where the
|
|
548
|
+
// stream-start bound stops applying.
|
|
549
|
+
throughput.start();
|
|
550
|
+
const degraded = throughput.record(streamedUnitsOf(result.value));
|
|
551
|
+
if (degraded !== undefined) {
|
|
552
|
+
closeAssistantIterator(iterator);
|
|
553
|
+
// Abort before rejecting: the caller inspects the request signal's
|
|
554
|
+
// reason, and the crawling upstream must be torn down either way.
|
|
555
|
+
onIdleTimeout?.(degraded);
|
|
556
|
+
throw degraded;
|
|
557
|
+
}
|
|
558
|
+
}
|
|
559
|
+
}
|
|
533
560
|
return result;
|
|
534
561
|
},
|
|
535
562
|
dispose: () => removeAbortListener?.(),
|