@bubblebrain-ai/bubble 0.0.52 → 0.0.54

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 (483) hide show
  1. package/README.md +4 -12
  2. package/dist/agent/routing-catalog.js +3 -2
  3. package/dist/agent/subagent/router.js +5 -0
  4. package/dist/agent/subagent/runtime.d.ts +1 -0
  5. package/dist/agent/subagent/runtime.js +13 -1
  6. package/dist/agent/subagent-control.d.ts +4 -0
  7. package/dist/agent/subagent-control.js +1 -0
  8. package/dist/agent/subagent-store.js +2 -0
  9. package/dist/agent/workflow/control.d.ts +2 -0
  10. package/dist/agent/workflow/runs.d.ts +1 -0
  11. package/dist/agent/workflow/runs.js +3 -0
  12. package/dist/agent.d.ts +11 -1
  13. package/dist/agent.js +158 -57
  14. package/dist/bin.js +2 -44
  15. package/dist/config.d.ts +14 -1
  16. package/dist/config.js +45 -4
  17. package/dist/context/budget.d.ts +7 -1
  18. package/dist/context/budget.js +25 -2
  19. package/dist/context/compact-llm.d.ts +1 -1
  20. package/dist/context/compact-llm.js +5 -2
  21. package/dist/context/overflow.js +2 -0
  22. package/dist/context/projector.d.ts +8 -0
  23. package/dist/context/projector.js +55 -6
  24. package/dist/context/tool-output-truncate.d.ts +17 -1
  25. package/dist/context/tool-output-truncate.js +171 -49
  26. package/dist/feishu/agent-host/run-driver.js +3 -0
  27. package/dist/feishu/serve.js +2 -0
  28. package/dist/goal/command.d.ts +1 -1
  29. package/dist/goal/command.js +7 -2
  30. package/dist/main.d.ts +1 -1
  31. package/dist/main.js +38 -8
  32. package/dist/memory/db.js +0 -7
  33. package/dist/model-catalog.js +25 -6
  34. package/dist/model-config.js +3 -2
  35. package/dist/model-pricing.d.ts +24 -5
  36. package/dist/model-pricing.js +0 -0
  37. package/dist/model-selection.js +13 -4
  38. package/dist/network/chatgpt-transport.js +0 -34
  39. package/dist/network/errors.d.ts +19 -0
  40. package/dist/network/errors.js +24 -0
  41. package/dist/network/provider-transport.d.ts +0 -4
  42. package/dist/network/provider-transport.js +3 -35
  43. package/dist/network/retry.d.ts +6 -1
  44. package/dist/network/retry.js +9 -0
  45. package/dist/provider-model-policy.d.ts +16 -0
  46. package/dist/provider-model-policy.js +33 -0
  47. package/dist/provider-registry.d.ts +1 -1
  48. package/dist/provider-registry.js +73 -10
  49. package/dist/provider-transform.js +32 -4
  50. package/dist/provider.d.ts +6 -2
  51. package/dist/provider.js +95 -6
  52. package/dist/question/controller.js +5 -4
  53. package/dist/question/normalize.d.ts +6 -0
  54. package/dist/question/normalize.js +11 -0
  55. package/dist/rewind.d.ts +20 -0
  56. package/dist/rewind.js +29 -0
  57. package/dist/sdk/index.d.ts +1 -1
  58. package/dist/sdk/index.js +11 -3
  59. package/dist/session.d.ts +7 -0
  60. package/dist/session.js +20 -0
  61. package/dist/skills/discovery.js +18 -0
  62. package/dist/skills/registry.d.ts +12 -2
  63. package/dist/skills/registry.js +40 -5
  64. package/dist/skills/types.d.ts +2 -0
  65. package/dist/slash-commands/commands.js +120 -81
  66. package/dist/slash-commands/registry.d.ts +2 -1
  67. package/dist/slash-commands/registry.js +3 -0
  68. package/dist/slash-commands/types.d.ts +22 -4
  69. package/dist/stats/usage.d.ts +3 -1
  70. package/dist/stats/usage.js +22 -13
  71. package/dist/tasks/manager.d.ts +4 -2
  72. package/dist/tasks/manager.js +34 -9
  73. package/dist/tasks/promotion.d.ts +2 -2
  74. package/dist/tasks/promotion.js +2 -2
  75. package/dist/tools/agent-lifecycle.js +4 -0
  76. package/dist/tools/bash.d.ts +3 -1
  77. package/dist/tools/bash.js +13 -2
  78. package/dist/tools/grep.d.ts +5 -1
  79. package/dist/tools/grep.js +318 -69
  80. package/dist/tools/index.d.ts +3 -1
  81. package/dist/tools/index.js +1 -0
  82. package/dist/tools/question.js +5 -4
  83. package/dist/tools/read.js +40 -21
  84. package/dist/tui/animation-clock.d.ts +14 -0
  85. package/dist/tui/animation-clock.js +34 -0
  86. package/dist/tui/app.d.ts +176 -0
  87. package/dist/tui/app.js +1647 -0
  88. package/dist/tui/components/approval-dialog.d.ts +43 -0
  89. package/dist/tui/components/approval-dialog.js +247 -0
  90. package/dist/tui/components/bottom-sheet.d.ts +9 -0
  91. package/dist/tui/components/bottom-sheet.js +32 -0
  92. package/dist/tui/components/context-info.d.ts +54 -0
  93. package/dist/tui/components/context-info.js +388 -0
  94. package/dist/tui/components/feedback-dialog.d.ts +56 -0
  95. package/dist/tui/components/feedback-dialog.js +262 -0
  96. package/dist/tui/components/feishu-setup-dialog.d.ts +65 -0
  97. package/dist/tui/components/feishu-setup-dialog.js +332 -0
  98. package/dist/tui/components/image-preview.d.ts +32 -0
  99. package/dist/tui/components/image-preview.js +130 -0
  100. package/dist/tui/components/plan-dialog.d.ts +34 -0
  101. package/dist/tui/components/plan-dialog.js +196 -0
  102. package/dist/tui/components/provider-key-input.d.ts +18 -0
  103. package/dist/tui/components/provider-key-input.js +49 -0
  104. package/dist/tui/components/question-dialog.d.ts +25 -0
  105. package/dist/tui/components/question-dialog.js +263 -0
  106. package/dist/tui/components/responsive-transcript.d.ts +31 -0
  107. package/dist/tui/components/responsive-transcript.js +77 -0
  108. package/dist/tui/components/rewind-picker.d.ts +62 -0
  109. package/dist/tui/components/rewind-picker.js +317 -0
  110. package/dist/tui/components/session-picker.d.ts +49 -0
  111. package/dist/tui/components/session-picker.js +303 -0
  112. package/dist/tui/components/skills-panel.d.ts +59 -0
  113. package/dist/tui/components/skills-panel.js +568 -0
  114. package/dist/tui/components/stats-panel.d.ts +40 -0
  115. package/dist/tui/components/stats-panel.js +301 -0
  116. package/dist/tui/components/streaming-message.d.ts +69 -0
  117. package/dist/tui/components/streaming-message.js +393 -0
  118. package/dist/tui/components/subagent-inspector.d.ts +28 -0
  119. package/dist/tui/components/subagent-inspector.js +127 -0
  120. package/dist/tui/components/task-inspector.d.ts +26 -0
  121. package/dist/tui/components/task-inspector.js +70 -0
  122. package/dist/tui/components/tasks-pane.d.ts +88 -0
  123. package/dist/tui/components/tasks-pane.js +416 -0
  124. package/dist/tui/components/transcript.d.ts +96 -0
  125. package/dist/tui/components/transcript.js +771 -0
  126. package/dist/tui/components/welcome.d.ts +20 -0
  127. package/dist/tui/components/welcome.js +133 -0
  128. package/dist/tui/components/workflow-inspector.d.ts +30 -0
  129. package/dist/tui/components/workflow-inspector.js +136 -0
  130. package/dist/tui/composer-autocomplete.d.ts +61 -0
  131. package/dist/tui/composer-autocomplete.js +383 -0
  132. package/dist/tui/composer-style.d.ts +7 -0
  133. package/dist/tui/composer-style.js +29 -0
  134. package/dist/tui/controller/agent-event-reducer.d.ts +75 -0
  135. package/dist/tui/controller/agent-event-reducer.js +238 -0
  136. package/dist/tui/controller/composer-controller.d.ts +95 -0
  137. package/dist/tui/controller/composer-controller.js +502 -0
  138. package/dist/tui/controller/controller.d.ts +194 -0
  139. package/dist/tui/controller/controller.js +1035 -0
  140. package/dist/tui/controller/effects.d.ts +71 -0
  141. package/dist/tui/controller/effects.js +1 -0
  142. package/dist/tui/controller/goal-runtime-controller.d.ts +47 -0
  143. package/dist/tui/controller/goal-runtime-controller.js +202 -0
  144. package/dist/tui/controller/input-queue-machine.d.ts +71 -0
  145. package/dist/tui/controller/input-queue-machine.js +121 -0
  146. package/dist/tui/controller/intents.d.ts +56 -0
  147. package/dist/tui/controller/intents.js +6 -0
  148. package/dist/tui/controller/overlay-controller.d.ts +64 -0
  149. package/dist/tui/controller/overlay-controller.js +129 -0
  150. package/dist/tui/controller/ports.d.ts +57 -0
  151. package/dist/tui/controller/ports.js +9 -0
  152. package/dist/tui/controller/session-transition.d.ts +54 -0
  153. package/dist/tui/controller/session-transition.js +68 -0
  154. package/dist/tui/controller/state.d.ts +14 -0
  155. package/dist/tui/controller/state.js +36 -0
  156. package/dist/tui/controller/task-runtime-controller.d.ts +66 -0
  157. package/dist/tui/controller/task-runtime-controller.js +158 -0
  158. package/dist/tui/footer.d.ts +37 -0
  159. package/dist/tui/footer.js +80 -0
  160. package/dist/{tui-ink → tui/formatting}/edit-diff.d.ts +1 -1
  161. package/dist/{tui-ink → tui/formatting}/edit-diff.js +1 -1
  162. package/dist/{tui-ink/app-helpers.d.ts → tui/formatting/summary.d.ts} +4 -4
  163. package/dist/{tui-ink/app-helpers.js → tui/formatting/summary.js} +2 -2
  164. package/dist/tui/fullscreen.d.ts +48 -0
  165. package/dist/tui/fullscreen.js +255 -0
  166. package/dist/tui/image-display.d.ts +4 -0
  167. package/dist/tui/image-display.js +30 -12
  168. package/dist/tui/markdown-style.d.ts +5 -0
  169. package/dist/tui/markdown-style.js +23 -0
  170. package/dist/{tui-ink → tui/model}/composer-buffer.js +1 -1
  171. package/dist/tui/model/composer-types.d.ts +17 -0
  172. package/dist/tui/model/composer-types.js +1 -0
  173. package/dist/{tui-ink → tui/model}/display-history.d.ts +7 -1
  174. package/dist/{tui-ink → tui/model}/display-reconstruct.d.ts +1 -1
  175. package/dist/{tui-ink → tui/model}/display-reconstruct.js +54 -6
  176. package/dist/{tui-ink → tui/model}/file-mentions.d.ts +2 -0
  177. package/dist/{tui-ink → tui/model}/file-mentions.js +4 -0
  178. package/dist/tui/model/image-attachment.d.ts +15 -0
  179. package/dist/tui/model/image-attachment.js +1 -0
  180. package/dist/{tui-ink → tui/model}/image-paste.d.ts +7 -1
  181. package/dist/{tui-ink → tui/model}/image-paste.js +46 -0
  182. package/dist/tui/model/input-history.d.ts +1 -0
  183. package/dist/tui/model/input-history.js +1 -0
  184. package/dist/{tui-ink → tui/model}/input-queue.d.ts +1 -1
  185. package/dist/{tui-ink → tui/model}/recent-activity.js +1 -1
  186. package/dist/{tui-ink → tui/model}/subagent-view.d.ts +17 -2
  187. package/dist/{tui-ink → tui/model}/subagent-view.js +125 -4
  188. package/dist/{tui-ink → tui/model}/submit-dedupe.d.ts +1 -1
  189. package/dist/tui/model/theme-style.d.ts +10 -0
  190. package/dist/tui/model/theme-style.js +79 -0
  191. package/dist/{tui-ink → tui/model}/theme.d.ts +11 -23
  192. package/dist/{tui-ink → tui/model}/theme.js +23 -38
  193. package/dist/{tui-ink → tui/model}/trace-groups.d.ts +2 -0
  194. package/dist/{tui-ink → tui/model}/trace-groups.js +91 -30
  195. package/dist/tui/model/trace-interaction.d.ts +63 -0
  196. package/dist/tui/model/trace-interaction.js +87 -0
  197. package/dist/tui/model-picker-data.d.ts +1 -2
  198. package/dist/tui/model-picker-data.js +8 -1
  199. package/dist/tui/model-switch.js +2 -0
  200. package/dist/{tui-ink → tui}/run-session-picker.d.ts +2 -3
  201. package/dist/tui/run-session-picker.js +64 -0
  202. package/dist/tui/run.d.ts +72 -0
  203. package/dist/tui/run.js +139 -0
  204. package/dist/tui/terminal/multiplexer.d.ts +5 -0
  205. package/dist/tui/terminal/multiplexer.js +14 -0
  206. package/dist/tui/testing/fake-agent.d.ts +24 -0
  207. package/dist/tui/testing/fake-agent.js +22 -0
  208. package/dist/tui/testing/spy-host.d.ts +21 -0
  209. package/dist/tui/testing/spy-host.js +55 -0
  210. package/dist/tui/trace-groups.js +27 -6
  211. package/dist/types.d.ts +7 -0
  212. package/dist/update/index.d.ts +1 -0
  213. package/dist/update/index.js +22 -17
  214. package/node_modules/@bubblebrain-ai/pi-tui/LICENSE +21 -0
  215. package/node_modules/@bubblebrain-ai/pi-tui/README.md +854 -0
  216. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/alt-screen-search.d.ts +26 -0
  217. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/alt-screen-search.d.ts.map +1 -0
  218. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/alt-screen-search.js +121 -0
  219. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/alt-screen-search.js.map +1 -0
  220. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/autocomplete.d.ts +86 -0
  221. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/autocomplete.d.ts.map +1 -0
  222. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/autocomplete.js +649 -0
  223. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/autocomplete.js.map +1 -0
  224. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/alt-screen-flash.d.ts +13 -0
  225. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/alt-screen-flash.d.ts.map +1 -0
  226. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/alt-screen-flash.js +36 -0
  227. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/alt-screen-flash.js.map +1 -0
  228. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/box.d.ts +22 -0
  229. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/box.d.ts.map +1 -0
  230. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/box.js +99 -0
  231. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/box.js.map +1 -0
  232. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/cancellable-loader.d.ts +22 -0
  233. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/cancellable-loader.d.ts.map +1 -0
  234. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/cancellable-loader.js +36 -0
  235. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/cancellable-loader.js.map +1 -0
  236. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/editor.d.ts +330 -0
  237. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/editor.d.ts.map +1 -0
  238. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/editor.js +2344 -0
  239. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/editor.js.map +1 -0
  240. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/h-stack.d.ts +7 -0
  241. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/h-stack.d.ts.map +1 -0
  242. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/h-stack.js +43 -0
  243. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/h-stack.js.map +1 -0
  244. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/image.d.ts +28 -0
  245. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/image.d.ts.map +1 -0
  246. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/image.js +82 -0
  247. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/image.js.map +1 -0
  248. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/input.d.ts +48 -0
  249. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/input.d.ts.map +1 -0
  250. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/input.js +390 -0
  251. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/input.js.map +1 -0
  252. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/loader.d.ts +31 -0
  253. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/loader.d.ts.map +1 -0
  254. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/loader.js +67 -0
  255. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/loader.js.map +1 -0
  256. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/markdown.d.ts +103 -0
  257. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/markdown.d.ts.map +1 -0
  258. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/markdown.js +797 -0
  259. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/markdown.js.map +1 -0
  260. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/scroll-view.d.ts +56 -0
  261. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/scroll-view.d.ts.map +1 -0
  262. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/scroll-view.js +179 -0
  263. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/scroll-view.js.map +1 -0
  264. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/select-list.d.ts +53 -0
  265. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/select-list.d.ts.map +1 -0
  266. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/select-list.js +175 -0
  267. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/select-list.js.map +1 -0
  268. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/settings-list.d.ts +50 -0
  269. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/settings-list.d.ts.map +1 -0
  270. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/settings-list.js +174 -0
  271. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/settings-list.js.map +1 -0
  272. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/spacer.d.ts +12 -0
  273. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/spacer.d.ts.map +1 -0
  274. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/spacer.js +22 -0
  275. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/spacer.js.map +1 -0
  276. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/stack.d.ts +32 -0
  277. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/stack.d.ts.map +1 -0
  278. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/stack.js +109 -0
  279. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/stack.js.map +1 -0
  280. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/text.d.ts +19 -0
  281. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/text.d.ts.map +1 -0
  282. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/text.js +81 -0
  283. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/text.js.map +1 -0
  284. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/truncated-text.d.ts +13 -0
  285. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/truncated-text.d.ts.map +1 -0
  286. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/truncated-text.js +48 -0
  287. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/truncated-text.js.map +1 -0
  288. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/v-stack.d.ts +8 -0
  289. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/v-stack.d.ts.map +1 -0
  290. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/v-stack.js +26 -0
  291. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/v-stack.js.map +1 -0
  292. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/editor-component.d.ts +39 -0
  293. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/editor-component.d.ts.map +1 -0
  294. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/editor-component.js +2 -0
  295. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/editor-component.js.map +1 -0
  296. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/fuzzy.d.ts +16 -0
  297. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/fuzzy.d.ts.map +1 -0
  298. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/fuzzy.js +110 -0
  299. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/fuzzy.js.map +1 -0
  300. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/index.d.ts +31 -0
  301. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/index.d.ts.map +1 -0
  302. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/index.js +42 -0
  303. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/index.js.map +1 -0
  304. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/keybindings.d.ts +273 -0
  305. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/keybindings.d.ts.map +1 -0
  306. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/keybindings.js +231 -0
  307. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/keybindings.js.map +1 -0
  308. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/keys.d.ts +184 -0
  309. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/keys.d.ts.map +1 -0
  310. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/keys.js +1174 -0
  311. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/keys.js.map +1 -0
  312. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/kill-ring.d.ts +28 -0
  313. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/kill-ring.d.ts.map +1 -0
  314. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/kill-ring.js +46 -0
  315. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/kill-ring.js.map +1 -0
  316. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/latex.d.ts +10 -0
  317. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/latex.d.ts.map +1 -0
  318. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/latex.js +1268 -0
  319. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/latex.js.map +1 -0
  320. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/layout-node.d.ts +40 -0
  321. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/layout-node.d.ts.map +1 -0
  322. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/layout-node.js +6 -0
  323. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/layout-node.js.map +1 -0
  324. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/layout.d.ts +42 -0
  325. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/layout.d.ts.map +1 -0
  326. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/layout.js +335 -0
  327. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/layout.js.map +1 -0
  328. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/native-modifiers.d.ts +3 -0
  329. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/native-modifiers.d.ts.map +1 -0
  330. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/native-modifiers.js +60 -0
  331. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/native-modifiers.js.map +1 -0
  332. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/stdin-buffer.d.ts +56 -0
  333. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/stdin-buffer.d.ts.map +1 -0
  334. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/stdin-buffer.js +363 -0
  335. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/stdin-buffer.js.map +1 -0
  336. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/terminal-colors.d.ts +10 -0
  337. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/terminal-colors.d.ts.map +1 -0
  338. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/terminal-colors.js +59 -0
  339. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/terminal-colors.js.map +1 -0
  340. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/terminal-image.d.ts +116 -0
  341. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/terminal-image.d.ts.map +1 -0
  342. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/terminal-image.js +518 -0
  343. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/terminal-image.js.map +1 -0
  344. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/terminal.d.ts +142 -0
  345. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/terminal.d.ts.map +1 -0
  346. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/terminal.js +544 -0
  347. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/terminal.js.map +1 -0
  348. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/testing.d.ts +11 -0
  349. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/testing.d.ts.map +1 -0
  350. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/testing.js +11 -0
  351. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/testing.js.map +1 -0
  352. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/tui-alt-screen.d.ts +140 -0
  353. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/tui-alt-screen.d.ts.map +1 -0
  354. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/tui-alt-screen.js +1334 -0
  355. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/tui-alt-screen.js.map +1 -0
  356. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/tui-main-screen.d.ts +39 -0
  357. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/tui-main-screen.d.ts.map +1 -0
  358. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/tui-main-screen.js +536 -0
  359. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/tui-main-screen.js.map +1 -0
  360. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/tui.d.ts +338 -0
  361. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/tui.d.ts.map +1 -0
  362. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/tui.js +1016 -0
  363. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/tui.js.map +1 -0
  364. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/undo-stack.d.ts +17 -0
  365. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/undo-stack.d.ts.map +1 -0
  366. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/undo-stack.js +27 -0
  367. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/undo-stack.js.map +1 -0
  368. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/utils.d.ts +96 -0
  369. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/utils.d.ts.map +1 -0
  370. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/utils.js +1193 -0
  371. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/utils.js.map +1 -0
  372. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/word-navigation.d.ts +25 -0
  373. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/word-navigation.d.ts.map +1 -0
  374. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/word-navigation.js +96 -0
  375. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/word-navigation.js.map +1 -0
  376. package/node_modules/@bubblebrain-ai/pi-tui/dist/test/virtual-terminal.d.ts +73 -0
  377. package/node_modules/@bubblebrain-ai/pi-tui/dist/test/virtual-terminal.d.ts.map +1 -0
  378. package/node_modules/@bubblebrain-ai/pi-tui/dist/test/virtual-terminal.js +188 -0
  379. package/node_modules/@bubblebrain-ai/pi-tui/dist/test/virtual-terminal.js.map +1 -0
  380. package/node_modules/@bubblebrain-ai/pi-tui/native/darwin/README.md +20 -0
  381. package/node_modules/@bubblebrain-ai/pi-tui/native/darwin/build.sh +62 -0
  382. package/node_modules/@bubblebrain-ai/pi-tui/native/darwin/prebuilds/darwin-arm64/darwin-modifiers.node +0 -0
  383. package/node_modules/@bubblebrain-ai/pi-tui/native/darwin/prebuilds/darwin-x64/darwin-modifiers.node +0 -0
  384. package/node_modules/@bubblebrain-ai/pi-tui/native/darwin/src/darwin-modifiers.c +70 -0
  385. package/node_modules/@bubblebrain-ai/pi-tui/native/win32/README.md +22 -0
  386. package/node_modules/@bubblebrain-ai/pi-tui/native/win32/build.mjs +229 -0
  387. package/node_modules/@bubblebrain-ai/pi-tui/native/win32/prebuilds/win32-arm64/win32-console-mode.node +0 -0
  388. package/node_modules/@bubblebrain-ai/pi-tui/native/win32/prebuilds/win32-x64/win32-console-mode.node +0 -0
  389. package/node_modules/@bubblebrain-ai/pi-tui/native/win32/src/win32-console-mode.c +119 -0
  390. package/node_modules/@bubblebrain-ai/pi-tui/package.json +66 -0
  391. package/node_modules/get-east-asian-width/index.d.ts +60 -0
  392. package/node_modules/get-east-asian-width/index.js +30 -0
  393. package/node_modules/get-east-asian-width/license +9 -0
  394. package/node_modules/get-east-asian-width/lookup-data.js +21 -0
  395. package/node_modules/get-east-asian-width/lookup.js +138 -0
  396. package/node_modules/get-east-asian-width/package.json +71 -0
  397. package/node_modules/get-east-asian-width/readme.md +65 -0
  398. package/node_modules/get-east-asian-width/utilities.js +24 -0
  399. package/node_modules/marked/LICENSE +44 -0
  400. package/node_modules/marked/README.md +115 -0
  401. package/node_modules/marked/bin/main.js +284 -0
  402. package/node_modules/marked/bin/marked.js +16 -0
  403. package/node_modules/marked/lib/marked.d.ts +760 -0
  404. package/node_modules/marked/lib/marked.esm.js +77 -0
  405. package/node_modules/marked/lib/marked.esm.js.map +7 -0
  406. package/node_modules/marked/lib/marked.umd.js +79 -0
  407. package/node_modules/marked/lib/marked.umd.js.map +7 -0
  408. package/node_modules/marked/man/marked.1 +113 -0
  409. package/node_modules/marked/man/marked.1.md +93 -0
  410. package/node_modules/marked/package.json +103 -0
  411. package/package.json +25 -10
  412. package/dist/tui-ink/app.d.ts +0 -76
  413. package/dist/tui-ink/app.js +0 -2377
  414. package/dist/tui-ink/approval/approval-dialog.d.ts +0 -13
  415. package/dist/tui-ink/approval/approval-dialog.js +0 -184
  416. package/dist/tui-ink/approval/diff-view.d.ts +0 -7
  417. package/dist/tui-ink/approval/diff-view.js +0 -44
  418. package/dist/tui-ink/approval/select.d.ts +0 -35
  419. package/dist/tui-ink/approval/select.js +0 -98
  420. package/dist/tui-ink/code-highlight.d.ts +0 -8
  421. package/dist/tui-ink/code-highlight.js +0 -121
  422. package/dist/tui-ink/command-palette.d.ts +0 -32
  423. package/dist/tui-ink/command-palette.js +0 -158
  424. package/dist/tui-ink/compaction-progress.d.ts +0 -19
  425. package/dist/tui-ink/compaction-progress.js +0 -74
  426. package/dist/tui-ink/detect-theme.d.ts +0 -1
  427. package/dist/tui-ink/detect-theme.js +0 -1
  428. package/dist/tui-ink/feedback-dialog.d.ts +0 -19
  429. package/dist/tui-ink/feedback-dialog.js +0 -133
  430. package/dist/tui-ink/feishu-setup-picker.d.ts +0 -5
  431. package/dist/tui-ink/feishu-setup-picker.js +0 -271
  432. package/dist/tui-ink/footer.d.ts +0 -26
  433. package/dist/tui-ink/footer.js +0 -51
  434. package/dist/tui-ink/input-box.d.ts +0 -189
  435. package/dist/tui-ink/input-box.js +0 -1279
  436. package/dist/tui-ink/input-history.d.ts +0 -1
  437. package/dist/tui-ink/input-history.js +0 -1
  438. package/dist/tui-ink/markdown.d.ts +0 -103
  439. package/dist/tui-ink/markdown.js +0 -747
  440. package/dist/tui-ink/message-list.d.ts +0 -49
  441. package/dist/tui-ink/message-list.js +0 -841
  442. package/dist/tui-ink/model-picker.d.ts +0 -143
  443. package/dist/tui-ink/model-picker.js +0 -966
  444. package/dist/tui-ink/plan-confirm.d.ts +0 -7
  445. package/dist/tui-ink/plan-confirm.js +0 -115
  446. package/dist/tui-ink/question-dialog.d.ts +0 -8
  447. package/dist/tui-ink/question-dialog.js +0 -135
  448. package/dist/tui-ink/rewind-picker.d.ts +0 -8
  449. package/dist/tui-ink/rewind-picker.js +0 -102
  450. package/dist/tui-ink/run-session-picker.js +0 -22
  451. package/dist/tui-ink/run.d.ts +0 -62
  452. package/dist/tui-ink/run.js +0 -103
  453. package/dist/tui-ink/session-picker.d.ts +0 -10
  454. package/dist/tui-ink/session-picker.js +0 -113
  455. package/dist/tui-ink/stats-panel.d.ts +0 -11
  456. package/dist/tui-ink/stats-panel.js +0 -65
  457. package/dist/tui-ink/subagent-inspector.d.ts +0 -21
  458. package/dist/tui-ink/subagent-inspector.js +0 -205
  459. package/dist/tui-ink/use-terminal-size.d.ts +0 -4
  460. package/dist/tui-ink/use-terminal-size.js +0 -48
  461. package/dist/tui-ink/waiting-indicator.d.ts +0 -12
  462. package/dist/tui-ink/waiting-indicator.js +0 -129
  463. package/dist/tui-ink/welcome.d.ts +0 -25
  464. package/dist/tui-ink/welcome.js +0 -88
  465. package/dist/tui-ink/wordmark.d.ts +0 -8
  466. package/dist/tui-ink/wordmark.js +0 -103
  467. /package/dist/{tui-ink → tui/model}/composer-buffer.d.ts +0 -0
  468. /package/dist/{tui-ink → tui/model}/display-history.js +0 -0
  469. /package/dist/{tui-ink → tui/model}/input-queue.js +0 -0
  470. /package/dist/{tui-ink → tui/model}/key-events.d.ts +0 -0
  471. /package/dist/{tui-ink → tui/model}/key-events.js +0 -0
  472. /package/dist/{tui-ink → tui/model}/paste-operation-tracker.d.ts +0 -0
  473. /package/dist/{tui-ink → tui/model}/paste-operation-tracker.js +0 -0
  474. /package/dist/{tui-ink → tui/model}/recent-activity.d.ts +0 -0
  475. /package/dist/{tui-ink → tui/model}/submit-dedupe.js +0 -0
  476. /package/dist/{tui-ink → tui/model}/sync-output.d.ts +0 -0
  477. /package/dist/{tui-ink → tui/model}/sync-output.js +0 -0
  478. /package/dist/{tui-ink → tui/model}/terminal-env.d.ts +0 -0
  479. /package/dist/{tui-ink → tui/model}/terminal-env.js +0 -0
  480. /package/dist/{tui-ink → tui/model}/terminal-mouse.d.ts +0 -0
  481. /package/dist/{tui-ink → tui/model}/terminal-mouse.js +0 -0
  482. /package/dist/{tui-ink → tui/model}/width.d.ts +0 -0
  483. /package/dist/{tui-ink → tui/model}/width.js +0 -0
@@ -0,0 +1,88 @@
1
+ import { type Component, type TuiMouseEvent } from "@bubblebrain-ai/pi-tui";
2
+ import type { WorkflowRunSnapshot } from "../../agent/workflow/control.js";
3
+ import type { BackgroundTaskInfo } from "../../tasks/manager.js";
4
+ import { type Theme } from "../model/theme.js";
5
+ import { type SubagentDisplay, type SubagentGroup } from "../model/subagent-view.js";
6
+ export interface TasksPaneSnapshot {
7
+ groups: SubagentGroup[];
8
+ workflows: WorkflowRunSnapshot[];
9
+ tasks: BackgroundTaskInfo[];
10
+ }
11
+ export interface WorkflowPaneItem {
12
+ kind: "workflow";
13
+ id: string;
14
+ title: string;
15
+ status: string;
16
+ members: SubagentDisplay[];
17
+ createdAt?: number;
18
+ updatedAt?: number;
19
+ }
20
+ export interface SubagentPaneItem {
21
+ kind: "subagent";
22
+ id: string;
23
+ title: string;
24
+ status: string;
25
+ member: SubagentDisplay;
26
+ }
27
+ export interface TaskPaneItem {
28
+ kind: "task";
29
+ id: string;
30
+ title: string;
31
+ status: string;
32
+ task: BackgroundTaskInfo;
33
+ }
34
+ export type PaneItem = WorkflowPaneItem | SubagentPaneItem | TaskPaneItem;
35
+ export interface TasksPaneCallbacks {
36
+ onRender(): void;
37
+ onOpenWorkflow(item: WorkflowPaneItem): void;
38
+ onOpenSubagent(item: SubagentPaneItem): void;
39
+ onOpenTask(item: TaskPaneItem): void;
40
+ onStopWorkflow(id: string): void;
41
+ onStopSubagent(id: string): void;
42
+ onStopTask(id: string): void;
43
+ onCopyTaskOutput?(id: string): void;
44
+ onEscape(): void;
45
+ }
46
+ export declare class TasksPaneComponent implements Component {
47
+ private readonly getSnapshot;
48
+ private readonly getTerminalRows;
49
+ private readonly callbacks;
50
+ private readonly getTheme;
51
+ focused: boolean;
52
+ private open;
53
+ private manuallyClosed;
54
+ private showHistory;
55
+ private selectedId?;
56
+ private hoveredId?;
57
+ private lastActiveCount;
58
+ private lastRows;
59
+ private allRows;
60
+ private frame;
61
+ private readonly collapsed;
62
+ constructor(getSnapshot: () => TasksPaneSnapshot, getTerminalRows: () => number, callbacks: TasksPaneCallbacks, getTheme?: () => Theme);
63
+ isAnimationActive(): boolean;
64
+ advanceAnimationFrame(): boolean;
65
+ dispose(): void;
66
+ invalidate(): void;
67
+ isOpen(): boolean;
68
+ isAvailable(): boolean;
69
+ activeCount(): number;
70
+ totalCount(): number;
71
+ activityGlyph(): string;
72
+ theme(): Theme;
73
+ toggle(forceFocus?: boolean): void;
74
+ close(): void;
75
+ render(width: number): string[];
76
+ private renderItem;
77
+ handleInput(data: string): void;
78
+ handleMouse(event: TuiMouseEvent): boolean;
79
+ private openItem;
80
+ private stopItem;
81
+ }
82
+ export declare class TaskStatusBarComponent implements Component {
83
+ private readonly pane;
84
+ constructor(pane: TasksPaneComponent);
85
+ render(width: number): string[];
86
+ handleMouse(event: TuiMouseEvent): boolean;
87
+ invalidate(): void;
88
+ }
@@ -0,0 +1,416 @@
1
+ import { matchesKey, truncateToWidth, visibleWidth, } from "@bubblebrain-ai/pi-tui";
2
+ import { darkTheme } from "../model/theme.js";
3
+ import { themeBackground, themeDim, themeForeground } from "../model/theme-style.js";
4
+ import { safeSheetText } from "./bottom-sheet.js";
5
+ import { latestSubagentNote, } from "../model/subagent-view.js";
6
+ const FINAL = new Set(["completed", "failed", "blocked", "cancelled", "closed", "killed"]);
7
+ const SPINNER = ["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"];
8
+ function isActive(status) {
9
+ return !FINAL.has(status);
10
+ }
11
+ function safe(value) {
12
+ return safeSheetText(value).replace(/[\r\n\t]+/g, " ").trim();
13
+ }
14
+ function pad(line, width) {
15
+ const clipped = truncateToWidth(line, width, "");
16
+ return clipped + " ".repeat(Math.max(0, width - visibleWidth(clipped)));
17
+ }
18
+ function paint(line, width, state, theme = darkTheme) {
19
+ const filled = pad(line, width);
20
+ if (state === "selected")
21
+ return themeBackground(theme.traceSelectedBg, filled);
22
+ if (state === "hover")
23
+ return themeBackground(theme.traceHoverBg, filled);
24
+ return filled;
25
+ }
26
+ function statusGlyph(status, frame, theme = darkTheme) {
27
+ if (status === "completed" || status === "closed")
28
+ return themeForeground(theme.success, "✓");
29
+ if (status === "failed" || status === "blocked")
30
+ return themeForeground(theme.error, "×");
31
+ if (status === "cancelled" || status === "killed")
32
+ return themeForeground(theme.muted, "■");
33
+ if (status === "queued")
34
+ return themeForeground(theme.muted, "○");
35
+ return themeForeground(theme.accent, SPINNER[frame % SPINNER.length]);
36
+ }
37
+ function elapsed(createdAt, updatedAt, active = true) {
38
+ if (!createdAt)
39
+ return "";
40
+ const ms = Math.max(0, (active ? Date.now() : updatedAt ?? Date.now()) - createdAt);
41
+ const seconds = Math.floor(ms / 1000);
42
+ if (seconds < 60)
43
+ return `${seconds}s`;
44
+ const minutes = Math.floor(seconds / 60);
45
+ return minutes < 60 ? `${minutes}m` : `${Math.floor(minutes / 60)}h${minutes % 60}m`;
46
+ }
47
+ function usageLabel(member) {
48
+ const usage = member.usage;
49
+ if (!usage)
50
+ return "";
51
+ const total = usage.promptTokens + usage.completionTokens;
52
+ return total >= 1000 ? `${(total / 1000).toFixed(total < 10_000 ? 1 : 0)}k` : String(total);
53
+ }
54
+ function workflowMembers(workflow, groups) {
55
+ if (workflow.snapshots.length > 0) {
56
+ return workflow.snapshots.map((snapshot) => ({
57
+ subAgentId: snapshot.agentId,
58
+ agentName: snapshot.agentName,
59
+ nickname: snapshot.nickname,
60
+ status: snapshot.status,
61
+ category: snapshot.category,
62
+ phase: snapshot.phase,
63
+ route: snapshot.route,
64
+ task: snapshot.task,
65
+ summary: snapshot.summary,
66
+ toolNotes: snapshot.toolNotes,
67
+ error: snapshot.error,
68
+ usage: snapshot.usage,
69
+ createdAt: snapshot.createdAt,
70
+ updatedAt: snapshot.updatedAt,
71
+ }));
72
+ }
73
+ return groups.find((group) => group.kind === "workflow" && group.runId === workflow.runId)?.members ?? [];
74
+ }
75
+ function normalize(snapshot, showHistory) {
76
+ const workflowItems = snapshot.workflows.map((workflow) => ({
77
+ kind: "workflow",
78
+ id: workflow.runId,
79
+ title: workflow.title,
80
+ status: workflow.status,
81
+ members: workflowMembers(workflow, snapshot.groups),
82
+ createdAt: workflow.createdAt,
83
+ updatedAt: workflow.updatedAt,
84
+ }));
85
+ const knownWorkflowRuns = new Set(snapshot.workflows.map((workflow) => workflow.runId));
86
+ for (const group of snapshot.groups) {
87
+ if (group.kind !== "workflow" || (group.runId && knownWorkflowRuns.has(group.runId)))
88
+ continue;
89
+ const statuses = group.members.map((member) => member.status ?? "running");
90
+ const status = statuses.some(isActive)
91
+ ? "running"
92
+ : statuses.some((value) => value === "failed" || value === "blocked") ? "failed" : "completed";
93
+ workflowItems.push({
94
+ kind: "workflow",
95
+ id: group.runId ?? group.id,
96
+ title: group.label,
97
+ status,
98
+ members: group.members,
99
+ createdAt: group.members.map((member) => member.createdAt).filter((value) => value !== undefined).sort()[0],
100
+ updatedAt: Math.max(0, ...group.members.map((member) => member.updatedAt ?? 0)),
101
+ });
102
+ }
103
+ const subagentItems = snapshot.groups
104
+ .filter((group) => group.kind !== "workflow")
105
+ .flatMap((group) => group.members.map((member) => ({
106
+ kind: "subagent",
107
+ id: member.subAgentId ?? group.id,
108
+ title: member.nickname ?? member.agentName ?? group.label,
109
+ status: member.status ?? "running",
110
+ member,
111
+ })));
112
+ const taskItems = snapshot.tasks.map((task) => ({
113
+ kind: "task",
114
+ id: task.id,
115
+ title: task.description || task.command,
116
+ status: task.status,
117
+ task,
118
+ }));
119
+ const filter = (items) => (showHistory ? items : items.filter((item) => isActive(item.status)))
120
+ .sort((left, right) => {
121
+ const activityOrder = Number(isActive(right.status)) - Number(isActive(left.status));
122
+ if (activityOrder !== 0)
123
+ return activityOrder;
124
+ return itemUpdatedAt(right) - itemUpdatedAt(left);
125
+ });
126
+ return {
127
+ workflows: filter(workflowItems),
128
+ subagents: filter(subagentItems),
129
+ tasks: filter(taskItems),
130
+ };
131
+ }
132
+ function itemUpdatedAt(item) {
133
+ if (item.kind === "workflow")
134
+ return item.updatedAt ?? item.createdAt ?? 0;
135
+ if (item.kind === "subagent")
136
+ return item.member.updatedAt ?? item.member.createdAt ?? 0;
137
+ return item.task.endedAt ?? item.task.startedAt;
138
+ }
139
+ export class TasksPaneComponent {
140
+ getSnapshot;
141
+ getTerminalRows;
142
+ callbacks;
143
+ getTheme;
144
+ focused = false;
145
+ open = false;
146
+ manuallyClosed = false;
147
+ showHistory = false;
148
+ selectedId;
149
+ hoveredId;
150
+ lastActiveCount = 0;
151
+ lastRows = [];
152
+ allRows = [];
153
+ frame = 0;
154
+ collapsed = new Set();
155
+ constructor(getSnapshot, getTerminalRows, callbacks, getTheme = () => darkTheme) {
156
+ this.getSnapshot = getSnapshot;
157
+ this.getTerminalRows = getTerminalRows;
158
+ this.callbacks = callbacks;
159
+ this.getTheme = getTheme;
160
+ }
161
+ isAnimationActive() {
162
+ return this.isAvailable() && this.activeCount() > 0;
163
+ }
164
+ advanceAnimationFrame() {
165
+ if (!this.isAnimationActive())
166
+ return false;
167
+ this.frame = (this.frame + 1) % SPINNER.length;
168
+ return true;
169
+ }
170
+ dispose() { }
171
+ invalidate() { }
172
+ isOpen() {
173
+ return this.open && this.getTerminalRows() >= 12;
174
+ }
175
+ isAvailable() {
176
+ return this.getTerminalRows() >= 12;
177
+ }
178
+ activeCount() {
179
+ const items = normalize(this.getSnapshot(), true);
180
+ return Object.values(items).flat().filter((item) => isActive(item.status)).length;
181
+ }
182
+ totalCount() {
183
+ const items = normalize(this.getSnapshot(), true);
184
+ return Object.values(items).flat().length;
185
+ }
186
+ activityGlyph() {
187
+ return SPINNER[this.frame % SPINNER.length];
188
+ }
189
+ theme() {
190
+ return this.getTheme();
191
+ }
192
+ toggle(forceFocus = false) {
193
+ if (this.open && !forceFocus) {
194
+ this.open = false;
195
+ this.manuallyClosed = true;
196
+ }
197
+ else {
198
+ this.open = true;
199
+ this.manuallyClosed = false;
200
+ // Once all activity has settled, Ctrl+G must remain a usable route back
201
+ // to the completed child transcript. Opening an empty active-only pane
202
+ // makes the work look lost even though the child session still exists.
203
+ if (this.activeCount() === 0 && this.totalCount() > 0)
204
+ this.showHistory = true;
205
+ }
206
+ this.callbacks.onRender();
207
+ }
208
+ close() {
209
+ this.open = false;
210
+ this.manuallyClosed = true;
211
+ this.callbacks.onRender();
212
+ }
213
+ render(width) {
214
+ const terminalRows = this.getTerminalRows();
215
+ if (terminalRows < 12) {
216
+ this.lastRows = [];
217
+ this.allRows = [];
218
+ return [];
219
+ }
220
+ const activeCount = this.activeCount();
221
+ if (activeCount > 0 && this.lastActiveCount === 0 && !this.manuallyClosed)
222
+ this.open = true;
223
+ if (activeCount === 0 && this.lastActiveCount > 0) {
224
+ if (this.focused) {
225
+ // A user who is already inspecting the pane should see the final
226
+ // status land in place instead of watching the selected row vanish.
227
+ this.showHistory = true;
228
+ }
229
+ else {
230
+ this.open = false;
231
+ this.manuallyClosed = false;
232
+ }
233
+ }
234
+ this.lastActiveCount = activeCount;
235
+ if (!this.open) {
236
+ this.lastRows = [];
237
+ this.allRows = [];
238
+ return [];
239
+ }
240
+ const items = normalize(this.getSnapshot(), this.showHistory);
241
+ const sections = [
242
+ ["workflows", "Workflows"],
243
+ ["subagents", "Subagents"],
244
+ ["tasks", "Tasks"],
245
+ ];
246
+ const rows = [];
247
+ for (const [section] of sections) {
248
+ if (items[section].length === 0)
249
+ continue;
250
+ rows.push({ kind: "header", section });
251
+ if (!this.collapsed.has(section))
252
+ rows.push(...items[section].map((item) => ({ kind: "item", item })));
253
+ }
254
+ const itemRows = rows.filter((row) => row.kind === "item");
255
+ this.allRows = rows;
256
+ if (!this.selectedId || !itemRows.some((row) => `${row.item.kind}:${row.item.id}` === this.selectedId)) {
257
+ this.selectedId = itemRows[0] ? `${itemRows[0].item.kind}:${itemRows[0].item.id}` : undefined;
258
+ }
259
+ const maxRows = Math.max(3, Math.min(8, Math.floor(terminalRows * 0.15)));
260
+ let start = 0;
261
+ const selectedIndex = rows.findIndex((row) => row.kind === "item" && `${row.item.kind}:${row.item.id}` === this.selectedId);
262
+ if (selectedIndex >= maxRows)
263
+ start = selectedIndex - maxRows + 1;
264
+ const visibleRows = rows.slice(start, start + maxRows);
265
+ this.lastRows = visibleRows;
266
+ const theme = this.getTheme();
267
+ return visibleRows.map((row) => {
268
+ if (row.kind === "header") {
269
+ const count = items[row.section].length;
270
+ const marker = this.collapsed.has(row.section) ? "▸" : "▾";
271
+ const label = sections.find(([section]) => section === row.section)?.[1] ?? row.section;
272
+ return themeDim(theme.dim, pad(` ${marker} ${label} ${count}`, width));
273
+ }
274
+ const key = `${row.item.kind}:${row.item.id}`;
275
+ const state = key === this.selectedId && this.focused ? "selected" : key === this.hoveredId ? "hover" : "idle";
276
+ return paint(this.renderItem(row.item, width), width, state, theme);
277
+ });
278
+ }
279
+ renderItem(item, width) {
280
+ const theme = this.getTheme();
281
+ const glyph = statusGlyph(item.status, this.frame, theme);
282
+ if (item.kind === "workflow") {
283
+ const done = item.members.filter((member) => !isActive(member.status ?? "running")).length;
284
+ const progress = item.members.length > 0 ? `${done}/${item.members.length}` : item.status;
285
+ const duration = elapsed(item.createdAt, item.updatedAt, isActive(item.status));
286
+ return truncateToWidth(` ${glyph} ${safe(item.title)} ${themeDim(theme.dim, `${progress}${duration ? ` · ${duration}` : ""}`)}${isActive(item.status) ? themeDim(theme.dim, " view ×") : themeDim(theme.dim, " view")}`, width, "");
287
+ }
288
+ if (item.kind === "task") {
289
+ const duration = elapsed(item.task.startedAt, item.task.endedAt, isActive(item.status));
290
+ const lineCount = `${item.task.outputLines} line${item.task.outputLines === 1 ? "" : "s"}`;
291
+ return truncateToWidth(` ${glyph} ${safe(item.title)} ${themeDim(theme.dim, `${item.status}${duration ? ` · ${duration}` : ""} · ${lineCount}`)}${isActive(item.status) ? themeDim(theme.dim, " view ×") : themeDim(theme.dim, " view")}`, width, "");
292
+ }
293
+ const member = item.member;
294
+ const activity = latestSubagentNote(member);
295
+ const model = member.route?.model ?? member.agentName ?? "";
296
+ const tokens = usageLabel(member);
297
+ const duration = elapsed(member.createdAt, member.updatedAt, isActive(item.status));
298
+ const meta = [model, tokens ? `${tokens} tok` : "", duration].filter(Boolean).join(" · ");
299
+ const detail = activity ? ` — ${safe(activity)}` : "";
300
+ return truncateToWidth(` ${glyph} ${safe(item.title)}${detail} ${themeDim(theme.dim, meta)}${isActive(item.status) ? themeDim(theme.dim, " view ×") : themeDim(theme.dim, " view")}`, width, "");
301
+ }
302
+ handleInput(data) {
303
+ if (matchesKey(data, "escape")) {
304
+ this.focused = false;
305
+ this.callbacks.onEscape();
306
+ return;
307
+ }
308
+ if (data === "h") {
309
+ this.showHistory = !this.showHistory;
310
+ this.callbacks.onRender();
311
+ return;
312
+ }
313
+ const itemRows = this.allRows.filter((row) => row.kind === "item");
314
+ const index = Math.max(0, itemRows.findIndex((row) => `${row.item.kind}:${row.item.id}` === this.selectedId));
315
+ if (matchesKey(data, "up") || data === "k") {
316
+ const row = itemRows[Math.max(0, index - 1)];
317
+ if (row)
318
+ this.selectedId = `${row.item.kind}:${row.item.id}`;
319
+ this.callbacks.onRender();
320
+ return;
321
+ }
322
+ if (matchesKey(data, "down") || data === "j") {
323
+ const row = itemRows[Math.min(itemRows.length - 1, index + 1)];
324
+ if (row)
325
+ this.selectedId = `${row.item.kind}:${row.item.id}`;
326
+ this.callbacks.onRender();
327
+ return;
328
+ }
329
+ const selected = itemRows.find((row) => `${row.item.kind}:${row.item.id}` === this.selectedId)?.item;
330
+ if ((matchesKey(data, "left") || matchesKey(data, "right")) && selected) {
331
+ const section = selected.kind === "workflow" ? "workflows" : selected.kind === "subagent" ? "subagents" : "tasks";
332
+ if (matchesKey(data, "left"))
333
+ this.collapsed.add(section);
334
+ else
335
+ this.collapsed.delete(section);
336
+ this.callbacks.onRender();
337
+ return;
338
+ }
339
+ if ((matchesKey(data, "enter") || matchesKey(data, "ctrl+f")) && selected)
340
+ this.openItem(selected);
341
+ if (data === "x" && selected && isActive(selected.status))
342
+ this.stopItem(selected);
343
+ if (data === "y" && selected?.kind === "task")
344
+ this.callbacks.onCopyTaskOutput?.(selected.id);
345
+ }
346
+ handleMouse(event) {
347
+ if (event.kind === "leave") {
348
+ const changed = this.hoveredId !== undefined;
349
+ this.hoveredId = undefined;
350
+ return changed;
351
+ }
352
+ const row = this.lastRows[event.y];
353
+ if (event.kind === "move") {
354
+ const next = row?.kind === "item" ? `${row.item.kind}:${row.item.id}` : undefined;
355
+ const changed = next !== this.hoveredId;
356
+ this.hoveredId = next;
357
+ return changed;
358
+ }
359
+ if (event.release || (event.button & 3) !== 0 || !row)
360
+ return false;
361
+ if (row.kind === "header") {
362
+ if (this.collapsed.has(row.section))
363
+ this.collapsed.delete(row.section);
364
+ else
365
+ this.collapsed.add(row.section);
366
+ return true;
367
+ }
368
+ this.selectedId = `${row.item.kind}:${row.item.id}`;
369
+ if (event.clickCount >= 2)
370
+ this.openItem(row.item);
371
+ return true;
372
+ }
373
+ openItem(item) {
374
+ if (item.kind === "workflow")
375
+ this.callbacks.onOpenWorkflow(item);
376
+ else if (item.kind === "subagent")
377
+ this.callbacks.onOpenSubagent(item);
378
+ else
379
+ this.callbacks.onOpenTask(item);
380
+ }
381
+ stopItem(item) {
382
+ if (item.kind === "workflow")
383
+ this.callbacks.onStopWorkflow(item.id);
384
+ else if (item.kind === "subagent")
385
+ this.callbacks.onStopSubagent(item.id);
386
+ else
387
+ this.callbacks.onStopTask(item.id);
388
+ }
389
+ }
390
+ export class TaskStatusBarComponent {
391
+ pane;
392
+ constructor(pane) {
393
+ this.pane = pane;
394
+ }
395
+ render(width) {
396
+ if (!this.pane.isAvailable())
397
+ return [];
398
+ const count = this.pane.activeCount();
399
+ const total = this.pane.totalCount();
400
+ if (total === 0 && !this.pane.isOpen())
401
+ return [];
402
+ const marker = this.pane.isOpen() ? "▾" : "▸";
403
+ const theme = this.pane.theme();
404
+ const text = count > 0
405
+ ? `${marker} ${themeForeground(theme.accent, this.pane.activityGlyph())} ${count} background activit${count === 1 ? "y" : "ies"} · Ctrl+G`
406
+ : `${marker} ${themeForeground(theme.success, "✓")} ${total} completed activit${total === 1 ? "y" : "ies"} · Ctrl+G`;
407
+ return [themeDim(theme.dim, truncateToWidth(` ${text}`, Math.max(1, width), ""))];
408
+ }
409
+ handleMouse(event) {
410
+ if (event.kind !== "press" || event.release || (event.button & 3) !== 0)
411
+ return false;
412
+ this.pane.toggle();
413
+ return true;
414
+ }
415
+ invalidate() { }
416
+ }
@@ -0,0 +1,96 @@
1
+ import { DisplayToolCall, DisplayMessage } from "../model/display-history.js";
2
+ import { type Theme } from "../model/theme.js";
3
+ import type { TraceInteractionState, TraceRowTarget } from "../model/trace-interaction.js";
4
+ import type { DisplayImageAttachment } from "../model/image-attachment.js";
5
+ export interface TranscriptRenderOptions {
6
+ columns: number;
7
+ showReasoning?: boolean;
8
+ verboseTrace?: boolean;
9
+ theme?: TranscriptTheme;
10
+ /** Optional markdown pipeline for assistant content (app injects pi-tui's
11
+ * Markdown component; the default is plain wrapped text). */
12
+ markdownRenderer?: (text: string, width: number) => string[];
13
+ /** Shared UI-only selection/fold state for interactive tool groups. */
14
+ traceInteraction?: TraceInteractionState;
15
+ /** Keep a final transcript spacer; fullscreen disables it once no live tail follows. */
16
+ trailingSpacer?: boolean;
17
+ /** Preview a destructive rewrite by dimming this message and everything after it. */
18
+ dimFromMessageIndex?: number;
19
+ }
20
+ export interface TranscriptProjection {
21
+ rows: string[];
22
+ /** Row-aligned pointer targets; undefined rows remain ordinary selectable text. */
23
+ traceTargets: Array<TraceRowTarget | undefined>;
24
+ /** Semantic padding survives hover painting, so joins never add/remove rows. */
25
+ leadingSpacer?: boolean;
26
+ trailingSpacer?: boolean;
27
+ }
28
+ export declare function joinTranscriptProjections(blocks: readonly TranscriptProjection[]): TranscriptProjection;
29
+ export interface TranscriptTheme {
30
+ userBg: (text: string) => string;
31
+ userText: (text: string) => string;
32
+ accent: (text: string) => string;
33
+ dim: (text: string) => string;
34
+ error: (text: string) => string;
35
+ success: (text: string) => string;
36
+ /** Dim chrome used by Grok-style pointer hover around tool entries. */
37
+ hoverBorder?: (text: string) => string;
38
+ /** Brighter chrome used by Grok for the selected scrollback entry. */
39
+ selectionBorder?: (text: string) => string;
40
+ /** Full-width neutral surface painted inside a hovered tool entry. */
41
+ hoverBackground?: (text: string) => string;
42
+ /** Persistent surface painted while the tool entry is selected. */
43
+ selectionBackground?: (text: string) => string;
44
+ imageChip?: (text: string, active: boolean) => string;
45
+ }
46
+ export declare function createTranscriptTheme(getTheme: () => Theme): TranscriptTheme;
47
+ export declare const defaultTranscriptTheme: TranscriptTheme;
48
+ export declare function renderUserCard(content: string, options: TranscriptRenderOptions, images?: readonly DisplayImageAttachment[], messageKey?: string): string[];
49
+ export declare function wrapPlain(text: string, columns: number): string[];
50
+ /**
51
+ * Project assistant prose without transcript spacing. Live streaming and
52
+ * settled history both call this function, so completing a turn cannot change
53
+ * the answer gutter or wrapping width.
54
+ */
55
+ export declare function projectAssistantRows(content: string, options: TranscriptRenderOptions): string[];
56
+ export declare function renderAssistant(content: string, options: TranscriptRenderOptions): string[];
57
+ /**
58
+ * Join reasoning, tool, and prose surfaces with one semantic separator.
59
+ * Individual projectors own only their visible rows; this composition layer
60
+ * owns vertical rhythm, so live and settled timelines cannot drift apart.
61
+ */
62
+ export declare function joinTranscriptBlocks(blocks: readonly (readonly string[])[]): string[];
63
+ export interface ReasoningProjectionOptions {
64
+ /** In-flight reasoning uses the only stateful visual difference Grok keeps. */
65
+ running?: boolean;
66
+ /** Maximum number of physical reasoning body rows. */
67
+ maxBodyRows?: number;
68
+ /** Minimal reasoning keeps the newest rows in both live and settled states. */
69
+ fromEnd?: boolean;
70
+ }
71
+ /** Grok minimal mode keeps the same rolling reasoning surface live/settled. */
72
+ export declare const MINIMAL_REASONING_BODY_ROWS = 5;
73
+ /**
74
+ * Grok-style reasoning surface. Reasoning alone owns a one-cell rail; normal
75
+ * assistant prose never inherits this gutter. The same projection is used by
76
+ * the live row pool and committed transcript.
77
+ */
78
+ export declare function projectReasoningRows(content: string, options: TranscriptRenderOptions, projection?: ReasoningProjectionOptions): string[];
79
+ export declare function renderReasoning(content: string, options: TranscriptRenderOptions): string[];
80
+ export declare function renderToolTrace(tool: DisplayToolCall, options: TranscriptRenderOptions): string;
81
+ export interface TraceGroupRenderOptions {
82
+ /** Live Ink parity: identify the last group that is actually still active. */
83
+ showActivity?: boolean;
84
+ }
85
+ /**
86
+ * Render the same semantic trace groups used by the Ink TUI. This is shared
87
+ * by the live row pool and settled transcript so tool_start/tool_update/
88
+ * tool_end cannot change from a rich trace into an unrelated one-line row at
89
+ * the commit boundary.
90
+ */
91
+ export declare function renderToolTraceGroups(toolCalls: readonly DisplayToolCall[], options: TranscriptRenderOptions, renderOptions?: TraceGroupRenderOptions): string[];
92
+ export declare function projectToolTraceGroups(toolCalls: readonly DisplayToolCall[], options: TranscriptRenderOptions, renderOptions?: TraceGroupRenderOptions): TranscriptProjection;
93
+ export declare function renderMessage(message: DisplayMessage, options: TranscriptRenderOptions): string[];
94
+ export declare function projectMessage(message: DisplayMessage, options: TranscriptRenderOptions): TranscriptProjection;
95
+ export declare function renderTranscript(messages: readonly DisplayMessage[], options: TranscriptRenderOptions): string[];
96
+ export declare function projectTranscript(messages: readonly DisplayMessage[], options: TranscriptRenderOptions): TranscriptProjection;