@code-yeongyu/senpi 2026.7.25-2 → 2026.7.26
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 +52 -0
- package/README.md +1 -1
- package/dist/cli/args.d.ts +4 -16
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +9 -25
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/grok-neo-gate.d.ts +12 -0
- package/dist/cli/grok-neo-gate.d.ts.map +1 -0
- package/dist/cli/grok-neo-gate.js +18 -0
- package/dist/cli/grok-neo-gate.js.map +1 -0
- package/dist/cli-main.js +4 -0
- package/dist/cli-main.js.map +1 -1
- package/dist/cli.js +2 -0
- package/dist/cli.js.map +1 -1
- package/dist/core/agent-session-runtime.d.ts +2 -0
- package/dist/core/agent-session-runtime.d.ts.map +1 -1
- package/dist/core/agent-session-runtime.js +33 -8
- package/dist/core/agent-session-runtime.js.map +1 -1
- package/dist/core/agent-session.d.ts +9 -3
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +179 -57
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/auth-providers.d.ts +2 -2
- package/dist/core/auth-providers.js +2 -2
- package/dist/core/auth-providers.js.map +1 -1
- package/dist/core/extensions/builtin/bash-timeout/timeout.d.ts.map +1 -1
- package/dist/core/extensions/builtin/bash-timeout/timeout.js +3 -2
- package/dist/core/extensions/builtin/bash-timeout/timeout.js.map +1 -1
- package/dist/core/extensions/builtin/compaction/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/compaction/index.js +30 -2
- package/dist/core/extensions/builtin/compaction/index.js.map +1 -1
- package/dist/core/extensions/builtin/compaction/speculative.d.ts.map +1 -1
- package/dist/core/extensions/builtin/compaction/speculative.js +28 -0
- package/dist/core/extensions/builtin/compaction/speculative.js.map +1 -1
- package/dist/core/extensions/builtin/goal/command-registration.js +2 -2
- package/dist/core/extensions/builtin/goal/command-registration.js.map +1 -1
- package/dist/core/extensions/builtin/goal/format.d.ts +1 -1
- package/dist/core/extensions/builtin/goal/format.d.ts.map +1 -1
- package/dist/core/extensions/builtin/goal/format.js +9 -2
- package/dist/core/extensions/builtin/goal/format.js.map +1 -1
- package/dist/core/extensions/builtin/goal/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/goal/index.js +38 -23
- package/dist/core/extensions/builtin/goal/index.js.map +1 -1
- package/dist/core/extensions/builtin/goal/lifecycle-helpers.d.ts +6 -0
- package/dist/core/extensions/builtin/goal/lifecycle-helpers.d.ts.map +1 -0
- package/dist/core/extensions/builtin/goal/lifecycle-helpers.js +19 -0
- package/dist/core/extensions/builtin/goal/lifecycle-helpers.js.map +1 -0
- package/dist/core/extensions/builtin/goal/persistence.d.ts +6 -0
- package/dist/core/extensions/builtin/goal/persistence.d.ts.map +1 -0
- package/dist/core/extensions/builtin/goal/persistence.js +141 -0
- package/dist/core/extensions/builtin/goal/persistence.js.map +1 -0
- package/dist/core/extensions/builtin/goal/store.d.ts +7 -3
- package/dist/core/extensions/builtin/goal/store.d.ts.map +1 -1
- package/dist/core/extensions/builtin/goal/store.js +66 -181
- package/dist/core/extensions/builtin/goal/store.js.map +1 -1
- package/dist/core/extensions/builtin/goal/tool-registration.d.ts +1 -0
- package/dist/core/extensions/builtin/goal/tool-registration.d.ts.map +1 -1
- package/dist/core/extensions/builtin/goal/tool-registration.js +26 -15
- package/dist/core/extensions/builtin/goal/tool-registration.js.map +1 -1
- package/dist/core/extensions/builtin/goal/transitions.d.ts +3 -0
- package/dist/core/extensions/builtin/goal/transitions.d.ts.map +1 -0
- package/dist/core/extensions/builtin/goal/transitions.js +45 -0
- package/dist/core/extensions/builtin/goal/transitions.js.map +1 -0
- package/dist/core/extensions/builtin/goal/types.d.ts +10 -4
- package/dist/core/extensions/builtin/goal/types.d.ts.map +1 -1
- package/dist/core/extensions/builtin/goal/types.js +2 -2
- package/dist/core/extensions/builtin/goal/types.js.map +1 -1
- package/dist/core/extensions/builtin/goal/ui.d.ts.map +1 -1
- package/dist/core/extensions/builtin/goal/ui.js +2 -0
- package/dist/core/extensions/builtin/goal/ui.js.map +1 -1
- package/dist/core/extensions/builtin/goal/validation.d.ts +8 -1
- package/dist/core/extensions/builtin/goal/validation.d.ts.map +1 -1
- package/dist/core/extensions/builtin/goal/validation.js +24 -12
- package/dist/core/extensions/builtin/goal/validation.js.map +1 -1
- package/dist/core/extensions/builtin/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/index.js +0 -2
- package/dist/core/extensions/builtin/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 +8 -5
- package/dist/core/extensions/builtin/mcp/index.js.map +1 -1
- package/dist/core/extensions/builtin/permission-system/parsers.d.ts.map +1 -1
- package/dist/core/extensions/builtin/permission-system/parsers.js +1 -0
- package/dist/core/extensions/builtin/permission-system/parsers.js.map +1 -1
- package/dist/core/extensions/builtin/terminal/extension.d.ts.map +1 -1
- package/dist/core/extensions/builtin/terminal/extension.js +32 -0
- package/dist/core/extensions/builtin/terminal/extension.js.map +1 -1
- package/dist/core/extensions/builtin/terminal/index.d.ts +1 -1
- package/dist/core/extensions/builtin/terminal/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/terminal/index.js +1 -1
- package/dist/core/extensions/builtin/terminal/index.js.map +1 -1
- package/dist/core/extensions/builtin/terminal/monitor-notify.d.ts +29 -0
- package/dist/core/extensions/builtin/terminal/monitor-notify.d.ts.map +1 -0
- package/dist/core/extensions/builtin/terminal/monitor-notify.js +185 -0
- package/dist/core/extensions/builtin/terminal/monitor-notify.js.map +1 -0
- package/dist/core/extensions/builtin/terminal/monitor-registry.d.ts +35 -0
- package/dist/core/extensions/builtin/terminal/monitor-registry.d.ts.map +1 -0
- package/dist/core/extensions/builtin/terminal/monitor-registry.js +98 -0
- package/dist/core/extensions/builtin/terminal/monitor-registry.js.map +1 -0
- package/dist/core/extensions/builtin/terminal/notify.d.ts +9 -0
- package/dist/core/extensions/builtin/terminal/notify.d.ts.map +1 -1
- package/dist/core/extensions/builtin/terminal/notify.js +30 -14
- package/dist/core/extensions/builtin/terminal/notify.js.map +1 -1
- package/dist/core/extensions/builtin/terminal/prompt.d.ts +1 -1
- package/dist/core/extensions/builtin/terminal/prompt.d.ts.map +1 -1
- package/dist/core/extensions/builtin/terminal/prompt.js +13 -5
- package/dist/core/extensions/builtin/terminal/prompt.js.map +1 -1
- package/dist/core/extensions/builtin/terminal/runtime-session.d.ts +3 -12
- package/dist/core/extensions/builtin/terminal/runtime-session.d.ts.map +1 -1
- package/dist/core/extensions/builtin/terminal/runtime-session.js +4 -59
- package/dist/core/extensions/builtin/terminal/runtime-session.js.map +1 -1
- package/dist/core/extensions/builtin/terminal/settings.d.ts +8 -0
- package/dist/core/extensions/builtin/terminal/settings.d.ts.map +1 -1
- package/dist/core/extensions/builtin/terminal/settings.js +16 -2
- package/dist/core/extensions/builtin/terminal/settings.js.map +1 -1
- package/dist/core/extensions/builtin/terminal/shared.d.ts +2 -2
- package/dist/core/extensions/builtin/terminal/shared.d.ts.map +1 -1
- package/dist/core/extensions/builtin/terminal/shared.js +2 -1
- package/dist/core/extensions/builtin/terminal/shared.js.map +1 -1
- package/dist/core/extensions/builtin/terminal/tools/bash-output.d.ts +10 -4
- package/dist/core/extensions/builtin/terminal/tools/bash-output.d.ts.map +1 -1
- package/dist/core/extensions/builtin/terminal/tools/bash-output.js +17 -96
- package/dist/core/extensions/builtin/terminal/tools/bash-output.js.map +1 -1
- package/dist/core/extensions/builtin/terminal/tools/context.d.ts +7 -0
- package/dist/core/extensions/builtin/terminal/tools/context.d.ts.map +1 -1
- package/dist/core/extensions/builtin/terminal/tools/context.js.map +1 -1
- package/dist/core/extensions/builtin/terminal/tools/monitor.d.ts +41 -0
- package/dist/core/extensions/builtin/terminal/tools/monitor.d.ts.map +1 -0
- package/dist/core/extensions/builtin/terminal/tools/monitor.js +97 -0
- package/dist/core/extensions/builtin/terminal/tools/monitor.js.map +1 -0
- package/dist/core/extensions/builtin/terminal/tools/render.d.ts +3 -0
- package/dist/core/extensions/builtin/terminal/tools/render.d.ts.map +1 -1
- package/dist/core/extensions/builtin/terminal/tools/render.js +5 -2
- package/dist/core/extensions/builtin/terminal/tools/render.js.map +1 -1
- package/dist/core/extensions/builtin/todotools/fuzzy-match.d.ts +19 -0
- package/dist/core/extensions/builtin/todotools/fuzzy-match.d.ts.map +1 -0
- package/dist/core/extensions/builtin/todotools/fuzzy-match.js +70 -0
- package/dist/core/extensions/builtin/todotools/fuzzy-match.js.map +1 -0
- package/dist/core/extensions/builtin/todotools/normalize.d.ts +8 -0
- package/dist/core/extensions/builtin/todotools/normalize.d.ts.map +1 -0
- package/dist/core/extensions/builtin/todotools/normalize.js +174 -0
- package/dist/core/extensions/builtin/todotools/normalize.js.map +1 -0
- 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 +4 -2
- package/dist/core/extensions/builtin/todotools/prompt.js.map +1 -1
- package/dist/core/extensions/builtin/todotools/state.d.ts +9 -8
- package/dist/core/extensions/builtin/todotools/state.d.ts.map +1 -1
- package/dist/core/extensions/builtin/todotools/state.js +99 -48
- package/dist/core/extensions/builtin/todotools/state.js.map +1 -1
- package/dist/core/extensions/builtin/todotools/tools/todo.d.ts +1 -1
- package/dist/core/extensions/builtin/todotools/tools/todo.d.ts.map +1 -1
- package/dist/core/extensions/builtin/todotools/tools/todo.js +65 -38
- 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 +12 -0
- package/dist/core/extensions/loader.js.map +1 -1
- package/dist/core/extensions/runner.d.ts +5 -0
- package/dist/core/extensions/runner.d.ts.map +1 -1
- package/dist/core/extensions/runner.js +12 -1
- package/dist/core/extensions/runner.js.map +1 -1
- package/dist/core/extensions/types.d.ts +23 -1
- package/dist/core/extensions/types.d.ts.map +1 -1
- package/dist/core/extensions/types.js.map +1 -1
- package/dist/core/keybindings.d.ts +0 -5
- package/dist/core/keybindings.d.ts.map +1 -1
- package/dist/core/keybindings.js +0 -2
- package/dist/core/keybindings.js.map +1 -1
- package/dist/core/messages.d.ts +32 -0
- package/dist/core/messages.d.ts.map +1 -1
- package/dist/core/messages.js +91 -0
- package/dist/core/messages.js.map +1 -1
- package/dist/core/model-resolver.d.ts +9 -1
- package/dist/core/model-resolver.d.ts.map +1 -1
- package/dist/core/model-resolver.js.map +1 -1
- package/dist/core/model-runtime.d.ts +2 -0
- package/dist/core/model-runtime.d.ts.map +1 -1
- package/dist/core/model-runtime.js +4 -3
- package/dist/core/model-runtime.js.map +1 -1
- package/dist/core/resource-loader.d.ts +9 -0
- package/dist/core/resource-loader.d.ts.map +1 -1
- package/dist/core/resource-loader.js +10 -2
- package/dist/core/resource-loader.js.map +1 -1
- package/dist/core/retry-fallback/cooldown.d.ts.map +1 -1
- package/dist/core/retry-fallback/cooldown.js +5 -0
- package/dist/core/retry-fallback/cooldown.js.map +1 -1
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +11 -35
- package/dist/core/sdk.js.map +1 -1
- package/dist/core/settings-manager.d.ts +5 -16
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +0 -13
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/slash-commands.d.ts.map +1 -1
- package/dist/core/slash-commands.js +1 -0
- package/dist/core/slash-commands.js.map +1 -1
- package/dist/core/timings.d.ts +7 -2
- package/dist/core/timings.d.ts.map +1 -1
- package/dist/core/timings.js +11 -0
- package/dist/core/timings.js.map +1 -1
- package/dist/inspector-policy.d.ts +22 -0
- package/dist/inspector-policy.d.ts.map +1 -0
- package/dist/inspector-policy.js +84 -0
- package/dist/inspector-policy.js.map +1 -0
- package/dist/main.d.ts +6 -0
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +20 -23
- package/dist/main.js.map +1 -1
- package/dist/modes/app-server/runtime.d.ts.map +1 -1
- package/dist/modes/app-server/runtime.js +1 -0
- package/dist/modes/app-server/runtime.js.map +1 -1
- package/dist/modes/app-server/threads/goal-handlers.js +4 -2
- package/dist/modes/app-server/threads/goal-handlers.js.map +1 -1
- package/dist/modes/app-server/threads/goal-wire.d.ts.map +1 -1
- package/dist/modes/app-server/threads/goal-wire.js +1 -0
- package/dist/modes/app-server/threads/goal-wire.js.map +1 -1
- package/dist/modes/app-server/threads/handlers.d.ts +1 -0
- package/dist/modes/app-server/threads/handlers.d.ts.map +1 -1
- package/dist/modes/app-server/threads/handlers.js +2 -0
- package/dist/modes/app-server/threads/handlers.js.map +1 -1
- package/dist/modes/app-server/threads/turn-runtime.d.ts +1 -0
- package/dist/modes/app-server/threads/turn-runtime.d.ts.map +1 -1
- package/dist/modes/app-server/threads/turn-runtime.js.map +1 -1
- package/dist/modes/app-server/threads/turns.d.ts.map +1 -1
- package/dist/modes/app-server/threads/turns.js +47 -3
- package/dist/modes/app-server/threads/turns.js.map +1 -1
- package/dist/modes/interactive/components/status-indicator.d.ts +1 -0
- package/dist/modes/interactive/components/status-indicator.d.ts.map +1 -1
- package/dist/modes/interactive/components/status-indicator.js +29 -4
- package/dist/modes/interactive/components/status-indicator.js.map +1 -1
- package/dist/modes/interactive/components/tool-execution.d.ts +5 -1
- package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/dist/modes/interactive/components/tool-execution.js +43 -17
- package/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/dist/modes/interactive/grok/chrome-tokens.d.ts +22 -0
- package/dist/modes/interactive/grok/chrome-tokens.d.ts.map +1 -0
- package/dist/modes/interactive/grok/chrome-tokens.js +27 -0
- package/dist/modes/interactive/grok/chrome-tokens.js.map +1 -0
- package/dist/modes/interactive/grok/chrome.d.ts +51 -0
- package/dist/modes/interactive/grok/chrome.d.ts.map +1 -0
- package/dist/modes/interactive/grok/chrome.js +105 -0
- package/dist/modes/interactive/grok/chrome.js.map +1 -0
- package/dist/modes/interactive/grok/footer.d.ts +14 -0
- package/dist/modes/interactive/grok/footer.d.ts.map +1 -0
- package/dist/modes/interactive/grok/footer.js +27 -0
- package/dist/modes/interactive/grok/footer.js.map +1 -0
- package/dist/modes/interactive/grok/input-card.d.ts +9 -0
- package/dist/modes/interactive/grok/input-card.d.ts.map +1 -0
- package/dist/modes/interactive/grok/input-card.js +30 -0
- package/dist/modes/interactive/grok/input-card.js.map +1 -0
- package/dist/modes/interactive/grok/palette.d.ts +145 -0
- package/dist/modes/interactive/grok/palette.d.ts.map +1 -0
- package/dist/modes/interactive/grok/palette.js +92 -0
- package/dist/modes/interactive/grok/palette.js.map +1 -0
- package/dist/modes/interactive/grok/tool-row.d.ts +17 -0
- package/dist/modes/interactive/grok/tool-row.d.ts.map +1 -0
- package/dist/modes/interactive/grok/tool-row.js +26 -0
- package/dist/modes/interactive/grok/tool-row.js.map +1 -0
- package/dist/modes/interactive/grok/welcome-card.d.ts +10 -0
- package/dist/modes/interactive/grok/welcome-card.d.ts.map +1 -0
- package/dist/modes/interactive/grok/welcome-card.js +30 -0
- package/dist/modes/interactive/grok/welcome-card.js.map +1 -0
- package/dist/modes/interactive/interactive-mode.d.ts +5 -0
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +108 -52
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/interactive/theme/grok-day.json +77 -0
- package/dist/modes/interactive/theme/grok-night.json +93 -0
- package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
- package/dist/modes/interactive/theme/theme.js +4 -0
- package/dist/modes/interactive/theme/theme.js.map +1 -1
- package/dist/modes/rpc/connection-handler.d.ts +3 -3
- package/dist/modes/rpc/connection-handler.js +6 -6
- package/dist/modes/rpc/connection-handler.js.map +1 -1
- package/dist/modes/rpc/custom-capability.d.ts +6 -7
- package/dist/modes/rpc/custom-capability.d.ts.map +1 -1
- package/dist/modes/rpc/custom-capability.js +6 -7
- package/dist/modes/rpc/custom-capability.js.map +1 -1
- package/dist/modes/rpc/rpc-mode.d.ts +2 -2
- package/dist/modes/rpc/rpc-mode.js +5 -5
- package/dist/modes/rpc/rpc-mode.js.map +1 -1
- package/dist/senpi +2 -0
- package/docs/docs.json +4 -0
- package/docs/environment-variables.md +1 -0
- package/docs/grok-neo.md +77 -0
- package/docs/keybindings.md +0 -1
- package/docs/settings.md +3 -3
- package/docs/terminal-tools.md +6 -3
- package/docs/usage.md +1 -1
- package/node_modules/@code-yeongyu/senpi-codemode/CHANGELOG.md +35 -0
- package/node_modules/@code-yeongyu/senpi-codemode/README.md +39 -19
- package/node_modules/@code-yeongyu/senpi-codemode/package.json +3 -3
- package/node_modules/@code-yeongyu/senpi-codemode/src/bridge/http-server.ts +6 -1
- package/node_modules/@code-yeongyu/senpi-codemode/src/bridges/output-bridge.ts +0 -1
- package/node_modules/@code-yeongyu/senpi-codemode/src/extension/eval-notifier.ts +40 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/index.ts +46 -66
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/context-manager.ts +5 -2
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/py/kernel-contract.ts +2 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/py/kernel.ts +19 -4
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/py/prelude.py +7 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/shared/subprocess-kernel.ts +8 -5
- package/node_modules/@code-yeongyu/senpi-codemode/src/prompt/eval-prompt.ts +23 -5
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/detached-cell-manager.ts +322 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/eval-tool.ts +253 -18
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/interrupt-note.ts +58 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/render.ts +28 -6
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/status-events.ts +20 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/types.ts +65 -22
- package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.js +4 -41
- package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/agent.d.ts +3 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/agent.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/agent.js +2 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/agent.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/assistant-terminal-state.d.ts +10 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/assistant-terminal-state.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/assistant-terminal-state.js +38 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/assistant-terminal-state.js.map +1 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/types.d.ts +5 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/types.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/types.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/package.json +2 -2
- package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.js +135 -16
- package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/azure-openai-responses.js +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/azure-openai-responses.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/bedrock-converse-stream.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/bedrock-converse-stream.js +1 -4
- 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 +4 -3
- 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-codex-responses.js +2 -2
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses-shared.d.ts +1 -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 +67 -31
- 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.js +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.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/openrouter.json +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 +10 -0
- package/node_modules/@earendil-works/pi-ai/dist/utils/retry.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/stop-details.d.ts +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/stop-details.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/stop-details.js +7 -3
- package/node_modules/@earendil-works/pi-ai/dist/utils/stop-details.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/tool-call-id.d.ts +9 -0
- package/node_modules/@earendil-works/pi-ai/dist/utils/tool-call-id.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/utils/tool-call-id.js +16 -0
- package/node_modules/@earendil-works/pi-ai/dist/utils/tool-call-id.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/package.json +1 -1
- package/node_modules/@earendil-works/pi-pty/package.json +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/autocomplete.d.ts +1 -0
- package/node_modules/@earendil-works/pi-tui/dist/autocomplete.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/autocomplete.js +35 -3
- package/node_modules/@earendil-works/pi-tui/dist/autocomplete.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/components/editor.d.ts +6 -0
- package/node_modules/@earendil-works/pi-tui/dist/components/editor.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/components/editor.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/components/select-list.d.ts +32 -0
- package/node_modules/@earendil-works/pi-tui/dist/components/select-list.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/components/select-list.js +15 -7
- package/node_modules/@earendil-works/pi-tui/dist/components/select-list.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/index.d.ts +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/index.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/index.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/package.json +1 -1
- package/package.json +8 -8
- package/dist/cli/neo/build-argv.d.ts +0 -19
- package/dist/cli/neo/build-argv.d.ts.map +0 -1
- package/dist/cli/neo/build-argv.js +0 -84
- package/dist/cli/neo/build-argv.js.map +0 -1
- package/dist/cli/neo/daemon-launch.d.ts +0 -25
- package/dist/cli/neo/daemon-launch.d.ts.map +0 -1
- package/dist/cli/neo/daemon-launch.js +0 -97
- package/dist/cli/neo/daemon-launch.js.map +0 -1
- package/dist/cli/neo/gate.d.ts +0 -15
- package/dist/cli/neo/gate.d.ts.map +0 -1
- package/dist/cli/neo/gate.js +0 -21
- package/dist/cli/neo/gate.js.map +0 -1
- package/dist/cli/neo/launch.d.ts +0 -24
- package/dist/cli/neo/launch.d.ts.map +0 -1
- package/dist/cli/neo/launch.js +0 -66
- package/dist/cli/neo/launch.js.map +0 -1
- package/dist/cli/neo/platform.d.ts +0 -38
- package/dist/cli/neo/platform.d.ts.map +0 -1
- package/dist/cli/neo/platform.js +0 -54
- package/dist/cli/neo/platform.js.map +0 -1
- package/dist/cli/neo/resolve-binary.d.ts +0 -39
- package/dist/cli/neo/resolve-binary.d.ts.map +0 -1
- package/dist/cli/neo/resolve-binary.js +0 -66
- package/dist/cli/neo/resolve-binary.js.map +0 -1
- package/dist/core/extensions/builtin/session-observer/index.d.ts +0 -5
- package/dist/core/extensions/builtin/session-observer/index.d.ts.map +0 -1
- package/dist/core/extensions/builtin/session-observer/index.js +0 -36
- package/dist/core/extensions/builtin/session-observer/index.js.map +0 -1
- package/dist/core/extensions/builtin/session-observer/loader.d.ts +0 -3
- package/dist/core/extensions/builtin/session-observer/loader.d.ts.map +0 -1
- package/dist/core/extensions/builtin/session-observer/loader.js +0 -20
- package/dist/core/extensions/builtin/session-observer/loader.js.map +0 -1
- package/dist/core/extensions/builtin/session-observer/overlay-format.d.ts +0 -7
- package/dist/core/extensions/builtin/session-observer/overlay-format.d.ts.map +0 -1
- package/dist/core/extensions/builtin/session-observer/overlay-format.js +0 -30
- package/dist/core/extensions/builtin/session-observer/overlay-format.js.map +0 -1
- package/dist/core/extensions/builtin/session-observer/overlay.d.ts +0 -51
- package/dist/core/extensions/builtin/session-observer/overlay.d.ts.map +0 -1
- package/dist/core/extensions/builtin/session-observer/overlay.js +0 -229
- package/dist/core/extensions/builtin/session-observer/overlay.js.map +0 -1
- package/dist/core/extensions/builtin/session-observer/scanner.d.ts +0 -10
- package/dist/core/extensions/builtin/session-observer/scanner.d.ts.map +0 -1
- package/dist/core/extensions/builtin/session-observer/scanner.js +0 -142
- package/dist/core/extensions/builtin/session-observer/scanner.js.map +0 -1
- package/dist/core/extensions/builtin/session-observer/text.d.ts +0 -7
- package/dist/core/extensions/builtin/session-observer/text.d.ts.map +0 -1
- package/dist/core/extensions/builtin/session-observer/text.js +0 -37
- package/dist/core/extensions/builtin/session-observer/text.js.map +0 -1
- package/dist/core/extensions/builtin/session-observer/transcript-entries.d.ts +0 -7
- package/dist/core/extensions/builtin/session-observer/transcript-entries.d.ts.map +0 -1
- package/dist/core/extensions/builtin/session-observer/transcript-entries.js +0 -71
- package/dist/core/extensions/builtin/session-observer/transcript-entries.js.map +0 -1
- package/dist/core/extensions/builtin/session-observer/transcript-format.d.ts +0 -11
- package/dist/core/extensions/builtin/session-observer/transcript-format.d.ts.map +0 -1
- package/dist/core/extensions/builtin/session-observer/transcript-format.js +0 -65
- package/dist/core/extensions/builtin/session-observer/transcript-format.js.map +0 -1
- package/dist/core/extensions/builtin/session-observer/transcript.d.ts +0 -4
- package/dist/core/extensions/builtin/session-observer/transcript.d.ts.map +0 -1
- package/dist/core/extensions/builtin/session-observer/transcript.js +0 -81
- package/dist/core/extensions/builtin/session-observer/transcript.js.map +0 -1
- package/dist/core/extensions/builtin/session-observer/types.d.ts +0 -33
- package/dist/core/extensions/builtin/session-observer/types.d.ts.map +0 -1
- package/dist/core/extensions/builtin/session-observer/types.js +0 -2
- package/dist/core/extensions/builtin/session-observer/types.js.map +0 -1
- package/dist/modes/rpc/neo-daemon-child-worker.d.ts +0 -29
- package/dist/modes/rpc/neo-daemon-child-worker.d.ts.map +0 -1
- package/dist/modes/rpc/neo-daemon-child-worker.js +0 -95
- package/dist/modes/rpc/neo-daemon-child-worker.js.map +0 -1
- package/dist/modes/rpc/neo-daemon-mode.d.ts +0 -110
- package/dist/modes/rpc/neo-daemon-mode.d.ts.map +0 -1
- package/dist/modes/rpc/neo-daemon-mode.js +0 -267
- package/dist/modes/rpc/neo-daemon-mode.js.map +0 -1
- package/dist/modes/rpc/neo-daemon-protocol.d.ts +0 -50
- package/dist/modes/rpc/neo-daemon-protocol.d.ts.map +0 -1
- package/dist/modes/rpc/neo-daemon-protocol.js +0 -66
- package/dist/modes/rpc/neo-daemon-protocol.js.map +0 -1
- package/dist/modes/rpc/neo-daemon-registry.d.ts +0 -98
- package/dist/modes/rpc/neo-daemon-registry.d.ts.map +0 -1
- package/dist/modes/rpc/neo-daemon-registry.js +0 -209
- package/dist/modes/rpc/neo-daemon-registry.js.map +0 -1
- package/dist/modes/rpc/neo-runtime-options-argv.d.ts +0 -17
- package/dist/modes/rpc/neo-runtime-options-argv.d.ts.map +0 -1
- package/dist/modes/rpc/neo-runtime-options-argv.js +0 -79
- package/dist/modes/rpc/neo-runtime-options-argv.js.map +0 -1
- package/dist/modes/rpc/neo-runtime-options.d.ts +0 -84
- package/dist/modes/rpc/neo-runtime-options.d.ts.map +0 -1
- package/dist/modes/rpc/neo-runtime-options.js +0 -92
- package/dist/modes/rpc/neo-runtime-options.js.map +0 -1
- package/docs/neo.md +0 -111
- package/node_modules/@code-yeongyu/senpi-codemode/src/codemode/runtime.ts +0 -258
- package/node_modules/@code-yeongyu/senpi-codemode/src/codemode/tools.ts +0 -106
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/goal/types.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,kBAAkB,YAAI,QAAQ,EAAE,QAAQ,EAAE,UAAU,CAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/goal/types.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,kBAAkB,YAAI,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,CAAU,CAAC;AACvF,eAAO,MAAM,iCAAiC,YAAI,UAAU,EAAE,SAAS,CAAU,CAAC;AAElF,MAAM,MAAM,UAAU,GAAG,CAAC,OAAO,kBAAkB,CAAC,CAAC,MAAM,CAAC,CAAC;AAC7D,MAAM,MAAM,uBAAuB,GAAG,CAAC,OAAO,iCAAiC,CAAC,CAAC,MAAM,CAAC,CAAC;AAEzF,MAAM,MAAM,YAAY,GAAG;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG,QAAQ,GAAG,iBAAiB,GAAG,kBAAkB,CAAC;AACnF,MAAM,MAAM,gBAAgB,GAAG,OAAO,GAAG,MAAM,CAAC;AAEhD,MAAM,MAAM,IAAI,GAAG;IAClB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,UAAU,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,QAAQ,GAAG;IACtB,OAAO,EAAE,CAAC,CAAC;IACX,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,UAAU,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC9B,IAAI,EAAE,gBAAgB,GAAG,IAAI,CAAC;CAC9B,CAAC;AAEF,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAEzE"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
export const GOAL_STATUS_VALUES = ["active", "paused", "complete"];
|
|
2
|
-
export const
|
|
1
|
+
export const GOAL_STATUS_VALUES = ["active", "paused", "blocked", "complete"];
|
|
2
|
+
export const MODEL_SETTABLE_GOAL_STATUS_VALUES = ["complete", "blocked"];
|
|
3
3
|
export function isRecord(value) {
|
|
4
4
|
return typeof value === "object" && value !== null;
|
|
5
5
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/goal/types.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,QAAQ,EAAE,QAAQ,EAAE,UAAU,CAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/goal/types.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,CAAU,CAAC;AACvF,MAAM,CAAC,MAAM,iCAAiC,GAAG,CAAC,UAAU,EAAE,SAAS,CAAU,CAAC;AAiElF,MAAM,UAAU,QAAQ,CAAC,KAAc;IACtC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,CAAC;AACpD,CAAC","sourcesContent":["export const GOAL_STATUS_VALUES = [\"active\", \"paused\", \"blocked\", \"complete\"] as const;\nexport const MODEL_SETTABLE_GOAL_STATUS_VALUES = [\"complete\", \"blocked\"] as const;\n\nexport type GoalStatus = (typeof GOAL_STATUS_VALUES)[number];\nexport type ModelSettableGoalStatus = (typeof MODEL_SETTABLE_GOAL_STATUS_VALUES)[number];\n\nexport type GoalStoreRef = {\n\tbaseDir: string;\n\tthreadId: string;\n};\n\nexport type GoalAccountingMode = \"active\" | \"activeOrBlocked\" | \"activeOrComplete\";\nexport type GoalUpdateSource = \"model\" | \"user\";\n\nexport type Goal = {\n\tid: string;\n\tthreadId: string;\n\tobjective: string;\n\tstatus: GoalStatus;\n\ttokenBudget?: number;\n\ttokensUsed: number;\n\ttimeUsedSeconds: number;\n\tcreatedAt: number;\n\tupdatedAt: number;\n\tlastStartedAt?: number;\n\tblockedReason?: string;\n\tblockedAt?: number;\n\tcompletedAt?: number;\n};\n\nexport type GoalFile = {\n\tversion: 1;\n\tgoal: Goal | null;\n};\n\nexport type TokenUsageSnapshot = {\n\tinput: number;\n\toutput: number;\n\tcacheRead: number;\n\tcacheWrite: number;\n\ttotalTokens: number;\n};\n\nexport type GoalUpdate = {\n\tobjective?: string;\n\tstatus?: GoalStatus;\n\treason?: string;\n\ttokenBudget?: number | null;\n};\n\nexport type GoalToolSnapshot = {\n\tthreadId: string;\n\tobjective: string;\n\tstatus: GoalStatus;\n\ttokensUsed: number;\n\ttimeUsedSeconds: number;\n\tcreatedAt: number;\n\tupdatedAt: number;\n\tblockedReason?: string;\n\tblockedAt?: number;\n};\n\nexport type GoalToolResponse = {\n\tgoal: GoalToolSnapshot | null;\n};\n\nexport function isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ui.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/goal/ui.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAEvD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAEvC,eAAO,MAAM,UAAU,SAAS,CAAC;AAEjC,wBAAgB,YAAY,CAAC,GAAG,EAAE,gBAAgB,EAAE,IAAI,EAAE,IAAI,GAAG,IAAI,EAAE,kBAAkB,CAAC,EAAE,MAAM,GAAG,IAAI,CAGxG;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,kBAAkB,CAAC,EAAE,MAAM,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"ui.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/goal/ui.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAEvD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAEvC,eAAO,MAAM,UAAU,SAAS,CAAC;AAEjC,wBAAgB,YAAY,CAAC,GAAG,EAAE,gBAAgB,EAAE,IAAI,EAAE,IAAI,GAAG,IAAI,EAAE,kBAAkB,CAAC,EAAE,MAAM,GAAG,IAAI,CAGxG;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,kBAAkB,CAAC,EAAE,MAAM,GAAG,MAAM,CAiB9E"}
|
|
@@ -17,6 +17,8 @@ export function goalStatusText(goal, liveElapsedSeconds) {
|
|
|
17
17
|
}
|
|
18
18
|
case "paused":
|
|
19
19
|
return "Goal paused (/goal resume)";
|
|
20
|
+
case "blocked":
|
|
21
|
+
return goal.blockedReason ? `Goal blocked: ${goal.blockedReason}` : "Goal blocked";
|
|
20
22
|
case "complete":
|
|
21
23
|
return "Goal achieved";
|
|
22
24
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ui.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/goal/ui.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AAGvD,MAAM,CAAC,MAAM,UAAU,GAAG,MAAM,CAAC;AAEjC,MAAM,UAAU,YAAY,CAAC,GAAqB,EAAE,IAAiB,EAAE,kBAA2B;IACjG,IAAI,CAAC,GAAG,CAAC,KAAK;QAAE,OAAO;IACvB,GAAG,CAAC,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,EAAE,kBAAkB,CAAC,CAAC,CAAC;AACpG,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,IAAU,EAAE,kBAA2B;IACrE,QAAQ,IAAI,CAAC,MAAM,EAAE,CAAC;QACrB,KAAK,QAAQ,EAAE,CAAC;YACf,IAAI,kBAAkB,KAAK,SAAS,EAAE,CAAC;gBACtC,OAAO,kBAAkB,wBAAwB,CAAC,kBAAkB,CAAC,GAAG,CAAC;YAC1E,CAAC;YACD,OAAO,IAAI,CAAC,eAAe,GAAG,CAAC;gBAC9B,CAAC,CAAC,kBAAkB,wBAAwB,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG;gBACrE,CAAC,CAAC,eAAe,CAAC;QACpB,CAAC;QACD,KAAK,QAAQ;YACZ,OAAO,4BAA4B,CAAC;QACrC,KAAK,UAAU;YACd,OAAO,eAAe,CAAC;IACzB,CAAC;AACF,CAAC","sourcesContent":["import type { ExtensionContext } from \"../../types.ts\";\nimport { formatGoalElapsedSeconds } from \"./format.ts\";\nimport type { Goal } from \"./types.ts\";\n\nexport const STATUS_KEY = \"goal\";\n\nexport function updateGoalUi(ctx: ExtensionContext, goal: Goal | null, liveElapsedSeconds?: number): void {\n\tif (!ctx.hasUI) return;\n\tctx.ui.setStatus(STATUS_KEY, goal === null ? undefined : goalStatusText(goal, liveElapsedSeconds));\n}\n\nexport function goalStatusText(goal: Goal, liveElapsedSeconds?: number): string {\n\tswitch (goal.status) {\n\t\tcase \"active\": {\n\t\t\tif (liveElapsedSeconds !== undefined) {\n\t\t\t\treturn `Pursuing goal (${formatGoalElapsedSeconds(liveElapsedSeconds)})`;\n\t\t\t}\n\t\t\treturn goal.timeUsedSeconds > 0\n\t\t\t\t? `Pursuing goal (${formatGoalElapsedSeconds(goal.timeUsedSeconds)})`\n\t\t\t\t: \"Pursuing goal\";\n\t\t}\n\t\tcase \"paused\":\n\t\t\treturn \"Goal paused (/goal resume)\";\n\t\tcase \"complete\":\n\t\t\treturn \"Goal achieved\";\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"ui.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/goal/ui.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AAGvD,MAAM,CAAC,MAAM,UAAU,GAAG,MAAM,CAAC;AAEjC,MAAM,UAAU,YAAY,CAAC,GAAqB,EAAE,IAAiB,EAAE,kBAA2B;IACjG,IAAI,CAAC,GAAG,CAAC,KAAK;QAAE,OAAO;IACvB,GAAG,CAAC,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,EAAE,kBAAkB,CAAC,CAAC,CAAC;AACpG,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,IAAU,EAAE,kBAA2B;IACrE,QAAQ,IAAI,CAAC,MAAM,EAAE,CAAC;QACrB,KAAK,QAAQ,EAAE,CAAC;YACf,IAAI,kBAAkB,KAAK,SAAS,EAAE,CAAC;gBACtC,OAAO,kBAAkB,wBAAwB,CAAC,kBAAkB,CAAC,GAAG,CAAC;YAC1E,CAAC;YACD,OAAO,IAAI,CAAC,eAAe,GAAG,CAAC;gBAC9B,CAAC,CAAC,kBAAkB,wBAAwB,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG;gBACrE,CAAC,CAAC,eAAe,CAAC;QACpB,CAAC;QACD,KAAK,QAAQ;YACZ,OAAO,4BAA4B,CAAC;QACrC,KAAK,SAAS;YACb,OAAO,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,iBAAiB,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,cAAc,CAAC;QACpF,KAAK,UAAU;YACd,OAAO,eAAe,CAAC;IACzB,CAAC;AACF,CAAC","sourcesContent":["import type { ExtensionContext } from \"../../types.ts\";\nimport { formatGoalElapsedSeconds } from \"./format.ts\";\nimport type { Goal } from \"./types.ts\";\n\nexport const STATUS_KEY = \"goal\";\n\nexport function updateGoalUi(ctx: ExtensionContext, goal: Goal | null, liveElapsedSeconds?: number): void {\n\tif (!ctx.hasUI) return;\n\tctx.ui.setStatus(STATUS_KEY, goal === null ? undefined : goalStatusText(goal, liveElapsedSeconds));\n}\n\nexport function goalStatusText(goal: Goal, liveElapsedSeconds?: number): string {\n\tswitch (goal.status) {\n\t\tcase \"active\": {\n\t\t\tif (liveElapsedSeconds !== undefined) {\n\t\t\t\treturn `Pursuing goal (${formatGoalElapsedSeconds(liveElapsedSeconds)})`;\n\t\t\t}\n\t\t\treturn goal.timeUsedSeconds > 0\n\t\t\t\t? `Pursuing goal (${formatGoalElapsedSeconds(goal.timeUsedSeconds)})`\n\t\t\t\t: \"Pursuing goal\";\n\t\t}\n\t\tcase \"paused\":\n\t\t\treturn \"Goal paused (/goal resume)\";\n\t\tcase \"blocked\":\n\t\t\treturn goal.blockedReason ? `Goal blocked: ${goal.blockedReason}` : \"Goal blocked\";\n\t\tcase \"complete\":\n\t\t\treturn \"Goal achieved\";\n\t}\n}\n"]}
|
|
@@ -1,6 +1,13 @@
|
|
|
1
1
|
import { type GoalStatus } from "./types.ts";
|
|
2
2
|
export declare const MAX_OBJECTIVE_LENGTH = 4000;
|
|
3
|
-
export
|
|
3
|
+
export type ValidatedObjective = {
|
|
4
|
+
objective: string;
|
|
5
|
+
truncated: boolean;
|
|
6
|
+
fullTextFileName?: string;
|
|
7
|
+
};
|
|
8
|
+
export declare function validateObjective(value: string, fullTextFileName: string): ValidatedObjective;
|
|
9
|
+
export declare function truncationMarker(fullTextFileName: string): string;
|
|
10
|
+
export declare function objectiveTruncationNotice(fullTextFileName: string): string;
|
|
4
11
|
export declare function isGoalStatus(value: unknown): value is GoalStatus;
|
|
5
12
|
export declare function isNonNegativeSafeInteger(value: unknown): value is number;
|
|
6
13
|
export declare function resolveTokenBudget(current: number | undefined, update: number | null | undefined): number | undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/goal/validation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC;AAEjE,eAAO,MAAM,oBAAoB,OAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/goal/validation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC;AAEjE,eAAO,MAAM,oBAAoB,OAAQ,CAAC;AAG1C,MAAM,MAAM,kBAAkB,GAAG;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC1B,CAAC;AAEF,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,GAAG,kBAAkB,CAU7F;AAED,wBAAgB,gBAAgB,CAAC,gBAAgB,EAAE,MAAM,GAAG,MAAM,CAEjE;AAED,wBAAgB,yBAAyB,CAAC,gBAAgB,EAAE,MAAM,GAAG,MAAM,CAE1E;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,UAAU,CAEhE;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAExE;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAGrH;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAGzD"}
|
|
@@ -1,15 +1,23 @@
|
|
|
1
1
|
import { GOAL_STATUS_VALUES } from "./types.js";
|
|
2
2
|
export const MAX_OBJECTIVE_LENGTH = 4_000;
|
|
3
|
-
const
|
|
4
|
-
export function validateObjective(value) {
|
|
3
|
+
const WHITESPACE_LOOKBACK = 200;
|
|
4
|
+
export function validateObjective(value, fullTextFileName) {
|
|
5
5
|
const objective = value.trim();
|
|
6
6
|
if (objective.length === 0)
|
|
7
7
|
throw new Error("objective must not be empty");
|
|
8
|
-
const
|
|
9
|
-
if (
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
8
|
+
const codePoints = [...objective];
|
|
9
|
+
if (codePoints.length <= MAX_OBJECTIVE_LENGTH)
|
|
10
|
+
return { objective, truncated: false };
|
|
11
|
+
const marker = truncationMarker(fullTextFileName);
|
|
12
|
+
const payloadBudget = MAX_OBJECTIVE_LENGTH - [...marker].length;
|
|
13
|
+
const payload = codePoints.slice(0, nearestWhitespaceCut(codePoints, payloadBudget) ?? payloadBudget).join("");
|
|
14
|
+
return { objective: `${payload}${marker}`, truncated: true, fullTextFileName };
|
|
15
|
+
}
|
|
16
|
+
export function truncationMarker(fullTextFileName) {
|
|
17
|
+
return `… [truncated; full objective: ${fullTextFileName}]`;
|
|
18
|
+
}
|
|
19
|
+
export function objectiveTruncationNotice(fullTextFileName) {
|
|
20
|
+
return `Objective was truncated; full objective saved to ${fullTextFileName}.`;
|
|
13
21
|
}
|
|
14
22
|
export function isGoalStatus(value) {
|
|
15
23
|
return GOAL_STATUS_VALUES.some((status) => status === value);
|
|
@@ -20,14 +28,18 @@ export function isNonNegativeSafeInteger(value) {
|
|
|
20
28
|
export function resolveTokenBudget(current, update) {
|
|
21
29
|
if (update === undefined)
|
|
22
30
|
return current;
|
|
23
|
-
|
|
24
|
-
return undefined;
|
|
25
|
-
return validateTokenBudget(update);
|
|
31
|
+
return update === null ? undefined : validateTokenBudget(update);
|
|
26
32
|
}
|
|
27
33
|
export function validateTokenBudget(value) {
|
|
28
|
-
if (!isNonNegativeSafeInteger(value))
|
|
34
|
+
if (!isNonNegativeSafeInteger(value))
|
|
29
35
|
throw new Error("token budget must be a non-negative integer");
|
|
30
|
-
}
|
|
31
36
|
return value;
|
|
32
37
|
}
|
|
38
|
+
function nearestWhitespaceCut(codePoints, payloadBudget) {
|
|
39
|
+
for (let index = payloadBudget - 1; index >= Math.max(0, payloadBudget - WHITESPACE_LOOKBACK); index -= 1) {
|
|
40
|
+
if (/\s/u.test(codePoints[index] ?? ""))
|
|
41
|
+
return index;
|
|
42
|
+
}
|
|
43
|
+
return undefined;
|
|
44
|
+
}
|
|
33
45
|
//# sourceMappingURL=validation.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/goal/validation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAmB,MAAM,YAAY,CAAC;AAEjE,MAAM,CAAC,MAAM,oBAAoB,GAAG,KAAK,CAAC;AAC1C,MAAM,
|
|
1
|
+
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/goal/validation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAmB,MAAM,YAAY,CAAC;AAEjE,MAAM,CAAC,MAAM,oBAAoB,GAAG,KAAK,CAAC;AAC1C,MAAM,mBAAmB,GAAG,GAAG,CAAC;AAQhC,MAAM,UAAU,iBAAiB,CAAC,KAAa,EAAE,gBAAwB;IACxE,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC/B,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;IAC3E,MAAM,UAAU,GAAG,CAAC,GAAG,SAAS,CAAC,CAAC;IAClC,IAAI,UAAU,CAAC,MAAM,IAAI,oBAAoB;QAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IAEtF,MAAM,MAAM,GAAG,gBAAgB,CAAC,gBAAgB,CAAC,CAAC;IAClD,MAAM,aAAa,GAAG,oBAAoB,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,MAAM,CAAC;IAChE,MAAM,OAAO,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,oBAAoB,CAAC,UAAU,EAAE,aAAa,CAAC,IAAI,aAAa,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC/G,OAAO,EAAE,SAAS,EAAE,GAAG,OAAO,GAAG,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,gBAAgB,EAAE,CAAC;AAChF,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,gBAAwB;IACxD,OAAO,iCAAiC,gBAAgB,GAAG,CAAC;AAC7D,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,gBAAwB;IACjE,OAAO,oDAAoD,gBAAgB,GAAG,CAAC;AAChF,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,KAAc;IAC1C,OAAO,kBAAkB,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,KAAK,KAAK,CAAC,CAAC;AAC9D,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,KAAc;IACtD,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;AAC/E,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,OAA2B,EAAE,MAAiC;IAChG,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,OAAO,CAAC;IACzC,OAAO,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC;AAClE,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,KAAa;IAChD,IAAI,CAAC,wBAAwB,CAAC,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;IACrG,OAAO,KAAK,CAAC;AACd,CAAC;AAED,SAAS,oBAAoB,CAAC,UAAoB,EAAE,aAAqB;IACxE,KAAK,IAAI,KAAK,GAAG,aAAa,GAAG,CAAC,EAAE,KAAK,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,aAAa,GAAG,mBAAmB,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QAC3G,IAAI,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;YAAE,OAAO,KAAK,CAAC;IACvD,CAAC;IACD,OAAO,SAAS,CAAC;AAClB,CAAC","sourcesContent":["import { GOAL_STATUS_VALUES, type GoalStatus } from \"./types.ts\";\n\nexport const MAX_OBJECTIVE_LENGTH = 4_000;\nconst WHITESPACE_LOOKBACK = 200;\n\nexport type ValidatedObjective = {\n\tobjective: string;\n\ttruncated: boolean;\n\tfullTextFileName?: string;\n};\n\nexport function validateObjective(value: string, fullTextFileName: string): ValidatedObjective {\n\tconst objective = value.trim();\n\tif (objective.length === 0) throw new Error(\"objective must not be empty\");\n\tconst codePoints = [...objective];\n\tif (codePoints.length <= MAX_OBJECTIVE_LENGTH) return { objective, truncated: false };\n\n\tconst marker = truncationMarker(fullTextFileName);\n\tconst payloadBudget = MAX_OBJECTIVE_LENGTH - [...marker].length;\n\tconst payload = codePoints.slice(0, nearestWhitespaceCut(codePoints, payloadBudget) ?? payloadBudget).join(\"\");\n\treturn { objective: `${payload}${marker}`, truncated: true, fullTextFileName };\n}\n\nexport function truncationMarker(fullTextFileName: string): string {\n\treturn `… [truncated; full objective: ${fullTextFileName}]`;\n}\n\nexport function objectiveTruncationNotice(fullTextFileName: string): string {\n\treturn `Objective was truncated; full objective saved to ${fullTextFileName}.`;\n}\n\nexport function isGoalStatus(value: unknown): value is GoalStatus {\n\treturn GOAL_STATUS_VALUES.some((status) => status === value);\n}\n\nexport function isNonNegativeSafeInteger(value: unknown): value is number {\n\treturn typeof value === \"number\" && Number.isSafeInteger(value) && value >= 0;\n}\n\nexport function resolveTokenBudget(current: number | undefined, update: number | null | undefined): number | undefined {\n\tif (update === undefined) return current;\n\treturn update === null ? undefined : validateTokenBudget(update);\n}\n\nexport function validateTokenBudget(value: number): number {\n\tif (!isNonNegativeSafeInteger(value)) throw new Error(\"token budget must be a non-negative integer\");\n\treturn value;\n}\n\nfunction nearestWhitespaceCut(codePoints: string[], payloadBudget: number): number | undefined {\n\tfor (let index = payloadBudget - 1; index >= Math.max(0, payloadBudget - WHITESPACE_LOOKBACK); index -= 1) {\n\t\tif (/\\s/u.test(codePoints[index] ?? \"\")) return index;\n\t}\n\treturn undefined;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/core/extensions/builtin/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAOpD,OAAO,aAAa,MAAM,WAAW,CAAC;AACtC,OAAO,cAAc,MAAM,YAAY,CAAC;AAaxC,OAAO,wBAAwB,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/core/extensions/builtin/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAOpD,OAAO,aAAa,MAAM,WAAW,CAAC;AACtC,OAAO,cAAc,MAAM,YAAY,CAAC;AAaxC,OAAO,wBAAwB,MAAM,wBAAwB,CAAC;AAO9D,OAAO,YAAY,MAAM,UAAU,CAAC;AAKpC,MAAM,WAAW,uBAAuB;IACvC,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,gBAAgB,CAAC;CAC1B;AAED,eAAO,MAAM,yBAAyB,YAAI,MAAM,EAAE,OAAO,EAAE,mBAAmB,EAAE,KAAK,CAAU,CAAC;AAEhG,eAAO,MAAM,+BAA+B;;;;;CAKoC,CAAC;AAEjF,eAAO,MAAM,iBAAiB,EAAE,uBAAuB,EAgCtD,CAAC"}
|
|
@@ -22,7 +22,6 @@ import promptUrlWidgetExtension from "./prompt-url-widget.js";
|
|
|
22
22
|
import redrawsExtension from "./redraws.js";
|
|
23
23
|
import piRulesExtension from "./rules/index.js";
|
|
24
24
|
import serviceTierExtension from "./service-tier.js";
|
|
25
|
-
import sessionObserverExtension from "./session-observer/index.js";
|
|
26
25
|
import terminalExtension from "./terminal/index.js";
|
|
27
26
|
import todowriteExtension from "./todotools/index.js";
|
|
28
27
|
import toolPairGuardExtension from "./tool-pair-guard/index.js";
|
|
@@ -57,7 +56,6 @@ export const builtinExtensions = [
|
|
|
57
56
|
{ id: "compaction", factory: compactionExtension },
|
|
58
57
|
{ id: "history-search", factory: historySearchExtension },
|
|
59
58
|
{ id: "import-repro", factory: importReproExtension },
|
|
60
|
-
{ id: "session-observer", factory: sessionObserverExtension },
|
|
61
59
|
{ id: "websearch", factory: websearchExtension },
|
|
62
60
|
{ id: "webfetch", factory: webfetchExtension },
|
|
63
61
|
{ id: "video-in", factory: videoInExtension },
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/core/extensions/builtin/index.ts"],"names":[],"mappings":"AACA,OAAO,sBAAsB,MAAM,2BAA2B,CAAC;AAC/D,OAAO,2BAA2B,MAAM,iCAAiC,CAAC;AAC1E,OAAO,oBAAoB,MAAM,yBAAyB,CAAC;AAC3D,OAAO,YAAY,MAAM,gBAAgB,CAAC;AAC1C,OAAO,mBAAmB,MAAM,uBAAuB,CAAC;AACxD,OAAO,qBAAqB,MAAM,0BAA0B,CAAC;AAC7D,OAAO,aAAa,MAAM,WAAW,CAAC;AACtC,OAAO,cAAc,MAAM,YAAY,CAAC;AACxC,OAAO,aAAa,MAAM,iBAAiB,CAAC;AAC5C,OAAO,sBAAsB,MAAM,4BAA4B,CAAC;AAChE,OAAO,sBAAsB,MAAM,2BAA2B,CAAC;AAC/D,OAAO,cAAc,MAAM,kBAAkB,CAAC;AAC9C,OAAO,oBAAoB,MAAM,mBAAmB,CAAC;AACrD,OAAO,eAAe,MAAM,oBAAoB,CAAC;AACjD,OAAO,YAAY,MAAM,gBAAgB,CAAC;AAC1C,OAAO,sBAAsB,MAAM,2BAA2B,CAAC;AAC/D,OAAO,uBAAuB,MAAM,6BAA6B,CAAC;AAClE,OAAO,wBAAwB,MAAM,8BAA8B,CAAC;AACpE,OAAO,yBAAyB,MAAM,8BAA8B,CAAC;AACrE,OAAO,qBAAqB,MAAM,0BAA0B,CAAC;AAC7D,OAAO,wBAAwB,MAAM,wBAAwB,CAAC;AAC9D,OAAO,gBAAgB,MAAM,cAAc,CAAC;AAC5C,OAAO,gBAAgB,MAAM,kBAAkB,CAAC;AAChD,OAAO,oBAAoB,MAAM,mBAAmB,CAAC;AACrD,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/core/extensions/builtin/index.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ExtensionFactory } from \"../types.ts\";\nimport anthropicBashExtension from \"./anthropic-bash/index.ts\";\nimport anthropicWebSearchExtension from \"./anthropic-web-search/index.ts\";\nimport bashTimeoutExtension from \"./bash-timeout/index.ts\";\nimport btwExtension from \"./btw/index.ts\";\nimport compactionExtension from \"./compaction/index.ts\";\nimport configReloadExtension from \"./config-reload/index.ts\";\nimport diffExtension from \"./diff.ts\";\nimport filesExtension from \"./files.ts\";\nimport goalExtension from \"./goal/index.ts\";\nimport gptApplyPatchExtension from \"./gpt-apply-patch/index.ts\";\nimport historySearchExtension from \"./history-search/index.ts\";\nimport hooksExtension from \"./hooks/index.ts\";\nimport importReproExtension from \"./import-repro.ts\";\nimport lookAtExtension from \"./look-at/index.ts\";\nimport mcpExtension from \"./mcp/index.ts\";\nimport modelFallbackExtension from \"./model-fallback/index.ts\";\nimport nestedAgentsMdExtension from \"./nested-agents-md/index.ts\";\nimport openaiWebSearchExtension from \"./openai-web-search/index.ts\";\nimport permissionSystemExtension from \"./permission-system/index.ts\";\nimport promptPresetExtension from \"./prompt-preset/index.ts\";\nimport promptUrlWidgetExtension from \"./prompt-url-widget.ts\";\nimport redrawsExtension from \"./redraws.ts\";\nimport piRulesExtension from \"./rules/index.ts\";\nimport serviceTierExtension from \"./service-tier.ts\";\nimport terminalExtension from \"./terminal/index.ts\";\nimport todowriteExtension from \"./todotools/index.ts\";\nimport toolPairGuardExtension from \"./tool-pair-guard/index.ts\";\nimport tpsExtension from \"./tps.ts\";\nimport videoInExtension from \"./video-in/index.ts\";\nimport webfetchExtension from \"./webfetch/index.ts\";\nimport websearchExtension from \"./websearch/index.ts\";\n\nexport interface BuiltinExtensionFactory {\n\tid: string;\n\tfactory: ExtensionFactory;\n}\n\nexport const globalDefaultExtensionIds = [\"diff\", \"files\", \"prompt-url-widget\", \"tps\"] as const;\n\nexport const globalDefaultExtensionFactories = {\n\tdiff: diffExtension,\n\tfiles: filesExtension,\n\t\"prompt-url-widget\": promptUrlWidgetExtension,\n\ttps: tpsExtension,\n} satisfies Record<(typeof globalDefaultExtensionIds)[number], ExtensionFactory>;\n\nexport const builtinExtensions: BuiltinExtensionFactory[] = [\n\t{ id: \"hooks\", factory: hooksExtension },\n\t{ id: \"permission-system\", factory: permissionSystemExtension },\n\t{ id: \"gpt-apply-patch\", factory: gptApplyPatchExtension },\n\t{ id: \"prompt-preset\", factory: promptPresetExtension },\n\t{ id: \"todowrite\", factory: todowriteExtension },\n\t{ id: \"redraws\", factory: redrawsExtension },\n\t{ id: \"anthropic-web-search\", factory: anthropicWebSearchExtension },\n\t{ id: \"anthropic-bash\", factory: anthropicBashExtension },\n\t{ id: \"openai-web-search\", factory: openaiWebSearchExtension },\n\t{ id: \"service-tier\", factory: serviceTierExtension },\n\t{ id: \"model-fallback\", factory: modelFallbackExtension },\n\t{ id: \"bash-timeout\", factory: bashTimeoutExtension },\n\t// Terminal follows bash-timeout so its injected default reaches the PTY bash, and follows\n\t// anthropic-bash so mutual-exclusion (companion step-aside) is evaluated after it registers.\n\t{ id: \"terminal\", factory: terminalExtension },\n\t{ id: \"tool-pair-guard\", factory: toolPairGuardExtension },\n\t{ id: \"compaction\", factory: compactionExtension },\n\t{ id: \"history-search\", factory: historySearchExtension },\n\t{ id: \"import-repro\", factory: importReproExtension },\n\t{ id: \"websearch\", factory: websearchExtension },\n\t{ id: \"webfetch\", factory: webfetchExtension },\n\t{ id: \"video-in\", factory: videoInExtension },\n\t{ id: \"look-at\", factory: lookAtExtension },\n\t{ id: \"nested-agents-md\", factory: nestedAgentsMdExtension },\n\t{ id: \"rules\", factory: piRulesExtension },\n\t{ id: \"goal\", factory: goalExtension },\n\t{ id: \"btw\", factory: btwExtension },\n\t// Config reload follows settings-dependent builtins so reloads rebuild their resolved settings before MCP observes them.\n\t{ id: \"config-reload\", factory: configReloadExtension },\n\t// Keep MCP last so its eventual provider-payload tap observes all co-resident builtin mutations.\n\t{ id: \"mcp\", factory: mcpExtension },\n];\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/mcp/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAoB,gBAAgB,EAAqB,MAAM,gBAAgB,CAAC;AAQ1G,OAAO,EAAiB,UAAU,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/mcp/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAoB,gBAAgB,EAAqB,MAAM,gBAAgB,CAAC;AAQ1G,OAAO,EAAiB,UAAU,EAAE,MAAM,cAAc,CAAC;AAWzD,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,UAAU,EAAE,YAAY,UAAO,GAAG,gBAAgB,CAwJ7F;AAWD,MAAM,CAAC,OAAO,UAAU,YAAY,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAG3E"}
|
|
@@ -9,6 +9,7 @@ import { expandMcpResourceMentions } from "./resources.js";
|
|
|
9
9
|
import { getMcpService, McpService } from "./service.js";
|
|
10
10
|
import { parseSkillMcpDeclarations, skillActivationTargets, } from "./skills.js";
|
|
11
11
|
import { reportMcpAsyncError, wrapAsync } from "./wrap.js";
|
|
12
|
+
const MCP_BUILTIN_EXTENSION_PATH = "<builtin:mcp>";
|
|
12
13
|
export function createMcpExtension(service, sessionOwned = true) {
|
|
13
14
|
return (pi) => {
|
|
14
15
|
let attachPromise;
|
|
@@ -141,12 +142,14 @@ export function createMcpExtension(service, sessionOwned = true) {
|
|
|
141
142
|
}
|
|
142
143
|
});
|
|
143
144
|
pi.on("session_shutdown", wrapAsync("mcp.session_shutdown", async (event) => {
|
|
145
|
+
if (event.reason === "reload" && !sessionOwned)
|
|
146
|
+
return;
|
|
144
147
|
await service.handleSessionShutdown(event);
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
148
|
+
}, sink));
|
|
149
|
+
pi.on("session_extensions_removed", wrapAsync("mcp.session_extensions_removed", async (event) => {
|
|
150
|
+
if (event.removed.some((extension) => extension.path === MCP_BUILTIN_EXTENSION_PATH)) {
|
|
151
|
+
await service.dispose("reload");
|
|
152
|
+
}
|
|
150
153
|
}, sink));
|
|
151
154
|
};
|
|
152
155
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/mcp/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { bindToProviderScope } from \"@earendil-works/pi-ai/node/provider-scope\";\nimport type { ExtensionAPI, ExtensionContext, ExtensionFactory, SessionStartEvent } from \"../../types.ts\";\nimport { registerMcpCommands } from \"./commands.ts\";\nimport { AnthropicNativeToolSearchAdapter } from \"./expose/native-search.ts\";\nimport { TOOL_SEARCH_TOOL_NAME } from \"./expose/tool-search.ts\";\nimport { injectMcpInstructions, refreshMcpInstructionsForSession } from \"./instructions.ts\";\nimport { createMcpLogger } from \"./log.ts\";\nimport { registerMcpPromptCommands } from \"./prompts.ts\";\nimport { expandMcpResourceMentions } from \"./resources.ts\";\nimport { getMcpService, McpService } from \"./service.ts\";\nimport {\n\tparseSkillMcpDeclarations,\n\ttype SkillLike,\n\ttype SkillMcpDeclarations,\n\tskillActivationTargets,\n} from \"./skills.ts\";\nimport { reportMcpAsyncError, wrapAsync } from \"./wrap.ts\";\n\nexport function createMcpExtension(service: McpService, sessionOwned = true): ExtensionFactory {\n\treturn (pi: ExtensionAPI): void => {\n\t\tlet attachPromise: Promise<void> | undefined;\n\t\tconst sink = {\n\t\t\tlogger: {\n\t\t\t\terror(message: string, data?: unknown): void {\n\t\t\t\t\tcreateMcpLogger(\"service\").error(message, data);\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\n\t\tregisterMcpCommands(pi, service);\n\n\t\t// Native provider tool-search adapter (todo 33 — Anthropic, spike = GO).\n\t\t// Runs on every request but is a no-op unless settings.nativeToolSearch is\n\t\t// auto|true and the model is anthropic-messages; a 400 disables it for the\n\t\t// session and falls back to the always-registered local tool_search.\n\t\tconst nativeAdapter = new AnthropicNativeToolSearchAdapter({\n\t\t\tenabled: () => {\n\t\t\t\tconst setting = service.getNativeToolSearchSetting();\n\t\t\t\treturn setting === true || setting === \"auto\";\n\t\t\t},\n\t\t\tisDeferrable: (name) => name.startsWith(\"mcp_\") && name !== TOOL_SEARCH_TOOL_NAME,\n\t\t\tonFallback: (reason) => createMcpLogger(\"service\").warn(reason),\n\t\t\tsearchToolName: TOOL_SEARCH_TOOL_NAME,\n\t\t});\n\t\tpi.on(\"before_provider_request\", (event, ctx) => nativeAdapter.applyBeforeRequest(ctx.model?.api, event.payload));\n\t\tpi.on(\"after_provider_response\", (event) => nativeAdapter.noteResponseStatus(event.status));\n\t\t// Resumed/compacted sessions carry tool_search activation markers in their\n\t\t// history but re-enter search mode with only directTools active. The context\n\t\t// event (fired before each LLM call, with the full message history) replays\n\t\t// the markers as a safety net; the primary replay happens at attach time so\n\t\t// the FIRST turn's payload already carries previously promoted tools. Scans\n\t\t// once per registration (see McpService.maybeRehydrateFromHistory).\n\t\tpi.on(\"context\", (event) => {\n\t\t\tservice.maybeRehydrateFromHistory(event.messages);\n\t\t});\n\n\t\t// skills-carry-MCP (todo 37): skills declaring MCP servers (mcp.json\n\t\t// sidecar or SKILL.md frontmatter) register lazily with tools hidden;\n\t\t// loading a skill — /skill:<name> input or the model reading its SKILL.md —\n\t\t// reveals that skill's includeTools matches for the rest of the session.\n\t\tlet skillDecls: SkillMcpDeclarations = { servers: new Map(), warnings: [] };\n\t\tlet skillsByName = new Map<string, SkillLike>();\n\t\tconst loadedSkills = new Set<string>();\n\t\tconst revealSkill = (skillName: string): void => {\n\t\t\tif (loadedSkills.has(skillName) || !skillsByName.has(skillName)) return;\n\t\t\tloadedSkills.add(skillName);\n\t\t\tconst registered = service.getTierBSearchable();\n\t\t\tconst targets = skillActivationTargets(skillDecls, skillName, registered);\n\t\t\tif (targets.length > 0) service.activateSkillMcpTools(targets);\n\t\t};\n\t\tpi.on(\"input\", async (event, ctx) => {\n\t\t\tconst match = /^\\s*\\/skill:([A-Za-z0-9._-]+)/.exec(event.text);\n\t\t\tif (match) revealSkill(match[1]);\n\t\t\t// @mcp:<server>/<uri> mention expansion (todo 39): recognized mentions are\n\t\t\t// inlined via the sanctioned input transform; failures pass through\n\t\t\t// untouched with a one-line notice so submission is never blocked.\n\t\t\tif (event.text.includes(\"@mcp:\")) {\n\t\t\t\tconst expansion = await expandMcpResourceMentions(event.text, () => service.getMcpResourceServers());\n\t\t\t\tfor (const notice of expansion.notices) {\n\t\t\t\t\tcreateMcpLogger(\"resources\").warn(notice);\n\t\t\t\t\tvoid ctx.ui?.notify?.(notice, \"warning\");\n\t\t\t\t}\n\t\t\t\tif (expansion.changed) return { action: \"transform\", text: expansion.text };\n\t\t\t}\n\t\t\treturn undefined;\n\t\t});\n\t\tpi.on(\"tool_call\", (event) => {\n\t\t\tif (event.toolName !== \"read\") return undefined;\n\t\t\tconst path = (event.input as { path?: string }).path;\n\t\t\tif (path === undefined) return undefined;\n\t\t\tfor (const [name, skill] of skillsByName) {\n\t\t\t\tif (path === skill.filePath || path.endsWith(skill.filePath)) revealSkill(name);\n\t\t\t}\n\t\t\treturn undefined;\n\t\t});\n\n\t\t// Attach is SINGLE-FLIGHT. session_start handlers are dispatched\n\t\t// fire-and-forget, so a slow attach (a cold MCP server's boot + catalog\n\t\t// collection is awaited inside attachSession) can still be in flight when\n\t\t// before_agent_start fires. The old `attached` boolean was only set on\n\t\t// completion, so before_agent_start would start a SECOND concurrent attach —\n\t\t// which found the connection entries already created (still \"connecting\"),\n\t\t// collected an empty catalog, and registered no MCP tools for turn 1; the\n\t\t// first attach then landed the real registration turns later. Memoizing the\n\t\t// in-flight promise makes before_agent_start await the ORIGINAL attach, so\n\t\t// the first turn's payload deterministically carries the MCP tool set.\n\t\t// session_start always starts a fresh attach (reloads must re-sync config).\n\t\tconst attach = (event: SessionStartEvent, ctx: ExtensionContext): Promise<void> => {\n\t\t\tattachPromise = (async () => {\n\t\t\t\tawait service.attachSession(event, ctx, pi);\n\t\t\t\trefreshMcpInstructionsForSession(service);\n\t\t\t\tif (sessionOwned) registerMcpPromptCommands(service, pi, service.getMcpPromptServers());\n\t\t\t\telse registerMcpPromptCommands(pi, service.getMcpPromptServers());\n\t\t\t})();\n\t\t\treturn attachPromise;\n\t\t};\n\t\tpi.on(\n\t\t\t\"session_start\",\n\t\t\twrapAsync(\"mcp.session_start\", (event, ctx) => attach(event, ctx), sink),\n\t\t);\n\t\tpi.on(\"before_agent_start\", async (event, ctx) => {\n\t\t\ttry {\n\t\t\t\t// Elicitation (todo 41): point mid-call forms at this session's UI.\n\t\t\t\tservice.setMcpElicitationUiProvider(() => ctx.ui);\n\t\t\t\tawait (attachPromise ?? attach({ type: \"session_start\", reason: \"startup\" }, ctx));\n\t\t\t\tconst skills = (event.systemPromptOptions.skills ?? []) as readonly SkillLike[];\n\t\t\t\tif (skills.length > 0) {\n\t\t\t\t\tskillsByName = new Map(skills.map((skill) => [skill.name, skill]));\n\t\t\t\t\tskillDecls = parseSkillMcpDeclarations(skills);\n\t\t\t\t\tconst declared = new Map(\n\t\t\t\t\t\t[...skillDecls.servers].map(([name, decl]) => [name, { raw: decl.raw, sourcePath: decl.sourcePath }]),\n\t\t\t\t\t);\n\t\t\t\t\tconst warnings = [\n\t\t\t\t\t\t...skillDecls.warnings,\n\t\t\t\t\t\t...(declared.size > 0 ? await service.attachSkillMcpServers(declared) : []),\n\t\t\t\t\t];\n\t\t\t\t\tfor (const warning of warnings) createMcpLogger(\"skills\").warn(warning);\n\t\t\t\t}\n\t\t\t\tconst systemPrompt = injectMcpInstructions(service, event.systemPrompt);\n\t\t\t\treturn systemPrompt === undefined ? undefined : { systemPrompt };\n\t\t\t} catch (error) {\n\t\t\t\tif (!(error instanceof Error)) throw error;\n\t\t\t\tawait reportMcpAsyncError(\"mcp.before_agent_start\", error, sink);\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t});\n\t\tpi.on(\n\t\t\t\"session_shutdown\",\n\t\t\twrapAsync(\n\t\t\t\t\"mcp.session_shutdown\",\n\t\t\t\tasync (event) => {\n\t\t\t\t\tawait service.handleSessionShutdown(event);\n\t\t\t\t\t// A classic extension instance can be reused by the test/legacy host\n\t\t\t\t\t// after reload. Its singleton is intentionally refreshed for that next\n\t\t\t\t\t// session; scoped factories keep their closed instance.\n\t\t\t\t\tif (!sessionOwned && event.reason === \"reload\" && service.isDisposed()) service = getMcpService();\n\t\t\t\t},\n\t\t\t\tsink,\n\t\t\t),\n\t\t);\n\t};\n}\n\nfunction hasProviderScope(): boolean {\n\ttry {\n\t\tbindToProviderScope(() => undefined);\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nexport default function mcpExtension(pi: ExtensionAPI): void | Promise<void> {\n\tconst sessionOwned = hasProviderScope();\n\treturn createMcpExtension(sessionOwned ? new McpService() : getMcpService(), sessionOwned)(pi);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/mcp/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { bindToProviderScope } from \"@earendil-works/pi-ai/node/provider-scope\";\nimport type { ExtensionAPI, ExtensionContext, ExtensionFactory, SessionStartEvent } from \"../../types.ts\";\nimport { registerMcpCommands } from \"./commands.ts\";\nimport { AnthropicNativeToolSearchAdapter } from \"./expose/native-search.ts\";\nimport { TOOL_SEARCH_TOOL_NAME } from \"./expose/tool-search.ts\";\nimport { injectMcpInstructions, refreshMcpInstructionsForSession } from \"./instructions.ts\";\nimport { createMcpLogger } from \"./log.ts\";\nimport { registerMcpPromptCommands } from \"./prompts.ts\";\nimport { expandMcpResourceMentions } from \"./resources.ts\";\nimport { getMcpService, McpService } from \"./service.ts\";\nimport {\n\tparseSkillMcpDeclarations,\n\ttype SkillLike,\n\ttype SkillMcpDeclarations,\n\tskillActivationTargets,\n} from \"./skills.ts\";\nimport { reportMcpAsyncError, wrapAsync } from \"./wrap.ts\";\n\nconst MCP_BUILTIN_EXTENSION_PATH = \"<builtin:mcp>\";\n\nexport function createMcpExtension(service: McpService, sessionOwned = true): ExtensionFactory {\n\treturn (pi: ExtensionAPI): void => {\n\t\tlet attachPromise: Promise<void> | undefined;\n\t\tconst sink = {\n\t\t\tlogger: {\n\t\t\t\terror(message: string, data?: unknown): void {\n\t\t\t\t\tcreateMcpLogger(\"service\").error(message, data);\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\n\t\tregisterMcpCommands(pi, service);\n\n\t\t// Native provider tool-search adapter (todo 33 — Anthropic, spike = GO).\n\t\t// Runs on every request but is a no-op unless settings.nativeToolSearch is\n\t\t// auto|true and the model is anthropic-messages; a 400 disables it for the\n\t\t// session and falls back to the always-registered local tool_search.\n\t\tconst nativeAdapter = new AnthropicNativeToolSearchAdapter({\n\t\t\tenabled: () => {\n\t\t\t\tconst setting = service.getNativeToolSearchSetting();\n\t\t\t\treturn setting === true || setting === \"auto\";\n\t\t\t},\n\t\t\tisDeferrable: (name) => name.startsWith(\"mcp_\") && name !== TOOL_SEARCH_TOOL_NAME,\n\t\t\tonFallback: (reason) => createMcpLogger(\"service\").warn(reason),\n\t\t\tsearchToolName: TOOL_SEARCH_TOOL_NAME,\n\t\t});\n\t\tpi.on(\"before_provider_request\", (event, ctx) => nativeAdapter.applyBeforeRequest(ctx.model?.api, event.payload));\n\t\tpi.on(\"after_provider_response\", (event) => nativeAdapter.noteResponseStatus(event.status));\n\t\t// Resumed/compacted sessions carry tool_search activation markers in their\n\t\t// history but re-enter search mode with only directTools active. The context\n\t\t// event (fired before each LLM call, with the full message history) replays\n\t\t// the markers as a safety net; the primary replay happens at attach time so\n\t\t// the FIRST turn's payload already carries previously promoted tools. Scans\n\t\t// once per registration (see McpService.maybeRehydrateFromHistory).\n\t\tpi.on(\"context\", (event) => {\n\t\t\tservice.maybeRehydrateFromHistory(event.messages);\n\t\t});\n\n\t\t// skills-carry-MCP (todo 37): skills declaring MCP servers (mcp.json\n\t\t// sidecar or SKILL.md frontmatter) register lazily with tools hidden;\n\t\t// loading a skill — /skill:<name> input or the model reading its SKILL.md —\n\t\t// reveals that skill's includeTools matches for the rest of the session.\n\t\tlet skillDecls: SkillMcpDeclarations = { servers: new Map(), warnings: [] };\n\t\tlet skillsByName = new Map<string, SkillLike>();\n\t\tconst loadedSkills = new Set<string>();\n\t\tconst revealSkill = (skillName: string): void => {\n\t\t\tif (loadedSkills.has(skillName) || !skillsByName.has(skillName)) return;\n\t\t\tloadedSkills.add(skillName);\n\t\t\tconst registered = service.getTierBSearchable();\n\t\t\tconst targets = skillActivationTargets(skillDecls, skillName, registered);\n\t\t\tif (targets.length > 0) service.activateSkillMcpTools(targets);\n\t\t};\n\t\tpi.on(\"input\", async (event, ctx) => {\n\t\t\tconst match = /^\\s*\\/skill:([A-Za-z0-9._-]+)/.exec(event.text);\n\t\t\tif (match) revealSkill(match[1]);\n\t\t\t// @mcp:<server>/<uri> mention expansion (todo 39): recognized mentions are\n\t\t\t// inlined via the sanctioned input transform; failures pass through\n\t\t\t// untouched with a one-line notice so submission is never blocked.\n\t\t\tif (event.text.includes(\"@mcp:\")) {\n\t\t\t\tconst expansion = await expandMcpResourceMentions(event.text, () => service.getMcpResourceServers());\n\t\t\t\tfor (const notice of expansion.notices) {\n\t\t\t\t\tcreateMcpLogger(\"resources\").warn(notice);\n\t\t\t\t\tvoid ctx.ui?.notify?.(notice, \"warning\");\n\t\t\t\t}\n\t\t\t\tif (expansion.changed) return { action: \"transform\", text: expansion.text };\n\t\t\t}\n\t\t\treturn undefined;\n\t\t});\n\t\tpi.on(\"tool_call\", (event) => {\n\t\t\tif (event.toolName !== \"read\") return undefined;\n\t\t\tconst path = (event.input as { path?: string }).path;\n\t\t\tif (path === undefined) return undefined;\n\t\t\tfor (const [name, skill] of skillsByName) {\n\t\t\t\tif (path === skill.filePath || path.endsWith(skill.filePath)) revealSkill(name);\n\t\t\t}\n\t\t\treturn undefined;\n\t\t});\n\n\t\t// Attach is SINGLE-FLIGHT. session_start handlers are dispatched\n\t\t// fire-and-forget, so a slow attach (a cold MCP server's boot + catalog\n\t\t// collection is awaited inside attachSession) can still be in flight when\n\t\t// before_agent_start fires. The old `attached` boolean was only set on\n\t\t// completion, so before_agent_start would start a SECOND concurrent attach —\n\t\t// which found the connection entries already created (still \"connecting\"),\n\t\t// collected an empty catalog, and registered no MCP tools for turn 1; the\n\t\t// first attach then landed the real registration turns later. Memoizing the\n\t\t// in-flight promise makes before_agent_start await the ORIGINAL attach, so\n\t\t// the first turn's payload deterministically carries the MCP tool set.\n\t\t// session_start always starts a fresh attach (reloads must re-sync config).\n\t\tconst attach = (event: SessionStartEvent, ctx: ExtensionContext): Promise<void> => {\n\t\t\tattachPromise = (async () => {\n\t\t\t\tawait service.attachSession(event, ctx, pi);\n\t\t\t\trefreshMcpInstructionsForSession(service);\n\t\t\t\tif (sessionOwned) registerMcpPromptCommands(service, pi, service.getMcpPromptServers());\n\t\t\t\telse registerMcpPromptCommands(pi, service.getMcpPromptServers());\n\t\t\t})();\n\t\t\treturn attachPromise;\n\t\t};\n\t\tpi.on(\n\t\t\t\"session_start\",\n\t\t\twrapAsync(\"mcp.session_start\", (event, ctx) => attach(event, ctx), sink),\n\t\t);\n\t\tpi.on(\"before_agent_start\", async (event, ctx) => {\n\t\t\ttry {\n\t\t\t\t// Elicitation (todo 41): point mid-call forms at this session's UI.\n\t\t\t\tservice.setMcpElicitationUiProvider(() => ctx.ui);\n\t\t\t\tawait (attachPromise ?? attach({ type: \"session_start\", reason: \"startup\" }, ctx));\n\t\t\t\tconst skills = (event.systemPromptOptions.skills ?? []) as readonly SkillLike[];\n\t\t\t\tif (skills.length > 0) {\n\t\t\t\t\tskillsByName = new Map(skills.map((skill) => [skill.name, skill]));\n\t\t\t\t\tskillDecls = parseSkillMcpDeclarations(skills);\n\t\t\t\t\tconst declared = new Map(\n\t\t\t\t\t\t[...skillDecls.servers].map(([name, decl]) => [name, { raw: decl.raw, sourcePath: decl.sourcePath }]),\n\t\t\t\t\t);\n\t\t\t\t\tconst warnings = [\n\t\t\t\t\t\t...skillDecls.warnings,\n\t\t\t\t\t\t...(declared.size > 0 ? await service.attachSkillMcpServers(declared) : []),\n\t\t\t\t\t];\n\t\t\t\t\tfor (const warning of warnings) createMcpLogger(\"skills\").warn(warning);\n\t\t\t\t}\n\t\t\t\tconst systemPrompt = injectMcpInstructions(service, event.systemPrompt);\n\t\t\t\treturn systemPrompt === undefined ? undefined : { systemPrompt };\n\t\t\t} catch (error) {\n\t\t\t\tif (!(error instanceof Error)) throw error;\n\t\t\t\tawait reportMcpAsyncError(\"mcp.before_agent_start\", error, sink);\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t});\n\t\tpi.on(\n\t\t\t\"session_shutdown\",\n\t\t\twrapAsync(\n\t\t\t\t\"mcp.session_shutdown\",\n\t\t\t\tasync (event) => {\n\t\t\t\t\tif (event.reason === \"reload\" && !sessionOwned) return;\n\t\t\t\t\tawait service.handleSessionShutdown(event);\n\t\t\t\t},\n\t\t\t\tsink,\n\t\t\t),\n\t\t);\n\t\tpi.on(\n\t\t\t\"session_extensions_removed\",\n\t\t\twrapAsync(\n\t\t\t\t\"mcp.session_extensions_removed\",\n\t\t\t\tasync (event) => {\n\t\t\t\t\tif (event.removed.some((extension) => extension.path === MCP_BUILTIN_EXTENSION_PATH)) {\n\t\t\t\t\t\tawait service.dispose(\"reload\");\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tsink,\n\t\t\t),\n\t\t);\n\t};\n}\n\nfunction hasProviderScope(): boolean {\n\ttry {\n\t\tbindToProviderScope(() => undefined);\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nexport default function mcpExtension(pi: ExtensionAPI): void | Promise<void> {\n\tconst sessionOwned = hasProviderScope();\n\treturn createMcpExtension(sessionOwned ? new McpService() : getMcpService(), sessionOwned)(pi);\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parsers.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/permission-system/parsers.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,+BAA+B,CAAC;AAE7D,gEAAgE;AAChE,MAAM,MAAM,iBAAiB,GAAG,IAAI,CAAC,OAAO,EAAE,YAAY,GAAG,UAAU,GAAG,QAAQ,CAAC,CAAC;AAEpF,wEAAwE;AACxE,MAAM,MAAM,oBAAoB,GAAG,CAClC,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,GAAG,EAAE,MAAM,KACP,iBAAiB,EAAE,CAAC;AAmEzB,oDAAoD;AACpD,qBAAa,cAAc;IAC1B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA2C;IAEnE,4CAA4C;IAC5C,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,oBAAoB,GAAG,IAAI,CAE7D;IAED,gDAAgD;IAChD,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,iBAAiB,EAAE,CAMxF;CACD;AAED,+DAA+D;AAC/D,wBAAgB,2BAA2B,IAAI,cAAc,
|
|
1
|
+
{"version":3,"file":"parsers.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/permission-system/parsers.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,+BAA+B,CAAC;AAE7D,gEAAgE;AAChE,MAAM,MAAM,iBAAiB,GAAG,IAAI,CAAC,OAAO,EAAE,YAAY,GAAG,UAAU,GAAG,QAAQ,CAAC,CAAC;AAEpF,wEAAwE;AACxE,MAAM,MAAM,oBAAoB,GAAG,CAClC,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,GAAG,EAAE,MAAM,KACP,iBAAiB,EAAE,CAAC;AAmEzB,oDAAoD;AACpD,qBAAa,cAAc;IAC1B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA2C;IAEnE,4CAA4C;IAC5C,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,oBAAoB,GAAG,IAAI,CAE7D;IAED,gDAAgD;IAChD,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,iBAAiB,EAAE,CAMxF;CACD;AAED,+DAA+D;AAC/D,wBAAgB,2BAA2B,IAAI,cAAc,CAiJ5D"}
|
|
@@ -102,6 +102,7 @@ export function createBuiltinParserRegistry() {
|
|
|
102
102
|
};
|
|
103
103
|
registry.register("bash", parseBashLikePermission("command"));
|
|
104
104
|
registry.register("bash_input", parseBashLikePermission("input"));
|
|
105
|
+
registry.register("monitor", parseBashLikePermission("command"));
|
|
105
106
|
const editParser = () => {
|
|
106
107
|
return [fallbackPermissionRequest("edit")];
|
|
107
108
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parsers.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/permission-system/parsers.ts"],"names":[],"mappings":"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","sourcesContent":["import { extractPatchedPaths } from \"../gpt-apply-patch/index.ts\";\nimport { BashArity } from \"../permission-system/arity.ts\";\nimport { extractExternalPaths, isExternalPath } from \"../permission-system/external-dir.ts\";\nimport type { Request } from \"../permission-system/types.ts\";\n\n/** Simplified permission request without ID/session metadata */\nexport type PermissionRequest = Pick<Request, \"permission\" | \"patterns\" | \"always\">;\n\n/** Parser function that extracts permission requests from tool input */\nexport type ToolPermissionParser = (\n\ttoolName: string,\n\tinput: Record<string, unknown>,\n\tcwd: string,\n) => PermissionRequest[];\n\nfunction fallbackPermissionRequest(permission: string): PermissionRequest {\n\treturn {\n\t\tpermission,\n\t\tpatterns: [\"*\"],\n\t\talways: [\"*\"],\n\t};\n}\n\nfunction getString(input: Record<string, unknown>, ...keys: string[]): string | undefined {\n\tfor (const key of keys) {\n\t\tconst value = input[key];\n\t\tif (typeof value === \"string\") {\n\t\t\treturn value;\n\t\t}\n\t}\n\treturn undefined;\n}\n\ntype AlwaysScope = \"file\" | \"directory\";\n\nfunction toParentDirectoryPattern(inputPath: string, scope: AlwaysScope): string {\n\tif (inputPath === \"~\" || inputPath === \"$HOME\") {\n\t\treturn `${inputPath}/*`;\n\t}\n\n\tif (scope === \"directory\") {\n\t\treturn inputPath.endsWith(\"/\") || inputPath.endsWith(\"\\\\\") ? `${inputPath}*` : `${inputPath}/*`;\n\t}\n\n\tif (inputPath.endsWith(\"/\") || inputPath.endsWith(\"\\\\\")) {\n\t\treturn `${inputPath}*`;\n\t}\n\n\tconst parentPattern = inputPath.replace(/[\\\\/][^\\\\/]+$/, \"/*\");\n\tif (parentPattern === \"/*\") {\n\t\treturn inputPath;\n\t}\n\treturn parentPattern;\n}\n\nfunction parseFilePath(input: Record<string, unknown>): string | undefined {\n\treturn getString(input, \"path\", \"file_path\");\n}\n\nfunction withExternalDirectoryRequests(\n\trequests: PermissionRequest[],\n\tpaths: string[],\n\tcwd: string,\n\tscope: AlwaysScope,\n): PermissionRequest[] {\n\tconst externalPaths = paths.filter((inputPath) => isExternalPath(inputPath, cwd));\n\tif (externalPaths.length === 0) {\n\t\treturn requests;\n\t}\n\n\treturn [\n\t\t...requests,\n\t\t{\n\t\t\tpermission: \"external_directory\",\n\t\t\tpatterns: externalPaths,\n\t\t\talways: externalPaths.map((externalPath) => toParentDirectoryPattern(externalPath, scope)),\n\t\t},\n\t];\n}\n\n/** Registry for tool-specific permission parsers */\nexport class ParserRegistry {\n\tprivate readonly parsers = new Map<string, ToolPermissionParser>();\n\n\t/** Register a parser for a specific tool */\n\tregister(toolName: string, parser: ToolPermissionParser): void {\n\t\tthis.parsers.set(toolName, parser);\n\t}\n\n\t/** Parse tool input into permission requests */\n\tparse(toolName: string, input: Record<string, unknown>, cwd: string): PermissionRequest[] {\n\t\tconst parser = this.parsers.get(toolName);\n\t\tif (!parser) {\n\t\t\treturn [fallbackPermissionRequest(toolName)];\n\t\t}\n\t\treturn parser(toolName, input, cwd);\n\t}\n}\n\n/** Create registry with built-in parsers for standard tools */\nexport function createBuiltinParserRegistry(): ParserRegistry {\n\tconst registry = new ParserRegistry();\n\n\t// bash_input writes arbitrary stdin to a live shell session = arbitrary command execution,\n\t// so it MUST be gated in the SAME `bash` permission class (via the `input` field), else\n\t// read-only/ask presets would be bypassable through a persistent session. The steering/read\n\t// tools (bash_output/kill_bash/bash_resize) fall back to their own tool-named permissions.\n\tconst parseBashLikePermission =\n\t\t(commandKey: string): ToolPermissionParser =>\n\t\t(_toolName, input, cwd) => {\n\t\t\tconst command = getString(input, commandKey);\n\t\t\tif (!command) {\n\t\t\t\treturn [fallbackPermissionRequest(\"bash\")];\n\t\t\t}\n\n\t\t\tconst tokens = command.split(/\\s+/).filter(Boolean);\n\t\t\tconst prefix = BashArity.prefix(tokens).join(\" \");\n\t\t\tconst always = prefix ? [prefix, `${prefix} *`] : [\"*\"];\n\t\t\tconst requests: PermissionRequest[] = [\n\t\t\t\t{\n\t\t\t\t\tpermission: \"bash\",\n\t\t\t\t\tpatterns: [prefix || command],\n\t\t\t\t\talways,\n\t\t\t\t},\n\t\t\t];\n\n\t\t\tconst externalPaths = extractExternalPaths(command, cwd);\n\t\t\tif (externalPaths.length > 0) {\n\t\t\t\trequests.push({\n\t\t\t\t\tpermission: \"external_directory\",\n\t\t\t\t\tpatterns: externalPaths,\n\t\t\t\t\talways: externalPaths.map((externalPath) => toParentDirectoryPattern(externalPath, \"file\")),\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn requests;\n\t\t};\n\n\tregistry.register(\"bash\", parseBashLikePermission(\"command\"));\n\tregistry.register(\"bash_input\", parseBashLikePermission(\"input\"));\n\n\tconst editParser: ToolPermissionParser = () => {\n\t\treturn [fallbackPermissionRequest(\"edit\")];\n\t};\n\n\tconst parseEditPermission: ToolPermissionParser = (_toolName, input, cwd) => {\n\t\tconst filePath = parseFilePath(input);\n\t\tif (filePath) {\n\t\t\treturn withExternalDirectoryRequests(\n\t\t\t\t[\n\t\t\t\t\t{\n\t\t\t\t\t\tpermission: \"edit\",\n\t\t\t\t\t\tpatterns: [filePath],\n\t\t\t\t\t\talways: [filePath],\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\t[filePath],\n\t\t\t\tcwd,\n\t\t\t\t\"file\",\n\t\t\t);\n\t\t}\n\n\t\tconst patchText = getString(input, \"input\", \"patchText\");\n\t\tif (!patchText) {\n\t\t\treturn editParser(\"edit\", input, \"\");\n\t\t}\n\n\t\tconst patchedPaths = extractPatchedPaths(patchText);\n\t\tif (patchedPaths.length === 0) {\n\t\t\treturn editParser(\"edit\", input, \"\");\n\t\t}\n\n\t\tconst editRequests = patchedPaths.map((patchedPath) => ({\n\t\t\tpermission: \"edit\",\n\t\t\tpatterns: [patchedPath],\n\t\t\talways: [patchedPath],\n\t\t}));\n\n\t\treturn withExternalDirectoryRequests(editRequests, patchedPaths, cwd, \"file\");\n\t};\n\n\tregistry.register(\"edit\", parseEditPermission);\n\tregistry.register(\"write\", parseEditPermission);\n\tregistry.register(\"apply_patch\", parseEditPermission);\n\tregistry.register(\"multiedit\", parseEditPermission);\n\n\tregistry.register(\"read\", (_toolName, input, cwd) => {\n\t\tconst filePath = parseFilePath(input);\n\t\tif (!filePath) {\n\t\t\treturn [fallbackPermissionRequest(\"read\")];\n\t\t}\n\n\t\treturn withExternalDirectoryRequests(\n\t\t\t[\n\t\t\t\t{\n\t\t\t\t\tpermission: \"read\",\n\t\t\t\t\tpatterns: [filePath],\n\t\t\t\t\talways: [filePath],\n\t\t\t\t},\n\t\t\t],\n\t\t\t[filePath],\n\t\t\tcwd,\n\t\t\t\"file\",\n\t\t);\n\t});\n\n\tregistry.register(\"grep\", (_toolName, input, cwd) => {\n\t\tconst searchPath = getString(input, \"path\");\n\t\tconst pattern = getString(input, \"pattern\");\n\t\tconst permissionPattern = searchPath ?? pattern;\n\t\tif (!permissionPattern) {\n\t\t\treturn [fallbackPermissionRequest(\"grep\")];\n\t\t}\n\n\t\tconst grepRequests: PermissionRequest[] = [\n\t\t\t{\n\t\t\t\tpermission: \"grep\",\n\t\t\t\tpatterns: [permissionPattern],\n\t\t\t\talways: [\"*\"],\n\t\t\t},\n\t\t];\n\t\treturn searchPath ? withExternalDirectoryRequests(grepRequests, [searchPath], cwd, \"directory\") : grepRequests;\n\t});\n\n\tconst listParser: ToolPermissionParser = (_toolName, input, cwd) => {\n\t\tconst searchPath = getString(input, \"path\") ?? \".\";\n\t\treturn withExternalDirectoryRequests(\n\t\t\t[\n\t\t\t\t{\n\t\t\t\t\tpermission: \"list\",\n\t\t\t\t\tpatterns: [searchPath],\n\t\t\t\t\talways: [searchPath],\n\t\t\t\t},\n\t\t\t],\n\t\t\t[searchPath],\n\t\t\tcwd,\n\t\t\t\"directory\",\n\t\t);\n\t};\n\n\tregistry.register(\"find\", listParser);\n\tregistry.register(\"ls\", listParser);\n\n\treturn registry;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"parsers.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/permission-system/parsers.ts"],"names":[],"mappings":"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","sourcesContent":["import { extractPatchedPaths } from \"../gpt-apply-patch/index.ts\";\nimport { BashArity } from \"../permission-system/arity.ts\";\nimport { extractExternalPaths, isExternalPath } from \"../permission-system/external-dir.ts\";\nimport type { Request } from \"../permission-system/types.ts\";\n\n/** Simplified permission request without ID/session metadata */\nexport type PermissionRequest = Pick<Request, \"permission\" | \"patterns\" | \"always\">;\n\n/** Parser function that extracts permission requests from tool input */\nexport type ToolPermissionParser = (\n\ttoolName: string,\n\tinput: Record<string, unknown>,\n\tcwd: string,\n) => PermissionRequest[];\n\nfunction fallbackPermissionRequest(permission: string): PermissionRequest {\n\treturn {\n\t\tpermission,\n\t\tpatterns: [\"*\"],\n\t\talways: [\"*\"],\n\t};\n}\n\nfunction getString(input: Record<string, unknown>, ...keys: string[]): string | undefined {\n\tfor (const key of keys) {\n\t\tconst value = input[key];\n\t\tif (typeof value === \"string\") {\n\t\t\treturn value;\n\t\t}\n\t}\n\treturn undefined;\n}\n\ntype AlwaysScope = \"file\" | \"directory\";\n\nfunction toParentDirectoryPattern(inputPath: string, scope: AlwaysScope): string {\n\tif (inputPath === \"~\" || inputPath === \"$HOME\") {\n\t\treturn `${inputPath}/*`;\n\t}\n\n\tif (scope === \"directory\") {\n\t\treturn inputPath.endsWith(\"/\") || inputPath.endsWith(\"\\\\\") ? `${inputPath}*` : `${inputPath}/*`;\n\t}\n\n\tif (inputPath.endsWith(\"/\") || inputPath.endsWith(\"\\\\\")) {\n\t\treturn `${inputPath}*`;\n\t}\n\n\tconst parentPattern = inputPath.replace(/[\\\\/][^\\\\/]+$/, \"/*\");\n\tif (parentPattern === \"/*\") {\n\t\treturn inputPath;\n\t}\n\treturn parentPattern;\n}\n\nfunction parseFilePath(input: Record<string, unknown>): string | undefined {\n\treturn getString(input, \"path\", \"file_path\");\n}\n\nfunction withExternalDirectoryRequests(\n\trequests: PermissionRequest[],\n\tpaths: string[],\n\tcwd: string,\n\tscope: AlwaysScope,\n): PermissionRequest[] {\n\tconst externalPaths = paths.filter((inputPath) => isExternalPath(inputPath, cwd));\n\tif (externalPaths.length === 0) {\n\t\treturn requests;\n\t}\n\n\treturn [\n\t\t...requests,\n\t\t{\n\t\t\tpermission: \"external_directory\",\n\t\t\tpatterns: externalPaths,\n\t\t\talways: externalPaths.map((externalPath) => toParentDirectoryPattern(externalPath, scope)),\n\t\t},\n\t];\n}\n\n/** Registry for tool-specific permission parsers */\nexport class ParserRegistry {\n\tprivate readonly parsers = new Map<string, ToolPermissionParser>();\n\n\t/** Register a parser for a specific tool */\n\tregister(toolName: string, parser: ToolPermissionParser): void {\n\t\tthis.parsers.set(toolName, parser);\n\t}\n\n\t/** Parse tool input into permission requests */\n\tparse(toolName: string, input: Record<string, unknown>, cwd: string): PermissionRequest[] {\n\t\tconst parser = this.parsers.get(toolName);\n\t\tif (!parser) {\n\t\t\treturn [fallbackPermissionRequest(toolName)];\n\t\t}\n\t\treturn parser(toolName, input, cwd);\n\t}\n}\n\n/** Create registry with built-in parsers for standard tools */\nexport function createBuiltinParserRegistry(): ParserRegistry {\n\tconst registry = new ParserRegistry();\n\n\t// bash_input writes arbitrary stdin to a live shell session = arbitrary command execution,\n\t// so it MUST be gated in the SAME `bash` permission class (via the `input` field), else\n\t// read-only/ask presets would be bypassable through a persistent session. The steering/read\n\t// tools (bash_output/kill_bash/bash_resize) fall back to their own tool-named permissions.\n\tconst parseBashLikePermission =\n\t\t(commandKey: string): ToolPermissionParser =>\n\t\t(_toolName, input, cwd) => {\n\t\t\tconst command = getString(input, commandKey);\n\t\t\tif (!command) {\n\t\t\t\treturn [fallbackPermissionRequest(\"bash\")];\n\t\t\t}\n\n\t\t\tconst tokens = command.split(/\\s+/).filter(Boolean);\n\t\t\tconst prefix = BashArity.prefix(tokens).join(\" \");\n\t\t\tconst always = prefix ? [prefix, `${prefix} *`] : [\"*\"];\n\t\t\tconst requests: PermissionRequest[] = [\n\t\t\t\t{\n\t\t\t\t\tpermission: \"bash\",\n\t\t\t\t\tpatterns: [prefix || command],\n\t\t\t\t\talways,\n\t\t\t\t},\n\t\t\t];\n\n\t\t\tconst externalPaths = extractExternalPaths(command, cwd);\n\t\t\tif (externalPaths.length > 0) {\n\t\t\t\trequests.push({\n\t\t\t\t\tpermission: \"external_directory\",\n\t\t\t\t\tpatterns: externalPaths,\n\t\t\t\t\talways: externalPaths.map((externalPath) => toParentDirectoryPattern(externalPath, \"file\")),\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn requests;\n\t\t};\n\n\tregistry.register(\"bash\", parseBashLikePermission(\"command\"));\n\tregistry.register(\"bash_input\", parseBashLikePermission(\"input\"));\n\tregistry.register(\"monitor\", parseBashLikePermission(\"command\"));\n\n\tconst editParser: ToolPermissionParser = () => {\n\t\treturn [fallbackPermissionRequest(\"edit\")];\n\t};\n\n\tconst parseEditPermission: ToolPermissionParser = (_toolName, input, cwd) => {\n\t\tconst filePath = parseFilePath(input);\n\t\tif (filePath) {\n\t\t\treturn withExternalDirectoryRequests(\n\t\t\t\t[\n\t\t\t\t\t{\n\t\t\t\t\t\tpermission: \"edit\",\n\t\t\t\t\t\tpatterns: [filePath],\n\t\t\t\t\t\talways: [filePath],\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\t[filePath],\n\t\t\t\tcwd,\n\t\t\t\t\"file\",\n\t\t\t);\n\t\t}\n\n\t\tconst patchText = getString(input, \"input\", \"patchText\");\n\t\tif (!patchText) {\n\t\t\treturn editParser(\"edit\", input, \"\");\n\t\t}\n\n\t\tconst patchedPaths = extractPatchedPaths(patchText);\n\t\tif (patchedPaths.length === 0) {\n\t\t\treturn editParser(\"edit\", input, \"\");\n\t\t}\n\n\t\tconst editRequests = patchedPaths.map((patchedPath) => ({\n\t\t\tpermission: \"edit\",\n\t\t\tpatterns: [patchedPath],\n\t\t\talways: [patchedPath],\n\t\t}));\n\n\t\treturn withExternalDirectoryRequests(editRequests, patchedPaths, cwd, \"file\");\n\t};\n\n\tregistry.register(\"edit\", parseEditPermission);\n\tregistry.register(\"write\", parseEditPermission);\n\tregistry.register(\"apply_patch\", parseEditPermission);\n\tregistry.register(\"multiedit\", parseEditPermission);\n\n\tregistry.register(\"read\", (_toolName, input, cwd) => {\n\t\tconst filePath = parseFilePath(input);\n\t\tif (!filePath) {\n\t\t\treturn [fallbackPermissionRequest(\"read\")];\n\t\t}\n\n\t\treturn withExternalDirectoryRequests(\n\t\t\t[\n\t\t\t\t{\n\t\t\t\t\tpermission: \"read\",\n\t\t\t\t\tpatterns: [filePath],\n\t\t\t\t\talways: [filePath],\n\t\t\t\t},\n\t\t\t],\n\t\t\t[filePath],\n\t\t\tcwd,\n\t\t\t\"file\",\n\t\t);\n\t});\n\n\tregistry.register(\"grep\", (_toolName, input, cwd) => {\n\t\tconst searchPath = getString(input, \"path\");\n\t\tconst pattern = getString(input, \"pattern\");\n\t\tconst permissionPattern = searchPath ?? pattern;\n\t\tif (!permissionPattern) {\n\t\t\treturn [fallbackPermissionRequest(\"grep\")];\n\t\t}\n\n\t\tconst grepRequests: PermissionRequest[] = [\n\t\t\t{\n\t\t\t\tpermission: \"grep\",\n\t\t\t\tpatterns: [permissionPattern],\n\t\t\t\talways: [\"*\"],\n\t\t\t},\n\t\t];\n\t\treturn searchPath ? withExternalDirectoryRequests(grepRequests, [searchPath], cwd, \"directory\") : grepRequests;\n\t});\n\n\tconst listParser: ToolPermissionParser = (_toolName, input, cwd) => {\n\t\tconst searchPath = getString(input, \"path\") ?? \".\";\n\t\treturn withExternalDirectoryRequests(\n\t\t\t[\n\t\t\t\t{\n\t\t\t\t\tpermission: \"list\",\n\t\t\t\t\tpatterns: [searchPath],\n\t\t\t\t\talways: [searchPath],\n\t\t\t\t},\n\t\t\t],\n\t\t\t[searchPath],\n\t\t\tcwd,\n\t\t\t\"directory\",\n\t\t);\n\t};\n\n\tregistry.register(\"find\", listParser);\n\tregistry.register(\"ls\", listParser);\n\n\treturn registry;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extension.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/terminal/extension.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAoB,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"extension.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/terminal/extension.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAoB,MAAM,gBAAgB,CAAC;AAkGrE,wBAAgB,yBAAyB,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CA2EhE;eAEc,yBAAyB"}
|
|
@@ -2,6 +2,8 @@ import { getShellEnv } from "../../../../utils/shell.js";
|
|
|
2
2
|
import { SettingsManager } from "../../../settings-manager.js";
|
|
3
3
|
import { isAnthropicBashEnabled } from "../anthropic-bash/index.js";
|
|
4
4
|
import { TerminalManager } from "./manager.js";
|
|
5
|
+
import { MonitorNotifier } from "./monitor-notify.js";
|
|
6
|
+
import { MonitorRegistry } from "./monitor-registry.js";
|
|
5
7
|
import { TerminalNotifier } from "./notify.js";
|
|
6
8
|
import { TERMINAL_PROMPT_SECTION } from "./prompt.js";
|
|
7
9
|
import { loadTerminalSettings, TERMINAL_SETTINGS_DEFAULTS } from "./settings.js";
|
|
@@ -11,6 +13,7 @@ import { createBashInputTool } from "./tools/bash-input.js";
|
|
|
11
13
|
import { createBashOutputTool } from "./tools/bash-output.js";
|
|
12
14
|
import { createBashResizeTool } from "./tools/bash-resize.js";
|
|
13
15
|
import { createKillBashTool } from "./tools/kill-bash.js";
|
|
16
|
+
import { createMonitorTool } from "./tools/monitor.js";
|
|
14
17
|
function buildToolContext(state) {
|
|
15
18
|
const requireManager = () => {
|
|
16
19
|
// Lazily create a manager so the tool works even when invoked directly (e.g. via the
|
|
@@ -38,11 +41,16 @@ function buildToolContext(state) {
|
|
|
38
41
|
get defaultRows() {
|
|
39
42
|
return state.settings.defaultRows;
|
|
40
43
|
},
|
|
44
|
+
get monitorRegistry() {
|
|
45
|
+
state.monitors ??= new MonitorRegistry((event) => state.monitorNotifier?.notifyEvent(event));
|
|
46
|
+
return state.monitors;
|
|
47
|
+
},
|
|
41
48
|
getEnv: () => getShellEnv(),
|
|
42
49
|
getSessionContext: () => state.ctx,
|
|
43
50
|
onBackgroundExit: (id, runtime) => {
|
|
44
51
|
state.notifier?.notifyCompletion(id, runtime);
|
|
45
52
|
},
|
|
53
|
+
onMonitorRearmed: (id) => state.monitorNotifier?.rearm(id),
|
|
46
54
|
};
|
|
47
55
|
}
|
|
48
56
|
function shouldStepAside(ctx) {
|
|
@@ -79,6 +87,8 @@ export function registerTerminalExtension(pi) {
|
|
|
79
87
|
manager: null,
|
|
80
88
|
settings: TERMINAL_SETTINGS_DEFAULTS,
|
|
81
89
|
notifier: null,
|
|
90
|
+
monitorNotifier: null,
|
|
91
|
+
monitors: null,
|
|
82
92
|
ctx: undefined,
|
|
83
93
|
shellPath: undefined,
|
|
84
94
|
steppedAside: false,
|
|
@@ -90,6 +100,7 @@ export function registerTerminalExtension(pi) {
|
|
|
90
100
|
pi.registerTool(createBashInputTool(toolCtx));
|
|
91
101
|
pi.registerTool(createBashResizeTool(toolCtx));
|
|
92
102
|
pi.registerTool(createKillBashTool(toolCtx));
|
|
103
|
+
pi.registerTool(createMonitorTool(toolCtx));
|
|
93
104
|
pi.on("session_start", async (_event, ctx) => {
|
|
94
105
|
state.ctx = ctx;
|
|
95
106
|
const settingsManager = SettingsManager.create(ctx.cwd);
|
|
@@ -100,6 +111,16 @@ export function registerTerminalExtension(pi) {
|
|
|
100
111
|
getContext: () => state.ctx,
|
|
101
112
|
getMode: () => state.settings.notify,
|
|
102
113
|
});
|
|
114
|
+
state.monitorNotifier?.dispose();
|
|
115
|
+
state.monitorNotifier = new MonitorNotifier({
|
|
116
|
+
sendUserMessage: (content, options) => pi.sendUserMessage(content, options),
|
|
117
|
+
getContext: () => state.ctx,
|
|
118
|
+
getMode: () => state.settings.notify,
|
|
119
|
+
getSettings: () => state.settings.monitor,
|
|
120
|
+
pauseMonitors: () => state.monitors?.pauseAll() ?? [],
|
|
121
|
+
});
|
|
122
|
+
state.monitors?.dispose();
|
|
123
|
+
state.monitors = null;
|
|
103
124
|
await state.manager?.teardown();
|
|
104
125
|
state.manager = new TerminalManager({
|
|
105
126
|
maxSessions: state.settings.maxSessions,
|
|
@@ -111,12 +132,23 @@ export function registerTerminalExtension(pi) {
|
|
|
111
132
|
state.ctx = { ...ctx, model: event.model };
|
|
112
133
|
syncToolset(pi, state);
|
|
113
134
|
});
|
|
135
|
+
pi.on("input", (event) => {
|
|
136
|
+
if (event.source !== "extension")
|
|
137
|
+
state.monitorNotifier?.noteActivity();
|
|
138
|
+
});
|
|
139
|
+
pi.on("tool_call", () => {
|
|
140
|
+
state.monitorNotifier?.noteActivity();
|
|
141
|
+
});
|
|
114
142
|
pi.on("before_agent_start", async (event) => {
|
|
115
143
|
if (state.steppedAside)
|
|
116
144
|
return undefined;
|
|
117
145
|
return { systemPrompt: `${event.systemPrompt}\n${TERMINAL_PROMPT_SECTION}` };
|
|
118
146
|
});
|
|
119
147
|
pi.on("session_shutdown", async () => {
|
|
148
|
+
state.monitorNotifier?.dispose();
|
|
149
|
+
state.monitorNotifier = null;
|
|
150
|
+
state.monitors?.dispose();
|
|
151
|
+
state.monitors = null;
|
|
120
152
|
await state.manager?.teardown();
|
|
121
153
|
state.manager = null;
|
|
122
154
|
});
|
|
@@ -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 { getShellEnv } from \"../../../../utils/shell.ts\";\nimport { SettingsManager } from \"../../../settings-manager.ts\";\nimport type { ExtensionAPI, ExtensionContext } from \"../../types.ts\";\nimport { isAnthropicBashEnabled } from \"../anthropic-bash/index.ts\";\nimport { TerminalManager } from \"./manager.ts\";\nimport { TerminalNotifier } from \"./notify.ts\";\nimport { TERMINAL_PROMPT_SECTION } from \"./prompt.ts\";\nimport type { TerminalRuntimeSession } from \"./runtime-session.ts\";\nimport { loadTerminalSettings, type ResolvedTerminalSettings, TERMINAL_SETTINGS_DEFAULTS } from \"./settings.ts\";\nimport { TERMINAL_BASH_TOOL, TERMINAL_COMPANION_TOOLS } from \"./shared.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\";\n\ninterface TerminalExtensionState {\n\tmanager: TerminalManager | null;\n\tsettings: ResolvedTerminalSettings;\n\tnotifier: TerminalNotifier | null;\n\tctx: ExtensionContext | undefined;\n\tshellPath: string | undefined;\n\tsteppedAside: boolean;\n\tnoticeShown: boolean;\n}\n\nfunction buildToolContext(state: TerminalExtensionState): TerminalToolContext {\n\tconst requireManager = (): TerminalManager => {\n\t\t// Lazily create a manager so the tool works 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 manager and tears down any earlier one.\n\t\tstate.manager ??= new TerminalManager({\n\t\t\tmaxSessions: state.settings.maxSessions,\n\t\t\tscrollback: state.settings.scrollback,\n\t\t});\n\t\treturn state.manager;\n\t};\n\treturn {\n\t\tget manager() {\n\t\t\treturn requireManager();\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\tgetEnv: () => getShellEnv(),\n\t\tgetSessionContext: () => state.ctx,\n\t\tonBackgroundExit: (id: string, runtime: TerminalRuntimeSession) => {\n\t\t\tstate.notifier?.notifyCompletion(id, runtime);\n\t\t},\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 PTY companions are deactivated so none dangle without a usable persistent `bash` (the\n * function `bash` is stripped + replaced by native bash in the provider payload). Otherwise the\n * PTY `bash` + companions are (re)activated. Re-evaluated on session_start AND 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.delete(companion);\n\t\tif (!state.noticeShown) {\n\t\t\tstate.ctx?.ui.notify(\"native Anthropic bash active — persistent terminal sessions disabled\", \"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\nexport function registerTerminalExtension(pi: ExtensionAPI): void {\n\tconst state: TerminalExtensionState = {\n\t\tmanager: null,\n\t\tsettings: TERMINAL_SETTINGS_DEFAULTS,\n\t\tnotifier: null,\n\t\tctx: undefined,\n\t\tshellPath: undefined,\n\t\tsteppedAside: false,\n\t\tnoticeShown: false,\n\t};\n\tconst toolCtx = buildToolContext(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\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\tsendUserMessage: (content, options) => pi.sendUserMessage(content, options),\n\t\t\tgetContext: () => state.ctx,\n\t\t\tgetMode: () => state.settings.notify,\n\t\t});\n\t\tawait state.manager?.teardown();\n\t\tstate.manager = new TerminalManager({\n\t\t\tmaxSessions: state.settings.maxSessions,\n\t\t\tscrollback: state.settings.scrollback,\n\t\t});\n\t\tsyncToolset(pi, state);\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(\"before_agent_start\", async (event) => {\n\t\tif (state.steppedAside) return undefined;\n\t\treturn { systemPrompt: `${event.systemPrompt}\\n${TERMINAL_PROMPT_SECTION}` };\n\t});\n\n\tpi.on(\"session_shutdown\", async () => {\n\t\tawait state.manager?.teardown();\n\t\tstate.manager = null;\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":"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","sourcesContent":["import { getShellEnv } from \"../../../../utils/shell.ts\";\nimport { SettingsManager } from \"../../../settings-manager.ts\";\nimport type { ExtensionAPI, ExtensionContext } from \"../../types.ts\";\nimport { isAnthropicBashEnabled } from \"../anthropic-bash/index.ts\";\nimport { TerminalManager } from \"./manager.ts\";\nimport { MonitorNotifier } from \"./monitor-notify.ts\";\nimport { MonitorRegistry } from \"./monitor-registry.ts\";\nimport { TerminalNotifier } from \"./notify.ts\";\nimport { TERMINAL_PROMPT_SECTION } from \"./prompt.ts\";\nimport type { TerminalRuntimeSession } from \"./runtime-session.ts\";\nimport { loadTerminalSettings, type ResolvedTerminalSettings, TERMINAL_SETTINGS_DEFAULTS } from \"./settings.ts\";\nimport { TERMINAL_BASH_TOOL, TERMINAL_COMPANION_TOOLS } from \"./shared.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 { createMonitorTool } from \"./tools/monitor.ts\";\n\ninterface TerminalExtensionState {\n\tmanager: TerminalManager | null;\n\tsettings: ResolvedTerminalSettings;\n\tnotifier: TerminalNotifier | null;\n\tmonitorNotifier: MonitorNotifier | null;\n\tmonitors: MonitorRegistry | null;\n\tctx: ExtensionContext | undefined;\n\tshellPath: string | undefined;\n\tsteppedAside: boolean;\n\tnoticeShown: boolean;\n}\n\nfunction buildToolContext(state: TerminalExtensionState): TerminalToolContext {\n\tconst requireManager = (): TerminalManager => {\n\t\t// Lazily create a manager so the tool works 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 manager and tears down any earlier one.\n\t\tstate.manager ??= new TerminalManager({\n\t\t\tmaxSessions: state.settings.maxSessions,\n\t\t\tscrollback: state.settings.scrollback,\n\t\t});\n\t\treturn state.manager;\n\t};\n\treturn {\n\t\tget manager() {\n\t\t\treturn requireManager();\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 monitorRegistry() {\n\t\t\tstate.monitors ??= new MonitorRegistry((event) => state.monitorNotifier?.notifyEvent(event));\n\t\t\treturn state.monitors;\n\t\t},\n\t\tgetEnv: () => getShellEnv(),\n\t\tgetSessionContext: () => state.ctx,\n\t\tonBackgroundExit: (id: string, runtime: TerminalRuntimeSession) => {\n\t\t\tstate.notifier?.notifyCompletion(id, runtime);\n\t\t},\n\t\tonMonitorRearmed: (id: string) => state.monitorNotifier?.rearm(id),\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 PTY companions are deactivated so none dangle without a usable persistent `bash` (the\n * function `bash` is stripped + replaced by native bash in the provider payload). Otherwise the\n * PTY `bash` + companions are (re)activated. Re-evaluated on session_start AND 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.delete(companion);\n\t\tif (!state.noticeShown) {\n\t\t\tstate.ctx?.ui.notify(\"native Anthropic bash active — persistent terminal sessions disabled\", \"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\nexport function registerTerminalExtension(pi: ExtensionAPI): void {\n\tconst state: TerminalExtensionState = {\n\t\tmanager: null,\n\t\tsettings: TERMINAL_SETTINGS_DEFAULTS,\n\t\tnotifier: null,\n\t\tmonitorNotifier: null,\n\t\tmonitors: null,\n\t\tctx: undefined,\n\t\tshellPath: undefined,\n\t\tsteppedAside: false,\n\t\tnoticeShown: false,\n\t};\n\tconst toolCtx = buildToolContext(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\tsendUserMessage: (content, options) => pi.sendUserMessage(content, 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\tsendUserMessage: (content, options) => pi.sendUserMessage(content, 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: () => state.monitors?.pauseAll() ?? [],\n\t\t});\n\t\tstate.monitors?.dispose();\n\t\tstate.monitors = null;\n\t\tawait state.manager?.teardown();\n\t\tstate.manager = new TerminalManager({\n\t\t\tmaxSessions: state.settings.maxSessions,\n\t\t\tscrollback: state.settings.scrollback,\n\t\t});\n\t\tsyncToolset(pi, state);\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\") state.monitorNotifier?.noteActivity();\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 { systemPrompt: `${event.systemPrompt}\\n${TERMINAL_PROMPT_SECTION}` };\n\t});\n\n\tpi.on(\"session_shutdown\", async () => {\n\t\tstate.monitorNotifier?.dispose();\n\t\tstate.monitorNotifier = null;\n\t\tstate.monitors?.dispose();\n\t\tstate.monitors = null;\n\t\tawait state.manager?.teardown();\n\t\tstate.manager = null;\n\t});\n}\n\nexport default registerTerminalExtension;\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
export { default, registerTerminalExtension } from "./extension.ts";
|
|
2
2
|
export { loadTerminalSettings, resolveTerminalSettings, TERMINAL_SETTINGS_DEFAULTS } from "./settings.ts";
|
|
3
|
-
export { TERMINAL_BASH_TOOL, TERMINAL_COMPANION_TOOLS, TERMINAL_INPUT_TOOL, TERMINAL_KILL_TOOL, TERMINAL_OUTPUT_TOOL, TERMINAL_RESIZE_TOOL, } from "./shared.ts";
|
|
3
|
+
export { TERMINAL_BASH_TOOL, TERMINAL_COMPANION_TOOLS, TERMINAL_INPUT_TOOL, TERMINAL_KILL_TOOL, TERMINAL_MONITOR_TOOL, TERMINAL_OUTPUT_TOOL, TERMINAL_RESIZE_TOOL, } from "./shared.ts";
|
|
4
4
|
//# sourceMappingURL=index.d.ts.map
|