@sayknow-cli/coding-agent 0.3.15 → 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 +133 -116
  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
@@ -2,7 +2,8 @@ import * as fs from "node:fs/promises";
2
2
  import * as path from "node:path";
3
3
  import { type AgentMessage, ThinkingLevel } from "@sayknow-cli/agent-core";
4
4
  import { type AutocompleteProvider, matchesKey, type SlashCommand } from "@sayknow-cli/tui";
5
- import { $env, sanitizeText } from "@sayknow-cli/utils";
5
+ import { $env, logger, sanitizeText } from "@sayknow-cli/utils";
6
+ import { type AppKeybinding, KEYBINDINGS } from "../../config/keybindings";
6
7
  import { isSettingsInitialized, settings } from "../../config/settings";
7
8
  import { resolveSubskillActivationForSkillInvocation } from "../../extensibility/skc-plugins";
8
9
  import { buildSkillPromptMessage, parseSkillInvocations } from "../../extensibility/skills";
@@ -10,41 +11,271 @@ import { expandEmoticons } from "../../modes/emoji-autocomplete";
10
11
  import { createPromptActionAutocompleteProvider } from "../../modes/prompt-action-autocomplete";
11
12
  import { theme } from "../../modes/theme/theme";
12
13
  import { scrollTmuxToPreviousUserInput as scrollTmuxPaneToPreviousUserInput } from "../../modes/tmux-scroll";
13
- import type { InteractiveModeContext } from "../../modes/types";
14
+ import {
15
+ type ComposerSubmissionOptions,
16
+ canApplyComposerSubmission,
17
+ type InteractiveModeContext,
18
+ } from "../../modes/types";
14
19
  import type { AgentSessionEvent, QueuedMessageEditEntry } from "../../session/agent-session";
15
20
  import { SKILL_PROMPT_MESSAGE_TYPE, type SkillPromptDetails } from "../../session/messages";
21
+ import { getUserMessageViewportAnchorIds } from "../../session/session-manager";
16
22
  import { executeBuiltinSlashCommand } from "../../slash-commands/builtin-registry";
17
23
  import { copyToClipboard, readImageFromClipboard } from "../../utils/clipboard";
18
24
  import { getEditorCommand, openInEditor } from "../../utils/external-editor";
19
- import { ensureSupportedImageInput, ImageInputTooLargeError, loadImageInput } from "../../utils/image-loading";
25
+ import { ensureSupportedImageInput, ImageInputTooLargeError } from "../../utils/image-loading";
20
26
  import { resizeImage } from "../../utils/image-resize";
21
- import { formatPastedImageReference, resolvePastedImagePath } from "../../utils/pasted-image-path";
27
+ import { loadPastedImageBatch, PastedImageBatchError } from "../../utils/pasted-image-loading";
28
+ import { formatPastedImageReference, parsePastedImagePaths } from "../../utils/pasted-image-path";
22
29
  import { generateSessionTitle, setSessionTerminalTitle } from "../../utils/title-generator";
30
+ import { ActionRegistry, APP_ACTION_METADATA } from "../action-registry";
31
+ import { CommandPalette, type CommandPaletteAction, type CommandPaletteEntry } from "../components/command-palette";
32
+ import type { PasteTextContext } from "../components/custom-editor";
33
+ import { QueuePaneComponent } from "../components/queue-pane";
23
34
  import { type QueuedMessageMoveDirection, QueuedMessageSelectorComponent } from "../components/queued-message-selector";
24
35
 
25
36
  interface Expandable {
26
37
  setExpanded(expanded: boolean): void;
38
+ setManuallyExpanded?(expanded: boolean): void;
27
39
  }
28
40
 
29
- const INTERACTIVE_ABORT_CLEANUP_TIMEOUT_MS = 5_000;
41
+ export const INTERACTIVE_ABORT_CLEANUP_TIMEOUT_MS = 5_000;
42
+ export const BACKGROUND_FOLD_DOUBLE_PRESS_MS = 750;
43
+
44
+ const DRAFT_CLEAR_DOUBLE_ESCAPE_WINDOW_MS = 800;
45
+ const EMPTY_EDITOR_DOUBLE_ESCAPE_WINDOW_MS = 500;
30
46
  const IMAGE_PLACEHOLDER_PATTERN = /\[image ([1-9]\d*)\]/g;
31
47
  const IMAGE_PLACEHOLDER_PRESENT_PATTERN = /\[image [1-9]\d*\]/;
32
48
 
49
+ interface InputControllerDependencies {
50
+ loadPastedImageBatch?: typeof loadPastedImageBatch;
51
+ }
52
+
33
53
  function isExpandable(obj: unknown): obj is Expandable {
34
54
  return typeof obj === "object" && obj !== null && "setExpanded" in obj && typeof obj.setExpanded === "function";
35
55
  }
36
56
 
37
57
  export class InputController {
38
- constructor(private ctx: InteractiveModeContext) {}
58
+ readonly actionRegistry: ActionRegistry<void>;
59
+ readonly #loadPastedImageBatch: typeof loadPastedImageBatch;
60
+
61
+ constructor(
62
+ private ctx: InteractiveModeContext,
63
+ dependencies: InputControllerDependencies = {},
64
+ ) {
65
+ this.#loadPastedImageBatch = dependencies.loadPastedImageBatch ?? loadPastedImageBatch;
66
+ this.actionRegistry = new ActionRegistry({
67
+ context: undefined,
68
+ showError: actionId => this.ctx.showError(actionId),
69
+ });
70
+ this.#registerActions();
71
+ }
72
+
73
+ #registerActions(): void {
74
+ const callbacks: Partial<Record<(typeof APP_ACTION_METADATA)[number]["id"], () => void | Promise<void>>> = {
75
+ "app.interrupt": () => this.ctx.editor.onEscape?.(),
76
+ "app.clear": () => this.handleCtrlC(),
77
+ "app.exit": () => this.handleCtrlD(),
78
+ "app.suspend": () => this.handleCtrlZ(),
79
+ "app.thinking.cycle": () => this.cycleThinkingLevel(),
80
+ "app.thinking.toggle": () => this.toggleThinkingBlockVisibility(),
81
+ "app.commandPalette.open": () => this.openCommandPalette(),
82
+ "app.model.cycleForward": () => this.cycleRoleModel(),
83
+ "app.model.cycleBackward": () => this.cycleRoleModel({ temporary: true }),
84
+ "app.model.select": () => this.ctx.showModelSelector(),
85
+ "app.model.selectTemporary": () => this.ctx.showModelSelector({ temporaryOnly: true }),
86
+ "app.tools.expand": () => this.toggleToolOutputExpansion(),
87
+ "app.tool.backgroundFold": () => {
88
+ this.handleForegroundToolBackgroundFold();
89
+ },
90
+ "app.editor.external": () => this.openExternalEditor(),
91
+ "app.message.followUp": () => this.handleFollowUp(),
92
+ "app.message.queue": () => this.handleQueueSubmit(),
93
+ "app.message.dequeue": () => this.handleDequeue(),
94
+ "app.clipboard.pasteImage": async () => {
95
+ await this.handleImagePaste();
96
+ },
97
+ "app.clipboard.copyLine": () => this.handleCopyCurrentLine(),
98
+ "app.clipboard.copyPrompt": () => this.handleCopyPrompt(),
99
+ "app.session.new": async () => {
100
+ await this.ctx.handleClearCommand();
101
+ },
102
+ "app.session.tree": () => this.ctx.showTreeSelector(),
103
+ "app.session.fork": () => this.ctx.showUserMessageSelector(),
104
+ "app.session.resume": () => this.ctx.showSessionSelector(),
105
+ "app.session.observe": async () => {
106
+ await this.ctx.showSessionObserver();
107
+ },
108
+ "app.session.dashboard": () => this.ctx.showSessionsDashboard(),
109
+ "app.transcript.browse": () => this.ctx.showTranscriptViewer(),
110
+ "app.jobs.open": () => this.ctx.showJobsOverlay(),
111
+ "app.plan.toggle": () => this.ctx.planModeController.handleCommand(),
112
+ "app.mode.cycle": () => this.ctx.planModeController.handleCommand(),
113
+ "app.history.search": () => this.ctx.showHistorySearch(),
114
+ "app.stt.toggle": () => this.ctx.handleSTTToggle(),
115
+ "app.irc.sidebar.toggle": () => this.ctx.toggleIrcSidebar(),
116
+ "app.transcript.prevTurn": () => this.#jumpTranscriptTurn(-1),
117
+ "app.transcript.nextTurn": () => this.#jumpTranscriptTurn(1),
118
+ "app.tasks.toggle": () => this.ctx.showTasksPane(),
119
+ "app.queue.togglePane": () => this.toggleQueuePane(),
120
+ "app.message.sendNow": () => this.sendNow(),
121
+ };
122
+ for (const metadata of APP_ACTION_METADATA) {
123
+ const callback = callbacks[metadata.id];
124
+ this.actionRegistry.register({
125
+ ...metadata,
126
+ availability: () => Boolean(callback) && this.#isActionAvailable(metadata.id),
127
+ execute: async () => {
128
+ if (!callback) throw new Error(`Unavailable action executed: ${metadata.id}`);
129
+ await callback();
130
+ },
131
+ });
132
+ }
133
+ }
134
+
135
+ #isActionAvailable(id: (typeof APP_ACTION_METADATA)[number]["id"]): boolean {
136
+ switch (id) {
137
+ case "app.suspend":
138
+ return process.platform !== "win32";
139
+ case "app.thinking.cycle":
140
+ case "app.thinking.toggle":
141
+ return Boolean(this.ctx.session.model?.reasoning);
142
+ case "app.commandPalette.open":
143
+ return this.ctx.editor.getText().trim().length === 0;
144
+ case "app.model.cycleForward":
145
+ case "app.model.cycleBackward":
146
+ return this.ctx.session.getRoleModelCycleCandidateCount() > 1;
147
+ case "app.tools.expand":
148
+ return this.ctx.chatContainer.children.some(isExpandable);
149
+ case "app.tool.backgroundFold":
150
+ return Boolean(this.ctx.session.hasForegroundBashBackgroundRequestHandler?.());
151
+ case "app.editor.external":
152
+ return Boolean(getEditorCommand());
153
+ case "app.message.followUp":
154
+ case "app.message.queue":
155
+ return (
156
+ this.ctx.session.isStreaming ||
157
+ this.ctx.session.isCompacting ||
158
+ this.ctx.session.isBashRunning ||
159
+ this.ctx.session.isEvalRunning
160
+ );
161
+ case "app.message.dequeue":
162
+ return this.ctx.session.queuedMessageCount > 0;
163
+ case "app.clipboard.copyPrompt":
164
+ return this.ctx.editor.getText().length > 0;
165
+ case "app.session.tree":
166
+ case "app.session.fork":
167
+ return this.ctx.session.messages.length > 0;
168
+ case "app.plan.toggle":
169
+ return this.ctx.planModeController.enabled && !this.ctx.goalModeController.enabled;
170
+ case "app.history.search":
171
+ return (this.ctx.historyStorage?.getRecent(1).length ?? 0) > 0;
172
+ case "app.stt.toggle":
173
+ return Boolean(this.ctx.settings.get("stt.enabled"));
174
+ case "app.transcript.browse":
175
+ return this.ctx.session.messages.length > 0;
176
+ case "app.transcript.prevTurn":
177
+ case "app.transcript.nextTurn":
178
+ return getUserMessageViewportAnchorIds(this.ctx.session.messages).length > 0;
179
+ case "app.mode.cycle":
180
+ return (
181
+ Boolean(this.ctx.settings.get("plan.enabled")) &&
182
+ !this.ctx.goalModeController.enabled &&
183
+ !this.ctx.goalModeController.paused
184
+ );
185
+ case "app.queue.togglePane":
186
+ return true;
187
+ case "app.message.sendNow":
188
+ return (
189
+ this.ctx.session.isStreaming &&
190
+ (this.ctx.editor.getText().trim().length > 0 || this.ctx.session.queuedMessageCount > 0)
191
+ );
192
+ default:
193
+ return true;
194
+ }
195
+ }
196
+
197
+ #executeAction(id: (typeof APP_ACTION_METADATA)[number]["id"]): void {
198
+ void this.actionRegistry.execute(id);
199
+ }
200
+
201
+ #transcriptTurnAnchorIds: readonly string[] = [];
202
+ #transcriptTurnPosition = 0;
203
+
204
+ #syncTranscriptTurnPosition(): readonly string[] {
205
+ const anchorIds = getUserMessageViewportAnchorIds(this.ctx.session.messages);
206
+ if (
207
+ anchorIds.length !== this.#transcriptTurnAnchorIds.length ||
208
+ anchorIds.some(id => !this.#transcriptTurnAnchorIds.includes(id))
209
+ ) {
210
+ const hadAnchors = this.#transcriptTurnAnchorIds.length > 0;
211
+ const currentAnchorId = this.#transcriptTurnAnchorIds[this.#transcriptTurnPosition];
212
+ const retainedAnchorIds = this.#transcriptTurnAnchorIds.filter(id => anchorIds.includes(id));
213
+ this.#transcriptTurnAnchorIds = [
214
+ ...retainedAnchorIds,
215
+ ...anchorIds.filter(id => !retainedAnchorIds.includes(id)),
216
+ ];
217
+ const currentPosition = currentAnchorId ? this.#transcriptTurnAnchorIds.indexOf(currentAnchorId) : -1;
218
+ this.#transcriptTurnPosition =
219
+ currentPosition >= 0
220
+ ? currentPosition
221
+ : currentAnchorId || hadAnchors
222
+ ? Math.min(this.#transcriptTurnPosition, this.#transcriptTurnAnchorIds.length)
223
+ : this.#transcriptTurnAnchorIds.length;
224
+ }
225
+ return this.#transcriptTurnAnchorIds;
226
+ }
227
+
228
+ #jumpTranscriptTurn(direction: -1 | 1): void {
229
+ const anchorIds = this.#syncTranscriptTurnPosition();
230
+ const targetPosition = this.#transcriptTurnPosition + direction;
231
+ if (targetPosition < 0 || targetPosition >= anchorIds.length) return;
232
+ if (this.ctx.ui.revealViewportAnchor(anchorIds[targetPosition], "top")) {
233
+ this.#transcriptTurnPosition = targetPosition;
234
+ }
235
+ }
39
236
 
40
237
  #lastBackgroundFoldKeyTime = 0;
238
+ #slashCommands: SlashCommand[] = [];
41
239
 
42
240
  /** Set after a first Esc silently consumes a queued steer. Kept until the
43
241
  * queued steer is either cancelled by a second Esc or drained by continuation,
44
242
  * so abort cleanup going idle cannot turn the second Esc into an idle action. */
45
243
  #steerConsumePending = false;
244
+ #commandPaletteActions = new Map<AppKeybinding, CommandPaletteAction>();
245
+ #paletteCommandInFlight = false;
246
+
247
+ #registerCommandPaletteAction(action: AppKeybinding, handler: () => void | Promise<void>): void {
248
+ this.#commandPaletteActions.set(action, {
249
+ id: action,
250
+ label: KEYBINDINGS[action].description,
251
+ handler,
252
+ });
253
+ }
46
254
 
47
255
  #globalInterruptUnsubscribe: (() => void) | undefined;
256
+ #draftClearEscapeText: string | undefined;
257
+
258
+ #resetEscapeGestures(): void {
259
+ this.ctx.lastEscapeTime = 0;
260
+ this.ctx.lastComposerClearEscapeTime = 0;
261
+ this.#draftClearEscapeText = undefined;
262
+ }
263
+
264
+ #armDraftClearEscape(text: string, now: number): void {
265
+ this.ctx.lastEscapeTime = 0;
266
+ this.ctx.lastComposerClearEscapeTime = now;
267
+ this.#draftClearEscapeText = text;
268
+ this.ctx.showStatus("press Esc again to clear");
269
+ }
270
+
271
+ #resetDraftClearEscape(): void {
272
+ this.ctx.lastComposerClearEscapeTime = 0;
273
+ this.#draftClearEscapeText = undefined;
274
+ }
275
+
276
+ #resetEmptyEditorEscape(): void {
277
+ this.ctx.lastEscapeTime = 0;
278
+ }
48
279
 
49
280
  #matchesInterruptKey(data: string): boolean {
50
281
  return this.ctx.keybindings.getKeys("app.interrupt").some(key => matchesKey(data, key));
@@ -146,6 +377,7 @@ export class InputController {
146
377
  return undefined;
147
378
  }
148
379
  if (this.ctx.hasActiveBtw() && this.ctx.handleBtwEscape()) {
380
+ this.#resetEscapeGestures();
149
381
  return { consume: true };
150
382
  }
151
383
  const hookDialogActive = this.#hasHookDialog();
@@ -153,6 +385,7 @@ export class InputController {
153
385
  // Inline ask/custom-input editors use Esc to return to the option list.
154
386
  // Let the focused selector see the key instead of converting a typo
155
387
  // into a full workflow/session abort while the agent is streaming.
388
+ this.#resetEscapeGestures();
156
389
  return undefined;
157
390
  }
158
391
  if (
@@ -165,6 +398,7 @@ export class InputController {
165
398
  streaming: hookDialogActive,
166
399
  })
167
400
  ) {
401
+ this.#resetEscapeGestures();
168
402
  return { consume: true };
169
403
  }
170
404
  return undefined;
@@ -178,11 +412,18 @@ export class InputController {
178
412
  silent: options?.silent,
179
413
  });
180
414
  }
415
+ #clearComposer(): void {
416
+ const text = this.ctx.editor.getText();
417
+ if (text.trim()) {
418
+ this.ctx.editor.addToHistory(text);
419
+ }
420
+ this.ctx.clearEditor();
421
+ }
181
422
 
182
423
  setupKeyHandlers(): void {
183
424
  this.ctx.editor.setActionKeys("app.interrupt", this.ctx.keybindings.getKeys("app.interrupt"));
184
- this.ctx.editor.shouldBypassAutocompleteOnEscape = () =>
185
- Boolean(
425
+ this.ctx.editor.shouldBypassAutocompleteOnEscape = () => {
426
+ const bypassAutocomplete = Boolean(
186
427
  this.ctx.loadingAnimation ||
187
428
  this.ctx.hasActiveBtw() ||
188
429
  (this.#steerConsumePending && this.ctx.session.hasQueuedSteering) ||
@@ -197,18 +438,28 @@ export class InputController {
197
438
  this.ctx.autoCompactionEscapeHandler ||
198
439
  this.ctx.retryEscapeHandler,
199
440
  );
441
+ if (!bypassAutocomplete) this.#resetEscapeGestures();
442
+ return bypassAutocomplete;
443
+ };
200
444
  this.#installGlobalInterruptListener();
201
445
 
202
446
  // An open btw panel must stay dismissable with Esc even while another
203
447
  // controller (auto-compaction, auto-retry, manual compaction, etc.) has
204
448
  // temporarily replaced editor.onEscape. This priority hook is never
205
449
  // swapped out, so it always wins for the interrupt key.
206
- this.ctx.editor.onInterruptPriority = () => (this.ctx.hasActiveBtw() ? this.ctx.handleBtwEscape() : false);
450
+ this.ctx.editor.onInterruptPriority = () => {
451
+ if (!this.ctx.hasActiveBtw()) return false;
452
+ const consumed = this.ctx.handleBtwEscape();
453
+ if (consumed) this.#resetEscapeGestures();
454
+ return consumed;
455
+ };
207
456
  this.ctx.editor.onEscape = () => {
208
457
  if (this.ctx.hasActiveBtw() && this.ctx.handleBtwEscape()) {
458
+ this.#resetEscapeGestures();
209
459
  return;
210
460
  }
211
461
  if (this.#steerConsumePending) {
462
+ this.#resetEscapeGestures();
212
463
  if (this.ctx.session.hasQueuedSteering) {
213
464
  // Second Esc before the scheduled steer continuation drains the
214
465
  // queue: restore/drop the queued steer and perform a real abort,
@@ -220,20 +471,7 @@ export class InputController {
220
471
  this.#steerConsumePending = false;
221
472
  }
222
473
  if (this.#handleCancellableWorkEscape({ maintenance: true, retry: true })) {
223
- return;
224
- }
225
- // Normal input state with user-typed text: Esc must not interrupt a
226
- // running task (streaming turn, bash/eval). A double Esc within the
227
- // 500ms window clears the composer instead. Bash/Python input modes
228
- // keep their own Esc handling in the chain below.
229
- if (!this.ctx.isBashMode && !this.ctx.isPythonMode && this.ctx.editor.getText().trim()) {
230
- const now = Date.now();
231
- if (now - this.ctx.lastComposerClearEscapeTime < 500) {
232
- this.ctx.clearEditor();
233
- this.ctx.lastComposerClearEscapeTime = 0;
234
- } else {
235
- this.ctx.lastComposerClearEscapeTime = now;
236
- }
474
+ this.#resetEscapeGestures();
237
475
  return;
238
476
  }
239
477
  if (
@@ -246,81 +484,137 @@ export class InputController {
246
484
  streaming: true,
247
485
  })
248
486
  ) {
487
+ this.#resetEscapeGestures();
249
488
  return;
250
489
  }
251
- if (!this.ctx.editor.getText().trim()) {
490
+
491
+ const text = this.ctx.editor.getText();
492
+ if (!this.ctx.isBashMode && !this.ctx.isPythonMode && text.trim()) {
493
+ this.#resetEmptyEditorEscape();
494
+ const now = Date.now();
495
+ if (
496
+ now - this.ctx.lastComposerClearEscapeTime < DRAFT_CLEAR_DOUBLE_ESCAPE_WINDOW_MS &&
497
+ this.#draftClearEscapeText === text
498
+ ) {
499
+ this.#clearComposer();
500
+ this.#resetDraftClearEscape();
501
+ } else {
502
+ this.#armDraftClearEscape(text, now);
503
+ }
504
+ return;
505
+ }
506
+
507
+ if (!text.trim()) {
508
+ this.#resetDraftClearEscape();
252
509
  // Double-interrupt with empty editor triggers /tree, /branch, or nothing based on setting
253
510
  const action = settings.get("doubleEscapeAction");
254
- if (action !== "none") {
255
- const now = Date.now();
256
- if (now - this.ctx.lastEscapeTime < 500) {
257
- if (action === "tree") {
258
- this.ctx.showTreeSelector();
259
- } else {
260
- this.ctx.showUserMessageSelector();
261
- }
262
- this.ctx.lastEscapeTime = 0;
511
+ if (action === "none") {
512
+ this.#resetEmptyEditorEscape();
513
+ return;
514
+ }
515
+
516
+ const now = Date.now();
517
+ if (now - this.ctx.lastEscapeTime < EMPTY_EDITOR_DOUBLE_ESCAPE_WINDOW_MS) {
518
+ if (action === "tree") {
519
+ this.ctx.showTreeSelector();
263
520
  } else {
264
- this.ctx.lastEscapeTime = now;
521
+ this.ctx.showUserMessageSelector();
265
522
  }
523
+ this.#resetEmptyEditorEscape();
524
+ } else {
525
+ this.ctx.lastEscapeTime = now;
266
526
  }
267
527
  }
268
528
  };
269
529
 
530
+ const clear = () => this.handleCtrlC();
270
531
  this.ctx.editor.setActionKeys("app.clear", this.ctx.keybindings.getKeys("app.clear"));
271
- this.ctx.editor.onClear = () => this.handleCtrlC();
532
+ this.ctx.editor.onClear = () => this.#executeAction("app.clear");
533
+ this.#registerCommandPaletteAction("app.clear", clear);
534
+ const exit = () => this.handleCtrlD();
272
535
  this.ctx.editor.setActionKeys("app.exit", this.ctx.keybindings.getKeys("app.exit"));
273
- this.ctx.editor.onExit = () => this.handleCtrlD();
536
+ this.ctx.editor.onExit = () => this.#executeAction("app.exit");
537
+ this.#registerCommandPaletteAction("app.exit", exit);
538
+ const suspend = () => this.handleCtrlZ();
274
539
  this.ctx.editor.setActionKeys("app.suspend", this.ctx.keybindings.getKeys("app.suspend"));
275
- this.ctx.editor.onSuspend = () => this.handleCtrlZ();
540
+ this.ctx.editor.onSuspend = () => this.#executeAction("app.suspend");
541
+ this.#registerCommandPaletteAction("app.suspend", suspend);
542
+ const cycleThinking = () => this.cycleThinkingLevel();
276
543
  this.ctx.editor.setActionKeys("app.thinking.cycle", this.ctx.keybindings.getKeys("app.thinking.cycle"));
277
- this.ctx.editor.onCycleThinkingLevel = () => this.cycleThinkingLevel();
544
+ this.ctx.editor.onCycleThinkingLevel = () => this.#executeAction("app.thinking.cycle");
545
+ this.#registerCommandPaletteAction("app.thinking.cycle", cycleThinking);
278
546
  this.ctx.editor.setActionKeys("app.commandPalette.open", this.ctx.keybindings.getKeys("app.commandPalette.open"));
279
- this.ctx.editor.onOpenCommandPalette = () => this.openCommandPalette();
547
+ this.ctx.editor.onOpenCommandPalette = () => this.#executeAction("app.commandPalette.open");
548
+ const cycleModelForward = () => this.cycleRoleModel();
280
549
  this.ctx.editor.setActionKeys("app.model.cycleForward", this.ctx.keybindings.getKeys("app.model.cycleForward"));
281
- this.ctx.editor.onCycleModelForward = () => this.cycleRoleModel();
550
+ this.ctx.editor.onCycleModelForward = () => this.#executeAction("app.model.cycleForward");
551
+ this.#registerCommandPaletteAction("app.model.cycleForward", cycleModelForward);
552
+ const cycleModelBackward = () => this.cycleRoleModel({ temporary: true });
282
553
  this.ctx.editor.setActionKeys("app.model.cycleBackward", this.ctx.keybindings.getKeys("app.model.cycleBackward"));
283
- this.ctx.editor.onCycleModelBackward = () => this.cycleRoleModel({ temporary: true });
554
+ this.ctx.editor.onCycleModelBackward = () => this.#executeAction("app.model.cycleBackward");
555
+ this.#registerCommandPaletteAction("app.model.cycleBackward", cycleModelBackward);
556
+ const selectTemporaryModel = () => this.ctx.showModelSelector({ temporaryOnly: true });
284
557
  this.ctx.editor.setActionKeys(
285
558
  "app.model.selectTemporary",
286
559
  this.ctx.keybindings.getKeys("app.model.selectTemporary"),
287
560
  );
288
- this.ctx.editor.onSelectModelTemporary = () => this.ctx.showModelSelector({ temporaryOnly: true });
561
+ this.ctx.editor.onSelectModelTemporary = () => this.#executeAction("app.model.selectTemporary");
562
+ this.#registerCommandPaletteAction("app.model.selectTemporary", selectTemporaryModel);
289
563
 
290
564
  // Global debug handler on TUI (works regardless of focus)
291
565
  this.ctx.ui.onDebug = () => this.ctx.showDebugSelector();
566
+ const selectModel = () => this.ctx.showModelSelector();
292
567
  this.ctx.editor.setActionKeys("app.model.select", this.ctx.keybindings.getKeys("app.model.select"));
293
- this.ctx.editor.onSelectModel = () => this.ctx.showModelSelector();
568
+ this.ctx.editor.onSelectModel = () => this.#executeAction("app.model.select");
569
+ this.#registerCommandPaletteAction("app.model.select", selectModel);
570
+ const searchHistory = () => this.ctx.showHistorySearch();
294
571
  this.ctx.editor.setActionKeys("app.history.search", this.ctx.keybindings.getKeys("app.history.search"));
295
- this.ctx.editor.onHistorySearch = () => this.ctx.showHistorySearch();
572
+ this.ctx.editor.onHistorySearch = () => this.#executeAction("app.history.search");
573
+ this.#registerCommandPaletteAction("app.history.search", searchHistory);
574
+ const toggleThinking = () => this.ctx.toggleThinkingBlockVisibility();
296
575
  this.ctx.editor.setActionKeys("app.thinking.toggle", this.ctx.keybindings.getKeys("app.thinking.toggle"));
297
- this.ctx.editor.onToggleThinking = () => this.ctx.toggleThinkingBlockVisibility();
576
+ this.ctx.editor.onToggleThinking = () => this.#executeAction("app.thinking.toggle");
577
+ this.#registerCommandPaletteAction("app.thinking.toggle", toggleThinking);
578
+ const externalEditor = () => this.openExternalEditor();
298
579
  this.ctx.editor.setActionKeys("app.editor.external", this.ctx.keybindings.getKeys("app.editor.external"));
299
- this.ctx.editor.onExternalEditor = () => void this.openExternalEditor();
580
+ this.ctx.editor.onExternalEditor = () => this.#executeAction("app.editor.external");
581
+ this.#registerCommandPaletteAction("app.editor.external", externalEditor);
300
582
  this.ctx.editor.onShowHotkeys = () => this.ctx.handleHotkeysCommand();
583
+ const pasteImageFromPalette = async () => {
584
+ await this.handleImagePaste();
585
+ };
301
586
  this.ctx.editor.setActionKeys(
302
587
  "app.clipboard.pasteImage",
303
588
  this.ctx.keybindings.getKeys("app.clipboard.pasteImage"),
304
589
  );
305
- this.ctx.editor.onPasteImage = () => this.handleImagePaste();
590
+ this.ctx.editor.onPasteImage = () => this.actionRegistry.execute("app.clipboard.pasteImage");
591
+ this.#registerCommandPaletteAction("app.clipboard.pasteImage", pasteImageFromPalette);
592
+ const copyPrompt = () => this.handleCopyPrompt();
306
593
  this.ctx.editor.setActionKeys(
307
594
  "app.clipboard.copyPrompt",
308
595
  this.ctx.keybindings.getKeys("app.clipboard.copyPrompt"),
309
596
  );
310
- this.ctx.editor.onCopyPrompt = () => this.handleCopyPrompt();
311
- this.ctx.editor.onPasteText = text => this.handleTextPaste(text);
312
- this.ctx.editor.onPastePendingInputCleared = (reason, droppedInputCount) => {
597
+ this.ctx.editor.onCopyPrompt = () => this.#executeAction("app.clipboard.copyPrompt");
598
+ this.#registerCommandPaletteAction("app.clipboard.copyPrompt", copyPrompt);
599
+ this.ctx.editor.onPasteText = (text, context) => this.handleTextPaste(text, context);
600
+ this.ctx.editor.onPastePendingInputCleared = (reason, restoredInputCount) => {
313
601
  const reasonText = reason === "timeout" ? "timed out" : "exceeded the input queue limit";
314
602
  this.ctx.showWarning(
315
- `Paste handling ${reasonText}; discarded ${droppedInputCount} buffered input event${droppedInputCount === 1 ? "" : "s"}.`,
603
+ `Paste handling ${reasonText}; restored the original paste and ${restoredInputCount} buffered input event${restoredInputCount === 1 ? "" : "s"}.`,
316
604
  );
317
605
  };
606
+ const expandTools = () => this.toggleToolOutputExpansion();
318
607
  this.ctx.editor.setActionKeys("app.tools.expand", this.ctx.keybindings.getKeys("app.tools.expand"));
319
- this.ctx.editor.onExpandTools = () => this.toggleToolOutputExpansion();
608
+ this.ctx.editor.onExpandTools = () => this.#executeAction("app.tools.expand");
609
+ this.#registerCommandPaletteAction("app.tools.expand", expandTools);
610
+ const dequeue = () => this.handleDequeue();
320
611
  this.ctx.editor.setActionKeys("app.message.dequeue", this.ctx.keybindings.getKeys("app.message.dequeue"));
321
- this.ctx.editor.onDequeue = () => this.handleDequeue();
612
+ this.ctx.editor.onDequeue = () => this.#executeAction("app.message.dequeue");
613
+ this.#registerCommandPaletteAction("app.message.dequeue", dequeue);
614
+ const queue = () => this.handleQueueSubmit();
322
615
  this.ctx.editor.setActionKeys("app.message.queue", this.ctx.keybindings.getKeys("app.message.queue"));
323
- this.ctx.editor.onQueue = () => void this.handleQueueSubmit();
616
+ this.ctx.editor.onQueue = () => this.#executeAction("app.message.queue");
617
+ this.#registerCommandPaletteAction("app.message.queue", queue);
324
618
 
325
619
  this.ctx.editor.onViewportPageScroll = direction => this.ctx.ui.scrollViewportPages(direction);
326
620
  this.ctx.editor.onViewportFollowLive = () => {
@@ -333,64 +627,106 @@ export class InputController {
333
627
 
334
628
  for (const key of this.ctx.keybindings.getKeys("app.irc.sidebar.toggle")) {
335
629
  this.ctx.editor.setCustomKeyHandler(key, () => {
336
- this.ctx.toggleIrcSidebar();
630
+ this.#executeAction("app.irc.sidebar.toggle");
337
631
  return true;
338
632
  });
339
633
  }
340
634
 
341
- const planModeKeys = this.ctx.keybindings.getKeys("app.plan.toggle");
342
- for (const key of planModeKeys) {
343
- this.ctx.editor.setCustomKeyHandler(key, () => void this.ctx.handlePlanModeCommand());
635
+ const togglePlanMode = () => this.ctx.planModeController.handleCommand();
636
+ this.#registerCommandPaletteAction("app.plan.toggle", togglePlanMode);
637
+ for (const key of this.ctx.keybindings.getKeys("app.plan.toggle")) {
638
+ this.ctx.editor.setCustomKeyHandler(key, () => {
639
+ this.#executeAction("app.plan.toggle");
640
+ return true;
641
+ });
344
642
  }
345
-
643
+ const newSession = async () => {
644
+ await this.ctx.handleClearCommand();
645
+ };
646
+ this.#registerCommandPaletteAction("app.session.new", newSession);
346
647
  for (const key of this.ctx.keybindings.getKeys("app.session.new")) {
347
- this.ctx.editor.setCustomKeyHandler(key, () => void this.ctx.handleClearCommand());
648
+ this.ctx.editor.setCustomKeyHandler(key, () => {
649
+ this.#executeAction("app.session.new");
650
+ return true;
651
+ });
348
652
  }
653
+ const showTree = () => {
654
+ this.ctx.showTreeSelector();
655
+ return undefined;
656
+ };
657
+ this.#registerCommandPaletteAction("app.session.tree", showTree);
349
658
  for (const key of this.ctx.keybindings.getKeys("app.session.tree")) {
350
659
  this.ctx.editor.setCustomKeyHandler(key, () => {
351
- this.ctx.showTreeSelector();
660
+ this.#executeAction("app.session.tree");
661
+ return true;
352
662
  });
353
663
  }
664
+ const forkSession = () => {
665
+ this.ctx.showUserMessageSelector();
666
+ return undefined;
667
+ };
668
+ this.#registerCommandPaletteAction("app.session.fork", forkSession);
354
669
  for (const key of this.ctx.keybindings.getKeys("app.session.fork")) {
355
670
  this.ctx.editor.setCustomKeyHandler(key, () => {
356
- this.ctx.showUserMessageSelector();
671
+ this.#executeAction("app.session.fork");
672
+ return true;
357
673
  });
358
674
  }
675
+ const resumeSession = () => {
676
+ this.ctx.showSessionSelector();
677
+ return undefined;
678
+ };
679
+ this.#registerCommandPaletteAction("app.session.resume", resumeSession);
359
680
  for (const key of this.ctx.keybindings.getKeys("app.session.resume")) {
360
681
  this.ctx.editor.setCustomKeyHandler(key, () => {
361
- this.ctx.showSessionSelector();
682
+ this.#executeAction("app.session.resume");
683
+ return true;
362
684
  });
363
685
  }
364
686
  for (const key of this.ctx.keybindings.getKeys("app.message.followUp")) {
365
687
  this.ctx.editor.setCustomKeyHandler(key, () => {
366
- if (!this.#isFollowUpShortcutActive()) return false;
367
- void this.handleFollowUp();
688
+ if (!this.actionRegistry.isAvailable("app.message.followUp")) return false;
689
+ this.#executeAction("app.message.followUp");
368
690
  return true;
369
691
  });
370
692
  }
371
693
  for (const key of this.ctx.keybindings.getKeys("app.stt.toggle")) {
372
- this.ctx.editor.setCustomKeyHandler(key, () => void this.ctx.handleSTTToggle());
694
+ this.ctx.editor.setCustomKeyHandler(key, () => {
695
+ this.#executeAction("app.stt.toggle");
696
+ return true;
697
+ });
373
698
  }
374
699
  for (const key of this.ctx.keybindings.getKeys("app.clipboard.copyLine")) {
375
700
  this.ctx.editor.setCustomKeyHandler(key, () => {
376
- this.handleCopyCurrentLine();
701
+ this.#executeAction("app.clipboard.copyLine");
377
702
  });
378
703
  }
379
704
  for (const key of this.ctx.keybindings.getKeys("app.session.observe")) {
380
705
  this.ctx.editor.setCustomKeyHandler(key, () => {
381
- this.ctx.showSessionObserver();
706
+ this.#executeAction("app.session.observe");
382
707
  });
383
708
  }
384
709
  for (const key of this.ctx.keybindings.getKeys("app.jobs.open")) {
385
710
  this.ctx.editor.setCustomKeyHandler(key, () => {
386
- this.ctx.showJobsOverlay();
711
+ this.#executeAction("app.jobs.open");
712
+ });
713
+ }
714
+ for (const key of this.ctx.keybindings.getKeys("app.tasks.toggle")) {
715
+ this.ctx.editor.setCustomKeyHandler(key, () => {
716
+ this.#executeAction("app.tasks.toggle");
717
+ return true;
387
718
  });
388
719
  }
389
720
  for (const key of this.ctx.keybindings.getKeys("app.tool.backgroundFold")) {
390
- this.ctx.editor.setCustomKeyHandler(key, () => this.handleForegroundToolBackgroundFold());
721
+ this.ctx.editor.setCustomKeyHandler(key, () => {
722
+ if (!this.actionRegistry.isAvailable("app.tool.backgroundFold")) return false;
723
+ this.#executeAction("app.tool.backgroundFold");
724
+ return true;
725
+ });
391
726
  }
392
727
 
393
728
  this.ctx.editor.onChange = (text: string) => {
729
+ this.#resetEscapeGestures();
394
730
  const wasBashMode = this.ctx.isBashMode;
395
731
  const wasBashNoContext = this.ctx.isBashNoContext;
396
732
  const wasPythonMode = this.ctx.isPythonMode;
@@ -410,187 +746,205 @@ export class InputController {
410
746
  }
411
747
 
412
748
  setupEditorSubmitHandler(): void {
413
- this.ctx.editor.onSubmit = async (text: string) => {
414
- text = text.trim();
415
- if ((!isSettingsInitialized() || settings.get("emojiAutocomplete")) && text) text = expandEmoticons(text);
416
-
417
- // Empty submit while streaming with queued messages: flush queues immediately
418
- if (!text && this.ctx.session.isStreaming && this.ctx.session.queuedMessageCount > 0) {
419
- // Abort current stream and let queued messages be processed
420
- await this.#abortInteractive();
421
- return;
422
- }
749
+ this.ctx.editor.onSubmit = text => this.submitText(text, { ownsComposer: true, editor: this.ctx.editor });
750
+ }
423
751
 
424
- if (!text) return;
752
+ async submitText(text: string, composer: ComposerSubmissionOptions): Promise<void> {
753
+ text = text.trim();
754
+ if ((!isSettingsInitialized() || settings.get("emojiAutocomplete")) && text) text = expandEmoticons(text);
425
755
 
426
- // Continue shortcuts: "." or "c" sends empty message (agent continues, no visible message)
427
- if (text === "." || text === "c") {
428
- if (this.ctx.onInputCallback) {
429
- this.ctx.editor.setText("");
430
- this.ctx.pendingImages = [];
431
- this.ctx.onInputCallback({ text: "", cancelled: false, started: true });
432
- }
433
- return;
434
- }
756
+ // Empty submit while streaming with queued messages: flush queues immediately
757
+ if (!text && this.ctx.session.isStreaming && this.ctx.session.queuedMessageCount > 0) {
758
+ // Abort current stream and let queued messages be processed
759
+ await this.#abortInteractive();
760
+ return;
761
+ }
435
762
 
436
- const runner = this.ctx.session.extensionRunner;
437
- let inputImages = this.#visiblePendingImagesForText(text);
763
+ if (!text) return;
438
764
 
439
- if (runner?.hasHandlers("input")) {
440
- const result = await runner.emitInput(text, inputImages, "interactive");
441
- if (result?.handled) {
442
- this.ctx.editor.setText("");
443
- this.ctx.pendingImages = [];
444
- return;
445
- }
446
- if (result?.text !== undefined) {
447
- text = result.text.trim();
448
- }
449
- if (result?.images !== undefined) {
450
- inputImages = result.images;
451
- }
765
+ // Continue shortcuts: "." or "c" sends empty message (agent continues, no visible message)
766
+ if (text === "." || text === "c") {
767
+ if (this.ctx.onInputCallback) {
768
+ this.ctx.editor.setText("");
769
+ this.ctx.pendingImages = [];
770
+ this.ctx.onInputCallback({ text: "", cancelled: false, started: true });
452
771
  }
772
+ return;
773
+ }
453
774
 
454
- if (!text) return;
775
+ const runner = this.ctx.session.extensionRunner;
776
+ const pendingImages = this.ctx.pendingImages;
777
+ let inputImages = this.#visiblePendingImagesForText(text);
455
778
 
456
- // Handle built-in slash commands
457
- const slashResult = await executeBuiltinSlashCommand(text, {
458
- ctx: this.ctx,
459
- handleBackgroundCommand: () => this.handleBackgroundCommand(),
460
- });
461
- if (slashResult === true) {
779
+ if (runner?.hasHandlers("input")) {
780
+ const result = await runner.emitInput(text, inputImages, "interactive");
781
+ if (result?.handled) {
782
+ if (this.#canModifyComposer(composer)) {
783
+ this.ctx.editor.setText("");
784
+ }
785
+ this.#clearPendingImagesIfOwnedBy(pendingImages, composer);
462
786
  return;
463
787
  }
464
- if (typeof slashResult === "string") {
465
- // Command handled but returned remaining text to use as prompt
466
- text = slashResult;
788
+ if (result?.text !== undefined) {
789
+ text = result.text.trim();
467
790
  }
468
-
469
- // Handle skill commands (/skill:name [args]). While streaming, Enter
470
- // honors `busyPromptMode`: "steer" interrupts the active turn, "queue"
471
- // runs after it completes (matches the free-text Enter semantics applied
472
- // a few lines below at the streaming branch). Explicit queue shortcuts
473
- // route through `handleFollowUp` and dispatch as `followUp`.
474
- if (await this.#invokeSkillCommand(text, this.#busyStreamingBehavior())) {
475
- return;
791
+ if (result?.images !== undefined) {
792
+ inputImages = result.images;
476
793
  }
794
+ }
795
+
796
+ if (!text) return;
797
+
798
+ // Handle built-in slash commands
799
+ const slashResult = await executeBuiltinSlashCommand(text, {
800
+ ctx: this.ctx,
801
+ handleBackgroundCommand: () => this.handleBackgroundCommand(),
802
+ composer,
803
+ });
804
+ if (slashResult === true) {
805
+ return;
806
+ }
807
+ if (typeof slashResult === "string") {
808
+ // Command handled but returned remaining text to use as prompt
809
+ text = slashResult;
810
+ }
477
811
 
478
- // Handle bash command (! for normal, !! for excluded from context)
479
- if (text.startsWith("!")) {
480
- const isExcluded = text.startsWith("!!");
481
- const command = isExcluded ? text.slice(2).trim() : text.slice(1).trim();
482
- if (command) {
483
- if (this.ctx.session.isBashRunning) {
484
- this.ctx.showWarning("A bash command is already running. Press Esc to cancel it first.");
812
+ // Handle skill commands (/skill:name [args]). While streaming, Enter
813
+ // honors `busyPromptMode`: "steer" interrupts the active turn, "queue"
814
+ // runs after it completes (matches the free-text Enter semantics applied
815
+ // a few lines below at the streaming branch). Explicit queue shortcuts
816
+ // route through `handleFollowUp` and dispatch as `followUp`.
817
+ if (await this.#invokeSkillCommand(text, this.#busyStreamingBehavior(), composer)) {
818
+ return;
819
+ }
820
+
821
+ // Handle bash command (! for normal, !! for excluded from context)
822
+ if (text.startsWith("!")) {
823
+ const isExcluded = text.startsWith("!!");
824
+ const command = isExcluded ? text.slice(2).trim() : text.slice(1).trim();
825
+ if (command) {
826
+ if (this.ctx.session.isBashRunning) {
827
+ this.ctx.showWarning("A bash command is already running. Press Esc to cancel it first.");
828
+ if (this.#canModifyComposer(composer)) {
485
829
  this.ctx.editor.setText(text);
486
- return;
487
830
  }
488
- this.ctx.editor.addToHistory(text);
489
- await this.ctx.handleBashCommand(command, isExcluded);
490
- this.ctx.isBashMode = false;
491
- this.ctx.isBashNoContext = false;
492
- this.ctx.updateEditorBorderColor();
493
831
  return;
494
832
  }
833
+ if (this.#canModifyComposer(composer)) {
834
+ this.ctx.editor.addToHistory(text);
835
+ }
836
+ await this.ctx.handleBashCommand(command, isExcluded);
837
+ this.ctx.isBashMode = false;
838
+ this.ctx.isBashNoContext = false;
839
+ this.ctx.updateEditorBorderColor();
840
+ return;
495
841
  }
842
+ }
496
843
 
497
- // Handle python command ($ for normal, $$ for excluded from context)
498
- if (text.startsWith("$")) {
499
- const isExcluded = text.startsWith("$$");
500
- const code = isExcluded ? text.slice(2).trim() : text.slice(1).trim();
501
- if (code) {
502
- if (this.ctx.session.isEvalRunning) {
503
- this.ctx.showWarning("A Python execution is already running. Press Esc to cancel it first.");
844
+ // Handle python command ($ for normal, $$ for excluded from context)
845
+ if (text.startsWith("$")) {
846
+ const isExcluded = text.startsWith("$$");
847
+ const code = isExcluded ? text.slice(2).trim() : text.slice(1).trim();
848
+ if (code) {
849
+ if (this.ctx.session.isEvalRunning) {
850
+ this.ctx.showWarning("A Python execution is already running. Press Esc to cancel it first.");
851
+ if (this.#canModifyComposer(composer)) {
504
852
  this.ctx.editor.setText(text);
505
- return;
506
853
  }
507
- this.ctx.editor.addToHistory(text);
508
- await this.ctx.handlePythonCommand(code, isExcluded);
509
- this.ctx.isPythonMode = false;
510
- this.ctx.updateEditorBorderColor();
511
854
  return;
512
855
  }
856
+ if (this.#canModifyComposer(composer)) {
857
+ this.ctx.editor.addToHistory(text);
858
+ }
859
+ await this.ctx.handlePythonCommand(code, isExcluded);
860
+ this.ctx.isPythonMode = false;
861
+ this.ctx.updateEditorBorderColor();
862
+ return;
513
863
  }
864
+ }
514
865
 
515
- // Queue input during compaction
516
- if (this.ctx.session.isCompacting) {
517
- if ((inputImages?.length ?? 0) > 0) {
518
- this.ctx.showStatus("Compaction in progress. Retry after it completes to send images.");
519
- return;
520
- }
521
- this.ctx.queueCompactionMessage(text, "steer");
866
+ // Queue input during compaction
867
+ if (this.ctx.session.isCompacting) {
868
+ if ((inputImages?.length ?? 0) > 0) {
869
+ this.ctx.showStatus("Compaction in progress. Retry after it completes to send images.");
522
870
  return;
523
871
  }
872
+ this.ctx.queueCompactionMessage(text, "steer", composer);
873
+ return;
874
+ }
524
875
 
525
- // If streaming, use prompt() with the busy-prompt behavior the user
526
- // selected: "steer" interrupts the active turn, "queue" defers the
527
- // prompt to run after the active turn completes (in submission order).
528
- // This handles extension commands (execute immediately), prompt template expansion, and queueing
529
- if (this.ctx.session.isStreaming) {
876
+ // If streaming, use prompt() with the busy-prompt behavior the user
877
+ // selected: "steer" interrupts the active turn, "queue" defers the
878
+ // prompt to run after the active turn completes (in submission order).
879
+ // This handles extension commands (execute immediately), prompt template expansion, and queueing
880
+ if (this.ctx.session.isStreaming) {
881
+ if (this.#canModifyComposer(composer)) {
530
882
  this.ctx.editor.addToHistory(text);
531
883
  this.ctx.editor.setText("");
532
- const images = inputImages && inputImages.length > 0 ? [...inputImages] : undefined;
533
- this.ctx.pendingImages = [];
534
- // Record the signature so the queued message's eventual delivery
535
- // (a user-role `message_start` event) leaves any draft the user has
536
- // typed since queuing intact. Same protection as #783, applied to
537
- // the streaming/queue path.
538
- const streamingBehavior = this.#busyStreamingBehavior();
539
- const promptOptions =
540
- streamingBehavior === "followUp"
541
- ? { streamingBehavior, images, followUpQueuePolicy: "sequential" as const }
542
- : { streamingBehavior, images };
543
- await this.ctx.withLocalSubmission(text, () => this.ctx.session.prompt(text, promptOptions), {
544
- imageCount: images?.length ?? 0,
545
- });
546
- this.ctx.updatePendingMessagesDisplay();
547
- this.ctx.ui.requestRender();
548
- return;
549
884
  }
885
+ const images = inputImages && inputImages.length > 0 ? [...inputImages] : undefined;
886
+ this.#clearPendingImagesIfOwnedBy(pendingImages, composer);
887
+ // Record the signature so the queued message's eventual delivery
888
+ // (a user-role `message_start` event) leaves any draft the user has
889
+ // typed since queuing intact. Same protection as #783, applied to
890
+ // the streaming/queue path.
891
+ const streamingBehavior = this.#busyStreamingBehavior();
892
+ const promptOptions =
893
+ streamingBehavior === "followUp"
894
+ ? { streamingBehavior, images, followUpQueuePolicy: "sequential" as const }
895
+ : { streamingBehavior, images };
896
+ await this.ctx.withLocalSubmission(text, () => this.ctx.session.prompt(text, promptOptions), {
897
+ imageCount: images?.length ?? 0,
898
+ });
899
+ this.ctx.updatePendingMessagesDisplay();
900
+ this.ctx.ui.requestRender();
901
+ return;
902
+ }
550
903
 
551
- // Normal message submission
552
- // First, move any pending bash components to chat
553
- this.ctx.flushPendingBashComponents();
554
-
555
- // Generate session title on first message
556
- const hasUserMessages = this.ctx.session.messages.some((m: AgentMessage) => m.role === "user");
557
- if (!hasUserMessages && !this.ctx.sessionManager.getSessionName() && !$env.PI_NO_TITLE) {
558
- const registry = this.ctx.session.modelRegistry;
559
- generateSessionTitle(
560
- text,
561
- registry,
562
- this.ctx.settings,
563
- this.ctx.session.sessionId,
564
- this.ctx.session.model,
565
- provider => this.ctx.session.agent.metadataForProvider(provider),
566
- )
567
- .then(async title => {
568
- if (title) {
569
- const applied = await this.ctx.sessionManager.setSessionName(title, "auto");
570
- if (applied) {
571
- setSessionTerminalTitle(
572
- this.ctx.sessionManager.getSessionName()!,
573
- this.ctx.sessionManager.getCwd(),
574
- );
575
- this.ctx.updateEditorBorderColor();
576
- }
904
+ // Normal message submission
905
+ // First, move any pending bash components to chat
906
+ this.ctx.flushPendingBashComponents();
907
+
908
+ // Generate session title on first message
909
+ const hasUserMessages = this.ctx.session.messages.some((m: AgentMessage) => m.role === "user");
910
+ if (!hasUserMessages && !this.ctx.sessionManager.getSessionName() && !$env.PI_NO_TITLE) {
911
+ const registry = this.ctx.session.modelRegistry;
912
+ generateSessionTitle(
913
+ text,
914
+ registry,
915
+ this.ctx.settings,
916
+ this.ctx.session.sessionId,
917
+ this.ctx.session.model,
918
+ provider => this.ctx.session.agent.metadataForProvider(provider),
919
+ )
920
+ .then(async title => {
921
+ if (title) {
922
+ const applied = await this.ctx.sessionManager.setSessionName(title, "auto");
923
+ if (applied) {
924
+ setSessionTerminalTitle(
925
+ this.ctx.sessionManager.getSessionName()!,
926
+ this.ctx.sessionManager.getCwd(),
927
+ );
928
+ this.ctx.updateEditorBorderColor();
577
929
  }
578
- })
579
- .catch(() => {});
580
- }
930
+ }
931
+ })
932
+ .catch(() => {});
933
+ }
581
934
 
582
- if (this.ctx.onInputCallback) {
583
- // Include any pending images from clipboard paste
584
- const images = inputImages && inputImages.length > 0 ? [...inputImages] : undefined;
585
- this.ctx.pendingImages = [];
935
+ if (this.ctx.onInputCallback) {
936
+ // Include any pending images from clipboard paste
937
+ const images = inputImages && inputImages.length > 0 ? [...inputImages] : undefined;
938
+ this.#clearPendingImagesIfOwnedBy(pendingImages, composer);
586
939
 
587
- // Render user message immediately, then let session events catch up
588
- const submission = this.ctx.startPendingSubmission({ text, images });
940
+ // Render user message immediately, then let session events catch up
941
+ const submission = this.ctx.startPendingSubmission({ text, images }, composer);
589
942
 
590
- this.ctx.onInputCallback(submission);
591
- }
943
+ this.ctx.onInputCallback(submission);
944
+ }
945
+ if (this.#canModifyComposer(composer)) {
592
946
  this.ctx.editor.addToHistory(text);
593
- };
947
+ }
594
948
  }
595
949
 
596
950
  handleCtrlC(): void {
@@ -624,6 +978,106 @@ export class InputController {
624
978
  process.kill(0, "SIGTSTP");
625
979
  }
626
980
 
981
+ #queuePaneOverlay: ReturnType<typeof this.ctx.ui.showOverlay> | undefined;
982
+
983
+ toggleQueuePane(): void {
984
+ if (this.#queuePaneOverlay) {
985
+ this.#queuePaneOverlay.hide();
986
+ this.#queuePaneOverlay = undefined;
987
+ this.ctx.ui.setFocus(this.ctx.editor);
988
+ this.ctx.ui.requestRender(true);
989
+ return;
990
+ }
991
+ this.#showQueuePane();
992
+ }
993
+
994
+ #showQueuePane(selectedIndex = 0): void {
995
+ const entries = this.ctx.session.getQueuedMessageEntries();
996
+ if (entries.length === 0) {
997
+ this.ctx.showStatus("No queued messages");
998
+ return;
999
+ }
1000
+ const close = () => {
1001
+ this.#queuePaneOverlay?.hide();
1002
+ this.#queuePaneOverlay = undefined;
1003
+ this.ctx.ui.setFocus(this.ctx.editor);
1004
+ this.ctx.ui.requestRender(true);
1005
+ };
1006
+ const refresh = (nextIndex: number) => {
1007
+ this.#queuePaneOverlay?.hide();
1008
+ this.#queuePaneOverlay = undefined;
1009
+ this.#showQueuePane(nextIndex);
1010
+ };
1011
+ const pane = new QueuePaneComponent(entries, {
1012
+ selectedIndex,
1013
+ onDelete: (entry, index) => {
1014
+ const deleted = this.ctx.session.removeQueuedMessageForEditing(entry.id) !== undefined;
1015
+ const remaining = this.ctx.session.getQueuedMessageEntries();
1016
+ this.ctx.updatePendingMessagesDisplay();
1017
+ if (remaining.length === 0) {
1018
+ close();
1019
+ this.ctx.showStatus(deleted ? "Deleted queued message" : "Queued message is no longer available");
1020
+ return;
1021
+ }
1022
+ this.ctx.showStatus(deleted ? "Deleted queued message" : "Queued message is no longer available");
1023
+ refresh(Math.min(index, remaining.length - 1));
1024
+ },
1025
+ onMove: (entry, index, direction) => {
1026
+ const moved = this.ctx.session.moveQueuedMessageForEditing(entry.id, direction);
1027
+ this.ctx.updatePendingMessagesDisplay();
1028
+ this.ctx.showStatus(moved ? "Moved queued message" : "Queued message cannot move further");
1029
+ refresh(Math.max(0, Math.min(index + (direction === "up" ? -1 : 1), entries.length - 1)));
1030
+ },
1031
+ onClose: close,
1032
+ });
1033
+ this.#queuePaneOverlay = this.ctx.ui.showOverlay(pane, {
1034
+ anchor: "bottom-center",
1035
+ width: "100%",
1036
+ maxHeight: "100%",
1037
+ margin: 0,
1038
+ });
1039
+ this.ctx.ui.setFocus(pane);
1040
+ this.ctx.ui.requestRender();
1041
+ }
1042
+
1043
+ async sendNow(): Promise<void> {
1044
+ const composerText = this.ctx.editor.getText().trim();
1045
+ let text = composerText;
1046
+ let queuedEntryId: string | undefined;
1047
+ if (!text) {
1048
+ if (this.ctx.session.isCompacting) {
1049
+ this.ctx.showWarning("Cannot send immediately while compaction is in progress");
1050
+ return;
1051
+ }
1052
+ const entry = this.ctx.session.getQueuedMessageEntries()[0];
1053
+ if (!entry) {
1054
+ this.ctx.showStatus("No visible queued message to send");
1055
+ return;
1056
+ }
1057
+ text = entry.text;
1058
+ queuedEntryId = entry.id;
1059
+ }
1060
+ const outcome = await this.ctx.session.cancelAndSubmit(text, { queuedEntryId });
1061
+ if (outcome.kind === "submitted") {
1062
+ if (composerText) this.ctx.clearEditor();
1063
+ this.ctx.updatePendingMessagesDisplay();
1064
+ return;
1065
+ }
1066
+ if (outcome.kind === "rolled_back") {
1067
+ this.ctx.showWarning(
1068
+ outcome.outcome.kind === "timeout"
1069
+ ? "Send was cancelled after forced recovery; queued messages were restored"
1070
+ : "Send failed; queued messages were restored",
1071
+ );
1072
+ return;
1073
+ }
1074
+ if (outcome.reason === "compaction") {
1075
+ this.ctx.showWarning("Cannot send immediately while compaction is in progress");
1076
+ } else {
1077
+ this.ctx.showStatus("Send already in progress");
1078
+ }
1079
+ }
1080
+
627
1081
  handleDequeue(): void {
628
1082
  const entries = this.#getEditableQueuedMessages();
629
1083
  if (entries.length === 0) {
@@ -814,15 +1268,6 @@ export class InputController {
814
1268
  return this.ctx.settings.get("busyPromptMode") === "steer" ? "steer" : "followUp";
815
1269
  }
816
1270
 
817
- #isFollowUpShortcutActive(): boolean {
818
- return (
819
- this.ctx.session.isStreaming ||
820
- this.ctx.session.isCompacting ||
821
- this.ctx.session.isBashRunning ||
822
- this.ctx.session.isEvalRunning
823
- );
824
- }
825
-
826
1271
  /**
827
1272
  * Dispatch skill slash invocation(s) (`/skill:<name>`) through custom messages
828
1273
  * using the supplied `streamingBehavior`. Returns true if the text contains a
@@ -836,11 +1281,17 @@ export class InputController {
836
1281
  * while the agent is streaming; the idle path of `promptCustomMessage`
837
1282
  * ignores it.
838
1283
  */
839
- async #invokeSkillCommand(text: string, streamingBehavior: "steer" | "followUp"): Promise<boolean> {
1284
+ async #invokeSkillCommand(
1285
+ text: string,
1286
+ streamingBehavior: "steer" | "followUp",
1287
+ options?: ComposerSubmissionOptions,
1288
+ ): Promise<boolean> {
840
1289
  const invocations = parseSkillInvocations(text, this.ctx.skillCommands ?? new Map());
841
1290
  if (invocations.length === 0) return false;
842
- this.ctx.editor.addToHistory(text);
843
- this.ctx.editor.setText("");
1291
+ if (!options || this.#canModifyComposer(options)) {
1292
+ this.ctx.editor.addToHistory(text);
1293
+ this.ctx.editor.setText("");
1294
+ }
844
1295
  try {
845
1296
  for (let index = 0; index < invocations.length; index += 1) {
846
1297
  const invocation = invocations[index];
@@ -1064,7 +1515,7 @@ export class InputController {
1064
1515
  }
1065
1516
 
1066
1517
  const now = Date.now();
1067
- if (now - this.#lastBackgroundFoldKeyTime > 750) {
1518
+ if (now - this.#lastBackgroundFoldKeyTime > BACKGROUND_FOLD_DOUBLE_PRESS_MS) {
1068
1519
  this.#lastBackgroundFoldKeyTime = now;
1069
1520
  this.ctx.showStatus("Press Ctrl+B again to fold supported foreground bash into a background job");
1070
1521
  return true;
@@ -1082,43 +1533,96 @@ export class InputController {
1082
1533
  return true;
1083
1534
  }
1084
1535
 
1085
- handleTextPaste(text: string): boolean | Promise<boolean> {
1086
- const imagePath = resolvePastedImagePath(text, { cwd: this.ctx.sessionManager.getCwd() });
1087
- return imagePath ? this.#attachPastedImagePath(imagePath) : false;
1536
+ handleTextPaste(text: string, context: PasteTextContext): boolean | Promise<boolean> {
1537
+ if (this.ctx.isBashMode || this.ctx.isPythonMode) return false;
1538
+ const parsed = parsePastedImagePaths(text, { cwd: this.ctx.sessionManager.getCwd() });
1539
+ if (!parsed) return false;
1540
+ if (parsed.kind === "too-many") {
1541
+ this.ctx.showStatus(`Cannot attach more than ${parsed.maxCandidates} pasted images.`);
1542
+ return false;
1543
+ }
1544
+ return this.#attachPastedImagePaths(parsed.paths, parsed.requiresConfirmation, context);
1088
1545
  }
1089
1546
 
1090
- /**
1091
- * Returns `false` on every failure path so the editor replays the original
1092
- * bracketed paste — the raw path text must never be lost when attachment
1093
- * is impossible (unsupported content, oversized image, load error).
1094
- */
1095
- async #attachPastedImagePath(imagePath: string): Promise<boolean> {
1547
+ /** Return false on every failure so CustomEditor restores the exact paste. */
1548
+ async #attachPastedImagePaths(
1549
+ imagePaths: readonly string[],
1550
+ requiresConfirmation: boolean,
1551
+ context: PasteTextContext,
1552
+ ): Promise<boolean> {
1553
+ const signal = context.signal;
1554
+ const editor = this.ctx.editor;
1555
+ const editorText = editor.getText();
1556
+ const pendingImages = this.ctx.pendingImages;
1557
+ const pendingImageCount = pendingImages.length;
1096
1558
  try {
1097
- const image = await loadImageInput({
1098
- path: imagePath,
1099
- cwd: this.ctx.sessionManager.getCwd(),
1559
+ if (requiresConfirmation) {
1560
+ const selection = await this.ctx.showHookSelector(
1561
+ `Attach ${imagePaths.length} pasted images?\nOnly attach files you intend to send to the model.`,
1562
+ ["Attach images", "Paste paths literally"],
1563
+ { signal, helpText: "Enter: choose · Esc: paste paths literally" },
1564
+ );
1565
+ signal.throwIfAborted();
1566
+ if (selection !== "Attach images") return false;
1567
+ }
1568
+
1569
+ const loaded = await this.#loadPastedImageBatch({
1570
+ paths: imagePaths,
1100
1571
  autoResize: this.ctx.settings.get("images.autoResize"),
1572
+ sourcePolicy: requiresConfirmation ? "confirmed" : "automatic-temp",
1573
+ signal,
1101
1574
  });
1102
- if (!image) {
1103
- this.ctx.showStatus("Unsupported pasted image file");
1104
- return false;
1105
- }
1575
+ signal.throwIfAborted();
1576
+ return context.commit(() => {
1577
+ if (
1578
+ this.ctx.editor !== editor ||
1579
+ editor.getText() !== editorText ||
1580
+ this.ctx.pendingImages !== pendingImages ||
1581
+ pendingImages.length !== pendingImageCount
1582
+ ) {
1583
+ return false;
1584
+ }
1585
+
1586
+ const firstImageNumber = pendingImages.length + 1;
1587
+ const references = loaded.sourcePaths.map((sourcePath, index) =>
1588
+ formatPastedImageReference(`[image ${firstImageNumber + index}]`, sourcePath),
1589
+ );
1590
+ try {
1591
+ editor.insertText(`${references.join(" ")} `);
1592
+ this.ctx.pendingImages = [...pendingImages, ...loaded.images];
1593
+ } catch (error) {
1594
+ try {
1595
+ editor.setText(editorText);
1596
+ } catch {
1597
+ // Preserve the original mutation error when rollback itself fails.
1598
+ } finally {
1599
+ this.ctx.pendingImages = pendingImages;
1600
+ }
1601
+ throw error;
1602
+ }
1106
1603
 
1107
- this.ctx.pendingImages.push({
1108
- type: "image",
1109
- data: image.data,
1110
- mimeType: image.mimeType,
1604
+ try {
1605
+ this.ctx.showStatus(
1606
+ loaded.images.length === 1
1607
+ ? `Attached image: ${path.basename(loaded.sourcePaths[0] ?? "")}`
1608
+ : `Attached ${loaded.images.length} images`,
1609
+ { dim: true },
1610
+ );
1611
+ this.ctx.ui.requestRender();
1612
+ } catch (error) {
1613
+ logger.warn("Pasted images attached but status rendering failed", { error: String(error) });
1614
+ }
1615
+ return true;
1111
1616
  });
1112
- this.ctx.editor.insertText(`${formatPastedImageReference(this.#nextImagePlaceholder(), image.resolvedPath)} `);
1113
- this.ctx.showStatus(`Attached image: ${path.basename(image.resolvedPath)}`, { dim: true });
1114
- this.ctx.ui.requestRender();
1115
- return true;
1116
1617
  } catch (error) {
1117
- if (error instanceof ImageInputTooLargeError) {
1618
+ if (signal.aborted) return false;
1619
+ if (error instanceof ImageInputTooLargeError || error instanceof PastedImageBatchError) {
1118
1620
  this.ctx.showStatus(error.message);
1119
1621
  return false;
1120
1622
  }
1121
- this.ctx.showStatus("Failed to attach pasted image");
1623
+ this.ctx.showStatus(
1624
+ imagePaths.length === 1 ? "Failed to attach pasted image" : "Failed to attach pasted images",
1625
+ );
1122
1626
  return false;
1123
1627
  }
1124
1628
  }
@@ -1151,10 +1655,40 @@ export class InputController {
1151
1655
  return images.length > 0 ? images : undefined;
1152
1656
  }
1153
1657
 
1658
+ #canModifyComposer(options: ComposerSubmissionOptions): boolean {
1659
+ return canApplyComposerSubmission(options, this.ctx.editor);
1660
+ }
1661
+
1662
+ #clearPendingImagesIfOwnedBy(
1663
+ pendingImages: InteractiveModeContext["pendingImages"],
1664
+ options: ComposerSubmissionOptions,
1665
+ ): void {
1666
+ if (this.#canModifyComposer(options) && this.ctx.pendingImages === pendingImages) {
1667
+ this.ctx.pendingImages = [];
1668
+ }
1669
+ }
1670
+
1154
1671
  #clearPendingImagesIfPlaceholdersRemoved(text: string): void {
1155
1672
  if (this.ctx.pendingImages.length === 0 || IMAGE_PLACEHOLDER_PRESENT_PATTERN.test(text)) {
1156
1673
  return;
1157
1674
  }
1675
+ // Editor submit resets the composer and emits onChange("") before onSubmit(result).
1676
+ // Defer the empty-buffer clear so the submit handler can still resolve image
1677
+ // placeholders against pendingImages, while manual clears still drop stale images.
1678
+ if (text.length === 0) {
1679
+ const pendingImages = this.ctx.pendingImages;
1680
+ const pendingImageCount = pendingImages.length;
1681
+ queueMicrotask(() => {
1682
+ if (
1683
+ this.ctx.pendingImages === pendingImages &&
1684
+ pendingImages.length === pendingImageCount &&
1685
+ this.ctx.editor.getText().length === 0
1686
+ ) {
1687
+ this.ctx.pendingImages = [];
1688
+ }
1689
+ });
1690
+ return;
1691
+ }
1158
1692
  this.ctx.pendingImages = [];
1159
1693
  }
1160
1694
 
@@ -1185,11 +1719,14 @@ export class InputController {
1185
1719
  }
1186
1720
  }
1187
1721
 
1188
- this.ctx.pendingImages.push({
1189
- type: "image",
1190
- data: imageData.data,
1191
- mimeType: imageData.mimeType,
1192
- });
1722
+ this.ctx.pendingImages = [
1723
+ ...this.ctx.pendingImages,
1724
+ {
1725
+ type: "image",
1726
+ data: imageData.data,
1727
+ mimeType: imageData.mimeType,
1728
+ },
1729
+ ];
1193
1730
  this.ctx.editor.insertText(`${this.#nextImagePlaceholder()} `);
1194
1731
  this.ctx.ui.requestRender();
1195
1732
  return true;
@@ -1205,6 +1742,7 @@ export class InputController {
1205
1742
  }
1206
1743
 
1207
1744
  createAutocompleteProvider(commands: SlashCommand[], basePath: string): AutocompleteProvider {
1745
+ this.#slashCommands = commands;
1208
1746
  return createPromptActionAutocompleteProvider({
1209
1747
  commands,
1210
1748
  basePath,
@@ -1258,12 +1796,90 @@ export class InputController {
1258
1796
  }
1259
1797
  }
1260
1798
 
1799
+ async #dispatchPaletteSlashCommand(name: string, restoreComposer: () => void): Promise<void> {
1800
+ if (this.#paletteCommandInFlight) {
1801
+ this.ctx.showStatus("A palette command is still running.");
1802
+ return;
1803
+ }
1804
+
1805
+ if (this.ctx.editor.getText() || this.ctx.pendingImages.length > 0) {
1806
+ this.ctx.showStatus("Send or clear the draft before running a palette command.");
1807
+ return;
1808
+ }
1809
+
1810
+ restoreComposer();
1811
+ this.#paletteCommandInFlight = true;
1812
+ try {
1813
+ await this.submitText(`/${name}`, { ownsComposer: false, editor: this.ctx.editor });
1814
+ } finally {
1815
+ this.#paletteCommandInFlight = false;
1816
+ }
1817
+ }
1818
+
1261
1819
  openCommandPalette(): void {
1262
- if (this.ctx.editor.getText().trim().length > 0) {
1263
- this.ctx.showStatus("Command palette opens from an empty prompt. Type / for inline commands.");
1820
+ if (this.ctx.isTranscriptViewerOpen?.()) return;
1821
+ if (this.#paletteCommandInFlight) {
1822
+ this.ctx.showStatus("A palette command is still running.");
1823
+ return;
1824
+ }
1825
+
1826
+ const actions = [...this.#commandPaletteActions.values()];
1827
+ const slashCommands = [...(this.ctx.getSlashCommands?.() ?? this.#slashCommands)];
1828
+ if (!this.ctx.showCommandPalette) {
1829
+ let overlayHandle: ReturnType<typeof this.ctx.ui.showOverlay> | undefined;
1830
+ const close = () => {
1831
+ overlayHandle?.hide();
1832
+ this.ctx.ui.setFocus(this.ctx.editor);
1833
+ this.ctx.ui.requestRender(true);
1834
+ };
1835
+ const entries: CommandPaletteEntry[] = [
1836
+ ...this.actionRegistry
1837
+ .all()
1838
+ .filter(action => this.actionRegistry.isAvailable(action.id))
1839
+ .map(action => ({
1840
+ id: `action:${action.id}`,
1841
+ label: action.title,
1842
+ description: action.category,
1843
+ keybinding: action.bindingId
1844
+ ? this.ctx.keybindings.getKeys(action.bindingId).join(", ") || undefined
1845
+ : undefined,
1846
+ handler: () => this.actionRegistry.execute(action.id),
1847
+ })),
1848
+ ...slashCommands.map(command => ({
1849
+ id: `slash:/${command.name}`,
1850
+ label: `/${command.name}`,
1851
+ description: command.description,
1852
+ })),
1853
+ ];
1854
+ const palette = new CommandPalette(
1855
+ entries,
1856
+ entry => {
1857
+ if (entry.handler) {
1858
+ close();
1859
+ void entry.handler();
1860
+ } else {
1861
+ const command = entry.id.slice("slash:/".length);
1862
+ void this.#dispatchPaletteSlashCommand(command, close);
1863
+ }
1864
+ },
1865
+ close,
1866
+ );
1867
+ overlayHandle = this.ctx.ui.showOverlay(palette, {
1868
+ anchor: "bottom-center",
1869
+ width: "100%",
1870
+ maxHeight: "100%",
1871
+ margin: 0,
1872
+ });
1873
+ this.ctx.ui.setFocus(palette);
1874
+ this.ctx.ui.requestRender();
1264
1875
  return;
1265
1876
  }
1266
- this.ctx.editor.handleInput("/");
1877
+ this.ctx.showCommandPalette(slashCommands, actions, name =>
1878
+ this.#dispatchPaletteSlashCommand(name, () => {
1879
+ this.ctx.ui.setFocus?.(this.ctx.editor);
1880
+ this.ctx.ui.requestRender(true);
1881
+ }),
1882
+ );
1267
1883
  }
1268
1884
 
1269
1885
  cycleThinkingLevel(): void {
@@ -1334,7 +1950,17 @@ export class InputController {
1334
1950
  this.ctx.toolOutputExpanded = expanded;
1335
1951
  for (const child of this.ctx.chatContainer.children) {
1336
1952
  if (isExpandable(child)) {
1337
- child.setExpanded(expanded);
1953
+ // Callable guard: setManuallyExpanded is optional on the exported
1954
+ // contract, and hostile/legacy children may expose it as a
1955
+ // non-function property or an unstable getter. Read once, then
1956
+ // invoke only a real function; everything else falls back to the
1957
+ // automatic path.
1958
+ const setManuallyExpanded = child.setManuallyExpanded;
1959
+ if (typeof setManuallyExpanded === "function") {
1960
+ setManuallyExpanded.call(child, expanded);
1961
+ } else {
1962
+ child.setExpanded(expanded);
1963
+ }
1338
1964
  }
1339
1965
  }
1340
1966
  this.ctx.ui.requestRender();