@linxiraos/pi-tui 1.1.26 → 1.2.0

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 (423) hide show
  1. package/CHANGELOG.md +51 -491
  2. package/README.md +13 -7
  3. package/dist/types/active-terminal.d.ts +30 -0
  4. package/dist/types/app-keybindings.d.ts +7 -2
  5. package/dist/types/apps/cleanse-board.d.ts +1 -1
  6. package/dist/types/apps/debug/log-viewer.d.ts +4 -0
  7. package/dist/types/apps/debug/raw-sse-buffer.d.ts +2 -0
  8. package/dist/types/apps/git/git-tui.d.ts +5 -4
  9. package/dist/types/apps/git/help.d.ts +3 -1
  10. package/dist/types/apps/if-bench-board.d.ts +2 -2
  11. package/dist/types/apps/setup-model-picker.d.ts +1 -1
  12. package/dist/types/autocomplete.d.ts +5 -2
  13. package/dist/types/charts/chart-plan.d.ts +674 -0
  14. package/dist/types/charts/chart-svg.d.ts +59 -0
  15. package/dist/types/charts/table-data.d.ts +175 -0
  16. package/dist/types/chat/assistant-message.d.ts +11 -1
  17. package/dist/types/chat/chat-transcript-builder.d.ts +3 -0
  18. package/dist/types/chat/compaction-summary-message.d.ts +1 -0
  19. package/dist/types/chat/execution-shared.d.ts +6 -5
  20. package/dist/types/chat/fence-figure.d.ts +42 -0
  21. package/dist/types/chat/figure-markdown.d.ts +42 -0
  22. package/dist/types/chat/messages.d.ts +1 -1
  23. package/dist/types/chat/svg-figure.d.ts +33 -0
  24. package/dist/types/chat/svg-source.d.ts +49 -0
  25. package/dist/types/chat/table-chart.d.ts +89 -0
  26. package/dist/types/chat/tool-execution.d.ts +2 -0
  27. package/dist/types/chat/user-message.d.ts +17 -4
  28. package/dist/types/chrome/shared.d.ts +9 -0
  29. package/dist/types/chrome/status-notice.d.ts +15 -3
  30. package/dist/types/chrome/transcript-container.d.ts +6 -0
  31. package/dist/types/components/box.d.ts +1 -0
  32. package/dist/types/components/disclosure.d.ts +1 -0
  33. package/dist/types/components/editor.d.ts +23 -5
  34. package/dist/types/components/form.d.ts +1 -0
  35. package/dist/types/components/image.d.ts +26 -44
  36. package/dist/types/components/input.d.ts +2 -1
  37. package/dist/types/components/key-value-list.d.ts +1 -0
  38. package/dist/types/components/layout/row.d.ts +1 -0
  39. package/dist/types/components/layout/stack.d.ts +1 -0
  40. package/dist/types/components/loader.d.ts +5 -6
  41. package/dist/types/components/markdown.d.ts +47 -5
  42. package/dist/types/components/scroll-view.d.ts +1 -0
  43. package/dist/types/components/section.d.ts +1 -0
  44. package/dist/types/components/table.d.ts +1 -0
  45. package/dist/types/components/text.d.ts +1 -0
  46. package/dist/types/components/tree-view.d.ts +7 -0
  47. package/dist/types/components/truncated-text.d.ts +1 -0
  48. package/dist/types/fuzzy.d.ts +29 -1
  49. package/dist/types/key-hint-format.d.ts +9 -1
  50. package/dist/types/keybinding-matchers.d.ts +3 -0
  51. package/dist/types/keybindings.d.ts +1 -1
  52. package/dist/types/kitty-graphics.d.ts +2 -2
  53. package/dist/types/loop-watchdog.d.ts +8 -7
  54. package/dist/types/multiplexers/cmux.d.ts +16 -0
  55. package/dist/types/multiplexers/herdr.d.ts +26 -0
  56. package/dist/types/multiplexers/notify.d.ts +13 -0
  57. package/dist/types/multiplexers/orca.d.ts +12 -0
  58. package/dist/types/multiplexers/screen.d.ts +9 -0
  59. package/dist/types/multiplexers/tmux.d.ts +29 -0
  60. package/dist/types/multiplexers/types.d.ts +100 -0
  61. package/dist/types/multiplexers/wmux.d.ts +12 -0
  62. package/dist/types/multiplexers/zellij.d.ts +12 -0
  63. package/dist/types/native/apply.d.ts +4 -3
  64. package/dist/types/native/backend.d.ts +5 -4
  65. package/dist/types/native/blobs.d.ts +7 -3
  66. package/dist/types/native/encode.d.ts +8 -6
  67. package/dist/types/native/node.d.ts +36 -5
  68. package/dist/types/native/overlay.d.ts +8 -3
  69. package/dist/types/native/settle.d.ts +4 -3
  70. package/dist/types/overlays/agent-hub-projection.d.ts +6 -5
  71. package/dist/types/overlays/agent-hub-types.d.ts +9 -0
  72. package/dist/types/overlays/agent-hub.d.ts +3 -0
  73. package/dist/types/overlays/agent-transcript-viewer.d.ts +12 -2
  74. package/dist/types/overlays/agents-hub.d.ts +9 -0
  75. package/dist/types/overlays/annotation-overlay.d.ts +19 -2
  76. package/dist/types/overlays/annotation-types.d.ts +2 -0
  77. package/dist/types/overlays/ask-dialog.d.ts +5 -2
  78. package/dist/types/overlays/btw-history-panel.d.ts +13 -1
  79. package/dist/types/overlays/copy-selector.d.ts +1 -0
  80. package/dist/types/overlays/history-search.d.ts +10 -0
  81. package/dist/types/overlays/hook-selector.d.ts +9 -4
  82. package/dist/types/overlays/hub-frame.d.ts +4 -1
  83. package/dist/types/overlays/jobs-panel.d.ts +1 -7
  84. package/dist/types/overlays/model-browser.d.ts +54 -7
  85. package/dist/types/overlays/model-hub.d.ts +37 -0
  86. package/dist/types/overlays/oauth-selector.d.ts +0 -1
  87. package/dist/types/overlays/plan-review-overlay.d.ts +3 -2
  88. package/dist/types/overlays/report-panel.d.ts +68 -0
  89. package/dist/types/overlays/rewind-selector.d.ts +1 -0
  90. package/dist/types/overlays/session-observer-registry.d.ts +2 -0
  91. package/dist/types/overlays/session-selector.d.ts +6 -2
  92. package/dist/types/overlays/settings-defs.d.ts +1 -0
  93. package/dist/types/overlays/thinking-selector.d.ts +2 -2
  94. package/dist/types/overlays/usage-dashboard.d.ts +12 -8
  95. package/dist/types/overlays/usage-display.d.ts +3 -1
  96. package/dist/types/prompt/composer-cache.d.ts +0 -16
  97. package/dist/types/prompt/composer.d.ts +18 -3
  98. package/dist/types/prompt/custom-editor.d.ts +25 -13
  99. package/dist/types/prompt/image-source.d.ts +2 -1
  100. package/dist/types/prompt/interactive-context-helpers.d.ts +5 -1
  101. package/dist/types/prompt/model-mention-autocomplete.d.ts +1 -1
  102. package/dist/types/prompt/welcome.d.ts +7 -2
  103. package/dist/types/render/composite.d.ts +2 -0
  104. package/dist/types/render/output-pane.d.ts +1 -0
  105. package/dist/types/render/render-utils.d.ts +1 -0
  106. package/dist/types/render/tool-card.d.ts +6 -0
  107. package/dist/types/render/width-aware-text.d.ts +2 -0
  108. package/dist/types/setup/scenes/types.d.ts +1 -0
  109. package/dist/types/space-hold.d.ts +40 -25
  110. package/dist/types/status-line/component.d.ts +3 -0
  111. package/dist/types/status-line/context-usage.d.ts +7 -5
  112. package/dist/types/status-line/host.d.ts +4 -1
  113. package/dist/types/status-line/segments.d.ts +2 -0
  114. package/dist/types/status-line/types.d.ts +14 -3
  115. package/dist/types/terminal-capabilities.d.ts +41 -36
  116. package/dist/types/terminal-multiplexer.d.ts +127 -14
  117. package/dist/types/terminal.d.ts +23 -16
  118. package/dist/types/theme/active-symbols.d.ts +1 -1
  119. package/dist/types/theme/schema.d.ts +11 -2
  120. package/dist/types/theme/symbols.d.ts +1 -1
  121. package/dist/types/theme/theme-class.d.ts +7 -0
  122. package/dist/types/theme/theme.d.ts +1 -1
  123. package/dist/types/theme/tui-adapters.d.ts +3 -0
  124. package/dist/types/thinking.d.ts +1 -1
  125. package/dist/types/tmux.d.ts +11 -4
  126. package/dist/types/tools/bash.d.ts +7 -2
  127. package/dist/types/tools/daemon.d.ts +1 -1
  128. package/dist/types/tools/eval.d.ts +22 -3
  129. package/dist/types/tools/glob.d.ts +4 -0
  130. package/dist/types/tools/native-view.d.ts +47 -0
  131. package/dist/types/tools/output-meta.d.ts +11 -1
  132. package/dist/types/tools/renderer.d.ts +37 -2
  133. package/dist/types/tools/streaming-output.d.ts +20 -1
  134. package/dist/types/tools/task.d.ts +2 -3
  135. package/dist/types/tools/write.d.ts +9 -2
  136. package/dist/types/tools/yield.d.ts +22 -0
  137. package/dist/types/tui.d.ts +36 -0
  138. package/dist/types/utils.d.ts +6 -0
  139. package/dist/types/vim.d.ts +19 -5
  140. package/dist/types/windows-input-mode.d.ts +33 -1
  141. package/package.json +13 -9
  142. package/src/active-terminal.d.ts +30 -0
  143. package/src/active-terminal.ts +80 -0
  144. package/src/app-keybindings.d.ts +7 -2
  145. package/src/app-keybindings.ts +7 -2
  146. package/src/apps/autoresearch-dashboard.ts +7 -3
  147. package/src/apps/cleanse-board.ts +2 -2
  148. package/src/apps/cleanse-picker.ts +1 -1
  149. package/src/apps/debug/log-viewer.ts +188 -72
  150. package/src/apps/debug/raw-sse-buffer.ts +8 -0
  151. package/src/apps/debug/raw-sse.ts +39 -5
  152. package/src/apps/git/diff-pane.ts +96 -23
  153. package/src/apps/git/git-tui.ts +23 -16
  154. package/src/apps/git/help.ts +29 -20
  155. package/src/apps/git/sidebar.ts +8 -3
  156. package/src/apps/if-bench-board.ts +2 -2
  157. package/src/apps/ps-top.ts +2 -2
  158. package/src/apps/setup-model-picker.ts +1 -1
  159. package/src/autocomplete.d.ts +5 -2
  160. package/src/autocomplete.ts +67 -43
  161. package/src/bracketed-paste.ts +10 -3
  162. package/src/charts/chart-plan.d.ts +674 -0
  163. package/src/charts/chart-plan.ts +5081 -0
  164. package/src/charts/chart-svg.d.ts +59 -0
  165. package/src/charts/chart-svg.ts +4657 -0
  166. package/src/charts/table-data.d.ts +175 -0
  167. package/src/charts/table-data.ts +1478 -0
  168. package/src/chat/advisor-message.ts +11 -0
  169. package/src/chat/assistant-message.d.ts +11 -1
  170. package/src/chat/assistant-message.ts +245 -54
  171. package/src/chat/chat-transcript-builder.d.ts +3 -0
  172. package/src/chat/chat-transcript-builder.ts +9 -3
  173. package/src/chat/compaction-summary-message.d.ts +1 -0
  174. package/src/chat/compaction-summary-message.ts +8 -0
  175. package/src/chat/execution-shared.d.ts +6 -5
  176. package/src/chat/execution-shared.ts +42 -25
  177. package/src/chat/fence-figure.d.ts +42 -0
  178. package/src/chat/fence-figure.ts +80 -0
  179. package/src/chat/figure-markdown.d.ts +42 -0
  180. package/src/chat/figure-markdown.ts +174 -0
  181. package/src/chat/messages.d.ts +1 -1
  182. package/src/chat/messages.ts +1 -1
  183. package/src/chat/read-tool-group.ts +6 -4
  184. package/src/chat/skill-message.ts +6 -0
  185. package/src/chat/svg-figure.d.ts +33 -0
  186. package/src/chat/svg-figure.ts +399 -0
  187. package/src/chat/svg-source.d.ts +49 -0
  188. package/src/chat/svg-source.ts +188 -0
  189. package/src/chat/table-chart.d.ts +89 -0
  190. package/src/chat/table-chart.ts +294 -0
  191. package/src/chat/tool-execution.d.ts +2 -0
  192. package/src/chat/tool-execution.ts +86 -7
  193. package/src/chat/user-message.d.ts +17 -4
  194. package/src/chat/user-message.ts +71 -8
  195. package/src/chrome/shared.ts +53 -0
  196. package/src/chrome/status-notice.ts +25 -7
  197. package/src/chrome/transcript-container.d.ts +6 -0
  198. package/src/chrome/transcript-container.ts +162 -19
  199. package/src/components/box.d.ts +1 -0
  200. package/src/components/box.ts +5 -0
  201. package/src/components/disclosure.d.ts +1 -0
  202. package/src/components/disclosure.ts +8 -0
  203. package/src/components/editor.d.ts +23 -5
  204. package/src/components/editor.ts +316 -47
  205. package/src/components/form.d.ts +1 -0
  206. package/src/components/form.ts +8 -0
  207. package/src/components/image.d.ts +26 -44
  208. package/src/components/image.ts +115 -152
  209. package/src/components/input.d.ts +2 -1
  210. package/src/components/input.ts +17 -7
  211. package/src/components/key-value-list.d.ts +1 -0
  212. package/src/components/key-value-list.ts +4 -0
  213. package/src/components/layout/row.d.ts +1 -0
  214. package/src/components/layout/row.ts +7 -0
  215. package/src/components/layout/stack.d.ts +1 -0
  216. package/src/components/layout/stack.ts +7 -0
  217. package/src/components/loader.d.ts +5 -6
  218. package/src/components/loader.ts +10 -17
  219. package/src/components/markdown.d.ts +47 -5
  220. package/src/components/markdown.ts +786 -303
  221. package/src/components/scroll-view.d.ts +1 -0
  222. package/src/components/scroll-view.ts +5 -0
  223. package/src/components/section.d.ts +1 -0
  224. package/src/components/section.ts +5 -0
  225. package/src/components/settings-list.ts +2 -0
  226. package/src/components/table.d.ts +1 -0
  227. package/src/components/table.ts +4 -0
  228. package/src/components/text.d.ts +1 -0
  229. package/src/components/text.ts +7 -0
  230. package/src/components/tree-view.d.ts +7 -0
  231. package/src/components/tree-view.ts +38 -8
  232. package/src/components/truncated-text.d.ts +1 -0
  233. package/src/components/truncated-text.ts +5 -0
  234. package/src/desktop-notify.ts +3 -2
  235. package/src/fuzzy.d.ts +29 -1
  236. package/src/fuzzy.ts +115 -30
  237. package/src/hotkeys-markdown.ts +9 -2
  238. package/src/key-hint-format.d.ts +9 -1
  239. package/src/key-hint-format.ts +26 -11
  240. package/src/keybinding-matchers.d.ts +3 -0
  241. package/src/keybinding-matchers.ts +6 -2
  242. package/src/keybindings.d.ts +1 -1
  243. package/src/keybindings.ts +1 -1
  244. package/src/kitty-graphics.d.ts +2 -2
  245. package/src/kitty-graphics.ts +11 -5
  246. package/src/loop-watchdog.d.ts +8 -7
  247. package/src/loop-watchdog.ts +18 -13
  248. package/src/multiplexers/cmux.d.ts +16 -0
  249. package/src/multiplexers/cmux.ts +29 -0
  250. package/src/multiplexers/herdr.d.ts +26 -0
  251. package/src/multiplexers/herdr.ts +64 -0
  252. package/src/multiplexers/notify.d.ts +13 -0
  253. package/src/multiplexers/notify.ts +24 -0
  254. package/src/multiplexers/orca.d.ts +12 -0
  255. package/src/multiplexers/orca.ts +16 -0
  256. package/src/multiplexers/screen.d.ts +9 -0
  257. package/src/multiplexers/screen.ts +15 -0
  258. package/src/multiplexers/tmux.d.ts +29 -0
  259. package/src/multiplexers/tmux.ts +40 -0
  260. package/src/multiplexers/types.d.ts +100 -0
  261. package/src/multiplexers/types.ts +110 -0
  262. package/src/multiplexers/wmux.d.ts +12 -0
  263. package/src/multiplexers/wmux.ts +16 -0
  264. package/src/multiplexers/zellij.d.ts +12 -0
  265. package/src/multiplexers/zellij.ts +24 -0
  266. package/src/native/apply.d.ts +4 -3
  267. package/src/native/apply.ts +4 -3
  268. package/src/native/backend.d.ts +5 -4
  269. package/src/native/backend.ts +199 -22
  270. package/src/native/blobs.d.ts +7 -3
  271. package/src/native/blobs.ts +47 -12
  272. package/src/native/encode.d.ts +8 -6
  273. package/src/native/encode.ts +76 -34
  274. package/src/native/node.d.ts +36 -5
  275. package/src/native/node.ts +31 -5
  276. package/src/native/overlay.d.ts +8 -3
  277. package/src/native/overlay.ts +17 -4
  278. package/src/native/reconcile.ts +16 -4
  279. package/src/native/settle.d.ts +4 -3
  280. package/src/native/settle.ts +4 -3
  281. package/src/overlays/agent-hub-projection.d.ts +6 -5
  282. package/src/overlays/agent-hub-projection.ts +124 -13
  283. package/src/overlays/agent-hub-types.d.ts +9 -0
  284. package/src/overlays/agent-hub-types.ts +6 -0
  285. package/src/overlays/agent-hub.ts +48 -29
  286. package/src/overlays/agent-transcript-viewer.ts +93 -23
  287. package/src/overlays/agents-hub.ts +28 -8
  288. package/src/overlays/annotation-overlay.ts +293 -90
  289. package/src/overlays/annotation-types.ts +2 -0
  290. package/src/overlays/ask-dialog.ts +10 -17
  291. package/src/overlays/btw-history-panel.ts +136 -39
  292. package/src/overlays/copy-selector.d.ts +1 -0
  293. package/src/overlays/copy-selector.ts +32 -8
  294. package/src/overlays/extensions/extension-dashboard.ts +4 -4
  295. package/src/overlays/extensions/state-manager.ts +52 -12
  296. package/src/overlays/history-search.ts +100 -7
  297. package/src/overlays/hook-selector.ts +12 -5
  298. package/src/overlays/hub-frame.ts +19 -1
  299. package/src/overlays/jobs-panel.ts +33 -52
  300. package/src/overlays/model-browser.ts +367 -122
  301. package/src/overlays/model-hub.ts +435 -59
  302. package/src/overlays/move-overlay.ts +28 -14
  303. package/src/overlays/oauth-selector.ts +54 -70
  304. package/src/overlays/pause-screen.ts +2 -2
  305. package/src/overlays/plan-review-overlay.ts +208 -70
  306. package/src/overlays/plugin-settings.ts +3 -3
  307. package/src/overlays/report-panel.ts +191 -0
  308. package/src/overlays/rewind-selector.ts +88 -17
  309. package/src/overlays/session-observer-registry.d.ts +2 -0
  310. package/src/overlays/session-observer-registry.ts +10 -2
  311. package/src/overlays/session-selector.ts +64 -26
  312. package/src/overlays/settings-defs.ts +5 -4
  313. package/src/overlays/settings-selector.ts +33 -8
  314. package/src/overlays/snapcompact-shape-preview.ts +2 -3
  315. package/src/overlays/stats-notice.ts +1 -1
  316. package/src/overlays/thinking-selector.ts +11 -10
  317. package/src/overlays/tree-selector.ts +41 -20
  318. package/src/overlays/usage-dashboard.ts +117 -58
  319. package/src/overlays/usage-display.ts +10 -4
  320. package/src/overlays/usage-row.ts +22 -8
  321. package/src/prompt/attachment-chips.ts +15 -11
  322. package/src/prompt/composer-attachments.ts +6 -4
  323. package/src/prompt/composer-cache.ts +7 -86
  324. package/src/prompt/composer.ts +37 -26
  325. package/src/prompt/custom-editor.ts +282 -105
  326. package/src/prompt/image-source.ts +2 -1
  327. package/src/prompt/interactive-context-helpers.ts +32 -18
  328. package/src/prompt/macos-spelling.ts +7 -0
  329. package/src/prompt/magic-keywords.ts +11 -2
  330. package/src/prompt/model-mention-autocomplete.ts +14 -14
  331. package/src/prompt/queued-messages.ts +6 -4
  332. package/src/prompt/tips.txt +13 -9
  333. package/src/prompt/welcome.ts +64 -46
  334. package/src/prompt/word-completion.ts +38 -5
  335. package/src/render/composite.d.ts +2 -0
  336. package/src/render/composite.ts +64 -0
  337. package/src/render/output-pane.d.ts +1 -0
  338. package/src/render/output-pane.ts +6 -0
  339. package/src/render/render-utils.d.ts +1 -0
  340. package/src/render/render-utils.ts +16 -1
  341. package/src/render/tool-card.d.ts +6 -0
  342. package/src/render/tool-card.ts +15 -0
  343. package/src/render/width-aware-text.d.ts +2 -0
  344. package/src/render/width-aware-text.ts +5 -0
  345. package/src/setup/scenes/model.ts +2 -1
  346. package/src/setup/scenes/types.ts +1 -0
  347. package/src/space-hold.d.ts +40 -25
  348. package/src/space-hold.ts +156 -52
  349. package/src/status-line/component.ts +292 -78
  350. package/src/status-line/context-usage.ts +21 -46
  351. package/src/status-line/host.ts +4 -1
  352. package/src/status-line/segments.ts +40 -22
  353. package/src/status-line/types.ts +15 -3
  354. package/src/terminal-capabilities.d.ts +41 -36
  355. package/src/terminal-capabilities.ts +137 -213
  356. package/src/terminal-multiplexer.d.ts +127 -14
  357. package/src/terminal-multiplexer.ts +112 -33
  358. package/src/terminal.d.ts +23 -16
  359. package/src/terminal.ts +203 -99
  360. package/src/theme/active-symbols.d.ts +1 -1
  361. package/src/theme/active-symbols.ts +1 -1
  362. package/src/theme/schema-validation.ts +1 -0
  363. package/src/theme/schema.d.ts +11 -2
  364. package/src/theme/schema.ts +14 -1
  365. package/src/theme/session-color.ts +1 -7
  366. package/src/theme/symbols.d.ts +1 -1
  367. package/src/theme/symbols.ts +11 -4
  368. package/src/theme/theme-class.d.ts +7 -0
  369. package/src/theme/theme-class.ts +26 -1
  370. package/src/theme/theme-schema.json +5 -1
  371. package/src/theme/theme.d.ts +1 -1
  372. package/src/theme/theme.ts +8 -4
  373. package/src/theme/tui-adapters.d.ts +3 -0
  374. package/src/theme/tui-adapters.ts +68 -0
  375. package/src/thinking.d.ts +1 -1
  376. package/src/thinking.ts +1 -1
  377. package/src/tmux.d.ts +11 -4
  378. package/src/tmux.ts +47 -11
  379. package/src/tools/ast-edit.ts +59 -35
  380. package/src/tools/ast-grep.ts +35 -16
  381. package/src/tools/bash.d.ts +7 -2
  382. package/src/tools/bash.ts +116 -47
  383. package/src/tools/daemon.d.ts +1 -1
  384. package/src/tools/daemon.ts +1 -1
  385. package/src/tools/default-renderer.ts +35 -19
  386. package/src/tools/edit.ts +142 -120
  387. package/src/tools/eval-format/index.ts +28 -2
  388. package/src/tools/eval-format/javascript.ts +7 -5
  389. package/src/tools/eval.d.ts +22 -3
  390. package/src/tools/eval.ts +364 -208
  391. package/src/tools/fetch.ts +5 -6
  392. package/src/tools/glob.d.ts +4 -0
  393. package/src/tools/glob.ts +33 -65
  394. package/src/tools/grep.ts +81 -48
  395. package/src/tools/index.ts +2 -0
  396. package/src/tools/lsp.ts +81 -59
  397. package/src/tools/mcp.ts +111 -68
  398. package/src/tools/native-view.d.ts +47 -0
  399. package/src/tools/native-view.ts +102 -1
  400. package/src/tools/output-meta.d.ts +11 -1
  401. package/src/tools/output-meta.ts +23 -3
  402. package/src/tools/read.ts +7 -5
  403. package/src/tools/renderer.d.ts +37 -2
  404. package/src/tools/renderer.ts +42 -2
  405. package/src/tools/streaming-output.d.ts +20 -1
  406. package/src/tools/streaming-output.ts +154 -50
  407. package/src/tools/task.d.ts +2 -3
  408. package/src/tools/task.ts +115 -62
  409. package/src/tools/todo.ts +119 -30
  410. package/src/tools/wait.ts +34 -24
  411. package/src/tools/web-search.ts +1 -1
  412. package/src/tools/write.d.ts +9 -2
  413. package/src/tools/write.ts +147 -95
  414. package/src/tools/yield.d.ts +22 -0
  415. package/src/tools/yield.ts +225 -0
  416. package/src/tui.d.ts +36 -0
  417. package/src/tui.ts +666 -217
  418. package/src/utils.d.ts +6 -0
  419. package/src/utils.ts +19 -0
  420. package/src/vim.d.ts +19 -5
  421. package/src/vim.ts +333 -18
  422. package/src/windows-input-mode.d.ts +33 -1
  423. package/src/windows-input-mode.ts +212 -6
@@ -165,6 +165,9 @@ export const COMPOSER_TOKEN_REGEX = new RegExp(
165
165
  "gu",
166
166
  );
167
167
 
168
+ /** Last compiled {@link referencedAttachments} scanner, keyed by its source (labels and glyphs rarely change). */
169
+ let cachedScanner: { source: string; scanner: RegExp } | undefined;
170
+
168
171
  /**
169
172
  * Attachment indices referenced by a composer buffer, per kind. Image/video count compact chips
170
173
  * and expanded markers; paste counts compact chips only, since `[Paste #N]` markers number the
@@ -182,10 +185,9 @@ export function referencedAttachments(
182
185
  const icons = [...kindByIcon.keys()].sort((a, b) => b.length - a.length).map(glyphSource);
183
186
  const labels = [...recorded.keys()].sort((a, b) => b.length - a.length).map(label => RegExp.escape(label));
184
187
  const recordedSource = labels.length > 0 ? labels.join("|") : "(?!)";
185
- const scanner = new RegExp(
186
- `${PLACEHOLDER_REGEX.source}|(${recordedSource})(?!\\d)|(${icons.join("|")}) #([1-9]\\d*)`,
187
- "gu",
188
- );
188
+ const source = `${PLACEHOLDER_REGEX.source}|(${recordedSource})(?!\\d)|(${icons.join("|")}) #([1-9]\\d*)`;
189
+ if (cachedScanner?.source !== source) cachedScanner = { source, scanner: new RegExp(source, "gu") };
190
+ const { scanner } = cachedScanner;
189
191
 
190
192
  const refs: Record<ChipKind, Set<number>> = { image: new Set(), video: new Set(), paste: new Set() };
191
193
  for (const match of text.matchAll(scanner)) {
@@ -35,7 +35,6 @@ import { isWordCompletionMethod } from "./word-completion";
35
35
  const FORMAT_VERSION = 1;
36
36
  /** Project key of rows that serve every project lacking its own. */
37
37
  const ANY_PROJECT = "";
38
- const RECENT_SESSION_LIMIT = 4;
39
38
 
40
39
  const SCHEMA = `
41
40
  PRAGMA journal_mode=WAL;
@@ -48,9 +47,8 @@ CREATE TABLE IF NOT EXISTS entries (
48
47
  ) WITHOUT ROWID;
49
48
  `;
50
49
 
51
- type EntryKind = "ui" | "welcome" | "recent-sessions" | "lsp-servers" | "status";
52
- /** Kinds mirrored under {@link ANY_PROJECT} as the fallback for projects without their own row. */
53
- type SharedEntryKind = "ui" | "welcome" | "status";
50
+ /** Every kind is mirrored under {@link ANY_PROJECT} as the fallback for projects without their own row. */
51
+ type EntryKind = "ui" | "status";
54
52
 
55
53
  /** Theme inputs cached from the last resolved settings load for stable prepaint colors. */
56
54
  export interface ComposerThemePreferences {
@@ -60,20 +58,10 @@ export interface ComposerThemePreferences {
60
58
  readonly lightTheme?: string;
61
59
  }
62
60
 
63
- /** Last authoritative model labels shown in the welcome component. */
64
- export interface ComposerWelcomeCache {
65
- readonly modelName: string;
66
- readonly providerName: string;
67
- }
68
-
69
61
  /** Speculative composer state read before the settings/session graph is available. */
70
62
  export interface ComposerStartupCache {
71
63
  readonly preferences?: ComposerPreferences;
72
64
  readonly theme?: ComposerThemePreferences;
73
- readonly welcome?: ComposerWelcomeCache;
74
- readonly recentSessions: RecentSession[];
75
- /** `null` when the last run had LSP disabled. */
76
- readonly lspServers: LspServerInfo[] | null;
77
65
  readonly status?: ComposerStatusCache;
78
66
  }
79
67
 
@@ -86,44 +74,6 @@ function parseJson(value: string | undefined): unknown {
86
74
  }
87
75
  }
88
76
 
89
- function parseRecentSessions(value: unknown): RecentSession[] {
90
- if (!Array.isArray(value)) return [];
91
- const sessions: RecentSession[] = [];
92
- for (const item of value) {
93
- if (!isRecord(item)) continue;
94
- const { name, timeAgo } = item;
95
- if (typeof name === "string" && typeof timeAgo === "string") sessions.push({ name, timeAgo });
96
- if (sessions.length === RECENT_SESSION_LIMIT) break;
97
- }
98
- return sessions;
99
- }
100
-
101
- function parseLspServers(value: unknown): LspServerInfo[] | null {
102
- if (value === null) return null;
103
- if (!Array.isArray(value)) return [];
104
- const servers: LspServerInfo[] = [];
105
- for (const item of value) {
106
- if (!isRecord(item)) continue;
107
- const { name, status, fileTypes } = item;
108
- if (
109
- typeof name !== "string" ||
110
- (status !== "ready" && status !== "error" && status !== "connecting" && status !== "available") ||
111
- !Array.isArray(fileTypes) ||
112
- !fileTypes.every(fileType => typeof fileType === "string")
113
- ) {
114
- continue;
115
- }
116
- servers.push({ name, status, fileTypes });
117
- }
118
- return servers;
119
- }
120
-
121
- function parseWelcome(value: unknown): ComposerWelcomeCache | undefined {
122
- if (!isRecord(value)) return undefined;
123
- const { modelName, providerName } = value;
124
- return typeof modelName === "string" && typeof providerName === "string" ? { modelName, providerName } : undefined;
125
- }
126
-
127
77
  function parseStatus(value: unknown): ComposerStatusCache | undefined {
128
78
  if (!isRecord(value)) return undefined;
129
79
  const statusLine = readStatusLineStartupData(value.statusLine);
@@ -275,9 +225,6 @@ export class ComposerCache {
275
225
  return {
276
226
  preferences: ui?.preferences,
277
227
  theme: ui?.theme,
278
- welcome: parseWelcome(parseJson(own.welcome)) ?? parseWelcome(parseJson(anyProject.welcome)),
279
- recentSessions: parseRecentSessions(parseJson(own["recent-sessions"])),
280
- lspServers: own["lsp-servers"] === undefined ? [] : parseLspServers(parseJson(own["lsp-servers"])),
281
228
  status: parseStatus(parseJson(own.status)) ?? parseStatus(parseJson(anyProject.status)),
282
229
  };
283
230
  }
@@ -287,21 +234,6 @@ export class ComposerCache {
287
234
  this.#putShared(cwd, "ui", { preferences, theme });
288
235
  }
289
236
 
290
- /** Authoritative model/provider labels for the next welcome prepaint. */
291
- writeWelcome(cwd: string, welcome: ComposerWelcomeCache): void {
292
- this.#putShared(cwd, "welcome", welcome);
293
- }
294
-
295
- /** The latest recent-session rows (first four). */
296
- writeRecentSessions(cwd: string, sessions: readonly RecentSession[]): void {
297
- this.#put(cwd, "recent-sessions", sessions.slice(0, RECENT_SESSION_LIMIT));
298
- }
299
-
300
- /** The latest detected project LSP rows; `null` records that LSP is disabled. */
301
- writeLspServers(cwd: string, servers: readonly LspServerInfo[] | null): void {
302
- this.#put(cwd, "lsp-servers", servers);
303
- }
304
-
305
237
  /** Status-bar inputs for the next prepaint's startup status line. */
306
238
  writeStatus(cwd: string, status: ComposerStatusCache): void {
307
239
  this.#putShared(cwd, "status", status);
@@ -314,22 +246,11 @@ export class ComposerCache {
314
246
  this.#db.close();
315
247
  }
316
248
 
317
- /** Best-effort upsert: a failed write only costs the next launch its speculation. */
318
- #put(cwd: string, kind: EntryKind, value: unknown): void {
319
- const project = path.resolve(cwd);
320
- const json = JSON.stringify(value);
321
- const key = `${project}\0${kind}`;
322
- if (this.#known.get(key) === json) return;
323
- try {
324
- this.#upsert.run(project, kind, json);
325
- this.#known.set(key, json);
326
- } catch (error) {
327
- logger.debug("composer cache write failed", { kind, error: String(error) });
328
- }
329
- }
330
-
331
- /** {@link #put} for this project plus the any-project fallback row, atomically. */
332
- #putShared(cwd: string, kind: SharedEntryKind, value: unknown): void {
249
+ /**
250
+ * Best-effort upsert of this project's row plus the any-project fallback row,
251
+ * atomically: a failed write only costs the next launch its speculation.
252
+ */
253
+ #putShared(cwd: string, kind: EntryKind, value: unknown): void {
333
254
  const project = path.resolve(cwd);
334
255
  const json = JSON.stringify(value);
335
256
  const ownKey = `${project}\0${kind}`;
@@ -15,14 +15,14 @@ import {
15
15
  type TUIOptions,
16
16
  type ViewportSize,
17
17
  } from "../tui";
18
- import { sliceWithWidth, visibleWidth } from "../utils";
18
+ import { wrapLiteralLine } from "../utils";
19
19
  import type { NativeChild, NativeSurface, NativeSurfaceProvider } from "../native/node";
20
20
  import { sameItems } from "../native/memo";
21
21
  import { postmortem } from "@linxiraos/pi-utils";
22
22
  import { CustomEditor } from "./custom-editor";
23
23
  import type { WordCompletionMethod } from "./word-completion";
24
24
  import { type AnimationFrame, TranscriptContainer } from "../chrome/transcript-container";
25
- import { type LspServerInfo, type RecentSession, WelcomeComponent } from "./welcome";
25
+ import { WelcomeComponent, type RecentSession, type LspServerInfo } from "./welcome";
26
26
  import { ensureThemeSync, getEditorTheme, theme } from "../theme/theme";
27
27
 
28
28
  const DOUBLE_INTERRUPT_MS = 500;
@@ -82,7 +82,7 @@ export interface ComposerStatusCache {
82
82
  /** Optional dependencies and initial state for a standalone composer. */
83
83
  export interface ComposerOptions {
84
84
  readonly terminal?: Terminal;
85
- /** Extra TUI construction options (render scheduler injection for tests and `zeta render`). */
85
+ /** Extra TUI construction options (render scheduler injection for tests and `zetacode render`). */
86
86
  readonly tuiOptions?: TUIOptions;
87
87
  readonly preferences?: Partial<ComposerPreferences>;
88
88
  readonly welcome?: ComposerWelcomeUpdate;
@@ -279,6 +279,8 @@ export class Composer implements TerminalFrameProvider, NativeSurfaceProvider {
279
279
  #transientChrome: ReadonlySet<Component> = new Set();
280
280
  #transientChromeFloor: number | undefined;
281
281
  #anchorAfterInlineRetirement = false;
282
+ /** Rows the chrome below each below-transcript root took in the last frame (see {@link rowsBelow}). */
283
+ #rowsBelow = new Map<Component, number>();
282
284
  #lastInterruptAt = 0;
283
285
  /** Last described surface; its arrays are reused while their children are unchanged. */
284
286
  #nativeSurface: NativeSurface = { main: [], dock: [] };
@@ -347,6 +349,27 @@ export class Composer implements TerminalFrameProvider, NativeSurfaceProvider {
347
349
  this.ui.addChild(this.#statusHost);
348
350
  this.ui.setFocus(this.editor);
349
351
  }
352
+ /**
353
+ * Rows the below-transcript chrome under `root` (editor, status line, …)
354
+ * took in the last frame, so a root that grows upward can cap itself to
355
+ * the screen rows left above them; `undefined` before `root` was laid out.
356
+ */
357
+ rowsBelow(root: Component): number | undefined {
358
+ return this.#rowsBelow.get(root);
359
+ }
360
+
361
+ /**
362
+ * Keep the input on the bottom row while the live rows cannot fill the
363
+ * screen, as after an inline decision panel closes. A tall block that just
364
+ * left the chrome above the editor (a command report) may have scrolled
365
+ * rows into native history that cannot be pulled back; without the pin the
366
+ * editor would jump up to where the shorter frame now ends. The pin lifts
367
+ * once live rows fill the screen again.
368
+ */
369
+ pinInputToBottom(): void {
370
+ this.#anchorAfterInlineRetirement = true;
371
+ }
372
+
350
373
  /** Compose the bounded mutable viewport and the next ordered history append. */
351
374
  renderFrame(viewport: ViewportSize): TerminalFramePlan {
352
375
  if (!this.#started || this.#stopped) return { viewport: [] };
@@ -373,10 +396,12 @@ export class Composer implements TerminalFrameProvider, NativeSurfaceProvider {
373
396
  let transientRows = 0;
374
397
  let displacingRows = 0;
375
398
  let decisionPanelOpen = false;
399
+ const ends: { root: Component; end: number }[] = [];
376
400
  for (const root of afterRoots) {
377
401
  const chrome: Component = root;
378
402
  const start = after.length;
379
403
  this.#renderBelowRoot(root, width, after, afterSpans);
404
+ ends.push({ root, end: after.length });
380
405
  if (this.#transientChrome.has(root)) transientRows += after.length - start;
381
406
  if (
382
407
  chrome.retireDisplacedTranscript ||
@@ -386,6 +411,7 @@ export class Composer implements TerminalFrameProvider, NativeSurfaceProvider {
386
411
  decisionPanelOpen = true;
387
412
  }
388
413
  }
414
+ this.#rowsBelow = new Map(ends.map(({ root, end }) => [root, after.length - end]));
389
415
  // Offer history under capacity pressure only: blocks stay live (and keep
390
416
  // reflowing to the current width) while the screen has room. A batch
391
417
  // leaves the mutable viewport in the same frame it is appended, so its
@@ -786,20 +812,8 @@ export class Composer implements TerminalFrameProvider, NativeSurfaceProvider {
786
812
  if (!lines) return [];
787
813
  if (isInsideTerminalMultiplexer()) return lines.slice(start);
788
814
  const reflowed: string[] = [];
789
- const columns = Math.max(1, width);
790
815
  for (let index = start; index < lines.length; index++) {
791
- const line = lines[index]!;
792
- const lineWidth = visibleWidth(line);
793
- if (lineWidth === 0) {
794
- reflowed.push("");
795
- continue;
796
- }
797
- for (let column = 0; column < lineWidth;) {
798
- let slice = sliceWithWidth(line, column, columns, true);
799
- if (slice.width === 0) slice = sliceWithWidth(line, column, columns);
800
- reflowed.push(slice.text);
801
- column += Math.max(1, slice.width);
802
- }
816
+ reflowed.push(...wrapLiteralLine(lines[index]!, width));
803
817
  }
804
818
  return reflowed;
805
819
  }
@@ -871,7 +885,7 @@ export class Composer implements TerminalFrameProvider, NativeSurfaceProvider {
871
885
  this.ui.requestRender();
872
886
  }
873
887
 
874
- /** Patch welcome data in place as model, session, and project discovery complete. */
888
+ /** Patch welcome data in place as version, session, and project discovery complete. */
875
889
  updateWelcome(update: ComposerWelcomeUpdate): void {
876
890
  if (this.#stopped) return;
877
891
  this.#applyWelcomeUpdate(update);
@@ -880,11 +894,7 @@ export class Composer implements TerminalFrameProvider, NativeSurfaceProvider {
880
894
  const welcome = this.#welcome;
881
895
  if (!welcome) return;
882
896
  if (update.version !== undefined) welcome.setVersion(this.#version);
883
- if (update.modelName !== undefined || update.providerName !== undefined) {
884
- welcome.setModel(this.#modelName, this.#providerName);
885
- }
886
- if (update.recentSessions !== undefined) welcome.setRecentSessions(this.#recentSessions);
887
- if (update.lspServers !== undefined) welcome.setLspServers(this.#lspServers);
897
+ welcome.setModel(this.#modelName, this.#providerName);
888
898
  this.ui.requestRender();
889
899
  }
890
900
 
@@ -899,6 +909,7 @@ export class Composer implements TerminalFrameProvider, NativeSurfaceProvider {
899
909
 
900
910
  /** Update the canonical editor reference after InteractiveMode remounts a custom editor. */
901
911
  setEditor(editor: CustomEditor): void {
912
+ this.ui.replaceHeldFocus(this.#editor, editor);
902
913
  this.#editor = editor;
903
914
  }
904
915
 
@@ -965,10 +976,10 @@ export class Composer implements TerminalFrameProvider, NativeSurfaceProvider {
965
976
 
966
977
  #applyWelcomeUpdate(update: ComposerWelcomeUpdate): void {
967
978
  if (update.version !== undefined) this.#version = update.version;
968
- if (update.modelName !== undefined) this.#modelName = update.modelName;
969
- if (update.providerName !== undefined) this.#providerName = update.providerName;
970
- if (update.recentSessions !== undefined) this.#recentSessions = [...update.recentSessions];
971
- if (update.lspServers !== undefined) this.#lspServers = update.lspServers && [...update.lspServers];
979
+ if (update.modelName !== undefined || update.providerName !== undefined) {
980
+ this.#modelName = update.modelName ?? this.#modelName;
981
+ this.#providerName = update.providerName ?? this.#providerName;
982
+ }
972
983
  }
973
984
 
974
985
  #ensureWelcome(): void {