@bastani/atomic 0.9.21-alpha.1 → 0.9.21

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 (516) hide show
  1. package/CHANGELOG.md +56 -0
  2. package/dist/builtin/intercom/package.json +1 -1
  3. package/dist/builtin/mcp/package.json +1 -1
  4. package/dist/builtin/subagents/CHANGELOG.md +22 -0
  5. package/dist/builtin/subagents/package.json +1 -1
  6. package/dist/builtin/subagents/src/extension/index.bundle.mjs +292 -60
  7. package/dist/builtin/web-access/package.json +1 -1
  8. package/dist/builtin/workflows/CHANGELOG.md +23 -0
  9. package/dist/builtin/workflows/builtin/adversarial-verification.js +3 -3
  10. package/dist/builtin/workflows/builtin/{chunk-cw86srkf.js → chunk-632fxeb8.js} +1 -1
  11. package/dist/builtin/workflows/builtin/{chunk-w18kbz63.js → chunk-94f8zfz1.js} +1 -1
  12. package/dist/builtin/workflows/builtin/{chunk-kspvwc24.js → chunk-9cm2ckq2.js} +1 -1
  13. package/dist/builtin/workflows/builtin/{chunk-jaj27rqc.js → chunk-a1ar035d.js} +1 -1
  14. package/dist/builtin/workflows/builtin/{chunk-wh19f5ee.js → chunk-d3xhj946.js} +5 -4
  15. package/dist/builtin/workflows/builtin/{chunk-crw7q5g1.js → chunk-gyjck9z8.js} +1 -1
  16. package/dist/builtin/workflows/builtin/{chunk-maqv731g.js → chunk-hj8mh07f.js} +10 -6
  17. package/dist/builtin/workflows/builtin/{chunk-0nrgfbag.js → chunk-kb7s3gx2.js} +1 -1
  18. package/dist/builtin/workflows/builtin/{chunk-73c5tayt.js → chunk-kgn5wz1c.js} +19 -1
  19. package/dist/builtin/workflows/builtin/{chunk-2hak3b7g.js → chunk-nkj4qhj6.js} +1 -1
  20. package/dist/builtin/workflows/builtin/{chunk-bzdvx2xr.js → chunk-r97ndfvt.js} +1 -1
  21. package/dist/builtin/workflows/builtin/{chunk-vkmpdat4.js → chunk-wf876n16.js} +1 -1
  22. package/dist/builtin/workflows/builtin/classify-and-act.js +3 -3
  23. package/dist/builtin/workflows/builtin/fan-out-and-synthesize.js +3 -3
  24. package/dist/builtin/workflows/builtin/generate-and-filter.js +3 -3
  25. package/dist/builtin/workflows/builtin/goal.js +4 -4
  26. package/dist/builtin/workflows/builtin/index.js +12 -12
  27. package/dist/builtin/workflows/builtin/loop-until-done.js +3 -3
  28. package/dist/builtin/workflows/builtin/open-claude-design.js +3 -3
  29. package/dist/builtin/workflows/builtin/ralph.js +4 -4
  30. package/dist/builtin/workflows/builtin/steering-context.js +1 -1
  31. package/dist/builtin/workflows/builtin/tournament.js +3 -3
  32. package/dist/builtin/workflows/package.json +1 -1
  33. package/dist/builtin/workflows/src/extension/index.bundle.mjs +40 -11
  34. package/dist/builtin/workflows/src/index.js +9 -3
  35. package/dist/builtin/workflows/src/shared/authoring-contract-stage.d.ts +6 -1
  36. package/dist/cli/auth-command.js +5 -0
  37. package/dist/cli/auth-command.js.map +1 -1
  38. package/dist/cli/credential-print.js +2 -0
  39. package/dist/cli/credential-print.js.map +1 -1
  40. package/dist/cli/experimental/command.js +5 -2
  41. package/dist/cli/experimental/command.js.map +1 -1
  42. package/dist/cli.js +1 -1
  43. package/dist/cli.js.map +1 -1
  44. package/dist/config.d.ts +4 -4
  45. package/dist/config.js +4 -4
  46. package/dist/config.js.map +1 -1
  47. package/dist/core/agent-session-extension-bindings.d.ts.map +1 -1
  48. package/dist/core/agent-session-extension-bindings.js +9 -4
  49. package/dist/core/agent-session-extension-bindings.js.map +1 -1
  50. package/dist/core/agent-session-methods.d.ts +4 -4
  51. package/dist/core/agent-session-methods.d.ts.map +1 -1
  52. package/dist/core/agent-session-methods.js.map +1 -1
  53. package/dist/core/agent-session-prompt.d.ts +4 -4
  54. package/dist/core/agent-session-prompt.d.ts.map +1 -1
  55. package/dist/core/agent-session-prompt.js +38 -15
  56. package/dist/core/agent-session-prompt.js.map +1 -1
  57. package/dist/core/agent-session-runtime.d.ts.map +1 -1
  58. package/dist/core/agent-session-runtime.js +14 -9
  59. package/dist/core/agent-session-runtime.js.map +1 -1
  60. package/dist/core/agent-session-types.d.ts +4 -1
  61. package/dist/core/agent-session-types.d.ts.map +1 -1
  62. package/dist/core/agent-session-types.js.map +1 -1
  63. package/dist/core/agent-session.d.ts +1 -1
  64. package/dist/core/agent-session.d.ts.map +1 -1
  65. package/dist/core/agent-session.js +140 -95
  66. package/dist/core/agent-session.js.map +1 -1
  67. package/dist/core/auth-storage-backends.js +2 -3
  68. package/dist/core/auth-storage-backends.js.map +1 -1
  69. package/dist/core/auth-storage.js +4 -1
  70. package/dist/core/auth-storage.js.map +1 -1
  71. package/dist/core/builtin-resource-loader.js +9 -0
  72. package/dist/core/builtin-resource-loader.js.map +1 -1
  73. package/dist/core/cache-warmer.js +8 -1
  74. package/dist/core/cache-warmer.js.map +1 -1
  75. package/dist/core/compaction/range-planner.js +6 -0
  76. package/dist/core/compaction/range-planner.js.map +1 -1
  77. package/dist/core/execution-model-router.d.ts +13 -3
  78. package/dist/core/execution-model-router.d.ts.map +1 -1
  79. package/dist/core/execution-model-router.js +227 -131
  80. package/dist/core/execution-model-router.js.map +1 -1
  81. package/dist/core/export-html/template-js/entries-navigation.js +16 -6
  82. package/dist/core/export-html/template-js/initialization.js +34 -11
  83. package/dist/core/export-html/template.css +10 -0
  84. package/dist/core/export-html/template.js +50 -17
  85. package/dist/core/extensions/context-types.d.ts +2 -0
  86. package/dist/core/extensions/context-types.d.ts.map +1 -1
  87. package/dist/core/extensions/context-types.js.map +1 -1
  88. package/dist/core/extensions/host-input.js +8 -4
  89. package/dist/core/extensions/host-input.js.map +1 -1
  90. package/dist/core/extensions/reactive-widget.js +1 -0
  91. package/dist/core/extensions/reactive-widget.js.map +1 -1
  92. package/dist/core/extensions/runner-context.d.ts +1 -0
  93. package/dist/core/extensions/runner-context.d.ts.map +1 -1
  94. package/dist/core/extensions/runner-context.js +4 -0
  95. package/dist/core/extensions/runner-context.js.map +1 -1
  96. package/dist/core/extensions/runner.d.ts +1 -0
  97. package/dist/core/extensions/runner.d.ts.map +1 -1
  98. package/dist/core/extensions/runner.js +48 -30
  99. package/dist/core/extensions/runner.js.map +1 -1
  100. package/dist/core/extensions/runtime-types.d.ts +1 -0
  101. package/dist/core/extensions/runtime-types.d.ts.map +1 -1
  102. package/dist/core/extensions/runtime-types.js.map +1 -1
  103. package/dist/core/extensions/workflow-activity-hub.js +9 -7
  104. package/dist/core/extensions/workflow-activity-hub.js.map +1 -1
  105. package/dist/core/footer-data-provider.js +24 -23
  106. package/dist/core/footer-data-provider.js.map +1 -1
  107. package/dist/core/keybindings.js +1 -0
  108. package/dist/core/keybindings.js.map +1 -1
  109. package/dist/core/mandatory-resource-loader.js +4 -1
  110. package/dist/core/mandatory-resource-loader.js.map +1 -1
  111. package/dist/core/model-config.js +2 -0
  112. package/dist/core/model-config.js.map +1 -1
  113. package/dist/core/model-registry.js +1 -0
  114. package/dist/core/model-registry.js.map +1 -1
  115. package/dist/core/model-resolver-defaults.js +1 -1
  116. package/dist/core/model-resolver-defaults.js.map +1 -1
  117. package/dist/core/{model-routing-task.d.ts → model-routing-bytes.d.ts} +1 -4
  118. package/dist/core/model-routing-bytes.d.ts.map +1 -0
  119. package/dist/core/model-routing-bytes.js +33 -0
  120. package/dist/core/model-routing-bytes.js.map +1 -0
  121. package/dist/core/model-routing-candidates.d.ts +42 -0
  122. package/dist/core/model-routing-candidates.d.ts.map +1 -0
  123. package/dist/core/model-routing-candidates.js +309 -0
  124. package/dist/core/model-routing-candidates.js.map +1 -0
  125. package/dist/core/model-routing-constraints.d.ts +4 -0
  126. package/dist/core/model-routing-constraints.d.ts.map +1 -1
  127. package/dist/core/model-routing-constraints.js +13 -1
  128. package/dist/core/model-routing-constraints.js.map +1 -1
  129. package/dist/core/model-routing-debug.d.ts +9 -0
  130. package/dist/core/model-routing-debug.d.ts.map +1 -0
  131. package/dist/core/model-routing-debug.js +14 -0
  132. package/dist/core/model-routing-debug.js.map +1 -0
  133. package/dist/core/model-routing-evals.d.ts +50 -0
  134. package/dist/core/model-routing-evals.d.ts.map +1 -0
  135. package/dist/core/model-routing-evals.js +190 -0
  136. package/dist/core/model-routing-evals.js.map +1 -0
  137. package/dist/core/model-routing-needs.d.ts +75 -0
  138. package/dist/core/model-routing-needs.d.ts.map +1 -0
  139. package/dist/core/model-routing-needs.js +176 -0
  140. package/dist/core/model-routing-needs.js.map +1 -0
  141. package/dist/core/model-runtime-streaming.js +3 -0
  142. package/dist/core/model-runtime-streaming.js.map +1 -1
  143. package/dist/core/model-runtime.js +26 -14
  144. package/dist/core/model-runtime.js.map +1 -1
  145. package/dist/core/models-store.js +2 -3
  146. package/dist/core/models-store.js.map +1 -1
  147. package/dist/core/output-guard.js +1 -0
  148. package/dist/core/output-guard.js.map +1 -1
  149. package/dist/core/package-manager-paths.d.ts +2 -1
  150. package/dist/core/package-manager-paths.d.ts.map +1 -1
  151. package/dist/core/package-manager-paths.js +4 -3
  152. package/dist/core/package-manager-paths.js.map +1 -1
  153. package/dist/core/package-manager.js +1 -0
  154. package/dist/core/package-manager.js.map +1 -1
  155. package/dist/core/resource-loader-assets.d.ts.map +1 -1
  156. package/dist/core/resource-loader-assets.js +9 -7
  157. package/dist/core/resource-loader-assets.js.map +1 -1
  158. package/dist/core/resource-loader-core.js +49 -0
  159. package/dist/core/resource-loader-core.js.map +1 -1
  160. package/dist/core/runtime-credentials.js +2 -1
  161. package/dist/core/runtime-credentials.js.map +1 -1
  162. package/dist/core/session-cwd.js +1 -0
  163. package/dist/core/session-cwd.js.map +1 -1
  164. package/dist/core/session-manager-archive.d.ts.map +1 -1
  165. package/dist/core/session-manager-archive.js +4 -2
  166. package/dist/core/session-manager-archive.js.map +1 -1
  167. package/dist/core/session-manager-core.js +11 -7
  168. package/dist/core/session-manager-core.js.map +1 -1
  169. package/dist/core/session-manager-storage.d.ts +10 -4
  170. package/dist/core/session-manager-storage.d.ts.map +1 -1
  171. package/dist/core/session-manager-storage.js +12 -6
  172. package/dist/core/session-manager-storage.js.map +1 -1
  173. package/dist/core/settings-manager-basic-accessors.d.ts +2 -1
  174. package/dist/core/settings-manager-basic-accessors.d.ts.map +1 -1
  175. package/dist/core/settings-manager-basic-accessors.js +21 -0
  176. package/dist/core/settings-manager-basic-accessors.js.map +1 -1
  177. package/dist/core/settings-manager-core.js +13 -7
  178. package/dist/core/settings-manager-core.js.map +1 -1
  179. package/dist/core/settings-manager.d.ts +1 -1
  180. package/dist/core/settings-manager.d.ts.map +1 -1
  181. package/dist/core/settings-manager.js.map +1 -1
  182. package/dist/core/settings-storage.js +6 -0
  183. package/dist/core/settings-storage.js.map +1 -1
  184. package/dist/core/settings-types.d.ts +8 -0
  185. package/dist/core/settings-types.d.ts.map +1 -1
  186. package/dist/core/settings-types.js.map +1 -1
  187. package/dist/core/structured-output/index.d.ts.map +1 -1
  188. package/dist/core/structured-output/index.js +4 -1
  189. package/dist/core/structured-output/index.js.map +1 -1
  190. package/dist/core/structured-output/invalid-output.js +1 -0
  191. package/dist/core/structured-output/invalid-output.js.map +1 -1
  192. package/dist/core/tasks/agent-adapter.js +5 -3
  193. package/dist/core/tasks/agent-adapter.js.map +1 -1
  194. package/dist/core/tasks/child-command-owner.js +3 -7
  195. package/dist/core/tasks/child-command-owner.js.map +1 -1
  196. package/dist/core/tasks/completion.js +5 -1
  197. package/dist/core/tasks/completion.js.map +1 -1
  198. package/dist/core/tasks/owner-store.js +12 -8
  199. package/dist/core/tasks/owner-store.js.map +1 -1
  200. package/dist/core/tasks/supervisor.js +14 -35
  201. package/dist/core/tasks/supervisor.js.map +1 -1
  202. package/dist/core/tools/ask-user-question/state/build-questionnaire.js +13 -4
  203. package/dist/core/tools/ask-user-question/state/build-questionnaire.js.map +1 -1
  204. package/dist/core/tools/ask-user-question/state/questionnaire-session.js +11 -1
  205. package/dist/core/tools/ask-user-question/state/questionnaire-session.js.map +1 -1
  206. package/dist/core/tools/ask-user-question/view/components/chat-row-view.js +1 -0
  207. package/dist/core/tools/ask-user-question/view/components/chat-row-view.js.map +1 -1
  208. package/dist/core/tools/ask-user-question/view/components/multi-select-view.js +1 -0
  209. package/dist/core/tools/ask-user-question/view/components/multi-select-view.js.map +1 -1
  210. package/dist/core/tools/ask-user-question/view/components/option-list-view.js +1 -0
  211. package/dist/core/tools/ask-user-question/view/components/option-list-view.js.map +1 -1
  212. package/dist/core/tools/ask-user-question/view/components/preview/markdown-content-cache.js +5 -0
  213. package/dist/core/tools/ask-user-question/view/components/preview/markdown-content-cache.js.map +1 -1
  214. package/dist/core/tools/ask-user-question/view/components/preview/preview-block-renderer.js +2 -0
  215. package/dist/core/tools/ask-user-question/view/components/preview/preview-block-renderer.js.map +1 -1
  216. package/dist/core/tools/ask-user-question/view/components/preview/preview-pane.js +13 -8
  217. package/dist/core/tools/ask-user-question/view/components/preview/preview-pane.js.map +1 -1
  218. package/dist/core/tools/ask-user-question/view/components/submit-picker.js +1 -0
  219. package/dist/core/tools/ask-user-question/view/components/submit-picker.js.map +1 -1
  220. package/dist/core/tools/ask-user-question/view/components/tab-bar.js +1 -0
  221. package/dist/core/tools/ask-user-question/view/components/tab-bar.js.map +1 -1
  222. package/dist/core/tools/ask-user-question/view/components/wrapping-select.js +30 -24
  223. package/dist/core/tools/ask-user-question/view/components/wrapping-select.js.map +1 -1
  224. package/dist/core/tools/ask-user-question/view/dialog-builder.js +5 -0
  225. package/dist/core/tools/ask-user-question/view/dialog-builder.js.map +1 -1
  226. package/dist/core/tools/ask-user-question/view/props-adapter.js +8 -0
  227. package/dist/core/tools/ask-user-question/view/props-adapter.js.map +1 -1
  228. package/dist/core/tools/ask-user-question/view/tab-content-strategy.js +4 -4
  229. package/dist/core/tools/ask-user-question/view/tab-content-strategy.js.map +1 -1
  230. package/dist/core/tools/bash.js +5 -8
  231. package/dist/core/tools/bash.js.map +1 -1
  232. package/dist/core/tools/edit-batch.js +4 -0
  233. package/dist/core/tools/edit-batch.js.map +1 -1
  234. package/dist/core/tools/edit.js +2 -0
  235. package/dist/core/tools/edit.js.map +1 -1
  236. package/dist/core/tools/file-mutation-coordinator.js +9 -0
  237. package/dist/core/tools/file-mutation-coordinator.js.map +1 -1
  238. package/dist/core/tools/find.js +1 -1
  239. package/dist/core/tools/find.js.map +1 -1
  240. package/dist/core/tools/hashline-engine/fs.js +1 -1
  241. package/dist/core/tools/hashline-engine/fs.js.map +1 -1
  242. package/dist/core/tools/hashline-engine/input.js +4 -0
  243. package/dist/core/tools/hashline-engine/input.js.map +1 -1
  244. package/dist/core/tools/hashline-engine/mismatch.js +6 -0
  245. package/dist/core/tools/hashline-engine/mismatch.js.map +1 -1
  246. package/dist/core/tools/hashline-engine/patcher.js +13 -0
  247. package/dist/core/tools/hashline-engine/patcher.js.map +1 -1
  248. package/dist/core/tools/hashline-engine/recovery.js +1 -0
  249. package/dist/core/tools/hashline-engine/recovery.js.map +1 -1
  250. package/dist/core/tools/output-accumulator.js +20 -13
  251. package/dist/core/tools/output-accumulator.js.map +1 -1
  252. package/dist/core/tools/persisted-output-file.js +9 -3
  253. package/dist/core/tools/persisted-output-file.js.map +1 -1
  254. package/dist/core/tools/resource-selectors.js +1 -0
  255. package/dist/core/tools/resource-selectors.js.map +1 -1
  256. package/dist/core/tools/write.js +1 -0
  257. package/dist/core/tools/write.js.map +1 -1
  258. package/dist/core/trust-manager.js +1 -0
  259. package/dist/core/trust-manager.js.map +1 -1
  260. package/dist/core/workflow-stage-admission.js +17 -10
  261. package/dist/core/workflow-stage-admission.js.map +1 -1
  262. package/dist/extensions/llama/client.js +2 -0
  263. package/dist/extensions/llama/client.js.map +1 -1
  264. package/dist/extensions/llama/huggingface-ui.js +17 -9
  265. package/dist/extensions/llama/huggingface-ui.js.map +1 -1
  266. package/dist/extensions/llama/huggingface.js +2 -0
  267. package/dist/extensions/llama/huggingface.js.map +1 -1
  268. package/dist/extensions/llama/ui.js +11 -3
  269. package/dist/extensions/llama/ui.js.map +1 -1
  270. package/dist/index.d.ts +4 -2
  271. package/dist/index.d.ts.map +1 -1
  272. package/dist/index.js +3 -1
  273. package/dist/index.js.map +1 -1
  274. package/dist/modes/interactive/components/armin.js +10 -6
  275. package/dist/modes/interactive/components/armin.js.map +1 -1
  276. package/dist/modes/interactive/components/assistant-message.js +10 -2
  277. package/dist/modes/interactive/components/assistant-message.js.map +1 -1
  278. package/dist/modes/interactive/components/atomic-working-status.js +10 -2
  279. package/dist/modes/interactive/components/atomic-working-status.js.map +1 -1
  280. package/dist/modes/interactive/components/bash-execution.js +9 -4
  281. package/dist/modes/interactive/components/bash-execution.js.map +1 -1
  282. package/dist/modes/interactive/components/bordered-loader.js +3 -0
  283. package/dist/modes/interactive/components/bordered-loader.js.map +1 -1
  284. package/dist/modes/interactive/components/branch-summary-message.js +4 -1
  285. package/dist/modes/interactive/components/branch-summary-message.js.map +1 -1
  286. package/dist/modes/interactive/components/chat-message-renderer.js +2 -1
  287. package/dist/modes/interactive/components/chat-message-renderer.js.map +1 -1
  288. package/dist/modes/interactive/components/chat-session-host-state.js +63 -31
  289. package/dist/modes/interactive/components/chat-session-host-state.js.map +1 -1
  290. package/dist/modes/interactive/components/chat-session-host.js +8 -1
  291. package/dist/modes/interactive/components/chat-session-host.js.map +1 -1
  292. package/dist/modes/interactive/components/chat-transcript.js +24 -14
  293. package/dist/modes/interactive/components/chat-transcript.js.map +1 -1
  294. package/dist/modes/interactive/components/compaction-boundary-message.js +2 -1
  295. package/dist/modes/interactive/components/compaction-boundary-message.js.map +1 -1
  296. package/dist/modes/interactive/components/config-selector-list.js +15 -6
  297. package/dist/modes/interactive/components/config-selector-list.js.map +1 -1
  298. package/dist/modes/interactive/components/config-selector.js +7 -1
  299. package/dist/modes/interactive/components/config-selector.js.map +1 -1
  300. package/dist/modes/interactive/components/countdown-timer.js +2 -0
  301. package/dist/modes/interactive/components/countdown-timer.js.map +1 -1
  302. package/dist/modes/interactive/components/custom-editor.js +21 -1
  303. package/dist/modes/interactive/components/custom-editor.js.map +1 -1
  304. package/dist/modes/interactive/components/custom-entry.js +4 -1
  305. package/dist/modes/interactive/components/custom-entry.js.map +1 -1
  306. package/dist/modes/interactive/components/custom-message.js +9 -1
  307. package/dist/modes/interactive/components/custom-message.js.map +1 -1
  308. package/dist/modes/interactive/components/daxnuts.js +8 -6
  309. package/dist/modes/interactive/components/daxnuts.js.map +1 -1
  310. package/dist/modes/interactive/components/dynamic-border.js +1 -0
  311. package/dist/modes/interactive/components/dynamic-border.js.map +1 -1
  312. package/dist/modes/interactive/components/extension-editor.js +7 -1
  313. package/dist/modes/interactive/components/extension-editor.js.map +1 -1
  314. package/dist/modes/interactive/components/extension-input.js +8 -2
  315. package/dist/modes/interactive/components/extension-input.js.map +1 -1
  316. package/dist/modes/interactive/components/extension-selector.js +9 -1
  317. package/dist/modes/interactive/components/extension-selector.js.map +1 -1
  318. package/dist/modes/interactive/components/first-time-setup.js +4 -2
  319. package/dist/modes/interactive/components/first-time-setup.js.map +1 -1
  320. package/dist/modes/interactive/components/footer.js +5 -2
  321. package/dist/modes/interactive/components/footer.js.map +1 -1
  322. package/dist/modes/interactive/components/host-input-form.js +13 -2
  323. package/dist/modes/interactive/components/host-input-form.js.map +1 -1
  324. package/dist/modes/interactive/components/login-dialog.js +9 -3
  325. package/dist/modes/interactive/components/login-dialog.js.map +1 -1
  326. package/dist/modes/interactive/components/model-selector.js +24 -12
  327. package/dist/modes/interactive/components/model-selector.js.map +1 -1
  328. package/dist/modes/interactive/components/oauth-selector.js +12 -3
  329. package/dist/modes/interactive/components/oauth-selector.js.map +1 -1
  330. package/dist/modes/interactive/components/reserved-bottom-overlay.js +11 -2
  331. package/dist/modes/interactive/components/reserved-bottom-overlay.js.map +1 -1
  332. package/dist/modes/interactive/components/scoped-models-selector.js +13 -8
  333. package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -1
  334. package/dist/modes/interactive/components/scroll-widget.js +4 -0
  335. package/dist/modes/interactive/components/scroll-widget.js.map +1 -1
  336. package/dist/modes/interactive/components/session-selector-header.js +11 -7
  337. package/dist/modes/interactive/components/session-selector-header.js.map +1 -1
  338. package/dist/modes/interactive/components/session-selector-list.js +25 -12
  339. package/dist/modes/interactive/components/session-selector-list.js.map +1 -1
  340. package/dist/modes/interactive/components/session-selector.js +23 -15
  341. package/dist/modes/interactive/components/session-selector.js.map +1 -1
  342. package/dist/modes/interactive/components/settings-selector-submenus.js +19 -1
  343. package/dist/modes/interactive/components/settings-selector-submenus.js.map +1 -1
  344. package/dist/modes/interactive/components/settings-selector.js +1 -0
  345. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  346. package/dist/modes/interactive/components/show-images-selector.js +1 -0
  347. package/dist/modes/interactive/components/show-images-selector.js.map +1 -1
  348. package/dist/modes/interactive/components/skill-invocation-message.js +4 -1
  349. package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
  350. package/dist/modes/interactive/components/startup-identity.js +8 -3
  351. package/dist/modes/interactive/components/startup-identity.js.map +1 -1
  352. package/dist/modes/interactive/components/task-completion-message.js +2 -0
  353. package/dist/modes/interactive/components/task-completion-message.js.map +1 -1
  354. package/dist/modes/interactive/components/task-detail.js +2 -0
  355. package/dist/modes/interactive/components/task-detail.js.map +1 -1
  356. package/dist/modes/interactive/components/task-inspector.js +22 -12
  357. package/dist/modes/interactive/components/task-inspector.js.map +1 -1
  358. package/dist/modes/interactive/components/task-list.js +2 -0
  359. package/dist/modes/interactive/components/task-list.js.map +1 -1
  360. package/dist/modes/interactive/components/task-live-transcript.js +8 -3
  361. package/dist/modes/interactive/components/task-live-transcript.js.map +1 -1
  362. package/dist/modes/interactive/components/task-navigation.js +5 -2
  363. package/dist/modes/interactive/components/task-navigation.js.map +1 -1
  364. package/dist/modes/interactive/components/task-row.js +2 -0
  365. package/dist/modes/interactive/components/task-row.js.map +1 -1
  366. package/dist/modes/interactive/components/theme-selector.js +2 -0
  367. package/dist/modes/interactive/components/theme-selector.js.map +1 -1
  368. package/dist/modes/interactive/components/thinking-selector.js +7 -1
  369. package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
  370. package/dist/modes/interactive/components/tool-execution.js +25 -10
  371. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  372. package/dist/modes/interactive/components/transcript-follow-indicator.js +1 -0
  373. package/dist/modes/interactive/components/transcript-follow-indicator.js.map +1 -1
  374. package/dist/modes/interactive/components/tree-selector-component.js +7 -3
  375. package/dist/modes/interactive/components/tree-selector-component.js.map +1 -1
  376. package/dist/modes/interactive/components/tree-selector-help.js +1 -0
  377. package/dist/modes/interactive/components/tree-selector-help.js.map +1 -1
  378. package/dist/modes/interactive/components/tree-selector-label-input.js +6 -2
  379. package/dist/modes/interactive/components/tree-selector-label-input.js.map +1 -1
  380. package/dist/modes/interactive/components/tree-selector-list.js +4 -0
  381. package/dist/modes/interactive/components/tree-selector-list.js.map +1 -1
  382. package/dist/modes/interactive/components/trust-selector.js +6 -0
  383. package/dist/modes/interactive/components/trust-selector.js.map +1 -1
  384. package/dist/modes/interactive/components/user-message-selector.js +6 -3
  385. package/dist/modes/interactive/components/user-message-selector.js.map +1 -1
  386. package/dist/modes/interactive/components/user-message.js +5 -0
  387. package/dist/modes/interactive/components/user-message.js.map +1 -1
  388. package/dist/modes/interactive/components/working-status.js +1 -0
  389. package/dist/modes/interactive/components/working-status.js.map +1 -1
  390. package/dist/modes/interactive/interactive-autocomplete.js +2 -0
  391. package/dist/modes/interactive/interactive-autocomplete.js.map +1 -1
  392. package/dist/modes/interactive/interactive-extension-runtime.js +1 -0
  393. package/dist/modes/interactive/interactive-extension-runtime.js.map +1 -1
  394. package/dist/modes/interactive/interactive-mode-base.js +162 -120
  395. package/dist/modes/interactive/interactive-mode-base.js.map +1 -1
  396. package/dist/modes/interactive/interactive-mode-helpers.js +3 -0
  397. package/dist/modes/interactive/interactive-mode-helpers.js.map +1 -1
  398. package/dist/modes/interactive/interactive-mode-surface.d.ts +0 -6
  399. package/dist/modes/interactive/interactive-mode-surface.d.ts.map +1 -1
  400. package/dist/modes/interactive/interactive-mode-surface.js.map +1 -1
  401. package/dist/modes/interactive/interactive-resource-disclosure.js +0 -4
  402. package/dist/modes/interactive/interactive-resource-disclosure.js.map +1 -1
  403. package/dist/modes/interactive/interactive-resource-rendering.js +0 -12
  404. package/dist/modes/interactive/interactive-resource-rendering.js.map +1 -1
  405. package/dist/modes/interactive/interactive-startup-chat-container.js +1 -4
  406. package/dist/modes/interactive/interactive-startup-chat-container.js.map +1 -1
  407. package/dist/modes/interactive/model-catalog-refresh.js +1 -3
  408. package/dist/modes/interactive/model-catalog-refresh.js.map +1 -1
  409. package/dist/modes/interactive/theme/color-utils.d.ts +5 -0
  410. package/dist/modes/interactive/theme/color-utils.d.ts.map +1 -1
  411. package/dist/modes/interactive/theme/color-utils.js +11 -0
  412. package/dist/modes/interactive/theme/color-utils.js.map +1 -1
  413. package/dist/modes/interactive/theme/global-theme.d.ts.map +1 -1
  414. package/dist/modes/interactive/theme/global-theme.js +4 -3
  415. package/dist/modes/interactive/theme/global-theme.js.map +1 -1
  416. package/dist/modes/interactive/theme/theme-class.js +7 -0
  417. package/dist/modes/interactive/theme/theme-class.js.map +1 -1
  418. package/dist/modes/interactive/theme/theme-controller.js +9 -2
  419. package/dist/modes/interactive/theme/theme-controller.js.map +1 -1
  420. package/dist/modes/interactive-engine/activity-watchdog.js +8 -3
  421. package/dist/modes/interactive-engine/activity-watchdog.js.map +1 -1
  422. package/dist/modes/interactive-engine/engine-custom-ui.js +12 -8
  423. package/dist/modes/interactive-engine/engine-custom-ui.js.map +1 -1
  424. package/dist/modes/interactive-engine/engine-dialog-host.js +7 -3
  425. package/dist/modes/interactive-engine/engine-dialog-host.js.map +1 -1
  426. package/dist/modes/interactive-engine/engine-health.js +23 -13
  427. package/dist/modes/interactive-engine/engine-health.js.map +1 -1
  428. package/dist/modes/interactive-engine/engine-input-form.js +3 -2
  429. package/dist/modes/interactive-engine/engine-input-form.js.map +1 -1
  430. package/dist/modes/interactive-engine/engine-monitor.js +13 -1
  431. package/dist/modes/interactive-engine/engine-monitor.js.map +1 -1
  432. package/dist/modes/interactive-engine/engine-project-trust.js +2 -1
  433. package/dist/modes/interactive-engine/engine-project-trust.js.map +1 -1
  434. package/dist/modes/interactive-engine/engine-render-service.js +7 -4
  435. package/dist/modes/interactive-engine/engine-render-service.js.map +1 -1
  436. package/dist/modes/interactive-engine/engine-session-picker.js +3 -2
  437. package/dist/modes/interactive-engine/engine-session-picker.js.map +1 -1
  438. package/dist/modes/interactive-engine/input-form-host.js +5 -1
  439. package/dist/modes/interactive-engine/input-form-host.js.map +1 -1
  440. package/dist/modes/interactive-engine/isolated-runtime.js +37 -23
  441. package/dist/modes/interactive-engine/isolated-runtime.js.map +1 -1
  442. package/dist/modes/interactive-engine/remote-command-catalog.js +4 -3
  443. package/dist/modes/interactive-engine/remote-command-catalog.js.map +1 -1
  444. package/dist/modes/interactive-engine/remote-component.js +24 -12
  445. package/dist/modes/interactive-engine/remote-component.js.map +1 -1
  446. package/dist/modes/interactive-engine/remote-frame-clamp.js +3 -3
  447. package/dist/modes/interactive-engine/remote-frame-clamp.js.map +1 -1
  448. package/dist/modes/interactive-engine/remote-model-catalog.js +5 -4
  449. package/dist/modes/interactive-engine/remote-model-catalog.js.map +1 -1
  450. package/dist/modes/interactive-engine/remote-queue-pause.js +3 -1
  451. package/dist/modes/interactive-engine/remote-queue-pause.js.map +1 -1
  452. package/dist/modes/interactive-engine/remote-renderer.js +24 -13
  453. package/dist/modes/interactive-engine/remote-renderer.js.map +1 -1
  454. package/dist/modes/interactive-engine/resource-readiness-error.js +1 -0
  455. package/dist/modes/interactive-engine/resource-readiness-error.js.map +1 -1
  456. package/dist/modes/interactive-engine/session-picker-host.js +5 -1
  457. package/dist/modes/interactive-engine/session-picker-host.js.map +1 -1
  458. package/dist/modes/interactive-engine/terminal-mode-controller.js +2 -1
  459. package/dist/modes/interactive-engine/terminal-mode-controller.js.map +1 -1
  460. package/dist/modes/rpc/queued-writer.js +13 -4
  461. package/dist/modes/rpc/queued-writer.js.map +1 -1
  462. package/dist/modes/rpc/rpc-bash-request-owners.js +2 -1
  463. package/dist/modes/rpc/rpc-bash-request-owners.js.map +1 -1
  464. package/dist/modes/rpc/rpc-client-api.d.ts +8 -4
  465. package/dist/modes/rpc/rpc-client-api.d.ts.map +1 -1
  466. package/dist/modes/rpc/rpc-client-api.js +10 -3
  467. package/dist/modes/rpc/rpc-client-api.js.map +1 -1
  468. package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  469. package/dist/modes/rpc/rpc-client.js +35 -22
  470. package/dist/modes/rpc/rpc-client.js.map +1 -1
  471. package/dist/modes/rpc/rpc-command-handler.js +6 -6
  472. package/dist/modes/rpc/rpc-command-handler.js.map +1 -1
  473. package/dist/modes/rpc/rpc-event-buffer.js +3 -1
  474. package/dist/modes/rpc/rpc-event-buffer.js.map +1 -1
  475. package/dist/modes/rpc/rpc-generation-buffer.js +1 -3
  476. package/dist/modes/rpc/rpc-generation-buffer.js.map +1 -1
  477. package/dist/modes/rpc/rpc-keybindings-reload.js +4 -1
  478. package/dist/modes/rpc/rpc-keybindings-reload.js.map +1 -1
  479. package/dist/modes/rpc/rpc-output-buffer.js +3 -4
  480. package/dist/modes/rpc/rpc-output-buffer.js.map +1 -1
  481. package/dist/modes/rpc/rpc-pending-requests.js +1 -3
  482. package/dist/modes/rpc/rpc-pending-requests.js.map +1 -1
  483. package/dist/modes/rpc/rpc-provider-auth.js +3 -1
  484. package/dist/modes/rpc/rpc-provider-auth.js.map +1 -1
  485. package/dist/modes/rpc/rpc-resource-readiness.js +4 -5
  486. package/dist/modes/rpc/rpc-resource-readiness.js.map +1 -1
  487. package/dist/modes/rpc/rpc-session-binding.js +15 -0
  488. package/dist/modes/rpc/rpc-session-binding.js.map +1 -1
  489. package/dist/modes/rpc/rpc-terminal-drain.js +3 -0
  490. package/dist/modes/rpc/rpc-terminal-drain.js.map +1 -1
  491. package/dist/modes/rpc/rpc-types.d.ts +10 -1
  492. package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  493. package/dist/modes/rpc/rpc-types.js.map +1 -1
  494. package/docs/models/evals.md +883 -39
  495. package/docs/models/model-selection.md +7 -8
  496. package/docs/rpc/examples.md +1 -1
  497. package/docs/rpc/protocol.md +9 -3
  498. package/docs/sdk/structured-decisions.md +1 -1
  499. package/docs/sdk.md +3 -3
  500. package/docs/settings.md +24 -3
  501. package/docs/subagents/reference.md +22 -4
  502. package/docs/subagents.md +2 -0
  503. package/docs/usage.md +3 -3
  504. package/docs/workflows/api-reference.md +1 -1
  505. package/docs/workflows/authoring.md +1 -7
  506. package/docs/workflows/builtins.md +1 -1
  507. package/docs/workflows/reliable-design.md +1 -1
  508. package/examples/extensions/custom-provider-gitlab-duo/test.ts +5 -5
  509. package/examples/extensions/gondolin/package.json +1 -1
  510. package/examples/rpc-client.ts +1 -1
  511. package/examples/rpc-extension-ui.ts +1 -1
  512. package/npm-shrinkwrap.json +70 -33
  513. package/package.json +6 -7
  514. package/dist/core/model-routing-task.d.ts.map +0 -1
  515. package/dist/core/model-routing-task.js +0 -120
  516. package/dist/core/model-routing-task.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"interactive-extension-runtime.js","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-extension-runtime.ts"],"names":[],"mappings":"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","sourcesContent":["import { copyScopedModels } from \"../../core/extensions/runner-context.ts\";\nimport { ModelRegistry } from \"../../core/model-registry.ts\";\nimport { AtomicWorkingLoader } from \"./components/atomic-working-status.ts\";\nimport { mountIdleStatus } from \"./components/idle-status.ts\";\nimport { ScrollWidget } from \"./components/scroll-widget.js\";\nimport { InteractiveModeBase } from \"./interactive-mode-base.ts\";\nimport {\n\tAssistantMessageComponent,\n\ttype Component,\n\tContainer,\n\ttype ExtensionContext,\n\ttype ExtensionRunner,\n\ttype ExtensionWidgetOptions,\n\ttype KeyId,\n\tkeyText,\n\ttype LoaderIndicatorOptions,\n\tmatchesKey,\n\tText,\n\ttype Theme,\n\ttype TUI,\n\ttheme,\n} from \"./interactive-mode-deps.ts\";\n\nInteractiveModeBase.prototype.setupExtensionShortcuts = function (\n\tthis: InteractiveModeBase,\n\textensionRunner: ExtensionRunner,\n): void {\n\tconst shortcuts = extensionRunner.getShortcuts(this.keybindings.getEffectiveConfig());\n\tif (shortcuts.size === 0) return;\n\n\t// Create a context for shortcut handlers\n\tconst createContext = (): ExtensionContext => ({\n\t\tobserveWorkflowActivity: (observer) => extensionRunner.createContext().observeWorkflowActivity(observer),\n\t\tui: extensionRunner.getUIContext(),\n\t\tmode: \"tui\",\n\t\thasUI: true,\n\t\tget hasHumanInput() {\n\t\t\treturn extensionRunner.createContext().hasHumanInput;\n\t\t},\n\t\tcwd: this.sessionManager.getCwd(),\n\t\tsessionManager: this.sessionManager,\n\t\tmodelRegistry: new ModelRegistry(this.session.modelRuntime),\n\t\tmodel: this.session.model,\n\t\t// Copied through the same helper `createExtensionContext` uses: this\n\t\t// hand-built context reaches the same shortcut handlers, so it owes them\n\t\t// the same guarantee, entries included.\n\t\tscopedModels: copyScopedModels(this.session.scopedModels),\n\t\tisIdle: () => !this.session.isStreaming,\n\t\tisProjectTrusted: () => this.session.settingsManager.isProjectTrusted(),\n\t\tsignal: this.session.agent.signal,\n\t\tabort: () => this.session.abort(),\n\t\thasPendingMessages: () => this.session.pendingMessageCount > 0,\n\t\tshutdown: () => {\n\t\t\tthis.shutdownRequested = true;\n\t\t},\n\t\tgetContextUsage: () => this.session.getContextUsage(),\n\t\tcompact: (options) => {\n\t\t\tvoid (async () => {\n\t\t\t\ttry {\n\t\t\t\t\tconst result = await this.session.compact();\n\t\t\t\t\toptions?.onComplete?.(result);\n\t\t\t\t} catch (error) {\n\t\t\t\t\tconst err = error instanceof Error ? error : new Error(String(error));\n\t\t\t\t\toptions?.onError?.(err);\n\t\t\t\t}\n\t\t\t})();\n\t\t},\n\t\tgetSystemPrompt: () => this.session.systemPrompt,\n\t\tgetRouterModel: () => this.session.settingsManager.getRouterModel(),\n\t});\n\n\t// Set up the extension shortcut handler on the default editor\n\tthis.defaultEditor.onExtensionShortcut = (data: string) => {\n\t\tfor (const [shortcutStr, shortcut] of shortcuts) {\n\t\t\t// Cast to KeyId - extension shortcuts use the same format\n\t\t\tif (matchesKey(data, shortcutStr as KeyId) && !shortcut.editorKeys?.some((key) => matchesKey(data, key))) {\n\t\t\t\t// Run handler async, don't block input\n\t\t\t\tPromise.resolve(shortcut.handler(createContext())).catch((err) => {\n\t\t\t\t\tthis.showError(`Shortcut handler error: ${err instanceof Error ? err.message : String(err)}`);\n\t\t\t\t});\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t};\n};\n\nInteractiveModeBase.prototype.setExtensionStatus = function (\n\tthis: InteractiveModeBase,\n\tkey: string,\n\ttext: string | undefined,\n): void {\n\tthis.footerDataProvider.setExtensionStatus(key, text);\n\tthis.ui.requestRender();\n};\n\nInteractiveModeBase.prototype.getWorkingLoaderMessage = function (this: InteractiveModeBase): string {\n\treturn this.workingMessage ?? this.defaultWorkingMessage;\n};\n\nInteractiveModeBase.prototype.createWorkingLoader = function (this: InteractiveModeBase): AtomicWorkingLoader {\n\treturn new AtomicWorkingLoader(\n\t\tthis.ui,\n\t\tundefined,\n\t\t(text) => theme.fg(\"muted\", text),\n\t\tthis.getWorkingLoaderMessage(),\n\t\tthis.workingIndicatorOptions,\n\t);\n};\n\nInteractiveModeBase.prototype.clearWorkingLoader = function (this: InteractiveModeBase): void {\n\tthis.loadingAnimation?.stop();\n\tthis.loadingAnimation = undefined;\n\tthis.workingIndicatorEmbedded = false;\n\tthis.setEditorWorkingStatusIndicator?.(undefined);\n\tthis.statusContainer.clear();\n};\n\nInteractiveModeBase.prototype.stopWorkingLoader = function (this: InteractiveModeBase): void {\n\tconst hadLoader = this.loadingAnimation !== undefined;\n\tconst wasEmbedded = this.workingIndicatorEmbedded;\n\tInteractiveModeBase.prototype.clearWorkingLoader.call(this);\n\tif (hadLoader && !wasEmbedded) mountIdleStatus(this.statusContainer, this.settingsManager.getClearOnShrink());\n};\n\nInteractiveModeBase.prototype.showWorkingLoaderNow = function (this: InteractiveModeBase): void {\n\t// Mount the working spinner immediately, regardless of streaming state, so\n\t// there is no visible gap between submitting a prompt and the agent turn\n\t// actually starting. Prompt preflight (extension input hooks, template/skill\n\t// expansion, auth and compaction checks, deferred startup) runs before the\n\t// agent emits `agent_start`, which is otherwise the only place the loader is\n\t// created. Respect `workingVisible` so extensions can still suppress it.\n\tif (!this.workingVisible || this.loadingAnimation) {\n\t\tthis.ui.requestRender();\n\t\treturn;\n\t}\n\tthis.statusContainer.clear();\n\tconst loader = this.createWorkingLoader();\n\tthis.loadingAnimation = loader;\n\tthis.workingIndicatorEmbedded = this.setEditorWorkingStatusIndicator?.(loader) ?? false;\n\tif (!this.workingIndicatorEmbedded) this.statusContainer.addChild(loader);\n\tthis.ui.requestRender();\n};\n\nInteractiveModeBase.prototype.setWorkingVisible = function (this: InteractiveModeBase, visible: boolean): void {\n\tthis.workingVisible = visible;\n\tif (!visible) {\n\t\tthis.stopWorkingLoader();\n\t\tthis.ui.requestRender();\n\t\treturn;\n\t}\n\tif (this.session.isStreaming && !this.loadingAnimation) {\n\t\tthis.statusContainer.clear();\n\t\tconst loader = this.createWorkingLoader();\n\t\tthis.loadingAnimation = loader;\n\t\tthis.workingIndicatorEmbedded = this.setEditorWorkingStatusIndicator?.(loader) ?? false;\n\t\tif (!this.workingIndicatorEmbedded) this.statusContainer.addChild(loader);\n\t}\n\tthis.ui.requestRender();\n};\n\nInteractiveModeBase.prototype.setWorkingIndicator = function (\n\tthis: InteractiveModeBase,\n\toptions?: LoaderIndicatorOptions,\n): void {\n\tthis.workingIndicatorOptions = options;\n\tthis.loadingAnimation?.setIndicator(options);\n\tthis.ui.requestRender();\n};\n\nInteractiveModeBase.prototype.setHiddenThinkingLabel = function (this: InteractiveModeBase, label?: string): void {\n\tthis.hiddenThinkingLabel = label ?? this.defaultHiddenThinkingLabel;\n\tfor (const child of this.chatContainer.children) {\n\t\tif (child instanceof AssistantMessageComponent) {\n\t\t\tchild.setHiddenThinkingLabel(this.hiddenThinkingLabel);\n\t\t}\n\t}\n\tif (this.streamingComponent) {\n\t\tthis.streamingComponent.setHiddenThinkingLabel(this.hiddenThinkingLabel);\n\t}\n\tthis.ui.requestRender();\n};\n\nInteractiveModeBase.prototype.setExtensionWidget = function (\n\tthis: InteractiveModeBase,\n\tkey: string,\n\tcontent: string[] | ((tui: TUI, thm: Theme) => Component & { dispose?(): void }) | undefined,\n\toptions?: ExtensionWidgetOptions,\n): void {\n\tconst placement = options?.placement ?? \"aboveEditor\";\n\tconst removeExisting = (map: Map<string, Component & { dispose?(): void }>) => {\n\t\tconst existing = map.get(key);\n\t\tif (existing?.dispose) existing.dispose();\n\t\tmap.delete(key);\n\t};\n\n\tremoveExisting(this.extensionWidgetsAbove);\n\tremoveExisting(this.extensionWidgetsBelow);\n\n\tif (content === undefined) {\n\t\tthis.renderWidgets();\n\t\tthis.notifyExtensionWidgetRelease(key);\n\t\treturn;\n\t}\n\n\tlet component: Component & { dispose?(): void };\n\n\tif (Array.isArray(content)) {\n\t\t// Wrap string array in a Container with Text components\n\t\tconst container = new Container();\n\t\tfor (const line of options?.scroll ? content : content.slice(0, InteractiveModeBase.MAX_WIDGET_LINES)) {\n\t\t\tcontainer.addChild(new Text(line, 1, 0));\n\t\t}\n\t\tif (!options?.scroll && content.length > InteractiveModeBase.MAX_WIDGET_LINES) {\n\t\t\tcontainer.addChild(new Text(theme.fg(\"muted\", \"... (widget truncated)\"), 1, 0));\n\t\t}\n\t\tcomponent = container;\n\t} else {\n\t\t// Factory function - create component\n\t\tcomponent = content(this.ui, theme);\n\t}\n\tif (options?.scroll) {\n\t\tconst { maxHeight, maxHeightFraction } = options.scroll;\n\t\tcomponent = new ScrollWidget(component, maxHeight, () =>\n\t\t\tmaxHeightFraction === undefined\n\t\t\t\t? maxHeight\n\t\t\t\t: Math.min(maxHeight, Math.max(1, Math.floor(this.ui.terminal.rows * maxHeightFraction))),\n\t\t);\n\t}\n\n\tconst targetMap = placement === \"belowEditor\" ? this.extensionWidgetsBelow : this.extensionWidgetsAbove;\n\ttargetMap.set(key, component);\n\tthis.renderWidgets();\n};\n\nInteractiveModeBase.prototype.clearExtensionWidgets = function (this: InteractiveModeBase): void {\n\tconst releasedKeys = new Set<string>();\n\tfor (const [key, widget] of this.extensionWidgetsAbove) {\n\t\twidget.dispose?.();\n\t\treleasedKeys.add(key);\n\t}\n\tfor (const [key, widget] of this.extensionWidgetsBelow) {\n\t\twidget.dispose?.();\n\t\treleasedKeys.add(key);\n\t}\n\tthis.extensionWidgetsAbove.clear();\n\tthis.extensionWidgetsBelow.clear();\n\tthis.renderWidgets();\n\tfor (const key of releasedKeys) this.notifyExtensionWidgetRelease(key);\n};\n\nInteractiveModeBase.prototype.resetExtensionUI = function (this: InteractiveModeBase): void {\n\tif (this.extensionSelector) {\n\t\tthis.hideExtensionSelector();\n\t}\n\tif (this.extensionInput) {\n\t\tthis.hideExtensionInput();\n\t}\n\tif (this.extensionEditor) {\n\t\tthis.hideExtensionEditor();\n\t}\n\tthis.ui.hideOverlay();\n\tthis.clearExtensionTerminalInputListeners();\n\tthis.setExtensionFooter(undefined);\n\tthis.setExtensionHeader(undefined);\n\tthis.clearExtensionWidgets();\n\tthis.footerDataProvider.clearExtensionStatuses();\n\tthis.footer.invalidate();\n\tthis.autocompleteProviderWrappers = [];\n\tthis.setCustomEditorComponent(undefined);\n\tthis.setupAutocompleteProvider();\n\tthis.defaultEditor.onExtensionShortcut = this.interactiveEngineShortcutHandler;\n\tthis.updateTerminalTitle();\n\tthis.workingMessage = undefined;\n\tthis.workingVisible = true;\n\tthis.setWorkingIndicator();\n\tif (this.loadingAnimation) {\n\t\tthis.loadingAnimation.setMessage(`${this.defaultWorkingMessage} (${keyText(\"app.interrupt\")} Interrupt)`);\n\t}\n\tthis.setHiddenThinkingLabel();\n};\n"]}
1
+ {"version":3,"file":"interactive-extension-runtime.js","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-extension-runtime.ts"],"names":[],"mappings":"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","sourcesContent":["import { copyScopedModels } from \"../../core/extensions/runner-context.ts\";\nimport { ModelRegistry } from \"../../core/model-registry.ts\";\nimport { AtomicWorkingLoader } from \"./components/atomic-working-status.ts\";\nimport { mountIdleStatus } from \"./components/idle-status.ts\";\nimport { ScrollWidget } from \"./components/scroll-widget.js\";\nimport { InteractiveModeBase } from \"./interactive-mode-base.ts\";\nimport {\n\tAssistantMessageComponent,\n\ttype Component,\n\tContainer,\n\ttype ExtensionContext,\n\ttype ExtensionRunner,\n\ttype ExtensionWidgetOptions,\n\ttype KeyId,\n\tkeyText,\n\ttype LoaderIndicatorOptions,\n\tmatchesKey,\n\tText,\n\ttype Theme,\n\ttype TUI,\n\ttheme,\n} from \"./interactive-mode-deps.ts\";\n\nInteractiveModeBase.prototype.setupExtensionShortcuts = function (\n\tthis: InteractiveModeBase,\n\textensionRunner: ExtensionRunner,\n): void {\n\tconst shortcuts = extensionRunner.getShortcuts(this.keybindings.getEffectiveConfig());\n\tif (shortcuts.size === 0) return;\n\n\t// Create a context for shortcut handlers\n\tconst createContext = (): ExtensionContext => ({\n\t\tobserveWorkflowActivity: (observer) => extensionRunner.createContext().observeWorkflowActivity(observer),\n\t\tui: extensionRunner.getUIContext(),\n\t\tmode: \"tui\",\n\t\thasUI: true,\n\t\tget hasHumanInput() {\n\t\t\treturn extensionRunner.createContext().hasHumanInput;\n\t\t},\n\t\tcwd: this.sessionManager.getCwd(),\n\t\tsessionManager: this.sessionManager,\n\t\tmodelRegistry: new ModelRegistry(this.session.modelRuntime),\n\t\tmodel: this.session.model,\n\t\t// Copied through the same helper `createExtensionContext` uses: this\n\t\t// hand-built context reaches the same shortcut handlers, so it owes them\n\t\t// the same guarantee, entries included.\n\t\tscopedModels: copyScopedModels(this.session.scopedModels),\n\t\tisIdle: () => !this.session.isStreaming,\n\t\tisProjectTrusted: () => this.session.settingsManager.isProjectTrusted(),\n\t\tsignal: this.session.agent.signal,\n\t\tabort: () => this.session.abort(),\n\t\thasPendingMessages: () => this.session.pendingMessageCount > 0,\n\t\tshutdown: () => {\n\t\t\tthis.shutdownRequested = true;\n\t\t},\n\t\tgetContextUsage: () => this.session.getContextUsage(),\n\t\tcompact: (options) => {\n\t\t\tvoid (async () => {\n\t\t\t\ttry {\n\t\t\t\t\tconst result = await this.session.compact();\n\t\t\t\t\toptions?.onComplete?.(result);\n\t\t\t\t} catch (error) {\n\t\t\t\t\tconst err = error instanceof Error ? error : new Error(String(error));\n\t\t\t\t\toptions?.onError?.(err);\n\t\t\t\t}\n\t\t\t})();\n\t\t},\n\t\tgetSystemPrompt: () => this.session.systemPrompt,\n\t\tgetRouterModel: () => this.session.settingsManager.getRouterModel(),\n\t\tgetModelRouting: () => this.session.settingsManager.getModelRouting(),\n\t});\n\n\t// Set up the extension shortcut handler on the default editor\n\tthis.defaultEditor.onExtensionShortcut = (data: string) => {\n\t\tfor (const [shortcutStr, shortcut] of shortcuts) {\n\t\t\t// Cast to KeyId - extension shortcuts use the same format\n\t\t\tif (matchesKey(data, shortcutStr as KeyId) && !shortcut.editorKeys?.some((key) => matchesKey(data, key))) {\n\t\t\t\t// Run handler async, don't block input\n\t\t\t\tPromise.resolve(shortcut.handler(createContext())).catch((err) => {\n\t\t\t\t\tthis.showError(`Shortcut handler error: ${err instanceof Error ? err.message : String(err)}`);\n\t\t\t\t});\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t};\n};\n\nInteractiveModeBase.prototype.setExtensionStatus = function (\n\tthis: InteractiveModeBase,\n\tkey: string,\n\ttext: string | undefined,\n): void {\n\tthis.footerDataProvider.setExtensionStatus(key, text);\n\tthis.ui.requestRender();\n};\n\nInteractiveModeBase.prototype.getWorkingLoaderMessage = function (this: InteractiveModeBase): string {\n\treturn this.workingMessage ?? this.defaultWorkingMessage;\n};\n\nInteractiveModeBase.prototype.createWorkingLoader = function (this: InteractiveModeBase): AtomicWorkingLoader {\n\treturn new AtomicWorkingLoader(\n\t\tthis.ui,\n\t\tundefined,\n\t\t(text) => theme.fg(\"muted\", text),\n\t\tthis.getWorkingLoaderMessage(),\n\t\tthis.workingIndicatorOptions,\n\t);\n};\n\nInteractiveModeBase.prototype.clearWorkingLoader = function (this: InteractiveModeBase): void {\n\tthis.loadingAnimation?.stop();\n\tthis.loadingAnimation = undefined;\n\tthis.workingIndicatorEmbedded = false;\n\tthis.setEditorWorkingStatusIndicator?.(undefined);\n\tthis.statusContainer.clear();\n};\n\nInteractiveModeBase.prototype.stopWorkingLoader = function (this: InteractiveModeBase): void {\n\tconst hadLoader = this.loadingAnimation !== undefined;\n\tconst wasEmbedded = this.workingIndicatorEmbedded;\n\tInteractiveModeBase.prototype.clearWorkingLoader.call(this);\n\tif (hadLoader && !wasEmbedded) mountIdleStatus(this.statusContainer, this.settingsManager.getClearOnShrink());\n};\n\nInteractiveModeBase.prototype.showWorkingLoaderNow = function (this: InteractiveModeBase): void {\n\t// Mount the working spinner immediately, regardless of streaming state, so\n\t// there is no visible gap between submitting a prompt and the agent turn\n\t// actually starting. Prompt preflight (extension input hooks, template/skill\n\t// expansion, auth and compaction checks, deferred startup) runs before the\n\t// agent emits `agent_start`, which is otherwise the only place the loader is\n\t// created. Respect `workingVisible` so extensions can still suppress it.\n\tif (!this.workingVisible || this.loadingAnimation) {\n\t\tthis.ui.requestRender();\n\t\treturn;\n\t}\n\tthis.statusContainer.clear();\n\tconst loader = this.createWorkingLoader();\n\tthis.loadingAnimation = loader;\n\tthis.workingIndicatorEmbedded = this.setEditorWorkingStatusIndicator?.(loader) ?? false;\n\tif (!this.workingIndicatorEmbedded) this.statusContainer.addChild(loader);\n\tthis.ui.requestRender();\n};\n\nInteractiveModeBase.prototype.setWorkingVisible = function (this: InteractiveModeBase, visible: boolean): void {\n\tthis.workingVisible = visible;\n\tif (!visible) {\n\t\tthis.stopWorkingLoader();\n\t\tthis.ui.requestRender();\n\t\treturn;\n\t}\n\tif (this.session.isStreaming && !this.loadingAnimation) {\n\t\tthis.statusContainer.clear();\n\t\tconst loader = this.createWorkingLoader();\n\t\tthis.loadingAnimation = loader;\n\t\tthis.workingIndicatorEmbedded = this.setEditorWorkingStatusIndicator?.(loader) ?? false;\n\t\tif (!this.workingIndicatorEmbedded) this.statusContainer.addChild(loader);\n\t}\n\tthis.ui.requestRender();\n};\n\nInteractiveModeBase.prototype.setWorkingIndicator = function (\n\tthis: InteractiveModeBase,\n\toptions?: LoaderIndicatorOptions,\n): void {\n\tthis.workingIndicatorOptions = options;\n\tthis.loadingAnimation?.setIndicator(options);\n\tthis.ui.requestRender();\n};\n\nInteractiveModeBase.prototype.setHiddenThinkingLabel = function (this: InteractiveModeBase, label?: string): void {\n\tthis.hiddenThinkingLabel = label ?? this.defaultHiddenThinkingLabel;\n\tfor (const child of this.chatContainer.children) {\n\t\tif (child instanceof AssistantMessageComponent) {\n\t\t\tchild.setHiddenThinkingLabel(this.hiddenThinkingLabel);\n\t\t}\n\t}\n\tif (this.streamingComponent) {\n\t\tthis.streamingComponent.setHiddenThinkingLabel(this.hiddenThinkingLabel);\n\t}\n\tthis.ui.requestRender();\n};\n\nInteractiveModeBase.prototype.setExtensionWidget = function (\n\tthis: InteractiveModeBase,\n\tkey: string,\n\tcontent: string[] | ((tui: TUI, thm: Theme) => Component & { dispose?(): void }) | undefined,\n\toptions?: ExtensionWidgetOptions,\n): void {\n\tconst placement = options?.placement ?? \"aboveEditor\";\n\tconst removeExisting = (map: Map<string, Component & { dispose?(): void }>) => {\n\t\tconst existing = map.get(key);\n\t\tif (existing?.dispose) existing.dispose();\n\t\tmap.delete(key);\n\t};\n\n\tremoveExisting(this.extensionWidgetsAbove);\n\tremoveExisting(this.extensionWidgetsBelow);\n\n\tif (content === undefined) {\n\t\tthis.renderWidgets();\n\t\tthis.notifyExtensionWidgetRelease(key);\n\t\treturn;\n\t}\n\n\tlet component: Component & { dispose?(): void };\n\n\tif (Array.isArray(content)) {\n\t\t// Wrap string array in a Container with Text components\n\t\tconst container = new Container();\n\t\tfor (const line of options?.scroll ? content : content.slice(0, InteractiveModeBase.MAX_WIDGET_LINES)) {\n\t\t\tcontainer.addChild(new Text(line, 1, 0));\n\t\t}\n\t\tif (!options?.scroll && content.length > InteractiveModeBase.MAX_WIDGET_LINES) {\n\t\t\tcontainer.addChild(new Text(theme.fg(\"muted\", \"... (widget truncated)\"), 1, 0));\n\t\t}\n\t\tcomponent = container;\n\t} else {\n\t\t// Factory function - create component\n\t\tcomponent = content(this.ui, theme);\n\t}\n\tif (options?.scroll) {\n\t\tconst { maxHeight, maxHeightFraction } = options.scroll;\n\t\tcomponent = new ScrollWidget(component, maxHeight, () =>\n\t\t\tmaxHeightFraction === undefined\n\t\t\t\t? maxHeight\n\t\t\t\t: Math.min(maxHeight, Math.max(1, Math.floor(this.ui.terminal.rows * maxHeightFraction))),\n\t\t);\n\t}\n\n\tconst targetMap = placement === \"belowEditor\" ? this.extensionWidgetsBelow : this.extensionWidgetsAbove;\n\ttargetMap.set(key, component);\n\tthis.renderWidgets();\n};\n\nInteractiveModeBase.prototype.clearExtensionWidgets = function (this: InteractiveModeBase): void {\n\tconst releasedKeys = new Set<string>();\n\tfor (const [key, widget] of this.extensionWidgetsAbove) {\n\t\twidget.dispose?.();\n\t\treleasedKeys.add(key);\n\t}\n\tfor (const [key, widget] of this.extensionWidgetsBelow) {\n\t\twidget.dispose?.();\n\t\treleasedKeys.add(key);\n\t}\n\tthis.extensionWidgetsAbove.clear();\n\tthis.extensionWidgetsBelow.clear();\n\tthis.renderWidgets();\n\tfor (const key of releasedKeys) this.notifyExtensionWidgetRelease(key);\n};\n\nInteractiveModeBase.prototype.resetExtensionUI = function (this: InteractiveModeBase): void {\n\tif (this.extensionSelector) {\n\t\tthis.hideExtensionSelector();\n\t}\n\tif (this.extensionInput) {\n\t\tthis.hideExtensionInput();\n\t}\n\tif (this.extensionEditor) {\n\t\tthis.hideExtensionEditor();\n\t}\n\tthis.ui.hideOverlay();\n\tthis.clearExtensionTerminalInputListeners();\n\tthis.setExtensionFooter(undefined);\n\tthis.setExtensionHeader(undefined);\n\tthis.clearExtensionWidgets();\n\tthis.footerDataProvider.clearExtensionStatuses();\n\tthis.footer.invalidate();\n\tthis.autocompleteProviderWrappers = [];\n\tthis.setCustomEditorComponent(undefined);\n\tthis.setupAutocompleteProvider();\n\tthis.defaultEditor.onExtensionShortcut = this.interactiveEngineShortcutHandler;\n\tthis.updateTerminalTitle();\n\tthis.workingMessage = undefined;\n\tthis.workingVisible = true;\n\tthis.setWorkingIndicator();\n\tif (this.loadingAnimation) {\n\t\tthis.loadingAnimation.setMessage(`${this.defaultWorkingMessage} (${keyText(\"app.interrupt\")} Interrupt)`);\n\t}\n\tthis.setHiddenThinkingLabel();\n};\n"]}
@@ -118,6 +118,14 @@ function isWorkingStatusEditor(editor) {
118
118
  typeof editor.setWorkingStatusIndicator === "function");
119
119
  }
120
120
  export class InteractiveModeBase {
121
+ runtimeHost;
122
+ ui;
123
+ renderer;
124
+ shouldHandleViewportInput = (data, isMouseInput, focusedIsOverlay, focusedIsViewportSearch) => {
125
+ return shouldHandleFullscreenViewportInput(this.renderer.getFocusedComponent(), this.editor, data, isMouseInput, focusedIsOverlay, this.keybindings, focusedIsViewportSearch);
126
+ };
127
+ onOverlayUnhandledInput = (data) => this.handleOverlayUnhandledInput(data);
128
+ onOverlayInternalUiAction = (url) => handleFocusedOverlayInternalUiAction(this.renderer, url);
121
129
  /** Dispatch the host thinking action after a focused workflow overlay declines input. */
122
130
  handleOverlayUnhandledInput(data) {
123
131
  if (isKeyRelease(data) || !this.keybindings.matches(data, "app.thinking.toggle"))
@@ -131,6 +139,153 @@ export class InteractiveModeBase {
131
139
  if (this.renderer.mode === "fullscreen")
132
140
  this.renderer.setCopyOnSelect(enabled);
133
141
  }
142
+ onRightClickPaste = () => {
143
+ void this.handleRightClickPaste();
144
+ };
145
+ chatContainer;
146
+ documentContainer;
147
+ transcriptScrollView;
148
+ fullscreenLayoutRoot;
149
+ resourceDisclosureContainer;
150
+ startupNoticesContainer;
151
+ pendingMessagesContainer;
152
+ statusContainer;
153
+ defaultEditor;
154
+ editor;
155
+ editorComponentFactory;
156
+ autocompleteProvider;
157
+ autocompleteProviderWrappers = [];
158
+ fdPath;
159
+ editorContainer;
160
+ activeSelectorToken;
161
+ activeSelectorDispose;
162
+ footer;
163
+ footerContainer;
164
+ usageMeter;
165
+ footerDataProvider;
166
+ // Stored so the same manager can be injected into custom editors, selectors, and extension UI.
167
+ keybindings;
168
+ reloadCoordinator;
169
+ interactiveEngineShortcutHandler;
170
+ disposeInteractiveEngineHost = () => { };
171
+ disposeMarkitDiagnosticSink = () => { };
172
+ version;
173
+ isInitialized = false;
174
+ onInputCallback;
175
+ pendingUserInputs = [];
176
+ startupReplayInputs = [];
177
+ startupReplayActiveInput = undefined;
178
+ startupDraftText = undefined;
179
+ workingIndicatorEmbedded = false;
180
+ startupCookedInputRecovered = false;
181
+ deferredRenderedUserInputs = [];
182
+ deferredRenderedUserInputComponents = new Map();
183
+ loadingAnimation = undefined;
184
+ workingMessage = undefined;
185
+ workingVisible = true;
186
+ workingIndicatorOptions = undefined;
187
+ defaultWorkingMessage = "Working";
188
+ defaultHiddenThinkingLabel = "Thinking...";
189
+ hiddenThinkingLabel = this.defaultHiddenThinkingLabel;
190
+ lastSigintTime = 0;
191
+ lastEscapeTime = 0;
192
+ changelogMarkdown = undefined;
193
+ startupNoticesShown = false;
194
+ /** Last model-catalog warning already shown, so the deferred re-read only speaks on a change. */
195
+ reportedModelCatalogWarning;
196
+ startupNoticesPrepared = false;
197
+ anthropicSubscriptionWarningShown = false;
198
+ firstRunNoticeVisible = false;
199
+ hadLastChangelogVersionAtStartup = false;
200
+ firstRunOnboardingNoticeComponents = [];
201
+ autoTrustOnReloadCwd;
202
+ // Status line tracking (for mutating immediately-sequential status updates)
203
+ lastStatusSpacer = undefined;
204
+ lastStatusText = undefined;
205
+ /** Leading spacer added once for the managed-tool startup status block. */
206
+ managedToolStatusStarted = false;
207
+ /** Invalidates readiness callbacks after the transcript is rebuilt for another session. */
208
+ managedToolStatusGeneration = 0;
209
+ // Streaming message tracking
210
+ streamingComponent = undefined;
211
+ streamingMessage = undefined;
212
+ // Tool execution tracking: toolCallId -> component
213
+ pendingTools = new Map();
214
+ // Tool output expansion state
215
+ toolOutputExpanded = false;
216
+ // Thinking block visibility state
217
+ hideThinkingBlock = false;
218
+ outputPad = 1;
219
+ mermaidMarkdownTransformer = createMermaidMarkdownTransformer({
220
+ getMode: () => this.settingsManager.getMermaidRenderingMode(),
221
+ theme,
222
+ });
223
+ mermaidMarkdownTransformerMode;
224
+ // Skill commands: command name -> skill file path
225
+ skillCommands = new Map();
226
+ // Agent subscription unsubscribe function
227
+ unsubscribe;
228
+ signalCleanupHandlers = [];
229
+ // Track if editor is in bash mode (text starts with !)
230
+ isBashMode = false;
231
+ // Track current bash execution component
232
+ bashComponent = undefined;
233
+ // Track pending bash components (shown in pending area, moved to chat on submit)
234
+ pendingBashComponents = [];
235
+ // Auto-compaction state
236
+ autoCompactionLoader = undefined;
237
+ autoCompactionEscapeHandler;
238
+ /** True once the pre-compaction Escape handler has been captured for restore. */
239
+ autoCompactionEscapeHandlerSaved = false;
240
+ /** True while `runUserPromptTurn()` owns the working loader. */
241
+ promptTurnWorkingLoaderActive = false;
242
+ // Auto-retry state
243
+ retryLoader = undefined;
244
+ fallbackLoader = undefined;
245
+ retryCountdown = undefined;
246
+ retryEscapeHandler;
247
+ // Messages queued while compaction is running
248
+ compactionQueuedMessages = [];
249
+ /** Keeps input queued while automatic compaction hands off to a manual request. */
250
+ manualCompactionTakeoverPending = false;
251
+ // Deferred extension load state (first paint happens before extensions load)
252
+ deferredStartupPending = false;
253
+ initialStartupBinding = false;
254
+ deferredStartupPromise = undefined;
255
+ inputHandlerReadyRecorded = false;
256
+ firstSubmitRecorded = false;
257
+ // Shutdown state
258
+ shutdownRequested = false;
259
+ // Extension UI state
260
+ extensionSelector = undefined;
261
+ extensionInput = undefined;
262
+ extensionEditor = undefined;
263
+ tuiInputSubscriptions = new Set();
264
+ extensionTerminalInputSubscriptions = new Set();
265
+ tuiRendererChangeListeners = new Set();
266
+ blockingInlineCustomUiDepth = 0;
267
+ navigationInlineCustomUiDepth = 0;
268
+ deferredInlineCustomUiFocusDepth = 0;
269
+ pendingInlineCustomUiFocus = undefined;
270
+ /** Pending inline mounts in display order, oldest first. */
271
+ inlineCustomUiStack = [];
272
+ hostCustomUiStateListeners = new Set();
273
+ widgetReleaseListeners = new Map();
274
+ transcriptOverlayReserve = undefined;
275
+ themeController;
276
+ // Extension widgets (components rendered above/below the editor)
277
+ extensionWidgetsAbove = new Map();
278
+ extensionWidgetsBelow = new Map();
279
+ widgetContainerAbove;
280
+ widgetContainerBelow;
281
+ // Custom footer from extension (undefined = use built-in footer)
282
+ customFooter = undefined;
283
+ // Header container that holds the built-in or custom header
284
+ headerContainer;
285
+ // Built-in header (logo + keybinding hints + changelog)
286
+ builtInHeader = undefined;
287
+ // Custom header from extension (undefined = use built-in header)
288
+ customHeader = undefined;
134
289
  // Convenience accessors
135
290
  get session() {
136
291
  return this.runtimeHost.session;
@@ -235,125 +390,6 @@ export class InteractiveModeBase {
235
390
  return true;
236
391
  }
237
392
  constructor(runtimeHost, options = {}) {
238
- this.shouldHandleViewportInput = (data, isMouseInput, focusedIsOverlay, focusedIsViewportSearch) => {
239
- return shouldHandleFullscreenViewportInput(this.renderer.getFocusedComponent(), this.editor, data, isMouseInput, focusedIsOverlay, this.keybindings, focusedIsViewportSearch);
240
- };
241
- this.onOverlayUnhandledInput = (data) => this.handleOverlayUnhandledInput(data);
242
- this.onOverlayInternalUiAction = (url) => handleFocusedOverlayInternalUiAction(this.renderer, url);
243
- this.onRightClickPaste = () => {
244
- void this.handleRightClickPaste();
245
- };
246
- this.autocompleteProviderWrappers = [];
247
- this.disposeInteractiveEngineHost = () => { };
248
- this.disposeMarkitDiagnosticSink = () => { };
249
- this.isInitialized = false;
250
- this.pendingUserInputs = [];
251
- this.startupReplayInputs = [];
252
- this.startupReplayActiveInput = undefined;
253
- this.startupDraftText = undefined;
254
- this.workingIndicatorEmbedded = false;
255
- this.startupCookedInputRecovered = false;
256
- this.deferredRenderedUserInputs = [];
257
- this.deferredRenderedUserInputComponents = new Map();
258
- this.loadingAnimation = undefined;
259
- this.workingMessage = undefined;
260
- this.workingVisible = true;
261
- this.workingIndicatorOptions = undefined;
262
- this.defaultWorkingMessage = "Working";
263
- this.defaultHiddenThinkingLabel = "Thinking...";
264
- this.hiddenThinkingLabel = this.defaultHiddenThinkingLabel;
265
- this.lastSigintTime = 0;
266
- this.lastEscapeTime = 0;
267
- this.changelogMarkdown = undefined;
268
- this.startupNoticesShown = false;
269
- this.startupNoticesPrepared = false;
270
- this.anthropicSubscriptionWarningShown = false;
271
- this.firstRunNoticeVisible = false;
272
- this.hadLastChangelogVersionAtStartup = false;
273
- this.firstRunOnboardingNoticeComponents = [];
274
- // Status line tracking (for mutating immediately-sequential status updates)
275
- this.lastStatusSpacer = undefined;
276
- this.lastStatusText = undefined;
277
- /** Leading spacer added once for the managed-tool startup status block. */
278
- this.managedToolStatusStarted = false;
279
- /** Invalidates readiness callbacks after the transcript is rebuilt for another session. */
280
- this.managedToolStatusGeneration = 0;
281
- // Streaming message tracking
282
- this.streamingComponent = undefined;
283
- this.streamingMessage = undefined;
284
- // Tool execution tracking: toolCallId -> component
285
- this.pendingTools = new Map();
286
- // Tool output expansion state
287
- this.toolOutputExpanded = false;
288
- // Thinking block visibility state
289
- this.hideThinkingBlock = false;
290
- this.outputPad = 1;
291
- this.mermaidMarkdownTransformer = createMermaidMarkdownTransformer({
292
- getMode: () => this.settingsManager.getMermaidRenderingMode(),
293
- theme,
294
- });
295
- // Skill commands: command name -> skill file path
296
- this.skillCommands = new Map();
297
- this.signalCleanupHandlers = [];
298
- // Track if editor is in bash mode (text starts with !)
299
- this.isBashMode = false;
300
- // Track current bash execution component
301
- this.bashComponent = undefined;
302
- // Track pending bash components (shown in pending area, moved to chat on submit)
303
- this.pendingBashComponents = [];
304
- // Auto-compaction state
305
- this.autoCompactionLoader = undefined;
306
- /** True once the pre-compaction Escape handler has been captured for restore. */
307
- this.autoCompactionEscapeHandlerSaved = false;
308
- /** True while `runUserPromptTurn()` owns the working loader. */
309
- this.promptTurnWorkingLoaderActive = false;
310
- // Auto-retry state
311
- this.retryLoader = undefined;
312
- this.fallbackLoader = undefined;
313
- this.retryCountdown = undefined;
314
- // Messages queued while compaction is running
315
- this.compactionQueuedMessages = [];
316
- /** Keeps input queued while automatic compaction hands off to a manual request. */
317
- this.manualCompactionTakeoverPending = false;
318
- // Deferred extension load state (first paint happens before extensions load)
319
- this.deferredStartupPending = false;
320
- this.initialStartupBinding = false;
321
- this.deferredStartupPromise = undefined;
322
- this.inputHandlerReadyRecorded = false;
323
- this.firstSubmitRecorded = false;
324
- // Shutdown state
325
- this.shutdownRequested = false;
326
- // Extension UI state
327
- this.extensionSelector = undefined;
328
- this.extensionInput = undefined;
329
- this.extensionEditor = undefined;
330
- this.tuiInputSubscriptions = new Set();
331
- this.extensionTerminalInputSubscriptions = new Set();
332
- this.tuiRendererChangeListeners = new Set();
333
- this.blockingInlineCustomUiDepth = 0;
334
- this.navigationInlineCustomUiDepth = 0;
335
- this.deferredInlineCustomUiFocusDepth = 0;
336
- this.pendingInlineCustomUiFocus = undefined;
337
- /** Pending inline mounts in display order, oldest first. */
338
- this.inlineCustomUiStack = [];
339
- this.hostCustomUiStateListeners = new Set();
340
- this.widgetReleaseListeners = new Map();
341
- this.transcriptOverlayReserve = undefined;
342
- // Extension widgets (components rendered above/below the editor)
343
- this.extensionWidgetsAbove = new Map();
344
- this.extensionWidgetsBelow = new Map();
345
- // Custom footer from extension (undefined = use built-in footer)
346
- this.customFooter = undefined;
347
- // Built-in header (logo + keybinding hints + changelog)
348
- this.builtInHeader = undefined;
349
- // Custom header from extension (undefined = use built-in header)
350
- this.customHeader = undefined;
351
- /**
352
- * Gracefully shutdown the agent.
353
- * Stops the TUI before emitting shutdown events so extension UI cleanup cannot
354
- * repaint the final frame while the process is exiting.
355
- */
356
- this.isShuttingDown = false;
357
393
  this.runtimeHost = runtimeHost;
358
394
  this.options = options;
359
395
  this.deferredStartupPending = Boolean(options.deferredExtensionLoad);
@@ -449,6 +485,12 @@ export class InteractiveModeBase {
449
485
  }, this.keybindings);
450
486
  }
451
487
  // Maximum total widget lines to prevent viewport overflow
452
- static { this.MAX_WIDGET_LINES = 10; }
488
+ static MAX_WIDGET_LINES = 10;
489
+ /**
490
+ * Gracefully shutdown the agent.
491
+ * Stops the TUI before emitting shutdown events so extension UI cleanup cannot
492
+ * repaint the final frame while the process is exiting.
493
+ */
494
+ isShuttingDown = false;
453
495
  }
454
496
  //# sourceMappingURL=interactive-mode-base.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"interactive-mode-base.js","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-mode-base.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Shared state and constructor wiring for interactive mode.\n * Responsibility-specific behavior is installed by sibling modules.\n */\nimport {\n\tisKeyRelease,\n\tisViewportTUI,\n\ttype ScrollView,\n\tsetCapabilityOverrides,\n\ttype TuiInputListener,\n} from \"@earendil-works/pi-tui\";\nimport type { AgentSessionQueuePauseControl } from \"../../core/agent-session-methods.ts\";\nimport type { MarkdownTransformer } from \"../../core/extensions/types.ts\";\nimport type { FullscreenExitOutput, MermaidRenderingMode } from \"../../core/settings-manager.ts\";\nimport type { EarlyInputSnapshot } from \"../../main-early-input.ts\";\nimport { readClipboardText } from \"../../utils/clipboard.ts\";\nimport { renderEngineDiagnostic } from \"../interactive-engine/engine-diagnostic-view.js\";\nimport { attachInteractiveEngineHost } from \"../interactive-engine/extension-ui-bridge.ts\";\nimport type { RemoteToolExecutionComponent } from \"../interactive-engine/remote-renderer.ts\";\nimport { KeybindingsReloadCoordinator } from \"../rpc/rpc-keybindings-reload.ts\";\nimport type { AtomicWorkingLoader } from \"./components/atomic-working-status.ts\";\nimport { createMermaidMarkdownTransformer } from \"./components/mermaid.ts\";\nimport type { TranscriptOverlayReserve } from \"./components/reserved-bottom-overlay.ts\";\nimport { WidgetContainer } from \"./components/scroll-widget.js\";\nimport {\n\ttype AgentSession,\n\ttype AgentSessionRuntime,\n\ttype AssistantMessage,\n\ttype AssistantMessageComponent,\n\ttype AutocompleteProvider,\n\ttype AutocompleteProviderFactory,\n\ttype BashExecutionComponent,\n\ttype Component,\n\tContainer,\n\ttype CountdownTimer,\n\tCustomEditor,\n\ttype EditorComponent,\n\ttype EditorFactory,\n\ttype ExtensionEditorComponent,\n\ttype ExtensionInputComponent,\n\ttype ExtensionSelectorComponent,\n\tFooterComponent,\n\tFooterDataProvider,\n\tgetEditorTheme,\n\ttype HostCustomUiStateListener,\n\tInteractiveThemeController,\n\tKeybindingsManager,\n\ttype Loader,\n\ttype LoaderIndicatorOptions,\n\ttype Spacer,\n\tsetKeybindings,\n\tsetRegisteredThemes,\n\ttype Text,\n\ttype ToolExecutionComponent,\n\ttype TUI,\n\ttheme,\n\tUsageMeterComponent,\n\tVERSION,\n} from \"./interactive-mode-deps.ts\";\nimport type {} from \"./interactive-mode-surface.ts\";\nimport type { CompactionQueuedMessage, InteractiveModeOptions } from \"./interactive-mode-types.ts\";\nimport { StartupChatContainer } from \"./interactive-startup-chat-container.ts\";\nimport type { InteractiveSubmission } from \"./interactive-submission.ts\";\nimport {\n\tcreateInteractiveTui,\n\tcreateInteractiveTuiReference,\n\thandleFocusedOverlayInternalUiAction,\n\ttype InteractiveTui,\n\ttype InternalUiActionResult,\n} from \"./interactive-tui.ts\";\n\n/** Move the transcript and nothing else: what a reserving overlay may release. */\nconst FULLSCREEN_TRANSCRIPT_SCROLL_ACTIONS = [\n\t\"tui.altScreen.pageUp\",\n\t\"tui.altScreen.pageDown\",\n\t\"tui.altScreen.halfPageUp\",\n\t\"tui.altScreen.halfPageDown\",\n\t\"tui.altScreen.lineUp\",\n\t\"tui.altScreen.lineDown\",\n\t\"tui.altScreen.previousPrompt\",\n\t\"tui.altScreen.nextPrompt\",\n\t\"tui.altScreen.top\",\n\t\"tui.altScreen.bottom\",\n] as const;\n\nconst FULLSCREEN_VIEWPORT_ACTIONS = FULLSCREEN_TRANSCRIPT_SCROLL_ACTIONS;\n\nexport function isFullscreenViewportAction(data: string, keybindings: KeybindingsManager): boolean {\n\treturn FULLSCREEN_VIEWPORT_ACTIONS.some((action) => keybindings.matches(data, action));\n}\n\n/**\n * Whether a key scrolls the transcript. A reserving overlay — the\n * `ask_user_question` dialog, an extension component with\n * `reserveTranscriptRows` — declines these so the strip above it still pages\n * and jumps (#2378), and keeps everything else.\n */\nexport function isFullscreenTranscriptScrollAction(data: string, keybindings: KeybindingsManager): boolean {\n\treturn FULLSCREEN_TRANSCRIPT_SCROLL_ACTIONS.some((action) => keybindings.matches(data, action));\n}\n\n/**\n * Decide whether the fullscreen viewport should run before the focused\n * component. `isMouseInput` is classified by pi-tui's own mouse predicate in\n * `AtomicTuiAltScreen`, so this policy does not duplicate terminal grammars.\n * Mouse deferral is limited to actual overlays so inline components do not\n * disable pi-tui's application-owned transcript selection path.\n *\n * **Who owns viewport keys while an overlay is focused.** pi-tui 0.84.2 added\n * `shouldDeferViewportInputToOverlay()` (upstream #7894) and answers \"the\n * overlay\". Atomic answers \"the overlay first, the transcript with whatever it\n * declines\" (#2378 / PR #2381): the actions in `FULLSCREEN_VIEWPORT_ACTIONS`\n * and wheel reports are offered to the focused overlay, and\n * `AtomicTuiAltScreen` replays what it does not consume into pi-tui's viewport\n * listener. Atomic's answer stands, because a mounted dialog that keeps its\n * selection keys must not also freeze the transcript behind it.\n *\n * **The list covers every `tui.altScreen.*` scroll action pi-tui defines.**\n * An action a focused overlay declines still reaches the transcript, so the\n * shortcut is never simply lost.\n *\n * **A focused overlay with no `handleInput` is still an overlay.** The handler\n * is optional — `ExtensionCustomComponent` marks it `handleInput?` and\n * `docs/tui.md` documents it as optional — and a component that cannot answer\n * declines by definition. Answering \"the viewport owns it\" for that shape\n * would hand the key to pi-tui, whose native deferral then drops it because an\n * overlay holds focus, so the transcript would freeze behind a component that\n * never asked for the key. A handler-less overlay therefore takes the same\n * route as one that returns `false`: nothing to offer, then replay. Only a\n * focused component that is *not* an overlay keeps the shortcut, because\n * pi-tui defers nothing to it.\n */\nexport function shouldHandleFullscreenViewportInput(\n\tfocused: Component | null,\n\teditor: Component,\n\tdata: string,\n\tisMouseInput: boolean,\n\tfocusedIsOverlay: boolean,\n\tkeybindings: KeybindingsManager,\n\t_focusedIsViewportSearch = false,\n): boolean {\n\tif (focused === editor || !focused) return true;\n\tif (!focused.handleInput && !focusedIsOverlay) return true;\n\tif (isMouseInput) return !focusedIsOverlay;\n\tif (focusedIsOverlay && keybindings.matches(data, \"app.thinking.toggle\")) return false;\n\treturn !isFullscreenViewportAction(data, keybindings);\n}\n\nfunction isCommandLikeStartupInput(text: string): boolean {\n\tconst trimmed = text.trimStart();\n\treturn trimmed.startsWith(\"/\") || trimmed.startsWith(\"!\");\n}\n\nexport function seedStartupInput(\n\tpendingUserInputs: InteractiveSubmission[],\n\teditor: { setText(text: string): void },\n\tstartupInput: EarlyInputSnapshot | undefined,\n\tstartupReplayInputs: string[] = [],\n\tsetStartupDraftText?: (text: string) => void,\n\tsetStartupReplayActiveInput?: (text: string) => void,\n): void {\n\tif (!startupInput) return;\n\tlet commandReplayStarted = false;\n\tfor (const submission of startupInput.submissions) {\n\t\tif (commandReplayStarted) {\n\t\t\tstartupReplayInputs.push(submission);\n\t\t} else if (isCommandLikeStartupInput(submission)) {\n\t\t\tconst commandText = submission.trim();\n\t\t\tcommandReplayStarted = true;\n\t\t\teditor.setText(commandText);\n\t\t\tsetStartupReplayActiveInput?.(commandText);\n\t\t} else {\n\t\t\tpendingUserInputs.push({ text: submission, draft: submission });\n\t\t}\n\t}\n\tif (startupInput.text.length === 0) return;\n\tif (commandReplayStarted) {\n\t\tsetStartupDraftText?.(startupInput.text);\n\t} else {\n\t\teditor.setText(startupInput.text);\n\t}\n}\n\nexport interface InteractiveTuiInputSubscription {\n\thandler: TuiInputListener;\n\tunsubscribe: () => void;\n}\n\ninterface WorkingStatusEditor extends EditorComponent {\n\treadonly embedWorkingStatus: boolean;\n\tsetWorkingStatusIndicator(indicator: AtomicWorkingLoader | undefined): void;\n}\n\nfunction isWorkingStatusEditor(editor: EditorComponent): editor is WorkingStatusEditor {\n\treturn (\n\t\t\"embedWorkingStatus\" in editor &&\n\t\teditor.embedWorkingStatus === true &&\n\t\t\"setWorkingStatusIndicator\" in editor &&\n\t\ttypeof editor.setWorkingStatusIndicator === \"function\"\n\t);\n}\n\nexport class InteractiveModeBase {\n\truntimeHost: AgentSessionRuntime;\n\n\tui: TUI;\n\tprivate renderer: InteractiveTui;\n\n\tprivate readonly shouldHandleViewportInput = (\n\t\tdata: string,\n\t\tisMouseInput: boolean,\n\t\tfocusedIsOverlay: boolean,\n\t\tfocusedIsViewportSearch: boolean,\n\t): boolean => {\n\t\treturn shouldHandleFullscreenViewportInput(\n\t\t\tthis.renderer.getFocusedComponent(),\n\t\t\tthis.editor,\n\t\t\tdata,\n\t\t\tisMouseInput,\n\t\t\tfocusedIsOverlay,\n\t\t\tthis.keybindings,\n\t\t\tfocusedIsViewportSearch,\n\t\t);\n\t};\n\tprivate readonly onOverlayUnhandledInput = (data: string): boolean => this.handleOverlayUnhandledInput(data);\n\tprivate readonly onOverlayInternalUiAction = (url: string): InternalUiActionResult =>\n\t\thandleFocusedOverlayInternalUiAction(this.renderer, url);\n\n\t/** Dispatch the host thinking action after a focused workflow overlay declines input. */\n\thandleOverlayUnhandledInput(data: string): boolean {\n\t\tif (isKeyRelease(data) || !this.keybindings.matches(data, \"app.thinking.toggle\")) return false;\n\t\t// Reuse the default editor's action dispatcher even while a workflow\n\t\t// overlay owns focus. This keeps the host binding and its user remap as\n\t\t// the source of truth instead of calling the implementation directly.\n\t\treturn this.defaultEditor.handleInput(data);\n\t}\n\n\tsetFullscreenCopyOnSelect(enabled: boolean): void {\n\t\tif (this.renderer.mode === \"fullscreen\") this.renderer.setCopyOnSelect(enabled);\n\t}\n\n\tprivate readonly onRightClickPaste = (): void => {\n\t\tvoid this.handleRightClickPaste();\n\t};\n\n\tchatContainer: Container;\n\tdocumentContainer: Container;\n\n\ttranscriptScrollView: ScrollView | undefined;\n\n\tfullscreenLayoutRoot: Component | undefined;\n\n\tresourceDisclosureContainer: Container;\n\tstartupNoticesContainer: Container;\n\tpendingMessagesContainer: Container;\n\n\tstatusContainer: Container;\n\n\tdefaultEditor: CustomEditor;\n\n\teditor: EditorComponent;\n\n\teditorComponentFactory: EditorFactory | undefined;\n\n\tautocompleteProvider: AutocompleteProvider | undefined;\n\n\tautocompleteProviderWrappers: AutocompleteProviderFactory[] = [];\n\n\tfdPath: string | undefined;\n\n\teditorContainer: Container;\n\n\tactiveSelectorToken: object | undefined;\n\n\tactiveSelectorDispose: (() => void) | undefined;\n\n\tfooter: FooterComponent;\n\tfooterContainer: Container;\n\n\tusageMeter: UsageMeterComponent;\n\n\tfooterDataProvider: FooterDataProvider;\n\n\t// Stored so the same manager can be injected into custom editors, selectors, and extension UI.\n\tkeybindings: KeybindingsManager;\n\n\treloadCoordinator: KeybindingsReloadCoordinator;\n\n\tinteractiveEngineShortcutHandler: ((data: string) => boolean) | undefined;\n\n\tdisposeInteractiveEngineHost: () => void = () => {};\n\tdisposeMarkitDiagnosticSink: () => void = () => {};\n\n\tversion: string;\n\n\tisInitialized = false;\n\n\tonInputCallback?: (submission: InteractiveSubmission) => void;\n\n\tpendingUserInputs: InteractiveSubmission[] = [];\n\n\tstartupReplayInputs: string[] = [];\n\n\tstartupReplayActiveInput: string | undefined = undefined;\n\n\tstartupDraftText: string | undefined = undefined;\n\tworkingIndicatorEmbedded = false;\n\n\tstartupCookedInputRecovered = false;\n\n\tdeferredRenderedUserInputs: string[] = [];\n\n\tdeferredRenderedUserInputComponents = new Map<string, Component[][]>();\n\n\tloadingAnimation: Loader | AtomicWorkingLoader | undefined = undefined;\n\n\tworkingMessage: string | undefined = undefined;\n\n\tworkingVisible = true;\n\n\tworkingIndicatorOptions: LoaderIndicatorOptions | undefined = undefined;\n\n\treadonly defaultWorkingMessage = \"Working\";\n\n\treadonly defaultHiddenThinkingLabel = \"Thinking...\";\n\n\thiddenThinkingLabel = this.defaultHiddenThinkingLabel;\n\n\tlastSigintTime = 0;\n\n\tlastEscapeTime = 0;\n\n\tchangelogMarkdown: string | undefined = undefined;\n\n\tstartupNoticesShown = false;\n\t/** Last model-catalog warning already shown, so the deferred re-read only speaks on a change. */\n\treportedModelCatalogWarning: string | undefined;\n\tstartupNoticesPrepared = false;\n\n\tanthropicSubscriptionWarningShown = false;\n\n\tfirstRunNoticeVisible = false;\n\n\thadLastChangelogVersionAtStartup = false;\n\n\tfirstRunOnboardingNoticeComponents: Component[] = [];\n\n\tautoTrustOnReloadCwd: string | undefined;\n\n\t// Status line tracking (for mutating immediately-sequential status updates)\n\tlastStatusSpacer: Spacer | undefined = undefined;\n\n\tlastStatusText: Text | undefined = undefined;\n\n\t/** Leading spacer added once for the managed-tool startup status block. */\n\tmanagedToolStatusStarted = false;\n\t/** Invalidates readiness callbacks after the transcript is rebuilt for another session. */\n\tmanagedToolStatusGeneration = 0;\n\n\t// Streaming message tracking\n\tstreamingComponent: AssistantMessageComponent | undefined = undefined;\n\n\tstreamingMessage: AssistantMessage | undefined = undefined;\n\n\t// Tool execution tracking: toolCallId -> component\n\tpendingTools = new Map<string, ToolExecutionComponent | RemoteToolExecutionComponent>();\n\n\t// Tool output expansion state\n\ttoolOutputExpanded = false;\n\n\t// Thinking block visibility state\n\thideThinkingBlock = false;\n\toutputPad: 0 | 1 = 1;\n\n\tmermaidMarkdownTransformer: MarkdownTransformer = createMermaidMarkdownTransformer({\n\t\tgetMode: () => this.settingsManager.getMermaidRenderingMode(),\n\t\ttheme,\n\t});\n\tmermaidMarkdownTransformerMode: MermaidRenderingMode | undefined;\n\n\t// Skill commands: command name -> skill file path\n\tskillCommands = new Map<string, string>();\n\n\t// Agent subscription unsubscribe function\n\tunsubscribe?: () => void;\n\n\tsignalCleanupHandlers: Array<() => void> = [];\n\n\t// Track if editor is in bash mode (text starts with !)\n\tisBashMode = false;\n\n\t// Track current bash execution component\n\tbashComponent: BashExecutionComponent | undefined = undefined;\n\n\t// Track pending bash components (shown in pending area, moved to chat on submit)\n\tpendingBashComponents: BashExecutionComponent[] = [];\n\n\t// Auto-compaction state\n\tautoCompactionLoader: AtomicWorkingLoader | undefined = undefined;\n\n\tautoCompactionEscapeHandler?: () => void;\n\n\t/** True once the pre-compaction Escape handler has been captured for restore. */\n\tautoCompactionEscapeHandlerSaved = false;\n\n\t/** True while `runUserPromptTurn()` owns the working loader. */\n\tpromptTurnWorkingLoaderActive = false;\n\n\t// Auto-retry state\n\tretryLoader: AtomicWorkingLoader | undefined = undefined;\n\tfallbackLoader: Loader | undefined = undefined;\n\n\tretryCountdown: CountdownTimer | undefined = undefined;\n\n\tretryEscapeHandler?: () => void;\n\n\t// Messages queued while compaction is running\n\tcompactionQueuedMessages: CompactionQueuedMessage[] = [];\n\n\t/** Keeps input queued while automatic compaction hands off to a manual request. */\n\tmanualCompactionTakeoverPending = false;\n\n\t// Deferred extension load state (first paint happens before extensions load)\n\tdeferredStartupPending = false;\n\tinitialStartupBinding = false;\n\tdeferredStartupPromise: Promise<void> | undefined = undefined;\n\n\tinputHandlerReadyRecorded = false;\n\n\tfirstSubmitRecorded = false;\n\n\t// Shutdown state\n\tshutdownRequested = false;\n\n\t// Extension UI state\n\textensionSelector: ExtensionSelectorComponent | undefined = undefined;\n\n\textensionInput: ExtensionInputComponent | undefined = undefined;\n\n\textensionEditor: ExtensionEditorComponent | undefined = undefined;\n\n\ttuiInputSubscriptions = new Set<InteractiveTuiInputSubscription>();\n\n\textensionTerminalInputSubscriptions = new Set<InteractiveTuiInputSubscription>();\n\n\ttuiRendererChangeListeners = new Set<() => void>();\n\n\tblockingInlineCustomUiDepth = 0;\n\n\tnavigationInlineCustomUiDepth = 0;\n\n\tdeferredInlineCustomUiFocusDepth = 0;\n\n\tpendingInlineCustomUiFocus: Component | undefined = undefined;\n\n\t/** Pending inline mounts in display order, oldest first. */\n\tinlineCustomUiStack: { component: Component }[] = [];\n\n\thostCustomUiStateListeners = new Set<HostCustomUiStateListener>();\n\n\twidgetReleaseListeners = new Map<string, Set<() => void>>();\n\n\ttranscriptOverlayReserve: TranscriptOverlayReserve | undefined = undefined;\n\n\tthemeController: InteractiveThemeController;\n\n\t// Extension widgets (components rendered above/below the editor)\n\textensionWidgetsAbove = new Map<string, Component & { dispose?(): void }>();\n\n\textensionWidgetsBelow = new Map<string, Component & { dispose?(): void }>();\n\n\twidgetContainerAbove!: Container;\n\n\twidgetContainerBelow!: Container;\n\n\t// Custom footer from extension (undefined = use built-in footer)\n\tcustomFooter: (Component & { dispose?(): void }) | undefined = undefined;\n\n\t// Header container that holds the built-in or custom header\n\theaderContainer: Container;\n\n\t// Built-in header (logo + keybinding hints + changelog)\n\tbuiltInHeader: Component | undefined = undefined;\n\n\t// Custom header from extension (undefined = use built-in header)\n\tcustomHeader: (Component & { dispose?(): void }) | undefined = undefined;\n\n\t// Convenience accessors\n\tget session(): AgentSession & AgentSessionQueuePauseControl {\n\t\treturn this.runtimeHost.session as AgentSession & AgentSessionQueuePauseControl;\n\t}\n\n\t/** Includes the short handoff window that an isolated engine cannot mirror. */\n\tget compactionActive(): boolean {\n\t\treturn this.session.isCompacting || this.manualCompactionTakeoverPending;\n\t}\n\n\tget agent() {\n\t\treturn this.session.agent;\n\t}\n\n\tget sessionManager() {\n\t\treturn this.session.sessionManager;\n\t}\n\n\tget settingsManager() {\n\t\treturn this.session.settingsManager;\n\t}\n\n\t/**\n\t * Tears down the selector that owns `editorContainer`, including in-flight\n\t * work such as a model catalog refresh.\n\t *\n\t * This lives on the base class so behavior modules can dispose a selector\n\t * without relying on `interactive-selectors.ts` load order.\n\t */\n\tdisposeActiveSelector(): void {\n\t\tconst dispose = this.activeSelectorDispose;\n\t\tthis.activeSelectorToken = undefined;\n\t\tthis.activeSelectorDispose = undefined;\n\t\tdispose?.();\n\t}\n\n\taddTuiInputListener(handler: TuiInputListener): () => void {\n\t\tconst subscription: InteractiveTuiInputSubscription = {\n\t\t\thandler,\n\t\t\tunsubscribe: this.ui.addInputListener(handler),\n\t\t};\n\t\tthis.tuiInputSubscriptions.add(subscription);\n\t\treturn () => {\n\t\t\tsubscription.unsubscribe();\n\t\t\tthis.tuiInputSubscriptions.delete(subscription);\n\t\t};\n\t}\n\n\trebindTuiInputListeners(): void {\n\t\tfor (const subscription of this.tuiInputSubscriptions) {\n\t\t\tsubscription.unsubscribe();\n\t\t\tsubscription.unsubscribe = this.ui.addInputListener(subscription.handler);\n\t\t}\n\t}\n\n\tonTuiRendererChange(listener: () => void): () => void {\n\t\tthis.tuiRendererChangeListeners.add(listener);\n\t\treturn () => this.tuiRendererChangeListeners.delete(listener);\n\t}\n\n\tmountInteractiveTui(tui: TUI, components: readonly Component[]): void {\n\t\tfor (const component of components) tui.addChild(component);\n\t\tif (isViewportTUI(tui)) {\n\t\t\tif (!this.fullscreenLayoutRoot) throw new Error(\"Fullscreen layout is not initialized\");\n\t\t\ttui.setLayoutRoot(this.fullscreenLayoutRoot);\n\t\t}\n\t}\n\n\tprivate async handleRightClickPaste(): Promise<void> {\n\t\tconst target = this.renderer.getFocusedComponent();\n\t\tconst handleInput = target?.handleInput;\n\t\tif (!target || !handleInput) return;\n\t\ttry {\n\t\t\tconst text = await readClipboardText();\n\t\t\tif (!text || this.renderer.getFocusedComponent() !== target) return;\n\t\t\thandleInput.call(target, `\\x1b[200~${text}\\x1b[201~`);\n\t\t\tthis.ui.requestRender();\n\t\t} catch {\n\t\t\t// Clipboard paste is best-effort; permission and native-module failures are common.\n\t\t}\n\t}\n\n\tstopInteractiveTui(fullscreenExitOutput: FullscreenExitOutput): void {\n\t\tconst isFullscreen = this.renderer.mode === \"fullscreen\";\n\t\tif (isFullscreen && fullscreenExitOutput === \"transcript\") {\n\t\t\t// Atomic has no regular renderer to switch into, so pi-tui's own\n\t\t\t// exit paint is the only painter: its stop renders the layout root\n\t\t\t// at natural height onto the main screen. The docked fullscreen\n\t\t\t// layout squeezes its scroll view to `basis` (one row) at natural\n\t\t\t// height, so hand it the document container directly — the exit\n\t\t\t// paint then carries the whole transcript. Drop overlays first so\n\t\t\t// what gets painted is the transcript, not the focused dialog.\n\t\t\twhile (this.renderer.hasOverlayEntries) this.renderer.hideOverlay();\n\t\t\tif (isViewportTUI(this.renderer)) this.renderer.setLayoutRoot(this.documentContainer);\n\t\t}\n\t\t// `resume-hint` keeps whatever the alternate screen held: the prior\n\t\t// shell contents reappear and shutdown prints only the resume line.\n\t\tthis.ui.stop({ preserveScreen: isFullscreen && fullscreenExitOutput === \"resume-hint\" });\n\t\tthis.disposeMarkitDiagnosticSink();\n\t}\n\n\tdeclare options: InteractiveModeOptions;\n\n\tsetEditorWorkingStatusIndicator(indicator: AtomicWorkingLoader | undefined): boolean {\n\t\tthis.defaultEditor.setWorkingStatusIndicator(undefined);\n\t\tif (!isWorkingStatusEditor(this.editor)) return false;\n\t\tthis.editor.setWorkingStatusIndicator(indicator);\n\t\treturn true;\n\t}\n\n\tconstructor(runtimeHost: AgentSessionRuntime, options: InteractiveModeOptions = {}) {\n\t\tthis.runtimeHost = runtimeHost;\n\t\tthis.options = options;\n\t\tthis.deferredStartupPending = Boolean(options.deferredExtensionLoad);\n\t\tthis.autoTrustOnReloadCwd = options.autoTrustOnReloadCwd;\n\t\tthis.runtimeHost.setBeforeSessionInvalidate(() => {\n\t\t\tthis.resetExtensionUI();\n\t\t});\n\t\tthis.runtimeHost.setRebindSession(async () => {\n\t\t\tawait this.rebindCurrentSession();\n\t\t\t// A rebound session can carry a different settings manager; re-apply\n\t\t\t// the theme so the live selection tracks the session that is current.\n\t\t\tawait this.themeController.applyFromSettings();\n\t\t});\n\t\tsetCapabilityOverrides(this.settingsManager.getTerminalCapabilityOverrides());\n\t\tthis.version = VERSION;\n\t\tthis.renderer = createInteractiveTui({\n\t\t\tshowHardwareCursor: this.settingsManager.getShowHardwareCursor(),\n\t\t\tlogDirectory: runtimeHost.services.agentDir,\n\t\t\tterminal: options.terminal,\n\t\t\tcopyOnSelect: this.settingsManager.getFullscreenCopyOnSelect(),\n\t\t\tonRightClickPaste: this.onRightClickPaste,\n\t\t\tshouldHandleViewportInput: this.shouldHandleViewportInput,\n\t\t\tonOverlayUnhandledInput: this.onOverlayUnhandledInput,\n\t\t\tonOverlayInternalUiAction: this.onOverlayInternalUiAction,\n\t\t\tonInternalUiAction: () => {\n\t\t\t\tthis.jumpToTranscriptEnd();\n\t\t\t\treturn undefined;\n\t\t\t},\n\t\t});\n\t\tthis.ui = createInteractiveTuiReference(() => this.renderer);\n\t\tthis.ui.setClearOnShrink(this.settingsManager.getClearOnShrink());\n\t\tthis.headerContainer = new Container();\n\t\tthis.documentContainer = new Container();\n\t\tthis.documentContainer.addChild(this.headerContainer);\n\t\tthis.chatContainer = new StartupChatContainer();\n\t\tthis.documentContainer.addChild(this.chatContainer);\n\t\tthis.resourceDisclosureContainer = new Container();\n\t\tthis.startupNoticesContainer = new Container();\n\t\t// The isolated engine can emit session_start UI requests as soon as its\n\t\t// bridge attaches below, before init() mounts chat in the TUI. Reserve the\n\t\t// ordering slots now so those messages can never precede RESOURCES.\n\t\tthis.chatContainer.addChild(this.resourceDisclosureContainer);\n\t\tthis.chatContainer.addChild(this.startupNoticesContainer);\n\t\tthis.pendingMessagesContainer = new Container();\n\t\tthis.statusContainer = new Container();\n\t\tthis.widgetContainerAbove = new WidgetContainer();\n\t\tthis.widgetContainerBelow = new WidgetContainer();\n\t\tthis.keybindings = KeybindingsManager.create(runtimeHost.services.agentDir);\n\t\tthis.reloadCoordinator = new KeybindingsReloadCoordinator(this.keybindings);\n\t\tsetKeybindings(this.keybindings);\n\t\tconst editorPaddingX = this.settingsManager.getEditorPaddingX();\n\t\tconst autocompleteMaxVisible = this.settingsManager.getAutocompleteMaxVisible();\n\t\tthis.defaultEditor = new CustomEditor(this.ui, getEditorTheme(), this.keybindings, {\n\t\t\tpaddingX: editorPaddingX,\n\t\t\tautocompleteMaxVisible,\n\t\t});\n\n\t\tthis.editor = this.defaultEditor;\n\t\tthis.editorContainer = new Container();\n\t\tthis.editorContainer.addChild(this.editor as Component);\n\t\tthis.footerDataProvider = new FooterDataProvider(this.sessionManager.getCwd());\n\t\tthis.footer = new FooterComponent(\n\t\t\tthis.session,\n\t\t\tthis.footerDataProvider,\n\t\t\tundefined,\n\t\t\t() => this.navigationInlineCustomUiDepth > 0,\n\t\t);\n\t\tthis.footerContainer = new Container();\n\t\tthis.footerContainer.addChild(this.footer);\n\t\tthis.usageMeter = new UsageMeterComponent(this.session);\n\t\tthis.usageMeter.setAutoCompactEnabled(this.session.autoCompactionEnabled);\n\n\t\t// Load hide thinking block setting\n\t\tthis.hideThinkingBlock = this.settingsManager.getHideThinkingBlock();\n\t\tthis.outputPad = this.settingsManager.getOutputPad();\n\n\t\t// Register themes from resource loader and initialize\n\t\tsetRegisteredThemes(this.session.resourceLoader.getThemes().themes);\n\t\tthis.themeController = new InteractiveThemeController(this.ui, {\n\t\t\tgetSettingsManager: () => this.settingsManager,\n\t\t\tshowError: (message) => this.showError(message),\n\t\t\tonChanged: () => this.updateEditorBorderColor(),\n\t\t\tinitialThemeSetting: options.initialThemeSetting,\n\t\t});\n\t\tthis.disposeInteractiveEngineHost = attachInteractiveEngineHost(\n\t\t\truntimeHost,\n\t\t\tthis.createExtensionUIContext(),\n\t\t\t(diagnostic) =>\n\t\t\t\trenderEngineDiagnostic(diagnostic, {\n\t\t\t\t\tstopWorkingLoader: () => this.stopWorkingLoader(),\n\t\t\t\t\tshowStatus: (message, persist) => this.showStatus(message, persist),\n\t\t\t\t\tshowError: (message) => this.showError(message),\n\t\t\t\t}),\n\t\t\t{\n\t\t\t\tisFullscreen: () => this.renderer.mode === \"fullscreen\",\n\t\t\t\tonRendererReplaced: (listener) => this.onTuiRendererChange(listener),\n\t\t\t},\n\t\t\t(handler) => {\n\t\t\t\tthis.interactiveEngineShortcutHandler = handler;\n\t\t\t\tthis.defaultEditor.onExtensionShortcut = handler;\n\t\t\t\treturn () => {\n\t\t\t\t\tif (this.interactiveEngineShortcutHandler === handler) this.interactiveEngineShortcutHandler = undefined;\n\t\t\t\t\tif (this.defaultEditor.onExtensionShortcut === handler)\n\t\t\t\t\t\tthis.defaultEditor.onExtensionShortcut = undefined;\n\t\t\t\t};\n\t\t\t},\n\t\t\tthis.keybindings,\n\t\t);\n\t}\n\n\t// Maximum total widget lines to prevent viewport overflow\n\tstatic readonly MAX_WIDGET_LINES = 10;\n\n\t/**\n\t * Gracefully shutdown the agent.\n\t * Stops the TUI before emitting shutdown events so extension UI cleanup cannot\n\t * repaint the final frame while the process is exiting.\n\t */\n\tisShuttingDown = false;\n}\n"]}
1
+ {"version":3,"file":"interactive-mode-base.js","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-mode-base.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Shared state and constructor wiring for interactive mode.\n * Responsibility-specific behavior is installed by sibling modules.\n */\nimport {\n\tisKeyRelease,\n\tisViewportTUI,\n\ttype ScrollView,\n\tsetCapabilityOverrides,\n\ttype TuiInputListener,\n} from \"@earendil-works/pi-tui\";\nimport type { AgentSessionQueuePauseControl } from \"../../core/agent-session-methods.ts\";\nimport type { MarkdownTransformer } from \"../../core/extensions/types.ts\";\nimport type { FullscreenExitOutput, MermaidRenderingMode } from \"../../core/settings-manager.ts\";\nimport type { EarlyInputSnapshot } from \"../../main-early-input.ts\";\nimport { readClipboardText } from \"../../utils/clipboard.ts\";\nimport { renderEngineDiagnostic } from \"../interactive-engine/engine-diagnostic-view.js\";\nimport { attachInteractiveEngineHost } from \"../interactive-engine/extension-ui-bridge.ts\";\nimport type { RemoteToolExecutionComponent } from \"../interactive-engine/remote-renderer.ts\";\nimport { KeybindingsReloadCoordinator } from \"../rpc/rpc-keybindings-reload.ts\";\nimport type { AtomicWorkingLoader } from \"./components/atomic-working-status.ts\";\nimport { createMermaidMarkdownTransformer } from \"./components/mermaid.ts\";\nimport type { TranscriptOverlayReserve } from \"./components/reserved-bottom-overlay.ts\";\nimport { WidgetContainer } from \"./components/scroll-widget.js\";\nimport {\n\ttype AgentSession,\n\ttype AgentSessionRuntime,\n\ttype AssistantMessage,\n\ttype AssistantMessageComponent,\n\ttype AutocompleteProvider,\n\ttype AutocompleteProviderFactory,\n\ttype BashExecutionComponent,\n\ttype Component,\n\tContainer,\n\ttype CountdownTimer,\n\tCustomEditor,\n\ttype EditorComponent,\n\ttype EditorFactory,\n\ttype ExtensionEditorComponent,\n\ttype ExtensionInputComponent,\n\ttype ExtensionSelectorComponent,\n\tFooterComponent,\n\tFooterDataProvider,\n\tgetEditorTheme,\n\ttype HostCustomUiStateListener,\n\tInteractiveThemeController,\n\tKeybindingsManager,\n\ttype Loader,\n\ttype LoaderIndicatorOptions,\n\ttype Spacer,\n\tsetKeybindings,\n\tsetRegisteredThemes,\n\ttype Text,\n\ttype ToolExecutionComponent,\n\ttype TUI,\n\ttheme,\n\tUsageMeterComponent,\n\tVERSION,\n} from \"./interactive-mode-deps.ts\";\nimport type {} from \"./interactive-mode-surface.ts\";\nimport type { CompactionQueuedMessage, InteractiveModeOptions } from \"./interactive-mode-types.ts\";\nimport { StartupChatContainer } from \"./interactive-startup-chat-container.ts\";\nimport type { InteractiveSubmission } from \"./interactive-submission.ts\";\nimport {\n\tcreateInteractiveTui,\n\tcreateInteractiveTuiReference,\n\thandleFocusedOverlayInternalUiAction,\n\ttype InteractiveTui,\n\ttype InternalUiActionResult,\n} from \"./interactive-tui.ts\";\n\n/** Move the transcript and nothing else: what a reserving overlay may release. */\nconst FULLSCREEN_TRANSCRIPT_SCROLL_ACTIONS = [\n\t\"tui.altScreen.pageUp\",\n\t\"tui.altScreen.pageDown\",\n\t\"tui.altScreen.halfPageUp\",\n\t\"tui.altScreen.halfPageDown\",\n\t\"tui.altScreen.lineUp\",\n\t\"tui.altScreen.lineDown\",\n\t\"tui.altScreen.previousPrompt\",\n\t\"tui.altScreen.nextPrompt\",\n\t\"tui.altScreen.top\",\n\t\"tui.altScreen.bottom\",\n] as const;\n\nconst FULLSCREEN_VIEWPORT_ACTIONS = FULLSCREEN_TRANSCRIPT_SCROLL_ACTIONS;\n\nexport function isFullscreenViewportAction(data: string, keybindings: KeybindingsManager): boolean {\n\treturn FULLSCREEN_VIEWPORT_ACTIONS.some((action) => keybindings.matches(data, action));\n}\n\n/**\n * Whether a key scrolls the transcript. A reserving overlay — the\n * `ask_user_question` dialog, an extension component with\n * `reserveTranscriptRows` — declines these so the strip above it still pages\n * and jumps (#2378), and keeps everything else.\n */\nexport function isFullscreenTranscriptScrollAction(data: string, keybindings: KeybindingsManager): boolean {\n\treturn FULLSCREEN_TRANSCRIPT_SCROLL_ACTIONS.some((action) => keybindings.matches(data, action));\n}\n\n/**\n * Decide whether the fullscreen viewport should run before the focused\n * component. `isMouseInput` is classified by pi-tui's own mouse predicate in\n * `AtomicTuiAltScreen`, so this policy does not duplicate terminal grammars.\n * Mouse deferral is limited to actual overlays so inline components do not\n * disable pi-tui's application-owned transcript selection path.\n *\n * **Who owns viewport keys while an overlay is focused.** pi-tui 0.84.2 added\n * `shouldDeferViewportInputToOverlay()` (upstream #7894) and answers \"the\n * overlay\". Atomic answers \"the overlay first, the transcript with whatever it\n * declines\" (#2378 / PR #2381): the actions in `FULLSCREEN_VIEWPORT_ACTIONS`\n * and wheel reports are offered to the focused overlay, and\n * `AtomicTuiAltScreen` replays what it does not consume into pi-tui's viewport\n * listener. Atomic's answer stands, because a mounted dialog that keeps its\n * selection keys must not also freeze the transcript behind it.\n *\n * **The list covers every `tui.altScreen.*` scroll action pi-tui defines.**\n * An action a focused overlay declines still reaches the transcript, so the\n * shortcut is never simply lost.\n *\n * **A focused overlay with no `handleInput` is still an overlay.** The handler\n * is optional — `ExtensionCustomComponent` marks it `handleInput?` and\n * `docs/tui.md` documents it as optional — and a component that cannot answer\n * declines by definition. Answering \"the viewport owns it\" for that shape\n * would hand the key to pi-tui, whose native deferral then drops it because an\n * overlay holds focus, so the transcript would freeze behind a component that\n * never asked for the key. A handler-less overlay therefore takes the same\n * route as one that returns `false`: nothing to offer, then replay. Only a\n * focused component that is *not* an overlay keeps the shortcut, because\n * pi-tui defers nothing to it.\n */\nexport function shouldHandleFullscreenViewportInput(\n\tfocused: Component | null,\n\teditor: Component,\n\tdata: string,\n\tisMouseInput: boolean,\n\tfocusedIsOverlay: boolean,\n\tkeybindings: KeybindingsManager,\n\t_focusedIsViewportSearch = false,\n): boolean {\n\tif (focused === editor || !focused) return true;\n\tif (!focused.handleInput && !focusedIsOverlay) return true;\n\tif (isMouseInput) return !focusedIsOverlay;\n\tif (focusedIsOverlay && keybindings.matches(data, \"app.thinking.toggle\")) return false;\n\treturn !isFullscreenViewportAction(data, keybindings);\n}\n\nfunction isCommandLikeStartupInput(text: string): boolean {\n\tconst trimmed = text.trimStart();\n\treturn trimmed.startsWith(\"/\") || trimmed.startsWith(\"!\");\n}\n\nexport function seedStartupInput(\n\tpendingUserInputs: InteractiveSubmission[],\n\teditor: { setText(text: string): void },\n\tstartupInput: EarlyInputSnapshot | undefined,\n\tstartupReplayInputs: string[] = [],\n\tsetStartupDraftText?: (text: string) => void,\n\tsetStartupReplayActiveInput?: (text: string) => void,\n): void {\n\tif (!startupInput) return;\n\tlet commandReplayStarted = false;\n\tfor (const submission of startupInput.submissions) {\n\t\tif (commandReplayStarted) {\n\t\t\tstartupReplayInputs.push(submission);\n\t\t} else if (isCommandLikeStartupInput(submission)) {\n\t\t\tconst commandText = submission.trim();\n\t\t\tcommandReplayStarted = true;\n\t\t\teditor.setText(commandText);\n\t\t\tsetStartupReplayActiveInput?.(commandText);\n\t\t} else {\n\t\t\tpendingUserInputs.push({ text: submission, draft: submission });\n\t\t}\n\t}\n\tif (startupInput.text.length === 0) return;\n\tif (commandReplayStarted) {\n\t\tsetStartupDraftText?.(startupInput.text);\n\t} else {\n\t\teditor.setText(startupInput.text);\n\t}\n}\n\nexport interface InteractiveTuiInputSubscription {\n\thandler: TuiInputListener;\n\tunsubscribe: () => void;\n}\n\ninterface WorkingStatusEditor extends EditorComponent {\n\treadonly embedWorkingStatus: boolean;\n\tsetWorkingStatusIndicator(indicator: AtomicWorkingLoader | undefined): void;\n}\n\nfunction isWorkingStatusEditor(editor: EditorComponent): editor is WorkingStatusEditor {\n\treturn (\n\t\t\"embedWorkingStatus\" in editor &&\n\t\teditor.embedWorkingStatus === true &&\n\t\t\"setWorkingStatusIndicator\" in editor &&\n\t\ttypeof editor.setWorkingStatusIndicator === \"function\"\n\t);\n}\n\nexport class InteractiveModeBase {\n\truntimeHost: AgentSessionRuntime;\n\n\tui: TUI;\n\tprivate renderer: InteractiveTui;\n\n\tprivate readonly shouldHandleViewportInput = (\n\t\tdata: string,\n\t\tisMouseInput: boolean,\n\t\tfocusedIsOverlay: boolean,\n\t\tfocusedIsViewportSearch: boolean,\n\t): boolean => {\n\t\treturn shouldHandleFullscreenViewportInput(\n\t\t\tthis.renderer.getFocusedComponent(),\n\t\t\tthis.editor,\n\t\t\tdata,\n\t\t\tisMouseInput,\n\t\t\tfocusedIsOverlay,\n\t\t\tthis.keybindings,\n\t\t\tfocusedIsViewportSearch,\n\t\t);\n\t};\n\tprivate readonly onOverlayUnhandledInput = (data: string): boolean => this.handleOverlayUnhandledInput(data);\n\tprivate readonly onOverlayInternalUiAction = (url: string): InternalUiActionResult =>\n\t\thandleFocusedOverlayInternalUiAction(this.renderer, url);\n\n\t/** Dispatch the host thinking action after a focused workflow overlay declines input. */\n\thandleOverlayUnhandledInput(data: string): boolean {\n\t\tif (isKeyRelease(data) || !this.keybindings.matches(data, \"app.thinking.toggle\")) return false;\n\t\t// Reuse the default editor's action dispatcher even while a workflow\n\t\t// overlay owns focus. This keeps the host binding and its user remap as\n\t\t// the source of truth instead of calling the implementation directly.\n\t\treturn this.defaultEditor.handleInput(data);\n\t}\n\n\tsetFullscreenCopyOnSelect(enabled: boolean): void {\n\t\tif (this.renderer.mode === \"fullscreen\") this.renderer.setCopyOnSelect(enabled);\n\t}\n\n\tprivate readonly onRightClickPaste = (): void => {\n\t\tvoid this.handleRightClickPaste();\n\t};\n\n\tchatContainer: Container;\n\tdocumentContainer: Container;\n\n\ttranscriptScrollView: ScrollView | undefined;\n\n\tfullscreenLayoutRoot: Component | undefined;\n\n\tresourceDisclosureContainer: Container;\n\tstartupNoticesContainer: Container;\n\tpendingMessagesContainer: Container;\n\n\tstatusContainer: Container;\n\n\tdefaultEditor: CustomEditor;\n\n\teditor: EditorComponent;\n\n\teditorComponentFactory: EditorFactory | undefined;\n\n\tautocompleteProvider: AutocompleteProvider | undefined;\n\n\tautocompleteProviderWrappers: AutocompleteProviderFactory[] = [];\n\n\tfdPath: string | undefined;\n\n\teditorContainer: Container;\n\n\tactiveSelectorToken: object | undefined;\n\n\tactiveSelectorDispose: (() => void) | undefined;\n\n\tfooter: FooterComponent;\n\tfooterContainer: Container;\n\n\tusageMeter: UsageMeterComponent;\n\n\tfooterDataProvider: FooterDataProvider;\n\n\t// Stored so the same manager can be injected into custom editors, selectors, and extension UI.\n\tkeybindings: KeybindingsManager;\n\n\treloadCoordinator: KeybindingsReloadCoordinator;\n\n\tinteractiveEngineShortcutHandler: ((data: string) => boolean) | undefined;\n\n\tdisposeInteractiveEngineHost: () => void = () => {};\n\tdisposeMarkitDiagnosticSink: () => void = () => {};\n\n\tversion: string;\n\n\tisInitialized = false;\n\n\tonInputCallback?: (submission: InteractiveSubmission) => void;\n\n\tpendingUserInputs: InteractiveSubmission[] = [];\n\n\tstartupReplayInputs: string[] = [];\n\n\tstartupReplayActiveInput: string | undefined = undefined;\n\n\tstartupDraftText: string | undefined = undefined;\n\tworkingIndicatorEmbedded = false;\n\n\tstartupCookedInputRecovered = false;\n\n\tdeferredRenderedUserInputs: string[] = [];\n\n\tdeferredRenderedUserInputComponents = new Map<string, Component[][]>();\n\n\tloadingAnimation: Loader | AtomicWorkingLoader | undefined = undefined;\n\n\tworkingMessage: string | undefined = undefined;\n\n\tworkingVisible = true;\n\n\tworkingIndicatorOptions: LoaderIndicatorOptions | undefined = undefined;\n\n\treadonly defaultWorkingMessage = \"Working\";\n\n\treadonly defaultHiddenThinkingLabel = \"Thinking...\";\n\n\thiddenThinkingLabel = this.defaultHiddenThinkingLabel;\n\n\tlastSigintTime = 0;\n\n\tlastEscapeTime = 0;\n\n\tchangelogMarkdown: string | undefined = undefined;\n\n\tstartupNoticesShown = false;\n\t/** Last model-catalog warning already shown, so the deferred re-read only speaks on a change. */\n\treportedModelCatalogWarning: string | undefined;\n\tstartupNoticesPrepared = false;\n\n\tanthropicSubscriptionWarningShown = false;\n\n\tfirstRunNoticeVisible = false;\n\n\thadLastChangelogVersionAtStartup = false;\n\n\tfirstRunOnboardingNoticeComponents: Component[] = [];\n\n\tautoTrustOnReloadCwd: string | undefined;\n\n\t// Status line tracking (for mutating immediately-sequential status updates)\n\tlastStatusSpacer: Spacer | undefined = undefined;\n\n\tlastStatusText: Text | undefined = undefined;\n\n\t/** Leading spacer added once for the managed-tool startup status block. */\n\tmanagedToolStatusStarted = false;\n\t/** Invalidates readiness callbacks after the transcript is rebuilt for another session. */\n\tmanagedToolStatusGeneration = 0;\n\n\t// Streaming message tracking\n\tstreamingComponent: AssistantMessageComponent | undefined = undefined;\n\n\tstreamingMessage: AssistantMessage | undefined = undefined;\n\n\t// Tool execution tracking: toolCallId -> component\n\tpendingTools = new Map<string, ToolExecutionComponent | RemoteToolExecutionComponent>();\n\n\t// Tool output expansion state\n\ttoolOutputExpanded = false;\n\n\t// Thinking block visibility state\n\thideThinkingBlock = false;\n\toutputPad: 0 | 1 = 1;\n\n\tmermaidMarkdownTransformer: MarkdownTransformer = createMermaidMarkdownTransformer({\n\t\tgetMode: () => this.settingsManager.getMermaidRenderingMode(),\n\t\ttheme,\n\t});\n\tmermaidMarkdownTransformerMode: MermaidRenderingMode | undefined;\n\n\t// Skill commands: command name -> skill file path\n\tskillCommands = new Map<string, string>();\n\n\t// Agent subscription unsubscribe function\n\tunsubscribe?: () => void;\n\n\tsignalCleanupHandlers: Array<() => void> = [];\n\n\t// Track if editor is in bash mode (text starts with !)\n\tisBashMode = false;\n\n\t// Track current bash execution component\n\tbashComponent: BashExecutionComponent | undefined = undefined;\n\n\t// Track pending bash components (shown in pending area, moved to chat on submit)\n\tpendingBashComponents: BashExecutionComponent[] = [];\n\n\t// Auto-compaction state\n\tautoCompactionLoader: AtomicWorkingLoader | undefined = undefined;\n\n\tautoCompactionEscapeHandler?: () => void;\n\n\t/** True once the pre-compaction Escape handler has been captured for restore. */\n\tautoCompactionEscapeHandlerSaved = false;\n\n\t/** True while `runUserPromptTurn()` owns the working loader. */\n\tpromptTurnWorkingLoaderActive = false;\n\n\t// Auto-retry state\n\tretryLoader: AtomicWorkingLoader | undefined = undefined;\n\tfallbackLoader: Loader | undefined = undefined;\n\n\tretryCountdown: CountdownTimer | undefined = undefined;\n\n\tretryEscapeHandler?: () => void;\n\n\t// Messages queued while compaction is running\n\tcompactionQueuedMessages: CompactionQueuedMessage[] = [];\n\n\t/** Keeps input queued while automatic compaction hands off to a manual request. */\n\tmanualCompactionTakeoverPending = false;\n\n\t// Deferred extension load state (first paint happens before extensions load)\n\tdeferredStartupPending = false;\n\tinitialStartupBinding = false;\n\tdeferredStartupPromise: Promise<void> | undefined = undefined;\n\n\tinputHandlerReadyRecorded = false;\n\n\tfirstSubmitRecorded = false;\n\n\t// Shutdown state\n\tshutdownRequested = false;\n\n\t// Extension UI state\n\textensionSelector: ExtensionSelectorComponent | undefined = undefined;\n\n\textensionInput: ExtensionInputComponent | undefined = undefined;\n\n\textensionEditor: ExtensionEditorComponent | undefined = undefined;\n\n\ttuiInputSubscriptions = new Set<InteractiveTuiInputSubscription>();\n\n\textensionTerminalInputSubscriptions = new Set<InteractiveTuiInputSubscription>();\n\n\ttuiRendererChangeListeners = new Set<() => void>();\n\n\tblockingInlineCustomUiDepth = 0;\n\n\tnavigationInlineCustomUiDepth = 0;\n\n\tdeferredInlineCustomUiFocusDepth = 0;\n\n\tpendingInlineCustomUiFocus: Component | undefined = undefined;\n\n\t/** Pending inline mounts in display order, oldest first. */\n\tinlineCustomUiStack: { component: Component }[] = [];\n\n\thostCustomUiStateListeners = new Set<HostCustomUiStateListener>();\n\n\twidgetReleaseListeners = new Map<string, Set<() => void>>();\n\n\ttranscriptOverlayReserve: TranscriptOverlayReserve | undefined = undefined;\n\n\tthemeController: InteractiveThemeController;\n\n\t// Extension widgets (components rendered above/below the editor)\n\textensionWidgetsAbove = new Map<string, Component & { dispose?(): void }>();\n\n\textensionWidgetsBelow = new Map<string, Component & { dispose?(): void }>();\n\n\twidgetContainerAbove!: Container;\n\n\twidgetContainerBelow!: Container;\n\n\t// Custom footer from extension (undefined = use built-in footer)\n\tcustomFooter: (Component & { dispose?(): void }) | undefined = undefined;\n\n\t// Header container that holds the built-in or custom header\n\theaderContainer: Container;\n\n\t// Built-in header (logo + keybinding hints + changelog)\n\tbuiltInHeader: Component | undefined = undefined;\n\n\t// Custom header from extension (undefined = use built-in header)\n\tcustomHeader: (Component & { dispose?(): void }) | undefined = undefined;\n\n\t// Convenience accessors\n\tget session(): AgentSession & AgentSessionQueuePauseControl {\n\t\treturn this.runtimeHost.session as AgentSession & AgentSessionQueuePauseControl;\n\t}\n\n\t/** Includes the short handoff window that an isolated engine cannot mirror. */\n\tget compactionActive(): boolean {\n\t\treturn this.session.isCompacting || this.manualCompactionTakeoverPending;\n\t}\n\n\tget agent() {\n\t\treturn this.session.agent;\n\t}\n\n\tget sessionManager() {\n\t\treturn this.session.sessionManager;\n\t}\n\n\tget settingsManager() {\n\t\treturn this.session.settingsManager;\n\t}\n\n\t/**\n\t * Tears down the selector that owns `editorContainer`, including in-flight\n\t * work such as a model catalog refresh.\n\t *\n\t * This lives on the base class so behavior modules can dispose a selector\n\t * without relying on `interactive-selectors.ts` load order.\n\t */\n\tdisposeActiveSelector(): void {\n\t\tconst dispose = this.activeSelectorDispose;\n\t\tthis.activeSelectorToken = undefined;\n\t\tthis.activeSelectorDispose = undefined;\n\t\tdispose?.();\n\t}\n\n\taddTuiInputListener(handler: TuiInputListener): () => void {\n\t\tconst subscription: InteractiveTuiInputSubscription = {\n\t\t\thandler,\n\t\t\tunsubscribe: this.ui.addInputListener(handler),\n\t\t};\n\t\tthis.tuiInputSubscriptions.add(subscription);\n\t\treturn () => {\n\t\t\tsubscription.unsubscribe();\n\t\t\tthis.tuiInputSubscriptions.delete(subscription);\n\t\t};\n\t}\n\n\trebindTuiInputListeners(): void {\n\t\tfor (const subscription of this.tuiInputSubscriptions) {\n\t\t\tsubscription.unsubscribe();\n\t\t\tsubscription.unsubscribe = this.ui.addInputListener(subscription.handler);\n\t\t}\n\t}\n\n\tonTuiRendererChange(listener: () => void): () => void {\n\t\tthis.tuiRendererChangeListeners.add(listener);\n\t\treturn () => this.tuiRendererChangeListeners.delete(listener);\n\t}\n\n\tmountInteractiveTui(tui: TUI, components: readonly Component[]): void {\n\t\tfor (const component of components) tui.addChild(component);\n\t\tif (isViewportTUI(tui)) {\n\t\t\tif (!this.fullscreenLayoutRoot) throw new Error(\"Fullscreen layout is not initialized\");\n\t\t\ttui.setLayoutRoot(this.fullscreenLayoutRoot);\n\t\t}\n\t}\n\n\tprivate async handleRightClickPaste(): Promise<void> {\n\t\tconst target = this.renderer.getFocusedComponent();\n\t\tconst handleInput = target?.handleInput;\n\t\tif (!target || !handleInput) return;\n\t\ttry {\n\t\t\tconst text = await readClipboardText();\n\t\t\tif (!text || this.renderer.getFocusedComponent() !== target) return;\n\t\t\thandleInput.call(target, `\\x1b[200~${text}\\x1b[201~`);\n\t\t\tthis.ui.requestRender();\n\t\t} catch {\n\t\t\t// Clipboard paste is best-effort; permission and native-module failures are common.\n\t\t}\n\t}\n\n\tstopInteractiveTui(fullscreenExitOutput: FullscreenExitOutput): void {\n\t\tconst isFullscreen = this.renderer.mode === \"fullscreen\";\n\t\tif (isFullscreen && fullscreenExitOutput === \"transcript\") {\n\t\t\t// Atomic has no regular renderer to switch into, so pi-tui's own\n\t\t\t// exit paint is the only painter: its stop renders the layout root\n\t\t\t// at natural height onto the main screen. The docked fullscreen\n\t\t\t// layout squeezes its scroll view to `basis` (one row) at natural\n\t\t\t// height, so hand it the document container directly — the exit\n\t\t\t// paint then carries the whole transcript. Drop overlays first so\n\t\t\t// what gets painted is the transcript, not the focused dialog.\n\t\t\twhile (this.renderer.hasOverlayEntries) this.renderer.hideOverlay();\n\t\t\tif (isViewportTUI(this.renderer)) this.renderer.setLayoutRoot(this.documentContainer);\n\t\t}\n\t\t// `resume-hint` keeps whatever the alternate screen held: the prior\n\t\t// shell contents reappear and shutdown prints only the resume line.\n\t\tthis.ui.stop({ preserveScreen: isFullscreen && fullscreenExitOutput === \"resume-hint\" });\n\t\tthis.disposeMarkitDiagnosticSink();\n\t}\n\n\tdeclare options: InteractiveModeOptions;\n\n\tsetEditorWorkingStatusIndicator(indicator: AtomicWorkingLoader | undefined): boolean {\n\t\tthis.defaultEditor.setWorkingStatusIndicator(undefined);\n\t\tif (!isWorkingStatusEditor(this.editor)) return false;\n\t\tthis.editor.setWorkingStatusIndicator(indicator);\n\t\treturn true;\n\t}\n\n\tconstructor(runtimeHost: AgentSessionRuntime, options: InteractiveModeOptions = {}) {\n\t\tthis.runtimeHost = runtimeHost;\n\t\tthis.options = options;\n\t\tthis.deferredStartupPending = Boolean(options.deferredExtensionLoad);\n\t\tthis.autoTrustOnReloadCwd = options.autoTrustOnReloadCwd;\n\t\tthis.runtimeHost.setBeforeSessionInvalidate(() => {\n\t\t\tthis.resetExtensionUI();\n\t\t});\n\t\tthis.runtimeHost.setRebindSession(async () => {\n\t\t\tawait this.rebindCurrentSession();\n\t\t\t// A rebound session can carry a different settings manager; re-apply\n\t\t\t// the theme so the live selection tracks the session that is current.\n\t\t\tawait this.themeController.applyFromSettings();\n\t\t});\n\t\tsetCapabilityOverrides(this.settingsManager.getTerminalCapabilityOverrides());\n\t\tthis.version = VERSION;\n\t\tthis.renderer = createInteractiveTui({\n\t\t\tshowHardwareCursor: this.settingsManager.getShowHardwareCursor(),\n\t\t\tlogDirectory: runtimeHost.services.agentDir,\n\t\t\tterminal: options.terminal,\n\t\t\tcopyOnSelect: this.settingsManager.getFullscreenCopyOnSelect(),\n\t\t\tonRightClickPaste: this.onRightClickPaste,\n\t\t\tshouldHandleViewportInput: this.shouldHandleViewportInput,\n\t\t\tonOverlayUnhandledInput: this.onOverlayUnhandledInput,\n\t\t\tonOverlayInternalUiAction: this.onOverlayInternalUiAction,\n\t\t\tonInternalUiAction: () => {\n\t\t\t\tthis.jumpToTranscriptEnd();\n\t\t\t\treturn undefined;\n\t\t\t},\n\t\t});\n\t\tthis.ui = createInteractiveTuiReference(() => this.renderer);\n\t\tthis.ui.setClearOnShrink(this.settingsManager.getClearOnShrink());\n\t\tthis.headerContainer = new Container();\n\t\tthis.documentContainer = new Container();\n\t\tthis.documentContainer.addChild(this.headerContainer);\n\t\tthis.chatContainer = new StartupChatContainer();\n\t\tthis.documentContainer.addChild(this.chatContainer);\n\t\tthis.resourceDisclosureContainer = new Container();\n\t\tthis.startupNoticesContainer = new Container();\n\t\t// The isolated engine can emit session_start UI requests as soon as its\n\t\t// bridge attaches below, before init() mounts chat in the TUI. Reserve the\n\t\t// ordering slots now so those messages can never precede RESOURCES.\n\t\tthis.chatContainer.addChild(this.resourceDisclosureContainer);\n\t\tthis.chatContainer.addChild(this.startupNoticesContainer);\n\t\tthis.pendingMessagesContainer = new Container();\n\t\tthis.statusContainer = new Container();\n\t\tthis.widgetContainerAbove = new WidgetContainer();\n\t\tthis.widgetContainerBelow = new WidgetContainer();\n\t\tthis.keybindings = KeybindingsManager.create(runtimeHost.services.agentDir);\n\t\tthis.reloadCoordinator = new KeybindingsReloadCoordinator(this.keybindings);\n\t\tsetKeybindings(this.keybindings);\n\t\tconst editorPaddingX = this.settingsManager.getEditorPaddingX();\n\t\tconst autocompleteMaxVisible = this.settingsManager.getAutocompleteMaxVisible();\n\t\tthis.defaultEditor = new CustomEditor(this.ui, getEditorTheme(), this.keybindings, {\n\t\t\tpaddingX: editorPaddingX,\n\t\t\tautocompleteMaxVisible,\n\t\t});\n\n\t\tthis.editor = this.defaultEditor;\n\t\tthis.editorContainer = new Container();\n\t\tthis.editorContainer.addChild(this.editor as Component);\n\t\tthis.footerDataProvider = new FooterDataProvider(this.sessionManager.getCwd());\n\t\tthis.footer = new FooterComponent(\n\t\t\tthis.session,\n\t\t\tthis.footerDataProvider,\n\t\t\tundefined,\n\t\t\t() => this.navigationInlineCustomUiDepth > 0,\n\t\t);\n\t\tthis.footerContainer = new Container();\n\t\tthis.footerContainer.addChild(this.footer);\n\t\tthis.usageMeter = new UsageMeterComponent(this.session);\n\t\tthis.usageMeter.setAutoCompactEnabled(this.session.autoCompactionEnabled);\n\n\t\t// Load hide thinking block setting\n\t\tthis.hideThinkingBlock = this.settingsManager.getHideThinkingBlock();\n\t\tthis.outputPad = this.settingsManager.getOutputPad();\n\n\t\t// Register themes from resource loader and initialize\n\t\tsetRegisteredThemes(this.session.resourceLoader.getThemes().themes);\n\t\tthis.themeController = new InteractiveThemeController(this.ui, {\n\t\t\tgetSettingsManager: () => this.settingsManager,\n\t\t\tshowError: (message) => this.showError(message),\n\t\t\tonChanged: () => this.updateEditorBorderColor(),\n\t\t\tinitialThemeSetting: options.initialThemeSetting,\n\t\t});\n\t\tthis.disposeInteractiveEngineHost = attachInteractiveEngineHost(\n\t\t\truntimeHost,\n\t\t\tthis.createExtensionUIContext(),\n\t\t\t(diagnostic) =>\n\t\t\t\trenderEngineDiagnostic(diagnostic, {\n\t\t\t\t\tstopWorkingLoader: () => this.stopWorkingLoader(),\n\t\t\t\t\tshowStatus: (message, persist) => this.showStatus(message, persist),\n\t\t\t\t\tshowError: (message) => this.showError(message),\n\t\t\t\t}),\n\t\t\t{\n\t\t\t\tisFullscreen: () => this.renderer.mode === \"fullscreen\",\n\t\t\t\tonRendererReplaced: (listener) => this.onTuiRendererChange(listener),\n\t\t\t},\n\t\t\t(handler) => {\n\t\t\t\tthis.interactiveEngineShortcutHandler = handler;\n\t\t\t\tthis.defaultEditor.onExtensionShortcut = handler;\n\t\t\t\treturn () => {\n\t\t\t\t\tif (this.interactiveEngineShortcutHandler === handler) this.interactiveEngineShortcutHandler = undefined;\n\t\t\t\t\tif (this.defaultEditor.onExtensionShortcut === handler)\n\t\t\t\t\t\tthis.defaultEditor.onExtensionShortcut = undefined;\n\t\t\t\t};\n\t\t\t},\n\t\t\tthis.keybindings,\n\t\t);\n\t}\n\n\t// Maximum total widget lines to prevent viewport overflow\n\tstatic readonly MAX_WIDGET_LINES = 10;\n\n\t/**\n\t * Gracefully shutdown the agent.\n\t * Stops the TUI before emitting shutdown events so extension UI cleanup cannot\n\t * repaint the final frame while the process is exiting.\n\t */\n\tisShuttingDown = false;\n}\n"]}
@@ -4,6 +4,9 @@ export function isExpandable(obj) {
4
4
  return typeof obj === "object" && obj !== null && "setExpanded" in obj && typeof obj.setExpanded === "function";
5
5
  }
6
6
  export class ExpandableText extends Text {
7
+ expanded;
8
+ contentWidth;
9
+ textPaddingX;
7
10
  constructor(getCollapsedText, getExpandedText, expanded = false, paddingX = 0, paddingY = 0) {
8
11
  super(expanded ? getExpandedText() : getCollapsedText(), paddingX, paddingY);
9
12
  this.getCollapsedText = getCollapsedText;