@sayknow-cli/coding-agent 0.3.16 → 0.4.0

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.
Files changed (1474) hide show
  1. package/CHANGELOG.md +52 -0
  2. package/package.json +127 -110
  3. package/scripts/build-sdk-package-smoke.ts +132 -0
  4. package/scripts/capture-notifications-settings-showcase.ts +435 -0
  5. package/scripts/compile-args.ts +5 -2
  6. package/scripts/g005-daemon-smoke.ts +4 -5
  7. package/scripts/g011-daemon-path-smoke.ts +5 -5
  8. package/scripts/generate-hotkeys-docs.ts +74 -0
  9. package/scripts/generate-sdk-adapter-parity-manifest.ts +163 -0
  10. package/scripts/generate-sdk-operation-inventory.ts +914 -0
  11. package/scripts/generate-telegram-baseline-manifest.ts +128 -0
  12. package/scripts/manifest-schema.ts +124 -0
  13. package/scripts/run-test-manifest.ts +153 -0
  14. package/scripts/run-threat-model-check.ts +217 -0
  15. package/scripts/verify-skc-sdk-canonicalization.ts +3647 -0
  16. package/scripts/verify-skc-sdk-rename.ts +90 -0
  17. package/src/append-only-mode.ts +1 -1
  18. package/src/async/job-manager.ts +455 -69
  19. package/src/cli/args.ts +43 -12
  20. package/src/cli/auth-gateway-cli.ts +2 -2
  21. package/src/cli/config-cli.ts +77 -3
  22. package/src/cli/daemon-cli.ts +63 -14
  23. package/src/cli/launch-disposition.ts +42 -0
  24. package/src/cli/list-models.ts +1 -1
  25. package/src/cli/notify-cli.ts +373 -283
  26. package/src/cli/session-picker.ts +20 -3
  27. package/src/cli/setup-cli.ts +1 -1
  28. package/src/cli/worktree-cli.ts +9 -287
  29. package/src/cli.ts +31 -11
  30. package/src/commands/config.ts +1 -1
  31. package/src/commands/daemon.ts +50 -6
  32. package/src/commands/gc.ts +11 -1
  33. package/src/commands/harness.ts +127 -142
  34. package/src/commands/launch.ts +11 -6
  35. package/src/commands/mcp-serve.ts +97 -13
  36. package/src/commands/mcp.ts +2 -2
  37. package/src/commands/notify.ts +44 -7
  38. package/src/commands/sdk.ts +453 -0
  39. package/src/commands/ultragoal.ts +4 -1
  40. package/src/commands/worktree.ts +10 -53
  41. package/src/commit/agentic/agent.ts +1 -0
  42. package/src/config/atomic-yaml-patch.ts +490 -0
  43. package/src/config/file-lock.ts +105 -43
  44. package/src/config/keybindings.ts +64 -20
  45. package/src/config/model-auth.ts +9 -0
  46. package/src/config/model-bindings-applier.ts +139 -0
  47. package/src/config/model-discovery-manager.ts +224 -0
  48. package/src/config/model-equivalence.ts +66 -0
  49. package/src/config/model-profile-activation.ts +233 -86
  50. package/src/config/model-profiles.ts +52 -49
  51. package/src/config/model-registry.ts +5 -4
  52. package/src/config/model-resolver.ts +487 -410
  53. package/src/config/model-selector-value.ts +50 -0
  54. package/src/config/models-config-schema.ts +17 -23
  55. package/src/config/settings-schema.ts +372 -21
  56. package/src/config/settings.ts +1120 -182
  57. package/src/coordinator-mcp/model-preset.ts +74 -20
  58. package/src/coordinator-mcp/policy.ts +76 -11
  59. package/src/coordinator-mcp/question-gate-codec.ts +274 -0
  60. package/src/coordinator-mcp/question-state.ts +778 -0
  61. package/src/coordinator-mcp/server.ts +3120 -3111
  62. package/src/daemon/builtin.ts +8 -5
  63. package/src/daemon/control-types.ts +1 -1
  64. package/src/daemon/runtime.ts +2 -2
  65. package/src/debug/index.ts +1 -1
  66. package/src/defaults/skc/skills/team/SKILL.md +27 -13
  67. package/src/defaults/skc/skills/ultragoal/SKILL.md +0 -2
  68. package/src/discovery/helpers.ts +1 -50
  69. package/src/discovery/mcp-json.ts +327 -20
  70. package/src/edit/index.ts +64 -0
  71. package/src/eval/js/shared/runtime.ts +1 -1
  72. package/src/eval/py/env.ts +26 -0
  73. package/src/eval/py/index.ts +2 -2
  74. package/src/eval/py/kernel.ts +5 -3
  75. package/src/export/html/template.generated.ts +1 -1
  76. package/src/export/html/template.js +52 -18
  77. package/src/extensibility/custom-tools/types.ts +1 -1
  78. package/src/extensibility/extensions/compact-handler.ts +3 -3
  79. package/src/extensibility/extensions/get-commands-handler.ts +2 -2
  80. package/src/extensibility/extensions/loader.ts +77 -5
  81. package/src/extensibility/extensions/runner.ts +124 -7
  82. package/src/extensibility/extensions/types.ts +215 -18
  83. package/src/extensibility/hooks/runner.ts +2 -2
  84. package/src/extensibility/hooks/types.ts +1 -1
  85. package/src/extensibility/plugins/marketplace/manager.ts +94 -10
  86. package/src/extensibility/runtime-skill-discovery.ts +33 -13
  87. package/src/extensibility/shared-events.ts +2 -0
  88. package/src/extensibility/skc-plugins/installer.ts +16 -16
  89. package/src/extensibility/slash-commands.ts +3 -3
  90. package/src/goals/continuation-timeout-guard.ts +79 -0
  91. package/src/goals/runtime.ts +7 -5
  92. package/src/goals/state.ts +18 -0
  93. package/src/harness-control-plane/lifecycle-reconciliation.ts +64 -0
  94. package/src/harness-control-plane/operate.ts +9 -9
  95. package/src/harness-control-plane/owner.ts +341 -41
  96. package/src/harness-control-plane/phase-rollup.ts +4 -7
  97. package/src/harness-control-plane/receipt-ingest.ts +5 -0
  98. package/src/harness-control-plane/receipt-spool.ts +51 -7
  99. package/src/harness-control-plane/receipts.ts +0 -1
  100. package/src/harness-control-plane/sdk-transport.ts +395 -0
  101. package/src/harness-control-plane/session-lease.ts +12 -130
  102. package/src/harness-control-plane/session-transport.ts +94 -0
  103. package/src/harness-control-plane/types.ts +1 -1
  104. package/src/hindsight/backend.ts +26 -27
  105. package/src/hindsight/client.ts +65 -2
  106. package/src/hindsight/state.ts +101 -32
  107. package/src/hooks/skill-state.ts +17 -11
  108. package/src/i18n/messages/en.ts +1 -0
  109. package/src/internal-urls/agent-protocol.ts +76 -5
  110. package/src/internal-urls/docs-index.generated.ts +44 -37
  111. package/src/internal-urls/local-protocol.ts +420 -18
  112. package/src/lsp/client.ts +43 -7
  113. package/src/lsp/config.ts +145 -26
  114. package/src/lsp/index.ts +7 -91
  115. package/src/lsp/lspmux.ts +39 -10
  116. package/src/lsp/path-trust.ts +81 -0
  117. package/src/main.ts +451 -236
  118. package/src/memories/index.ts +1 -0
  119. package/src/memories/storage.ts +6 -2
  120. package/src/modes/DESIGN.md +258 -0
  121. package/src/modes/acp/acp-agent.ts +1236 -2612
  122. package/src/modes/acp/acp-client-bridge.ts +2 -20
  123. package/src/modes/acp/acp-event-mapper.ts +18 -2
  124. package/src/modes/acp/acp-mode.ts +8 -36
  125. package/src/modes/acp/permission-mode.ts +25 -0
  126. package/src/modes/acp/startup-options.ts +6 -0
  127. package/src/modes/action-registry.ts +165 -0
  128. package/src/modes/bridge/bridge-mode.ts +6 -4
  129. package/src/modes/components/agent-dashboard.ts +37 -17
  130. package/src/modes/components/ansi-display-validator.ts +54 -0
  131. package/src/modes/components/chrome.ts +40 -0
  132. package/src/modes/components/command-palette.ts +168 -0
  133. package/src/modes/components/custom-editor.ts +105 -33
  134. package/src/modes/components/custom-provider-wizard.ts +77 -15
  135. package/src/modes/components/index.ts +2 -1
  136. package/src/modes/components/model-selector.ts +93 -35
  137. package/src/modes/components/notifications-settings-editor.ts +1403 -0
  138. package/src/modes/components/pet-capability.ts +115 -0
  139. package/src/modes/components/pet-selector.ts +15 -23
  140. package/src/modes/components/plan-preview-overlay.ts +295 -0
  141. package/src/modes/components/queue-mode-selector.ts +10 -27
  142. package/src/modes/components/queue-pane.ts +79 -0
  143. package/src/modes/components/read-tool-group.ts +13 -0
  144. package/src/modes/components/sayknow-pet-widget.ts +169 -20
  145. package/src/modes/components/session-observer-overlay.ts +213 -775
  146. package/src/modes/components/sessions-dashboard.ts +181 -0
  147. package/src/modes/components/settings-selector.ts +89 -12
  148. package/src/modes/components/show-images-selector.ts +10 -24
  149. package/src/modes/components/status-line/types.ts +1 -1
  150. package/src/modes/components/status-line.ts +1 -969
  151. package/src/modes/components/tasks-pane.ts +73 -0
  152. package/src/modes/components/theme-selector.ts +11 -31
  153. package/src/modes/components/tool-execution.ts +22 -0
  154. package/src/modes/components/tool-status-header.ts +1056 -0
  155. package/src/modes/components/tool-transcript-format.ts +393 -0
  156. package/src/modes/components/transcript-viewer-overlay.ts +446 -0
  157. package/src/modes/components/welcome.ts +4 -4
  158. package/src/modes/controllers/btw-controller.ts +1 -0
  159. package/src/modes/controllers/command-controller.ts +25 -17
  160. package/src/modes/controllers/event-controller.ts +14 -18
  161. package/src/modes/controllers/extension-ui-controller.ts +441 -37
  162. package/src/modes/controllers/goal-mode-controller.ts +493 -0
  163. package/src/modes/controllers/input-controller.ts +889 -263
  164. package/src/modes/controllers/mode-gate.ts +24 -0
  165. package/src/modes/controllers/plan-mode-controller.ts +519 -0
  166. package/src/modes/controllers/runtime-mcp-command-controller.ts +3 -0
  167. package/src/modes/controllers/selector-controller.ts +957 -54
  168. package/src/modes/controllers/stt-controller.ts +125 -0
  169. package/src/modes/index.ts +0 -22
  170. package/src/modes/interactive-mode.ts +376 -1130
  171. package/src/modes/jobs-observer.ts +3 -0
  172. package/src/modes/prompt-action-autocomplete.ts +7 -0
  173. package/src/modes/rpc/rpc-mode.ts +3 -1
  174. package/src/modes/runtime-init.ts +320 -6
  175. package/src/modes/shared/agent-wire/approval-gate.ts +9 -11
  176. package/src/modes/shared/agent-wire/command-dispatch.ts +3 -1
  177. package/src/modes/shared/agent-wire/deep-interview-gate.ts +65 -111
  178. package/src/modes/shared/agent-wire/event-contract.ts +7 -8
  179. package/src/modes/shared/agent-wire/event-envelope.ts +9 -17
  180. package/src/modes/shared/agent-wire/event-observation.ts +16 -7
  181. package/src/modes/shared/agent-wire/workflow-gate-broker.ts +1331 -89
  182. package/src/modes/shared/agent-wire/workflow-gate-schema.ts +19 -17
  183. package/src/modes/shared/agent-wire/workflow-gate-types.ts +407 -0
  184. package/src/modes/tasks-aggregator.ts +199 -0
  185. package/src/modes/transcript-item-registry.ts +229 -0
  186. package/src/modes/types.ts +63 -21
  187. package/src/modes/utils/ui-helpers.ts +17 -9
  188. package/src/notifications/index.ts +8 -2
  189. package/src/plan-mode/approved-plan.ts +3 -1
  190. package/src/prompts/agent-fragments/ralplan-persistence.md +6 -0
  191. package/src/prompts/agent-fragments/restricted-bash.md +1 -0
  192. package/src/prompts/agents/architect.md +3 -8
  193. package/src/prompts/agents/critic.md +3 -8
  194. package/src/prompts/agents/executor.md +3 -0
  195. package/src/prompts/agents/planner.md +4 -12
  196. package/src/prompts/system/custom-system-prompt.md +2 -24
  197. package/src/prompts/system/plan-mode-approved.md +8 -0
  198. package/src/prompts/system/system-prompt.md +18 -94
  199. package/src/prompts/tools/bash.md +4 -4
  200. package/src/prompts/tools/browser.md +15 -52
  201. package/src/prompts/tools/find.md +2 -2
  202. package/src/prompts/tools/hashline.md +13 -55
  203. package/src/prompts/tools/lsp.md +3 -3
  204. package/src/prompts/tools/read.md +3 -6
  205. package/src/prompts/tools/search-tool-bm25.md +0 -2
  206. package/src/prompts/tools/search.md +2 -4
  207. package/src/prompts/tools/skill-discovery.md +1 -2
  208. package/src/prompts/tools/task.md +1 -1
  209. package/src/runtime-mcp/client.ts +94 -19
  210. package/src/runtime-mcp/config.ts +27 -15
  211. package/src/runtime-mcp/discoverable-tool-metadata.ts +16 -13
  212. package/src/runtime-mcp/manager.ts +359 -106
  213. package/src/runtime-mcp/oauth-discovery.ts +116 -26
  214. package/src/runtime-mcp/oauth-flow.ts +42 -12
  215. package/src/runtime-mcp/transports/http.ts +49 -19
  216. package/src/runtime-mcp/transports/stdio.ts +47 -28
  217. package/src/runtime-mcp/types.ts +10 -0
  218. package/src/sdk/acp/adapter.ts +418 -0
  219. package/src/sdk/acp/index.ts +2 -0
  220. package/src/sdk/broker/broker.ts +877 -0
  221. package/src/sdk/broker/discovery.ts +238 -0
  222. package/src/sdk/broker/ensure.ts +393 -0
  223. package/src/sdk/broker/identity.ts +42 -0
  224. package/src/sdk/broker/index.ts +8 -0
  225. package/src/sdk/broker/internal-source-marker-2178.txt +1 -0
  226. package/src/sdk/broker/internal-source.bunfig.toml +1 -0
  227. package/src/sdk/broker/internal.ts +10 -0
  228. package/src/sdk/broker/lifecycle-codec.ts +11 -0
  229. package/src/sdk/broker/lifecycle-ledger.ts +583 -0
  230. package/src/sdk/broker/lifecycle.ts +3413 -0
  231. package/src/sdk/broker/process-incarnation.ts +151 -0
  232. package/src/sdk/broker/runtime.ts +164 -0
  233. package/src/sdk/broker/session-index.ts +678 -0
  234. package/src/sdk/broker/state-version.ts +47 -0
  235. package/src/sdk/broker/transport.ts +125 -0
  236. package/src/sdk/bus/attachment-registry.ts +23 -0
  237. package/src/sdk/bus/chat-adapters.ts +147 -0
  238. package/src/sdk/bus/chat-command-policy.ts +107 -0
  239. package/src/sdk/bus/chat-daemon-cli.ts +278 -0
  240. package/src/sdk/bus/chat-daemon-control.ts +1101 -0
  241. package/src/sdk/bus/chat-daemon-runtime.ts +527 -0
  242. package/src/sdk/bus/chat-effect-journal.ts +363 -0
  243. package/src/sdk/bus/config-commands.ts +192 -0
  244. package/src/sdk/bus/config.ts +568 -0
  245. package/src/sdk/bus/conversation-store.ts +367 -0
  246. package/src/sdk/bus/daemon-paths.ts +34 -0
  247. package/src/sdk/bus/discord-conversation.ts +85 -0
  248. package/src/sdk/bus/discord-daemon.ts +2292 -0
  249. package/src/sdk/bus/discord-live-provider.ts +521 -0
  250. package/src/sdk/bus/discord-provider.ts +56 -0
  251. package/src/sdk/bus/engine.ts +100 -0
  252. package/src/sdk/bus/helpers.ts +135 -0
  253. package/src/sdk/bus/html-format.ts +518 -0
  254. package/src/sdk/bus/index.ts +4961 -0
  255. package/src/sdk/bus/lifecycle-commands.ts +291 -0
  256. package/src/sdk/bus/lifecycle-control-runtime.ts +1409 -0
  257. package/src/sdk/bus/lifecycle-orchestrator.ts +458 -0
  258. package/src/sdk/bus/managed-daemon.ts +163 -0
  259. package/src/sdk/bus/native-runtime-compatibility.ts +42 -0
  260. package/src/sdk/bus/natives-augment.d.ts +63 -0
  261. package/src/sdk/bus/notification-orchestration.ts +535 -0
  262. package/src/sdk/bus/notification-service.ts +1174 -0
  263. package/src/sdk/bus/operator-runtime.ts +171 -0
  264. package/src/sdk/bus/rate-limit-pool.ts +276 -0
  265. package/src/sdk/bus/recent-activity.ts +279 -0
  266. package/src/sdk/bus/reply-sent-store.ts +134 -0
  267. package/src/sdk/bus/rich-document.ts +258 -0
  268. package/src/sdk/bus/rich-draft.ts +107 -0
  269. package/src/sdk/bus/rich-render.ts +135 -0
  270. package/src/sdk/bus/session-control.ts +439 -0
  271. package/src/sdk/bus/slack-conversation.ts +74 -0
  272. package/src/sdk/bus/slack-daemon.ts +2144 -0
  273. package/src/sdk/bus/slack-live-provider.ts +380 -0
  274. package/src/sdk/bus/slack-provider.ts +76 -0
  275. package/src/sdk/bus/telegram-cli.ts +194 -0
  276. package/src/sdk/bus/telegram-daemon-cli.ts +292 -0
  277. package/src/sdk/bus/telegram-daemon-contract.ts +27 -0
  278. package/src/sdk/bus/telegram-daemon-control.ts +642 -0
  279. package/src/sdk/bus/telegram-daemon.ts +6675 -0
  280. package/src/sdk/bus/telegram-reference.ts +436 -0
  281. package/src/sdk/bus/telegram-setup.ts +663 -0
  282. package/src/sdk/bus/threaded-inbound.ts +141 -0
  283. package/src/sdk/bus/threaded-render.ts +294 -0
  284. package/src/sdk/bus/topic-registry.ts +364 -0
  285. package/src/sdk/cli/index.ts +1 -0
  286. package/src/sdk/cli/session-cli.ts +275 -0
  287. package/src/sdk/client/client.ts +1 -0
  288. package/src/sdk/client/discovery.ts +108 -0
  289. package/src/sdk/client/index.ts +2 -0
  290. package/src/sdk/host/control/dispatch.ts +388 -0
  291. package/src/sdk/host/control/index.ts +10 -0
  292. package/src/sdk/host/control/operations.ts +68 -0
  293. package/src/sdk/host/events.ts +91 -0
  294. package/src/sdk/host/host.ts +338 -0
  295. package/src/sdk/host/index.ts +4 -0
  296. package/src/sdk/host/query/cursor.ts +189 -0
  297. package/src/sdk/host/query/handlers.ts +531 -0
  298. package/src/sdk/host/query/index.ts +3 -0
  299. package/src/sdk/host/query/revision-store.ts +1149 -0
  300. package/src/sdk/host/reverse-leases.ts +325 -0
  301. package/src/sdk/host/types.ts +29 -0
  302. package/src/sdk/index.ts +14 -0
  303. package/src/sdk/lifecycle-session.ts +39 -0
  304. package/src/sdk/mcp/index.ts +1 -0
  305. package/src/sdk/mcp/server.ts +332 -0
  306. package/src/sdk/models.ts +168 -0
  307. package/src/sdk/protocol/adapter-validation.ts +48 -0
  308. package/src/sdk/protocol/operation-inventory.generated.json +4719 -0
  309. package/src/sdk/protocol/operation-registry.ts +312 -0
  310. package/src/sdk/session-directory.ts +141 -0
  311. package/src/sdk/session.ts +2869 -0
  312. package/src/sdk/startup-capability.ts +189 -0
  313. package/src/secrets/index.ts +53 -10
  314. package/src/secrets/obfuscator.ts +21 -18
  315. package/src/secrets/regex.ts +2 -0
  316. package/src/session/agent-session.ts +5602 -2138
  317. package/src/session/agent-storage.ts +18 -0
  318. package/src/session/artifacts.ts +188 -23
  319. package/src/session/cache-economics.ts +25 -8
  320. package/src/session/context-estimation.ts +7 -2
  321. package/src/session/default-model-selection.ts +93 -0
  322. package/src/session/fallback-chain-controller.ts +186 -0
  323. package/src/session/internal/managed-session-scope.ts +2402 -0
  324. package/src/session/internal/managed-session-storage.ts +1559 -0
  325. package/src/session/messages.ts +91 -2
  326. package/src/session/session-manager-internal.ts +33 -0
  327. package/src/session/session-manager.ts +2578 -392
  328. package/src/session/session-storage.ts +550 -40
  329. package/src/session/streaming-output.ts +6 -0
  330. package/src/session/volatile-context-pruning.ts +78 -0
  331. package/src/session/yield-queue.ts +20 -0
  332. package/src/setup/credential-auto-import.ts +291 -35
  333. package/src/setup/hermes/templates/operator-instructions.v1.md +4 -6
  334. package/src/setup/provider-onboarding.ts +36 -61
  335. package/src/setup/provider-presets.json +5 -0
  336. package/src/skc-runtime/deep-interview-recorder.ts +70 -3
  337. package/src/skc-runtime/deep-interview-state.ts +441 -5
  338. package/src/skc-runtime/gc-render.ts +19 -1
  339. package/src/skc-runtime/gc-runtime.ts +68 -3
  340. package/src/skc-runtime/goal-mode-request.ts +55 -8
  341. package/src/skc-runtime/launch-worktree.ts +5 -5
  342. package/src/skc-runtime/linux-proc.ts +71 -0
  343. package/src/skc-runtime/managed-owner-admission.ts +352 -0
  344. package/src/skc-runtime/managed-owner-supervisor.ts +162 -0
  345. package/src/skc-runtime/psmux-detect.ts +82 -4
  346. package/src/skc-runtime/ralplan-runtime.ts +74 -90
  347. package/src/skc-runtime/session-resolution.ts +18 -3
  348. package/src/skc-runtime/session-state-sidecar.ts +47 -138
  349. package/src/skc-runtime/state-argv.ts +292 -0
  350. package/src/skc-runtime/state-migrations.ts +1 -1
  351. package/src/skc-runtime/state-runtime.ts +387 -451
  352. package/src/skc-runtime/state-writer.ts +36 -40
  353. package/src/skc-runtime/team-launch.ts +319 -0
  354. package/src/skc-runtime/team-notify.ts +326 -0
  355. package/src/skc-runtime/team-runtime.ts +8 -2
  356. package/src/skc-runtime/team-store.ts +828 -0
  357. package/src/skc-runtime/team-workers.ts +962 -0
  358. package/src/skc-runtime/tmux-owner-isolation-cli.ts +55 -28
  359. package/src/skc-runtime/tmux-owner-isolation.ts +136 -11
  360. package/src/skc-runtime/tmux-sessions.ts +23 -34
  361. package/src/skc-runtime/ultragoal-change-set.ts +172 -0
  362. package/src/skc-runtime/ultragoal-evidence.ts +874 -0
  363. package/src/skc-runtime/ultragoal-guard.ts +136 -18
  364. package/src/skc-runtime/ultragoal-owner-loss-recovery.ts +328 -0
  365. package/src/skc-runtime/ultragoal-pipeline.ts +306 -0
  366. package/src/skc-runtime/ultragoal-receipt-freshness.ts +102 -1
  367. package/src/skc-runtime/ultragoal-runtime.ts +325 -1322
  368. package/src/skc-runtime/windows-powershell-command.ts +58 -0
  369. package/src/skc-runtime/workflow-cli-common.ts +30 -0
  370. package/src/skc-runtime/workflow-manifest.generated.json +58 -0
  371. package/src/skc-runtime/workflow-manifest.ts +18 -0
  372. package/src/skill-state/active-state.ts +3 -13
  373. package/src/skill-state/workflow-mutation-guard.ts +661 -0
  374. package/src/skill-state/workflow-state-contract.ts +6 -41
  375. package/src/slash-commands/builtin-registry.ts +115 -41
  376. package/src/system-prompt.ts +37 -44
  377. package/src/task/agents.ts +19 -1
  378. package/src/task/executor.ts +223 -45
  379. package/src/task/index.ts +124 -56
  380. package/src/thinking.ts +21 -6
  381. package/src/tool-discovery/tool-index.ts +20 -134
  382. package/src/tools/ask-answer-registry.ts +16 -2
  383. package/src/tools/ast-edit.ts +1 -1
  384. package/src/tools/bash-allowed-prefixes.ts +79 -29
  385. package/src/tools/bash-skill-urls.ts +14 -3
  386. package/src/tools/bash.ts +40 -2
  387. package/src/tools/browser/STEALTH-THIRD-PARTY-NOTICES.md +26 -0
  388. package/src/tools/browser/benchmark/detector-report.ts +157 -0
  389. package/src/tools/browser/benchmark/run-suite.ts +39 -0
  390. package/src/tools/browser/dead-tab-recovery.ts +78 -0
  391. package/src/tools/browser/launch.ts +127 -20
  392. package/src/tools/browser/profile-discovery.ts +63 -0
  393. package/src/tools/browser/profile-posture.ts +59 -0
  394. package/src/tools/browser/profile-reuse.ts +102 -0
  395. package/src/tools/browser/profile-warmup.ts +109 -0
  396. package/src/tools/browser/readable.ts +1 -1
  397. package/src/tools/browser/registry.ts +87 -11
  398. package/src/tools/browser/screenshot-format.ts +34 -0
  399. package/src/tools/browser/tab-protocol.ts +4 -0
  400. package/src/tools/browser/tab-supervisor.ts +392 -142
  401. package/src/tools/browser/tab-worker-entry.ts +33 -14
  402. package/src/tools/browser/tab-worker-path-resolver.ts +67 -0
  403. package/src/tools/browser/tab-worker-smoke.ts +87 -0
  404. package/src/tools/browser/tab-worker.ts +8 -6
  405. package/src/tools/browser.ts +6 -0
  406. package/src/tools/computer.ts +10 -3
  407. package/src/tools/cron.ts +30 -16
  408. package/src/tools/fetch.ts +11 -4
  409. package/src/tools/index.ts +88 -32
  410. package/src/tools/output-meta.ts +19 -7
  411. package/src/tools/path-utils.ts +42 -35
  412. package/src/tools/plan-mode-guard.ts +1 -0
  413. package/src/tools/puppeteer/14_stealth_permissions.txt +57 -0
  414. package/src/tools/puppeteer/15_stealth_webrtc.txt +60 -0
  415. package/src/tools/read.ts +226 -65
  416. package/src/tools/resource-gc.ts +125 -36
  417. package/src/tools/search-tool-bm25.ts +11 -74
  418. package/src/tools/sqlite-reader.ts +3 -2
  419. package/src/tools/subagent-render.ts +19 -8
  420. package/src/tools/subagent.ts +129 -34
  421. package/src/tools/telegram-send.ts +2 -2
  422. package/src/utils/event-bus.ts +9 -4
  423. package/src/utils/file-mentions.ts +4 -4
  424. package/src/utils/image-loading.ts +85 -34
  425. package/src/utils/image-resize.ts +16 -9
  426. package/src/utils/pasted-image-loading.ts +514 -0
  427. package/src/utils/pasted-image-path.ts +223 -98
  428. package/src/web/scrapers/html-to-markdown.ts +68 -0
  429. package/src/web/scrapers/readthedocs.ts +1 -1
  430. package/src/web/scrapers/types.ts +1 -68
  431. package/src/web/search/index.ts +3 -3
  432. package/src/web/search/providers/openai-compatible.ts +76 -23
  433. package/dist/types/append-only-mode.d.ts +0 -31
  434. package/dist/types/async/index.d.ts +0 -2
  435. package/dist/types/async/job-manager.d.ts +0 -328
  436. package/dist/types/async/support.d.ts +0 -2
  437. package/dist/types/autoresearch/dashboard.d.ts +0 -4
  438. package/dist/types/autoresearch/git.d.ts +0 -36
  439. package/dist/types/autoresearch/helpers.d.ts +0 -24
  440. package/dist/types/autoresearch/index.d.ts +0 -2
  441. package/dist/types/autoresearch/state.d.ts +0 -17
  442. package/dist/types/autoresearch/storage.d.ts +0 -142
  443. package/dist/types/autoresearch/tools/init-experiment.d.ts +0 -31
  444. package/dist/types/autoresearch/tools/log-experiment.d.ts +0 -23
  445. package/dist/types/autoresearch/tools/run-experiment.d.ts +0 -8
  446. package/dist/types/autoresearch/tools/update-notes.d.ts +0 -12
  447. package/dist/types/autoresearch/types.d.ts +0 -154
  448. package/dist/types/build-metadata.d.ts +0 -7
  449. package/dist/types/capability/context-file.d.ts +0 -17
  450. package/dist/types/capability/extension-module.d.ts +0 -15
  451. package/dist/types/capability/extension.d.ts +0 -28
  452. package/dist/types/capability/fs.d.ts +0 -20
  453. package/dist/types/capability/hook.d.ts +0 -19
  454. package/dist/types/capability/index.d.ts +0 -80
  455. package/dist/types/capability/instruction.d.ts +0 -17
  456. package/dist/types/capability/mcp.d.ts +0 -49
  457. package/dist/types/capability/prompt.d.ts +0 -15
  458. package/dist/types/capability/rule.d.ts +0 -69
  459. package/dist/types/capability/settings.d.ts +0 -15
  460. package/dist/types/capability/skill.d.ts +0 -36
  461. package/dist/types/capability/slash-command.d.ts +0 -17
  462. package/dist/types/capability/ssh.d.ts +0 -23
  463. package/dist/types/capability/system-prompt.d.ts +0 -15
  464. package/dist/types/capability/tool.d.ts +0 -19
  465. package/dist/types/capability/types.d.ts +0 -154
  466. package/dist/types/cli/agents-cli.d.ts +0 -12
  467. package/dist/types/cli/args.d.ts +0 -57
  468. package/dist/types/cli/auth-broker-cli.d.ts +0 -25
  469. package/dist/types/cli/auth-gateway-cli.d.ts +0 -18
  470. package/dist/types/cli/classify-install-target.d.ts +0 -8
  471. package/dist/types/cli/commands/init-xdg.d.ts +0 -1
  472. package/dist/types/cli/completion-cli.d.ts +0 -41
  473. package/dist/types/cli/config-cli.d.ts +0 -23
  474. package/dist/types/cli/daemon-cli.d.ts +0 -27
  475. package/dist/types/cli/fast-help.d.ts +0 -1
  476. package/dist/types/cli/file-processor.d.ts +0 -11
  477. package/dist/types/cli/fixture-report.d.ts +0 -20
  478. package/dist/types/cli/fixture-report.test.d.ts +0 -1
  479. package/dist/types/cli/grep-cli.d.ts +0 -17
  480. package/dist/types/cli/initial-message.d.ts +0 -17
  481. package/dist/types/cli/list-models.d.ts +0 -36
  482. package/dist/types/cli/local-provider-smoke.d.ts +0 -59
  483. package/dist/types/cli/malloc-env-guard.d.ts +0 -65
  484. package/dist/types/cli/malloc-env-guard.test.d.ts +0 -1
  485. package/dist/types/cli/mcp-cli.d.ts +0 -25
  486. package/dist/types/cli/migrate-cli.d.ts +0 -20
  487. package/dist/types/cli/nofile-limit.d.ts +0 -11
  488. package/dist/types/cli/notify-cli.d.ts +0 -39
  489. package/dist/types/cli/plugin-cli.d.ts +0 -34
  490. package/dist/types/cli/read-cli.d.ts +0 -4
  491. package/dist/types/cli/session-picker.d.ts +0 -4
  492. package/dist/types/cli/setup-cli.d.ts +0 -73
  493. package/dist/types/cli/shell-cli.d.ts +0 -8
  494. package/dist/types/cli/skills-cli.d.ts +0 -9
  495. package/dist/types/cli/ssh-cli.d.ts +0 -21
  496. package/dist/types/cli/stats-cli.d.ts +0 -17
  497. package/dist/types/cli/telegram-cli.d.ts +0 -13
  498. package/dist/types/cli/update-cli.d.ts +0 -108
  499. package/dist/types/cli/web-search-cli.d.ts +0 -32
  500. package/dist/types/cli/worktree-cli.d.ts +0 -26
  501. package/dist/types/cli.d.ts +0 -140
  502. package/dist/types/commands/acp.d.ts +0 -12
  503. package/dist/types/commands/agents.d.ts +0 -34
  504. package/dist/types/commands/auth-broker.d.ts +0 -54
  505. package/dist/types/commands/auth-gateway.d.ts +0 -32
  506. package/dist/types/commands/codex-native-hook.d.ts +0 -6
  507. package/dist/types/commands/commit.d.ts +0 -27
  508. package/dist/types/commands/completion.d.ts +0 -29
  509. package/dist/types/commands/config.d.ts +0 -33
  510. package/dist/types/commands/contribution-prep.d.ts +0 -18
  511. package/dist/types/commands/coordinator.d.ts +0 -19
  512. package/dist/types/commands/daemon.d.ts +0 -45
  513. package/dist/types/commands/deep-interview.d.ts +0 -54
  514. package/dist/types/commands/gc.d.ts +0 -26
  515. package/dist/types/commands/grep.d.ts +0 -42
  516. package/dist/types/commands/harness.d.ts +0 -43
  517. package/dist/types/commands/launch.d.ts +0 -131
  518. package/dist/types/commands/local-provider.d.ts +0 -34
  519. package/dist/types/commands/mcp-serve.d.ts +0 -24
  520. package/dist/types/commands/mcp.d.ts +0 -70
  521. package/dist/types/commands/migrate.d.ts +0 -33
  522. package/dist/types/commands/notify.d.ts +0 -47
  523. package/dist/types/commands/plugin.d.ts +0 -58
  524. package/dist/types/commands/ralplan.d.ts +0 -7
  525. package/dist/types/commands/read.d.ts +0 -15
  526. package/dist/types/commands/rlm.d.ts +0 -10
  527. package/dist/types/commands/session.d.ts +0 -30
  528. package/dist/types/commands/setup.d.ts +0 -105
  529. package/dist/types/commands/shell.d.ts +0 -21
  530. package/dist/types/commands/skills.d.ts +0 -26
  531. package/dist/types/commands/ssh.d.ts +0 -48
  532. package/dist/types/commands/state.d.ts +0 -7
  533. package/dist/types/commands/stats.d.ts +0 -25
  534. package/dist/types/commands/team.d.ts +0 -24
  535. package/dist/types/commands/telegram.d.ts +0 -22
  536. package/dist/types/commands/ultragoal.d.ts +0 -8
  537. package/dist/types/commands/update.d.ts +0 -20
  538. package/dist/types/commands/web-search.d.ts +0 -87
  539. package/dist/types/commands/worktree.d.ts +0 -34
  540. package/dist/types/commit/agentic/agent.d.ts +0 -31
  541. package/dist/types/commit/agentic/fallback.d.ts +0 -5
  542. package/dist/types/commit/agentic/index.d.ts +0 -2
  543. package/dist/types/commit/agentic/state.d.ts +0 -58
  544. package/dist/types/commit/agentic/tools/analyze-file.d.ts +0 -19
  545. package/dist/types/commit/agentic/tools/git-file-diff.d.ts +0 -10
  546. package/dist/types/commit/agentic/tools/git-hunk.d.ts +0 -9
  547. package/dist/types/commit/agentic/tools/git-overview.d.ts +0 -9
  548. package/dist/types/commit/agentic/tools/index.d.ts +0 -16
  549. package/dist/types/commit/agentic/tools/propose-changelog.d.ts +0 -28
  550. package/dist/types/commit/agentic/tools/propose-commit.d.ts +0 -36
  551. package/dist/types/commit/agentic/tools/recent-commits.d.ts +0 -7
  552. package/dist/types/commit/agentic/tools/schemas.d.ts +0 -27
  553. package/dist/types/commit/agentic/tools/split-commit.d.ts +0 -53
  554. package/dist/types/commit/agentic/topo-sort.d.ts +0 -4
  555. package/dist/types/commit/agentic/trivial.d.ts +0 -7
  556. package/dist/types/commit/agentic/validation.d.ts +0 -20
  557. package/dist/types/commit/analysis/conventional.d.ts +0 -22
  558. package/dist/types/commit/analysis/index.d.ts +0 -4
  559. package/dist/types/commit/analysis/scope.d.ts +0 -6
  560. package/dist/types/commit/analysis/summary.d.ts +0 -19
  561. package/dist/types/commit/analysis/validation.d.ts +0 -8
  562. package/dist/types/commit/changelog/detect.d.ts +0 -2
  563. package/dist/types/commit/changelog/generate.d.ts +0 -30
  564. package/dist/types/commit/changelog/index.d.ts +0 -30
  565. package/dist/types/commit/changelog/parse.d.ts +0 -2
  566. package/dist/types/commit/cli.d.ts +0 -3
  567. package/dist/types/commit/git/diff.d.ts +0 -5
  568. package/dist/types/commit/index.d.ts +0 -4
  569. package/dist/types/commit/map-reduce/index.d.ts +0 -28
  570. package/dist/types/commit/map-reduce/map-phase.d.ts +0 -17
  571. package/dist/types/commit/map-reduce/reduce-phase.d.ts +0 -13
  572. package/dist/types/commit/map-reduce/utils.d.ts +0 -2
  573. package/dist/types/commit/message.d.ts +0 -2
  574. package/dist/types/commit/model-selection.d.ts +0 -15
  575. package/dist/types/commit/pipeline.d.ts +0 -5
  576. package/dist/types/commit/shared-llm.d.ts +0 -54
  577. package/dist/types/commit/types.d.ts +0 -78
  578. package/dist/types/commit/utils/exclusions.d.ts +0 -4
  579. package/dist/types/commit/utils.d.ts +0 -20
  580. package/dist/types/config/config-file.d.ts +0 -58
  581. package/dist/types/config/file-lock-gc.d.ts +0 -5
  582. package/dist/types/config/file-lock.d.ts +0 -36
  583. package/dist/types/config/keybindings.d.ts +0 -364
  584. package/dist/types/config/model-equivalence.d.ts +0 -24
  585. package/dist/types/config/model-profile-activation.d.ts +0 -65
  586. package/dist/types/config/model-profiles.d.ts +0 -39
  587. package/dist/types/config/model-registry.d.ts +0 -473
  588. package/dist/types/config/model-resolver.d.ts +0 -217
  589. package/dist/types/config/models-config-schema.d.ts +0 -700
  590. package/dist/types/config/prompt-templates.d.ts +0 -32
  591. package/dist/types/config/resolve-config-value.d.ts +0 -17
  592. package/dist/types/config/settings-schema.d.ts +0 -4223
  593. package/dist/types/config/settings.d.ts +0 -158
  594. package/dist/types/config/skill-settings-defaults.d.ts +0 -14
  595. package/dist/types/config/telegram-autostart.d.ts +0 -14
  596. package/dist/types/config/telegram-env-bridge.d.ts +0 -18
  597. package/dist/types/config.d.ts +0 -66
  598. package/dist/types/coordinator/contract.d.ts +0 -4
  599. package/dist/types/coordinator-mcp/model-preset.d.ts +0 -45
  600. package/dist/types/coordinator-mcp/policy.d.ts +0 -27
  601. package/dist/types/coordinator-mcp/safety.d.ts +0 -26
  602. package/dist/types/coordinator-mcp/server.d.ts +0 -139
  603. package/dist/types/coordinator-mcp/session-reaper.d.ts +0 -53
  604. package/dist/types/cursor.d.ts +0 -24
  605. package/dist/types/daemon/builtin.d.ts +0 -20
  606. package/dist/types/daemon/control-types.d.ts +0 -67
  607. package/dist/types/daemon/operator-contract.d.ts +0 -47
  608. package/dist/types/daemon/runtime.d.ts +0 -25
  609. package/dist/types/dap/client.d.ts +0 -39
  610. package/dist/types/dap/config.d.ts +0 -6
  611. package/dist/types/dap/index.d.ts +0 -4
  612. package/dist/types/dap/session.d.ts +0 -108
  613. package/dist/types/dap/types.d.ts +0 -524
  614. package/dist/types/debug/crash-diagnostics.d.ts +0 -45
  615. package/dist/types/debug/index.d.ts +0 -15
  616. package/dist/types/debug/log-formatting.d.ts +0 -4
  617. package/dist/types/debug/log-viewer.d.ts +0 -68
  618. package/dist/types/debug/profiler.d.ts +0 -24
  619. package/dist/types/debug/raw-sse-buffer.d.ts +0 -44
  620. package/dist/types/debug/raw-sse.d.ts +0 -16
  621. package/dist/types/debug/report-bundle.d.ts +0 -55
  622. package/dist/types/debug/runtime-gauges.d.ts +0 -6
  623. package/dist/types/debug/system-info.d.ts +0 -26
  624. package/dist/types/deep-interview/plaintext-gate-guard.d.ts +0 -11
  625. package/dist/types/deep-interview/render-middleware.d.ts +0 -6
  626. package/dist/types/defaults/skc/extensions/grok-build/index.d.ts +0 -1
  627. package/dist/types/defaults/skc/extensions/grok-cli-vendor/src/index.d.ts +0 -1
  628. package/dist/types/defaults/skc/extensions/grok-cli-vendor/src/models/catalog.d.ts +0 -29
  629. package/dist/types/defaults/skc/extensions/grok-cli-vendor/src/payload/sanitize.d.ts +0 -27
  630. package/dist/types/defaults/skc/extensions/grok-cli-vendor/src/provider/billing.d.ts +0 -8
  631. package/dist/types/defaults/skc/extensions/grok-cli-vendor/src/provider/register.d.ts +0 -5
  632. package/dist/types/defaults/skc/extensions/grok-cli-vendor/src/provider/stream.d.ts +0 -10
  633. package/dist/types/defaults/skc/extensions/grok-cli-vendor/src/provider/usage.d.ts +0 -2
  634. package/dist/types/defaults/skc/extensions/grok-cli-vendor/src/shared/base-url.d.ts +0 -2
  635. package/dist/types/defaults/skc/extensions/grok-cli-vendor/src/shared/errors.d.ts +0 -38
  636. package/dist/types/defaults/skc-defaults.d.ts +0 -64
  637. package/dist/types/defaults/skc-grok-cli.d.ts +0 -5
  638. package/dist/types/discovery/agents-md.d.ts +0 -1
  639. package/dist/types/discovery/agents.d.ts +0 -12
  640. package/dist/types/discovery/builtin.d.ts +0 -1
  641. package/dist/types/discovery/claude-plugins.d.ts +0 -1
  642. package/dist/types/discovery/claude.d.ts +0 -1
  643. package/dist/types/discovery/cline.d.ts +0 -1
  644. package/dist/types/discovery/codex.d.ts +0 -1
  645. package/dist/types/discovery/cursor.d.ts +0 -19
  646. package/dist/types/discovery/gemini.d.ts +0 -1
  647. package/dist/types/discovery/github.d.ts +0 -1
  648. package/dist/types/discovery/helpers.d.ts +0 -271
  649. package/dist/types/discovery/index.d.ts +0 -48
  650. package/dist/types/discovery/mcp-json.d.ts +0 -1
  651. package/dist/types/discovery/opencode.d.ts +0 -1
  652. package/dist/types/discovery/plugin-dir-roots.d.ts +0 -15
  653. package/dist/types/discovery/ssh.d.ts +0 -1
  654. package/dist/types/discovery/substitute-plugin-root.d.ts +0 -1
  655. package/dist/types/discovery/vscode.d.ts +0 -1
  656. package/dist/types/discovery/windsurf.d.ts +0 -15
  657. package/dist/types/edit/apply-patch/index.d.ts +0 -35
  658. package/dist/types/edit/apply-patch/parser.d.ts +0 -34
  659. package/dist/types/edit/diff.d.ts +0 -75
  660. package/dist/types/edit/file-read-cache.d.ts +0 -25
  661. package/dist/types/edit/index.d.ts +0 -58
  662. package/dist/types/edit/modes/apply-patch.d.ts +0 -24
  663. package/dist/types/edit/modes/patch.d.ts +0 -99
  664. package/dist/types/edit/modes/replace.d.ts +0 -149
  665. package/dist/types/edit/normalize.d.ts +0 -43
  666. package/dist/types/edit/notebook.d.ts +0 -26
  667. package/dist/types/edit/read-file.d.ts +0 -8
  668. package/dist/types/edit/renderer.d.ts +0 -110
  669. package/dist/types/edit/streaming.d.ts +0 -66
  670. package/dist/types/eval/backend.d.ts +0 -40
  671. package/dist/types/eval/index.d.ts +0 -4
  672. package/dist/types/eval/js/context-manager.d.ts +0 -27
  673. package/dist/types/eval/js/executor.d.ts +0 -29
  674. package/dist/types/eval/js/index.d.ts +0 -10
  675. package/dist/types/eval/js/shared/helpers.d.ts +0 -38
  676. package/dist/types/eval/js/shared/indirect-eval.d.ts +0 -14
  677. package/dist/types/eval/js/shared/prelude.d.ts +0 -1
  678. package/dist/types/eval/js/shared/rewrite-imports.d.ts +0 -6
  679. package/dist/types/eval/js/shared/runtime.d.ts +0 -47
  680. package/dist/types/eval/js/shared/types.d.ts +0 -24
  681. package/dist/types/eval/js/tool-bridge.d.ts +0 -18
  682. package/dist/types/eval/js/worker-core.d.ts +0 -5
  683. package/dist/types/eval/js/worker-entry.d.ts +0 -1
  684. package/dist/types/eval/js/worker-protocol.d.ts +0 -77
  685. package/dist/types/eval/py/display.d.ts +0 -25
  686. package/dist/types/eval/py/executor.d.ts +0 -88
  687. package/dist/types/eval/py/index.d.ts +0 -10
  688. package/dist/types/eval/py/kernel.d.ts +0 -65
  689. package/dist/types/eval/py/prelude.d.ts +0 -1
  690. package/dist/types/eval/py/runtime.d.ts +0 -29
  691. package/dist/types/eval/py/tool-bridge.d.ts +0 -20
  692. package/dist/types/eval/types.d.ts +0 -52
  693. package/dist/types/exa/factory.d.ts +0 -13
  694. package/dist/types/exa/index.d.ts +0 -20
  695. package/dist/types/exa/mcp-client.d.ts +0 -45
  696. package/dist/types/exa/render.d.ts +0 -19
  697. package/dist/types/exa/researcher.d.ts +0 -9
  698. package/dist/types/exa/search.d.ts +0 -9
  699. package/dist/types/exa/types.d.ts +0 -155
  700. package/dist/types/exa/websets.d.ts +0 -9
  701. package/dist/types/exec/bash-executor.d.ts +0 -64
  702. package/dist/types/exec/exec.d.ts +0 -25
  703. package/dist/types/exec/idle-timeout-watchdog.d.ts +0 -18
  704. package/dist/types/exec/non-interactive-env.d.ts +0 -1
  705. package/dist/types/export/custom-share.d.ts +0 -20
  706. package/dist/types/export/html/index.d.ts +0 -10
  707. package/dist/types/export/html/template.generated.d.ts +0 -1
  708. package/dist/types/export/html/template.macro.d.ts +0 -5
  709. package/dist/types/export/ttsr.d.ts +0 -55
  710. package/dist/types/extensibility/custom-commands/bundled/ci-green/index.d.ts +0 -9
  711. package/dist/types/extensibility/custom-commands/index.d.ts +0 -2
  712. package/dist/types/extensibility/custom-commands/loader.d.ts +0 -29
  713. package/dist/types/extensibility/custom-commands/types.d.ts +0 -106
  714. package/dist/types/extensibility/custom-tools/index.d.ts +0 -6
  715. package/dist/types/extensibility/custom-tools/loader.d.ts +0 -69
  716. package/dist/types/extensibility/custom-tools/types.d.ts +0 -229
  717. package/dist/types/extensibility/custom-tools/wrapper.d.ts +0 -24
  718. package/dist/types/extensibility/extensions/compact-handler.d.ts +0 -26
  719. package/dist/types/extensibility/extensions/get-commands-handler.d.ts +0 -29
  720. package/dist/types/extensibility/extensions/index.d.ts +0 -9
  721. package/dist/types/extensibility/extensions/loader.d.ts +0 -43
  722. package/dist/types/extensibility/extensions/prefix-command-bridge.d.ts +0 -35
  723. package/dist/types/extensibility/extensions/runner.d.ts +0 -135
  724. package/dist/types/extensibility/extensions/types.d.ts +0 -920
  725. package/dist/types/extensibility/extensions/wrapper.d.ts +0 -55
  726. package/dist/types/extensibility/hooks/index.d.ts +0 -5
  727. package/dist/types/extensibility/hooks/loader.d.ts +0 -89
  728. package/dist/types/extensibility/hooks/runner.d.ts +0 -126
  729. package/dist/types/extensibility/hooks/tool-wrapper.d.ts +0 -25
  730. package/dist/types/extensibility/hooks/types.d.ts +0 -431
  731. package/dist/types/extensibility/plugins/doctor.d.ts +0 -3
  732. package/dist/types/extensibility/plugins/git-url.d.ts +0 -34
  733. package/dist/types/extensibility/plugins/index.d.ts +0 -8
  734. package/dist/types/extensibility/plugins/installer.d.ts +0 -5
  735. package/dist/types/extensibility/plugins/legacy-pi-compat.d.ts +0 -2
  736. package/dist/types/extensibility/plugins/loader.d.ts +0 -31
  737. package/dist/types/extensibility/plugins/manager.d.ts +0 -65
  738. package/dist/types/extensibility/plugins/marketplace/cache.d.ts +0 -41
  739. package/dist/types/extensibility/plugins/marketplace/fetcher.d.ts +0 -48
  740. package/dist/types/extensibility/plugins/marketplace/index.d.ts +0 -6
  741. package/dist/types/extensibility/plugins/marketplace/manager.d.ts +0 -57
  742. package/dist/types/extensibility/plugins/marketplace/registry.d.ts +0 -34
  743. package/dist/types/extensibility/plugins/marketplace/source-resolver.d.ts +0 -28
  744. package/dist/types/extensibility/plugins/marketplace/types.d.ts +0 -130
  745. package/dist/types/extensibility/plugins/parser.d.ts +0 -52
  746. package/dist/types/extensibility/plugins/security-scanner.d.ts +0 -31
  747. package/dist/types/extensibility/plugins/types.d.ts +0 -149
  748. package/dist/types/extensibility/runtime-skill-discovery.d.ts +0 -20
  749. package/dist/types/extensibility/shared-events.d.ts +0 -281
  750. package/dist/types/extensibility/skc-plugins/activation.d.ts +0 -14
  751. package/dist/types/extensibility/skc-plugins/compiler.d.ts +0 -19
  752. package/dist/types/extensibility/skc-plugins/constrained-hooks.d.ts +0 -29
  753. package/dist/types/extensibility/skc-plugins/index.d.ts +0 -18
  754. package/dist/types/extensibility/skc-plugins/injection.d.ts +0 -40
  755. package/dist/types/extensibility/skc-plugins/installer.d.ts +0 -13
  756. package/dist/types/extensibility/skc-plugins/loader.d.ts +0 -3
  757. package/dist/types/extensibility/skc-plugins/mcp-policy.d.ts +0 -26
  758. package/dist/types/extensibility/skc-plugins/observability.d.ts +0 -27
  759. package/dist/types/extensibility/skc-plugins/paths.d.ts +0 -8
  760. package/dist/types/extensibility/skc-plugins/prompt-appendix.d.ts +0 -16
  761. package/dist/types/extensibility/skc-plugins/registry.d.ts +0 -32
  762. package/dist/types/extensibility/skc-plugins/runtime-adapters.d.ts +0 -64
  763. package/dist/types/extensibility/skc-plugins/schema.d.ts +0 -3
  764. package/dist/types/extensibility/skc-plugins/session-validation.d.ts +0 -42
  765. package/dist/types/extensibility/skc-plugins/state.d.ts +0 -9
  766. package/dist/types/extensibility/skc-plugins/tools.d.ts +0 -8
  767. package/dist/types/extensibility/skc-plugins/types.d.ts +0 -220
  768. package/dist/types/extensibility/skc-plugins/validation.d.ts +0 -11
  769. package/dist/types/extensibility/skills.d.ts +0 -82
  770. package/dist/types/extensibility/slash-commands.d.ts +0 -48
  771. package/dist/types/extensibility/tool-proxy.d.ts +0 -4
  772. package/dist/types/extensibility/typebox.d.ts +0 -155
  773. package/dist/types/extensibility/utils.d.ts +0 -12
  774. package/dist/types/goals/index.d.ts +0 -3
  775. package/dist/types/goals/runtime.d.ts +0 -63
  776. package/dist/types/goals/state.d.ts +0 -32
  777. package/dist/types/goals/tools/goal-tool.d.ts +0 -62
  778. package/dist/types/harness-control-plane/classifier.d.ts +0 -13
  779. package/dist/types/harness-control-plane/control-endpoint.d.ts +0 -31
  780. package/dist/types/harness-control-plane/finalize.d.ts +0 -60
  781. package/dist/types/harness-control-plane/gc-adapter.d.ts +0 -3
  782. package/dist/types/harness-control-plane/operate.d.ts +0 -35
  783. package/dist/types/harness-control-plane/owner.d.ts +0 -53
  784. package/dist/types/harness-control-plane/phase-rollup.d.ts +0 -23
  785. package/dist/types/harness-control-plane/preserve.d.ts +0 -19
  786. package/dist/types/harness-control-plane/receipt-ingest.d.ts +0 -19
  787. package/dist/types/harness-control-plane/receipt-spool.d.ts +0 -19
  788. package/dist/types/harness-control-plane/receipts.d.ts +0 -149
  789. package/dist/types/harness-control-plane/rpc-adapter.d.ts +0 -69
  790. package/dist/types/harness-control-plane/seams.d.ts +0 -21
  791. package/dist/types/harness-control-plane/session-lease.d.ts +0 -65
  792. package/dist/types/harness-control-plane/state-machine.d.ts +0 -24
  793. package/dist/types/harness-control-plane/storage.d.ts +0 -81
  794. package/dist/types/harness-control-plane/types.d.ts +0 -187
  795. package/dist/types/hashline/anchors.d.ts +0 -20
  796. package/dist/types/hashline/apply.d.ts +0 -14
  797. package/dist/types/hashline/constants.d.ts +0 -19
  798. package/dist/types/hashline/diff-preview.d.ts +0 -2
  799. package/dist/types/hashline/diff.d.ts +0 -17
  800. package/dist/types/hashline/execute.d.ts +0 -4
  801. package/dist/types/hashline/hash.d.ts +0 -123
  802. package/dist/types/hashline/index.d.ts +0 -13
  803. package/dist/types/hashline/input.d.ts +0 -11
  804. package/dist/types/hashline/parser.d.ts +0 -7
  805. package/dist/types/hashline/prefixes.d.ts +0 -7
  806. package/dist/types/hashline/recovery.d.ts +0 -27
  807. package/dist/types/hashline/stream.d.ts +0 -2
  808. package/dist/types/hashline/types.d.ts +0 -77
  809. package/dist/types/hindsight/backend.d.ts +0 -13
  810. package/dist/types/hindsight/bank.d.ts +0 -54
  811. package/dist/types/hindsight/client.d.ts +0 -224
  812. package/dist/types/hindsight/config.d.ts +0 -51
  813. package/dist/types/hindsight/content.d.ts +0 -70
  814. package/dist/types/hindsight/index.d.ts +0 -8
  815. package/dist/types/hindsight/mental-models.d.ts +0 -125
  816. package/dist/types/hindsight/state.d.ts +0 -99
  817. package/dist/types/hindsight/transcript.d.ts +0 -28
  818. package/dist/types/hooks/codex-native-hooks-config.d.ts +0 -29
  819. package/dist/types/hooks/native-skill-hook.d.ts +0 -28
  820. package/dist/types/hooks/skill-keywords.d.ts +0 -18
  821. package/dist/types/hooks/skill-state.d.ts +0 -93
  822. package/dist/types/i18n/index.d.ts +0 -38
  823. package/dist/types/i18n/messages/de.d.ts +0 -2
  824. package/dist/types/i18n/messages/de.messages.d.ts +0 -1
  825. package/dist/types/i18n/messages/de.settings.d.ts +0 -1
  826. package/dist/types/i18n/messages/en.d.ts +0 -81
  827. package/dist/types/i18n/messages/es.d.ts +0 -2
  828. package/dist/types/i18n/messages/es.messages.d.ts +0 -1
  829. package/dist/types/i18n/messages/es.settings.d.ts +0 -1
  830. package/dist/types/i18n/messages/fr.d.ts +0 -2
  831. package/dist/types/i18n/messages/fr.messages.d.ts +0 -1
  832. package/dist/types/i18n/messages/fr.settings.d.ts +0 -1
  833. package/dist/types/i18n/messages/ja.d.ts +0 -2
  834. package/dist/types/i18n/messages/ja.messages.d.ts +0 -1
  835. package/dist/types/i18n/messages/ja.settings.d.ts +0 -1
  836. package/dist/types/i18n/messages/ko.d.ts +0 -2
  837. package/dist/types/i18n/messages/ko.messages.d.ts +0 -1
  838. package/dist/types/i18n/messages/ko.settings.d.ts +0 -1
  839. package/dist/types/i18n/messages/zh.d.ts +0 -2
  840. package/dist/types/i18n/messages/zh.messages.d.ts +0 -1
  841. package/dist/types/i18n/messages/zh.settings.d.ts +0 -1
  842. package/dist/types/index.d.ts +0 -33
  843. package/dist/types/internal-urls/agent-protocol.d.ts +0 -12
  844. package/dist/types/internal-urls/artifact-protocol.d.ts +0 -6
  845. package/dist/types/internal-urls/docs-index.generated.d.ts +0 -2
  846. package/dist/types/internal-urls/index.d.ts +0 -20
  847. package/dist/types/internal-urls/issue-pr-protocol.d.ts +0 -17
  848. package/dist/types/internal-urls/json-query.d.ts +0 -30
  849. package/dist/types/internal-urls/local-protocol.d.ts +0 -43
  850. package/dist/types/internal-urls/mcp-protocol.d.ts +0 -12
  851. package/dist/types/internal-urls/memory-protocol.d.ts +0 -23
  852. package/dist/types/internal-urls/parse.d.ts +0 -19
  853. package/dist/types/internal-urls/registry-helpers.d.ts +0 -11
  854. package/dist/types/internal-urls/router.d.ts +0 -14
  855. package/dist/types/internal-urls/rule-protocol.d.ts +0 -6
  856. package/dist/types/internal-urls/skc-protocol.d.ts +0 -12
  857. package/dist/types/internal-urls/skill-protocol.d.ts +0 -13
  858. package/dist/types/internal-urls/types.d.ts +0 -109
  859. package/dist/types/lsp/client.d.ts +0 -66
  860. package/dist/types/lsp/clients/biome-client.d.ts +0 -16
  861. package/dist/types/lsp/clients/index.d.ts +0 -19
  862. package/dist/types/lsp/clients/lsp-linter-client.d.ts +0 -16
  863. package/dist/types/lsp/clients/swiftlint-client.d.ts +0 -20
  864. package/dist/types/lsp/config.d.ts +0 -65
  865. package/dist/types/lsp/edits.d.ts +0 -23
  866. package/dist/types/lsp/index.d.ts +0 -130
  867. package/dist/types/lsp/lspmux.d.ts +0 -58
  868. package/dist/types/lsp/render.d.ts +0 -32
  869. package/dist/types/lsp/startup-events.d.ts +0 -12
  870. package/dist/types/lsp/types.d.ts +0 -306
  871. package/dist/types/lsp/utils.d.ts +0 -108
  872. package/dist/types/main.d.ts +0 -139
  873. package/dist/types/memories/index.d.ts +0 -28
  874. package/dist/types/memories/storage.d.ts +0 -110
  875. package/dist/types/memory-backend/index.d.ts +0 -4
  876. package/dist/types/memory-backend/local-backend.d.ts +0 -9
  877. package/dist/types/memory-backend/off-backend.d.ts +0 -7
  878. package/dist/types/memory-backend/resolve.d.ts +0 -15
  879. package/dist/types/memory-backend/types.d.ts +0 -61
  880. package/dist/types/migrate/action-planner.d.ts +0 -11
  881. package/dist/types/migrate/adapters/claude-code.d.ts +0 -2
  882. package/dist/types/migrate/adapters/codex.d.ts +0 -5
  883. package/dist/types/migrate/adapters/index.d.ts +0 -45
  884. package/dist/types/migrate/adapters/opencode.d.ts +0 -2
  885. package/dist/types/migrate/executor.d.ts +0 -2
  886. package/dist/types/migrate/mcp-mapper.d.ts +0 -20
  887. package/dist/types/migrate/report.d.ts +0 -18
  888. package/dist/types/migrate/skill-normalizer.d.ts +0 -27
  889. package/dist/types/migrate/types.d.ts +0 -126
  890. package/dist/types/modes/acp/acp-agent.d.ts +0 -78
  891. package/dist/types/modes/acp/acp-client-bridge.d.ts +0 -9
  892. package/dist/types/modes/acp/acp-event-mapper.d.ts +0 -36
  893. package/dist/types/modes/acp/acp-mode.d.ts +0 -17
  894. package/dist/types/modes/acp/index.d.ts +0 -2
  895. package/dist/types/modes/acp/terminal-auth.d.ts +0 -6
  896. package/dist/types/modes/bridge/auth.d.ts +0 -12
  897. package/dist/types/modes/bridge/bridge-client-bridge.d.ts +0 -9
  898. package/dist/types/modes/bridge/bridge-mode.d.ts +0 -47
  899. package/dist/types/modes/bridge/bridge-ui-context.d.ts +0 -88
  900. package/dist/types/modes/bridge/event-stream.d.ts +0 -8
  901. package/dist/types/modes/components/agent-dashboard.d.ts +0 -21
  902. package/dist/types/modes/components/assistant-message.d.ts +0 -20
  903. package/dist/types/modes/components/bash-execution.d.ts +0 -29
  904. package/dist/types/modes/components/bordered-loader.d.ts +0 -11
  905. package/dist/types/modes/components/branch-summary-message.d.ts +0 -13
  906. package/dist/types/modes/components/btw-panel.d.ts +0 -16
  907. package/dist/types/modes/components/compaction-summary-message.d.ts +0 -13
  908. package/dist/types/modes/components/countdown-timer.d.ts +0 -14
  909. package/dist/types/modes/components/custom-editor.d.ts +0 -69
  910. package/dist/types/modes/components/custom-message.d.ts +0 -15
  911. package/dist/types/modes/components/custom-model-preset-wizard.d.ts +0 -12
  912. package/dist/types/modes/components/custom-provider-wizard.d.ts +0 -10
  913. package/dist/types/modes/components/diff.d.ts +0 -11
  914. package/dist/types/modes/components/dynamic-border.d.ts +0 -14
  915. package/dist/types/modes/components/eval-execution.d.ts +0 -23
  916. package/dist/types/modes/components/execution-shared.d.ts +0 -46
  917. package/dist/types/modes/components/extensions/extension-dashboard.d.ts +0 -26
  918. package/dist/types/modes/components/extensions/extension-list.d.ts +0 -39
  919. package/dist/types/modes/components/extensions/index.d.ts +0 -8
  920. package/dist/types/modes/components/extensions/inspector-panel.d.ts +0 -8
  921. package/dist/types/modes/components/extensions/state-manager.d.ts +0 -50
  922. package/dist/types/modes/components/extensions/types.d.ts +0 -151
  923. package/dist/types/modes/components/footer.d.ts +0 -30
  924. package/dist/types/modes/components/history-search.d.ts +0 -7
  925. package/dist/types/modes/components/hook-editor.d.ts +0 -18
  926. package/dist/types/modes/components/hook-input.d.ts +0 -15
  927. package/dist/types/modes/components/hook-message.d.ts +0 -15
  928. package/dist/types/modes/components/hook-selector.d.ts +0 -59
  929. package/dist/types/modes/components/index.d.ts +0 -35
  930. package/dist/types/modes/components/irc-sidebar.d.ts +0 -32
  931. package/dist/types/modes/components/jobs-overlay-model.d.ts +0 -31
  932. package/dist/types/modes/components/jobs-overlay.d.ts +0 -30
  933. package/dist/types/modes/components/keybinding-hints.d.ts +0 -40
  934. package/dist/types/modes/components/login-dialog.d.ts +0 -32
  935. package/dist/types/modes/components/message-frame.d.ts +0 -42
  936. package/dist/types/modes/components/model-selector.d.ts +0 -60
  937. package/dist/types/modes/components/oauth-selector.d.ts +0 -17
  938. package/dist/types/modes/components/pet-selector.d.ts +0 -11
  939. package/dist/types/modes/components/plugin-selector.d.ts +0 -26
  940. package/dist/types/modes/components/plugin-settings.d.ts +0 -66
  941. package/dist/types/modes/components/provider-onboarding-selector.d.ts +0 -7
  942. package/dist/types/modes/components/queue-mode-selector.d.ts +0 -9
  943. package/dist/types/modes/components/queued-message-selector.d.ts +0 -12
  944. package/dist/types/modes/components/read-tool-group.d.ts +0 -30
  945. package/dist/types/modes/components/runtime-mcp-add-wizard.d.ts +0 -26
  946. package/dist/types/modes/components/sayknow-pet-widget.d.ts +0 -59
  947. package/dist/types/modes/components/session-observer-overlay.d.ts +0 -11
  948. package/dist/types/modes/components/session-selector.d.ts +0 -43
  949. package/dist/types/modes/components/settings-defs.d.ts +0 -50
  950. package/dist/types/modes/components/settings-selector.d.ts +0 -64
  951. package/dist/types/modes/components/show-images-selector.d.ts +0 -9
  952. package/dist/types/modes/components/skill-hud/render.d.ts +0 -2
  953. package/dist/types/modes/components/skill-message.d.ts +0 -10
  954. package/dist/types/modes/components/status-line/context-thresholds.d.ts +0 -4
  955. package/dist/types/modes/components/status-line/git-utils.d.ts +0 -28
  956. package/dist/types/modes/components/status-line/index.d.ts +0 -4
  957. package/dist/types/modes/components/status-line/presets.d.ts +0 -3
  958. package/dist/types/modes/components/status-line/segments.d.ts +0 -5
  959. package/dist/types/modes/components/status-line/separators.d.ts +0 -3
  960. package/dist/types/modes/components/status-line/token-rate.d.ts +0 -10
  961. package/dist/types/modes/components/status-line/types.d.ts +0 -83
  962. package/dist/types/modes/components/status-line.d.ts +0 -94
  963. package/dist/types/modes/components/theme-selector.d.ts +0 -10
  964. package/dist/types/modes/components/thinking-selector.d.ts +0 -15
  965. package/dist/types/modes/components/todo-reminder.d.ts +0 -13
  966. package/dist/types/modes/components/tool-execution.d.ts +0 -55
  967. package/dist/types/modes/components/tree-selector.d.ts +0 -31
  968. package/dist/types/modes/components/ttsr-notification.d.ts +0 -13
  969. package/dist/types/modes/components/two-column-body.d.ts +0 -9
  970. package/dist/types/modes/components/user-message-selector.d.ts +0 -28
  971. package/dist/types/modes/components/user-message.d.ts +0 -8
  972. package/dist/types/modes/components/visual-truncate.d.ts +0 -19
  973. package/dist/types/modes/components/welcome.d.ts +0 -46
  974. package/dist/types/modes/controllers/btw-controller.d.ts +0 -10
  975. package/dist/types/modes/controllers/command-controller-shared.d.ts +0 -47
  976. package/dist/types/modes/controllers/command-controller.d.ts +0 -40
  977. package/dist/types/modes/controllers/event-controller.d.ts +0 -21
  978. package/dist/types/modes/controllers/extension-ui-controller.d.ts +0 -80
  979. package/dist/types/modes/controllers/input-controller.d.ts +0 -42
  980. package/dist/types/modes/controllers/runtime-mcp-command-controller.d.ts +0 -10
  981. package/dist/types/modes/controllers/selector-controller.d.ts +0 -68
  982. package/dist/types/modes/controllers/ssh-command-controller.d.ts +0 -10
  983. package/dist/types/modes/controllers/todo-command-controller.d.ts +0 -7
  984. package/dist/types/modes/emoji-autocomplete.d.ts +0 -16
  985. package/dist/types/modes/index.d.ts +0 -10
  986. package/dist/types/modes/interactive-mode.d.ts +0 -297
  987. package/dist/types/modes/irc-observation-ledger.d.ts +0 -22
  988. package/dist/types/modes/jobs-observer.d.ts +0 -57
  989. package/dist/types/modes/oauth-manual-input.d.ts +0 -8
  990. package/dist/types/modes/print-mode.d.ts +0 -44
  991. package/dist/types/modes/prompt-action-autocomplete.d.ts +0 -50
  992. package/dist/types/modes/rpc/host-tools.d.ts +0 -1
  993. package/dist/types/modes/rpc/host-uris.d.ts +0 -1
  994. package/dist/types/modes/rpc/rpc-client.d.ts +0 -299
  995. package/dist/types/modes/rpc/rpc-mode.d.ts +0 -86
  996. package/dist/types/modes/rpc/rpc-socket-security.d.ts +0 -10
  997. package/dist/types/modes/rpc/rpc-types.d.ts +0 -810
  998. package/dist/types/modes/runtime-init.d.ts +0 -21
  999. package/dist/types/modes/session-observer-registry.d.ts +0 -26
  1000. package/dist/types/modes/shared/agent-wire/approval-gate.d.ts +0 -57
  1001. package/dist/types/modes/shared/agent-wire/command-contract.d.ts +0 -18
  1002. package/dist/types/modes/shared/agent-wire/command-dispatch.d.ts +0 -37
  1003. package/dist/types/modes/shared/agent-wire/command-validation.d.ts +0 -2
  1004. package/dist/types/modes/shared/agent-wire/deep-interview-gate.d.ts +0 -102
  1005. package/dist/types/modes/shared/agent-wire/event-contract.d.ts +0 -103
  1006. package/dist/types/modes/shared/agent-wire/event-envelope.d.ts +0 -60
  1007. package/dist/types/modes/shared/agent-wire/event-observation.d.ts +0 -37
  1008. package/dist/types/modes/shared/agent-wire/handshake.d.ts +0 -56
  1009. package/dist/types/modes/shared/agent-wire/host-tool-bridge.d.ts +0 -16
  1010. package/dist/types/modes/shared/agent-wire/host-uri-bridge.d.ts +0 -17
  1011. package/dist/types/modes/shared/agent-wire/protocol.d.ts +0 -25
  1012. package/dist/types/modes/shared/agent-wire/responses.d.ts +0 -4
  1013. package/dist/types/modes/shared/agent-wire/scopes.d.ts +0 -18
  1014. package/dist/types/modes/shared/agent-wire/session-registry.d.ts +0 -25
  1015. package/dist/types/modes/shared/agent-wire/ui-request-broker.d.ts +0 -42
  1016. package/dist/types/modes/shared/agent-wire/ui-result.d.ts +0 -27
  1017. package/dist/types/modes/shared/agent-wire/unattended-action-policy.d.ts +0 -29
  1018. package/dist/types/modes/shared/agent-wire/unattended-audit.d.ts +0 -68
  1019. package/dist/types/modes/shared/agent-wire/unattended-run-controller.d.ts +0 -166
  1020. package/dist/types/modes/shared/agent-wire/unattended-session.d.ts +0 -127
  1021. package/dist/types/modes/shared/agent-wire/workflow-gate-broker.d.ts +0 -154
  1022. package/dist/types/modes/shared/agent-wire/workflow-gate-schema.d.ts +0 -39
  1023. package/dist/types/modes/shared.d.ts +0 -15
  1024. package/dist/types/modes/slash-command-visibility.d.ts +0 -1
  1025. package/dist/types/modes/theme/defaults/index.d.ts +0 -652
  1026. package/dist/types/modes/theme/mermaid-cache.d.ts +0 -9
  1027. package/dist/types/modes/theme/shimmer.d.ts +0 -38
  1028. package/dist/types/modes/theme/theme.d.ts +0 -275
  1029. package/dist/types/modes/tmux-scroll.d.ts +0 -18
  1030. package/dist/types/modes/types.d.ts +0 -318
  1031. package/dist/types/modes/utils/abort-message.d.ts +0 -4
  1032. package/dist/types/modes/utils/context-usage.d.ts +0 -36
  1033. package/dist/types/modes/utils/hotkeys-markdown.d.ts +0 -5
  1034. package/dist/types/modes/utils/injected-user-submission.d.ts +0 -52
  1035. package/dist/types/modes/utils/irc-message.d.ts +0 -38
  1036. package/dist/types/modes/utils/keybinding-matchers.d.ts +0 -10
  1037. package/dist/types/modes/utils/terminal-bell.d.ts +0 -3
  1038. package/dist/types/modes/utils/tools-markdown.d.ts +0 -5
  1039. package/dist/types/modes/utils/ui-helpers.d.ts +0 -75
  1040. package/dist/types/notifications/attachment-registry.d.ts +0 -17
  1041. package/dist/types/notifications/chat-adapters.d.ts +0 -9
  1042. package/dist/types/notifications/config-commands.d.ts +0 -64
  1043. package/dist/types/notifications/config.d.ts +0 -132
  1044. package/dist/types/notifications/daemon-paths.d.ts +0 -17
  1045. package/dist/types/notifications/engine.d.ts +0 -59
  1046. package/dist/types/notifications/helpers.d.ts +0 -55
  1047. package/dist/types/notifications/html-format.d.ts +0 -75
  1048. package/dist/types/notifications/index.d.ts +0 -219
  1049. package/dist/types/notifications/lifecycle-commands.d.ts +0 -69
  1050. package/dist/types/notifications/lifecycle-control-runtime.d.ts +0 -107
  1051. package/dist/types/notifications/lifecycle-orchestrator.d.ts +0 -144
  1052. package/dist/types/notifications/managed-daemon.d.ts +0 -48
  1053. package/dist/types/notifications/notification-service.d.ts +0 -144
  1054. package/dist/types/notifications/operator-runtime.d.ts +0 -52
  1055. package/dist/types/notifications/rate-limit-pool.d.ts +0 -113
  1056. package/dist/types/notifications/recent-activity.d.ts +0 -39
  1057. package/dist/types/notifications/reply-sent-store.d.ts +0 -53
  1058. package/dist/types/notifications/rich-draft.d.ts +0 -68
  1059. package/dist/types/notifications/rich-render.d.ts +0 -90
  1060. package/dist/types/notifications/telegram-cli.d.ts +0 -19
  1061. package/dist/types/notifications/telegram-daemon-cli.d.ts +0 -28
  1062. package/dist/types/notifications/telegram-daemon-control.d.ts +0 -70
  1063. package/dist/types/notifications/telegram-daemon.d.ts +0 -558
  1064. package/dist/types/notifications/telegram-reference.d.ts +0 -136
  1065. package/dist/types/notifications/threaded-inbound.d.ts +0 -77
  1066. package/dist/types/notifications/threaded-render.d.ts +0 -88
  1067. package/dist/types/notifications/topic-registry.d.ts +0 -89
  1068. package/dist/types/plan-mode/approved-plan.d.ts +0 -49
  1069. package/dist/types/plan-mode/state.d.ts +0 -6
  1070. package/dist/types/registry/agent-registry.d.ts +0 -64
  1071. package/dist/types/reminders/star-reminder.d.ts +0 -115
  1072. package/dist/types/research-plan/index.d.ts +0 -1
  1073. package/dist/types/research-plan/ledger.d.ts +0 -33
  1074. package/dist/types/rlm/artifacts.d.ts +0 -9
  1075. package/dist/types/rlm/complete-research-tool.d.ts +0 -35
  1076. package/dist/types/rlm/data-context.d.ts +0 -6
  1077. package/dist/types/rlm/index.d.ts +0 -47
  1078. package/dist/types/rlm/notebook.d.ts +0 -12
  1079. package/dist/types/rlm/preset.d.ts +0 -23
  1080. package/dist/types/rlm/python-tool.d.ts +0 -16
  1081. package/dist/types/rlm/report.d.ts +0 -14
  1082. package/dist/types/rlm/types.d.ts +0 -37
  1083. package/dist/types/runtime/process-lifecycle.d.ts +0 -108
  1084. package/dist/types/runtime-api-key.d.ts +0 -7
  1085. package/dist/types/runtime-credential-selector.d.ts +0 -7
  1086. package/dist/types/runtime-mcp/client.d.ts +0 -74
  1087. package/dist/types/runtime-mcp/config-writer.d.ts +0 -89
  1088. package/dist/types/runtime-mcp/config.d.ts +0 -77
  1089. package/dist/types/runtime-mcp/discoverable-tool-metadata.d.ts +0 -7
  1090. package/dist/types/runtime-mcp/index.d.ts +0 -18
  1091. package/dist/types/runtime-mcp/json-rpc.d.ts +0 -22
  1092. package/dist/types/runtime-mcp/loader.d.ts +0 -45
  1093. package/dist/types/runtime-mcp/manager.d.ts +0 -195
  1094. package/dist/types/runtime-mcp/oauth-discovery.d.ts +0 -40
  1095. package/dist/types/runtime-mcp/oauth-flow.d.ts +0 -59
  1096. package/dist/types/runtime-mcp/render.d.ts +0 -25
  1097. package/dist/types/runtime-mcp/smithery-auth.d.ts +0 -16
  1098. package/dist/types/runtime-mcp/smithery-connect.d.ts +0 -38
  1099. package/dist/types/runtime-mcp/smithery-registry.d.ts +0 -51
  1100. package/dist/types/runtime-mcp/tool-bridge.d.ts +0 -86
  1101. package/dist/types/runtime-mcp/tool-cache.d.ts +0 -8
  1102. package/dist/types/runtime-mcp/transports/http.d.ts +0 -36
  1103. package/dist/types/runtime-mcp/transports/index.d.ts +0 -5
  1104. package/dist/types/runtime-mcp/transports/stdio.d.ts +0 -29
  1105. package/dist/types/runtime-mcp/types.d.ts +0 -349
  1106. package/dist/types/sdk.d.ts +0 -256
  1107. package/dist/types/secrets/index.d.ts +0 -9
  1108. package/dist/types/secrets/obfuscator.d.ts +0 -23
  1109. package/dist/types/secrets/regex.d.ts +0 -2
  1110. package/dist/types/session/agent-session.d.ts +0 -1238
  1111. package/dist/types/session/agent-storage.d.ts +0 -101
  1112. package/dist/types/session/artifacts.d.ts +0 -64
  1113. package/dist/types/session/auth-broker-config.d.ts +0 -13
  1114. package/dist/types/session/auth-storage.d.ts +0 -6
  1115. package/dist/types/session/blob-store.d.ts +0 -160
  1116. package/dist/types/session/cache-economics.d.ts +0 -79
  1117. package/dist/types/session/client-bridge.d.ts +0 -88
  1118. package/dist/types/session/context-estimation.d.ts +0 -31
  1119. package/dist/types/session/contribution-prep.d.ts +0 -47
  1120. package/dist/types/session/file-mention-pruning.d.ts +0 -8
  1121. package/dist/types/session/history-storage.d.ts +0 -16
  1122. package/dist/types/session/messages.d.ts +0 -169
  1123. package/dist/types/session/provider-safety-stop.d.ts +0 -5
  1124. package/dist/types/session/session-dump-format.d.ts +0 -22
  1125. package/dist/types/session/session-manager.d.ts +0 -781
  1126. package/dist/types/session/session-storage.d.ts +0 -230
  1127. package/dist/types/session/streaming-output.d.ts +0 -209
  1128. package/dist/types/session/tool-choice-queue.d.ts +0 -84
  1129. package/dist/types/session/yield-queue.d.ts +0 -24
  1130. package/dist/types/setup/credential-auto-import.d.ts +0 -63
  1131. package/dist/types/setup/credential-import.d.ts +0 -82
  1132. package/dist/types/setup/hermes-setup.d.ts +0 -78
  1133. package/dist/types/setup/host-plugin-setup.d.ts +0 -39
  1134. package/dist/types/setup/model-onboarding-guidance.d.ts +0 -9
  1135. package/dist/types/setup/provider-onboarding.d.ts +0 -52
  1136. package/dist/types/skc-runtime/cli-write-receipt.d.ts +0 -24
  1137. package/dist/types/skc-runtime/deep-interview-ambiguity.d.ts +0 -39
  1138. package/dist/types/skc-runtime/deep-interview-recorder.d.ts +0 -114
  1139. package/dist/types/skc-runtime/deep-interview-runtime.d.ts +0 -36
  1140. package/dist/types/skc-runtime/deep-interview-state.d.ts +0 -127
  1141. package/dist/types/skc-runtime/gc-render.d.ts +0 -6
  1142. package/dist/types/skc-runtime/gc-runtime.d.ts +0 -134
  1143. package/dist/types/skc-runtime/goal-mode-request.d.ts +0 -53
  1144. package/dist/types/skc-runtime/launch-tmux.d.ts +0 -78
  1145. package/dist/types/skc-runtime/launch-worktree.d.ts +0 -46
  1146. package/dist/types/skc-runtime/ledger-event-renderer.d.ts +0 -68
  1147. package/dist/types/skc-runtime/psmux-detect.d.ts +0 -78
  1148. package/dist/types/skc-runtime/ralplan-runtime.d.ts +0 -26
  1149. package/dist/types/skc-runtime/restricted-role-agent-bash.d.ts +0 -3
  1150. package/dist/types/skc-runtime/session-layout.d.ts +0 -59
  1151. package/dist/types/skc-runtime/session-resolution.d.ts +0 -47
  1152. package/dist/types/skc-runtime/session-state-sidecar.d.ts +0 -70
  1153. package/dist/types/skc-runtime/state-graph.d.ts +0 -4
  1154. package/dist/types/skc-runtime/state-migrations.d.ts +0 -33
  1155. package/dist/types/skc-runtime/state-renderer.d.ts +0 -70
  1156. package/dist/types/skc-runtime/state-runtime.d.ts +0 -38
  1157. package/dist/types/skc-runtime/state-schema.d.ts +0 -319
  1158. package/dist/types/skc-runtime/state-validation.d.ts +0 -6
  1159. package/dist/types/skc-runtime/state-writer.d.ts +0 -244
  1160. package/dist/types/skc-runtime/team-gc.d.ts +0 -7
  1161. package/dist/types/skc-runtime/team-runtime.d.ts +0 -355
  1162. package/dist/types/skc-runtime/tmux-common.d.ts +0 -111
  1163. package/dist/types/skc-runtime/tmux-gc.d.ts +0 -7
  1164. package/dist/types/skc-runtime/tmux-owner-isolation-cli.d.ts +0 -5
  1165. package/dist/types/skc-runtime/tmux-owner-isolation.d.ts +0 -309
  1166. package/dist/types/skc-runtime/tmux-sessions.d.ts +0 -94
  1167. package/dist/types/skc-runtime/ultragoal-guard.d.ts +0 -93
  1168. package/dist/types/skc-runtime/ultragoal-receipt-freshness.d.ts +0 -42
  1169. package/dist/types/skc-runtime/ultragoal-runtime.d.ts +0 -410
  1170. package/dist/types/skc-runtime/workflow-command-ref.d.ts +0 -43
  1171. package/dist/types/skc-runtime/workflow-manifest.d.ts +0 -54
  1172. package/dist/types/skill-state/active-state.d.ts +0 -126
  1173. package/dist/types/skill-state/canonical-skills.d.ts +0 -3
  1174. package/dist/types/skill-state/deep-interview-mutation-guard.d.ts +0 -38
  1175. package/dist/types/skill-state/initial-phase.d.ts +0 -12
  1176. package/dist/types/skill-state/workflow-hud.d.ts +0 -83
  1177. package/dist/types/skill-state/workflow-state-contract.d.ts +0 -57
  1178. package/dist/types/skill-state/workflow-state-version.d.ts +0 -3
  1179. package/dist/types/slash-commands/acp-builtins.d.ts +0 -18
  1180. package/dist/types/slash-commands/builtin-registry.d.ts +0 -24
  1181. package/dist/types/slash-commands/helpers/context-report.d.ts +0 -7
  1182. package/dist/types/slash-commands/helpers/fast-status-report.d.ts +0 -82
  1183. package/dist/types/slash-commands/helpers/format.d.ts +0 -10
  1184. package/dist/types/slash-commands/helpers/mcp.d.ts +0 -3
  1185. package/dist/types/slash-commands/helpers/parse.d.ts +0 -33
  1186. package/dist/types/slash-commands/helpers/ssh.d.ts +0 -3
  1187. package/dist/types/slash-commands/helpers/todo.d.ts +0 -3
  1188. package/dist/types/slash-commands/helpers/usage-report.d.ts +0 -7
  1189. package/dist/types/slash-commands/types.d.ts +0 -120
  1190. package/dist/types/ssh/config-writer.d.ts +0 -49
  1191. package/dist/types/ssh/connection-manager.d.ts +0 -33
  1192. package/dist/types/ssh/ssh-executor.d.ts +0 -37
  1193. package/dist/types/ssh/sshfs-mount.d.ts +0 -6
  1194. package/dist/types/ssh/utils.d.ts +0 -2
  1195. package/dist/types/stt/downloader.d.ts +0 -9
  1196. package/dist/types/stt/index.d.ts +0 -3
  1197. package/dist/types/stt/recorder.d.ts +0 -13
  1198. package/dist/types/stt/setup.d.ts +0 -18
  1199. package/dist/types/stt/stt-controller.d.ts +0 -16
  1200. package/dist/types/stt/transcriber.d.ts +0 -16
  1201. package/dist/types/system-prompt.d.ts +0 -118
  1202. package/dist/types/task/agents.d.ts +0 -28
  1203. package/dist/types/task/commands.d.ts +0 -35
  1204. package/dist/types/task/discovery.d.ts +0 -19
  1205. package/dist/types/task/executor.d.ts +0 -127
  1206. package/dist/types/task/fork-context-advisory.d.ts +0 -13
  1207. package/dist/types/task/fork-context-budget.d.ts +0 -7
  1208. package/dist/types/task/id.d.ts +0 -7
  1209. package/dist/types/task/index.d.ts +0 -43
  1210. package/dist/types/task/name-generator.d.ts +0 -16
  1211. package/dist/types/task/output-manager.d.ts +0 -36
  1212. package/dist/types/task/parallel.d.ts +0 -34
  1213. package/dist/types/task/receipt.d.ts +0 -89
  1214. package/dist/types/task/render.d.ts +0 -28
  1215. package/dist/types/task/roi-reconciliation.d.ts +0 -27
  1216. package/dist/types/task/simple-mode.d.ts +0 -8
  1217. package/dist/types/task/skc-command.d.ts +0 -7
  1218. package/dist/types/task/spawn-gate.d.ts +0 -29
  1219. package/dist/types/task/subprocess-tool-registry.d.ts +0 -72
  1220. package/dist/types/task/token-log.d.ts +0 -30
  1221. package/dist/types/task/token-log.test.d.ts +0 -1
  1222. package/dist/types/task/types.d.ts +0 -516
  1223. package/dist/types/task/worktree.d.ts +0 -94
  1224. package/dist/types/thinking-metadata.d.ts +0 -16
  1225. package/dist/types/thinking.d.ts +0 -22
  1226. package/dist/types/tool-discovery/tool-index.d.ts +0 -112
  1227. package/dist/types/tools/archive-reader.d.ts +0 -40
  1228. package/dist/types/tools/ask-answer-registry.d.ts +0 -18
  1229. package/dist/types/tools/ask.d.ts +0 -123
  1230. package/dist/types/tools/ast-edit.d.ts +0 -77
  1231. package/dist/types/tools/ast-grep.d.ts +0 -69
  1232. package/dist/types/tools/auto-generated-guard.d.ts +0 -17
  1233. package/dist/types/tools/bash-allowed-prefixes.d.ts +0 -10
  1234. package/dist/types/tools/bash-command-fixup.d.ts +0 -11
  1235. package/dist/types/tools/bash-interactive.d.ts +0 -16
  1236. package/dist/types/tools/bash-interceptor.d.ts +0 -24
  1237. package/dist/types/tools/bash-pty-selection.d.ts +0 -7
  1238. package/dist/types/tools/bash-skill-urls.d.ts +0 -31
  1239. package/dist/types/tools/bash.d.ts +0 -157
  1240. package/dist/types/tools/bisect.d.ts +0 -81
  1241. package/dist/types/tools/browser/actions.d.ts +0 -54
  1242. package/dist/types/tools/browser/attach.d.ts +0 -50
  1243. package/dist/types/tools/browser/launch.d.ts +0 -62
  1244. package/dist/types/tools/browser/readable.d.ts +0 -17
  1245. package/dist/types/tools/browser/registry.d.ts +0 -57
  1246. package/dist/types/tools/browser/render.d.ts +0 -53
  1247. package/dist/types/tools/browser/tab-protocol.d.ts +0 -144
  1248. package/dist/types/tools/browser/tab-supervisor.d.ts +0 -109
  1249. package/dist/types/tools/browser/tab-worker-entry.d.ts +0 -1
  1250. package/dist/types/tools/browser/tab-worker.d.ts +0 -19
  1251. package/dist/types/tools/browser.d.ts +0 -211
  1252. package/dist/types/tools/calculator.d.ts +0 -76
  1253. package/dist/types/tools/checkpoint.d.ts +0 -63
  1254. package/dist/types/tools/composer-bash-policy.d.ts +0 -14
  1255. package/dist/types/tools/computer/render.d.ts +0 -17
  1256. package/dist/types/tools/computer-gc.d.ts +0 -23
  1257. package/dist/types/tools/computer.d.ts +0 -465
  1258. package/dist/types/tools/conflict-detect.d.ts +0 -205
  1259. package/dist/types/tools/context.d.ts +0 -19
  1260. package/dist/types/tools/cron.d.ts +0 -91
  1261. package/dist/types/tools/debug.d.ts +0 -209
  1262. package/dist/types/tools/eval.d.ts +0 -108
  1263. package/dist/types/tools/fetch.d.ts +0 -84
  1264. package/dist/types/tools/file-recorder.d.ts +0 -13
  1265. package/dist/types/tools/find.d.ts +0 -95
  1266. package/dist/types/tools/fs-cache-invalidation.d.ts +0 -15
  1267. package/dist/types/tools/gh-format.d.ts +0 -6
  1268. package/dist/types/tools/gh-renderer.d.ts +0 -25
  1269. package/dist/types/tools/gh.d.ts +0 -356
  1270. package/dist/types/tools/github-cache.d.ts +0 -103
  1271. package/dist/types/tools/grouped-file-output.d.ts +0 -36
  1272. package/dist/types/tools/hindsight-recall.d.ts +0 -21
  1273. package/dist/types/tools/hindsight-reflect.d.ts +0 -23
  1274. package/dist/types/tools/hindsight-retain.d.ts +0 -27
  1275. package/dist/types/tools/image-gen.d.ts +0 -79
  1276. package/dist/types/tools/index.d.ts +0 -371
  1277. package/dist/types/tools/irc.d.ts +0 -79
  1278. package/dist/types/tools/job.d.ts +0 -78
  1279. package/dist/types/tools/json-tree.d.ts +0 -23
  1280. package/dist/types/tools/jtd-to-json-schema.d.ts +0 -29
  1281. package/dist/types/tools/jtd-to-typescript.d.ts +0 -26
  1282. package/dist/types/tools/jtd-utils.d.ts +0 -42
  1283. package/dist/types/tools/list-limit.d.ts +0 -12
  1284. package/dist/types/tools/match-line-format.d.ts +0 -11
  1285. package/dist/types/tools/monitor.d.ts +0 -54
  1286. package/dist/types/tools/output-meta.d.ts +0 -204
  1287. package/dist/types/tools/path-utils.d.ts +0 -147
  1288. package/dist/types/tools/plan-mode-guard.d.ts +0 -18
  1289. package/dist/types/tools/read.d.ts +0 -85
  1290. package/dist/types/tools/recipe/index.d.ts +0 -45
  1291. package/dist/types/tools/recipe/render.d.ts +0 -36
  1292. package/dist/types/tools/recipe/runner.d.ts +0 -60
  1293. package/dist/types/tools/recipe/runners/cargo.d.ts +0 -16
  1294. package/dist/types/tools/recipe/runners/index.d.ts +0 -2
  1295. package/dist/types/tools/recipe/runners/just.d.ts +0 -2
  1296. package/dist/types/tools/recipe/runners/make.d.ts +0 -2
  1297. package/dist/types/tools/recipe/runners/pkg.d.ts +0 -2
  1298. package/dist/types/tools/recipe/runners/task.d.ts +0 -2
  1299. package/dist/types/tools/render-mermaid.d.ts +0 -37
  1300. package/dist/types/tools/render-utils.d.ts +0 -158
  1301. package/dist/types/tools/renderers.d.ts +0 -26
  1302. package/dist/types/tools/resolve.d.ts +0 -80
  1303. package/dist/types/tools/resource-gc.d.ts +0 -54
  1304. package/dist/types/tools/review.d.ts +0 -63
  1305. package/dist/types/tools/search-tool-bm25.d.ts +0 -65
  1306. package/dist/types/tools/search.d.ts +0 -93
  1307. package/dist/types/tools/skill-discovery.d.ts +0 -40
  1308. package/dist/types/tools/skill.d.ts +0 -48
  1309. package/dist/types/tools/sqlite-reader.d.ts +0 -94
  1310. package/dist/types/tools/ssh.d.ts +0 -67
  1311. package/dist/types/tools/subagent-render.d.ts +0 -31
  1312. package/dist/types/tools/subagent.d.ts +0 -117
  1313. package/dist/types/tools/telegram-send.d.ts +0 -39
  1314. package/dist/types/tools/todo-write.d.ts +0 -120
  1315. package/dist/types/tools/tool-errors.d.ts +0 -33
  1316. package/dist/types/tools/tool-result.d.ts +0 -30
  1317. package/dist/types/tools/tool-timeouts.d.ts +0 -56
  1318. package/dist/types/tools/ultragoal-ask-guard.d.ts +0 -12
  1319. package/dist/types/tools/vim.d.ts +0 -58
  1320. package/dist/types/tools/write.d.ts +0 -59
  1321. package/dist/types/tools/yield.d.ts +0 -25
  1322. package/dist/types/tui/code-cell.d.ts +0 -32
  1323. package/dist/types/tui/file-list.d.ts +0 -22
  1324. package/dist/types/tui/hyperlink.d.ts +0 -42
  1325. package/dist/types/tui/index.d.ts +0 -11
  1326. package/dist/types/tui/output-block.d.ts +0 -28
  1327. package/dist/types/tui/status-line.d.ts +0 -18
  1328. package/dist/types/tui/tree-list.d.ts +0 -19
  1329. package/dist/types/tui/types.d.ts +0 -13
  1330. package/dist/types/tui/utils.d.ts +0 -36
  1331. package/dist/types/utils/changelog.d.ts +0 -37
  1332. package/dist/types/utils/clipboard.d.ts +0 -22
  1333. package/dist/types/utils/cmux-workspace.d.ts +0 -52
  1334. package/dist/types/utils/command-args.d.ts +0 -9
  1335. package/dist/types/utils/commit-message-generator.d.ts +0 -7
  1336. package/dist/types/utils/edit-mode.d.ts +0 -13
  1337. package/dist/types/utils/event-bus.d.ts +0 -6
  1338. package/dist/types/utils/external-editor.d.ts +0 -19
  1339. package/dist/types/utils/file-display-mode.d.ts +0 -27
  1340. package/dist/types/utils/file-mentions.d.ts +0 -25
  1341. package/dist/types/utils/git.d.ts +0 -393
  1342. package/dist/types/utils/image-loading.d.ts +0 -26
  1343. package/dist/types/utils/image-resize.d.ts +0 -39
  1344. package/dist/types/utils/lang-from-path.d.ts +0 -8
  1345. package/dist/types/utils/linkedom.d.ts +0 -4
  1346. package/dist/types/utils/markit.d.ts +0 -7
  1347. package/dist/types/utils/open.d.ts +0 -2
  1348. package/dist/types/utils/pasted-image-path.d.ts +0 -32
  1349. package/dist/types/utils/session-color.d.ts +0 -10
  1350. package/dist/types/utils/shell-snapshot.d.ts +0 -5
  1351. package/dist/types/utils/sixel.d.ts +0 -21
  1352. package/dist/types/utils/title-generator.d.ts +0 -31
  1353. package/dist/types/utils/tool-choice.d.ts +0 -20
  1354. package/dist/types/utils/tools-manager.d.ts +0 -9
  1355. package/dist/types/vim/buffer.d.ts +0 -41
  1356. package/dist/types/vim/commands.d.ts +0 -6
  1357. package/dist/types/vim/engine.d.ts +0 -47
  1358. package/dist/types/vim/parser.d.ts +0 -3
  1359. package/dist/types/vim/render.d.ts +0 -25
  1360. package/dist/types/vim/types.d.ts +0 -182
  1361. package/dist/types/web/insane/bridge.d.ts +0 -103
  1362. package/dist/types/web/insane/url-guard.d.ts +0 -25
  1363. package/dist/types/web/kagi.d.ts +0 -23
  1364. package/dist/types/web/parallel.d.ts +0 -58
  1365. package/dist/types/web/scrapers/artifacthub.d.ts +0 -6
  1366. package/dist/types/web/scrapers/arxiv.d.ts +0 -5
  1367. package/dist/types/web/scrapers/aur.d.ts +0 -5
  1368. package/dist/types/web/scrapers/biorxiv.d.ts +0 -5
  1369. package/dist/types/web/scrapers/bluesky.d.ts +0 -5
  1370. package/dist/types/web/scrapers/brew.d.ts +0 -5
  1371. package/dist/types/web/scrapers/cheatsh.d.ts +0 -8
  1372. package/dist/types/web/scrapers/chocolatey.d.ts +0 -5
  1373. package/dist/types/web/scrapers/choosealicense.d.ts +0 -2
  1374. package/dist/types/web/scrapers/cisa-kev.d.ts +0 -5
  1375. package/dist/types/web/scrapers/clojars.d.ts +0 -5
  1376. package/dist/types/web/scrapers/coingecko.d.ts +0 -5
  1377. package/dist/types/web/scrapers/crates-io.d.ts +0 -5
  1378. package/dist/types/web/scrapers/crossref.d.ts +0 -2
  1379. package/dist/types/web/scrapers/devto.d.ts +0 -5
  1380. package/dist/types/web/scrapers/discogs.d.ts +0 -8
  1381. package/dist/types/web/scrapers/discourse.d.ts +0 -5
  1382. package/dist/types/web/scrapers/dockerhub.d.ts +0 -5
  1383. package/dist/types/web/scrapers/docs-rs.d.ts +0 -2
  1384. package/dist/types/web/scrapers/fdroid.d.ts +0 -5
  1385. package/dist/types/web/scrapers/firefox-addons.d.ts +0 -2
  1386. package/dist/types/web/scrapers/flathub.d.ts +0 -2
  1387. package/dist/types/web/scrapers/github-gist.d.ts +0 -5
  1388. package/dist/types/web/scrapers/github.d.ts +0 -12
  1389. package/dist/types/web/scrapers/gitlab.d.ts +0 -5
  1390. package/dist/types/web/scrapers/go-pkg.d.ts +0 -5
  1391. package/dist/types/web/scrapers/hackage.d.ts +0 -5
  1392. package/dist/types/web/scrapers/hackernews.d.ts +0 -2
  1393. package/dist/types/web/scrapers/hex.d.ts +0 -5
  1394. package/dist/types/web/scrapers/huggingface.d.ts +0 -2
  1395. package/dist/types/web/scrapers/iacr.d.ts +0 -5
  1396. package/dist/types/web/scrapers/index.d.ts +0 -84
  1397. package/dist/types/web/scrapers/jetbrains-marketplace.d.ts +0 -2
  1398. package/dist/types/web/scrapers/lemmy.d.ts +0 -2
  1399. package/dist/types/web/scrapers/lobsters.d.ts +0 -5
  1400. package/dist/types/web/scrapers/mastodon.d.ts +0 -5
  1401. package/dist/types/web/scrapers/maven.d.ts +0 -6
  1402. package/dist/types/web/scrapers/mdn.d.ts +0 -2
  1403. package/dist/types/web/scrapers/metacpan.d.ts +0 -5
  1404. package/dist/types/web/scrapers/musicbrainz.d.ts +0 -5
  1405. package/dist/types/web/scrapers/npm.d.ts +0 -5
  1406. package/dist/types/web/scrapers/nuget.d.ts +0 -5
  1407. package/dist/types/web/scrapers/nvd.d.ts +0 -5
  1408. package/dist/types/web/scrapers/ollama.d.ts +0 -2
  1409. package/dist/types/web/scrapers/open-vsx.d.ts +0 -5
  1410. package/dist/types/web/scrapers/opencorporates.d.ts +0 -5
  1411. package/dist/types/web/scrapers/openlibrary.d.ts +0 -5
  1412. package/dist/types/web/scrapers/orcid.d.ts +0 -5
  1413. package/dist/types/web/scrapers/osv.d.ts +0 -5
  1414. package/dist/types/web/scrapers/packagist.d.ts +0 -5
  1415. package/dist/types/web/scrapers/pub-dev.d.ts +0 -5
  1416. package/dist/types/web/scrapers/pubmed.d.ts +0 -5
  1417. package/dist/types/web/scrapers/pypi.d.ts +0 -5
  1418. package/dist/types/web/scrapers/rawg.d.ts +0 -2
  1419. package/dist/types/web/scrapers/readthedocs.d.ts +0 -2
  1420. package/dist/types/web/scrapers/reddit.d.ts +0 -5
  1421. package/dist/types/web/scrapers/repology.d.ts +0 -5
  1422. package/dist/types/web/scrapers/rfc.d.ts +0 -5
  1423. package/dist/types/web/scrapers/rubygems.d.ts +0 -5
  1424. package/dist/types/web/scrapers/searchcode.d.ts +0 -2
  1425. package/dist/types/web/scrapers/sec-edgar.d.ts +0 -5
  1426. package/dist/types/web/scrapers/semantic-scholar.d.ts +0 -2
  1427. package/dist/types/web/scrapers/snapcraft.d.ts +0 -2
  1428. package/dist/types/web/scrapers/sourcegraph.d.ts +0 -2
  1429. package/dist/types/web/scrapers/spdx.d.ts +0 -5
  1430. package/dist/types/web/scrapers/spotify.d.ts +0 -8
  1431. package/dist/types/web/scrapers/stackoverflow.d.ts +0 -6
  1432. package/dist/types/web/scrapers/terraform.d.ts +0 -5
  1433. package/dist/types/web/scrapers/tldr.d.ts +0 -7
  1434. package/dist/types/web/scrapers/twitter.d.ts +0 -5
  1435. package/dist/types/web/scrapers/types.d.ts +0 -83
  1436. package/dist/types/web/scrapers/utils.d.ts +0 -32
  1437. package/dist/types/web/scrapers/vimeo.d.ts +0 -5
  1438. package/dist/types/web/scrapers/vscode-marketplace.d.ts +0 -5
  1439. package/dist/types/web/scrapers/w3c.d.ts +0 -2
  1440. package/dist/types/web/scrapers/wikidata.d.ts +0 -5
  1441. package/dist/types/web/scrapers/wikipedia.d.ts +0 -5
  1442. package/dist/types/web/scrapers/youtube.d.ts +0 -13
  1443. package/dist/types/web/search/index.d.ts +0 -118
  1444. package/dist/types/web/search/provider.d.ts +0 -55
  1445. package/dist/types/web/search/providers/anthropic.d.ts +0 -32
  1446. package/dist/types/web/search/providers/base.d.ts +0 -90
  1447. package/dist/types/web/search/providers/brave.d.ts +0 -27
  1448. package/dist/types/web/search/providers/codex.d.ts +0 -35
  1449. package/dist/types/web/search/providers/duckduckgo.d.ts +0 -57
  1450. package/dist/types/web/search/providers/exa.d.ts +0 -52
  1451. package/dist/types/web/search/providers/gemini.d.ts +0 -57
  1452. package/dist/types/web/search/providers/insane.d.ts +0 -53
  1453. package/dist/types/web/search/providers/jina.d.ts +0 -26
  1454. package/dist/types/web/search/providers/kagi.d.ts +0 -24
  1455. package/dist/types/web/search/providers/kimi.d.ts +0 -27
  1456. package/dist/types/web/search/providers/openai-compatible.d.ts +0 -9
  1457. package/dist/types/web/search/providers/parallel.d.ts +0 -15
  1458. package/dist/types/web/search/providers/perplexity.d.ts +0 -38
  1459. package/dist/types/web/search/providers/searxng.d.ts +0 -44
  1460. package/dist/types/web/search/providers/synthetic.d.ts +0 -21
  1461. package/dist/types/web/search/providers/tavily.d.ts +0 -29
  1462. package/dist/types/web/search/providers/text-citations.d.ts +0 -23
  1463. package/dist/types/web/search/providers/utils.d.ts +0 -88
  1464. package/dist/types/web/search/providers/xai.d.ts +0 -64
  1465. package/dist/types/web/search/providers/zai.d.ts +0 -28
  1466. package/dist/types/web/search/render.d.ts +0 -36
  1467. package/dist/types/web/search/types.d.ts +0 -372
  1468. package/dist/types/web/search/utils.d.ts +0 -4
  1469. package/dist/types/workflow/workflow-intent-diff.d.ts +0 -25
  1470. package/dist/types/workflow/workflow-intent-report-consumer.d.ts +0 -50
  1471. package/dist/types/workflow/workflow-intent-report-schema.d.ts +0 -2
  1472. package/dist/types/workflow/workflow-intent-report.d.ts +0 -48
  1473. package/dist/types/workspace-tree.d.ts +0 -42
  1474. 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, hsvToRgb, isEnoent, logger, postmortem, prompt } from "@sayknow-cli/utils";
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
- getEditorTheme,
116
- getMarkdownTheme,
117
- getSymbolTheme,
118
- onTerminalAppearanceChange,
119
- onThemeChange,
120
- theme,
121
- } from "./theme/theme";
122
- import type {
123
- CompactionQueuedMessage,
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
- #planModePreviousTools: string[] | undefined;
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
- #sttController: STTController | undefined;
418
- #voiceAnimationInterval: NodeJS.Timeout | undefined;
419
- #voiceHue = 0;
420
- #voicePreviousShowHardwareCursor: boolean | null = null;
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
- this.petWidget.setMode(settings.get("pet.mode"));
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
- const slashCommands = [...this.#baseSlashCommands, ...skillCommands];
843
+ this.#resolvedSlashCommands = [...this.#baseSlashCommands, ...skillCommands, ...fileSlashCommands];
762
844
  const autocompleteProvider = this.#inputController.createAutocompleteProvider(
763
- [...slashCommands, ...fileSlashCommands],
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.#exitGoalMode({ reason: "completed", silent: true });
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.#scheduleGoalContinuation();
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(input: {
881
- text: string;
882
- images?: ImageContent[];
883
- customType?: string;
884
- display?: boolean;
885
- }): SubmittedUserInput {
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.#resetGoalContinuationSuppression();
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.setText("");
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
- if (submission.customType === "goal-continuation") {
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
- if (input.customType === "goal-continuation") {
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
- setPetMode(mode: PetMode): void {
1083
- this.petWidget?.setMode(mode);
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
- async #getPlanFilePath(): Promise<string> {
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.goalModeEnabled || this.goalModePaused
1224
- ? { enabled: this.goalModeEnabled, paused: this.goalModePaused }
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
- if (event.type === "agent_start") {
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 (e.g. plan mode). */
1265
+ /** Restore mode state from session entries on resume. */
1340
1266
  async #restoreModeFromSession(): Promise<void> {
1341
1267
  const sessionContext = this.sessionManager.buildSessionContext();
1342
- const goalEnabled = this.session.settings.get("goal.enabled");
1343
- if (!goalEnabled && (sessionContext.mode === "goal" || sessionContext.mode === "goal_paused")) {
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 = this.petWidget?.mode ?? settings.get("pet.mode");
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
- this.#extensionUiController.clearExtensionTerminalInputListeners();
2500
- this.#planReviewContainer = undefined;
1683
+ if (cleanupPreviousSessionUi) cleanupPreviousSessionUi();
1684
+ else this.#extensionUiController.clearExtensionTerminalInputListeners();
1685
+ this.#planModeController.clearReview();
2501
1686
  }
2502
1687
 
2503
- handleClearCommand(): Promise<void> {
2504
- this.#prepareSessionSwitch();
2505
- return this.#commandController.handleClearCommand();
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<void> {
2514
- this.#prepareSessionSwitch();
2515
- return this.#commandController.handleDropCommand();
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
- if (!this.#sttController) {
2541
- this.#sttController = new STTController();
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
  }