@sayknow-cli/coding-agent 0.3.16 → 0.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +52 -0
- package/package.json +133 -116
- package/scripts/build-sdk-package-smoke.ts +132 -0
- package/scripts/capture-notifications-settings-showcase.ts +435 -0
- package/scripts/compile-args.ts +5 -2
- package/scripts/g005-daemon-smoke.ts +4 -5
- package/scripts/g011-daemon-path-smoke.ts +5 -5
- package/scripts/generate-hotkeys-docs.ts +74 -0
- package/scripts/generate-sdk-adapter-parity-manifest.ts +163 -0
- package/scripts/generate-sdk-operation-inventory.ts +914 -0
- package/scripts/generate-telegram-baseline-manifest.ts +128 -0
- package/scripts/manifest-schema.ts +124 -0
- package/scripts/run-test-manifest.ts +153 -0
- package/scripts/run-threat-model-check.ts +217 -0
- package/scripts/verify-skc-sdk-canonicalization.ts +3647 -0
- package/scripts/verify-skc-sdk-rename.ts +90 -0
- package/src/append-only-mode.ts +1 -1
- package/src/async/job-manager.ts +455 -69
- package/src/cli/args.ts +43 -12
- package/src/cli/auth-gateway-cli.ts +2 -2
- package/src/cli/config-cli.ts +77 -3
- package/src/cli/daemon-cli.ts +63 -14
- package/src/cli/launch-disposition.ts +42 -0
- package/src/cli/list-models.ts +1 -1
- package/src/cli/notify-cli.ts +373 -283
- package/src/cli/session-picker.ts +20 -3
- package/src/cli/setup-cli.ts +1 -1
- package/src/cli/worktree-cli.ts +9 -287
- package/src/cli.ts +31 -11
- package/src/commands/config.ts +1 -1
- package/src/commands/daemon.ts +50 -6
- package/src/commands/gc.ts +11 -1
- package/src/commands/harness.ts +127 -142
- package/src/commands/launch.ts +11 -6
- package/src/commands/mcp-serve.ts +97 -13
- package/src/commands/mcp.ts +2 -2
- package/src/commands/notify.ts +44 -7
- package/src/commands/sdk.ts +453 -0
- package/src/commands/ultragoal.ts +4 -1
- package/src/commands/worktree.ts +10 -53
- package/src/commit/agentic/agent.ts +1 -0
- package/src/config/atomic-yaml-patch.ts +490 -0
- package/src/config/file-lock.ts +105 -43
- package/src/config/keybindings.ts +64 -20
- package/src/config/model-auth.ts +9 -0
- package/src/config/model-bindings-applier.ts +139 -0
- package/src/config/model-discovery-manager.ts +224 -0
- package/src/config/model-equivalence.ts +66 -0
- package/src/config/model-profile-activation.ts +233 -86
- package/src/config/model-profiles.ts +52 -49
- package/src/config/model-registry.ts +5 -4
- package/src/config/model-resolver.ts +487 -410
- package/src/config/model-selector-value.ts +50 -0
- package/src/config/models-config-schema.ts +17 -23
- package/src/config/settings-schema.ts +372 -21
- package/src/config/settings.ts +1120 -182
- package/src/coordinator-mcp/model-preset.ts +74 -20
- package/src/coordinator-mcp/policy.ts +76 -11
- package/src/coordinator-mcp/question-gate-codec.ts +274 -0
- package/src/coordinator-mcp/question-state.ts +778 -0
- package/src/coordinator-mcp/server.ts +3120 -3111
- package/src/daemon/builtin.ts +8 -5
- package/src/daemon/control-types.ts +1 -1
- package/src/daemon/runtime.ts +2 -2
- package/src/debug/index.ts +1 -1
- package/src/defaults/skc/skills/team/SKILL.md +27 -13
- package/src/defaults/skc/skills/ultragoal/SKILL.md +0 -2
- package/src/discovery/helpers.ts +1 -50
- package/src/discovery/mcp-json.ts +327 -20
- package/src/edit/index.ts +64 -0
- package/src/eval/js/shared/runtime.ts +1 -1
- package/src/eval/py/env.ts +26 -0
- package/src/eval/py/index.ts +2 -2
- package/src/eval/py/kernel.ts +5 -3
- package/src/export/html/template.generated.ts +1 -1
- package/src/export/html/template.js +52 -18
- package/src/extensibility/custom-tools/types.ts +1 -1
- package/src/extensibility/extensions/compact-handler.ts +3 -3
- package/src/extensibility/extensions/get-commands-handler.ts +2 -2
- package/src/extensibility/extensions/loader.ts +77 -5
- package/src/extensibility/extensions/runner.ts +124 -7
- package/src/extensibility/extensions/types.ts +215 -18
- package/src/extensibility/hooks/runner.ts +2 -2
- package/src/extensibility/hooks/types.ts +1 -1
- package/src/extensibility/plugins/marketplace/manager.ts +94 -10
- package/src/extensibility/runtime-skill-discovery.ts +33 -13
- package/src/extensibility/shared-events.ts +2 -0
- package/src/extensibility/skc-plugins/installer.ts +16 -16
- package/src/extensibility/slash-commands.ts +3 -3
- package/src/goals/continuation-timeout-guard.ts +79 -0
- package/src/goals/runtime.ts +7 -5
- package/src/goals/state.ts +18 -0
- package/src/harness-control-plane/lifecycle-reconciliation.ts +64 -0
- package/src/harness-control-plane/operate.ts +9 -9
- package/src/harness-control-plane/owner.ts +341 -41
- package/src/harness-control-plane/phase-rollup.ts +4 -7
- package/src/harness-control-plane/receipt-ingest.ts +5 -0
- package/src/harness-control-plane/receipt-spool.ts +51 -7
- package/src/harness-control-plane/receipts.ts +0 -1
- package/src/harness-control-plane/sdk-transport.ts +395 -0
- package/src/harness-control-plane/session-lease.ts +12 -130
- package/src/harness-control-plane/session-transport.ts +94 -0
- package/src/harness-control-plane/types.ts +1 -1
- package/src/hindsight/backend.ts +26 -27
- package/src/hindsight/client.ts +65 -2
- package/src/hindsight/state.ts +101 -32
- package/src/hooks/skill-state.ts +17 -11
- package/src/i18n/messages/en.ts +1 -0
- package/src/internal-urls/agent-protocol.ts +76 -5
- package/src/internal-urls/docs-index.generated.ts +44 -37
- package/src/internal-urls/local-protocol.ts +420 -18
- package/src/lsp/client.ts +43 -7
- package/src/lsp/config.ts +145 -26
- package/src/lsp/index.ts +7 -91
- package/src/lsp/lspmux.ts +39 -10
- package/src/lsp/path-trust.ts +81 -0
- package/src/main.ts +451 -236
- package/src/memories/index.ts +1 -0
- package/src/memories/storage.ts +6 -2
- package/src/modes/DESIGN.md +258 -0
- package/src/modes/acp/acp-agent.ts +1236 -2612
- package/src/modes/acp/acp-client-bridge.ts +2 -20
- package/src/modes/acp/acp-event-mapper.ts +18 -2
- package/src/modes/acp/acp-mode.ts +8 -36
- package/src/modes/acp/permission-mode.ts +25 -0
- package/src/modes/acp/startup-options.ts +6 -0
- package/src/modes/action-registry.ts +165 -0
- package/src/modes/bridge/bridge-mode.ts +6 -4
- package/src/modes/components/agent-dashboard.ts +37 -17
- package/src/modes/components/ansi-display-validator.ts +54 -0
- package/src/modes/components/chrome.ts +40 -0
- package/src/modes/components/command-palette.ts +168 -0
- package/src/modes/components/custom-editor.ts +105 -33
- package/src/modes/components/custom-provider-wizard.ts +77 -15
- package/src/modes/components/index.ts +2 -1
- package/src/modes/components/model-selector.ts +93 -35
- package/src/modes/components/notifications-settings-editor.ts +1403 -0
- package/src/modes/components/pet-capability.ts +115 -0
- package/src/modes/components/pet-selector.ts +15 -23
- package/src/modes/components/plan-preview-overlay.ts +295 -0
- package/src/modes/components/queue-mode-selector.ts +10 -27
- package/src/modes/components/queue-pane.ts +79 -0
- package/src/modes/components/read-tool-group.ts +13 -0
- package/src/modes/components/sayknow-pet-widget.ts +169 -20
- package/src/modes/components/session-observer-overlay.ts +213 -775
- package/src/modes/components/sessions-dashboard.ts +181 -0
- package/src/modes/components/settings-selector.ts +89 -12
- package/src/modes/components/show-images-selector.ts +10 -24
- package/src/modes/components/status-line/types.ts +1 -1
- package/src/modes/components/status-line.ts +1 -969
- package/src/modes/components/tasks-pane.ts +73 -0
- package/src/modes/components/theme-selector.ts +11 -31
- package/src/modes/components/tool-execution.ts +22 -0
- package/src/modes/components/tool-status-header.ts +1056 -0
- package/src/modes/components/tool-transcript-format.ts +393 -0
- package/src/modes/components/transcript-viewer-overlay.ts +446 -0
- package/src/modes/components/welcome.ts +4 -4
- package/src/modes/controllers/btw-controller.ts +1 -0
- package/src/modes/controllers/command-controller.ts +25 -17
- package/src/modes/controllers/event-controller.ts +14 -18
- package/src/modes/controllers/extension-ui-controller.ts +441 -37
- package/src/modes/controllers/goal-mode-controller.ts +493 -0
- package/src/modes/controllers/input-controller.ts +889 -263
- package/src/modes/controllers/mode-gate.ts +24 -0
- package/src/modes/controllers/plan-mode-controller.ts +519 -0
- package/src/modes/controllers/runtime-mcp-command-controller.ts +3 -0
- package/src/modes/controllers/selector-controller.ts +957 -54
- package/src/modes/controllers/stt-controller.ts +125 -0
- package/src/modes/index.ts +0 -22
- package/src/modes/interactive-mode.ts +376 -1130
- package/src/modes/jobs-observer.ts +3 -0
- package/src/modes/prompt-action-autocomplete.ts +7 -0
- package/src/modes/rpc/rpc-mode.ts +3 -1
- package/src/modes/runtime-init.ts +320 -6
- package/src/modes/shared/agent-wire/approval-gate.ts +9 -11
- package/src/modes/shared/agent-wire/command-dispatch.ts +3 -1
- package/src/modes/shared/agent-wire/deep-interview-gate.ts +65 -111
- package/src/modes/shared/agent-wire/event-contract.ts +7 -8
- package/src/modes/shared/agent-wire/event-envelope.ts +9 -17
- package/src/modes/shared/agent-wire/event-observation.ts +16 -7
- package/src/modes/shared/agent-wire/workflow-gate-broker.ts +1331 -89
- package/src/modes/shared/agent-wire/workflow-gate-schema.ts +19 -17
- package/src/modes/shared/agent-wire/workflow-gate-types.ts +407 -0
- package/src/modes/tasks-aggregator.ts +199 -0
- package/src/modes/transcript-item-registry.ts +229 -0
- package/src/modes/types.ts +63 -21
- package/src/modes/utils/ui-helpers.ts +17 -9
- package/src/notifications/index.ts +8 -2
- package/src/plan-mode/approved-plan.ts +3 -1
- package/src/prompts/agent-fragments/ralplan-persistence.md +6 -0
- package/src/prompts/agent-fragments/restricted-bash.md +1 -0
- package/src/prompts/agents/architect.md +3 -8
- package/src/prompts/agents/critic.md +3 -8
- package/src/prompts/agents/executor.md +3 -0
- package/src/prompts/agents/planner.md +4 -12
- package/src/prompts/system/custom-system-prompt.md +2 -24
- package/src/prompts/system/plan-mode-approved.md +8 -0
- package/src/prompts/system/system-prompt.md +18 -94
- package/src/prompts/tools/bash.md +4 -4
- package/src/prompts/tools/browser.md +15 -52
- package/src/prompts/tools/find.md +2 -2
- package/src/prompts/tools/hashline.md +13 -55
- package/src/prompts/tools/lsp.md +3 -3
- package/src/prompts/tools/read.md +3 -6
- package/src/prompts/tools/search-tool-bm25.md +0 -2
- package/src/prompts/tools/search.md +2 -4
- package/src/prompts/tools/skill-discovery.md +1 -2
- package/src/prompts/tools/task.md +1 -1
- package/src/runtime-mcp/client.ts +94 -19
- package/src/runtime-mcp/config.ts +27 -15
- package/src/runtime-mcp/discoverable-tool-metadata.ts +16 -13
- package/src/runtime-mcp/manager.ts +359 -106
- package/src/runtime-mcp/oauth-discovery.ts +116 -26
- package/src/runtime-mcp/oauth-flow.ts +42 -12
- package/src/runtime-mcp/transports/http.ts +49 -19
- package/src/runtime-mcp/transports/stdio.ts +47 -28
- package/src/runtime-mcp/types.ts +10 -0
- package/src/sdk/acp/adapter.ts +418 -0
- package/src/sdk/acp/index.ts +2 -0
- package/src/sdk/broker/broker.ts +877 -0
- package/src/sdk/broker/discovery.ts +238 -0
- package/src/sdk/broker/ensure.ts +393 -0
- package/src/sdk/broker/identity.ts +42 -0
- package/src/sdk/broker/index.ts +8 -0
- package/src/sdk/broker/internal-source-marker-2178.txt +1 -0
- package/src/sdk/broker/internal-source.bunfig.toml +1 -0
- package/src/sdk/broker/internal.ts +10 -0
- package/src/sdk/broker/lifecycle-codec.ts +11 -0
- package/src/sdk/broker/lifecycle-ledger.ts +583 -0
- package/src/sdk/broker/lifecycle.ts +3413 -0
- package/src/sdk/broker/process-incarnation.ts +151 -0
- package/src/sdk/broker/runtime.ts +164 -0
- package/src/sdk/broker/session-index.ts +678 -0
- package/src/sdk/broker/state-version.ts +47 -0
- package/src/sdk/broker/transport.ts +125 -0
- package/src/sdk/bus/attachment-registry.ts +23 -0
- package/src/sdk/bus/chat-adapters.ts +147 -0
- package/src/sdk/bus/chat-command-policy.ts +107 -0
- package/src/sdk/bus/chat-daemon-cli.ts +278 -0
- package/src/sdk/bus/chat-daemon-control.ts +1101 -0
- package/src/sdk/bus/chat-daemon-runtime.ts +527 -0
- package/src/sdk/bus/chat-effect-journal.ts +363 -0
- package/src/sdk/bus/config-commands.ts +192 -0
- package/src/sdk/bus/config.ts +568 -0
- package/src/sdk/bus/conversation-store.ts +367 -0
- package/src/sdk/bus/daemon-paths.ts +34 -0
- package/src/sdk/bus/discord-conversation.ts +85 -0
- package/src/sdk/bus/discord-daemon.ts +2292 -0
- package/src/sdk/bus/discord-live-provider.ts +521 -0
- package/src/sdk/bus/discord-provider.ts +56 -0
- package/src/sdk/bus/engine.ts +100 -0
- package/src/sdk/bus/helpers.ts +135 -0
- package/src/sdk/bus/html-format.ts +518 -0
- package/src/sdk/bus/index.ts +4961 -0
- package/src/sdk/bus/lifecycle-commands.ts +291 -0
- package/src/sdk/bus/lifecycle-control-runtime.ts +1409 -0
- package/src/sdk/bus/lifecycle-orchestrator.ts +458 -0
- package/src/sdk/bus/managed-daemon.ts +163 -0
- package/src/sdk/bus/native-runtime-compatibility.ts +42 -0
- package/src/sdk/bus/natives-augment.d.ts +63 -0
- package/src/sdk/bus/notification-orchestration.ts +535 -0
- package/src/sdk/bus/notification-service.ts +1174 -0
- package/src/sdk/bus/operator-runtime.ts +171 -0
- package/src/sdk/bus/rate-limit-pool.ts +276 -0
- package/src/sdk/bus/recent-activity.ts +279 -0
- package/src/sdk/bus/reply-sent-store.ts +134 -0
- package/src/sdk/bus/rich-document.ts +258 -0
- package/src/sdk/bus/rich-draft.ts +107 -0
- package/src/sdk/bus/rich-render.ts +135 -0
- package/src/sdk/bus/session-control.ts +439 -0
- package/src/sdk/bus/slack-conversation.ts +74 -0
- package/src/sdk/bus/slack-daemon.ts +2144 -0
- package/src/sdk/bus/slack-live-provider.ts +380 -0
- package/src/sdk/bus/slack-provider.ts +76 -0
- package/src/sdk/bus/telegram-cli.ts +194 -0
- package/src/sdk/bus/telegram-daemon-cli.ts +292 -0
- package/src/sdk/bus/telegram-daemon-contract.ts +27 -0
- package/src/sdk/bus/telegram-daemon-control.ts +642 -0
- package/src/sdk/bus/telegram-daemon.ts +6675 -0
- package/src/sdk/bus/telegram-reference.ts +436 -0
- package/src/sdk/bus/telegram-setup.ts +663 -0
- package/src/sdk/bus/threaded-inbound.ts +141 -0
- package/src/sdk/bus/threaded-render.ts +294 -0
- package/src/sdk/bus/topic-registry.ts +364 -0
- package/src/sdk/cli/index.ts +1 -0
- package/src/sdk/cli/session-cli.ts +275 -0
- package/src/sdk/client/client.ts +1 -0
- package/src/sdk/client/discovery.ts +108 -0
- package/src/sdk/client/index.ts +2 -0
- package/src/sdk/host/control/dispatch.ts +388 -0
- package/src/sdk/host/control/index.ts +10 -0
- package/src/sdk/host/control/operations.ts +68 -0
- package/src/sdk/host/events.ts +91 -0
- package/src/sdk/host/host.ts +338 -0
- package/src/sdk/host/index.ts +4 -0
- package/src/sdk/host/query/cursor.ts +189 -0
- package/src/sdk/host/query/handlers.ts +531 -0
- package/src/sdk/host/query/index.ts +3 -0
- package/src/sdk/host/query/revision-store.ts +1149 -0
- package/src/sdk/host/reverse-leases.ts +325 -0
- package/src/sdk/host/types.ts +29 -0
- package/src/sdk/index.ts +14 -0
- package/src/sdk/lifecycle-session.ts +39 -0
- package/src/sdk/mcp/index.ts +1 -0
- package/src/sdk/mcp/server.ts +332 -0
- package/src/sdk/models.ts +168 -0
- package/src/sdk/protocol/adapter-validation.ts +48 -0
- package/src/sdk/protocol/operation-inventory.generated.json +4719 -0
- package/src/sdk/protocol/operation-registry.ts +312 -0
- package/src/sdk/session-directory.ts +141 -0
- package/src/sdk/session.ts +2869 -0
- package/src/sdk/startup-capability.ts +189 -0
- package/src/secrets/index.ts +53 -10
- package/src/secrets/obfuscator.ts +21 -18
- package/src/secrets/regex.ts +2 -0
- package/src/session/agent-session.ts +5602 -2138
- package/src/session/agent-storage.ts +18 -0
- package/src/session/artifacts.ts +188 -23
- package/src/session/cache-economics.ts +25 -8
- package/src/session/context-estimation.ts +7 -2
- package/src/session/default-model-selection.ts +93 -0
- package/src/session/fallback-chain-controller.ts +186 -0
- package/src/session/internal/managed-session-scope.ts +2402 -0
- package/src/session/internal/managed-session-storage.ts +1559 -0
- package/src/session/messages.ts +91 -2
- package/src/session/session-manager-internal.ts +33 -0
- package/src/session/session-manager.ts +2578 -392
- package/src/session/session-storage.ts +550 -40
- package/src/session/streaming-output.ts +6 -0
- package/src/session/volatile-context-pruning.ts +78 -0
- package/src/session/yield-queue.ts +20 -0
- package/src/setup/credential-auto-import.ts +291 -35
- package/src/setup/hermes/templates/operator-instructions.v1.md +4 -6
- package/src/setup/provider-onboarding.ts +36 -61
- package/src/setup/provider-presets.json +5 -0
- package/src/skc-runtime/deep-interview-recorder.ts +70 -3
- package/src/skc-runtime/deep-interview-state.ts +441 -5
- package/src/skc-runtime/gc-render.ts +19 -1
- package/src/skc-runtime/gc-runtime.ts +68 -3
- package/src/skc-runtime/goal-mode-request.ts +55 -8
- package/src/skc-runtime/launch-worktree.ts +5 -5
- package/src/skc-runtime/linux-proc.ts +71 -0
- package/src/skc-runtime/managed-owner-admission.ts +352 -0
- package/src/skc-runtime/managed-owner-supervisor.ts +162 -0
- package/src/skc-runtime/psmux-detect.ts +82 -4
- package/src/skc-runtime/ralplan-runtime.ts +74 -90
- package/src/skc-runtime/session-resolution.ts +18 -3
- package/src/skc-runtime/session-state-sidecar.ts +47 -138
- package/src/skc-runtime/state-argv.ts +292 -0
- package/src/skc-runtime/state-migrations.ts +1 -1
- package/src/skc-runtime/state-runtime.ts +387 -451
- package/src/skc-runtime/state-writer.ts +36 -40
- package/src/skc-runtime/team-launch.ts +319 -0
- package/src/skc-runtime/team-notify.ts +326 -0
- package/src/skc-runtime/team-runtime.ts +8 -2
- package/src/skc-runtime/team-store.ts +828 -0
- package/src/skc-runtime/team-workers.ts +962 -0
- package/src/skc-runtime/tmux-owner-isolation-cli.ts +55 -28
- package/src/skc-runtime/tmux-owner-isolation.ts +136 -11
- package/src/skc-runtime/tmux-sessions.ts +23 -34
- package/src/skc-runtime/ultragoal-change-set.ts +172 -0
- package/src/skc-runtime/ultragoal-evidence.ts +874 -0
- package/src/skc-runtime/ultragoal-guard.ts +136 -18
- package/src/skc-runtime/ultragoal-owner-loss-recovery.ts +328 -0
- package/src/skc-runtime/ultragoal-pipeline.ts +306 -0
- package/src/skc-runtime/ultragoal-receipt-freshness.ts +102 -1
- package/src/skc-runtime/ultragoal-runtime.ts +325 -1322
- package/src/skc-runtime/windows-powershell-command.ts +58 -0
- package/src/skc-runtime/workflow-cli-common.ts +30 -0
- package/src/skc-runtime/workflow-manifest.generated.json +58 -0
- package/src/skc-runtime/workflow-manifest.ts +18 -0
- package/src/skill-state/active-state.ts +3 -13
- package/src/skill-state/workflow-mutation-guard.ts +661 -0
- package/src/skill-state/workflow-state-contract.ts +6 -41
- package/src/slash-commands/builtin-registry.ts +115 -41
- package/src/system-prompt.ts +37 -44
- package/src/task/agents.ts +19 -1
- package/src/task/executor.ts +223 -45
- package/src/task/index.ts +124 -56
- package/src/thinking.ts +21 -6
- package/src/tool-discovery/tool-index.ts +20 -134
- package/src/tools/ask-answer-registry.ts +16 -2
- package/src/tools/ast-edit.ts +1 -1
- package/src/tools/bash-allowed-prefixes.ts +79 -29
- package/src/tools/bash-skill-urls.ts +14 -3
- package/src/tools/bash.ts +40 -2
- package/src/tools/browser/STEALTH-THIRD-PARTY-NOTICES.md +26 -0
- package/src/tools/browser/benchmark/detector-report.ts +157 -0
- package/src/tools/browser/benchmark/run-suite.ts +39 -0
- package/src/tools/browser/dead-tab-recovery.ts +78 -0
- package/src/tools/browser/launch.ts +127 -20
- package/src/tools/browser/profile-discovery.ts +63 -0
- package/src/tools/browser/profile-posture.ts +59 -0
- package/src/tools/browser/profile-reuse.ts +102 -0
- package/src/tools/browser/profile-warmup.ts +109 -0
- package/src/tools/browser/readable.ts +1 -1
- package/src/tools/browser/registry.ts +87 -11
- package/src/tools/browser/screenshot-format.ts +34 -0
- package/src/tools/browser/tab-protocol.ts +4 -0
- package/src/tools/browser/tab-supervisor.ts +392 -142
- package/src/tools/browser/tab-worker-entry.ts +33 -14
- package/src/tools/browser/tab-worker-path-resolver.ts +67 -0
- package/src/tools/browser/tab-worker-smoke.ts +87 -0
- package/src/tools/browser/tab-worker.ts +8 -6
- package/src/tools/browser.ts +6 -0
- package/src/tools/computer.ts +10 -3
- package/src/tools/cron.ts +30 -16
- package/src/tools/fetch.ts +11 -4
- package/src/tools/index.ts +88 -32
- package/src/tools/output-meta.ts +19 -7
- package/src/tools/path-utils.ts +42 -35
- package/src/tools/plan-mode-guard.ts +1 -0
- package/src/tools/puppeteer/14_stealth_permissions.txt +57 -0
- package/src/tools/puppeteer/15_stealth_webrtc.txt +60 -0
- package/src/tools/read.ts +226 -65
- package/src/tools/resource-gc.ts +125 -36
- package/src/tools/search-tool-bm25.ts +11 -74
- package/src/tools/sqlite-reader.ts +3 -2
- package/src/tools/subagent-render.ts +19 -8
- package/src/tools/subagent.ts +129 -34
- package/src/tools/telegram-send.ts +2 -2
- package/src/utils/event-bus.ts +9 -4
- package/src/utils/file-mentions.ts +4 -4
- package/src/utils/image-loading.ts +85 -34
- package/src/utils/image-resize.ts +16 -9
- package/src/utils/pasted-image-loading.ts +514 -0
- package/src/utils/pasted-image-path.ts +223 -98
- package/src/web/scrapers/html-to-markdown.ts +68 -0
- package/src/web/scrapers/readthedocs.ts +1 -1
- package/src/web/scrapers/types.ts +1 -68
- package/src/web/search/index.ts +3 -3
- package/src/web/search/providers/openai-compatible.ts +76 -23
- package/dist/types/append-only-mode.d.ts +0 -31
- package/dist/types/async/index.d.ts +0 -2
- package/dist/types/async/job-manager.d.ts +0 -328
- package/dist/types/async/support.d.ts +0 -2
- package/dist/types/autoresearch/dashboard.d.ts +0 -4
- package/dist/types/autoresearch/git.d.ts +0 -36
- package/dist/types/autoresearch/helpers.d.ts +0 -24
- package/dist/types/autoresearch/index.d.ts +0 -2
- package/dist/types/autoresearch/state.d.ts +0 -17
- package/dist/types/autoresearch/storage.d.ts +0 -142
- package/dist/types/autoresearch/tools/init-experiment.d.ts +0 -31
- package/dist/types/autoresearch/tools/log-experiment.d.ts +0 -23
- package/dist/types/autoresearch/tools/run-experiment.d.ts +0 -8
- package/dist/types/autoresearch/tools/update-notes.d.ts +0 -12
- package/dist/types/autoresearch/types.d.ts +0 -154
- package/dist/types/build-metadata.d.ts +0 -7
- package/dist/types/capability/context-file.d.ts +0 -17
- package/dist/types/capability/extension-module.d.ts +0 -15
- package/dist/types/capability/extension.d.ts +0 -28
- package/dist/types/capability/fs.d.ts +0 -20
- package/dist/types/capability/hook.d.ts +0 -19
- package/dist/types/capability/index.d.ts +0 -80
- package/dist/types/capability/instruction.d.ts +0 -17
- package/dist/types/capability/mcp.d.ts +0 -49
- package/dist/types/capability/prompt.d.ts +0 -15
- package/dist/types/capability/rule.d.ts +0 -69
- package/dist/types/capability/settings.d.ts +0 -15
- package/dist/types/capability/skill.d.ts +0 -36
- package/dist/types/capability/slash-command.d.ts +0 -17
- package/dist/types/capability/ssh.d.ts +0 -23
- package/dist/types/capability/system-prompt.d.ts +0 -15
- package/dist/types/capability/tool.d.ts +0 -19
- package/dist/types/capability/types.d.ts +0 -154
- package/dist/types/cli/agents-cli.d.ts +0 -12
- package/dist/types/cli/args.d.ts +0 -57
- package/dist/types/cli/auth-broker-cli.d.ts +0 -25
- package/dist/types/cli/auth-gateway-cli.d.ts +0 -18
- package/dist/types/cli/classify-install-target.d.ts +0 -8
- package/dist/types/cli/commands/init-xdg.d.ts +0 -1
- package/dist/types/cli/completion-cli.d.ts +0 -41
- package/dist/types/cli/config-cli.d.ts +0 -23
- package/dist/types/cli/daemon-cli.d.ts +0 -27
- package/dist/types/cli/fast-help.d.ts +0 -1
- package/dist/types/cli/file-processor.d.ts +0 -11
- package/dist/types/cli/fixture-report.d.ts +0 -20
- package/dist/types/cli/fixture-report.test.d.ts +0 -1
- package/dist/types/cli/grep-cli.d.ts +0 -17
- package/dist/types/cli/initial-message.d.ts +0 -17
- package/dist/types/cli/list-models.d.ts +0 -36
- package/dist/types/cli/local-provider-smoke.d.ts +0 -59
- package/dist/types/cli/malloc-env-guard.d.ts +0 -65
- package/dist/types/cli/malloc-env-guard.test.d.ts +0 -1
- package/dist/types/cli/mcp-cli.d.ts +0 -25
- package/dist/types/cli/migrate-cli.d.ts +0 -20
- package/dist/types/cli/nofile-limit.d.ts +0 -11
- package/dist/types/cli/notify-cli.d.ts +0 -39
- package/dist/types/cli/plugin-cli.d.ts +0 -34
- package/dist/types/cli/read-cli.d.ts +0 -4
- package/dist/types/cli/session-picker.d.ts +0 -4
- package/dist/types/cli/setup-cli.d.ts +0 -73
- package/dist/types/cli/shell-cli.d.ts +0 -8
- package/dist/types/cli/skills-cli.d.ts +0 -9
- package/dist/types/cli/ssh-cli.d.ts +0 -21
- package/dist/types/cli/stats-cli.d.ts +0 -17
- package/dist/types/cli/telegram-cli.d.ts +0 -13
- package/dist/types/cli/update-cli.d.ts +0 -108
- package/dist/types/cli/web-search-cli.d.ts +0 -32
- package/dist/types/cli/worktree-cli.d.ts +0 -26
- package/dist/types/cli.d.ts +0 -140
- package/dist/types/commands/acp.d.ts +0 -12
- package/dist/types/commands/agents.d.ts +0 -34
- package/dist/types/commands/auth-broker.d.ts +0 -54
- package/dist/types/commands/auth-gateway.d.ts +0 -32
- package/dist/types/commands/codex-native-hook.d.ts +0 -6
- package/dist/types/commands/commit.d.ts +0 -27
- package/dist/types/commands/completion.d.ts +0 -29
- package/dist/types/commands/config.d.ts +0 -33
- package/dist/types/commands/contribution-prep.d.ts +0 -18
- package/dist/types/commands/coordinator.d.ts +0 -19
- package/dist/types/commands/daemon.d.ts +0 -45
- package/dist/types/commands/deep-interview.d.ts +0 -54
- package/dist/types/commands/gc.d.ts +0 -26
- package/dist/types/commands/grep.d.ts +0 -42
- package/dist/types/commands/harness.d.ts +0 -43
- package/dist/types/commands/launch.d.ts +0 -131
- package/dist/types/commands/local-provider.d.ts +0 -34
- package/dist/types/commands/mcp-serve.d.ts +0 -24
- package/dist/types/commands/mcp.d.ts +0 -70
- package/dist/types/commands/migrate.d.ts +0 -33
- package/dist/types/commands/notify.d.ts +0 -47
- package/dist/types/commands/plugin.d.ts +0 -58
- package/dist/types/commands/ralplan.d.ts +0 -7
- package/dist/types/commands/read.d.ts +0 -15
- package/dist/types/commands/rlm.d.ts +0 -10
- package/dist/types/commands/session.d.ts +0 -30
- package/dist/types/commands/setup.d.ts +0 -105
- package/dist/types/commands/shell.d.ts +0 -21
- package/dist/types/commands/skills.d.ts +0 -26
- package/dist/types/commands/ssh.d.ts +0 -48
- package/dist/types/commands/state.d.ts +0 -7
- package/dist/types/commands/stats.d.ts +0 -25
- package/dist/types/commands/team.d.ts +0 -24
- package/dist/types/commands/telegram.d.ts +0 -22
- package/dist/types/commands/ultragoal.d.ts +0 -8
- package/dist/types/commands/update.d.ts +0 -20
- package/dist/types/commands/web-search.d.ts +0 -87
- package/dist/types/commands/worktree.d.ts +0 -34
- package/dist/types/commit/agentic/agent.d.ts +0 -31
- package/dist/types/commit/agentic/fallback.d.ts +0 -5
- package/dist/types/commit/agentic/index.d.ts +0 -2
- package/dist/types/commit/agentic/state.d.ts +0 -58
- package/dist/types/commit/agentic/tools/analyze-file.d.ts +0 -19
- package/dist/types/commit/agentic/tools/git-file-diff.d.ts +0 -10
- package/dist/types/commit/agentic/tools/git-hunk.d.ts +0 -9
- package/dist/types/commit/agentic/tools/git-overview.d.ts +0 -9
- package/dist/types/commit/agentic/tools/index.d.ts +0 -16
- package/dist/types/commit/agentic/tools/propose-changelog.d.ts +0 -28
- package/dist/types/commit/agentic/tools/propose-commit.d.ts +0 -36
- package/dist/types/commit/agentic/tools/recent-commits.d.ts +0 -7
- package/dist/types/commit/agentic/tools/schemas.d.ts +0 -27
- package/dist/types/commit/agentic/tools/split-commit.d.ts +0 -53
- package/dist/types/commit/agentic/topo-sort.d.ts +0 -4
- package/dist/types/commit/agentic/trivial.d.ts +0 -7
- package/dist/types/commit/agentic/validation.d.ts +0 -20
- package/dist/types/commit/analysis/conventional.d.ts +0 -22
- package/dist/types/commit/analysis/index.d.ts +0 -4
- package/dist/types/commit/analysis/scope.d.ts +0 -6
- package/dist/types/commit/analysis/summary.d.ts +0 -19
- package/dist/types/commit/analysis/validation.d.ts +0 -8
- package/dist/types/commit/changelog/detect.d.ts +0 -2
- package/dist/types/commit/changelog/generate.d.ts +0 -30
- package/dist/types/commit/changelog/index.d.ts +0 -30
- package/dist/types/commit/changelog/parse.d.ts +0 -2
- package/dist/types/commit/cli.d.ts +0 -3
- package/dist/types/commit/git/diff.d.ts +0 -5
- package/dist/types/commit/index.d.ts +0 -4
- package/dist/types/commit/map-reduce/index.d.ts +0 -28
- package/dist/types/commit/map-reduce/map-phase.d.ts +0 -17
- package/dist/types/commit/map-reduce/reduce-phase.d.ts +0 -13
- package/dist/types/commit/map-reduce/utils.d.ts +0 -2
- package/dist/types/commit/message.d.ts +0 -2
- package/dist/types/commit/model-selection.d.ts +0 -15
- package/dist/types/commit/pipeline.d.ts +0 -5
- package/dist/types/commit/shared-llm.d.ts +0 -54
- package/dist/types/commit/types.d.ts +0 -78
- package/dist/types/commit/utils/exclusions.d.ts +0 -4
- package/dist/types/commit/utils.d.ts +0 -20
- package/dist/types/config/config-file.d.ts +0 -58
- package/dist/types/config/file-lock-gc.d.ts +0 -5
- package/dist/types/config/file-lock.d.ts +0 -36
- package/dist/types/config/keybindings.d.ts +0 -364
- package/dist/types/config/model-equivalence.d.ts +0 -24
- package/dist/types/config/model-profile-activation.d.ts +0 -65
- package/dist/types/config/model-profiles.d.ts +0 -39
- package/dist/types/config/model-registry.d.ts +0 -473
- package/dist/types/config/model-resolver.d.ts +0 -217
- package/dist/types/config/models-config-schema.d.ts +0 -700
- package/dist/types/config/prompt-templates.d.ts +0 -32
- package/dist/types/config/resolve-config-value.d.ts +0 -17
- package/dist/types/config/settings-schema.d.ts +0 -4223
- package/dist/types/config/settings.d.ts +0 -158
- package/dist/types/config/skill-settings-defaults.d.ts +0 -14
- package/dist/types/config/telegram-autostart.d.ts +0 -14
- package/dist/types/config/telegram-env-bridge.d.ts +0 -18
- package/dist/types/config.d.ts +0 -66
- package/dist/types/coordinator/contract.d.ts +0 -4
- package/dist/types/coordinator-mcp/model-preset.d.ts +0 -45
- package/dist/types/coordinator-mcp/policy.d.ts +0 -27
- package/dist/types/coordinator-mcp/safety.d.ts +0 -26
- package/dist/types/coordinator-mcp/server.d.ts +0 -139
- package/dist/types/coordinator-mcp/session-reaper.d.ts +0 -53
- package/dist/types/cursor.d.ts +0 -24
- package/dist/types/daemon/builtin.d.ts +0 -20
- package/dist/types/daemon/control-types.d.ts +0 -67
- package/dist/types/daemon/operator-contract.d.ts +0 -47
- package/dist/types/daemon/runtime.d.ts +0 -25
- package/dist/types/dap/client.d.ts +0 -39
- package/dist/types/dap/config.d.ts +0 -6
- package/dist/types/dap/index.d.ts +0 -4
- package/dist/types/dap/session.d.ts +0 -108
- package/dist/types/dap/types.d.ts +0 -524
- package/dist/types/debug/crash-diagnostics.d.ts +0 -45
- package/dist/types/debug/index.d.ts +0 -15
- package/dist/types/debug/log-formatting.d.ts +0 -4
- package/dist/types/debug/log-viewer.d.ts +0 -68
- package/dist/types/debug/profiler.d.ts +0 -24
- package/dist/types/debug/raw-sse-buffer.d.ts +0 -44
- package/dist/types/debug/raw-sse.d.ts +0 -16
- package/dist/types/debug/report-bundle.d.ts +0 -55
- package/dist/types/debug/runtime-gauges.d.ts +0 -6
- package/dist/types/debug/system-info.d.ts +0 -26
- package/dist/types/deep-interview/plaintext-gate-guard.d.ts +0 -11
- package/dist/types/deep-interview/render-middleware.d.ts +0 -6
- package/dist/types/defaults/skc/extensions/grok-build/index.d.ts +0 -1
- package/dist/types/defaults/skc/extensions/grok-cli-vendor/src/index.d.ts +0 -1
- package/dist/types/defaults/skc/extensions/grok-cli-vendor/src/models/catalog.d.ts +0 -29
- package/dist/types/defaults/skc/extensions/grok-cli-vendor/src/payload/sanitize.d.ts +0 -27
- package/dist/types/defaults/skc/extensions/grok-cli-vendor/src/provider/billing.d.ts +0 -8
- package/dist/types/defaults/skc/extensions/grok-cli-vendor/src/provider/register.d.ts +0 -5
- package/dist/types/defaults/skc/extensions/grok-cli-vendor/src/provider/stream.d.ts +0 -10
- package/dist/types/defaults/skc/extensions/grok-cli-vendor/src/provider/usage.d.ts +0 -2
- package/dist/types/defaults/skc/extensions/grok-cli-vendor/src/shared/base-url.d.ts +0 -2
- package/dist/types/defaults/skc/extensions/grok-cli-vendor/src/shared/errors.d.ts +0 -38
- package/dist/types/defaults/skc-defaults.d.ts +0 -64
- package/dist/types/defaults/skc-grok-cli.d.ts +0 -5
- package/dist/types/discovery/agents-md.d.ts +0 -1
- package/dist/types/discovery/agents.d.ts +0 -12
- package/dist/types/discovery/builtin.d.ts +0 -1
- package/dist/types/discovery/claude-plugins.d.ts +0 -1
- package/dist/types/discovery/claude.d.ts +0 -1
- package/dist/types/discovery/cline.d.ts +0 -1
- package/dist/types/discovery/codex.d.ts +0 -1
- package/dist/types/discovery/cursor.d.ts +0 -19
- package/dist/types/discovery/gemini.d.ts +0 -1
- package/dist/types/discovery/github.d.ts +0 -1
- package/dist/types/discovery/helpers.d.ts +0 -271
- package/dist/types/discovery/index.d.ts +0 -48
- package/dist/types/discovery/mcp-json.d.ts +0 -1
- package/dist/types/discovery/opencode.d.ts +0 -1
- package/dist/types/discovery/plugin-dir-roots.d.ts +0 -15
- package/dist/types/discovery/ssh.d.ts +0 -1
- package/dist/types/discovery/substitute-plugin-root.d.ts +0 -1
- package/dist/types/discovery/vscode.d.ts +0 -1
- package/dist/types/discovery/windsurf.d.ts +0 -15
- package/dist/types/edit/apply-patch/index.d.ts +0 -35
- package/dist/types/edit/apply-patch/parser.d.ts +0 -34
- package/dist/types/edit/diff.d.ts +0 -75
- package/dist/types/edit/file-read-cache.d.ts +0 -25
- package/dist/types/edit/index.d.ts +0 -58
- package/dist/types/edit/modes/apply-patch.d.ts +0 -24
- package/dist/types/edit/modes/patch.d.ts +0 -99
- package/dist/types/edit/modes/replace.d.ts +0 -149
- package/dist/types/edit/normalize.d.ts +0 -43
- package/dist/types/edit/notebook.d.ts +0 -26
- package/dist/types/edit/read-file.d.ts +0 -8
- package/dist/types/edit/renderer.d.ts +0 -110
- package/dist/types/edit/streaming.d.ts +0 -66
- package/dist/types/eval/backend.d.ts +0 -40
- package/dist/types/eval/index.d.ts +0 -4
- package/dist/types/eval/js/context-manager.d.ts +0 -27
- package/dist/types/eval/js/executor.d.ts +0 -29
- package/dist/types/eval/js/index.d.ts +0 -10
- package/dist/types/eval/js/shared/helpers.d.ts +0 -38
- package/dist/types/eval/js/shared/indirect-eval.d.ts +0 -14
- package/dist/types/eval/js/shared/prelude.d.ts +0 -1
- package/dist/types/eval/js/shared/rewrite-imports.d.ts +0 -6
- package/dist/types/eval/js/shared/runtime.d.ts +0 -47
- package/dist/types/eval/js/shared/types.d.ts +0 -24
- package/dist/types/eval/js/tool-bridge.d.ts +0 -18
- package/dist/types/eval/js/worker-core.d.ts +0 -5
- package/dist/types/eval/js/worker-entry.d.ts +0 -1
- package/dist/types/eval/js/worker-protocol.d.ts +0 -77
- package/dist/types/eval/py/display.d.ts +0 -25
- package/dist/types/eval/py/executor.d.ts +0 -88
- package/dist/types/eval/py/index.d.ts +0 -10
- package/dist/types/eval/py/kernel.d.ts +0 -65
- package/dist/types/eval/py/prelude.d.ts +0 -1
- package/dist/types/eval/py/runtime.d.ts +0 -29
- package/dist/types/eval/py/tool-bridge.d.ts +0 -20
- package/dist/types/eval/types.d.ts +0 -52
- package/dist/types/exa/factory.d.ts +0 -13
- package/dist/types/exa/index.d.ts +0 -20
- package/dist/types/exa/mcp-client.d.ts +0 -45
- package/dist/types/exa/render.d.ts +0 -19
- package/dist/types/exa/researcher.d.ts +0 -9
- package/dist/types/exa/search.d.ts +0 -9
- package/dist/types/exa/types.d.ts +0 -155
- package/dist/types/exa/websets.d.ts +0 -9
- package/dist/types/exec/bash-executor.d.ts +0 -64
- package/dist/types/exec/exec.d.ts +0 -25
- package/dist/types/exec/idle-timeout-watchdog.d.ts +0 -18
- package/dist/types/exec/non-interactive-env.d.ts +0 -1
- package/dist/types/export/custom-share.d.ts +0 -20
- package/dist/types/export/html/index.d.ts +0 -10
- package/dist/types/export/html/template.generated.d.ts +0 -1
- package/dist/types/export/html/template.macro.d.ts +0 -5
- package/dist/types/export/ttsr.d.ts +0 -55
- package/dist/types/extensibility/custom-commands/bundled/ci-green/index.d.ts +0 -9
- package/dist/types/extensibility/custom-commands/index.d.ts +0 -2
- package/dist/types/extensibility/custom-commands/loader.d.ts +0 -29
- package/dist/types/extensibility/custom-commands/types.d.ts +0 -106
- package/dist/types/extensibility/custom-tools/index.d.ts +0 -6
- package/dist/types/extensibility/custom-tools/loader.d.ts +0 -69
- package/dist/types/extensibility/custom-tools/types.d.ts +0 -229
- package/dist/types/extensibility/custom-tools/wrapper.d.ts +0 -24
- package/dist/types/extensibility/extensions/compact-handler.d.ts +0 -26
- package/dist/types/extensibility/extensions/get-commands-handler.d.ts +0 -29
- package/dist/types/extensibility/extensions/index.d.ts +0 -9
- package/dist/types/extensibility/extensions/loader.d.ts +0 -43
- package/dist/types/extensibility/extensions/prefix-command-bridge.d.ts +0 -35
- package/dist/types/extensibility/extensions/runner.d.ts +0 -135
- package/dist/types/extensibility/extensions/types.d.ts +0 -920
- package/dist/types/extensibility/extensions/wrapper.d.ts +0 -55
- package/dist/types/extensibility/hooks/index.d.ts +0 -5
- package/dist/types/extensibility/hooks/loader.d.ts +0 -89
- package/dist/types/extensibility/hooks/runner.d.ts +0 -126
- package/dist/types/extensibility/hooks/tool-wrapper.d.ts +0 -25
- package/dist/types/extensibility/hooks/types.d.ts +0 -431
- package/dist/types/extensibility/plugins/doctor.d.ts +0 -3
- package/dist/types/extensibility/plugins/git-url.d.ts +0 -34
- package/dist/types/extensibility/plugins/index.d.ts +0 -8
- package/dist/types/extensibility/plugins/installer.d.ts +0 -5
- package/dist/types/extensibility/plugins/legacy-pi-compat.d.ts +0 -2
- package/dist/types/extensibility/plugins/loader.d.ts +0 -31
- package/dist/types/extensibility/plugins/manager.d.ts +0 -65
- package/dist/types/extensibility/plugins/marketplace/cache.d.ts +0 -41
- package/dist/types/extensibility/plugins/marketplace/fetcher.d.ts +0 -48
- package/dist/types/extensibility/plugins/marketplace/index.d.ts +0 -6
- package/dist/types/extensibility/plugins/marketplace/manager.d.ts +0 -57
- package/dist/types/extensibility/plugins/marketplace/registry.d.ts +0 -34
- package/dist/types/extensibility/plugins/marketplace/source-resolver.d.ts +0 -28
- package/dist/types/extensibility/plugins/marketplace/types.d.ts +0 -130
- package/dist/types/extensibility/plugins/parser.d.ts +0 -52
- package/dist/types/extensibility/plugins/security-scanner.d.ts +0 -31
- package/dist/types/extensibility/plugins/types.d.ts +0 -149
- package/dist/types/extensibility/runtime-skill-discovery.d.ts +0 -20
- package/dist/types/extensibility/shared-events.d.ts +0 -281
- package/dist/types/extensibility/skc-plugins/activation.d.ts +0 -14
- package/dist/types/extensibility/skc-plugins/compiler.d.ts +0 -19
- package/dist/types/extensibility/skc-plugins/constrained-hooks.d.ts +0 -29
- package/dist/types/extensibility/skc-plugins/index.d.ts +0 -18
- package/dist/types/extensibility/skc-plugins/injection.d.ts +0 -40
- package/dist/types/extensibility/skc-plugins/installer.d.ts +0 -13
- package/dist/types/extensibility/skc-plugins/loader.d.ts +0 -3
- package/dist/types/extensibility/skc-plugins/mcp-policy.d.ts +0 -26
- package/dist/types/extensibility/skc-plugins/observability.d.ts +0 -27
- package/dist/types/extensibility/skc-plugins/paths.d.ts +0 -8
- package/dist/types/extensibility/skc-plugins/prompt-appendix.d.ts +0 -16
- package/dist/types/extensibility/skc-plugins/registry.d.ts +0 -32
- package/dist/types/extensibility/skc-plugins/runtime-adapters.d.ts +0 -64
- package/dist/types/extensibility/skc-plugins/schema.d.ts +0 -3
- package/dist/types/extensibility/skc-plugins/session-validation.d.ts +0 -42
- package/dist/types/extensibility/skc-plugins/state.d.ts +0 -9
- package/dist/types/extensibility/skc-plugins/tools.d.ts +0 -8
- package/dist/types/extensibility/skc-plugins/types.d.ts +0 -220
- package/dist/types/extensibility/skc-plugins/validation.d.ts +0 -11
- package/dist/types/extensibility/skills.d.ts +0 -82
- package/dist/types/extensibility/slash-commands.d.ts +0 -48
- package/dist/types/extensibility/tool-proxy.d.ts +0 -4
- package/dist/types/extensibility/typebox.d.ts +0 -155
- package/dist/types/extensibility/utils.d.ts +0 -12
- package/dist/types/goals/index.d.ts +0 -3
- package/dist/types/goals/runtime.d.ts +0 -63
- package/dist/types/goals/state.d.ts +0 -32
- package/dist/types/goals/tools/goal-tool.d.ts +0 -62
- package/dist/types/harness-control-plane/classifier.d.ts +0 -13
- package/dist/types/harness-control-plane/control-endpoint.d.ts +0 -31
- package/dist/types/harness-control-plane/finalize.d.ts +0 -60
- package/dist/types/harness-control-plane/gc-adapter.d.ts +0 -3
- package/dist/types/harness-control-plane/operate.d.ts +0 -35
- package/dist/types/harness-control-plane/owner.d.ts +0 -53
- package/dist/types/harness-control-plane/phase-rollup.d.ts +0 -23
- package/dist/types/harness-control-plane/preserve.d.ts +0 -19
- package/dist/types/harness-control-plane/receipt-ingest.d.ts +0 -19
- package/dist/types/harness-control-plane/receipt-spool.d.ts +0 -19
- package/dist/types/harness-control-plane/receipts.d.ts +0 -149
- package/dist/types/harness-control-plane/rpc-adapter.d.ts +0 -69
- package/dist/types/harness-control-plane/seams.d.ts +0 -21
- package/dist/types/harness-control-plane/session-lease.d.ts +0 -65
- package/dist/types/harness-control-plane/state-machine.d.ts +0 -24
- package/dist/types/harness-control-plane/storage.d.ts +0 -81
- package/dist/types/harness-control-plane/types.d.ts +0 -187
- package/dist/types/hashline/anchors.d.ts +0 -20
- package/dist/types/hashline/apply.d.ts +0 -14
- package/dist/types/hashline/constants.d.ts +0 -19
- package/dist/types/hashline/diff-preview.d.ts +0 -2
- package/dist/types/hashline/diff.d.ts +0 -17
- package/dist/types/hashline/execute.d.ts +0 -4
- package/dist/types/hashline/hash.d.ts +0 -123
- package/dist/types/hashline/index.d.ts +0 -13
- package/dist/types/hashline/input.d.ts +0 -11
- package/dist/types/hashline/parser.d.ts +0 -7
- package/dist/types/hashline/prefixes.d.ts +0 -7
- package/dist/types/hashline/recovery.d.ts +0 -27
- package/dist/types/hashline/stream.d.ts +0 -2
- package/dist/types/hashline/types.d.ts +0 -77
- package/dist/types/hindsight/backend.d.ts +0 -13
- package/dist/types/hindsight/bank.d.ts +0 -54
- package/dist/types/hindsight/client.d.ts +0 -224
- package/dist/types/hindsight/config.d.ts +0 -51
- package/dist/types/hindsight/content.d.ts +0 -70
- package/dist/types/hindsight/index.d.ts +0 -8
- package/dist/types/hindsight/mental-models.d.ts +0 -125
- package/dist/types/hindsight/state.d.ts +0 -99
- package/dist/types/hindsight/transcript.d.ts +0 -28
- package/dist/types/hooks/codex-native-hooks-config.d.ts +0 -29
- package/dist/types/hooks/native-skill-hook.d.ts +0 -28
- package/dist/types/hooks/skill-keywords.d.ts +0 -18
- package/dist/types/hooks/skill-state.d.ts +0 -93
- package/dist/types/i18n/index.d.ts +0 -38
- package/dist/types/i18n/messages/de.d.ts +0 -2
- package/dist/types/i18n/messages/de.messages.d.ts +0 -1
- package/dist/types/i18n/messages/de.settings.d.ts +0 -1
- package/dist/types/i18n/messages/en.d.ts +0 -81
- package/dist/types/i18n/messages/es.d.ts +0 -2
- package/dist/types/i18n/messages/es.messages.d.ts +0 -1
- package/dist/types/i18n/messages/es.settings.d.ts +0 -1
- package/dist/types/i18n/messages/fr.d.ts +0 -2
- package/dist/types/i18n/messages/fr.messages.d.ts +0 -1
- package/dist/types/i18n/messages/fr.settings.d.ts +0 -1
- package/dist/types/i18n/messages/ja.d.ts +0 -2
- package/dist/types/i18n/messages/ja.messages.d.ts +0 -1
- package/dist/types/i18n/messages/ja.settings.d.ts +0 -1
- package/dist/types/i18n/messages/ko.d.ts +0 -2
- package/dist/types/i18n/messages/ko.messages.d.ts +0 -1
- package/dist/types/i18n/messages/ko.settings.d.ts +0 -1
- package/dist/types/i18n/messages/zh.d.ts +0 -2
- package/dist/types/i18n/messages/zh.messages.d.ts +0 -1
- package/dist/types/i18n/messages/zh.settings.d.ts +0 -1
- package/dist/types/index.d.ts +0 -33
- package/dist/types/internal-urls/agent-protocol.d.ts +0 -12
- package/dist/types/internal-urls/artifact-protocol.d.ts +0 -6
- package/dist/types/internal-urls/docs-index.generated.d.ts +0 -2
- package/dist/types/internal-urls/index.d.ts +0 -20
- package/dist/types/internal-urls/issue-pr-protocol.d.ts +0 -17
- package/dist/types/internal-urls/json-query.d.ts +0 -30
- package/dist/types/internal-urls/local-protocol.d.ts +0 -43
- package/dist/types/internal-urls/mcp-protocol.d.ts +0 -12
- package/dist/types/internal-urls/memory-protocol.d.ts +0 -23
- package/dist/types/internal-urls/parse.d.ts +0 -19
- package/dist/types/internal-urls/registry-helpers.d.ts +0 -11
- package/dist/types/internal-urls/router.d.ts +0 -14
- package/dist/types/internal-urls/rule-protocol.d.ts +0 -6
- package/dist/types/internal-urls/skc-protocol.d.ts +0 -12
- package/dist/types/internal-urls/skill-protocol.d.ts +0 -13
- package/dist/types/internal-urls/types.d.ts +0 -109
- package/dist/types/lsp/client.d.ts +0 -66
- package/dist/types/lsp/clients/biome-client.d.ts +0 -16
- package/dist/types/lsp/clients/index.d.ts +0 -19
- package/dist/types/lsp/clients/lsp-linter-client.d.ts +0 -16
- package/dist/types/lsp/clients/swiftlint-client.d.ts +0 -20
- package/dist/types/lsp/config.d.ts +0 -65
- package/dist/types/lsp/edits.d.ts +0 -23
- package/dist/types/lsp/index.d.ts +0 -130
- package/dist/types/lsp/lspmux.d.ts +0 -58
- package/dist/types/lsp/render.d.ts +0 -32
- package/dist/types/lsp/startup-events.d.ts +0 -12
- package/dist/types/lsp/types.d.ts +0 -306
- package/dist/types/lsp/utils.d.ts +0 -108
- package/dist/types/main.d.ts +0 -139
- package/dist/types/memories/index.d.ts +0 -28
- package/dist/types/memories/storage.d.ts +0 -110
- package/dist/types/memory-backend/index.d.ts +0 -4
- package/dist/types/memory-backend/local-backend.d.ts +0 -9
- package/dist/types/memory-backend/off-backend.d.ts +0 -7
- package/dist/types/memory-backend/resolve.d.ts +0 -15
- package/dist/types/memory-backend/types.d.ts +0 -61
- package/dist/types/migrate/action-planner.d.ts +0 -11
- package/dist/types/migrate/adapters/claude-code.d.ts +0 -2
- package/dist/types/migrate/adapters/codex.d.ts +0 -5
- package/dist/types/migrate/adapters/index.d.ts +0 -45
- package/dist/types/migrate/adapters/opencode.d.ts +0 -2
- package/dist/types/migrate/executor.d.ts +0 -2
- package/dist/types/migrate/mcp-mapper.d.ts +0 -20
- package/dist/types/migrate/report.d.ts +0 -18
- package/dist/types/migrate/skill-normalizer.d.ts +0 -27
- package/dist/types/migrate/types.d.ts +0 -126
- package/dist/types/modes/acp/acp-agent.d.ts +0 -78
- package/dist/types/modes/acp/acp-client-bridge.d.ts +0 -9
- package/dist/types/modes/acp/acp-event-mapper.d.ts +0 -36
- package/dist/types/modes/acp/acp-mode.d.ts +0 -17
- package/dist/types/modes/acp/index.d.ts +0 -2
- package/dist/types/modes/acp/terminal-auth.d.ts +0 -6
- package/dist/types/modes/bridge/auth.d.ts +0 -12
- package/dist/types/modes/bridge/bridge-client-bridge.d.ts +0 -9
- package/dist/types/modes/bridge/bridge-mode.d.ts +0 -47
- package/dist/types/modes/bridge/bridge-ui-context.d.ts +0 -88
- package/dist/types/modes/bridge/event-stream.d.ts +0 -8
- package/dist/types/modes/components/agent-dashboard.d.ts +0 -21
- package/dist/types/modes/components/assistant-message.d.ts +0 -20
- package/dist/types/modes/components/bash-execution.d.ts +0 -29
- package/dist/types/modes/components/bordered-loader.d.ts +0 -11
- package/dist/types/modes/components/branch-summary-message.d.ts +0 -13
- package/dist/types/modes/components/btw-panel.d.ts +0 -16
- package/dist/types/modes/components/compaction-summary-message.d.ts +0 -13
- package/dist/types/modes/components/countdown-timer.d.ts +0 -14
- package/dist/types/modes/components/custom-editor.d.ts +0 -69
- package/dist/types/modes/components/custom-message.d.ts +0 -15
- package/dist/types/modes/components/custom-model-preset-wizard.d.ts +0 -12
- package/dist/types/modes/components/custom-provider-wizard.d.ts +0 -10
- package/dist/types/modes/components/diff.d.ts +0 -11
- package/dist/types/modes/components/dynamic-border.d.ts +0 -14
- package/dist/types/modes/components/eval-execution.d.ts +0 -23
- package/dist/types/modes/components/execution-shared.d.ts +0 -46
- package/dist/types/modes/components/extensions/extension-dashboard.d.ts +0 -26
- package/dist/types/modes/components/extensions/extension-list.d.ts +0 -39
- package/dist/types/modes/components/extensions/index.d.ts +0 -8
- package/dist/types/modes/components/extensions/inspector-panel.d.ts +0 -8
- package/dist/types/modes/components/extensions/state-manager.d.ts +0 -50
- package/dist/types/modes/components/extensions/types.d.ts +0 -151
- package/dist/types/modes/components/footer.d.ts +0 -30
- package/dist/types/modes/components/history-search.d.ts +0 -7
- package/dist/types/modes/components/hook-editor.d.ts +0 -18
- package/dist/types/modes/components/hook-input.d.ts +0 -15
- package/dist/types/modes/components/hook-message.d.ts +0 -15
- package/dist/types/modes/components/hook-selector.d.ts +0 -59
- package/dist/types/modes/components/index.d.ts +0 -35
- package/dist/types/modes/components/irc-sidebar.d.ts +0 -32
- package/dist/types/modes/components/jobs-overlay-model.d.ts +0 -31
- package/dist/types/modes/components/jobs-overlay.d.ts +0 -30
- package/dist/types/modes/components/keybinding-hints.d.ts +0 -40
- package/dist/types/modes/components/login-dialog.d.ts +0 -32
- package/dist/types/modes/components/message-frame.d.ts +0 -42
- package/dist/types/modes/components/model-selector.d.ts +0 -60
- package/dist/types/modes/components/oauth-selector.d.ts +0 -17
- package/dist/types/modes/components/pet-selector.d.ts +0 -11
- package/dist/types/modes/components/plugin-selector.d.ts +0 -26
- package/dist/types/modes/components/plugin-settings.d.ts +0 -66
- package/dist/types/modes/components/provider-onboarding-selector.d.ts +0 -7
- package/dist/types/modes/components/queue-mode-selector.d.ts +0 -9
- package/dist/types/modes/components/queued-message-selector.d.ts +0 -12
- package/dist/types/modes/components/read-tool-group.d.ts +0 -30
- package/dist/types/modes/components/runtime-mcp-add-wizard.d.ts +0 -26
- package/dist/types/modes/components/sayknow-pet-widget.d.ts +0 -59
- package/dist/types/modes/components/session-observer-overlay.d.ts +0 -11
- package/dist/types/modes/components/session-selector.d.ts +0 -43
- package/dist/types/modes/components/settings-defs.d.ts +0 -50
- package/dist/types/modes/components/settings-selector.d.ts +0 -64
- package/dist/types/modes/components/show-images-selector.d.ts +0 -9
- package/dist/types/modes/components/skill-hud/render.d.ts +0 -2
- package/dist/types/modes/components/skill-message.d.ts +0 -10
- package/dist/types/modes/components/status-line/context-thresholds.d.ts +0 -4
- package/dist/types/modes/components/status-line/git-utils.d.ts +0 -28
- package/dist/types/modes/components/status-line/index.d.ts +0 -4
- package/dist/types/modes/components/status-line/presets.d.ts +0 -3
- package/dist/types/modes/components/status-line/segments.d.ts +0 -5
- package/dist/types/modes/components/status-line/separators.d.ts +0 -3
- package/dist/types/modes/components/status-line/token-rate.d.ts +0 -10
- package/dist/types/modes/components/status-line/types.d.ts +0 -83
- package/dist/types/modes/components/status-line.d.ts +0 -94
- package/dist/types/modes/components/theme-selector.d.ts +0 -10
- package/dist/types/modes/components/thinking-selector.d.ts +0 -15
- package/dist/types/modes/components/todo-reminder.d.ts +0 -13
- package/dist/types/modes/components/tool-execution.d.ts +0 -55
- package/dist/types/modes/components/tree-selector.d.ts +0 -31
- package/dist/types/modes/components/ttsr-notification.d.ts +0 -13
- package/dist/types/modes/components/two-column-body.d.ts +0 -9
- package/dist/types/modes/components/user-message-selector.d.ts +0 -28
- package/dist/types/modes/components/user-message.d.ts +0 -8
- package/dist/types/modes/components/visual-truncate.d.ts +0 -19
- package/dist/types/modes/components/welcome.d.ts +0 -46
- package/dist/types/modes/controllers/btw-controller.d.ts +0 -10
- package/dist/types/modes/controllers/command-controller-shared.d.ts +0 -47
- package/dist/types/modes/controllers/command-controller.d.ts +0 -40
- package/dist/types/modes/controllers/event-controller.d.ts +0 -21
- package/dist/types/modes/controllers/extension-ui-controller.d.ts +0 -80
- package/dist/types/modes/controllers/input-controller.d.ts +0 -42
- package/dist/types/modes/controllers/runtime-mcp-command-controller.d.ts +0 -10
- package/dist/types/modes/controllers/selector-controller.d.ts +0 -68
- package/dist/types/modes/controllers/ssh-command-controller.d.ts +0 -10
- package/dist/types/modes/controllers/todo-command-controller.d.ts +0 -7
- package/dist/types/modes/emoji-autocomplete.d.ts +0 -16
- package/dist/types/modes/index.d.ts +0 -10
- package/dist/types/modes/interactive-mode.d.ts +0 -297
- package/dist/types/modes/irc-observation-ledger.d.ts +0 -22
- package/dist/types/modes/jobs-observer.d.ts +0 -57
- package/dist/types/modes/oauth-manual-input.d.ts +0 -8
- package/dist/types/modes/print-mode.d.ts +0 -44
- package/dist/types/modes/prompt-action-autocomplete.d.ts +0 -50
- package/dist/types/modes/rpc/host-tools.d.ts +0 -1
- package/dist/types/modes/rpc/host-uris.d.ts +0 -1
- package/dist/types/modes/rpc/rpc-client.d.ts +0 -299
- package/dist/types/modes/rpc/rpc-mode.d.ts +0 -86
- package/dist/types/modes/rpc/rpc-socket-security.d.ts +0 -10
- package/dist/types/modes/rpc/rpc-types.d.ts +0 -810
- package/dist/types/modes/runtime-init.d.ts +0 -21
- package/dist/types/modes/session-observer-registry.d.ts +0 -26
- package/dist/types/modes/shared/agent-wire/approval-gate.d.ts +0 -57
- package/dist/types/modes/shared/agent-wire/command-contract.d.ts +0 -18
- package/dist/types/modes/shared/agent-wire/command-dispatch.d.ts +0 -37
- package/dist/types/modes/shared/agent-wire/command-validation.d.ts +0 -2
- package/dist/types/modes/shared/agent-wire/deep-interview-gate.d.ts +0 -102
- package/dist/types/modes/shared/agent-wire/event-contract.d.ts +0 -103
- package/dist/types/modes/shared/agent-wire/event-envelope.d.ts +0 -60
- package/dist/types/modes/shared/agent-wire/event-observation.d.ts +0 -37
- package/dist/types/modes/shared/agent-wire/handshake.d.ts +0 -56
- package/dist/types/modes/shared/agent-wire/host-tool-bridge.d.ts +0 -16
- package/dist/types/modes/shared/agent-wire/host-uri-bridge.d.ts +0 -17
- package/dist/types/modes/shared/agent-wire/protocol.d.ts +0 -25
- package/dist/types/modes/shared/agent-wire/responses.d.ts +0 -4
- package/dist/types/modes/shared/agent-wire/scopes.d.ts +0 -18
- package/dist/types/modes/shared/agent-wire/session-registry.d.ts +0 -25
- package/dist/types/modes/shared/agent-wire/ui-request-broker.d.ts +0 -42
- package/dist/types/modes/shared/agent-wire/ui-result.d.ts +0 -27
- package/dist/types/modes/shared/agent-wire/unattended-action-policy.d.ts +0 -29
- package/dist/types/modes/shared/agent-wire/unattended-audit.d.ts +0 -68
- package/dist/types/modes/shared/agent-wire/unattended-run-controller.d.ts +0 -166
- package/dist/types/modes/shared/agent-wire/unattended-session.d.ts +0 -127
- package/dist/types/modes/shared/agent-wire/workflow-gate-broker.d.ts +0 -154
- package/dist/types/modes/shared/agent-wire/workflow-gate-schema.d.ts +0 -39
- package/dist/types/modes/shared.d.ts +0 -15
- package/dist/types/modes/slash-command-visibility.d.ts +0 -1
- package/dist/types/modes/theme/defaults/index.d.ts +0 -652
- package/dist/types/modes/theme/mermaid-cache.d.ts +0 -9
- package/dist/types/modes/theme/shimmer.d.ts +0 -38
- package/dist/types/modes/theme/theme.d.ts +0 -275
- package/dist/types/modes/tmux-scroll.d.ts +0 -18
- package/dist/types/modes/types.d.ts +0 -318
- package/dist/types/modes/utils/abort-message.d.ts +0 -4
- package/dist/types/modes/utils/context-usage.d.ts +0 -36
- package/dist/types/modes/utils/hotkeys-markdown.d.ts +0 -5
- package/dist/types/modes/utils/injected-user-submission.d.ts +0 -52
- package/dist/types/modes/utils/irc-message.d.ts +0 -38
- package/dist/types/modes/utils/keybinding-matchers.d.ts +0 -10
- package/dist/types/modes/utils/terminal-bell.d.ts +0 -3
- package/dist/types/modes/utils/tools-markdown.d.ts +0 -5
- package/dist/types/modes/utils/ui-helpers.d.ts +0 -75
- package/dist/types/notifications/attachment-registry.d.ts +0 -17
- package/dist/types/notifications/chat-adapters.d.ts +0 -9
- package/dist/types/notifications/config-commands.d.ts +0 -64
- package/dist/types/notifications/config.d.ts +0 -132
- package/dist/types/notifications/daemon-paths.d.ts +0 -17
- package/dist/types/notifications/engine.d.ts +0 -59
- package/dist/types/notifications/helpers.d.ts +0 -55
- package/dist/types/notifications/html-format.d.ts +0 -75
- package/dist/types/notifications/index.d.ts +0 -219
- package/dist/types/notifications/lifecycle-commands.d.ts +0 -69
- package/dist/types/notifications/lifecycle-control-runtime.d.ts +0 -107
- package/dist/types/notifications/lifecycle-orchestrator.d.ts +0 -144
- package/dist/types/notifications/managed-daemon.d.ts +0 -48
- package/dist/types/notifications/notification-service.d.ts +0 -144
- package/dist/types/notifications/operator-runtime.d.ts +0 -52
- package/dist/types/notifications/rate-limit-pool.d.ts +0 -113
- package/dist/types/notifications/recent-activity.d.ts +0 -39
- package/dist/types/notifications/reply-sent-store.d.ts +0 -53
- package/dist/types/notifications/rich-draft.d.ts +0 -68
- package/dist/types/notifications/rich-render.d.ts +0 -90
- package/dist/types/notifications/telegram-cli.d.ts +0 -19
- package/dist/types/notifications/telegram-daemon-cli.d.ts +0 -28
- package/dist/types/notifications/telegram-daemon-control.d.ts +0 -70
- package/dist/types/notifications/telegram-daemon.d.ts +0 -558
- package/dist/types/notifications/telegram-reference.d.ts +0 -136
- package/dist/types/notifications/threaded-inbound.d.ts +0 -77
- package/dist/types/notifications/threaded-render.d.ts +0 -88
- package/dist/types/notifications/topic-registry.d.ts +0 -89
- package/dist/types/plan-mode/approved-plan.d.ts +0 -49
- package/dist/types/plan-mode/state.d.ts +0 -6
- package/dist/types/registry/agent-registry.d.ts +0 -64
- package/dist/types/reminders/star-reminder.d.ts +0 -115
- package/dist/types/research-plan/index.d.ts +0 -1
- package/dist/types/research-plan/ledger.d.ts +0 -33
- package/dist/types/rlm/artifacts.d.ts +0 -9
- package/dist/types/rlm/complete-research-tool.d.ts +0 -35
- package/dist/types/rlm/data-context.d.ts +0 -6
- package/dist/types/rlm/index.d.ts +0 -47
- package/dist/types/rlm/notebook.d.ts +0 -12
- package/dist/types/rlm/preset.d.ts +0 -23
- package/dist/types/rlm/python-tool.d.ts +0 -16
- package/dist/types/rlm/report.d.ts +0 -14
- package/dist/types/rlm/types.d.ts +0 -37
- package/dist/types/runtime/process-lifecycle.d.ts +0 -108
- package/dist/types/runtime-api-key.d.ts +0 -7
- package/dist/types/runtime-credential-selector.d.ts +0 -7
- package/dist/types/runtime-mcp/client.d.ts +0 -74
- package/dist/types/runtime-mcp/config-writer.d.ts +0 -89
- package/dist/types/runtime-mcp/config.d.ts +0 -77
- package/dist/types/runtime-mcp/discoverable-tool-metadata.d.ts +0 -7
- package/dist/types/runtime-mcp/index.d.ts +0 -18
- package/dist/types/runtime-mcp/json-rpc.d.ts +0 -22
- package/dist/types/runtime-mcp/loader.d.ts +0 -45
- package/dist/types/runtime-mcp/manager.d.ts +0 -195
- package/dist/types/runtime-mcp/oauth-discovery.d.ts +0 -40
- package/dist/types/runtime-mcp/oauth-flow.d.ts +0 -59
- package/dist/types/runtime-mcp/render.d.ts +0 -25
- package/dist/types/runtime-mcp/smithery-auth.d.ts +0 -16
- package/dist/types/runtime-mcp/smithery-connect.d.ts +0 -38
- package/dist/types/runtime-mcp/smithery-registry.d.ts +0 -51
- package/dist/types/runtime-mcp/tool-bridge.d.ts +0 -86
- package/dist/types/runtime-mcp/tool-cache.d.ts +0 -8
- package/dist/types/runtime-mcp/transports/http.d.ts +0 -36
- package/dist/types/runtime-mcp/transports/index.d.ts +0 -5
- package/dist/types/runtime-mcp/transports/stdio.d.ts +0 -29
- package/dist/types/runtime-mcp/types.d.ts +0 -349
- package/dist/types/sdk.d.ts +0 -256
- package/dist/types/secrets/index.d.ts +0 -9
- package/dist/types/secrets/obfuscator.d.ts +0 -23
- package/dist/types/secrets/regex.d.ts +0 -2
- package/dist/types/session/agent-session.d.ts +0 -1238
- package/dist/types/session/agent-storage.d.ts +0 -101
- package/dist/types/session/artifacts.d.ts +0 -64
- package/dist/types/session/auth-broker-config.d.ts +0 -13
- package/dist/types/session/auth-storage.d.ts +0 -6
- package/dist/types/session/blob-store.d.ts +0 -160
- package/dist/types/session/cache-economics.d.ts +0 -79
- package/dist/types/session/client-bridge.d.ts +0 -88
- package/dist/types/session/context-estimation.d.ts +0 -31
- package/dist/types/session/contribution-prep.d.ts +0 -47
- package/dist/types/session/file-mention-pruning.d.ts +0 -8
- package/dist/types/session/history-storage.d.ts +0 -16
- package/dist/types/session/messages.d.ts +0 -169
- package/dist/types/session/provider-safety-stop.d.ts +0 -5
- package/dist/types/session/session-dump-format.d.ts +0 -22
- package/dist/types/session/session-manager.d.ts +0 -781
- package/dist/types/session/session-storage.d.ts +0 -230
- package/dist/types/session/streaming-output.d.ts +0 -209
- package/dist/types/session/tool-choice-queue.d.ts +0 -84
- package/dist/types/session/yield-queue.d.ts +0 -24
- package/dist/types/setup/credential-auto-import.d.ts +0 -63
- package/dist/types/setup/credential-import.d.ts +0 -82
- package/dist/types/setup/hermes-setup.d.ts +0 -78
- package/dist/types/setup/host-plugin-setup.d.ts +0 -39
- package/dist/types/setup/model-onboarding-guidance.d.ts +0 -9
- package/dist/types/setup/provider-onboarding.d.ts +0 -52
- package/dist/types/skc-runtime/cli-write-receipt.d.ts +0 -24
- package/dist/types/skc-runtime/deep-interview-ambiguity.d.ts +0 -39
- package/dist/types/skc-runtime/deep-interview-recorder.d.ts +0 -114
- package/dist/types/skc-runtime/deep-interview-runtime.d.ts +0 -36
- package/dist/types/skc-runtime/deep-interview-state.d.ts +0 -127
- package/dist/types/skc-runtime/gc-render.d.ts +0 -6
- package/dist/types/skc-runtime/gc-runtime.d.ts +0 -134
- package/dist/types/skc-runtime/goal-mode-request.d.ts +0 -53
- package/dist/types/skc-runtime/launch-tmux.d.ts +0 -78
- package/dist/types/skc-runtime/launch-worktree.d.ts +0 -46
- package/dist/types/skc-runtime/ledger-event-renderer.d.ts +0 -68
- package/dist/types/skc-runtime/psmux-detect.d.ts +0 -78
- package/dist/types/skc-runtime/ralplan-runtime.d.ts +0 -26
- package/dist/types/skc-runtime/restricted-role-agent-bash.d.ts +0 -3
- package/dist/types/skc-runtime/session-layout.d.ts +0 -59
- package/dist/types/skc-runtime/session-resolution.d.ts +0 -47
- package/dist/types/skc-runtime/session-state-sidecar.d.ts +0 -70
- package/dist/types/skc-runtime/state-graph.d.ts +0 -4
- package/dist/types/skc-runtime/state-migrations.d.ts +0 -33
- package/dist/types/skc-runtime/state-renderer.d.ts +0 -70
- package/dist/types/skc-runtime/state-runtime.d.ts +0 -38
- package/dist/types/skc-runtime/state-schema.d.ts +0 -319
- package/dist/types/skc-runtime/state-validation.d.ts +0 -6
- package/dist/types/skc-runtime/state-writer.d.ts +0 -244
- package/dist/types/skc-runtime/team-gc.d.ts +0 -7
- package/dist/types/skc-runtime/team-runtime.d.ts +0 -355
- package/dist/types/skc-runtime/tmux-common.d.ts +0 -111
- package/dist/types/skc-runtime/tmux-gc.d.ts +0 -7
- package/dist/types/skc-runtime/tmux-owner-isolation-cli.d.ts +0 -5
- package/dist/types/skc-runtime/tmux-owner-isolation.d.ts +0 -309
- package/dist/types/skc-runtime/tmux-sessions.d.ts +0 -94
- package/dist/types/skc-runtime/ultragoal-guard.d.ts +0 -93
- package/dist/types/skc-runtime/ultragoal-receipt-freshness.d.ts +0 -42
- package/dist/types/skc-runtime/ultragoal-runtime.d.ts +0 -410
- package/dist/types/skc-runtime/workflow-command-ref.d.ts +0 -43
- package/dist/types/skc-runtime/workflow-manifest.d.ts +0 -54
- package/dist/types/skill-state/active-state.d.ts +0 -126
- package/dist/types/skill-state/canonical-skills.d.ts +0 -3
- package/dist/types/skill-state/deep-interview-mutation-guard.d.ts +0 -38
- package/dist/types/skill-state/initial-phase.d.ts +0 -12
- package/dist/types/skill-state/workflow-hud.d.ts +0 -83
- package/dist/types/skill-state/workflow-state-contract.d.ts +0 -57
- package/dist/types/skill-state/workflow-state-version.d.ts +0 -3
- package/dist/types/slash-commands/acp-builtins.d.ts +0 -18
- package/dist/types/slash-commands/builtin-registry.d.ts +0 -24
- package/dist/types/slash-commands/helpers/context-report.d.ts +0 -7
- package/dist/types/slash-commands/helpers/fast-status-report.d.ts +0 -82
- package/dist/types/slash-commands/helpers/format.d.ts +0 -10
- package/dist/types/slash-commands/helpers/mcp.d.ts +0 -3
- package/dist/types/slash-commands/helpers/parse.d.ts +0 -33
- package/dist/types/slash-commands/helpers/ssh.d.ts +0 -3
- package/dist/types/slash-commands/helpers/todo.d.ts +0 -3
- package/dist/types/slash-commands/helpers/usage-report.d.ts +0 -7
- package/dist/types/slash-commands/types.d.ts +0 -120
- package/dist/types/ssh/config-writer.d.ts +0 -49
- package/dist/types/ssh/connection-manager.d.ts +0 -33
- package/dist/types/ssh/ssh-executor.d.ts +0 -37
- package/dist/types/ssh/sshfs-mount.d.ts +0 -6
- package/dist/types/ssh/utils.d.ts +0 -2
- package/dist/types/stt/downloader.d.ts +0 -9
- package/dist/types/stt/index.d.ts +0 -3
- package/dist/types/stt/recorder.d.ts +0 -13
- package/dist/types/stt/setup.d.ts +0 -18
- package/dist/types/stt/stt-controller.d.ts +0 -16
- package/dist/types/stt/transcriber.d.ts +0 -16
- package/dist/types/system-prompt.d.ts +0 -118
- package/dist/types/task/agents.d.ts +0 -28
- package/dist/types/task/commands.d.ts +0 -35
- package/dist/types/task/discovery.d.ts +0 -19
- package/dist/types/task/executor.d.ts +0 -127
- package/dist/types/task/fork-context-advisory.d.ts +0 -13
- package/dist/types/task/fork-context-budget.d.ts +0 -7
- package/dist/types/task/id.d.ts +0 -7
- package/dist/types/task/index.d.ts +0 -43
- package/dist/types/task/name-generator.d.ts +0 -16
- package/dist/types/task/output-manager.d.ts +0 -36
- package/dist/types/task/parallel.d.ts +0 -34
- package/dist/types/task/receipt.d.ts +0 -89
- package/dist/types/task/render.d.ts +0 -28
- package/dist/types/task/roi-reconciliation.d.ts +0 -27
- package/dist/types/task/simple-mode.d.ts +0 -8
- package/dist/types/task/skc-command.d.ts +0 -7
- package/dist/types/task/spawn-gate.d.ts +0 -29
- package/dist/types/task/subprocess-tool-registry.d.ts +0 -72
- package/dist/types/task/token-log.d.ts +0 -30
- package/dist/types/task/token-log.test.d.ts +0 -1
- package/dist/types/task/types.d.ts +0 -516
- package/dist/types/task/worktree.d.ts +0 -94
- package/dist/types/thinking-metadata.d.ts +0 -16
- package/dist/types/thinking.d.ts +0 -22
- package/dist/types/tool-discovery/tool-index.d.ts +0 -112
- package/dist/types/tools/archive-reader.d.ts +0 -40
- package/dist/types/tools/ask-answer-registry.d.ts +0 -18
- package/dist/types/tools/ask.d.ts +0 -123
- package/dist/types/tools/ast-edit.d.ts +0 -77
- package/dist/types/tools/ast-grep.d.ts +0 -69
- package/dist/types/tools/auto-generated-guard.d.ts +0 -17
- package/dist/types/tools/bash-allowed-prefixes.d.ts +0 -10
- package/dist/types/tools/bash-command-fixup.d.ts +0 -11
- package/dist/types/tools/bash-interactive.d.ts +0 -16
- package/dist/types/tools/bash-interceptor.d.ts +0 -24
- package/dist/types/tools/bash-pty-selection.d.ts +0 -7
- package/dist/types/tools/bash-skill-urls.d.ts +0 -31
- package/dist/types/tools/bash.d.ts +0 -157
- package/dist/types/tools/bisect.d.ts +0 -81
- package/dist/types/tools/browser/actions.d.ts +0 -54
- package/dist/types/tools/browser/attach.d.ts +0 -50
- package/dist/types/tools/browser/launch.d.ts +0 -62
- package/dist/types/tools/browser/readable.d.ts +0 -17
- package/dist/types/tools/browser/registry.d.ts +0 -57
- package/dist/types/tools/browser/render.d.ts +0 -53
- package/dist/types/tools/browser/tab-protocol.d.ts +0 -144
- package/dist/types/tools/browser/tab-supervisor.d.ts +0 -109
- package/dist/types/tools/browser/tab-worker-entry.d.ts +0 -1
- package/dist/types/tools/browser/tab-worker.d.ts +0 -19
- package/dist/types/tools/browser.d.ts +0 -211
- package/dist/types/tools/calculator.d.ts +0 -76
- package/dist/types/tools/checkpoint.d.ts +0 -63
- package/dist/types/tools/composer-bash-policy.d.ts +0 -14
- package/dist/types/tools/computer/render.d.ts +0 -17
- package/dist/types/tools/computer-gc.d.ts +0 -23
- package/dist/types/tools/computer.d.ts +0 -465
- package/dist/types/tools/conflict-detect.d.ts +0 -205
- package/dist/types/tools/context.d.ts +0 -19
- package/dist/types/tools/cron.d.ts +0 -91
- package/dist/types/tools/debug.d.ts +0 -209
- package/dist/types/tools/eval.d.ts +0 -108
- package/dist/types/tools/fetch.d.ts +0 -84
- package/dist/types/tools/file-recorder.d.ts +0 -13
- package/dist/types/tools/find.d.ts +0 -95
- package/dist/types/tools/fs-cache-invalidation.d.ts +0 -15
- package/dist/types/tools/gh-format.d.ts +0 -6
- package/dist/types/tools/gh-renderer.d.ts +0 -25
- package/dist/types/tools/gh.d.ts +0 -356
- package/dist/types/tools/github-cache.d.ts +0 -103
- package/dist/types/tools/grouped-file-output.d.ts +0 -36
- package/dist/types/tools/hindsight-recall.d.ts +0 -21
- package/dist/types/tools/hindsight-reflect.d.ts +0 -23
- package/dist/types/tools/hindsight-retain.d.ts +0 -27
- package/dist/types/tools/image-gen.d.ts +0 -79
- package/dist/types/tools/index.d.ts +0 -371
- package/dist/types/tools/irc.d.ts +0 -79
- package/dist/types/tools/job.d.ts +0 -78
- package/dist/types/tools/json-tree.d.ts +0 -23
- package/dist/types/tools/jtd-to-json-schema.d.ts +0 -29
- package/dist/types/tools/jtd-to-typescript.d.ts +0 -26
- package/dist/types/tools/jtd-utils.d.ts +0 -42
- package/dist/types/tools/list-limit.d.ts +0 -12
- package/dist/types/tools/match-line-format.d.ts +0 -11
- package/dist/types/tools/monitor.d.ts +0 -54
- package/dist/types/tools/output-meta.d.ts +0 -204
- package/dist/types/tools/path-utils.d.ts +0 -147
- package/dist/types/tools/plan-mode-guard.d.ts +0 -18
- package/dist/types/tools/read.d.ts +0 -85
- package/dist/types/tools/recipe/index.d.ts +0 -45
- package/dist/types/tools/recipe/render.d.ts +0 -36
- package/dist/types/tools/recipe/runner.d.ts +0 -60
- package/dist/types/tools/recipe/runners/cargo.d.ts +0 -16
- package/dist/types/tools/recipe/runners/index.d.ts +0 -2
- package/dist/types/tools/recipe/runners/just.d.ts +0 -2
- package/dist/types/tools/recipe/runners/make.d.ts +0 -2
- package/dist/types/tools/recipe/runners/pkg.d.ts +0 -2
- package/dist/types/tools/recipe/runners/task.d.ts +0 -2
- package/dist/types/tools/render-mermaid.d.ts +0 -37
- package/dist/types/tools/render-utils.d.ts +0 -158
- package/dist/types/tools/renderers.d.ts +0 -26
- package/dist/types/tools/resolve.d.ts +0 -80
- package/dist/types/tools/resource-gc.d.ts +0 -54
- package/dist/types/tools/review.d.ts +0 -63
- package/dist/types/tools/search-tool-bm25.d.ts +0 -65
- package/dist/types/tools/search.d.ts +0 -93
- package/dist/types/tools/skill-discovery.d.ts +0 -40
- package/dist/types/tools/skill.d.ts +0 -48
- package/dist/types/tools/sqlite-reader.d.ts +0 -94
- package/dist/types/tools/ssh.d.ts +0 -67
- package/dist/types/tools/subagent-render.d.ts +0 -31
- package/dist/types/tools/subagent.d.ts +0 -117
- package/dist/types/tools/telegram-send.d.ts +0 -39
- package/dist/types/tools/todo-write.d.ts +0 -120
- package/dist/types/tools/tool-errors.d.ts +0 -33
- package/dist/types/tools/tool-result.d.ts +0 -30
- package/dist/types/tools/tool-timeouts.d.ts +0 -56
- package/dist/types/tools/ultragoal-ask-guard.d.ts +0 -12
- package/dist/types/tools/vim.d.ts +0 -58
- package/dist/types/tools/write.d.ts +0 -59
- package/dist/types/tools/yield.d.ts +0 -25
- package/dist/types/tui/code-cell.d.ts +0 -32
- package/dist/types/tui/file-list.d.ts +0 -22
- package/dist/types/tui/hyperlink.d.ts +0 -42
- package/dist/types/tui/index.d.ts +0 -11
- package/dist/types/tui/output-block.d.ts +0 -28
- package/dist/types/tui/status-line.d.ts +0 -18
- package/dist/types/tui/tree-list.d.ts +0 -19
- package/dist/types/tui/types.d.ts +0 -13
- package/dist/types/tui/utils.d.ts +0 -36
- package/dist/types/utils/changelog.d.ts +0 -37
- package/dist/types/utils/clipboard.d.ts +0 -22
- package/dist/types/utils/cmux-workspace.d.ts +0 -52
- package/dist/types/utils/command-args.d.ts +0 -9
- package/dist/types/utils/commit-message-generator.d.ts +0 -7
- package/dist/types/utils/edit-mode.d.ts +0 -13
- package/dist/types/utils/event-bus.d.ts +0 -6
- package/dist/types/utils/external-editor.d.ts +0 -19
- package/dist/types/utils/file-display-mode.d.ts +0 -27
- package/dist/types/utils/file-mentions.d.ts +0 -25
- package/dist/types/utils/git.d.ts +0 -393
- package/dist/types/utils/image-loading.d.ts +0 -26
- package/dist/types/utils/image-resize.d.ts +0 -39
- package/dist/types/utils/lang-from-path.d.ts +0 -8
- package/dist/types/utils/linkedom.d.ts +0 -4
- package/dist/types/utils/markit.d.ts +0 -7
- package/dist/types/utils/open.d.ts +0 -2
- package/dist/types/utils/pasted-image-path.d.ts +0 -32
- package/dist/types/utils/session-color.d.ts +0 -10
- package/dist/types/utils/shell-snapshot.d.ts +0 -5
- package/dist/types/utils/sixel.d.ts +0 -21
- package/dist/types/utils/title-generator.d.ts +0 -31
- package/dist/types/utils/tool-choice.d.ts +0 -20
- package/dist/types/utils/tools-manager.d.ts +0 -9
- package/dist/types/vim/buffer.d.ts +0 -41
- package/dist/types/vim/commands.d.ts +0 -6
- package/dist/types/vim/engine.d.ts +0 -47
- package/dist/types/vim/parser.d.ts +0 -3
- package/dist/types/vim/render.d.ts +0 -25
- package/dist/types/vim/types.d.ts +0 -182
- package/dist/types/web/insane/bridge.d.ts +0 -103
- package/dist/types/web/insane/url-guard.d.ts +0 -25
- package/dist/types/web/kagi.d.ts +0 -23
- package/dist/types/web/parallel.d.ts +0 -58
- package/dist/types/web/scrapers/artifacthub.d.ts +0 -6
- package/dist/types/web/scrapers/arxiv.d.ts +0 -5
- package/dist/types/web/scrapers/aur.d.ts +0 -5
- package/dist/types/web/scrapers/biorxiv.d.ts +0 -5
- package/dist/types/web/scrapers/bluesky.d.ts +0 -5
- package/dist/types/web/scrapers/brew.d.ts +0 -5
- package/dist/types/web/scrapers/cheatsh.d.ts +0 -8
- package/dist/types/web/scrapers/chocolatey.d.ts +0 -5
- package/dist/types/web/scrapers/choosealicense.d.ts +0 -2
- package/dist/types/web/scrapers/cisa-kev.d.ts +0 -5
- package/dist/types/web/scrapers/clojars.d.ts +0 -5
- package/dist/types/web/scrapers/coingecko.d.ts +0 -5
- package/dist/types/web/scrapers/crates-io.d.ts +0 -5
- package/dist/types/web/scrapers/crossref.d.ts +0 -2
- package/dist/types/web/scrapers/devto.d.ts +0 -5
- package/dist/types/web/scrapers/discogs.d.ts +0 -8
- package/dist/types/web/scrapers/discourse.d.ts +0 -5
- package/dist/types/web/scrapers/dockerhub.d.ts +0 -5
- package/dist/types/web/scrapers/docs-rs.d.ts +0 -2
- package/dist/types/web/scrapers/fdroid.d.ts +0 -5
- package/dist/types/web/scrapers/firefox-addons.d.ts +0 -2
- package/dist/types/web/scrapers/flathub.d.ts +0 -2
- package/dist/types/web/scrapers/github-gist.d.ts +0 -5
- package/dist/types/web/scrapers/github.d.ts +0 -12
- package/dist/types/web/scrapers/gitlab.d.ts +0 -5
- package/dist/types/web/scrapers/go-pkg.d.ts +0 -5
- package/dist/types/web/scrapers/hackage.d.ts +0 -5
- package/dist/types/web/scrapers/hackernews.d.ts +0 -2
- package/dist/types/web/scrapers/hex.d.ts +0 -5
- package/dist/types/web/scrapers/huggingface.d.ts +0 -2
- package/dist/types/web/scrapers/iacr.d.ts +0 -5
- package/dist/types/web/scrapers/index.d.ts +0 -84
- package/dist/types/web/scrapers/jetbrains-marketplace.d.ts +0 -2
- package/dist/types/web/scrapers/lemmy.d.ts +0 -2
- package/dist/types/web/scrapers/lobsters.d.ts +0 -5
- package/dist/types/web/scrapers/mastodon.d.ts +0 -5
- package/dist/types/web/scrapers/maven.d.ts +0 -6
- package/dist/types/web/scrapers/mdn.d.ts +0 -2
- package/dist/types/web/scrapers/metacpan.d.ts +0 -5
- package/dist/types/web/scrapers/musicbrainz.d.ts +0 -5
- package/dist/types/web/scrapers/npm.d.ts +0 -5
- package/dist/types/web/scrapers/nuget.d.ts +0 -5
- package/dist/types/web/scrapers/nvd.d.ts +0 -5
- package/dist/types/web/scrapers/ollama.d.ts +0 -2
- package/dist/types/web/scrapers/open-vsx.d.ts +0 -5
- package/dist/types/web/scrapers/opencorporates.d.ts +0 -5
- package/dist/types/web/scrapers/openlibrary.d.ts +0 -5
- package/dist/types/web/scrapers/orcid.d.ts +0 -5
- package/dist/types/web/scrapers/osv.d.ts +0 -5
- package/dist/types/web/scrapers/packagist.d.ts +0 -5
- package/dist/types/web/scrapers/pub-dev.d.ts +0 -5
- package/dist/types/web/scrapers/pubmed.d.ts +0 -5
- package/dist/types/web/scrapers/pypi.d.ts +0 -5
- package/dist/types/web/scrapers/rawg.d.ts +0 -2
- package/dist/types/web/scrapers/readthedocs.d.ts +0 -2
- package/dist/types/web/scrapers/reddit.d.ts +0 -5
- package/dist/types/web/scrapers/repology.d.ts +0 -5
- package/dist/types/web/scrapers/rfc.d.ts +0 -5
- package/dist/types/web/scrapers/rubygems.d.ts +0 -5
- package/dist/types/web/scrapers/searchcode.d.ts +0 -2
- package/dist/types/web/scrapers/sec-edgar.d.ts +0 -5
- package/dist/types/web/scrapers/semantic-scholar.d.ts +0 -2
- package/dist/types/web/scrapers/snapcraft.d.ts +0 -2
- package/dist/types/web/scrapers/sourcegraph.d.ts +0 -2
- package/dist/types/web/scrapers/spdx.d.ts +0 -5
- package/dist/types/web/scrapers/spotify.d.ts +0 -8
- package/dist/types/web/scrapers/stackoverflow.d.ts +0 -6
- package/dist/types/web/scrapers/terraform.d.ts +0 -5
- package/dist/types/web/scrapers/tldr.d.ts +0 -7
- package/dist/types/web/scrapers/twitter.d.ts +0 -5
- package/dist/types/web/scrapers/types.d.ts +0 -83
- package/dist/types/web/scrapers/utils.d.ts +0 -32
- package/dist/types/web/scrapers/vimeo.d.ts +0 -5
- package/dist/types/web/scrapers/vscode-marketplace.d.ts +0 -5
- package/dist/types/web/scrapers/w3c.d.ts +0 -2
- package/dist/types/web/scrapers/wikidata.d.ts +0 -5
- package/dist/types/web/scrapers/wikipedia.d.ts +0 -5
- package/dist/types/web/scrapers/youtube.d.ts +0 -13
- package/dist/types/web/search/index.d.ts +0 -118
- package/dist/types/web/search/provider.d.ts +0 -55
- package/dist/types/web/search/providers/anthropic.d.ts +0 -32
- package/dist/types/web/search/providers/base.d.ts +0 -90
- package/dist/types/web/search/providers/brave.d.ts +0 -27
- package/dist/types/web/search/providers/codex.d.ts +0 -35
- package/dist/types/web/search/providers/duckduckgo.d.ts +0 -57
- package/dist/types/web/search/providers/exa.d.ts +0 -52
- package/dist/types/web/search/providers/gemini.d.ts +0 -57
- package/dist/types/web/search/providers/insane.d.ts +0 -53
- package/dist/types/web/search/providers/jina.d.ts +0 -26
- package/dist/types/web/search/providers/kagi.d.ts +0 -24
- package/dist/types/web/search/providers/kimi.d.ts +0 -27
- package/dist/types/web/search/providers/openai-compatible.d.ts +0 -9
- package/dist/types/web/search/providers/parallel.d.ts +0 -15
- package/dist/types/web/search/providers/perplexity.d.ts +0 -38
- package/dist/types/web/search/providers/searxng.d.ts +0 -44
- package/dist/types/web/search/providers/synthetic.d.ts +0 -21
- package/dist/types/web/search/providers/tavily.d.ts +0 -29
- package/dist/types/web/search/providers/text-citations.d.ts +0 -23
- package/dist/types/web/search/providers/utils.d.ts +0 -88
- package/dist/types/web/search/providers/xai.d.ts +0 -64
- package/dist/types/web/search/providers/zai.d.ts +0 -28
- package/dist/types/web/search/render.d.ts +0 -36
- package/dist/types/web/search/types.d.ts +0 -372
- package/dist/types/web/search/utils.d.ts +0 -4
- package/dist/types/workflow/workflow-intent-diff.d.ts +0 -25
- package/dist/types/workflow/workflow-intent-report-consumer.d.ts +0 -50
- package/dist/types/workflow/workflow-intent-report-schema.d.ts +0 -2
- package/dist/types/workflow/workflow-intent-report.d.ts +0 -48
- package/dist/types/workspace-tree.d.ts +0 -42
- package/src/sdk.ts +0 -2623
|
@@ -1,34 +1,19 @@
|
|
|
1
|
-
|
|
2
|
-
* Interactive mode for the coding agent.
|
|
3
|
-
* Handles TUI rendering and user interaction, delegating business logic to AgentSession.
|
|
4
|
-
*/
|
|
5
|
-
import * as fs from "node:fs/promises";
|
|
6
|
-
import * as path from "node:path";
|
|
7
|
-
import { type Agent, type AgentMessage, type AgentToolResult, ThinkingLevel } from "@sayknow-cli/agent-core";
|
|
1
|
+
import { type Agent, type AgentMessage, ThinkingLevel } from "@sayknow-cli/agent-core";
|
|
8
2
|
import type { CompactionOutcome } from "@sayknow-cli/agent-core/compaction";
|
|
9
|
-
import {
|
|
10
|
-
type AssistantMessage,
|
|
11
|
-
type ImageContent,
|
|
12
|
-
type Message,
|
|
13
|
-
type Model,
|
|
14
|
-
modelsAreEqual,
|
|
15
|
-
type UsageReport,
|
|
16
|
-
} from "@sayknow-cli/ai";
|
|
3
|
+
import type { AssistantMessage, ImageContent, Message, UsageReport } from "@sayknow-cli/ai";
|
|
17
4
|
import type { Component, EditorTheme, SlashCommand } from "@sayknow-cli/tui";
|
|
18
5
|
import {
|
|
19
6
|
Container,
|
|
20
7
|
clearRenderCache,
|
|
21
8
|
getRenderCacheRetainedBytes,
|
|
22
9
|
Loader,
|
|
23
|
-
Markdown,
|
|
24
10
|
onImageProtocolChanged,
|
|
25
11
|
ProcessTerminal,
|
|
26
12
|
Spacer,
|
|
27
13
|
Text,
|
|
28
14
|
TUI,
|
|
29
|
-
visibleWidth,
|
|
30
15
|
} from "@sayknow-cli/tui";
|
|
31
|
-
import { APP_NAME, adjustHsv, getProjectDir,
|
|
16
|
+
import { APP_NAME, adjustHsv, getProjectDir, logger, postmortem } from "@sayknow-cli/utils";
|
|
32
17
|
import chalk from "chalk";
|
|
33
18
|
import { AsyncJobManager } from "../async";
|
|
34
19
|
import { type AppKeybinding, KeybindingsManager } from "../config/keybindings";
|
|
@@ -43,53 +28,41 @@ import type {
|
|
|
43
28
|
import type { CompactOptions } from "../extensibility/extensions/types";
|
|
44
29
|
import { resolveSkillSlashCommands, type Skill } from "../extensibility/skills";
|
|
45
30
|
import { BUILTIN_SLASH_COMMANDS, loadSlashCommands } from "../extensibility/slash-commands";
|
|
46
|
-
import { type Goal, type GoalModeState, normalizeGoal } from "../goals/state";
|
|
47
|
-
import { t } from "../i18n";
|
|
48
|
-
import { resolveLocalUrlToPath } from "../internal-urls";
|
|
49
31
|
import { getLspStartupWarningMessage, LSP_STARTUP_EVENT_CHANNEL, type LspStartupEvent } from "../lsp/startup-events";
|
|
50
|
-
import {
|
|
51
|
-
humanizePlanTitle,
|
|
52
|
-
type PlanApprovalDetails,
|
|
53
|
-
renameApprovedPlanFile,
|
|
54
|
-
resolvePlanTitle,
|
|
55
|
-
} from "../plan-mode/approved-plan";
|
|
56
|
-
import planModeApprovedPrompt from "../prompts/system/plan-mode-approved.md" with { type: "text" };
|
|
57
|
-
import planModeCompactInstructionsPrompt from "../prompts/system/plan-mode-compact-instructions.md" with {
|
|
58
|
-
type: "text",
|
|
59
|
-
};
|
|
60
32
|
import {
|
|
61
33
|
createStarReminderBeforeAgentStartContributor,
|
|
62
34
|
scheduleLaunchStarReminderAfterFirstRender,
|
|
63
35
|
starReminderLaunchGate,
|
|
64
36
|
} from "../reminders/star-reminder";
|
|
37
|
+
import type { NotificationSessionReconcileResult, NotificationSessionStatus } from "../sdk/bus/session-control";
|
|
65
38
|
import type { AgentSession, AgentSessionEvent } from "../session/agent-session";
|
|
66
39
|
import { HistoryStorage } from "../session/history-storage";
|
|
67
40
|
import type { SessionContext, SessionManager } from "../session/session-manager";
|
|
68
|
-
import { getRecentSessions } from "../session/session-manager";
|
|
69
|
-
import { consumePendingGoalModeRequest } from "../skc-runtime/goal-mode-request";
|
|
70
|
-
import { formatDuration } from "../slash-commands/helpers/format";
|
|
71
|
-
import { STTController, type SttState } from "../stt";
|
|
41
|
+
import { getRecentSessions, getSessionMessageEntryId } from "../session/session-manager";
|
|
72
42
|
import type { LspStartupServerInfo } from "../tools";
|
|
73
|
-
import { normalizeLocalScheme } from "../tools/path-utils";
|
|
74
|
-
import { type ResolveToolDetails, runResolveInvocation } from "../tools/resolve";
|
|
75
43
|
import { formatPhaseDisplayName } from "../tools/todo-write";
|
|
76
|
-
import { ToolError } from "../tools/tool-errors";
|
|
77
44
|
import type { EventBus } from "../utils/event-bus";
|
|
78
|
-
import { getEditorCommand, openInEditor } from "../utils/external-editor";
|
|
79
45
|
import { getSessionAccentAnsi, getSessionAccentHex } from "../utils/session-color";
|
|
80
46
|
import { popTerminalTitle, pushTerminalTitle, setSessionTerminalTitle } from "../utils/title-generator";
|
|
81
47
|
import type { AssistantMessageComponent } from "./components/assistant-message";
|
|
82
48
|
import type { BashExecutionComponent } from "./components/bash-execution";
|
|
49
|
+
import type { CommandPaletteAction } from "./components/command-palette";
|
|
83
50
|
import { CustomEditor } from "./components/custom-editor";
|
|
84
|
-
import { DynamicBorder } from "./components/dynamic-border";
|
|
85
51
|
import type { EvalExecutionComponent } from "./components/eval-execution";
|
|
86
52
|
import type { HookEditorComponent } from "./components/hook-editor";
|
|
87
53
|
import type { HookInputComponent } from "./components/hook-input";
|
|
88
54
|
import type { HookSelectorComponent } from "./components/hook-selector";
|
|
89
55
|
import { IrcSplitViewComponent } from "./components/irc-sidebar";
|
|
56
|
+
import {
|
|
57
|
+
getPetUnavailableWarning,
|
|
58
|
+
isPetAvailable,
|
|
59
|
+
isPetCapabilityProbePending,
|
|
60
|
+
warnWhenPetCapabilitySettled,
|
|
61
|
+
} from "./components/pet-capability";
|
|
90
62
|
import { type PetMode, SayknowPetWidget } from "./components/sayknow-pet-widget";
|
|
91
|
-
import { StatusLineComponent } from "./components/status-line";
|
|
92
63
|
import type { ToolExecutionHandle } from "./components/tool-execution";
|
|
64
|
+
import { StatusLineComponent } from "./components/tool-status-header";
|
|
65
|
+
import { composeToolText } from "./components/tool-transcript-format";
|
|
93
66
|
import {
|
|
94
67
|
WelcomeComponent,
|
|
95
68
|
type WelcomeLogoMode,
|
|
@@ -99,9 +72,13 @@ import { BtwController } from "./controllers/btw-controller";
|
|
|
99
72
|
import { CommandController } from "./controllers/command-controller";
|
|
100
73
|
import { EventController } from "./controllers/event-controller";
|
|
101
74
|
import { ExtensionUiController } from "./controllers/extension-ui-controller";
|
|
75
|
+
import { GoalModeController } from "./controllers/goal-mode-controller";
|
|
102
76
|
import { InputController } from "./controllers/input-controller";
|
|
77
|
+
import { ModeGate } from "./controllers/mode-gate";
|
|
78
|
+
import { PlanModeController } from "./controllers/plan-mode-controller";
|
|
103
79
|
import { SelectorController } from "./controllers/selector-controller";
|
|
104
80
|
import { SSHCommandController } from "./controllers/ssh-command-controller";
|
|
81
|
+
import { SttModeController } from "./controllers/stt-controller";
|
|
105
82
|
import { TodoCommandController } from "./controllers/todo-command-controller";
|
|
106
83
|
import { IrcObservationLedger } from "./irc-observation-ledger";
|
|
107
84
|
import { JobsObserver } from "./jobs-observer";
|
|
@@ -109,29 +86,25 @@ import { OAuthManualInputManager } from "./oauth-manual-input";
|
|
|
109
86
|
import { SessionObserverRegistry } from "./session-observer-registry";
|
|
110
87
|
import { interruptHint } from "./shared";
|
|
111
88
|
import { shouldShowExtensionCommand } from "./slash-command-visibility";
|
|
89
|
+
import { TasksAggregator } from "./tasks-aggregator";
|
|
112
90
|
import { type ShimmerPalette, shimmerSegments, shimmerText } from "./theme/shimmer";
|
|
113
91
|
import type { Theme } from "./theme/theme";
|
|
92
|
+
import { getEditorTheme, getSymbolTheme, onTerminalAppearanceChange, onThemeChange, theme } from "./theme/theme";
|
|
93
|
+
import { type RegisterTranscriptItem, TranscriptItemRegistry, transcriptItemId } from "./transcript-item-registry";
|
|
114
94
|
import {
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
InteractiveModeContext,
|
|
125
|
-
IrcArrivalSnapshot,
|
|
126
|
-
SubmittedUserInput,
|
|
127
|
-
TodoItem,
|
|
128
|
-
TodoPhase,
|
|
129
|
-
TranscriptRebuildPolicy,
|
|
95
|
+
type CompactionQueuedMessage,
|
|
96
|
+
type ComposerSubmissionOptions,
|
|
97
|
+
canApplyComposerSubmission,
|
|
98
|
+
type InteractiveModeContext,
|
|
99
|
+
type IrcArrivalSnapshot,
|
|
100
|
+
type SubmittedUserInput,
|
|
101
|
+
type TodoItem,
|
|
102
|
+
type TodoPhase,
|
|
103
|
+
type TranscriptRebuildPolicy,
|
|
130
104
|
} from "./types";
|
|
131
105
|
import type { ParsedIrcMessage } from "./utils/irc-message";
|
|
132
106
|
import { addChatChild, prepareTranscriptRebuild, UiHelpers } from "./utils/ui-helpers";
|
|
133
107
|
|
|
134
|
-
const INTERACTIVE_ABORT_CLEANUP_TIMEOUT_MS = 5_000;
|
|
135
108
|
const COMPOSER_NEWLINE_HINT = process.platform === "win32" ? "Alt+Enter/Ctrl+J" : "Shift+Enter/Ctrl+J";
|
|
136
109
|
export const DEFAULT_COMPOSER_PLACEHOLDER = `Type your message... ${COMPOSER_NEWLINE_HINT}: New line · Ctrl+C: Clear · Ctrl+R: Search history · Shift+Tab: Reasoning`;
|
|
137
110
|
const WELCOME_RESERVED_CONTAINER_CHILD_LIMIT = 8;
|
|
@@ -262,22 +235,6 @@ function formatHudNoteMarker(count: number): string {
|
|
|
262
235
|
return theme.fg("dim", chalk.italic(` \u207a${sub}`));
|
|
263
236
|
}
|
|
264
237
|
|
|
265
|
-
type GoalSubcommand = "set" | "show" | "pause" | "resume" | "drop";
|
|
266
|
-
|
|
267
|
-
const GOAL_SUBCOMMANDS = new Set<GoalSubcommand>(["set", "show", "pause", "resume", "drop"]);
|
|
268
|
-
|
|
269
|
-
function parseGoalSubcommand(args: string): { sub: GoalSubcommand | undefined; rest: string } {
|
|
270
|
-
const trimmed = args.trim();
|
|
271
|
-
if (!trimmed) return { sub: undefined, rest: "" };
|
|
272
|
-
const match = /^(\S+)(?:\s+([\s\S]*))?$/.exec(trimmed);
|
|
273
|
-
if (!match) return { sub: undefined, rest: trimmed };
|
|
274
|
-
const first = match[1].toLowerCase();
|
|
275
|
-
if (GOAL_SUBCOMMANDS.has(first as GoalSubcommand)) {
|
|
276
|
-
return { sub: first as GoalSubcommand, rest: match[2]?.trim() ?? "" };
|
|
277
|
-
}
|
|
278
|
-
return { sub: undefined, rest: trimmed };
|
|
279
|
-
}
|
|
280
|
-
|
|
281
238
|
export type WelcomeBannerSettingMode = "auto" | "unicode" | "square" | "ascii";
|
|
282
239
|
|
|
283
240
|
export function resolveWelcomeLogoMode(
|
|
@@ -336,11 +293,6 @@ export class InteractiveMode implements InteractiveModeContext {
|
|
|
336
293
|
isBashNoContext = false;
|
|
337
294
|
toolOutputExpanded = false;
|
|
338
295
|
todoExpanded = false;
|
|
339
|
-
planModeEnabled = false;
|
|
340
|
-
planModePaused = false;
|
|
341
|
-
goalModeEnabled = false;
|
|
342
|
-
goalModePaused = false;
|
|
343
|
-
planModePlanFilePath: string | undefined = undefined;
|
|
344
296
|
todoPhases: TodoPhase[] = [];
|
|
345
297
|
hideThinkingBlock = false;
|
|
346
298
|
pendingImages: ImageContent[] = [];
|
|
@@ -386,22 +338,16 @@ export class InteractiveMode implements InteractiveModeContext {
|
|
|
386
338
|
oauthManualInput: OAuthManualInputManager = new OAuthManualInputManager();
|
|
387
339
|
|
|
388
340
|
#baseSlashCommands: SlashCommand[] = [];
|
|
341
|
+
#resolvedSlashCommands: SlashCommand[] = [];
|
|
389
342
|
#baseReservedSlashCommandNames: Set<string> = new Set();
|
|
390
343
|
#cleanupUnsubscribe?: () => void;
|
|
391
344
|
#subprocessTeardownUnsubscribe?: () => void;
|
|
392
345
|
#petProtocolUnsubscribe?: () => void;
|
|
346
|
+
/** Cancels a startup pet-unavailable warning still awaiting probe settlement. */
|
|
347
|
+
#petUnavailableWarningDisposer?: () => void;
|
|
393
348
|
readonly #version: string;
|
|
394
349
|
readonly #changelogMarkdown: string | undefined;
|
|
395
|
-
|
|
396
|
-
#goalModePreviousTools: string[] | undefined;
|
|
397
|
-
#goalContinuationTimer: NodeJS.Timeout | undefined;
|
|
398
|
-
#goalTurnHadToolCalls = false;
|
|
399
|
-
#goalContinuationTurnInFlight = false;
|
|
400
|
-
#goalSuppressNextContinuation = false;
|
|
401
|
-
#planModePreviousModelState: { model: Model; thinkingLevel?: ThinkingLevel } | undefined;
|
|
402
|
-
#pendingModelSwitch: { model: Model; thinkingLevel?: ThinkingLevel } | undefined;
|
|
403
|
-
#planModeHasEntered = false;
|
|
404
|
-
#planReviewContainer: Container | undefined;
|
|
350
|
+
|
|
405
351
|
readonly lspServers: LspStartupServerInfo[] | undefined = undefined;
|
|
406
352
|
mcpManager?: import("../runtime-mcp").MCPManager;
|
|
407
353
|
readonly #toolUiContextSetter: (uiContext: ExtensionUIContext, hasUI: boolean) => void;
|
|
@@ -414,14 +360,25 @@ export class InteractiveMode implements InteractiveModeContext {
|
|
|
414
360
|
readonly #inputController: InputController;
|
|
415
361
|
readonly #selectorController: SelectorController;
|
|
416
362
|
readonly #uiHelpers: UiHelpers;
|
|
417
|
-
#
|
|
418
|
-
#
|
|
419
|
-
#
|
|
420
|
-
#
|
|
421
|
-
#voicePreviousUseTerminalCursor: boolean | null = null;
|
|
363
|
+
readonly #modeGate = new ModeGate();
|
|
364
|
+
readonly #goalModeController: GoalModeController;
|
|
365
|
+
readonly #planModeController: PlanModeController;
|
|
366
|
+
#sttController: SttModeController | undefined;
|
|
422
367
|
#resizeHandler?: () => void;
|
|
423
368
|
#observerRegistry: SessionObserverRegistry;
|
|
369
|
+
#transcriptRegistry = new TranscriptItemRegistry();
|
|
370
|
+
|
|
371
|
+
/** Direct controller capabilities for consumers that coordinate mode transitions. */
|
|
372
|
+
get planModeController(): PlanModeController {
|
|
373
|
+
return this.#planModeController;
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
get goalModeController(): GoalModeController {
|
|
377
|
+
return this.#goalModeController;
|
|
378
|
+
}
|
|
379
|
+
|
|
424
380
|
#jobsObserver?: JobsObserver;
|
|
381
|
+
#tasksAggregator?: TasksAggregator;
|
|
425
382
|
#eventBus?: EventBus;
|
|
426
383
|
#eventBusUnsubscribers: Array<() => void> = [];
|
|
427
384
|
#welcomeComponent?: WelcomeComponent;
|
|
@@ -440,6 +397,28 @@ export class InteractiveMode implements InteractiveModeContext {
|
|
|
440
397
|
) {
|
|
441
398
|
this.session = session;
|
|
442
399
|
this.sessionManager = session.sessionManager;
|
|
400
|
+
this.session.setSdkPlanModeHandler(async on => {
|
|
401
|
+
if (on && (this.#goalModeController.enabled || this.#goalModeController.paused)) {
|
|
402
|
+
throw Object.assign(new Error("mode.plan.set could not enter plan mode while goal mode is active."), {
|
|
403
|
+
code: "conflict",
|
|
404
|
+
});
|
|
405
|
+
}
|
|
406
|
+
if (on) await this.#planModeController.enter();
|
|
407
|
+
else await this.#planModeController.exit();
|
|
408
|
+
const state = this.session.getPlanModeState();
|
|
409
|
+
const applied = on
|
|
410
|
+
? this.#planModeController.enabled && state?.enabled === true
|
|
411
|
+
: !this.#planModeController.enabled && !this.#planModeController.paused && state === undefined;
|
|
412
|
+
if (!applied) {
|
|
413
|
+
throw Object.assign(
|
|
414
|
+
new Error(`mode.plan.set could not ${on ? "enter" : "exit"} plan mode in the current lifecycle state.`),
|
|
415
|
+
{
|
|
416
|
+
code: "conflict",
|
|
417
|
+
},
|
|
418
|
+
);
|
|
419
|
+
}
|
|
420
|
+
return state;
|
|
421
|
+
});
|
|
443
422
|
this.session.setRetainedMemorySampler(() => ({
|
|
444
423
|
tuiChatChildren: this.chatContainer.children.length,
|
|
445
424
|
tuiCachedRenderBytes: getRenderCacheRetainedBytes(),
|
|
@@ -453,6 +432,67 @@ export class InteractiveMode implements InteractiveModeContext {
|
|
|
453
432
|
this.lspServers = lspServers;
|
|
454
433
|
this.mcpManager = mcpManager;
|
|
455
434
|
this.#eventBus = eventBus;
|
|
435
|
+
const thisMode = this;
|
|
436
|
+
this.#goalModeController = new GoalModeController({
|
|
437
|
+
session: this.session,
|
|
438
|
+
sessionManager: this.sessionManager,
|
|
439
|
+
modeGate: this.#modeGate,
|
|
440
|
+
get planModeActive() {
|
|
441
|
+
return thisMode.#planModeController.enabled || thisMode.#planModeController.paused;
|
|
442
|
+
},
|
|
443
|
+
get inputCallback() {
|
|
444
|
+
return thisMode.onInputCallback;
|
|
445
|
+
},
|
|
446
|
+
get hasPendingSubmission() {
|
|
447
|
+
return thisMode.#pendingSubmittedInput !== undefined;
|
|
448
|
+
},
|
|
449
|
+
get hasPendingImages() {
|
|
450
|
+
return thisMode.pendingImages.length > 0;
|
|
451
|
+
},
|
|
452
|
+
get editorText() {
|
|
453
|
+
return thisMode.editor.getText();
|
|
454
|
+
},
|
|
455
|
+
startPendingSubmission: input => thisMode.startPendingSubmission(input),
|
|
456
|
+
showStatus: message => this.showStatus(message),
|
|
457
|
+
showWarning: message => this.showWarning(message),
|
|
458
|
+
showError: message => this.showError(message),
|
|
459
|
+
showHookConfirm: (title, message) => this.showHookConfirm(title, message),
|
|
460
|
+
showHookSelector: (title, options) => this.showHookSelector(title, options),
|
|
461
|
+
showHookEditor: (title, options) => this.showHookEditor(title, undefined, undefined, options),
|
|
462
|
+
updateGoalModeStatus: () => this.#updateGoalModeStatus(),
|
|
463
|
+
});
|
|
464
|
+
this.#planModeController = new PlanModeController({
|
|
465
|
+
session: this.session,
|
|
466
|
+
sessionManager: this.sessionManager,
|
|
467
|
+
modeGate: this.#modeGate,
|
|
468
|
+
get chatContainer() {
|
|
469
|
+
return thisMode.chatContainer;
|
|
470
|
+
},
|
|
471
|
+
get inputCallback() {
|
|
472
|
+
return thisMode.onInputCallback;
|
|
473
|
+
},
|
|
474
|
+
get externalEditorKey() {
|
|
475
|
+
return thisMode.keybindings.getDisplayString("app.editor.external");
|
|
476
|
+
},
|
|
477
|
+
get externalEditorKeys() {
|
|
478
|
+
return thisMode.keybindings.getKeys("app.editor.external");
|
|
479
|
+
},
|
|
480
|
+
startPendingSubmission: input => thisMode.startPendingSubmission(input),
|
|
481
|
+
addChatChild: child => addChatChild(thisMode, child),
|
|
482
|
+
requestRender: full => thisMode.ui.requestRender(full),
|
|
483
|
+
stopUi: () => thisMode.ui.stop(),
|
|
484
|
+
startUi: () => thisMode.ui.start(),
|
|
485
|
+
showStatus: message => thisMode.showStatus(message),
|
|
486
|
+
showWarning: message => thisMode.showWarning(message),
|
|
487
|
+
showError: message => thisMode.showError(message),
|
|
488
|
+
showHookConfirm: (title, message) => thisMode.showHookConfirm(title, message),
|
|
489
|
+
showPlanPreview: (content, options) => thisMode.#selectorController.showPlanPreview(content, options),
|
|
490
|
+
flushCompactionQueue: options => thisMode.flushCompactionQueue(options),
|
|
491
|
+
updatePlanModeStatus: status => thisMode.#updatePlanModeStatus(status),
|
|
492
|
+
handleClearCommand: () => thisMode.handleClearCommand(),
|
|
493
|
+
handleCompactCommand: instructions => thisMode.handleCompactCommand(instructions),
|
|
494
|
+
updateEditorChrome: () => thisMode.updateEditorChrome(),
|
|
495
|
+
});
|
|
456
496
|
if (eventBus) {
|
|
457
497
|
this.#eventBusUnsubscribers.push(
|
|
458
498
|
eventBus.on(LSP_STARTUP_EVENT_CHANNEL, data => {
|
|
@@ -461,7 +501,9 @@ export class InteractiveMode implements InteractiveModeContext {
|
|
|
461
501
|
);
|
|
462
502
|
}
|
|
463
503
|
|
|
464
|
-
this.ui = new TUI(new ProcessTerminal(), settings.get("showHardwareCursor")
|
|
504
|
+
this.ui = new TUI(new ProcessTerminal(), settings.get("showHardwareCursor"), {
|
|
505
|
+
enableMouse: settings.get("mouse.enabled"),
|
|
506
|
+
});
|
|
465
507
|
this.ui.setClearOnShrink(settings.get("clearOnShrink"));
|
|
466
508
|
this.chatContainer = new Container();
|
|
467
509
|
this.#ircSplitView = new IrcSplitViewComponent(this.chatContainer, this.ircLedger, () => theme);
|
|
@@ -498,7 +540,7 @@ export class InteractiveMode implements InteractiveModeContext {
|
|
|
498
540
|
this.hookWidgetContainerBelow = new Container();
|
|
499
541
|
this.editorContainer = new Container();
|
|
500
542
|
this.editorContainer.addChild(this.editor);
|
|
501
|
-
this.statusLine = new StatusLineComponent(session, { version: this.#version });
|
|
543
|
+
this.statusLine = new StatusLineComponent(session, { version: this.#version, focusDomain: "composer" });
|
|
502
544
|
this.statusLine.setAutoCompactEnabled(session.autoCompactionEnabled);
|
|
503
545
|
|
|
504
546
|
this.hideThinkingBlock = settings.get("hideThinkingBlock");
|
|
@@ -523,7 +565,7 @@ export class InteractiveMode implements InteractiveModeContext {
|
|
|
523
565
|
|
|
524
566
|
this.#baseSlashCommands = [...BUILTIN_SLASH_COMMANDS, ...hookCommands, ...customCommands];
|
|
525
567
|
this.#baseReservedSlashCommandNames = new Set(this.#baseSlashCommands.map(command => command.name));
|
|
526
|
-
this.#rebuildSkillSlashCommands();
|
|
568
|
+
this.#resolvedSlashCommands = [...this.#baseSlashCommands, ...this.#rebuildSkillSlashCommands()];
|
|
527
569
|
|
|
528
570
|
this.#uiHelpers = new UiHelpers(this);
|
|
529
571
|
this.#btwController = new BtwController(this);
|
|
@@ -533,9 +575,23 @@ export class InteractiveMode implements InteractiveModeContext {
|
|
|
533
575
|
this.#todoCommandController = new TodoCommandController(this);
|
|
534
576
|
this.#selectorController = new SelectorController(this);
|
|
535
577
|
this.#inputController = new InputController(this);
|
|
578
|
+
this.statusLine.setActionRegistry(this.#inputController.actionRegistry, () => this.keybindings);
|
|
536
579
|
this.#observerRegistry = new SessionObserverRegistry();
|
|
537
580
|
}
|
|
538
581
|
|
|
582
|
+
getCurrentSessionNotificationStatus(): NotificationSessionStatus | undefined {
|
|
583
|
+
return this.session.notificationSessionController?.query({ sessionManager: this.sessionManager });
|
|
584
|
+
}
|
|
585
|
+
|
|
586
|
+
async setCurrentSessionNotificationsEnabled(
|
|
587
|
+
enabled: boolean,
|
|
588
|
+
): Promise<NotificationSessionReconcileResult | undefined> {
|
|
589
|
+
return await this.session.notificationSessionController?.setLocalEnabled(
|
|
590
|
+
{ sessionManager: this.sessionManager },
|
|
591
|
+
enabled,
|
|
592
|
+
);
|
|
593
|
+
}
|
|
594
|
+
|
|
539
595
|
async init(): Promise<void> {
|
|
540
596
|
if (this.isInitialized) return;
|
|
541
597
|
|
|
@@ -618,8 +674,10 @@ export class InteractiveMode implements InteractiveModeContext {
|
|
|
618
674
|
this.ui.addChild(this.hookWidgetContainerBelow);
|
|
619
675
|
this.ui.setBottomPinnedComponent(this.statusLine);
|
|
620
676
|
this.ui.setFocus(this.editor);
|
|
677
|
+
this.petWidget?.dispose();
|
|
621
678
|
this.petWidget = this.#createPetWidget(this.editor);
|
|
622
|
-
|
|
679
|
+
const configuredPetMode = settings.get("pet.mode");
|
|
680
|
+
this.petWidget.setMode(configuredPetMode);
|
|
623
681
|
// The async sixel capability probe can enable graphics after the saved
|
|
624
682
|
// pet mode was applied and dropped (no protocol yet at startup).
|
|
625
683
|
// Re-apply the configured mode when capability arrives so the pet
|
|
@@ -632,6 +690,19 @@ export class InteractiveMode implements InteractiveModeContext {
|
|
|
632
690
|
this.petWidget.setMode(saved);
|
|
633
691
|
}
|
|
634
692
|
});
|
|
693
|
+
if (configuredPetMode !== "off" && !isPetAvailable()) {
|
|
694
|
+
// The async Sixel capability probe (started by TUI.start()) may still
|
|
695
|
+
// enable graphics; warn only once the capability question is settled
|
|
696
|
+
// so a supported terminal is never told it is incompatible.
|
|
697
|
+
this.#petUnavailableWarningDisposer?.();
|
|
698
|
+
this.#petUnavailableWarningDisposer = warnWhenPetCapabilitySettled({
|
|
699
|
+
probePending: isPetCapabilityProbePending(),
|
|
700
|
+
onUnavailable: () => {
|
|
701
|
+
this.showStatus(theme.fg("warning", getPetUnavailableWarning()), { dim: false });
|
|
702
|
+
this.ui.requestRender();
|
|
703
|
+
},
|
|
704
|
+
});
|
|
705
|
+
}
|
|
635
706
|
|
|
636
707
|
this.#inputController.setupKeyHandlers();
|
|
637
708
|
this.#inputController.setupEditorSubmitHandler();
|
|
@@ -657,6 +728,12 @@ export class InteractiveMode implements InteractiveModeContext {
|
|
|
657
728
|
this.statusLine.setJobs(jobsObserver.getSnapshot());
|
|
658
729
|
this.ui.requestRender();
|
|
659
730
|
});
|
|
731
|
+
this.#tasksAggregator = new TasksAggregator(
|
|
732
|
+
jobManager,
|
|
733
|
+
jobsObserver,
|
|
734
|
+
this.#observerRegistry,
|
|
735
|
+
this.session.getAgentId(),
|
|
736
|
+
);
|
|
660
737
|
}
|
|
661
738
|
|
|
662
739
|
// Load initial todos
|
|
@@ -669,6 +746,7 @@ export class InteractiveMode implements InteractiveModeContext {
|
|
|
669
746
|
this.updateEditorChrome();
|
|
670
747
|
this.#syncEditorMaxHeight();
|
|
671
748
|
this.isInitialized = true;
|
|
749
|
+
if (this.settings.get("tasksPane.defaultVisible")) this.showTasksPane();
|
|
672
750
|
this.#syncIrcSidebarAvailabilityFromSettings();
|
|
673
751
|
this.ui.requestRender(true);
|
|
674
752
|
|
|
@@ -747,6 +825,10 @@ export class InteractiveMode implements InteractiveModeContext {
|
|
|
747
825
|
this.updateEditorChrome();
|
|
748
826
|
}
|
|
749
827
|
|
|
828
|
+
getSlashCommands(): readonly SlashCommand[] {
|
|
829
|
+
return this.#resolvedSlashCommands;
|
|
830
|
+
}
|
|
831
|
+
|
|
750
832
|
/** Reload slash commands and autocomplete for the provided working directory. */
|
|
751
833
|
async refreshSlashCommandState(cwd?: string): Promise<void> {
|
|
752
834
|
const basePath = cwd ?? this.sessionManager.getCwd();
|
|
@@ -758,9 +840,9 @@ export class InteractiveMode implements InteractiveModeContext {
|
|
|
758
840
|
description: cmd.description,
|
|
759
841
|
}));
|
|
760
842
|
const skillCommands = this.#rebuildSkillSlashCommands(fileCommandNames);
|
|
761
|
-
|
|
843
|
+
this.#resolvedSlashCommands = [...this.#baseSlashCommands, ...skillCommands, ...fileSlashCommands];
|
|
762
844
|
const autocompleteProvider = this.#inputController.createAutocompleteProvider(
|
|
763
|
-
|
|
845
|
+
this.#resolvedSlashCommands,
|
|
764
846
|
basePath,
|
|
765
847
|
);
|
|
766
848
|
this.editor.setAutocompleteProvider(autocompleteProvider);
|
|
@@ -791,68 +873,17 @@ export class InteractiveMode implements InteractiveModeContext {
|
|
|
791
873
|
|
|
792
874
|
async getUserInput(): Promise<SubmittedUserInput> {
|
|
793
875
|
if (this.session.getGoalModeState()?.mode === "exiting") {
|
|
794
|
-
await this.#
|
|
876
|
+
await this.#goalModeController.beforeGetUserInput();
|
|
795
877
|
}
|
|
796
878
|
const { promise, resolve } = Promise.withResolvers<SubmittedUserInput>();
|
|
797
879
|
this.onInputCallback = input => {
|
|
798
880
|
this.onInputCallback = undefined;
|
|
799
881
|
resolve(input);
|
|
800
882
|
};
|
|
801
|
-
this.#
|
|
883
|
+
this.#goalModeController.scheduleContinuation();
|
|
802
884
|
return promise;
|
|
803
885
|
}
|
|
804
886
|
|
|
805
|
-
#scheduleGoalContinuation(): void {
|
|
806
|
-
this.#cancelGoalContinuation();
|
|
807
|
-
if (!this.onInputCallback) return;
|
|
808
|
-
if (!this.session.settings.get("goal.continuationModes").includes("interactive")) return;
|
|
809
|
-
if (this.planModeEnabled || this.planModePaused) return;
|
|
810
|
-
if (!this.goalModeEnabled || this.goalModePaused) return;
|
|
811
|
-
if (this.#goalSuppressNextContinuation) return;
|
|
812
|
-
if (this.#pendingSubmittedInput) return;
|
|
813
|
-
if (this.editor.getText().trim().length > 0) return;
|
|
814
|
-
if ((this.pendingImages?.length ?? 0) > 0) return;
|
|
815
|
-
const state = this.session.getGoalModeState();
|
|
816
|
-
if (!state?.enabled || state.goal.status !== "active") return;
|
|
817
|
-
const prompt = this.session.goalRuntime.buildContinuationPrompt();
|
|
818
|
-
if (!prompt) return;
|
|
819
|
-
this.#goalContinuationTimer = setTimeout(() => {
|
|
820
|
-
this.#goalContinuationTimer = undefined;
|
|
821
|
-
if (!this.onInputCallback) return;
|
|
822
|
-
if (!this.goalModeEnabled || this.goalModePaused) return;
|
|
823
|
-
if (this.#pendingSubmittedInput) return;
|
|
824
|
-
if (this.editor.getText().trim().length > 0) return;
|
|
825
|
-
if ((this.pendingImages?.length ?? 0) > 0) return;
|
|
826
|
-
// Never fire an autonomous continuation prompt() while the session is
|
|
827
|
-
// busy. A wedged/orphaned subagent turn can leave isStreaming stuck true;
|
|
828
|
-
// firing prompt() here throws AgentBusyError, which submitInteractiveInput
|
|
829
|
-
// surfaces as a red "Error: Agent is already processing…" and then loops
|
|
830
|
-
// back to getUserInput(), re-arming this timer — an infinite error spam.
|
|
831
|
-
// Re-arm and only fire once the session returns to idle.
|
|
832
|
-
if (this.session.isStreaming || this.session.isCompacting) {
|
|
833
|
-
this.#scheduleGoalContinuation();
|
|
834
|
-
return;
|
|
835
|
-
}
|
|
836
|
-
const latestState = this.session.getGoalModeState();
|
|
837
|
-
if (!latestState?.enabled || latestState.goal.status !== "active") return;
|
|
838
|
-
this.#goalContinuationTurnInFlight = true;
|
|
839
|
-
this.onInputCallback(
|
|
840
|
-
this.startPendingSubmission({
|
|
841
|
-
text: prompt,
|
|
842
|
-
customType: "goal-continuation",
|
|
843
|
-
display: false,
|
|
844
|
-
}),
|
|
845
|
-
);
|
|
846
|
-
}, 800);
|
|
847
|
-
}
|
|
848
|
-
|
|
849
|
-
#cancelGoalContinuation(): void {
|
|
850
|
-
if (this.#goalContinuationTimer) {
|
|
851
|
-
clearTimeout(this.#goalContinuationTimer);
|
|
852
|
-
this.#goalContinuationTimer = undefined;
|
|
853
|
-
}
|
|
854
|
-
}
|
|
855
|
-
|
|
856
887
|
recordLocalSubmission(text: string, imageCount = 0): () => void {
|
|
857
888
|
if (this.isKnownSlashCommand(text)) {
|
|
858
889
|
return () => {};
|
|
@@ -877,12 +908,15 @@ export class InteractiveMode implements InteractiveModeContext {
|
|
|
877
908
|
}
|
|
878
909
|
}
|
|
879
910
|
|
|
880
|
-
startPendingSubmission(
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
911
|
+
startPendingSubmission(
|
|
912
|
+
input: {
|
|
913
|
+
text: string;
|
|
914
|
+
images?: ImageContent[];
|
|
915
|
+
customType?: string;
|
|
916
|
+
display?: boolean;
|
|
917
|
+
},
|
|
918
|
+
options?: ComposerSubmissionOptions,
|
|
919
|
+
): SubmittedUserInput {
|
|
886
920
|
const submission: SubmittedUserInput = {
|
|
887
921
|
text: input.text,
|
|
888
922
|
images: input.images,
|
|
@@ -893,7 +927,7 @@ export class InteractiveMode implements InteractiveModeContext {
|
|
|
893
927
|
};
|
|
894
928
|
this.#pendingSubmittedInput = submission;
|
|
895
929
|
if (!submission.customType) {
|
|
896
|
-
this.#
|
|
930
|
+
this.#goalModeController.onUserSubmission();
|
|
897
931
|
const imageCount = submission.images?.length ?? 0;
|
|
898
932
|
this.optimisticUserMessageSignature = `${submission.text}\u0000${imageCount}`;
|
|
899
933
|
this.#pendingSubmissionDispose = this.recordLocalSubmission(submission.text, imageCount);
|
|
@@ -907,7 +941,9 @@ export class InteractiveMode implements InteractiveModeContext {
|
|
|
907
941
|
this.optimisticUserMessageSignature = undefined;
|
|
908
942
|
this.#pendingSubmissionDispose = undefined;
|
|
909
943
|
}
|
|
910
|
-
this.editor
|
|
944
|
+
if (canApplyComposerSubmission(options, this.editor)) {
|
|
945
|
+
this.editor.setText("");
|
|
946
|
+
}
|
|
911
947
|
this.ensureLoadingAnimation();
|
|
912
948
|
this.ui.requestRender();
|
|
913
949
|
return submission;
|
|
@@ -925,9 +961,7 @@ export class InteractiveMode implements InteractiveModeContext {
|
|
|
925
961
|
this.#pendingSubmissionDispose?.();
|
|
926
962
|
this.#pendingSubmissionDispose = undefined;
|
|
927
963
|
this.#pendingWorkingMessage = undefined;
|
|
928
|
-
|
|
929
|
-
this.#goalContinuationTurnInFlight = false;
|
|
930
|
-
}
|
|
964
|
+
this.#goalModeController.onPendingSubmissionFinished(submission.customType);
|
|
931
965
|
if (this.loadingAnimation) {
|
|
932
966
|
this.loadingAnimation.stop();
|
|
933
967
|
this.loadingAnimation = undefined;
|
|
@@ -958,9 +992,7 @@ export class InteractiveMode implements InteractiveModeContext {
|
|
|
958
992
|
this.#pendingSubmittedInput = undefined;
|
|
959
993
|
this.#pendingSubmissionDispose = undefined;
|
|
960
994
|
}
|
|
961
|
-
|
|
962
|
-
this.#goalContinuationTurnInFlight = false;
|
|
963
|
-
}
|
|
995
|
+
this.#goalModeController.onPendingSubmissionFinished(input.customType);
|
|
964
996
|
|
|
965
997
|
if (wasPendingSubmission && !this.session.isStreaming && !this.streamingComponent) {
|
|
966
998
|
this.optimisticUserMessageSignature = undefined;
|
|
@@ -1079,10 +1111,26 @@ export class InteractiveMode implements InteractiveModeContext {
|
|
|
1079
1111
|
this.editor.setTopBorder(undefined);
|
|
1080
1112
|
}
|
|
1081
1113
|
|
|
1082
|
-
|
|
1083
|
-
|
|
1114
|
+
/**
|
|
1115
|
+
* Single result-returning pet commit policy shared by every entry path
|
|
1116
|
+
* (`/pet`, the pet selector, and the Settings submenu). Capability is
|
|
1117
|
+
* rechecked immediately before mutation, and the preference persists only
|
|
1118
|
+
* after the commit is accepted.
|
|
1119
|
+
*/
|
|
1120
|
+
#commitPetMode(mode: PetMode, apply: (mode: PetMode) => void): boolean {
|
|
1121
|
+
if (mode !== "off" && !isPetAvailable()) {
|
|
1122
|
+
this.showStatus(theme.fg("warning", getPetUnavailableWarning()), { dim: false });
|
|
1123
|
+
this.ui.requestRender();
|
|
1124
|
+
return false;
|
|
1125
|
+
}
|
|
1126
|
+
apply(mode);
|
|
1084
1127
|
settings.set("pet.mode", mode);
|
|
1085
1128
|
this.ui.requestRender();
|
|
1129
|
+
return true;
|
|
1130
|
+
}
|
|
1131
|
+
|
|
1132
|
+
setPetMode(mode: PetMode): boolean {
|
|
1133
|
+
return this.#commitPetMode(mode, next => this.petWidget?.setMode(next));
|
|
1086
1134
|
}
|
|
1087
1135
|
|
|
1088
1136
|
previewPetMode(mode: PetMode): void {
|
|
@@ -1090,6 +1138,10 @@ export class InteractiveMode implements InteractiveModeContext {
|
|
|
1090
1138
|
this.ui.requestRender();
|
|
1091
1139
|
}
|
|
1092
1140
|
|
|
1141
|
+
commitPetPreviewMode(mode: PetMode): boolean {
|
|
1142
|
+
return this.#commitPetMode(mode, next => this.petWidget?.commitPreviewMode(next));
|
|
1143
|
+
}
|
|
1144
|
+
|
|
1093
1145
|
restoreComposer(): void {
|
|
1094
1146
|
if (this.petWidget) {
|
|
1095
1147
|
this.petWidget.remountComposer();
|
|
@@ -1190,29 +1242,7 @@ export class InteractiveMode implements InteractiveModeContext {
|
|
|
1190
1242
|
this.#renderTodoList();
|
|
1191
1243
|
}
|
|
1192
1244
|
|
|
1193
|
-
|
|
1194
|
-
return "local://PLAN.md";
|
|
1195
|
-
}
|
|
1196
|
-
|
|
1197
|
-
#resolvePlanFilePath(planFilePath: string): string {
|
|
1198
|
-
if (planFilePath.startsWith("local:")) {
|
|
1199
|
-
const normalized = normalizeLocalScheme(planFilePath);
|
|
1200
|
-
return resolveLocalUrlToPath(normalized, {
|
|
1201
|
-
getArtifactsDir: () => this.sessionManager.getArtifactsDir(),
|
|
1202
|
-
getSessionId: () => this.sessionManager.getSessionId(),
|
|
1203
|
-
});
|
|
1204
|
-
}
|
|
1205
|
-
return path.resolve(this.sessionManager.getCwd(), planFilePath);
|
|
1206
|
-
}
|
|
1207
|
-
|
|
1208
|
-
#updatePlanModeStatus(): void {
|
|
1209
|
-
const status =
|
|
1210
|
-
this.planModeEnabled || this.planModePaused
|
|
1211
|
-
? {
|
|
1212
|
-
enabled: this.planModeEnabled,
|
|
1213
|
-
paused: this.planModePaused,
|
|
1214
|
-
}
|
|
1215
|
-
: undefined;
|
|
1245
|
+
#updatePlanModeStatus(status: { enabled: boolean; paused: boolean } | undefined): void {
|
|
1216
1246
|
this.statusLine.setPlanModeStatus(status);
|
|
1217
1247
|
this.updateEditorChrome();
|
|
1218
1248
|
this.ui.requestRender();
|
|
@@ -1220,877 +1250,30 @@ export class InteractiveMode implements InteractiveModeContext {
|
|
|
1220
1250
|
|
|
1221
1251
|
#updateGoalModeStatus(): void {
|
|
1222
1252
|
const status =
|
|
1223
|
-
this.
|
|
1224
|
-
? { enabled: this.
|
|
1253
|
+
this.#goalModeController.enabled || this.#goalModeController.paused
|
|
1254
|
+
? { enabled: this.#goalModeController.enabled, paused: this.#goalModeController.paused }
|
|
1225
1255
|
: undefined;
|
|
1226
1256
|
this.statusLine.setGoalModeStatus(status);
|
|
1227
1257
|
this.updateEditorChrome();
|
|
1228
1258
|
this.ui.requestRender();
|
|
1229
1259
|
}
|
|
1230
1260
|
|
|
1231
|
-
#resetGoalContinuationSuppression(): void {
|
|
1232
|
-
this.#goalSuppressNextContinuation = false;
|
|
1233
|
-
}
|
|
1234
|
-
|
|
1235
|
-
#getPausedGoalState(): GoalModeState | undefined {
|
|
1236
|
-
const state = this.session.getGoalModeState();
|
|
1237
|
-
if (!state?.goal || state.enabled || state.goal.status !== "paused") {
|
|
1238
|
-
return undefined;
|
|
1239
|
-
}
|
|
1240
|
-
return state;
|
|
1241
|
-
}
|
|
1242
|
-
|
|
1243
|
-
#goalFromModeData(modeData: SessionContext["modeData"]): Goal | undefined {
|
|
1244
|
-
return normalizeGoal(modeData?.goal) ?? undefined;
|
|
1245
|
-
}
|
|
1246
|
-
|
|
1247
1261
|
async #handleGoalSessionEvent(event: AgentSessionEvent): Promise<void> {
|
|
1248
|
-
|
|
1249
|
-
this.#goalTurnHadToolCalls = false;
|
|
1250
|
-
this.#cancelGoalContinuation();
|
|
1251
|
-
return;
|
|
1252
|
-
}
|
|
1253
|
-
if (event.type === "tool_execution_start") {
|
|
1254
|
-
this.#goalTurnHadToolCalls = true;
|
|
1255
|
-
if (!this.#goalContinuationTurnInFlight) {
|
|
1256
|
-
this.#resetGoalContinuationSuppression();
|
|
1257
|
-
}
|
|
1258
|
-
return;
|
|
1259
|
-
}
|
|
1260
|
-
if (event.type === "message_start" && event.message.role === "user" && !event.message.synthetic) {
|
|
1261
|
-
this.#resetGoalContinuationSuppression();
|
|
1262
|
-
return;
|
|
1263
|
-
}
|
|
1264
|
-
if (event.type === "goal_updated") {
|
|
1265
|
-
// Handle drop before clearing goalModeEnabled so #exitGoalMode can
|
|
1266
|
-
// still restore the previous tool set while the flag is true.
|
|
1267
|
-
if (event.state?.goal?.status === "dropped") {
|
|
1268
|
-
await this.#exitGoalMode({ reason: "dropped", silent: true });
|
|
1269
|
-
return;
|
|
1270
|
-
}
|
|
1271
|
-
if (event.state?.enabled === true && !this.#goalModePreviousTools) {
|
|
1272
|
-
this.#goalModePreviousTools = this.session.getActiveToolNames();
|
|
1273
|
-
}
|
|
1274
|
-
this.goalModeEnabled = event.state?.enabled === true;
|
|
1275
|
-
this.goalModePaused = event.state?.enabled !== true && event.state?.goal?.status === "paused";
|
|
1276
|
-
if (!event.state?.enabled) {
|
|
1277
|
-
this.#cancelGoalContinuation();
|
|
1278
|
-
}
|
|
1279
|
-
this.#updateGoalModeStatus();
|
|
1280
|
-
return;
|
|
1281
|
-
}
|
|
1282
|
-
if (event.type !== "agent_end") {
|
|
1283
|
-
return;
|
|
1284
|
-
}
|
|
1285
|
-
if (this.#goalContinuationTurnInFlight) {
|
|
1286
|
-
this.#goalSuppressNextContinuation = !this.#goalTurnHadToolCalls;
|
|
1287
|
-
this.#goalContinuationTurnInFlight = false;
|
|
1288
|
-
}
|
|
1289
|
-
if (this.session.getGoalModeState()?.mode === "exiting") {
|
|
1290
|
-
await this.#exitGoalMode({ reason: "completed", silent: true });
|
|
1291
|
-
return;
|
|
1292
|
-
}
|
|
1293
|
-
this.#scheduleGoalContinuation();
|
|
1294
|
-
}
|
|
1295
|
-
|
|
1296
|
-
async #applyPlanModeModel(): Promise<void> {
|
|
1297
|
-
const resolved = this.session.resolveRoleModelWithThinking("plan");
|
|
1298
|
-
if (!resolved.model) return;
|
|
1299
|
-
|
|
1300
|
-
const currentModel = this.session.model;
|
|
1301
|
-
const sameModel = modelsAreEqual(currentModel, resolved.model);
|
|
1302
|
-
const planThinkingLevel = resolved.explicitThinkingLevel ? resolved.thinkingLevel : undefined;
|
|
1303
|
-
|
|
1304
|
-
this.#planModePreviousModelState = currentModel
|
|
1305
|
-
? { model: currentModel, thinkingLevel: this.session.thinkingLevel }
|
|
1306
|
-
: undefined;
|
|
1307
|
-
|
|
1308
|
-
if (!sameModel) {
|
|
1309
|
-
if (this.session.isStreaming) {
|
|
1310
|
-
this.#pendingModelSwitch = { model: resolved.model, thinkingLevel: planThinkingLevel };
|
|
1311
|
-
return;
|
|
1312
|
-
}
|
|
1313
|
-
try {
|
|
1314
|
-
await this.session.setModelTemporary(resolved.model, planThinkingLevel);
|
|
1315
|
-
} catch (error) {
|
|
1316
|
-
this.showWarning(
|
|
1317
|
-
`Failed to switch to plan model for plan mode: ${error instanceof Error ? error.message : String(error)}`,
|
|
1318
|
-
);
|
|
1319
|
-
}
|
|
1320
|
-
} else if (planThinkingLevel) {
|
|
1321
|
-
this.session.setThinkingLevel(planThinkingLevel);
|
|
1322
|
-
}
|
|
1323
|
-
}
|
|
1324
|
-
|
|
1325
|
-
/** Apply any deferred model switch after the current stream ends. */
|
|
1326
|
-
async flushPendingModelSwitch(): Promise<void> {
|
|
1327
|
-
const pending = this.#pendingModelSwitch;
|
|
1328
|
-
if (!pending) return;
|
|
1329
|
-
this.#pendingModelSwitch = undefined;
|
|
1330
|
-
try {
|
|
1331
|
-
await this.session.setModelTemporary(pending.model, pending.thinkingLevel);
|
|
1332
|
-
} catch (error) {
|
|
1333
|
-
this.showWarning(
|
|
1334
|
-
`Failed to switch model after streaming: ${error instanceof Error ? error.message : String(error)}`,
|
|
1335
|
-
);
|
|
1336
|
-
}
|
|
1262
|
+
await this.#goalModeController.handleSessionEvent(event);
|
|
1337
1263
|
}
|
|
1338
1264
|
|
|
1339
|
-
/** Restore mode state from session entries on resume
|
|
1265
|
+
/** Restore mode state from session entries on resume. */
|
|
1340
1266
|
async #restoreModeFromSession(): Promise<void> {
|
|
1341
1267
|
const sessionContext = this.sessionManager.buildSessionContext();
|
|
1342
|
-
|
|
1343
|
-
|
|
1344
|
-
this.sessionManager.appendModeChange("none");
|
|
1345
|
-
return;
|
|
1346
|
-
}
|
|
1347
|
-
if (sessionContext.mode === "goal" || sessionContext.mode === "goal_paused") {
|
|
1348
|
-
const goal = this.#goalFromModeData(sessionContext.modeData);
|
|
1349
|
-
if (!goal) {
|
|
1350
|
-
this.sessionManager.appendModeChange("none");
|
|
1351
|
-
return;
|
|
1352
|
-
}
|
|
1353
|
-
this.session.setGoalModeState({
|
|
1354
|
-
enabled: sessionContext.mode === "goal",
|
|
1355
|
-
mode: "active",
|
|
1356
|
-
goal,
|
|
1357
|
-
});
|
|
1358
|
-
const restored = await this.session.goalRuntime.onThreadResumed();
|
|
1359
|
-
this.goalModeEnabled = restored?.enabled === true;
|
|
1360
|
-
this.goalModePaused = restored?.enabled !== true && restored?.goal.status === "paused";
|
|
1361
|
-
// Keep `goal` armed on resumed threads; it is part of the default active tool set.
|
|
1362
|
-
if (restored?.goal) {
|
|
1363
|
-
const previousTools = this.session.getActiveToolNames();
|
|
1364
|
-
this.#goalModePreviousTools = previousTools;
|
|
1365
|
-
await this.session.setActiveToolsByName([...new Set([...previousTools, "goal"])]);
|
|
1366
|
-
}
|
|
1367
|
-
this.#updateGoalModeStatus();
|
|
1368
|
-
return;
|
|
1369
|
-
}
|
|
1370
|
-
const pendingGoal = goalEnabled
|
|
1371
|
-
? await consumePendingGoalModeRequest(this.sessionManager.getCwd(), this.sessionManager.getSessionId())
|
|
1372
|
-
: null;
|
|
1373
|
-
if (pendingGoal) {
|
|
1374
|
-
await this.#enterGoalMode({ objective: pendingGoal.objective, silent: true });
|
|
1375
|
-
this.#scheduleGoalContinuation();
|
|
1376
|
-
return;
|
|
1377
|
-
}
|
|
1378
|
-
if (!this.session.settings.get("plan.enabled")) {
|
|
1379
|
-
// Clear stale plan/plan_paused mode so re-enabling the setting
|
|
1380
|
-
// later doesn't unexpectedly restore an old plan session.
|
|
1381
|
-
if (sessionContext.mode === "plan" || sessionContext.mode === "plan_paused") {
|
|
1382
|
-
this.sessionManager.appendModeChange("none");
|
|
1383
|
-
}
|
|
1384
|
-
return;
|
|
1385
|
-
}
|
|
1386
|
-
if (sessionContext.mode === "plan") {
|
|
1387
|
-
const planFilePath = sessionContext.modeData?.planFilePath as string | undefined;
|
|
1388
|
-
await this.#enterPlanMode({ planFilePath });
|
|
1389
|
-
} else if (sessionContext.mode === "plan_paused") {
|
|
1390
|
-
this.planModePaused = true;
|
|
1391
|
-
this.#planModeHasEntered = true;
|
|
1392
|
-
this.#updatePlanModeStatus();
|
|
1393
|
-
}
|
|
1394
|
-
}
|
|
1395
|
-
|
|
1396
|
-
async #enterPlanMode(options?: { planFilePath?: string; workflow?: "parallel" | "iterative" }): Promise<void> {
|
|
1397
|
-
if (this.planModeEnabled) {
|
|
1398
|
-
return;
|
|
1399
|
-
}
|
|
1400
|
-
if (this.goalModeEnabled || this.goalModePaused) {
|
|
1401
|
-
this.showWarning("Exit goal mode first.");
|
|
1402
|
-
return;
|
|
1403
|
-
}
|
|
1404
|
-
|
|
1405
|
-
this.planModePaused = false;
|
|
1406
|
-
|
|
1407
|
-
const planFilePath = options?.planFilePath ?? (await this.#getPlanFilePath());
|
|
1408
|
-
const previousTools = this.session.getActiveToolNames();
|
|
1409
|
-
const hasResolveTool = this.session.getToolByName("resolve") !== undefined;
|
|
1410
|
-
const planTools = hasResolveTool ? [...previousTools, "resolve"] : previousTools;
|
|
1411
|
-
const uniquePlanTools = [...new Set(planTools)];
|
|
1412
|
-
|
|
1413
|
-
this.#planModePreviousTools = previousTools;
|
|
1414
|
-
this.planModePlanFilePath = planFilePath;
|
|
1415
|
-
this.planModeEnabled = true;
|
|
1416
|
-
|
|
1417
|
-
await this.session.setActiveToolsByName(uniquePlanTools);
|
|
1418
|
-
this.session.setPlanModeState({
|
|
1419
|
-
enabled: true,
|
|
1420
|
-
planFilePath,
|
|
1421
|
-
workflow: options?.workflow ?? "parallel",
|
|
1422
|
-
reentry: this.#planModeHasEntered,
|
|
1423
|
-
});
|
|
1424
|
-
this.session.setStandingResolveHandler?.(input => this.#runPlanApprovalResolve(input));
|
|
1425
|
-
if (this.session.isStreaming) {
|
|
1426
|
-
await this.session.sendPlanModeContext({ deliverAs: "steer" });
|
|
1427
|
-
}
|
|
1428
|
-
this.#planModeHasEntered = true;
|
|
1429
|
-
await this.#applyPlanModeModel();
|
|
1430
|
-
this.#updatePlanModeStatus();
|
|
1431
|
-
this.sessionManager.appendModeChange("plan", { planFilePath });
|
|
1432
|
-
this.showStatus(`Plan mode enabled. Plan file: ${planFilePath}`);
|
|
1433
|
-
}
|
|
1434
|
-
|
|
1435
|
-
/** Standing resolve dispatcher registered while plan mode is active. The agent
|
|
1436
|
-
* submits the finalized plan by calling `resolve { action: "apply", extra: { title } }`;
|
|
1437
|
-
* this handler validates the plan file exists, normalizes the title, and shapes the
|
|
1438
|
-
* payload that `event-controller` forwards to `handlePlanApproval`. */
|
|
1439
|
-
#runPlanApprovalResolve(input: unknown): Promise<AgentToolResult<ResolveToolDetails>> {
|
|
1440
|
-
return runResolveInvocation(input as Parameters<typeof runResolveInvocation>[0], {
|
|
1441
|
-
sourceToolName: "plan_approval",
|
|
1442
|
-
label: "Plan ready for approval",
|
|
1443
|
-
apply: async (_reason, extra) => {
|
|
1444
|
-
const state = this.session.getPlanModeState?.();
|
|
1445
|
-
if (!state?.enabled) {
|
|
1446
|
-
throw new ToolError("Plan mode is not active.");
|
|
1447
|
-
}
|
|
1448
|
-
const planFilePath = state.planFilePath;
|
|
1449
|
-
const planContent = await this.#readPlanFile(planFilePath);
|
|
1450
|
-
if (planContent === null) {
|
|
1451
|
-
throw new ToolError(
|
|
1452
|
-
`Plan file not found at ${planFilePath}. Write the finalized plan to ${planFilePath} before requesting approval.`,
|
|
1453
|
-
);
|
|
1454
|
-
}
|
|
1455
|
-
const normalized = resolvePlanTitle({
|
|
1456
|
-
suppliedTitle: extra?.title,
|
|
1457
|
-
planContent,
|
|
1458
|
-
planFilePath,
|
|
1459
|
-
});
|
|
1460
|
-
const details: PlanApprovalDetails = {
|
|
1461
|
-
planFilePath,
|
|
1462
|
-
finalPlanFilePath: `local://${normalized.fileName}`,
|
|
1463
|
-
title: normalized.title,
|
|
1464
|
-
planExists: true,
|
|
1465
|
-
};
|
|
1466
|
-
return {
|
|
1467
|
-
content: [{ type: "text" as const, text: "Plan ready for approval." }],
|
|
1468
|
-
details,
|
|
1469
|
-
};
|
|
1470
|
-
},
|
|
1471
|
-
});
|
|
1472
|
-
}
|
|
1473
|
-
|
|
1474
|
-
async #exitPlanMode(options?: { silent?: boolean; paused?: boolean }): Promise<void> {
|
|
1475
|
-
if (!this.planModeEnabled) {
|
|
1476
|
-
return;
|
|
1477
|
-
}
|
|
1478
|
-
|
|
1479
|
-
// Leaving plan mode invalidates the plan-mode steering and standing
|
|
1480
|
-
// resolve handler that the in-flight turn may still be acting on. Abort
|
|
1481
|
-
// before clearing that state so the model cannot continue from stale
|
|
1482
|
-
// plan-mode context and retry `resolve` against a retired handler.
|
|
1483
|
-
await this.session.abort({ timeoutMs: INTERACTIVE_ABORT_CLEANUP_TIMEOUT_MS });
|
|
1484
|
-
|
|
1485
|
-
const previousTools = this.#planModePreviousTools;
|
|
1486
|
-
if (previousTools && previousTools.length > 0) {
|
|
1487
|
-
await this.session.setActiveToolsByName(previousTools);
|
|
1488
|
-
}
|
|
1489
|
-
if (this.#planModePreviousModelState) {
|
|
1490
|
-
const prev = this.#planModePreviousModelState;
|
|
1491
|
-
if (modelsAreEqual(this.session.model, prev.model)) {
|
|
1492
|
-
// Same model — only thinking level may differ. Avoid setModelTemporary()
|
|
1493
|
-
// which would reset provider-side sessions (openai-responses/OpenAI code backend) and
|
|
1494
|
-
// break conversation continuity.
|
|
1495
|
-
this.session.setThinkingLevel(prev.thinkingLevel);
|
|
1496
|
-
} else if (this.session.isStreaming) {
|
|
1497
|
-
this.#pendingModelSwitch = { model: prev.model, thinkingLevel: prev.thinkingLevel };
|
|
1498
|
-
} else {
|
|
1499
|
-
await this.session.setModelTemporary(prev.model, prev.thinkingLevel);
|
|
1500
|
-
}
|
|
1501
|
-
// If #applyPlanModeModel queued a deferred switch to the plan-role model
|
|
1502
|
-
// (because the session was streaming on entry), drop it now: we are
|
|
1503
|
-
// leaving plan mode, so flushing it on the next agent_end would land the
|
|
1504
|
-
// session on the plan-role model after the user has exited plan mode
|
|
1505
|
-
// (issue #816). Only clear when the pending target matches the plan-role
|
|
1506
|
-
// model — leave any unrelated user-queued switch intact.
|
|
1507
|
-
const pending = this.#pendingModelSwitch;
|
|
1508
|
-
if (pending) {
|
|
1509
|
-
const planResolution = this.session.resolveRoleModelWithThinking("plan");
|
|
1510
|
-
if (planResolution.model && modelsAreEqual(pending.model, planResolution.model)) {
|
|
1511
|
-
this.#pendingModelSwitch = undefined;
|
|
1512
|
-
}
|
|
1513
|
-
}
|
|
1514
|
-
}
|
|
1515
|
-
this.session.setStandingResolveHandler?.(null);
|
|
1516
|
-
this.session.setPlanModeState(undefined);
|
|
1517
|
-
this.planModeEnabled = false;
|
|
1518
|
-
this.planModePaused = options?.paused ?? false;
|
|
1519
|
-
this.planModePlanFilePath = undefined;
|
|
1520
|
-
this.#planModePreviousTools = undefined;
|
|
1521
|
-
this.#planModePreviousModelState = undefined;
|
|
1522
|
-
this.#updatePlanModeStatus();
|
|
1523
|
-
const paused = options?.paused ?? false;
|
|
1524
|
-
this.sessionManager.appendModeChange(paused ? "plan_paused" : "none");
|
|
1525
|
-
if (!options?.silent) {
|
|
1526
|
-
this.showStatus(paused ? "Plan mode paused." : "Plan mode disabled.");
|
|
1527
|
-
}
|
|
1528
|
-
}
|
|
1529
|
-
|
|
1530
|
-
async #enterGoalMode(options: { objective?: string; resume?: boolean; silent?: boolean }): Promise<void> {
|
|
1531
|
-
if (this.goalModeEnabled) {
|
|
1532
|
-
return;
|
|
1533
|
-
}
|
|
1534
|
-
if (this.planModeEnabled || this.planModePaused) {
|
|
1535
|
-
this.showWarning("Exit plan mode first.");
|
|
1536
|
-
return;
|
|
1537
|
-
}
|
|
1538
|
-
const previousTools = this.session.getActiveToolNames();
|
|
1539
|
-
const goalTools = [...new Set([...previousTools, "goal"])];
|
|
1540
|
-
this.#goalModePreviousTools = previousTools;
|
|
1541
|
-
this.goalModePaused = false;
|
|
1542
|
-
const state = options.resume
|
|
1543
|
-
? await this.session.goalRuntime.resumeGoal()
|
|
1544
|
-
: await this.session.goalRuntime.createGoal({ objective: options.objective ?? "" });
|
|
1545
|
-
await this.session.setActiveToolsByName(goalTools);
|
|
1546
|
-
this.session.setGoalModeState(state);
|
|
1547
|
-
this.goalModeEnabled = true;
|
|
1548
|
-
this.#resetGoalContinuationSuppression();
|
|
1549
|
-
this.#updateGoalModeStatus();
|
|
1550
|
-
if (this.session.isStreaming) {
|
|
1551
|
-
await this.session.sendGoalModeContext({ deliverAs: "steer" });
|
|
1552
|
-
}
|
|
1553
|
-
if (!options.silent) {
|
|
1554
|
-
this.showStatus(options.resume ? "Goal mode resumed." : "Goal mode enabled.");
|
|
1555
|
-
}
|
|
1556
|
-
}
|
|
1557
|
-
|
|
1558
|
-
async #exitGoalMode(options?: {
|
|
1559
|
-
silent?: boolean;
|
|
1560
|
-
paused?: boolean;
|
|
1561
|
-
reason?: "completed" | "paused" | "dropped";
|
|
1562
|
-
}): Promise<void> {
|
|
1563
|
-
const previousTools = this.#goalModePreviousTools;
|
|
1564
|
-
// Drop keeps the `goal` tool callable so the agent can immediately create a new
|
|
1565
|
-
// goal in the same session without a leader-side cleanup. Complete (and pause)
|
|
1566
|
-
// exit goal mode and restore the pre-goal tool set even when the goal_updated
|
|
1567
|
-
// event has already cleared goalModeEnabled (see #completeGoalFromTool emitting
|
|
1568
|
-
// state.enabled = false before #exitGoalMode runs). Spec: deep-interview-ultragoal-goal-tool-wiring AC1+AC2.
|
|
1569
|
-
const shouldRestoreTools =
|
|
1570
|
-
previousTools &&
|
|
1571
|
-
options?.reason !== "dropped" &&
|
|
1572
|
-
(this.goalModeEnabled || options?.reason === "completed" || options?.paused === true);
|
|
1573
|
-
if (shouldRestoreTools) {
|
|
1574
|
-
await this.session.setActiveToolsByName(previousTools);
|
|
1575
|
-
}
|
|
1576
|
-
const currentState = this.session.getGoalModeState();
|
|
1577
|
-
if (options?.reason === "completed") {
|
|
1578
|
-
this.session.setGoalModeState(undefined);
|
|
1579
|
-
this.sessionManager.appendModeChange("none");
|
|
1580
|
-
this.sessionManager.appendCustomEntry("goal-completed", {
|
|
1581
|
-
objective: currentState?.goal?.objective,
|
|
1582
|
-
tokensUsed: currentState?.goal?.tokensUsed,
|
|
1583
|
-
timeUsedSeconds: currentState?.goal?.timeUsedSeconds,
|
|
1584
|
-
});
|
|
1585
|
-
}
|
|
1586
|
-
this.goalModeEnabled = false;
|
|
1587
|
-
this.goalModePaused = options?.paused ?? false;
|
|
1588
|
-
this.#goalModePreviousTools = undefined;
|
|
1589
|
-
this.#goalContinuationTurnInFlight = false;
|
|
1590
|
-
this.#cancelGoalContinuation();
|
|
1591
|
-
this.#updateGoalModeStatus();
|
|
1592
|
-
if (!options?.silent) {
|
|
1593
|
-
if (options?.reason === "completed") {
|
|
1594
|
-
this.showStatus("Goal mode completed.");
|
|
1595
|
-
} else if (options?.reason === "dropped") {
|
|
1596
|
-
this.showStatus("Goal dropped.");
|
|
1597
|
-
} else if (options?.paused) {
|
|
1598
|
-
this.showStatus("Goal mode paused.");
|
|
1599
|
-
} else {
|
|
1600
|
-
this.showStatus("Goal mode disabled.");
|
|
1601
|
-
}
|
|
1602
|
-
}
|
|
1603
|
-
}
|
|
1604
|
-
|
|
1605
|
-
async #readPlanFile(planFilePath: string): Promise<string | null> {
|
|
1606
|
-
const resolvedPath = this.#resolvePlanFilePath(planFilePath);
|
|
1607
|
-
try {
|
|
1608
|
-
return await Bun.file(resolvedPath).text();
|
|
1609
|
-
} catch (error) {
|
|
1610
|
-
if (isEnoent(error)) {
|
|
1611
|
-
return null;
|
|
1612
|
-
}
|
|
1613
|
-
throw error;
|
|
1614
|
-
}
|
|
1615
|
-
}
|
|
1616
|
-
|
|
1617
|
-
#renderPlanPreview(planContent: string, options?: { append?: boolean }): void {
|
|
1618
|
-
const existingContainer = this.#planReviewContainer;
|
|
1619
|
-
// Only reuse the existing preview when it is still attached to the chat container;
|
|
1620
|
-
// a collapsed/disposed container must be re-added, not mutated in place.
|
|
1621
|
-
const stillAttached = existingContainer !== undefined && this.chatContainer.children.includes(existingContainer);
|
|
1622
|
-
const replaceExisting = options?.append !== true && stillAttached;
|
|
1623
|
-
const planReviewContainer = replaceExisting && existingContainer ? existingContainer : new Container();
|
|
1624
|
-
planReviewContainer.clear();
|
|
1625
|
-
planReviewContainer.addChild(new Spacer(1));
|
|
1626
|
-
planReviewContainer.addChild(new DynamicBorder());
|
|
1627
|
-
planReviewContainer.addChild(new Text(theme.bold(theme.fg("accent", "Plan Review")), 1, 1));
|
|
1628
|
-
planReviewContainer.addChild(new Spacer(1));
|
|
1629
|
-
planReviewContainer.addChild(new Markdown(planContent, 1, 1, getMarkdownTheme()));
|
|
1630
|
-
planReviewContainer.addChild(new DynamicBorder());
|
|
1631
|
-
if (!replaceExisting) {
|
|
1632
|
-
addChatChild(this, planReviewContainer);
|
|
1633
|
-
}
|
|
1634
|
-
this.#planReviewContainer = planReviewContainer;
|
|
1635
|
-
this.ui.requestRender();
|
|
1636
|
-
}
|
|
1637
|
-
|
|
1638
|
-
#getEditorTerminalPath(): string | null {
|
|
1639
|
-
if (process.platform === "win32") {
|
|
1640
|
-
return null;
|
|
1641
|
-
}
|
|
1642
|
-
return "/dev/tty";
|
|
1643
|
-
}
|
|
1644
|
-
|
|
1645
|
-
async #openEditorTerminalHandle(): Promise<fs.FileHandle | null> {
|
|
1646
|
-
const terminalPath = this.#getEditorTerminalPath();
|
|
1647
|
-
if (!terminalPath) {
|
|
1648
|
-
return null;
|
|
1649
|
-
}
|
|
1650
|
-
try {
|
|
1651
|
-
return await fs.open(terminalPath, "r+");
|
|
1652
|
-
} catch {
|
|
1653
|
-
return null;
|
|
1654
|
-
}
|
|
1655
|
-
}
|
|
1656
|
-
|
|
1657
|
-
#getPlanReviewHelpText(): string {
|
|
1658
|
-
const externalEditorKey = this.keybindings.getDisplayString("app.editor.external");
|
|
1659
|
-
if (!externalEditorKey) {
|
|
1660
|
-
return t("nav.hint");
|
|
1661
|
-
}
|
|
1662
|
-
return `up/down navigate enter select ${externalEditorKey.toLowerCase()} open in editor esc cancel`;
|
|
1663
|
-
}
|
|
1664
|
-
|
|
1665
|
-
async #openPlanInExternalEditor(planFilePath: string): Promise<void> {
|
|
1666
|
-
const editorCmd = getEditorCommand();
|
|
1667
|
-
if (!editorCmd) {
|
|
1668
|
-
this.showWarning("No editor configured. Set $VISUAL or $EDITOR environment variable.");
|
|
1669
|
-
return;
|
|
1670
|
-
}
|
|
1671
|
-
|
|
1672
|
-
const resolvedPath = this.#resolvePlanFilePath(planFilePath);
|
|
1673
|
-
let currentText: string;
|
|
1674
|
-
try {
|
|
1675
|
-
currentText = await Bun.file(resolvedPath).text();
|
|
1676
|
-
} catch (error) {
|
|
1677
|
-
if (isEnoent(error)) {
|
|
1678
|
-
this.showError(`Plan file not found at ${planFilePath}`);
|
|
1679
|
-
return;
|
|
1680
|
-
}
|
|
1681
|
-
this.showWarning(`Failed to open external editor: ${error instanceof Error ? error.message : String(error)}`);
|
|
1682
|
-
return;
|
|
1683
|
-
}
|
|
1684
|
-
|
|
1685
|
-
let ttyHandle: fs.FileHandle | null = null;
|
|
1686
|
-
try {
|
|
1687
|
-
ttyHandle = await this.#openEditorTerminalHandle();
|
|
1688
|
-
this.ui.stop();
|
|
1689
|
-
|
|
1690
|
-
const stdio: [number | "inherit", number | "inherit", number | "inherit"] = ttyHandle
|
|
1691
|
-
? [ttyHandle.fd, ttyHandle.fd, ttyHandle.fd]
|
|
1692
|
-
: ["inherit", "inherit", "inherit"];
|
|
1693
|
-
|
|
1694
|
-
const result = await openInEditor(editorCmd, currentText, {
|
|
1695
|
-
extension: path.extname(resolvedPath) || ".md",
|
|
1696
|
-
stdio,
|
|
1697
|
-
trimTrailingNewline: false,
|
|
1698
|
-
});
|
|
1699
|
-
if (result !== null) {
|
|
1700
|
-
await Bun.write(resolvedPath, result);
|
|
1701
|
-
this.#renderPlanPreview(result);
|
|
1702
|
-
this.showStatus("Plan updated in external editor.");
|
|
1703
|
-
}
|
|
1704
|
-
} catch (error) {
|
|
1705
|
-
this.showWarning(`Failed to open external editor: ${error instanceof Error ? error.message : String(error)}`);
|
|
1706
|
-
} finally {
|
|
1707
|
-
if (ttyHandle) {
|
|
1708
|
-
await ttyHandle.close();
|
|
1709
|
-
}
|
|
1710
|
-
this.ui.start();
|
|
1711
|
-
this.ui.requestRender(true);
|
|
1712
|
-
}
|
|
1713
|
-
}
|
|
1714
|
-
|
|
1715
|
-
async #approvePlan(
|
|
1716
|
-
planContent: string,
|
|
1717
|
-
options: {
|
|
1718
|
-
planFilePath: string;
|
|
1719
|
-
finalPlanFilePath: string;
|
|
1720
|
-
title: string;
|
|
1721
|
-
preserveContext?: boolean;
|
|
1722
|
-
compactBeforeExecute?: boolean;
|
|
1723
|
-
},
|
|
1724
|
-
): Promise<void> {
|
|
1725
|
-
await renameApprovedPlanFile({
|
|
1726
|
-
planFilePath: options.planFilePath,
|
|
1727
|
-
finalPlanFilePath: options.finalPlanFilePath,
|
|
1728
|
-
getArtifactsDir: () => this.sessionManager.getArtifactsDir(),
|
|
1729
|
-
getSessionId: () => this.sessionManager.getSessionId(),
|
|
1730
|
-
});
|
|
1731
|
-
const previousTools = this.#planModePreviousTools ?? this.session.getActiveToolNames();
|
|
1732
|
-
|
|
1733
|
-
// Mark the pending abort caused by the plan-mode → compaction transition as
|
|
1734
|
-
// silent BEFORE #exitPlanMode raises it. The `finally` below clears the
|
|
1735
|
-
// flag on every terminal compaction outcome (ok / cancelled / failed /
|
|
1736
|
-
// throw) so a leaked flag cannot silence a later unrelated abort.
|
|
1737
|
-
// Branchless mark+clear when !compactBeforeExecute: mark is gated; clear
|
|
1738
|
-
// is unconditional and idempotent.
|
|
1739
|
-
if (options.compactBeforeExecute) {
|
|
1740
|
-
this.session.markPlanCompactAbortPending();
|
|
1741
|
-
}
|
|
1742
|
-
let compactOutcome: CompactionOutcome | undefined;
|
|
1743
|
-
try {
|
|
1744
|
-
await this.#exitPlanMode({ silent: true, paused: false });
|
|
1745
|
-
|
|
1746
|
-
if (!options.preserveContext) {
|
|
1747
|
-
await this.handleClearCommand();
|
|
1748
|
-
// The new session has a fresh local:// root — persist the approved plan there
|
|
1749
|
-
// so `local://<title>.md` resolves correctly in the execution session.
|
|
1750
|
-
const newLocalPath = resolveLocalUrlToPath(options.finalPlanFilePath, {
|
|
1751
|
-
getArtifactsDir: () => this.sessionManager.getArtifactsDir(),
|
|
1752
|
-
getSessionId: () => this.sessionManager.getSessionId(),
|
|
1753
|
-
});
|
|
1754
|
-
await Bun.write(newLocalPath, planContent);
|
|
1755
|
-
} else if (options.compactBeforeExecute) {
|
|
1756
|
-
// Distill the plan-mode transcript before the execution turn is queued so
|
|
1757
|
-
// the plan-approved synthetic prompt lands as a fresh cache anchor.
|
|
1758
|
-
// Outcome is consumed after tool-restoration and plan-reference-path
|
|
1759
|
-
// bookkeeping below; `markPlanReferenceSent` is intentionally deferred
|
|
1760
|
-
// past the cancel guard — see the comment at the cancel branch.
|
|
1761
|
-
// Cancellation skips the synthetic-prompt dispatch (operator's explicit
|
|
1762
|
-
// abort is honored); failure proceeds best-effort — approval intent stands.
|
|
1763
|
-
const compactionPrompt = prompt.render(planModeCompactInstructionsPrompt, {
|
|
1764
|
-
planFilePath: options.finalPlanFilePath,
|
|
1765
|
-
});
|
|
1766
|
-
// Pin the plan reference path BEFORE compaction so any user messages
|
|
1767
|
-
// queued during the compaction await (which `handleCompactCommand`
|
|
1768
|
-
// flushes via `flushCompactionQueue` before returning) see the
|
|
1769
|
-
// approved plan in `#buildPlanReferenceMessage`. Reassignment after
|
|
1770
|
-
// the try/finally is idempotent and kept for the !compactBeforeExecute
|
|
1771
|
-
// branch.
|
|
1772
|
-
this.session.setPlanReferencePath(options.finalPlanFilePath);
|
|
1773
|
-
compactOutcome = await this.handleCompactCommand(compactionPrompt);
|
|
1774
|
-
}
|
|
1775
|
-
} finally {
|
|
1776
|
-
// Unconditional clear. Idempotent: a no-op when the flag was never set
|
|
1777
|
-
// (i.e., the !compactBeforeExecute branch), and a no-op when the flag
|
|
1778
|
-
// was already consumed by AgentSession.#handleAgentEvent's aborted
|
|
1779
|
-
// message_end stamping. Guarantees the flag is dead at every exit.
|
|
1780
|
-
this.session.clearPlanCompactAbortPending();
|
|
1781
|
-
}
|
|
1782
|
-
|
|
1783
|
-
// Tool restoration runs on every path — the plan mode tools must be
|
|
1784
|
-
// retired regardless of whether the synthetic prompt fires.
|
|
1785
|
-
if (previousTools.length > 0) {
|
|
1786
|
-
await this.session.setActiveToolsByName(previousTools);
|
|
1787
|
-
}
|
|
1788
|
-
this.session.setPlanReferencePath(options.finalPlanFilePath);
|
|
1789
|
-
|
|
1790
|
-
if (compactOutcome === "cancelled") {
|
|
1791
|
-
// Explicit abort: honor it. `executeCompaction` already surfaced
|
|
1792
|
-
// `showError("Compaction cancelled")` to the operator; we add the
|
|
1793
|
-
// deferred-dispatch warning and exit. `markPlanReferenceSent` is
|
|
1794
|
-
// intentionally skipped here: `#planReferenceSent` stays false, so
|
|
1795
|
-
// `AgentSession.#buildPlanReferenceMessage` will inject the plan
|
|
1796
|
-
// reference on the operator's next `prompt()` call. If we marked it
|
|
1797
|
-
// sent here, the executor's first turn would have no plan context.
|
|
1798
|
-
this.showWarning(
|
|
1799
|
-
"Plan approved, but compaction was cancelled — execution not dispatched. Submit a turn to continue.",
|
|
1800
|
-
);
|
|
1801
|
-
return;
|
|
1802
|
-
}
|
|
1803
|
-
|
|
1804
|
-
// Approved plans land in a fresh (or compacted) session whose first user-visible
|
|
1805
|
-
// turn is the synthetic plan-approved prompt — that path bypasses the
|
|
1806
|
-
// input-controller's title generation. Seed an auto-name from the plan title
|
|
1807
|
-
// so the session is not left unnamed. `setSessionName("auto")` is a no-op
|
|
1808
|
-
// when the user has already chosen a name (preserveContext paths).
|
|
1809
|
-
const seededName = humanizePlanTitle(options.title);
|
|
1810
|
-
if (seededName && !this.sessionManager.getSessionName()) {
|
|
1811
|
-
const applied = await this.sessionManager.setSessionName(seededName, "auto");
|
|
1812
|
-
if (applied) {
|
|
1813
|
-
setSessionTerminalTitle(this.sessionManager.getSessionName(), this.sessionManager.getCwd());
|
|
1814
|
-
this.updateEditorChrome();
|
|
1815
|
-
}
|
|
1816
|
-
}
|
|
1817
|
-
|
|
1818
|
-
// markPlanReferenceSent fires only on the dispatch path so the synthetic
|
|
1819
|
-
// plan-approved prompt is the source of the reference injection.
|
|
1820
|
-
this.session.markPlanReferenceSent();
|
|
1821
|
-
const planModePrompt = prompt.render(planModeApprovedPrompt, {
|
|
1822
|
-
planContent,
|
|
1823
|
-
finalPlanFilePath: options.finalPlanFilePath,
|
|
1824
|
-
contextPreserved: options.preserveContext === true,
|
|
1825
|
-
tools: this.session.getActiveToolNames(),
|
|
1826
|
-
});
|
|
1827
|
-
await this.session.prompt(planModePrompt, { synthetic: true });
|
|
1828
|
-
}
|
|
1829
|
-
|
|
1830
|
-
async handlePlanModeCommand(initialPrompt?: string): Promise<void> {
|
|
1831
|
-
if (this.goalModeEnabled || this.goalModePaused) {
|
|
1832
|
-
this.showWarning("Exit goal mode first.");
|
|
1833
|
-
return;
|
|
1834
|
-
}
|
|
1835
|
-
if (this.planModeEnabled) {
|
|
1836
|
-
const confirmed = await this.showHookConfirm(
|
|
1837
|
-
"Exit plan mode?",
|
|
1838
|
-
"This exits plan mode without approving a plan.",
|
|
1839
|
-
);
|
|
1840
|
-
if (!confirmed) return;
|
|
1841
|
-
await this.#exitPlanMode({ paused: true });
|
|
1842
|
-
return;
|
|
1843
|
-
}
|
|
1844
|
-
if (!this.session.settings.get("plan.enabled")) {
|
|
1845
|
-
this.showWarning("Plan mode is disabled. Enable it in settings (plan.enabled).");
|
|
1846
|
-
return;
|
|
1847
|
-
}
|
|
1848
|
-
await this.#enterPlanMode();
|
|
1849
|
-
if (initialPrompt && this.onInputCallback) {
|
|
1850
|
-
this.onInputCallback(this.startPendingSubmission({ text: initialPrompt }));
|
|
1851
|
-
}
|
|
1852
|
-
}
|
|
1853
|
-
|
|
1854
|
-
async handleGoalModeCommand(rest?: string): Promise<void> {
|
|
1855
|
-
try {
|
|
1856
|
-
if (this.planModeEnabled || this.planModePaused) {
|
|
1857
|
-
this.showWarning("Exit plan mode first.");
|
|
1858
|
-
return;
|
|
1859
|
-
}
|
|
1860
|
-
if (!this.session.settings.get("goal.enabled")) {
|
|
1861
|
-
this.showWarning("Goal mode is disabled. Enable it in settings (goal.enabled).");
|
|
1862
|
-
return;
|
|
1863
|
-
}
|
|
1864
|
-
const { sub, rest: subRest } = parseGoalSubcommand(rest ?? "");
|
|
1865
|
-
if (sub) {
|
|
1866
|
-
await this.#dispatchGoalSubcommand(sub, subRest);
|
|
1867
|
-
return;
|
|
1868
|
-
}
|
|
1869
|
-
if (this.goalModeEnabled) {
|
|
1870
|
-
if (subRest) {
|
|
1871
|
-
this.showStatus("Goal mode is already active. Use /goal to manage it, or /goal drop to start over.");
|
|
1872
|
-
return;
|
|
1873
|
-
}
|
|
1874
|
-
await this.#openGoalMenu("active");
|
|
1875
|
-
return;
|
|
1876
|
-
}
|
|
1877
|
-
const pausedState = this.#getPausedGoalState();
|
|
1878
|
-
if (pausedState) {
|
|
1879
|
-
if (subRest) {
|
|
1880
|
-
this.showWarning("Resume the current goal first, or drop it before setting a new objective.");
|
|
1881
|
-
return;
|
|
1882
|
-
}
|
|
1883
|
-
await this.#openGoalMenu("paused");
|
|
1884
|
-
return;
|
|
1885
|
-
}
|
|
1886
|
-
if (subRest) {
|
|
1887
|
-
await this.#startGoalFromObjective(subRest);
|
|
1888
|
-
return;
|
|
1889
|
-
}
|
|
1890
|
-
const objective = (
|
|
1891
|
-
await this.showHookEditor("Goal objective", undefined, undefined, { promptStyle: true })
|
|
1892
|
-
)?.trim();
|
|
1893
|
-
if (!objective) return;
|
|
1894
|
-
await this.#startGoalFromObjective(objective);
|
|
1895
|
-
} catch (error) {
|
|
1896
|
-
this.showError(error instanceof Error ? error.message : String(error));
|
|
1897
|
-
}
|
|
1898
|
-
}
|
|
1899
|
-
|
|
1900
|
-
async #dispatchGoalSubcommand(sub: GoalSubcommand, rest: string): Promise<void> {
|
|
1901
|
-
switch (sub) {
|
|
1902
|
-
case "set":
|
|
1903
|
-
await this.#handleGoalSetSubcommand(rest);
|
|
1904
|
-
return;
|
|
1905
|
-
case "show":
|
|
1906
|
-
this.#showGoalDetails();
|
|
1907
|
-
return;
|
|
1908
|
-
case "pause":
|
|
1909
|
-
await this.#pauseGoalAction();
|
|
1910
|
-
return;
|
|
1911
|
-
case "resume":
|
|
1912
|
-
await this.#resumeGoalAction();
|
|
1913
|
-
return;
|
|
1914
|
-
case "drop":
|
|
1915
|
-
await this.#confirmAndDropGoal();
|
|
1916
|
-
return;
|
|
1917
|
-
}
|
|
1918
|
-
}
|
|
1919
|
-
|
|
1920
|
-
async #openGoalMenu(state: "active" | "paused"): Promise<void> {
|
|
1921
|
-
const goal = this.session.getGoalModeState()?.goal;
|
|
1922
|
-
if (!goal) return;
|
|
1923
|
-
const summary = goal.objective.length > 48 ? `${goal.objective.slice(0, 47)}…` : goal.objective;
|
|
1924
|
-
const title = state === "active" ? `Goal: ${summary} (${goal.status})` : `Goal paused: ${summary}`;
|
|
1925
|
-
const items = state === "active" ? ["Show details", "Pause", "Drop"] : ["Resume", "Show details", "Drop"];
|
|
1926
|
-
const choice = await this.showHookSelector(title, items);
|
|
1927
|
-
if (!choice) return;
|
|
1928
|
-
switch (choice) {
|
|
1929
|
-
case "Show details":
|
|
1930
|
-
this.#showGoalDetails();
|
|
1931
|
-
return;
|
|
1932
|
-
case "Pause":
|
|
1933
|
-
await this.#pauseGoalAction();
|
|
1934
|
-
return;
|
|
1935
|
-
case "Resume":
|
|
1936
|
-
await this.#resumeGoalAction();
|
|
1937
|
-
return;
|
|
1938
|
-
case "Drop":
|
|
1939
|
-
await this.#confirmAndDropGoal();
|
|
1940
|
-
return;
|
|
1941
|
-
}
|
|
1942
|
-
}
|
|
1943
|
-
|
|
1944
|
-
#showGoalDetails(): void {
|
|
1945
|
-
const state = this.session.getGoalModeState();
|
|
1946
|
-
const goal = state?.goal;
|
|
1947
|
-
if (!goal) {
|
|
1948
|
-
this.showStatus("No goal set.");
|
|
1949
|
-
return;
|
|
1950
|
-
}
|
|
1951
|
-
const used = goal.tokensUsed.toLocaleString();
|
|
1952
|
-
const lines = [
|
|
1953
|
-
`Objective: ${goal.objective}`,
|
|
1954
|
-
`Status: ${goal.status}${state?.enabled ? "" : " (paused)"}`,
|
|
1955
|
-
`Tokens used: ${used}`,
|
|
1956
|
-
`Time spent: ${formatDuration(goal.timeUsedSeconds * 1000)}`,
|
|
1957
|
-
];
|
|
1958
|
-
this.showStatus(lines.join("\n"));
|
|
1959
|
-
}
|
|
1960
|
-
|
|
1961
|
-
async #pauseGoalAction(): Promise<void> {
|
|
1962
|
-
if (!this.goalModeEnabled) {
|
|
1963
|
-
this.showWarning("No active goal to pause.");
|
|
1964
|
-
return;
|
|
1965
|
-
}
|
|
1966
|
-
await this.session.goalRuntime.pauseGoal();
|
|
1967
|
-
await this.#exitGoalMode({ paused: true, reason: "paused" });
|
|
1968
|
-
}
|
|
1969
|
-
|
|
1970
|
-
async #resumeGoalAction(): Promise<void> {
|
|
1971
|
-
if (!this.#getPausedGoalState()) {
|
|
1972
|
-
this.showWarning("No paused goal to resume.");
|
|
1973
|
-
return;
|
|
1974
|
-
}
|
|
1975
|
-
await this.#enterGoalMode({ resume: true, silent: true });
|
|
1976
|
-
this.showStatus("Goal mode resumed.");
|
|
1977
|
-
this.#scheduleGoalContinuation();
|
|
1978
|
-
}
|
|
1979
|
-
|
|
1980
|
-
async #confirmAndDropGoal(): Promise<void> {
|
|
1981
|
-
if (!this.goalModeEnabled && !this.#getPausedGoalState()) {
|
|
1982
|
-
this.showWarning("No goal to drop.");
|
|
1983
|
-
return;
|
|
1984
|
-
}
|
|
1985
|
-
const confirmed = await this.showHookConfirm(
|
|
1986
|
-
"Drop goal?",
|
|
1987
|
-
"This removes the goal record. Accumulated usage stays in the session log.",
|
|
1988
|
-
);
|
|
1989
|
-
if (!confirmed) return;
|
|
1990
|
-
await this.session.goalRuntime.dropGoal();
|
|
1991
|
-
await this.#exitGoalMode({ reason: "dropped" });
|
|
1992
|
-
}
|
|
1993
|
-
|
|
1994
|
-
async #startGoalFromObjective(objective: string): Promise<void> {
|
|
1995
|
-
await this.#enterGoalMode({ objective, silent: true });
|
|
1996
|
-
this.#resetGoalContinuationSuppression();
|
|
1997
|
-
if (this.onInputCallback) {
|
|
1998
|
-
this.onInputCallback(this.startPendingSubmission({ text: objective }));
|
|
1999
|
-
}
|
|
2000
|
-
}
|
|
2001
|
-
|
|
2002
|
-
async #replaceGoalFromObjective(objective: string): Promise<void> {
|
|
2003
|
-
const state = await this.session.goalRuntime.replaceGoal({ objective });
|
|
2004
|
-
this.session.setGoalModeState(state);
|
|
2005
|
-
this.goalModeEnabled = true;
|
|
2006
|
-
this.goalModePaused = false;
|
|
2007
|
-
this.#resetGoalContinuationSuppression();
|
|
2008
|
-
this.#updateGoalModeStatus();
|
|
2009
|
-
if (this.session.isStreaming) {
|
|
2010
|
-
await this.session.sendGoalModeContext({ deliverAs: "steer" });
|
|
2011
|
-
}
|
|
2012
|
-
if (this.onInputCallback) {
|
|
2013
|
-
this.onInputCallback(this.startPendingSubmission({ text: objective }));
|
|
2014
|
-
}
|
|
2015
|
-
}
|
|
2016
|
-
|
|
2017
|
-
async #handleGoalSetSubcommand(rest: string): Promise<void> {
|
|
2018
|
-
if (!this.goalModeEnabled && this.#getPausedGoalState()) {
|
|
2019
|
-
this.showWarning("Resume the current goal first, or drop it before setting a new objective.");
|
|
2020
|
-
return;
|
|
2021
|
-
}
|
|
2022
|
-
const objective = rest.trim()
|
|
2023
|
-
? rest.trim()
|
|
2024
|
-
: (await this.showHookEditor("Goal objective", undefined, undefined, { promptStyle: true }))?.trim();
|
|
2025
|
-
if (!objective) return;
|
|
2026
|
-
if (this.goalModeEnabled) {
|
|
2027
|
-
await this.#replaceGoalFromObjective(objective);
|
|
2028
|
-
return;
|
|
2029
|
-
}
|
|
2030
|
-
await this.#startGoalFromObjective(objective);
|
|
2031
|
-
}
|
|
2032
|
-
|
|
2033
|
-
async handlePlanApproval(details: PlanApprovalDetails): Promise<void> {
|
|
2034
|
-
if (!this.planModeEnabled) {
|
|
2035
|
-
this.showWarning("Plan mode is not active.");
|
|
2036
|
-
return;
|
|
2037
|
-
}
|
|
2038
|
-
|
|
2039
|
-
// Abort the agent to prevent it from continuing (e.g., re-submitting the
|
|
2040
|
-
// plan) while the popup is showing. The event listener fires asynchronously
|
|
2041
|
-
// (agent's #emit is fire-and-forget), so without this the model sees
|
|
2042
|
-
// "Plan ready for approval." and immediately re-invokes `resolve` in a loop.
|
|
2043
|
-
await this.session.abort({ timeoutMs: INTERACTIVE_ABORT_CLEANUP_TIMEOUT_MS });
|
|
2044
|
-
|
|
2045
|
-
const planFilePath = details.planFilePath || this.planModePlanFilePath || (await this.#getPlanFilePath());
|
|
2046
|
-
this.planModePlanFilePath = planFilePath;
|
|
2047
|
-
const planContent = await this.#readPlanFile(planFilePath);
|
|
2048
|
-
if (!planContent) {
|
|
2049
|
-
this.showError(`Plan file not found at ${planFilePath}`);
|
|
2050
|
-
return;
|
|
2051
|
-
}
|
|
2052
|
-
|
|
2053
|
-
this.#renderPlanPreview(planContent, { append: true });
|
|
2054
|
-
const choice = await this.showHookSelector(
|
|
2055
|
-
"Plan mode - next step",
|
|
2056
|
-
["Approve and execute", "Approve and compact context", "Approve and keep context", "Refine plan"],
|
|
2057
|
-
{
|
|
2058
|
-
helpText: this.#getPlanReviewHelpText(),
|
|
2059
|
-
onExternalEditor: () => void this.#openPlanInExternalEditor(planFilePath),
|
|
2060
|
-
},
|
|
2061
|
-
);
|
|
2062
|
-
|
|
2063
|
-
if (
|
|
2064
|
-
choice === "Approve and execute" ||
|
|
2065
|
-
choice === "Approve and compact context" ||
|
|
2066
|
-
choice === "Approve and keep context"
|
|
2067
|
-
) {
|
|
2068
|
-
const finalPlanFilePath = details.finalPlanFilePath || planFilePath;
|
|
2069
|
-
try {
|
|
2070
|
-
const latestPlanContent = await this.#readPlanFile(planFilePath);
|
|
2071
|
-
if (!latestPlanContent) {
|
|
2072
|
-
this.showError(`Plan file not found at ${planFilePath}`);
|
|
2073
|
-
return;
|
|
2074
|
-
}
|
|
2075
|
-
await this.#approvePlan(latestPlanContent, {
|
|
2076
|
-
planFilePath,
|
|
2077
|
-
finalPlanFilePath,
|
|
2078
|
-
title: details.title,
|
|
2079
|
-
preserveContext: choice !== "Approve and execute",
|
|
2080
|
-
compactBeforeExecute: choice === "Approve and compact context",
|
|
2081
|
-
});
|
|
2082
|
-
} catch (error) {
|
|
2083
|
-
this.showError(
|
|
2084
|
-
`Failed to finalize approved plan: ${error instanceof Error ? error.message : String(error)}`,
|
|
2085
|
-
);
|
|
2086
|
-
}
|
|
2087
|
-
return;
|
|
2088
|
-
}
|
|
1268
|
+
if (await this.#goalModeController.restoreFromSession(sessionContext)) return;
|
|
1269
|
+
await this.#planModeController.restoreFromSession(sessionContext);
|
|
2089
1270
|
}
|
|
2090
1271
|
|
|
2091
1272
|
stop(): void {
|
|
2092
1273
|
this.#petProtocolUnsubscribe?.();
|
|
2093
1274
|
this.#petProtocolUnsubscribe = undefined;
|
|
1275
|
+
this.#petUnavailableWarningDisposer?.();
|
|
1276
|
+
this.#petUnavailableWarningDisposer = undefined;
|
|
2094
1277
|
this.petWidget?.dispose();
|
|
2095
1278
|
this.petWidget = undefined;
|
|
2096
1279
|
if (this.loadingAnimation) {
|
|
@@ -2099,18 +1282,18 @@ export class InteractiveMode implements InteractiveModeContext {
|
|
|
2099
1282
|
}
|
|
2100
1283
|
this.#welcomeComponent?.dispose();
|
|
2101
1284
|
this.#welcomeComponent = undefined;
|
|
2102
|
-
this.#cleanupMicAnimation();
|
|
2103
|
-
this.#cancelGoalContinuation();
|
|
2104
1285
|
if (this.#sttController) {
|
|
2105
|
-
this.#sttController.dispose();
|
|
1286
|
+
this.#sttController.dispose(this);
|
|
2106
1287
|
this.#sttController = undefined;
|
|
2107
1288
|
}
|
|
1289
|
+
this.#goalModeController.cancelContinuation();
|
|
2108
1290
|
this.#extensionUiController.clearExtensionTerminalInputListeners();
|
|
2109
1291
|
this.#extensionUiController.clearHookWidgets();
|
|
2110
1292
|
for (const unsubscribe of this.#eventBusUnsubscribers) {
|
|
2111
1293
|
unsubscribe();
|
|
2112
1294
|
}
|
|
2113
1295
|
this.#eventBusUnsubscribers = [];
|
|
1296
|
+
this.#tasksAggregator?.dispose();
|
|
2114
1297
|
this.#observerRegistry.dispose();
|
|
2115
1298
|
this.#eventController.dispose();
|
|
2116
1299
|
this.statusLine.dispose();
|
|
@@ -2154,6 +1337,7 @@ export class InteractiveMode implements InteractiveModeContext {
|
|
|
2154
1337
|
this.#btwController.dispose();
|
|
2155
1338
|
|
|
2156
1339
|
// Emit shutdown event to hooks
|
|
1340
|
+
this.session.setSdkPlanModeHandler(null);
|
|
2157
1341
|
await this.session.dispose();
|
|
2158
1342
|
|
|
2159
1343
|
if (this.isInitialized) {
|
|
@@ -2224,7 +1408,7 @@ export class InteractiveMode implements InteractiveModeContext {
|
|
|
2224
1408
|
nextEditor.setText(previousText);
|
|
2225
1409
|
previousEditor.dispose();
|
|
2226
1410
|
|
|
2227
|
-
const petMode =
|
|
1411
|
+
const petMode = settings.get("pet.mode");
|
|
2228
1412
|
this.petWidget?.dispose();
|
|
2229
1413
|
|
|
2230
1414
|
this.editorContainer.clear();
|
|
@@ -2371,8 +1555,8 @@ export class InteractiveMode implements InteractiveModeContext {
|
|
|
2371
1555
|
this.#uiHelpers.updatePendingMessagesDisplay();
|
|
2372
1556
|
}
|
|
2373
1557
|
|
|
2374
|
-
queueCompactionMessage(text: string, mode: "steer" | "followUp"): void {
|
|
2375
|
-
this.#uiHelpers.queueCompactionMessage(text, mode);
|
|
1558
|
+
queueCompactionMessage(text: string, mode: "steer" | "followUp", options?: ComposerSubmissionOptions): void {
|
|
1559
|
+
this.#uiHelpers.queueCompactionMessage(text, mode, options);
|
|
2376
1560
|
}
|
|
2377
1561
|
|
|
2378
1562
|
flushCompactionQueue(options?: { willRetry?: boolean }): Promise<void> {
|
|
@@ -2494,15 +1678,18 @@ export class InteractiveMode implements InteractiveModeContext {
|
|
|
2494
1678
|
this.#commandController.handleContextCommand();
|
|
2495
1679
|
}
|
|
2496
1680
|
|
|
2497
|
-
#prepareSessionSwitch(): void {
|
|
1681
|
+
#prepareSessionSwitch(cleanupPreviousSessionUi?: () => void): void {
|
|
2498
1682
|
this.#btwController.dispose();
|
|
2499
|
-
|
|
2500
|
-
this.#
|
|
1683
|
+
if (cleanupPreviousSessionUi) cleanupPreviousSessionUi();
|
|
1684
|
+
else this.#extensionUiController.clearExtensionTerminalInputListeners();
|
|
1685
|
+
this.#planModeController.clearReview();
|
|
2501
1686
|
}
|
|
2502
1687
|
|
|
2503
|
-
handleClearCommand(): Promise<
|
|
2504
|
-
this.#
|
|
2505
|
-
|
|
1688
|
+
async handleClearCommand(): Promise<boolean> {
|
|
1689
|
+
const cleanupPreviousSessionUi = this.#extensionUiController.captureSessionUiCleanup();
|
|
1690
|
+
const switched = await this.#commandController.handleClearCommand();
|
|
1691
|
+
if (switched) this.#prepareSessionSwitch(cleanupPreviousSessionUi);
|
|
1692
|
+
return switched;
|
|
2506
1693
|
}
|
|
2507
1694
|
|
|
2508
1695
|
handleContextClearCommand(): Promise<void> {
|
|
@@ -2510,9 +1697,11 @@ export class InteractiveMode implements InteractiveModeContext {
|
|
|
2510
1697
|
return this.#commandController.handleContextClearCommand();
|
|
2511
1698
|
}
|
|
2512
1699
|
|
|
2513
|
-
handleDropCommand(): Promise<
|
|
2514
|
-
this.#
|
|
2515
|
-
|
|
1700
|
+
async handleDropCommand(): Promise<boolean> {
|
|
1701
|
+
const cleanupPreviousSessionUi = this.#extensionUiController.captureSessionUiCleanup();
|
|
1702
|
+
const switched = await this.#commandController.handleDropCommand();
|
|
1703
|
+
if (switched) this.#prepareSessionSwitch(cleanupPreviousSessionUi);
|
|
1704
|
+
return switched;
|
|
2516
1705
|
}
|
|
2517
1706
|
|
|
2518
1707
|
handleForkCommand(): Promise<void> {
|
|
@@ -2537,75 +1726,8 @@ export class InteractiveMode implements InteractiveModeContext {
|
|
|
2537
1726
|
this.showWarning("Speech-to-text is disabled. Enable it in settings: stt.enabled");
|
|
2538
1727
|
return;
|
|
2539
1728
|
}
|
|
2540
|
-
|
|
2541
|
-
|
|
2542
|
-
}
|
|
2543
|
-
await this.#sttController.toggle(this.editor, {
|
|
2544
|
-
showWarning: (msg: string) => this.showWarning(msg),
|
|
2545
|
-
showStatus: (msg: string) => this.showStatus(msg),
|
|
2546
|
-
onStateChange: (state: SttState) => {
|
|
2547
|
-
if (state === "recording") {
|
|
2548
|
-
this.#voicePreviousShowHardwareCursor = this.ui.getShowHardwareCursor();
|
|
2549
|
-
this.#voicePreviousUseTerminalCursor = this.editor.getUseTerminalCursor();
|
|
2550
|
-
this.ui.setShowHardwareCursor(false);
|
|
2551
|
-
this.editor.setUseTerminalCursor(false);
|
|
2552
|
-
this.#startMicAnimation();
|
|
2553
|
-
} else if (state === "transcribing") {
|
|
2554
|
-
this.#stopMicAnimation();
|
|
2555
|
-
this.#setMicCursor({ r: 200, g: 200, b: 200 });
|
|
2556
|
-
} else {
|
|
2557
|
-
this.#cleanupMicAnimation();
|
|
2558
|
-
}
|
|
2559
|
-
this.updateEditorChrome();
|
|
2560
|
-
this.ui.requestRender();
|
|
2561
|
-
},
|
|
2562
|
-
});
|
|
2563
|
-
}
|
|
2564
|
-
|
|
2565
|
-
#setMicCursor(color: { r: number; g: number; b: number }): void {
|
|
2566
|
-
this.editor.cursorOverride = `\x1b[38;2;${color.r};${color.g};${color.b}m${theme.icon.mic}\x1b[0m`;
|
|
2567
|
-
// Theme symbols can be wide (for example, 🎤), so measure the rendered override.
|
|
2568
|
-
this.editor.cursorOverrideWidth = visibleWidth(this.editor.cursorOverride);
|
|
2569
|
-
}
|
|
2570
|
-
|
|
2571
|
-
#updateMicIcon(): void {
|
|
2572
|
-
const { r, g, b } = hsvToRgb({ h: this.#voiceHue, s: 0.9, v: 1.0 });
|
|
2573
|
-
this.#setMicCursor({ r, g, b });
|
|
2574
|
-
}
|
|
2575
|
-
|
|
2576
|
-
#startMicAnimation(): void {
|
|
2577
|
-
if (this.#voiceAnimationInterval) return;
|
|
2578
|
-
this.#voiceHue = 0;
|
|
2579
|
-
this.#updateMicIcon();
|
|
2580
|
-
this.#voiceAnimationInterval = setInterval(() => {
|
|
2581
|
-
this.#voiceHue = (this.#voiceHue + 8) % 360;
|
|
2582
|
-
this.#updateMicIcon();
|
|
2583
|
-
this.ui.requestRender();
|
|
2584
|
-
}, 60);
|
|
2585
|
-
}
|
|
2586
|
-
|
|
2587
|
-
#stopMicAnimation(): void {
|
|
2588
|
-
if (this.#voiceAnimationInterval) {
|
|
2589
|
-
clearInterval(this.#voiceAnimationInterval);
|
|
2590
|
-
this.#voiceAnimationInterval = undefined;
|
|
2591
|
-
}
|
|
2592
|
-
}
|
|
2593
|
-
|
|
2594
|
-
#cleanupMicAnimation(): void {
|
|
2595
|
-
if (this.#voiceAnimationInterval) {
|
|
2596
|
-
clearInterval(this.#voiceAnimationInterval);
|
|
2597
|
-
this.#voiceAnimationInterval = undefined;
|
|
2598
|
-
}
|
|
2599
|
-
this.editor.cursorOverride = undefined;
|
|
2600
|
-
this.editor.cursorOverrideWidth = undefined;
|
|
2601
|
-
if (this.#voicePreviousShowHardwareCursor !== null) {
|
|
2602
|
-
this.ui.setShowHardwareCursor(this.#voicePreviousShowHardwareCursor);
|
|
2603
|
-
this.#voicePreviousShowHardwareCursor = null;
|
|
2604
|
-
}
|
|
2605
|
-
if (this.#voicePreviousUseTerminalCursor !== null) {
|
|
2606
|
-
this.editor.setUseTerminalCursor(this.#voicePreviousUseTerminalCursor);
|
|
2607
|
-
this.#voicePreviousUseTerminalCursor = null;
|
|
2608
|
-
}
|
|
1729
|
+
this.#sttController ??= new SttModeController();
|
|
1730
|
+
await this.#sttController.toggle(this);
|
|
2609
1731
|
}
|
|
2610
1732
|
|
|
2611
1733
|
showDebugSelector(): void {
|
|
@@ -2621,6 +1743,114 @@ export class InteractiveMode implements InteractiveModeContext {
|
|
|
2621
1743
|
this.#selectorController.showSessionObserver(this.#observerRegistry);
|
|
2622
1744
|
}
|
|
2623
1745
|
|
|
1746
|
+
showSessionsDashboard(): void {
|
|
1747
|
+
void this.#selectorController.showSessionsDashboard();
|
|
1748
|
+
}
|
|
1749
|
+
|
|
1750
|
+
isTranscriptViewerOpen(): boolean {
|
|
1751
|
+
return this.#selectorController.isTranscriptViewerOpen();
|
|
1752
|
+
}
|
|
1753
|
+
refreshTranscriptViewer(): void {
|
|
1754
|
+
if (!this.isTranscriptViewerOpen()) return;
|
|
1755
|
+
const identityMap = this.#rebuildTranscriptRegistry();
|
|
1756
|
+
this.#selectorController.refreshTranscriptViewer(identityMap);
|
|
1757
|
+
}
|
|
1758
|
+
showTranscriptViewer(): void {
|
|
1759
|
+
this.#rebuildTranscriptRegistry();
|
|
1760
|
+
this.#selectorController.showTranscriptViewer(this.#transcriptRegistry);
|
|
1761
|
+
}
|
|
1762
|
+
#rebuildTranscriptRegistry(): ReadonlyMap<string, string> {
|
|
1763
|
+
const toolResults = new Map<string, Extract<AgentMessage, { role: "toolResult" }>>();
|
|
1764
|
+
for (const message of this.session.messages) {
|
|
1765
|
+
if (message.role === "toolResult") toolResults.set(message.toolCallId, message);
|
|
1766
|
+
}
|
|
1767
|
+
const items: RegisterTranscriptItem[] = [];
|
|
1768
|
+
const identityMap = new Map<string, string>();
|
|
1769
|
+
for (const [messageIndex, message] of this.session.messages.entries()) {
|
|
1770
|
+
const provisionalEntryId = transcriptItemId.stream(this.session.transcriptPromptGeneration, messageIndex);
|
|
1771
|
+
const durableEntryId = getSessionMessageEntryId(message);
|
|
1772
|
+
const entryId = durableEntryId ?? provisionalEntryId;
|
|
1773
|
+
if (durableEntryId) {
|
|
1774
|
+
if (message.role === "user" || message.role === "developer") {
|
|
1775
|
+
identityMap.set(transcriptItemId.entry(provisionalEntryId), transcriptItemId.entry(durableEntryId));
|
|
1776
|
+
} else if (message.role === "assistant") {
|
|
1777
|
+
for (const [contentIndex] of message.content.entries()) {
|
|
1778
|
+
identityMap.set(
|
|
1779
|
+
transcriptItemId.assistantContent(provisionalEntryId, contentIndex),
|
|
1780
|
+
transcriptItemId.assistantContent(durableEntryId, contentIndex),
|
|
1781
|
+
);
|
|
1782
|
+
}
|
|
1783
|
+
}
|
|
1784
|
+
}
|
|
1785
|
+
if (message.role === "user" || message.role === "developer") {
|
|
1786
|
+
const text =
|
|
1787
|
+
typeof message.content === "string"
|
|
1788
|
+
? message.content
|
|
1789
|
+
: message.content
|
|
1790
|
+
.filter(part => part.type === "text")
|
|
1791
|
+
.map(part => part.text)
|
|
1792
|
+
.join("\n");
|
|
1793
|
+
if (text.trim())
|
|
1794
|
+
items.push({
|
|
1795
|
+
kind: "user",
|
|
1796
|
+
source: { entryId, message },
|
|
1797
|
+
getPayload: () => ({ text, metadata: { role: message.role }, source: message }),
|
|
1798
|
+
});
|
|
1799
|
+
continue;
|
|
1800
|
+
}
|
|
1801
|
+
if (message.role !== "assistant") continue;
|
|
1802
|
+
for (const [contentIndex, content] of message.content.entries()) {
|
|
1803
|
+
if (content.type === "thinking" && content.thinking.trim())
|
|
1804
|
+
items.push({
|
|
1805
|
+
kind: "assistant-thinking",
|
|
1806
|
+
source: { entryId, contentIndex, content },
|
|
1807
|
+
getPayload: () => ({ text: content.thinking, metadata: { entryId, contentIndex }, source: content }),
|
|
1808
|
+
});
|
|
1809
|
+
if (content.type === "text" && content.text.trim())
|
|
1810
|
+
items.push({
|
|
1811
|
+
kind: "assistant-text",
|
|
1812
|
+
source: { entryId, contentIndex, content },
|
|
1813
|
+
getPayload: () => ({ text: content.text, metadata: { entryId, contentIndex }, source: content }),
|
|
1814
|
+
});
|
|
1815
|
+
if (content.type === "toolCall") {
|
|
1816
|
+
const result = toolResults.get(content.id);
|
|
1817
|
+
const resultText =
|
|
1818
|
+
result?.content
|
|
1819
|
+
.filter(part => part.type === "text")
|
|
1820
|
+
.map(part => part.text)
|
|
1821
|
+
.join("\n")
|
|
1822
|
+
.trim() ?? "";
|
|
1823
|
+
items.push({
|
|
1824
|
+
kind: "tool",
|
|
1825
|
+
source: { toolCallId: content.id, content, result },
|
|
1826
|
+
getPayload: () => ({
|
|
1827
|
+
text: composeToolText({
|
|
1828
|
+
name: content.name,
|
|
1829
|
+
args: content.arguments,
|
|
1830
|
+
intent: content.intent,
|
|
1831
|
+
resultText,
|
|
1832
|
+
isError: result?.isError ?? false,
|
|
1833
|
+
hasResult: toolResults.has(content.id),
|
|
1834
|
+
}),
|
|
1835
|
+
metadata: {
|
|
1836
|
+
name: content.name,
|
|
1837
|
+
arguments: content.arguments,
|
|
1838
|
+
intent: content.intent,
|
|
1839
|
+
isError: result?.isError ?? false,
|
|
1840
|
+
resultText,
|
|
1841
|
+
hasResult: toolResults.has(content.id),
|
|
1842
|
+
detailsData: result?.details,
|
|
1843
|
+
},
|
|
1844
|
+
source: { content, result },
|
|
1845
|
+
}),
|
|
1846
|
+
});
|
|
1847
|
+
}
|
|
1848
|
+
}
|
|
1849
|
+
}
|
|
1850
|
+
this.#transcriptRegistry.rebuild(items);
|
|
1851
|
+
return identityMap;
|
|
1852
|
+
}
|
|
1853
|
+
|
|
2624
1854
|
showJobsOverlay(): void {
|
|
2625
1855
|
if (!this.#jobsObserver) {
|
|
2626
1856
|
this.showStatus("Background jobs are unavailable in this session");
|
|
@@ -2629,6 +1859,14 @@ export class InteractiveMode implements InteractiveModeContext {
|
|
|
2629
1859
|
this.#selectorController.showJobsOverlay(this.#jobsObserver);
|
|
2630
1860
|
}
|
|
2631
1861
|
|
|
1862
|
+
showTasksPane(): void {
|
|
1863
|
+
if (!this.#tasksAggregator) {
|
|
1864
|
+
this.showStatus("Tasks are unavailable in this session");
|
|
1865
|
+
return;
|
|
1866
|
+
}
|
|
1867
|
+
this.#selectorController.showTasksPane(this.#tasksAggregator);
|
|
1868
|
+
}
|
|
1869
|
+
|
|
2632
1870
|
resetObserverRegistry(): void {
|
|
2633
1871
|
this.#observerRegistry.resetSessions();
|
|
2634
1872
|
this.#observerRegistry.setMainSession(this.sessionManager.getSessionFile() ?? undefined);
|
|
@@ -2675,6 +1913,14 @@ export class InteractiveMode implements InteractiveModeContext {
|
|
|
2675
1913
|
}
|
|
2676
1914
|
|
|
2677
1915
|
// Selector handling
|
|
1916
|
+
showCommandPalette(
|
|
1917
|
+
commands: SlashCommand[],
|
|
1918
|
+
actions: CommandPaletteAction[],
|
|
1919
|
+
executeSlashCommand: (name: string) => Promise<void>,
|
|
1920
|
+
): void {
|
|
1921
|
+
this.#selectorController.showCommandPalette(commands, actions, executeSlashCommand);
|
|
1922
|
+
}
|
|
1923
|
+
|
|
2678
1924
|
showSettingsSelector(): void {
|
|
2679
1925
|
this.#selectorController.showSettingsSelector();
|
|
2680
1926
|
}
|