@bastani/atomic 0.9.21-alpha.1 → 0.9.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (516) hide show
  1. package/CHANGELOG.md +56 -0
  2. package/dist/builtin/intercom/package.json +1 -1
  3. package/dist/builtin/mcp/package.json +1 -1
  4. package/dist/builtin/subagents/CHANGELOG.md +22 -0
  5. package/dist/builtin/subagents/package.json +1 -1
  6. package/dist/builtin/subagents/src/extension/index.bundle.mjs +292 -60
  7. package/dist/builtin/web-access/package.json +1 -1
  8. package/dist/builtin/workflows/CHANGELOG.md +23 -0
  9. package/dist/builtin/workflows/builtin/adversarial-verification.js +3 -3
  10. package/dist/builtin/workflows/builtin/{chunk-cw86srkf.js → chunk-632fxeb8.js} +1 -1
  11. package/dist/builtin/workflows/builtin/{chunk-w18kbz63.js → chunk-94f8zfz1.js} +1 -1
  12. package/dist/builtin/workflows/builtin/{chunk-kspvwc24.js → chunk-9cm2ckq2.js} +1 -1
  13. package/dist/builtin/workflows/builtin/{chunk-jaj27rqc.js → chunk-a1ar035d.js} +1 -1
  14. package/dist/builtin/workflows/builtin/{chunk-wh19f5ee.js → chunk-d3xhj946.js} +5 -4
  15. package/dist/builtin/workflows/builtin/{chunk-crw7q5g1.js → chunk-gyjck9z8.js} +1 -1
  16. package/dist/builtin/workflows/builtin/{chunk-maqv731g.js → chunk-hj8mh07f.js} +10 -6
  17. package/dist/builtin/workflows/builtin/{chunk-0nrgfbag.js → chunk-kb7s3gx2.js} +1 -1
  18. package/dist/builtin/workflows/builtin/{chunk-73c5tayt.js → chunk-kgn5wz1c.js} +19 -1
  19. package/dist/builtin/workflows/builtin/{chunk-2hak3b7g.js → chunk-nkj4qhj6.js} +1 -1
  20. package/dist/builtin/workflows/builtin/{chunk-bzdvx2xr.js → chunk-r97ndfvt.js} +1 -1
  21. package/dist/builtin/workflows/builtin/{chunk-vkmpdat4.js → chunk-wf876n16.js} +1 -1
  22. package/dist/builtin/workflows/builtin/classify-and-act.js +3 -3
  23. package/dist/builtin/workflows/builtin/fan-out-and-synthesize.js +3 -3
  24. package/dist/builtin/workflows/builtin/generate-and-filter.js +3 -3
  25. package/dist/builtin/workflows/builtin/goal.js +4 -4
  26. package/dist/builtin/workflows/builtin/index.js +12 -12
  27. package/dist/builtin/workflows/builtin/loop-until-done.js +3 -3
  28. package/dist/builtin/workflows/builtin/open-claude-design.js +3 -3
  29. package/dist/builtin/workflows/builtin/ralph.js +4 -4
  30. package/dist/builtin/workflows/builtin/steering-context.js +1 -1
  31. package/dist/builtin/workflows/builtin/tournament.js +3 -3
  32. package/dist/builtin/workflows/package.json +1 -1
  33. package/dist/builtin/workflows/src/extension/index.bundle.mjs +40 -11
  34. package/dist/builtin/workflows/src/index.js +9 -3
  35. package/dist/builtin/workflows/src/shared/authoring-contract-stage.d.ts +6 -1
  36. package/dist/cli/auth-command.js +5 -0
  37. package/dist/cli/auth-command.js.map +1 -1
  38. package/dist/cli/credential-print.js +2 -0
  39. package/dist/cli/credential-print.js.map +1 -1
  40. package/dist/cli/experimental/command.js +5 -2
  41. package/dist/cli/experimental/command.js.map +1 -1
  42. package/dist/cli.js +1 -1
  43. package/dist/cli.js.map +1 -1
  44. package/dist/config.d.ts +4 -4
  45. package/dist/config.js +4 -4
  46. package/dist/config.js.map +1 -1
  47. package/dist/core/agent-session-extension-bindings.d.ts.map +1 -1
  48. package/dist/core/agent-session-extension-bindings.js +9 -4
  49. package/dist/core/agent-session-extension-bindings.js.map +1 -1
  50. package/dist/core/agent-session-methods.d.ts +4 -4
  51. package/dist/core/agent-session-methods.d.ts.map +1 -1
  52. package/dist/core/agent-session-methods.js.map +1 -1
  53. package/dist/core/agent-session-prompt.d.ts +4 -4
  54. package/dist/core/agent-session-prompt.d.ts.map +1 -1
  55. package/dist/core/agent-session-prompt.js +38 -15
  56. package/dist/core/agent-session-prompt.js.map +1 -1
  57. package/dist/core/agent-session-runtime.d.ts.map +1 -1
  58. package/dist/core/agent-session-runtime.js +14 -9
  59. package/dist/core/agent-session-runtime.js.map +1 -1
  60. package/dist/core/agent-session-types.d.ts +4 -1
  61. package/dist/core/agent-session-types.d.ts.map +1 -1
  62. package/dist/core/agent-session-types.js.map +1 -1
  63. package/dist/core/agent-session.d.ts +1 -1
  64. package/dist/core/agent-session.d.ts.map +1 -1
  65. package/dist/core/agent-session.js +140 -95
  66. package/dist/core/agent-session.js.map +1 -1
  67. package/dist/core/auth-storage-backends.js +2 -3
  68. package/dist/core/auth-storage-backends.js.map +1 -1
  69. package/dist/core/auth-storage.js +4 -1
  70. package/dist/core/auth-storage.js.map +1 -1
  71. package/dist/core/builtin-resource-loader.js +9 -0
  72. package/dist/core/builtin-resource-loader.js.map +1 -1
  73. package/dist/core/cache-warmer.js +8 -1
  74. package/dist/core/cache-warmer.js.map +1 -1
  75. package/dist/core/compaction/range-planner.js +6 -0
  76. package/dist/core/compaction/range-planner.js.map +1 -1
  77. package/dist/core/execution-model-router.d.ts +13 -3
  78. package/dist/core/execution-model-router.d.ts.map +1 -1
  79. package/dist/core/execution-model-router.js +227 -131
  80. package/dist/core/execution-model-router.js.map +1 -1
  81. package/dist/core/export-html/template-js/entries-navigation.js +16 -6
  82. package/dist/core/export-html/template-js/initialization.js +34 -11
  83. package/dist/core/export-html/template.css +10 -0
  84. package/dist/core/export-html/template.js +50 -17
  85. package/dist/core/extensions/context-types.d.ts +2 -0
  86. package/dist/core/extensions/context-types.d.ts.map +1 -1
  87. package/dist/core/extensions/context-types.js.map +1 -1
  88. package/dist/core/extensions/host-input.js +8 -4
  89. package/dist/core/extensions/host-input.js.map +1 -1
  90. package/dist/core/extensions/reactive-widget.js +1 -0
  91. package/dist/core/extensions/reactive-widget.js.map +1 -1
  92. package/dist/core/extensions/runner-context.d.ts +1 -0
  93. package/dist/core/extensions/runner-context.d.ts.map +1 -1
  94. package/dist/core/extensions/runner-context.js +4 -0
  95. package/dist/core/extensions/runner-context.js.map +1 -1
  96. package/dist/core/extensions/runner.d.ts +1 -0
  97. package/dist/core/extensions/runner.d.ts.map +1 -1
  98. package/dist/core/extensions/runner.js +48 -30
  99. package/dist/core/extensions/runner.js.map +1 -1
  100. package/dist/core/extensions/runtime-types.d.ts +1 -0
  101. package/dist/core/extensions/runtime-types.d.ts.map +1 -1
  102. package/dist/core/extensions/runtime-types.js.map +1 -1
  103. package/dist/core/extensions/workflow-activity-hub.js +9 -7
  104. package/dist/core/extensions/workflow-activity-hub.js.map +1 -1
  105. package/dist/core/footer-data-provider.js +24 -23
  106. package/dist/core/footer-data-provider.js.map +1 -1
  107. package/dist/core/keybindings.js +1 -0
  108. package/dist/core/keybindings.js.map +1 -1
  109. package/dist/core/mandatory-resource-loader.js +4 -1
  110. package/dist/core/mandatory-resource-loader.js.map +1 -1
  111. package/dist/core/model-config.js +2 -0
  112. package/dist/core/model-config.js.map +1 -1
  113. package/dist/core/model-registry.js +1 -0
  114. package/dist/core/model-registry.js.map +1 -1
  115. package/dist/core/model-resolver-defaults.js +1 -1
  116. package/dist/core/model-resolver-defaults.js.map +1 -1
  117. package/dist/core/{model-routing-task.d.ts → model-routing-bytes.d.ts} +1 -4
  118. package/dist/core/model-routing-bytes.d.ts.map +1 -0
  119. package/dist/core/model-routing-bytes.js +33 -0
  120. package/dist/core/model-routing-bytes.js.map +1 -0
  121. package/dist/core/model-routing-candidates.d.ts +42 -0
  122. package/dist/core/model-routing-candidates.d.ts.map +1 -0
  123. package/dist/core/model-routing-candidates.js +309 -0
  124. package/dist/core/model-routing-candidates.js.map +1 -0
  125. package/dist/core/model-routing-constraints.d.ts +4 -0
  126. package/dist/core/model-routing-constraints.d.ts.map +1 -1
  127. package/dist/core/model-routing-constraints.js +13 -1
  128. package/dist/core/model-routing-constraints.js.map +1 -1
  129. package/dist/core/model-routing-debug.d.ts +9 -0
  130. package/dist/core/model-routing-debug.d.ts.map +1 -0
  131. package/dist/core/model-routing-debug.js +14 -0
  132. package/dist/core/model-routing-debug.js.map +1 -0
  133. package/dist/core/model-routing-evals.d.ts +50 -0
  134. package/dist/core/model-routing-evals.d.ts.map +1 -0
  135. package/dist/core/model-routing-evals.js +190 -0
  136. package/dist/core/model-routing-evals.js.map +1 -0
  137. package/dist/core/model-routing-needs.d.ts +75 -0
  138. package/dist/core/model-routing-needs.d.ts.map +1 -0
  139. package/dist/core/model-routing-needs.js +176 -0
  140. package/dist/core/model-routing-needs.js.map +1 -0
  141. package/dist/core/model-runtime-streaming.js +3 -0
  142. package/dist/core/model-runtime-streaming.js.map +1 -1
  143. package/dist/core/model-runtime.js +26 -14
  144. package/dist/core/model-runtime.js.map +1 -1
  145. package/dist/core/models-store.js +2 -3
  146. package/dist/core/models-store.js.map +1 -1
  147. package/dist/core/output-guard.js +1 -0
  148. package/dist/core/output-guard.js.map +1 -1
  149. package/dist/core/package-manager-paths.d.ts +2 -1
  150. package/dist/core/package-manager-paths.d.ts.map +1 -1
  151. package/dist/core/package-manager-paths.js +4 -3
  152. package/dist/core/package-manager-paths.js.map +1 -1
  153. package/dist/core/package-manager.js +1 -0
  154. package/dist/core/package-manager.js.map +1 -1
  155. package/dist/core/resource-loader-assets.d.ts.map +1 -1
  156. package/dist/core/resource-loader-assets.js +9 -7
  157. package/dist/core/resource-loader-assets.js.map +1 -1
  158. package/dist/core/resource-loader-core.js +49 -0
  159. package/dist/core/resource-loader-core.js.map +1 -1
  160. package/dist/core/runtime-credentials.js +2 -1
  161. package/dist/core/runtime-credentials.js.map +1 -1
  162. package/dist/core/session-cwd.js +1 -0
  163. package/dist/core/session-cwd.js.map +1 -1
  164. package/dist/core/session-manager-archive.d.ts.map +1 -1
  165. package/dist/core/session-manager-archive.js +4 -2
  166. package/dist/core/session-manager-archive.js.map +1 -1
  167. package/dist/core/session-manager-core.js +11 -7
  168. package/dist/core/session-manager-core.js.map +1 -1
  169. package/dist/core/session-manager-storage.d.ts +10 -4
  170. package/dist/core/session-manager-storage.d.ts.map +1 -1
  171. package/dist/core/session-manager-storage.js +12 -6
  172. package/dist/core/session-manager-storage.js.map +1 -1
  173. package/dist/core/settings-manager-basic-accessors.d.ts +2 -1
  174. package/dist/core/settings-manager-basic-accessors.d.ts.map +1 -1
  175. package/dist/core/settings-manager-basic-accessors.js +21 -0
  176. package/dist/core/settings-manager-basic-accessors.js.map +1 -1
  177. package/dist/core/settings-manager-core.js +13 -7
  178. package/dist/core/settings-manager-core.js.map +1 -1
  179. package/dist/core/settings-manager.d.ts +1 -1
  180. package/dist/core/settings-manager.d.ts.map +1 -1
  181. package/dist/core/settings-manager.js.map +1 -1
  182. package/dist/core/settings-storage.js +6 -0
  183. package/dist/core/settings-storage.js.map +1 -1
  184. package/dist/core/settings-types.d.ts +8 -0
  185. package/dist/core/settings-types.d.ts.map +1 -1
  186. package/dist/core/settings-types.js.map +1 -1
  187. package/dist/core/structured-output/index.d.ts.map +1 -1
  188. package/dist/core/structured-output/index.js +4 -1
  189. package/dist/core/structured-output/index.js.map +1 -1
  190. package/dist/core/structured-output/invalid-output.js +1 -0
  191. package/dist/core/structured-output/invalid-output.js.map +1 -1
  192. package/dist/core/tasks/agent-adapter.js +5 -3
  193. package/dist/core/tasks/agent-adapter.js.map +1 -1
  194. package/dist/core/tasks/child-command-owner.js +3 -7
  195. package/dist/core/tasks/child-command-owner.js.map +1 -1
  196. package/dist/core/tasks/completion.js +5 -1
  197. package/dist/core/tasks/completion.js.map +1 -1
  198. package/dist/core/tasks/owner-store.js +12 -8
  199. package/dist/core/tasks/owner-store.js.map +1 -1
  200. package/dist/core/tasks/supervisor.js +14 -35
  201. package/dist/core/tasks/supervisor.js.map +1 -1
  202. package/dist/core/tools/ask-user-question/state/build-questionnaire.js +13 -4
  203. package/dist/core/tools/ask-user-question/state/build-questionnaire.js.map +1 -1
  204. package/dist/core/tools/ask-user-question/state/questionnaire-session.js +11 -1
  205. package/dist/core/tools/ask-user-question/state/questionnaire-session.js.map +1 -1
  206. package/dist/core/tools/ask-user-question/view/components/chat-row-view.js +1 -0
  207. package/dist/core/tools/ask-user-question/view/components/chat-row-view.js.map +1 -1
  208. package/dist/core/tools/ask-user-question/view/components/multi-select-view.js +1 -0
  209. package/dist/core/tools/ask-user-question/view/components/multi-select-view.js.map +1 -1
  210. package/dist/core/tools/ask-user-question/view/components/option-list-view.js +1 -0
  211. package/dist/core/tools/ask-user-question/view/components/option-list-view.js.map +1 -1
  212. package/dist/core/tools/ask-user-question/view/components/preview/markdown-content-cache.js +5 -0
  213. package/dist/core/tools/ask-user-question/view/components/preview/markdown-content-cache.js.map +1 -1
  214. package/dist/core/tools/ask-user-question/view/components/preview/preview-block-renderer.js +2 -0
  215. package/dist/core/tools/ask-user-question/view/components/preview/preview-block-renderer.js.map +1 -1
  216. package/dist/core/tools/ask-user-question/view/components/preview/preview-pane.js +13 -8
  217. package/dist/core/tools/ask-user-question/view/components/preview/preview-pane.js.map +1 -1
  218. package/dist/core/tools/ask-user-question/view/components/submit-picker.js +1 -0
  219. package/dist/core/tools/ask-user-question/view/components/submit-picker.js.map +1 -1
  220. package/dist/core/tools/ask-user-question/view/components/tab-bar.js +1 -0
  221. package/dist/core/tools/ask-user-question/view/components/tab-bar.js.map +1 -1
  222. package/dist/core/tools/ask-user-question/view/components/wrapping-select.js +30 -24
  223. package/dist/core/tools/ask-user-question/view/components/wrapping-select.js.map +1 -1
  224. package/dist/core/tools/ask-user-question/view/dialog-builder.js +5 -0
  225. package/dist/core/tools/ask-user-question/view/dialog-builder.js.map +1 -1
  226. package/dist/core/tools/ask-user-question/view/props-adapter.js +8 -0
  227. package/dist/core/tools/ask-user-question/view/props-adapter.js.map +1 -1
  228. package/dist/core/tools/ask-user-question/view/tab-content-strategy.js +4 -4
  229. package/dist/core/tools/ask-user-question/view/tab-content-strategy.js.map +1 -1
  230. package/dist/core/tools/bash.js +5 -8
  231. package/dist/core/tools/bash.js.map +1 -1
  232. package/dist/core/tools/edit-batch.js +4 -0
  233. package/dist/core/tools/edit-batch.js.map +1 -1
  234. package/dist/core/tools/edit.js +2 -0
  235. package/dist/core/tools/edit.js.map +1 -1
  236. package/dist/core/tools/file-mutation-coordinator.js +9 -0
  237. package/dist/core/tools/file-mutation-coordinator.js.map +1 -1
  238. package/dist/core/tools/find.js +1 -1
  239. package/dist/core/tools/find.js.map +1 -1
  240. package/dist/core/tools/hashline-engine/fs.js +1 -1
  241. package/dist/core/tools/hashline-engine/fs.js.map +1 -1
  242. package/dist/core/tools/hashline-engine/input.js +4 -0
  243. package/dist/core/tools/hashline-engine/input.js.map +1 -1
  244. package/dist/core/tools/hashline-engine/mismatch.js +6 -0
  245. package/dist/core/tools/hashline-engine/mismatch.js.map +1 -1
  246. package/dist/core/tools/hashline-engine/patcher.js +13 -0
  247. package/dist/core/tools/hashline-engine/patcher.js.map +1 -1
  248. package/dist/core/tools/hashline-engine/recovery.js +1 -0
  249. package/dist/core/tools/hashline-engine/recovery.js.map +1 -1
  250. package/dist/core/tools/output-accumulator.js +20 -13
  251. package/dist/core/tools/output-accumulator.js.map +1 -1
  252. package/dist/core/tools/persisted-output-file.js +9 -3
  253. package/dist/core/tools/persisted-output-file.js.map +1 -1
  254. package/dist/core/tools/resource-selectors.js +1 -0
  255. package/dist/core/tools/resource-selectors.js.map +1 -1
  256. package/dist/core/tools/write.js +1 -0
  257. package/dist/core/tools/write.js.map +1 -1
  258. package/dist/core/trust-manager.js +1 -0
  259. package/dist/core/trust-manager.js.map +1 -1
  260. package/dist/core/workflow-stage-admission.js +17 -10
  261. package/dist/core/workflow-stage-admission.js.map +1 -1
  262. package/dist/extensions/llama/client.js +2 -0
  263. package/dist/extensions/llama/client.js.map +1 -1
  264. package/dist/extensions/llama/huggingface-ui.js +17 -9
  265. package/dist/extensions/llama/huggingface-ui.js.map +1 -1
  266. package/dist/extensions/llama/huggingface.js +2 -0
  267. package/dist/extensions/llama/huggingface.js.map +1 -1
  268. package/dist/extensions/llama/ui.js +11 -3
  269. package/dist/extensions/llama/ui.js.map +1 -1
  270. package/dist/index.d.ts +4 -2
  271. package/dist/index.d.ts.map +1 -1
  272. package/dist/index.js +3 -1
  273. package/dist/index.js.map +1 -1
  274. package/dist/modes/interactive/components/armin.js +10 -6
  275. package/dist/modes/interactive/components/armin.js.map +1 -1
  276. package/dist/modes/interactive/components/assistant-message.js +10 -2
  277. package/dist/modes/interactive/components/assistant-message.js.map +1 -1
  278. package/dist/modes/interactive/components/atomic-working-status.js +10 -2
  279. package/dist/modes/interactive/components/atomic-working-status.js.map +1 -1
  280. package/dist/modes/interactive/components/bash-execution.js +9 -4
  281. package/dist/modes/interactive/components/bash-execution.js.map +1 -1
  282. package/dist/modes/interactive/components/bordered-loader.js +3 -0
  283. package/dist/modes/interactive/components/bordered-loader.js.map +1 -1
  284. package/dist/modes/interactive/components/branch-summary-message.js +4 -1
  285. package/dist/modes/interactive/components/branch-summary-message.js.map +1 -1
  286. package/dist/modes/interactive/components/chat-message-renderer.js +2 -1
  287. package/dist/modes/interactive/components/chat-message-renderer.js.map +1 -1
  288. package/dist/modes/interactive/components/chat-session-host-state.js +63 -31
  289. package/dist/modes/interactive/components/chat-session-host-state.js.map +1 -1
  290. package/dist/modes/interactive/components/chat-session-host.js +8 -1
  291. package/dist/modes/interactive/components/chat-session-host.js.map +1 -1
  292. package/dist/modes/interactive/components/chat-transcript.js +24 -14
  293. package/dist/modes/interactive/components/chat-transcript.js.map +1 -1
  294. package/dist/modes/interactive/components/compaction-boundary-message.js +2 -1
  295. package/dist/modes/interactive/components/compaction-boundary-message.js.map +1 -1
  296. package/dist/modes/interactive/components/config-selector-list.js +15 -6
  297. package/dist/modes/interactive/components/config-selector-list.js.map +1 -1
  298. package/dist/modes/interactive/components/config-selector.js +7 -1
  299. package/dist/modes/interactive/components/config-selector.js.map +1 -1
  300. package/dist/modes/interactive/components/countdown-timer.js +2 -0
  301. package/dist/modes/interactive/components/countdown-timer.js.map +1 -1
  302. package/dist/modes/interactive/components/custom-editor.js +21 -1
  303. package/dist/modes/interactive/components/custom-editor.js.map +1 -1
  304. package/dist/modes/interactive/components/custom-entry.js +4 -1
  305. package/dist/modes/interactive/components/custom-entry.js.map +1 -1
  306. package/dist/modes/interactive/components/custom-message.js +9 -1
  307. package/dist/modes/interactive/components/custom-message.js.map +1 -1
  308. package/dist/modes/interactive/components/daxnuts.js +8 -6
  309. package/dist/modes/interactive/components/daxnuts.js.map +1 -1
  310. package/dist/modes/interactive/components/dynamic-border.js +1 -0
  311. package/dist/modes/interactive/components/dynamic-border.js.map +1 -1
  312. package/dist/modes/interactive/components/extension-editor.js +7 -1
  313. package/dist/modes/interactive/components/extension-editor.js.map +1 -1
  314. package/dist/modes/interactive/components/extension-input.js +8 -2
  315. package/dist/modes/interactive/components/extension-input.js.map +1 -1
  316. package/dist/modes/interactive/components/extension-selector.js +9 -1
  317. package/dist/modes/interactive/components/extension-selector.js.map +1 -1
  318. package/dist/modes/interactive/components/first-time-setup.js +4 -2
  319. package/dist/modes/interactive/components/first-time-setup.js.map +1 -1
  320. package/dist/modes/interactive/components/footer.js +5 -2
  321. package/dist/modes/interactive/components/footer.js.map +1 -1
  322. package/dist/modes/interactive/components/host-input-form.js +13 -2
  323. package/dist/modes/interactive/components/host-input-form.js.map +1 -1
  324. package/dist/modes/interactive/components/login-dialog.js +9 -3
  325. package/dist/modes/interactive/components/login-dialog.js.map +1 -1
  326. package/dist/modes/interactive/components/model-selector.js +24 -12
  327. package/dist/modes/interactive/components/model-selector.js.map +1 -1
  328. package/dist/modes/interactive/components/oauth-selector.js +12 -3
  329. package/dist/modes/interactive/components/oauth-selector.js.map +1 -1
  330. package/dist/modes/interactive/components/reserved-bottom-overlay.js +11 -2
  331. package/dist/modes/interactive/components/reserved-bottom-overlay.js.map +1 -1
  332. package/dist/modes/interactive/components/scoped-models-selector.js +13 -8
  333. package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -1
  334. package/dist/modes/interactive/components/scroll-widget.js +4 -0
  335. package/dist/modes/interactive/components/scroll-widget.js.map +1 -1
  336. package/dist/modes/interactive/components/session-selector-header.js +11 -7
  337. package/dist/modes/interactive/components/session-selector-header.js.map +1 -1
  338. package/dist/modes/interactive/components/session-selector-list.js +25 -12
  339. package/dist/modes/interactive/components/session-selector-list.js.map +1 -1
  340. package/dist/modes/interactive/components/session-selector.js +23 -15
  341. package/dist/modes/interactive/components/session-selector.js.map +1 -1
  342. package/dist/modes/interactive/components/settings-selector-submenus.js +19 -1
  343. package/dist/modes/interactive/components/settings-selector-submenus.js.map +1 -1
  344. package/dist/modes/interactive/components/settings-selector.js +1 -0
  345. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  346. package/dist/modes/interactive/components/show-images-selector.js +1 -0
  347. package/dist/modes/interactive/components/show-images-selector.js.map +1 -1
  348. package/dist/modes/interactive/components/skill-invocation-message.js +4 -1
  349. package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
  350. package/dist/modes/interactive/components/startup-identity.js +8 -3
  351. package/dist/modes/interactive/components/startup-identity.js.map +1 -1
  352. package/dist/modes/interactive/components/task-completion-message.js +2 -0
  353. package/dist/modes/interactive/components/task-completion-message.js.map +1 -1
  354. package/dist/modes/interactive/components/task-detail.js +2 -0
  355. package/dist/modes/interactive/components/task-detail.js.map +1 -1
  356. package/dist/modes/interactive/components/task-inspector.js +22 -12
  357. package/dist/modes/interactive/components/task-inspector.js.map +1 -1
  358. package/dist/modes/interactive/components/task-list.js +2 -0
  359. package/dist/modes/interactive/components/task-list.js.map +1 -1
  360. package/dist/modes/interactive/components/task-live-transcript.js +8 -3
  361. package/dist/modes/interactive/components/task-live-transcript.js.map +1 -1
  362. package/dist/modes/interactive/components/task-navigation.js +5 -2
  363. package/dist/modes/interactive/components/task-navigation.js.map +1 -1
  364. package/dist/modes/interactive/components/task-row.js +2 -0
  365. package/dist/modes/interactive/components/task-row.js.map +1 -1
  366. package/dist/modes/interactive/components/theme-selector.js +2 -0
  367. package/dist/modes/interactive/components/theme-selector.js.map +1 -1
  368. package/dist/modes/interactive/components/thinking-selector.js +7 -1
  369. package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
  370. package/dist/modes/interactive/components/tool-execution.js +25 -10
  371. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  372. package/dist/modes/interactive/components/transcript-follow-indicator.js +1 -0
  373. package/dist/modes/interactive/components/transcript-follow-indicator.js.map +1 -1
  374. package/dist/modes/interactive/components/tree-selector-component.js +7 -3
  375. package/dist/modes/interactive/components/tree-selector-component.js.map +1 -1
  376. package/dist/modes/interactive/components/tree-selector-help.js +1 -0
  377. package/dist/modes/interactive/components/tree-selector-help.js.map +1 -1
  378. package/dist/modes/interactive/components/tree-selector-label-input.js +6 -2
  379. package/dist/modes/interactive/components/tree-selector-label-input.js.map +1 -1
  380. package/dist/modes/interactive/components/tree-selector-list.js +4 -0
  381. package/dist/modes/interactive/components/tree-selector-list.js.map +1 -1
  382. package/dist/modes/interactive/components/trust-selector.js +6 -0
  383. package/dist/modes/interactive/components/trust-selector.js.map +1 -1
  384. package/dist/modes/interactive/components/user-message-selector.js +6 -3
  385. package/dist/modes/interactive/components/user-message-selector.js.map +1 -1
  386. package/dist/modes/interactive/components/user-message.js +5 -0
  387. package/dist/modes/interactive/components/user-message.js.map +1 -1
  388. package/dist/modes/interactive/components/working-status.js +1 -0
  389. package/dist/modes/interactive/components/working-status.js.map +1 -1
  390. package/dist/modes/interactive/interactive-autocomplete.js +2 -0
  391. package/dist/modes/interactive/interactive-autocomplete.js.map +1 -1
  392. package/dist/modes/interactive/interactive-extension-runtime.js +1 -0
  393. package/dist/modes/interactive/interactive-extension-runtime.js.map +1 -1
  394. package/dist/modes/interactive/interactive-mode-base.js +162 -120
  395. package/dist/modes/interactive/interactive-mode-base.js.map +1 -1
  396. package/dist/modes/interactive/interactive-mode-helpers.js +3 -0
  397. package/dist/modes/interactive/interactive-mode-helpers.js.map +1 -1
  398. package/dist/modes/interactive/interactive-mode-surface.d.ts +0 -6
  399. package/dist/modes/interactive/interactive-mode-surface.d.ts.map +1 -1
  400. package/dist/modes/interactive/interactive-mode-surface.js.map +1 -1
  401. package/dist/modes/interactive/interactive-resource-disclosure.js +0 -4
  402. package/dist/modes/interactive/interactive-resource-disclosure.js.map +1 -1
  403. package/dist/modes/interactive/interactive-resource-rendering.js +0 -12
  404. package/dist/modes/interactive/interactive-resource-rendering.js.map +1 -1
  405. package/dist/modes/interactive/interactive-startup-chat-container.js +1 -4
  406. package/dist/modes/interactive/interactive-startup-chat-container.js.map +1 -1
  407. package/dist/modes/interactive/model-catalog-refresh.js +1 -3
  408. package/dist/modes/interactive/model-catalog-refresh.js.map +1 -1
  409. package/dist/modes/interactive/theme/color-utils.d.ts +5 -0
  410. package/dist/modes/interactive/theme/color-utils.d.ts.map +1 -1
  411. package/dist/modes/interactive/theme/color-utils.js +11 -0
  412. package/dist/modes/interactive/theme/color-utils.js.map +1 -1
  413. package/dist/modes/interactive/theme/global-theme.d.ts.map +1 -1
  414. package/dist/modes/interactive/theme/global-theme.js +4 -3
  415. package/dist/modes/interactive/theme/global-theme.js.map +1 -1
  416. package/dist/modes/interactive/theme/theme-class.js +7 -0
  417. package/dist/modes/interactive/theme/theme-class.js.map +1 -1
  418. package/dist/modes/interactive/theme/theme-controller.js +9 -2
  419. package/dist/modes/interactive/theme/theme-controller.js.map +1 -1
  420. package/dist/modes/interactive-engine/activity-watchdog.js +8 -3
  421. package/dist/modes/interactive-engine/activity-watchdog.js.map +1 -1
  422. package/dist/modes/interactive-engine/engine-custom-ui.js +12 -8
  423. package/dist/modes/interactive-engine/engine-custom-ui.js.map +1 -1
  424. package/dist/modes/interactive-engine/engine-dialog-host.js +7 -3
  425. package/dist/modes/interactive-engine/engine-dialog-host.js.map +1 -1
  426. package/dist/modes/interactive-engine/engine-health.js +23 -13
  427. package/dist/modes/interactive-engine/engine-health.js.map +1 -1
  428. package/dist/modes/interactive-engine/engine-input-form.js +3 -2
  429. package/dist/modes/interactive-engine/engine-input-form.js.map +1 -1
  430. package/dist/modes/interactive-engine/engine-monitor.js +13 -1
  431. package/dist/modes/interactive-engine/engine-monitor.js.map +1 -1
  432. package/dist/modes/interactive-engine/engine-project-trust.js +2 -1
  433. package/dist/modes/interactive-engine/engine-project-trust.js.map +1 -1
  434. package/dist/modes/interactive-engine/engine-render-service.js +7 -4
  435. package/dist/modes/interactive-engine/engine-render-service.js.map +1 -1
  436. package/dist/modes/interactive-engine/engine-session-picker.js +3 -2
  437. package/dist/modes/interactive-engine/engine-session-picker.js.map +1 -1
  438. package/dist/modes/interactive-engine/input-form-host.js +5 -1
  439. package/dist/modes/interactive-engine/input-form-host.js.map +1 -1
  440. package/dist/modes/interactive-engine/isolated-runtime.js +37 -23
  441. package/dist/modes/interactive-engine/isolated-runtime.js.map +1 -1
  442. package/dist/modes/interactive-engine/remote-command-catalog.js +4 -3
  443. package/dist/modes/interactive-engine/remote-command-catalog.js.map +1 -1
  444. package/dist/modes/interactive-engine/remote-component.js +24 -12
  445. package/dist/modes/interactive-engine/remote-component.js.map +1 -1
  446. package/dist/modes/interactive-engine/remote-frame-clamp.js +3 -3
  447. package/dist/modes/interactive-engine/remote-frame-clamp.js.map +1 -1
  448. package/dist/modes/interactive-engine/remote-model-catalog.js +5 -4
  449. package/dist/modes/interactive-engine/remote-model-catalog.js.map +1 -1
  450. package/dist/modes/interactive-engine/remote-queue-pause.js +3 -1
  451. package/dist/modes/interactive-engine/remote-queue-pause.js.map +1 -1
  452. package/dist/modes/interactive-engine/remote-renderer.js +24 -13
  453. package/dist/modes/interactive-engine/remote-renderer.js.map +1 -1
  454. package/dist/modes/interactive-engine/resource-readiness-error.js +1 -0
  455. package/dist/modes/interactive-engine/resource-readiness-error.js.map +1 -1
  456. package/dist/modes/interactive-engine/session-picker-host.js +5 -1
  457. package/dist/modes/interactive-engine/session-picker-host.js.map +1 -1
  458. package/dist/modes/interactive-engine/terminal-mode-controller.js +2 -1
  459. package/dist/modes/interactive-engine/terminal-mode-controller.js.map +1 -1
  460. package/dist/modes/rpc/queued-writer.js +13 -4
  461. package/dist/modes/rpc/queued-writer.js.map +1 -1
  462. package/dist/modes/rpc/rpc-bash-request-owners.js +2 -1
  463. package/dist/modes/rpc/rpc-bash-request-owners.js.map +1 -1
  464. package/dist/modes/rpc/rpc-client-api.d.ts +8 -4
  465. package/dist/modes/rpc/rpc-client-api.d.ts.map +1 -1
  466. package/dist/modes/rpc/rpc-client-api.js +10 -3
  467. package/dist/modes/rpc/rpc-client-api.js.map +1 -1
  468. package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  469. package/dist/modes/rpc/rpc-client.js +35 -22
  470. package/dist/modes/rpc/rpc-client.js.map +1 -1
  471. package/dist/modes/rpc/rpc-command-handler.js +6 -6
  472. package/dist/modes/rpc/rpc-command-handler.js.map +1 -1
  473. package/dist/modes/rpc/rpc-event-buffer.js +3 -1
  474. package/dist/modes/rpc/rpc-event-buffer.js.map +1 -1
  475. package/dist/modes/rpc/rpc-generation-buffer.js +1 -3
  476. package/dist/modes/rpc/rpc-generation-buffer.js.map +1 -1
  477. package/dist/modes/rpc/rpc-keybindings-reload.js +4 -1
  478. package/dist/modes/rpc/rpc-keybindings-reload.js.map +1 -1
  479. package/dist/modes/rpc/rpc-output-buffer.js +3 -4
  480. package/dist/modes/rpc/rpc-output-buffer.js.map +1 -1
  481. package/dist/modes/rpc/rpc-pending-requests.js +1 -3
  482. package/dist/modes/rpc/rpc-pending-requests.js.map +1 -1
  483. package/dist/modes/rpc/rpc-provider-auth.js +3 -1
  484. package/dist/modes/rpc/rpc-provider-auth.js.map +1 -1
  485. package/dist/modes/rpc/rpc-resource-readiness.js +4 -5
  486. package/dist/modes/rpc/rpc-resource-readiness.js.map +1 -1
  487. package/dist/modes/rpc/rpc-session-binding.js +15 -0
  488. package/dist/modes/rpc/rpc-session-binding.js.map +1 -1
  489. package/dist/modes/rpc/rpc-terminal-drain.js +3 -0
  490. package/dist/modes/rpc/rpc-terminal-drain.js.map +1 -1
  491. package/dist/modes/rpc/rpc-types.d.ts +10 -1
  492. package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  493. package/dist/modes/rpc/rpc-types.js.map +1 -1
  494. package/docs/models/evals.md +883 -39
  495. package/docs/models/model-selection.md +7 -8
  496. package/docs/rpc/examples.md +1 -1
  497. package/docs/rpc/protocol.md +9 -3
  498. package/docs/sdk/structured-decisions.md +1 -1
  499. package/docs/sdk.md +3 -3
  500. package/docs/settings.md +24 -3
  501. package/docs/subagents/reference.md +22 -4
  502. package/docs/subagents.md +2 -0
  503. package/docs/usage.md +3 -3
  504. package/docs/workflows/api-reference.md +1 -1
  505. package/docs/workflows/authoring.md +1 -7
  506. package/docs/workflows/builtins.md +1 -1
  507. package/docs/workflows/reliable-design.md +1 -1
  508. package/examples/extensions/custom-provider-gitlab-duo/test.ts +5 -5
  509. package/examples/extensions/gondolin/package.json +1 -1
  510. package/examples/rpc-client.ts +1 -1
  511. package/examples/rpc-extension-ui.ts +1 -1
  512. package/npm-shrinkwrap.json +70 -33
  513. package/package.json +6 -7
  514. package/dist/core/model-routing-task.d.ts.map +0 -1
  515. package/dist/core/model-routing-task.js +0 -120
  516. package/dist/core/model-routing-task.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"task-inspector.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/task-inspector.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport { stripVTControlCharacters } from \"node:util\";\nimport type { AgentMessage } from \"@earendil-works/pi-agent-core\";\nimport {\n\ttype Component,\n\tgetKeybindings,\n\tInput,\n\tmatchesKey,\n\tText,\n\ttruncateToWidth,\n\tvisibleWidth,\n} from \"@earendil-works/pi-tui\";\nimport type { KeybindingsManager } from \"../../../core/keybindings.ts\";\nimport { taskOutputText } from \"../../../core/tasks/command-output.js\";\nimport type { OperationId, PromptRoute, TaskId } from \"../../../core/tasks/contracts.js\";\nimport type { OwnerTaskStore } from \"../../../core/tasks/owner-store.js\";\nimport { taskOwnTranscriptEntries, taskTranscriptSource } from \"../../../core/tasks/supervisor.js\";\nimport { readTaskTranscriptSnapshot } from \"../../../core/tasks/transcript.js\";\nimport { theme } from \"../theme/theme.js\";\nimport { chatEntriesFromAgentMessages, renderChatMessageEntry } from \"./chat-message-renderer.ts\";\nimport { mouseWheelDeltaRows } from \"./chat-transcript.js\";\nimport { keyHintIfBound } from \"./keybinding-hints.js\";\nimport {\n\tTaskDetail,\n\ttype TaskDetailContent,\n\ttaskDetailActions,\n\ttaskDetailLabels,\n\ttaskDetailSummary,\n} from \"./task-detail.js\";\nimport { type TaskListSection, taskListSections } from \"./task-list.js\";\nimport { TaskLiveTranscript } from \"./task-live-transcript.js\";\nimport { TaskNavigation } from \"./task-navigation.js\";\nimport { taskDisplayText, taskLabel, taskMetricsText, taskModelText, taskStatusAppearance } from \"./task-row.js\";\n\n/** Focused view only. The store and original session remain the authorities. */\nexport class TaskInspector implements Component {\n\treadonly navigation: TaskNavigation;\n\tprivate actionIndex = 0;\n\tprivate confirmation?: (answer: boolean) => void;\n\tprivate transcript?: Component[];\n\tprivate liveTranscript?: TaskLiveTranscript;\n\tprivate transcriptRefreshPending = false;\n\tprivate transcriptRequested = false;\n\tprivate transcriptLoading = false;\n\tprivate transcriptHistorical = false;\n\tprivate transcriptPageRows = 5;\n\tprivate cursor?: string;\n\tprivate status = \"\";\n\tprivate scroll = 0;\n\tprivate detailContent: Omit<TaskDetailContent, \"stdinAvailable\"> = {};\n\tprivate detailTaskId?: TaskId;\n\tprivate detailGeneration = 0;\n\tprivate disposed = false;\n\tprivate readonly input = new Input();\n\tprivate readonly unsubscribe: () => void;\n\tconstructor(\n\t\tprivateStore: OwnerTaskStore,\n\t\tprivateRender: () => void,\n\t\tprivateClose: () => void,\n\t\topenQuestion?: (route: PromptRoute) => void,\n\t) {\n\t\tthis.store = privateStore;\n\t\tthis.requestRender = privateRender;\n\t\tthis.close = privateClose;\n\t\tthis.navigation = new TaskNavigation(getKeybindings() as KeybindingsManager, {\n\t\t\tinspect: () => {\n\t\t\t\tthis.releaseLiveTranscript();\n\t\t\t\tthis.actionIndex = 0;\n\t\t\t\tthis.scroll = 0;\n\t\t\t\tthis.transcript = undefined;\n\t\t\t\tthis.transcriptRequested = false;\n\t\t\t\tthis.transcriptLoading = false;\n\t\t\t\tthis.transcriptHistorical = false;\n\t\t\t\tvoid this.loadDetail();\n\t\t\t},\n\t\t\ttranscript: () => {\n\t\t\t\tthis.detailGeneration++;\n\t\t\t\tthis.scroll = 0;\n\t\t\t\tvoid this.loadTranscript();\n\t\t\t},\n\t\t\tforeground: (task) => {\n\t\t\t\tconst lease = this.store.resolveTask(task.ref.taskId);\n\t\t\t\tif (lease.ok)\n\t\t\t\t\tvoid this.store.supervisor.foregroundTask(lease.value).then((result) => {\n\t\t\t\t\t\tthis.status = result.ok ? result.value.kind : result.error.message;\n\t\t\t\t\t\tthis.requestRender();\n\t\t\t\t\t});\n\t\t\t},\n\t\t\tconfirmCancel: () =>\n\t\t\t\tnew Promise<boolean>((resolve) => {\n\t\t\t\t\tthis.confirmation = resolve;\n\t\t\t\t\tthis.requestRender();\n\t\t\t\t}),\n\t\t\tcancel: (task) => {\n\t\t\t\tconst lease = this.store.resolveTask(task.ref.taskId);\n\t\t\t\tif (lease.ok) void this.store.supervisor.cancelTask(lease.value, \"user\").then(() => this.requestRender());\n\t\t\t},\n\t\t\tstdinAvailable: (task) => {\n\t\t\t\tconst lease = this.store.resolveTask(task.ref.taskId);\n\t\t\t\treturn lease.ok && this.store.supervisor.taskStdin(lease.value).ok;\n\t\t\t},\n\t\t\tinput: () => {\n\t\t\t\tthis.input.setValue(\"\");\n\t\t\t},\n\t\t\topenQuestion: (route) => {\n\t\t\t\tif (openQuestion) {\n\t\t\t\t\tthis.close();\n\t\t\t\t\topenQuestion(route);\n\t\t\t\t} else this.status = \"Question is available in its owning session.\";\n\t\t\t},\n\t\t});\n\t\tthis.unsubscribe = this.store.subscribe(() => {\n\t\t\tthis.navigation.update(this.orderedSections().flatMap((section) => section.tasks));\n\t\t\tif (this.transcriptRequested) {\n\t\t\t\tthis.refreshTranscript();\n\t\t\t} else if (this.navigation.focus.kind === \"detail\") void this.loadDetail();\n\t\t\tthis.requestRender();\n\t\t});\n\t\tthis.navigation.update(this.orderedSections().flatMap((section) => section.tasks));\n\t\tthis.navigation.open();\n\t\tthis.input.onSubmit = (text) => {\n\t\t\tvoid this.sendInput(text);\n\t\t};\n\t}\n\tprivate readonly store: OwnerTaskStore;\n\tprivate readonly requestRender: () => void;\n\tprivate readonly close: () => void;\n\topen(id?: TaskId): void {\n\t\tthis.navigation.open(id);\n\t}\n\tprivate orderedSections(): TaskListSection[] {\n\t\treturn taskListSections(this.store.backgroundTasks, this.store.settlementOrder);\n\t}\n\tdispose(): void {\n\t\tthis.disposed = true;\n\t\tthis.releaseLiveTranscript();\n\t\tthis.confirmation?.(false);\n\t\tthis.unsubscribe();\n\t}\n\tinvalidate(): void {\n\t\tfor (const component of this.transcript ?? []) component.invalidate();\n\t}\n\tprivate selected() {\n\t\treturn this.store.backgroundTasks.find((task) => task.ref.taskId === this.navigation.selectedTaskId);\n\t}\n\tprivate stdinAvailable(): boolean {\n\t\tconst task = this.selected();\n\t\tif (!task || task.execution.kind === \"settled\") return false;\n\t\tconst lease = this.store.resolveTask(task.ref.taskId);\n\t\treturn lease.ok && this.store.supervisor.taskStdin(lease.value).ok;\n\t}\n\tprivate async sendInput(text: string): Promise<void> {\n\t\tconst task = this.selected();\n\t\tif (!task) return;\n\t\tconst lease = this.store.resolveTask(task.ref.taskId);\n\t\tif (!lease.ok) return;\n\t\tconst stdin = this.store.supervisor.taskStdin(lease.value);\n\t\tif (!stdin.ok) {\n\t\t\tthis.status = stdin.error.message;\n\t\t\treturn;\n\t\t}\n\t\tconst result = await this.store.supervisor.writeTaskInput(stdin.value, randomUUID() as OperationId, {\n\t\t\tkind: \"bytes\",\n\t\t\tbytes: Buffer.from(`${text}\\n`),\n\t\t});\n\t\tthis.status = result.ok ? `Sent ${result.value.acceptedBytes} bytes` : result.error.message;\n\t\tthis.input.setValue(\"\");\n\t\tthis.requestRender();\n\t}\n\tprivate releaseLiveTranscript(): void {\n\t\tthis.liveTranscript?.dispose();\n\t\tthis.liveTranscript = undefined;\n\t\tthis.transcriptRefreshPending = false;\n\t}\n\tprivate refreshTranscript(): void {\n\t\tif (this.disposed || !this.transcriptRequested) return;\n\t\tconst task = this.selected();\n\t\tconst lease = task && this.store.resolveTask(task.ref.taskId);\n\t\tconst bound = lease?.ok ? taskTranscriptSource(lease.value) : undefined;\n\t\tif (bound?.ok && this.liveTranscript?.source === bound.value.session) return;\n\t\t// Legacy history-only sources have no live tail; keep their retained page anchored.\n\t\tif (bound?.ok && !bound.value.session.subscribe && this.transcriptHistorical) return;\n\t\tif (this.transcriptLoading) this.transcriptRefreshPending = true;\n\t\telse void this.loadTranscript();\n\t}\n\tprivate async loadTranscript(earlier = false): Promise<void> {\n\t\tconst task = this.selected();\n\t\tif (!task) return;\n\t\tconst generation = ++this.detailGeneration;\n\t\tconst focus = this.navigation.focus;\n\t\tthis.transcriptRequested = true;\n\t\tthis.transcriptLoading = true;\n\t\tif (earlier) this.transcriptHistorical = true;\n\t\tthis.requestRender();\n\t\ttry {\n\t\t\tconst lease = this.store.resolveTask(task.ref.taskId);\n\t\t\tif (!lease.ok) {\n\t\t\t\tthis.status = lease.error.message;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (task.kind === \"command\") {\n\t\t\t\tconst count = BigInt(task.output.byteCount);\n\t\t\t\tconst page = await this.store.supervisor.readTaskOutput(lease.value, {\n\t\t\t\t\tstart: String(count > 8192n ? count - 8192n : 0n),\n\t\t\t\t\tmaximumBytes: 8192,\n\t\t\t\t});\n\t\t\t\tif (\n\t\t\t\t\tthis.disposed ||\n\t\t\t\t\tgeneration !== this.detailGeneration ||\n\t\t\t\t\tfocus !== this.navigation.focus ||\n\t\t\t\t\ttask.ref.taskId !== this.navigation.selectedTaskId\n\t\t\t\t)\n\t\t\t\t\treturn;\n\t\t\t\tconst text = page.ok ? taskOutputText(page.value) : page.error.message;\n\t\t\t\tthis.transcript = [\n\t\t\t\t\tnew Text(text.split(\"\\n\").map(taskDisplayText).join(\"\\n\") || \"No output available\", 0, 0),\n\t\t\t\t];\n\t\t\t\tthis.cursor = undefined;\n\t\t\t\tthis.status =\n\t\t\t\t\tcount > 8192n ? \"Earlier output omitted · showing retained 8 KiB tail\" : \"Retained shell output\";\n\t\t\t\tthis.requestRender();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst page = readTaskTranscriptSnapshot(lease.value, earlier ? this.cursor : undefined);\n\t\t\tif (\n\t\t\t\tthis.disposed ||\n\t\t\t\tgeneration !== this.detailGeneration ||\n\t\t\t\tfocus !== this.navigation.focus ||\n\t\t\t\ttask.ref.taskId !== this.navigation.selectedTaskId\n\t\t\t)\n\t\t\t\treturn;\n\t\t\tconst bound = taskTranscriptSource(lease.value);\n\t\t\tif (!bound.ok || (!page.ok && !bound.value.session.subscribe)) {\n\t\t\t\tthis.status = \"Transcript unavailable\";\n\t\t\t\tthis.requestRender();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst ids = new Set(page.ok ? page.value.items.map((item) => item.source.entryId) : []);\n\t\t\tconst messages = bound.value.session.getEntries().flatMap<AgentMessage>((entry) => {\n\t\t\t\tif (entry.type !== \"message\" || !ids.has(entry.id)) return [];\n\t\t\t\tconst message = entry.message;\n\t\t\t\tif (message.role === \"assistant\")\n\t\t\t\t\treturn [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t...message,\n\t\t\t\t\t\t\tcontent: message.content.filter(\n\t\t\t\t\t\t\t\t(block, index) =>\n\t\t\t\t\t\t\t\t\tblock.type !== \"thinking\" &&\n\t\t\t\t\t\t\t\t\tpage.ok &&\n\t\t\t\t\t\t\t\t\tpage.value.items.some(\n\t\t\t\t\t\t\t\t\t\t(item) => item.source.entryId === entry.id && item.source.contentIndex === index,\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t},\n\t\t\t\t\t];\n\t\t\t\treturn message.role === \"user\" || message.role === \"toolResult\" ? [message] : [];\n\t\t\t});\n\t\t\tconst components = chatEntriesFromAgentMessages(messages).map((entry) =>\n\t\t\t\trenderChatMessageEntry(entry, {\n\t\t\t\t\tui: { requestRender: this.requestRender },\n\t\t\t\t\tcwd: process.cwd(),\n\t\t\t\t\thideThinkingBlock: true,\n\t\t\t\t\ttoolOutputExpanded: true,\n\t\t\t\t\tshowImages: false,\n\t\t\t\t}),\n\t\t\t);\n\t\t\tif (!earlier && bound.value.session.subscribe) {\n\t\t\t\tthis.releaseLiveTranscript();\n\t\t\t\tthis.liveTranscript = new TaskLiveTranscript(bound.value.session, messages, this.requestRender);\n\t\t\t\tthis.transcript = [this.liveTranscript];\n\t\t\t} else this.transcript = earlier ? [...components, ...(this.transcript ?? [])] : components;\n\t\t\tthis.cursor = page.ok ? page.value.nextCursor : undefined;\n\t\t\tthis.status = this.cursor ? \"PageUp: earlier retained messages\" : \"\";\n\t\t\tthis.requestRender();\n\t\t} catch {\n\t\t\tif (!this.disposed && generation === this.detailGeneration && focus === this.navigation.focus) {\n\t\t\t\tthis.transcript = [];\n\t\t\t\tthis.status = \"Task output unavailable\";\n\t\t\t\tthis.requestRender();\n\t\t\t}\n\t\t} finally {\n\t\t\tif (generation === this.detailGeneration) {\n\t\t\t\tthis.transcriptLoading = false;\n\t\t\t\tif (this.transcriptRefreshPending) {\n\t\t\t\t\tthis.transcriptRefreshPending = false;\n\t\t\t\t\tthis.refreshTranscript();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tprivate async loadDetail(): Promise<void> {\n\t\tconst selectedId = this.selected()?.ref.taskId;\n\t\tif (selectedId !== this.detailTaskId) {\n\t\t\tthis.detailContent = {};\n\t\t\tthis.detailTaskId = selectedId;\n\t\t}\n\t\tthis.status = \"\";\n\t\tconst generation = ++this.detailGeneration;\n\t\tconst focus = this.navigation.focus;\n\t\tconst task = this.selected();\n\t\tif (!task) return;\n\t\tconst current = () =>\n\t\t\t!this.disposed &&\n\t\t\tgeneration === this.detailGeneration &&\n\t\t\tthis.navigation.focus === focus &&\n\t\t\tfocus.kind === \"detail\" &&\n\t\t\tthis.navigation.selectedTaskId === task.ref.taskId;\n\t\tconst lease = this.store.resolveTask(task.ref.taskId);\n\t\tif (!lease.ok) return;\n\t\tconst ownEntries = taskOwnTranscriptEntries(lease.value);\n\t\tif (ownEntries) {\n\t\t\tconst prompt = ownEntries.find((entry) => entry.type === \"message\" && entry.message.role === \"user\");\n\t\t\tif (prompt?.type === \"message\" && prompt.message.role === \"user\")\n\t\t\t\tthis.detailContent.prompt =\n\t\t\t\t\ttypeof prompt.message.content === \"string\"\n\t\t\t\t\t\t? prompt.message.content\n\t\t\t\t\t\t: prompt.message.content\n\t\t\t\t\t\t\t\t.filter((block) => block.type === \"text\")\n\t\t\t\t\t\t\t\t.map((block) => block.text)\n\t\t\t\t\t\t\t\t.join(\"\");\n\t\t\tconst response = ownEntries\n\t\t\t\t.slice()\n\t\t\t\t.reverse()\n\t\t\t\t.find((entry) => entry.type === \"message\" && entry.message.role === \"assistant\");\n\t\t\tif (response?.type === \"message\" && response.message.role === \"assistant\")\n\t\t\t\tthis.detailContent.output = response.message.content\n\t\t\t\t\t.filter((block) => block.type === \"text\")\n\t\t\t\t\t.map((block) => block.text)\n\t\t\t\t\t.join(\"\");\n\t\t}\n\t\tif (task.kind === \"command\") {\n\t\t\ttry {\n\t\t\t\tconst count = BigInt(task.output.byteCount);\n\t\t\t\tconst output = await this.store.supervisor.readTaskOutput(lease.value, {\n\t\t\t\t\tstart: String(count > 8192n ? count - 8192n : 0n),\n\t\t\t\t\tmaximumBytes: 8192,\n\t\t\t\t});\n\t\t\t\tif (!current()) return;\n\t\t\t\tif (output.ok) {\n\t\t\t\t\tthis.detailContent.output = taskOutputText(output.value);\n\t\t\t\t\tthis.detailContent.outputOmitted = count > 8192n || output.value.omittedRanges.length > 0;\n\t\t\t\t} else this.status = output.error.message;\n\t\t\t} catch {\n\t\t\t\tif (!current()) return;\n\t\t\t\tthis.status = \"Command output unavailable\";\n\t\t\t}\n\t\t}\n\t\tif (current()) this.requestRender();\n\t}\n\thandleInput(data: string): boolean {\n\t\tif (this.confirmation) {\n\t\t\tif (data === \"y\" || data === \"n\" || matchesKey(data, \"escape\")) {\n\t\t\t\tconst answer = this.confirmation;\n\t\t\t\tthis.confirmation = undefined;\n\t\t\t\tanswer(data === \"y\");\n\t\t\t}\n\t\t\tthis.requestRender();\n\t\t\treturn true;\n\t\t}\n\t\tconst wheel = mouseWheelDeltaRows(data);\n\t\tif (wheel !== 0) {\n\t\t\tif (this.navigation.focus.kind === \"tasks\") this.navigation.moveSelection(Math.sign(wheel));\n\t\t\telse if (this.navigation.focus.kind === \"detail\") {\n\t\t\t\tif (this.transcriptRequested && wheel < 0 && this.scroll === 0 && this.cursor && !this.transcriptLoading)\n\t\t\t\t\tvoid this.loadTranscript(true);\n\t\t\t\telse this.scroll = Math.max(0, this.scroll + wheel);\n\t\t\t}\n\t\t\tthis.requestRender();\n\t\t\treturn true;\n\t\t}\n\t\t// Mouse reports are never text input, including horizontal wheel/release.\n\t\tif (/^\\x1b\\[<\\d+;\\d+;\\d+[mM]$/.test(data) || data.startsWith(\"\\x1b[M\")) return true;\n\t\tif (\n\t\t\tmatchesKey(data, \"escape\") ||\n\t\t\t(matchesKey(data, \"left\") && this.navigation.focus.kind !== \"stdin\" && !this.configuredTaskKey(data))\n\t\t) {\n\t\t\tif (this.transcriptRequested) {\n\t\t\t\tthis.releaseLiveTranscript();\n\t\t\t\tthis.detailGeneration++;\n\t\t\t\tthis.transcript = undefined;\n\t\t\t\tthis.transcriptRequested = false;\n\t\t\t\tthis.transcriptLoading = false;\n\t\t\t\tthis.transcriptHistorical = false;\n\t\t\t\tthis.scroll = 0;\n\t\t\t\tvoid this.loadDetail();\n\t\t\t} else {\n\t\t\t\tthis.navigation.handleInput(\"\\x1b\", \"tasks\");\n\t\t\t\tif (this.navigation.focus.kind === \"composer\") this.close();\n\t\t\t}\n\t\t\tthis.requestRender();\n\t\t\treturn true;\n\t\t}\n\t\tif (this.navigation.focus.kind === \"stdin\") {\n\t\t\tthis.input.handleInput(data);\n\t\t\tthis.requestRender();\n\t\t\treturn true;\n\t\t}\n\t\tif (data === \"x\" && !this.configuredTaskKey(data)) {\n\t\t\tvoid this.navigation.activate(\"cancel\");\n\t\t\treturn true;\n\t\t}\n\t\tif (this.transcriptRequested) {\n\t\t\tif (this.configuredTaskKey(data)) this.navigation.handleInput(data, \"tasks\");\n\t\t\telse if (matchesKey(data, \"up\")) this.scroll = Math.max(0, this.scroll - 1);\n\t\t\telse if (matchesKey(data, \"down\")) this.scroll++;\n\t\t\telse if (matchesKey(data, \"pageUp\")) {\n\t\t\t\tif (this.scroll === 0 && this.cursor && !this.transcriptLoading) void this.loadTranscript(true);\n\t\t\t\telse this.scroll = Math.max(0, this.scroll - this.transcriptPageRows);\n\t\t\t} else if (matchesKey(data, \"pageDown\")) this.scroll += this.transcriptPageRows;\n\t\t\telse if (matchesKey(data, \"home\")) this.scroll = 0;\n\t\t\telse if (matchesKey(data, \"end\")) this.scroll = Number.MAX_SAFE_INTEGER;\n\t\t\tthis.requestRender();\n\t\t\treturn true;\n\t\t}\n\t\tconst task = this.selected();\n\t\tif (task && this.navigation.focus.kind === \"detail\") {\n\t\t\tconst actions = taskDetailActions(task.execution, task.attention, this.stdinAvailable());\n\t\t\tif (this.configuredTaskKey(data)) {\n\t\t\t\tif (getKeybindings().matches(data, \"app.tasks.inspect\"))\n\t\t\t\t\tvoid this.navigation.activate(actions[Math.min(this.actionIndex, actions.length - 1)]);\n\t\t\t\telse this.navigation.handleInput(data, \"tasks\");\n\t\t\t\tthis.requestRender();\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (matchesKey(data, \"pageUp\") || matchesKey(data, \"pageDown\")) {\n\t\t\t\tthis.scroll = Math.max(0, this.scroll + (matchesKey(data, \"pageUp\") ? -5 : 5));\n\t\t\t\tthis.requestRender();\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (matchesKey(data, \"up\")) this.actionIndex = Math.max(0, this.actionIndex - 1);\n\t\t\telse if (matchesKey(data, \"down\")) this.actionIndex = Math.min(actions.length - 1, this.actionIndex + 1);\n\t\t\telse if (getKeybindings().matches(data, \"app.tasks.inspect\"))\n\t\t\t\tvoid this.navigation.activate(actions[Math.min(this.actionIndex, actions.length - 1)]);\n\t\t\telse if (!this.navigation.handleInput(data, \"tasks\")) return false;\n\t\t} else if (!this.navigation.handleInput(data, \"tasks\")) return false;\n\t\tthis.requestRender();\n\t\treturn true;\n\t}\n\tprivate configuredTaskKey(data: string): boolean {\n\t\treturn ([\"app.tasks.inspect\", \"app.tasks.foreground\", \"app.tasks.cancel\", \"app.tasks.input\"] as const).some(\n\t\t\t(key) => getKeybindings().matches(data, key),\n\t\t);\n\t}\n\t/** Only the task picker stays inline; drill-down and confirmation own the screen. */\n\tget fullscreen(): boolean {\n\t\treturn (\n\t\t\tthis.confirmation !== undefined ||\n\t\t\tthis.navigation.focus.kind === \"detail\" ||\n\t\t\tthis.navigation.focus.kind === \"stdin\"\n\t\t);\n\t}\n\trenderPicker(width: number, availableRows: number): string[] {\n\t\treturn this.renderViewport(width, Math.max(1, Math.min(12, availableRows)));\n\t}\n\trender(width: number): string[] {\n\t\treturn this.renderViewport(width, Math.max(3, (process.stdout.rows || 24) - 5));\n\t}\n\tprivate renderTranscriptViewport(width: number, budget: number): string[] {\n\t\tconst task = this.selected();\n\t\tconst room = Math.max(1, budget - 5);\n\t\tthis.transcriptPageRows = room;\n\t\tconst rows = this.transcript?.flatMap((component) => component.render(width)) ?? [\n\t\t\tthis.transcriptLoading ? \"Loading transcript…\" : this.status,\n\t\t];\n\t\tthis.scroll = Math.min(this.scroll, Math.max(0, rows.length - room));\n\t\tconst visible = rows.slice(this.scroll, this.scroll + room);\n\t\t// Transcript tools own their backgrounds. Keep them out of a nested box,\n\t\t// strip terminal movement, and reset styles at every viewport row boundary.\n\t\tconst safeLine = (line: string) =>\n\t\t\tline\n\t\t\t\t.split(/(\\x1b\\[[0-9;:]*m)/g)\n\t\t\t\t.map((part, index) =>\n\t\t\t\t\tindex % 2 ? part : stripVTControlCharacters(part).replace(/[\\x00-\\x1f\\x7f-\\x9f]/g, \" \"),\n\t\t\t\t)\n\t\t\t\t.join(\"\");\n\t\tconst fit = (line: string) => truncateToWidth(safeLine(line), Math.max(1, width)) + \"\\x1b[0m\";\n\t\treturn [\n\t\t\ttheme.bold(`Transcript · ${task ? taskDisplayText(taskLabel(task)) : \"Task\"}`),\n\t\t\ttask ? taskDetailSummary(task) : \"\",\n\t\t\ttheme.fg(\"borderMuted\", \"─\".repeat(Math.max(0, width))),\n\t\t\t...visible,\n\t\t\t...Array.from({ length: Math.max(0, room - visible.length) }, () => \"\"),\n\t\t\ttheme.fg(\n\t\t\t\t\"dim\",\n\t\t\t\t`Lines ${rows.length ? this.scroll + 1 : 0}–${Math.min(rows.length, this.scroll + room)} of ${rows.length}${this.cursor ? \" · PgUp at top: earlier history\" : \"\"}${this.status ? ` · ${this.status}` : \"\"}`,\n\t\t\t),\n\t\t\ttheme.fg(\"dim\", \"↑↓ scroll · PgUp/PgDn page · Home/End · ←/Esc back\"),\n\t\t]\n\t\t\t.map(fit)\n\t\t\t.slice(0, Math.max(1, budget));\n\t}\n\trenderViewport(width: number, budget: number): string[] {\n\t\tif (this.transcriptRequested && !this.confirmation && this.navigation.focus.kind === \"detail\")\n\t\t\treturn this.renderTranscriptViewport(width, budget);\n\t\tconst framed = width >= 20 && budget >= 7;\n\t\tconst inner = Math.max(1, width - (framed ? 4 : 0));\n\t\tconst current = this.selected();\n\t\tconst detail = this.navigation.focus.kind === \"detail\";\n\t\tconst selectingAction = current && detail && !this.transcriptRequested && !this.confirmation;\n\t\tconst actions = selectingAction\n\t\t\t? taskDetailActions(current.execution, current.attention, this.stdinAvailable())\n\t\t\t: [];\n\t\tthis.actionIndex = Math.max(0, Math.min(this.actionIndex, actions.length - 1));\n\t\tconst action = actions[this.actionIndex];\n\t\tconst actionRow = action ? [theme.fg(\"accent\", `› ${taskDetailLabels[action]}`)] : [];\n\t\tconst rows = this.renderAll(inner);\n\t\tconst compactSummary = !framed && detail && current && budget >= 4 ? [taskDetailSummary(current)] : [];\n\t\tconst height = Math.max(0, budget - (framed ? 4 : 1) - actionRow.length - compactSummary.length);\n\t\tconst selected = detail ? -1 : rows.findIndex((row) => stripVTControlCharacters(row).startsWith(\"›\"));\n\t\tthis.scroll = Math.min(this.scroll, Math.max(0, rows.length - height));\n\t\tconst selectionRows = Math.min(height, current?.kind === \"agent\" ? 3 : 2);\n\t\tconst offset = detail ? this.scroll : Math.max(0, selected + selectionRows - height);\n\t\tconst view = rows.slice(offset, offset + height);\n\t\tconst inspect = keyHintIfBound(\"app.tasks.inspect\", detail ? \"select\" : \"view\");\n\t\tconst hints = this.confirmation\n\t\t\t? \"y confirm · n/Esc keep running\"\n\t\t\t: this.navigation.focus.kind === \"stdin\"\n\t\t\t\t? \"Enter send · Esc back\"\n\t\t\t\t: this.transcriptRequested\n\t\t\t\t\t? \"↑↓ scroll · PgUp/PgDn page · ←/Esc back\"\n\t\t\t\t\t: [\n\t\t\t\t\t\t\tdetail ? \"PgUp/PgDn scroll · ↑↓ actions\" : \"↑↓ select\",\n\t\t\t\t\t\t\tinspect,\n\t\t\t\t\t\t\tcurrent && current.execution.kind !== \"settled\"\n\t\t\t\t\t\t\t\t? keyHintIfBound(\"app.tasks.cancel\", \"stop\") || (!this.configuredTaskKey(\"x\") ? \"x stop\" : \"\")\n\t\t\t\t\t\t\t\t: \"\",\n\t\t\t\t\t\t\t\"Esc back\",\n\t\t\t\t\t\t]\n\t\t\t\t\t\t\t.filter(Boolean)\n\t\t\t\t\t\t\t.join(\" · \");\n\t\tconst footer = theme.fg(\"dim\", truncateToWidth(`/tasks · ${hints}`, width));\n\t\tif (!framed)\n\t\t\treturn [...compactSummary, ...view, ...actionRow, footer]\n\t\t\t\t.map((line) => truncateToWidth(line, width))\n\t\t\t\t.slice(-Math.max(1, budget));\n\t\tconst live = this.store.backgroundTasks.filter((task) => task.execution.kind !== \"settled\").length;\n\t\tconst title =\n\t\t\tdetail && current\n\t\t\t\t? `${taskDisplayText(taskLabel(current))} › ${taskDisplayText(current.title)}`\n\t\t\t\t: \"Background tasks\";\n\t\tconst heading = ` ${truncateToWidth(title, Math.max(1, width - 5))} `;\n\t\tconst border = (text: string) => theme.fg(\"borderMuted\", text);\n\t\tconst frameRow = (line: string) => {\n\t\t\tconst text = truncateToWidth(line, inner);\n\t\t\treturn border(\"│ \") + text + \" \".repeat(Math.max(0, inner - visibleWidth(text))) + border(\" │\");\n\t\t};\n\t\treturn [\n\t\t\tborder(\"╭─\") + theme.bold(heading) + border(`${\"─\".repeat(Math.max(0, width - visibleWidth(heading) - 3))}╮`),\n\t\t\tframeRow(\n\t\t\t\tdetail && current\n\t\t\t\t\t? taskDetailSummary(current)\n\t\t\t\t\t: theme.fg(\"muted\", `${live} active · ${this.store.backgroundTasks.length} total`),\n\t\t\t),\n\t\t\t...view.map(frameRow),\n\t\t\t...actionRow.map(frameRow),\n\t\t\tborder(`╰${\"─\".repeat(Math.max(0, width - 2))}╯`),\n\t\t\tfooter,\n\t\t].map((line) => truncateToWidth(line, width));\n\t}\n\tprivate renderAll(width: number): string[] {\n\t\tconst task = this.selected();\n\t\tif (this.confirmation)\n\t\t\treturn new Text(\n\t\t\t\t`Cancel ${task?.title}\\nTask ${task?.ref.taskId}\\ny: confirm · n/Escape: keep running`,\n\t\t\t\t0,\n\t\t\t\t0,\n\t\t\t).render(width);\n\t\tif (this.navigation.focus.kind === \"stdin\")\n\t\t\treturn [`Input to ${task?.title} · Escape: tasks`, ...this.input.render(width), this.status];\n\t\tif (this.transcript) return [...this.transcript.flatMap((component) => component.render(width)), this.status];\n\t\tif (this.transcriptRequested)\n\t\t\treturn [this.transcriptLoading ? \"Loading transcript…\" : this.status || \"Transcript unavailable\"];\n\t\tif (task && this.navigation.focus.kind === \"detail\") {\n\t\t\treturn [\n\t\t\t\t...new TaskDetail(task, {\n\t\t\t\t\t...this.detailContent,\n\t\t\t\t\tstdinAvailable: this.stdinAvailable(),\n\t\t\t\t\tactivity: this.store.recentActivity(task.ref.taskId),\n\t\t\t\t\tactivityOmitted: this.store.activityOmitted(task.ref.taskId),\n\t\t\t\t}).renderContent(width),\n\t\t\t\tthis.status,\n\t\t\t];\n\t\t}\n\t\tconst sections = this.orderedSections();\n\t\tif (!sections.length)\n\t\t\treturn new Text(\"No background tasks.\\nBackground agents and shells will appear here.\", 0, 0).render(width);\n\t\treturn sections.flatMap((section) => [\n\t\t\t\"\",\n\t\t\ttheme.fg(\"muted\", theme.bold(`${section.title} (${section.tasks.length})`)),\n\t\t\t...section.tasks.flatMap((item) => {\n\t\t\t\tconst selected = item.ref.taskId === this.navigation.selectedTaskId;\n\t\t\t\tconst { label: state, color, icon } = taskStatusAppearance(item);\n\t\t\t\tconst status = width < 32 ? ` ${icon}` : ` ${icon} ${state}`;\n\t\t\t\tconst name = taskDisplayText(item.title || taskLabel(item));\n\t\t\t\tconst marker = selected ? \"› \" : \" \";\n\t\t\t\tconst title = marker + truncateToWidth(name, Math.max(1, width - visibleWidth(status) - 3));\n\t\t\t\tconst row = `${selected ? theme.fg(\"accent\", theme.bold(title)) : title}${\" \".repeat(Math.max(1, width - visibleWidth(title) - visibleWidth(status)))}${theme.fg(color, status)}`;\n\t\t\t\tconst metadata = [\n\t\t\t\t\t...(width < 32 ? [state] : []),\n\t\t\t\t\ttaskLabel(item),\n\t\t\t\t\ttaskMetricsText(item),\n\t\t\t\t\titem.currentAction ? `${item.currentAction.tool} ${item.currentAction.text}` : \"\",\n\t\t\t\t]\n\t\t\t\t\t.filter(Boolean)\n\t\t\t\t\t.join(\" · \");\n\t\t\t\treturn [\n\t\t\t\t\ttruncateToWidth(row, width),\n\t\t\t\t\t...(item.kind === \"agent\" ? [theme.fg(\"dim\", truncateToWidth(` ${taskModelText(item)}`, width))] : []),\n\t\t\t\t\t...(selected ? [theme.fg(\"dim\", truncateToWidth(` ${taskDisplayText(metadata)}`, width))] : []),\n\t\t\t\t];\n\t\t\t}),\n\t\t]);\n\t}\n}\n"]}
1
+ {"version":3,"file":"task-inspector.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/task-inspector.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport { stripVTControlCharacters } from \"node:util\";\nimport type { AgentMessage } from \"@earendil-works/pi-agent-core\";\nimport {\n\ttype Component,\n\tgetKeybindings,\n\tInput,\n\tmatchesKey,\n\tText,\n\ttruncateToWidth,\n\tvisibleWidth,\n} from \"@earendil-works/pi-tui\";\nimport type { KeybindingsManager } from \"../../../core/keybindings.ts\";\nimport { taskOutputText } from \"../../../core/tasks/command-output.js\";\nimport type { OperationId, PromptRoute, TaskId } from \"../../../core/tasks/contracts.js\";\nimport type { OwnerTaskStore } from \"../../../core/tasks/owner-store.js\";\nimport { taskOwnTranscriptEntries, taskTranscriptSource } from \"../../../core/tasks/supervisor.js\";\nimport { readTaskTranscriptSnapshot } from \"../../../core/tasks/transcript.js\";\nimport { theme } from \"../theme/theme.js\";\nimport { chatEntriesFromAgentMessages, renderChatMessageEntry } from \"./chat-message-renderer.ts\";\nimport { mouseWheelDeltaRows } from \"./chat-transcript.js\";\nimport { keyHintIfBound } from \"./keybinding-hints.js\";\nimport {\n\tTaskDetail,\n\ttype TaskDetailContent,\n\ttaskDetailActions,\n\ttaskDetailLabels,\n\ttaskDetailSummary,\n} from \"./task-detail.js\";\nimport { type TaskListSection, taskListSections } from \"./task-list.js\";\nimport { TaskLiveTranscript } from \"./task-live-transcript.js\";\nimport { TaskNavigation } from \"./task-navigation.js\";\nimport { taskDisplayText, taskLabel, taskMetricsText, taskModelText, taskStatusAppearance } from \"./task-row.js\";\n\n/** Focused view only. The store and original session remain the authorities. */\nexport class TaskInspector implements Component {\n\treadonly navigation: TaskNavigation;\n\tprivate actionIndex = 0;\n\tprivate confirmation?: (answer: boolean) => void;\n\tprivate transcript?: Component[];\n\tprivate liveTranscript?: TaskLiveTranscript;\n\tprivate transcriptRefreshPending = false;\n\tprivate transcriptRequested = false;\n\tprivate transcriptLoading = false;\n\tprivate transcriptHistorical = false;\n\tprivate transcriptPageRows = 5;\n\tprivate cursor?: string;\n\tprivate status = \"\";\n\tprivate scroll = 0;\n\tprivate detailContent: Omit<TaskDetailContent, \"stdinAvailable\"> = {};\n\tprivate detailTaskId?: TaskId;\n\tprivate detailGeneration = 0;\n\tprivate disposed = false;\n\tprivate readonly input = new Input();\n\tprivate readonly unsubscribe: () => void;\n\tconstructor(\n\t\tprivateStore: OwnerTaskStore,\n\t\tprivateRender: () => void,\n\t\tprivateClose: () => void,\n\t\topenQuestion?: (route: PromptRoute) => void,\n\t) {\n\t\tthis.store = privateStore;\n\t\tthis.requestRender = privateRender;\n\t\tthis.close = privateClose;\n\t\tthis.navigation = new TaskNavigation(getKeybindings() as KeybindingsManager, {\n\t\t\tinspect: () => {\n\t\t\t\tthis.releaseLiveTranscript();\n\t\t\t\tthis.actionIndex = 0;\n\t\t\t\tthis.scroll = 0;\n\t\t\t\tthis.transcript = undefined;\n\t\t\t\tthis.transcriptRequested = false;\n\t\t\t\tthis.transcriptLoading = false;\n\t\t\t\tthis.transcriptHistorical = false;\n\t\t\t\tvoid this.loadDetail();\n\t\t\t},\n\t\t\ttranscript: () => {\n\t\t\t\tthis.detailGeneration++;\n\t\t\t\tthis.scroll = 0;\n\t\t\t\tvoid this.loadTranscript();\n\t\t\t},\n\t\t\tforeground: (task) => {\n\t\t\t\tconst lease = this.store.resolveTask(task.ref.taskId);\n\t\t\t\tif (lease.ok)\n\t\t\t\t\tvoid this.store.supervisor.foregroundTask(lease.value).then((result) => {\n\t\t\t\t\t\tthis.status = result.ok ? result.value.kind : result.error.message;\n\t\t\t\t\t\tthis.requestRender();\n\t\t\t\t\t});\n\t\t\t},\n\t\t\tconfirmCancel: () =>\n\t\t\t\tnew Promise<boolean>((resolve) => {\n\t\t\t\t\tthis.confirmation = resolve;\n\t\t\t\t\tthis.requestRender();\n\t\t\t\t}),\n\t\t\tcancel: (task) => {\n\t\t\t\tconst lease = this.store.resolveTask(task.ref.taskId);\n\t\t\t\tif (lease.ok) void this.store.supervisor.cancelTask(lease.value, \"user\").then(() => this.requestRender());\n\t\t\t},\n\t\t\tstdinAvailable: (task) => {\n\t\t\t\tconst lease = this.store.resolveTask(task.ref.taskId);\n\t\t\t\treturn lease.ok && this.store.supervisor.taskStdin(lease.value).ok;\n\t\t\t},\n\t\t\tinput: () => {\n\t\t\t\tthis.input.setValue(\"\");\n\t\t\t},\n\t\t\topenQuestion: (route) => {\n\t\t\t\tif (openQuestion) {\n\t\t\t\t\tthis.close();\n\t\t\t\t\topenQuestion(route);\n\t\t\t\t} else this.status = \"Question is available in its owning session.\";\n\t\t\t},\n\t\t});\n\t\tthis.unsubscribe = this.store.subscribe(() => {\n\t\t\tthis.navigation.update(this.orderedSections().flatMap((section) => section.tasks));\n\t\t\tif (this.transcriptRequested) {\n\t\t\t\tthis.refreshTranscript();\n\t\t\t} else if (this.navigation.focus.kind === \"detail\") void this.loadDetail();\n\t\t\tthis.requestRender();\n\t\t});\n\t\tthis.navigation.update(this.orderedSections().flatMap((section) => section.tasks));\n\t\tthis.navigation.open();\n\t\tthis.input.onSubmit = (text) => {\n\t\t\tvoid this.sendInput(text);\n\t\t};\n\t}\n\tprivate readonly store: OwnerTaskStore;\n\tprivate readonly requestRender: () => void;\n\tprivate readonly close: () => void;\n\topen(id?: TaskId): void {\n\t\tthis.navigation.open(id);\n\t}\n\tprivate orderedSections(): TaskListSection[] {\n\t\treturn taskListSections(this.store.backgroundTasks, this.store.settlementOrder);\n\t}\n\tdispose(): void {\n\t\tthis.disposed = true;\n\t\tthis.releaseLiveTranscript();\n\t\tthis.confirmation?.(false);\n\t\tthis.unsubscribe();\n\t}\n\tinvalidate(): void {\n\t\tfor (const component of this.transcript ?? []) component.invalidate();\n\t}\n\tprivate selected() {\n\t\treturn this.store.backgroundTasks.find((task) => task.ref.taskId === this.navigation.selectedTaskId);\n\t}\n\tprivate stdinAvailable(): boolean {\n\t\tconst task = this.selected();\n\t\tif (!task || task.execution.kind === \"settled\") return false;\n\t\tconst lease = this.store.resolveTask(task.ref.taskId);\n\t\treturn lease.ok && this.store.supervisor.taskStdin(lease.value).ok;\n\t}\n\tprivate async sendInput(text: string): Promise<void> {\n\t\tconst task = this.selected();\n\t\tif (!task) return;\n\t\tconst lease = this.store.resolveTask(task.ref.taskId);\n\t\tif (!lease.ok) return;\n\t\tconst stdin = this.store.supervisor.taskStdin(lease.value);\n\t\tif (!stdin.ok) {\n\t\t\tthis.status = stdin.error.message;\n\t\t\treturn;\n\t\t}\n\t\tconst result = await this.store.supervisor.writeTaskInput(stdin.value, randomUUID() as OperationId, {\n\t\t\tkind: \"bytes\",\n\t\t\tbytes: Buffer.from(`${text}\\n`),\n\t\t});\n\t\tthis.status = result.ok ? `Sent ${result.value.acceptedBytes} bytes` : result.error.message;\n\t\tthis.input.setValue(\"\");\n\t\tthis.requestRender();\n\t}\n\tprivate releaseLiveTranscript(): void {\n\t\tthis.liveTranscript?.dispose();\n\t\tthis.liveTranscript = undefined;\n\t\tthis.transcriptRefreshPending = false;\n\t}\n\tprivate refreshTranscript(): void {\n\t\tif (this.disposed || !this.transcriptRequested) return;\n\t\tconst task = this.selected();\n\t\tconst lease = task && this.store.resolveTask(task.ref.taskId);\n\t\tconst bound = lease?.ok ? taskTranscriptSource(lease.value) : undefined;\n\t\tif (bound?.ok && this.liveTranscript?.source === bound.value.session) return;\n\t\t// Legacy history-only sources have no live tail; keep their retained page anchored.\n\t\tif (bound?.ok && !bound.value.session.subscribe && this.transcriptHistorical) return;\n\t\tif (this.transcriptLoading) this.transcriptRefreshPending = true;\n\t\telse void this.loadTranscript();\n\t}\n\tprivate async loadTranscript(earlier = false): Promise<void> {\n\t\tconst task = this.selected();\n\t\tif (!task) return;\n\t\tconst generation = ++this.detailGeneration;\n\t\tconst focus = this.navigation.focus;\n\t\tthis.transcriptRequested = true;\n\t\tthis.transcriptLoading = true;\n\t\tif (earlier) this.transcriptHistorical = true;\n\t\tthis.requestRender();\n\t\ttry {\n\t\t\tconst lease = this.store.resolveTask(task.ref.taskId);\n\t\t\tif (!lease.ok) {\n\t\t\t\tthis.status = lease.error.message;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (task.kind === \"command\") {\n\t\t\t\tconst count = BigInt(task.output.byteCount);\n\t\t\t\tconst page = await this.store.supervisor.readTaskOutput(lease.value, {\n\t\t\t\t\tstart: String(count > 8192n ? count - 8192n : 0n),\n\t\t\t\t\tmaximumBytes: 8192,\n\t\t\t\t});\n\t\t\t\tif (\n\t\t\t\t\tthis.disposed ||\n\t\t\t\t\tgeneration !== this.detailGeneration ||\n\t\t\t\t\tfocus !== this.navigation.focus ||\n\t\t\t\t\ttask.ref.taskId !== this.navigation.selectedTaskId\n\t\t\t\t)\n\t\t\t\t\treturn;\n\t\t\t\tconst text = page.ok ? taskOutputText(page.value) : page.error.message;\n\t\t\t\tthis.transcript = [\n\t\t\t\t\tnew Text(text.split(\"\\n\").map(taskDisplayText).join(\"\\n\") || \"No output available\", 0, 0),\n\t\t\t\t];\n\t\t\t\tthis.cursor = undefined;\n\t\t\t\tthis.status =\n\t\t\t\t\tcount > 8192n ? \"Earlier output omitted · showing retained 8 KiB tail\" : \"Retained shell output\";\n\t\t\t\tthis.requestRender();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst page = readTaskTranscriptSnapshot(lease.value, earlier ? this.cursor : undefined);\n\t\t\tif (\n\t\t\t\tthis.disposed ||\n\t\t\t\tgeneration !== this.detailGeneration ||\n\t\t\t\tfocus !== this.navigation.focus ||\n\t\t\t\ttask.ref.taskId !== this.navigation.selectedTaskId\n\t\t\t)\n\t\t\t\treturn;\n\t\t\tconst bound = taskTranscriptSource(lease.value);\n\t\t\tif (!bound.ok || (!page.ok && !bound.value.session.subscribe)) {\n\t\t\t\tthis.status = \"Transcript unavailable\";\n\t\t\t\tthis.requestRender();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst ids = new Set(page.ok ? page.value.items.map((item) => item.source.entryId) : []);\n\t\t\tconst messages = bound.value.session.getEntries().flatMap<AgentMessage>((entry) => {\n\t\t\t\tif (entry.type !== \"message\" || !ids.has(entry.id)) return [];\n\t\t\t\tconst message = entry.message;\n\t\t\t\tif (message.role === \"assistant\")\n\t\t\t\t\treturn [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t...message,\n\t\t\t\t\t\t\tcontent: message.content.filter(\n\t\t\t\t\t\t\t\t(block, index) =>\n\t\t\t\t\t\t\t\t\tblock.type !== \"thinking\" &&\n\t\t\t\t\t\t\t\t\tpage.ok &&\n\t\t\t\t\t\t\t\t\tpage.value.items.some(\n\t\t\t\t\t\t\t\t\t\t(item) => item.source.entryId === entry.id && item.source.contentIndex === index,\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t},\n\t\t\t\t\t];\n\t\t\t\treturn message.role === \"user\" || message.role === \"toolResult\" ? [message] : [];\n\t\t\t});\n\t\t\tconst components = chatEntriesFromAgentMessages(messages).map((entry) =>\n\t\t\t\trenderChatMessageEntry(entry, {\n\t\t\t\t\tui: { requestRender: this.requestRender },\n\t\t\t\t\tcwd: process.cwd(),\n\t\t\t\t\thideThinkingBlock: true,\n\t\t\t\t\ttoolOutputExpanded: true,\n\t\t\t\t\tshowImages: false,\n\t\t\t\t}),\n\t\t\t);\n\t\t\tif (!earlier && bound.value.session.subscribe) {\n\t\t\t\tthis.releaseLiveTranscript();\n\t\t\t\tthis.liveTranscript = new TaskLiveTranscript(bound.value.session, messages, this.requestRender);\n\t\t\t\tthis.transcript = [this.liveTranscript];\n\t\t\t} else this.transcript = earlier ? [...components, ...(this.transcript ?? [])] : components;\n\t\t\tthis.cursor = page.ok ? page.value.nextCursor : undefined;\n\t\t\tthis.status = this.cursor ? \"PageUp: earlier retained messages\" : \"\";\n\t\t\tthis.requestRender();\n\t\t} catch {\n\t\t\tif (!this.disposed && generation === this.detailGeneration && focus === this.navigation.focus) {\n\t\t\t\tthis.transcript = [];\n\t\t\t\tthis.status = \"Task output unavailable\";\n\t\t\t\tthis.requestRender();\n\t\t\t}\n\t\t} finally {\n\t\t\tif (generation === this.detailGeneration) {\n\t\t\t\tthis.transcriptLoading = false;\n\t\t\t\tif (this.transcriptRefreshPending) {\n\t\t\t\t\tthis.transcriptRefreshPending = false;\n\t\t\t\t\tthis.refreshTranscript();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tprivate async loadDetail(): Promise<void> {\n\t\tconst selectedId = this.selected()?.ref.taskId;\n\t\tif (selectedId !== this.detailTaskId) {\n\t\t\tthis.detailContent = {};\n\t\t\tthis.detailTaskId = selectedId;\n\t\t}\n\t\tthis.status = \"\";\n\t\tconst generation = ++this.detailGeneration;\n\t\tconst focus = this.navigation.focus;\n\t\tconst task = this.selected();\n\t\tif (!task) return;\n\t\tconst current = () =>\n\t\t\t!this.disposed &&\n\t\t\tgeneration === this.detailGeneration &&\n\t\t\tthis.navigation.focus === focus &&\n\t\t\tfocus.kind === \"detail\" &&\n\t\t\tthis.navigation.selectedTaskId === task.ref.taskId;\n\t\tconst lease = this.store.resolveTask(task.ref.taskId);\n\t\tif (!lease.ok) return;\n\t\tconst ownEntries = taskOwnTranscriptEntries(lease.value);\n\t\tif (ownEntries) {\n\t\t\tconst prompt = ownEntries.find((entry) => entry.type === \"message\" && entry.message.role === \"user\");\n\t\t\tif (prompt?.type === \"message\" && prompt.message.role === \"user\")\n\t\t\t\tthis.detailContent.prompt =\n\t\t\t\t\ttypeof prompt.message.content === \"string\"\n\t\t\t\t\t\t? prompt.message.content\n\t\t\t\t\t\t: prompt.message.content\n\t\t\t\t\t\t\t\t.filter((block) => block.type === \"text\")\n\t\t\t\t\t\t\t\t.map((block) => block.text)\n\t\t\t\t\t\t\t\t.join(\"\");\n\t\t\tconst response = ownEntries\n\t\t\t\t.slice()\n\t\t\t\t.reverse()\n\t\t\t\t.find((entry) => entry.type === \"message\" && entry.message.role === \"assistant\");\n\t\t\tif (response?.type === \"message\" && response.message.role === \"assistant\")\n\t\t\t\tthis.detailContent.output = response.message.content\n\t\t\t\t\t.filter((block) => block.type === \"text\")\n\t\t\t\t\t.map((block) => block.text)\n\t\t\t\t\t.join(\"\");\n\t\t}\n\t\tif (task.kind === \"command\") {\n\t\t\ttry {\n\t\t\t\tconst count = BigInt(task.output.byteCount);\n\t\t\t\tconst output = await this.store.supervisor.readTaskOutput(lease.value, {\n\t\t\t\t\tstart: String(count > 8192n ? count - 8192n : 0n),\n\t\t\t\t\tmaximumBytes: 8192,\n\t\t\t\t});\n\t\t\t\tif (!current()) return;\n\t\t\t\tif (output.ok) {\n\t\t\t\t\tthis.detailContent.output = taskOutputText(output.value);\n\t\t\t\t\tthis.detailContent.outputOmitted = count > 8192n || output.value.omittedRanges.length > 0;\n\t\t\t\t} else this.status = output.error.message;\n\t\t\t} catch {\n\t\t\t\tif (!current()) return;\n\t\t\t\tthis.status = \"Command output unavailable\";\n\t\t\t}\n\t\t}\n\t\tif (current()) this.requestRender();\n\t}\n\thandleInput(data: string): boolean {\n\t\tif (this.confirmation) {\n\t\t\tif (data === \"y\" || data === \"n\" || matchesKey(data, \"escape\")) {\n\t\t\t\tconst answer = this.confirmation;\n\t\t\t\tthis.confirmation = undefined;\n\t\t\t\tanswer(data === \"y\");\n\t\t\t}\n\t\t\tthis.requestRender();\n\t\t\treturn true;\n\t\t}\n\t\tconst wheel = mouseWheelDeltaRows(data);\n\t\tif (wheel !== 0) {\n\t\t\tif (this.navigation.focus.kind === \"tasks\") this.navigation.moveSelection(Math.sign(wheel));\n\t\t\telse if (this.navigation.focus.kind === \"detail\") {\n\t\t\t\tif (this.transcriptRequested && wheel < 0 && this.scroll === 0 && this.cursor && !this.transcriptLoading)\n\t\t\t\t\tvoid this.loadTranscript(true);\n\t\t\t\telse this.scroll = Math.max(0, this.scroll + wheel);\n\t\t\t}\n\t\t\tthis.requestRender();\n\t\t\treturn true;\n\t\t}\n\t\t// Mouse reports are never text input, including horizontal wheel/release.\n\t\tif (/^\\x1b\\[<\\d+;\\d+;\\d+[mM]$/.test(data) || data.startsWith(\"\\x1b[M\")) return true;\n\t\tif (\n\t\t\tmatchesKey(data, \"escape\") ||\n\t\t\t(matchesKey(data, \"left\") && this.navigation.focus.kind !== \"stdin\" && !this.configuredTaskKey(data))\n\t\t) {\n\t\t\tif (this.transcriptRequested) {\n\t\t\t\tthis.releaseLiveTranscript();\n\t\t\t\tthis.detailGeneration++;\n\t\t\t\tthis.transcript = undefined;\n\t\t\t\tthis.transcriptRequested = false;\n\t\t\t\tthis.transcriptLoading = false;\n\t\t\t\tthis.transcriptHistorical = false;\n\t\t\t\tthis.scroll = 0;\n\t\t\t\tvoid this.loadDetail();\n\t\t\t} else {\n\t\t\t\tthis.navigation.handleInput(\"\\x1b\", \"tasks\");\n\t\t\t\tif (this.navigation.focus.kind === \"composer\") this.close();\n\t\t\t}\n\t\t\tthis.requestRender();\n\t\t\treturn true;\n\t\t}\n\t\tif (this.navigation.focus.kind === \"stdin\") {\n\t\t\tthis.input.handleInput(data);\n\t\t\tthis.requestRender();\n\t\t\treturn true;\n\t\t}\n\t\tif (data === \"x\" && !this.configuredTaskKey(data)) {\n\t\t\tvoid this.navigation.activate(\"cancel\");\n\t\t\treturn true;\n\t\t}\n\t\tif (this.transcriptRequested) {\n\t\t\tif (this.configuredTaskKey(data)) this.navigation.handleInput(data, \"tasks\");\n\t\t\telse if (matchesKey(data, \"up\")) this.scroll = Math.max(0, this.scroll - 1);\n\t\t\telse if (matchesKey(data, \"down\")) this.scroll++;\n\t\t\telse if (matchesKey(data, \"pageUp\")) {\n\t\t\t\tif (this.scroll === 0 && this.cursor && !this.transcriptLoading) void this.loadTranscript(true);\n\t\t\t\telse this.scroll = Math.max(0, this.scroll - this.transcriptPageRows);\n\t\t\t} else if (matchesKey(data, \"pageDown\")) this.scroll += this.transcriptPageRows;\n\t\t\telse if (matchesKey(data, \"home\")) this.scroll = 0;\n\t\t\telse if (matchesKey(data, \"end\")) this.scroll = Number.MAX_SAFE_INTEGER;\n\t\t\tthis.requestRender();\n\t\t\treturn true;\n\t\t}\n\t\tconst task = this.selected();\n\t\tif (task && this.navigation.focus.kind === \"detail\") {\n\t\t\tconst actions = taskDetailActions(task.execution, task.attention, this.stdinAvailable());\n\t\t\tif (this.configuredTaskKey(data)) {\n\t\t\t\tif (getKeybindings().matches(data, \"app.tasks.inspect\"))\n\t\t\t\t\tvoid this.navigation.activate(actions[Math.min(this.actionIndex, actions.length - 1)]);\n\t\t\t\telse this.navigation.handleInput(data, \"tasks\");\n\t\t\t\tthis.requestRender();\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (matchesKey(data, \"pageUp\") || matchesKey(data, \"pageDown\")) {\n\t\t\t\tthis.scroll = Math.max(0, this.scroll + (matchesKey(data, \"pageUp\") ? -5 : 5));\n\t\t\t\tthis.requestRender();\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (matchesKey(data, \"up\")) this.actionIndex = Math.max(0, this.actionIndex - 1);\n\t\t\telse if (matchesKey(data, \"down\")) this.actionIndex = Math.min(actions.length - 1, this.actionIndex + 1);\n\t\t\telse if (getKeybindings().matches(data, \"app.tasks.inspect\"))\n\t\t\t\tvoid this.navigation.activate(actions[Math.min(this.actionIndex, actions.length - 1)]);\n\t\t\telse if (!this.navigation.handleInput(data, \"tasks\")) return false;\n\t\t} else if (!this.navigation.handleInput(data, \"tasks\")) return false;\n\t\tthis.requestRender();\n\t\treturn true;\n\t}\n\tprivate configuredTaskKey(data: string): boolean {\n\t\treturn ([\"app.tasks.inspect\", \"app.tasks.foreground\", \"app.tasks.cancel\", \"app.tasks.input\"] as const).some(\n\t\t\t(key) => getKeybindings().matches(data, key),\n\t\t);\n\t}\n\t/** Only the task picker stays inline; drill-down and confirmation own the screen. */\n\tget fullscreen(): boolean {\n\t\treturn (\n\t\t\tthis.confirmation !== undefined ||\n\t\t\tthis.navigation.focus.kind === \"detail\" ||\n\t\t\tthis.navigation.focus.kind === \"stdin\"\n\t\t);\n\t}\n\trenderPicker(width: number, availableRows: number): string[] {\n\t\treturn this.renderViewport(width, Math.max(1, Math.min(12, availableRows)));\n\t}\n\trender(width: number): string[] {\n\t\treturn this.renderViewport(width, Math.max(3, (process.stdout.rows || 24) - 5));\n\t}\n\tprivate renderTranscriptViewport(width: number, budget: number): string[] {\n\t\tconst task = this.selected();\n\t\tconst room = Math.max(1, budget - 5);\n\t\tthis.transcriptPageRows = room;\n\t\tconst rows = this.transcript?.flatMap((component) => component.render(width)) ?? [\n\t\t\tthis.transcriptLoading ? \"Loading transcript…\" : this.status,\n\t\t];\n\t\tthis.scroll = Math.min(this.scroll, Math.max(0, rows.length - room));\n\t\tconst visible = rows.slice(this.scroll, this.scroll + room);\n\t\t// Transcript tools own their backgrounds. Keep them out of a nested box,\n\t\t// strip terminal movement, and reset styles at every viewport row boundary.\n\t\tconst safeLine = (line: string) =>\n\t\t\tline\n\t\t\t\t.split(/(\\x1b\\[[0-9;:]*m)/g)\n\t\t\t\t.map((part, index) =>\n\t\t\t\t\tindex % 2 ? part : stripVTControlCharacters(part).replace(/[\\x00-\\x1f\\x7f-\\x9f]/g, \" \"),\n\t\t\t\t)\n\t\t\t\t.join(\"\");\n\t\tconst fit = (line: string) => truncateToWidth(safeLine(line), Math.max(1, width)) + \"\\x1b[0m\";\n\t\treturn [\n\t\t\ttheme.bold(`Transcript · ${task ? taskDisplayText(taskLabel(task)) : \"Task\"}`),\n\t\t\ttask ? taskDetailSummary(task) : \"\",\n\t\t\ttheme.fg(\"borderMuted\", \"─\".repeat(Math.max(0, width))),\n\t\t\t...visible,\n\t\t\t...Array.from({ length: Math.max(0, room - visible.length) }, () => \"\"),\n\t\t\ttheme.fg(\n\t\t\t\t\"dim\",\n\t\t\t\t`Lines ${rows.length ? this.scroll + 1 : 0}–${Math.min(rows.length, this.scroll + room)} of ${rows.length}${this.cursor ? \" · PgUp at top: earlier history\" : \"\"}${this.status ? ` · ${this.status}` : \"\"}`,\n\t\t\t),\n\t\t\ttheme.fg(\"dim\", \"↑↓ scroll · PgUp/PgDn page · Home/End · ←/Esc back\"),\n\t\t]\n\t\t\t.map(fit)\n\t\t\t.slice(0, Math.max(1, budget));\n\t}\n\trenderViewport(width: number, budget: number): string[] {\n\t\tif (this.transcriptRequested && !this.confirmation && this.navigation.focus.kind === \"detail\")\n\t\t\treturn this.renderTranscriptViewport(width, budget);\n\t\tconst framed = width >= 20 && budget >= 7;\n\t\tconst inner = Math.max(1, width - (framed ? 4 : 0));\n\t\tconst current = this.selected();\n\t\tconst detail = this.navigation.focus.kind === \"detail\";\n\t\tconst selectingAction = current && detail && !this.transcriptRequested && !this.confirmation;\n\t\tconst actions = selectingAction\n\t\t\t? taskDetailActions(current.execution, current.attention, this.stdinAvailable())\n\t\t\t: [];\n\t\tthis.actionIndex = Math.max(0, Math.min(this.actionIndex, actions.length - 1));\n\t\tconst action = actions[this.actionIndex];\n\t\tconst actionRow = action ? [theme.fg(\"accent\", `› ${taskDetailLabels[action]}`)] : [];\n\t\tconst rows = this.renderAll(inner);\n\t\tconst compactSummary = !framed && detail && current && budget >= 4 ? [taskDetailSummary(current)] : [];\n\t\tconst height = Math.max(0, budget - (framed ? 4 : 1) - actionRow.length - compactSummary.length);\n\t\tconst selected = detail ? -1 : rows.findIndex((row) => stripVTControlCharacters(row).startsWith(\"›\"));\n\t\tthis.scroll = Math.min(this.scroll, Math.max(0, rows.length - height));\n\t\tconst selectionRows = Math.min(height, current?.kind === \"agent\" ? 3 : 2);\n\t\tconst offset = detail ? this.scroll : Math.max(0, selected + selectionRows - height);\n\t\tconst view = rows.slice(offset, offset + height);\n\t\tconst inspect = keyHintIfBound(\"app.tasks.inspect\", detail ? \"select\" : \"view\");\n\t\tconst hints = this.confirmation\n\t\t\t? \"y confirm · n/Esc keep running\"\n\t\t\t: this.navigation.focus.kind === \"stdin\"\n\t\t\t\t? \"Enter send · Esc back\"\n\t\t\t\t: this.transcriptRequested\n\t\t\t\t\t? \"↑↓ scroll · PgUp/PgDn page · ←/Esc back\"\n\t\t\t\t\t: [\n\t\t\t\t\t\t\tdetail ? \"PgUp/PgDn scroll · ↑↓ actions\" : \"↑↓ select\",\n\t\t\t\t\t\t\tinspect,\n\t\t\t\t\t\t\tcurrent && current.execution.kind !== \"settled\"\n\t\t\t\t\t\t\t\t? keyHintIfBound(\"app.tasks.cancel\", \"stop\") || (!this.configuredTaskKey(\"x\") ? \"x stop\" : \"\")\n\t\t\t\t\t\t\t\t: \"\",\n\t\t\t\t\t\t\t\"Esc back\",\n\t\t\t\t\t\t]\n\t\t\t\t\t\t\t.filter(Boolean)\n\t\t\t\t\t\t\t.join(\" · \");\n\t\tconst footer = theme.fg(\"dim\", truncateToWidth(`/tasks · ${hints}`, width));\n\t\tif (!framed)\n\t\t\treturn [...compactSummary, ...view, ...actionRow, footer]\n\t\t\t\t.map((line) => truncateToWidth(line, width))\n\t\t\t\t.slice(-Math.max(1, budget));\n\t\tconst live = this.store.backgroundTasks.filter((task) => task.execution.kind !== \"settled\").length;\n\t\tconst title =\n\t\t\tdetail && current\n\t\t\t\t? `${taskDisplayText(taskLabel(current))} › ${taskDisplayText(current.title)}`\n\t\t\t\t: \"Background tasks\";\n\t\tconst heading = ` ${truncateToWidth(title, Math.max(1, width - 5))} `;\n\t\tconst border = (text: string) => theme.fg(\"borderMuted\", text);\n\t\tconst frameRow = (line: string) => {\n\t\t\tconst text = truncateToWidth(line, inner);\n\t\t\treturn border(\"│ \") + text + \" \".repeat(Math.max(0, inner - visibleWidth(text))) + border(\" │\");\n\t\t};\n\t\treturn [\n\t\t\tborder(\"╭─\") + theme.bold(heading) + border(`${\"─\".repeat(Math.max(0, width - visibleWidth(heading) - 3))}╮`),\n\t\t\tframeRow(\n\t\t\t\tdetail && current\n\t\t\t\t\t? taskDetailSummary(current)\n\t\t\t\t\t: theme.fg(\"muted\", `${live} active · ${this.store.backgroundTasks.length} total`),\n\t\t\t),\n\t\t\t...view.map(frameRow),\n\t\t\t...actionRow.map(frameRow),\n\t\t\tborder(`╰${\"─\".repeat(Math.max(0, width - 2))}╯`),\n\t\t\tfooter,\n\t\t].map((line) => truncateToWidth(line, width));\n\t}\n\tprivate renderAll(width: number): string[] {\n\t\tconst task = this.selected();\n\t\tif (this.confirmation)\n\t\t\treturn new Text(\n\t\t\t\t`Cancel ${task?.title}\\nTask ${task?.ref.taskId}\\ny: confirm · n/Escape: keep running`,\n\t\t\t\t0,\n\t\t\t\t0,\n\t\t\t).render(width);\n\t\tif (this.navigation.focus.kind === \"stdin\")\n\t\t\treturn [`Input to ${task?.title} · Escape: tasks`, ...this.input.render(width), this.status];\n\t\tif (this.transcript) return [...this.transcript.flatMap((component) => component.render(width)), this.status];\n\t\tif (this.transcriptRequested)\n\t\t\treturn [this.transcriptLoading ? \"Loading transcript…\" : this.status || \"Transcript unavailable\"];\n\t\tif (task && this.navigation.focus.kind === \"detail\") {\n\t\t\treturn [\n\t\t\t\t...new TaskDetail(task, {\n\t\t\t\t\t...this.detailContent,\n\t\t\t\t\tstdinAvailable: this.stdinAvailable(),\n\t\t\t\t\tactivity: this.store.recentActivity(task.ref.taskId),\n\t\t\t\t\tactivityOmitted: this.store.activityOmitted(task.ref.taskId),\n\t\t\t\t}).renderContent(width),\n\t\t\t\tthis.status,\n\t\t\t];\n\t\t}\n\t\tconst sections = this.orderedSections();\n\t\tif (!sections.length)\n\t\t\treturn new Text(\"No background tasks.\\nBackground agents and shells will appear here.\", 0, 0).render(width);\n\t\treturn sections.flatMap((section) => [\n\t\t\t\"\",\n\t\t\ttheme.fg(\"muted\", theme.bold(`${section.title} (${section.tasks.length})`)),\n\t\t\t...section.tasks.flatMap((item) => {\n\t\t\t\tconst selected = item.ref.taskId === this.navigation.selectedTaskId;\n\t\t\t\tconst { label: state, color, icon } = taskStatusAppearance(item);\n\t\t\t\tconst status = width < 32 ? ` ${icon}` : ` ${icon} ${state}`;\n\t\t\t\tconst name = taskDisplayText(item.title || taskLabel(item));\n\t\t\t\tconst marker = selected ? \"› \" : \" \";\n\t\t\t\tconst title = marker + truncateToWidth(name, Math.max(1, width - visibleWidth(status) - 3));\n\t\t\t\tconst row = `${selected ? theme.fg(\"accent\", theme.bold(title)) : title}${\" \".repeat(Math.max(1, width - visibleWidth(title) - visibleWidth(status)))}${theme.fg(color, status)}`;\n\t\t\t\tconst metadata = [\n\t\t\t\t\t...(width < 32 ? [state] : []),\n\t\t\t\t\ttaskLabel(item),\n\t\t\t\t\ttaskMetricsText(item),\n\t\t\t\t\titem.currentAction ? `${item.currentAction.tool} ${item.currentAction.text}` : \"\",\n\t\t\t\t]\n\t\t\t\t\t.filter(Boolean)\n\t\t\t\t\t.join(\" · \");\n\t\t\t\treturn [\n\t\t\t\t\ttruncateToWidth(row, width),\n\t\t\t\t\t...(item.kind === \"agent\" ? [theme.fg(\"dim\", truncateToWidth(` ${taskModelText(item)}`, width))] : []),\n\t\t\t\t\t...(selected ? [theme.fg(\"dim\", truncateToWidth(` ${taskDisplayText(metadata)}`, width))] : []),\n\t\t\t\t];\n\t\t\t}),\n\t\t]);\n\t}\n}\n"]}
@@ -3,6 +3,8 @@ import { theme } from "../theme/theme.js";
3
3
  import { TaskRow, taskLabel, taskTitle } from "./task-row.js";
4
4
  /** Complete projection; viewport owners, not this list, decide how much to mount. */
5
5
  export class TaskList {
6
+ tasks;
7
+ expanded;
6
8
  constructor(tasks, expanded = false) {
7
9
  this.tasks = tasks;
8
10
  this.expanded = expanded;
@@ -1 +1 @@
1
- {"version":3,"file":"task-list.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/task-list.ts"],"names":[],"mappings":"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","sourcesContent":["import { type Component, truncateToWidth } from \"@earendil-works/pi-tui\";\nimport type { TaskId, TaskRecord } from \"../../../core/tasks/contracts.js\";\nimport { theme } from \"../theme/theme.js\";\nimport { TaskRow, taskLabel, taskTitle } from \"./task-row.js\";\n\n/** Complete projection; viewport owners, not this list, decide how much to mount. */\nexport class TaskList implements Component {\n\tprivate readonly tasks: readonly TaskRecord[];\n\tprivate readonly expanded: boolean;\n\tconstructor(tasks: readonly TaskRecord[], expanded = false) {\n\t\tthis.tasks = tasks;\n\t\tthis.expanded = expanded;\n\t}\n\tinvalidate(): void {}\n\trender(width: number): string[] {\n\t\treturn this.tasks.flatMap((task) => {\n\t\t\tconst duplicate =\n\t\t\t\tthis.tasks.filter((item) => taskLabel(item) === taskLabel(task) && taskTitle(item) === taskTitle(task))\n\t\t\t\t\t.length > 1;\n\t\t\treturn new TaskRow(task, { expanded: this.expanded, duplicate, siblings: this.tasks }).render(width);\n\t\t});\n\t}\n}\nexport type TaskListSection = { title: string; tasks: TaskRecord[] };\n\nfunction statusRank(task: TaskRecord): number {\n\tconst execution = task.execution;\n\tif (execution.kind === \"running\") return task.attention.kind === \"none\" ? 1 : 0;\n\tif (execution.kind === \"cancelling\") return 2;\n\tif (execution.kind === \"queued\") return 3;\n\treturn { failed: 4, cancelled: 5, completed: 6 }[execution.result.kind];\n}\n\n/**\n * Sections list running work first, then stopping, queued, failed, cancelled and completed tasks.\n * Within a status, the latest launch comes first; settled tasks use the latest settlement when known,\n * and fall back to launch order when their settlement sequences tie.\n */\nexport function taskListSections(\n\ttasks: readonly TaskRecord[],\n\tsettlementOrder: ReadonlyMap<TaskId, bigint> = new Map(),\n): TaskListSection[] {\n\tconst launchOrder = new Map(tasks.map((task, index) => [task.ref.taskId, index]));\n\tconst newerFirst = (a: TaskRecord, b: TaskRecord) => {\n\t\tconst settledA = a.execution.kind === \"settled\" ? settlementOrder.get(a.ref.taskId) : undefined;\n\t\tconst settledB = b.execution.kind === \"settled\" ? settlementOrder.get(b.ref.taskId) : undefined;\n\t\tif (settledA !== undefined && settledB !== undefined && settledA !== settledB)\n\t\t\treturn settledB > settledA ? 1 : -1;\n\t\treturn (launchOrder.get(b.ref.taskId) ?? 0) - (launchOrder.get(a.ref.taskId) ?? 0);\n\t};\n\tconst ordered = [...tasks].sort((a, b) => statusRank(a) - statusRank(b) || newerFirst(a, b));\n\treturn ([\"agent\", \"command\"] as const).flatMap((kind) => {\n\t\tconst selected = ordered.filter((task) => task.kind === kind);\n\t\treturn selected.length ? [{ title: kind === \"agent\" ? \"Agents\" : \"Shells\", tasks: selected }] : [];\n\t});\n}\n/** Terminal results remain inspectable but no longer advertise active work. */\nexport function isActiveBackgroundTask(task: TaskRecord): boolean {\n\treturn task.observation.kind === \"background\" && task.execution.kind !== \"settled\";\n}\nexport function renderTaskFooter(tasks: readonly TaskRecord[], width: number): string[] {\n\tconst active = tasks.filter(isActiveBackgroundTask);\n\tconst background = active.filter((task) => task.execution.kind === \"running\" || task.execution.kind === \"queued\");\n\tconst attention = active.filter((task) => task.attention.kind !== \"none\");\n\tif (!active.length) return [];\n\tconst parts: string[] = [];\n\tif (attention.length) parts.push(`${attention.length} need attention`);\n\tconst agents = background.filter((task) => task.kind === \"agent\" && task.execution.kind === \"running\").length;\n\tconst shells = background.filter((task) => task.kind === \"command\" && task.execution.kind === \"running\").length;\n\tconst queued = background.filter((task) => task.execution.kind === \"queued\").length;\n\tif (agents && shells) parts.push(`${agents + shells} background tasks running`);\n\telse if (agents) parts.push(`${agents} ${agents === 1 ? \"local agent\" : \"local agents\"} running`);\n\telse if (shells) parts.push(`${shells} ${shells === 1 ? \"shell\" : \"shells\"} running`);\n\tif (queued) parts.push(`${queued} queued`);\n\tconst cancelling = active.filter((task) => task.execution.kind === \"cancelling\").length;\n\tif (cancelling) parts.push(`${cancelling} stopping`);\n\tif (!parts.length) parts.push(`${active.length} active`);\n\tconst route = \" · /tasks\";\n\treturn [\n\t\ttheme.fg(\n\t\t\tattention.length || cancelling ? \"warning\" : \"accent\",\n\t\t\ttruncateToWidth(\n\t\t\t\ttruncateToWidth(`Tasks ${parts.join(\" · \")}`, Math.max(1, width - route.length)) + route,\n\t\t\t\twidth,\n\t\t\t),\n\t\t),\n\t];\n}\n"]}
1
+ {"version":3,"file":"task-list.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/task-list.ts"],"names":[],"mappings":"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","sourcesContent":["import { type Component, truncateToWidth } from \"@earendil-works/pi-tui\";\nimport type { TaskId, TaskRecord } from \"../../../core/tasks/contracts.js\";\nimport { theme } from \"../theme/theme.js\";\nimport { TaskRow, taskLabel, taskTitle } from \"./task-row.js\";\n\n/** Complete projection; viewport owners, not this list, decide how much to mount. */\nexport class TaskList implements Component {\n\tprivate readonly tasks: readonly TaskRecord[];\n\tprivate readonly expanded: boolean;\n\tconstructor(tasks: readonly TaskRecord[], expanded = false) {\n\t\tthis.tasks = tasks;\n\t\tthis.expanded = expanded;\n\t}\n\tinvalidate(): void {}\n\trender(width: number): string[] {\n\t\treturn this.tasks.flatMap((task) => {\n\t\t\tconst duplicate =\n\t\t\t\tthis.tasks.filter((item) => taskLabel(item) === taskLabel(task) && taskTitle(item) === taskTitle(task))\n\t\t\t\t\t.length > 1;\n\t\t\treturn new TaskRow(task, { expanded: this.expanded, duplicate, siblings: this.tasks }).render(width);\n\t\t});\n\t}\n}\nexport type TaskListSection = { title: string; tasks: TaskRecord[] };\n\nfunction statusRank(task: TaskRecord): number {\n\tconst execution = task.execution;\n\tif (execution.kind === \"running\") return task.attention.kind === \"none\" ? 1 : 0;\n\tif (execution.kind === \"cancelling\") return 2;\n\tif (execution.kind === \"queued\") return 3;\n\treturn { failed: 4, cancelled: 5, completed: 6 }[execution.result.kind];\n}\n\n/**\n * Sections list running work first, then stopping, queued, failed, cancelled and completed tasks.\n * Within a status, the latest launch comes first; settled tasks use the latest settlement when known,\n * and fall back to launch order when their settlement sequences tie.\n */\nexport function taskListSections(\n\ttasks: readonly TaskRecord[],\n\tsettlementOrder: ReadonlyMap<TaskId, bigint> = new Map(),\n): TaskListSection[] {\n\tconst launchOrder = new Map(tasks.map((task, index) => [task.ref.taskId, index]));\n\tconst newerFirst = (a: TaskRecord, b: TaskRecord) => {\n\t\tconst settledA = a.execution.kind === \"settled\" ? settlementOrder.get(a.ref.taskId) : undefined;\n\t\tconst settledB = b.execution.kind === \"settled\" ? settlementOrder.get(b.ref.taskId) : undefined;\n\t\tif (settledA !== undefined && settledB !== undefined && settledA !== settledB)\n\t\t\treturn settledB > settledA ? 1 : -1;\n\t\treturn (launchOrder.get(b.ref.taskId) ?? 0) - (launchOrder.get(a.ref.taskId) ?? 0);\n\t};\n\tconst ordered = [...tasks].sort((a, b) => statusRank(a) - statusRank(b) || newerFirst(a, b));\n\treturn ([\"agent\", \"command\"] as const).flatMap((kind) => {\n\t\tconst selected = ordered.filter((task) => task.kind === kind);\n\t\treturn selected.length ? [{ title: kind === \"agent\" ? \"Agents\" : \"Shells\", tasks: selected }] : [];\n\t});\n}\n/** Terminal results remain inspectable but no longer advertise active work. */\nexport function isActiveBackgroundTask(task: TaskRecord): boolean {\n\treturn task.observation.kind === \"background\" && task.execution.kind !== \"settled\";\n}\nexport function renderTaskFooter(tasks: readonly TaskRecord[], width: number): string[] {\n\tconst active = tasks.filter(isActiveBackgroundTask);\n\tconst background = active.filter((task) => task.execution.kind === \"running\" || task.execution.kind === \"queued\");\n\tconst attention = active.filter((task) => task.attention.kind !== \"none\");\n\tif (!active.length) return [];\n\tconst parts: string[] = [];\n\tif (attention.length) parts.push(`${attention.length} need attention`);\n\tconst agents = background.filter((task) => task.kind === \"agent\" && task.execution.kind === \"running\").length;\n\tconst shells = background.filter((task) => task.kind === \"command\" && task.execution.kind === \"running\").length;\n\tconst queued = background.filter((task) => task.execution.kind === \"queued\").length;\n\tif (agents && shells) parts.push(`${agents + shells} background tasks running`);\n\telse if (agents) parts.push(`${agents} ${agents === 1 ? \"local agent\" : \"local agents\"} running`);\n\telse if (shells) parts.push(`${shells} ${shells === 1 ? \"shell\" : \"shells\"} running`);\n\tif (queued) parts.push(`${queued} queued`);\n\tconst cancelling = active.filter((task) => task.execution.kind === \"cancelling\").length;\n\tif (cancelling) parts.push(`${cancelling} stopping`);\n\tif (!parts.length) parts.push(`${active.length} active`);\n\tconst route = \" · /tasks\";\n\treturn [\n\t\ttheme.fg(\n\t\t\tattention.length || cancelling ? \"warning\" : \"accent\",\n\t\t\ttruncateToWidth(\n\t\t\t\ttruncateToWidth(`Tasks ${parts.join(\" · \")}`, Math.max(1, width - route.length)) + route,\n\t\t\t\twidth,\n\t\t\t),\n\t\t),\n\t];\n}\n"]}
@@ -1,10 +1,15 @@
1
1
  import { chatEntriesFromAgentMessages, LiveChatEntriesController, renderChatMessageEntry, } from "./chat-message-renderer.js";
2
2
  /** A viewer subscription, not a second task runner or a task-activity publisher. */
3
3
  export class TaskLiveTranscript {
4
+ entries;
5
+ live;
6
+ unsubscribe;
7
+ // LiveChatEntriesController replaces changed entries, including in-place message deltas.
8
+ // Weak keys release superseded generations without retaining a cache of the stream.
9
+ components = new WeakMap();
10
+ source;
11
+ requestRender;
4
12
  constructor(source, messages, requestRender) {
5
- // LiveChatEntriesController replaces changed entries, including in-place message deltas.
6
- // Weak keys release superseded generations without retaining a cache of the stream.
7
- this.components = new WeakMap();
8
13
  this.source = source;
9
14
  this.requestRender = requestRender;
10
15
  this.entries = chatEntriesFromAgentMessages(messages);
@@ -1 +1 @@
1
- {"version":3,"file":"task-live-transcript.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/task-live-transcript.ts"],"names":[],"mappings":"AAGA,OAAO,EAEN,4BAA4B,EAC5B,yBAAyB,EACzB,sBAAsB,GACtB,MAAM,4BAA4B,CAAC;AAEpC,oFAAoF;AACpF,MAAM,OAAO,kBAAkB;IAS9B,YAAY,MAA4B,EAAE,QAAwB,EAAE,aAAyB;QAL7F,yFAAyF;QACzF,oFAAoF;QAC5E,eAAU,GAAG,IAAI,OAAO,EAA+B,CAAC;QAI/D,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;QACnC,IAAI,CAAC,OAAO,GAAG,4BAA4B,CAAC,QAAQ,CAAC,CAAC;QACtD,IAAI,CAAC,IAAI,GAAG,IAAI,yBAAyB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACxD,IAAI,CAAC,IAAI,CAAC,gCAAgC,CAAC,MAAM,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAC;QAC3E,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,KAAK,EAAE,EAAE;YAC/C,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;YAC5B,IAAI,CAAC,aAAa,EAAE,CAAC;QACtB,CAAC,CAAC,CAAC;IACJ,CAAC;IACD,UAAU;QACT,IAAI,CAAC,UAAU,GAAG,IAAI,OAAO,EAAE,CAAC;IACjC,CAAC;IACD,MAAM,CAAC,KAAa;QACnB,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;YACrC,IAAI,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YAC3C,IAAI,CAAC,SAAS,EAAE,CAAC;gBAChB,SAAS,GAAG,sBAAsB,CAAC,KAAK,EAAE;oBACzC,EAAE,EAAE,EAAE,aAAa,EAAE,IAAI,CAAC,aAAa,EAAE;oBACzC,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;oBAClB,iBAAiB,EAAE,IAAI;oBACvB,kBAAkB,EAAE,IAAI;oBACxB,UAAU,EAAE,KAAK;iBACjB,CAAC,CAAC;gBACH,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;YACvC,CAAC;YACD,OAAO,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAChC,CAAC,CAAC,CAAC;IACJ,CAAC;IACD,OAAO;QACN,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;IACtB,CAAC;CACD","sourcesContent":["import type { AgentMessage } from \"@earendil-works/pi-agent-core\";\nimport type { Component } from \"@earendil-works/pi-tui\";\nimport type { TaskTranscriptSource } from \"../../../core/tasks/supervisor.js\";\nimport {\n\ttype ChatMessageEntry,\n\tchatEntriesFromAgentMessages,\n\tLiveChatEntriesController,\n\trenderChatMessageEntry,\n} from \"./chat-message-renderer.ts\";\n\n/** A viewer subscription, not a second task runner or a task-activity publisher. */\nexport class TaskLiveTranscript implements Component {\n\tprivate readonly entries: ChatMessageEntry[];\n\tprivate readonly live: LiveChatEntriesController;\n\tprivate readonly unsubscribe?: () => void;\n\t// LiveChatEntriesController replaces changed entries, including in-place message deltas.\n\t// Weak keys release superseded generations without retaining a cache of the stream.\n\tprivate components = new WeakMap<ChatMessageEntry, Component>();\n\treadonly source: TaskTranscriptSource;\n\tprivate readonly requestRender: () => void;\n\tconstructor(source: TaskTranscriptSource, messages: AgentMessage[], requestRender: () => void) {\n\t\tthis.source = source;\n\t\tthis.requestRender = requestRender;\n\t\tthis.entries = chatEntriesFromAgentMessages(messages);\n\t\tthis.live = new LiveChatEntriesController(this.entries);\n\t\tthis.live.hydrateStreamingAssistantMessage(source.getStreamingMessage?.());\n\t\tthis.unsubscribe = source.subscribe?.((event) => {\n\t\t\tthis.live.applyEvent(event);\n\t\t\tthis.requestRender();\n\t\t});\n\t}\n\tinvalidate(): void {\n\t\tthis.components = new WeakMap();\n\t}\n\trender(width: number): string[] {\n\t\treturn this.entries.flatMap((entry) => {\n\t\t\tlet component = this.components.get(entry);\n\t\t\tif (!component) {\n\t\t\t\tcomponent = renderChatMessageEntry(entry, {\n\t\t\t\t\tui: { requestRender: this.requestRender },\n\t\t\t\t\tcwd: process.cwd(),\n\t\t\t\t\thideThinkingBlock: true,\n\t\t\t\t\ttoolOutputExpanded: true,\n\t\t\t\t\tshowImages: false,\n\t\t\t\t});\n\t\t\t\tthis.components.set(entry, component);\n\t\t\t}\n\t\t\treturn component.render(width);\n\t\t});\n\t}\n\tdispose(): void {\n\t\tthis.unsubscribe?.();\n\t}\n}\n"]}
1
+ {"version":3,"file":"task-live-transcript.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/task-live-transcript.ts"],"names":[],"mappings":"AAGA,OAAO,EAEN,4BAA4B,EAC5B,yBAAyB,EACzB,sBAAsB,GACtB,MAAM,4BAA4B,CAAC;AAEpC,oFAAoF;AACpF,MAAM,OAAO,kBAAkB;IACb,OAAO,CAAqB;IAC5B,IAAI,CAA4B;IAChC,WAAW,CAAc;IAC1C,yFAAyF;IACzF,oFAAoF;IAC5E,UAAU,GAAG,IAAI,OAAO,EAA+B,CAAC;IACvD,MAAM,CAAuB;IACrB,aAAa,CAAa;IAC3C,YAAY,MAA4B,EAAE,QAAwB,EAAE,aAAyB;QAC5F,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;QACnC,IAAI,CAAC,OAAO,GAAG,4BAA4B,CAAC,QAAQ,CAAC,CAAC;QACtD,IAAI,CAAC,IAAI,GAAG,IAAI,yBAAyB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACxD,IAAI,CAAC,IAAI,CAAC,gCAAgC,CAAC,MAAM,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAC;QAC3E,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,KAAK,EAAE,EAAE;YAC/C,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;YAC5B,IAAI,CAAC,aAAa,EAAE,CAAC;QACtB,CAAC,CAAC,CAAC;IACJ,CAAC;IACD,UAAU;QACT,IAAI,CAAC,UAAU,GAAG,IAAI,OAAO,EAAE,CAAC;IACjC,CAAC;IACD,MAAM,CAAC,KAAa;QACnB,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;YACrC,IAAI,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YAC3C,IAAI,CAAC,SAAS,EAAE,CAAC;gBAChB,SAAS,GAAG,sBAAsB,CAAC,KAAK,EAAE;oBACzC,EAAE,EAAE,EAAE,aAAa,EAAE,IAAI,CAAC,aAAa,EAAE;oBACzC,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;oBAClB,iBAAiB,EAAE,IAAI;oBACvB,kBAAkB,EAAE,IAAI;oBACxB,UAAU,EAAE,KAAK;iBACjB,CAAC,CAAC;gBACH,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;YACvC,CAAC;YACD,OAAO,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAChC,CAAC,CAAC,CAAC;IACJ,CAAC;IACD,OAAO;QACN,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;IACtB,CAAC;CACD","sourcesContent":["import type { AgentMessage } from \"@earendil-works/pi-agent-core\";\nimport type { Component } from \"@earendil-works/pi-tui\";\nimport type { TaskTranscriptSource } from \"../../../core/tasks/supervisor.js\";\nimport {\n\ttype ChatMessageEntry,\n\tchatEntriesFromAgentMessages,\n\tLiveChatEntriesController,\n\trenderChatMessageEntry,\n} from \"./chat-message-renderer.ts\";\n\n/** A viewer subscription, not a second task runner or a task-activity publisher. */\nexport class TaskLiveTranscript implements Component {\n\tprivate readonly entries: ChatMessageEntry[];\n\tprivate readonly live: LiveChatEntriesController;\n\tprivate readonly unsubscribe?: () => void;\n\t// LiveChatEntriesController replaces changed entries, including in-place message deltas.\n\t// Weak keys release superseded generations without retaining a cache of the stream.\n\tprivate components = new WeakMap<ChatMessageEntry, Component>();\n\treadonly source: TaskTranscriptSource;\n\tprivate readonly requestRender: () => void;\n\tconstructor(source: TaskTranscriptSource, messages: AgentMessage[], requestRender: () => void) {\n\t\tthis.source = source;\n\t\tthis.requestRender = requestRender;\n\t\tthis.entries = chatEntriesFromAgentMessages(messages);\n\t\tthis.live = new LiveChatEntriesController(this.entries);\n\t\tthis.live.hydrateStreamingAssistantMessage(source.getStreamingMessage?.());\n\t\tthis.unsubscribe = source.subscribe?.((event) => {\n\t\t\tthis.live.applyEvent(event);\n\t\t\tthis.requestRender();\n\t\t});\n\t}\n\tinvalidate(): void {\n\t\tthis.components = new WeakMap();\n\t}\n\trender(width: number): string[] {\n\t\treturn this.entries.flatMap((entry) => {\n\t\t\tlet component = this.components.get(entry);\n\t\t\tif (!component) {\n\t\t\t\tcomponent = renderChatMessageEntry(entry, {\n\t\t\t\t\tui: { requestRender: this.requestRender },\n\t\t\t\t\tcwd: process.cwd(),\n\t\t\t\t\thideThinkingBlock: true,\n\t\t\t\t\ttoolOutputExpanded: true,\n\t\t\t\t\tshowImages: false,\n\t\t\t\t});\n\t\t\t\tthis.components.set(entry, component);\n\t\t\t}\n\t\t\treturn component.render(width);\n\t\t});\n\t}\n\tdispose(): void {\n\t\tthis.unsubscribe?.();\n\t}\n}\n"]}
@@ -1,9 +1,12 @@
1
1
  import { matchesKey } from "@earendil-works/pi-tui";
2
2
  /** Shared focus state; activity updates never take ownership of editor input. */
3
3
  export class TaskNavigation {
4
+ focus = { kind: "composer" };
5
+ selectedTaskId;
6
+ tasks = [];
7
+ keys;
8
+ actions;
4
9
  constructor(keys, actions) {
5
- this.focus = { kind: "composer" };
6
- this.tasks = [];
7
10
  this.keys = keys;
8
11
  this.actions = actions;
9
12
  }
@@ -1 +1 @@
1
- {"version":3,"file":"task-navigation.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/task-navigation.ts"],"names":[],"mappings":"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","sourcesContent":["import { matchesKey } from \"@earendil-works/pi-tui\";\nimport type { KeybindingsManager } from \"../../../core/keybindings.ts\";\nimport type { PromptRoute, TaskId, TaskRecord } from \"../../../core/tasks/contracts.js\";\nimport type { TaskDetailAction } from \"./task-detail.js\";\n\nexport type TaskFocus =\n\t| { kind: \"composer\" }\n\t| { kind: \"tasks\" }\n\t| { kind: \"detail\" }\n\t| { kind: \"stdin\"; taskId: TaskId };\nexport type TaskNavigationActions = {\n\tinspect(task: TaskRecord): void;\n\ttranscript(task: TaskRecord): void;\n\tforeground(task: TaskRecord): void;\n\tconfirmCancel(task: TaskRecord): Promise<boolean>;\n\tcancel(task: TaskRecord): void;\n\tinput(task: TaskRecord): void;\n\tstdinAvailable(task: TaskRecord): boolean;\n\topenQuestion(route: PromptRoute): void;\n};\n\n/** Shared focus state; activity updates never take ownership of editor input. */\nexport class TaskNavigation {\n\tfocus: TaskFocus = { kind: \"composer\" };\n\tselectedTaskId?: TaskId;\n\tprivate tasks: TaskRecord[] = [];\n\n\tprivate keys: KeybindingsManager;\n\tprivate actions: TaskNavigationActions;\n\tconstructor(keys: KeybindingsManager, actions: TaskNavigationActions) {\n\t\tthis.keys = keys;\n\t\tthis.actions = actions;\n\t}\n\n\tupdate(tasks: readonly TaskRecord[]): void {\n\t\tthis.tasks = [\n\t\t\t...tasks.filter((task) => task.kind === \"agent\"),\n\t\t\t...tasks.filter((task) => task.kind === \"command\"),\n\t\t];\n\t\tif (!this.tasks.some((task) => task.ref.taskId === this.selectedTaskId))\n\t\t\tthis.selectedTaskId = this.tasks[0]?.ref.taskId;\n\t}\n\n\topen(taskId?: TaskId): void {\n\t\tif (taskId !== undefined && this.tasks.some((task) => task.ref.taskId === taskId)) this.selectedTaskId = taskId;\n\t\tthis.focus = { kind: \"tasks\" };\n\t}\n\n\tasync activate(action: TaskDetailAction): Promise<void> {\n\t\tconst task = this.tasks.find((task) => task.ref.taskId === this.selectedTaskId);\n\t\tif (!task) return;\n\t\tif (action === \"transcript\") return this.actions.transcript(task);\n\t\tif (task.execution.kind === \"settled\") return;\n\t\tif (action === \"foreground\") this.actions.foreground(task);\n\t\tif (action === \"question\" && task.attention.kind === \"input-needed\")\n\t\t\tthis.actions.openQuestion(task.attention.route);\n\t\tif (action === \"cancel\" && (await this.actions.confirmCancel(task))) {\n\t\t\tconst current = this.tasks.find((candidate) => candidate.ref.taskId === task.ref.taskId);\n\t\t\tif (current && current.execution.kind !== \"settled\") this.actions.cancel(current);\n\t\t}\n\t\tif (action === \"input\" && this.actions.stdinAvailable(task)) {\n\t\t\tthis.focus = { kind: \"stdin\", taskId: task.ref.taskId };\n\t\t\tthis.actions.input(task);\n\t\t}\n\t}\n\n\tmoveSelection(delta: number): void {\n\t\tconst index = this.tasks.findIndex((task) => task.ref.taskId === this.selectedTaskId);\n\t\tthis.selectedTaskId = this.tasks[Math.max(0, Math.min(this.tasks.length - 1, index + delta))]?.ref.taskId;\n\t}\n\n\thandleInput(data: string, inputOwner: \"composer\" | \"hil\" | \"tasks\"): boolean {\n\t\tif (inputOwner !== \"tasks\" || this.focus.kind === \"composer\") return false;\n\t\tif (matchesKey(data, \"escape\")) {\n\t\t\tthis.focus =\n\t\t\t\tthis.focus.kind === \"stdin\" || this.focus.kind === \"detail\" ? { kind: \"tasks\" } : { kind: \"composer\" };\n\t\t\treturn true;\n\t\t}\n\t\tif (this.focus.kind === \"stdin\") return false;\n\t\tif (this.keys.matches(data, \"app.tasks.inspect\")) {\n\t\t\tconst task = this.tasks.find((task) => task.ref.taskId === this.selectedTaskId);\n\t\t\tif (task) {\n\t\t\t\tthis.focus = { kind: \"detail\" };\n\t\t\t\tthis.actions.inspect(task);\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\t\tfor (const action of [\"foreground\", \"cancel\", \"input\"] as const) {\n\t\t\tif (this.keys.matches(data, `app.tasks.${action}`)) {\n\t\t\t\tvoid this.activate(action);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\tconst index = this.tasks.findIndex((task) => task.ref.taskId === this.selectedTaskId);\n\t\tlet next = index;\n\t\tif (matchesKey(data, \"up\")) next--;\n\t\telse if (matchesKey(data, \"down\")) next++;\n\t\telse if (matchesKey(data, \"home\")) next = 0;\n\t\telse if (matchesKey(data, \"end\")) next = this.tasks.length - 1;\n\t\telse if (matchesKey(data, \"pageUp\")) next -= 10;\n\t\telse if (matchesKey(data, \"pageDown\")) next += 10;\n\t\telse return false;\n\t\tthis.selectedTaskId = this.tasks[Math.max(0, Math.min(this.tasks.length - 1, next))]?.ref.taskId;\n\t\treturn true;\n\t}\n}\n"]}
1
+ {"version":3,"file":"task-navigation.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/task-navigation.ts"],"names":[],"mappings":"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","sourcesContent":["import { matchesKey } from \"@earendil-works/pi-tui\";\nimport type { KeybindingsManager } from \"../../../core/keybindings.ts\";\nimport type { PromptRoute, TaskId, TaskRecord } from \"../../../core/tasks/contracts.js\";\nimport type { TaskDetailAction } from \"./task-detail.js\";\n\nexport type TaskFocus =\n\t| { kind: \"composer\" }\n\t| { kind: \"tasks\" }\n\t| { kind: \"detail\" }\n\t| { kind: \"stdin\"; taskId: TaskId };\nexport type TaskNavigationActions = {\n\tinspect(task: TaskRecord): void;\n\ttranscript(task: TaskRecord): void;\n\tforeground(task: TaskRecord): void;\n\tconfirmCancel(task: TaskRecord): Promise<boolean>;\n\tcancel(task: TaskRecord): void;\n\tinput(task: TaskRecord): void;\n\tstdinAvailable(task: TaskRecord): boolean;\n\topenQuestion(route: PromptRoute): void;\n};\n\n/** Shared focus state; activity updates never take ownership of editor input. */\nexport class TaskNavigation {\n\tfocus: TaskFocus = { kind: \"composer\" };\n\tselectedTaskId?: TaskId;\n\tprivate tasks: TaskRecord[] = [];\n\n\tprivate keys: KeybindingsManager;\n\tprivate actions: TaskNavigationActions;\n\tconstructor(keys: KeybindingsManager, actions: TaskNavigationActions) {\n\t\tthis.keys = keys;\n\t\tthis.actions = actions;\n\t}\n\n\tupdate(tasks: readonly TaskRecord[]): void {\n\t\tthis.tasks = [\n\t\t\t...tasks.filter((task) => task.kind === \"agent\"),\n\t\t\t...tasks.filter((task) => task.kind === \"command\"),\n\t\t];\n\t\tif (!this.tasks.some((task) => task.ref.taskId === this.selectedTaskId))\n\t\t\tthis.selectedTaskId = this.tasks[0]?.ref.taskId;\n\t}\n\n\topen(taskId?: TaskId): void {\n\t\tif (taskId !== undefined && this.tasks.some((task) => task.ref.taskId === taskId)) this.selectedTaskId = taskId;\n\t\tthis.focus = { kind: \"tasks\" };\n\t}\n\n\tasync activate(action: TaskDetailAction): Promise<void> {\n\t\tconst task = this.tasks.find((task) => task.ref.taskId === this.selectedTaskId);\n\t\tif (!task) return;\n\t\tif (action === \"transcript\") return this.actions.transcript(task);\n\t\tif (task.execution.kind === \"settled\") return;\n\t\tif (action === \"foreground\") this.actions.foreground(task);\n\t\tif (action === \"question\" && task.attention.kind === \"input-needed\")\n\t\t\tthis.actions.openQuestion(task.attention.route);\n\t\tif (action === \"cancel\" && (await this.actions.confirmCancel(task))) {\n\t\t\tconst current = this.tasks.find((candidate) => candidate.ref.taskId === task.ref.taskId);\n\t\t\tif (current && current.execution.kind !== \"settled\") this.actions.cancel(current);\n\t\t}\n\t\tif (action === \"input\" && this.actions.stdinAvailable(task)) {\n\t\t\tthis.focus = { kind: \"stdin\", taskId: task.ref.taskId };\n\t\t\tthis.actions.input(task);\n\t\t}\n\t}\n\n\tmoveSelection(delta: number): void {\n\t\tconst index = this.tasks.findIndex((task) => task.ref.taskId === this.selectedTaskId);\n\t\tthis.selectedTaskId = this.tasks[Math.max(0, Math.min(this.tasks.length - 1, index + delta))]?.ref.taskId;\n\t}\n\n\thandleInput(data: string, inputOwner: \"composer\" | \"hil\" | \"tasks\"): boolean {\n\t\tif (inputOwner !== \"tasks\" || this.focus.kind === \"composer\") return false;\n\t\tif (matchesKey(data, \"escape\")) {\n\t\t\tthis.focus =\n\t\t\t\tthis.focus.kind === \"stdin\" || this.focus.kind === \"detail\" ? { kind: \"tasks\" } : { kind: \"composer\" };\n\t\t\treturn true;\n\t\t}\n\t\tif (this.focus.kind === \"stdin\") return false;\n\t\tif (this.keys.matches(data, \"app.tasks.inspect\")) {\n\t\t\tconst task = this.tasks.find((task) => task.ref.taskId === this.selectedTaskId);\n\t\t\tif (task) {\n\t\t\t\tthis.focus = { kind: \"detail\" };\n\t\t\t\tthis.actions.inspect(task);\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\t\tfor (const action of [\"foreground\", \"cancel\", \"input\"] as const) {\n\t\t\tif (this.keys.matches(data, `app.tasks.${action}`)) {\n\t\t\t\tvoid this.activate(action);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\tconst index = this.tasks.findIndex((task) => task.ref.taskId === this.selectedTaskId);\n\t\tlet next = index;\n\t\tif (matchesKey(data, \"up\")) next--;\n\t\telse if (matchesKey(data, \"down\")) next++;\n\t\telse if (matchesKey(data, \"home\")) next = 0;\n\t\telse if (matchesKey(data, \"end\")) next = this.tasks.length - 1;\n\t\telse if (matchesKey(data, \"pageUp\")) next -= 10;\n\t\telse if (matchesKey(data, \"pageDown\")) next += 10;\n\t\telse return false;\n\t\tthis.selectedTaskId = this.tasks[Math.max(0, Math.min(this.tasks.length - 1, next))]?.ref.taskId;\n\t\treturn true;\n\t}\n}\n"]}
@@ -71,6 +71,8 @@ export function taskMetricsText(task) {
71
71
  .join(" · ");
72
72
  }
73
73
  export class TaskRow {
74
+ task;
75
+ options;
74
76
  constructor(task, options = {}) {
75
77
  this.task = task;
76
78
  this.options = options;
@@ -1 +1 @@
1
- {"version":3,"file":"task-row.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/task-row.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash } from \"node:crypto\";\nimport { type Component, truncateToWidth } from \"@earendil-works/pi-tui\";\nimport { taskOutcomeStatus } from \"../../../core/tasks/command-output.js\";\nimport type { TaskRecord } from \"../../../core/tasks/contracts.js\";\nimport type { TaskActivity } from \"../../../core/tasks/owner-store.js\";\nimport { theme } from \"../theme/theme.js\";\nimport { keyHintIfBound as keyHint } from \"./keybinding-hints.js\";\n\n/** Control removal and truncation apply only to terminal display, never task identity. */\nexport function taskDisplayText(text: string): string {\n\treturn text.replace(/\\x1b\\[[0-?]*[ -/]*[@-~]/g, \"\").replace(/[\\x00-\\x1f\\x7f-\\x9f]/g, \" \");\n}\nexport function taskState(task: TaskRecord): string {\n\tif (\n\t\ttask.kind === \"agent\" &&\n\t\ttask.execution.kind === \"settled\" &&\n\t\ttask.execution.result.kind === \"cancelled\" &&\n\t\ttask.execution.result.cause === \"user\"\n\t)\n\t\treturn \"killed\";\n\tif (task.execution.kind === \"settled\") return taskOutcomeStatus(task.execution.result, task.kind);\n\tif (task.execution.kind === \"cancelling\") return \"cancelling\";\n\tif (task.attention.kind === \"input-needed\") return \"input-needed\";\n\treturn task.execution.kind;\n}\nexport function taskLabel(task: TaskRecord): string {\n\treturn task.kind === \"command\" ? \"bash\" : (task.agentName ?? \"agent\");\n}\nexport function taskTitle(task: TaskRecord): string {\n\treturn task.title || taskLabel(task);\n}\nexport function taskModelText(task: Pick<TaskRecord, \"kind\" | \"model\" | \"thinking\">): string {\n\tif (task.kind !== \"agent\") return \"\";\n\treturn taskDisplayText(\n\t\t[task.model ?? \"model unavailable\", task.thinking ? `thinking ${task.thinking}` : \"thinking unavailable\"].join(\n\t\t\t\" · \",\n\t\t),\n\t);\n}\nexport function taskShortId(task: TaskRecord): string {\n\treturn createHash(\"sha256\").update(task.ref.taskId).digest(\"hex\").slice(0, 6);\n}\nexport function taskDuration(milliseconds: number): string {\n\tconst seconds = Math.max(0, Math.floor(milliseconds / 1000));\n\treturn seconds < 60 ? `${seconds}s` : `${Math.floor(seconds / 60)}m ${seconds % 60}s`;\n}\n\n/** One semantic status palette for inline rows, lists and detail headers. */\nexport function taskStatusAppearance(task: TaskRecord): {\n\tlabel: string;\n\ticon: string;\n\tcolor: \"accent\" | \"success\" | \"error\" | \"warning\" | \"muted\";\n} {\n\tswitch (taskState(task)) {\n\t\tcase \"completed\":\n\t\t\treturn { label: \"Completed\", icon: \"✓\", color: \"success\" };\n\t\tcase \"failed\":\n\t\t\treturn { label: \"Failed\", icon: \"✗\", color: \"error\" };\n\t\tcase \"killed\":\n\t\t\treturn { label: \"Killed (non-resumable)\", icon: \"■\", color: \"warning\" };\n\t\tcase \"cancelled\":\n\t\t\treturn { label: \"Stopped\", icon: \"✗\", color: \"warning\" };\n\t\tcase \"cancelling\":\n\t\t\treturn { label: \"Stopping\", icon: \"!\", color: \"warning\" };\n\t\tcase \"input-needed\":\n\t\t\treturn { label: \"Input needed\", icon: \"?\", color: \"warning\" };\n\t\tcase \"queued\":\n\t\t\treturn { label: \"Queued\", icon: \"○\", color: \"muted\" };\n\t\tdefault:\n\t\t\treturn { label: \"Running\", icon: \"∀\", color: \"accent\" };\n\t}\n}\n\nexport function taskMetricsText(task: TaskRecord): string {\n\tconst metrics = task.metrics;\n\treturn [\n\t\tmetrics?.elapsedMs === undefined ? \"\" : taskDuration(metrics.elapsedMs),\n\t\tmetrics?.tokenCount === undefined ? \"\" : `${metrics.tokenCount.toLocaleString(\"en-US\")} tokens`,\n\t\tmetrics?.toolCount === undefined ? \"\" : `${metrics.toolCount} ${metrics.toolCount === 1 ? \"tool\" : \"tools\"}`,\n\t]\n\t\t.filter(Boolean)\n\t\t.join(\" · \");\n}\nexport type TaskRowOptions = {\n\texpanded?: boolean;\n\tduplicate?: boolean;\n\thint?: boolean;\n\tsiblings?: readonly TaskRecord[];\n\tactivity?: readonly TaskActivity[];\n\tactivityOmitted?: boolean;\n};\nexport class TaskRow implements Component {\n\tprivate readonly task: TaskRecord;\n\tprivate readonly options: TaskRowOptions;\n\tconstructor(task: TaskRecord, options: TaskRowOptions = {}) {\n\t\tthis.task = task;\n\t\tthis.options = options;\n\t}\n\tinvalidate(): void {}\n\trender(width: number): string[] {\n\t\tconst task = this.task;\n\t\tconst group = task.launchGroupId\n\t\t\t? this.options.siblings?.filter((item) => item.launchGroupId === task.launchGroupId)\n\t\t\t: undefined;\n\t\tconst index = group?.findIndex((item) => item.ref.taskId === task.ref.taskId) ?? -1;\n\t\tconst grouped = group !== undefined && index >= 0;\n\t\tconst rowWidth = Math.max(1, width - (grouped ? 2 : 0));\n\t\tconst state = taskState(task) === \"killed\" ? \"killed (non-resumable)\" : taskState(task);\n\t\tconst live = task.execution.kind === \"running\" || task.execution.kind === \"queued\";\n\t\tconst badge = live && task.observation.kind !== \"none\" ? ` · ${task.observation.kind}` : \"\";\n\t\tconst { icon: glyph, color } = taskStatusAppearance(task);\n\t\tconst displayLabel = (item: TaskRecord) =>\n\t\t\ttruncateToWidth(\n\t\t\t\t`${taskDisplayText(taskLabel(item))}: ${taskDisplayText(taskTitle(item))}`,\n\t\t\t\tMath.max(1, rowWidth - 2),\n\t\t\t);\n\t\tconst duplicate =\n\t\t\tthis.options.duplicate ||\n\t\t\tthis.options.siblings?.some(\n\t\t\t\t(item) => item.ref.taskId !== task.ref.taskId && displayLabel(item) === displayLabel(task),\n\t\t\t);\n\t\tconst suffix = duplicate ? ` [${taskShortId(task)}]` : \"\";\n\t\tconst title =\n\t\t\ttheme.fg(color, glyph) +\n\t\t\t\" \" +\n\t\t\ttheme.bold(taskDisplayText(taskLabel(task))) +\n\t\t\ttheme.fg(\"muted\", `: ${taskDisplayText(taskTitle(task))}`);\n\t\tconst lines = [truncateToWidth(title, Math.max(1, rowWidth - suffix.length)) + theme.fg(\"dim\", suffix)];\n\t\tif (task.kind === \"agent\") lines.push(theme.fg(\"dim\", truncateToWidth(` ${taskModelText(task)}`, rowWidth)));\n\t\tconst action =\n\t\t\tlive && task.currentAction\n\t\t\t\t? ` · ${taskDisplayText(task.currentAction.tool)} ${taskDisplayText(task.currentAction.text)}`\n\t\t\t\t: \"\";\n\t\tconst tools = task.metrics?.toolCount === undefined ? \"\" : ` · ${task.metrics.toolCount} tool uses`;\n\t\tconst duration = task.metrics?.elapsedMs === undefined ? \"\" : ` · ${taskDuration(task.metrics.elapsedMs)}`;\n\t\tlines.push(theme.fg(\"dim\", truncateToWidth(` ${state}${badge}${tools}${duration}${action}`, width)));\n\t\tif (this.options.expanded) {\n\t\t\tlines.push(theme.fg(\"dim\", truncateToWidth(` ${task.ref.taskId} · owner ${task.ref.ownerId}`, width)));\n\t\t\tif (task.metrics?.tokenCount !== undefined) lines.push(theme.fg(\"dim\", ` ${task.metrics.tokenCount} tokens`));\n\t\t\tlines.push(\" Activity\");\n\t\t\tif (this.options.activityOmitted) lines.push(theme.fg(\"dim\", \" Earlier activity omitted\"));\n\t\t\tconst retained = retainedActivityLines(this.options.activity ?? []);\n\t\t\tif (retained.length) lines.push(...retained.map((text) => theme.fg(\"dim\", ` ${taskDisplayText(text)}`)));\n\t\t\telse\n\t\t\t\tlines.push(\n\t\t\t\t\ttheme.fg(\n\t\t\t\t\t\t\"dim\",\n\t\t\t\t\t\ttask.currentAction\n\t\t\t\t\t\t\t? ` ${taskDisplayText(task.currentAction.tool)} ${taskDisplayText(task.currentAction.text)}`\n\t\t\t\t\t\t\t: \" No retained activity\",\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\tlines.push(theme.fg(\"dim\", \" /tasks to inspect transcript and task details\"));\n\t\t\tif (task.execution.kind === \"settled\" && task.execution.result.kind === \"failed\")\n\t\t\t\tlines.push(truncateToWidth(` ${taskDisplayText(task.execution.result.message)}`, width));\n\t\t}\n\t\tconst rendered = lines.map(\n\t\t\t(line, row) =>\n\t\t\t\t(grouped ? theme.fg(\"dim\", row === 0 ? (index === group.length - 1 ? \"└─\" : \"├─\") : \" \") : \"\") +\n\t\t\t\ttruncateToWidth(line, rowWidth),\n\t\t);\n\t\tif (grouped && index === 0) {\n\t\t\tconst labels = new Set(group.map(taskLabel));\n\t\t\tconst counts = new Map<string, number>();\n\t\t\tfor (const sibling of group) {\n\t\t\t\tconst state = taskState(sibling);\n\t\t\t\tcounts.set(state, (counts.get(state) ?? 0) + 1);\n\t\t\t}\n\t\t\trendered.unshift(\n\t\t\t\ttheme.bold(\n\t\t\t\t\ttruncateToWidth(\n\t\t\t\t\t\t`${labels.size === 1 ? taskDisplayText(taskLabel(task)) : \"Tasks\"} · ${[...counts].map(([state, count]) => `${count} ${state}`).join(\" · \")}`,\n\t\t\t\t\t\twidth,\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\t\tif (this.options.hint !== false && (!grouped || index === group.length - 1)) {\n\t\t\tconst hint = keyHint(\"app.tools.expand\", this.options.expanded ? \"collapse\" : \"expand\");\n\t\t\tif (hint) rendered.push(theme.fg(\"dim\", hint));\n\t\t}\n\t\treturn rendered.map((line) => truncateToWidth(line, width));\n\t}\n}\n\nfunction retainedActivityLines(activity: readonly TaskActivity[]): string[] {\n\tconst lines: string[] = [];\n\tconst decoder = new TextDecoder();\n\tfor (const { report } of activity) {\n\t\tconst change = report.change;\n\t\tif (change.kind === \"action\") lines.push(`${change.tool} ${change.text}`);\n\t\telse if (change.kind === \"output\") {\n\t\t\tconst text = decoder.decode(Buffer.from(change.bytesBase64, \"base64\"), { stream: true });\n\t\t\tif (text) lines.push(`Retained output: ${text}`);\n\t\t} else if (change.kind === \"attention-set\" && change.attention.kind === \"input-needed\")\n\t\t\tlines.push(`Input needed: ${change.attention.prompt}`);\n\t}\n\tconst tail = decoder.decode();\n\tif (tail) lines.push(`Retained output: ${tail}`);\n\treturn lines;\n}\n"]}
1
+ {"version":3,"file":"task-row.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/task-row.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash } from \"node:crypto\";\nimport { type Component, truncateToWidth } from \"@earendil-works/pi-tui\";\nimport { taskOutcomeStatus } from \"../../../core/tasks/command-output.js\";\nimport type { TaskRecord } from \"../../../core/tasks/contracts.js\";\nimport type { TaskActivity } from \"../../../core/tasks/owner-store.js\";\nimport { theme } from \"../theme/theme.js\";\nimport { keyHintIfBound as keyHint } from \"./keybinding-hints.js\";\n\n/** Control removal and truncation apply only to terminal display, never task identity. */\nexport function taskDisplayText(text: string): string {\n\treturn text.replace(/\\x1b\\[[0-?]*[ -/]*[@-~]/g, \"\").replace(/[\\x00-\\x1f\\x7f-\\x9f]/g, \" \");\n}\nexport function taskState(task: TaskRecord): string {\n\tif (\n\t\ttask.kind === \"agent\" &&\n\t\ttask.execution.kind === \"settled\" &&\n\t\ttask.execution.result.kind === \"cancelled\" &&\n\t\ttask.execution.result.cause === \"user\"\n\t)\n\t\treturn \"killed\";\n\tif (task.execution.kind === \"settled\") return taskOutcomeStatus(task.execution.result, task.kind);\n\tif (task.execution.kind === \"cancelling\") return \"cancelling\";\n\tif (task.attention.kind === \"input-needed\") return \"input-needed\";\n\treturn task.execution.kind;\n}\nexport function taskLabel(task: TaskRecord): string {\n\treturn task.kind === \"command\" ? \"bash\" : (task.agentName ?? \"agent\");\n}\nexport function taskTitle(task: TaskRecord): string {\n\treturn task.title || taskLabel(task);\n}\nexport function taskModelText(task: Pick<TaskRecord, \"kind\" | \"model\" | \"thinking\">): string {\n\tif (task.kind !== \"agent\") return \"\";\n\treturn taskDisplayText(\n\t\t[task.model ?? \"model unavailable\", task.thinking ? `thinking ${task.thinking}` : \"thinking unavailable\"].join(\n\t\t\t\" · \",\n\t\t),\n\t);\n}\nexport function taskShortId(task: TaskRecord): string {\n\treturn createHash(\"sha256\").update(task.ref.taskId).digest(\"hex\").slice(0, 6);\n}\nexport function taskDuration(milliseconds: number): string {\n\tconst seconds = Math.max(0, Math.floor(milliseconds / 1000));\n\treturn seconds < 60 ? `${seconds}s` : `${Math.floor(seconds / 60)}m ${seconds % 60}s`;\n}\n\n/** One semantic status palette for inline rows, lists and detail headers. */\nexport function taskStatusAppearance(task: TaskRecord): {\n\tlabel: string;\n\ticon: string;\n\tcolor: \"accent\" | \"success\" | \"error\" | \"warning\" | \"muted\";\n} {\n\tswitch (taskState(task)) {\n\t\tcase \"completed\":\n\t\t\treturn { label: \"Completed\", icon: \"✓\", color: \"success\" };\n\t\tcase \"failed\":\n\t\t\treturn { label: \"Failed\", icon: \"✗\", color: \"error\" };\n\t\tcase \"killed\":\n\t\t\treturn { label: \"Killed (non-resumable)\", icon: \"■\", color: \"warning\" };\n\t\tcase \"cancelled\":\n\t\t\treturn { label: \"Stopped\", icon: \"✗\", color: \"warning\" };\n\t\tcase \"cancelling\":\n\t\t\treturn { label: \"Stopping\", icon: \"!\", color: \"warning\" };\n\t\tcase \"input-needed\":\n\t\t\treturn { label: \"Input needed\", icon: \"?\", color: \"warning\" };\n\t\tcase \"queued\":\n\t\t\treturn { label: \"Queued\", icon: \"○\", color: \"muted\" };\n\t\tdefault:\n\t\t\treturn { label: \"Running\", icon: \"∀\", color: \"accent\" };\n\t}\n}\n\nexport function taskMetricsText(task: TaskRecord): string {\n\tconst metrics = task.metrics;\n\treturn [\n\t\tmetrics?.elapsedMs === undefined ? \"\" : taskDuration(metrics.elapsedMs),\n\t\tmetrics?.tokenCount === undefined ? \"\" : `${metrics.tokenCount.toLocaleString(\"en-US\")} tokens`,\n\t\tmetrics?.toolCount === undefined ? \"\" : `${metrics.toolCount} ${metrics.toolCount === 1 ? \"tool\" : \"tools\"}`,\n\t]\n\t\t.filter(Boolean)\n\t\t.join(\" · \");\n}\nexport type TaskRowOptions = {\n\texpanded?: boolean;\n\tduplicate?: boolean;\n\thint?: boolean;\n\tsiblings?: readonly TaskRecord[];\n\tactivity?: readonly TaskActivity[];\n\tactivityOmitted?: boolean;\n};\nexport class TaskRow implements Component {\n\tprivate readonly task: TaskRecord;\n\tprivate readonly options: TaskRowOptions;\n\tconstructor(task: TaskRecord, options: TaskRowOptions = {}) {\n\t\tthis.task = task;\n\t\tthis.options = options;\n\t}\n\tinvalidate(): void {}\n\trender(width: number): string[] {\n\t\tconst task = this.task;\n\t\tconst group = task.launchGroupId\n\t\t\t? this.options.siblings?.filter((item) => item.launchGroupId === task.launchGroupId)\n\t\t\t: undefined;\n\t\tconst index = group?.findIndex((item) => item.ref.taskId === task.ref.taskId) ?? -1;\n\t\tconst grouped = group !== undefined && index >= 0;\n\t\tconst rowWidth = Math.max(1, width - (grouped ? 2 : 0));\n\t\tconst state = taskState(task) === \"killed\" ? \"killed (non-resumable)\" : taskState(task);\n\t\tconst live = task.execution.kind === \"running\" || task.execution.kind === \"queued\";\n\t\tconst badge = live && task.observation.kind !== \"none\" ? ` · ${task.observation.kind}` : \"\";\n\t\tconst { icon: glyph, color } = taskStatusAppearance(task);\n\t\tconst displayLabel = (item: TaskRecord) =>\n\t\t\ttruncateToWidth(\n\t\t\t\t`${taskDisplayText(taskLabel(item))}: ${taskDisplayText(taskTitle(item))}`,\n\t\t\t\tMath.max(1, rowWidth - 2),\n\t\t\t);\n\t\tconst duplicate =\n\t\t\tthis.options.duplicate ||\n\t\t\tthis.options.siblings?.some(\n\t\t\t\t(item) => item.ref.taskId !== task.ref.taskId && displayLabel(item) === displayLabel(task),\n\t\t\t);\n\t\tconst suffix = duplicate ? ` [${taskShortId(task)}]` : \"\";\n\t\tconst title =\n\t\t\ttheme.fg(color, glyph) +\n\t\t\t\" \" +\n\t\t\ttheme.bold(taskDisplayText(taskLabel(task))) +\n\t\t\ttheme.fg(\"muted\", `: ${taskDisplayText(taskTitle(task))}`);\n\t\tconst lines = [truncateToWidth(title, Math.max(1, rowWidth - suffix.length)) + theme.fg(\"dim\", suffix)];\n\t\tif (task.kind === \"agent\") lines.push(theme.fg(\"dim\", truncateToWidth(` ${taskModelText(task)}`, rowWidth)));\n\t\tconst action =\n\t\t\tlive && task.currentAction\n\t\t\t\t? ` · ${taskDisplayText(task.currentAction.tool)} ${taskDisplayText(task.currentAction.text)}`\n\t\t\t\t: \"\";\n\t\tconst tools = task.metrics?.toolCount === undefined ? \"\" : ` · ${task.metrics.toolCount} tool uses`;\n\t\tconst duration = task.metrics?.elapsedMs === undefined ? \"\" : ` · ${taskDuration(task.metrics.elapsedMs)}`;\n\t\tlines.push(theme.fg(\"dim\", truncateToWidth(` ${state}${badge}${tools}${duration}${action}`, width)));\n\t\tif (this.options.expanded) {\n\t\t\tlines.push(theme.fg(\"dim\", truncateToWidth(` ${task.ref.taskId} · owner ${task.ref.ownerId}`, width)));\n\t\t\tif (task.metrics?.tokenCount !== undefined) lines.push(theme.fg(\"dim\", ` ${task.metrics.tokenCount} tokens`));\n\t\t\tlines.push(\" Activity\");\n\t\t\tif (this.options.activityOmitted) lines.push(theme.fg(\"dim\", \" Earlier activity omitted\"));\n\t\t\tconst retained = retainedActivityLines(this.options.activity ?? []);\n\t\t\tif (retained.length) lines.push(...retained.map((text) => theme.fg(\"dim\", ` ${taskDisplayText(text)}`)));\n\t\t\telse\n\t\t\t\tlines.push(\n\t\t\t\t\ttheme.fg(\n\t\t\t\t\t\t\"dim\",\n\t\t\t\t\t\ttask.currentAction\n\t\t\t\t\t\t\t? ` ${taskDisplayText(task.currentAction.tool)} ${taskDisplayText(task.currentAction.text)}`\n\t\t\t\t\t\t\t: \" No retained activity\",\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\tlines.push(theme.fg(\"dim\", \" /tasks to inspect transcript and task details\"));\n\t\t\tif (task.execution.kind === \"settled\" && task.execution.result.kind === \"failed\")\n\t\t\t\tlines.push(truncateToWidth(` ${taskDisplayText(task.execution.result.message)}`, width));\n\t\t}\n\t\tconst rendered = lines.map(\n\t\t\t(line, row) =>\n\t\t\t\t(grouped ? theme.fg(\"dim\", row === 0 ? (index === group.length - 1 ? \"└─\" : \"├─\") : \" \") : \"\") +\n\t\t\t\ttruncateToWidth(line, rowWidth),\n\t\t);\n\t\tif (grouped && index === 0) {\n\t\t\tconst labels = new Set(group.map(taskLabel));\n\t\t\tconst counts = new Map<string, number>();\n\t\t\tfor (const sibling of group) {\n\t\t\t\tconst state = taskState(sibling);\n\t\t\t\tcounts.set(state, (counts.get(state) ?? 0) + 1);\n\t\t\t}\n\t\t\trendered.unshift(\n\t\t\t\ttheme.bold(\n\t\t\t\t\ttruncateToWidth(\n\t\t\t\t\t\t`${labels.size === 1 ? taskDisplayText(taskLabel(task)) : \"Tasks\"} · ${[...counts].map(([state, count]) => `${count} ${state}`).join(\" · \")}`,\n\t\t\t\t\t\twidth,\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\t\tif (this.options.hint !== false && (!grouped || index === group.length - 1)) {\n\t\t\tconst hint = keyHint(\"app.tools.expand\", this.options.expanded ? \"collapse\" : \"expand\");\n\t\t\tif (hint) rendered.push(theme.fg(\"dim\", hint));\n\t\t}\n\t\treturn rendered.map((line) => truncateToWidth(line, width));\n\t}\n}\n\nfunction retainedActivityLines(activity: readonly TaskActivity[]): string[] {\n\tconst lines: string[] = [];\n\tconst decoder = new TextDecoder();\n\tfor (const { report } of activity) {\n\t\tconst change = report.change;\n\t\tif (change.kind === \"action\") lines.push(`${change.tool} ${change.text}`);\n\t\telse if (change.kind === \"output\") {\n\t\t\tconst text = decoder.decode(Buffer.from(change.bytesBase64, \"base64\"), { stream: true });\n\t\t\tif (text) lines.push(`Retained output: ${text}`);\n\t\t} else if (change.kind === \"attention-set\" && change.attention.kind === \"input-needed\")\n\t\t\tlines.push(`Input needed: ${change.attention.prompt}`);\n\t}\n\tconst tail = decoder.decode();\n\tif (tail) lines.push(`Retained output: ${tail}`);\n\treturn lines;\n}\n"]}
@@ -9,6 +9,8 @@ const THEME_SELECT_LIST_LAYOUT = {
9
9
  * Component that renders a theme selector
10
10
  */
11
11
  export class ThemeSelectorComponent extends Container {
12
+ selectList;
13
+ onPreview;
12
14
  constructor(currentTheme, onSelect, onCancel, onPreview) {
13
15
  super();
14
16
  this.onPreview = onPreview;
@@ -1 +1 @@
1
- {"version":3,"file":"theme-selector.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/theme-selector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAmB,UAAU,EAAgC,MAAM,wBAAwB,CAAC;AAC9G,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAC3E,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,MAAM,wBAAwB,GAA4B;IACzD,qBAAqB,EAAE,EAAE;IACzB,qBAAqB,EAAE,EAAE;CACzB,CAAC;AAEF;;GAEG;AACH,MAAM,OAAO,sBAAuB,SAAQ,SAAS;IAIpD,YACC,YAAoB,EACpB,QAAqC,EACrC,QAAoB,EACpB,SAAsC;QAEtC,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAE3B,+CAA+C;QAC/C,MAAM,MAAM,GAAG,kBAAkB,EAAE,CAAC;QACpC,MAAM,UAAU,GAAiB,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YACtD,KAAK,EAAE,IAAI;YACX,KAAK,EAAE,IAAI;YACX,WAAW,EAAE,IAAI,KAAK,YAAY,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS;SAC5D,CAAC,CAAC,CAAC;QAEJ,iBAAiB;QACjB,IAAI,CAAC,QAAQ,CAAC,IAAI,aAAa,EAAE,CAAC,CAAC;QAEnC,kBAAkB;QAClB,IAAI,CAAC,UAAU,GAAG,IAAI,UAAU,CAAC,UAAU,EAAE,EAAE,EAAE,kBAAkB,EAAE,EAAE,wBAAwB,CAAC,CAAC;QAEjG,0BAA0B;QAC1B,MAAM,YAAY,GAAG,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;QAClD,IAAI,YAAY,KAAK,CAAC,CAAC,EAAE,CAAC;YACzB,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC;QAChD,CAAC;QAED,IAAI,CAAC,UAAU,CAAC,QAAQ,GAAG,CAAC,IAAI,EAAE,EAAE;YACnC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACtB,CAAC,CAAC;QAEF,IAAI,CAAC,UAAU,CAAC,QAAQ,GAAG,GAAG,EAAE;YAC/B,QAAQ,EAAE,CAAC;QACZ,CAAC,CAAC;QAEF,IAAI,CAAC,UAAU,CAAC,iBAAiB,GAAG,CAAC,IAAI,EAAE,EAAE;YAC5C,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC5B,CAAC,CAAC;QAEF,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAE/B,oBAAoB;QACpB,IAAI,CAAC,QAAQ,CAAC,IAAI,aAAa,EAAE,CAAC,CAAC;IACpC,CAAC;IAED,aAAa;QACZ,OAAO,IAAI,CAAC,UAAU,CAAC;IACxB,CAAC;CACD","sourcesContent":["import { Container, type SelectItem, SelectList, type SelectListLayoutOptions } from \"@earendil-works/pi-tui\";\nimport { getAvailableThemes, getSelectListTheme } from \"../theme/theme.js\";\nimport { DynamicBorder } from \"./dynamic-border.ts\";\n\nconst THEME_SELECT_LIST_LAYOUT: SelectListLayoutOptions = {\n\tminPrimaryColumnWidth: 12,\n\tmaxPrimaryColumnWidth: 32,\n};\n\n/**\n * Component that renders a theme selector\n */\nexport class ThemeSelectorComponent extends Container {\n\tprivate selectList: SelectList;\n\tprivate onPreview: (themeName: string) => void;\n\n\tconstructor(\n\t\tcurrentTheme: string,\n\t\tonSelect: (themeName: string) => void,\n\t\tonCancel: () => void,\n\t\tonPreview: (themeName: string) => void,\n\t) {\n\t\tsuper();\n\t\tthis.onPreview = onPreview;\n\n\t\t// Get available themes and create select items\n\t\tconst themes = getAvailableThemes();\n\t\tconst themeItems: SelectItem[] = themes.map((name) => ({\n\t\t\tvalue: name,\n\t\t\tlabel: name,\n\t\t\tdescription: name === currentTheme ? \"(current)\" : undefined,\n\t\t}));\n\n\t\t// Add top border\n\t\tthis.addChild(new DynamicBorder());\n\n\t\t// Create selector\n\t\tthis.selectList = new SelectList(themeItems, 10, getSelectListTheme(), THEME_SELECT_LIST_LAYOUT);\n\n\t\t// Preselect current theme\n\t\tconst currentIndex = themes.indexOf(currentTheme);\n\t\tif (currentIndex !== -1) {\n\t\t\tthis.selectList.setSelectedIndex(currentIndex);\n\t\t}\n\n\t\tthis.selectList.onSelect = (item) => {\n\t\t\tonSelect(item.value);\n\t\t};\n\n\t\tthis.selectList.onCancel = () => {\n\t\t\tonCancel();\n\t\t};\n\n\t\tthis.selectList.onSelectionChange = (item) => {\n\t\t\tthis.onPreview(item.value);\n\t\t};\n\n\t\tthis.addChild(this.selectList);\n\n\t\t// Add bottom border\n\t\tthis.addChild(new DynamicBorder());\n\t}\n\n\tgetSelectList(): SelectList {\n\t\treturn this.selectList;\n\t}\n}\n"]}
1
+ {"version":3,"file":"theme-selector.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/theme-selector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAmB,UAAU,EAAgC,MAAM,wBAAwB,CAAC;AAC9G,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAC3E,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,MAAM,wBAAwB,GAA4B;IACzD,qBAAqB,EAAE,EAAE;IACzB,qBAAqB,EAAE,EAAE;CACzB,CAAC;AAEF;;GAEG;AACH,MAAM,OAAO,sBAAuB,SAAQ,SAAS;IAC5C,UAAU,CAAa;IACvB,SAAS,CAA8B;IAE/C,YACC,YAAoB,EACpB,QAAqC,EACrC,QAAoB,EACpB,SAAsC;QAEtC,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAE3B,+CAA+C;QAC/C,MAAM,MAAM,GAAG,kBAAkB,EAAE,CAAC;QACpC,MAAM,UAAU,GAAiB,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YACtD,KAAK,EAAE,IAAI;YACX,KAAK,EAAE,IAAI;YACX,WAAW,EAAE,IAAI,KAAK,YAAY,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS;SAC5D,CAAC,CAAC,CAAC;QAEJ,iBAAiB;QACjB,IAAI,CAAC,QAAQ,CAAC,IAAI,aAAa,EAAE,CAAC,CAAC;QAEnC,kBAAkB;QAClB,IAAI,CAAC,UAAU,GAAG,IAAI,UAAU,CAAC,UAAU,EAAE,EAAE,EAAE,kBAAkB,EAAE,EAAE,wBAAwB,CAAC,CAAC;QAEjG,0BAA0B;QAC1B,MAAM,YAAY,GAAG,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;QAClD,IAAI,YAAY,KAAK,CAAC,CAAC,EAAE,CAAC;YACzB,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC;QAChD,CAAC;QAED,IAAI,CAAC,UAAU,CAAC,QAAQ,GAAG,CAAC,IAAI,EAAE,EAAE;YACnC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACtB,CAAC,CAAC;QAEF,IAAI,CAAC,UAAU,CAAC,QAAQ,GAAG,GAAG,EAAE;YAC/B,QAAQ,EAAE,CAAC;QACZ,CAAC,CAAC;QAEF,IAAI,CAAC,UAAU,CAAC,iBAAiB,GAAG,CAAC,IAAI,EAAE,EAAE;YAC5C,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC5B,CAAC,CAAC;QAEF,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAE/B,oBAAoB;QACpB,IAAI,CAAC,QAAQ,CAAC,IAAI,aAAa,EAAE,CAAC,CAAC;IACpC,CAAC;IAED,aAAa;QACZ,OAAO,IAAI,CAAC,UAAU,CAAC;IACxB,CAAC;CACD","sourcesContent":["import { Container, type SelectItem, SelectList, type SelectListLayoutOptions } from \"@earendil-works/pi-tui\";\nimport { getAvailableThemes, getSelectListTheme } from \"../theme/theme.js\";\nimport { DynamicBorder } from \"./dynamic-border.ts\";\n\nconst THEME_SELECT_LIST_LAYOUT: SelectListLayoutOptions = {\n\tminPrimaryColumnWidth: 12,\n\tmaxPrimaryColumnWidth: 32,\n};\n\n/**\n * Component that renders a theme selector\n */\nexport class ThemeSelectorComponent extends Container {\n\tprivate selectList: SelectList;\n\tprivate onPreview: (themeName: string) => void;\n\n\tconstructor(\n\t\tcurrentTheme: string,\n\t\tonSelect: (themeName: string) => void,\n\t\tonCancel: () => void,\n\t\tonPreview: (themeName: string) => void,\n\t) {\n\t\tsuper();\n\t\tthis.onPreview = onPreview;\n\n\t\t// Get available themes and create select items\n\t\tconst themes = getAvailableThemes();\n\t\tconst themeItems: SelectItem[] = themes.map((name) => ({\n\t\t\tvalue: name,\n\t\t\tlabel: name,\n\t\t\tdescription: name === currentTheme ? \"(current)\" : undefined,\n\t\t}));\n\n\t\t// Add top border\n\t\tthis.addChild(new DynamicBorder());\n\n\t\t// Create selector\n\t\tthis.selectList = new SelectList(themeItems, 10, getSelectListTheme(), THEME_SELECT_LIST_LAYOUT);\n\n\t\t// Preselect current theme\n\t\tconst currentIndex = themes.indexOf(currentTheme);\n\t\tif (currentIndex !== -1) {\n\t\t\tthis.selectList.setSelectedIndex(currentIndex);\n\t\t}\n\n\t\tthis.selectList.onSelect = (item) => {\n\t\t\tonSelect(item.value);\n\t\t};\n\n\t\tthis.selectList.onCancel = () => {\n\t\t\tonCancel();\n\t\t};\n\n\t\tthis.selectList.onSelectionChange = (item) => {\n\t\t\tthis.onPreview(item.value);\n\t\t};\n\n\t\tthis.addChild(this.selectList);\n\n\t\t// Add bottom border\n\t\tthis.addChild(new DynamicBorder());\n\t}\n\n\tgetSelectList(): SelectList {\n\t\treturn this.selectList;\n\t}\n}\n"]}