@bubblebrain-ai/bubble 0.0.51 → 0.0.53

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 (481) 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 +80 -11
  49. package/dist/provider-transform.js +32 -4
  50. package/dist/provider.d.ts +6 -2
  51. package/dist/provider.js +100 -11
  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/node_modules/@bubblebrain-ai/pi-tui/LICENSE +21 -0
  213. package/node_modules/@bubblebrain-ai/pi-tui/README.md +854 -0
  214. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/alt-screen-search.d.ts +26 -0
  215. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/alt-screen-search.d.ts.map +1 -0
  216. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/alt-screen-search.js +121 -0
  217. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/alt-screen-search.js.map +1 -0
  218. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/autocomplete.d.ts +86 -0
  219. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/autocomplete.d.ts.map +1 -0
  220. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/autocomplete.js +649 -0
  221. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/autocomplete.js.map +1 -0
  222. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/alt-screen-flash.d.ts +13 -0
  223. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/alt-screen-flash.d.ts.map +1 -0
  224. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/alt-screen-flash.js +36 -0
  225. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/alt-screen-flash.js.map +1 -0
  226. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/box.d.ts +22 -0
  227. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/box.d.ts.map +1 -0
  228. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/box.js +99 -0
  229. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/box.js.map +1 -0
  230. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/cancellable-loader.d.ts +22 -0
  231. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/cancellable-loader.d.ts.map +1 -0
  232. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/cancellable-loader.js +36 -0
  233. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/cancellable-loader.js.map +1 -0
  234. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/editor.d.ts +330 -0
  235. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/editor.d.ts.map +1 -0
  236. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/editor.js +2344 -0
  237. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/editor.js.map +1 -0
  238. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/h-stack.d.ts +7 -0
  239. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/h-stack.d.ts.map +1 -0
  240. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/h-stack.js +43 -0
  241. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/h-stack.js.map +1 -0
  242. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/image.d.ts +28 -0
  243. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/image.d.ts.map +1 -0
  244. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/image.js +82 -0
  245. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/image.js.map +1 -0
  246. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/input.d.ts +48 -0
  247. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/input.d.ts.map +1 -0
  248. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/input.js +390 -0
  249. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/input.js.map +1 -0
  250. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/loader.d.ts +31 -0
  251. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/loader.d.ts.map +1 -0
  252. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/loader.js +67 -0
  253. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/loader.js.map +1 -0
  254. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/markdown.d.ts +103 -0
  255. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/markdown.d.ts.map +1 -0
  256. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/markdown.js +797 -0
  257. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/markdown.js.map +1 -0
  258. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/scroll-view.d.ts +56 -0
  259. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/scroll-view.d.ts.map +1 -0
  260. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/scroll-view.js +179 -0
  261. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/scroll-view.js.map +1 -0
  262. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/select-list.d.ts +53 -0
  263. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/select-list.d.ts.map +1 -0
  264. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/select-list.js +175 -0
  265. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/select-list.js.map +1 -0
  266. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/settings-list.d.ts +50 -0
  267. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/settings-list.d.ts.map +1 -0
  268. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/settings-list.js +174 -0
  269. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/settings-list.js.map +1 -0
  270. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/spacer.d.ts +12 -0
  271. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/spacer.d.ts.map +1 -0
  272. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/spacer.js +22 -0
  273. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/spacer.js.map +1 -0
  274. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/stack.d.ts +32 -0
  275. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/stack.d.ts.map +1 -0
  276. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/stack.js +109 -0
  277. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/stack.js.map +1 -0
  278. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/text.d.ts +19 -0
  279. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/text.d.ts.map +1 -0
  280. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/text.js +81 -0
  281. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/text.js.map +1 -0
  282. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/truncated-text.d.ts +13 -0
  283. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/truncated-text.d.ts.map +1 -0
  284. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/truncated-text.js +48 -0
  285. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/truncated-text.js.map +1 -0
  286. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/v-stack.d.ts +8 -0
  287. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/v-stack.d.ts.map +1 -0
  288. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/v-stack.js +26 -0
  289. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/v-stack.js.map +1 -0
  290. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/editor-component.d.ts +39 -0
  291. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/editor-component.d.ts.map +1 -0
  292. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/editor-component.js +2 -0
  293. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/editor-component.js.map +1 -0
  294. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/fuzzy.d.ts +16 -0
  295. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/fuzzy.d.ts.map +1 -0
  296. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/fuzzy.js +110 -0
  297. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/fuzzy.js.map +1 -0
  298. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/index.d.ts +31 -0
  299. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/index.d.ts.map +1 -0
  300. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/index.js +42 -0
  301. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/index.js.map +1 -0
  302. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/keybindings.d.ts +273 -0
  303. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/keybindings.d.ts.map +1 -0
  304. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/keybindings.js +231 -0
  305. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/keybindings.js.map +1 -0
  306. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/keys.d.ts +184 -0
  307. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/keys.d.ts.map +1 -0
  308. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/keys.js +1174 -0
  309. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/keys.js.map +1 -0
  310. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/kill-ring.d.ts +28 -0
  311. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/kill-ring.d.ts.map +1 -0
  312. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/kill-ring.js +46 -0
  313. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/kill-ring.js.map +1 -0
  314. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/latex.d.ts +10 -0
  315. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/latex.d.ts.map +1 -0
  316. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/latex.js +1268 -0
  317. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/latex.js.map +1 -0
  318. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/layout-node.d.ts +40 -0
  319. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/layout-node.d.ts.map +1 -0
  320. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/layout-node.js +6 -0
  321. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/layout-node.js.map +1 -0
  322. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/layout.d.ts +42 -0
  323. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/layout.d.ts.map +1 -0
  324. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/layout.js +335 -0
  325. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/layout.js.map +1 -0
  326. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/native-modifiers.d.ts +3 -0
  327. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/native-modifiers.d.ts.map +1 -0
  328. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/native-modifiers.js +60 -0
  329. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/native-modifiers.js.map +1 -0
  330. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/stdin-buffer.d.ts +56 -0
  331. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/stdin-buffer.d.ts.map +1 -0
  332. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/stdin-buffer.js +363 -0
  333. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/stdin-buffer.js.map +1 -0
  334. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/terminal-colors.d.ts +10 -0
  335. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/terminal-colors.d.ts.map +1 -0
  336. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/terminal-colors.js +59 -0
  337. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/terminal-colors.js.map +1 -0
  338. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/terminal-image.d.ts +116 -0
  339. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/terminal-image.d.ts.map +1 -0
  340. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/terminal-image.js +518 -0
  341. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/terminal-image.js.map +1 -0
  342. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/terminal.d.ts +142 -0
  343. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/terminal.d.ts.map +1 -0
  344. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/terminal.js +544 -0
  345. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/terminal.js.map +1 -0
  346. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/testing.d.ts +11 -0
  347. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/testing.d.ts.map +1 -0
  348. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/testing.js +11 -0
  349. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/testing.js.map +1 -0
  350. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/tui-alt-screen.d.ts +140 -0
  351. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/tui-alt-screen.d.ts.map +1 -0
  352. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/tui-alt-screen.js +1334 -0
  353. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/tui-alt-screen.js.map +1 -0
  354. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/tui-main-screen.d.ts +39 -0
  355. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/tui-main-screen.d.ts.map +1 -0
  356. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/tui-main-screen.js +536 -0
  357. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/tui-main-screen.js.map +1 -0
  358. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/tui.d.ts +338 -0
  359. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/tui.d.ts.map +1 -0
  360. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/tui.js +1016 -0
  361. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/tui.js.map +1 -0
  362. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/undo-stack.d.ts +17 -0
  363. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/undo-stack.d.ts.map +1 -0
  364. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/undo-stack.js +27 -0
  365. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/undo-stack.js.map +1 -0
  366. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/utils.d.ts +96 -0
  367. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/utils.d.ts.map +1 -0
  368. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/utils.js +1193 -0
  369. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/utils.js.map +1 -0
  370. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/word-navigation.d.ts +25 -0
  371. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/word-navigation.d.ts.map +1 -0
  372. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/word-navigation.js +96 -0
  373. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/word-navigation.js.map +1 -0
  374. package/node_modules/@bubblebrain-ai/pi-tui/dist/test/virtual-terminal.d.ts +73 -0
  375. package/node_modules/@bubblebrain-ai/pi-tui/dist/test/virtual-terminal.d.ts.map +1 -0
  376. package/node_modules/@bubblebrain-ai/pi-tui/dist/test/virtual-terminal.js +188 -0
  377. package/node_modules/@bubblebrain-ai/pi-tui/dist/test/virtual-terminal.js.map +1 -0
  378. package/node_modules/@bubblebrain-ai/pi-tui/native/darwin/README.md +20 -0
  379. package/node_modules/@bubblebrain-ai/pi-tui/native/darwin/build.sh +62 -0
  380. package/node_modules/@bubblebrain-ai/pi-tui/native/darwin/prebuilds/darwin-arm64/darwin-modifiers.node +0 -0
  381. package/node_modules/@bubblebrain-ai/pi-tui/native/darwin/prebuilds/darwin-x64/darwin-modifiers.node +0 -0
  382. package/node_modules/@bubblebrain-ai/pi-tui/native/darwin/src/darwin-modifiers.c +70 -0
  383. package/node_modules/@bubblebrain-ai/pi-tui/native/win32/README.md +22 -0
  384. package/node_modules/@bubblebrain-ai/pi-tui/native/win32/build.mjs +229 -0
  385. package/node_modules/@bubblebrain-ai/pi-tui/native/win32/prebuilds/win32-arm64/win32-console-mode.node +0 -0
  386. package/node_modules/@bubblebrain-ai/pi-tui/native/win32/prebuilds/win32-x64/win32-console-mode.node +0 -0
  387. package/node_modules/@bubblebrain-ai/pi-tui/native/win32/src/win32-console-mode.c +119 -0
  388. package/node_modules/@bubblebrain-ai/pi-tui/package.json +66 -0
  389. package/node_modules/get-east-asian-width/index.d.ts +60 -0
  390. package/node_modules/get-east-asian-width/index.js +30 -0
  391. package/node_modules/get-east-asian-width/license +9 -0
  392. package/node_modules/get-east-asian-width/lookup-data.js +21 -0
  393. package/node_modules/get-east-asian-width/lookup.js +138 -0
  394. package/node_modules/get-east-asian-width/package.json +71 -0
  395. package/node_modules/get-east-asian-width/readme.md +65 -0
  396. package/node_modules/get-east-asian-width/utilities.js +24 -0
  397. package/package.json +23 -10
  398. package/packages/pi-tui/node_modules/marked/LICENSE +44 -0
  399. package/packages/pi-tui/node_modules/marked/README.md +115 -0
  400. package/packages/pi-tui/node_modules/marked/bin/main.js +284 -0
  401. package/packages/pi-tui/node_modules/marked/bin/marked.js +16 -0
  402. package/packages/pi-tui/node_modules/marked/lib/marked.d.ts +760 -0
  403. package/packages/pi-tui/node_modules/marked/lib/marked.esm.js +77 -0
  404. package/packages/pi-tui/node_modules/marked/lib/marked.esm.js.map +7 -0
  405. package/packages/pi-tui/node_modules/marked/lib/marked.umd.js +79 -0
  406. package/packages/pi-tui/node_modules/marked/lib/marked.umd.js.map +7 -0
  407. package/packages/pi-tui/node_modules/marked/man/marked.1 +113 -0
  408. package/packages/pi-tui/node_modules/marked/man/marked.1.md +93 -0
  409. package/packages/pi-tui/node_modules/marked/package.json +103 -0
  410. package/dist/tui-ink/app.d.ts +0 -76
  411. package/dist/tui-ink/app.js +0 -2377
  412. package/dist/tui-ink/approval/approval-dialog.d.ts +0 -13
  413. package/dist/tui-ink/approval/approval-dialog.js +0 -184
  414. package/dist/tui-ink/approval/diff-view.d.ts +0 -7
  415. package/dist/tui-ink/approval/diff-view.js +0 -44
  416. package/dist/tui-ink/approval/select.d.ts +0 -35
  417. package/dist/tui-ink/approval/select.js +0 -98
  418. package/dist/tui-ink/code-highlight.d.ts +0 -8
  419. package/dist/tui-ink/code-highlight.js +0 -121
  420. package/dist/tui-ink/command-palette.d.ts +0 -32
  421. package/dist/tui-ink/command-palette.js +0 -158
  422. package/dist/tui-ink/compaction-progress.d.ts +0 -19
  423. package/dist/tui-ink/compaction-progress.js +0 -74
  424. package/dist/tui-ink/detect-theme.d.ts +0 -1
  425. package/dist/tui-ink/detect-theme.js +0 -1
  426. package/dist/tui-ink/feedback-dialog.d.ts +0 -19
  427. package/dist/tui-ink/feedback-dialog.js +0 -133
  428. package/dist/tui-ink/feishu-setup-picker.d.ts +0 -5
  429. package/dist/tui-ink/feishu-setup-picker.js +0 -271
  430. package/dist/tui-ink/footer.d.ts +0 -26
  431. package/dist/tui-ink/footer.js +0 -51
  432. package/dist/tui-ink/input-box.d.ts +0 -189
  433. package/dist/tui-ink/input-box.js +0 -1279
  434. package/dist/tui-ink/input-history.d.ts +0 -1
  435. package/dist/tui-ink/input-history.js +0 -1
  436. package/dist/tui-ink/markdown.d.ts +0 -103
  437. package/dist/tui-ink/markdown.js +0 -747
  438. package/dist/tui-ink/message-list.d.ts +0 -49
  439. package/dist/tui-ink/message-list.js +0 -841
  440. package/dist/tui-ink/model-picker.d.ts +0 -143
  441. package/dist/tui-ink/model-picker.js +0 -966
  442. package/dist/tui-ink/plan-confirm.d.ts +0 -7
  443. package/dist/tui-ink/plan-confirm.js +0 -115
  444. package/dist/tui-ink/question-dialog.d.ts +0 -8
  445. package/dist/tui-ink/question-dialog.js +0 -135
  446. package/dist/tui-ink/rewind-picker.d.ts +0 -8
  447. package/dist/tui-ink/rewind-picker.js +0 -102
  448. package/dist/tui-ink/run-session-picker.js +0 -22
  449. package/dist/tui-ink/run.d.ts +0 -62
  450. package/dist/tui-ink/run.js +0 -103
  451. package/dist/tui-ink/session-picker.d.ts +0 -10
  452. package/dist/tui-ink/session-picker.js +0 -113
  453. package/dist/tui-ink/stats-panel.d.ts +0 -11
  454. package/dist/tui-ink/stats-panel.js +0 -65
  455. package/dist/tui-ink/subagent-inspector.d.ts +0 -21
  456. package/dist/tui-ink/subagent-inspector.js +0 -205
  457. package/dist/tui-ink/use-terminal-size.d.ts +0 -4
  458. package/dist/tui-ink/use-terminal-size.js +0 -48
  459. package/dist/tui-ink/waiting-indicator.d.ts +0 -12
  460. package/dist/tui-ink/waiting-indicator.js +0 -129
  461. package/dist/tui-ink/welcome.d.ts +0 -25
  462. package/dist/tui-ink/welcome.js +0 -88
  463. package/dist/tui-ink/wordmark.d.ts +0 -8
  464. package/dist/tui-ink/wordmark.js +0 -103
  465. /package/dist/{tui-ink → tui/model}/composer-buffer.d.ts +0 -0
  466. /package/dist/{tui-ink → tui/model}/display-history.js +0 -0
  467. /package/dist/{tui-ink → tui/model}/input-queue.js +0 -0
  468. /package/dist/{tui-ink → tui/model}/key-events.d.ts +0 -0
  469. /package/dist/{tui-ink → tui/model}/key-events.js +0 -0
  470. /package/dist/{tui-ink → tui/model}/paste-operation-tracker.d.ts +0 -0
  471. /package/dist/{tui-ink → tui/model}/paste-operation-tracker.js +0 -0
  472. /package/dist/{tui-ink → tui/model}/recent-activity.d.ts +0 -0
  473. /package/dist/{tui-ink → tui/model}/submit-dedupe.js +0 -0
  474. /package/dist/{tui-ink → tui/model}/sync-output.d.ts +0 -0
  475. /package/dist/{tui-ink → tui/model}/sync-output.js +0 -0
  476. /package/dist/{tui-ink → tui/model}/terminal-env.d.ts +0 -0
  477. /package/dist/{tui-ink → tui/model}/terminal-env.js +0 -0
  478. /package/dist/{tui-ink → tui/model}/terminal-mouse.d.ts +0 -0
  479. /package/dist/{tui-ink → tui/model}/terminal-mouse.js +0 -0
  480. /package/dist/{tui-ink → tui/model}/width.d.ts +0 -0
  481. /package/dist/{tui-ink → tui/model}/width.js +0 -0
@@ -0,0 +1,383 @@
1
+ import { CombinedAutocompleteProvider, } from "@bubblebrain-ai/pi-tui";
2
+ import { BUILTIN_PROVIDERS, encodeModel, isUserVisibleProvider, } from "../provider-registry.js";
3
+ import { getAvailableThinkingLevels, isThinkingToggleModel, normalizeThinkingLevel, } from "../provider-transform.js";
4
+ import { discoverModelProviderGroups, getVisibleModelProviders, localModelsForProvider, } from "./model-picker-data.js";
5
+ const MODEL_COMMAND_PREFIX = "/model ";
6
+ const REASONING_EFFORT_SEPARATOR = " --reasoning-effort ";
7
+ const PROVIDER_COMMAND_PREFIX = "/provider ";
8
+ const THEME_COMMAND_PREFIX = "/theme ";
9
+ const EFFORT_DESCRIPTIONS = {
10
+ off: "no reasoning effort",
11
+ minimal: "fastest reasoning",
12
+ low: "light reasoning",
13
+ medium: "balanced reasoning",
14
+ high: "deeper reasoning",
15
+ xhigh: "extra high reasoning",
16
+ max: "maximum provider effort",
17
+ ultra: "maximum effort with delegation",
18
+ };
19
+ function selectableModels(groups) {
20
+ const seen = new Set();
21
+ const selections = [];
22
+ for (const { provider, models } of groups) {
23
+ for (const model of models) {
24
+ const value = encodeModel(provider.id, model.id);
25
+ if (seen.has(value))
26
+ continue;
27
+ seen.add(value);
28
+ const declaredLevels = model.reasoningLevels ?? getAvailableThinkingLevels(provider.id, model.id);
29
+ selections.push({
30
+ provider,
31
+ model,
32
+ value,
33
+ levels: declaredLevels.length > 0 ? declaredLevels : ["off"],
34
+ });
35
+ }
36
+ }
37
+ return selections;
38
+ }
39
+ function preferredThinkingLevel(selection, current) {
40
+ if (selection.levels.includes(current))
41
+ return current;
42
+ if (selection.model.defaultReasoningLevel &&
43
+ selection.levels.includes(selection.model.defaultReasoningLevel)) {
44
+ return selection.model.defaultReasoningLevel;
45
+ }
46
+ return normalizeThinkingLevel(current, selection.levels);
47
+ }
48
+ function effortPhase(selections, argumentPrefix) {
49
+ const separatorIndex = argumentPrefix.indexOf(REASONING_EFFORT_SEPARATOR);
50
+ if (separatorIndex < 0)
51
+ return null;
52
+ const modelValue = argumentPrefix.slice(0, separatorIndex);
53
+ const selection = selections.find((candidate) => candidate.value === modelValue);
54
+ if (!selection || selection.levels.length <= 1)
55
+ return null;
56
+ return {
57
+ selection,
58
+ query: argumentPrefix.slice(separatorIndex + REASONING_EFFORT_SEPARATOR.length),
59
+ };
60
+ }
61
+ function modelCatalogKey(groups) {
62
+ return JSON.stringify(groups.map(({ provider, models }) => [
63
+ provider.id,
64
+ provider.baseURL,
65
+ provider.authType ?? "api",
66
+ provider.protocol ?? "default",
67
+ provider.apiKey,
68
+ models.map((model) => [
69
+ model.id,
70
+ model.name,
71
+ model.reasoningLevels,
72
+ model.defaultReasoningLevel,
73
+ model.contextWindow,
74
+ model.useResponsesLite,
75
+ model.toolOutputTokenLimit,
76
+ model.tier,
77
+ ]),
78
+ ]));
79
+ }
80
+ export function buildModelAutocompleteItems(groups, argumentPrefix = "", currentThinkingLevel = "off") {
81
+ const selections = selectableModels(groups);
82
+ const effort = effortPhase(selections, argumentPrefix);
83
+ if (effort) {
84
+ const toggle = isThinkingToggleModel(effort.selection.provider.id, effort.selection.model.id);
85
+ const query = effort.query.trim().toLowerCase();
86
+ const baseValue = `${effort.selection.value}${REASONING_EFFORT_SEPARATOR}`;
87
+ return effort.selection.levels.flatMap((level) => {
88
+ const label = toggle ? (level === "off" ? "off" : "on") : level;
89
+ const description = toggle
90
+ ? (level === "off" ? "thinking disabled" : "thinking enabled")
91
+ : EFFORT_DESCRIPTIONS[level];
92
+ if (query && !`${label} ${level} ${description}`.toLowerCase().includes(query))
93
+ return [];
94
+ return [{
95
+ value: `${baseValue}${level}`,
96
+ label,
97
+ description,
98
+ submitOnSelect: true,
99
+ }];
100
+ });
101
+ }
102
+ const query = argumentPrefix.trim().toLowerCase();
103
+ const items = [];
104
+ for (const selection of selections) {
105
+ const { provider, model, value, levels } = selection;
106
+ const label = model.name || model.id;
107
+ const description = label === model.id
108
+ ? provider.name
109
+ : `${provider.name} · ${model.id}`;
110
+ const searchable = `${value} ${label} ${description}`.toLowerCase();
111
+ if (query && !searchable.includes(query))
112
+ continue;
113
+ const level = preferredThinkingLevel(selection, currentThinkingLevel);
114
+ items.push({
115
+ value: levels.length > 1
116
+ ? `${value}${REASONING_EFFORT_SEPARATOR}`
117
+ : `${value}${REASONING_EFFORT_SEPARATOR}${level}`,
118
+ label,
119
+ description,
120
+ submitOnSelect: levels.length <= 1,
121
+ });
122
+ }
123
+ return items;
124
+ }
125
+ export function buildProviderAutocompleteItems(registry, argumentPrefix = "", currentProviderId) {
126
+ const query = argumentPrefix.trim().toLowerCase();
127
+ if (query.startsWith("--"))
128
+ return [];
129
+ const configured = registry.getConfigured();
130
+ const configuredById = new Map(configured.map((provider) => [provider.id, provider]));
131
+ const seen = new Set();
132
+ const candidates = [
133
+ ...BUILTIN_PROVIDERS.filter((provider) => isUserVisibleProvider(provider.id)),
134
+ ...configured.filter((provider) => isUserVisibleProvider(provider.id)),
135
+ ];
136
+ return candidates.flatMap((provider) => {
137
+ if (seen.has(provider.id))
138
+ return [];
139
+ seen.add(provider.id);
140
+ const profile = configuredById.get(provider.id);
141
+ const builtin = BUILTIN_PROVIDERS.find((candidate) => candidate.id === provider.id);
142
+ const managedByFile = registry.getModelConfig().hasProvider(provider.id);
143
+ const status = profile?.apiKey
144
+ ? (profile.authType === "oauth" ? "OAuth connected" : "Configured")
145
+ : builtin?.supportsOAuth
146
+ ? "OAuth available"
147
+ : "Needs API key";
148
+ const current = provider.id === currentProviderId;
149
+ const action = profile?.apiKey || provider.id === "grok" ? "--set" : "--add";
150
+ const source = managedByFile ? " · models.json" : "";
151
+ const description = `${current ? "Current · " : ""}${provider.id} · ${status}${source}`;
152
+ const searchable = `${provider.id} ${provider.name} ${description}`.toLowerCase();
153
+ if (query && !searchable.includes(query))
154
+ return [];
155
+ return [{
156
+ value: `${action} ${provider.id}`,
157
+ label: provider.name,
158
+ description,
159
+ submitOnSelect: true,
160
+ }];
161
+ });
162
+ }
163
+ export function buildThemeAutocompleteItems(argumentPrefix = "", detectedTheme = "dark") {
164
+ const query = argumentPrefix.trim().toLowerCase();
165
+ const candidates = [
166
+ { value: "auto", label: "Auto", description: `Match terminal · currently ${detectedTheme}` },
167
+ { value: "light", label: "Light", description: "Light surfaces and dark text" },
168
+ { value: "dark", label: "Dark", description: "Dark surfaces and light text" },
169
+ ];
170
+ return candidates.flatMap((candidate) => {
171
+ const searchable = `${candidate.value} ${candidate.label} ${candidate.description}`.toLowerCase();
172
+ if (query && !searchable.includes(query))
173
+ return [];
174
+ return [{ ...candidate, submitOnSelect: true }];
175
+ });
176
+ }
177
+ /**
178
+ * Build the command surface in execution-priority order. The registry remains
179
+ * live so MCP prompts that connect after startup appear on the next keypress.
180
+ */
181
+ export function buildComposerSlashCommands(commands, skills, uiMode = "regular", modelCompletions, providerCompletions, themeCompletions) {
182
+ const result = new Map();
183
+ const add = (command) => {
184
+ if (!result.has(command.name))
185
+ result.set(command.name, command);
186
+ };
187
+ // Renderer-local commands execute before the shared registry.
188
+ if (uiMode === "regular") {
189
+ add({ name: "fullscreen", description: "Open the alternate-screen transcript view" });
190
+ }
191
+ for (const command of commands.filter((entry) => entry.source === "builtin")) {
192
+ if (command.name === "model" && modelCompletions) {
193
+ add({
194
+ name: command.name,
195
+ description: command.description,
196
+ argumentHint: "<model>",
197
+ submitOnSelect: false,
198
+ argumentInputHint: {
199
+ prompt: "⌕ ",
200
+ placeholder: "Search models…",
201
+ valuePrefix: "/model ",
202
+ },
203
+ keepArgumentMenuOnEmpty: true,
204
+ argumentEmptyMessage: "No matching models",
205
+ getArgumentCompletions: modelCompletions,
206
+ });
207
+ }
208
+ else if (command.name === "provider" && providerCompletions) {
209
+ add({
210
+ name: command.name,
211
+ description: command.description,
212
+ argumentHint: "<provider>",
213
+ submitOnSelect: false,
214
+ argumentInputHint: {
215
+ prompt: "⌕ ",
216
+ placeholder: "Search providers…",
217
+ valuePrefix: PROVIDER_COMMAND_PREFIX,
218
+ },
219
+ keepArgumentMenuOnEmpty: true,
220
+ argumentEmptyMessage: "No matching providers",
221
+ getArgumentCompletions: providerCompletions,
222
+ });
223
+ }
224
+ else if (command.name === "theme" && themeCompletions) {
225
+ add({
226
+ name: command.name,
227
+ description: command.description,
228
+ argumentHint: "<auto|light|dark>",
229
+ submitOnSelect: false,
230
+ argumentInputHint: {
231
+ prompt: "◐ ",
232
+ placeholder: "Select theme…",
233
+ valuePrefix: THEME_COMMAND_PREFIX,
234
+ },
235
+ keepArgumentMenuOnEmpty: true,
236
+ argumentEmptyMessage: "No matching themes",
237
+ getArgumentCompletions: themeCompletions,
238
+ });
239
+ }
240
+ else {
241
+ add({ name: command.name, description: command.description });
242
+ }
243
+ }
244
+ for (const skill of skills) {
245
+ const source = skill.source ? ` · ${skill.source}` : "";
246
+ add({
247
+ name: skill.name,
248
+ argumentHint: "<request>",
249
+ submitOnSelect: false,
250
+ description: `[skill${source}] ${skill.description}`,
251
+ });
252
+ }
253
+ for (const command of commands.filter((entry) => entry.source !== "builtin")) {
254
+ const source = command.sourceLabel ? `mcp:${command.sourceLabel}` : command.source;
255
+ add({ name: command.name, description: `[${source}] ${command.description}` });
256
+ }
257
+ return [...result.values()];
258
+ }
259
+ /** A live adapter around pi-tui's command/file completion implementation. */
260
+ export class ComposerAutocompleteProvider {
261
+ sources;
262
+ discoveredModels = null;
263
+ modelRefresh = null;
264
+ constructor(sources) {
265
+ this.sources = sources;
266
+ }
267
+ async getSuggestions(lines, cursorLine, cursorCol, options) {
268
+ return this.delegate().getSuggestions(lines, cursorLine, cursorCol, options);
269
+ }
270
+ applyCompletion(lines, cursorLine, cursorCol, item, prefix) {
271
+ return this.delegate().applyCompletion(lines, cursorLine, cursorCol, item, prefix);
272
+ }
273
+ shouldTriggerFileCompletion(lines, cursorLine, cursorCol) {
274
+ return this.delegate().shouldTriggerFileCompletion?.(lines, cursorLine, cursorCol) ?? true;
275
+ }
276
+ delegate() {
277
+ return new CombinedAutocompleteProvider(buildComposerSlashCommands(this.sources.commands(), this.sources.skills(), this.sources.uiMode?.() ?? "regular", this.sources.registry ? (prefix) => this.getModelCompletions(prefix) : undefined, this.sources.registry ? (prefix) => this.getProviderCompletions(prefix) : undefined, (prefix) => this.getThemeCompletions(prefix)), this.sources.cwd, this.sources.fdPath ?? null);
278
+ }
279
+ getThemeCompletions(argumentPrefix) {
280
+ const items = buildThemeAutocompleteItems(argumentPrefix, this.sources.detectedTheme?.() ?? "dark");
281
+ const current = this.sources.themeMode?.() ?? "auto";
282
+ return {
283
+ items,
284
+ inputHint: {
285
+ prompt: "◐ ",
286
+ placeholder: "Select theme…",
287
+ valuePrefix: THEME_COMMAND_PREFIX,
288
+ },
289
+ keepOpenOnEmpty: true,
290
+ emptyMessage: "No matching themes",
291
+ ...(argumentPrefix.length === 0 ? { preferredValue: current } : {}),
292
+ };
293
+ }
294
+ getProviderCompletions(argumentPrefix) {
295
+ const registry = this.sources.registry;
296
+ if (!registry || argumentPrefix.trimStart().startsWith("--"))
297
+ return null;
298
+ const currentProviderId = this.sources.providerId?.() ?? registry.getDefault()?.id;
299
+ const items = buildProviderAutocompleteItems(registry, argumentPrefix, currentProviderId);
300
+ return {
301
+ items,
302
+ inputHint: {
303
+ prompt: "⌕ ",
304
+ placeholder: "Search providers…",
305
+ valuePrefix: PROVIDER_COMMAND_PREFIX,
306
+ },
307
+ keepOpenOnEmpty: true,
308
+ emptyMessage: "No matching providers",
309
+ ...(argumentPrefix.length === 0 && currentProviderId
310
+ ? { preferredValue: `--set ${currentProviderId}` }
311
+ : {}),
312
+ };
313
+ }
314
+ getModelCompletions(argumentPrefix) {
315
+ const registry = this.sources.registry;
316
+ if (!registry)
317
+ return null;
318
+ const localGroups = getVisibleModelProviders(registry).map((provider) => ({
319
+ provider,
320
+ models: localModelsForProvider(registry, provider),
321
+ }));
322
+ const key = modelCatalogKey(localGroups);
323
+ const groups = this.discoveredModels?.key === key ? this.discoveredModels.groups : localGroups;
324
+ this.refreshModelCatalog(key);
325
+ const currentThinkingLevel = this.sources.thinkingLevel?.() ?? "off";
326
+ const items = buildModelAutocompleteItems(groups, argumentPrefix, currentThinkingLevel);
327
+ const selections = selectableModels(groups);
328
+ const effort = effortPhase(selections, argumentPrefix);
329
+ if (!effort) {
330
+ return {
331
+ items,
332
+ inputHint: {
333
+ prompt: "⌕ ",
334
+ placeholder: "Search models…",
335
+ valuePrefix: MODEL_COMMAND_PREFIX,
336
+ },
337
+ keepOpenOnEmpty: true,
338
+ emptyMessage: "No matching models",
339
+ };
340
+ }
341
+ const toggle = isThinkingToggleModel(effort.selection.provider.id, effort.selection.model.id);
342
+ const baseValue = `${effort.selection.value}${REASONING_EFFORT_SEPARATOR}`;
343
+ const preferredLevel = preferredThinkingLevel(effort.selection, currentThinkingLevel);
344
+ return {
345
+ items,
346
+ inputHint: {
347
+ prompt: "◆ ",
348
+ placeholder: toggle ? "Select thinking mode…" : "Select reasoning effort…",
349
+ valuePrefix: `${MODEL_COMMAND_PREFIX}${baseValue}`,
350
+ backValue: MODEL_COMMAND_PREFIX,
351
+ },
352
+ keepOpenOnEmpty: true,
353
+ emptyMessage: toggle ? "No matching modes" : "No matching efforts",
354
+ ...(effort.query.length === 0
355
+ ? { preferredValue: `${baseValue}${preferredLevel}` }
356
+ : {}),
357
+ };
358
+ }
359
+ /**
360
+ * Remote discovery enriches the already-visible local catalog. It is shared
361
+ * per provider snapshot and runs all providers concurrently, so opening the
362
+ * composer menu never waits on network latency.
363
+ */
364
+ refreshModelCatalog(key) {
365
+ const registry = this.sources.registry;
366
+ if (!registry || this.discoveredModels?.key === key || this.modelRefresh?.key === key)
367
+ return;
368
+ const task = discoverModelProviderGroups(registry).then((groups) => {
369
+ const currentGroups = getVisibleModelProviders(registry).map((provider) => ({
370
+ provider,
371
+ models: localModelsForProvider(registry, provider),
372
+ }));
373
+ if (modelCatalogKey(currentGroups) !== key)
374
+ return;
375
+ this.discoveredModels = { key, groups };
376
+ this.sources.onModelSuggestionsChanged?.();
377
+ }).finally(() => {
378
+ if (this.modelRefresh?.task === task)
379
+ this.modelRefresh = null;
380
+ });
381
+ this.modelRefresh = { key, task };
382
+ }
383
+ }
@@ -0,0 +1,7 @@
1
+ import type { EditorOptions, EditorTheme } from "@bubblebrain-ai/pi-tui";
2
+ import { type Theme } from "./model/theme.js";
3
+ /** Bubble's primary composer: lightweight square box with an agent prompt. */
4
+ export declare function createComposerEditorTheme(getTheme: () => Theme): EditorTheme;
5
+ /** Backward-compatible dark default for isolated components and tests. */
6
+ export declare const COMPOSER_EDITOR_THEME: EditorTheme;
7
+ export declare const COMPOSER_EDITOR_OPTIONS: EditorOptions;
@@ -0,0 +1,29 @@
1
+ import { darkTheme } from "./model/theme.js";
2
+ import { themeBackground, themeDim, themeForeground } from "./model/theme-style.js";
3
+ /** Bubble's primary composer: lightweight square box with an agent prompt. */
4
+ export function createComposerEditorTheme(getTheme) {
5
+ return {
6
+ // The callbacks read the current palette on every render. Editor keeps the
7
+ // theme object for its lifetime, so this is what makes /theme repaint an
8
+ // already-mounted composer and autocomplete menu without reconstruction.
9
+ borderColor: (str) => themeDim(getTheme().border, str),
10
+ autocompleteBackground: (str) => themeBackground(getTheme().backgroundPanel, str),
11
+ selectList: {
12
+ selectedPrefix: () => themeForeground(getTheme().accent, "› "),
13
+ selectedText: (str) => themeForeground(getTheme().inputText, str),
14
+ selectedRow: (str) => themeForeground(getTheme().inputText, themeBackground(getTheme().traceSelectedBg, str)),
15
+ description: (str) => themeDim(getTheme().dim, str),
16
+ scrollInfo: (str) => themeDim(getTheme().dim, str),
17
+ noMatch: (str) => themeDim(getTheme().dim, str),
18
+ },
19
+ };
20
+ }
21
+ /** Backward-compatible dark default for isolated components and tests. */
22
+ export const COMPOSER_EDITOR_THEME = createComposerEditorTheme(() => darkTheme);
23
+ export const COMPOSER_EDITOR_OPTIONS = {
24
+ borderStyle: "box",
25
+ paddingX: 1,
26
+ prompt: "> ",
27
+ autocompletePlacement: "above",
28
+ autocompleteBorderStyle: "none",
29
+ };
@@ -0,0 +1,75 @@
1
+ /**
2
+ * Pure Agent-event reducer for a single agent run.
3
+ *
4
+ * Mechanical extraction of the legacy application event switch plus
5
+ * its finally-block semantics (1888-1958) into a pure function: state in,
6
+ * (state, effects) out. No React, no Ink, no ports — the controller applies
7
+ * effects and owns scheduling (40ms flush) via ports.
8
+ *
9
+ * Migration rule (docs/pi-tui-controller-extraction.md §2): each case is
10
+ * case-for-case equivalent to the legacy implementation; no opportunistic
11
+ * refactoring. Behavior deltas are called out in comments.
12
+ */
13
+ import type { AgentEvent, AgentRunInput } from "../../types.js";
14
+ import { setUserInputStatus, type DisplayMessage, type DisplayMessagePart, type DisplayToolCall } from "../model/display-history.js";
15
+ import type { ControllerEffect } from "./effects.js";
16
+ export declare const STREAMING_FLUSH_INTERVAL_MS = 40;
17
+ export interface RunAccumulator {
18
+ readonly runId: number;
19
+ content: string;
20
+ reasoning: string;
21
+ systemFingerprint?: string;
22
+ toolCalls: DisplayToolCall[];
23
+ parts: DisplayMessagePart[];
24
+ usageTokens: number;
25
+ usageReported: boolean;
26
+ }
27
+ export type RunOutcome = "running" | "cancelled" | "errored";
28
+ export interface RunDirty {
29
+ content: boolean;
30
+ reasoning: boolean;
31
+ parts: boolean;
32
+ tools: boolean;
33
+ }
34
+ export interface RunState {
35
+ readonly accumulator: RunAccumulator;
36
+ readonly dirty: RunDirty;
37
+ readonly outcome: RunOutcome;
38
+ }
39
+ export interface RunContext {
40
+ readonly external: boolean;
41
+ readonly externalModelId?: string;
42
+ isCurrentRun(): boolean;
43
+ now(): number;
44
+ readonly runStartedAt: number | null;
45
+ /** Steer placeholders correlated by input id (controller-owned map). */
46
+ readonly pendingSteers: ReadonlyMap<string, {
47
+ displayKey: string;
48
+ sessionFile?: string;
49
+ }>;
50
+ }
51
+ export interface EventReduceResult {
52
+ readonly state: RunState;
53
+ readonly effects: readonly ControllerEffect[];
54
+ }
55
+ export declare function createRunState(runId: number): RunState;
56
+ /** Grok policy guard: events outside the whitelist abort the session. */
57
+ export declare function grokEventAllowed(event: AgentEvent): boolean;
58
+ export declare function reduceAgentEvent(state: RunState, event: AgentEvent, ctx: RunContext): EventReduceResult;
59
+ export interface RunFinishOptions {
60
+ cancelled: boolean;
61
+ errored: boolean;
62
+ /** Steers still pending at run end (inputController.clear() upstream). */
63
+ leftoverSteers: Array<{
64
+ input: AgentRunInput;
65
+ displayKey?: string;
66
+ sessionFile?: string;
67
+ }>;
68
+ /** Placeholder-row bookkeeping stays with the controller's queue state. */
69
+ ownsCurrentGeneration: boolean;
70
+ }
71
+ /** finally-block semantics (app.tsx:1888-1958) as a pure transition. */
72
+ export declare function reduceRunFinish(state: RunState, opts: RunFinishOptions): EventReduceResult;
73
+ /** Build the committed assistant message from the accumulator (app.tsx:1567-1607). */
74
+ export declare function buildAssistantMessage(state: RunState, taskElapsedMs?: number): DisplayMessage | null;
75
+ export type { setUserInputStatus };