@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
@@ -1,271 +0,0 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { useEffect, useRef, useState } from "react";
3
- import { Box, Text, useInput } from "ink";
4
- import qrTerminal from "qrcode-terminal";
5
- import { existsSync, statSync } from "node:fs";
6
- import { isAbsolute, resolve as resolvePath, basename } from "node:path";
7
- import { homedir } from "node:os";
8
- import { registerApp } from "@larksuiteoapi/node-sdk";
9
- import { isKeyReleaseEvent } from "./key-events.js";
10
- import { useTheme } from "./theme.js";
11
- import { stripTerminalMouseSequences } from "./terminal-mouse.js";
12
- import { bootstrapConfig } from "../feishu/config.js";
13
- import { ScopeRegistry } from "../feishu/scope/scope-registry.js";
14
- const EMPTY_VALUES = { chatId: "", cwd: "", displayName: "" };
15
- export function FeishuSetupPicker({ onComplete, onCancel }) {
16
- const theme = useTheme();
17
- const [stage, setStage] = useState({ kind: "registering" });
18
- const abortRef = useRef(undefined);
19
- const completedRef = useRef(false);
20
- useEffect(() => {
21
- const controller = new AbortController();
22
- abortRef.current = controller;
23
- let cancelled = false;
24
- void (async () => {
25
- try {
26
- const result = await registerApp({
27
- signal: controller.signal,
28
- onQRCodeReady: (info) => {
29
- if (cancelled)
30
- return;
31
- qrTerminal.generate(info.url, { small: true }, (ascii) => {
32
- if (cancelled)
33
- return;
34
- setStage({
35
- kind: "qr_shown",
36
- url: info.url,
37
- ascii,
38
- status: "等待扫码…",
39
- });
40
- });
41
- },
42
- onStatusChange: (info) => {
43
- if (cancelled)
44
- return;
45
- setStage((prev) => {
46
- if (prev.kind !== "qr_shown")
47
- return prev;
48
- const label = info.status === "polling"
49
- ? "等待扫码…"
50
- : info.status === "slow_down"
51
- ? "轮询变慢中…仍在等待"
52
- : info.status === "domain_switched"
53
- ? "已切换域名"
54
- : info.status;
55
- return { ...prev, status: label };
56
- });
57
- },
58
- });
59
- if (cancelled)
60
- return;
61
- const ownerOpenId = result.user_info?.open_id;
62
- if (!ownerOpenId) {
63
- setStage({ kind: "error", message: "授权成功但没拿到 owner open_id,无法继续。" });
64
- return;
65
- }
66
- try {
67
- bootstrapConfig({
68
- appId: result.client_id,
69
- appSecret: result.client_secret,
70
- ownerOpenId,
71
- });
72
- }
73
- catch (err) {
74
- setStage({ kind: "error", message: `保存 config 失败:${err.message}` });
75
- return;
76
- }
77
- setStage({ kind: "credentialed", ownerOpenId, configWritten: true });
78
- }
79
- catch (err) {
80
- if (cancelled || controller.signal.aborted)
81
- return;
82
- setStage({ kind: "error", message: err.message || "扫码注册失败" });
83
- }
84
- })();
85
- return () => {
86
- cancelled = true;
87
- controller.abort();
88
- };
89
- }, []);
90
- const finish = (summary) => {
91
- if (completedRef.current)
92
- return;
93
- completedRef.current = true;
94
- setStage({ kind: "done", summary });
95
- onComplete(summary);
96
- };
97
- const cancel = () => {
98
- if (completedRef.current)
99
- return;
100
- completedRef.current = true;
101
- abortRef.current?.abort();
102
- onCancel();
103
- };
104
- useInput((input, key) => {
105
- if (isKeyReleaseEvent(key))
106
- return;
107
- const strippedMouseInput = stripTerminalMouseSequences(input);
108
- if (strippedMouseInput !== input) {
109
- if (!strippedMouseInput)
110
- return;
111
- input = strippedMouseInput;
112
- }
113
- if (key.escape) {
114
- // Esc at any stage = cancel/skip.
115
- if (stage.kind === "credentialed") {
116
- finish(`✅ 应用已注册并保存到 ~/.bubble/feishu/。owner: ${stage.ownerOpenId}\n(已跳过 chat 绑定 — 稍后可以编辑 ~/.bubble/feishu/scopes.json 添加)`);
117
- return;
118
- }
119
- if (stage.kind === "binding") {
120
- finish(`✅ 应用已注册。owner: ${stage.ownerOpenId}\n(已跳过 chat 绑定 — 稍后可以 /feishu setup 重来或编辑 scopes.json)`);
121
- return;
122
- }
123
- cancel();
124
- return;
125
- }
126
- if (stage.kind === "credentialed" && key.return) {
127
- setStage({
128
- kind: "binding",
129
- ownerOpenId: stage.ownerOpenId,
130
- field: "chatId",
131
- values: EMPTY_VALUES,
132
- });
133
- return;
134
- }
135
- if (stage.kind === "error" && key.return) {
136
- onCancel();
137
- return;
138
- }
139
- if (stage.kind !== "binding")
140
- return;
141
- const cur = stage;
142
- const updateValue = (next) => {
143
- setStage({ ...cur, values: { ...cur.values, [cur.field]: next }, error: undefined });
144
- };
145
- if (key.return) {
146
- const submitField = cur.field;
147
- const value = cur.values[submitField];
148
- if (submitField === "chatId") {
149
- if (!value.trim()) {
150
- setStage({ ...cur, error: "Chat ID 不能为空(oc_...)" });
151
- return;
152
- }
153
- setStage({ ...cur, field: "cwd", error: undefined });
154
- return;
155
- }
156
- if (submitField === "cwd") {
157
- const expanded = expandUser(value.trim());
158
- if (!isAbsolute(expanded)) {
159
- setStage({ ...cur, error: "cwd 必须是绝对路径或 ~/..." });
160
- return;
161
- }
162
- if (!existsSync(expanded) || !statSync(expanded).isDirectory()) {
163
- setStage({ ...cur, error: `路径不存在或不是目录:${expanded}` });
164
- return;
165
- }
166
- // Pre-fill display name with basename if user left it empty later.
167
- const nextDisplayName = cur.values.displayName || basename(expanded);
168
- setStage({
169
- ...cur,
170
- field: "displayName",
171
- values: { ...cur.values, cwd: expanded, displayName: nextDisplayName },
172
- error: undefined,
173
- });
174
- return;
175
- }
176
- // displayName
177
- const displayName = value.trim() || basename(cur.values.cwd);
178
- try {
179
- const registry = ScopeRegistry.load();
180
- const scope = {
181
- cwd: cur.values.cwd,
182
- displayName,
183
- allowedUsers: [cur.ownerOpenId],
184
- admins: [cur.ownerOpenId],
185
- defaultPermissionMode: "default",
186
- model: null,
187
- createdAt: Date.now(),
188
- lastActiveAt: Date.now(),
189
- };
190
- registry.upsert(cur.values.chatId.trim(), scope);
191
- }
192
- catch (err) {
193
- setStage({ ...cur, error: `保存 scope 失败:${err.message}` });
194
- return;
195
- }
196
- finish(`✅ 已注册应用并绑定第一个 chat:\n chat: ${cur.values.chatId.trim()}\n cwd: ${cur.values.cwd}\n现在可以 /feishu start 启动服务。`);
197
- return;
198
- }
199
- if (key.backspace || key.delete) {
200
- updateValue(cur.values[cur.field].slice(0, -1));
201
- return;
202
- }
203
- if (key.tab && cur.field === "displayName") {
204
- // Tab in displayName field = use default (basename).
205
- updateValue(basename(cur.values.cwd));
206
- return;
207
- }
208
- if (input && !key.ctrl && !key.meta) {
209
- updateValue(cur.values[cur.field] + input);
210
- }
211
- });
212
- return (_jsxs(Box, { flexDirection: "column", marginY: 1, paddingX: 1, borderStyle: "round", borderColor: theme.borderActive, children: [_jsx(Text, { bold: true, color: theme.accent, children: "Feishu Setup Wizard" }), _jsx(Text, { color: theme.muted, children: renderHint(stage) }), _jsx(Box, { marginTop: 1, flexDirection: "column", children: renderBody(stage, theme) })] }));
213
- }
214
- function renderHint(stage) {
215
- switch (stage.kind) {
216
- case "registering": return "Esc 取消";
217
- case "qr_shown": return "用手机飞书扫码 · Esc 取消";
218
- case "credentialed": return "Enter 绑定第一个 chat · Esc 跳过(之后可手动配置 scopes.json)";
219
- case "binding": return "输入后 Enter 下一步 · Esc 跳过绑定";
220
- case "done": return "Enter 关闭";
221
- case "error": return "Enter 关闭";
222
- }
223
- }
224
- function renderBody(stage, theme) {
225
- switch (stage.kind) {
226
- case "registering":
227
- return _jsx(Text, { color: theme.muted, children: "\u6B63\u5728\u5411\u98DE\u4E66\u7533\u8BF7\u6CE8\u518C\u7801\u2026" });
228
- case "qr_shown":
229
- return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Text, { color: theme.muted, children: stage.status }), _jsx(Box, { marginTop: 1, flexDirection: "column", children: stage.ascii.split("\n").map((line, i) => (_jsx(Text, { children: line || " " }, `q-${i}`))) }), _jsxs(Box, { marginTop: 1, flexDirection: "column", children: [_jsx(Text, { color: theme.muted, children: "\u626B\u4E0D\u5230\uFF1F\u4E5F\u53EF\u4EE5\u6D4F\u89C8\u5668\u6253\u5F00\uFF1A" }), _jsx(Text, { children: stage.url })] })] }));
230
- case "credentialed":
231
- return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Text, { color: theme.accent, children: "\u2705 \u6CE8\u518C\u6210\u529F" }), _jsxs(Text, { children: ["owner open_id: ", _jsx(Text, { color: theme.accent, children: stage.ownerOpenId })] }), _jsx(Box, { marginTop: 1, children: _jsx(Text, { color: theme.muted, children: "\u5DF2\u5199\u5165 ~/.bubble/feishu/config.json + secrets.enc\uFF08\u52A0\u5BC6\uFF09\u3002" }) }), _jsx(Box, { marginTop: 1, children: _jsx(Text, { children: "\u4E0B\u4E00\u6B65\uFF1A\u628A\u4E00\u4E2A\u98DE\u4E66 chat \u7ED1\u5B9A\u5230\u672C\u5730\u76EE\u5F55\uFF1F" }) })] }));
232
- case "binding":
233
- return _jsx(BindingForm, { stage: stage, theme: theme });
234
- case "done":
235
- return (_jsx(Box, { flexDirection: "column", children: stage.summary.split("\n").map((line, i) => (_jsx(Text, { children: line }, i))) }));
236
- case "error":
237
- return (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Text, { color: theme.error, children: ["\u274C ", stage.message] }), _jsx(Box, { marginTop: 1, children: _jsx(Text, { color: theme.muted, children: "\u6309 Enter \u5173\u95ED\u3002\u53EF\u4EE5\u7A0D\u540E\u518D /feishu setup \u91CD\u8BD5\u3002" }) })] }));
238
- }
239
- }
240
- function BindingForm({ stage, theme }) {
241
- const labels = {
242
- chatId: {
243
- label: "Chat ID",
244
- hint: "飞书 chat 的 oc_ 开头 ID。⚠️ 现在你大概率还不知道这个 —— 按 Esc 跳过,先 /feishu start 起服务,给 bot 发条消息后用 /feishu discover 自动获取。",
245
- },
246
- cwd: {
247
- label: "本地 cwd",
248
- hint: `例如 ${homedir()}/projects/my-app(绝对路径或 ~/...)`,
249
- },
250
- displayName: {
251
- label: "显示名(可空,默认 = 目录名)",
252
- hint: "出现在飞书卡片顶栏的短标签",
253
- },
254
- };
255
- return (_jsxs(Box, { flexDirection: "column", children: [Object.keys(labels).map((field) => {
256
- const meta = labels[field];
257
- const value = stage.values[field];
258
- const isActive = stage.field === field;
259
- const isDone = !isActive && value && fieldOrderIndex(stage.field) > fieldOrderIndex(field);
260
- const marker = isActive ? "› " : isDone ? "✓ " : " ";
261
- return (_jsxs(Box, { flexDirection: "column", marginBottom: isActive ? 1 : 0, children: [_jsxs(Box, { children: [_jsxs(Text, { color: isActive ? theme.accent : isDone ? theme.success : theme.muted, children: [marker, meta.label, ":"] }), _jsx(Box, { marginLeft: 1, children: _jsxs(Text, { children: [value, isActive ? "▌" : ""] }) })] }), isActive && (_jsx(Box, { marginLeft: 2, children: _jsx(Text, { color: theme.muted, children: meta.hint }) }))] }, field));
262
- }), stage.error && (_jsx(Box, { marginTop: 1, children: _jsx(Text, { color: theme.error, children: stage.error }) }))] }));
263
- }
264
- function fieldOrderIndex(field) {
265
- return field === "chatId" ? 0 : field === "cwd" ? 1 : 2;
266
- }
267
- function expandUser(p) {
268
- if (p === "~" || p.startsWith("~/"))
269
- return homedir() + p.slice(1);
270
- return resolvePath(p);
271
- }
@@ -1,26 +0,0 @@
1
- import type { PermissionMode } from "../types.js";
2
- export interface FooterData {
3
- mode?: PermissionMode;
4
- goalLine?: string;
5
- runtimeLabel?: string;
6
- /** Friendly working directory (e.g. `~/project`). */
7
- cwd?: string;
8
- /** Current git branch, when the cwd is a git repo. */
9
- branch?: string;
10
- /** Display name of the active model. */
11
- model?: string;
12
- /** Current session title, when one has been assigned. */
13
- sessionTitle?: string;
14
- /** Compact context usage, e.g. `42K/500K`. */
15
- contextUsage?: string;
16
- }
17
- /**
18
- * Bottom status line. Always surfaces a `cwd | branch | model | title | ctx`
19
- * row (each segment only when its data is present), and appends the
20
- * permission-mode badge for non-default modes. Renders nothing (zero rows)
21
- * when no data is available.
22
- */
23
- export declare function FooterBar({ data }: {
24
- data: FooterData;
25
- }): import("react/jsx-runtime").JSX.Element | null;
26
- export declare function buildFooterData(input: FooterData): FooterData;
@@ -1,51 +0,0 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import React from "react";
3
- import { Box, Text } from "ink";
4
- import { useTheme } from "./theme.js";
5
- import { PERMISSION_MODE_INFO } from "../permission/mode.js";
6
- /**
7
- * Bottom status line. Always surfaces a `cwd | branch | model | title | ctx`
8
- * row (each segment only when its data is present), and appends the
9
- * permission-mode badge for non-default modes. Renders nothing (zero rows)
10
- * when no data is available.
11
- */
12
- export function FooterBar({ data }) {
13
- const theme = useTheme();
14
- const showMode = !!data.mode && data.mode !== "default";
15
- const goalLine = data.goalLine?.trim();
16
- const runtimeLabel = data.runtimeLabel?.trim();
17
- const segments = [];
18
- if (data.cwd?.trim())
19
- segments.push({ key: "cwd", text: data.cwd.trim(), color: theme.muted });
20
- if (data.branch?.trim())
21
- segments.push({ key: "branch", text: data.branch.trim(), color: theme.muted });
22
- if (data.model?.trim())
23
- segments.push({ key: "model", text: data.model.trim(), color: theme.accent });
24
- if (data.sessionTitle?.trim())
25
- segments.push({ key: "title", text: data.sessionTitle.trim(), color: theme.muted });
26
- if (data.contextUsage?.trim())
27
- segments.push({ key: "ctx", text: data.contextUsage.trim(), color: theme.muted });
28
- if (!showMode && !goalLine && !runtimeLabel && segments.length === 0)
29
- return null;
30
- return (_jsxs(Box, { paddingX: 1, flexShrink: 0, flexDirection: "column", children: [goalLine && _jsx(GoalBadge, { line: goalLine }), runtimeLabel && _jsx(RuntimeBadge, { label: runtimeLabel }), (segments.length > 0 || showMode) && (_jsxs(Box, { children: [showMode && (_jsxs(React.Fragment, { children: [_jsx(ModeBadge, { mode: data.mode }), segments.length > 0 && _jsx(Text, { color: theme.muted, children: " | " })] })), segments.map((segment, index) => (_jsxs(React.Fragment, { children: [index > 0 && _jsx(Text, { color: theme.muted, children: " | " }), _jsx(Text, { color: segment.color, children: segment.text })] }, segment.key)))] }))] }));
31
- }
32
- function RuntimeBadge({ label }) {
33
- const theme = useTheme();
34
- return _jsx(Text, { color: theme.accent, children: label });
35
- }
36
- function GoalBadge({ line }) {
37
- const theme = useTheme();
38
- return (_jsx(Text, { color: theme.muted, children: line }));
39
- }
40
- function ModeBadge({ mode }) {
41
- const theme = useTheme();
42
- if (!mode || mode === "default")
43
- return null;
44
- const info = PERMISSION_MODE_INFO[mode];
45
- const color = theme[info.color] ?? theme.muted;
46
- const symbol = info.symbol ? `${info.symbol} ` : "";
47
- return (_jsxs(Text, { color: color, bold: true, children: [symbol, info.shortTitle, " on"] }));
48
- }
49
- export function buildFooterData(input) {
50
- return input;
51
- }
@@ -1,189 +0,0 @@
1
- import type { SkillRegistry } from "../skills/registry.js";
2
- import { type ImageAttachment } from "./image-paste.js";
3
- import { type HistoryEntry } from "./input-history.js";
4
- import { type ComposerBuffer } from "./composer-buffer.js";
5
- export { createPastedContentMarker, expandPastedContentMarkers, shouldCollapsePastedContent, type PastedContentReference, } from "../tui/paste-placeholder.js";
6
- export interface SubmitPayload {
7
- /** Fully-expanded text sent to the agent. */
8
- text: string;
9
- /** Text shown in the composer/transcript when it differs from the real text. */
10
- displayText?: string;
11
- images: ImageAttachment[];
12
- /** First UI-only [Image #N] label reserved for this submitted payload. */
13
- imageDisplayStart?: number;
14
- /**
15
- * Harness-initiated submission (background-tasks design §2.3b): runs
16
- * hidden with the text wrapped as internal context, never rendered as a
17
- * user row. Only the TUI wake path sets this.
18
- */
19
- internal?: "task_wake";
20
- }
21
- interface InputBoxProps {
22
- onSubmit: (payload: SubmitPayload) => void;
23
- /**
24
- * When set (agent running), Tab queues the composer content for the next
25
- * turn instead of its idle-time behavior.
26
- */
27
- onQueue?: (payload: SubmitPayload) => void;
28
- onPasteNotice?: (notice: string) => void;
29
- disabled?: boolean;
30
- /**
31
- * Called when Down is pressed at the bottom edge with nothing newer in
32
- * history — the parent uses this to move focus out of the composer (e.g. into
33
- * the subagent entry), matching Claude Code's ↓-to-focus-the-task-panel.
34
- */
35
- onArrowDownAtBottom?: () => void;
36
- cursorResetEpoch?: number;
37
- draftText?: string;
38
- draftEpoch?: number;
39
- onDraftApplied?: () => void;
40
- skillRegistry?: SkillRegistry;
41
- localSlashCommands?: Array<{
42
- name: string;
43
- description: string;
44
- }>;
45
- /** Restrict slash completion to commands handled locally by a constrained runtime. */
46
- allowedSlashCommands?: ReadonlySet<string>;
47
- /** False only for runtimes that must not enumerate or read the workspace. */
48
- allowWorkspaceMentions?: boolean;
49
- /** False for text-only runtimes; prevents clipboard and pasted-path image reads. */
50
- allowImageAttachments?: boolean;
51
- terminalColumns: number;
52
- cwd: string;
53
- sessionFile?: string;
54
- nextImageLabelStart?: number;
55
- }
56
- export declare function resolveComposerAtContext(text: string, cursor: number, isSlashContext: boolean, allowWorkspaceMentions?: boolean): import("./file-mentions.js").AtContext | null;
57
- export interface ComposerDraftSnapshot {
58
- buffer: ComposerBuffer;
59
- attachments: ImageAttachment[];
60
- imageLabelStartOverride: number | null;
61
- }
62
- export declare function createComposerDraftSnapshot(input: ComposerDraftSnapshot): ComposerDraftSnapshot;
63
- export interface ComposerHistoryState {
64
- buffer: ComposerBuffer;
65
- attachments: ImageAttachment[];
66
- imageLabelStartOverride: number | null;
67
- historyIndex: number | null;
68
- draftSnapshot: ComposerDraftSnapshot | null;
69
- }
70
- export interface ComposerHistoryTransition extends ComposerHistoryState {
71
- changed: boolean;
72
- }
73
- /**
74
- * Browse persisted history without turning marker-shaped text into live paste
75
- * tokens, while preserving the exact unsent draft in memory for the final
76
- * Down transition back out of history.
77
- */
78
- export declare function stepComposerHistory(state: ComposerHistoryState, history: HistoryEntry[], direction: "up" | "down"): ComposerHistoryTransition;
79
- export declare function needsCursorRowCompensation(nextOutputHeight: number, viewportRows: number, previousOutputHeight: number | null): boolean;
80
- export declare function resolveCursorRowCompensation(input: {
81
- sameRenderedFrame: boolean;
82
- previousRowCompensation: number;
83
- nextOutputHeight: number;
84
- viewportRows: number;
85
- previousOutputHeight: number | null;
86
- }): number;
87
- export declare function isCtrlLetterInput(input: string, key: {
88
- ctrl?: boolean;
89
- }, letter: string): boolean;
90
- export declare function isCtrlCInput(input: string, key: {
91
- ctrl?: boolean;
92
- }): boolean;
93
- export declare function shouldUseHardwareComposerCursor(env?: Record<string, string | undefined>): boolean;
94
- export declare function composerVerticalArrowDirection(key: {
95
- upArrow?: boolean;
96
- downArrow?: boolean;
97
- eventType?: string;
98
- }): "up" | "down" | undefined;
99
- export declare function resolveSoftwareCursorCellStyle(input: {
100
- visible: boolean;
101
- textColor: string;
102
- }): {
103
- inverse: boolean;
104
- color: string;
105
- };
106
- /**
107
- * Split a composer line around the cursor so the cell under it can render as
108
- * an inverse-video software cursor. The visible cursor must not depend on the
109
- * real terminal cursor: Ink only re-arms its one-shot cursor escape when the
110
- * component owning useCursor re-commits, so frames produced by other
111
- * components' local state (the waiting spinner, viewport scrolling) hide the
112
- * hardware cursor for most of an agent run. Drawing and blinking the cell
113
- * ourselves keeps it visible while preserving normal typing feedback; the real
114
- * cursor is still positioned for IME anchoring.
115
- */
116
- export declare function splitLineAtCursor(lineText: string, charOffset: number): {
117
- before: string;
118
- at: string;
119
- after: string;
120
- };
121
- export interface TextHighlightRange {
122
- start: number;
123
- end: number;
124
- }
125
- export type ComposerTextSegmentKind = "normal" | "command" | "cursor";
126
- export interface ComposerTextSegment {
127
- kind: ComposerTextSegmentKind;
128
- text: string;
129
- }
130
- export declare function resolveSlashCommandHighlightRange(input: string, commandNames: Iterable<string>): TextHighlightRange | null;
131
- export declare function splitComposerTextSegments(input: {
132
- text: string;
133
- absStart: number;
134
- highlight: TextHighlightRange | null;
135
- cursorOffset?: number;
136
- }): ComposerTextSegment[];
137
- export declare function shouldSubmitExactSlashSuggestion(input: string, suggestionName?: string): boolean;
138
- export declare function resolveSlashEnterAction(input: string, suggestions: Array<{
139
- name: string;
140
- }>, selectedIndex: number): {
141
- kind: "submit";
142
- } | {
143
- kind: "complete";
144
- text: string;
145
- } | {
146
- kind: "none";
147
- };
148
- export type InkEnterIntent = "none" | "newline" | "submit";
149
- export declare function isInkModifiedEnterInput(input: string): boolean;
150
- export declare function resolveInkEnterIntent(input: string, key: {
151
- return?: boolean;
152
- shift?: boolean;
153
- ctrl?: boolean;
154
- meta?: boolean;
155
- eventType?: string;
156
- }): InkEnterIntent;
157
- export declare function shouldDeferComposerCommitWhilePastePending(hasPendingPaste: boolean, enterIntent: InkEnterIntent, key: {
158
- tab?: boolean;
159
- }): boolean;
160
- export declare function insertNewlineAtCursor(text: string, cursor: number): {
161
- text: string;
162
- cursor: number;
163
- };
164
- export declare function previousWordBoundary(text: string, cursor: number): number;
165
- export declare function nextWordBoundary(text: string, cursor: number): number;
166
- export declare function lineStartBoundary(text: string, cursor: number): number;
167
- export declare function lineEndBoundary(text: string, cursor: number): number;
168
- export declare function deleteToLineStart(text: string, cursor: number): {
169
- text: string;
170
- cursor: number;
171
- };
172
- export declare function deleteToLineEnd(text: string, cursor: number): {
173
- text: string;
174
- cursor: number;
175
- };
176
- export declare function deleteAtCursor(text: string, cursor: number): {
177
- text: string;
178
- cursor: number;
179
- };
180
- export type ComposerEditAction = "word-left" | "word-right" | "line-start" | "line-end" | "delete-line-start" | "delete-line-end";
181
- export declare function resolveComposerEditAction(input: string, key: {
182
- ctrl?: boolean;
183
- meta?: boolean;
184
- leftArrow?: boolean;
185
- rightArrow?: boolean;
186
- home?: boolean;
187
- end?: boolean;
188
- }): ComposerEditAction | null;
189
- export declare function InputBox({ onSubmit, onQueue, onPasteNotice, disabled, onArrowDownAtBottom, cursorResetEpoch, draftText, draftEpoch, onDraftApplied, skillRegistry, localSlashCommands, allowedSlashCommands, allowWorkspaceMentions, allowImageAttachments, terminalColumns, cwd, sessionFile, nextImageLabelStart, }: InputBoxProps): import("react/jsx-runtime").JSX.Element;