@code-yeongyu/senpi 2026.9.24-2 → 2026.9.24-3
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 +28 -0
- package/dist/bundle/chunks/{anthropic-messages-UPLQFNTT.js → anthropic-messages-UYDVRFAS.js} +1 -1
- package/dist/bundle/chunks/{app-server-command-UHPJ2C4D.js → app-server-command-OTRHYRIB.js} +1 -1
- package/dist/bundle/chunks/{azure-openai-responses-XAR2E66I.js → azure-openai-responses-DODWR4W6.js} +1 -1
- package/dist/bundle/chunks/bedrock-converse-stream.js +1 -1
- package/dist/bundle/chunks/{chunk-WISJJQ4K.js → chunk-6Q6DGME2.js} +1 -1
- package/dist/bundle/chunks/{chunk-YWO3OBYK.js → chunk-77ACEMYL.js} +1 -1
- package/dist/bundle/chunks/chunk-ELFCNCBY.js +11 -0
- package/dist/bundle/chunks/{chunk-WTSAB6AE.js → chunk-FD34HSJJ.js} +2 -2
- package/dist/bundle/chunks/{chunk-2PLPSKHD.js → chunk-HZAKOVHN.js} +1 -1
- package/dist/bundle/chunks/chunk-JBOV6VNK.js +8 -0
- package/dist/bundle/chunks/{chunk-YBC274GY.js → chunk-KMJXSXRX.js} +3 -3
- package/dist/bundle/chunks/{chunk-JRQSHZPP.js → chunk-OZCB6BP3.js} +4 -3
- package/dist/bundle/chunks/{chunk-NQAVM5XL.js → chunk-SFYHCFRO.js} +1 -1
- package/dist/bundle/chunks/{chunk-ONR57UMO.js → chunk-TTY5BHCG.js} +1 -1
- package/dist/bundle/chunks/{chunk-YKU45B65.js → chunk-UM43CBL4.js} +156 -98
- package/dist/bundle/chunks/{chunk-NGHOUIPR.js → chunk-WM5FVFAP.js} +2 -2
- package/dist/bundle/chunks/{chunk-NKVUDCGZ.js → chunk-ZKZAATFM.js} +1 -1
- package/dist/bundle/chunks/{cli-main-O5Y3TBID.js → cli-main-TX6I4X4F.js} +1 -1
- package/dist/bundle/chunks/{google-generative-ai-B5QMFONL.js → google-generative-ai-VIEFECKJ.js} +1 -1
- package/dist/bundle/chunks/{google-vertex-O2TGMVWF.js → google-vertex-Q64CKFID.js} +1 -1
- package/dist/bundle/chunks/{help-fast-path-Y33OIZBU.js → help-fast-path-ZGKPSDFO.js} +1 -1
- package/dist/bundle/chunks/{host-command-WJOL27Q7.js → host-command-BMHJ4YUD.js} +1 -1
- package/dist/bundle/chunks/{host-lifecycle-YBFXYFZP.js → host-lifecycle-2GZAGSGW.js} +1 -1
- package/dist/bundle/chunks/{interactive-host-runtime-XVTF3NUD.js → interactive-host-runtime-YI75GFD5.js} +1 -1
- package/dist/bundle/chunks/{interactive-mode-OO3NGM4G.js → interactive-mode-UI5Q6FGY.js} +1 -1
- package/dist/bundle/chunks/{multi-session-host-6MKBBOKF.js → multi-session-host-D6HMI3RQ.js} +1 -1
- package/dist/bundle/chunks/{openai-codex-responses-CK7T4WNM.js → openai-codex-responses-YSGZZDD5.js} +1 -1
- package/dist/bundle/chunks/{openai-completions-OPQKN7FH.js → openai-completions-4CLXDDHJ.js} +3 -3
- package/dist/bundle/chunks/openai-responses-IBFGBAJP.js +2 -0
- package/dist/bundle/chunks/{package-manager-cli-BMEWLAI2.js → package-manager-cli-3UWH3ZZS.js} +1 -1
- package/dist/bundle/chunks/{rotation-stream-ZFA6ELXJ.js → rotation-stream-NATO6IMN.js} +1 -1
- package/dist/bundle/chunks/{rpc-mode-5653CV65.js → rpc-mode-LXIZHJSJ.js} +1 -1
- package/dist/bundle/chunks/{session-picker-PPYK56TA.js → session-picker-BP7THCWF.js} +1 -1
- package/dist/bundle/chunks/session-worker.js +190 -131
- package/dist/bundle/cli.js +1 -1
- package/dist/bundle/index.js +1 -1
- package/dist/bundle/rpc-entry.js +1 -1
- package/dist/core/agent-session.d.ts +3 -0
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +42 -7
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/dynamic-prompt/build.d.ts.map +1 -1
- package/dist/core/dynamic-prompt/build.js +3 -0
- package/dist/core/dynamic-prompt/build.js.map +1 -1
- package/dist/core/dynamic-prompt/handoff.d.ts +16 -0
- package/dist/core/dynamic-prompt/handoff.d.ts.map +1 -0
- package/dist/core/dynamic-prompt/handoff.js +16 -0
- package/dist/core/dynamic-prompt/handoff.js.map +1 -0
- package/dist/core/dynamic-prompt/index.d.ts +1 -0
- package/dist/core/dynamic-prompt/index.d.ts.map +1 -1
- package/dist/core/dynamic-prompt/index.js +1 -0
- package/dist/core/dynamic-prompt/index.js.map +1 -1
- package/dist/core/dynamic-prompt/policies.d.ts.map +1 -1
- package/dist/core/dynamic-prompt/policies.js +2 -1
- package/dist/core/dynamic-prompt/policies.js.map +1 -1
- package/dist/core/dynamic-prompt/style.js +2 -2
- package/dist/core/dynamic-prompt/style.js.map +1 -1
- package/dist/core/environment-context.d.ts +13 -0
- package/dist/core/environment-context.d.ts.map +1 -1
- package/dist/core/environment-context.js +31 -0
- package/dist/core/environment-context.js.map +1 -1
- package/dist/core/extensions/builtin/anthropic-bash/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/anthropic-bash/index.js +1 -1
- package/dist/core/extensions/builtin/anthropic-bash/index.js.map +1 -1
- package/dist/core/extensions/builtin/anthropic-web-search/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/anthropic-web-search/index.js +1 -1
- package/dist/core/extensions/builtin/anthropic-web-search/index.js.map +1 -1
- package/dist/core/extensions/builtin/bash-timeout/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/bash-timeout/index.js +1 -1
- package/dist/core/extensions/builtin/bash-timeout/index.js.map +1 -1
- package/dist/core/extensions/builtin/cache-keepalive/index.d.ts +1 -0
- package/dist/core/extensions/builtin/cache-keepalive/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/cache-keepalive/index.js +4 -0
- package/dist/core/extensions/builtin/cache-keepalive/index.js.map +1 -1
- package/dist/core/extensions/builtin/cache-keepalive/prewarm-entry.d.ts +21 -0
- package/dist/core/extensions/builtin/cache-keepalive/prewarm-entry.d.ts.map +1 -0
- package/dist/core/extensions/builtin/cache-keepalive/prewarm-entry.js +23 -0
- package/dist/core/extensions/builtin/cache-keepalive/prewarm-entry.js.map +1 -0
- package/dist/core/extensions/builtin/cache-keepalive/session-prewarm.d.ts +25 -0
- package/dist/core/extensions/builtin/cache-keepalive/session-prewarm.d.ts.map +1 -0
- package/dist/core/extensions/builtin/cache-keepalive/session-prewarm.js +86 -0
- package/dist/core/extensions/builtin/cache-keepalive/session-prewarm.js.map +1 -0
- package/dist/core/extensions/builtin/compaction/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/compaction/index.js +6 -2
- package/dist/core/extensions/builtin/compaction/index.js.map +1 -1
- package/dist/core/extensions/builtin/compaction/todo-bridge.d.ts +3 -1
- package/dist/core/extensions/builtin/compaction/todo-bridge.d.ts.map +1 -1
- package/dist/core/extensions/builtin/compaction/todo-bridge.js +6 -3
- package/dist/core/extensions/builtin/compaction/todo-bridge.js.map +1 -1
- package/dist/core/extensions/builtin/goal/continuation.d.ts +1 -0
- package/dist/core/extensions/builtin/goal/continuation.d.ts.map +1 -1
- package/dist/core/extensions/builtin/goal/continuation.js +1 -1
- package/dist/core/extensions/builtin/goal/continuation.js.map +1 -1
- package/dist/core/extensions/builtin/goal/direct-input-lifecycle.d.ts +2 -0
- package/dist/core/extensions/builtin/goal/direct-input-lifecycle.d.ts.map +1 -1
- package/dist/core/extensions/builtin/goal/direct-input-lifecycle.js +2 -0
- package/dist/core/extensions/builtin/goal/direct-input-lifecycle.js.map +1 -1
- package/dist/core/extensions/builtin/goal/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/goal/index.js +14 -0
- package/dist/core/extensions/builtin/goal/index.js.map +1 -1
- package/dist/core/extensions/builtin/goal/todo-owed-backstop.d.ts +47 -0
- package/dist/core/extensions/builtin/goal/todo-owed-backstop.d.ts.map +1 -0
- package/dist/core/extensions/builtin/goal/todo-owed-backstop.js +155 -0
- package/dist/core/extensions/builtin/goal/todo-owed-backstop.js.map +1 -0
- package/dist/core/extensions/builtin/hooks/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/hooks/index.js +6 -2
- package/dist/core/extensions/builtin/hooks/index.js.map +1 -1
- package/dist/core/extensions/builtin/imagegen/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/imagegen/index.js +1 -1
- package/dist/core/extensions/builtin/imagegen/index.js.map +1 -1
- package/dist/core/extensions/builtin/mcp/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/mcp/index.js +15 -6
- package/dist/core/extensions/builtin/mcp/index.js.map +1 -1
- package/dist/core/extensions/builtin/openai-image-gen/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/openai-image-gen/index.js +13 -3
- package/dist/core/extensions/builtin/openai-image-gen/index.js.map +1 -1
- package/dist/core/extensions/builtin/openai-web-search/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/openai-web-search/index.js +1 -1
- package/dist/core/extensions/builtin/openai-web-search/index.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/claude-fable-5-1.d.ts.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/claude-fable-5-1.js +12 -1
- package/dist/core/extensions/builtin/prompt-preset/claude-fable-5-1.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/claude-fable-5.d.ts.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/claude-fable-5.js +13 -2
- package/dist/core/extensions/builtin/prompt-preset/claude-fable-5.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/claude-opus-5-5.d.ts.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/claude-opus-5-5.js +13 -2
- package/dist/core/extensions/builtin/prompt-preset/claude-opus-5-5.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/claude-opus-5.d.ts.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/claude-opus-5.js +14 -3
- package/dist/core/extensions/builtin/prompt-preset/claude-opus-5.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/gpt-5.5.d.ts.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/gpt-5.5.js +15 -1
- package/dist/core/extensions/builtin/prompt-preset/gpt-5.5.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/gpt-5.6.d.ts.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/gpt-5.6.js +17 -5
- package/dist/core/extensions/builtin/prompt-preset/gpt-5.6.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/gpt-6-astra.d.ts +6 -2
- package/dist/core/extensions/builtin/prompt-preset/gpt-6-astra.d.ts.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/gpt-6-astra.js +11 -2
- package/dist/core/extensions/builtin/prompt-preset/gpt-6-astra.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/grok-4.5.d.ts.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/grok-4.5.js +10 -1
- package/dist/core/extensions/builtin/prompt-preset/grok-4.5.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/grok-4.6.d.ts.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/grok-4.6.js +12 -4
- package/dist/core/extensions/builtin/prompt-preset/grok-4.6.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/grok-4.7.d.ts.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/grok-4.7.js +45 -31
- package/dist/core/extensions/builtin/prompt-preset/grok-4.7.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/index.js +3 -2
- package/dist/core/extensions/builtin/prompt-preset/index.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/kimi-k2-code.js +1 -1
- package/dist/core/extensions/builtin/prompt-preset/kimi-k2-code.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/kimi-k3.d.ts.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/kimi-k3.js +13 -2
- package/dist/core/extensions/builtin/prompt-preset/kimi-k3.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-url-widget.d.ts.map +1 -1
- package/dist/core/extensions/builtin/prompt-url-widget.js +4 -3
- package/dist/core/extensions/builtin/prompt-url-widget.js.map +1 -1
- package/dist/core/extensions/builtin/rules/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/rules/index.js +15 -8
- package/dist/core/extensions/builtin/rules/index.js.map +1 -1
- package/dist/core/extensions/builtin/terminal/extension.d.ts.map +1 -1
- package/dist/core/extensions/builtin/terminal/extension.js +1 -1
- package/dist/core/extensions/builtin/terminal/extension.js.map +1 -1
- package/dist/core/extensions/builtin/todotools/commands.d.ts +2 -1
- package/dist/core/extensions/builtin/todotools/commands.d.ts.map +1 -1
- package/dist/core/extensions/builtin/todotools/commands.js +6 -3
- package/dist/core/extensions/builtin/todotools/commands.js.map +1 -1
- package/dist/core/extensions/builtin/todotools/first-turn.d.ts +38 -0
- package/dist/core/extensions/builtin/todotools/first-turn.d.ts.map +1 -0
- package/dist/core/extensions/builtin/todotools/first-turn.js +83 -0
- package/dist/core/extensions/builtin/todotools/first-turn.js.map +1 -0
- package/dist/core/extensions/builtin/todotools/index.d.ts +1 -1
- package/dist/core/extensions/builtin/todotools/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/todotools/index.js +69 -14
- package/dist/core/extensions/builtin/todotools/index.js.map +1 -1
- package/dist/core/extensions/builtin/todotools/prompt.d.ts +2 -2
- package/dist/core/extensions/builtin/todotools/prompt.d.ts.map +1 -1
- package/dist/core/extensions/builtin/todotools/prompt.js +2 -3
- package/dist/core/extensions/builtin/todotools/prompt.js.map +1 -1
- package/dist/core/extensions/builtin/todotools/state.d.ts +4 -3
- package/dist/core/extensions/builtin/todotools/state.d.ts.map +1 -1
- package/dist/core/extensions/builtin/todotools/state.js +4 -3
- package/dist/core/extensions/builtin/todotools/state.js.map +1 -1
- package/dist/core/extensions/builtin/todotools/todo-ask.d.ts +13 -0
- package/dist/core/extensions/builtin/todotools/todo-ask.d.ts.map +1 -0
- package/dist/core/extensions/builtin/todotools/todo-ask.js +61 -0
- package/dist/core/extensions/builtin/todotools/todo-ask.js.map +1 -0
- package/dist/core/extensions/builtin/todotools/todo-format.d.ts +30 -2
- package/dist/core/extensions/builtin/todotools/todo-format.d.ts.map +1 -1
- package/dist/core/extensions/builtin/todotools/todo-format.js +58 -1
- package/dist/core/extensions/builtin/todotools/todo-format.js.map +1 -1
- package/dist/core/extensions/builtin/todotools/todo-storage.d.ts +5 -2
- package/dist/core/extensions/builtin/todotools/todo-storage.d.ts.map +1 -1
- package/dist/core/extensions/builtin/todotools/todo-storage.js +23 -12
- package/dist/core/extensions/builtin/todotools/todo-storage.js.map +1 -1
- package/dist/core/extensions/builtin/todotools/todo-types.d.ts +14 -0
- package/dist/core/extensions/builtin/todotools/todo-types.d.ts.map +1 -1
- package/dist/core/extensions/builtin/todotools/todo-types.js +2 -0
- package/dist/core/extensions/builtin/todotools/todo-types.js.map +1 -1
- package/dist/core/extensions/builtin/todotools/tools/todo.d.ts +3 -1
- package/dist/core/extensions/builtin/todotools/tools/todo.d.ts.map +1 -1
- package/dist/core/extensions/builtin/todotools/tools/todo.js +23 -8
- package/dist/core/extensions/builtin/todotools/tools/todo.js.map +1 -1
- package/dist/core/extensions/loader.d.ts.map +1 -1
- package/dist/core/extensions/loader.js +5 -1
- package/dist/core/extensions/loader.js.map +1 -1
- package/dist/core/extensions/runner.d.ts +7 -1
- package/dist/core/extensions/runner.d.ts.map +1 -1
- package/dist/core/extensions/runner.js +27 -2
- package/dist/core/extensions/runner.js.map +1 -1
- package/dist/core/extensions/types.d.ts +53 -1
- package/dist/core/extensions/types.d.ts.map +1 -1
- package/dist/core/extensions/types.js.map +1 -1
- package/dist/core/messages.d.ts.map +1 -1
- package/dist/core/messages.js +10 -2
- package/dist/core/messages.js.map +1 -1
- package/dist/core/model-runtime.d.ts +11 -1
- package/dist/core/model-runtime.d.ts.map +1 -1
- package/dist/core/model-runtime.js +13 -0
- package/dist/core/model-runtime.js.map +1 -1
- package/dist/core/prompt-cache-prefix-request.d.ts +45 -0
- package/dist/core/prompt-cache-prefix-request.d.ts.map +1 -0
- package/dist/core/prompt-cache-prefix-request.js +134 -0
- package/dist/core/prompt-cache-prefix-request.js.map +1 -0
- package/dist/core/settings-manager.d.ts +4 -1
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +8 -0
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/settings-shapes.d.ts +5 -0
- package/dist/core/settings-shapes.d.ts.map +1 -1
- package/dist/core/settings-shapes.js.map +1 -1
- package/dist/core/usage-totals.d.ts.map +1 -1
- package/dist/core/usage-totals.js +6 -0
- package/dist/core/usage-totals.js.map +1 -1
- package/docs/extensions.md +22 -0
- package/docs/settings.md +7 -0
- package/node_modules/@code-yeongyu/senpi-codemode/CHANGELOG.md +12 -0
- package/node_modules/@code-yeongyu/senpi-codemode/package.json +4 -4
- package/node_modules/@earendil-works/pi-agent-core/package.json +3 -3
- package/node_modules/@earendil-works/pi-ai/dist/api/bedrock-converse-stream.js +16 -3
- package/node_modules/@earendil-works/pi-ai/dist/api/bedrock-converse-stream.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/google-shared.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/google-shared.js +24 -17
- package/node_modules/@earendil-works/pi-ai/dist/api/google-shared.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.js +57 -3
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses-prompt-cache.d.ts +24 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses-prompt-cache.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses-prompt-cache.js +62 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses-prompt-cache.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses-shared.d.ts +6 -0
- 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 +12 -4
- 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/openai-responses.d.ts +11 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.js +63 -9
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.lazy.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.lazy.js +5 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.lazy.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/prompt-cache-warmers.d.ts +13 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/prompt-cache-warmers.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/prompt-cache-warmers.js +8 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/prompt-cache-warmers.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/warm-prompt-cache.d.ts +4 -2
- package/node_modules/@earendil-works/pi-ai/dist/api/warm-prompt-cache.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/warm-prompt-cache.js +22 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/warm-prompt-cache.js.map +1 -1
- 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/google-vertex.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/types.d.ts +13 -0
- 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 +8 -0
- package/node_modules/@earendil-works/pi-ai/dist/utils/retry.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/tool-choice-fallback.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/tool-choice-fallback.js +7 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/tool-choice-fallback.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
- package/dist/bundle/chunks/chunk-J7IUURQ6.js +0 -8
- package/dist/bundle/chunks/chunk-MO2U7YRX.js +0 -11
- package/dist/bundle/chunks/openai-responses-QHWM3KPO.js +0 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/rules/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { readFileSync, realpathSync } from \"node:fs\";\nimport { isAbsolute, relative } from \"node:path\";\n\nimport type { ExtensionAPI } from \"../../types.ts\";\n\nimport { appendRuleActivation, registerRuleActivationRenderer } from \"../rule-activation/index.ts\";\nimport { registerSlashCommands } from \"./commands.ts\";\nimport { configFromEnvironment } from \"./config.ts\";\nimport { createEngine } from \"./rules/engine.ts\";\nimport { findRuleCandidates } from \"./rules/finder.ts\";\nimport { findProjectRoot } from \"./rules/project-root.ts\";\nimport { extractToolPaths } from \"./rules/tool-paths.ts\";\nimport type { PiRulesConfig } from \"./rules/types.ts\";\n\ntype PiRulesMode = PiRulesConfig[\"mode\"];\n\nconst MODE_VALUES = new Set<string>([\"static\", \"dynamic\", \"both\", \"off\"]);\nconst DYNAMIC_CONTEXT_SCOPE = \"live-context\";\n\nexport default function piRulesExtension(pi: ExtensionAPI): void {\n\tpi.registerFlag(\"pi-rules-disabled\", {\n\t\ttype: \"boolean\",\n\t\tdefault: false,\n\t\tdescription: \"Disable pi-rules hooks.\",\n\t});\n\tpi.registerFlag(\"pi-rules-mode\", {\n\t\ttype: \"string\",\n\t\tdefault: \"both\",\n\t\tdescription: \"Rule injection mode: static, dynamic, both, or off.\",\n\t});\n\tconst config = configFromEnvironment();\n\tconst envDisabled = config.disabled;\n\tconst engine = createEngine(config, {\n\t\tfindCandidates: findRuleCandidates,\n\t\treadFile: (path) => {\n\t\t\ttry {\n\t\t\t\treturn readFileSync(path, \"utf-8\");\n\t\t\t} catch {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t},\n\t\tfindProjectRoot,\n\t\textractToolPaths,\n\t});\n\tregisterSlashCommands(pi, engine);\n\tregisterRuleActivationRenderer(pi);\n\n\t/**\n\t * Absolute paths (and realpaths) of context files pi loaded natively into the system\n\t * prompt. Rebuilt on every before_agent_start. Dynamic discovery walks to the repository\n\t * root, so single-file rules (AGENTS.md/CLAUDE.md) from levels the agent has natively\n\t * loaded must be deduplicated in the tool_result path as well — otherwise each matching\n\t * read re-injects a context file that is already in the system prompt.\n\t */\n\tconst nativeContextPaths = new Set<string>();\n\n\tfunction syncConfigFromFlags(): void {\n\t\tconst disabled = pi.getFlag(\"pi-rules-disabled\");\n\t\tconst mode = pi.getFlag(\"pi-rules-mode\");\n\n\t\tif (typeof disabled === \"boolean\") {\n\t\t\tengine.config.disabled = disabled || envDisabled;\n\t\t}\n\t\tif (typeof mode === \"string\" && isPiRulesMode(mode)) {\n\t\t\tengine.config.mode = mode;\n\t\t}\n\t}\n\n\tpi.on(\"session_start\", async (event, ctx) => {\n\t\tsyncConfigFromFlags();\n\t\tengine.resetSession(ctx.cwd);\n\t\tif (engine.config.disabled) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tpi.appendEntry(\"pi-rules.scan\", { cwd: ctx.cwd, reason: event.reason });\n\t\treturn undefined;\n\t});\n\n\tpi.on(\"session_compact\", async (event, ctx) => {\n\t\t// Rejected compactions do not mutate session state; do not reset rules.\n\t\tif (!event.accepted) return undefined;\n\t\tengine.resetSession(ctx.cwd);\n\t\tpi.appendEntry(\"pi-rules.scan\", { cwd: ctx.cwd, reason: \"compact\" });\n\t\treturn undefined;\n\t});\n\n\tpi.on(\"before_agent_start\", async (event, ctx) => {\n\t\tsyncConfigFromFlags();\n\t\tif (engine.config.disabled || engine.config.mode === \"off\" || engine.config.mode === \"dynamic\") {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst loaded = engine.loadStaticRules(ctx.cwd);\n\t\tnativeContextPaths.clear();\n\t\tfor (const path of event.systemPromptOptions.contextFiles?.flatMap((contextFile) => pathKeys(contextFile.path)) ??\n\t\t\t[]) {\n\t\t\tnativeContextPaths.add(path);\n\t\t}\n\t\tfor (const rule of loaded.rules) {\n\t\t\tif (nativeContextPaths.has(rule.path) || nativeContextPaths.has(rule.realPath)) {\n\t\t\t\tengine.markStaticInjected(rule);\n\t\t\t}\n\t\t}\n\t\t// Deliberately NOT gated on isStaticInjected: the host re-emits this from the BASE prompt\n\t\t// every user prompt, so a prior turn's mark would drop the block from turn 2 onward. The\n\t\t// marks below serve only the dynamic tool_result path.\n\t\tconst rules = loaded.rules.filter(\n\t\t\t(rule) => !nativeContextPaths.has(rule.path) && !nativeContextPaths.has(rule.realPath),\n\t\t);\n\n\t\tif (rules.length === 0) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst block = engine.formatStatic(rules);\n\t\tfor (const rule of rules) {\n\t\t\tengine.markStaticInjected(rule);\n\t\t}\n\n\t\treturn { systemPrompt: event.systemPrompt + block };\n\t});\n\n\tpi.on(\"tool_result\", async (event, ctx) => {\n\t\tsyncConfigFromFlags();\n\t\tif (engine.config.disabled || engine.config.mode === \"off\" || engine.config.mode === \"static\" || event.isError) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst targetPaths = extractToolPaths(event, ctx.cwd);\n\t\tconst firstTargetPath = targetPaths[0];\n\t\tif (firstTargetPath === undefined) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst fingerprints = engine.fingerprintDynamicTargets(ctx.cwd, targetPaths);\n\t\tconst pendingFingerprints = fingerprints.filter((target) => !engine.isDynamicTargetFingerprintCurrent(target));\n\t\tif (pendingFingerprints.length === 0) {\n\t\t\tengine.commitDynamicTargetFingerprints(fingerprints);\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst loaded = engine.loadDynamicRules(\n\t\t\tctx.cwd,\n\t\t\tpendingFingerprints.map((target) => target.targetPath),\n\t\t);\n\t\tengine.commitDynamicTargetFingerprints(fingerprints);\n\t\tfor (const rule of loaded.rules) {\n\t\t\tif (nativeContextPaths.has(rule.path) || nativeContextPaths.has(rule.realPath)) {\n\t\t\t\tengine.markStaticInjected(rule);\n\t\t\t}\n\t\t}\n\t\t// DYNAMIC_CONTEXT_SCOPE already dedups every rule (single-file or glob) session-wide, which\n\t\t// subsumes upstream's per-session single-file set.\n\t\tconst rules = loaded.rules.filter(\n\t\t\t(rule) =>\n\t\t\t\t!nativeContextPaths.has(rule.path) &&\n\t\t\t\t!nativeContextPaths.has(rule.realPath) &&\n\t\t\t\t!engine.isStaticInjected(rule) &&\n\t\t\t\t!engine.isDynamicInjected(DYNAMIC_CONTEXT_SCOPE, rule),\n\t\t);\n\t\tif (rules.length === 0) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst firstPendingTarget = pendingFingerprints[0]?.targetPath ?? firstTargetPath;\n\t\tconst targetPath = displayPath(ctx.cwd, firstPendingTarget);\n\t\tconst block = engine.formatDynamic(rules, targetPath);\n\t\tfor (const rule of rules) {\n\t\t\tengine.markDynamicInjected(DYNAMIC_CONTEXT_SCOPE, rule);\n\t\t}\n\t\tappendRuleActivation(pi, {\n\t\t\tkind: \"project-rules\",\n\t\t\ttargetPath,\n\t\t\trules: rules.map((rule) => rule.relativePath),\n\t\t\ttoolCallId: event.toolCallId,\n\t\t});\n\n\t\treturn { content: [...event.content, { type: \"text\", text: block, audience: \"model\" }] };\n\t});\n}\n\nfunction isPiRulesMode(value: string): value is PiRulesMode {\n\treturn MODE_VALUES.has(value);\n}\n\nfunction pathKeys(filePath: string): string[] {\n\ttry {\n\t\treturn [filePath, realpathSync.native(filePath)];\n\t} catch {\n\t\treturn [filePath];\n\t}\n}\n\nfunction displayPath(cwd: string, filePath: string): string {\n\treturn isAbsolute(filePath) ? relative(cwd, filePath) : filePath;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/rules/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { readFileSync, realpathSync } from \"node:fs\";\nimport { isAbsolute, relative } from \"node:path\";\n\nimport type {\n\tBeforeAgentStartEvent,\n\tBeforeAgentStartEventResult,\n\tExtensionAPI,\n\tExtensionHandler,\n} from \"../../types.ts\";\n\nimport { appendRuleActivation, registerRuleActivationRenderer } from \"../rule-activation/index.ts\";\nimport { registerSlashCommands } from \"./commands.ts\";\nimport { configFromEnvironment } from \"./config.ts\";\nimport { createEngine } from \"./rules/engine.ts\";\nimport { findRuleCandidates } from \"./rules/finder.ts\";\nimport { findProjectRoot } from \"./rules/project-root.ts\";\nimport { extractToolPaths } from \"./rules/tool-paths.ts\";\nimport type { PiRulesConfig } from \"./rules/types.ts\";\n\ntype PiRulesMode = PiRulesConfig[\"mode\"];\n\nconst MODE_VALUES = new Set<string>([\"static\", \"dynamic\", \"both\", \"off\"]);\nconst DYNAMIC_CONTEXT_SCOPE = \"live-context\";\n\nexport default function piRulesExtension(pi: ExtensionAPI): void {\n\tpi.registerFlag(\"pi-rules-disabled\", {\n\t\ttype: \"boolean\",\n\t\tdefault: false,\n\t\tdescription: \"Disable pi-rules hooks.\",\n\t});\n\tpi.registerFlag(\"pi-rules-mode\", {\n\t\ttype: \"string\",\n\t\tdefault: \"both\",\n\t\tdescription: \"Rule injection mode: static, dynamic, both, or off.\",\n\t});\n\tconst config = configFromEnvironment();\n\tconst envDisabled = config.disabled;\n\tconst engine = createEngine(config, {\n\t\tfindCandidates: findRuleCandidates,\n\t\treadFile: (path) => {\n\t\t\ttry {\n\t\t\t\treturn readFileSync(path, \"utf-8\");\n\t\t\t} catch {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t},\n\t\tfindProjectRoot,\n\t\textractToolPaths,\n\t});\n\tregisterSlashCommands(pi, engine);\n\tregisterRuleActivationRenderer(pi);\n\n\t/**\n\t * Absolute paths (and realpaths) of context files pi loaded natively into the system\n\t * prompt. Rebuilt on every before_agent_start. Dynamic discovery walks to the repository\n\t * root, so single-file rules (AGENTS.md/CLAUDE.md) from levels the agent has natively\n\t * loaded must be deduplicated in the tool_result path as well — otherwise each matching\n\t * read re-injects a context file that is already in the system prompt.\n\t */\n\tconst nativeContextPaths = new Set<string>();\n\n\tfunction syncConfigFromFlags(): void {\n\t\tconst disabled = pi.getFlag(\"pi-rules-disabled\");\n\t\tconst mode = pi.getFlag(\"pi-rules-mode\");\n\n\t\tif (typeof disabled === \"boolean\") {\n\t\t\tengine.config.disabled = disabled || envDisabled;\n\t\t}\n\t\tif (typeof mode === \"string\" && isPiRulesMode(mode)) {\n\t\t\tengine.config.mode = mode;\n\t\t}\n\t}\n\n\tpi.on(\"session_start\", async (event, ctx) => {\n\t\tsyncConfigFromFlags();\n\t\tengine.resetSession(ctx.cwd);\n\t\tif (engine.config.disabled) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tpi.appendEntry(\"pi-rules.scan\", { cwd: ctx.cwd, reason: event.reason });\n\t\treturn undefined;\n\t});\n\n\tpi.on(\"session_compact\", async (event, ctx) => {\n\t\t// Rejected compactions do not mutate session state; do not reset rules.\n\t\tif (!event.accepted) return undefined;\n\t\tengine.resetSession(ctx.cwd);\n\t\tpi.appendEntry(\"pi-rules.scan\", { cwd: ctx.cwd, reason: \"compact\" });\n\t\treturn undefined;\n\t});\n\n\tconst onBeforeAgentStart: ExtensionHandler<BeforeAgentStartEvent, BeforeAgentStartEventResult> = async (\n\t\tevent,\n\t\tctx,\n\t) => {\n\t\tsyncConfigFromFlags();\n\t\tif (engine.config.disabled || engine.config.mode === \"off\" || engine.config.mode === \"dynamic\") {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst loaded = engine.loadStaticRules(ctx.cwd);\n\t\t// A preview composes the same block but leaves the injection marks the dynamic\n\t\t// tool_result path reads untouched: no turn follows it.\n\t\tconst commit = event.preview !== true;\n\t\tconst contextPaths = commit ? nativeContextPaths : new Set<string>();\n\t\tcontextPaths.clear();\n\t\tfor (const path of event.systemPromptOptions.contextFiles?.flatMap((contextFile) => pathKeys(contextFile.path)) ??\n\t\t\t[]) {\n\t\t\tcontextPaths.add(path);\n\t\t}\n\t\tfor (const rule of loaded.rules) {\n\t\t\tif (commit && (contextPaths.has(rule.path) || contextPaths.has(rule.realPath))) {\n\t\t\t\tengine.markStaticInjected(rule);\n\t\t\t}\n\t\t}\n\t\t// Deliberately NOT gated on isStaticInjected: the host re-emits this from the BASE prompt\n\t\t// every user prompt, so a prior turn's mark would drop the block from turn 2 onward. The\n\t\t// marks below serve only the dynamic tool_result path.\n\t\tconst rules = loaded.rules.filter((rule) => !contextPaths.has(rule.path) && !contextPaths.has(rule.realPath));\n\n\t\tif (rules.length === 0) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst block = engine.formatStatic(rules);\n\t\tif (commit) {\n\t\t\tfor (const rule of rules) {\n\t\t\t\tengine.markStaticInjected(rule);\n\t\t\t}\n\t\t}\n\n\t\treturn { systemPrompt: event.systemPrompt + block };\n\t};\n\tpi.on(\"before_agent_start\", onBeforeAgentStart, { previewSafe: true });\n\n\tpi.on(\"tool_result\", async (event, ctx) => {\n\t\tsyncConfigFromFlags();\n\t\tif (engine.config.disabled || engine.config.mode === \"off\" || engine.config.mode === \"static\" || event.isError) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst targetPaths = extractToolPaths(event, ctx.cwd);\n\t\tconst firstTargetPath = targetPaths[0];\n\t\tif (firstTargetPath === undefined) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst fingerprints = engine.fingerprintDynamicTargets(ctx.cwd, targetPaths);\n\t\tconst pendingFingerprints = fingerprints.filter((target) => !engine.isDynamicTargetFingerprintCurrent(target));\n\t\tif (pendingFingerprints.length === 0) {\n\t\t\tengine.commitDynamicTargetFingerprints(fingerprints);\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst loaded = engine.loadDynamicRules(\n\t\t\tctx.cwd,\n\t\t\tpendingFingerprints.map((target) => target.targetPath),\n\t\t);\n\t\tengine.commitDynamicTargetFingerprints(fingerprints);\n\t\tfor (const rule of loaded.rules) {\n\t\t\tif (nativeContextPaths.has(rule.path) || nativeContextPaths.has(rule.realPath)) {\n\t\t\t\tengine.markStaticInjected(rule);\n\t\t\t}\n\t\t}\n\t\t// DYNAMIC_CONTEXT_SCOPE already dedups every rule (single-file or glob) session-wide, which\n\t\t// subsumes upstream's per-session single-file set.\n\t\tconst rules = loaded.rules.filter(\n\t\t\t(rule) =>\n\t\t\t\t!nativeContextPaths.has(rule.path) &&\n\t\t\t\t!nativeContextPaths.has(rule.realPath) &&\n\t\t\t\t!engine.isStaticInjected(rule) &&\n\t\t\t\t!engine.isDynamicInjected(DYNAMIC_CONTEXT_SCOPE, rule),\n\t\t);\n\t\tif (rules.length === 0) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst firstPendingTarget = pendingFingerprints[0]?.targetPath ?? firstTargetPath;\n\t\tconst targetPath = displayPath(ctx.cwd, firstPendingTarget);\n\t\tconst block = engine.formatDynamic(rules, targetPath);\n\t\tfor (const rule of rules) {\n\t\t\tengine.markDynamicInjected(DYNAMIC_CONTEXT_SCOPE, rule);\n\t\t}\n\t\tappendRuleActivation(pi, {\n\t\t\tkind: \"project-rules\",\n\t\t\ttargetPath,\n\t\t\trules: rules.map((rule) => rule.relativePath),\n\t\t\ttoolCallId: event.toolCallId,\n\t\t});\n\n\t\treturn { content: [...event.content, { type: \"text\", text: block, audience: \"model\" }] };\n\t});\n}\n\nfunction isPiRulesMode(value: string): value is PiRulesMode {\n\treturn MODE_VALUES.has(value);\n}\n\nfunction pathKeys(filePath: string): string[] {\n\ttry {\n\t\treturn [filePath, realpathSync.native(filePath)];\n\t} catch {\n\t\treturn [filePath];\n\t}\n}\n\nfunction displayPath(cwd: string, filePath: string): string {\n\treturn isAbsolute(filePath) ? relative(cwd, filePath) : filePath;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extension.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/terminal/extension.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAoB,MAAM,gBAAgB,CAAC;AAkYrE,wBAAgB,yBAAyB,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"extension.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/terminal/extension.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAoB,MAAM,gBAAgB,CAAC;AAkYrE,wBAAgB,yBAAyB,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CA6JhE;eAEc,yBAAyB"}
|
|
@@ -453,7 +453,7 @@ export function registerTerminalExtension(pi) {
|
|
|
453
453
|
return {
|
|
454
454
|
systemPrompt: `${event.systemPrompt}\n${buildTerminalPromptSection({ evalOnly: isEvalOnlyRouting(pi) })}`,
|
|
455
455
|
};
|
|
456
|
-
});
|
|
456
|
+
}, { previewSafe: true });
|
|
457
457
|
pi.on("session_shutdown", async (event, ctx) => {
|
|
458
458
|
state.monitorNotifier?.dispose();
|
|
459
459
|
state.monitorNotifier = null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extension.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/terminal/extension.ts"],"names":[],"mappings":"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","sourcesContent":["import { isAbsolute, join } from \"node:path\";\nimport { getShellEnv } from \"../../../../utils/shell.ts\";\nimport { encodedSessionId } from \"../../../session-sidecar-store.ts\";\nimport { SettingsManager } from \"../../../settings-manager.ts\";\nimport type { ExtensionAPI, ExtensionContext } from \"../../types.ts\";\nimport { isAnthropicBashEnabled } from \"../anthropic-bash/index.ts\";\nimport { isEvalOnlyRouting } from \"../eval-only-routing.ts\";\nimport {\n\tTERMINAL_MONITOR_ENDED_EVENT,\n\tTERMINAL_MONITOR_STATE_EVENT,\n\tWAKE_SOURCE_STATE_EVENT,\n} from \"../monitor-state-event.ts\";\nimport { createRestartableCommandHandler } from \"./durable-command.ts\";\nimport { createCheckpointedFileRestoreHandler } from \"./durable-file.ts\";\nimport { acquireTerminalLease, releaseTerminalLease } from \"./manifest-lease.ts\";\nimport { MonitorNotifier } from \"./monitor-notify.ts\";\nimport { MONITOR_STATUS_KEY } from \"./monitor-status.ts\";\nimport { MonitorStatusTicker } from \"./monitor-status-ticker.ts\";\nimport { getTerminalNotificationDelivery, TerminalNotifier } from \"./notify.ts\";\nimport { buildTerminalPromptSection } from \"./prompt.ts\";\nimport {\n\ttype RestoreDigest,\n\ttype RestoreHandler,\n\ttype RestoreHandlers,\n\ttype RestoreOutcome,\n\treapplyPersistedMute,\n\trestoreTerminalState,\n} from \"./restore.ts\";\nimport type { TerminalRuntimeSession } from \"./runtime-session.ts\";\nimport {\n\tclaimParkedBundle,\n\tparkBundle,\n\ttype TerminalEventSinks,\n\tTerminalSessionBundle,\n\tteardownParkedBundle,\n} from \"./session-bundle.ts\";\nimport { loadTerminalSettings, type ResolvedTerminalSettings, TERMINAL_SETTINGS_DEFAULTS } from \"./settings.ts\";\nimport { TERMINAL_BASH_TOOL, TERMINAL_COMPANION_TOOLS } from \"./shared.ts\";\nimport { type ManifestMonitor, TerminalManifestWriter } from \"./terminal-manifest.ts\";\nimport { createPtyBashTool } from \"./tools/bash.ts\";\nimport { createBashInputTool } from \"./tools/bash-input.ts\";\nimport { createBashOutputTool } from \"./tools/bash-output.ts\";\nimport { createBashResizeTool } from \"./tools/bash-resize.ts\";\nimport type { TerminalToolContext } from \"./tools/context.ts\";\nimport { createKillBashTool } from \"./tools/kill-bash.ts\";\nimport { bindTerminalManifestWriter, createMonitorTool, unbindTerminalManifestWriter } from \"./tools/monitor.ts\";\n\ninterface TerminalExtensionState {\n\tbundle: TerminalSessionBundle | null;\n\tsettings: ResolvedTerminalSettings;\n\tnotifier: TerminalNotifier | null;\n\tmonitorNotifier: MonitorNotifier | null;\n\tstatusTicker: MonitorStatusTicker;\n\tctx: ExtensionContext | undefined;\n\tshellPath: string | undefined;\n\tsteppedAside: boolean;\n\tnoticeShown: boolean;\n\t/** Set only when this generation acquired the persistence lease (non-reload starts). */\n\tlease: { path: string; pid: number } | null;\n\t/** Manifest recorder; present only while this process owns the session's lease. */\n\tmanifestWriter: TerminalManifestWriter | null;\n\trecordedBackgroundIds: Set<string>;\n\tparked: boolean;\n}\n\n/** Tests and SDK callers may hand partial contexts without a session manager. */\nfunction sessionKeyOf(ctx: ExtensionContext | undefined): string | undefined {\n\treturn ctx?.sessionManager?.getSessionId?.();\n}\n\n/**\n * Per-session persistence dir for the terminal lease + manifest; undefined when the context\n * carries no durable session dir (SDK/in-memory sessions must not persist terminal state).\n */\nfunction terminalStateDir(ctx: ExtensionContext | undefined): string | undefined {\n\tconst sessionDir = ctx?.sessionManager?.getSessionDir?.();\n\tif (sessionDir === undefined || sessionDir.length === 0 || !isAbsolute(sessionDir)) return undefined;\n\treturn join(sessionDir, \"extensions\", \"terminal\");\n}\n\nfunction createBundle(state: TerminalExtensionState): TerminalSessionBundle {\n\treturn new TerminalSessionBundle({\n\t\tmaxSessions: state.settings.maxSessions,\n\t\tscrollback: state.settings.scrollback,\n\t});\n}\n\n/** Sinks read the live instance state at call time, so notifier swaps need no re-bind. */\nfunction bundleSinks(pi: ExtensionAPI, state: TerminalExtensionState): TerminalEventSinks {\n\treturn {\n\t\tonMonitorEvent: (event) => state.monitorNotifier?.notifyEvent(event),\n\t\tonMonitorEnded: (event) => {\n\t\t\tpi.events?.emit(TERMINAL_MONITOR_ENDED_EVENT, event);\n\t\t\tpi.rpc?.emit(TERMINAL_MONITOR_ENDED_EVENT, event);\n\t\t},\n\t\tonMonitorState: (snapshot, transition = true) => {\n\t\t\tif (!state.parked) state.statusTicker.sync(snapshot);\n\t\t\tconst payload = {\n\t\t\t\tactiveCount: snapshot.length,\n\t\t\t\tmonitors: snapshot.map((entry) => ({\n\t\t\t\t\tid: entry.id,\n\t\t\t\t\tdescription: entry.description,\n\t\t\t\t\tpaused: entry.paused,\n\t\t\t\t\tstartedAtMs: entry.startedAtMs,\n\t\t\t\t\tcommand: entry.command,\n\t\t\t\t\tfilter: entry.filter,\n\t\t\t\t\tpersistent: entry.persistent,\n\t\t\t\t\tdeadlineMs: entry.deadlineMs,\n\t\t\t\t\tfireCount: entry.fireCount,\n\t\t\t\t\tlastFiredAtMs: entry.lastFiredAtMs,\n\t\t\t\t})),\n\t\t\t};\n\t\t\tpi.events?.emit(TERMINAL_MONITOR_STATE_EVENT, payload);\n\t\t\tpi.rpc?.emit(TERMINAL_MONITOR_STATE_EVENT, payload);\n\t\t\tif (!transition) return;\n\t\t\tpi.events?.emit(WAKE_SOURCE_STATE_EVENT, {\n\t\t\t\tsource: \"terminal-monitors\",\n\t\t\t\tactiveCount: snapshot.length,\n\t\t\t\tmonitors: snapshot.map((entry) => ({\n\t\t\t\t\tid: entry.id,\n\t\t\t\t\tdescription: entry.description,\n\t\t\t\t\tstartedAtMs: entry.startedAtMs,\n\t\t\t\t})),\n\t\t\t});\n\t\t\tif (state.manifestWriter) void state.manifestWriter.observeMonitorState(snapshot);\n\t\t},\n\t\tonBackgroundState: (snapshot) => {\n\t\t\tpi.events?.emit(WAKE_SOURCE_STATE_EVENT, {\n\t\t\t\tsource: \"terminal-background-sessions\",\n\t\t\t\tactiveCount: snapshot.length,\n\t\t\t\titems: snapshot,\n\t\t\t});\n\t\t\tconst writer = state.manifestWriter;\n\t\t\tif (!writer) return;\n\t\t\tfor (const entry of snapshot) {\n\t\t\t\tif (state.recordedBackgroundIds.has(entry.id)) continue;\n\t\t\t\tstate.recordedBackgroundIds.add(entry.id);\n\t\t\t\tvoid writer.recordBackgroundStart(entry.id, entry.description ?? entry.id, entry.startedAtMs);\n\t\t\t}\n\t\t},\n\t\tonBackgroundExit: (id, runtime) => {\n\t\t\tstate.recordedBackgroundIds.delete(id);\n\t\t\tif (state.manifestWriter) void state.manifestWriter.recordBackgroundExit(id);\n\t\t\tstate.notifier?.notifyCompletion(id, runtime);\n\t\t},\n\t};\n}\n\nfunction buildToolContext(pi: ExtensionAPI, state: TerminalExtensionState): TerminalToolContext {\n\tconst requireBundle = (): TerminalSessionBundle => {\n\t\t// Lazily create a bundle so the tools work even when invoked directly (e.g. via the\n\t\t// SDK) before `session_start` initializes one. `session_start` replaces it with a\n\t\t// settings-configured bundle and tears down any earlier one.\n\t\tif (!state.bundle) {\n\t\t\tstate.bundle = createBundle(state);\n\t\t\tstate.bundle.monitors.setParked(state.parked);\n\t\t\tstate.bundle.bind(bundleSinks(pi, state));\n\t\t}\n\t\treturn state.bundle;\n\t};\n\treturn {\n\t\tget manager() {\n\t\t\treturn requireBundle().manager;\n\t\t},\n\t\tget cwd() {\n\t\t\treturn state.ctx?.cwd ?? process.cwd();\n\t\t},\n\t\tget shellPath() {\n\t\t\treturn state.shellPath;\n\t\t},\n\t\tget defaultCols() {\n\t\t\treturn state.settings.defaultCols;\n\t\t},\n\t\tget defaultRows() {\n\t\t\treturn state.settings.defaultRows;\n\t\t},\n\t\tget timeoutAction() {\n\t\t\treturn state.settings.timeoutAction;\n\t\t},\n\t\tget monitorRegistry() {\n\t\t\treturn requireBundle().monitors;\n\t\t},\n\t\tgetEnv: () => getShellEnv(),\n\t\tgetSessionContext: () => state.ctx,\n\t\t// Exit listeners registered before a reload reach the post-reload owner through the\n\t\t// shared bundle, so this must dispatch via the bundle, never the instance notifier.\n\t\tonBackgroundStart: (id: string, description: string, startedAtMs: number) => {\n\t\t\tstate.bundle?.notifyBackgroundStart(id, description, startedAtMs);\n\t\t},\n\t\tonBackgroundExit: (id: string, runtime: TerminalRuntimeSession) => {\n\t\t\tstate.bundle?.notifyBackgroundExit(id, runtime);\n\t\t},\n\t\tonMonitorRearmed: (id: string) => state.monitorNotifier?.rearm(id),\n\t\tonMonitorsResumed: (ids: readonly string[]) => state.monitorNotifier?.resume(ids),\n\t};\n}\n\nfunction shouldStepAside(ctx: ExtensionContext | undefined): boolean {\n\treturn isAnthropicBashEnabled() && ctx?.model?.api === \"anthropic-messages\";\n}\n\n/**\n * Keep the tool surface consistent with anthropic-bash. When native Anthropic bash is active,\n * the provider replaces the PTY `bash` function, but the companions stay active because `monitor`\n * creates its own PTY session and bash_output/input/resize/kill operate on that shared registry.\n * Otherwise the PTY `bash` + companions are (re)activated. Re-evaluated on session_start AND\n * model_select.\n */\nfunction syncToolset(pi: ExtensionAPI, state: TerminalExtensionState): void {\n\tconst stepAside = shouldStepAside(state.ctx);\n\tconst active = new Set(pi.getActiveTools());\n\tif (stepAside) {\n\t\tfor (const companion of TERMINAL_COMPANION_TOOLS) active.add(companion);\n\t\tif (!state.noticeShown) {\n\t\t\tstate.ctx?.ui.notify(\"native Anthropic bash active — monitor sessions remain available\", \"info\");\n\t\t\tstate.noticeShown = true;\n\t\t}\n\t} else {\n\t\tactive.add(TERMINAL_BASH_TOOL);\n\t\tfor (const companion of TERMINAL_COMPANION_TOOLS) active.add(companion);\n\t\tstate.noticeShown = false;\n\t}\n\tstate.steppedAside = stepAside;\n\tpi.setActiveTools([...active]);\n}\n\n/** Send one model-visible terminal reminder; suppressed by notify `off` and non-interactive modes. */\nfunction sendTerminalReminder(pi: ExtensionAPI, state: TerminalExtensionState, sentence: string): void {\n\tgetTerminalNotificationDelivery({\n\t\tsendMessage: (message, options) => pi.sendMessage(message, options),\n\t\tgetContext: () => state.ctx,\n\t\tgetMode: () => state.settings.notify,\n\t})?.send(`<system-reminder>${sentence}</system-reminder>`);\n}\n\nfunction clauseWithDescriptions(label: string, count: number, descriptions: readonly string[]): string {\n\treturn descriptions.length > 0 ? `${label} ${count} (${descriptions.join(\", \")})` : `${label} ${count}`;\n}\n\n/**\n * The ONE coalesced restore digest. Counts come from the restore orchestrator; descriptions\n * are attributed per manifest entry so the sentence stays a single message however many\n * monitors there are. Empty clauses are omitted; undefined when there is nothing to report.\n */\nfunction restoreDigestSentence(\n\tdigest: RestoreDigest,\n\trestoredDescriptions: readonly string[],\n\tlostDescriptions: readonly string[],\n): string | undefined {\n\tconst clauses: string[] = [];\n\tif (digest.restored > 0) clauses.push(clauseWithDescriptions(\"restored\", digest.restored, restoredDescriptions));\n\tif (digest.lost > 0) clauses.push(clauseWithDescriptions(\"lost\", digest.lost, lostDescriptions));\n\tif (digest.expired > 0) clauses.push(`expired ${digest.expired}`);\n\tif (digest.muted > 0) clauses.push(`${digest.muted} still muted`);\n\tif (clauses.length === 0) return undefined;\n\treturn `Terminal state after restart: ${clauses.join(\"; \")}.`;\n}\n\n/**\n * Non-reload startup: acquire the persistence lease, then restore from the manifest and\n * deliver EXACTLY ONE coalesced digest. A live foreign holder keeps its lease and gets one\n * attached-elsewhere reminder; an unreadable manifest fails closed with one notice and no\n * restore attempt. Only the lease owner records manifest state afterwards.\n */\nasync function adoptPersistedTerminalState(\n\tpi: ExtensionAPI,\n\tstate: TerminalExtensionState,\n\ttoolCtx: TerminalToolContext,\n\tbundle: TerminalSessionBundle,\n\tsessionKey: string,\n): Promise<void> {\n\tconst ctx = state.ctx;\n\tconst dir = terminalStateDir(ctx);\n\tif (dir === undefined || !ctx?.sessionManager) return;\n\tconst lease = await acquireTerminalLease({ dir, encodedSessionId: sessionKey });\n\tif (!lease.acquired) {\n\t\tsendTerminalReminder(\n\t\t\tpi,\n\t\t\tstate,\n\t\t\t`Terminal monitors for this session are attached in another live process (pid ${lease.holder.pid}); nothing was restored here.`,\n\t\t);\n\t\treturn;\n\t}\n\tstate.lease = { path: lease.path, pid: lease.pid };\n\tconst writer = new TerminalManifestWriter({ session: ctx.sessionManager });\n\tstate.manifestWriter = writer;\n\tstate.recordedBackgroundIds.clear();\n\tbindTerminalManifestWriter(sessionKey, writer);\n\n\t// The real durability handlers, built from what this restore site already owns: the live\n\t// registry/manager of the bundle created for this generation, plus the manifest writer.\n\t// Each monitor's REAL outcome is recorded so the digest attributes descriptions correctly.\n\tconst nowMs = Date.now();\n\tconst outcomesById = new Map<string, RestoreOutcome>();\n\tconst registry = bundle.monitors;\n\tconst record = (handler: RestoreHandler): RestoreHandler => {\n\t\treturn async (monitor: ManifestMonitor) => {\n\t\t\tconst result = await handler(monitor);\n\t\t\toutcomesById.set(monitor.monitorId, result.outcome);\n\t\t\t// Re-adopt every entry that is LIVE in this generation, so the next persist rewrites\n\t\t\t// the manifest with it instead of erasing it: `restored` and `muted` both describe a\n\t\t\t// live monitor (a mute only silences delivery). `lost`/`expired`/`attachedElsewhere`\n\t\t\t// are deliberately not adopted — nothing is running for them here.\n\t\t\tif (result.outcome === \"restored\" || result.outcome === \"muted\") {\n\t\t\t\twriter.adoptRestored(monitor);\n\t\t\t\t// Re-bind the persisted fire budget so a restart cannot hand the watch a fresh window.\n\t\t\t\tregistry.adoptFireWindow(monitor.monitorId, monitor.fireWindow);\n\t\t\t}\n\t\t\treturn result;\n\t\t};\n\t};\n\tconst restartableCommand = createRestartableCommandHandler({ ctx: toolCtx, registry });\n\t// The file handler re-binds the mon_ id to the fresh runtime id; capture that id here so a\n\t// persisted mute is re-applied by the runtime id the registry can actually resolve.\n\tlet freshFileRuntimeId: string | undefined;\n\tconst checkpointedFile = createCheckpointedFileRestoreHandler({\n\t\tregistry,\n\t\twriter,\n\t\tbindMonitorId: (monitorId, runtimeId) => {\n\t\t\tfreshFileRuntimeId = runtimeId;\n\t\t\tbundle.manager.bindMonitorId(monitorId, runtimeId);\n\t\t},\n\t\tnow: () => nowMs,\n\t});\n\tconst handlers: RestoreHandlers = {\n\t\t\"restartable-command\": record(restartableCommand),\n\t\t\"checkpointed-file\": record(async (monitor) => {\n\t\t\tfreshFileRuntimeId = undefined;\n\t\t\tconst result = await checkpointedFile(monitor);\n\t\t\tif (result.outcome !== \"restored\" || freshFileRuntimeId === undefined) return result;\n\t\t\treturn { ...result, outcome: reapplyPersistedMute(registry, monitor, freshFileRuntimeId) };\n\t\t}),\n\t};\n\tconst digest = await restoreTerminalState({ manifest: writer.store, handlers, now: () => nowMs });\n\n\tlet manifest = null;\n\tlet unreadable = digest.storeError;\n\tif (!unreadable) {\n\t\ttry {\n\t\t\tmanifest = await writer.store.read();\n\t\t} catch {\n\t\t\tunreadable = true;\n\t\t}\n\t}\n\tif (unreadable) {\n\t\tsendTerminalReminder(\n\t\t\tpi,\n\t\t\tstate,\n\t\t\t\"Terminal state after restart: the persisted terminal manifest is corrupt; nothing was restored here (fail closed).\",\n\t\t);\n\t\treturn;\n\t}\n\tif (manifest === null) return; // nothing was ever persisted for this session\n\n\tconst restoredDescriptions: string[] = [];\n\tconst lostDescriptions: string[] = [];\n\tfor (const monitor of manifest.monitors) {\n\t\t// Same boundary as the restore orchestrator: at the deadline the entry is expired.\n\t\tif (monitor.expiresAt !== null && monitor.expiresAt <= nowMs) continue;\n\t\tconst outcome = outcomesById.get(monitor.monitorId);\n\t\t// Only `restored` and `lost` carry descriptions; a muted restore is reported by its own\n\t\t// count clause, so naming it under either list would desync the clause counts.\n\t\tif (outcome === \"restored\") restoredDescriptions.push(monitor.description);\n\t\telse if (outcome === undefined || outcome === \"lost\") lostDescriptions.push(monitor.description);\n\t}\n\tfor (const background of manifest.backgroundSessions) lostDescriptions.push(background.command);\n\tconst sentence = restoreDigestSentence(digest, restoredDescriptions, lostDescriptions);\n\tif (sentence !== undefined) sendTerminalReminder(pi, state, sentence);\n}\n\n/** Detach the manifest recorder without writing (a reload keeps live state instead). */\nfunction detachManifestWriter(state: TerminalExtensionState, sessionKey: string | undefined): void {\n\tstate.manifestWriter = null;\n\tstate.recordedBackgroundIds.clear();\n\tif (sessionKey !== undefined) unbindTerminalManifestWriter(sessionKey);\n}\n\n/**\n * Shutdown view of the manifest: recordShutdown absorbs pending checkpoints, marks every\n * live monitor `suspended`, and persists in one write. Detach FIRST so bundle teardown's\n * empty-registry sync cannot touch the recorder afterwards.\n */\nasync function suspendAndFlushManifest(state: TerminalExtensionState, sessionKey: string): Promise<void> {\n\tconst writer = state.manifestWriter;\n\t// Final live-state sync: the shutdown write must carry each watch's burned fire window.\n\tif (writer && state.bundle) await writer.observeMonitorState(state.bundle.monitors.snapshot());\n\tdetachManifestWriter(state, sessionKey);\n\tif (writer) await writer.recordShutdown();\n}\n\nexport function registerTerminalExtension(pi: ExtensionAPI): void {\n\tconst state: TerminalExtensionState = {\n\t\tbundle: null,\n\t\tsettings: TERMINAL_SETTINGS_DEFAULTS,\n\t\tnotifier: null,\n\t\tmonitorNotifier: null,\n\t\tstatusTicker: new MonitorStatusTicker({\n\t\t\trender: (status) => {\n\t\t\t\tconst ctx = state.ctx;\n\t\t\t\tctx?.ui.setStatus(\n\t\t\t\t\tMONITOR_STATUS_KEY,\n\t\t\t\t\tstatus === undefined || ctx.mode !== \"tui\"\n\t\t\t\t\t\t? status\n\t\t\t\t\t\t: ctx.ui.theme.bg(\"selectedBg\", ctx.ui.theme.fg(\"text\", status)),\n\t\t\t\t);\n\t\t\t},\n\t\t}),\n\t\tctx: undefined,\n\t\tshellPath: undefined,\n\t\tsteppedAside: false,\n\t\tnoticeShown: false,\n\t\tlease: null,\n\t\tmanifestWriter: null,\n\t\trecordedBackgroundIds: new Set(),\n\t\tparked: false,\n\t};\n\tconst toolCtx = buildToolContext(pi, state);\n\n\tpi.registerTool(createPtyBashTool(toolCtx));\n\tpi.registerTool(createBashOutputTool(toolCtx));\n\tpi.registerTool(createBashInputTool(toolCtx));\n\tpi.registerTool(createBashResizeTool(toolCtx));\n\tpi.registerTool(createKillBashTool(toolCtx));\n\tpi.registerTool(createMonitorTool(toolCtx));\n\n\tpi.on(\"session_start\", async (event, ctx) => {\n\t\tstate.ctx = ctx;\n\t\tconst settingsManager = SettingsManager.create(ctx.cwd);\n\t\tstate.settings = loadTerminalSettings(settingsManager);\n\t\tstate.shellPath = settingsManager.getShellPath();\n\t\tstate.notifier = new TerminalNotifier({\n\t\t\tsendMessage: (message, options) => pi.sendMessage(message, options),\n\t\t\tgetContext: () => state.ctx,\n\t\t\tgetMode: () => state.settings.notify,\n\t\t});\n\t\tstate.monitorNotifier?.dispose();\n\t\tstate.monitorNotifier = new MonitorNotifier({\n\t\t\tsendMessage: (message, options) => pi.sendMessage(message, options),\n\t\t\tgetContext: () => state.ctx,\n\t\t\tgetMode: () => state.settings.notify,\n\t\t\tgetSettings: () => state.settings.monitor,\n\t\t\tpauseMonitors: (ids) => state.bundle?.monitors.pause(ids) ?? [],\n\t\t});\n\t\tconst sessionKey = sessionKeyOf(ctx);\n\t\tif (event.reason === \"reload\") {\n\t\t\tconst claimed = sessionKey === undefined ? undefined : claimParkedBundle(sessionKey);\n\t\t\tif (claimed) {\n\t\t\t\tawait state.bundle?.teardown();\n\t\t\t\tstate.bundle = claimed;\n\t\t\t}\n\t\t} else {\n\t\t\tif (sessionKey !== undefined) await teardownParkedBundle(sessionKey);\n\t\t\tawait state.bundle?.teardown();\n\t\t\tstate.bundle = createBundle(state);\n\t\t}\n\t\tstate.bundle ??= createBundle(state);\n\t\tstate.bundle.bind(bundleSinks(pi, state));\n\t\tif (event.reason === \"reload\") {\n\t\t\t// Park/claim and the lease stay untouched: the same pid keeps holding it. The\n\t\t\t// reload generation only rebinds the recorder so manifest coverage continues.\n\t\t\tif (sessionKey !== undefined && terminalStateDir(ctx) !== undefined) {\n\t\t\t\tconst writer = new TerminalManifestWriter({ session: ctx.sessionManager });\n\t\t\t\tstate.manifestWriter = writer;\n\t\t\t\tstate.recordedBackgroundIds.clear();\n\t\t\t\tbindTerminalManifestWriter(sessionKey, writer);\n\t\t\t}\n\t\t} else if (sessionKey !== undefined) {\n\t\t\tawait adoptPersistedTerminalState(pi, state, toolCtx, state.bundle, sessionKey);\n\t\t}\n\t\tsyncToolset(pi, state);\n\t});\n\n\tpi.on(\"session_parked\", () => {\n\t\tstate.parked = true;\n\t\tstate.bundle?.monitors.setParked(true);\n\t\tstate.statusTicker.stop();\n\t});\n\n\tpi.on(\"session_resumed\", () => {\n\t\tstate.parked = false;\n\t\tstate.bundle?.monitors.setParked(false);\n\t\tif (state.bundle) state.statusTicker.sync(state.bundle.monitors.snapshot());\n\t});\n\n\tpi.on(\"model_select\", async (event, ctx) => {\n\t\tstate.ctx = { ...ctx, model: event.model };\n\t\tsyncToolset(pi, state);\n\t});\n\n\tpi.on(\"input\", (event) => {\n\t\tif (event.source === \"extension\") return;\n\t\tstate.monitorNotifier?.noteActivity();\n\t\tconst resumed = state.bundle?.monitors.resume() ?? [];\n\t\tif (resumed.length > 0) state.monitorNotifier?.resume(resumed.map((monitor) => monitor.id));\n\t});\n\n\tpi.on(\"tool_call\", () => {\n\t\tstate.monitorNotifier?.noteActivity();\n\t});\n\n\tpi.on(\"before_agent_start\", async (event) => {\n\t\tif (state.steppedAside) return undefined;\n\t\treturn {\n\t\t\tsystemPrompt: `${event.systemPrompt}\\n${buildTerminalPromptSection({ evalOnly: isEvalOnlyRouting(pi) })}`,\n\t\t};\n\t});\n\n\tpi.on(\"session_shutdown\", async (event, ctx) => {\n\t\tstate.monitorNotifier?.dispose();\n\t\tstate.monitorNotifier = null;\n\t\tstate.notifier = null;\n\t\tstate.statusTicker.stop();\n\t\tconst sessionKey = sessionKeyOf(ctx) ?? sessionKeyOf(state.ctx);\n\t\tif (event.reason === \"reload\" && state.bundle && sessionKey !== undefined) {\n\t\t\t// Keep state.bundle referenced: exit listeners captured by this instance's tool\n\t\t\t// context still route through the shared bundle after the new owner claims it.\n\t\t\t// The lease is deliberately NOT released: the same pid keeps it across the reload.\n\t\t\tdetachManifestWriter(state, sessionKey);\n\t\t\tstate.bundle.park();\n\t\t\tawait parkBundle(sessionKey, state.bundle);\n\t\t\treturn;\n\t\t}\n\t\tif (sessionKey !== undefined) await suspendAndFlushManifest(state, sessionKey);\n\t\tconst lease = state.lease;\n\t\tstate.lease = null;\n\t\tif (lease !== null) {\n\t\t\tawait releaseTerminalLease(lease);\n\t\t} else if (sessionKey !== undefined) {\n\t\t\tconst dir = terminalStateDir(ctx) ?? terminalStateDir(state.ctx);\n\t\t\t// A reload generation inherits the pre-reload lease without re-acquiring it;\n\t\t\t// releasing by (path, own pid) removes exactly that file and no foreign holder's.\n\t\t\tif (dir !== undefined) {\n\t\t\t\tawait releaseTerminalLease({\n\t\t\t\t\tpath: join(dir, `${encodedSessionId(sessionKey)}.lease`),\n\t\t\t\t\tpid: process.pid,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\tconst bundle = state.bundle;\n\t\tstate.bundle = null;\n\t\tawait bundle?.teardown();\n\t\tif (sessionKey !== undefined) await teardownParkedBundle(sessionKey);\n\t});\n}\n\nexport default registerTerminalExtension;\n"]}
|
|
1
|
+
{"version":3,"file":"extension.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/terminal/extension.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AACrE,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAE/D,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AACpE,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EACN,4BAA4B,EAC5B,4BAA4B,EAC5B,uBAAuB,GACvB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,+BAA+B,EAAE,MAAM,sBAAsB,CAAC;AACvE,OAAO,EAAE,oCAAoC,EAAE,MAAM,mBAAmB,CAAC;AACzE,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AACjF,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,+BAA+B,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAChF,OAAO,EAAE,0BAA0B,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,EAKN,oBAAoB,EACpB,oBAAoB,GACpB,MAAM,cAAc,CAAC;AAEtB,OAAO,EACN,iBAAiB,EACjB,UAAU,EAEV,qBAAqB,EACrB,oBAAoB,GACpB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,oBAAoB,EAAiC,0BAA0B,EAAE,MAAM,eAAe,CAAC;AAChH,OAAO,EAAE,kBAAkB,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AAC3E,OAAO,EAAwB,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AACtF,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAE9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,0BAA0B,EAAE,iBAAiB,EAAE,4BAA4B,EAAE,MAAM,oBAAoB,CAAC;AAoBjH,iFAAiF;AACjF,SAAS,YAAY,CAAC,GAAiC;IACtD,OAAO,GAAG,EAAE,cAAc,EAAE,YAAY,EAAE,EAAE,CAAC;AAC9C,CAAC;AAED;;;GAGG;AACH,SAAS,gBAAgB,CAAC,GAAiC;IAC1D,MAAM,UAAU,GAAG,GAAG,EAAE,cAAc,EAAE,aAAa,EAAE,EAAE,CAAC;IAC1D,IAAI,UAAU,KAAK,SAAS,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC;QAAE,OAAO,SAAS,CAAC;IACrG,OAAO,IAAI,CAAC,UAAU,EAAE,YAAY,EAAE,UAAU,CAAC,CAAC;AACnD,CAAC;AAED,SAAS,YAAY,CAAC,KAA6B;IAClD,OAAO,IAAI,qBAAqB,CAAC;QAChC,WAAW,EAAE,KAAK,CAAC,QAAQ,CAAC,WAAW;QACvC,UAAU,EAAE,KAAK,CAAC,QAAQ,CAAC,UAAU;KACrC,CAAC,CAAC;AACJ,CAAC;AAED,0FAA0F;AAC1F,SAAS,WAAW,CAAC,EAAgB,EAAE,KAA6B;IACnE,OAAO;QACN,cAAc,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,eAAe,EAAE,WAAW,CAAC,KAAK,CAAC;QACpE,cAAc,EAAE,CAAC,KAAK,EAAE,EAAE;YACzB,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,4BAA4B,EAAE,KAAK,CAAC,CAAC;YACrD,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,4BAA4B,EAAE,KAAK,CAAC,CAAC;QACnD,CAAC;QACD,cAAc,EAAE,CAAC,QAAQ,EAAE,UAAU,GAAG,IAAI,EAAE,EAAE;YAC/C,IAAI,CAAC,KAAK,CAAC,MAAM;gBAAE,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACrD,MAAM,OAAO,GAAG;gBACf,WAAW,EAAE,QAAQ,CAAC,MAAM;gBAC5B,QAAQ,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;oBAClC,EAAE,EAAE,KAAK,CAAC,EAAE;oBACZ,WAAW,EAAE,KAAK,CAAC,WAAW;oBAC9B,MAAM,EAAE,KAAK,CAAC,MAAM;oBACpB,WAAW,EAAE,KAAK,CAAC,WAAW;oBAC9B,OAAO,EAAE,KAAK,CAAC,OAAO;oBACtB,MAAM,EAAE,KAAK,CAAC,MAAM;oBACpB,UAAU,EAAE,KAAK,CAAC,UAAU;oBAC5B,UAAU,EAAE,KAAK,CAAC,UAAU;oBAC5B,SAAS,EAAE,KAAK,CAAC,SAAS;oBAC1B,aAAa,EAAE,KAAK,CAAC,aAAa;iBAClC,CAAC,CAAC;aACH,CAAC;YACF,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,4BAA4B,EAAE,OAAO,CAAC,CAAC;YACvD,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,4BAA4B,EAAE,OAAO,CAAC,CAAC;YACpD,IAAI,CAAC,UAAU;gBAAE,OAAO;YACxB,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,uBAAuB,EAAE;gBACxC,MAAM,EAAE,mBAAmB;gBAC3B,WAAW,EAAE,QAAQ,CAAC,MAAM;gBAC5B,QAAQ,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;oBAClC,EAAE,EAAE,KAAK,CAAC,EAAE;oBACZ,WAAW,EAAE,KAAK,CAAC,WAAW;oBAC9B,WAAW,EAAE,KAAK,CAAC,WAAW;iBAC9B,CAAC,CAAC;aACH,CAAC,CAAC;YACH,IAAI,KAAK,CAAC,cAAc;gBAAE,KAAK,KAAK,CAAC,cAAc,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC;QACnF,CAAC;QACD,iBAAiB,EAAE,CAAC,QAAQ,EAAE,EAAE;YAC/B,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,uBAAuB,EAAE;gBACxC,MAAM,EAAE,8BAA8B;gBACtC,WAAW,EAAE,QAAQ,CAAC,MAAM;gBAC5B,KAAK,EAAE,QAAQ;aACf,CAAC,CAAC;YACH,MAAM,MAAM,GAAG,KAAK,CAAC,cAAc,CAAC;YACpC,IAAI,CAAC,MAAM;gBAAE,OAAO;YACpB,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;gBAC9B,IAAI,KAAK,CAAC,qBAAqB,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;oBAAE,SAAS;gBACxD,KAAK,CAAC,qBAAqB,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;gBAC1C,KAAK,MAAM,CAAC,qBAAqB,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,WAAW,IAAI,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC;YAC/F,CAAC;QACF,CAAC;QACD,gBAAgB,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,EAAE;YACjC,KAAK,CAAC,qBAAqB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACvC,IAAI,KAAK,CAAC,cAAc;gBAAE,KAAK,KAAK,CAAC,cAAc,CAAC,oBAAoB,CAAC,EAAE,CAAC,CAAC;YAC7E,KAAK,CAAC,QAAQ,EAAE,gBAAgB,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;QAC/C,CAAC;KACD,CAAC;AACH,CAAC;AAED,SAAS,gBAAgB,CAAC,EAAgB,EAAE,KAA6B;IACxE,MAAM,aAAa,GAAG,GAA0B,EAAE;QACjD,oFAAoF;QACpF,kFAAkF;QAClF,6DAA6D;QAC7D,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;YACnB,KAAK,CAAC,MAAM,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;YACnC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YAC9C,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC;QAC3C,CAAC;QACD,OAAO,KAAK,CAAC,MAAM,CAAC;IACrB,CAAC,CAAC;IACF,OAAO;QACN,IAAI,OAAO;YACV,OAAO,aAAa,EAAE,CAAC,OAAO,CAAC;QAChC,CAAC;QACD,IAAI,GAAG;YACN,OAAO,KAAK,CAAC,GAAG,EAAE,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;QACxC,CAAC;QACD,IAAI,SAAS;YACZ,OAAO,KAAK,CAAC,SAAS,CAAC;QACxB,CAAC;QACD,IAAI,WAAW;YACd,OAAO,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC;QACnC,CAAC;QACD,IAAI,WAAW;YACd,OAAO,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC;QACnC,CAAC;QACD,IAAI,aAAa;YAChB,OAAO,KAAK,CAAC,QAAQ,CAAC,aAAa,CAAC;QACrC,CAAC;QACD,IAAI,eAAe;YAClB,OAAO,aAAa,EAAE,CAAC,QAAQ,CAAC;QACjC,CAAC;QACD,MAAM,EAAE,GAAG,EAAE,CAAC,WAAW,EAAE;QAC3B,iBAAiB,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG;QAClC,oFAAoF;QACpF,oFAAoF;QACpF,iBAAiB,EAAE,CAAC,EAAU,EAAE,WAAmB,EAAE,WAAmB,EAAE,EAAE;YAC3E,KAAK,CAAC,MAAM,EAAE,qBAAqB,CAAC,EAAE,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC;QACnE,CAAC;QACD,gBAAgB,EAAE,CAAC,EAAU,EAAE,OAA+B,EAAE,EAAE;YACjE,KAAK,CAAC,MAAM,EAAE,oBAAoB,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;QACjD,CAAC;QACD,gBAAgB,EAAE,CAAC,EAAU,EAAE,EAAE,CAAC,KAAK,CAAC,eAAe,EAAE,KAAK,CAAC,EAAE,CAAC;QAClE,iBAAiB,EAAE,CAAC,GAAsB,EAAE,EAAE,CAAC,KAAK,CAAC,eAAe,EAAE,MAAM,CAAC,GAAG,CAAC;KACjF,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CAAC,GAAiC;IACzD,OAAO,sBAAsB,EAAE,IAAI,GAAG,EAAE,KAAK,EAAE,GAAG,KAAK,oBAAoB,CAAC;AAC7E,CAAC;AAED;;;;;;GAMG;AACH,SAAS,WAAW,CAAC,EAAgB,EAAE,KAA6B;IACnE,MAAM,SAAS,GAAG,eAAe,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC7C,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,EAAE,CAAC,cAAc,EAAE,CAAC,CAAC;IAC5C,IAAI,SAAS,EAAE,CAAC;QACf,KAAK,MAAM,SAAS,IAAI,wBAAwB;YAAE,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACxE,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;YACxB,KAAK,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,kEAAkE,EAAE,MAAM,CAAC,CAAC;YACjG,KAAK,CAAC,WAAW,GAAG,IAAI,CAAC;QAC1B,CAAC;IACF,CAAC;SAAM,CAAC;QACP,MAAM,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;QAC/B,KAAK,MAAM,SAAS,IAAI,wBAAwB;YAAE,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACxE,KAAK,CAAC,WAAW,GAAG,KAAK,CAAC;IAC3B,CAAC;IACD,KAAK,CAAC,YAAY,GAAG,SAAS,CAAC;IAC/B,EAAE,CAAC,cAAc,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC;AAChC,CAAC;AAED,sGAAsG;AACtG,SAAS,oBAAoB,CAAC,EAAgB,EAAE,KAA6B,EAAE,QAAgB;IAC9F,+BAA+B,CAAC;QAC/B,WAAW,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC;QACnE,UAAU,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG;QAC3B,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM;KACpC,CAAC,EAAE,IAAI,CAAC,oBAAoB,QAAQ,oBAAoB,CAAC,CAAC;AAC5D,CAAC;AAED,SAAS,sBAAsB,CAAC,KAAa,EAAE,KAAa,EAAE,YAA+B;IAC5F,OAAO,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,IAAI,KAAK,KAAK,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,IAAI,KAAK,EAAE,CAAC;AACzG,CAAC;AAED;;;;GAIG;AACH,SAAS,qBAAqB,CAC7B,MAAqB,EACrB,oBAAuC,EACvC,gBAAmC;IAEnC,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,IAAI,MAAM,CAAC,QAAQ,GAAG,CAAC;QAAE,OAAO,CAAC,IAAI,CAAC,sBAAsB,CAAC,UAAU,EAAE,MAAM,CAAC,QAAQ,EAAE,oBAAoB,CAAC,CAAC,CAAC;IACjH,IAAI,MAAM,CAAC,IAAI,GAAG,CAAC;QAAE,OAAO,CAAC,IAAI,CAAC,sBAAsB,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC,CAAC;IACjG,IAAI,MAAM,CAAC,OAAO,GAAG,CAAC;QAAE,OAAO,CAAC,IAAI,CAAC,WAAW,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;IAClE,IAAI,MAAM,CAAC,KAAK,GAAG,CAAC;QAAE,OAAO,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,KAAK,cAAc,CAAC,CAAC;IAClE,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAC3C,OAAO,iCAAiC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;AAC/D,CAAC;AAED;;;;;GAKG;AACH,KAAK,UAAU,2BAA2B,CACzC,EAAgB,EAChB,KAA6B,EAC7B,OAA4B,EAC5B,MAA6B,EAC7B,UAAkB;IAElB,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC;IACtB,MAAM,GAAG,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC;IAClC,IAAI,GAAG,KAAK,SAAS,IAAI,CAAC,GAAG,EAAE,cAAc;QAAE,OAAO;IACtD,MAAM,KAAK,GAAG,MAAM,oBAAoB,CAAC,EAAE,GAAG,EAAE,gBAAgB,EAAE,UAAU,EAAE,CAAC,CAAC;IAChF,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;QACrB,oBAAoB,CACnB,EAAE,EACF,KAAK,EACL,gFAAgF,KAAK,CAAC,MAAM,CAAC,GAAG,+BAA+B,CAC/H,CAAC;QACF,OAAO;IACR,CAAC;IACD,KAAK,CAAC,KAAK,GAAG,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC;IACnD,MAAM,MAAM,GAAG,IAAI,sBAAsB,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,cAAc,EAAE,CAAC,CAAC;IAC3E,KAAK,CAAC,cAAc,GAAG,MAAM,CAAC;IAC9B,KAAK,CAAC,qBAAqB,CAAC,KAAK,EAAE,CAAC;IACpC,0BAA0B,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IAE/C,yFAAyF;IACzF,wFAAwF;IACxF,2FAA2F;IAC3F,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACzB,MAAM,YAAY,GAAG,IAAI,GAAG,EAA0B,CAAC;IACvD,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;IACjC,MAAM,MAAM,GAAG,CAAC,OAAuB,EAAkB,EAAE;QAC1D,OAAO,KAAK,EAAE,OAAwB,EAAE,EAAE;YACzC,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;YACtC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;YACpD,qFAAqF;YACrF,qFAAqF;YACrF,qFAAqF;YACrF,mEAAmE;YACnE,IAAI,MAAM,CAAC,OAAO,KAAK,UAAU,IAAI,MAAM,CAAC,OAAO,KAAK,OAAO,EAAE,CAAC;gBACjE,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;gBAC9B,uFAAuF;gBACvF,QAAQ,CAAC,eAAe,CAAC,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;YACjE,CAAC;YACD,OAAO,MAAM,CAAC;QACf,CAAC,CAAC;IACH,CAAC,CAAC;IACF,MAAM,kBAAkB,GAAG,+BAA+B,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC;IACvF,2FAA2F;IAC3F,oFAAoF;IACpF,IAAI,kBAAsC,CAAC;IAC3C,MAAM,gBAAgB,GAAG,oCAAoC,CAAC;QAC7D,QAAQ;QACR,MAAM;QACN,aAAa,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,EAAE;YACvC,kBAAkB,GAAG,SAAS,CAAC;YAC/B,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QACpD,CAAC;QACD,GAAG,EAAE,GAAG,EAAE,CAAC,KAAK;KAChB,CAAC,CAAC;IACH,MAAM,QAAQ,GAAoB;QACjC,qBAAqB,EAAE,MAAM,CAAC,kBAAkB,CAAC;QACjD,mBAAmB,EAAE,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;YAC7C,kBAAkB,GAAG,SAAS,CAAC;YAC/B,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,OAAO,CAAC,CAAC;YAC/C,IAAI,MAAM,CAAC,OAAO,KAAK,UAAU,IAAI,kBAAkB,KAAK,SAAS;gBAAE,OAAO,MAAM,CAAC;YACrF,OAAO,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,oBAAoB,CAAC,QAAQ,EAAE,OAAO,EAAE,kBAAkB,CAAC,EAAE,CAAC;QAC5F,CAAC,CAAC;KACF,CAAC;IACF,MAAM,MAAM,GAAG,MAAM,oBAAoB,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC;IAElG,IAAI,QAAQ,GAAG,IAAI,CAAC;IACpB,IAAI,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;IACnC,IAAI,CAAC,UAAU,EAAE,CAAC;QACjB,IAAI,CAAC;YACJ,QAAQ,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QACtC,CAAC;QAAC,MAAM,CAAC;YACR,UAAU,GAAG,IAAI,CAAC;QACnB,CAAC;IACF,CAAC;IACD,IAAI,UAAU,EAAE,CAAC;QAChB,oBAAoB,CACnB,EAAE,EACF,KAAK,EACL,oHAAoH,CACpH,CAAC;QACF,OAAO;IACR,CAAC;IACD,IAAI,QAAQ,KAAK,IAAI;QAAE,OAAO,CAAC,8CAA8C;IAE7E,MAAM,oBAAoB,GAAa,EAAE,CAAC;IAC1C,MAAM,gBAAgB,GAAa,EAAE,CAAC;IACtC,KAAK,MAAM,OAAO,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC;QACzC,mFAAmF;QACnF,IAAI,OAAO,CAAC,SAAS,KAAK,IAAI,IAAI,OAAO,CAAC,SAAS,IAAI,KAAK;YAAE,SAAS;QACvE,MAAM,OAAO,GAAG,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QACpD,wFAAwF;QACxF,+EAA+E;QAC/E,IAAI,OAAO,KAAK,UAAU;YAAE,oBAAoB,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;aACtE,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,KAAK,MAAM;YAAE,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IAClG,CAAC;IACD,KAAK,MAAM,UAAU,IAAI,QAAQ,CAAC,kBAAkB;QAAE,gBAAgB,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IAChG,MAAM,QAAQ,GAAG,qBAAqB,CAAC,MAAM,EAAE,oBAAoB,EAAE,gBAAgB,CAAC,CAAC;IACvF,IAAI,QAAQ,KAAK,SAAS;QAAE,oBAAoB,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;AACvE,CAAC;AAED,wFAAwF;AACxF,SAAS,oBAAoB,CAAC,KAA6B,EAAE,UAA8B;IAC1F,KAAK,CAAC,cAAc,GAAG,IAAI,CAAC;IAC5B,KAAK,CAAC,qBAAqB,CAAC,KAAK,EAAE,CAAC;IACpC,IAAI,UAAU,KAAK,SAAS;QAAE,4BAA4B,CAAC,UAAU,CAAC,CAAC;AACxE,CAAC;AAED;;;;GAIG;AACH,KAAK,UAAU,uBAAuB,CAAC,KAA6B,EAAE,UAAkB;IACvF,MAAM,MAAM,GAAG,KAAK,CAAC,cAAc,CAAC;IACpC,wFAAwF;IACxF,IAAI,MAAM,IAAI,KAAK,CAAC,MAAM;QAAE,MAAM,MAAM,CAAC,mBAAmB,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC/F,oBAAoB,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;IACxC,IAAI,MAAM;QAAE,MAAM,MAAM,CAAC,cAAc,EAAE,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,EAAgB;IACzD,MAAM,KAAK,GAA2B;QACrC,MAAM,EAAE,IAAI;QACZ,QAAQ,EAAE,0BAA0B;QACpC,QAAQ,EAAE,IAAI;QACd,eAAe,EAAE,IAAI;QACrB,YAAY,EAAE,IAAI,mBAAmB,CAAC;YACrC,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE;gBAClB,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC;gBACtB,GAAG,EAAE,EAAE,CAAC,SAAS,CAChB,kBAAkB,EAClB,MAAM,KAAK,SAAS,IAAI,GAAG,CAAC,IAAI,KAAK,KAAK;oBACzC,CAAC,CAAC,MAAM;oBACR,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,EAAE,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CACjE,CAAC;YACH,CAAC;SACD,CAAC;QACF,GAAG,EAAE,SAAS;QACd,SAAS,EAAE,SAAS;QACpB,YAAY,EAAE,KAAK;QACnB,WAAW,EAAE,KAAK;QAClB,KAAK,EAAE,IAAI;QACX,cAAc,EAAE,IAAI;QACpB,qBAAqB,EAAE,IAAI,GAAG,EAAE;QAChC,MAAM,EAAE,KAAK;KACb,CAAC;IACF,MAAM,OAAO,GAAG,gBAAgB,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;IAE5C,EAAE,CAAC,YAAY,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAAC;IAC5C,EAAE,CAAC,YAAY,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC,CAAC;IAC/C,EAAE,CAAC,YAAY,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,CAAC;IAC9C,EAAE,CAAC,YAAY,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC,CAAC;IAC/C,EAAE,CAAC,YAAY,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC;IAC7C,EAAE,CAAC,YAAY,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAAC;IAE5C,EAAE,CAAC,EAAE,CAAC,eAAe,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QAC3C,KAAK,CAAC,GAAG,GAAG,GAAG,CAAC;QAChB,MAAM,eAAe,GAAG,eAAe,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACxD,KAAK,CAAC,QAAQ,GAAG,oBAAoB,CAAC,eAAe,CAAC,CAAC;QACvD,KAAK,CAAC,SAAS,GAAG,eAAe,CAAC,YAAY,EAAE,CAAC;QACjD,KAAK,CAAC,QAAQ,GAAG,IAAI,gBAAgB,CAAC;YACrC,WAAW,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC;YACnE,UAAU,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG;YAC3B,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM;SACpC,CAAC,CAAC;QACH,KAAK,CAAC,eAAe,EAAE,OAAO,EAAE,CAAC;QACjC,KAAK,CAAC,eAAe,GAAG,IAAI,eAAe,CAAC;YAC3C,WAAW,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC;YACnE,UAAU,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG;YAC3B,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM;YACpC,WAAW,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO;YACzC,aAAa,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE;SAC/D,CAAC,CAAC;QACH,MAAM,UAAU,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;QACrC,IAAI,KAAK,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC/B,MAAM,OAAO,GAAG,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC;YACrF,IAAI,OAAO,EAAE,CAAC;gBACb,MAAM,KAAK,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC;gBAC/B,KAAK,CAAC,MAAM,GAAG,OAAO,CAAC;YACxB,CAAC;QACF,CAAC;aAAM,CAAC;YACP,IAAI,UAAU,KAAK,SAAS;gBAAE,MAAM,oBAAoB,CAAC,UAAU,CAAC,CAAC;YACrE,MAAM,KAAK,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC;YAC/B,KAAK,CAAC,MAAM,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;QACpC,CAAC;QACD,KAAK,CAAC,MAAM,KAAK,YAAY,CAAC,KAAK,CAAC,CAAC;QACrC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC;QAC1C,IAAI,KAAK,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC/B,8EAA8E;YAC9E,8EAA8E;YAC9E,IAAI,UAAU,KAAK,SAAS,IAAI,gBAAgB,CAAC,GAAG,CAAC,KAAK,SAAS,EAAE,CAAC;gBACrE,MAAM,MAAM,GAAG,IAAI,sBAAsB,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,cAAc,EAAE,CAAC,CAAC;gBAC3E,KAAK,CAAC,cAAc,GAAG,MAAM,CAAC;gBAC9B,KAAK,CAAC,qBAAqB,CAAC,KAAK,EAAE,CAAC;gBACpC,0BAA0B,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;YAChD,CAAC;QACF,CAAC;aAAM,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;YACrC,MAAM,2BAA2B,CAAC,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;QACjF,CAAC;QACD,WAAW,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;IACxB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,EAAE,CAAC,gBAAgB,EAAE,GAAG,EAAE;QAC5B,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC;QACpB,KAAK,CAAC,MAAM,EAAE,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QACvC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;IAC3B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,EAAE,CAAC,iBAAiB,EAAE,GAAG,EAAE;QAC7B,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC;QACrB,KAAK,CAAC,MAAM,EAAE,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QACxC,IAAI,KAAK,CAAC,MAAM;YAAE,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC7E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,EAAE,CAAC,cAAc,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QAC1C,KAAK,CAAC,GAAG,GAAG,EAAE,GAAG,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC;QAC3C,WAAW,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;IACxB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;QACxB,IAAI,KAAK,CAAC,MAAM,KAAK,WAAW;YAAE,OAAO;QACzC,KAAK,CAAC,eAAe,EAAE,YAAY,EAAE,CAAC;QACtC,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC;QACtD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;YAAE,KAAK,CAAC,eAAe,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;IAC7F,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,EAAE,CAAC,WAAW,EAAE,GAAG,EAAE;QACvB,KAAK,CAAC,eAAe,EAAE,YAAY,EAAE,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,EAAE,CACJ,oBAAoB,EACpB,KAAK,EAAE,KAAK,EAAE,EAAE;QACf,IAAI,KAAK,CAAC,YAAY;YAAE,OAAO,SAAS,CAAC;QACzC,OAAO;YACN,YAAY,EAAE,GAAG,KAAK,CAAC,YAAY,KAAK,0BAA0B,CAAC,EAAE,QAAQ,EAAE,iBAAiB,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;SACzG,CAAC;IACH,CAAC,EACD,EAAE,WAAW,EAAE,IAAI,EAAE,CACrB,CAAC;IAEF,EAAE,CAAC,EAAE,CAAC,kBAAkB,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QAC9C,KAAK,CAAC,eAAe,EAAE,OAAO,EAAE,CAAC;QACjC,KAAK,CAAC,eAAe,GAAG,IAAI,CAAC;QAC7B,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC;QACtB,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;QAC1B,MAAM,UAAU,GAAG,YAAY,CAAC,GAAG,CAAC,IAAI,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAChE,IAAI,KAAK,CAAC,MAAM,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;YAC3E,gFAAgF;YAChF,+EAA+E;YAC/E,mFAAmF;YACnF,oBAAoB,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;YACxC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;YACpB,MAAM,UAAU,CAAC,UAAU,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;YAC3C,OAAO;QACR,CAAC;QACD,IAAI,UAAU,KAAK,SAAS;YAAE,MAAM,uBAAuB,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;QAC/E,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;QAC1B,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC;QACnB,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YACpB,MAAM,oBAAoB,CAAC,KAAK,CAAC,CAAC;QACnC,CAAC;aAAM,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;YACrC,MAAM,GAAG,GAAG,gBAAgB,CAAC,GAAG,CAAC,IAAI,gBAAgB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACjE,6EAA6E;YAC7E,kFAAkF;YAClF,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;gBACvB,MAAM,oBAAoB,CAAC;oBAC1B,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,gBAAgB,CAAC,UAAU,CAAC,QAAQ,CAAC;oBACxD,GAAG,EAAE,OAAO,CAAC,GAAG;iBAChB,CAAC,CAAC;YACJ,CAAC;QACF,CAAC;QACD,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;QAC5B,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC;QACpB,MAAM,MAAM,EAAE,QAAQ,EAAE,CAAC;QACzB,IAAI,UAAU,KAAK,SAAS;YAAE,MAAM,oBAAoB,CAAC,UAAU,CAAC,CAAC;IACtE,CAAC,CAAC,CAAC;AACJ,CAAC;AAED,eAAe,yBAAyB,CAAC","sourcesContent":["import { isAbsolute, join } from \"node:path\";\nimport { getShellEnv } from \"../../../../utils/shell.ts\";\nimport { encodedSessionId } from \"../../../session-sidecar-store.ts\";\nimport { SettingsManager } from \"../../../settings-manager.ts\";\nimport type { ExtensionAPI, ExtensionContext } from \"../../types.ts\";\nimport { isAnthropicBashEnabled } from \"../anthropic-bash/index.ts\";\nimport { isEvalOnlyRouting } from \"../eval-only-routing.ts\";\nimport {\n\tTERMINAL_MONITOR_ENDED_EVENT,\n\tTERMINAL_MONITOR_STATE_EVENT,\n\tWAKE_SOURCE_STATE_EVENT,\n} from \"../monitor-state-event.ts\";\nimport { createRestartableCommandHandler } from \"./durable-command.ts\";\nimport { createCheckpointedFileRestoreHandler } from \"./durable-file.ts\";\nimport { acquireTerminalLease, releaseTerminalLease } from \"./manifest-lease.ts\";\nimport { MonitorNotifier } from \"./monitor-notify.ts\";\nimport { MONITOR_STATUS_KEY } from \"./monitor-status.ts\";\nimport { MonitorStatusTicker } from \"./monitor-status-ticker.ts\";\nimport { getTerminalNotificationDelivery, TerminalNotifier } from \"./notify.ts\";\nimport { buildTerminalPromptSection } from \"./prompt.ts\";\nimport {\n\ttype RestoreDigest,\n\ttype RestoreHandler,\n\ttype RestoreHandlers,\n\ttype RestoreOutcome,\n\treapplyPersistedMute,\n\trestoreTerminalState,\n} from \"./restore.ts\";\nimport type { TerminalRuntimeSession } from \"./runtime-session.ts\";\nimport {\n\tclaimParkedBundle,\n\tparkBundle,\n\ttype TerminalEventSinks,\n\tTerminalSessionBundle,\n\tteardownParkedBundle,\n} from \"./session-bundle.ts\";\nimport { loadTerminalSettings, type ResolvedTerminalSettings, TERMINAL_SETTINGS_DEFAULTS } from \"./settings.ts\";\nimport { TERMINAL_BASH_TOOL, TERMINAL_COMPANION_TOOLS } from \"./shared.ts\";\nimport { type ManifestMonitor, TerminalManifestWriter } from \"./terminal-manifest.ts\";\nimport { createPtyBashTool } from \"./tools/bash.ts\";\nimport { createBashInputTool } from \"./tools/bash-input.ts\";\nimport { createBashOutputTool } from \"./tools/bash-output.ts\";\nimport { createBashResizeTool } from \"./tools/bash-resize.ts\";\nimport type { TerminalToolContext } from \"./tools/context.ts\";\nimport { createKillBashTool } from \"./tools/kill-bash.ts\";\nimport { bindTerminalManifestWriter, createMonitorTool, unbindTerminalManifestWriter } from \"./tools/monitor.ts\";\n\ninterface TerminalExtensionState {\n\tbundle: TerminalSessionBundle | null;\n\tsettings: ResolvedTerminalSettings;\n\tnotifier: TerminalNotifier | null;\n\tmonitorNotifier: MonitorNotifier | null;\n\tstatusTicker: MonitorStatusTicker;\n\tctx: ExtensionContext | undefined;\n\tshellPath: string | undefined;\n\tsteppedAside: boolean;\n\tnoticeShown: boolean;\n\t/** Set only when this generation acquired the persistence lease (non-reload starts). */\n\tlease: { path: string; pid: number } | null;\n\t/** Manifest recorder; present only while this process owns the session's lease. */\n\tmanifestWriter: TerminalManifestWriter | null;\n\trecordedBackgroundIds: Set<string>;\n\tparked: boolean;\n}\n\n/** Tests and SDK callers may hand partial contexts without a session manager. */\nfunction sessionKeyOf(ctx: ExtensionContext | undefined): string | undefined {\n\treturn ctx?.sessionManager?.getSessionId?.();\n}\n\n/**\n * Per-session persistence dir for the terminal lease + manifest; undefined when the context\n * carries no durable session dir (SDK/in-memory sessions must not persist terminal state).\n */\nfunction terminalStateDir(ctx: ExtensionContext | undefined): string | undefined {\n\tconst sessionDir = ctx?.sessionManager?.getSessionDir?.();\n\tif (sessionDir === undefined || sessionDir.length === 0 || !isAbsolute(sessionDir)) return undefined;\n\treturn join(sessionDir, \"extensions\", \"terminal\");\n}\n\nfunction createBundle(state: TerminalExtensionState): TerminalSessionBundle {\n\treturn new TerminalSessionBundle({\n\t\tmaxSessions: state.settings.maxSessions,\n\t\tscrollback: state.settings.scrollback,\n\t});\n}\n\n/** Sinks read the live instance state at call time, so notifier swaps need no re-bind. */\nfunction bundleSinks(pi: ExtensionAPI, state: TerminalExtensionState): TerminalEventSinks {\n\treturn {\n\t\tonMonitorEvent: (event) => state.monitorNotifier?.notifyEvent(event),\n\t\tonMonitorEnded: (event) => {\n\t\t\tpi.events?.emit(TERMINAL_MONITOR_ENDED_EVENT, event);\n\t\t\tpi.rpc?.emit(TERMINAL_MONITOR_ENDED_EVENT, event);\n\t\t},\n\t\tonMonitorState: (snapshot, transition = true) => {\n\t\t\tif (!state.parked) state.statusTicker.sync(snapshot);\n\t\t\tconst payload = {\n\t\t\t\tactiveCount: snapshot.length,\n\t\t\t\tmonitors: snapshot.map((entry) => ({\n\t\t\t\t\tid: entry.id,\n\t\t\t\t\tdescription: entry.description,\n\t\t\t\t\tpaused: entry.paused,\n\t\t\t\t\tstartedAtMs: entry.startedAtMs,\n\t\t\t\t\tcommand: entry.command,\n\t\t\t\t\tfilter: entry.filter,\n\t\t\t\t\tpersistent: entry.persistent,\n\t\t\t\t\tdeadlineMs: entry.deadlineMs,\n\t\t\t\t\tfireCount: entry.fireCount,\n\t\t\t\t\tlastFiredAtMs: entry.lastFiredAtMs,\n\t\t\t\t})),\n\t\t\t};\n\t\t\tpi.events?.emit(TERMINAL_MONITOR_STATE_EVENT, payload);\n\t\t\tpi.rpc?.emit(TERMINAL_MONITOR_STATE_EVENT, payload);\n\t\t\tif (!transition) return;\n\t\t\tpi.events?.emit(WAKE_SOURCE_STATE_EVENT, {\n\t\t\t\tsource: \"terminal-monitors\",\n\t\t\t\tactiveCount: snapshot.length,\n\t\t\t\tmonitors: snapshot.map((entry) => ({\n\t\t\t\t\tid: entry.id,\n\t\t\t\t\tdescription: entry.description,\n\t\t\t\t\tstartedAtMs: entry.startedAtMs,\n\t\t\t\t})),\n\t\t\t});\n\t\t\tif (state.manifestWriter) void state.manifestWriter.observeMonitorState(snapshot);\n\t\t},\n\t\tonBackgroundState: (snapshot) => {\n\t\t\tpi.events?.emit(WAKE_SOURCE_STATE_EVENT, {\n\t\t\t\tsource: \"terminal-background-sessions\",\n\t\t\t\tactiveCount: snapshot.length,\n\t\t\t\titems: snapshot,\n\t\t\t});\n\t\t\tconst writer = state.manifestWriter;\n\t\t\tif (!writer) return;\n\t\t\tfor (const entry of snapshot) {\n\t\t\t\tif (state.recordedBackgroundIds.has(entry.id)) continue;\n\t\t\t\tstate.recordedBackgroundIds.add(entry.id);\n\t\t\t\tvoid writer.recordBackgroundStart(entry.id, entry.description ?? entry.id, entry.startedAtMs);\n\t\t\t}\n\t\t},\n\t\tonBackgroundExit: (id, runtime) => {\n\t\t\tstate.recordedBackgroundIds.delete(id);\n\t\t\tif (state.manifestWriter) void state.manifestWriter.recordBackgroundExit(id);\n\t\t\tstate.notifier?.notifyCompletion(id, runtime);\n\t\t},\n\t};\n}\n\nfunction buildToolContext(pi: ExtensionAPI, state: TerminalExtensionState): TerminalToolContext {\n\tconst requireBundle = (): TerminalSessionBundle => {\n\t\t// Lazily create a bundle so the tools work even when invoked directly (e.g. via the\n\t\t// SDK) before `session_start` initializes one. `session_start` replaces it with a\n\t\t// settings-configured bundle and tears down any earlier one.\n\t\tif (!state.bundle) {\n\t\t\tstate.bundle = createBundle(state);\n\t\t\tstate.bundle.monitors.setParked(state.parked);\n\t\t\tstate.bundle.bind(bundleSinks(pi, state));\n\t\t}\n\t\treturn state.bundle;\n\t};\n\treturn {\n\t\tget manager() {\n\t\t\treturn requireBundle().manager;\n\t\t},\n\t\tget cwd() {\n\t\t\treturn state.ctx?.cwd ?? process.cwd();\n\t\t},\n\t\tget shellPath() {\n\t\t\treturn state.shellPath;\n\t\t},\n\t\tget defaultCols() {\n\t\t\treturn state.settings.defaultCols;\n\t\t},\n\t\tget defaultRows() {\n\t\t\treturn state.settings.defaultRows;\n\t\t},\n\t\tget timeoutAction() {\n\t\t\treturn state.settings.timeoutAction;\n\t\t},\n\t\tget monitorRegistry() {\n\t\t\treturn requireBundle().monitors;\n\t\t},\n\t\tgetEnv: () => getShellEnv(),\n\t\tgetSessionContext: () => state.ctx,\n\t\t// Exit listeners registered before a reload reach the post-reload owner through the\n\t\t// shared bundle, so this must dispatch via the bundle, never the instance notifier.\n\t\tonBackgroundStart: (id: string, description: string, startedAtMs: number) => {\n\t\t\tstate.bundle?.notifyBackgroundStart(id, description, startedAtMs);\n\t\t},\n\t\tonBackgroundExit: (id: string, runtime: TerminalRuntimeSession) => {\n\t\t\tstate.bundle?.notifyBackgroundExit(id, runtime);\n\t\t},\n\t\tonMonitorRearmed: (id: string) => state.monitorNotifier?.rearm(id),\n\t\tonMonitorsResumed: (ids: readonly string[]) => state.monitorNotifier?.resume(ids),\n\t};\n}\n\nfunction shouldStepAside(ctx: ExtensionContext | undefined): boolean {\n\treturn isAnthropicBashEnabled() && ctx?.model?.api === \"anthropic-messages\";\n}\n\n/**\n * Keep the tool surface consistent with anthropic-bash. When native Anthropic bash is active,\n * the provider replaces the PTY `bash` function, but the companions stay active because `monitor`\n * creates its own PTY session and bash_output/input/resize/kill operate on that shared registry.\n * Otherwise the PTY `bash` + companions are (re)activated. Re-evaluated on session_start AND\n * model_select.\n */\nfunction syncToolset(pi: ExtensionAPI, state: TerminalExtensionState): void {\n\tconst stepAside = shouldStepAside(state.ctx);\n\tconst active = new Set(pi.getActiveTools());\n\tif (stepAside) {\n\t\tfor (const companion of TERMINAL_COMPANION_TOOLS) active.add(companion);\n\t\tif (!state.noticeShown) {\n\t\t\tstate.ctx?.ui.notify(\"native Anthropic bash active — monitor sessions remain available\", \"info\");\n\t\t\tstate.noticeShown = true;\n\t\t}\n\t} else {\n\t\tactive.add(TERMINAL_BASH_TOOL);\n\t\tfor (const companion of TERMINAL_COMPANION_TOOLS) active.add(companion);\n\t\tstate.noticeShown = false;\n\t}\n\tstate.steppedAside = stepAside;\n\tpi.setActiveTools([...active]);\n}\n\n/** Send one model-visible terminal reminder; suppressed by notify `off` and non-interactive modes. */\nfunction sendTerminalReminder(pi: ExtensionAPI, state: TerminalExtensionState, sentence: string): void {\n\tgetTerminalNotificationDelivery({\n\t\tsendMessage: (message, options) => pi.sendMessage(message, options),\n\t\tgetContext: () => state.ctx,\n\t\tgetMode: () => state.settings.notify,\n\t})?.send(`<system-reminder>${sentence}</system-reminder>`);\n}\n\nfunction clauseWithDescriptions(label: string, count: number, descriptions: readonly string[]): string {\n\treturn descriptions.length > 0 ? `${label} ${count} (${descriptions.join(\", \")})` : `${label} ${count}`;\n}\n\n/**\n * The ONE coalesced restore digest. Counts come from the restore orchestrator; descriptions\n * are attributed per manifest entry so the sentence stays a single message however many\n * monitors there are. Empty clauses are omitted; undefined when there is nothing to report.\n */\nfunction restoreDigestSentence(\n\tdigest: RestoreDigest,\n\trestoredDescriptions: readonly string[],\n\tlostDescriptions: readonly string[],\n): string | undefined {\n\tconst clauses: string[] = [];\n\tif (digest.restored > 0) clauses.push(clauseWithDescriptions(\"restored\", digest.restored, restoredDescriptions));\n\tif (digest.lost > 0) clauses.push(clauseWithDescriptions(\"lost\", digest.lost, lostDescriptions));\n\tif (digest.expired > 0) clauses.push(`expired ${digest.expired}`);\n\tif (digest.muted > 0) clauses.push(`${digest.muted} still muted`);\n\tif (clauses.length === 0) return undefined;\n\treturn `Terminal state after restart: ${clauses.join(\"; \")}.`;\n}\n\n/**\n * Non-reload startup: acquire the persistence lease, then restore from the manifest and\n * deliver EXACTLY ONE coalesced digest. A live foreign holder keeps its lease and gets one\n * attached-elsewhere reminder; an unreadable manifest fails closed with one notice and no\n * restore attempt. Only the lease owner records manifest state afterwards.\n */\nasync function adoptPersistedTerminalState(\n\tpi: ExtensionAPI,\n\tstate: TerminalExtensionState,\n\ttoolCtx: TerminalToolContext,\n\tbundle: TerminalSessionBundle,\n\tsessionKey: string,\n): Promise<void> {\n\tconst ctx = state.ctx;\n\tconst dir = terminalStateDir(ctx);\n\tif (dir === undefined || !ctx?.sessionManager) return;\n\tconst lease = await acquireTerminalLease({ dir, encodedSessionId: sessionKey });\n\tif (!lease.acquired) {\n\t\tsendTerminalReminder(\n\t\t\tpi,\n\t\t\tstate,\n\t\t\t`Terminal monitors for this session are attached in another live process (pid ${lease.holder.pid}); nothing was restored here.`,\n\t\t);\n\t\treturn;\n\t}\n\tstate.lease = { path: lease.path, pid: lease.pid };\n\tconst writer = new TerminalManifestWriter({ session: ctx.sessionManager });\n\tstate.manifestWriter = writer;\n\tstate.recordedBackgroundIds.clear();\n\tbindTerminalManifestWriter(sessionKey, writer);\n\n\t// The real durability handlers, built from what this restore site already owns: the live\n\t// registry/manager of the bundle created for this generation, plus the manifest writer.\n\t// Each monitor's REAL outcome is recorded so the digest attributes descriptions correctly.\n\tconst nowMs = Date.now();\n\tconst outcomesById = new Map<string, RestoreOutcome>();\n\tconst registry = bundle.monitors;\n\tconst record = (handler: RestoreHandler): RestoreHandler => {\n\t\treturn async (monitor: ManifestMonitor) => {\n\t\t\tconst result = await handler(monitor);\n\t\t\toutcomesById.set(monitor.monitorId, result.outcome);\n\t\t\t// Re-adopt every entry that is LIVE in this generation, so the next persist rewrites\n\t\t\t// the manifest with it instead of erasing it: `restored` and `muted` both describe a\n\t\t\t// live monitor (a mute only silences delivery). `lost`/`expired`/`attachedElsewhere`\n\t\t\t// are deliberately not adopted — nothing is running for them here.\n\t\t\tif (result.outcome === \"restored\" || result.outcome === \"muted\") {\n\t\t\t\twriter.adoptRestored(monitor);\n\t\t\t\t// Re-bind the persisted fire budget so a restart cannot hand the watch a fresh window.\n\t\t\t\tregistry.adoptFireWindow(monitor.monitorId, monitor.fireWindow);\n\t\t\t}\n\t\t\treturn result;\n\t\t};\n\t};\n\tconst restartableCommand = createRestartableCommandHandler({ ctx: toolCtx, registry });\n\t// The file handler re-binds the mon_ id to the fresh runtime id; capture that id here so a\n\t// persisted mute is re-applied by the runtime id the registry can actually resolve.\n\tlet freshFileRuntimeId: string | undefined;\n\tconst checkpointedFile = createCheckpointedFileRestoreHandler({\n\t\tregistry,\n\t\twriter,\n\t\tbindMonitorId: (monitorId, runtimeId) => {\n\t\t\tfreshFileRuntimeId = runtimeId;\n\t\t\tbundle.manager.bindMonitorId(monitorId, runtimeId);\n\t\t},\n\t\tnow: () => nowMs,\n\t});\n\tconst handlers: RestoreHandlers = {\n\t\t\"restartable-command\": record(restartableCommand),\n\t\t\"checkpointed-file\": record(async (monitor) => {\n\t\t\tfreshFileRuntimeId = undefined;\n\t\t\tconst result = await checkpointedFile(monitor);\n\t\t\tif (result.outcome !== \"restored\" || freshFileRuntimeId === undefined) return result;\n\t\t\treturn { ...result, outcome: reapplyPersistedMute(registry, monitor, freshFileRuntimeId) };\n\t\t}),\n\t};\n\tconst digest = await restoreTerminalState({ manifest: writer.store, handlers, now: () => nowMs });\n\n\tlet manifest = null;\n\tlet unreadable = digest.storeError;\n\tif (!unreadable) {\n\t\ttry {\n\t\t\tmanifest = await writer.store.read();\n\t\t} catch {\n\t\t\tunreadable = true;\n\t\t}\n\t}\n\tif (unreadable) {\n\t\tsendTerminalReminder(\n\t\t\tpi,\n\t\t\tstate,\n\t\t\t\"Terminal state after restart: the persisted terminal manifest is corrupt; nothing was restored here (fail closed).\",\n\t\t);\n\t\treturn;\n\t}\n\tif (manifest === null) return; // nothing was ever persisted for this session\n\n\tconst restoredDescriptions: string[] = [];\n\tconst lostDescriptions: string[] = [];\n\tfor (const monitor of manifest.monitors) {\n\t\t// Same boundary as the restore orchestrator: at the deadline the entry is expired.\n\t\tif (monitor.expiresAt !== null && monitor.expiresAt <= nowMs) continue;\n\t\tconst outcome = outcomesById.get(monitor.monitorId);\n\t\t// Only `restored` and `lost` carry descriptions; a muted restore is reported by its own\n\t\t// count clause, so naming it under either list would desync the clause counts.\n\t\tif (outcome === \"restored\") restoredDescriptions.push(monitor.description);\n\t\telse if (outcome === undefined || outcome === \"lost\") lostDescriptions.push(monitor.description);\n\t}\n\tfor (const background of manifest.backgroundSessions) lostDescriptions.push(background.command);\n\tconst sentence = restoreDigestSentence(digest, restoredDescriptions, lostDescriptions);\n\tif (sentence !== undefined) sendTerminalReminder(pi, state, sentence);\n}\n\n/** Detach the manifest recorder without writing (a reload keeps live state instead). */\nfunction detachManifestWriter(state: TerminalExtensionState, sessionKey: string | undefined): void {\n\tstate.manifestWriter = null;\n\tstate.recordedBackgroundIds.clear();\n\tif (sessionKey !== undefined) unbindTerminalManifestWriter(sessionKey);\n}\n\n/**\n * Shutdown view of the manifest: recordShutdown absorbs pending checkpoints, marks every\n * live monitor `suspended`, and persists in one write. Detach FIRST so bundle teardown's\n * empty-registry sync cannot touch the recorder afterwards.\n */\nasync function suspendAndFlushManifest(state: TerminalExtensionState, sessionKey: string): Promise<void> {\n\tconst writer = state.manifestWriter;\n\t// Final live-state sync: the shutdown write must carry each watch's burned fire window.\n\tif (writer && state.bundle) await writer.observeMonitorState(state.bundle.monitors.snapshot());\n\tdetachManifestWriter(state, sessionKey);\n\tif (writer) await writer.recordShutdown();\n}\n\nexport function registerTerminalExtension(pi: ExtensionAPI): void {\n\tconst state: TerminalExtensionState = {\n\t\tbundle: null,\n\t\tsettings: TERMINAL_SETTINGS_DEFAULTS,\n\t\tnotifier: null,\n\t\tmonitorNotifier: null,\n\t\tstatusTicker: new MonitorStatusTicker({\n\t\t\trender: (status) => {\n\t\t\t\tconst ctx = state.ctx;\n\t\t\t\tctx?.ui.setStatus(\n\t\t\t\t\tMONITOR_STATUS_KEY,\n\t\t\t\t\tstatus === undefined || ctx.mode !== \"tui\"\n\t\t\t\t\t\t? status\n\t\t\t\t\t\t: ctx.ui.theme.bg(\"selectedBg\", ctx.ui.theme.fg(\"text\", status)),\n\t\t\t\t);\n\t\t\t},\n\t\t}),\n\t\tctx: undefined,\n\t\tshellPath: undefined,\n\t\tsteppedAside: false,\n\t\tnoticeShown: false,\n\t\tlease: null,\n\t\tmanifestWriter: null,\n\t\trecordedBackgroundIds: new Set(),\n\t\tparked: false,\n\t};\n\tconst toolCtx = buildToolContext(pi, state);\n\n\tpi.registerTool(createPtyBashTool(toolCtx));\n\tpi.registerTool(createBashOutputTool(toolCtx));\n\tpi.registerTool(createBashInputTool(toolCtx));\n\tpi.registerTool(createBashResizeTool(toolCtx));\n\tpi.registerTool(createKillBashTool(toolCtx));\n\tpi.registerTool(createMonitorTool(toolCtx));\n\n\tpi.on(\"session_start\", async (event, ctx) => {\n\t\tstate.ctx = ctx;\n\t\tconst settingsManager = SettingsManager.create(ctx.cwd);\n\t\tstate.settings = loadTerminalSettings(settingsManager);\n\t\tstate.shellPath = settingsManager.getShellPath();\n\t\tstate.notifier = new TerminalNotifier({\n\t\t\tsendMessage: (message, options) => pi.sendMessage(message, options),\n\t\t\tgetContext: () => state.ctx,\n\t\t\tgetMode: () => state.settings.notify,\n\t\t});\n\t\tstate.monitorNotifier?.dispose();\n\t\tstate.monitorNotifier = new MonitorNotifier({\n\t\t\tsendMessage: (message, options) => pi.sendMessage(message, options),\n\t\t\tgetContext: () => state.ctx,\n\t\t\tgetMode: () => state.settings.notify,\n\t\t\tgetSettings: () => state.settings.monitor,\n\t\t\tpauseMonitors: (ids) => state.bundle?.monitors.pause(ids) ?? [],\n\t\t});\n\t\tconst sessionKey = sessionKeyOf(ctx);\n\t\tif (event.reason === \"reload\") {\n\t\t\tconst claimed = sessionKey === undefined ? undefined : claimParkedBundle(sessionKey);\n\t\t\tif (claimed) {\n\t\t\t\tawait state.bundle?.teardown();\n\t\t\t\tstate.bundle = claimed;\n\t\t\t}\n\t\t} else {\n\t\t\tif (sessionKey !== undefined) await teardownParkedBundle(sessionKey);\n\t\t\tawait state.bundle?.teardown();\n\t\t\tstate.bundle = createBundle(state);\n\t\t}\n\t\tstate.bundle ??= createBundle(state);\n\t\tstate.bundle.bind(bundleSinks(pi, state));\n\t\tif (event.reason === \"reload\") {\n\t\t\t// Park/claim and the lease stay untouched: the same pid keeps holding it. The\n\t\t\t// reload generation only rebinds the recorder so manifest coverage continues.\n\t\t\tif (sessionKey !== undefined && terminalStateDir(ctx) !== undefined) {\n\t\t\t\tconst writer = new TerminalManifestWriter({ session: ctx.sessionManager });\n\t\t\t\tstate.manifestWriter = writer;\n\t\t\t\tstate.recordedBackgroundIds.clear();\n\t\t\t\tbindTerminalManifestWriter(sessionKey, writer);\n\t\t\t}\n\t\t} else if (sessionKey !== undefined) {\n\t\t\tawait adoptPersistedTerminalState(pi, state, toolCtx, state.bundle, sessionKey);\n\t\t}\n\t\tsyncToolset(pi, state);\n\t});\n\n\tpi.on(\"session_parked\", () => {\n\t\tstate.parked = true;\n\t\tstate.bundle?.monitors.setParked(true);\n\t\tstate.statusTicker.stop();\n\t});\n\n\tpi.on(\"session_resumed\", () => {\n\t\tstate.parked = false;\n\t\tstate.bundle?.monitors.setParked(false);\n\t\tif (state.bundle) state.statusTicker.sync(state.bundle.monitors.snapshot());\n\t});\n\n\tpi.on(\"model_select\", async (event, ctx) => {\n\t\tstate.ctx = { ...ctx, model: event.model };\n\t\tsyncToolset(pi, state);\n\t});\n\n\tpi.on(\"input\", (event) => {\n\t\tif (event.source === \"extension\") return;\n\t\tstate.monitorNotifier?.noteActivity();\n\t\tconst resumed = state.bundle?.monitors.resume() ?? [];\n\t\tif (resumed.length > 0) state.monitorNotifier?.resume(resumed.map((monitor) => monitor.id));\n\t});\n\n\tpi.on(\"tool_call\", () => {\n\t\tstate.monitorNotifier?.noteActivity();\n\t});\n\n\tpi.on(\n\t\t\"before_agent_start\",\n\t\tasync (event) => {\n\t\t\tif (state.steppedAside) return undefined;\n\t\t\treturn {\n\t\t\t\tsystemPrompt: `${event.systemPrompt}\\n${buildTerminalPromptSection({ evalOnly: isEvalOnlyRouting(pi) })}`,\n\t\t\t};\n\t\t},\n\t\t{ previewSafe: true },\n\t);\n\n\tpi.on(\"session_shutdown\", async (event, ctx) => {\n\t\tstate.monitorNotifier?.dispose();\n\t\tstate.monitorNotifier = null;\n\t\tstate.notifier = null;\n\t\tstate.statusTicker.stop();\n\t\tconst sessionKey = sessionKeyOf(ctx) ?? sessionKeyOf(state.ctx);\n\t\tif (event.reason === \"reload\" && state.bundle && sessionKey !== undefined) {\n\t\t\t// Keep state.bundle referenced: exit listeners captured by this instance's tool\n\t\t\t// context still route through the shared bundle after the new owner claims it.\n\t\t\t// The lease is deliberately NOT released: the same pid keeps it across the reload.\n\t\t\tdetachManifestWriter(state, sessionKey);\n\t\t\tstate.bundle.park();\n\t\t\tawait parkBundle(sessionKey, state.bundle);\n\t\t\treturn;\n\t\t}\n\t\tif (sessionKey !== undefined) await suspendAndFlushManifest(state, sessionKey);\n\t\tconst lease = state.lease;\n\t\tstate.lease = null;\n\t\tif (lease !== null) {\n\t\t\tawait releaseTerminalLease(lease);\n\t\t} else if (sessionKey !== undefined) {\n\t\t\tconst dir = terminalStateDir(ctx) ?? terminalStateDir(state.ctx);\n\t\t\t// A reload generation inherits the pre-reload lease without re-acquiring it;\n\t\t\t// releasing by (path, own pid) removes exactly that file and no foreign holder's.\n\t\t\tif (dir !== undefined) {\n\t\t\t\tawait releaseTerminalLease({\n\t\t\t\t\tpath: join(dir, `${encodedSessionId(sessionKey)}.lease`),\n\t\t\t\t\tpid: process.pid,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\tconst bundle = state.bundle;\n\t\tstate.bundle = null;\n\t\tawait bundle?.teardown();\n\t\tif (sessionKey !== undefined) await teardownParkedBundle(sessionKey);\n\t});\n}\n\nexport default registerTerminalExtension;\n"]}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import type { ExtensionAPI, ExtensionContext } from "../../types.ts";
|
|
2
|
-
import { type TodoCompletionTransition, type TodoItem, type TodoPhase } from "./state.ts";
|
|
2
|
+
import { type TodoAsk, type TodoCompletionTransition, type TodoItem, type TodoPhase } from "./state.ts";
|
|
3
3
|
export type TodoCommandAccessors = {
|
|
4
4
|
getCurrentPhases: () => TodoPhase[];
|
|
5
5
|
setCurrentPhases: (phases: TodoPhase[]) => void;
|
|
6
|
+
getCurrentAsk: () => TodoAsk | undefined;
|
|
6
7
|
syncWidget: (ctx: ExtensionContext, completedTasks?: readonly TodoCompletionTransition[]) => void;
|
|
7
8
|
};
|
|
8
9
|
/** Tokenizer honoring double-quoted strings and backslash escapes. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/todotools/commands.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,YAAY,EAA2B,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAE9F,OAAO,
|
|
1
|
+
{"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/todotools/commands.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,YAAY,EAA2B,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAE9F,OAAO,EAMN,KAAK,OAAO,EACZ,KAAK,wBAAwB,EAC7B,KAAK,QAAQ,EACb,KAAK,SAAS,EAEd,MAAM,YAAY,CAAC;AAkBpB,MAAM,MAAM,oBAAoB,GAAG;IAClC,gBAAgB,EAAE,MAAM,SAAS,EAAE,CAAC;IACpC,gBAAgB,EAAE,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,IAAI,CAAC;IAChD,aAAa,EAAE,MAAM,OAAO,GAAG,SAAS,CAAC;IACzC,UAAU,EAAE,CAAC,GAAG,EAAE,gBAAgB,EAAE,cAAc,CAAC,EAAE,SAAS,wBAAwB,EAAE,KAAK,IAAI,CAAC;CAClG,CAAC;AAEF,sEAAsE;AACtE,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CA0BxD;AAED,sFAAsF;AACtF,wBAAgB,cAAc,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAUxF;AAED,uFAAuF;AACvF,wBAAgB,aAAa,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,SAAS,CAAA;CAAE,GAAG,SAAS,CAkBlH;AA8BD,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,YAAY,EAAE,SAAS,EAAE,oBAAoB,GAAG,IAAI,CAsS3F"}
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
import { readFile, writeFile } from "node:fs/promises";
|
|
11
11
|
import { copyToClipboard } from "../../../../utils/clipboard.js";
|
|
12
12
|
import { markdownToPhases, phasesToMarkdown, resolveTodoMarkdownPath } from "./markdown.js";
|
|
13
|
-
import { applyOpsToPhases, clonePhases, DEFAULT_INIT_PHASE, TODO_STATE_ENTRY_TYPE, } from "./state.js";
|
|
13
|
+
import { applyOpsToPhases, clonePhases, DEFAULT_INIT_PHASE, formatAskNowNextHeader, TODO_STATE_ENTRY_TYPE, } from "./state.js";
|
|
14
14
|
const USAGE = [
|
|
15
15
|
"Usage: /todo <verb> [args]",
|
|
16
16
|
" /todo Show current todos",
|
|
@@ -122,9 +122,11 @@ function buildUserEditReminder(action, phases, removed) {
|
|
|
122
122
|
export function registerTodoCommand(pi, accessors) {
|
|
123
123
|
function commit(ctx, nextPhases, action, options) {
|
|
124
124
|
accessors.setCurrentPhases(clonePhases(nextPhases));
|
|
125
|
+
const ask = accessors.getCurrentAsk();
|
|
125
126
|
pi.appendEntry(TODO_STATE_ENTRY_TYPE, {
|
|
126
127
|
schema: "v2",
|
|
127
128
|
phases: clonePhases(nextPhases),
|
|
129
|
+
...(ask ? { ask } : {}),
|
|
128
130
|
source: "user",
|
|
129
131
|
action,
|
|
130
132
|
});
|
|
@@ -137,11 +139,12 @@ export function registerTodoCommand(pi, accessors) {
|
|
|
137
139
|
}
|
|
138
140
|
function showCurrent(ctx) {
|
|
139
141
|
const phases = accessors.getCurrentPhases();
|
|
142
|
+
const header = formatAskNowNextHeader(phases, accessors.getCurrentAsk());
|
|
140
143
|
if (phases.length === 0) {
|
|
141
|
-
ctx.ui.notify(
|
|
144
|
+
ctx.ui.notify(`${header}No todos. Use /todo append <task> to start one.`, "info");
|
|
142
145
|
return;
|
|
143
146
|
}
|
|
144
|
-
ctx.ui.notify(phasesToMarkdown(phases).trimEnd()
|
|
147
|
+
ctx.ui.notify(`${header}${phasesToMarkdown(phases).trimEnd()}`, "info");
|
|
145
148
|
}
|
|
146
149
|
async function editInOverlay(ctx) {
|
|
147
150
|
const current = accessors.getCurrentPhases();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"commands.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/todotools/commands.ts"],"names":[],"mappings":"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","sourcesContent":["// /todo slash command: user-facing todo management.\n//\n// Ported and adapted from oh-my-pi's\n// `packages/coding-agent/src/modes/controllers/todo-command-controller.ts`\n// (MIT — see NOTICE.md). senpi adaptations: the command registers through the\n// extension API, edits happen in the built-in `ctx.ui.editor` overlay instead\n// of a suspended external $EDITOR, and user edits persist as `senpi.todo-state`\n// entries with `source: \"user\"` so the branch scanner and compaction bridge\n// pick them up unchanged.\n\nimport { readFile, writeFile } from \"node:fs/promises\";\nimport { copyToClipboard } from \"../../../../utils/clipboard.ts\";\nimport type { ExtensionAPI, ExtensionCommandContext, ExtensionContext } from \"../../types.ts\";\nimport { markdownToPhases, phasesToMarkdown, resolveTodoMarkdownPath } from \"./markdown.ts\";\nimport {\n\tapplyOpsToPhases,\n\tclonePhases,\n\tDEFAULT_INIT_PHASE,\n\tTODO_STATE_ENTRY_TYPE,\n\ttype TodoCompletionTransition,\n\ttype TodoItem,\n\ttype TodoPhase,\n\ttype TodoStateEntry,\n} from \"./state.ts\";\n\nconst USAGE = [\n\t\"Usage: /todo <verb> [args]\",\n\t\" /todo Show current todos\",\n\t\" /todo edit Edit todos as Markdown in an overlay\",\n\t\" /todo copy Copy todos as Markdown to clipboard\",\n\t\" /todo export [<path>] Write todos to file (default: TODO.md)\",\n\t\" /todo import [<path>] Replace todos from file (default: TODO.md)\",\n\t\" /todo append [<phase>] <task...> Append a task; phase fuzzy-matched or created\",\n\t\" /todo start <task> Mark task in_progress (fuzzy match)\",\n\t\" /todo done [<task|phase>] Mark task/phase/all completed\",\n\t\" /todo drop [<task|phase>] Mark task/phase/all abandoned\",\n\t\" /todo rm [<task|phase>] Remove task/phase/all\",\n].join(\"\\n\");\n\nconst VERBS = [\"edit\", \"copy\", \"export\", \"import\", \"append\", \"start\", \"done\", \"drop\", \"rm\", \"help\"] as const;\n\nexport type TodoCommandAccessors = {\n\tgetCurrentPhases: () => TodoPhase[];\n\tsetCurrentPhases: (phases: TodoPhase[]) => void;\n\tsyncWidget: (ctx: ExtensionContext, completedTasks?: readonly TodoCompletionTransition[]) => void;\n};\n\n/** Tokenizer honoring double-quoted strings and backslash escapes. */\nexport function tokenizeTodoArgs(input: string): string[] {\n\tconst tokens: string[] = [];\n\tlet current = \"\";\n\tlet inQuote = false;\n\tfor (let index = 0; index < input.length; index += 1) {\n\t\tconst char = input[index];\n\t\tif (char === \"\\\\\" && index + 1 < input.length) {\n\t\t\tcurrent += input[index + 1];\n\t\t\tindex += 1;\n\t\t\tcontinue;\n\t\t}\n\t\tif (char === '\"') {\n\t\t\tinQuote = !inQuote;\n\t\t\tcontinue;\n\t\t}\n\t\tif (!inQuote && /\\s/.test(char)) {\n\t\t\tif (current) {\n\t\t\t\ttokens.push(current);\n\t\t\t\tcurrent = \"\";\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\t\tcurrent += char;\n\t}\n\tif (current) tokens.push(current);\n\treturn tokens;\n}\n\n/** Exact name first, then unique prefix, then unique substring (case-insensitive). */\nexport function findPhaseFuzzy(phases: TodoPhase[], query: string): TodoPhase | undefined {\n\tconst q = query.trim().toLowerCase();\n\tif (!q) return undefined;\n\tconst byName = phases.find((phase) => phase.name.toLowerCase() === q);\n\tif (byName) return byName;\n\tconst prefixMatches = phases.filter((phase) => phase.name.toLowerCase().startsWith(q));\n\tif (prefixMatches.length === 1) return prefixMatches[0];\n\tconst substringMatches = phases.filter((phase) => phase.name.toLowerCase().includes(q));\n\tif (substringMatches.length === 1) return substringMatches[0];\n\treturn undefined;\n}\n\n/** Exact content first, then unique substring; ambiguity resolved toward open work. */\nexport function findTaskFuzzy(phases: TodoPhase[], query: string): { task: TodoItem; phase: TodoPhase } | undefined {\n\tconst q = query.trim().toLowerCase();\n\tif (!q) return undefined;\n\tfor (const phase of phases) {\n\t\tfor (const task of phase.tasks) {\n\t\t\tif (task.content.toLowerCase() === q) return { task, phase };\n\t\t}\n\t}\n\tconst matches: Array<{ task: TodoItem; phase: TodoPhase }> = [];\n\tfor (const phase of phases) {\n\t\tfor (const task of phase.tasks) {\n\t\t\tif (task.content.toLowerCase().includes(q)) matches.push({ task, phase });\n\t\t}\n\t}\n\tif (matches.length === 1) return matches[0];\n\tconst open = matches.filter((hit) => hit.task.status === \"in_progress\" || hit.task.status === \"pending\");\n\tif (open.length === 1) return open[0];\n\treturn undefined;\n}\n\nfunction titleCaseWords(text: string): string {\n\treturn text\n\t\t.split(/\\s+/)\n\t\t.filter(Boolean)\n\t\t.map((word) => word[0].toUpperCase() + word.slice(1))\n\t\t.join(\" \");\n}\n\nfunction titleCaseSentence(text: string): string {\n\tconst trimmed = text.trim();\n\tif (!trimmed) return trimmed;\n\treturn trimmed[0].toUpperCase() + trimmed.slice(1);\n}\n\nfunction buildUserEditReminder(action: string, phases: readonly TodoPhase[], removed: boolean): string {\n\tconst markdown = phases.length === 0 ? \"(empty)\" : phasesToMarkdown(phases).trimEnd();\n\tconst lines = [\"<system-reminder>\", `The user manually modified the todo list (${action}).`];\n\tif (removed) {\n\t\tlines.push(\n\t\t\tphases.length === 0\n\t\t\t\t? \"The user intentionally cleared the todo list. Do NOT recreate or re-populate it unless the user explicitly asks; continue the current request without a todo list.\"\n\t\t\t\t: \"The user intentionally removed the entries no longer shown below. Do NOT re-add them unless the user explicitly asks.\",\n\t\t);\n\t}\n\tlines.push(\"Current todo list:\", \"\", markdown, \"</system-reminder>\");\n\treturn lines.join(\"\\n\");\n}\n\nexport function registerTodoCommand(pi: ExtensionAPI, accessors: TodoCommandAccessors): void {\n\tfunction commit(\n\t\tctx: ExtensionCommandContext,\n\t\tnextPhases: TodoPhase[],\n\t\taction: string,\n\t\toptions?: { removed?: boolean },\n\t): void {\n\t\taccessors.setCurrentPhases(clonePhases(nextPhases));\n\t\tpi.appendEntry(TODO_STATE_ENTRY_TYPE, {\n\t\t\tschema: \"v2\",\n\t\t\tphases: clonePhases(nextPhases),\n\t\t\tsource: \"user\",\n\t\t\taction,\n\t\t} satisfies TodoStateEntry & { source: string; action: string });\n\t\taccessors.syncWidget(ctx);\n\t\tpi.sendMessage(\n\t\t\t{\n\t\t\t\tcustomType: \"todotools.user-edit\",\n\t\t\t\tcontent: buildUserEditReminder(action, nextPhases, options?.removed ?? false),\n\t\t\t\tdisplay: false,\n\t\t\t},\n\t\t\t{ triggerTurn: false, deliverAs: \"nextTurn\" },\n\t\t);\n\t}\n\n\tfunction showCurrent(ctx: ExtensionCommandContext): void {\n\t\tconst phases = accessors.getCurrentPhases();\n\t\tif (phases.length === 0) {\n\t\t\tctx.ui.notify(\"No todos. Use /todo append <task> to start one.\", \"info\");\n\t\t\treturn;\n\t\t}\n\t\tctx.ui.notify(phasesToMarkdown(phases).trimEnd(), \"info\");\n\t}\n\n\tasync function editInOverlay(ctx: ExtensionCommandContext): Promise<void> {\n\t\tconst current = accessors.getCurrentPhases();\n\t\tconst initialMarkdown =\n\t\t\tcurrent.length > 0\n\t\t\t\t? phasesToMarkdown(current)\n\t\t\t\t: `# ${DEFAULT_INIT_PHASE}\\n- [ ] (replace this with your tasks)\\n`;\n\t\tconst edited = await ctx.ui.editor(\"Edit todos (Markdown checklist)\", initialMarkdown);\n\t\tif (edited === undefined || edited === initialMarkdown) {\n\t\t\tctx.ui.notify(\"Todos unchanged.\", \"info\");\n\t\t\treturn;\n\t\t}\n\t\tconst { phases, errors } = markdownToPhases(edited);\n\t\tif (errors.length > 0) {\n\t\t\tctx.ui.notify(`Could not parse Markdown:\\n ${errors.join(\"\\n \")}`, \"error\");\n\t\t\treturn;\n\t\t}\n\t\tcommit(ctx, phases, \"/todo edit\");\n\t\tconst taskCount = phases.reduce((sum, phase) => sum + phase.tasks.length, 0);\n\t\tctx.ui.notify(`Todos updated: ${phases.length} phase(s), ${taskCount} task(s).`, \"info\");\n\t}\n\n\tasync function copyMarkdown(ctx: ExtensionCommandContext): Promise<void> {\n\t\tconst phases = accessors.getCurrentPhases();\n\t\tif (phases.length === 0) {\n\t\t\tctx.ui.notify(\"No todos to copy.\", \"warning\");\n\t\t\treturn;\n\t\t}\n\t\ttry {\n\t\t\tawait copyToClipboard(phasesToMarkdown(phases));\n\t\t\tctx.ui.notify(\"Copied todos as Markdown to clipboard.\", \"info\");\n\t\t} catch (error) {\n\t\t\tctx.ui.notify(error instanceof Error ? error.message : String(error), \"error\");\n\t\t}\n\t}\n\n\tasync function exportToFile(ctx: ExtensionCommandContext, rest: string): Promise<void> {\n\t\tconst phases = accessors.getCurrentPhases();\n\t\tif (phases.length === 0) {\n\t\t\tctx.ui.notify(\"No todos to export.\", \"warning\");\n\t\t\treturn;\n\t\t}\n\t\ttry {\n\t\t\tconst target = resolveTodoMarkdownPath(rest, ctx.cwd);\n\t\t\tawait writeFile(target, phasesToMarkdown(phases), \"utf8\");\n\t\t\tctx.ui.notify(`Wrote todos to ${target}`, \"info\");\n\t\t} catch (error) {\n\t\t\tctx.ui.notify(`Failed to write todos: ${error instanceof Error ? error.message : String(error)}`, \"error\");\n\t\t}\n\t}\n\n\tasync function importFromFile(ctx: ExtensionCommandContext, rest: string): Promise<void> {\n\t\tlet source = \"\";\n\t\tlet content: string;\n\t\ttry {\n\t\t\tsource = resolveTodoMarkdownPath(rest, ctx.cwd);\n\t\t\tcontent = await readFile(source, \"utf8\");\n\t\t} catch (error) {\n\t\t\tctx.ui.notify(`Failed to read todos: ${error instanceof Error ? error.message : String(error)}`, \"error\");\n\t\t\treturn;\n\t\t}\n\t\tconst { phases, errors } = markdownToPhases(content);\n\t\tif (errors.length > 0) {\n\t\t\tctx.ui.notify(`Could not parse ${source}:\\n ${errors.join(\"\\n \")}`, \"error\");\n\t\t\treturn;\n\t\t}\n\t\tcommit(ctx, phases, `/todo import ${source}`);\n\t\tconst taskCount = phases.reduce((sum, phase) => sum + phase.tasks.length, 0);\n\t\tctx.ui.notify(`Imported ${phases.length} phase(s), ${taskCount} task(s) from ${source}.`, \"info\");\n\t}\n\n\tfunction append(ctx: ExtensionCommandContext, rest: string): void {\n\t\tconst tokens = tokenizeTodoArgs(rest);\n\t\tif (tokens.length === 0) {\n\t\t\tctx.ui.notify(\"Usage: /todo append [<phase>] <task...>\", \"error\");\n\t\t\treturn;\n\t\t}\n\n\t\tconst next = clonePhases(accessors.getCurrentPhases());\n\t\tlet phaseName: string | undefined;\n\t\tlet content: string;\n\t\tif (tokens.length === 1) {\n\t\t\tcontent = tokens[0];\n\t\t} else {\n\t\t\tphaseName = tokens[0];\n\t\t\tcontent = tokens.slice(1).join(\" \");\n\t\t}\n\n\t\tlet targetPhase: TodoPhase | undefined;\n\t\tif (phaseName) {\n\t\t\ttargetPhase = findPhaseFuzzy(next, phaseName);\n\t\t\tif (!targetPhase) {\n\t\t\t\ttargetPhase = { name: titleCaseWords(phaseName), tasks: [] };\n\t\t\t\tnext.push(targetPhase);\n\t\t\t}\n\t\t} else if (next.length > 0) {\n\t\t\ttargetPhase = next[next.length - 1];\n\t\t} else {\n\t\t\ttargetPhase = { name: DEFAULT_INIT_PHASE, tasks: [] };\n\t\t\tnext.push(targetPhase);\n\t\t}\n\n\t\tconst finalContent = titleCaseSentence(content);\n\t\ttargetPhase.tasks.push({ content: finalContent, status: \"pending\" });\n\t\tcommit(ctx, next, `/todo append → ${targetPhase.name}`);\n\t\tctx.ui.notify(`Appended to ${targetPhase.name}: ${finalContent}`, \"info\");\n\t}\n\n\tfunction start(ctx: ExtensionCommandContext, rest: string): void {\n\t\tif (!rest) {\n\t\t\tctx.ui.notify(\"Usage: /todo start <task>\", \"error\");\n\t\t\treturn;\n\t\t}\n\t\tconst current = accessors.getCurrentPhases();\n\t\tconst hit = findTaskFuzzy(current, rest);\n\t\tif (!hit) {\n\t\t\tctx.ui.notify(`No task matched \"${rest}\". Use /todo to list current tasks.`, \"error\");\n\t\t\treturn;\n\t\t}\n\t\tconst { phases, errors } = applyOpsToPhases(current, [{ op: \"start\", task: hit.task.content }]);\n\t\tif (errors.length > 0) {\n\t\t\tctx.ui.notify(errors.join(\"; \"), \"error\");\n\t\t\treturn;\n\t\t}\n\t\tcommit(ctx, phases, `/todo start ${hit.task.content}`);\n\t\tctx.ui.notify(`Started: ${hit.task.content}`, \"info\");\n\t}\n\n\tfunction mutateStatus(ctx: ExtensionCommandContext, rest: string, target: \"completed\" | \"abandoned\"): void {\n\t\tconst op = target === \"completed\" ? (\"done\" as const) : (\"drop\" as const);\n\t\tconst current = accessors.getCurrentPhases();\n\t\tconst trimmed = rest.trim();\n\t\tif (!trimmed) {\n\t\t\tconst { phases, errors } = applyOpsToPhases(current, [{ op }]);\n\t\t\tif (errors.length > 0) {\n\t\t\t\tctx.ui.notify(errors.join(\"; \"), \"error\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcommit(ctx, phases, `/todo ${op} (all)`);\n\t\t\tctx.ui.notify(`Marked all tasks ${target}.`, \"info\");\n\t\t\treturn;\n\t\t}\n\n\t\tconst taskHit = findTaskFuzzy(current, trimmed);\n\t\tif (taskHit) {\n\t\t\tconst { phases, errors } = applyOpsToPhases(current, [{ op, task: taskHit.task.content }]);\n\t\t\tif (errors.length > 0) {\n\t\t\t\tctx.ui.notify(errors.join(\"; \"), \"error\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcommit(ctx, phases, `/todo ${op} ${taskHit.task.content}`);\n\t\t\tctx.ui.notify(`Marked ${target}: ${taskHit.task.content}`, \"info\");\n\t\t\treturn;\n\t\t}\n\n\t\tconst phaseHit = findPhaseFuzzy(current, trimmed);\n\t\tif (phaseHit) {\n\t\t\tconst { phases, errors } = applyOpsToPhases(current, [{ op, phase: phaseHit.name }]);\n\t\t\tif (errors.length > 0) {\n\t\t\t\tctx.ui.notify(errors.join(\"; \"), \"error\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcommit(ctx, phases, `/todo ${op} ${phaseHit.name}`);\n\t\t\tctx.ui.notify(`Marked phase ${phaseHit.name} ${target}.`, \"info\");\n\t\t\treturn;\n\t\t}\n\n\t\tctx.ui.notify(`No task or phase matched \"${trimmed}\".`, \"error\");\n\t}\n\n\tfunction remove(ctx: ExtensionCommandContext, rest: string): void {\n\t\tconst current = accessors.getCurrentPhases();\n\t\tconst trimmed = rest.trim();\n\t\tif (!trimmed) {\n\t\t\tcommit(ctx, [], \"/todo rm (all)\", { removed: true });\n\t\t\tctx.ui.notify(\"Cleared all todos.\", \"info\");\n\t\t\treturn;\n\t\t}\n\t\tconst taskHit = findTaskFuzzy(current, trimmed);\n\t\tif (taskHit) {\n\t\t\tconst { phases, errors } = applyOpsToPhases(current, [{ op: \"rm\", task: taskHit.task.content }]);\n\t\t\tif (errors.length > 0) {\n\t\t\t\tctx.ui.notify(errors.join(\"; \"), \"error\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcommit(ctx, phases, `/todo rm ${taskHit.task.content}`, { removed: true });\n\t\t\tctx.ui.notify(`Removed: ${taskHit.task.content}`, \"info\");\n\t\t\treturn;\n\t\t}\n\t\tconst phaseHit = findPhaseFuzzy(current, trimmed);\n\t\tif (phaseHit) {\n\t\t\tconst { phases, errors } = applyOpsToPhases(current, [{ op: \"rm\", phase: phaseHit.name }]);\n\t\t\tif (errors.length > 0) {\n\t\t\t\tctx.ui.notify(errors.join(\"; \"), \"error\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcommit(ctx, phases, `/todo rm ${phaseHit.name}`, { removed: true });\n\t\t\tctx.ui.notify(`Removed phase: ${phaseHit.name}`, \"info\");\n\t\t\treturn;\n\t\t}\n\t\tctx.ui.notify(`No task or phase matched \"${trimmed}\".`, \"error\");\n\t}\n\n\tpi.registerCommand(\"todo\", {\n\t\tdescription: \"Show or edit the todo list (edit/copy/export/import/append/start/done/drop/rm)\",\n\t\tgetArgumentCompletions: (argumentPrefix: string) => {\n\t\t\tconst prefix = argumentPrefix.trim().toLowerCase();\n\t\t\tconst matches = VERBS.filter((verb) => verb.startsWith(prefix));\n\t\t\tif (matches.length === 0) return null;\n\t\t\treturn matches.map((verb) => ({ value: verb, label: verb }));\n\t\t},\n\t\thandler: async (args: string, ctx: ExtensionCommandContext) => {\n\t\t\tconst trimmed = args.trim();\n\t\t\tif (!trimmed) {\n\t\t\t\tshowCurrent(ctx);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst spaceIndex = trimmed.search(/\\s/);\n\t\t\tconst verb = (spaceIndex === -1 ? trimmed : trimmed.slice(0, spaceIndex)).toLowerCase();\n\t\t\tconst rest = spaceIndex === -1 ? \"\" : trimmed.slice(spaceIndex + 1).trim();\n\n\t\t\tswitch (verb) {\n\t\t\t\tcase \"edit\":\n\t\t\t\t\tawait editInOverlay(ctx);\n\t\t\t\t\treturn;\n\t\t\t\tcase \"copy\":\n\t\t\t\t\tawait copyMarkdown(ctx);\n\t\t\t\t\treturn;\n\t\t\t\tcase \"export\":\n\t\t\t\t\tawait exportToFile(ctx, rest);\n\t\t\t\t\treturn;\n\t\t\t\tcase \"import\":\n\t\t\t\t\tawait importFromFile(ctx, rest);\n\t\t\t\t\treturn;\n\t\t\t\tcase \"help\":\n\t\t\t\tcase \"?\":\n\t\t\t\t\tctx.ui.notify(USAGE, \"info\");\n\t\t\t\t\treturn;\n\t\t\t\tcase \"append\":\n\t\t\t\t\tappend(ctx, rest);\n\t\t\t\t\treturn;\n\t\t\t\tcase \"start\":\n\t\t\t\t\tstart(ctx, rest);\n\t\t\t\t\treturn;\n\t\t\t\tcase \"done\":\n\t\t\t\t\tmutateStatus(ctx, rest, \"completed\");\n\t\t\t\t\treturn;\n\t\t\t\tcase \"drop\":\n\t\t\t\t\tmutateStatus(ctx, rest, \"abandoned\");\n\t\t\t\t\treturn;\n\t\t\t\tcase \"rm\":\n\t\t\t\t\tremove(ctx, rest);\n\t\t\t\t\treturn;\n\t\t\t\tdefault:\n\t\t\t\t\tctx.ui.notify(`Unknown /todo verb \"${verb}\".\\n${USAGE}`, \"error\");\n\t\t\t}\n\t\t},\n\t});\n}\n"]}
|
|
1
|
+
{"version":3,"file":"commands.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/todotools/commands.ts"],"names":[],"mappings":"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","sourcesContent":["// /todo slash command: user-facing todo management.\n//\n// Ported and adapted from oh-my-pi's\n// `packages/coding-agent/src/modes/controllers/todo-command-controller.ts`\n// (MIT — see NOTICE.md). senpi adaptations: the command registers through the\n// extension API, edits happen in the built-in `ctx.ui.editor` overlay instead\n// of a suspended external $EDITOR, and user edits persist as `senpi.todo-state`\n// entries with `source: \"user\"` so the branch scanner and compaction bridge\n// pick them up unchanged.\n\nimport { readFile, writeFile } from \"node:fs/promises\";\nimport { copyToClipboard } from \"../../../../utils/clipboard.ts\";\nimport type { ExtensionAPI, ExtensionCommandContext, ExtensionContext } from \"../../types.ts\";\nimport { markdownToPhases, phasesToMarkdown, resolveTodoMarkdownPath } from \"./markdown.ts\";\nimport {\n\tapplyOpsToPhases,\n\tclonePhases,\n\tDEFAULT_INIT_PHASE,\n\tformatAskNowNextHeader,\n\tTODO_STATE_ENTRY_TYPE,\n\ttype TodoAsk,\n\ttype TodoCompletionTransition,\n\ttype TodoItem,\n\ttype TodoPhase,\n\ttype TodoStateEntry,\n} from \"./state.ts\";\n\nconst USAGE = [\n\t\"Usage: /todo <verb> [args]\",\n\t\" /todo Show current todos\",\n\t\" /todo edit Edit todos as Markdown in an overlay\",\n\t\" /todo copy Copy todos as Markdown to clipboard\",\n\t\" /todo export [<path>] Write todos to file (default: TODO.md)\",\n\t\" /todo import [<path>] Replace todos from file (default: TODO.md)\",\n\t\" /todo append [<phase>] <task...> Append a task; phase fuzzy-matched or created\",\n\t\" /todo start <task> Mark task in_progress (fuzzy match)\",\n\t\" /todo done [<task|phase>] Mark task/phase/all completed\",\n\t\" /todo drop [<task|phase>] Mark task/phase/all abandoned\",\n\t\" /todo rm [<task|phase>] Remove task/phase/all\",\n].join(\"\\n\");\n\nconst VERBS = [\"edit\", \"copy\", \"export\", \"import\", \"append\", \"start\", \"done\", \"drop\", \"rm\", \"help\"] as const;\n\nexport type TodoCommandAccessors = {\n\tgetCurrentPhases: () => TodoPhase[];\n\tsetCurrentPhases: (phases: TodoPhase[]) => void;\n\tgetCurrentAsk: () => TodoAsk | undefined;\n\tsyncWidget: (ctx: ExtensionContext, completedTasks?: readonly TodoCompletionTransition[]) => void;\n};\n\n/** Tokenizer honoring double-quoted strings and backslash escapes. */\nexport function tokenizeTodoArgs(input: string): string[] {\n\tconst tokens: string[] = [];\n\tlet current = \"\";\n\tlet inQuote = false;\n\tfor (let index = 0; index < input.length; index += 1) {\n\t\tconst char = input[index];\n\t\tif (char === \"\\\\\" && index + 1 < input.length) {\n\t\t\tcurrent += input[index + 1];\n\t\t\tindex += 1;\n\t\t\tcontinue;\n\t\t}\n\t\tif (char === '\"') {\n\t\t\tinQuote = !inQuote;\n\t\t\tcontinue;\n\t\t}\n\t\tif (!inQuote && /\\s/.test(char)) {\n\t\t\tif (current) {\n\t\t\t\ttokens.push(current);\n\t\t\t\tcurrent = \"\";\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\t\tcurrent += char;\n\t}\n\tif (current) tokens.push(current);\n\treturn tokens;\n}\n\n/** Exact name first, then unique prefix, then unique substring (case-insensitive). */\nexport function findPhaseFuzzy(phases: TodoPhase[], query: string): TodoPhase | undefined {\n\tconst q = query.trim().toLowerCase();\n\tif (!q) return undefined;\n\tconst byName = phases.find((phase) => phase.name.toLowerCase() === q);\n\tif (byName) return byName;\n\tconst prefixMatches = phases.filter((phase) => phase.name.toLowerCase().startsWith(q));\n\tif (prefixMatches.length === 1) return prefixMatches[0];\n\tconst substringMatches = phases.filter((phase) => phase.name.toLowerCase().includes(q));\n\tif (substringMatches.length === 1) return substringMatches[0];\n\treturn undefined;\n}\n\n/** Exact content first, then unique substring; ambiguity resolved toward open work. */\nexport function findTaskFuzzy(phases: TodoPhase[], query: string): { task: TodoItem; phase: TodoPhase } | undefined {\n\tconst q = query.trim().toLowerCase();\n\tif (!q) return undefined;\n\tfor (const phase of phases) {\n\t\tfor (const task of phase.tasks) {\n\t\t\tif (task.content.toLowerCase() === q) return { task, phase };\n\t\t}\n\t}\n\tconst matches: Array<{ task: TodoItem; phase: TodoPhase }> = [];\n\tfor (const phase of phases) {\n\t\tfor (const task of phase.tasks) {\n\t\t\tif (task.content.toLowerCase().includes(q)) matches.push({ task, phase });\n\t\t}\n\t}\n\tif (matches.length === 1) return matches[0];\n\tconst open = matches.filter((hit) => hit.task.status === \"in_progress\" || hit.task.status === \"pending\");\n\tif (open.length === 1) return open[0];\n\treturn undefined;\n}\n\nfunction titleCaseWords(text: string): string {\n\treturn text\n\t\t.split(/\\s+/)\n\t\t.filter(Boolean)\n\t\t.map((word) => word[0].toUpperCase() + word.slice(1))\n\t\t.join(\" \");\n}\n\nfunction titleCaseSentence(text: string): string {\n\tconst trimmed = text.trim();\n\tif (!trimmed) return trimmed;\n\treturn trimmed[0].toUpperCase() + trimmed.slice(1);\n}\n\nfunction buildUserEditReminder(action: string, phases: readonly TodoPhase[], removed: boolean): string {\n\tconst markdown = phases.length === 0 ? \"(empty)\" : phasesToMarkdown(phases).trimEnd();\n\tconst lines = [\"<system-reminder>\", `The user manually modified the todo list (${action}).`];\n\tif (removed) {\n\t\tlines.push(\n\t\t\tphases.length === 0\n\t\t\t\t? \"The user intentionally cleared the todo list. Do NOT recreate or re-populate it unless the user explicitly asks; continue the current request without a todo list.\"\n\t\t\t\t: \"The user intentionally removed the entries no longer shown below. Do NOT re-add them unless the user explicitly asks.\",\n\t\t);\n\t}\n\tlines.push(\"Current todo list:\", \"\", markdown, \"</system-reminder>\");\n\treturn lines.join(\"\\n\");\n}\n\nexport function registerTodoCommand(pi: ExtensionAPI, accessors: TodoCommandAccessors): void {\n\tfunction commit(\n\t\tctx: ExtensionCommandContext,\n\t\tnextPhases: TodoPhase[],\n\t\taction: string,\n\t\toptions?: { removed?: boolean },\n\t): void {\n\t\taccessors.setCurrentPhases(clonePhases(nextPhases));\n\t\tconst ask = accessors.getCurrentAsk();\n\t\tpi.appendEntry(TODO_STATE_ENTRY_TYPE, {\n\t\t\tschema: \"v2\",\n\t\t\tphases: clonePhases(nextPhases),\n\t\t\t...(ask ? { ask } : {}),\n\t\t\tsource: \"user\",\n\t\t\taction,\n\t\t} satisfies TodoStateEntry & { source: string; action: string });\n\t\taccessors.syncWidget(ctx);\n\t\tpi.sendMessage(\n\t\t\t{\n\t\t\t\tcustomType: \"todotools.user-edit\",\n\t\t\t\tcontent: buildUserEditReminder(action, nextPhases, options?.removed ?? false),\n\t\t\t\tdisplay: false,\n\t\t\t},\n\t\t\t{ triggerTurn: false, deliverAs: \"nextTurn\" },\n\t\t);\n\t}\n\n\tfunction showCurrent(ctx: ExtensionCommandContext): void {\n\t\tconst phases = accessors.getCurrentPhases();\n\t\tconst header = formatAskNowNextHeader(phases, accessors.getCurrentAsk());\n\t\tif (phases.length === 0) {\n\t\t\tctx.ui.notify(`${header}No todos. Use /todo append <task> to start one.`, \"info\");\n\t\t\treturn;\n\t\t}\n\t\tctx.ui.notify(`${header}${phasesToMarkdown(phases).trimEnd()}`, \"info\");\n\t}\n\n\tasync function editInOverlay(ctx: ExtensionCommandContext): Promise<void> {\n\t\tconst current = accessors.getCurrentPhases();\n\t\tconst initialMarkdown =\n\t\t\tcurrent.length > 0\n\t\t\t\t? phasesToMarkdown(current)\n\t\t\t\t: `# ${DEFAULT_INIT_PHASE}\\n- [ ] (replace this with your tasks)\\n`;\n\t\tconst edited = await ctx.ui.editor(\"Edit todos (Markdown checklist)\", initialMarkdown);\n\t\tif (edited === undefined || edited === initialMarkdown) {\n\t\t\tctx.ui.notify(\"Todos unchanged.\", \"info\");\n\t\t\treturn;\n\t\t}\n\t\tconst { phases, errors } = markdownToPhases(edited);\n\t\tif (errors.length > 0) {\n\t\t\tctx.ui.notify(`Could not parse Markdown:\\n ${errors.join(\"\\n \")}`, \"error\");\n\t\t\treturn;\n\t\t}\n\t\tcommit(ctx, phases, \"/todo edit\");\n\t\tconst taskCount = phases.reduce((sum, phase) => sum + phase.tasks.length, 0);\n\t\tctx.ui.notify(`Todos updated: ${phases.length} phase(s), ${taskCount} task(s).`, \"info\");\n\t}\n\n\tasync function copyMarkdown(ctx: ExtensionCommandContext): Promise<void> {\n\t\tconst phases = accessors.getCurrentPhases();\n\t\tif (phases.length === 0) {\n\t\t\tctx.ui.notify(\"No todos to copy.\", \"warning\");\n\t\t\treturn;\n\t\t}\n\t\ttry {\n\t\t\tawait copyToClipboard(phasesToMarkdown(phases));\n\t\t\tctx.ui.notify(\"Copied todos as Markdown to clipboard.\", \"info\");\n\t\t} catch (error) {\n\t\t\tctx.ui.notify(error instanceof Error ? error.message : String(error), \"error\");\n\t\t}\n\t}\n\n\tasync function exportToFile(ctx: ExtensionCommandContext, rest: string): Promise<void> {\n\t\tconst phases = accessors.getCurrentPhases();\n\t\tif (phases.length === 0) {\n\t\t\tctx.ui.notify(\"No todos to export.\", \"warning\");\n\t\t\treturn;\n\t\t}\n\t\ttry {\n\t\t\tconst target = resolveTodoMarkdownPath(rest, ctx.cwd);\n\t\t\tawait writeFile(target, phasesToMarkdown(phases), \"utf8\");\n\t\t\tctx.ui.notify(`Wrote todos to ${target}`, \"info\");\n\t\t} catch (error) {\n\t\t\tctx.ui.notify(`Failed to write todos: ${error instanceof Error ? error.message : String(error)}`, \"error\");\n\t\t}\n\t}\n\n\tasync function importFromFile(ctx: ExtensionCommandContext, rest: string): Promise<void> {\n\t\tlet source = \"\";\n\t\tlet content: string;\n\t\ttry {\n\t\t\tsource = resolveTodoMarkdownPath(rest, ctx.cwd);\n\t\t\tcontent = await readFile(source, \"utf8\");\n\t\t} catch (error) {\n\t\t\tctx.ui.notify(`Failed to read todos: ${error instanceof Error ? error.message : String(error)}`, \"error\");\n\t\t\treturn;\n\t\t}\n\t\tconst { phases, errors } = markdownToPhases(content);\n\t\tif (errors.length > 0) {\n\t\t\tctx.ui.notify(`Could not parse ${source}:\\n ${errors.join(\"\\n \")}`, \"error\");\n\t\t\treturn;\n\t\t}\n\t\tcommit(ctx, phases, `/todo import ${source}`);\n\t\tconst taskCount = phases.reduce((sum, phase) => sum + phase.tasks.length, 0);\n\t\tctx.ui.notify(`Imported ${phases.length} phase(s), ${taskCount} task(s) from ${source}.`, \"info\");\n\t}\n\n\tfunction append(ctx: ExtensionCommandContext, rest: string): void {\n\t\tconst tokens = tokenizeTodoArgs(rest);\n\t\tif (tokens.length === 0) {\n\t\t\tctx.ui.notify(\"Usage: /todo append [<phase>] <task...>\", \"error\");\n\t\t\treturn;\n\t\t}\n\n\t\tconst next = clonePhases(accessors.getCurrentPhases());\n\t\tlet phaseName: string | undefined;\n\t\tlet content: string;\n\t\tif (tokens.length === 1) {\n\t\t\tcontent = tokens[0];\n\t\t} else {\n\t\t\tphaseName = tokens[0];\n\t\t\tcontent = tokens.slice(1).join(\" \");\n\t\t}\n\n\t\tlet targetPhase: TodoPhase | undefined;\n\t\tif (phaseName) {\n\t\t\ttargetPhase = findPhaseFuzzy(next, phaseName);\n\t\t\tif (!targetPhase) {\n\t\t\t\ttargetPhase = { name: titleCaseWords(phaseName), tasks: [] };\n\t\t\t\tnext.push(targetPhase);\n\t\t\t}\n\t\t} else if (next.length > 0) {\n\t\t\ttargetPhase = next[next.length - 1];\n\t\t} else {\n\t\t\ttargetPhase = { name: DEFAULT_INIT_PHASE, tasks: [] };\n\t\t\tnext.push(targetPhase);\n\t\t}\n\n\t\tconst finalContent = titleCaseSentence(content);\n\t\ttargetPhase.tasks.push({ content: finalContent, status: \"pending\" });\n\t\tcommit(ctx, next, `/todo append → ${targetPhase.name}`);\n\t\tctx.ui.notify(`Appended to ${targetPhase.name}: ${finalContent}`, \"info\");\n\t}\n\n\tfunction start(ctx: ExtensionCommandContext, rest: string): void {\n\t\tif (!rest) {\n\t\t\tctx.ui.notify(\"Usage: /todo start <task>\", \"error\");\n\t\t\treturn;\n\t\t}\n\t\tconst current = accessors.getCurrentPhases();\n\t\tconst hit = findTaskFuzzy(current, rest);\n\t\tif (!hit) {\n\t\t\tctx.ui.notify(`No task matched \"${rest}\". Use /todo to list current tasks.`, \"error\");\n\t\t\treturn;\n\t\t}\n\t\tconst { phases, errors } = applyOpsToPhases(current, [{ op: \"start\", task: hit.task.content }]);\n\t\tif (errors.length > 0) {\n\t\t\tctx.ui.notify(errors.join(\"; \"), \"error\");\n\t\t\treturn;\n\t\t}\n\t\tcommit(ctx, phases, `/todo start ${hit.task.content}`);\n\t\tctx.ui.notify(`Started: ${hit.task.content}`, \"info\");\n\t}\n\n\tfunction mutateStatus(ctx: ExtensionCommandContext, rest: string, target: \"completed\" | \"abandoned\"): void {\n\t\tconst op = target === \"completed\" ? (\"done\" as const) : (\"drop\" as const);\n\t\tconst current = accessors.getCurrentPhases();\n\t\tconst trimmed = rest.trim();\n\t\tif (!trimmed) {\n\t\t\tconst { phases, errors } = applyOpsToPhases(current, [{ op }]);\n\t\t\tif (errors.length > 0) {\n\t\t\t\tctx.ui.notify(errors.join(\"; \"), \"error\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcommit(ctx, phases, `/todo ${op} (all)`);\n\t\t\tctx.ui.notify(`Marked all tasks ${target}.`, \"info\");\n\t\t\treturn;\n\t\t}\n\n\t\tconst taskHit = findTaskFuzzy(current, trimmed);\n\t\tif (taskHit) {\n\t\t\tconst { phases, errors } = applyOpsToPhases(current, [{ op, task: taskHit.task.content }]);\n\t\t\tif (errors.length > 0) {\n\t\t\t\tctx.ui.notify(errors.join(\"; \"), \"error\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcommit(ctx, phases, `/todo ${op} ${taskHit.task.content}`);\n\t\t\tctx.ui.notify(`Marked ${target}: ${taskHit.task.content}`, \"info\");\n\t\t\treturn;\n\t\t}\n\n\t\tconst phaseHit = findPhaseFuzzy(current, trimmed);\n\t\tif (phaseHit) {\n\t\t\tconst { phases, errors } = applyOpsToPhases(current, [{ op, phase: phaseHit.name }]);\n\t\t\tif (errors.length > 0) {\n\t\t\t\tctx.ui.notify(errors.join(\"; \"), \"error\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcommit(ctx, phases, `/todo ${op} ${phaseHit.name}`);\n\t\t\tctx.ui.notify(`Marked phase ${phaseHit.name} ${target}.`, \"info\");\n\t\t\treturn;\n\t\t}\n\n\t\tctx.ui.notify(`No task or phase matched \"${trimmed}\".`, \"error\");\n\t}\n\n\tfunction remove(ctx: ExtensionCommandContext, rest: string): void {\n\t\tconst current = accessors.getCurrentPhases();\n\t\tconst trimmed = rest.trim();\n\t\tif (!trimmed) {\n\t\t\tcommit(ctx, [], \"/todo rm (all)\", { removed: true });\n\t\t\tctx.ui.notify(\"Cleared all todos.\", \"info\");\n\t\t\treturn;\n\t\t}\n\t\tconst taskHit = findTaskFuzzy(current, trimmed);\n\t\tif (taskHit) {\n\t\t\tconst { phases, errors } = applyOpsToPhases(current, [{ op: \"rm\", task: taskHit.task.content }]);\n\t\t\tif (errors.length > 0) {\n\t\t\t\tctx.ui.notify(errors.join(\"; \"), \"error\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcommit(ctx, phases, `/todo rm ${taskHit.task.content}`, { removed: true });\n\t\t\tctx.ui.notify(`Removed: ${taskHit.task.content}`, \"info\");\n\t\t\treturn;\n\t\t}\n\t\tconst phaseHit = findPhaseFuzzy(current, trimmed);\n\t\tif (phaseHit) {\n\t\t\tconst { phases, errors } = applyOpsToPhases(current, [{ op: \"rm\", phase: phaseHit.name }]);\n\t\t\tif (errors.length > 0) {\n\t\t\t\tctx.ui.notify(errors.join(\"; \"), \"error\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcommit(ctx, phases, `/todo rm ${phaseHit.name}`, { removed: true });\n\t\t\tctx.ui.notify(`Removed phase: ${phaseHit.name}`, \"info\");\n\t\t\treturn;\n\t\t}\n\t\tctx.ui.notify(`No task or phase matched \"${trimmed}\".`, \"error\");\n\t}\n\n\tpi.registerCommand(\"todo\", {\n\t\tdescription: \"Show or edit the todo list (edit/copy/export/import/append/start/done/drop/rm)\",\n\t\tgetArgumentCompletions: (argumentPrefix: string) => {\n\t\t\tconst prefix = argumentPrefix.trim().toLowerCase();\n\t\t\tconst matches = VERBS.filter((verb) => verb.startsWith(prefix));\n\t\t\tif (matches.length === 0) return null;\n\t\t\treturn matches.map((verb) => ({ value: verb, label: verb }));\n\t\t},\n\t\thandler: async (args: string, ctx: ExtensionCommandContext) => {\n\t\t\tconst trimmed = args.trim();\n\t\t\tif (!trimmed) {\n\t\t\t\tshowCurrent(ctx);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst spaceIndex = trimmed.search(/\\s/);\n\t\t\tconst verb = (spaceIndex === -1 ? trimmed : trimmed.slice(0, spaceIndex)).toLowerCase();\n\t\t\tconst rest = spaceIndex === -1 ? \"\" : trimmed.slice(spaceIndex + 1).trim();\n\n\t\t\tswitch (verb) {\n\t\t\t\tcase \"edit\":\n\t\t\t\t\tawait editInOverlay(ctx);\n\t\t\t\t\treturn;\n\t\t\t\tcase \"copy\":\n\t\t\t\t\tawait copyMarkdown(ctx);\n\t\t\t\t\treturn;\n\t\t\t\tcase \"export\":\n\t\t\t\t\tawait exportToFile(ctx, rest);\n\t\t\t\t\treturn;\n\t\t\t\tcase \"import\":\n\t\t\t\t\tawait importFromFile(ctx, rest);\n\t\t\t\t\treturn;\n\t\t\t\tcase \"help\":\n\t\t\t\tcase \"?\":\n\t\t\t\t\tctx.ui.notify(USAGE, \"info\");\n\t\t\t\t\treturn;\n\t\t\t\tcase \"append\":\n\t\t\t\t\tappend(ctx, rest);\n\t\t\t\t\treturn;\n\t\t\t\tcase \"start\":\n\t\t\t\t\tstart(ctx, rest);\n\t\t\t\t\treturn;\n\t\t\t\tcase \"done\":\n\t\t\t\t\tmutateStatus(ctx, rest, \"completed\");\n\t\t\t\t\treturn;\n\t\t\t\tcase \"drop\":\n\t\t\t\t\tmutateStatus(ctx, rest, \"abandoned\");\n\t\t\t\t\treturn;\n\t\t\t\tcase \"rm\":\n\t\t\t\t\tremove(ctx, rest);\n\t\t\t\t\treturn;\n\t\t\t\tdefault:\n\t\t\t\t\tctx.ui.notify(`Unknown /todo verb \"${verb}\".\\n${USAGE}`, \"error\");\n\t\t\t}\n\t\t},\n\t});\n}\n"]}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { Api, Model } from "@earendil-works/pi-ai";
|
|
2
|
+
import type { SessionEntry } from "../../../session-manager.ts";
|
|
3
|
+
import type { TodoFirstTurnPlan } from "../../../settings-shapes.ts";
|
|
4
|
+
import type { ExtensionMode } from "../../types.ts";
|
|
5
|
+
import type { TodoPhase } from "./todo-types.ts";
|
|
6
|
+
export declare const FIRST_TURN_CUSTOM_TYPE = "senpi.todo-first-turn";
|
|
7
|
+
export declare const FIRST_TURN_REMINDER = "<system-reminder>\nThis is the first request of the session. Before continuing, call the todo tool with op \"init\" and a phased list covering the whole request end to end: investigation, implementation, verification (diagnostics, tests, build, manual check), and the final report. Give every task a unique 5-10 word label; phase names are short noun phrases. Then continue the request in this same turn - the init is not a turn by itself.\n</system-reminder>";
|
|
8
|
+
export type FirstTurnGateInput = {
|
|
9
|
+
preview: boolean | undefined;
|
|
10
|
+
prompt: string;
|
|
11
|
+
branchEntries: readonly SessionEntry[];
|
|
12
|
+
phases: readonly TodoPhase[];
|
|
13
|
+
todoActive: boolean;
|
|
14
|
+
setting: TodoFirstTurnPlan;
|
|
15
|
+
mode: ExtensionMode;
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* Arms the first-turn plan opener only for a session's first real request that asks for work:
|
|
19
|
+
* never in a preview, never once any user message is on the branch (`before_agent_start` fires
|
|
20
|
+
* before the prompt is persisted), never over an existing list, never for a question or an
|
|
21
|
+
* exclamation, and never in print/json runs.
|
|
22
|
+
*/
|
|
23
|
+
export declare function shouldArmFirstTurn(input: FirstTurnGateInput): boolean;
|
|
24
|
+
/**
|
|
25
|
+
* Whether the request wire can name one tool in `tool_choice`. Anthropic reads the RESOLVED
|
|
26
|
+
* compat (catalog models carry no `compat`, and the resolver applies the Fable / Mythos /
|
|
27
|
+
* Opus 5.5 forced-choice default), never `model.compat` directly.
|
|
28
|
+
*/
|
|
29
|
+
export declare function supportsNamedToolChoice(model: Model<Api> | undefined): boolean;
|
|
30
|
+
/** Wire shape of a `tool_choice` that forces `toolName`, or `undefined` for an unsupported api. */
|
|
31
|
+
export declare function namedToolChoicePayload(api: Api | undefined, toolName: string): Record<string, unknown> | undefined;
|
|
32
|
+
/**
|
|
33
|
+
* The payload with a forced `todo` tool_choice, or `undefined` to leave it untouched: the
|
|
34
|
+
* request must declare `todo`, carry no tool_choice of its own, and (Anthropic) not run
|
|
35
|
+
* extended thinking, which rejects any forced tool use.
|
|
36
|
+
*/
|
|
37
|
+
export declare function withForcedTodoChoice(payload: unknown, model: Model<Api> | undefined): unknown;
|
|
38
|
+
//# sourceMappingURL=first-turn.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"first-turn.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/todotools/first-turn.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAExD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEjD,eAAO,MAAM,sBAAsB,0BAA0B,CAAC;AAE9D,eAAO,MAAM,mBAAmB,gdAEb,CAAC;AAOpB,MAAM,MAAM,kBAAkB,GAAG;IAChC,OAAO,EAAE,OAAO,GAAG,SAAS,CAAC;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,SAAS,YAAY,EAAE,CAAC;IACvC,MAAM,EAAE,SAAS,SAAS,EAAE,CAAC;IAC7B,UAAU,EAAE,OAAO,CAAC;IACpB,OAAO,EAAE,iBAAiB,CAAC;IAC3B,IAAI,EAAE,aAAa,CAAC;CACpB,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAOrE;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,SAAS,GAAG,OAAO,CAY9E;AAED,mGAAmG;AACnG,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,GAAG,GAAG,SAAS,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAWlH;AAgBD;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,SAAS,GAAG,OAAO,CAQ7F"}
|