@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
@@ -6,7 +6,7 @@ import { type Component, type ResizeScrollbackMode, type TerminalFramePlan, type
6
6
  import type { NativeSurface, NativeSurfaceProvider } from "../native/node.js";
7
7
  import { CustomEditor } from "./custom-editor.js";
8
8
  import type { WordCompletionMethod } from "./word-completion.js";
9
- import { type LspServerInfo, type RecentSession, WelcomeComponent } from "./welcome.js";
9
+ import { WelcomeComponent, type RecentSession, type LspServerInfo } from "./welcome.js";
10
10
  /** Live settings that affect the composer before and after session adoption. */
11
11
  export interface ComposerPreferences {
12
12
  readonly quiet: boolean;
@@ -47,7 +47,7 @@ export interface ComposerStatusCache {
47
47
  /** Optional dependencies and initial state for a standalone composer. */
48
48
  export interface ComposerOptions {
49
49
  readonly terminal?: Terminal;
50
- /** Extra TUI construction options (render scheduler injection for tests and `zeta render`). */
50
+ /** Extra TUI construction options (render scheduler injection for tests and `zetacode render`). */
51
51
  readonly tuiOptions?: TUIOptions;
52
52
  readonly preferences?: Partial<ComposerPreferences>;
53
53
  readonly welcome?: ComposerWelcomeUpdate;
@@ -122,6 +122,21 @@ export declare class Composer implements TerminalFrameProvider, NativeSurfacePro
122
122
  #private;
123
123
  readonly ui: TUI;
124
124
  constructor(options?: ComposerOptions);
125
+ /**
126
+ * Rows the below-transcript chrome under `root` (editor, status line, …)
127
+ * took in the last frame, so a root that grows upward can cap itself to
128
+ * the screen rows left above them; `undefined` before `root` was laid out.
129
+ */
130
+ rowsBelow(root: Component): number | undefined;
131
+ /**
132
+ * Keep the input on the bottom row while the live rows cannot fill the
133
+ * screen, as after an inline decision panel closes. A tall block that just
134
+ * left the chrome above the editor (a command report) may have scrolled
135
+ * rows into native history that cannot be pulled back; without the pin the
136
+ * editor would jump up to where the shorter frame now ends. The pin lifts
137
+ * once live rows fill the screen again.
138
+ */
139
+ pinInputToBottom(): void;
125
140
  /** Compose the bounded mutable viewport and the next ordered history append. */
126
141
  renderFrame(viewport: ViewportSize): TerminalFramePlan;
127
142
  /**
@@ -164,7 +179,7 @@ export declare class Composer implements TerminalFrameProvider, NativeSurfacePro
164
179
  enableInput(): void;
165
180
  /** Apply settings changes without replacing the editor or welcome component. */
166
181
  setPreferences(update: Partial<ComposerPreferences>): void;
167
- /** Patch welcome data in place as model, session, and project discovery complete. */
182
+ /** Patch welcome data in place as version, session, and project discovery complete. */
168
183
  updateWelcome(update: ComposerWelcomeUpdate): void;
169
184
  /** Replace optional header content around the stable welcome scene. */
170
185
  setHeaderExtras(before: readonly Component[], after: readonly Component[]): void;
@@ -7,7 +7,7 @@ import type { AppKeybinding } from "../app-keybindings.js";
7
7
  import type { DescribeContext, NativeNode, NativeUiEvent } from "../native/node.js";
8
8
  import type { ComposerFactsSource } from "../status-line/types.js";
9
9
  import { type MacOSSpellingFeatures } from "./macos-spelling.js";
10
- import type { TspEditorDecoration } from "@linxiraos/pi-wire";
10
+ import type { TspEditorDecoration, TspText } from "@linxiraos/pi-wire";
11
11
  import { type WordCompletionMethod } from "./word-completion.js";
12
12
  /** Live composer state the TSP layout shows; the interactive host wires {@link CustomEditor.composerState}. */
13
13
  export interface ComposerNativeState {
@@ -18,10 +18,16 @@ export interface ComposerNativeState {
18
18
  };
19
19
  /** Thinking effort word (`high`, `off`, `auto`); undefined when the model has no thinking. */
20
20
  readonly thinking?: string;
21
+ /** The thinking level draws as the model chip's icon instead of its own chip (where the terminal has `effort`). */
22
+ readonly thinkingInModel?: boolean;
23
+ /** Generation tok/s after the thinking level (live while running, else the last reading); undefined hides it. */
24
+ readonly rate?: number;
21
25
  /** A turn is running: the send keycap becomes a Stop button. */
22
26
  readonly running: boolean;
23
27
  /** The viewed subagent's lineage, outermost first and the viewed agent last; undefined on the main session. */
24
28
  readonly viewing?: readonly string[];
29
+ /** The session's title, quoted in italics as the TSP placeholder; undefined until it has one. */
30
+ readonly title?: string;
25
31
  }
26
32
  /** Independently switchable prose-assistance features of the composer. */
27
33
  export interface SpellingFeatures extends MacOSSpellingFeatures {
@@ -112,19 +118,19 @@ export declare class CustomEditor extends Editor {
112
118
  * Numbered by a per-draft monotonic counter so a deleted chip never recycles its number
113
119
  * (labels key the atom table). */
114
120
  pendingTexts: TextAttachment[];
115
- /** Host-wired producer of per-image `file://` links (session blob store); drives clickable
116
- * chip tokens for restored drafts (esc-esc, `/tree`, branch). */
121
+ /** Host-wired producer of per-image chip targets (a file on disk, or a session blob copy);
122
+ * drives clickable chip tokens for restored drafts (esc-esc, `/tree`, branch). */
117
123
  draftImageLinkMaterializer?: (images: readonly ImageContent[]) => Promise<(string | undefined)[] | undefined>;
118
124
  /**
119
125
  * The host {@link TUI}, captured when a plugin constructs this editor through
120
- * the upstream-pi `(tui, theme, keybindings)` convention. Undefined for zeta's
126
+ * the upstream-pi `(tui, theme, keybindings)` convention. Undefined for omp's
121
127
  * own `new CustomEditor(theme)` callers (they drive repaints through the
122
128
  * interactive-mode wiring instead). Plugins that call `this.tui.requestRender()`
123
129
  * in their overrides read it here (issue #4766).
124
130
  */
125
131
  tui?: TUI;
126
132
  /**
127
- * Accept both the zeta constructor convention — `new CustomEditor(theme)` —
133
+ * Accept both the omp constructor convention — `new CustomEditor(theme)` —
128
134
  * and the upstream-pi `Editor` convention — `new Editor(tui, theme, keybindings)`
129
135
  * — that {@link ExtensionUIContext.setEditorComponent}'s factory contract
130
136
  * advertises `(tui, theme, keybindings)`. Plugins written against upstream pi
@@ -187,7 +193,8 @@ export declare class CustomEditor extends Editor {
187
193
  static readonly SHIMMER_PERIOD_MS = 1800;
188
194
  /** Decorate magic keywords, attachments, and the queue-composer header/list markers.
189
195
  * Queue shorthand reserves its first logical line as a dim `Queueing` label; sequential
190
- * item markers use the accent color so separate follow-ups remain visible while composing. */
196
+ * item markers use the accent color so separate follow-ups remain visible while composing.
197
+ * Called once per layout segment, so whole-buffer inputs are computed once per text revision. */
191
198
  decorateText: (text: string, context: EditorTextDecorationContext) => string;
192
199
  /**
193
200
  * TSP decorations: magic keywords shimmer (terminal-clocked) in the accent
@@ -213,8 +220,10 @@ export declare class CustomEditor extends Editor {
213
220
  * once after construction (and again after `setEditorComponent` swaps the
214
221
  * editor). Passing `undefined` clears any pending frame. */
215
222
  setShimmerRepaintHandler(handler: (() => void) | undefined): void;
216
- /** Viewing a subagent, the draft goes to it: the placeholder names it. */
217
- describePlaceholder: () => string;
223
+ /** Editing is available during bootstrap; atomic sends wait until submission is wired and enabled. */
224
+ protected get nativeSendable(): boolean;
225
+ /** Viewing a subagent, the draft goes to it: the placeholder names it; else the session's title, quoted in italics. */
226
+ describePlaceholder: () => TspText;
218
227
  /** A shell-mode draft highlights as its language. */
219
228
  describeLanguage: () => string | undefined;
220
229
  /** Host-owned live state for the TSP composer (shell mode, effort chip, send/stop). */
@@ -227,7 +236,8 @@ export declare class CustomEditor extends Editor {
227
236
  * The TSP composer: role `zeta.editor[.bash|.python]` (tone `pending` while
228
237
  * a turn runs) over the context hairline, the viewing header while a
229
238
  * subagent is focused, the attachment chips, a `line` row of the
230
- * shell-mode chip and the input, and the `bar`: model chip, effort chip,
239
+ * shell-mode chip and the input, and the `bar`: model chip, effort chip
240
+ * (or the effort glyph as the model chip's icon), the generation rate,
231
241
  * the other status facts, usage, then send (Stop while a turn runs).
232
242
  * Clicks come back as `status.model`, `thinking.cycle`, `submit`,
233
243
  * `interrupt` and `focus:<id>` actions.
@@ -237,7 +247,8 @@ export declare class CustomEditor extends Editor {
237
247
  * Clicks on the composer's controls take the same paths as their keys: ⇧⇥,
238
248
  * ⏎ and Esc; the viewing header's links (`focus:<id>`) go to the host,
239
249
  * the status facts' clicks (`status.*`) to their source. Selection edits
240
- * go to the buffer.
250
+ * go to the buffer; `send` submits its own prompt after saving the old draft
251
+ * for recall and waiting for in-flight clipboard work.
241
252
  */
242
253
  handleNativeEvent(event: NativeUiEvent): void;
243
254
  onEscape?: () => void;
@@ -268,9 +279,9 @@ export declare class CustomEditor extends Editor {
268
279
  onLeftAtStart?: () => void;
269
280
  /** Called when the viewing header asks to view agent `id` ({@link MAIN_AGENT_ID}: the main session). */
270
281
  onFocusAgent?: (id: string) => void;
271
- /** Space-bar push-to-talk; set its `handler` to enable it. It is a text-composition gesture, so it
272
- * stays out of Vim's Normal/Visual modes (where the space bar is the `l` motion) and away from an
273
- * open autocomplete menu. */
282
+ /** Configurable push-to-talk; set its `handler` to enable it. It is a text-composition gesture, so
283
+ * it stays out of Vim's Normal/Visual modes (where the space bar is the `l` motion), away from an
284
+ * open autocomplete menu, and out of a pending character jump (whose target may be the key). */
274
285
  readonly spaceHold: SpaceHoldGesture;
275
286
  setActionKeys(action: ConfigurableEditorAction, keys: KeyId[]): void;
276
287
  /**
@@ -285,6 +296,7 @@ export declare class CustomEditor extends Editor {
285
296
  * Clear all custom key handlers.
286
297
  */
287
298
  clearCustomKeyHandlers(): void;
299
+ capturesInput(data: string): boolean;
288
300
  handleInput(data: string): void;
289
301
  /**
290
302
  * Route a keystroke through the base text-editor pipeline only, skipping the
@@ -4,7 +4,8 @@
4
4
  * to the session's `local://` root, and generated video contact-sheet previews.
5
5
  * Symbol metadata stays out of serialized/model-bound image data while traveling
6
6
  * with the draft object, until AgentSession creates the hidden companion message
7
- * that tells the model the path (and link materialization prefers it over a blob copy).
7
+ * that tells the model the path. The model keeps `local://` references across
8
+ * `/move`; chips for internal URLs instead use a stable blob copy.
8
9
  */
9
10
  import type { ImageContent } from "@linxiraos/pi-ai";
10
11
  /** How an image attachment's backing file entered the session. */
@@ -15,14 +15,18 @@ export interface AssistantMessageHost {
15
15
  readonly viewSession: AssistantMessageSession;
16
16
  readonly effectiveHideThinkingBlock: boolean;
17
17
  readonly proseOnlyThinking: boolean;
18
+ readonly expandThinkingBlocks: boolean;
18
19
  readonly assistantImagesVisible: boolean;
20
+ /** Whether the viewed session's tables get charts: the main session's do, a focused subagent's do not. */
21
+ readonly tableChartsVisible: boolean;
19
22
  readonly hideToolActivity: boolean;
20
23
  readonly toolOutputExpanded: boolean;
21
24
  readonly ui: {
22
25
  requestRender(): void;
23
26
  readonly imageBudget: ImageBudget;
24
27
  };
25
- resolveAssistantMessageLinks(texts: readonly string[]): Promise<ReadonlyMap<string, string>>;
28
+ /** Resolve already-extracted Markdown link destinations to local targets. */
29
+ resolveAssistantMessageLinkHrefs(hrefs: readonly string[]): Promise<ReadonlyMap<string, string>>;
26
30
  }
27
31
  /**
28
32
  * Resolve and cache the current session's model-authored prose links. Existing
@@ -19,7 +19,7 @@ export declare function applyModelMentionCompletion(lines: string[], cursorLine:
19
19
  };
20
20
  /**
21
21
  * Create a session-scoped model candidate lookup using picker ordering. The
22
- * scope and search affinity are reused across queries until their inputs change.
22
+ * scope and its prepared ranker are reused across queries until their inputs change.
23
23
  */
24
24
  export declare function createModelMentionSource(host: {
25
25
  source: ModelBrowserSource;
@@ -14,7 +14,12 @@ export declare const WELCOME_LSP_SLOTS = 4;
14
14
  * `r` is a uniform sample in [0, 1). Returns "" when `tips` is empty.
15
15
  * Exported for tests. */
16
16
  export declare function pickWeightedTip(tips: readonly string[], r: number): string;
17
- export declare function renderWelcomeTip(tip: string, boxWidth: number, phase?: number): string[];
17
+ /**
18
+ * The welcome tip as lines of at most `width` columns: `Tip:` and the body
19
+ * wrapped together, with no indent, so the banner can center each line.
20
+ * `[]` when `width` leaves no room for a useful line.
21
+ */
22
+ export declare function renderWelcomeTip(tip: string, width: number, phase?: number): string[];
18
23
  export interface RecentSession {
19
24
  name: string;
20
25
  timeAgo: string;
@@ -37,7 +42,7 @@ export declare class WelcomeComponent implements Component {
37
42
  private recentSessions;
38
43
  /** Detected project servers; `null` means LSP is disabled and hides the section. */
39
44
  private lspServers;
40
- constructor(version: string, modelName: string, providerName: string, recentSessions?: RecentSession[],
45
+ constructor(version: string, modelName?: string, providerName?: string, recentSessions?: RecentSession[],
41
46
  /** Detected project servers; `null` means LSP is disabled and hides the section. */
42
47
  lspServers?: LspServerInfo[] | null);
43
48
  get tip(): string | undefined;
@@ -0,0 +1,2 @@
1
+ /** Splice overlay content into a base line at a specific column. Single-pass optimized. */
2
+ export declare function compositeLineAt(baseLine: string, overlayLine: string, startCol: number, overlayWidth: number, totalWidth: number): string;
@@ -92,6 +92,7 @@ export declare class OutputPane implements Component {
92
92
  describe(_cx: DescribeContext): NativeNode;
93
93
  render(width: number): readonly string[];
94
94
  invalidate(): void;
95
+ releaseRenderCaches(): void;
95
96
  }
96
97
  /** Default styling for plain tool output while preserving existing ANSI. */
97
98
  export declare function styleToolOutputLine(line: string, theme: Theme): string;
@@ -298,6 +298,7 @@ export interface RenderedStringCache {
298
298
  export declare function createRenderedStringCache(): RenderedStringCache;
299
299
  /** Drop the memo so the next lookup re-renders (e.g. the render function identity changed). */
300
300
  export declare function invalidateRenderedStringCache(cache: RenderedStringCache): void;
301
+ export declare function releaseRenderedStringCache(cache: RenderedStringCache): void;
301
302
  /** Reuse a rendered string while its theme, expansion, content, and salt match. */
302
303
  export declare function cachedRenderedString(cache: RenderedStringCache | undefined, theme: Theme, expanded: boolean, salt: string, content: string, render: () => string): string;
303
304
  /**
@@ -46,6 +46,11 @@ export interface ToolCardOptions {
46
46
  paddingY?: number;
47
47
  ignoreTight?: boolean;
48
48
  onInvalidate?: () => void;
49
+ /**
50
+ * Drop builder-owned memos the next build recomputes. Called by
51
+ * {@link ToolCard.releaseRenderCaches}, which never calls `onInvalidate`.
52
+ */
53
+ onReleaseRenderCaches?: () => void;
49
54
  onDispose?: () => void;
50
55
  }
51
56
  /** Map transcript lifecycle terminology onto the output frame's visual states. */
@@ -71,6 +76,7 @@ export declare class ToolCard implements Component {
71
76
  handleInput(data: string): void;
72
77
  setIgnoreTight(ignore: boolean): void;
73
78
  invalidate(): void;
79
+ releaseRenderCaches(): void;
74
80
  dispose(): void;
75
81
  }
76
82
  /** Construct a lazy framed tool card. */
@@ -20,6 +20,8 @@ export declare class WidthAwareText implements Component {
20
20
  setCustomBgFn(customBgFn?: (text: string) => string): void;
21
21
  setIgnoreTight(ignore: boolean): this;
22
22
  invalidate(): void;
23
+ /** The formatted text stays: the inner `Text` renders from it, so dropping it would free nothing. */
24
+ releaseRenderCaches(): void;
23
25
  /**
24
26
  * Re-run the formatter on the next render because its inputs changed.
25
27
  * Unlike {@link invalidate}, the inner `Text` keeps its wrap cache, so a
@@ -28,6 +28,7 @@ export interface SetupHost extends SetupUiHost {
28
28
  readonly disabledProviders: readonly string[];
29
29
  readonly authStorage: AuthStorage;
30
30
  readonly modelSource: ModelBrowserSource;
31
+ /** Available and catalog models of every kind; role chips resolve over all of them, rows list chat models. */
31
32
  getModels(): {
32
33
  available: Model[];
33
34
  all: Model[];
@@ -1,45 +1,60 @@
1
- /** Max gap (ms) between two spaces for the later one to count as OS key auto-repeat rather than a
2
- * deliberate press. OS auto-repeat is fast; a deliberate tap (even a fast one) is slower. */
1
+ import { type KeyId } from "./keys.js";
2
+ /** Printable text a push-to-talk candidate key types (plain or shifted single characters and Space),
3
+ * or undefined for non-printable keys and chords, which the gesture reserves instead of typing. */
4
+ export declare function getSpaceHoldText(data: string, canonical: string | undefined): string | undefined;
5
+ /** Max gap (ms) between two configured-key presses for a later one to count as OS key auto-repeat
6
+ * rather than a deliberate press. OS auto-repeat is fast; a deliberate tap (even a fast one) is slower. */
3
7
  export declare const SPACE_REPEAT_MAX_GAP_MS = 120;
4
- /** Two consecutive inter-space gaps are "mechanical" (machine-driven auto-repeat) when both are
8
+ /** Two consecutive inter-key gaps are "mechanical" (machine-driven auto-repeat) when both are
5
9
  * within {@link SPACE_REPEAT_MAX_GAP_MS} and differ by no more than this — an absolute jitter floor
6
10
  * or, for slower repeat rates, {@link SPACE_REPEAT_JITTER_RATIO} of the smaller gap. OS key-repeat
7
- * is metronomic; a human smashing the bar is fast but irregular, so its deltas never stay this
8
- * steady. */
11
+ * is metronomic; human typing is irregular, so its deltas do not stay this steady. */
9
12
  export declare const SPACE_REPEAT_JITTER_MS = 18;
10
13
  export declare const SPACE_REPEAT_JITTER_RATIO = 0.35;
11
- /** Consecutive mechanical (fast + steady) deltas that confirm the space bar is held and start
12
- * recording. Needs a sustained metronomic cadence, so jittery smashing and deliberate taps never
14
+ /** Consecutive mechanical (fast + steady) deltas that confirm a configured key is held and start
15
+ * recording. Needs a sustained metronomic cadence, so jittery typing and deliberate taps never
13
16
  * reach it. */
14
17
  export declare const SPACE_HOLD_MECHANICAL_RUN = 2;
15
- /** Idle gap (ms) after the last repeated space that counts as the space bar being released, ending
16
- * the push-to-talk recording. Must comfortably exceed the OS key-repeat interval. */
18
+ /** Idle gap (ms) after the last repeated configured-key press that counts as release and ends
19
+ * push-to-talk. Must comfortably exceed the OS key-repeat interval. */
17
20
  export declare const SPACE_HOLD_RELEASE_MS = 250;
18
- /** What a recognized space-bar hold drives — the push-to-talk start and stop. */
21
+ /** A release timer firing more than this (ms) past its deadline means the event loop stalled (a
22
+ * synchronous microphone open, GC, a heavy render) while the bar may still be held: the repeats
23
+ * emitted during the stall are queued but unread, so the stall must not read as a release. */
24
+ export declare const SPACE_HOLD_STALL_SLACK_MS = 100;
25
+ /** What a recognized push-to-talk hold drives — the start and stop callbacks. */
19
26
  export interface SpaceHoldHandler {
20
- /** Gate for the gesture. Returns false to keep the space bar inserting spaces normally, so
21
- * disabling push-to-talk restores plain space behavior. */
27
+ /** Gate for the gesture. Returns false to let matching keys behave normally. */
22
28
  enabled(): boolean;
23
- /** A sustained hold was recognized. The optimistically-typed spaces have already been deleted. */
29
+ /** A sustained hold was recognized; any safely typed candidate text has already been deleted. */
24
30
  onStart(): void;
25
- /** The held space bar was released (an idle gap with no further repeated spaces, or any other key). */
31
+ /** The held key was released (an idle gap with no further repeats, or any other key). */
26
32
  onEnd(): void;
27
33
  }
28
34
  /** What the host must do with a keypress after {@link SpaceHoldGesture.process} has seen it:
29
- * `"pass"` — handle it normally; `"type"` — insert the space now (it is tracked back out if the run
30
- * turns into a hold); `"swallow"` — drop it, the gesture consumed it. */
35
+ * `"pass"` — handle it normally; `"type"` — insert its safely decoded printable text now (it is
36
+ * tracked back out if the run turns into a hold); `"swallow"` — drop it, the gesture consumed it. */
31
37
  export type SpaceHoldStep = "pass" | "type" | "swallow";
32
- /** Space-hold push-to-talk state machine. A held space bar emits OS auto-repeat: a *steady* stream
33
- * of spaces at a fixed fast interval. We watch the inter-space deltas and only recognize a hold once
34
- * {@link SPACE_HOLD_MECHANICAL_RUN} consecutive deltas are "mechanical" — both auto-repeat-fast and
35
- * near-identical (see {@link gapsAreMechanical}). Smashing the bar is fast but jittery and deliberate
36
- * taps are too slow, so neither escalates and both keep typing real spaces; the few spaces typed
37
- * before a real hold is recognized are tracked back out of the host input. */
38
+ /** Push-to-talk key-hold state machine. A held key emits OS auto-repeat at a steady fast interval.
39
+ * We watch inter-key deltas and only recognize a hold once {@link SPACE_HOLD_MECHANICAL_RUN}
40
+ * consecutive deltas are mechanical (see {@link gapsAreMechanical}). Deliberate taps and jittery
41
+ * runs stay typed; only text typed during the current steady run is removed on recognition. */
38
42
  export declare class SpaceHoldGesture {
39
43
  #private;
40
- /** Unset (the default) keeps the space bar typing spaces. */
44
+ /** Configured alternative keys. Alternatives are tracked independently and never combine into one run. */
45
+ get keys(): readonly KeyId[];
46
+ set keys(keys: readonly KeyId[]);
47
+ /** Unset (the default) keeps configured keys behaving normally. */
41
48
  handler: SpaceHoldHandler | undefined;
42
49
  constructor(deleteTyped: (count: number) => void, allowed?: () => boolean);
43
- /** Feed one keypress, `isSpace` when it is a plain space bar press. */
44
- process(isSpace: boolean): SpaceHoldStep;
50
+ /** Pure focused-owner preflight on raw input: whether the key must reach the host before
51
+ * TUI-wide input listeners. Only non-printable bindings are claimed — they would otherwise
52
+ * trigger app shortcuts mid-hold; printable candidates keep the normal listener path so
53
+ * raw-input observers (e.g. extensions) still see typed text, as they did before remapping. */
54
+ shouldRoute(data: string): boolean;
55
+ /** Feed one canonical keypress and, when safely printable, its decoded text length. The host
56
+ * records the actual inserted length with {@link recordTyped} after applying normal typing. */
57
+ process(key: string | undefined, insertedCharacterLength?: number): SpaceHoldStep;
58
+ /** Account for text the host actually inserted for the preceding `"type"` step. */
59
+ recordTyped(insertedCharacterLength: number): void;
45
60
  }
@@ -86,6 +86,7 @@ export declare class StatusLineComponent<TSession extends StatusLineSession = St
86
86
  setPlanModeStatus(status: {
87
87
  enabled: boolean;
88
88
  paused: boolean;
89
+ workflow?: "parallel" | "iterative" | "ultra";
89
90
  } | undefined): void;
90
91
  setLoopModeStatus(status: NonNullable<SegmentContext["loopMode"]> | undefined): void;
91
92
  setGoalModeStatus(status: {
@@ -113,6 +114,8 @@ export declare class StatusLineComponent<TSession extends StatusLineSession = St
113
114
  setRecording(recording: boolean): void;
114
115
  /** Set the callback that presents detected Codex reset celebrations, or clear it with `undefined`. */
115
116
  setCodexResetFireworksHandler(handler: ((event: CodexResetFireworksEvent) => void) | undefined): void;
117
+ /** Set the callback that presents the first pool-wide saved-reset expiry warning, or clear it with `undefined`. */
118
+ setResetExpiryNoticeHandler(handler: ((notice: string) => void) | undefined): void;
116
119
  setHookStatus(key: string, text: string | undefined): void;
117
120
  watchBranch(onBranchChange: () => void): void;
118
121
  dispose(): void;
@@ -3,6 +3,7 @@ import type { CompactionSettings } from "@linxiraos/pi-agent-core/compaction";
3
3
  import type { Tool as AiTool, Model } from "@linxiraos/pi-ai";
4
4
  import type { Theme } from "../theme/index.js";
5
5
  import { Container } from "../tui.js";
6
+ import type { TspText } from "@linxiraos/pi-wire";
6
7
  import type { DescribeContext, NativeNode } from "../native/node.js";
7
8
  interface ContextSkill {
8
9
  readonly name: string;
@@ -154,6 +155,8 @@ export declare function computeNonMessageBreakdown(session: NonMessageTokenSourc
154
155
  * session and model.
155
156
  */
156
157
  export declare function computeContextBreakdown(session: ContextUsageSession, options: ContextUsageOptions): ContextBreakdown;
158
+ /** The `/context` title: the model and its window once a model is selected. */
159
+ export declare function contextUsageHead(breakdown: ContextBreakdown): TspText;
157
160
  /**
158
161
  * Native context-usage panel for terminals without `meter`: the cell grid as
159
162
  * unwrapped styled rows beside the legend. The terminal places the legend
@@ -161,15 +164,14 @@ export declare function computeContextBreakdown(session: ContextUsageSession, op
161
164
  */
162
165
  export declare function describeContextUsage(breakdown: ContextBreakdown): NativeNode;
163
166
  /**
164
- * The `/context` transcript block: ANSI renders the titled cell grid between
165
- * rules; natively it is one frame, drawn with `meter`s where the terminal
166
- * has them and as the glyph grid otherwise.
167
+ * The `/context` report body, without a frame or title of its own (the panel
168
+ * showing it is titled {@link contextUsageHead}): ANSI renders the cell grid
169
+ * beside the legend; natively it is drawn with `meter`s where the terminal has
170
+ * them and as the glyph grid otherwise.
167
171
  */
168
172
  export declare class ContextUsageView extends Container {
169
173
  #private;
170
174
  constructor(breakdown: ContextBreakdown, theme: Theme);
171
- /** Replace the shown breakdown in place, refreshing both the ANSI and native views. */
172
- setBreakdown(breakdown: ContextBreakdown): void;
173
175
  describe(cx: DescribeContext): NativeNode;
174
176
  }
175
177
  /**
@@ -2,7 +2,7 @@ import type { AgentMessage, ThinkingLevel } from "@linxiraos/pi-agent-core";
2
2
  import type { Tool, UsageLimit, UsageReport } from "@linxiraos/pi-ai";
3
3
  import type { Model } from "@linxiraos/pi-catalog/types";
4
4
  import type { CompactionBoundaries } from "./context-usage.js";
5
- import type { StatusLineSettings } from "./types.js";
5
+ import type { StatusLineSettings, StatusResetExpiry } from "./types.js";
6
6
  export interface StatusAccountIdentity {
7
7
  accountId?: string;
8
8
  email?: string;
@@ -126,6 +126,9 @@ export interface StatusLineHost<TSession extends StatusLineSession = StatusLineS
126
126
  }>;
127
127
  calculateTokensPerSecond(messages: readonly AgentMessage[], isStreaming: boolean): number | null;
128
128
  limitMatchesActiveAccount(report: UsageReport, limit: UsageLimit, identity: StatusAccountIdentity): boolean;
129
+ classifyResetExpiry?(report: UsageReport, nowMs: number): StatusResetExpiry | undefined;
130
+ /** One-line warning for saved resets anywhere in the pool that expire within 24 hours. */
131
+ resetExpiryNotice?(reports: readonly UsageReport[], nowMs: number): string | undefined;
129
132
  computeCompactionBoundaries(session: TSession, contextWindow: number, model?: Model): CompactionBoundaries | null;
130
133
  }
131
134
  export interface FooterHost {
@@ -7,6 +7,8 @@ export type { SegmentContext } from "./types.js";
7
7
  * model segment and the composer's effort chip.
8
8
  */
9
9
  export declare function thinkingLevelWord(session: Pick<StatusLineSession, "state" | "isAutoThinking" | "autoResolvedThinkingLevel">): string | undefined;
10
+ /** Zeta-only: the ultra plan workflow gets its own status-line label (lost in the v18.8.8 merge once already). */
11
+ export declare const PLAN_ULTRA_LABEL = "Plan-Ultra";
10
12
  export declare const SEGMENTS: Record<StatusLineSegmentId, StatusLineSegment>;
11
13
  export declare function renderSegment(id: StatusLineSegmentId, ctx: SegmentContext): RenderedSegment;
12
14
  /** Native description of one segment; null when it is hidden or unknown. */
@@ -93,6 +93,8 @@ export interface SegmentContext {
93
93
  planMode: {
94
94
  enabled: boolean;
95
95
  paused: boolean;
96
+ /** Plan workflow variant; `ultra` renders as `Plan-Ultra` in the mode segment. */
97
+ workflow?: "parallel" | "iterative" | "ultra";
96
98
  } | null;
97
99
  prewalk: {
98
100
  enabled: boolean;
@@ -112,7 +114,7 @@ export interface SegmentContext {
112
114
  } | null;
113
115
  /** Modal editing state, or null when `tui.vimMode` is off. */
114
116
  vim: {
115
- mode: "insert" | "normal" | "visual" | "visual-line";
117
+ mode: "insert" | "normal" | "visual" | "visual-line" | "replace";
116
118
  /** Half-typed operator/count (`"2d"`), empty when nothing is pending. */
117
119
  pending: string;
118
120
  /** Lines spanned by the active Visual selection; 0 outside Visual modes. */
@@ -223,9 +225,18 @@ export interface SegmentContext {
223
225
  expiryHours?: number;
224
226
  expired?: boolean;
225
227
  unavailableReason?: string;
228
+ expiring?: StatusResetExpiry;
226
229
  };
227
230
  } | null;
228
231
  }
232
+ /** How close an account's saved resets are to expiring, when it is worth a warning. */
233
+ export interface StatusResetExpiry {
234
+ /** `soon`: within 7 days; `imminent`: within 24 hours. */
235
+ tier: "soon" | "imminent";
236
+ count: number;
237
+ /** Expiry of the reset the warning is about (epoch ms); it can be later than the soonest banked one. */
238
+ expiresAtMs: number;
239
+ }
229
240
  export interface RenderedSegment {
230
241
  content: string;
231
242
  visible: boolean;
@@ -245,8 +256,8 @@ export interface SegmentView {
245
256
  }
246
257
  /**
247
258
  * The status line's facts for the native composer. A TSP terminal shows no
248
- * status strip: the tab title carries the session, the pane header the path
249
- * and branch, and the composer the rest.
259
+ * status strip: the tab title carries the session, the pane header the path,
260
+ * and the composer the rest (the git branch among its facts).
250
261
  */
251
262
  export interface ComposerFacts {
252
263
  /**