@code-yeongyu/senpi 2026.7.25 → 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 +81 -0
- package/README.md +1 -1
- package/dist/beta/omo-local-update.d.ts +207 -0
- package/dist/beta/omo-local-update.d.ts.map +1 -0
- package/dist/beta/omo-local-update.js +708 -0
- package/dist/beta/omo-local-update.js.map +1 -0
- 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 +22 -3
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +202 -58
- 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/config-reload/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/config-reload/index.js +20 -17
- package/dist/core/extensions/builtin/config-reload/index.js.map +1 -1
- package/dist/core/extensions/builtin/config-reload/log.d.ts +4 -1
- package/dist/core/extensions/builtin/config-reload/log.d.ts.map +1 -1
- package/dist/core/extensions/builtin/config-reload/log.js +3 -0
- package/dist/core/extensions/builtin/config-reload/log.js.map +1 -1
- package/dist/core/extensions/builtin/config-reload/routine-settings.d.ts +15 -0
- package/dist/core/extensions/builtin/config-reload/routine-settings.d.ts.map +1 -0
- package/dist/core/extensions/builtin/config-reload/routine-settings.js +102 -0
- package/dist/core/extensions/builtin/config-reload/routine-settings.js.map +1 -0
- 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/prompt-preset/gpt-5.6.d.ts +48 -0
- package/dist/core/extensions/builtin/prompt-preset/gpt-5.6.d.ts.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/gpt-5.6.js +88 -64
- package/dist/core/extensions/builtin/prompt-preset/gpt-5.6.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/builtin/websearch/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/websearch/index.js +2 -4
- package/dist/core/extensions/builtin/websearch/index.js.map +1 -1
- package/dist/core/extensions/builtin/websearch/websearch/config.d.ts.map +1 -1
- package/dist/core/extensions/builtin/websearch/websearch/config.js +4 -1
- package/dist/core/extensions/builtin/websearch/websearch/config.js.map +1 -1
- package/dist/core/extensions/builtin/websearch/websearch/native.d.ts.map +1 -1
- package/dist/core/extensions/builtin/websearch/websearch/native.js +2 -4
- package/dist/core/extensions/builtin/websearch/websearch/native.js.map +1 -1
- package/dist/core/extensions/builtin/websearch/websearch/renderers.d.ts.map +1 -1
- package/dist/core/extensions/builtin/websearch/websearch/renderers.js +20 -8
- package/dist/core/extensions/builtin/websearch/websearch/renderers.js.map +1 -1
- package/dist/core/extensions/builtin/websearch/websearch/search.d.ts +6 -1
- package/dist/core/extensions/builtin/websearch/websearch/search.d.ts.map +1 -1
- package/dist/core/extensions/builtin/websearch/websearch/search.js +15 -11
- package/dist/core/extensions/builtin/websearch/websearch/search.js.map +1 -1
- package/dist/core/extensions/builtin/websearch/websearch/tool.d.ts.map +1 -1
- package/dist/core/extensions/builtin/websearch/websearch/tool.js +5 -10
- package/dist/core/extensions/builtin/websearch/websearch/tool.js.map +1 -1
- package/dist/core/extensions/builtin/websearch/websearch/types.d.ts +1 -0
- package/dist/core/extensions/builtin/websearch/websearch/types.d.ts.map +1 -1
- package/dist/core/extensions/builtin/websearch/websearch/types.js.map +1 -1
- package/dist/core/extensions/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 +25 -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 +10 -1
- package/dist/core/model-resolver.d.ts.map +1 -1
- package/dist/core/model-resolver.js +13 -3
- 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/remote-catalog-provider.d.ts.map +1 -1
- package/dist/core/remote-catalog-provider.js +19 -1
- package/dist/core/remote-catalog-provider.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 +13 -2
- package/dist/core/resource-loader.js.map +1 -1
- package/dist/core/retry-fallback/controller.d.ts +7 -0
- package/dist/core/retry-fallback/controller.d.ts.map +1 -1
- package/dist/core/retry-fallback/controller.js +13 -0
- package/dist/core/retry-fallback/controller.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 +12 -16
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +10 -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/thinking-levels.d.ts.map +1 -1
- package/dist/core/thinking-levels.js +9 -2
- package/dist/core/thinking-levels.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/extensions/llama/provider.d.ts.map +1 -1
- package/dist/extensions/llama/provider.js +6 -0
- package/dist/extensions/llama/provider.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/custom-message.d.ts +3 -1
- package/dist/modes/interactive/components/custom-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/custom-message.js +9 -2
- package/dist/modes/interactive/components/custom-message.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 +117 -54
- 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/package-manager-cli.d.ts.map +1 -1
- package/dist/package-manager-cli.js +11 -0
- package/dist/package-manager-cli.js.map +1 -1
- package/dist/senpi +2 -0
- package/docs/docs.json +4 -0
- package/docs/environment-variables.md +1 -0
- package/docs/extensions.md +2 -2
- package/docs/grok-neo.md +77 -0
- package/docs/keybindings.md +0 -1
- package/docs/settings.md +14 -3
- package/docs/terminal-tools.md +6 -3
- package/docs/usage.md +1 -1
- package/examples/extensions/message-renderer.ts +2 -2
- package/node_modules/@code-yeongyu/senpi-codemode/CHANGELOG.md +47 -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 +6 -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 +4 -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 +210 -26
- 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.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/azure-openai-responses.js +16 -8
- 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 +39 -20
- 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-generative-ai.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/google-generative-ai.js +9 -2
- package/node_modules/@earendil-works/pi-ai/dist/api/google-generative-ai.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/google-vertex.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/google-vertex.js +12 -2
- package/node_modules/@earendil-works/pi-ai/dist/api/google-vertex.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses.js +19 -11
- 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-completions.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.js +121 -23
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses-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.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.js +13 -8
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/simple-options.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/simple-options.js +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/simple-options.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/radius.d.ts +3 -2
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/radius.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/radius.js +37 -35
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/radius.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/auth/resolve.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/auth/resolve.js +11 -1
- package/node_modules/@earendil-works/pi-ai/dist/auth/resolve.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/index.d.ts +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/index.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/index.js +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/index.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/models-store.d.ts +5 -0
- package/node_modules/@earendil-works/pi-ai/dist/models-store.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/models-store.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/models.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/models.js +5 -1
- package/node_modules/@earendil-works/pi-ai/dist/models.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/amazon-bedrock.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/anthropic.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/cloudflare-ai-gateway.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/github-copilot.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/opencode.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/openrouter.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/vercel-ai-gateway.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/types.d.ts +9 -0
- package/node_modules/@earendil-works/pi-ai/dist/types.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/types.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/error-body.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/error-body.js +8 -3
- package/node_modules/@earendil-works/pi-ai/dist/utils/error-body.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/retry.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/retry.js +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/server-fallback-receipt.d.ts +30 -0
- package/node_modules/@earendil-works/pi-ai/dist/utils/server-fallback-receipt.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/utils/server-fallback-receipt.js +70 -0
- package/node_modules/@earendil-works/pi-ai/dist/utils/server-fallback-receipt.js.map +1 -0
- 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,8 +1,9 @@
|
|
|
1
1
|
import { TerminalScreen, TerminalSession, } from "@earendil-works/pi-pty";
|
|
2
|
-
import { DEFAULT_SCROLLBACK, MAX_SESSION_OUTPUT_CHARS
|
|
2
|
+
import { DEFAULT_SCROLLBACK, MAX_SESSION_OUTPUT_CHARS } from "./shared.js";
|
|
3
3
|
/**
|
|
4
|
-
* A live terminal session: a pi-pty {@link TerminalSession} plus an xterm screen model
|
|
5
|
-
* a bounded decoded-output buffer with a per-consumer read cursor
|
|
4
|
+
* A live terminal session: a pi-pty {@link TerminalSession} plus an xterm screen model
|
|
5
|
+
* and a bounded decoded-output buffer with a per-consumer read cursor. Reads are pure
|
|
6
|
+
* non-blocking peeks; watchers subscribe through `onOutput` (the monitor path).
|
|
6
7
|
*/
|
|
7
8
|
export class TerminalRuntimeSession {
|
|
8
9
|
constructor(command, options) {
|
|
@@ -10,7 +11,6 @@ export class TerminalRuntimeSession {
|
|
|
10
11
|
this.buffer = "";
|
|
11
12
|
this.droppedChars = 0;
|
|
12
13
|
this.consumed = 0;
|
|
13
|
-
this.waiters = new Set();
|
|
14
14
|
this.outputListeners = new Set();
|
|
15
15
|
this.unsubscribeData = null;
|
|
16
16
|
this.command = command;
|
|
@@ -33,7 +33,6 @@ export class TerminalRuntimeSession {
|
|
|
33
33
|
}
|
|
34
34
|
}
|
|
35
35
|
});
|
|
36
|
-
this.session.onExit(() => this.settleWaiters("exited"));
|
|
37
36
|
this.session.start();
|
|
38
37
|
}
|
|
39
38
|
get backend() {
|
|
@@ -60,11 +59,6 @@ export class TerminalRuntimeSession {
|
|
|
60
59
|
this.buffer = this.buffer.slice(overflow);
|
|
61
60
|
this.droppedChars += overflow;
|
|
62
61
|
}
|
|
63
|
-
for (const waiter of this.waiters) {
|
|
64
|
-
waiter.buffer += text;
|
|
65
|
-
if (waiter.regex.test(waiter.buffer))
|
|
66
|
-
this.resolveWaiter(waiter, "matched");
|
|
67
|
-
}
|
|
68
62
|
return text;
|
|
69
63
|
}
|
|
70
64
|
/** Subscribe to decoded output without affecting the read cursor. */
|
|
@@ -90,60 +84,11 @@ export class TerminalRuntimeSession {
|
|
|
90
84
|
resizeScreen(cols, rows) {
|
|
91
85
|
void this.screen.resize(cols, rows);
|
|
92
86
|
}
|
|
93
|
-
/**
|
|
94
|
-
* Wait until `pattern` matches unread or newly produced output, the session exits, the
|
|
95
|
-
* timeout elapses, or the wait is aborted.
|
|
96
|
-
*/
|
|
97
|
-
waitFor(pattern, timeoutMs, signal) {
|
|
98
|
-
const regex = safeRegExp(pattern);
|
|
99
|
-
if (regex === null)
|
|
100
|
-
return Promise.resolve("invalid_pattern");
|
|
101
|
-
if (this.exited)
|
|
102
|
-
return Promise.resolve("exited");
|
|
103
|
-
if (signal?.aborted)
|
|
104
|
-
return Promise.resolve("aborted");
|
|
105
|
-
const unreadStart = Math.max(this.consumed, this.droppedChars);
|
|
106
|
-
const unreadOutput = this.buffer.slice(unreadStart - this.droppedChars);
|
|
107
|
-
if (regex.test(unreadOutput))
|
|
108
|
-
return Promise.resolve("matched");
|
|
109
|
-
return new Promise((resolve) => {
|
|
110
|
-
const waiter = {
|
|
111
|
-
regex,
|
|
112
|
-
buffer: unreadOutput,
|
|
113
|
-
timer: null,
|
|
114
|
-
signal,
|
|
115
|
-
onAbort: () => this.resolveWaiter(waiter, "aborted"),
|
|
116
|
-
resolve,
|
|
117
|
-
};
|
|
118
|
-
this.waiters.add(waiter);
|
|
119
|
-
waiter.timer = setTimeout(() => this.resolveWaiter(waiter, "timeout"), timeoutMs);
|
|
120
|
-
if (signal) {
|
|
121
|
-
signal.addEventListener("abort", waiter.onAbort, { once: true });
|
|
122
|
-
if (signal.aborted)
|
|
123
|
-
this.resolveWaiter(waiter, "aborted");
|
|
124
|
-
}
|
|
125
|
-
});
|
|
126
|
-
}
|
|
127
87
|
dispose() {
|
|
128
88
|
this.unsubscribeData?.();
|
|
129
89
|
this.unsubscribeData = null;
|
|
130
90
|
this.outputListeners.clear();
|
|
131
|
-
this.settleWaiters(this.exited ? "exited" : "timeout");
|
|
132
91
|
this.screen.dispose();
|
|
133
92
|
}
|
|
134
|
-
settleWaiters(outcome) {
|
|
135
|
-
for (const waiter of [...this.waiters])
|
|
136
|
-
this.resolveWaiter(waiter, outcome);
|
|
137
|
-
}
|
|
138
|
-
resolveWaiter(waiter, outcome) {
|
|
139
|
-
if (!this.waiters.delete(waiter))
|
|
140
|
-
return;
|
|
141
|
-
if (waiter.timer !== null) {
|
|
142
|
-
clearTimeout(waiter.timer);
|
|
143
|
-
waiter.timer = null;
|
|
144
|
-
}
|
|
145
|
-
waiter.signal?.removeEventListener("abort", waiter.onAbort);
|
|
146
|
-
waiter.resolve(outcome);
|
|
147
|
-
}
|
|
148
93
|
}
|
|
149
94
|
//# sourceMappingURL=runtime-session.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime-session.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/terminal/runtime-session.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,cAAc,EAEd,eAAe,GAGf,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,kBAAkB,EAAE,wBAAwB,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAsBvF;;;GAGG;AACH,MAAM,OAAO,sBAAsB;IAYlC,YAAY,OAAe,EAAE,OAA+B;QAR3C,YAAO,GAAG,IAAI,WAAW,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;QAC9D,WAAM,GAAG,EAAE,CAAC;QACZ,iBAAY,GAAG,CAAC,CAAC;QACjB,aAAQ,GAAG,CAAC,CAAC;QACJ,YAAO,GAAG,IAAI,GAAG,EAAgB,CAAC;QAClC,oBAAe,GAAG,IAAI,GAAG,EAA2B,CAAC;QAC9D,oBAAe,GAAwB,IAAI,CAAC;QAGnD,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,MAAM,GAAG,IAAI,cAAc,CAAC;YAChC,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,UAAU,EAAE,OAAO,CAAC,UAAU,IAAI,kBAAkB;SACpD,CAAC,CAAC;QACH,IAAI,CAAC,OAAO,GAAG,IAAI,eAAe,CAAC,OAAO,CAAC,CAAC;QAC5C,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;YACpD,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAChC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO;YAC9B,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;gBAC7C,IAAI,CAAC;oBACJ,QAAQ,CAAC,IAAI,CAAC,CAAC;gBAChB,CAAC;gBAAC,MAAM,CAAC;oBACR,sEAAsE;gBACvE,CAAC;YACF,CAAC;QACF,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC;QACxD,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;IACtB,CAAC;IAED,IAAI,OAAO;QACV,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;IAC7B,CAAC;IAED,IAAI,MAAM;QACT,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;IAC5B,CAAC;IAED,IAAI,UAAU;QACb,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC;IAChC,CAAC;IAED,kFAAkF;IAClF,IAAI,UAAU;QACb,OAAO,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;IAC/C,CAAC;IAEO,MAAM,CAAC,KAAiB;QAC/B,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1D,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QACnC,KAAK,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5B,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC;QACpB,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,wBAAwB,EAAE,CAAC;YACnD,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,wBAAwB,CAAC;YAC/D,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YAC1C,IAAI,CAAC,YAAY,IAAI,QAAQ,CAAC;QAC/B,CAAC;QACD,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACnC,MAAM,CAAC,MAAM,IAAI,IAAI,CAAC;YACtB,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;gBAAE,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QAC7E,CAAC;QACD,OAAO,IAAI,CAAC;IACb,CAAC;IAED,qEAAqE;IACrE,QAAQ,CAAC,QAAiC;QACzC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACnC,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACpD,CAAC;IAED,8EAA8E;IAC9E,SAAS;QACR,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;QACzD,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC/D,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC;QAC1D,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC;QAChC,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC;IACxC,CAAC;IAED,iFAAiF;IACjF,UAAU;QACT,OAAO,IAAI,CAAC,MAAM,CAAC;IACpB,CAAC;IAED,QAAQ;QACP,OAAO,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;IAC/B,CAAC;IAED,YAAY,CAAC,IAAY,EAAE,IAAY;QACtC,KAAK,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACrC,CAAC;IAED;;;OAGG;IACH,OAAO,CAAC,OAAe,EAAE,SAAiB,EAAE,MAAoB;QAC/D,MAAM,KAAK,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;QAClC,IAAI,KAAK,KAAK,IAAI;YAAE,OAAO,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;QAC9D,IAAI,IAAI,CAAC,MAAM;YAAE,OAAO,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAClD,IAAI,MAAM,EAAE,OAAO;YAAE,OAAO,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QACvD,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;QAC/D,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC;QACxE,IAAI,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC;YAAE,OAAO,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAChE,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC9B,MAAM,MAAM,GAAiB;gBAC5B,KAAK;gBACL,MAAM,EAAE,YAAY;gBACpB,KAAK,EAAE,IAAI;gBACX,MAAM;gBACN,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,SAAS,CAAC;gBACpD,OAAO;aACP,CAAC;YACF,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YACzB,MAAM,CAAC,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,SAAS,CAAC,EAAE,SAAS,CAAC,CAAC;YAClF,IAAI,MAAM,EAAE,CAAC;gBACZ,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;gBACjE,IAAI,MAAM,CAAC,OAAO;oBAAE,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;YAC3D,CAAC;QACF,CAAC,CAAC,CAAC;IACJ,CAAC;IAED,OAAO;QACN,IAAI,CAAC,eAAe,EAAE,EAAE,CAAC;QACzB,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;QAC5B,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC;QAC7B,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QACvD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;IACvB,CAAC;IAEO,aAAa,CAAC,OAA6B;QAClD,KAAK,MAAM,MAAM,IAAI,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC;YAAE,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC7E,CAAC;IAEO,aAAa,CAAC,MAAoB,EAAE,OAAsD;QACjG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC;YAAE,OAAO;QACzC,IAAI,MAAM,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;YAC3B,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC3B,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC;QACrB,CAAC;QACD,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;QAC5D,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACzB,CAAC;CACD","sourcesContent":["import {\n\tTerminalScreen,\n\ttype TerminalScreenSnapshot,\n\tTerminalSession,\n\ttype TerminalSessionExit,\n\ttype TerminalSessionOptions,\n} from \"@earendil-works/pi-pty\";\nimport { DEFAULT_SCROLLBACK, MAX_SESSION_OUTPUT_CHARS, safeRegExp } from \"./shared.ts\";\n\nexport interface TerminalRuntimeOptions extends TerminalSessionOptions {\n\treadonly scrollback?: number;\n}\n\nexport interface DeltaRead {\n\treadonly text: string;\n\treadonly droppedChars: number;\n}\n\ntype OutputWaitOutcome = \"matched\" | \"exited\" | \"timeout\" | \"aborted\" | \"invalid_pattern\";\n\ninterface OutputWaiter {\n\treadonly regex: RegExp;\n\tbuffer: string;\n\ttimer: ReturnType<typeof setTimeout> | null;\n\treadonly signal: AbortSignal | undefined;\n\treadonly onAbort: () => void;\n\treadonly resolve: (outcome: OutputWaitOutcome) => void;\n}\n\n/**\n * A live terminal session: a pi-pty {@link TerminalSession} plus an xterm screen model,\n * a bounded decoded-output buffer with a per-consumer read cursor, and `wait_for` waiters.\n */\nexport class TerminalRuntimeSession {\n\treadonly session: TerminalSession;\n\treadonly command: string;\n\tprivate readonly screen: TerminalScreen;\n\tprivate readonly decoder = new TextDecoder(\"utf-8\", { fatal: false });\n\tprivate buffer = \"\";\n\tprivate droppedChars = 0;\n\tprivate consumed = 0;\n\tprivate readonly waiters = new Set<OutputWaiter>();\n\tprivate readonly outputListeners = new Set<(chunk: string) => void>();\n\tprivate unsubscribeData: (() => void) | null = null;\n\n\tconstructor(command: string, options: TerminalRuntimeOptions) {\n\t\tthis.command = command;\n\t\tthis.screen = new TerminalScreen({\n\t\t\tcols: options.cols,\n\t\t\trows: options.rows,\n\t\t\tscrollback: options.scrollback ?? DEFAULT_SCROLLBACK,\n\t\t});\n\t\tthis.session = new TerminalSession(options);\n\t\tthis.unsubscribeData = this.session.onData((chunk) => {\n\t\t\tconst text = this.ingest(chunk);\n\t\t\tif (text.length === 0) return;\n\t\t\tfor (const listener of this.outputListeners) {\n\t\t\t\ttry {\n\t\t\t\t\tlistener(text);\n\t\t\t\t} catch {\n\t\t\t\t\t// Output observers must not interfere with the session's ingest path.\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\tthis.session.onExit(() => this.settleWaiters(\"exited\"));\n\t\tthis.session.start();\n\t}\n\n\tget backend(): string | null {\n\t\treturn this.session.backend;\n\t}\n\n\tget exited(): boolean {\n\t\treturn this.session.exited;\n\t}\n\n\tget exitResult(): TerminalSessionExit | null {\n\t\treturn this.session.exitResult;\n\t}\n\n\t/** Total decoded chars produced so far (including any dropped from the front). */\n\tget totalChars(): number {\n\t\treturn this.droppedChars + this.buffer.length;\n\t}\n\n\tprivate ingest(chunk: Uint8Array): string {\n\t\tconst text = this.decoder.decode(chunk, { stream: true });\n\t\tif (text.length === 0) return text;\n\t\tvoid this.screen.feed(text);\n\t\tthis.buffer += text;\n\t\tif (this.buffer.length > MAX_SESSION_OUTPUT_CHARS) {\n\t\t\tconst overflow = this.buffer.length - MAX_SESSION_OUTPUT_CHARS;\n\t\t\tthis.buffer = this.buffer.slice(overflow);\n\t\t\tthis.droppedChars += overflow;\n\t\t}\n\t\tfor (const waiter of this.waiters) {\n\t\t\twaiter.buffer += text;\n\t\t\tif (waiter.regex.test(waiter.buffer)) this.resolveWaiter(waiter, \"matched\");\n\t\t}\n\t\treturn text;\n\t}\n\n\t/** Subscribe to decoded output without affecting the read cursor. */\n\tonOutput(listener: (chunk: string) => void): () => void {\n\t\tthis.outputListeners.add(listener);\n\t\treturn () => this.outputListeners.delete(listener);\n\t}\n\n\t/** Return output produced since the last read and advance the read cursor. */\n\treadDelta(): DeltaRead {\n\t\tconst start = Math.max(this.consumed, this.droppedChars);\n\t\tconst dropped = Math.max(0, this.droppedChars - this.consumed);\n\t\tconst text = this.buffer.slice(start - this.droppedChars);\n\t\tthis.consumed = this.totalChars;\n\t\treturn { text, droppedChars: dropped };\n\t}\n\n\t/** Full retained decoded output (`view:\"log\"`), without advancing the cursor. */\n\tfullOutput(): string {\n\t\treturn this.buffer;\n\t}\n\n\tsnapshot(): TerminalScreenSnapshot {\n\t\treturn this.screen.snapshot();\n\t}\n\n\tresizeScreen(cols: number, rows: number): void {\n\t\tvoid this.screen.resize(cols, rows);\n\t}\n\n\t/**\n\t * Wait until `pattern` matches unread or newly produced output, the session exits, the\n\t * timeout elapses, or the wait is aborted.\n\t */\n\twaitFor(pattern: string, timeoutMs: number, signal?: AbortSignal): Promise<OutputWaitOutcome> {\n\t\tconst regex = safeRegExp(pattern);\n\t\tif (regex === null) return Promise.resolve(\"invalid_pattern\");\n\t\tif (this.exited) return Promise.resolve(\"exited\");\n\t\tif (signal?.aborted) return Promise.resolve(\"aborted\");\n\t\tconst unreadStart = Math.max(this.consumed, this.droppedChars);\n\t\tconst unreadOutput = this.buffer.slice(unreadStart - this.droppedChars);\n\t\tif (regex.test(unreadOutput)) return Promise.resolve(\"matched\");\n\t\treturn new Promise((resolve) => {\n\t\t\tconst waiter: OutputWaiter = {\n\t\t\t\tregex,\n\t\t\t\tbuffer: unreadOutput,\n\t\t\t\ttimer: null,\n\t\t\t\tsignal,\n\t\t\t\tonAbort: () => this.resolveWaiter(waiter, \"aborted\"),\n\t\t\t\tresolve,\n\t\t\t};\n\t\t\tthis.waiters.add(waiter);\n\t\t\twaiter.timer = setTimeout(() => this.resolveWaiter(waiter, \"timeout\"), timeoutMs);\n\t\t\tif (signal) {\n\t\t\t\tsignal.addEventListener(\"abort\", waiter.onAbort, { once: true });\n\t\t\t\tif (signal.aborted) this.resolveWaiter(waiter, \"aborted\");\n\t\t\t}\n\t\t});\n\t}\n\n\tdispose(): void {\n\t\tthis.unsubscribeData?.();\n\t\tthis.unsubscribeData = null;\n\t\tthis.outputListeners.clear();\n\t\tthis.settleWaiters(this.exited ? \"exited\" : \"timeout\");\n\t\tthis.screen.dispose();\n\t}\n\n\tprivate settleWaiters(outcome: \"exited\" | \"timeout\"): void {\n\t\tfor (const waiter of [...this.waiters]) this.resolveWaiter(waiter, outcome);\n\t}\n\n\tprivate resolveWaiter(waiter: OutputWaiter, outcome: Exclude<OutputWaitOutcome, \"invalid_pattern\">): void {\n\t\tif (!this.waiters.delete(waiter)) return;\n\t\tif (waiter.timer !== null) {\n\t\t\tclearTimeout(waiter.timer);\n\t\t\twaiter.timer = null;\n\t\t}\n\t\twaiter.signal?.removeEventListener(\"abort\", waiter.onAbort);\n\t\twaiter.resolve(outcome);\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"runtime-session.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/terminal/runtime-session.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n\tTerminalScreen,\n\ttype TerminalScreenSnapshot,\n\tTerminalSession,\n\ttype TerminalSessionExit,\n\ttype TerminalSessionOptions,\n} from \"@earendil-works/pi-pty\";\nimport { DEFAULT_SCROLLBACK, MAX_SESSION_OUTPUT_CHARS } from \"./shared.ts\";\n\nexport interface TerminalRuntimeOptions extends TerminalSessionOptions {\n\treadonly scrollback?: number;\n}\n\nexport interface DeltaRead {\n\treadonly text: string;\n\treadonly droppedChars: number;\n}\n\n/**\n * A live terminal session: a pi-pty {@link TerminalSession} plus an xterm screen model\n * and a bounded decoded-output buffer with a per-consumer read cursor. Reads are pure\n * non-blocking peeks; watchers subscribe through `onOutput` (the monitor path).\n */\nexport class TerminalRuntimeSession {\n\treadonly session: TerminalSession;\n\treadonly command: string;\n\tprivate readonly screen: TerminalScreen;\n\tprivate readonly decoder = new TextDecoder(\"utf-8\", { fatal: false });\n\tprivate buffer = \"\";\n\tprivate droppedChars = 0;\n\tprivate consumed = 0;\n\tprivate readonly outputListeners = new Set<(chunk: string) => void>();\n\tprivate unsubscribeData: (() => void) | null = null;\n\n\tconstructor(command: string, options: TerminalRuntimeOptions) {\n\t\tthis.command = command;\n\t\tthis.screen = new TerminalScreen({\n\t\t\tcols: options.cols,\n\t\t\trows: options.rows,\n\t\t\tscrollback: options.scrollback ?? DEFAULT_SCROLLBACK,\n\t\t});\n\t\tthis.session = new TerminalSession(options);\n\t\tthis.unsubscribeData = this.session.onData((chunk) => {\n\t\t\tconst text = this.ingest(chunk);\n\t\t\tif (text.length === 0) return;\n\t\t\tfor (const listener of this.outputListeners) {\n\t\t\t\ttry {\n\t\t\t\t\tlistener(text);\n\t\t\t\t} catch {\n\t\t\t\t\t// Output observers must not interfere with the session's ingest path.\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\tthis.session.start();\n\t}\n\n\tget backend(): string | null {\n\t\treturn this.session.backend;\n\t}\n\n\tget exited(): boolean {\n\t\treturn this.session.exited;\n\t}\n\n\tget exitResult(): TerminalSessionExit | null {\n\t\treturn this.session.exitResult;\n\t}\n\n\t/** Total decoded chars produced so far (including any dropped from the front). */\n\tget totalChars(): number {\n\t\treturn this.droppedChars + this.buffer.length;\n\t}\n\n\tprivate ingest(chunk: Uint8Array): string {\n\t\tconst text = this.decoder.decode(chunk, { stream: true });\n\t\tif (text.length === 0) return text;\n\t\tvoid this.screen.feed(text);\n\t\tthis.buffer += text;\n\t\tif (this.buffer.length > MAX_SESSION_OUTPUT_CHARS) {\n\t\t\tconst overflow = this.buffer.length - MAX_SESSION_OUTPUT_CHARS;\n\t\t\tthis.buffer = this.buffer.slice(overflow);\n\t\t\tthis.droppedChars += overflow;\n\t\t}\n\t\treturn text;\n\t}\n\n\t/** Subscribe to decoded output without affecting the read cursor. */\n\tonOutput(listener: (chunk: string) => void): () => void {\n\t\tthis.outputListeners.add(listener);\n\t\treturn () => this.outputListeners.delete(listener);\n\t}\n\n\t/** Return output produced since the last read and advance the read cursor. */\n\treadDelta(): DeltaRead {\n\t\tconst start = Math.max(this.consumed, this.droppedChars);\n\t\tconst dropped = Math.max(0, this.droppedChars - this.consumed);\n\t\tconst text = this.buffer.slice(start - this.droppedChars);\n\t\tthis.consumed = this.totalChars;\n\t\treturn { text, droppedChars: dropped };\n\t}\n\n\t/** Full retained decoded output (`view:\"log\"`), without advancing the cursor. */\n\tfullOutput(): string {\n\t\treturn this.buffer;\n\t}\n\n\tsnapshot(): TerminalScreenSnapshot {\n\t\treturn this.screen.snapshot();\n\t}\n\n\tresizeScreen(cols: number, rows: number): void {\n\t\tvoid this.screen.resize(cols, rows);\n\t}\n\n\tdispose(): void {\n\t\tthis.unsubscribeData?.();\n\t\tthis.unsubscribeData = null;\n\t\tthis.outputListeners.clear();\n\t\tthis.screen.dispose();\n\t}\n}\n"]}
|
|
@@ -1,6 +1,13 @@
|
|
|
1
1
|
import type { SettingsManager, TerminalSettings } from "../../../settings-manager.ts";
|
|
2
2
|
export type TimeoutAction = "background" | "kill";
|
|
3
3
|
export type NotifyMode = "wake" | "next-turn" | "off";
|
|
4
|
+
export interface MonitorDeliverySettings {
|
|
5
|
+
readonly coalesceWindowMs: number;
|
|
6
|
+
readonly rateLimitMs: number;
|
|
7
|
+
readonly maxLinesPerInjection: number;
|
|
8
|
+
readonly maxCharsPerInjection: number;
|
|
9
|
+
readonly wakeBudget: number;
|
|
10
|
+
}
|
|
4
11
|
export interface ResolvedTerminalSettings {
|
|
5
12
|
readonly defaultCols: number;
|
|
6
13
|
readonly defaultRows: number;
|
|
@@ -8,6 +15,7 @@ export interface ResolvedTerminalSettings {
|
|
|
8
15
|
readonly maxSessions: number;
|
|
9
16
|
readonly timeoutAction: TimeoutAction;
|
|
10
17
|
readonly notify: NotifyMode;
|
|
18
|
+
readonly monitor: MonitorDeliverySettings;
|
|
11
19
|
}
|
|
12
20
|
export declare const TERMINAL_SETTINGS_DEFAULTS: ResolvedTerminalSettings;
|
|
13
21
|
/** Resolve terminal-tool config from a raw `terminal` settings block, filling defaults. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/terminal/settings.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAGtF,MAAM,MAAM,aAAa,GAAG,YAAY,GAAG,MAAM,CAAC;AAClD,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,WAAW,GAAG,KAAK,CAAC;AAEtD,MAAM,WAAW,wBAAwB;IACxC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,aAAa,EAAE,aAAa,CAAC;IACtC,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/terminal/settings.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAGtF,MAAM,MAAM,aAAa,GAAG,YAAY,GAAG,MAAM,CAAC;AAClD,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,WAAW,GAAG,KAAK,CAAC;AAEtD,MAAM,WAAW,uBAAuB;IACvC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,oBAAoB,EAAE,MAAM,CAAC;IACtC,QAAQ,CAAC,oBAAoB,EAAE,MAAM,CAAC;IACtC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,wBAAwB;IACxC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,aAAa,EAAE,aAAa,CAAC;IACtC,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,uBAAuB,CAAC;CAC1C;AAED,eAAO,MAAM,0BAA0B,EAAE,wBAcxC,CAAC;AAgBF,2FAA2F;AAC3F,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,gBAAgB,GAAG,SAAS,GAAG,wBAAwB,CA6BnG;AAED,iFAAiF;AACjF,wBAAgB,oBAAoB,CAAC,eAAe,EAAE,eAAe,GAAG,wBAAwB,CAK/F"}
|
|
@@ -6,11 +6,18 @@ export const TERMINAL_SETTINGS_DEFAULTS = {
|
|
|
6
6
|
maxSessions: DEFAULT_MAX_SESSIONS,
|
|
7
7
|
timeoutAction: "background",
|
|
8
8
|
notify: "wake",
|
|
9
|
+
monitor: {
|
|
10
|
+
coalesceWindowMs: 2000,
|
|
11
|
+
rateLimitMs: 5000,
|
|
12
|
+
maxLinesPerInjection: 50,
|
|
13
|
+
maxCharsPerInjection: 4096,
|
|
14
|
+
wakeBudget: 5,
|
|
15
|
+
},
|
|
9
16
|
};
|
|
10
|
-
function positiveInt(value, fallback) {
|
|
17
|
+
function positiveInt(value, fallback, maximum = Number.MAX_SAFE_INTEGER) {
|
|
11
18
|
if (typeof value !== "number" || !Number.isFinite(value) || value < 1)
|
|
12
19
|
return fallback;
|
|
13
|
-
return Math.trunc(value);
|
|
20
|
+
return Math.min(Math.trunc(value), maximum);
|
|
14
21
|
}
|
|
15
22
|
function nonNegativeInt(value, fallback) {
|
|
16
23
|
if (typeof value !== "number" || !Number.isFinite(value) || value < 0)
|
|
@@ -31,6 +38,13 @@ export function resolveTerminalSettings(raw) {
|
|
|
31
38
|
maxSessions: positiveInt(raw.maxSessions, TERMINAL_SETTINGS_DEFAULTS.maxSessions),
|
|
32
39
|
timeoutAction: oneOf(raw.timeoutAction, ["background", "kill"], TERMINAL_SETTINGS_DEFAULTS.timeoutAction),
|
|
33
40
|
notify: oneOf(raw.notify, ["wake", "next-turn", "off"], TERMINAL_SETTINGS_DEFAULTS.notify),
|
|
41
|
+
monitor: {
|
|
42
|
+
coalesceWindowMs: positiveInt(raw.monitorCoalesceWindowMs, TERMINAL_SETTINGS_DEFAULTS.monitor.coalesceWindowMs, 60_000),
|
|
43
|
+
rateLimitMs: positiveInt(raw.monitorRateLimitMs, TERMINAL_SETTINGS_DEFAULTS.monitor.rateLimitMs, 3_600_000),
|
|
44
|
+
maxLinesPerInjection: positiveInt(raw.monitorMaxLinesPerInjection, TERMINAL_SETTINGS_DEFAULTS.monitor.maxLinesPerInjection, 200),
|
|
45
|
+
maxCharsPerInjection: positiveInt(raw.monitorMaxCharsPerInjection, TERMINAL_SETTINGS_DEFAULTS.monitor.maxCharsPerInjection, 16_384),
|
|
46
|
+
wakeBudget: positiveInt(raw.monitorWakeBudget, TERMINAL_SETTINGS_DEFAULTS.monitor.wakeBudget, 100),
|
|
47
|
+
},
|
|
34
48
|
};
|
|
35
49
|
}
|
|
36
50
|
/** Load and merge terminal-tool settings from global + project settings.json. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"settings.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/terminal/settings.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,oBAAoB,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"settings.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/terminal/settings.ts"],"names":[],"mappings":"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","sourcesContent":["import type { SettingsManager, TerminalSettings } from \"../../../settings-manager.ts\";\nimport { DEFAULT_COLS, DEFAULT_MAX_SESSIONS, DEFAULT_ROWS, DEFAULT_SCROLLBACK } from \"./shared.ts\";\n\nexport type TimeoutAction = \"background\" | \"kill\";\nexport type NotifyMode = \"wake\" | \"next-turn\" | \"off\";\n\nexport interface MonitorDeliverySettings {\n\treadonly coalesceWindowMs: number;\n\treadonly rateLimitMs: number;\n\treadonly maxLinesPerInjection: number;\n\treadonly maxCharsPerInjection: number;\n\treadonly wakeBudget: number;\n}\n\nexport interface ResolvedTerminalSettings {\n\treadonly defaultCols: number;\n\treadonly defaultRows: number;\n\treadonly scrollback: number;\n\treadonly maxSessions: number;\n\treadonly timeoutAction: TimeoutAction;\n\treadonly notify: NotifyMode;\n\treadonly monitor: MonitorDeliverySettings;\n}\n\nexport const TERMINAL_SETTINGS_DEFAULTS: ResolvedTerminalSettings = {\n\tdefaultCols: DEFAULT_COLS,\n\tdefaultRows: DEFAULT_ROWS,\n\tscrollback: DEFAULT_SCROLLBACK,\n\tmaxSessions: DEFAULT_MAX_SESSIONS,\n\ttimeoutAction: \"background\",\n\tnotify: \"wake\",\n\tmonitor: {\n\t\tcoalesceWindowMs: 2000,\n\t\trateLimitMs: 5000,\n\t\tmaxLinesPerInjection: 50,\n\t\tmaxCharsPerInjection: 4096,\n\t\twakeBudget: 5,\n\t},\n};\n\nfunction positiveInt(value: unknown, fallback: number, maximum = Number.MAX_SAFE_INTEGER): number {\n\tif (typeof value !== \"number\" || !Number.isFinite(value) || value < 1) return fallback;\n\treturn Math.min(Math.trunc(value), maximum);\n}\n\nfunction nonNegativeInt(value: unknown, fallback: number): number {\n\tif (typeof value !== \"number\" || !Number.isFinite(value) || value < 0) return fallback;\n\treturn Math.trunc(value);\n}\n\nfunction oneOf<T extends string>(value: unknown, allowed: readonly T[], fallback: T): T {\n\treturn typeof value === \"string\" && (allowed as readonly string[]).includes(value) ? (value as T) : fallback;\n}\n\n/** Resolve terminal-tool config from a raw `terminal` settings block, filling defaults. */\nexport function resolveTerminalSettings(raw: TerminalSettings | undefined): ResolvedTerminalSettings {\n\tif (!raw) return TERMINAL_SETTINGS_DEFAULTS;\n\treturn {\n\t\tdefaultCols: positiveInt(raw.defaultCols, TERMINAL_SETTINGS_DEFAULTS.defaultCols),\n\t\tdefaultRows: positiveInt(raw.defaultRows, TERMINAL_SETTINGS_DEFAULTS.defaultRows),\n\t\tscrollback: nonNegativeInt(raw.scrollback, TERMINAL_SETTINGS_DEFAULTS.scrollback),\n\t\tmaxSessions: positiveInt(raw.maxSessions, TERMINAL_SETTINGS_DEFAULTS.maxSessions),\n\t\ttimeoutAction: oneOf(raw.timeoutAction, [\"background\", \"kill\"], TERMINAL_SETTINGS_DEFAULTS.timeoutAction),\n\t\tnotify: oneOf(raw.notify, [\"wake\", \"next-turn\", \"off\"], TERMINAL_SETTINGS_DEFAULTS.notify),\n\t\tmonitor: {\n\t\t\tcoalesceWindowMs: positiveInt(\n\t\t\t\traw.monitorCoalesceWindowMs,\n\t\t\t\tTERMINAL_SETTINGS_DEFAULTS.monitor.coalesceWindowMs,\n\t\t\t\t60_000,\n\t\t\t),\n\t\t\trateLimitMs: positiveInt(raw.monitorRateLimitMs, TERMINAL_SETTINGS_DEFAULTS.monitor.rateLimitMs, 3_600_000),\n\t\t\tmaxLinesPerInjection: positiveInt(\n\t\t\t\traw.monitorMaxLinesPerInjection,\n\t\t\t\tTERMINAL_SETTINGS_DEFAULTS.monitor.maxLinesPerInjection,\n\t\t\t\t200,\n\t\t\t),\n\t\t\tmaxCharsPerInjection: positiveInt(\n\t\t\t\traw.monitorMaxCharsPerInjection,\n\t\t\t\tTERMINAL_SETTINGS_DEFAULTS.monitor.maxCharsPerInjection,\n\t\t\t\t16_384,\n\t\t\t),\n\t\t\twakeBudget: positiveInt(raw.monitorWakeBudget, TERMINAL_SETTINGS_DEFAULTS.monitor.wakeBudget, 100),\n\t\t},\n\t};\n}\n\n/** Load and merge terminal-tool settings from global + project settings.json. */\nexport function loadTerminalSettings(settingsManager: SettingsManager): ResolvedTerminalSettings {\n\tconst global = settingsManager.getGlobalSettings().terminal;\n\tconst project = settingsManager.getProjectSettings().terminal;\n\tconst merged: TerminalSettings = { ...global, ...project };\n\treturn resolveTerminalSettings(merged);\n}\n"]}
|
|
@@ -6,8 +6,9 @@ export declare const TERMINAL_OUTPUT_TOOL = "bash_output";
|
|
|
6
6
|
export declare const TERMINAL_KILL_TOOL = "kill_bash";
|
|
7
7
|
export declare const TERMINAL_INPUT_TOOL = "bash_input";
|
|
8
8
|
export declare const TERMINAL_RESIZE_TOOL = "bash_resize";
|
|
9
|
+
export declare const TERMINAL_MONITOR_TOOL = "monitor";
|
|
9
10
|
/** Companion tools that must never dangle without a live PTY `bash`. */
|
|
10
|
-
export declare const TERMINAL_COMPANION_TOOLS: readonly ["bash_output", "kill_bash", "bash_input", "bash_resize"];
|
|
11
|
+
export declare const TERMINAL_COMPANION_TOOLS: readonly ["bash_output", "kill_bash", "bash_input", "bash_resize", "monitor"];
|
|
11
12
|
export declare const DEFAULT_COLS = 120;
|
|
12
13
|
export declare const DEFAULT_ROWS = 40;
|
|
13
14
|
export declare const DEFAULT_SCROLLBACK = 10000;
|
|
@@ -23,7 +24,6 @@ export declare const BACKGROUND_START_GRACE_MS = 250;
|
|
|
23
24
|
* the agent blocked forever.
|
|
24
25
|
*/
|
|
25
26
|
export declare const KILLED_SESSION_EXIT_GRACE_MS = 5000;
|
|
26
|
-
export declare const DEFAULT_OUTPUT_WAIT_TIMEOUT_SECONDS = 30;
|
|
27
27
|
/**
|
|
28
28
|
* Non-interactive environment for foreground one-shot commands (codex-style):
|
|
29
29
|
* cooperative tools (`gh`, `git`, pagers, color libs) skip spinners/colors at
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/terminal/shared.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,eAAO,MAAM,kBAAkB,SAAS,CAAC;AACzC,eAAO,MAAM,oBAAoB,gBAAgB,CAAC;AAClD,eAAO,MAAM,kBAAkB,cAAc,CAAC;AAC9C,eAAO,MAAM,mBAAmB,eAAe,CAAC;AAChD,eAAO,MAAM,oBAAoB,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/terminal/shared.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,eAAO,MAAM,kBAAkB,SAAS,CAAC;AACzC,eAAO,MAAM,oBAAoB,gBAAgB,CAAC;AAClD,eAAO,MAAM,kBAAkB,cAAc,CAAC;AAC9C,eAAO,MAAM,mBAAmB,eAAe,CAAC;AAChD,eAAO,MAAM,oBAAoB,gBAAgB,CAAC;AAClD,eAAO,MAAM,qBAAqB,YAAY,CAAC;AAE/C,wEAAwE;AACxE,eAAO,MAAM,wBAAwB,+EAM3B,CAAC;AAEX,eAAO,MAAM,YAAY,MAAM,CAAC;AAChC,eAAO,MAAM,YAAY,KAAK,CAAC;AAC/B,eAAO,MAAM,kBAAkB,QAAS,CAAC;AACzC,eAAO,MAAM,oBAAoB,KAAK,CAAC;AACvC,2FAA2F;AAC3F,eAAO,MAAM,wBAAwB,UAAY,CAAC;AAClD,gGAAgG;AAChG,eAAO,MAAM,yBAAyB,MAAM,CAAC;AAC7C;;;;;GAKG;AACH,eAAO,MAAM,4BAA4B,OAAO,CAAC;AAEjD;;;;;GAKG;AACH,eAAO,MAAM,wBAAwB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAOrE,CAAC;AAiCF,iFAAiF;AACjF,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAQ7D;AAED,2FAA2F;AAC3F,wBAAgB,UAAU,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,CASvF;AAED,oFAAoF;AACpF,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAMzD"}
|
|
@@ -6,12 +6,14 @@ export const TERMINAL_OUTPUT_TOOL = "bash_output";
|
|
|
6
6
|
export const TERMINAL_KILL_TOOL = "kill_bash";
|
|
7
7
|
export const TERMINAL_INPUT_TOOL = "bash_input";
|
|
8
8
|
export const TERMINAL_RESIZE_TOOL = "bash_resize";
|
|
9
|
+
export const TERMINAL_MONITOR_TOOL = "monitor";
|
|
9
10
|
/** Companion tools that must never dangle without a live PTY `bash`. */
|
|
10
11
|
export const TERMINAL_COMPANION_TOOLS = [
|
|
11
12
|
TERMINAL_OUTPUT_TOOL,
|
|
12
13
|
TERMINAL_KILL_TOOL,
|
|
13
14
|
TERMINAL_INPUT_TOOL,
|
|
14
15
|
TERMINAL_RESIZE_TOOL,
|
|
16
|
+
TERMINAL_MONITOR_TOOL,
|
|
15
17
|
];
|
|
16
18
|
export const DEFAULT_COLS = 120;
|
|
17
19
|
export const DEFAULT_ROWS = 40;
|
|
@@ -28,7 +30,6 @@ export const BACKGROUND_START_GRACE_MS = 250;
|
|
|
28
30
|
* the agent blocked forever.
|
|
29
31
|
*/
|
|
30
32
|
export const KILLED_SESSION_EXIT_GRACE_MS = 5000;
|
|
31
|
-
export const DEFAULT_OUTPUT_WAIT_TIMEOUT_SECONDS = 30;
|
|
32
33
|
/**
|
|
33
34
|
* Non-interactive environment for foreground one-shot commands (codex-style):
|
|
34
35
|
* cooperative tools (`gh`, `git`, pagers, color libs) skip spinners/colors at
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/terminal/shared.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,CAAC,MAAM,kBAAkB,GAAG,MAAM,CAAC;AACzC,MAAM,CAAC,MAAM,oBAAoB,GAAG,aAAa,CAAC;AAClD,MAAM,CAAC,MAAM,kBAAkB,GAAG,WAAW,CAAC;AAC9C,MAAM,CAAC,MAAM,mBAAmB,GAAG,YAAY,CAAC;AAChD,MAAM,CAAC,MAAM,oBAAoB,GAAG,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/terminal/shared.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Shared constants and helpers for the persistent-terminal builtin extension.\n */\n\nexport const TERMINAL_BASH_TOOL = \"bash\";\nexport const TERMINAL_OUTPUT_TOOL = \"bash_output\";\nexport const TERMINAL_KILL_TOOL = \"kill_bash\";\nexport const TERMINAL_INPUT_TOOL = \"bash_input\";\nexport const TERMINAL_RESIZE_TOOL = \"bash_resize\";\nexport const TERMINAL_MONITOR_TOOL = \"monitor\";\n\n/** Companion tools that must never dangle without a live PTY `bash`. */\nexport const TERMINAL_COMPANION_TOOLS = [\n\tTERMINAL_OUTPUT_TOOL,\n\tTERMINAL_KILL_TOOL,\n\tTERMINAL_INPUT_TOOL,\n\tTERMINAL_RESIZE_TOOL,\n\tTERMINAL_MONITOR_TOOL,\n] as const;\n\nexport const DEFAULT_COLS = 120;\nexport const DEFAULT_ROWS = 40;\nexport const DEFAULT_SCROLLBACK = 10_000;\nexport const DEFAULT_MAX_SESSIONS = 32;\n/** Upper bound on decoded output retained per session for delta reads and `view:\"log\"`. */\nexport const MAX_SESSION_OUTPUT_CHARS = 1_000_000;\n/** Grace window used to capture a background command's early output before returning its id. */\nexport const BACKGROUND_START_GRACE_MS = 250;\n/**\n * After a foreground session has been killed (abort or timeout), how long to keep\n * waiting for its exit to settle before releasing the tool anyway. A surviving\n * descendant that holds the PTY open (or a kill that never lands) must not keep\n * the agent blocked forever.\n */\nexport const KILLED_SESSION_EXIT_GRACE_MS = 5000;\n\n/**\n * Non-interactive environment for foreground one-shot commands (codex-style):\n * cooperative tools (`gh`, `git`, pagers, color libs) skip spinners/colors at\n * the source instead of flooding the captured stream with redraw frames.\n * Background sessions keep the user's real TERM for interactive apps.\n */\nexport const FOREGROUND_ENV_OVERRIDES: Readonly<Record<string, string>> = {\n\tNO_COLOR: \"1\",\n\tTERM: \"dumb\",\n\tCOLORTERM: \"\",\n\tPAGER: \"cat\",\n\tGIT_PAGER: \"cat\",\n\tGH_PAGER: \"cat\",\n};\n\n/**\n * Named-key aliases the model can send via `bash_input {keys:[...]}`. Values are the\n * raw byte sequences a PTY expects (control chars + xterm cursor/function escapes).\n */\nconst KEY_SEQUENCES: Record<string, string> = {\n\tenter: \"\\r\",\n\treturn: \"\\r\",\n\ttab: \"\\t\",\n\tescape: \"\\x1b\",\n\tesc: \"\\x1b\",\n\tspace: \" \",\n\tbackspace: \"\\x7f\",\n\tdelete: \"\\x1b[3~\",\n\tup: \"\\x1b[A\",\n\tdown: \"\\x1b[B\",\n\tright: \"\\x1b[C\",\n\tleft: \"\\x1b[D\",\n\thome: \"\\x1b[H\",\n\tend: \"\\x1b[F\",\n\tpageup: \"\\x1b[5~\",\n\tpagedown: \"\\x1b[6~\",\n\t\"ctrl+c\": \"\\x03\",\n\t\"ctrl+d\": \"\\x04\",\n\t\"ctrl+z\": \"\\x1a\",\n\t\"ctrl+l\": \"\\x0c\",\n\t\"ctrl+u\": \"\\x15\",\n\t\"ctrl+a\": \"\\x01\",\n\t\"ctrl+e\": \"\\x05\",\n\t\"ctrl+\\\\\": \"\\x1c\",\n};\n\n/** Resolve a single named key to its PTY byte sequence, or null when unknown. */\nexport function resolveKeySequence(key: string): string | null {\n\tconst normalized = key.trim().toLowerCase();\n\tif (normalized.length === 0) return null;\n\tconst mapped = KEY_SEQUENCES[normalized];\n\tif (mapped !== undefined) return mapped;\n\t// Single printable character passes through verbatim.\n\tif ([...normalized].length === 1) return key;\n\treturn null;\n}\n\n/** Build a PTY-ready payload from a list of named keys, returning the unknown keys too. */\nexport function encodeKeys(keys: readonly string[]): { data: string; unknown: string[] } {\n\tlet data = \"\";\n\tconst unknown: string[] = [];\n\tfor (const key of keys) {\n\t\tconst sequence = resolveKeySequence(key);\n\t\tif (sequence === null) unknown.push(key);\n\t\telse data += sequence;\n\t}\n\treturn { data, unknown };\n}\n\n/** Compile a user-supplied regex, tolerating invalid patterns by returning null. */\nexport function safeRegExp(pattern: string): RegExp | null {\n\ttry {\n\t\treturn new RegExp(pattern);\n\t} catch {\n\t\treturn null;\n\t}\n}\n"]}
|
|
@@ -1,14 +1,20 @@
|
|
|
1
1
|
import { type Static, Type } from "typebox";
|
|
2
|
-
import type { AgentToolUpdateCallback } from "../../../types.ts";
|
|
3
2
|
import { type TerminalToolContext, type TerminalToolResult } from "./context.ts";
|
|
4
3
|
import { renderBashOutputCall, renderBashOutputResult } from "./render.ts";
|
|
4
|
+
/**
|
|
5
|
+
* Migration guidance returned when a caller passes one of the removed blocking
|
|
6
|
+
* params (`wait_for`, `block`, `timeout`). The params stay in the schema as
|
|
7
|
+
* deprecated ghosts so stale callers get this redirect instead of a generic
|
|
8
|
+
* validation error; the blocking semantics themselves are gone.
|
|
9
|
+
*/
|
|
10
|
+
export declare const BASH_OUTPUT_WAIT_REMOVED_GUIDANCE = "wait_for removed - launch pattern watches through monitor({command, filter}); for an already-running session, peek with bash_output or kill_bash and relaunch under monitor; completion notifications carry the tail";
|
|
5
11
|
export declare const bashOutputSchema: Type.TObject<{
|
|
6
12
|
bash_id: Type.TString;
|
|
7
13
|
filter: Type.TOptional<Type.TString>;
|
|
14
|
+
view: Type.TOptional<Type.TUnion<[Type.TLiteral<"log">, Type.TLiteral<"screen">]>>;
|
|
8
15
|
wait_for: Type.TOptional<Type.TString>;
|
|
9
16
|
block: Type.TOptional<Type.TBoolean>;
|
|
10
17
|
timeout: Type.TOptional<Type.TNumber>;
|
|
11
|
-
view: Type.TOptional<Type.TUnion<[Type.TLiteral<"log">, Type.TLiteral<"screen">]>>;
|
|
12
18
|
}>;
|
|
13
19
|
export type BashOutputInput = Static<typeof bashOutputSchema>;
|
|
14
20
|
export declare function createBashOutputTool(ctx: TerminalToolContext): {
|
|
@@ -19,12 +25,12 @@ export declare function createBashOutputTool(ctx: TerminalToolContext): {
|
|
|
19
25
|
parameters: Type.TObject<{
|
|
20
26
|
bash_id: Type.TString;
|
|
21
27
|
filter: Type.TOptional<Type.TString>;
|
|
28
|
+
view: Type.TOptional<Type.TUnion<[Type.TLiteral<"log">, Type.TLiteral<"screen">]>>;
|
|
22
29
|
wait_for: Type.TOptional<Type.TString>;
|
|
23
30
|
block: Type.TOptional<Type.TBoolean>;
|
|
24
31
|
timeout: Type.TOptional<Type.TNumber>;
|
|
25
|
-
view: Type.TOptional<Type.TUnion<[Type.TLiteral<"log">, Type.TLiteral<"screen">]>>;
|
|
26
32
|
}>;
|
|
27
|
-
execute(_toolCallId: string, input: BashOutputInput
|
|
33
|
+
execute(_toolCallId: string, input: BashOutputInput): Promise<TerminalToolResult>;
|
|
28
34
|
renderCall: typeof renderBashOutputCall;
|
|
29
35
|
renderResult: typeof renderBashOutputResult;
|
|
30
36
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bash-output.d.ts","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/terminal/tools/bash-output.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,MAAM,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"bash-output.d.ts","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/terminal/tools/bash-output.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,MAAM,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAI5C,OAAO,EAAe,KAAK,mBAAmB,EAAE,KAAK,kBAAkB,EAAc,MAAM,cAAc,CAAC;AAC1G,OAAO,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAG3E;;;;;GAKG;AACH,eAAO,MAAM,iCAAiC,yNACyK,CAAC;AAKxN,eAAO,MAAM,gBAAgB;;;;;;;EAW3B,CAAC;AAEH,MAAM,MAAM,eAAe,GAAG,MAAM,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAwB9D,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,mBAAmB;;;;;;;;;;;;;yBAShC,MAAM,SAAS,eAAe,GAAG,OAAO,CAAC,kBAAkB,CAAC;;;EAoBxF"}
|
|
@@ -1,63 +1,26 @@
|
|
|
1
1
|
import { Type } from "typebox";
|
|
2
2
|
import { formatTerminalToolOutput } from "../output-format.js";
|
|
3
|
-
import {
|
|
4
|
-
import { createThrottledEmitter } from "./bash.js";
|
|
3
|
+
import { safeRegExp, TERMINAL_OUTPUT_TOOL } from "../shared.js";
|
|
5
4
|
import { errorResult, textResult } from "./context.js";
|
|
6
5
|
import { renderBashOutputCall, renderBashOutputResult } from "./render.js";
|
|
7
6
|
import { describeExit } from "./spawn.js";
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
start++;
|
|
17
|
-
return buffer.subarray(start).toString("utf8");
|
|
18
|
-
}
|
|
19
|
-
class TailBuffer {
|
|
20
|
-
#maxBytes;
|
|
21
|
-
#text = "";
|
|
22
|
-
#bytes = 0;
|
|
23
|
-
constructor(maxBytes) {
|
|
24
|
-
this.#maxBytes = Math.max(0, Math.floor(maxBytes));
|
|
25
|
-
}
|
|
26
|
-
append(text) {
|
|
27
|
-
if (text.length === 0)
|
|
28
|
-
return;
|
|
29
|
-
if (this.#maxBytes === 0) {
|
|
30
|
-
this.#text = "";
|
|
31
|
-
this.#bytes = 0;
|
|
32
|
-
return;
|
|
33
|
-
}
|
|
34
|
-
const incomingBytes = Buffer.byteLength(text, "utf8");
|
|
35
|
-
this.#text =
|
|
36
|
-
incomingBytes >= this.#maxBytes
|
|
37
|
-
? truncateTailBytes(text, this.#maxBytes)
|
|
38
|
-
: truncateTailBytes(this.#text + text, this.#maxBytes);
|
|
39
|
-
this.#bytes = Buffer.byteLength(this.#text, "utf8");
|
|
40
|
-
}
|
|
41
|
-
text() {
|
|
42
|
-
return this.#text;
|
|
43
|
-
}
|
|
44
|
-
bytes() {
|
|
45
|
-
return this.#bytes;
|
|
46
|
-
}
|
|
47
|
-
}
|
|
7
|
+
/**
|
|
8
|
+
* Migration guidance returned when a caller passes one of the removed blocking
|
|
9
|
+
* params (`wait_for`, `block`, `timeout`). The params stay in the schema as
|
|
10
|
+
* deprecated ghosts so stale callers get this redirect instead of a generic
|
|
11
|
+
* validation error; the blocking semantics themselves are gone.
|
|
12
|
+
*/
|
|
13
|
+
export const BASH_OUTPUT_WAIT_REMOVED_GUIDANCE = "wait_for removed - launch pattern watches through monitor({command, filter}); for an already-running session, peek with bash_output or kill_bash and relaunch under monitor; completion notifications carry the tail";
|
|
14
|
+
const GHOST_PARAM_DESCRIPTION = "Removed: bash_output no longer blocks. Passing this returns migration guidance pointing at monitor + completion notifications.";
|
|
48
15
|
export const bashOutputSchema = Type.Object({
|
|
49
16
|
bash_id: Type.String({ description: "Session id returned by a run_in_background bash call." }),
|
|
50
17
|
filter: Type.Optional(Type.String({ description: "Only return output lines matching this regex." })),
|
|
51
|
-
wait_for: Type.Optional(Type.String({ description: "Block until output matches this regex, the session exits, or timeout." })),
|
|
52
|
-
block: Type.Optional(Type.Boolean({ description: "When wait_for is set, block (default true)." })),
|
|
53
|
-
timeout: Type.Optional(Type.Number({
|
|
54
|
-
minimum: 0,
|
|
55
|
-
maximum: MAX_OUTPUT_WAIT_TIMEOUT_SECONDS,
|
|
56
|
-
description: "wait_for timeout in seconds (default 30, maximum 300).",
|
|
57
|
-
})),
|
|
58
18
|
view: Type.Optional(Type.Union([Type.Literal("log"), Type.Literal("screen")], {
|
|
59
19
|
description: "'log' returns new raw output (default); 'screen' returns the rendered xterm grid.",
|
|
60
20
|
})),
|
|
21
|
+
wait_for: Type.Optional(Type.String({ description: GHOST_PARAM_DESCRIPTION })),
|
|
22
|
+
block: Type.Optional(Type.Boolean({ description: GHOST_PARAM_DESCRIPTION })),
|
|
23
|
+
timeout: Type.Optional(Type.Number({ description: GHOST_PARAM_DESCRIPTION })),
|
|
61
24
|
});
|
|
62
25
|
function statusLine(runtime) {
|
|
63
26
|
if (!runtime.exited)
|
|
@@ -85,57 +48,15 @@ export function createBashOutputTool(ctx) {
|
|
|
85
48
|
return {
|
|
86
49
|
name: TERMINAL_OUTPUT_TOOL,
|
|
87
50
|
label: "bash_output",
|
|
88
|
-
description: "Read
|
|
89
|
-
promptSnippet: "
|
|
51
|
+
description: "Read output from a background bash session without blocking: new output since the last read, the status line, or a rendered full-screen snapshot via view:'screen'. Pattern watches run through monitor; completion arrives as a notification carrying the exit code and output tail.",
|
|
52
|
+
promptSnippet: "Peek at background bash session output (filter, screen view, status); watch patterns with monitor, completion arrives as a notification",
|
|
90
53
|
parameters: bashOutputSchema,
|
|
91
|
-
async execute(_toolCallId, input
|
|
54
|
+
async execute(_toolCallId, input) {
|
|
92
55
|
const runtime = ctx.manager.get(input.bash_id);
|
|
93
56
|
if (!runtime)
|
|
94
57
|
return errorResult(`No terminal session found with id: ${input.bash_id}`);
|
|
95
|
-
if (input.wait_for
|
|
96
|
-
|
|
97
|
-
const timeoutMs = Math.trunc(timeoutSeconds * 1000);
|
|
98
|
-
if (input.view === "screen") {
|
|
99
|
-
const outcome = await runtime.waitFor(input.wait_for, timeoutMs, signal);
|
|
100
|
-
if (outcome === "invalid_pattern")
|
|
101
|
-
return errorResult(`Invalid wait_for regex: ${input.wait_for}`);
|
|
102
|
-
}
|
|
103
|
-
else {
|
|
104
|
-
const startedAt = Date.now();
|
|
105
|
-
const progress = {
|
|
106
|
-
activity: `waiting for /${input.wait_for}/`,
|
|
107
|
-
startedAt,
|
|
108
|
-
...(input.timeout === undefined ? {} : { maxWaitMs: timeoutMs }),
|
|
109
|
-
};
|
|
110
|
-
const preview = new TailBuffer(STREAM_PREVIEW_MAX_BYTES);
|
|
111
|
-
const emit = () => {
|
|
112
|
-
onUpdate?.({
|
|
113
|
-
content: [
|
|
114
|
-
{
|
|
115
|
-
type: "text",
|
|
116
|
-
text: `${statusLine(runtime)}\n${formatTerminalToolOutput(applyFilter(preview.text(), input.filter)).text}`,
|
|
117
|
-
},
|
|
118
|
-
],
|
|
119
|
-
details: { progress },
|
|
120
|
-
});
|
|
121
|
-
};
|
|
122
|
-
onUpdate?.({ content: [{ type: "text", text: statusLine(runtime) }], details: { progress } });
|
|
123
|
-
const throttle = createThrottledEmitter(emit);
|
|
124
|
-
const unsubscribe = runtime.onOutput((chunk) => {
|
|
125
|
-
preview.append(chunk);
|
|
126
|
-
throttle.schedule();
|
|
127
|
-
});
|
|
128
|
-
try {
|
|
129
|
-
const outcome = await runtime.waitFor(input.wait_for, timeoutMs, signal);
|
|
130
|
-
if (outcome === "invalid_pattern")
|
|
131
|
-
return errorResult(`Invalid wait_for regex: ${input.wait_for}`);
|
|
132
|
-
}
|
|
133
|
-
finally {
|
|
134
|
-
throttle.flush();
|
|
135
|
-
unsubscribe();
|
|
136
|
-
throttle.dispose();
|
|
137
|
-
}
|
|
138
|
-
}
|
|
58
|
+
if (input.wait_for !== undefined || input.block !== undefined || input.timeout !== undefined) {
|
|
59
|
+
return errorResult(BASH_OUTPUT_WAIT_REMOVED_GUIDANCE);
|
|
139
60
|
}
|
|
140
61
|
if (input.view === "screen") {
|
|
141
62
|
return textResult(`${statusLine(runtime)}\n${screenView(runtime)}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bash-output.js","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/terminal/tools/bash-output.ts"],"names":[],"mappings":"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","sourcesContent":["import { type Static, Type } from \"typebox\";\nimport type { AgentToolUpdateCallback } from \"../../../types.ts\";\nimport { formatTerminalToolOutput } from \"../output-format.ts\";\nimport type { TerminalRuntimeSession } from \"../runtime-session.ts\";\nimport { DEFAULT_OUTPUT_WAIT_TIMEOUT_SECONDS, safeRegExp, TERMINAL_OUTPUT_TOOL } from \"../shared.ts\";\nimport { createThrottledEmitter } from \"./bash.ts\";\nimport { errorResult, type TerminalToolContext, type TerminalToolResult, textResult } from \"./context.ts\";\nimport { renderBashOutputCall, renderBashOutputResult } from \"./render.ts\";\nimport { describeExit } from \"./spawn.ts\";\n\nconst MAX_OUTPUT_WAIT_TIMEOUT_SECONDS = 300;\nconst STREAM_PREVIEW_MAX_BYTES = 64 * 1024;\n\nfunction truncateTailBytes(text: string, maxBytes: number): string {\n\tconst buffer = Buffer.from(text, \"utf8\");\n\tif (buffer.length <= maxBytes) return text;\n\tlet start = buffer.length - maxBytes;\n\twhile (start < buffer.length && (buffer[start] & 0xc0) === 0x80) start++;\n\treturn buffer.subarray(start).toString(\"utf8\");\n}\n\nclass TailBuffer {\n\treadonly #maxBytes: number;\n\t#text = \"\";\n\t#bytes = 0;\n\n\tconstructor(maxBytes: number) {\n\t\tthis.#maxBytes = Math.max(0, Math.floor(maxBytes));\n\t}\n\n\tappend(text: string): void {\n\t\tif (text.length === 0) return;\n\t\tif (this.#maxBytes === 0) {\n\t\t\tthis.#text = \"\";\n\t\t\tthis.#bytes = 0;\n\t\t\treturn;\n\t\t}\n\t\tconst incomingBytes = Buffer.byteLength(text, \"utf8\");\n\t\tthis.#text =\n\t\t\tincomingBytes >= this.#maxBytes\n\t\t\t\t? truncateTailBytes(text, this.#maxBytes)\n\t\t\t\t: truncateTailBytes(this.#text + text, this.#maxBytes);\n\t\tthis.#bytes = Buffer.byteLength(this.#text, \"utf8\");\n\t}\n\n\ttext(): string {\n\t\treturn this.#text;\n\t}\n\n\tbytes(): number {\n\t\treturn this.#bytes;\n\t}\n}\n\nexport const bashOutputSchema = Type.Object({\n\tbash_id: Type.String({ description: \"Session id returned by a run_in_background bash call.\" }),\n\tfilter: Type.Optional(Type.String({ description: \"Only return output lines matching this regex.\" })),\n\twait_for: Type.Optional(\n\t\tType.String({ description: \"Block until output matches this regex, the session exits, or timeout.\" }),\n\t),\n\tblock: Type.Optional(Type.Boolean({ description: \"When wait_for is set, block (default true).\" })),\n\ttimeout: Type.Optional(\n\t\tType.Number({\n\t\t\tminimum: 0,\n\t\t\tmaximum: MAX_OUTPUT_WAIT_TIMEOUT_SECONDS,\n\t\t\tdescription: \"wait_for timeout in seconds (default 30, maximum 300).\",\n\t\t}),\n\t),\n\tview: Type.Optional(\n\t\tType.Union([Type.Literal(\"log\"), Type.Literal(\"screen\")], {\n\t\t\tdescription: \"'log' returns new raw output (default); 'screen' returns the rendered xterm grid.\",\n\t\t}),\n\t),\n});\n\nexport type BashOutputInput = Static<typeof bashOutputSchema>;\n\nfunction statusLine(runtime: TerminalRuntimeSession): string {\n\tif (!runtime.exited) return \"status: running\";\n\tconst status = describeExit(runtime) ?? \"exited\";\n\tconst code = runtime.exitResult?.exitCode;\n\treturn code === null || code === undefined ? `status: ${status}` : `status: ${status} exit_code: ${code}`;\n}\n\nfunction applyFilter(text: string, filter: string | undefined): string {\n\tif (!filter) return text;\n\tconst regex = safeRegExp(filter);\n\tif (regex === null) return text;\n\treturn text\n\t\t.split(\"\\n\")\n\t\t.filter((line) => regex.test(line))\n\t\t.join(\"\\n\");\n}\n\nfunction screenView(runtime: TerminalRuntimeSession): string {\n\tconst snapshot = runtime.snapshot();\n\treturn snapshot.visibleGrid.join(\"\\n\").replace(/\\s+$/, \"\");\n}\n\nexport function createBashOutputTool(ctx: TerminalToolContext) {\n\treturn {\n\t\tname: TERMINAL_OUTPUT_TOOL,\n\t\tlabel: \"bash_output\",\n\t\tdescription:\n\t\t\t\"Read new output from a background bash session, or block until wait_for matches / the session exits / timeout. Use view:'screen' for a rendered full-screen snapshot.\",\n\t\tpromptSnippet: \"Read/subscribe to background bash session output (wait_for, filter, screen view)\",\n\t\tparameters: bashOutputSchema,\n\t\tasync execute(\n\t\t\t_toolCallId: string,\n\t\t\tinput: BashOutputInput,\n\t\t\tsignal?: AbortSignal,\n\t\t\tonUpdate?: AgentToolUpdateCallback<Record<string, unknown> | undefined>,\n\t\t): Promise<TerminalToolResult> {\n\t\t\tconst runtime = ctx.manager.get(input.bash_id);\n\t\t\tif (!runtime) return errorResult(`No terminal session found with id: ${input.bash_id}`);\n\n\t\t\tif (input.wait_for && input.block !== false) {\n\t\t\t\tconst timeoutSeconds = Math.min(\n\t\t\t\t\tMath.max(input.timeout ?? DEFAULT_OUTPUT_WAIT_TIMEOUT_SECONDS, 0),\n\t\t\t\t\tMAX_OUTPUT_WAIT_TIMEOUT_SECONDS,\n\t\t\t\t);\n\t\t\t\tconst timeoutMs = Math.trunc(timeoutSeconds * 1000);\n\t\t\t\tif (input.view === \"screen\") {\n\t\t\t\t\tconst outcome = await runtime.waitFor(input.wait_for, timeoutMs, signal);\n\t\t\t\t\tif (outcome === \"invalid_pattern\") return errorResult(`Invalid wait_for regex: ${input.wait_for}`);\n\t\t\t\t} else {\n\t\t\t\t\tconst startedAt = Date.now();\n\t\t\t\t\tconst progress = {\n\t\t\t\t\t\tactivity: `waiting for /${input.wait_for}/`,\n\t\t\t\t\t\tstartedAt,\n\t\t\t\t\t\t...(input.timeout === undefined ? {} : { maxWaitMs: timeoutMs }),\n\t\t\t\t\t};\n\t\t\t\t\tconst preview = new TailBuffer(STREAM_PREVIEW_MAX_BYTES);\n\t\t\t\t\tconst emit = () => {\n\t\t\t\t\t\tonUpdate?.({\n\t\t\t\t\t\t\tcontent: [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\t\t\ttext: `${statusLine(runtime)}\\n${formatTerminalToolOutput(applyFilter(preview.text(), input.filter)).text}`,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\tdetails: { progress },\n\t\t\t\t\t\t});\n\t\t\t\t\t};\n\t\t\t\t\tonUpdate?.({ content: [{ type: \"text\", text: statusLine(runtime) }], details: { progress } });\n\t\t\t\t\tconst throttle = createThrottledEmitter(emit);\n\t\t\t\t\tconst unsubscribe = runtime.onOutput((chunk) => {\n\t\t\t\t\t\tpreview.append(chunk);\n\t\t\t\t\t\tthrottle.schedule();\n\t\t\t\t\t});\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst outcome = await runtime.waitFor(input.wait_for, timeoutMs, signal);\n\t\t\t\t\t\tif (outcome === \"invalid_pattern\") return errorResult(`Invalid wait_for regex: ${input.wait_for}`);\n\t\t\t\t\t} finally {\n\t\t\t\t\t\tthrottle.flush();\n\t\t\t\t\t\tunsubscribe();\n\t\t\t\t\t\tthrottle.dispose();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (input.view === \"screen\") {\n\t\t\t\treturn textResult(`${statusLine(runtime)}\\n${screenView(runtime)}`);\n\t\t\t}\n\n\t\t\tconst delta = runtime.readDelta();\n\t\t\tconst formatted = formatTerminalToolOutput(applyFilter(delta.text, input.filter));\n\t\t\tconst dropped = delta.droppedChars > 0 ? `[${delta.droppedChars} earlier chars dropped]\\n` : \"\";\n\t\t\treturn textResult(`${statusLine(runtime)}\\n${dropped}${formatted.text || \"(no new output)\"}`);\n\t\t},\n\t\trenderCall: renderBashOutputCall,\n\t\trenderResult: renderBashOutputResult,\n\t};\n}\n"]}
|
|
1
|
+
{"version":3,"file":"bash-output.js","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/terminal/tools/bash-output.ts"],"names":[],"mappings":"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","sourcesContent":["import { type Static, Type } from \"typebox\";\nimport { formatTerminalToolOutput } from \"../output-format.ts\";\nimport type { TerminalRuntimeSession } from \"../runtime-session.ts\";\nimport { safeRegExp, TERMINAL_OUTPUT_TOOL } from \"../shared.ts\";\nimport { errorResult, type TerminalToolContext, type TerminalToolResult, textResult } from \"./context.ts\";\nimport { renderBashOutputCall, renderBashOutputResult } from \"./render.ts\";\nimport { describeExit } from \"./spawn.ts\";\n\n/**\n * Migration guidance returned when a caller passes one of the removed blocking\n * params (`wait_for`, `block`, `timeout`). The params stay in the schema as\n * deprecated ghosts so stale callers get this redirect instead of a generic\n * validation error; the blocking semantics themselves are gone.\n */\nexport const BASH_OUTPUT_WAIT_REMOVED_GUIDANCE =\n\t\"wait_for removed - launch pattern watches through monitor({command, filter}); for an already-running session, peek with bash_output or kill_bash and relaunch under monitor; completion notifications carry the tail\";\n\nconst GHOST_PARAM_DESCRIPTION =\n\t\"Removed: bash_output no longer blocks. Passing this returns migration guidance pointing at monitor + completion notifications.\";\n\nexport const bashOutputSchema = Type.Object({\n\tbash_id: Type.String({ description: \"Session id returned by a run_in_background bash call.\" }),\n\tfilter: Type.Optional(Type.String({ description: \"Only return output lines matching this regex.\" })),\n\tview: Type.Optional(\n\t\tType.Union([Type.Literal(\"log\"), Type.Literal(\"screen\")], {\n\t\t\tdescription: \"'log' returns new raw output (default); 'screen' returns the rendered xterm grid.\",\n\t\t}),\n\t),\n\twait_for: Type.Optional(Type.String({ description: GHOST_PARAM_DESCRIPTION })),\n\tblock: Type.Optional(Type.Boolean({ description: GHOST_PARAM_DESCRIPTION })),\n\ttimeout: Type.Optional(Type.Number({ description: GHOST_PARAM_DESCRIPTION })),\n});\n\nexport type BashOutputInput = Static<typeof bashOutputSchema>;\n\nfunction statusLine(runtime: TerminalRuntimeSession): string {\n\tif (!runtime.exited) return \"status: running\";\n\tconst status = describeExit(runtime) ?? \"exited\";\n\tconst code = runtime.exitResult?.exitCode;\n\treturn code === null || code === undefined ? `status: ${status}` : `status: ${status} exit_code: ${code}`;\n}\n\nfunction applyFilter(text: string, filter: string | undefined): string {\n\tif (!filter) return text;\n\tconst regex = safeRegExp(filter);\n\tif (regex === null) return text;\n\treturn text\n\t\t.split(\"\\n\")\n\t\t.filter((line) => regex.test(line))\n\t\t.join(\"\\n\");\n}\n\nfunction screenView(runtime: TerminalRuntimeSession): string {\n\tconst snapshot = runtime.snapshot();\n\treturn snapshot.visibleGrid.join(\"\\n\").replace(/\\s+$/, \"\");\n}\n\nexport function createBashOutputTool(ctx: TerminalToolContext) {\n\treturn {\n\t\tname: TERMINAL_OUTPUT_TOOL,\n\t\tlabel: \"bash_output\",\n\t\tdescription:\n\t\t\t\"Read output from a background bash session without blocking: new output since the last read, the status line, or a rendered full-screen snapshot via view:'screen'. Pattern watches run through monitor; completion arrives as a notification carrying the exit code and output tail.\",\n\t\tpromptSnippet:\n\t\t\t\"Peek at background bash session output (filter, screen view, status); watch patterns with monitor, completion arrives as a notification\",\n\t\tparameters: bashOutputSchema,\n\t\tasync execute(_toolCallId: string, input: BashOutputInput): Promise<TerminalToolResult> {\n\t\t\tconst runtime = ctx.manager.get(input.bash_id);\n\t\t\tif (!runtime) return errorResult(`No terminal session found with id: ${input.bash_id}`);\n\n\t\t\tif (input.wait_for !== undefined || input.block !== undefined || input.timeout !== undefined) {\n\t\t\t\treturn errorResult(BASH_OUTPUT_WAIT_REMOVED_GUIDANCE);\n\t\t\t}\n\n\t\t\tif (input.view === \"screen\") {\n\t\t\t\treturn textResult(`${statusLine(runtime)}\\n${screenView(runtime)}`);\n\t\t\t}\n\n\t\t\tconst delta = runtime.readDelta();\n\t\t\tconst formatted = formatTerminalToolOutput(applyFilter(delta.text, input.filter));\n\t\t\tconst dropped = delta.droppedChars > 0 ? `[${delta.droppedChars} earlier chars dropped]\\n` : \"\";\n\t\t\treturn textResult(`${statusLine(runtime)}\\n${dropped}${formatted.text || \"(no new output)\"}`);\n\t\t},\n\t\trenderCall: renderBashOutputCall,\n\t\trenderResult: renderBashOutputResult,\n\t};\n}\n"]}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { TerminalManager } from "../manager.ts";
|
|
2
|
+
import type { MonitorEvent, MonitorRegistry } from "../monitor-registry.ts";
|
|
2
3
|
import type { TerminalRuntimeSession } from "../runtime-session.ts";
|
|
3
4
|
/** Shared dependencies handed to every terminal tool factory. */
|
|
4
5
|
export interface TerminalToolContext {
|
|
@@ -17,6 +18,12 @@ export interface TerminalToolContext {
|
|
|
17
18
|
readonly getSessionContext?: () => import("../../../types.ts").ExtensionContext | undefined;
|
|
18
19
|
/** Notified when a background session exits, so the notify layer can wake the agent. */
|
|
19
20
|
readonly onBackgroundExit?: (id: string, runtime: TerminalRuntimeSession) => void;
|
|
21
|
+
/** Session-scoped monitor state, sharing the terminal manager's bash-id namespace. */
|
|
22
|
+
readonly monitorRegistry?: MonitorRegistry;
|
|
23
|
+
/** Receives filtered monitor line and terminal-summary events. */
|
|
24
|
+
readonly onMonitorEvent?: (event: MonitorEvent) => void;
|
|
25
|
+
/** Resets session-global wake-budget delivery after a monitor was explicitly rearmed. */
|
|
26
|
+
readonly onMonitorRearmed?: (id: string) => void;
|
|
20
27
|
}
|
|
21
28
|
/** Minimal tool-result shape returned by the terminal tools. */
|
|
22
29
|
export interface TerminalToolResult {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/terminal/tools/context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAEpE,iEAAiE;AACjE,MAAM,WAAW,mBAAmB;IACnC,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAC;IAClC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,gFAAgF;IAChF,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,sFAAsF;IACtF,QAAQ,CAAC,MAAM,EAAE,MAAM,MAAM,CAAC,UAAU,CAAC;IACzC;;;OAGG;IACH,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,OAAO,mBAAmB,EAAE,gBAAgB,GAAG,SAAS,CAAC;IAC5F,wFAAwF;IACxF,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,sBAAsB,KAAK,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/terminal/tools/context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC5E,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAEpE,iEAAiE;AACjE,MAAM,WAAW,mBAAmB;IACnC,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAC;IAClC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,gFAAgF;IAChF,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,sFAAsF;IACtF,QAAQ,CAAC,MAAM,EAAE,MAAM,MAAM,CAAC,UAAU,CAAC;IACzC;;;OAGG;IACH,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,OAAO,mBAAmB,EAAE,gBAAgB,GAAG,SAAS,CAAC;IAC5F,wFAAwF;IACxF,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,sBAAsB,KAAK,IAAI,CAAC;IAClF,sFAAsF;IACtF,QAAQ,CAAC,eAAe,CAAC,EAAE,eAAe,CAAC;IAC3C,kEAAkE;IAClE,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,CAAC;IACxD,yFAAyF;IACzF,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;CACjD;AAED,gEAAgE;AAChE,MAAM,WAAW,kBAAkB;IAClC,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/C,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC;IAC7C,OAAO,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,wBAAgB,UAAU,CACzB,IAAI,EAAE,MAAM,EACZ,KAAK,CAAC,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,GAC9D,kBAAkB,CAEpB;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,kBAAkB,CAE5D"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/terminal/tools/context.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/terminal/tools/context.ts"],"names":[],"mappings":"AAoCA,MAAM,UAAU,UAAU,CACzB,IAAY,EACZ,KAAgE;IAEhE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;AAChG,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,IAAY;IACvC,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AACjF,CAAC","sourcesContent":["import type { TerminalManager } from \"../manager.ts\";\nimport type { MonitorEvent, MonitorRegistry } from \"../monitor-registry.ts\";\nimport type { TerminalRuntimeSession } from \"../runtime-session.ts\";\n\n/** Shared dependencies handed to every terminal tool factory. */\nexport interface TerminalToolContext {\n\treadonly manager: TerminalManager;\n\treadonly cwd: string;\n\t/** Explicit shell path from settings (settings-manager `shellPath`), if any. */\n\treadonly shellPath?: string;\n\treadonly defaultCols: number;\n\treadonly defaultRows: number;\n\t/** Resolve the environment for spawned sessions (mirrors core bash `getShellEnv`). */\n\treadonly getEnv: () => NodeJS.ProcessEnv;\n\t/**\n\t * Current extension session context (set on session_start/model_select), used to\n\t * expose PI_* session metadata to spawned commands like the core bash tool does.\n\t */\n\treadonly getSessionContext?: () => import(\"../../../types.ts\").ExtensionContext | undefined;\n\t/** Notified when a background session exits, so the notify layer can wake the agent. */\n\treadonly onBackgroundExit?: (id: string, runtime: TerminalRuntimeSession) => void;\n\t/** Session-scoped monitor state, sharing the terminal manager's bash-id namespace. */\n\treadonly monitorRegistry?: MonitorRegistry;\n\t/** Receives filtered monitor line and terminal-summary events. */\n\treadonly onMonitorEvent?: (event: MonitorEvent) => void;\n\t/** Resets session-global wake-budget delivery after a monitor was explicitly rearmed. */\n\treadonly onMonitorRearmed?: (id: string) => void;\n}\n\n/** Minimal tool-result shape returned by the terminal tools. */\nexport interface TerminalToolResult {\n\tcontent: Array<{ type: \"text\"; text: string }>;\n\tdetails: Record<string, unknown> | undefined;\n\tisError?: boolean;\n}\n\nexport function textResult(\n\ttext: string,\n\textra?: { details?: Record<string, unknown>; isError?: boolean },\n): TerminalToolResult {\n\treturn { content: [{ type: \"text\", text }], details: extra?.details, isError: extra?.isError };\n}\n\nexport function errorResult(text: string): TerminalToolResult {\n\treturn { content: [{ type: \"text\", text }], details: undefined, isError: true };\n}\n"]}
|