@bastani/atomic 0.9.19-alpha.1 → 0.9.19-alpha.2

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 (698) hide show
  1. package/CHANGELOG.md +94 -0
  2. package/dist/builtin/intercom/CHANGELOG.md +16 -0
  3. package/dist/builtin/intercom/README.md +21 -11
  4. package/dist/builtin/intercom/broker/broker.ts +73 -9
  5. package/dist/builtin/intercom/broker/client.ts +4 -0
  6. package/dist/builtin/intercom/broker/framing.ts +5 -2
  7. package/dist/builtin/intercom/broker/group-membership.ts +4 -2
  8. package/dist/builtin/intercom/broker/presence-handler.ts +14 -0
  9. package/dist/builtin/intercom/broker/send-handler.ts +34 -5
  10. package/dist/builtin/intercom/broker/terminal-questions.ts +29 -0
  11. package/dist/builtin/intercom/index.bundle.mjs +936 -740
  12. package/dist/builtin/intercom/package.json +2 -2
  13. package/dist/builtin/intercom/recipient-purpose.ts +9 -0
  14. package/dist/builtin/intercom/recoverable-disconnect.ts +2 -3
  15. package/dist/builtin/intercom/retry-policy.ts +4 -2
  16. package/dist/builtin/intercom/skills/intercom/SKILL.md +5 -4
  17. package/dist/builtin/intercom/types.ts +16 -2
  18. package/dist/builtin/mcp/CHANGELOG.md +6 -0
  19. package/dist/builtin/mcp/README.md +2 -0
  20. package/dist/builtin/mcp/index.bundle.mjs +2201 -12000
  21. package/dist/builtin/mcp/package.json +2 -2
  22. package/dist/builtin/subagents/CHANGELOG.md +27 -0
  23. package/dist/builtin/subagents/README.md +33 -12
  24. package/dist/builtin/subagents/agents/code-simplifier.md +1 -1
  25. package/dist/builtin/subagents/agents/codebase-analyzer.md +1 -1
  26. package/dist/builtin/subagents/agents/codebase-locator.md +2 -2
  27. package/dist/builtin/subagents/agents/codebase-online-researcher.md +1 -1
  28. package/dist/builtin/subagents/agents/codebase-pattern-finder.md +2 -2
  29. package/dist/builtin/subagents/agents/codebase-research-analyzer.md +1 -1
  30. package/dist/builtin/subagents/agents/codebase-research-locator.md +2 -2
  31. package/dist/builtin/subagents/agents/debugger.md +1 -1
  32. package/dist/builtin/subagents/agents/worker.md +1 -1
  33. package/dist/builtin/subagents/package.json +2 -2
  34. package/dist/builtin/subagents/skills/herdr/LICENSE +201 -0
  35. package/dist/builtin/subagents/skills/herdr/SKILL.md +202 -0
  36. package/dist/builtin/subagents/skills/subagent/SKILL.md +14 -10
  37. package/dist/builtin/subagents/skills/tmux/SKILL.md +1 -1
  38. package/dist/builtin/subagents/src/extension/index.bundle.mjs +1284 -609
  39. package/dist/builtin/web-access/index.bundle.mjs +26280 -26274
  40. package/dist/builtin/web-access/package.json +2 -2
  41. package/dist/builtin/workflows/CHANGELOG.md +38 -0
  42. package/dist/builtin/workflows/README.md +1 -1
  43. package/dist/builtin/workflows/builtin/adversarial-verification.js +5 -7
  44. package/dist/builtin/workflows/builtin/{chunk-reqr3sr3.js → chunk-1kx4aggw.js} +22 -22
  45. package/dist/builtin/workflows/builtin/{chunk-42s7sw0b.js → chunk-62v3gg9f.js} +9 -9
  46. package/dist/builtin/workflows/builtin/{chunk-wgccch41.js → chunk-6w6cvk6b.js} +16 -16
  47. package/dist/builtin/workflows/builtin/{chunk-zbekjqew.js → chunk-a2kdsqn8.js} +4 -4
  48. package/dist/builtin/workflows/builtin/{chunk-ze5x3d1r.js → chunk-fg9esgkj.js} +7 -7
  49. package/dist/builtin/workflows/builtin/{chunk-n8h4yyew.js → chunk-g0csgs7w.js} +11 -11
  50. package/dist/builtin/workflows/builtin/{chunk-79fjkcvh.js → chunk-hbnwv56f.js} +17 -17
  51. package/dist/builtin/workflows/builtin/{chunk-ed4jfn5t.js → chunk-mygmtz6e.js} +43 -43
  52. package/dist/builtin/workflows/builtin/{chunk-7430zyas.js → chunk-p8jjwfg6.js} +1 -1
  53. package/dist/builtin/workflows/builtin/{chunk-hqpe2cyx.js → chunk-r9qq7xfj.js} +49 -49
  54. package/dist/builtin/workflows/builtin/{chunk-k3w87x8y.js → chunk-t6x2d78s.js} +10 -10
  55. package/dist/builtin/workflows/builtin/{chunk-6fqs7c01.js → chunk-z0d03ktm.js} +1 -1
  56. package/dist/builtin/workflows/builtin/{chunk-b0v2xab1.js → chunk-zggjyg5z.js} +221 -23
  57. package/dist/builtin/workflows/builtin/classify-and-act.js +5 -6
  58. package/dist/builtin/workflows/builtin/fan-out-and-synthesize.js +3 -4
  59. package/dist/builtin/workflows/builtin/generate-and-filter.js +5 -6
  60. package/dist/builtin/workflows/builtin/goal.js +7 -8
  61. package/dist/builtin/workflows/builtin/index.js +20 -22
  62. package/dist/builtin/workflows/builtin/loop-until-done.js +5 -6
  63. package/dist/builtin/workflows/builtin/open-claude-design.js +3 -3
  64. package/dist/builtin/workflows/builtin/ralph.js +7 -8
  65. package/dist/builtin/workflows/builtin/steering-context.js +3 -3
  66. package/dist/builtin/workflows/builtin/tournament.js +5 -7
  67. package/dist/builtin/workflows/package.json +2 -2
  68. package/dist/builtin/workflows/src/extension/index.bundle.mjs +26654 -25831
  69. package/dist/builtin/workflows/src/index.js +907 -473
  70. package/dist/cli/config-selector.js.map +1 -1
  71. package/dist/cli/startup-ui.d.ts +1 -1
  72. package/dist/cli/startup-ui.js.map +1 -1
  73. package/dist/core/agent-session-auto-compaction.d.ts.map +1 -1
  74. package/dist/core/agent-session-auto-compaction.js +5 -4
  75. package/dist/core/agent-session-auto-compaction.js.map +1 -1
  76. package/dist/core/agent-session-bash.d.ts +1 -1
  77. package/dist/core/agent-session-bash.d.ts.map +1 -1
  78. package/dist/core/agent-session-bash.js +5 -1
  79. package/dist/core/agent-session-bash.js.map +1 -1
  80. package/dist/core/agent-session-compaction.d.ts +1 -1
  81. package/dist/core/agent-session-compaction.js.map +1 -1
  82. package/dist/core/agent-session-custom-message-commit.d.ts +1 -1
  83. package/dist/core/agent-session-custom-message-commit.js.map +1 -1
  84. package/dist/core/agent-session-delivery-forwarding.d.ts +1 -1
  85. package/dist/core/agent-session-delivery-forwarding.js.map +1 -1
  86. package/dist/core/agent-session-events.d.ts.map +1 -1
  87. package/dist/core/agent-session-events.js +5 -0
  88. package/dist/core/agent-session-events.js.map +1 -1
  89. package/dist/core/agent-session-export.d.ts +1 -1
  90. package/dist/core/agent-session-export.js.map +1 -1
  91. package/dist/core/agent-session-extension-bindings.d.ts +8 -1
  92. package/dist/core/agent-session-extension-bindings.d.ts.map +1 -1
  93. package/dist/core/agent-session-extension-bindings.js +45 -3
  94. package/dist/core/agent-session-extension-bindings.js.map +1 -1
  95. package/dist/core/agent-session-message-queue.d.ts +1 -1
  96. package/dist/core/agent-session-message-queue.js.map +1 -1
  97. package/dist/core/agent-session-methods.d.ts +14 -7
  98. package/dist/core/agent-session-methods.d.ts.map +1 -1
  99. package/dist/core/agent-session-methods.js.map +1 -1
  100. package/dist/core/agent-session-prompt.d.ts +2 -2
  101. package/dist/core/agent-session-prompt.d.ts.map +1 -1
  102. package/dist/core/agent-session-prompt.js +22 -18
  103. package/dist/core/agent-session-prompt.js.map +1 -1
  104. package/dist/core/agent-session-runtime-auth.d.ts +1 -1
  105. package/dist/core/agent-session-runtime-auth.js.map +1 -1
  106. package/dist/core/agent-session-runtime.d.ts +13 -4
  107. package/dist/core/agent-session-runtime.d.ts.map +1 -1
  108. package/dist/core/agent-session-runtime.js +27 -4
  109. package/dist/core/agent-session-runtime.js.map +1 -1
  110. package/dist/core/agent-session-services.d.ts +5 -1
  111. package/dist/core/agent-session-services.d.ts.map +1 -1
  112. package/dist/core/agent-session-services.js +44 -34
  113. package/dist/core/agent-session-services.js.map +1 -1
  114. package/dist/core/agent-session-state.d.ts +1 -1
  115. package/dist/core/agent-session-state.js.map +1 -1
  116. package/dist/core/agent-session-tasks.d.ts +9 -0
  117. package/dist/core/agent-session-tasks.d.ts.map +1 -0
  118. package/dist/core/agent-session-tasks.js +113 -0
  119. package/dist/core/agent-session-tasks.js.map +1 -0
  120. package/dist/core/agent-session-tool-registry.d.ts +1 -0
  121. package/dist/core/agent-session-tool-registry.d.ts.map +1 -1
  122. package/dist/core/agent-session-tool-registry.js +30 -5
  123. package/dist/core/agent-session-tool-registry.js.map +1 -1
  124. package/dist/core/agent-session-tree.d.ts.map +1 -1
  125. package/dist/core/agent-session-tree.js +3 -0
  126. package/dist/core/agent-session-tree.js.map +1 -1
  127. package/dist/core/agent-session-types.d.ts +2 -2
  128. package/dist/core/agent-session-types.js.map +1 -1
  129. package/dist/core/agent-session.d.ts +4 -1
  130. package/dist/core/agent-session.d.ts.map +1 -1
  131. package/dist/core/agent-session.js +7 -1
  132. package/dist/core/agent-session.js.map +1 -1
  133. package/dist/core/bash-executor.d.ts +1 -1
  134. package/dist/core/bash-executor.js.map +1 -1
  135. package/dist/core/export-html/index.js.map +1 -1
  136. package/dist/core/export-html/tool-renderer.d.ts +1 -1
  137. package/dist/core/export-html/tool-renderer.js.map +1 -1
  138. package/dist/core/extension-session-state.js.map +1 -1
  139. package/dist/core/extensions/agent-events.d.ts +4 -4
  140. package/dist/core/extensions/agent-events.d.ts.map +1 -1
  141. package/dist/core/extensions/agent-events.js.map +1 -1
  142. package/dist/core/extensions/api-types.d.ts +8 -2
  143. package/dist/core/extensions/api-types.d.ts.map +1 -1
  144. package/dist/core/extensions/api-types.js.map +1 -1
  145. package/dist/core/extensions/context-types.d.ts +9 -0
  146. package/dist/core/extensions/context-types.d.ts.map +1 -1
  147. package/dist/core/extensions/context-types.js.map +1 -1
  148. package/dist/core/extensions/event-results.d.ts +1 -1
  149. package/dist/core/extensions/event-results.js.map +1 -1
  150. package/dist/core/extensions/event-types.d.ts +2 -1
  151. package/dist/core/extensions/event-types.d.ts.map +1 -1
  152. package/dist/core/extensions/event-types.js.map +1 -1
  153. package/dist/core/extensions/index.d.ts +2 -1
  154. package/dist/core/extensions/index.d.ts.map +1 -1
  155. package/dist/core/extensions/index.js.map +1 -1
  156. package/dist/core/extensions/loader-api.d.ts +1 -1
  157. package/dist/core/extensions/loader-api.d.ts.map +1 -1
  158. package/dist/core/extensions/loader-api.js +7 -0
  159. package/dist/core/extensions/loader-api.js.map +1 -1
  160. package/dist/core/extensions/loader-core.d.ts +1 -1
  161. package/dist/core/extensions/loader-core.js.map +1 -1
  162. package/dist/core/extensions/loader-discovery.d.ts +1 -1
  163. package/dist/core/extensions/loader-discovery.js.map +1 -1
  164. package/dist/core/extensions/loader-runtime.d.ts.map +1 -1
  165. package/dist/core/extensions/loader-runtime.js +3 -0
  166. package/dist/core/extensions/loader-runtime.js.map +1 -1
  167. package/dist/core/extensions/loader.d.ts +1 -1
  168. package/dist/core/extensions/loader.js.map +1 -1
  169. package/dist/core/extensions/message-types.d.ts +1 -1
  170. package/dist/core/extensions/message-types.js.map +1 -1
  171. package/dist/core/extensions/runner-context.d.ts +11 -1
  172. package/dist/core/extensions/runner-context.d.ts.map +1 -1
  173. package/dist/core/extensions/runner-context.js +41 -2
  174. package/dist/core/extensions/runner-context.js.map +1 -1
  175. package/dist/core/extensions/runner-events.d.ts +1 -1
  176. package/dist/core/extensions/runner-events.d.ts.map +1 -1
  177. package/dist/core/extensions/runner-events.js +17 -2
  178. package/dist/core/extensions/runner-events.js.map +1 -1
  179. package/dist/core/extensions/runner-ui.js.map +1 -1
  180. package/dist/core/extensions/runner.d.ts +17 -2
  181. package/dist/core/extensions/runner.d.ts.map +1 -1
  182. package/dist/core/extensions/runner.js +68 -18
  183. package/dist/core/extensions/runner.js.map +1 -1
  184. package/dist/core/extensions/runtime-types.d.ts +4 -1
  185. package/dist/core/extensions/runtime-types.d.ts.map +1 -1
  186. package/dist/core/extensions/runtime-types.js.map +1 -1
  187. package/dist/core/extensions/tool-types.d.ts +1 -1
  188. package/dist/core/extensions/tool-types.js.map +1 -1
  189. package/dist/core/extensions/types.d.ts +1 -0
  190. package/dist/core/extensions/types.d.ts.map +1 -1
  191. package/dist/core/extensions/types.js.map +1 -1
  192. package/dist/core/extensions/ui-types.d.ts +5 -1
  193. package/dist/core/extensions/ui-types.d.ts.map +1 -1
  194. package/dist/core/extensions/ui-types.js.map +1 -1
  195. package/dist/core/extensions/workflow-activity-hub.d.ts +25 -0
  196. package/dist/core/extensions/workflow-activity-hub.d.ts.map +1 -0
  197. package/dist/core/extensions/workflow-activity-hub.js +183 -0
  198. package/dist/core/extensions/workflow-activity-hub.js.map +1 -0
  199. package/dist/core/extensions/workflow-events.d.ts +118 -0
  200. package/dist/core/extensions/workflow-events.d.ts.map +1 -0
  201. package/dist/core/extensions/workflow-events.js +2 -0
  202. package/dist/core/extensions/workflow-events.js.map +1 -0
  203. package/dist/core/footer-data-provider.d.ts +8 -4
  204. package/dist/core/footer-data-provider.d.ts.map +1 -1
  205. package/dist/core/footer-data-provider.js +97 -11
  206. package/dist/core/footer-data-provider.js.map +1 -1
  207. package/dist/core/index.d.ts +3 -3
  208. package/dist/core/index.js.map +1 -1
  209. package/dist/core/keybindings.d.ts +27 -2
  210. package/dist/core/keybindings.d.ts.map +1 -1
  211. package/dist/core/keybindings.js +7 -2
  212. package/dist/core/keybindings.js.map +1 -1
  213. package/dist/core/mandatory-runtime-tools.d.ts +1 -1
  214. package/dist/core/mandatory-runtime-tools.js.map +1 -1
  215. package/dist/core/model-fallback-failures.js +2 -2
  216. package/dist/core/model-fallback-failures.js.map +1 -1
  217. package/dist/core/model-registry.d.ts +5 -1
  218. package/dist/core/model-registry.d.ts.map +1 -1
  219. package/dist/core/model-registry.js +8 -0
  220. package/dist/core/model-registry.js.map +1 -1
  221. package/dist/core/model-resolver-defaults.js +1 -1
  222. package/dist/core/model-resolver-defaults.js.map +1 -1
  223. package/dist/core/resource-loader-assets.js.map +1 -1
  224. package/dist/core/resource-loader-core.d.ts +1 -1
  225. package/dist/core/resource-loader-core.js.map +1 -1
  226. package/dist/core/resource-loader-internals.d.ts +2 -2
  227. package/dist/core/resource-loader-internals.js.map +1 -1
  228. package/dist/core/resource-loader-reload.d.ts +2 -0
  229. package/dist/core/resource-loader-reload.d.ts.map +1 -1
  230. package/dist/core/resource-loader-reload.js +231 -191
  231. package/dist/core/resource-loader-reload.js.map +1 -1
  232. package/dist/core/resource-loader-types.d.ts +4 -2
  233. package/dist/core/resource-loader-types.d.ts.map +1 -1
  234. package/dist/core/resource-loader-types.js.map +1 -1
  235. package/dist/core/sdk-exports.d.ts +2 -2
  236. package/dist/core/sdk-exports.js.map +1 -1
  237. package/dist/core/sdk-types.d.ts +2 -2
  238. package/dist/core/sdk-types.js.map +1 -1
  239. package/dist/core/sdk.js.map +1 -1
  240. package/dist/core/settings-manager-core.d.ts.map +1 -1
  241. package/dist/core/settings-manager-core.js +10 -4
  242. package/dist/core/settings-manager-core.js.map +1 -1
  243. package/dist/core/settings-storage.d.ts +1 -0
  244. package/dist/core/settings-storage.d.ts.map +1 -1
  245. package/dist/core/settings-storage.js +18 -0
  246. package/dist/core/settings-storage.js.map +1 -1
  247. package/dist/core/settings-types.d.ts +11 -0
  248. package/dist/core/settings-types.d.ts.map +1 -1
  249. package/dist/core/settings-types.js.map +1 -1
  250. package/dist/core/slash-commands.d.ts.map +1 -1
  251. package/dist/core/slash-commands.js +2 -0
  252. package/dist/core/slash-commands.js.map +1 -1
  253. package/dist/core/system-prompt.d.ts.map +1 -1
  254. package/dist/core/system-prompt.js +5 -6
  255. package/dist/core/system-prompt.js.map +1 -1
  256. package/dist/core/tasks/agent-adapter.d.ts +32 -0
  257. package/dist/core/tasks/agent-adapter.d.ts.map +1 -0
  258. package/dist/core/tasks/agent-adapter.js +71 -0
  259. package/dist/core/tasks/agent-adapter.js.map +1 -0
  260. package/dist/core/tasks/command-output.d.ts +15 -0
  261. package/dist/core/tasks/command-output.d.ts.map +1 -0
  262. package/dist/core/tasks/command-output.js +29 -0
  263. package/dist/core/tasks/command-output.js.map +1 -0
  264. package/dist/core/tasks/completion-ordering.d.ts +11 -0
  265. package/dist/core/tasks/completion-ordering.d.ts.map +1 -0
  266. package/dist/core/tasks/completion-ordering.js +19 -0
  267. package/dist/core/tasks/completion-ordering.js.map +1 -0
  268. package/dist/core/tasks/completion.d.ts +36 -0
  269. package/dist/core/tasks/completion.d.ts.map +1 -0
  270. package/dist/core/tasks/completion.js +115 -0
  271. package/dist/core/tasks/completion.js.map +1 -0
  272. package/dist/core/tasks/contracts.d.ts +404 -0
  273. package/dist/core/tasks/contracts.d.ts.map +1 -0
  274. package/dist/core/tasks/contracts.js +2 -0
  275. package/dist/core/tasks/contracts.js.map +1 -0
  276. package/dist/core/tasks/execution-scope.d.ts +10 -0
  277. package/dist/core/tasks/execution-scope.d.ts.map +1 -0
  278. package/dist/core/tasks/execution-scope.js +27 -0
  279. package/dist/core/tasks/execution-scope.js.map +1 -0
  280. package/dist/core/tasks/owner-store.d.ts +53 -0
  281. package/dist/core/tasks/owner-store.d.ts.map +1 -0
  282. package/dist/core/tasks/owner-store.js +155 -0
  283. package/dist/core/tasks/owner-store.js.map +1 -0
  284. package/dist/core/tasks/supervisor.d.ts +121 -0
  285. package/dist/core/tasks/supervisor.d.ts.map +1 -0
  286. package/dist/core/tasks/supervisor.js +916 -0
  287. package/dist/core/tasks/supervisor.js.map +1 -0
  288. package/dist/core/tasks/transcript.d.ts +23 -0
  289. package/dist/core/tasks/transcript.d.ts.map +1 -0
  290. package/dist/core/tasks/transcript.js +74 -0
  291. package/dist/core/tasks/transcript.js.map +1 -0
  292. package/dist/core/tools/ask-user-question/ask-user-question.d.ts +2 -2
  293. package/dist/core/tools/ask-user-question/ask-user-question.d.ts.map +1 -1
  294. package/dist/core/tools/ask-user-question/ask-user-question.js +8 -4
  295. package/dist/core/tools/ask-user-question/ask-user-question.js.map +1 -1
  296. package/dist/core/tools/ask-user-question/state/build-questionnaire.d.ts +1 -1
  297. package/dist/core/tools/ask-user-question/state/build-questionnaire.js.map +1 -1
  298. package/dist/core/tools/ask-user-question/state/questionnaire-session.d.ts +1 -1
  299. package/dist/core/tools/ask-user-question/state/questionnaire-session.js.map +1 -1
  300. package/dist/core/tools/ask-user-question/view/components/multi-select-view.d.ts +1 -1
  301. package/dist/core/tools/ask-user-question/view/components/multi-select-view.js.map +1 -1
  302. package/dist/core/tools/ask-user-question/view/components/preview/markdown-content-cache.d.ts +1 -1
  303. package/dist/core/tools/ask-user-question/view/components/preview/markdown-content-cache.js.map +1 -1
  304. package/dist/core/tools/ask-user-question/view/components/preview/preview-block-renderer.d.ts +1 -1
  305. package/dist/core/tools/ask-user-question/view/components/preview/preview-block-renderer.js.map +1 -1
  306. package/dist/core/tools/ask-user-question/view/components/submit-picker.d.ts +1 -1
  307. package/dist/core/tools/ask-user-question/view/components/submit-picker.js.map +1 -1
  308. package/dist/core/tools/ask-user-question/view/components/tab-bar.d.ts +1 -1
  309. package/dist/core/tools/ask-user-question/view/components/tab-bar.js.map +1 -1
  310. package/dist/core/tools/ask-user-question/view/dialog-builder.d.ts +1 -1
  311. package/dist/core/tools/ask-user-question/view/dialog-builder.js.map +1 -1
  312. package/dist/core/tools/ask-user-question/view/tab-content-strategy.d.ts +1 -1
  313. package/dist/core/tools/ask-user-question/view/tab-content-strategy.js.map +1 -1
  314. package/dist/core/tools/bash-pty-native.d.ts +18 -3
  315. package/dist/core/tools/bash-pty-native.d.ts.map +1 -1
  316. package/dist/core/tools/bash-pty-native.js +116 -1
  317. package/dist/core/tools/bash-pty-native.js.map +1 -1
  318. package/dist/core/tools/bash.d.ts +11 -4
  319. package/dist/core/tools/bash.d.ts.map +1 -1
  320. package/dist/core/tools/bash.js +52 -8
  321. package/dist/core/tools/bash.js.map +1 -1
  322. package/dist/core/tools/edit.d.ts.map +1 -1
  323. package/dist/core/tools/edit.js +1 -2
  324. package/dist/core/tools/edit.js.map +1 -1
  325. package/dist/core/tools/find.js.map +1 -1
  326. package/dist/core/tools/grep.js.map +1 -1
  327. package/dist/core/tools/index.d.ts +2 -2
  328. package/dist/core/tools/index.js.map +1 -1
  329. package/dist/core/tools/ls.js.map +1 -1
  330. package/dist/core/tools/powershell.d.ts +20 -10
  331. package/dist/core/tools/powershell.d.ts.map +1 -1
  332. package/dist/core/tools/powershell.js +32 -7
  333. package/dist/core/tools/powershell.js.map +1 -1
  334. package/dist/core/tools/read.d.ts.map +1 -1
  335. package/dist/core/tools/read.js +1 -2
  336. package/dist/core/tools/read.js.map +1 -1
  337. package/dist/core/tools/render-utils.d.ts +1 -1
  338. package/dist/core/tools/render-utils.js.map +1 -1
  339. package/dist/core/tools/resource-selectors.d.ts.map +1 -1
  340. package/dist/core/tools/resource-selectors.js +15 -7
  341. package/dist/core/tools/resource-selectors.js.map +1 -1
  342. package/dist/core/tools/search.js.map +1 -1
  343. package/dist/core/tools/todos-render.d.ts +1 -1
  344. package/dist/core/tools/todos-render.js.map +1 -1
  345. package/dist/core/tools/write.d.ts.map +1 -1
  346. package/dist/core/tools/write.js +1 -2
  347. package/dist/core/tools/write.js.map +1 -1
  348. package/dist/core/workflow-stage-admission.d.ts +10 -0
  349. package/dist/core/workflow-stage-admission.d.ts.map +1 -1
  350. package/dist/core/workflow-stage-admission.js +24 -0
  351. package/dist/core/workflow-stage-admission.js.map +1 -1
  352. package/dist/extensions/herdr/activity.d.ts +15 -0
  353. package/dist/extensions/herdr/activity.d.ts.map +1 -0
  354. package/dist/extensions/herdr/activity.js +24 -0
  355. package/dist/extensions/herdr/activity.js.map +1 -0
  356. package/dist/extensions/herdr/environment.d.ts +7 -0
  357. package/dist/extensions/herdr/environment.d.ts.map +1 -0
  358. package/dist/extensions/herdr/environment.js +6 -0
  359. package/dist/extensions/herdr/environment.js.map +1 -0
  360. package/dist/extensions/herdr/index.d.ts +9 -0
  361. package/dist/extensions/herdr/index.d.ts.map +1 -0
  362. package/dist/extensions/herdr/index.js +225 -0
  363. package/dist/extensions/herdr/index.js.map +1 -0
  364. package/dist/extensions/herdr/pane-owner.d.ts +30 -0
  365. package/dist/extensions/herdr/pane-owner.d.ts.map +1 -0
  366. package/dist/extensions/herdr/pane-owner.js +111 -0
  367. package/dist/extensions/herdr/pane-owner.js.map +1 -0
  368. package/dist/extensions/herdr/transport.d.ts +8 -0
  369. package/dist/extensions/herdr/transport.d.ts.map +1 -0
  370. package/dist/extensions/herdr/transport.js +28 -0
  371. package/dist/extensions/herdr/transport.js.map +1 -0
  372. package/dist/extensions/index.d.ts.map +1 -1
  373. package/dist/extensions/index.js +2 -0
  374. package/dist/extensions/index.js.map +1 -1
  375. package/dist/extensions/llama/huggingface-ui.d.ts +1 -1
  376. package/dist/extensions/llama/huggingface-ui.js.map +1 -1
  377. package/dist/extensions/llama/ui.js.map +1 -1
  378. package/dist/index-extensions.d.ts +3 -2
  379. package/dist/index-extensions.d.ts.map +1 -1
  380. package/dist/index-extensions.js.map +1 -1
  381. package/dist/index.d.ts +11 -3
  382. package/dist/index.d.ts.map +1 -1
  383. package/dist/index.js +8 -0
  384. package/dist/index.js.map +1 -1
  385. package/dist/main-session.js.map +1 -1
  386. package/dist/main.d.ts.map +1 -1
  387. package/dist/main.js +149 -69
  388. package/dist/main.js.map +1 -1
  389. package/dist/modes/interactive/components/armin.js.map +1 -1
  390. package/dist/modes/interactive/components/assistant-message.js.map +1 -1
  391. package/dist/modes/interactive/components/atomic-banner.d.ts +1 -1
  392. package/dist/modes/interactive/components/atomic-banner.js.map +1 -1
  393. package/dist/modes/interactive/components/atomic-working-status.js.map +1 -1
  394. package/dist/modes/interactive/components/bash-execution.js.map +1 -1
  395. package/dist/modes/interactive/components/bordered-loader.d.ts +1 -1
  396. package/dist/modes/interactive/components/bordered-loader.js.map +1 -1
  397. package/dist/modes/interactive/components/branch-summary-message.js.map +1 -1
  398. package/dist/modes/interactive/components/chat-message-renderer.d.ts +12 -0
  399. package/dist/modes/interactive/components/chat-message-renderer.d.ts.map +1 -1
  400. package/dist/modes/interactive/components/chat-message-renderer.js +44 -0
  401. package/dist/modes/interactive/components/chat-message-renderer.js.map +1 -1
  402. package/dist/modes/interactive/components/chat-session-host-actions.d.ts +1 -1
  403. package/dist/modes/interactive/components/chat-session-host-actions.d.ts.map +1 -1
  404. package/dist/modes/interactive/components/chat-session-host-actions.js +43 -8
  405. package/dist/modes/interactive/components/chat-session-host-actions.js.map +1 -1
  406. package/dist/modes/interactive/components/chat-session-host-editor.d.ts +1 -1
  407. package/dist/modes/interactive/components/chat-session-host-editor.js.map +1 -1
  408. package/dist/modes/interactive/components/chat-session-host-events.d.ts +2 -2
  409. package/dist/modes/interactive/components/chat-session-host-events.js.map +1 -1
  410. package/dist/modes/interactive/components/chat-session-host-rendering.d.ts +2 -2
  411. package/dist/modes/interactive/components/chat-session-host-rendering.d.ts.map +1 -1
  412. package/dist/modes/interactive/components/chat-session-host-rendering.js +12 -3
  413. package/dist/modes/interactive/components/chat-session-host-rendering.js.map +1 -1
  414. package/dist/modes/interactive/components/chat-session-host-runtime.d.ts +4 -5
  415. package/dist/modes/interactive/components/chat-session-host-runtime.d.ts.map +1 -1
  416. package/dist/modes/interactive/components/chat-session-host-runtime.js +8 -6
  417. package/dist/modes/interactive/components/chat-session-host-runtime.js.map +1 -1
  418. package/dist/modes/interactive/components/chat-session-host-state.d.ts +7 -2
  419. package/dist/modes/interactive/components/chat-session-host-state.d.ts.map +1 -1
  420. package/dist/modes/interactive/components/chat-session-host-state.js +1 -0
  421. package/dist/modes/interactive/components/chat-session-host-state.js.map +1 -1
  422. package/dist/modes/interactive/components/chat-session-host-terminal-cleanup.d.ts +1 -1
  423. package/dist/modes/interactive/components/chat-session-host-terminal-cleanup.js.map +1 -1
  424. package/dist/modes/interactive/components/chat-session-host-types.d.ts +8 -3
  425. package/dist/modes/interactive/components/chat-session-host-types.d.ts.map +1 -1
  426. package/dist/modes/interactive/components/chat-session-host-types.js.map +1 -1
  427. package/dist/modes/interactive/components/chat-session-host-utils.d.ts +1 -1
  428. package/dist/modes/interactive/components/chat-session-host-utils.d.ts.map +1 -1
  429. package/dist/modes/interactive/components/chat-session-host-utils.js +2 -0
  430. package/dist/modes/interactive/components/chat-session-host-utils.js.map +1 -1
  431. package/dist/modes/interactive/components/chat-session-host.d.ts +17 -2
  432. package/dist/modes/interactive/components/chat-session-host.d.ts.map +1 -1
  433. package/dist/modes/interactive/components/chat-session-host.js +97 -1
  434. package/dist/modes/interactive/components/chat-session-host.js.map +1 -1
  435. package/dist/modes/interactive/components/chat-transcript.d.ts +1 -0
  436. package/dist/modes/interactive/components/chat-transcript.d.ts.map +1 -1
  437. package/dist/modes/interactive/components/chat-transcript.js +1 -1
  438. package/dist/modes/interactive/components/chat-transcript.js.map +1 -1
  439. package/dist/modes/interactive/components/compaction-boundary-message.js.map +1 -1
  440. package/dist/modes/interactive/components/config-selector-list.js.map +1 -1
  441. package/dist/modes/interactive/components/config-selector.js.map +1 -1
  442. package/dist/modes/interactive/components/custom-editor.js.map +1 -1
  443. package/dist/modes/interactive/components/custom-entry.js.map +1 -1
  444. package/dist/modes/interactive/components/custom-message.d.ts.map +1 -1
  445. package/dist/modes/interactive/components/custom-message.js +12 -0
  446. package/dist/modes/interactive/components/custom-message.js.map +1 -1
  447. package/dist/modes/interactive/components/daxnuts.js.map +1 -1
  448. package/dist/modes/interactive/components/diff.js.map +1 -1
  449. package/dist/modes/interactive/components/dynamic-border.js.map +1 -1
  450. package/dist/modes/interactive/components/earendil-announcement.js.map +1 -1
  451. package/dist/modes/interactive/components/extension-editor.js.map +1 -1
  452. package/dist/modes/interactive/components/extension-input.js.map +1 -1
  453. package/dist/modes/interactive/components/extension-selector.js.map +1 -1
  454. package/dist/modes/interactive/components/first-time-setup.d.ts +1 -1
  455. package/dist/modes/interactive/components/first-time-setup.js.map +1 -1
  456. package/dist/modes/interactive/components/footer.d.ts +7 -6
  457. package/dist/modes/interactive/components/footer.d.ts.map +1 -1
  458. package/dist/modes/interactive/components/footer.js +27 -9
  459. package/dist/modes/interactive/components/footer.js.map +1 -1
  460. package/dist/modes/interactive/components/host-input-form-mount.js.map +1 -1
  461. package/dist/modes/interactive/components/host-input-form.d.ts +1 -1
  462. package/dist/modes/interactive/components/host-input-form.js.map +1 -1
  463. package/dist/modes/interactive/components/index.d.ts +2 -2
  464. package/dist/modes/interactive/components/index.js.map +1 -1
  465. package/dist/modes/interactive/components/keybinding-hints.js.map +1 -1
  466. package/dist/modes/interactive/components/login-dialog.js.map +1 -1
  467. package/dist/modes/interactive/components/mermaid.d.ts +1 -1
  468. package/dist/modes/interactive/components/mermaid.js.map +1 -1
  469. package/dist/modes/interactive/components/model-selector.js.map +1 -1
  470. package/dist/modes/interactive/components/oauth-selector.js.map +1 -1
  471. package/dist/modes/interactive/components/reserved-bottom-overlay.js.map +1 -1
  472. package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -1
  473. package/dist/modes/interactive/components/session-selector-header.js.map +1 -1
  474. package/dist/modes/interactive/components/session-selector-list.js.map +1 -1
  475. package/dist/modes/interactive/components/session-selector.js.map +1 -1
  476. package/dist/modes/interactive/components/settings-selector-items.js.map +1 -1
  477. package/dist/modes/interactive/components/settings-selector-submenus.d.ts +1 -1
  478. package/dist/modes/interactive/components/settings-selector-submenus.js.map +1 -1
  479. package/dist/modes/interactive/components/settings-selector-types.d.ts +1 -1
  480. package/dist/modes/interactive/components/settings-selector-types.js.map +1 -1
  481. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  482. package/dist/modes/interactive/components/show-images-selector.js.map +1 -1
  483. package/dist/modes/interactive/components/skill-invocation-message.d.ts +1 -1
  484. package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
  485. package/dist/modes/interactive/components/task-completion-message.d.ts +13 -0
  486. package/dist/modes/interactive/components/task-completion-message.d.ts.map +1 -0
  487. package/dist/modes/interactive/components/task-completion-message.js +65 -0
  488. package/dist/modes/interactive/components/task-completion-message.js.map +1 -0
  489. package/dist/modes/interactive/components/task-detail.d.ts +27 -0
  490. package/dist/modes/interactive/components/task-detail.d.ts.map +1 -0
  491. package/dist/modes/interactive/components/task-detail.js +107 -0
  492. package/dist/modes/interactive/components/task-detail.js.map +1 -0
  493. package/dist/modes/interactive/components/task-inspector.d.ts +50 -0
  494. package/dist/modes/interactive/components/task-inspector.d.ts.map +1 -0
  495. package/dist/modes/interactive/components/task-inspector.js +599 -0
  496. package/dist/modes/interactive/components/task-inspector.js.map +1 -0
  497. package/dist/modes/interactive/components/task-list.d.ts +18 -0
  498. package/dist/modes/interactive/components/task-list.d.ts.map +1 -0
  499. package/dist/modes/interactive/components/task-list.js +59 -0
  500. package/dist/modes/interactive/components/task-list.js.map +1 -0
  501. package/dist/modes/interactive/components/task-live-transcript.d.ts +17 -0
  502. package/dist/modes/interactive/components/task-live-transcript.d.ts.map +1 -0
  503. package/dist/modes/interactive/components/task-live-transcript.js +33 -0
  504. package/dist/modes/interactive/components/task-live-transcript.js.map +1 -0
  505. package/dist/modes/interactive/components/task-navigation.d.ts +38 -0
  506. package/dist/modes/interactive/components/task-navigation.d.ts.map +1 -0
  507. package/dist/modes/interactive/components/task-navigation.js +93 -0
  508. package/dist/modes/interactive/components/task-navigation.js.map +1 -0
  509. package/dist/modes/interactive/components/task-row.d.ts +34 -0
  510. package/dist/modes/interactive/components/task-row.d.ts.map +1 -0
  511. package/dist/modes/interactive/components/task-row.js +158 -0
  512. package/dist/modes/interactive/components/task-row.js.map +1 -0
  513. package/dist/modes/interactive/components/theme-selector.js.map +1 -1
  514. package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
  515. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  516. package/dist/modes/interactive/components/transcript-follow-indicator.js.map +1 -1
  517. package/dist/modes/interactive/components/tree-selector-component.js.map +1 -1
  518. package/dist/modes/interactive/components/tree-selector-content.js.map +1 -1
  519. package/dist/modes/interactive/components/tree-selector-help.js.map +1 -1
  520. package/dist/modes/interactive/components/tree-selector-label-input.js.map +1 -1
  521. package/dist/modes/interactive/components/tree-selector-list.js.map +1 -1
  522. package/dist/modes/interactive/components/trust-selector.js.map +1 -1
  523. package/dist/modes/interactive/components/user-message-selector.js.map +1 -1
  524. package/dist/modes/interactive/components/user-message.js.map +1 -1
  525. package/dist/modes/interactive/components/working-status.js.map +1 -1
  526. package/dist/modes/interactive/interactive-agent-events.js +8 -2
  527. package/dist/modes/interactive/interactive-agent-events.js.map +1 -1
  528. package/dist/modes/interactive/interactive-auth-login.js +3 -1
  529. package/dist/modes/interactive/interactive-auth-login.js.map +1 -1
  530. package/dist/modes/interactive/interactive-autocomplete.js +9 -30
  531. package/dist/modes/interactive/interactive-autocomplete.js.map +1 -1
  532. package/dist/modes/interactive/interactive-deferred-startup.js +2 -1
  533. package/dist/modes/interactive/interactive-deferred-startup.js.map +1 -1
  534. package/dist/modes/interactive/interactive-extension-context.js +14 -4
  535. package/dist/modes/interactive/interactive-extension-context.js.map +1 -1
  536. package/dist/modes/interactive/interactive-extension-custom-ui.js +52 -4
  537. package/dist/modes/interactive/interactive-extension-custom-ui.js.map +1 -1
  538. package/dist/modes/interactive/interactive-extension-runtime.js +1 -0
  539. package/dist/modes/interactive/interactive-extension-runtime.js.map +1 -1
  540. package/dist/modes/interactive/interactive-extension-widgets.js +9 -1
  541. package/dist/modes/interactive/interactive-extension-widgets.js.map +1 -1
  542. package/dist/modes/interactive/interactive-input-handling.d.ts.map +1 -1
  543. package/dist/modes/interactive/interactive-input-handling.js +19 -0
  544. package/dist/modes/interactive/interactive-input-handling.js.map +1 -1
  545. package/dist/modes/interactive/interactive-mode-base.d.ts +6 -1
  546. package/dist/modes/interactive/interactive-mode-base.d.ts.map +1 -1
  547. package/dist/modes/interactive/interactive-mode-base.js +4 -1
  548. package/dist/modes/interactive/interactive-mode-base.js.map +1 -1
  549. package/dist/modes/interactive/interactive-mode-deps.d.ts +6 -6
  550. package/dist/modes/interactive/interactive-mode-deps.js.map +1 -1
  551. package/dist/modes/interactive/interactive-mode-surface.d.ts +2 -1
  552. package/dist/modes/interactive/interactive-mode-surface.d.ts.map +1 -1
  553. package/dist/modes/interactive/interactive-mode-surface.js.map +1 -1
  554. package/dist/modes/interactive/interactive-mode.d.ts +1 -0
  555. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  556. package/dist/modes/interactive/interactive-mode.js +3 -0
  557. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  558. package/dist/modes/interactive/interactive-process-lifecycle.js +4 -1
  559. package/dist/modes/interactive/interactive-process-lifecycle.js.map +1 -1
  560. package/dist/modes/interactive/interactive-render-chat.js +2 -0
  561. package/dist/modes/interactive/interactive-render-chat.js.map +1 -1
  562. package/dist/modes/interactive/interactive-session-routing.js +33 -23
  563. package/dist/modes/interactive/interactive-session-routing.js.map +1 -1
  564. package/dist/modes/interactive/interactive-session-runtime.js +1 -0
  565. package/dist/modes/interactive/interactive-session-runtime.js.map +1 -1
  566. package/dist/modes/interactive/interactive-slash-commands.js.map +1 -1
  567. package/dist/modes/interactive/interactive-summarization-retry-events.js +2 -2
  568. package/dist/modes/interactive/interactive-summarization-retry-events.js.map +1 -1
  569. package/dist/modes/interactive/interactive-task-projection.d.ts +13 -0
  570. package/dist/modes/interactive/interactive-task-projection.d.ts.map +1 -0
  571. package/dist/modes/interactive/interactive-task-projection.js +72 -0
  572. package/dist/modes/interactive/interactive-task-projection.js.map +1 -0
  573. package/dist/modes/interactive/interactive-tui.js.map +1 -1
  574. package/dist/modes/interactive/interactive-windows-subshell.d.ts +17 -0
  575. package/dist/modes/interactive/interactive-windows-subshell.d.ts.map +1 -0
  576. package/dist/modes/interactive/interactive-windows-subshell.js +92 -0
  577. package/dist/modes/interactive/interactive-windows-subshell.js.map +1 -0
  578. package/dist/modes/interactive/skill-command-autocomplete.d.ts +12 -0
  579. package/dist/modes/interactive/skill-command-autocomplete.d.ts.map +1 -0
  580. package/dist/modes/interactive/skill-command-autocomplete.js +69 -0
  581. package/dist/modes/interactive/skill-command-autocomplete.js.map +1 -0
  582. package/dist/modes/interactive/theme/theme-class.d.ts.map +1 -1
  583. package/dist/modes/interactive/theme/theme-class.js +4 -1
  584. package/dist/modes/interactive/theme/theme-class.js.map +1 -1
  585. package/dist/modes/interactive/theme/theme-controller.d.ts +1 -1
  586. package/dist/modes/interactive/theme/theme-controller.js.map +1 -1
  587. package/dist/modes/interactive-engine/create-isolated-runtime.d.ts +1 -1
  588. package/dist/modes/interactive-engine/create-isolated-runtime.js.map +1 -1
  589. package/dist/modes/interactive-engine/engine-custom-ui.d.ts +5 -9
  590. package/dist/modes/interactive-engine/engine-custom-ui.d.ts.map +1 -1
  591. package/dist/modes/interactive-engine/engine-custom-ui.js +14 -5
  592. package/dist/modes/interactive-engine/engine-custom-ui.js.map +1 -1
  593. package/dist/modes/interactive-engine/engine-dialog-host.d.ts +2 -2
  594. package/dist/modes/interactive-engine/engine-dialog-host.js.map +1 -1
  595. package/dist/modes/interactive-engine/engine-project-trust.d.ts +10 -0
  596. package/dist/modes/interactive-engine/engine-project-trust.d.ts.map +1 -0
  597. package/dist/modes/interactive-engine/engine-project-trust.js +28 -0
  598. package/dist/modes/interactive-engine/engine-project-trust.js.map +1 -0
  599. package/dist/modes/interactive-engine/engine-render-service.d.ts +1 -1
  600. package/dist/modes/interactive-engine/engine-render-service.js.map +1 -1
  601. package/dist/modes/interactive-engine/extension-ui-bridge.d.ts +3 -1
  602. package/dist/modes/interactive-engine/extension-ui-bridge.d.ts.map +1 -1
  603. package/dist/modes/interactive-engine/extension-ui-bridge.js +6 -0
  604. package/dist/modes/interactive-engine/extension-ui-bridge.js.map +1 -1
  605. package/dist/modes/interactive-engine/input-form-host.d.ts +2 -2
  606. package/dist/modes/interactive-engine/input-form-host.js.map +1 -1
  607. package/dist/modes/interactive-engine/isolated-auth.d.ts +1 -1
  608. package/dist/modes/interactive-engine/isolated-auth.js.map +1 -1
  609. package/dist/modes/interactive-engine/isolated-runtime.d.ts +5 -2
  610. package/dist/modes/interactive-engine/isolated-runtime.d.ts.map +1 -1
  611. package/dist/modes/interactive-engine/isolated-runtime.js +40 -3
  612. package/dist/modes/interactive-engine/isolated-runtime.js.map +1 -1
  613. package/dist/modes/interactive-engine/protocol.d.ts +9 -0
  614. package/dist/modes/interactive-engine/protocol.d.ts.map +1 -1
  615. package/dist/modes/interactive-engine/protocol.js +8 -0
  616. package/dist/modes/interactive-engine/protocol.js.map +1 -1
  617. package/dist/modes/interactive-engine/remote-component.d.ts +2 -2
  618. package/dist/modes/interactive-engine/remote-component.d.ts.map +1 -1
  619. package/dist/modes/interactive-engine/remote-component.js +3 -2
  620. package/dist/modes/interactive-engine/remote-component.js.map +1 -1
  621. package/dist/modes/interactive-engine/remote-model-catalog.d.ts +1 -1
  622. package/dist/modes/interactive-engine/remote-model-catalog.js.map +1 -1
  623. package/dist/modes/interactive-engine/remote-renderer.d.ts +1 -1
  624. package/dist/modes/interactive-engine/remote-renderer.js.map +1 -1
  625. package/dist/modes/interactive-engine/session-picker-host.d.ts +2 -2
  626. package/dist/modes/interactive-engine/session-picker-host.js.map +1 -1
  627. package/dist/modes/json-event.d.ts +1 -1
  628. package/dist/modes/json-event.js.map +1 -1
  629. package/dist/modes/print-mode.js.map +1 -1
  630. package/dist/modes/rpc/rpc-bash-request-owners.d.ts +2 -2
  631. package/dist/modes/rpc/rpc-bash-request-owners.js.map +1 -1
  632. package/dist/modes/rpc/rpc-client-api.d.ts +2 -2
  633. package/dist/modes/rpc/rpc-client-api.d.ts.map +1 -1
  634. package/dist/modes/rpc/rpc-client-api.js +2 -2
  635. package/dist/modes/rpc/rpc-client-api.js.map +1 -1
  636. package/dist/modes/rpc/rpc-client-waits.d.ts +1 -1
  637. package/dist/modes/rpc/rpc-client-waits.js.map +1 -1
  638. package/dist/modes/rpc/rpc-client.d.ts +3 -1
  639. package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  640. package/dist/modes/rpc/rpc-client.js +20 -0
  641. package/dist/modes/rpc/rpc-client.js.map +1 -1
  642. package/dist/modes/rpc/rpc-command-handler.d.ts +4 -2
  643. package/dist/modes/rpc/rpc-command-handler.d.ts.map +1 -1
  644. package/dist/modes/rpc/rpc-command-handler.js +12 -4
  645. package/dist/modes/rpc/rpc-command-handler.js.map +1 -1
  646. package/dist/modes/rpc/rpc-extension-ui.d.ts +1 -1
  647. package/dist/modes/rpc/rpc-extension-ui.js.map +1 -1
  648. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  649. package/dist/modes/rpc/rpc-mode.js +11 -2
  650. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  651. package/dist/modes/rpc/rpc-provider-auth.d.ts +1 -1
  652. package/dist/modes/rpc/rpc-provider-auth.js.map +1 -1
  653. package/dist/modes/rpc/rpc-session-binding.d.ts +4 -1
  654. package/dist/modes/rpc/rpc-session-binding.d.ts.map +1 -1
  655. package/dist/modes/rpc/rpc-session-binding.js +35 -1
  656. package/dist/modes/rpc/rpc-session-binding.js.map +1 -1
  657. package/dist/modes/rpc/rpc-types.d.ts +13 -1
  658. package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  659. package/dist/modes/rpc/rpc-types.js.map +1 -1
  660. package/dist/modes/rpc/task-ui-bridge.d.ts +9 -0
  661. package/dist/modes/rpc/task-ui-bridge.d.ts.map +1 -0
  662. package/dist/modes/rpc/task-ui-bridge.js +146 -0
  663. package/dist/modes/rpc/task-ui-bridge.js.map +1 -0
  664. package/dist/self-update-plan.js.map +1 -1
  665. package/docs/background-tasks.md +199 -0
  666. package/docs/compaction.md +2 -0
  667. package/docs/development.md +3 -1
  668. package/docs/docs.json +2 -0
  669. package/docs/environment-variables.md +1 -1
  670. package/docs/extensions.md +108 -6
  671. package/docs/herdr.md +106 -0
  672. package/docs/intercom.md +38 -35
  673. package/docs/keybindings.md +19 -2
  674. package/docs/models/evals.md +222 -147
  675. package/docs/models/model-selection.md +20 -14
  676. package/docs/models/pareto-efficiency.md +2 -2
  677. package/docs/providers.md +48 -46
  678. package/docs/quickstart.md +1 -1
  679. package/docs/sdk.md +244 -0
  680. package/docs/settings.md +15 -3
  681. package/docs/skills.md +23 -1
  682. package/docs/subagents.md +71 -9
  683. package/docs/themes.md +4 -0
  684. package/docs/tools.md +25 -0
  685. package/docs/tui.md +29 -2
  686. package/docs/usage.md +4 -0
  687. package/docs/windows.md +4 -4
  688. package/docs/workflows/api-reference.md +13 -4
  689. package/docs/workflows/operations.md +42 -1
  690. package/docs/workflows/reliable-design.md +35 -4
  691. package/docs/workflows/verification.md +21 -4
  692. package/docs/workflows.md +3 -1
  693. package/npm-shrinkwrap.json +781 -661
  694. package/package.json +10 -10
  695. /package/dist/builtin/workflows/builtin/{chunk-cg9tmks0.js → chunk-n1910xc4.js} +0 -0
  696. /package/dist/builtin/workflows/builtin/{chunk-wpckd35c.js → chunk-rc5ec5xx.js} +0 -0
  697. /package/dist/builtin/workflows/builtin/{chunk-7at6dnkr.js → chunk-tgt0s5e5.js} +0 -0
  698. /package/dist/builtin/workflows/builtin/{chunk-bfkmzv9h.js → chunk-xtxcq5tj.js} +0 -0
@@ -2,7 +2,7 @@ import type { Args } from "../../cli/args.ts";
2
2
  import { type AgentSessionRuntime, type CreateAgentSessionRuntimeFactory } from "../../core/agent-session-runtime.ts";
3
3
  import type { SessionManager } from "../../core/session-manager.ts";
4
4
  import { type InteractiveEngineResourcePaths } from "./engine-args.ts";
5
- import { IsolatedInteractiveRuntime } from "./isolated-runtime.ts";
5
+ import { IsolatedInteractiveRuntime } from "./isolated-runtime.js";
6
6
  export declare function createIsolatedInteractiveRuntime(options: {
7
7
  localRuntime: AgentSessionRuntime;
8
8
  createRuntime: CreateAgentSessionRuntimeFactory;
@@ -1 +1 @@
1
- {"version":3,"file":"create-isolated-runtime.js","sourceRoot":"","sources":["../../../src/modes/interactive-engine/create-isolated-runtime.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAErC,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC7D,OAAO,EAGN,yBAAyB,GACzB,MAAM,qCAAqC,CAAC;AAE7C,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEjD,OAAO,EAAE,0BAA0B,EAAuC,MAAM,kBAAkB,CAAC;AACnG,OAAO,EAAE,0BAA0B,EAAE,MAAM,uBAAuB,CAAC;AAEnE,MAAM,CAAC,KAAK,UAAU,gCAAgC,CAAC,OAMtD;IACA,MAAM,cAAc,GAAG,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;IAChE,MAAM,iBAAiB,GAAG,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;IAC1F,MAAM,OAAO,GAAG,iBAAiB,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACzD,IAAI,iBAAiB,IAAI,CAAC,OAAO;QAChC,MAAM,IAAI,KAAK,CAAC,4EAA4E,CAAC,CAAC;IAC/F,IAAI,eAAuD,CAAC;IAC5D,MAAM,kBAAkB,GAAiC,EAAE,CAAC;IAC5D,IAAI,cAAc,GAAG,KAAK,CAAC;IAC3B,MAAM,gBAAgB,GAAG,WAAW,CAAC,aAAa,CAAC,CAAC;IACpD,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;QAC5B,OAAO;QACP,GAAG,EAAE,OAAO,CAAC,cAAc,CAAC,MAAM,EAAE;QACpC,iBAAiB,EAAE,OAAO,CAAC,QAAQ;QACnC,IAAI,EAAE,0BAA0B,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,cAAc,EAAE,OAAO,CAAC,SAAS,CAAC;QAC3F,GAAG,EAAE;YACJ,GAAG,CAAC,gBAAgB,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC,EAAE,gBAAgB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAChF;QACD,iBAAiB,EAAE;YAClB,YAAY,EAAE,CAAC,UAAU,EAAE,EAAE,CAC5B,eAAe,CAAC,CAAC,CAAC,eAAe,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;YACnG,gBAAgB,EAAE,CAAC,MAAM,EAAE,EAAE;gBAC5B,cAAc,GAAG,MAAM,CAAC;gBACxB,eAAe,EAAE,uBAAuB,CAAC,MAAM,CAAC,CAAC;YAClD,CAAC;YACD,WAAW,EAAE,GAAG,EAAE,CAAC,eAAe,EAAE,mBAAmB,EAAE;YACzD,uEAAuE;YACvE,kEAAkE;YAClE,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACnE;KACD,CAAC,CAAC;IACH,IAAI,CAAC;QACJ,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;IACtB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;QACpB,MAAM,KAAK,CAAC;IACb,CAAC;IACD,eAAe,GAAG,IAAI,0BAA0B,CAAC,OAAO,CAAC,YAAY,EAAE,OAAO,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;IACtG,eAAe,CAAC,uBAAuB,CAAC,cAAc,CAAC,CAAC;IACxD,KAAK,MAAM,UAAU,IAAI,kBAAkB;QAAE,eAAe,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;IACxF,OAAO,eAAe,CAAC;AACxB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACzC,aAA+C,EAC/C,GAAW,EACX,QAAgB,EAChB,cAA8B,EAC9B,sBAA+B,EAC/B,2BAAoC,EACpC,MAAY,EACZ,SAAyC;IAEzC,IAAI,sBAAsB,IAAI,2BAA2B,EAAE,CAAC;QAC3D,MAAM,IAAI,KAAK,CACd,0HAA0H,CAC1H,CAAC;IACH,CAAC;IACD,MAAM,YAAY,GAAG,MAAM,yBAAyB,CAAC,aAAa,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,cAAc,EAAE,CAAC,CAAC;IACvG,IAAI,CAAC,sBAAsB;QAAE,OAAO,YAAY,CAAC;IACjD,OAAO,gCAAgC,CAAC,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,EAAE,cAAc,EAAE,SAAS,EAAE,CAAC,CAAC;AAC7G,CAAC","sourcesContent":["import { basename } from \"node:path\";\nimport type { Args } from \"../../cli/args.ts\";\nimport { ENV_AGENT_DIR, getEnvValue } from \"../../config.js\";\nimport {\n\ttype AgentSessionRuntime,\n\ttype CreateAgentSessionRuntimeFactory,\n\tcreateAgentSessionRuntime,\n} from \"../../core/agent-session-runtime.ts\";\nimport type { SessionManager } from \"../../core/session-manager.ts\";\nimport { RpcClient } from \"../rpc/rpc-client.ts\";\nimport type { ActivityWatchdogDiagnostic } from \"./activity-watchdog.ts\";\nimport { buildInteractiveEngineArgs, type InteractiveEngineResourcePaths } from \"./engine-args.ts\";\nimport { IsolatedInteractiveRuntime } from \"./isolated-runtime.ts\";\n\nexport async function createIsolatedInteractiveRuntime(options: {\n\tlocalRuntime: AgentSessionRuntime;\n\tcreateRuntime: CreateAgentSessionRuntimeFactory;\n\tparsed: Args;\n\tsessionManager: SessionManager;\n\tresources: InteractiveEngineResourcePaths;\n}): Promise<IsolatedInteractiveRuntime> {\n\tconst executableName = basename(process.execPath).toLowerCase();\n\tconst launchedByRuntime = [\"bun\", \"bun.exe\", \"node\", \"node.exe\"].includes(executableName);\n\tconst cliPath = launchedByRuntime ? process.argv[1] : \"\";\n\tif (launchedByRuntime && !cliPath)\n\t\tthrow new Error(\"Cannot start isolated interactive engine: Atomic entrypoint is unavailable\");\n\tlet isolatedRuntime: IsolatedInteractiveRuntime | undefined;\n\tconst pendingDiagnostics: ActivityWatchdogDiagnostic[] = [];\n\tlet callbackActive = false;\n\tconst explicitAgentDir = getEnvValue(ENV_AGENT_DIR);\n\tconst client = new RpcClient({\n\t\tcliPath,\n\t\tcwd: options.sessionManager.getCwd(),\n\t\truntimeExecutable: process.execPath,\n\t\targs: buildInteractiveEngineArgs(options.parsed, options.sessionManager, options.resources),\n\t\tenv: {\n\t\t\t...(explicitAgentDir !== undefined ? { [ENV_AGENT_DIR]: explicitAgentDir } : {}),\n\t\t},\n\t\tinteractiveEngine: {\n\t\t\tonDiagnostic: (diagnostic) =>\n\t\t\t\tisolatedRuntime ? isolatedRuntime.emitDiagnostic(diagnostic) : pendingDiagnostics.push(diagnostic),\n\t\t\tonActivityChange: (active) => {\n\t\t\t\tcallbackActive = active;\n\t\t\t\tisolatedRuntime?.setEngineCallbackActive(active);\n\t\t\t},\n\t\t\tonHeartbeat: () => isolatedRuntime?.noteEngineHeartbeat(),\n\t\t\t// Handed to the child through the protected bootstrap file so it never\n\t\t\t// enters an environment the child's own subprocesses can inherit.\n\t\t\t...(options.parsed.apiKey ? { apiKey: options.parsed.apiKey } : {}),\n\t\t},\n\t});\n\ttry {\n\t\tawait client.start();\n\t} catch (error) {\n\t\tawait client.stop();\n\t\tthrow error;\n\t}\n\tisolatedRuntime = new IsolatedInteractiveRuntime(options.localRuntime, options.createRuntime, client);\n\tisolatedRuntime.setEngineCallbackActive(callbackActive);\n\tfor (const diagnostic of pendingDiagnostics) isolatedRuntime.emitDiagnostic(diagnostic);\n\treturn isolatedRuntime;\n}\n\nexport async function createRuntimeForMode(\n\tcreateRuntime: CreateAgentSessionRuntimeFactory,\n\tcwd: string,\n\tagentDir: string,\n\tsessionManager: SessionManager,\n\tisolateInteractiveHost: boolean,\n\thasInlineExtensionFactories: boolean,\n\tparsed: Args,\n\tresources: InteractiveEngineResourcePaths,\n): Promise<AgentSessionRuntime> {\n\tif (isolateInteractiveHost && hasInlineExtensionFactories) {\n\t\tthrow new Error(\n\t\t\t\"Interactive engine isolation cannot serialize inline extension factories; load the extension from a module path instead.\",\n\t\t);\n\t}\n\tconst localRuntime = await createAgentSessionRuntime(createRuntime, { cwd, agentDir, sessionManager });\n\tif (!isolateInteractiveHost) return localRuntime;\n\treturn createIsolatedInteractiveRuntime({ localRuntime, createRuntime, parsed, sessionManager, resources });\n}\n"]}
1
+ {"version":3,"file":"create-isolated-runtime.js","sourceRoot":"","sources":["../../../src/modes/interactive-engine/create-isolated-runtime.ts"],"names":[],"mappings":"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","sourcesContent":["import { basename } from \"node:path\";\nimport type { Args } from \"../../cli/args.ts\";\nimport { ENV_AGENT_DIR, getEnvValue } from \"../../config.js\";\nimport {\n\ttype AgentSessionRuntime,\n\ttype CreateAgentSessionRuntimeFactory,\n\tcreateAgentSessionRuntime,\n} from \"../../core/agent-session-runtime.ts\";\nimport type { SessionManager } from \"../../core/session-manager.ts\";\nimport { RpcClient } from \"../rpc/rpc-client.ts\";\nimport type { ActivityWatchdogDiagnostic } from \"./activity-watchdog.ts\";\nimport { buildInteractiveEngineArgs, type InteractiveEngineResourcePaths } from \"./engine-args.ts\";\nimport { IsolatedInteractiveRuntime } from \"./isolated-runtime.js\";\n\nexport async function createIsolatedInteractiveRuntime(options: {\n\tlocalRuntime: AgentSessionRuntime;\n\tcreateRuntime: CreateAgentSessionRuntimeFactory;\n\tparsed: Args;\n\tsessionManager: SessionManager;\n\tresources: InteractiveEngineResourcePaths;\n}): Promise<IsolatedInteractiveRuntime> {\n\tconst executableName = basename(process.execPath).toLowerCase();\n\tconst launchedByRuntime = [\"bun\", \"bun.exe\", \"node\", \"node.exe\"].includes(executableName);\n\tconst cliPath = launchedByRuntime ? process.argv[1] : \"\";\n\tif (launchedByRuntime && !cliPath)\n\t\tthrow new Error(\"Cannot start isolated interactive engine: Atomic entrypoint is unavailable\");\n\tlet isolatedRuntime: IsolatedInteractiveRuntime | undefined;\n\tconst pendingDiagnostics: ActivityWatchdogDiagnostic[] = [];\n\tlet callbackActive = false;\n\tconst explicitAgentDir = getEnvValue(ENV_AGENT_DIR);\n\tconst client = new RpcClient({\n\t\tcliPath,\n\t\tcwd: options.sessionManager.getCwd(),\n\t\truntimeExecutable: process.execPath,\n\t\targs: buildInteractiveEngineArgs(options.parsed, options.sessionManager, options.resources),\n\t\tenv: {\n\t\t\t...(explicitAgentDir !== undefined ? { [ENV_AGENT_DIR]: explicitAgentDir } : {}),\n\t\t},\n\t\tinteractiveEngine: {\n\t\t\tonDiagnostic: (diagnostic) =>\n\t\t\t\tisolatedRuntime ? isolatedRuntime.emitDiagnostic(diagnostic) : pendingDiagnostics.push(diagnostic),\n\t\t\tonActivityChange: (active) => {\n\t\t\t\tcallbackActive = active;\n\t\t\t\tisolatedRuntime?.setEngineCallbackActive(active);\n\t\t\t},\n\t\t\tonHeartbeat: () => isolatedRuntime?.noteEngineHeartbeat(),\n\t\t\t// Handed to the child through the protected bootstrap file so it never\n\t\t\t// enters an environment the child's own subprocesses can inherit.\n\t\t\t...(options.parsed.apiKey ? { apiKey: options.parsed.apiKey } : {}),\n\t\t},\n\t});\n\ttry {\n\t\tawait client.start();\n\t} catch (error) {\n\t\tawait client.stop();\n\t\tthrow error;\n\t}\n\tisolatedRuntime = new IsolatedInteractiveRuntime(options.localRuntime, options.createRuntime, client);\n\tisolatedRuntime.setEngineCallbackActive(callbackActive);\n\tfor (const diagnostic of pendingDiagnostics) isolatedRuntime.emitDiagnostic(diagnostic);\n\treturn isolatedRuntime;\n}\n\nexport async function createRuntimeForMode(\n\tcreateRuntime: CreateAgentSessionRuntimeFactory,\n\tcwd: string,\n\tagentDir: string,\n\tsessionManager: SessionManager,\n\tisolateInteractiveHost: boolean,\n\thasInlineExtensionFactories: boolean,\n\tparsed: Args,\n\tresources: InteractiveEngineResourcePaths,\n): Promise<AgentSessionRuntime> {\n\tif (isolateInteractiveHost && hasInlineExtensionFactories) {\n\t\tthrow new Error(\n\t\t\t\"Interactive engine isolation cannot serialize inline extension factories; load the extension from a module path instead.\",\n\t\t);\n\t}\n\tconst localRuntime = await createAgentSessionRuntime(createRuntime, { cwd, agentDir, sessionManager });\n\tif (!isolateInteractiveHost) return localRuntime;\n\treturn createIsolatedInteractiveRuntime({ localRuntime, createRuntime, parsed, sessionManager, resources });\n}\n"]}
@@ -1,7 +1,9 @@
1
1
  import { type Component, type OverlayHandle, type OverlayOptions, type TUI } from "@earendil-works/pi-tui";
2
+ import type { HostCustomUiState, HostCustomUiStateListener } from "../../core/extensions/index.js";
2
3
  import type { KeybindingsManager } from "../../core/keybindings.ts";
3
- import type { Theme } from "../interactive/theme/theme.ts";
4
+ import type { Theme } from "../interactive/theme/theme.js";
4
5
  interface CustomUiOptions {
6
+ purpose?: "prompt" | "navigation";
5
7
  overlay?: boolean;
6
8
  deferInlineCustomUiFocus?: boolean;
7
9
  /** The component binds Ctrl+C itself; see ExtensionUIContext.custom options. */
@@ -31,14 +33,8 @@ export declare class EngineCustomUiService {
31
33
  }) | Promise<Component & {
32
34
  dispose?(): void;
33
35
  }>, options?: CustomUiOptions): Promise<T>;
34
- getHostCustomUiState(): {
35
- blockingInlineCustomUiDepth: number;
36
- blockingInlineCustomUiActive: boolean;
37
- };
38
- onHostCustomUiStateChange(listener: (state: {
39
- blockingInlineCustomUiDepth: number;
40
- blockingInlineCustomUiActive: boolean;
41
- }) => void): () => void;
36
+ getHostCustomUiState(): HostCustomUiState;
37
+ onHostCustomUiStateChange(listener: HostCustomUiStateListener): () => void;
42
38
  onWidgetRelease(key: string, listener: () => void): () => void;
43
39
  focusHostInlineCustomUi(): boolean;
44
40
  requestRender(): void;
@@ -1 +1 @@
1
- {"version":3,"file":"engine-custom-ui.d.ts","sourceRoot":"","sources":["../../../src/modes/interactive-engine/engine-custom-ui.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,KAAK,SAAS,EAEd,KAAK,aAAa,EAClB,KAAK,cAAc,EAEnB,KAAK,GAAG,EAER,MAAM,wBAAwB,CAAC;AAGhC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,+BAA+B,CAAC;AAY3D,UAAU,eAAe;IACxB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,wBAAwB,CAAC,EAAE,OAAO,CAAC;IACnC,gFAAgF;IAChF,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,+EAA+E;IAC/E,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC,2EAA2E;IAC3E,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,cAAc,CAAC,EAAE,cAAc,GAAG,CAAC,MAAM,cAAc,CAAC,CAAC;IACzD,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,aAAa,KAAK,IAAI,CAAC;IAC3C,MAAM,CAAC,EAAE,WAAW,CAAC;CACrB;AAkED,qBAAa,qBAAqB;IACjC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA6B;IACvD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAsC;IAC7D,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAyB;IAC/C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAqB;IACjD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAE3B;IACJ,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAsC;IAE7E,SAAS,CACR,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,KAAK,SAAS,GAAG;QAAE,OAAO,CAAC,IAAI,IAAI,CAAA;KAAE,CAAC,GAAG,SAAS,EACnF,SAAS,CAAC,EAAE,aAAa,GAAG,aAAa,GACvC,IAAI,CAwCN;IACD,YAAY,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,EAAE,WAAW,EAAE,kBAAkB,EAGzE;IAEK,MAAM,CAAC,CAAC,EACb,OAAO,EAAE,CACR,GAAG,EAAE,GAAG,EACR,KAAK,EAAE,KAAK,EACZ,WAAW,EAAE,kBAAkB,EAC/B,IAAI,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,IAAI,KACrB,CAAC,SAAS,GAAG;QAAE,OAAO,CAAC,IAAI,IAAI,CAAA;KAAE,CAAC,GAAG,OAAO,CAAC,SAAS,GAAG;QAAE,OAAO,CAAC,IAAI,IAAI,CAAA;KAAE,CAAC,EACnF,OAAO,CAAC,EAAE,eAAe,GACvB,OAAO,CAAC,CAAC,CAAC,CAsDZ;IACD,oBAAoB,IAAI;QAAE,2BAA2B,EAAE,MAAM,CAAC;QAAC,4BAA4B,EAAE,OAAO,CAAA;KAAE,CAGrG;IAED,yBAAyB,CACxB,QAAQ,EAAE,CAAC,KAAK,EAAE;QAAE,2BAA2B,EAAE,MAAM,CAAC;QAAC,4BAA4B,EAAE,OAAO,CAAA;KAAE,KAAK,IAAI,GACvG,MAAM,IAAI,CAGZ;IACD,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAQ7D;IAED,uBAAuB,IAAI,OAAO,CAEjC;IAED,aAAa,IAAI,IAAI,CAKpB;IAED,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAmEhC;IAED,OAAO,IAAI,IAAI,CAEd;IACD,OAAO,CAAC,gBAAgB;IAcxB,OAAO,CAAC,mBAAmB;IAS3B,OAAO,CAAC,WAAW;IAKnB,OAAO,CAAC,YAAY;IA6BpB,OAAO,CAAC,QAAQ;IAQhB,OAAO,CAAC,IAAI;CAGZ"}
1
+ {"version":3,"file":"engine-custom-ui.d.ts","sourceRoot":"","sources":["../../../src/modes/interactive-engine/engine-custom-ui.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,KAAK,SAAS,EAEd,KAAK,aAAa,EAClB,KAAK,cAAc,EAEnB,KAAK,GAAG,EAER,MAAM,wBAAwB,CAAC;AAGhC,OAAO,KAAK,EAAE,iBAAiB,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AACnG,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,+BAA+B,CAAC;AAY3D,UAAU,eAAe;IACxB,OAAO,CAAC,EAAE,QAAQ,GAAG,YAAY,CAAC;IAClC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,wBAAwB,CAAC,EAAE,OAAO,CAAC;IACnC,gFAAgF;IAChF,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,+EAA+E;IAC/E,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC,2EAA2E;IAC3E,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,cAAc,CAAC,EAAE,cAAc,GAAG,CAAC,MAAM,cAAc,CAAC,CAAC;IACzD,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,aAAa,KAAK,IAAI,CAAC;IAC3C,MAAM,CAAC,EAAE,WAAW,CAAC;CACrB;AAmED,qBAAa,qBAAqB;IACjC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA6B;IACvD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAsC;IAC7D,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAyB;IAC/C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAqB;IACjD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAwC;IACvE,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAsC;IAE7E,SAAS,CACR,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,KAAK,SAAS,GAAG;QAAE,OAAO,CAAC,IAAI,IAAI,CAAA;KAAE,CAAC,GAAG,SAAS,EACnF,SAAS,CAAC,EAAE,aAAa,GAAG,aAAa,GACvC,IAAI,CAwCN;IACD,YAAY,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,EAAE,WAAW,EAAE,kBAAkB,EAGzE;IAEK,MAAM,CAAC,CAAC,EACb,OAAO,EAAE,CACR,GAAG,EAAE,GAAG,EACR,KAAK,EAAE,KAAK,EACZ,WAAW,EAAE,kBAAkB,EAC/B,IAAI,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,IAAI,KACrB,CAAC,SAAS,GAAG;QAAE,OAAO,CAAC,IAAI,IAAI,CAAA;KAAE,CAAC,GAAG,OAAO,CAAC,SAAS,GAAG;QAAE,OAAO,CAAC,IAAI,IAAI,CAAA;KAAE,CAAC,EACnF,OAAO,CAAC,EAAE,eAAe,GACvB,OAAO,CAAC,CAAC,CAAC,CAyDZ;IACD,oBAAoB,IAAI,iBAAiB,CAQxC;IAED,yBAAyB,CAAC,QAAQ,EAAE,yBAAyB,GAAG,MAAM,IAAI,CAGzE;IACD,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAQ7D;IAED,uBAAuB,IAAI,OAAO,CAEjC;IAED,aAAa,IAAI,IAAI,CAKpB;IAED,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAmEhC;IAED,OAAO,IAAI,IAAI,CAEd;IACD,OAAO,CAAC,gBAAgB;IAexB,OAAO,CAAC,mBAAmB;IAS3B,OAAO,CAAC,WAAW;IAKnB,OAAO,CAAC,YAAY;IA6BpB,OAAO,CAAC,QAAQ;IAQhB,OAAO,CAAC,IAAI;CAGZ"}
@@ -127,10 +127,12 @@ export class EngineCustomUiService {
127
127
  tui.setFocus(component);
128
128
  const record = {
129
129
  component,
130
- resolve: (value) => resolveCompletion(value),
130
+ // Cancellation must settle through the same guarded host completion as done().
131
+ resolve: (value) => done(value),
131
132
  terminal,
132
133
  tui,
133
134
  overlay: options?.overlay === true,
135
+ purpose: options?.purpose,
134
136
  };
135
137
  this.active.set(componentId, record);
136
138
  this.notifyState();
@@ -139,6 +141,7 @@ export class EngineCustomUiService {
139
141
  type: "engine_custom_open",
140
142
  componentId,
141
143
  overlay: options?.overlay === true,
144
+ purpose: options?.purpose,
142
145
  deferInlineCustomUiFocus: options?.deferInlineCustomUiFocus,
143
146
  handlesCtrlC: options?.handlesCtrlC,
144
147
  handlesInternalUiAction: options?.handlesInternalUiAction,
@@ -160,8 +163,13 @@ export class EngineCustomUiService {
160
163
  }
161
164
  }
162
165
  getHostCustomUiState() {
163
- const depth = [...this.active.values()].filter((record) => !record.overlay && !record.widgetKey).length;
164
- return { blockingInlineCustomUiDepth: depth, blockingInlineCustomUiActive: depth > 0 };
166
+ const inline = [...this.active.values()].filter((record) => !record.overlay && !record.widgetKey);
167
+ const navigation = inline.filter((record) => record.purpose === "navigation").length;
168
+ return {
169
+ blockingInlineCustomUiDepth: inline.length,
170
+ blockingInlineCustomUiActive: inline.length > 0,
171
+ ...(navigation > 0 ? { blockingInlineCustomUiNeedsInput: inline.length > navigation } : {}),
172
+ };
165
173
  }
166
174
  onHostCustomUiStateChange(listener) {
167
175
  this.stateListeners.add(listener);
@@ -257,6 +265,9 @@ export class EngineCustomUiService {
257
265
  if (!record)
258
266
  return;
259
267
  this.active.delete(componentId);
268
+ // Claim cancellation before user disposal code can call done() reentrantly.
269
+ if (resolve)
270
+ record.resolve(undefined);
260
271
  record.component.dispose?.();
261
272
  record.tui.stop();
262
273
  if (record.widgetKey) {
@@ -267,8 +278,6 @@ export class EngineCustomUiService {
267
278
  this.notifyWidgetRelease(record.widgetKey);
268
279
  }
269
280
  this.notifyState();
270
- if (resolve)
271
- record.resolve(undefined);
272
281
  }
273
282
  notifyWidgetRelease(key) {
274
283
  for (const listener of this.widgetReleaseListeners.get(key) ?? []) {
@@ -1 +1 @@
1
- {"version":3,"file":"engine-custom-ui.js","sourceRoot":"","sources":["../../../src/modes/interactive-engine/engine-custom-ui.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n\ttype Component,\n\tisKeyRelease,\n\ttype OverlayHandle,\n\ttype OverlayOptions,\n\ttype Terminal,\n\ttype TUI,\n\tTuiMainScreen,\n} from \"@earendil-works/pi-tui\";\nimport { getAgentDir } from \"../../config.js\";\nimport { runCallback } from \"../../core/callback-activity.ts\";\nimport type { KeybindingsManager } from \"../../core/keybindings.ts\";\nimport type { Theme } from \"../interactive/theme/theme.ts\";\nimport { theme } from \"../interactive/theme/theme.ts\";\nimport {\n\ttype EngineTerminalControl,\n\ttype InteractiveEngineMessage,\n\tisJsonValue,\n\ttype JsonValue,\n\tparseInteractiveEngineCommand,\n\ttype SerializableOverlayOptions,\n\tserializeInteractiveEngineMessage,\n} from \"./protocol.ts\";\n\ninterface CustomUiOptions {\n\toverlay?: boolean;\n\tdeferInlineCustomUiFocus?: boolean;\n\t/** The component binds Ctrl+C itself; see ExtensionUIContext.custom options. */\n\thandlesCtrlC?: boolean;\n\t/** The component claims internal UI actions such as the jump-to-bottom URL. */\n\thandlesInternalUiAction?: boolean;\n\t/** Bound this overlay and reserve transcript scroll extent on the host. */\n\treserveTranscriptRows?: boolean;\n\toverlayOptions?: OverlayOptions | (() => OverlayOptions);\n\tonHandle?: (handle: OverlayHandle) => void;\n\tsignal?: AbortSignal;\n}\n\ninterface ActiveComponent {\n\tcomponent: Component & { dispose?(): void };\n\tresolve: (value: JsonValue | undefined) => void;\n\toverlay: boolean;\n\tterminal: RemoteTerminal;\n\ttui: TUI;\n\twidgetKey?: string;\n\t/**\n\t * Overlay visibility as last driven through the remote OverlayHandle.\n\t * Hidden components are skipped by the extension-level `requestRender()`\n\t * broadcast (#1856) — invalidating a hidden overlay only produced host\n\t * render work and terminal writes for frames the user cannot see.\n\t */\n\thidden?: boolean;\n}\n\nclass RemoteTerminal implements Terminal {\n\tcolumns = 80;\n\trows = 24;\n\tkittyProtocolActive = false;\n\tprivate readonly invalidate: () => void;\n\tprivate readonly control: ((control: EngineTerminalControl) => void) | undefined;\n\tconstructor(invalidate: () => void, control?: (control: EngineTerminalControl) => void) {\n\t\tthis.invalidate = invalidate;\n\t\tthis.control = control;\n\t}\n\tstart(): void {}\n\tstop(): void {}\n\tasync drainInput(): Promise<void> {}\n\twrite(): void {\n\t\tthis.invalidate();\n\t}\n\tmoveBy(): void {}\n\thideCursor(): void {}\n\tshowCursor(): void {}\n\tclearLine(): void {}\n\tclearFromCursor(): void {}\n\tclearScreen(): void {}\n\tsetTitle(): void {}\n\tsetProgress(): void {}\n\t/** Ask the host to toggle host-TTY autowrap (DECAWM) for this component. */\n\tsetAutowrap(enabled: boolean): void {\n\t\tthis.control?.({ kind: \"autowrap\", enabled });\n\t}\n}\n\nfunction serializableOverlayOptions(\n\toptions: CustomUiOptions[\"overlayOptions\"],\n): SerializableOverlayOptions | undefined {\n\tconst value = typeof options === \"function\" ? options() : options;\n\tif (!value) return undefined;\n\tconst { anchor, col, margin, maxHeight, minWidth, offsetX, offsetY, row, width } = value;\n\treturn { anchor, col, margin, maxHeight, minWidth, offsetX, offsetY, row, width };\n}\n\nfunction jsonResult(value: object | boolean | null | number | string | undefined): JsonValue | undefined {\n\tif (value === undefined) return undefined;\n\tconst encoded = JSON.stringify(value);\n\tif (encoded === undefined) return undefined;\n\tconst decoded = JSON.parse(encoded) as JsonValue;\n\tif (!isJsonValue(decoded)) throw new Error(\"Custom UI result is not JSON-safe\");\n\treturn decoded;\n}\n\nexport class EngineCustomUiService {\n\tprivate readonly widgetIds = new Map<string, string>();\n\tprivate readonly active = new Map<string, ActiveComponent>();\n\tprivate nextId = 0;\n\tprivate readonly write: (line: string) => void;\n\tprivate readonly keybindings: KeybindingsManager;\n\tprivate readonly stateListeners = new Set<\n\t\t(state: { blockingInlineCustomUiDepth: number; blockingInlineCustomUiActive: boolean }) => void\n\t>();\n\tprivate readonly widgetReleaseListeners = new Map<string, Set<() => void>>();\n\n\tsetWidget(\n\t\tkey: string,\n\t\tfactory: ((tui: TUI, theme: Theme) => Component & { dispose?(): void }) | undefined,\n\t\tplacement?: \"aboveEditor\" | \"belowEditor\",\n\t): void {\n\t\tconst previous = this.widgetIds.get(key);\n\t\tif (previous) this.disposeComponent(previous, false, false);\n\t\tif (!factory) return;\n\t\tconst componentId = `remote_widget_${++this.nextId}`;\n\t\tthis.widgetIds.set(key, componentId);\n\t\tconst terminal = new RemoteTerminal(() => this.send({ type: \"engine_custom_invalidate\", componentId }));\n\t\tconst tui = new TuiMainScreen(terminal, undefined, getAgentDir());\n\t\tvoid runCallback({ kind: \"renderer\", name: `widget:${key}` }, () => factory(tui, theme))\n\t\t\t.then((component) => {\n\t\t\t\tif (this.widgetIds.get(key) !== componentId) {\n\t\t\t\t\tcomponent.dispose?.();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\ttui.addChild(component);\n\t\t\t\tthis.active.set(componentId, {\n\t\t\t\t\tcomponent,\n\t\t\t\t\tresolve: () => {},\n\t\t\t\t\toverlay: false,\n\t\t\t\t\tterminal,\n\t\t\t\t\ttui,\n\t\t\t\t\twidgetKey: key,\n\t\t\t\t});\n\t\t\t\tthis.send({\n\t\t\t\t\ttype: \"engine_custom_open\",\n\t\t\t\t\tcomponentId,\n\t\t\t\t\toverlay: false,\n\t\t\t\t\twidgetKey: key,\n\t\t\t\t\twidgetPlacement: placement,\n\t\t\t\t});\n\t\t\t})\n\t\t\t.catch((error: Error) => {\n\t\t\t\tif (this.widgetIds.get(key) === componentId) this.widgetIds.delete(key);\n\t\t\t\tthis.send({\n\t\t\t\t\ttype: \"engine_custom_frame\",\n\t\t\t\t\tcomponentId,\n\t\t\t\t\trequestId: 0,\n\t\t\t\t\tlines: [`Widget ${key} failed: ${error.message}`],\n\t\t\t\t});\n\t\t\t});\n\t}\n\tconstructor(write: (line: string) => void, keybindings: KeybindingsManager) {\n\t\tthis.write = write;\n\t\tthis.keybindings = keybindings;\n\t}\n\n\tasync custom<T>(\n\t\tfactory: (\n\t\t\ttui: TUI,\n\t\t\ttheme: Theme,\n\t\t\tkeybindings: KeybindingsManager,\n\t\t\tdone: (result: T) => void,\n\t\t) => (Component & { dispose?(): void }) | Promise<Component & { dispose?(): void }>,\n\t\toptions?: CustomUiOptions,\n\t): Promise<T> {\n\t\tconst componentId = `remote_component_${++this.nextId}`;\n\t\tlet resolveCompletion!: (value: T) => void;\n\t\tconst completion = new Promise<T>((resolve) => {\n\t\t\tresolveCompletion = resolve;\n\t\t});\n\t\tlet opened = false;\n\t\tlet pendingDone: T | undefined;\n\t\tlet doneCalled = false;\n\t\tconst done = (result: T): void => {\n\t\t\tif (doneCalled) return;\n\t\t\tdoneCalled = true;\n\t\t\tpendingDone = result;\n\t\t\tresolveCompletion(result);\n\t\t\tif (opened) this.sendDone(componentId, result);\n\t\t};\n\t\tconst terminal = new RemoteTerminal(\n\t\t\t() => this.send({ type: \"engine_custom_invalidate\", componentId }),\n\t\t\t(control) => this.send({ type: \"engine_custom_terminal\", componentId, control }),\n\t\t);\n\t\tconst tui = new TuiMainScreen(terminal, undefined, getAgentDir());\n\t\tconst component = await factory(tui, theme, this.keybindings, done);\n\t\ttui.addChild(component);\n\t\ttui.setFocus(component);\n\t\tconst record: ActiveComponent = {\n\t\t\tcomponent,\n\t\t\tresolve: (value) => resolveCompletion(value as T),\n\t\t\tterminal,\n\t\t\ttui,\n\t\t\toverlay: options?.overlay === true,\n\t\t};\n\t\tthis.active.set(componentId, record);\n\t\tthis.notifyState();\n\t\topened = true;\n\t\tthis.send({\n\t\t\ttype: \"engine_custom_open\",\n\t\t\tcomponentId,\n\t\t\toverlay: options?.overlay === true,\n\t\t\tdeferInlineCustomUiFocus: options?.deferInlineCustomUiFocus,\n\t\t\thandlesCtrlC: options?.handlesCtrlC,\n\t\t\thandlesInternalUiAction: options?.handlesInternalUiAction,\n\t\t\treserveTranscriptRows: options?.reserveTranscriptRows,\n\t\t\toverlayOptions: serializableOverlayOptions(options?.overlayOptions),\n\t\t});\n\t\tif (options?.onHandle) options.onHandle(this.remoteHandle(componentId));\n\t\tif (doneCalled) this.sendDone(componentId, pendingDone as T);\n\t\tconst onAbort = () => this.disposeComponent(componentId, true);\n\t\toptions?.signal?.addEventListener(\"abort\", onAbort, { once: true });\n\t\ttry {\n\t\t\treturn await completion;\n\t\t} finally {\n\t\t\toptions?.signal?.removeEventListener(\"abort\", onAbort);\n\t\t\tthis.disposeComponent(componentId, false);\n\t\t}\n\t}\n\tgetHostCustomUiState(): { blockingInlineCustomUiDepth: number; blockingInlineCustomUiActive: boolean } {\n\t\tconst depth = [...this.active.values()].filter((record) => !record.overlay && !record.widgetKey).length;\n\t\treturn { blockingInlineCustomUiDepth: depth, blockingInlineCustomUiActive: depth > 0 };\n\t}\n\n\tonHostCustomUiStateChange(\n\t\tlistener: (state: { blockingInlineCustomUiDepth: number; blockingInlineCustomUiActive: boolean }) => void,\n\t): () => void {\n\t\tthis.stateListeners.add(listener);\n\t\treturn () => this.stateListeners.delete(listener);\n\t}\n\tonWidgetRelease(key: string, listener: () => void): () => void {\n\t\tconst listeners = this.widgetReleaseListeners.get(key) ?? new Set<() => void>();\n\t\tlisteners.add(listener);\n\t\tthis.widgetReleaseListeners.set(key, listeners);\n\t\treturn () => {\n\t\t\tlisteners.delete(listener);\n\t\t\tif (listeners.size === 0) this.widgetReleaseListeners.delete(key);\n\t\t};\n\t}\n\n\tfocusHostInlineCustomUi(): boolean {\n\t\treturn this.getHostCustomUiState().blockingInlineCustomUiActive;\n\t}\n\n\trequestRender(): void {\n\t\tfor (const [componentId, record] of this.active) {\n\t\t\tif (record.hidden === true) continue;\n\t\t\tthis.send({ type: \"engine_custom_invalidate\", componentId });\n\t\t}\n\t}\n\n\thandleLine(line: string): boolean {\n\t\tconst command = parseInteractiveEngineCommand(line);\n\t\tif (!command) return false;\n\t\tif (!command.type.startsWith(\"engine_custom_\")) return false;\n\t\tconst record = this.active.get(command.componentId);\n\t\tif (!record) {\n\t\t\tif (command.type === \"engine_custom_input\")\n\t\t\t\tthis.send({\n\t\t\t\t\ttype: \"engine_custom_input_result\",\n\t\t\t\t\tcomponentId: command.componentId,\n\t\t\t\t\trequestId: command.requestId,\n\t\t\t\t\thandled: false,\n\t\t\t\t});\n\t\t\treturn true;\n\t\t}\n\t\tswitch (command.type) {\n\t\t\tcase \"engine_custom_render\":\n\t\t\t\trecord.terminal.columns = Math.max(1, command.width);\n\t\t\t\trecord.terminal.rows = Math.max(1, command.rows);\n\t\t\t\tvoid runCallback({ kind: \"renderer\", name: command.componentId }, () =>\n\t\t\t\t\trecord.component.render(record.terminal.columns),\n\t\t\t\t)\n\t\t\t\t\t.then((lines) =>\n\t\t\t\t\t\tthis.send({\n\t\t\t\t\t\t\ttype: \"engine_custom_frame\",\n\t\t\t\t\t\t\tcomponentId: command.componentId,\n\t\t\t\t\t\t\trequestId: command.requestId,\n\t\t\t\t\t\t\tlines,\n\t\t\t\t\t\t}),\n\t\t\t\t\t)\n\t\t\t\t\t.catch((error: Error) =>\n\t\t\t\t\t\tthis.send({\n\t\t\t\t\t\t\ttype: \"engine_custom_frame\",\n\t\t\t\t\t\t\tcomponentId: command.componentId,\n\t\t\t\t\t\t\trequestId: command.requestId,\n\t\t\t\t\t\t\tlines: [`Remote component render failed: ${error.message}`],\n\t\t\t\t\t\t}),\n\t\t\t\t\t);\n\t\t\t\tbreak;\n\t\t\tcase \"engine_custom_input\":\n\t\t\t\tvoid runCallback({ kind: \"renderer\", name: command.componentId }, () => {\n\t\t\t\t\tif (isKeyRelease(command.data) && record.component.wantsKeyRelease !== true) return false;\n\t\t\t\t\tconst handleInput = record.component.handleInput as ((data: string) => boolean | undefined) | undefined;\n\t\t\t\t\treturn handleInput?.call(record.component, command.data) === true;\n\t\t\t\t})\n\t\t\t\t\t.then((handled) =>\n\t\t\t\t\t\tthis.send({\n\t\t\t\t\t\t\ttype: \"engine_custom_input_result\",\n\t\t\t\t\t\t\tcomponentId: command.componentId,\n\t\t\t\t\t\t\trequestId: command.requestId,\n\t\t\t\t\t\t\thandled,\n\t\t\t\t\t\t}),\n\t\t\t\t\t)\n\t\t\t\t\t.catch(() =>\n\t\t\t\t\t\tthis.send({\n\t\t\t\t\t\t\ttype: \"engine_custom_input_result\",\n\t\t\t\t\t\t\tcomponentId: command.componentId,\n\t\t\t\t\t\t\trequestId: command.requestId,\n\t\t\t\t\t\t\thandled: false,\n\t\t\t\t\t\t}),\n\t\t\t\t\t);\n\t\t\t\tbreak;\n\t\t\tcase \"engine_custom_dispose\":\n\t\t\t\tthis.disposeComponent(command.componentId, true);\n\t\t\t\tbreak;\n\t\t}\n\t\treturn true;\n\t}\n\n\tdispose(): void {\n\t\tfor (const componentId of [...this.active.keys()]) this.disposeComponent(componentId, true, false);\n\t}\n\tprivate disposeComponent(componentId: string, resolve: boolean, notifyWidgetRelease = true): void {\n\t\tconst record = this.active.get(componentId);\n\t\tif (!record) return;\n\t\tthis.active.delete(componentId);\n\t\trecord.component.dispose?.();\n\t\trecord.tui.stop();\n\t\tif (record.widgetKey) {\n\t\t\tif (this.widgetIds.get(record.widgetKey) === componentId) this.widgetIds.delete(record.widgetKey);\n\t\t\tthis.send({ type: \"engine_custom_close\", componentId });\n\t\t\tif (notifyWidgetRelease) this.notifyWidgetRelease(record.widgetKey);\n\t\t}\n\t\tthis.notifyState();\n\t\tif (resolve) record.resolve(undefined);\n\t}\n\tprivate notifyWidgetRelease(key: string): void {\n\t\tfor (const listener of this.widgetReleaseListeners.get(key) ?? []) {\n\t\t\ttry {\n\t\t\t\tlistener();\n\t\t\t} catch {\n\t\t\t\t// A release observer must not break engine UI teardown.\n\t\t\t}\n\t\t}\n\t}\n\tprivate notifyState(): void {\n\t\tconst state = this.getHostCustomUiState();\n\t\tfor (const listener of this.stateListeners) listener(state);\n\t}\n\n\tprivate remoteHandle(componentId: string): OverlayHandle {\n\t\tlet focused = true;\n\t\tconst setHiddenFlag = (value: boolean): void => {\n\t\t\tconst record = this.active.get(componentId);\n\t\t\tif (record) record.hidden = value;\n\t\t};\n\t\treturn {\n\t\t\thide: () => {\n\t\t\t\tsetHiddenFlag(true);\n\t\t\t\tthis.send({ type: \"engine_custom_control\", componentId, action: \"hide\" });\n\t\t\t},\n\t\t\tsetHidden: (value) => {\n\t\t\t\tsetHiddenFlag(value);\n\t\t\t\tthis.send({ type: \"engine_custom_control\", componentId, action: value ? \"hide\" : \"show\" });\n\t\t\t},\n\t\t\tisHidden: () => this.active.get(componentId)?.hidden === true,\n\t\t\tfocus: () => {\n\t\t\t\tfocused = true;\n\t\t\t\tthis.send({ type: \"engine_custom_control\", componentId, action: \"focus\" });\n\t\t\t},\n\t\t\tunfocus: () => {\n\t\t\t\tfocused = false;\n\t\t\t\tthis.send({ type: \"engine_custom_control\", componentId, action: \"unfocus\" });\n\t\t\t},\n\t\t\tisFocused: () => focused,\n\t\t\tgetBounds: () => undefined,\n\t\t};\n\t}\n\n\tprivate sendDone<T>(componentId: string, result: T): void {\n\t\tthis.send({\n\t\t\ttype: \"engine_custom_done\",\n\t\t\tcomponentId,\n\t\t\tresult: jsonResult(result as object | boolean | null | number | string | undefined),\n\t\t});\n\t}\n\n\tprivate send(message: InteractiveEngineMessage): void {\n\t\tthis.write(serializeInteractiveEngineMessage(message));\n\t}\n}\n"]}
1
+ {"version":3,"file":"engine-custom-ui.js","sourceRoot":"","sources":["../../../src/modes/interactive-engine/engine-custom-ui.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n\ttype Component,\n\tisKeyRelease,\n\ttype OverlayHandle,\n\ttype OverlayOptions,\n\ttype Terminal,\n\ttype TUI,\n\tTuiMainScreen,\n} from \"@earendil-works/pi-tui\";\nimport { getAgentDir } from \"../../config.js\";\nimport { runCallback } from \"../../core/callback-activity.ts\";\nimport type { HostCustomUiState, HostCustomUiStateListener } from \"../../core/extensions/index.js\";\nimport type { KeybindingsManager } from \"../../core/keybindings.ts\";\nimport type { Theme } from \"../interactive/theme/theme.js\";\nimport { theme } from \"../interactive/theme/theme.js\";\nimport {\n\ttype EngineTerminalControl,\n\ttype InteractiveEngineMessage,\n\tisJsonValue,\n\ttype JsonValue,\n\tparseInteractiveEngineCommand,\n\ttype SerializableOverlayOptions,\n\tserializeInteractiveEngineMessage,\n} from \"./protocol.ts\";\n\ninterface CustomUiOptions {\n\tpurpose?: \"prompt\" | \"navigation\";\n\toverlay?: boolean;\n\tdeferInlineCustomUiFocus?: boolean;\n\t/** The component binds Ctrl+C itself; see ExtensionUIContext.custom options. */\n\thandlesCtrlC?: boolean;\n\t/** The component claims internal UI actions such as the jump-to-bottom URL. */\n\thandlesInternalUiAction?: boolean;\n\t/** Bound this overlay and reserve transcript scroll extent on the host. */\n\treserveTranscriptRows?: boolean;\n\toverlayOptions?: OverlayOptions | (() => OverlayOptions);\n\tonHandle?: (handle: OverlayHandle) => void;\n\tsignal?: AbortSignal;\n}\n\ninterface ActiveComponent {\n\tcomponent: Component & { dispose?(): void };\n\tresolve: (value: JsonValue | undefined) => void;\n\toverlay: boolean;\n\tpurpose?: \"prompt\" | \"navigation\";\n\tterminal: RemoteTerminal;\n\ttui: TUI;\n\twidgetKey?: string;\n\t/**\n\t * Overlay visibility as last driven through the remote OverlayHandle.\n\t * Hidden components are skipped by the extension-level `requestRender()`\n\t * broadcast (#1856) — invalidating a hidden overlay only produced host\n\t * render work and terminal writes for frames the user cannot see.\n\t */\n\thidden?: boolean;\n}\n\nclass RemoteTerminal implements Terminal {\n\tcolumns = 80;\n\trows = 24;\n\tkittyProtocolActive = false;\n\tprivate readonly invalidate: () => void;\n\tprivate readonly control: ((control: EngineTerminalControl) => void) | undefined;\n\tconstructor(invalidate: () => void, control?: (control: EngineTerminalControl) => void) {\n\t\tthis.invalidate = invalidate;\n\t\tthis.control = control;\n\t}\n\tstart(): void {}\n\tstop(): void {}\n\tasync drainInput(): Promise<void> {}\n\twrite(): void {\n\t\tthis.invalidate();\n\t}\n\tmoveBy(): void {}\n\thideCursor(): void {}\n\tshowCursor(): void {}\n\tclearLine(): void {}\n\tclearFromCursor(): void {}\n\tclearScreen(): void {}\n\tsetTitle(): void {}\n\tsetProgress(): void {}\n\t/** Ask the host to toggle host-TTY autowrap (DECAWM) for this component. */\n\tsetAutowrap(enabled: boolean): void {\n\t\tthis.control?.({ kind: \"autowrap\", enabled });\n\t}\n}\n\nfunction serializableOverlayOptions(\n\toptions: CustomUiOptions[\"overlayOptions\"],\n): SerializableOverlayOptions | undefined {\n\tconst value = typeof options === \"function\" ? options() : options;\n\tif (!value) return undefined;\n\tconst { anchor, col, margin, maxHeight, minWidth, offsetX, offsetY, row, width } = value;\n\treturn { anchor, col, margin, maxHeight, minWidth, offsetX, offsetY, row, width };\n}\n\nfunction jsonResult(value: object | boolean | null | number | string | undefined): JsonValue | undefined {\n\tif (value === undefined) return undefined;\n\tconst encoded = JSON.stringify(value);\n\tif (encoded === undefined) return undefined;\n\tconst decoded = JSON.parse(encoded) as JsonValue;\n\tif (!isJsonValue(decoded)) throw new Error(\"Custom UI result is not JSON-safe\");\n\treturn decoded;\n}\n\nexport class EngineCustomUiService {\n\tprivate readonly widgetIds = new Map<string, string>();\n\tprivate readonly active = new Map<string, ActiveComponent>();\n\tprivate nextId = 0;\n\tprivate readonly write: (line: string) => void;\n\tprivate readonly keybindings: KeybindingsManager;\n\tprivate readonly stateListeners = new Set<HostCustomUiStateListener>();\n\tprivate readonly widgetReleaseListeners = new Map<string, Set<() => void>>();\n\n\tsetWidget(\n\t\tkey: string,\n\t\tfactory: ((tui: TUI, theme: Theme) => Component & { dispose?(): void }) | undefined,\n\t\tplacement?: \"aboveEditor\" | \"belowEditor\",\n\t): void {\n\t\tconst previous = this.widgetIds.get(key);\n\t\tif (previous) this.disposeComponent(previous, false, false);\n\t\tif (!factory) return;\n\t\tconst componentId = `remote_widget_${++this.nextId}`;\n\t\tthis.widgetIds.set(key, componentId);\n\t\tconst terminal = new RemoteTerminal(() => this.send({ type: \"engine_custom_invalidate\", componentId }));\n\t\tconst tui = new TuiMainScreen(terminal, undefined, getAgentDir());\n\t\tvoid runCallback({ kind: \"renderer\", name: `widget:${key}` }, () => factory(tui, theme))\n\t\t\t.then((component) => {\n\t\t\t\tif (this.widgetIds.get(key) !== componentId) {\n\t\t\t\t\tcomponent.dispose?.();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\ttui.addChild(component);\n\t\t\t\tthis.active.set(componentId, {\n\t\t\t\t\tcomponent,\n\t\t\t\t\tresolve: () => {},\n\t\t\t\t\toverlay: false,\n\t\t\t\t\tterminal,\n\t\t\t\t\ttui,\n\t\t\t\t\twidgetKey: key,\n\t\t\t\t});\n\t\t\t\tthis.send({\n\t\t\t\t\ttype: \"engine_custom_open\",\n\t\t\t\t\tcomponentId,\n\t\t\t\t\toverlay: false,\n\t\t\t\t\twidgetKey: key,\n\t\t\t\t\twidgetPlacement: placement,\n\t\t\t\t});\n\t\t\t})\n\t\t\t.catch((error: Error) => {\n\t\t\t\tif (this.widgetIds.get(key) === componentId) this.widgetIds.delete(key);\n\t\t\t\tthis.send({\n\t\t\t\t\ttype: \"engine_custom_frame\",\n\t\t\t\t\tcomponentId,\n\t\t\t\t\trequestId: 0,\n\t\t\t\t\tlines: [`Widget ${key} failed: ${error.message}`],\n\t\t\t\t});\n\t\t\t});\n\t}\n\tconstructor(write: (line: string) => void, keybindings: KeybindingsManager) {\n\t\tthis.write = write;\n\t\tthis.keybindings = keybindings;\n\t}\n\n\tasync custom<T>(\n\t\tfactory: (\n\t\t\ttui: TUI,\n\t\t\ttheme: Theme,\n\t\t\tkeybindings: KeybindingsManager,\n\t\t\tdone: (result: T) => void,\n\t\t) => (Component & { dispose?(): void }) | Promise<Component & { dispose?(): void }>,\n\t\toptions?: CustomUiOptions,\n\t): Promise<T> {\n\t\tconst componentId = `remote_component_${++this.nextId}`;\n\t\tlet resolveCompletion!: (value: T) => void;\n\t\tconst completion = new Promise<T>((resolve) => {\n\t\t\tresolveCompletion = resolve;\n\t\t});\n\t\tlet opened = false;\n\t\tlet pendingDone: T | undefined;\n\t\tlet doneCalled = false;\n\t\tconst done = (result: T): void => {\n\t\t\tif (doneCalled) return;\n\t\t\tdoneCalled = true;\n\t\t\tpendingDone = result;\n\t\t\tresolveCompletion(result);\n\t\t\tif (opened) this.sendDone(componentId, result);\n\t\t};\n\t\tconst terminal = new RemoteTerminal(\n\t\t\t() => this.send({ type: \"engine_custom_invalidate\", componentId }),\n\t\t\t(control) => this.send({ type: \"engine_custom_terminal\", componentId, control }),\n\t\t);\n\t\tconst tui = new TuiMainScreen(terminal, undefined, getAgentDir());\n\t\tconst component = await factory(tui, theme, this.keybindings, done);\n\t\ttui.addChild(component);\n\t\ttui.setFocus(component);\n\t\tconst record: ActiveComponent = {\n\t\t\tcomponent,\n\t\t\t// Cancellation must settle through the same guarded host completion as done().\n\t\t\tresolve: (value) => done(value as T),\n\t\t\tterminal,\n\t\t\ttui,\n\t\t\toverlay: options?.overlay === true,\n\t\t\tpurpose: options?.purpose,\n\t\t};\n\t\tthis.active.set(componentId, record);\n\t\tthis.notifyState();\n\t\topened = true;\n\t\tthis.send({\n\t\t\ttype: \"engine_custom_open\",\n\t\t\tcomponentId,\n\t\t\toverlay: options?.overlay === true,\n\t\t\tpurpose: options?.purpose,\n\t\t\tdeferInlineCustomUiFocus: options?.deferInlineCustomUiFocus,\n\t\t\thandlesCtrlC: options?.handlesCtrlC,\n\t\t\thandlesInternalUiAction: options?.handlesInternalUiAction,\n\t\t\treserveTranscriptRows: options?.reserveTranscriptRows,\n\t\t\toverlayOptions: serializableOverlayOptions(options?.overlayOptions),\n\t\t});\n\t\tif (options?.onHandle) options.onHandle(this.remoteHandle(componentId));\n\t\tif (doneCalled) this.sendDone(componentId, pendingDone as T);\n\t\tconst onAbort = () => this.disposeComponent(componentId, true);\n\t\toptions?.signal?.addEventListener(\"abort\", onAbort, { once: true });\n\t\ttry {\n\t\t\treturn await completion;\n\t\t} finally {\n\t\t\toptions?.signal?.removeEventListener(\"abort\", onAbort);\n\t\t\tthis.disposeComponent(componentId, false);\n\t\t}\n\t}\n\tgetHostCustomUiState(): HostCustomUiState {\n\t\tconst inline = [...this.active.values()].filter((record) => !record.overlay && !record.widgetKey);\n\t\tconst navigation = inline.filter((record) => record.purpose === \"navigation\").length;\n\t\treturn {\n\t\t\tblockingInlineCustomUiDepth: inline.length,\n\t\t\tblockingInlineCustomUiActive: inline.length > 0,\n\t\t\t...(navigation > 0 ? { blockingInlineCustomUiNeedsInput: inline.length > navigation } : {}),\n\t\t};\n\t}\n\n\tonHostCustomUiStateChange(listener: HostCustomUiStateListener): () => void {\n\t\tthis.stateListeners.add(listener);\n\t\treturn () => this.stateListeners.delete(listener);\n\t}\n\tonWidgetRelease(key: string, listener: () => void): () => void {\n\t\tconst listeners = this.widgetReleaseListeners.get(key) ?? new Set<() => void>();\n\t\tlisteners.add(listener);\n\t\tthis.widgetReleaseListeners.set(key, listeners);\n\t\treturn () => {\n\t\t\tlisteners.delete(listener);\n\t\t\tif (listeners.size === 0) this.widgetReleaseListeners.delete(key);\n\t\t};\n\t}\n\n\tfocusHostInlineCustomUi(): boolean {\n\t\treturn this.getHostCustomUiState().blockingInlineCustomUiActive;\n\t}\n\n\trequestRender(): void {\n\t\tfor (const [componentId, record] of this.active) {\n\t\t\tif (record.hidden === true) continue;\n\t\t\tthis.send({ type: \"engine_custom_invalidate\", componentId });\n\t\t}\n\t}\n\n\thandleLine(line: string): boolean {\n\t\tconst command = parseInteractiveEngineCommand(line);\n\t\tif (!command) return false;\n\t\tif (!command.type.startsWith(\"engine_custom_\")) return false;\n\t\tconst record = this.active.get(command.componentId);\n\t\tif (!record) {\n\t\t\tif (command.type === \"engine_custom_input\")\n\t\t\t\tthis.send({\n\t\t\t\t\ttype: \"engine_custom_input_result\",\n\t\t\t\t\tcomponentId: command.componentId,\n\t\t\t\t\trequestId: command.requestId,\n\t\t\t\t\thandled: false,\n\t\t\t\t});\n\t\t\treturn true;\n\t\t}\n\t\tswitch (command.type) {\n\t\t\tcase \"engine_custom_render\":\n\t\t\t\trecord.terminal.columns = Math.max(1, command.width);\n\t\t\t\trecord.terminal.rows = Math.max(1, command.rows);\n\t\t\t\tvoid runCallback({ kind: \"renderer\", name: command.componentId }, () =>\n\t\t\t\t\trecord.component.render(record.terminal.columns),\n\t\t\t\t)\n\t\t\t\t\t.then((lines) =>\n\t\t\t\t\t\tthis.send({\n\t\t\t\t\t\t\ttype: \"engine_custom_frame\",\n\t\t\t\t\t\t\tcomponentId: command.componentId,\n\t\t\t\t\t\t\trequestId: command.requestId,\n\t\t\t\t\t\t\tlines,\n\t\t\t\t\t\t}),\n\t\t\t\t\t)\n\t\t\t\t\t.catch((error: Error) =>\n\t\t\t\t\t\tthis.send({\n\t\t\t\t\t\t\ttype: \"engine_custom_frame\",\n\t\t\t\t\t\t\tcomponentId: command.componentId,\n\t\t\t\t\t\t\trequestId: command.requestId,\n\t\t\t\t\t\t\tlines: [`Remote component render failed: ${error.message}`],\n\t\t\t\t\t\t}),\n\t\t\t\t\t);\n\t\t\t\tbreak;\n\t\t\tcase \"engine_custom_input\":\n\t\t\t\tvoid runCallback({ kind: \"renderer\", name: command.componentId }, () => {\n\t\t\t\t\tif (isKeyRelease(command.data) && record.component.wantsKeyRelease !== true) return false;\n\t\t\t\t\tconst handleInput = record.component.handleInput as ((data: string) => boolean | undefined) | undefined;\n\t\t\t\t\treturn handleInput?.call(record.component, command.data) === true;\n\t\t\t\t})\n\t\t\t\t\t.then((handled) =>\n\t\t\t\t\t\tthis.send({\n\t\t\t\t\t\t\ttype: \"engine_custom_input_result\",\n\t\t\t\t\t\t\tcomponentId: command.componentId,\n\t\t\t\t\t\t\trequestId: command.requestId,\n\t\t\t\t\t\t\thandled,\n\t\t\t\t\t\t}),\n\t\t\t\t\t)\n\t\t\t\t\t.catch(() =>\n\t\t\t\t\t\tthis.send({\n\t\t\t\t\t\t\ttype: \"engine_custom_input_result\",\n\t\t\t\t\t\t\tcomponentId: command.componentId,\n\t\t\t\t\t\t\trequestId: command.requestId,\n\t\t\t\t\t\t\thandled: false,\n\t\t\t\t\t\t}),\n\t\t\t\t\t);\n\t\t\t\tbreak;\n\t\t\tcase \"engine_custom_dispose\":\n\t\t\t\tthis.disposeComponent(command.componentId, true);\n\t\t\t\tbreak;\n\t\t}\n\t\treturn true;\n\t}\n\n\tdispose(): void {\n\t\tfor (const componentId of [...this.active.keys()]) this.disposeComponent(componentId, true, false);\n\t}\n\tprivate disposeComponent(componentId: string, resolve: boolean, notifyWidgetRelease = true): void {\n\t\tconst record = this.active.get(componentId);\n\t\tif (!record) return;\n\t\tthis.active.delete(componentId);\n\t\t// Claim cancellation before user disposal code can call done() reentrantly.\n\t\tif (resolve) record.resolve(undefined);\n\t\trecord.component.dispose?.();\n\t\trecord.tui.stop();\n\t\tif (record.widgetKey) {\n\t\t\tif (this.widgetIds.get(record.widgetKey) === componentId) this.widgetIds.delete(record.widgetKey);\n\t\t\tthis.send({ type: \"engine_custom_close\", componentId });\n\t\t\tif (notifyWidgetRelease) this.notifyWidgetRelease(record.widgetKey);\n\t\t}\n\t\tthis.notifyState();\n\t}\n\tprivate notifyWidgetRelease(key: string): void {\n\t\tfor (const listener of this.widgetReleaseListeners.get(key) ?? []) {\n\t\t\ttry {\n\t\t\t\tlistener();\n\t\t\t} catch {\n\t\t\t\t// A release observer must not break engine UI teardown.\n\t\t\t}\n\t\t}\n\t}\n\tprivate notifyState(): void {\n\t\tconst state = this.getHostCustomUiState();\n\t\tfor (const listener of this.stateListeners) listener(state);\n\t}\n\n\tprivate remoteHandle(componentId: string): OverlayHandle {\n\t\tlet focused = true;\n\t\tconst setHiddenFlag = (value: boolean): void => {\n\t\t\tconst record = this.active.get(componentId);\n\t\t\tif (record) record.hidden = value;\n\t\t};\n\t\treturn {\n\t\t\thide: () => {\n\t\t\t\tsetHiddenFlag(true);\n\t\t\t\tthis.send({ type: \"engine_custom_control\", componentId, action: \"hide\" });\n\t\t\t},\n\t\t\tsetHidden: (value) => {\n\t\t\t\tsetHiddenFlag(value);\n\t\t\t\tthis.send({ type: \"engine_custom_control\", componentId, action: value ? \"hide\" : \"show\" });\n\t\t\t},\n\t\t\tisHidden: () => this.active.get(componentId)?.hidden === true,\n\t\t\tfocus: () => {\n\t\t\t\tfocused = true;\n\t\t\t\tthis.send({ type: \"engine_custom_control\", componentId, action: \"focus\" });\n\t\t\t},\n\t\t\tunfocus: () => {\n\t\t\t\tfocused = false;\n\t\t\t\tthis.send({ type: \"engine_custom_control\", componentId, action: \"unfocus\" });\n\t\t\t},\n\t\t\tisFocused: () => focused,\n\t\t\tgetBounds: () => undefined,\n\t\t};\n\t}\n\n\tprivate sendDone<T>(componentId: string, result: T): void {\n\t\tthis.send({\n\t\t\ttype: \"engine_custom_done\",\n\t\t\tcomponentId,\n\t\t\tresult: jsonResult(result as object | boolean | null | number | string | undefined),\n\t\t});\n\t}\n\n\tprivate send(message: InteractiveEngineMessage): void {\n\t\tthis.write(serializeInteractiveEngineMessage(message));\n\t}\n}\n"]}
@@ -1,5 +1,5 @@
1
- import type { ExtensionUIContext } from "../../core/extensions/index.ts";
2
- import type { IsolatedInteractiveRuntime } from "./isolated-runtime.ts";
1
+ import type { ExtensionUIContext } from "../../core/extensions/index.js";
2
+ import type { IsolatedInteractiveRuntime } from "./isolated-runtime.js";
3
3
  /**
4
4
  * Generation-owned host dialogs and line widgets for the isolated engine.
5
5
  *
@@ -1 +1 @@
1
- {"version":3,"file":"engine-dialog-host.js","sourceRoot":"","sources":["../../../src/modes/interactive-engine/engine-dialog-host.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ExtensionUIContext } from \"../../core/extensions/index.ts\";\nimport type { RpcExtensionUIRequest, RpcExtensionUIResponse } from \"../rpc/rpc-types.ts\";\nimport type { IsolatedInteractiveRuntime } from \"./isolated-runtime.ts\";\n\n/** Requests that mount a host dialog and therefore need generation ownership. */\nconst MOUNTING_METHODS: ReadonlySet<string> = new Set([\"select\", \"confirm\", \"input\", \"editor\"]);\n\nasync function handleRequest(\n\tui: ExtensionUIContext,\n\trequest: RpcExtensionUIRequest,\n\tsignal: AbortSignal | undefined,\n): Promise<RpcExtensionUIResponse | undefined> {\n\tswitch (request.method) {\n\t\tcase \"select\": {\n\t\t\tconst value = await ui.select(request.title, request.options, { timeout: request.timeout, signal });\n\t\t\treturn value === undefined\n\t\t\t\t? { type: \"extension_ui_response\", id: request.id, cancelled: true }\n\t\t\t\t: { type: \"extension_ui_response\", id: request.id, value };\n\t\t}\n\t\tcase \"confirm\": {\n\t\t\tconst confirmed = await ui.confirm(request.title, request.message, { timeout: request.timeout, signal });\n\t\t\treturn { type: \"extension_ui_response\", id: request.id, confirmed };\n\t\t}\n\t\tcase \"input\": {\n\t\t\tconst value = await ui.input(request.title, request.placeholder, { timeout: request.timeout, signal });\n\t\t\treturn value === undefined\n\t\t\t\t? { type: \"extension_ui_response\", id: request.id, cancelled: true }\n\t\t\t\t: { type: \"extension_ui_response\", id: request.id, value };\n\t\t}\n\t\tcase \"editor\": {\n\t\t\tconst value = await ui.editor(request.title, request.prefill, { signal });\n\t\t\treturn value === undefined\n\t\t\t\t? { type: \"extension_ui_response\", id: request.id, cancelled: true }\n\t\t\t\t: { type: \"extension_ui_response\", id: request.id, value };\n\t\t}\n\t\tcase \"notify\":\n\t\t\tui.notify(request.message, request.notifyType);\n\t\t\treturn undefined;\n\t\tcase \"setStatus\":\n\t\t\tui.setStatus(request.statusKey, request.statusText);\n\t\t\treturn undefined;\n\t\tcase \"setWidget\":\n\t\t\tui.setWidget(request.widgetKey, request.widgetLines, { placement: request.widgetPlacement });\n\t\t\treturn undefined;\n\t\tcase \"setTitle\":\n\t\t\tui.setTitle(request.title);\n\t\t\treturn undefined;\n\t\tcase \"set_editor_text\":\n\t\t\tui.setEditorText(request.text);\n\t\t\treturn undefined;\n\t}\n}\n\n/**\n * Generation-owned host dialogs and line widgets for the isolated engine.\n *\n * `select`, `confirm`, `input`, and `editor` mount real host components and can\n * outlive the engine child that asked for them. Without ownership a dead\n * generation left its dialog on screen forever, its host promise unsettled, and\n * could answer through the replacement child's writer. Each request is recorded\n * with the generation that issued it; when that generation ends the mount is\n * aborted — closing only its own instance — and any answer is suppressed.\n *\n * Line widgets (`setWidget` with `string[]`) have the same problem without any\n * component to close: they are plain host state keyed by name, so the key is\n * tracked against its latest writer and released only if that writer's\n * generation is the one that died.\n */\nexport class EngineDialogHostController {\n\tprivate readonly runtime: IsolatedInteractiveRuntime;\n\tprivate readonly ui: ExtensionUIContext;\n\tprivate readonly records = new Map<string, { generation: number; abort: AbortController }>();\n\t/** Line-widget key -> generation that last wrote it. */\n\tprivate readonly widgetOwners = new Map<string, number>();\n\tprivate readonly unsubscribeHandler: () => void;\n\tprivate readonly unsubscribeGenerationEnded: () => void;\n\n\tconstructor(runtime: IsolatedInteractiveRuntime, ui: ExtensionUIContext) {\n\t\tthis.runtime = runtime;\n\t\tthis.ui = ui;\n\t\tthis.unsubscribeHandler = runtime.setExtensionUIHandler((request) => this.handle(request));\n\t\tthis.unsubscribeGenerationEnded = runtime.onGenerationEnded((event) => this.disposeGeneration(event.generation));\n\t}\n\n\tdispose(): void {\n\t\tthis.unsubscribeHandler();\n\t\tthis.unsubscribeGenerationEnded();\n\t\tthis.abortAll();\n\t\tfor (const key of [...this.widgetOwners.keys()]) this.ui.setWidget(key, undefined);\n\t\tthis.widgetOwners.clear();\n\t}\n\n\t/** Close every dialog and release every widget key owned by an ended generation. */\n\tdisposeGeneration(generation: number): void {\n\t\tfor (const [id, record] of [...this.records]) {\n\t\t\tif (record.generation !== generation) continue;\n\t\t\tthis.records.delete(id);\n\t\t\trecord.abort.abort();\n\t\t}\n\t\tfor (const [key, owner] of [...this.widgetOwners]) {\n\t\t\t// A newer generation that rewrote this key owns it now; clearing here\n\t\t\t// would wipe live content the replacement child just published.\n\t\t\tif (owner !== generation) continue;\n\t\t\tthis.widgetOwners.delete(key);\n\t\t\tthis.ui.setWidget(key, undefined);\n\t\t}\n\t}\n\n\tprivate abortAll(): void {\n\t\tfor (const [, record] of [...this.records]) record.abort.abort();\n\t\tthis.records.clear();\n\t}\n\n\tprivate async handle(request: RpcExtensionUIRequest): Promise<RpcExtensionUIResponse | undefined> {\n\t\tif (request.method === \"setWidget\") {\n\t\t\tif (request.widgetLines === undefined) this.widgetOwners.delete(request.widgetKey);\n\t\t\telse this.widgetOwners.set(request.widgetKey, this.runtime.getEngineGeneration());\n\t\t\treturn handleRequest(this.ui, request, undefined);\n\t\t}\n\t\tif (!MOUNTING_METHODS.has(request.method)) return handleRequest(this.ui, request, undefined);\n\t\tconst abort = new AbortController();\n\t\tconst generation = this.runtime.getEngineGeneration();\n\t\tthis.records.set(request.id, { generation, abort });\n\t\tlet response: RpcExtensionUIResponse | undefined;\n\t\ttry {\n\t\t\tresponse = await handleRequest(this.ui, request, abort.signal);\n\t\t} finally {\n\t\t\t// Only the owning record may be removed: a late settle must not delete a\n\t\t\t// newer record that happens to share this id.\n\t\t\tif (this.records.get(request.id)?.abort === abort) this.records.delete(request.id);\n\t\t}\n\t\t// The generation that asked is gone, so the writer now points at a\n\t\t// replacement child. Answering would deliver this reply to the wrong engine.\n\t\tif (abort.signal.aborted) return undefined;\n\t\treturn response;\n\t}\n}\n"]}
1
+ {"version":3,"file":"engine-dialog-host.js","sourceRoot":"","sources":["../../../src/modes/interactive-engine/engine-dialog-host.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ExtensionUIContext } from \"../../core/extensions/index.js\";\nimport type { RpcExtensionUIRequest, RpcExtensionUIResponse } from \"../rpc/rpc-types.ts\";\nimport type { IsolatedInteractiveRuntime } from \"./isolated-runtime.js\";\n\n/** Requests that mount a host dialog and therefore need generation ownership. */\nconst MOUNTING_METHODS: ReadonlySet<string> = new Set([\"select\", \"confirm\", \"input\", \"editor\"]);\n\nasync function handleRequest(\n\tui: ExtensionUIContext,\n\trequest: RpcExtensionUIRequest,\n\tsignal: AbortSignal | undefined,\n): Promise<RpcExtensionUIResponse | undefined> {\n\tswitch (request.method) {\n\t\tcase \"select\": {\n\t\t\tconst value = await ui.select(request.title, request.options, { timeout: request.timeout, signal });\n\t\t\treturn value === undefined\n\t\t\t\t? { type: \"extension_ui_response\", id: request.id, cancelled: true }\n\t\t\t\t: { type: \"extension_ui_response\", id: request.id, value };\n\t\t}\n\t\tcase \"confirm\": {\n\t\t\tconst confirmed = await ui.confirm(request.title, request.message, { timeout: request.timeout, signal });\n\t\t\treturn { type: \"extension_ui_response\", id: request.id, confirmed };\n\t\t}\n\t\tcase \"input\": {\n\t\t\tconst value = await ui.input(request.title, request.placeholder, { timeout: request.timeout, signal });\n\t\t\treturn value === undefined\n\t\t\t\t? { type: \"extension_ui_response\", id: request.id, cancelled: true }\n\t\t\t\t: { type: \"extension_ui_response\", id: request.id, value };\n\t\t}\n\t\tcase \"editor\": {\n\t\t\tconst value = await ui.editor(request.title, request.prefill, { signal });\n\t\t\treturn value === undefined\n\t\t\t\t? { type: \"extension_ui_response\", id: request.id, cancelled: true }\n\t\t\t\t: { type: \"extension_ui_response\", id: request.id, value };\n\t\t}\n\t\tcase \"notify\":\n\t\t\tui.notify(request.message, request.notifyType);\n\t\t\treturn undefined;\n\t\tcase \"setStatus\":\n\t\t\tui.setStatus(request.statusKey, request.statusText);\n\t\t\treturn undefined;\n\t\tcase \"setWidget\":\n\t\t\tui.setWidget(request.widgetKey, request.widgetLines, { placement: request.widgetPlacement });\n\t\t\treturn undefined;\n\t\tcase \"setTitle\":\n\t\t\tui.setTitle(request.title);\n\t\t\treturn undefined;\n\t\tcase \"set_editor_text\":\n\t\t\tui.setEditorText(request.text);\n\t\t\treturn undefined;\n\t}\n}\n\n/**\n * Generation-owned host dialogs and line widgets for the isolated engine.\n *\n * `select`, `confirm`, `input`, and `editor` mount real host components and can\n * outlive the engine child that asked for them. Without ownership a dead\n * generation left its dialog on screen forever, its host promise unsettled, and\n * could answer through the replacement child's writer. Each request is recorded\n * with the generation that issued it; when that generation ends the mount is\n * aborted — closing only its own instance — and any answer is suppressed.\n *\n * Line widgets (`setWidget` with `string[]`) have the same problem without any\n * component to close: they are plain host state keyed by name, so the key is\n * tracked against its latest writer and released only if that writer's\n * generation is the one that died.\n */\nexport class EngineDialogHostController {\n\tprivate readonly runtime: IsolatedInteractiveRuntime;\n\tprivate readonly ui: ExtensionUIContext;\n\tprivate readonly records = new Map<string, { generation: number; abort: AbortController }>();\n\t/** Line-widget key -> generation that last wrote it. */\n\tprivate readonly widgetOwners = new Map<string, number>();\n\tprivate readonly unsubscribeHandler: () => void;\n\tprivate readonly unsubscribeGenerationEnded: () => void;\n\n\tconstructor(runtime: IsolatedInteractiveRuntime, ui: ExtensionUIContext) {\n\t\tthis.runtime = runtime;\n\t\tthis.ui = ui;\n\t\tthis.unsubscribeHandler = runtime.setExtensionUIHandler((request) => this.handle(request));\n\t\tthis.unsubscribeGenerationEnded = runtime.onGenerationEnded((event) => this.disposeGeneration(event.generation));\n\t}\n\n\tdispose(): void {\n\t\tthis.unsubscribeHandler();\n\t\tthis.unsubscribeGenerationEnded();\n\t\tthis.abortAll();\n\t\tfor (const key of [...this.widgetOwners.keys()]) this.ui.setWidget(key, undefined);\n\t\tthis.widgetOwners.clear();\n\t}\n\n\t/** Close every dialog and release every widget key owned by an ended generation. */\n\tdisposeGeneration(generation: number): void {\n\t\tfor (const [id, record] of [...this.records]) {\n\t\t\tif (record.generation !== generation) continue;\n\t\t\tthis.records.delete(id);\n\t\t\trecord.abort.abort();\n\t\t}\n\t\tfor (const [key, owner] of [...this.widgetOwners]) {\n\t\t\t// A newer generation that rewrote this key owns it now; clearing here\n\t\t\t// would wipe live content the replacement child just published.\n\t\t\tif (owner !== generation) continue;\n\t\t\tthis.widgetOwners.delete(key);\n\t\t\tthis.ui.setWidget(key, undefined);\n\t\t}\n\t}\n\n\tprivate abortAll(): void {\n\t\tfor (const [, record] of [...this.records]) record.abort.abort();\n\t\tthis.records.clear();\n\t}\n\n\tprivate async handle(request: RpcExtensionUIRequest): Promise<RpcExtensionUIResponse | undefined> {\n\t\tif (request.method === \"setWidget\") {\n\t\t\tif (request.widgetLines === undefined) this.widgetOwners.delete(request.widgetKey);\n\t\t\telse this.widgetOwners.set(request.widgetKey, this.runtime.getEngineGeneration());\n\t\t\treturn handleRequest(this.ui, request, undefined);\n\t\t}\n\t\tif (!MOUNTING_METHODS.has(request.method)) return handleRequest(this.ui, request, undefined);\n\t\tconst abort = new AbortController();\n\t\tconst generation = this.runtime.getEngineGeneration();\n\t\tthis.records.set(request.id, { generation, abort });\n\t\tlet response: RpcExtensionUIResponse | undefined;\n\t\ttry {\n\t\t\tresponse = await handleRequest(this.ui, request, abort.signal);\n\t\t} finally {\n\t\t\t// Only the owning record may be removed: a late settle must not delete a\n\t\t\t// newer record that happens to share this id.\n\t\t\tif (this.records.get(request.id)?.abort === abort) this.records.delete(request.id);\n\t\t}\n\t\t// The generation that asked is gone, so the writer now points at a\n\t\t// replacement child. Answering would deliver this reply to the wrong engine.\n\t\tif (abort.signal.aborted) return undefined;\n\t\treturn response;\n\t}\n}\n"]}
@@ -0,0 +1,10 @@
1
+ import type { ExtensionRunner } from "../../core/extensions/runner.ts";
2
+ /** Child-side lifecycle tracking for trust dialogs owned by the terminal host. */
3
+ export declare class EngineProjectTrustService {
4
+ private readonly active;
5
+ private readonly getRunner;
6
+ constructor(getRunner: () => ExtensionRunner);
7
+ handleLine(line: string): boolean;
8
+ dispose(): void;
9
+ }
10
+ //# sourceMappingURL=engine-project-trust.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine-project-trust.d.ts","sourceRoot":"","sources":["../../../src/modes/interactive-engine/engine-project-trust.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAGvE,kFAAkF;AAClF,qBAAa,yBAAyB;IACrC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiC;IAExD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAwB;IAElD,YAAY,SAAS,EAAE,MAAM,eAAe,EAE3C;IAED,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAWhC;IAED,OAAO,IAAI,IAAI,CAGd;CACD"}
@@ -0,0 +1,28 @@
1
+ import { parseInteractiveEngineCommand } from "./protocol.js";
2
+ /** Child-side lifecycle tracking for trust dialogs owned by the terminal host. */
3
+ export class EngineProjectTrustService {
4
+ constructor(getRunner) {
5
+ this.active = new Map();
6
+ this.getRunner = getRunner;
7
+ }
8
+ handleLine(line) {
9
+ const command = parseInteractiveEngineCommand(line);
10
+ if (command?.type === "engine_project_trust_end") {
11
+ this.active.get(command.componentId)?.();
12
+ this.active.delete(command.componentId);
13
+ return true;
14
+ }
15
+ if (command?.type !== "engine_project_trust_start")
16
+ return false;
17
+ if (this.active.has(command.componentId))
18
+ return true;
19
+ this.active.set(command.componentId, this.getRunner().beginProjectTrustPrompt(command.kind, command.title));
20
+ return true;
21
+ }
22
+ dispose() {
23
+ for (const finish of this.active.values())
24
+ finish();
25
+ this.active.clear();
26
+ }
27
+ }
28
+ //# sourceMappingURL=engine-project-trust.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine-project-trust.js","sourceRoot":"","sources":["../../../src/modes/interactive-engine/engine-project-trust.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,6BAA6B,EAAE,MAAM,eAAe,CAAC;AAE9D,kFAAkF;AAClF,MAAM,OAAO,yBAAyB;IAKrC,YAAY,SAAgC;QAJ3B,WAAM,GAAG,IAAI,GAAG,EAAsB,CAAC;QAKvD,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC5B,CAAC;IAED,UAAU,CAAC,IAAY;QACtB,MAAM,OAAO,GAAG,6BAA6B,CAAC,IAAI,CAAC,CAAC;QACpD,IAAI,OAAO,EAAE,IAAI,KAAK,0BAA0B,EAAE,CAAC;YAClD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,EAAE,CAAC;YACzC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;YACxC,OAAO,IAAI,CAAC;QACb,CAAC;QACD,IAAI,OAAO,EAAE,IAAI,KAAK,4BAA4B;YAAE,OAAO,KAAK,CAAC;QACjE,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC;YAAE,OAAO,IAAI,CAAC;QACtD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,uBAAuB,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;QAC5G,OAAO,IAAI,CAAC;IACb,CAAC;IAED,OAAO;QACN,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE;YAAE,MAAM,EAAE,CAAC;QACpD,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;CACD","sourcesContent":["import type { ExtensionRunner } from \"../../core/extensions/runner.ts\";\nimport { parseInteractiveEngineCommand } from \"./protocol.ts\";\n\n/** Child-side lifecycle tracking for trust dialogs owned by the terminal host. */\nexport class EngineProjectTrustService {\n\tprivate readonly active = new Map<string, () => void>();\n\n\tprivate readonly getRunner: () => ExtensionRunner;\n\n\tconstructor(getRunner: () => ExtensionRunner) {\n\t\tthis.getRunner = getRunner;\n\t}\n\n\thandleLine(line: string): boolean {\n\t\tconst command = parseInteractiveEngineCommand(line);\n\t\tif (command?.type === \"engine_project_trust_end\") {\n\t\t\tthis.active.get(command.componentId)?.();\n\t\t\tthis.active.delete(command.componentId);\n\t\t\treturn true;\n\t\t}\n\t\tif (command?.type !== \"engine_project_trust_start\") return false;\n\t\tif (this.active.has(command.componentId)) return true;\n\t\tthis.active.set(command.componentId, this.getRunner().beginProjectTrustPrompt(command.kind, command.title));\n\t\treturn true;\n\t}\n\n\tdispose(): void {\n\t\tfor (const finish of this.active.values()) finish();\n\t\tthis.active.clear();\n\t}\n}\n"]}
@@ -1,4 +1,4 @@
1
- import type { AgentSession } from "../../core/agent-session.ts";
1
+ import type { AgentSession } from "../../core/agent-session.js";
2
2
  export declare class EngineRenderService {
3
3
  private readonly records;
4
4
  private session;
@@ -1 +1 @@
1
- {"version":3,"file":"engine-render-service.js","sourceRoot":"","sources":["../../../src/modes/interactive-engine/engine-render-service.ts"],"names":[],"mappings":"AACA,OAAO,EAAY,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAE9C,OAAO,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAE9D,OAAO,EAAE,sBAAsB,EAAE,MAAM,6CAA6C,CAAC;AACrF,OAAO,EAAE,sBAAsB,EAAE,MAAM,6CAA6C,CAAC;AACrF,OAAO,EAGN,6BAA6B,EAC7B,iCAAiC,GACjC,MAAM,eAAe,CAAC;AAoBvB,MAAM,cAAc;IAKnB,YAAY,aAAyB;QAJrC,YAAO,GAAG,EAAE,CAAC;QACb,SAAI,GAAG,EAAE,CAAC;QACV,wBAAmB,GAAG,KAAK,CAAC;QAG3B,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;IACpC,CAAC;IACD,KAAK,KAAU,CAAC;IAChB,IAAI,KAAU,CAAC;IACf,KAAK,CAAC,UAAU,KAAmB,CAAC;IACpC,KAAK;QACJ,IAAI,CAAC,aAAa,EAAE,CAAC;IACtB,CAAC;IACD,MAAM,KAAU,CAAC;IACjB,UAAU,KAAU,CAAC;IACrB,UAAU,KAAU,CAAC;IACrB,SAAS,KAAU,CAAC;IACpB,eAAe,KAAU,CAAC;IAC1B,WAAW,KAAU,CAAC;IACtB,QAAQ,KAAU,CAAC;IACnB,WAAW,KAAU,CAAC;CACtB;AAED,MAAM,OAAO,mBAAmB;IAK/B,YAAY,KAA6B;QAJxB,YAAO,GAAG,IAAI,GAAG,EAAwB,CAAC;QAK1D,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACpB,CAAC;IAED,WAAW,CAAC,OAAqB;QAChC,IAAI,CAAC,OAAO,EAAE,CAAC;QACf,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACxB,CAAC;IAED,UAAU,CAAC,IAAY;QACtB,MAAM,OAAO,GAAG,6BAA6B,CAAC,IAAI,CAAC,CAAC;QACpD,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC;YAAE,OAAO,KAAK,CAAC;QACpG,IAAI,OAAO,CAAC,IAAI,KAAK,uBAAuB,EAAE,CAAC;YAC9C,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;YACxC,OAAO,IAAI,CAAC;QACb,CAAC;QACD,IAAI,OAAO,CAAC,IAAI,KAAK,oBAAoB,IAAI,OAAO,CAAC,IAAI,KAAK,uBAAuB;YAAE,OAAO,KAAK,CAAC;QACpG,MAAM,IAAI,GACT,OAAO,CAAC,IAAI,KAAK,oBAAoB;YACpC,CAAC,CAAC,QAAQ,OAAO,CAAC,QAAQ,EAAE;YAC5B,CAAC,CAAC,WAAW,OAAO,CAAC,OAAO,CAAC,UAAU,IAAI,QAAQ,EAAE,CAAC;QACxD,KAAK,WAAW,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,EAAE,KAAK,IAAI,EAAE;YACvD,OAAO,OAAO,CAAC,IAAI,KAAK,oBAAoB,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;QACvG,CAAC,CAAC;aACA,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CACf,IAAI,CAAC,IAAI,CAAC;YACT,IAAI,EAAE,qBAAqB;YAC3B,WAAW,EAAE,OAAO,CAAC,WAAW;YAChC,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,KAAK;SACL,CAAC,CACF;aACA,KAAK,CAAC,CAAC,KAAY,EAAE,EAAE,CACvB,IAAI,CAAC,IAAI,CAAC;YACT,IAAI,EAAE,qBAAqB;YAC3B,WAAW,EAAE,OAAO,CAAC,WAAW;YAChC,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,KAAK,EAAE,CAAC,2BAA2B,KAAK,CAAC,OAAO,EAAE,CAAC;SACnD,CAAC,CACF,CAAC;QACH,OAAO,IAAI,CAAC;IACb,CAAC;IAED,OAAO;QACN,KAAK,MAAM,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;YAAE,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;IACnE,CAAC;IAEO,YAAY;QACnB,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;QAC7B,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;QAC/D,OAAO,OAAO,CAAC;IAChB,CAAC;IAEO,cAAc,CAAC,WAAmB;QACzC,OAAO,IAAI,cAAc,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,0BAA0B,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC;IAC/F,CAAC;IAEO,UAAU,CAAC,OAA0B;QAC5C,IAAI,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QACnD,IAAI,MAAM,EAAE,IAAI,KAAK,MAAM,EAAE,CAAC;YAC7B,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;YACpC,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;YACxC,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;YAC1D,QAAQ,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;YAC9C,MAAM,GAAG,GAAG,IAAI,aAAa,CAAC,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,CAAC,CAAC;YAClE,MAAM,SAAS,GAAG,IAAI,sBAAsB,CAC3C,OAAO,CAAC,QAAQ,EAChB,OAAO,CAAC,UAAU,EAClB,OAAO,CAAC,IAAI,EACZ,EAAE,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,eAAe,EAAE,OAAO,CAAC,eAAe,EAAE,EAC5E,OAAO,CAAC,iBAAiB,CAAC,OAAO,CAAC,QAAQ,CAAC,EAC3C,GAAG,EACH,OAAO,CAAC,cAAc,CAAC,MAAM,EAAE,CAC/B,CAAC;YACF,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;YACxB,MAAM,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC;YACpD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;QAC/C,CAAC;aAAM,CAAC;YACP,MAAM,CAAC,QAAQ,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;YACrD,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAC1C,MAAM,CAAC,SAAS,CAAC,aAAa,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;YACnD,MAAM,CAAC,SAAS,CAAC,kBAAkB,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;QAC9D,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,CAAC,SAAS,CAAC;QAC9B,IAAI,OAAO,CAAC,gBAAgB;YAAE,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAC1D,IAAI,OAAO,CAAC,YAAY;YAAE,IAAI,CAAC,eAAe,EAAE,CAAC;QACjD,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACnC,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACpB,IAAI,CAAC,YAAY,CAChB,OAAO,CAAC,MAA0E,EAClF,OAAO,CAAC,SAAS,CACjB,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACnC,CAAC;IAEO,aAAa,CAAC,OAA6B;QAClD,IAAI,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QACnD,IAAI,MAAM,EAAE,IAAI,KAAK,SAAS,EAAE,CAAC;YAChC,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;YACpC,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;YACxC,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;YAC1D,QAAQ,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;YAC9C,MAAM,GAAG,GAAG,IAAI,aAAa,CAAC,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,CAAC,CAAC;YAClE,MAAM,OAAO,GAAG,OAAO,CAAC,OAA2C,CAAC;YACpE,MAAM,SAAS,GAAG,IAAI,sBAAsB,CAC3C,OAAO,EACP,OAAO,CAAC,eAAe,CAAC,kBAAkB,CAAC,OAAO,CAAC,UAAU,CAAC,EAC9D,SAAS,EACT,OAAO,CAAC,SAAS,CACjB,CAAC;YACF,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;YACxB,MAAM,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC;YACvD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;QAC/C,CAAC;aAAM,CAAC;YACP,MAAM,CAAC,QAAQ,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;QACtD,CAAC;QACD,MAAM,CAAC,SAAS,CAAC,WAAW,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAC/C,MAAM,CAAC,SAAS,CAAC,YAAY,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QACjD,OAAO,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAC/C,CAAC;IAEO,aAAa,CAAC,EAAU;QAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACpC,IAAI,CAAC,MAAM;YAAE,OAAO;QACpB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACxB,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM;YAAE,MAAM,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;QACvD,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;IACnB,CAAC;IAEO,IAAI,CAAC,OAAiC;QAC7C,IAAI,CAAC,KAAK,CAAC,iCAAiC,CAAC,OAAO,CAAC,CAAC,CAAC;IACxD,CAAC;CACD","sourcesContent":["import type { Terminal } from \"@earendil-works/pi-tui\";\nimport { type TUI, TuiMainScreen } from \"@earendil-works/pi-tui\";\nimport { getAgentDir } from \"../../config.js\";\nimport type { AgentSession } from \"../../core/agent-session.ts\";\nimport { runCallback } from \"../../core/callback-activity.ts\";\nimport type { CustomMessage } from \"../../core/messages.ts\";\nimport { CustomMessageComponent } from \"../interactive/components/custom-message.ts\";\nimport { ToolExecutionComponent } from \"../interactive/components/tool-execution.ts\";\nimport {\n\ttype InteractiveEngineCommand,\n\ttype InteractiveEngineMessage,\n\tparseInteractiveEngineCommand,\n\tserializeInteractiveEngineMessage,\n} from \"./protocol.ts\";\n\ntype ToolRenderCommand = Extract<InteractiveEngineCommand, { type: \"engine_tool_render\" }>;\ntype MessageRenderCommand = Extract<InteractiveEngineCommand, { type: \"engine_message_render\" }>;\n\n/**\n * Cached per-componentId render state. Records are REUSED across render\n * requests: recreating (and re-seeding) the component on every request made\n * the seeding setters call `ui.requestRender()` each time, whose eventual\n * terminal write emitted `engine_custom_invalidate` back to the host, which\n * re-sent the render request — a self-sustaining host⇄engine render\n * ping-pong that presented as full-screen TUI flicker (quit/pause while a\n * workflow stage streams). Reuse plus idempotent seeding setters lets the\n * loop converge after at most one round trip while still forwarding\n * legitimate async invalidations (e.g. image conversion).\n */\ntype RenderRecord =\n\t| { kind: \"message\"; component: CustomMessageComponent; terminal: RenderTerminal; tui: TUI }\n\t| { kind: \"tool\"; component: ToolExecutionComponent; terminal: RenderTerminal; tui: TUI };\n\nclass RenderTerminal implements Terminal {\n\tcolumns = 80;\n\trows = 24;\n\tkittyProtocolActive = false;\n\tprivate readonly requestRender: () => void;\n\tconstructor(requestRender: () => void) {\n\t\tthis.requestRender = requestRender;\n\t}\n\tstart(): void {}\n\tstop(): void {}\n\tasync drainInput(): Promise<void> {}\n\twrite(): void {\n\t\tthis.requestRender();\n\t}\n\tmoveBy(): void {}\n\thideCursor(): void {}\n\tshowCursor(): void {}\n\tclearLine(): void {}\n\tclearFromCursor(): void {}\n\tclearScreen(): void {}\n\tsetTitle(): void {}\n\tsetProgress(): void {}\n}\n\nexport class EngineRenderService {\n\tprivate readonly records = new Map<string, RenderRecord>();\n\tprivate session: AgentSession | undefined;\n\tprivate readonly write: (line: string) => void;\n\n\tconstructor(write: (line: string) => void) {\n\t\tthis.write = write;\n\t}\n\n\tbindSession(session: AgentSession): void {\n\t\tthis.dispose();\n\t\tthis.session = session;\n\t}\n\n\thandleLine(line: string): boolean {\n\t\tconst command = parseInteractiveEngineCommand(line);\n\t\tif (!command?.type.startsWith(\"engine_\") || command.type.startsWith(\"engine_custom_\")) return false;\n\t\tif (command.type === \"engine_render_dispose\") {\n\t\t\tthis.disposeRecord(command.componentId);\n\t\t\treturn true;\n\t\t}\n\t\tif (command.type !== \"engine_tool_render\" && command.type !== \"engine_message_render\") return false;\n\t\tconst name =\n\t\t\tcommand.type === \"engine_tool_render\"\n\t\t\t\t? `tool:${command.toolName}`\n\t\t\t\t: `message:${command.message.customType ?? \"custom\"}`;\n\t\tvoid runCallback({ kind: \"renderer\", name }, async () => {\n\t\t\treturn command.type === \"engine_tool_render\" ? this.renderTool(command) : this.renderMessage(command);\n\t\t})\n\t\t\t.then((lines) =>\n\t\t\t\tthis.send({\n\t\t\t\t\ttype: \"engine_custom_frame\",\n\t\t\t\t\tcomponentId: command.componentId,\n\t\t\t\t\trequestId: command.requestId,\n\t\t\t\t\tlines,\n\t\t\t\t}),\n\t\t\t)\n\t\t\t.catch((error: Error) =>\n\t\t\t\tthis.send({\n\t\t\t\t\ttype: \"engine_custom_frame\",\n\t\t\t\t\tcomponentId: command.componentId,\n\t\t\t\t\trequestId: command.requestId,\n\t\t\t\t\tlines: [`Remote renderer failed: ${error.message}`],\n\t\t\t\t}),\n\t\t\t);\n\t\treturn true;\n\t}\n\n\tdispose(): void {\n\t\tfor (const id of [...this.records.keys()]) this.disposeRecord(id);\n\t}\n\n\tprivate boundSession(): AgentSession {\n\t\tconst session = this.session;\n\t\tif (!session) throw new Error(\"Renderer session is not bound\");\n\t\treturn session;\n\t}\n\n\tprivate createTerminal(componentId: string): RenderTerminal {\n\t\treturn new RenderTerminal(() => this.send({ type: \"engine_custom_invalidate\", componentId }));\n\t}\n\n\tprivate renderTool(command: ToolRenderCommand): string[] {\n\t\tlet record = this.records.get(command.componentId);\n\t\tif (record?.kind !== \"tool\") {\n\t\t\tconst session = this.boundSession();\n\t\t\tthis.disposeRecord(command.componentId);\n\t\t\tconst terminal = this.createTerminal(command.componentId);\n\t\t\tterminal.columns = Math.max(1, command.width);\n\t\t\tconst tui = new TuiMainScreen(terminal, undefined, getAgentDir());\n\t\t\tconst component = new ToolExecutionComponent(\n\t\t\t\tcommand.toolName,\n\t\t\t\tcommand.toolCallId,\n\t\t\t\tcommand.args,\n\t\t\t\t{ showImages: command.showImages, imageWidthCells: command.imageWidthCells },\n\t\t\t\tsession.getToolDefinition(command.toolName),\n\t\t\t\ttui,\n\t\t\t\tsession.sessionManager.getCwd(),\n\t\t\t);\n\t\t\ttui.addChild(component);\n\t\t\trecord = { kind: \"tool\", component, terminal, tui };\n\t\t\tthis.records.set(command.componentId, record);\n\t\t} else {\n\t\t\trecord.terminal.columns = Math.max(1, command.width);\n\t\t\trecord.component.updateArgs(command.args);\n\t\t\trecord.component.setShowImages(command.showImages);\n\t\t\trecord.component.setImageWidthCells(command.imageWidthCells);\n\t\t}\n\t\tconst tool = record.component;\n\t\tif (command.executionStarted) tool.markExecutionStarted();\n\t\tif (command.argsComplete) tool.setArgsComplete();\n\t\ttool.setExpanded(command.expanded);\n\t\tif (command.result) {\n\t\t\ttool.updateResult(\n\t\t\t\tcommand.result as unknown as Parameters<ToolExecutionComponent[\"updateResult\"]>[0],\n\t\t\t\tcommand.isPartial,\n\t\t\t);\n\t\t}\n\t\treturn tool.render(command.width);\n\t}\n\n\tprivate renderMessage(command: MessageRenderCommand): string[] {\n\t\tlet record = this.records.get(command.componentId);\n\t\tif (record?.kind !== \"message\") {\n\t\t\tconst session = this.boundSession();\n\t\t\tthis.disposeRecord(command.componentId);\n\t\t\tconst terminal = this.createTerminal(command.componentId);\n\t\t\tterminal.columns = Math.max(1, command.width);\n\t\t\tconst tui = new TuiMainScreen(terminal, undefined, getAgentDir());\n\t\t\tconst message = command.message as unknown as CustomMessage<object>;\n\t\t\tconst component = new CustomMessageComponent(\n\t\t\t\tmessage,\n\t\t\t\tsession.extensionRunner.getMessageRenderer(message.customType),\n\t\t\t\tundefined,\n\t\t\t\tcommand.outputPad,\n\t\t\t);\n\t\t\ttui.addChild(component);\n\t\t\trecord = { kind: \"message\", component, terminal, tui };\n\t\t\tthis.records.set(command.componentId, record);\n\t\t} else {\n\t\t\trecord.terminal.columns = Math.max(1, command.width);\n\t\t}\n\t\trecord.component.setExpanded(command.expanded);\n\t\trecord.component.setOutputPad(command.outputPad);\n\t\treturn record.component.render(command.width);\n\t}\n\n\tprivate disposeRecord(id: string): void {\n\t\tconst record = this.records.get(id);\n\t\tif (!record) return;\n\t\tthis.records.delete(id);\n\t\tif (record.kind === \"tool\") record.component.dispose();\n\t\trecord.tui.stop();\n\t}\n\n\tprivate send(message: InteractiveEngineMessage): void {\n\t\tthis.write(serializeInteractiveEngineMessage(message));\n\t}\n}\n"]}
1
+ {"version":3,"file":"engine-render-service.js","sourceRoot":"","sources":["../../../src/modes/interactive-engine/engine-render-service.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Terminal } from \"@earendil-works/pi-tui\";\nimport { type TUI, TuiMainScreen } from \"@earendil-works/pi-tui\";\nimport { getAgentDir } from \"../../config.js\";\nimport type { AgentSession } from \"../../core/agent-session.js\";\nimport { runCallback } from \"../../core/callback-activity.ts\";\nimport type { CustomMessage } from \"../../core/messages.ts\";\nimport { CustomMessageComponent } from \"../interactive/components/custom-message.ts\";\nimport { ToolExecutionComponent } from \"../interactive/components/tool-execution.ts\";\nimport {\n\ttype InteractiveEngineCommand,\n\ttype InteractiveEngineMessage,\n\tparseInteractiveEngineCommand,\n\tserializeInteractiveEngineMessage,\n} from \"./protocol.ts\";\n\ntype ToolRenderCommand = Extract<InteractiveEngineCommand, { type: \"engine_tool_render\" }>;\ntype MessageRenderCommand = Extract<InteractiveEngineCommand, { type: \"engine_message_render\" }>;\n\n/**\n * Cached per-componentId render state. Records are REUSED across render\n * requests: recreating (and re-seeding) the component on every request made\n * the seeding setters call `ui.requestRender()` each time, whose eventual\n * terminal write emitted `engine_custom_invalidate` back to the host, which\n * re-sent the render request — a self-sustaining host⇄engine render\n * ping-pong that presented as full-screen TUI flicker (quit/pause while a\n * workflow stage streams). Reuse plus idempotent seeding setters lets the\n * loop converge after at most one round trip while still forwarding\n * legitimate async invalidations (e.g. image conversion).\n */\ntype RenderRecord =\n\t| { kind: \"message\"; component: CustomMessageComponent; terminal: RenderTerminal; tui: TUI }\n\t| { kind: \"tool\"; component: ToolExecutionComponent; terminal: RenderTerminal; tui: TUI };\n\nclass RenderTerminal implements Terminal {\n\tcolumns = 80;\n\trows = 24;\n\tkittyProtocolActive = false;\n\tprivate readonly requestRender: () => void;\n\tconstructor(requestRender: () => void) {\n\t\tthis.requestRender = requestRender;\n\t}\n\tstart(): void {}\n\tstop(): void {}\n\tasync drainInput(): Promise<void> {}\n\twrite(): void {\n\t\tthis.requestRender();\n\t}\n\tmoveBy(): void {}\n\thideCursor(): void {}\n\tshowCursor(): void {}\n\tclearLine(): void {}\n\tclearFromCursor(): void {}\n\tclearScreen(): void {}\n\tsetTitle(): void {}\n\tsetProgress(): void {}\n}\n\nexport class EngineRenderService {\n\tprivate readonly records = new Map<string, RenderRecord>();\n\tprivate session: AgentSession | undefined;\n\tprivate readonly write: (line: string) => void;\n\n\tconstructor(write: (line: string) => void) {\n\t\tthis.write = write;\n\t}\n\n\tbindSession(session: AgentSession): void {\n\t\tthis.dispose();\n\t\tthis.session = session;\n\t}\n\n\thandleLine(line: string): boolean {\n\t\tconst command = parseInteractiveEngineCommand(line);\n\t\tif (!command?.type.startsWith(\"engine_\") || command.type.startsWith(\"engine_custom_\")) return false;\n\t\tif (command.type === \"engine_render_dispose\") {\n\t\t\tthis.disposeRecord(command.componentId);\n\t\t\treturn true;\n\t\t}\n\t\tif (command.type !== \"engine_tool_render\" && command.type !== \"engine_message_render\") return false;\n\t\tconst name =\n\t\t\tcommand.type === \"engine_tool_render\"\n\t\t\t\t? `tool:${command.toolName}`\n\t\t\t\t: `message:${command.message.customType ?? \"custom\"}`;\n\t\tvoid runCallback({ kind: \"renderer\", name }, async () => {\n\t\t\treturn command.type === \"engine_tool_render\" ? this.renderTool(command) : this.renderMessage(command);\n\t\t})\n\t\t\t.then((lines) =>\n\t\t\t\tthis.send({\n\t\t\t\t\ttype: \"engine_custom_frame\",\n\t\t\t\t\tcomponentId: command.componentId,\n\t\t\t\t\trequestId: command.requestId,\n\t\t\t\t\tlines,\n\t\t\t\t}),\n\t\t\t)\n\t\t\t.catch((error: Error) =>\n\t\t\t\tthis.send({\n\t\t\t\t\ttype: \"engine_custom_frame\",\n\t\t\t\t\tcomponentId: command.componentId,\n\t\t\t\t\trequestId: command.requestId,\n\t\t\t\t\tlines: [`Remote renderer failed: ${error.message}`],\n\t\t\t\t}),\n\t\t\t);\n\t\treturn true;\n\t}\n\n\tdispose(): void {\n\t\tfor (const id of [...this.records.keys()]) this.disposeRecord(id);\n\t}\n\n\tprivate boundSession(): AgentSession {\n\t\tconst session = this.session;\n\t\tif (!session) throw new Error(\"Renderer session is not bound\");\n\t\treturn session;\n\t}\n\n\tprivate createTerminal(componentId: string): RenderTerminal {\n\t\treturn new RenderTerminal(() => this.send({ type: \"engine_custom_invalidate\", componentId }));\n\t}\n\n\tprivate renderTool(command: ToolRenderCommand): string[] {\n\t\tlet record = this.records.get(command.componentId);\n\t\tif (record?.kind !== \"tool\") {\n\t\t\tconst session = this.boundSession();\n\t\t\tthis.disposeRecord(command.componentId);\n\t\t\tconst terminal = this.createTerminal(command.componentId);\n\t\t\tterminal.columns = Math.max(1, command.width);\n\t\t\tconst tui = new TuiMainScreen(terminal, undefined, getAgentDir());\n\t\t\tconst component = new ToolExecutionComponent(\n\t\t\t\tcommand.toolName,\n\t\t\t\tcommand.toolCallId,\n\t\t\t\tcommand.args,\n\t\t\t\t{ showImages: command.showImages, imageWidthCells: command.imageWidthCells },\n\t\t\t\tsession.getToolDefinition(command.toolName),\n\t\t\t\ttui,\n\t\t\t\tsession.sessionManager.getCwd(),\n\t\t\t);\n\t\t\ttui.addChild(component);\n\t\t\trecord = { kind: \"tool\", component, terminal, tui };\n\t\t\tthis.records.set(command.componentId, record);\n\t\t} else {\n\t\t\trecord.terminal.columns = Math.max(1, command.width);\n\t\t\trecord.component.updateArgs(command.args);\n\t\t\trecord.component.setShowImages(command.showImages);\n\t\t\trecord.component.setImageWidthCells(command.imageWidthCells);\n\t\t}\n\t\tconst tool = record.component;\n\t\tif (command.executionStarted) tool.markExecutionStarted();\n\t\tif (command.argsComplete) tool.setArgsComplete();\n\t\ttool.setExpanded(command.expanded);\n\t\tif (command.result) {\n\t\t\ttool.updateResult(\n\t\t\t\tcommand.result as unknown as Parameters<ToolExecutionComponent[\"updateResult\"]>[0],\n\t\t\t\tcommand.isPartial,\n\t\t\t);\n\t\t}\n\t\treturn tool.render(command.width);\n\t}\n\n\tprivate renderMessage(command: MessageRenderCommand): string[] {\n\t\tlet record = this.records.get(command.componentId);\n\t\tif (record?.kind !== \"message\") {\n\t\t\tconst session = this.boundSession();\n\t\t\tthis.disposeRecord(command.componentId);\n\t\t\tconst terminal = this.createTerminal(command.componentId);\n\t\t\tterminal.columns = Math.max(1, command.width);\n\t\t\tconst tui = new TuiMainScreen(terminal, undefined, getAgentDir());\n\t\t\tconst message = command.message as unknown as CustomMessage<object>;\n\t\t\tconst component = new CustomMessageComponent(\n\t\t\t\tmessage,\n\t\t\t\tsession.extensionRunner.getMessageRenderer(message.customType),\n\t\t\t\tundefined,\n\t\t\t\tcommand.outputPad,\n\t\t\t);\n\t\t\ttui.addChild(component);\n\t\t\trecord = { kind: \"message\", component, terminal, tui };\n\t\t\tthis.records.set(command.componentId, record);\n\t\t} else {\n\t\t\trecord.terminal.columns = Math.max(1, command.width);\n\t\t}\n\t\trecord.component.setExpanded(command.expanded);\n\t\trecord.component.setOutputPad(command.outputPad);\n\t\treturn record.component.render(command.width);\n\t}\n\n\tprivate disposeRecord(id: string): void {\n\t\tconst record = this.records.get(id);\n\t\tif (!record) return;\n\t\tthis.records.delete(id);\n\t\tif (record.kind === \"tool\") record.component.dispose();\n\t\trecord.tui.stop();\n\t}\n\n\tprivate send(message: InteractiveEngineMessage): void {\n\t\tthis.write(serializeInteractiveEngineMessage(message));\n\t}\n}\n"]}
@@ -1,6 +1,6 @@
1
1
  import type { AgentSessionRuntime } from "../../core/agent-session-runtime.ts";
2
2
  import type { ResourceOverlap } from "../../core/diagnostics.ts";
3
- import type { ExtensionUIContext } from "../../core/extensions/index.ts";
3
+ import type { ExtensionUIContext } from "../../core/extensions/index.js";
4
4
  import type { KeybindingsManager } from "../../core/keybindings.ts";
5
5
  import type { RpcAutocompleteItem, RpcResourceExtension, RpcSlashCommand } from "../rpc/rpc-types.ts";
6
6
  import type { ActivityWatchdogDiagnostic } from "./activity-watchdog.ts";
@@ -12,6 +12,8 @@ interface EngineMessageSource {
12
12
  }
13
13
  export declare function attachInteractiveEngineKeybindingSync(runtime: EngineMessageSource, keybindings: KeybindingsManager, onState?: (state: EngineKeybindingState) => void): () => void;
14
14
  export declare function attachInteractiveEngineHost(runtime: AgentSessionRuntime, ui: ExtensionUIContext, onDiagnostic: (diagnostic: ActivityWatchdogDiagnostic) => void, tuiRendererLifecycle: TuiRendererLifecycle, setShortcutHandler?: (handler: (data: string) => boolean) => undefined | (() => void), keybindings?: KeybindingsManager): () => void;
15
+ /** Route host-owned trust waits to the runner that actually owns the subscribers. */
16
+ export declare function withHostProjectTrustPrompt<T>(runtime: AgentSessionRuntime, kind: "select" | "confirm" | "input", title: string, run: () => Promise<T>): Promise<T>;
15
17
  export declare function waitForInteractiveEngineBound(runtime: AgentSessionRuntime): Promise<void>;
16
18
  export declare function interruptBlockedInteractiveEngine(runtime: AgentSessionRuntime): boolean;
17
19
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"extension-ui-bridge.d.ts","sourceRoot":"","sources":["../../../src/modes/interactive-engine/extension-ui-bridge.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAC/E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AACzE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,KAAK,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtG,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,wBAAwB,CAAC;AAIzE,OAAO,KAAK,EAA2B,qBAAqB,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAC;AAC9G,OAAO,EAA6B,KAAK,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAI7F,UAAU,mBAAmB;IAC5B,eAAe,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,wBAAwB,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;IACnF,iBAAiB,CAAC,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,qBAAqB,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;CACjF;AAED,wBAAgB,qCAAqC,CACpD,OAAO,EAAE,mBAAmB,EAC5B,WAAW,EAAE,kBAAkB,EAC/B,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,qBAAqB,KAAK,IAAI,GAC9C,MAAM,IAAI,CASZ;AAED,wBAAgB,2BAA2B,CAC1C,OAAO,EAAE,mBAAmB,EAC5B,EAAE,EAAE,kBAAkB,EACtB,YAAY,EAAE,CAAC,UAAU,EAAE,0BAA0B,KAAK,IAAI,EAC9D,oBAAoB,EAAE,oBAAoB,EAC1C,kBAAkB,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,KAAK,SAAS,GAAG,CAAC,MAAM,IAAI,CAAC,EACrF,WAAW,CAAC,EAAE,kBAAkB,GAC9B,MAAM,IAAI,CAoDZ;AAED,wBAAsB,6BAA6B,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAI/F;AAED,wBAAgB,iCAAiC,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAEvF;AAED;;;;GAIG;AACH,wBAAgB,yCAAyC,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAE/F;AAED;;;GAGG;AACH,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAIhF;AAED;;;GAGG;AACH,wBAAgB,kCAAkC,CAAC,OAAO,EAAE,mBAAmB,GAAG,SAAS,eAAe,EAAE,CAE3G;AAED,wBAAgB,oCAAoC,CAAC,OAAO,EAAE,mBAAmB,GAAG,SAAS,eAAe,EAAE,CAE7G;AAED,wBAAgB,sCAAsC,CAAC,OAAO,EAAE,mBAAmB,GAAG,SAAS,oBAAoB,EAAE,CAEpH;AAED,wBAAgB,4CAA4C,CAC3D,OAAO,EAAE,mBAAmB,EAC5B,QAAQ,EAAE,CAAC,UAAU,EAAE,SAAS,oBAAoB,EAAE,KAAK,IAAI,GAC7D,MAAM,IAAI,CAEZ;AAED,oEAAoE;AACpE,wBAAgB,4CAA4C,CAC3D,OAAO,EAAE,mBAAmB,EAC5B,WAAW,EAAE,MAAM,EACnB,cAAc,EAAE,MAAM,GACpB,OAAO,CAAC,mBAAmB,EAAE,GAAG,IAAI,CAAC,CAIvC;AAED,kFAAkF;AAClF,wBAAgB,wCAAwC,CACvD,OAAO,EAAE,mBAAmB,EAC5B,QAAQ,EAAE,CAAC,QAAQ,EAAE,SAAS,eAAe,EAAE,KAAK,IAAI,GACtD,MAAM,IAAI,CAEZ"}
1
+ {"version":3,"file":"extension-ui-bridge.d.ts","sourceRoot":"","sources":["../../../src/modes/interactive-engine/extension-ui-bridge.ts"],"names":[],"mappings":"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"}
@@ -72,6 +72,12 @@ export function attachInteractiveEngineHost(runtime, ui, onDiagnostic, tuiRender
72
72
  disposeDiagnostic();
73
73
  };
74
74
  }
75
+ /** Route host-owned trust waits to the runner that actually owns the subscribers. */
76
+ export function withHostProjectTrustPrompt(runtime, kind, title, run) {
77
+ return runtime instanceof IsolatedInteractiveRuntime
78
+ ? runtime.withProjectTrustPrompt(kind, title, run)
79
+ : runtime.session.extensionRunner.withProjectTrustPrompt(kind, title, run);
80
+ }
75
81
  export async function waitForInteractiveEngineBound(runtime) {
76
82
  if (!(runtime instanceof IsolatedInteractiveRuntime))
77
83
  return;
@@ -1 +1 @@
1
- {"version":3,"file":"extension-ui-bridge.js","sourceRoot":"","sources":["../../../src/modes/interactive-engine/extension-ui-bridge.ts"],"names":[],"mappings":"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","sourcesContent":["import { type KeyId, matchesKey } from \"@earendil-works/pi-tui\";\nimport type { AgentSessionRuntime } from \"../../core/agent-session-runtime.ts\";\nimport type { ResourceOverlap } from \"../../core/diagnostics.ts\";\nimport type { ExtensionUIContext } from \"../../core/extensions/index.ts\";\nimport type { KeybindingsManager } from \"../../core/keybindings.ts\";\nimport type { RpcAutocompleteItem, RpcResourceExtension, RpcSlashCommand } from \"../rpc/rpc-types.ts\";\nimport type { ActivityWatchdogDiagnostic } from \"./activity-watchdog.ts\";\nimport { EngineDialogHostController } from \"./engine-dialog-host.ts\";\nimport { InputFormHostController } from \"./input-form-host.ts\";\nimport { IsolatedInteractiveRuntime } from \"./isolated-runtime.ts\";\nimport type { EngineExtensionShortcut, EngineKeybindingState, InteractiveEngineMessage } from \"./protocol.ts\";\nimport { RemoteComponentController, type TuiRendererLifecycle } from \"./remote-component.ts\";\nimport { registerRemoteProxyOwnership } from \"./remote-input-ownership.ts\";\nimport { SessionPickerHostController } from \"./session-picker-host.ts\";\n\ninterface EngineMessageSource {\n\tonEngineMessage(listener: (message: InteractiveEngineMessage) => void): () => void;\n\tonKeybindingState?(listener: (state: EngineKeybindingState) => void): () => void;\n}\n\nexport function attachInteractiveEngineKeybindingSync(\n\truntime: EngineMessageSource,\n\tkeybindings: KeybindingsManager,\n\tonState?: (state: EngineKeybindingState) => void,\n): () => void {\n\tconst applyState = (state: EngineKeybindingState): void => {\n\t\tkeybindings.setUserBindings(state.userBindings);\n\t\tonState?.(state);\n\t};\n\tif (runtime.onKeybindingState) return runtime.onKeybindingState(applyState);\n\treturn runtime.onEngineMessage((message) => {\n\t\tif (message.type === \"engine_keybindings_reloaded\") applyState(message.state);\n\t});\n}\n\nexport function attachInteractiveEngineHost(\n\truntime: AgentSessionRuntime,\n\tui: ExtensionUIContext,\n\tonDiagnostic: (diagnostic: ActivityWatchdogDiagnostic) => void,\n\ttuiRendererLifecycle: TuiRendererLifecycle,\n\tsetShortcutHandler?: (handler: (data: string) => boolean) => undefined | (() => void),\n\tkeybindings?: KeybindingsManager,\n): () => void {\n\tif (!(runtime instanceof IsolatedInteractiveRuntime)) return () => {};\n\tconst disposeDiagnostic = runtime.onDiagnostic(onDiagnostic);\n\t// Generation-owned: RPC dialogs mount real host components and must not\n\t// outlive, or answer through, a replacement engine child.\n\tconst dialogs = new EngineDialogHostController(runtime, ui);\n\tlet shortcuts: EngineExtensionShortcut[] = [];\n\tconst dispatchShortcut = (data: string): boolean => {\n\t\tconst shortcut = shortcuts.find(({ key }) => matchesKey(data, key as KeyId));\n\t\tif (!shortcut) return false;\n\t\tvoid runtime\n\t\t\t.invokeRemoteShortcut(shortcut.key)\n\t\t\t.catch((error: Error) =>\n\t\t\t\tonDiagnostic({ activity: undefined, elapsedMs: 0, level: \"unresponsive\", message: error.message }),\n\t\t\t);\n\t\treturn true;\n\t};\n\tlet disposeShortcutHandler: (() => void) | undefined;\n\tconst installShortcutHandler = (): void => {\n\t\tdisposeShortcutHandler?.();\n\t\tconst dispose = setShortcutHandler?.(dispatchShortcut);\n\t\tdisposeShortcutHandler = typeof dispose === \"function\" ? dispose : undefined;\n\t};\n\tconst applyState = (state: EngineKeybindingState): void => {\n\t\tshortcuts = [...state.shortcuts];\n\t\tinstallShortcutHandler();\n\t};\n\tinstallShortcutHandler();\n\tconst disposeKeybindings = keybindings\n\t\t? attachInteractiveEngineKeybindingSync(runtime, keybindings, applyState)\n\t\t: runtime.onEngineMessage((message) => {\n\t\t\t\tif (message.type === \"engine_keybindings_reloaded\") applyState(message.state);\n\t\t\t});\n\tconst remoteComponents = new RemoteComponentController(runtime, ui, tuiRendererLifecycle);\n\t// Ctrl+C must reach the host while a remote proxy owns input, so publish the\n\t// only component that can answer that question exactly.\n\tconst disposeOwnership = registerRemoteProxyOwnership(runtime, remoteComponents);\n\tconst sessionPicker = new SessionPickerHostController(runtime, ui);\n\tconst inputForm = new InputFormHostController(runtime, ui);\n\tlet disposed = false;\n\treturn () => {\n\t\tif (disposed) return;\n\t\tdisposed = true;\n\t\tdisposeShortcutHandler?.();\n\t\tdisposeKeybindings();\n\t\tdisposeOwnership();\n\t\tremoteComponents.dispose();\n\t\tsessionPicker.dispose();\n\t\tinputForm.dispose();\n\t\tdialogs.dispose();\n\t\tdisposeDiagnostic();\n\t};\n}\n\nexport async function waitForInteractiveEngineBound(runtime: AgentSessionRuntime): Promise<void> {\n\tif (!(runtime instanceof IsolatedInteractiveRuntime)) return;\n\tawait runtime.waitUntilBound();\n\tawait runtime.initializeFromEngine();\n}\n\nexport function interruptBlockedInteractiveEngine(runtime: AgentSessionRuntime): boolean {\n\treturn runtime instanceof IsolatedInteractiveRuntime && runtime.interruptBlockedCallback();\n}\n\n/**\n * True when the interactive engine still owes a cooperative abort or the\n * heartbeat watchdog has declared it unresponsive, i.e. when the explicit\n * Ctrl+C escape hatch promised by the watchdog copy applies.\n */\nexport function interactiveEngineNeedsExplicitTermination(runtime: AgentSessionRuntime): boolean {\n\treturn runtime instanceof IsolatedInteractiveRuntime && runtime.needsExplicitTermination();\n}\n\n/**\n * Explicitly terminate an unresponsive interactive engine and start recovery.\n * Only ever reached from a deliberate user action (Ctrl+C) — never from Escape.\n */\nexport function terminateInteractiveEngine(runtime: AgentSessionRuntime): boolean {\n\tif (!interactiveEngineNeedsExplicitTermination(runtime)) return false;\n\tvoid (runtime as IsolatedInteractiveRuntime).terminateAndRecover();\n\treturn true;\n}\n\n/**\n * Command catalog the engine child exposes to the isolated host. Returns an\n * empty list for non-isolated runtimes so callers can merge unconditionally.\n */\nexport function getInteractiveEngineRemoteCommands(runtime: AgentSessionRuntime): readonly RpcSlashCommand[] {\n\treturn runtime instanceof IsolatedInteractiveRuntime ? runtime.getRemoteCommands() : [];\n}\n\nexport function getInteractiveEngineResourceOverlaps(runtime: AgentSessionRuntime): readonly ResourceOverlap[] {\n\treturn runtime instanceof IsolatedInteractiveRuntime ? runtime.getResourceOverlaps() : [];\n}\n\nexport function getInteractiveEngineResourceExtensions(runtime: AgentSessionRuntime): readonly RpcResourceExtension[] {\n\treturn runtime instanceof IsolatedInteractiveRuntime ? runtime.getResourceExtensions() : [];\n}\n\nexport function onInteractiveEngineResourceExtensionsChanged(\n\truntime: AgentSessionRuntime,\n\tlistener: (extensions: readonly RpcResourceExtension[]) => void,\n): () => void {\n\treturn runtime instanceof IsolatedInteractiveRuntime ? runtime.onResourceExtensionsChanged(listener) : () => {};\n}\n\n/** Evaluate an engine-child command's live argument completions. */\nexport function getInteractiveEngineRemoteCommandCompletions(\n\truntime: AgentSessionRuntime,\n\tcommandName: string,\n\targumentPrefix: string,\n): Promise<RpcAutocompleteItem[] | null> {\n\treturn runtime instanceof IsolatedInteractiveRuntime\n\t\t? runtime.getRemoteCommandCompletions(commandName, argumentPrefix)\n\t\t: Promise.resolve(null);\n}\n\n/** Subscribe to engine-child command catalog changes. No-op when not isolated. */\nexport function onInteractiveEngineRemoteCommandsChanged(\n\truntime: AgentSessionRuntime,\n\tlistener: (commands: readonly RpcSlashCommand[]) => void,\n): () => void {\n\treturn runtime instanceof IsolatedInteractiveRuntime ? runtime.onRemoteCommandsChanged(listener) : () => {};\n}\n"]}
1
+ {"version":3,"file":"extension-ui-bridge.js","sourceRoot":"","sources":["../../../src/modes/interactive-engine/extension-ui-bridge.ts"],"names":[],"mappings":"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","sourcesContent":["import { type KeyId, matchesKey } from \"@earendil-works/pi-tui\";\nimport type { AgentSessionRuntime } from \"../../core/agent-session-runtime.ts\";\nimport type { ResourceOverlap } from \"../../core/diagnostics.ts\";\nimport type { ExtensionUIContext } from \"../../core/extensions/index.js\";\nimport type { KeybindingsManager } from \"../../core/keybindings.ts\";\nimport type { RpcAutocompleteItem, RpcResourceExtension, RpcSlashCommand } from \"../rpc/rpc-types.ts\";\nimport type { ActivityWatchdogDiagnostic } from \"./activity-watchdog.ts\";\nimport { EngineDialogHostController } from \"./engine-dialog-host.ts\";\nimport { InputFormHostController } from \"./input-form-host.ts\";\nimport { IsolatedInteractiveRuntime } from \"./isolated-runtime.js\";\nimport type { EngineExtensionShortcut, EngineKeybindingState, InteractiveEngineMessage } from \"./protocol.ts\";\nimport { RemoteComponentController, type TuiRendererLifecycle } from \"./remote-component.ts\";\nimport { registerRemoteProxyOwnership } from \"./remote-input-ownership.ts\";\nimport { SessionPickerHostController } from \"./session-picker-host.ts\";\n\ninterface EngineMessageSource {\n\tonEngineMessage(listener: (message: InteractiveEngineMessage) => void): () => void;\n\tonKeybindingState?(listener: (state: EngineKeybindingState) => void): () => void;\n}\n\nexport function attachInteractiveEngineKeybindingSync(\n\truntime: EngineMessageSource,\n\tkeybindings: KeybindingsManager,\n\tonState?: (state: EngineKeybindingState) => void,\n): () => void {\n\tconst applyState = (state: EngineKeybindingState): void => {\n\t\tkeybindings.setUserBindings(state.userBindings);\n\t\tonState?.(state);\n\t};\n\tif (runtime.onKeybindingState) return runtime.onKeybindingState(applyState);\n\treturn runtime.onEngineMessage((message) => {\n\t\tif (message.type === \"engine_keybindings_reloaded\") applyState(message.state);\n\t});\n}\n\nexport function attachInteractiveEngineHost(\n\truntime: AgentSessionRuntime,\n\tui: ExtensionUIContext,\n\tonDiagnostic: (diagnostic: ActivityWatchdogDiagnostic) => void,\n\ttuiRendererLifecycle: TuiRendererLifecycle,\n\tsetShortcutHandler?: (handler: (data: string) => boolean) => undefined | (() => void),\n\tkeybindings?: KeybindingsManager,\n): () => void {\n\tif (!(runtime instanceof IsolatedInteractiveRuntime)) return () => {};\n\tconst disposeDiagnostic = runtime.onDiagnostic(onDiagnostic);\n\t// Generation-owned: RPC dialogs mount real host components and must not\n\t// outlive, or answer through, a replacement engine child.\n\tconst dialogs = new EngineDialogHostController(runtime, ui);\n\tlet shortcuts: EngineExtensionShortcut[] = [];\n\tconst dispatchShortcut = (data: string): boolean => {\n\t\tconst shortcut = shortcuts.find(({ key }) => matchesKey(data, key as KeyId));\n\t\tif (!shortcut) return false;\n\t\tvoid runtime\n\t\t\t.invokeRemoteShortcut(shortcut.key)\n\t\t\t.catch((error: Error) =>\n\t\t\t\tonDiagnostic({ activity: undefined, elapsedMs: 0, level: \"unresponsive\", message: error.message }),\n\t\t\t);\n\t\treturn true;\n\t};\n\tlet disposeShortcutHandler: (() => void) | undefined;\n\tconst installShortcutHandler = (): void => {\n\t\tdisposeShortcutHandler?.();\n\t\tconst dispose = setShortcutHandler?.(dispatchShortcut);\n\t\tdisposeShortcutHandler = typeof dispose === \"function\" ? dispose : undefined;\n\t};\n\tconst applyState = (state: EngineKeybindingState): void => {\n\t\tshortcuts = [...state.shortcuts];\n\t\tinstallShortcutHandler();\n\t};\n\tinstallShortcutHandler();\n\tconst disposeKeybindings = keybindings\n\t\t? attachInteractiveEngineKeybindingSync(runtime, keybindings, applyState)\n\t\t: runtime.onEngineMessage((message) => {\n\t\t\t\tif (message.type === \"engine_keybindings_reloaded\") applyState(message.state);\n\t\t\t});\n\tconst remoteComponents = new RemoteComponentController(runtime, ui, tuiRendererLifecycle);\n\t// Ctrl+C must reach the host while a remote proxy owns input, so publish the\n\t// only component that can answer that question exactly.\n\tconst disposeOwnership = registerRemoteProxyOwnership(runtime, remoteComponents);\n\tconst sessionPicker = new SessionPickerHostController(runtime, ui);\n\tconst inputForm = new InputFormHostController(runtime, ui);\n\tlet disposed = false;\n\treturn () => {\n\t\tif (disposed) return;\n\t\tdisposed = true;\n\t\tdisposeShortcutHandler?.();\n\t\tdisposeKeybindings();\n\t\tdisposeOwnership();\n\t\tremoteComponents.dispose();\n\t\tsessionPicker.dispose();\n\t\tinputForm.dispose();\n\t\tdialogs.dispose();\n\t\tdisposeDiagnostic();\n\t};\n}\n\n/** Route host-owned trust waits to the runner that actually owns the subscribers. */\nexport function withHostProjectTrustPrompt<T>(\n\truntime: AgentSessionRuntime,\n\tkind: \"select\" | \"confirm\" | \"input\",\n\ttitle: string,\n\trun: () => Promise<T>,\n): Promise<T> {\n\treturn runtime instanceof IsolatedInteractiveRuntime\n\t\t? runtime.withProjectTrustPrompt(kind, title, run)\n\t\t: runtime.session.extensionRunner.withProjectTrustPrompt(kind, title, run);\n}\n\nexport async function waitForInteractiveEngineBound(runtime: AgentSessionRuntime): Promise<void> {\n\tif (!(runtime instanceof IsolatedInteractiveRuntime)) return;\n\tawait runtime.waitUntilBound();\n\tawait runtime.initializeFromEngine();\n}\n\nexport function interruptBlockedInteractiveEngine(runtime: AgentSessionRuntime): boolean {\n\treturn runtime instanceof IsolatedInteractiveRuntime && runtime.interruptBlockedCallback();\n}\n\n/**\n * True when the interactive engine still owes a cooperative abort or the\n * heartbeat watchdog has declared it unresponsive, i.e. when the explicit\n * Ctrl+C escape hatch promised by the watchdog copy applies.\n */\nexport function interactiveEngineNeedsExplicitTermination(runtime: AgentSessionRuntime): boolean {\n\treturn runtime instanceof IsolatedInteractiveRuntime && runtime.needsExplicitTermination();\n}\n\n/**\n * Explicitly terminate an unresponsive interactive engine and start recovery.\n * Only ever reached from a deliberate user action (Ctrl+C) — never from Escape.\n */\nexport function terminateInteractiveEngine(runtime: AgentSessionRuntime): boolean {\n\tif (!interactiveEngineNeedsExplicitTermination(runtime)) return false;\n\tvoid (runtime as IsolatedInteractiveRuntime).terminateAndRecover();\n\treturn true;\n}\n\n/**\n * Command catalog the engine child exposes to the isolated host. Returns an\n * empty list for non-isolated runtimes so callers can merge unconditionally.\n */\nexport function getInteractiveEngineRemoteCommands(runtime: AgentSessionRuntime): readonly RpcSlashCommand[] {\n\treturn runtime instanceof IsolatedInteractiveRuntime ? runtime.getRemoteCommands() : [];\n}\n\nexport function getInteractiveEngineResourceOverlaps(runtime: AgentSessionRuntime): readonly ResourceOverlap[] {\n\treturn runtime instanceof IsolatedInteractiveRuntime ? runtime.getResourceOverlaps() : [];\n}\n\nexport function getInteractiveEngineResourceExtensions(runtime: AgentSessionRuntime): readonly RpcResourceExtension[] {\n\treturn runtime instanceof IsolatedInteractiveRuntime ? runtime.getResourceExtensions() : [];\n}\n\nexport function onInteractiveEngineResourceExtensionsChanged(\n\truntime: AgentSessionRuntime,\n\tlistener: (extensions: readonly RpcResourceExtension[]) => void,\n): () => void {\n\treturn runtime instanceof IsolatedInteractiveRuntime ? runtime.onResourceExtensionsChanged(listener) : () => {};\n}\n\n/** Evaluate an engine-child command's live argument completions. */\nexport function getInteractiveEngineRemoteCommandCompletions(\n\truntime: AgentSessionRuntime,\n\tcommandName: string,\n\targumentPrefix: string,\n): Promise<RpcAutocompleteItem[] | null> {\n\treturn runtime instanceof IsolatedInteractiveRuntime\n\t\t? runtime.getRemoteCommandCompletions(commandName, argumentPrefix)\n\t\t: Promise.resolve(null);\n}\n\n/** Subscribe to engine-child command catalog changes. No-op when not isolated. */\nexport function onInteractiveEngineRemoteCommandsChanged(\n\truntime: AgentSessionRuntime,\n\tlistener: (commands: readonly RpcSlashCommand[]) => void,\n): () => void {\n\treturn runtime instanceof IsolatedInteractiveRuntime ? runtime.onRemoteCommandsChanged(listener) : () => {};\n}\n"]}
@@ -1,5 +1,5 @@
1
- import type { ExtensionUIContext } from "../../core/extensions/index.ts";
2
- import type { IsolatedInteractiveRuntime } from "./isolated-runtime.ts";
1
+ import type { ExtensionUIContext } from "../../core/extensions/index.js";
2
+ import type { IsolatedInteractiveRuntime } from "./isolated-runtime.js";
3
3
  /** Host-side controller that keeps form input/state entirely in the terminal process. */
4
4
  export declare class InputFormHostController {
5
5
  private readonly mounted;