@ai-zen/cli 1.0.0-alpha.9 → 1.0.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 (336) hide show
  1. package/CHANGELOG.md +1334 -275
  2. package/LICENSE +21 -0
  3. package/README.md +136 -31
  4. package/README.zh.md +136 -31
  5. package/dist/agent-creator.d.ts +11 -0
  6. package/dist/agent-creator.d.ts.map +1 -1
  7. package/dist/agent-creator.js +50 -20
  8. package/dist/agent-creator.js.map +1 -1
  9. package/dist/agent-switch.d.ts +61 -0
  10. package/dist/agent-switch.d.ts.map +1 -0
  11. package/dist/agent-switch.js +83 -0
  12. package/dist/agent-switch.js.map +1 -0
  13. package/dist/agents-store.d.ts +6 -1
  14. package/dist/agents-store.d.ts.map +1 -1
  15. package/dist/agents-store.js +46 -4
  16. package/dist/agents-store.js.map +1 -1
  17. package/dist/auto-migrate-confirm.d.ts +43 -0
  18. package/dist/auto-migrate-confirm.d.ts.map +1 -0
  19. package/dist/auto-migrate-confirm.js +47 -0
  20. package/dist/auto-migrate-confirm.js.map +1 -0
  21. package/dist/clipboard.d.ts +68 -0
  22. package/dist/clipboard.d.ts.map +1 -0
  23. package/dist/clipboard.js +177 -0
  24. package/dist/clipboard.js.map +1 -0
  25. package/dist/config-editor.d.ts +42 -5
  26. package/dist/config-editor.d.ts.map +1 -1
  27. package/dist/config-editor.js +80 -27
  28. package/dist/config-editor.js.map +1 -1
  29. package/dist/config.d.ts +76 -17
  30. package/dist/config.d.ts.map +1 -1
  31. package/dist/config.js +143 -39
  32. package/dist/config.js.map +1 -1
  33. package/dist/conversation-commands/registry.d.ts +127 -4
  34. package/dist/conversation-commands/registry.d.ts.map +1 -1
  35. package/dist/conversation-commands/registry.js +93 -14
  36. package/dist/conversation-commands/registry.js.map +1 -1
  37. package/dist/conversation-persist-plugin.d.ts +0 -1
  38. package/dist/conversation-persist-plugin.d.ts.map +1 -1
  39. package/dist/conversation-persist-plugin.js +7 -16
  40. package/dist/conversation-persist-plugin.js.map +1 -1
  41. package/dist/conversation-repository.d.ts +79 -18
  42. package/dist/conversation-repository.d.ts.map +1 -1
  43. package/dist/conversation-repository.js +96 -30
  44. package/dist/conversation-repository.js.map +1 -1
  45. package/dist/cwd-tracker-plugin.d.ts.map +1 -1
  46. package/dist/cwd-tracker-plugin.js +22 -7
  47. package/dist/cwd-tracker-plugin.js.map +1 -1
  48. package/dist/format-time.d.ts +17 -6
  49. package/dist/format-time.d.ts.map +1 -1
  50. package/dist/format-time.js +32 -14
  51. package/dist/format-time.js.map +1 -1
  52. package/dist/handoff-service.d.ts +19 -0
  53. package/dist/handoff-service.d.ts.map +1 -0
  54. package/dist/handoff-service.js +85 -0
  55. package/dist/handoff-service.js.map +1 -0
  56. package/dist/hook.d.ts.map +1 -1
  57. package/dist/hook.js +69 -15
  58. package/dist/hook.js.map +1 -1
  59. package/dist/i18n/en-wizard.d.ts +8 -0
  60. package/dist/i18n/en-wizard.d.ts.map +1 -0
  61. package/dist/i18n/en-wizard.js +303 -0
  62. package/dist/i18n/en-wizard.js.map +1 -0
  63. package/dist/i18n/en.d.ts +7 -0
  64. package/dist/i18n/en.d.ts.map +1 -0
  65. package/dist/i18n/en.js +245 -0
  66. package/dist/i18n/en.js.map +1 -0
  67. package/dist/i18n/index.d.ts +57 -0
  68. package/dist/i18n/index.d.ts.map +1 -0
  69. package/dist/i18n/index.js +109 -0
  70. package/dist/i18n/index.js.map +1 -0
  71. package/dist/i18n/preferences.d.ts +37 -0
  72. package/dist/i18n/preferences.d.ts.map +1 -0
  73. package/dist/i18n/preferences.js +73 -0
  74. package/dist/i18n/preferences.js.map +1 -0
  75. package/dist/i18n/zh-wizard.d.ts +11 -0
  76. package/dist/i18n/zh-wizard.d.ts.map +1 -0
  77. package/dist/i18n/zh-wizard.js +306 -0
  78. package/dist/i18n/zh-wizard.js.map +1 -0
  79. package/dist/i18n/zh.d.ts +10 -0
  80. package/dist/i18n/zh.d.ts.map +1 -0
  81. package/dist/i18n/zh.js +249 -0
  82. package/dist/i18n/zh.js.map +1 -0
  83. package/dist/index.js +52 -23
  84. package/dist/index.js.map +1 -1
  85. package/dist/mcp-command.d.ts +32 -0
  86. package/dist/mcp-command.d.ts.map +1 -0
  87. package/dist/mcp-command.js +37 -0
  88. package/dist/mcp-command.js.map +1 -0
  89. package/dist/mode.d.ts +31 -4
  90. package/dist/mode.d.ts.map +1 -1
  91. package/dist/mode.js +42 -7
  92. package/dist/mode.js.map +1 -1
  93. package/dist/model-switch.d.ts +58 -0
  94. package/dist/model-switch.d.ts.map +1 -0
  95. package/dist/model-switch.js +62 -0
  96. package/dist/model-switch.js.map +1 -0
  97. package/dist/reasoning-effort.d.ts +96 -0
  98. package/dist/reasoning-effort.d.ts.map +1 -0
  99. package/dist/reasoning-effort.js +164 -0
  100. package/dist/reasoning-effort.js.map +1 -0
  101. package/dist/reasoning-presets.d.ts +34 -0
  102. package/dist/reasoning-presets.d.ts.map +1 -0
  103. package/dist/reasoning-presets.js +85 -0
  104. package/dist/reasoning-presets.js.map +1 -0
  105. package/dist/sdk-log.d.ts +84 -0
  106. package/dist/sdk-log.d.ts.map +1 -0
  107. package/dist/sdk-log.js +167 -0
  108. package/dist/sdk-log.js.map +1 -0
  109. package/dist/session-pointer.d.ts.map +1 -1
  110. package/dist/session-pointer.js +10 -4
  111. package/dist/session-pointer.js.map +1 -1
  112. package/dist/stdio-runner.d.ts.map +1 -1
  113. package/dist/stdio-runner.js +32 -30
  114. package/dist/stdio-runner.js.map +1 -1
  115. package/dist/sub-agent-guard-plugin.d.ts +10 -7
  116. package/dist/sub-agent-guard-plugin.d.ts.map +1 -1
  117. package/dist/sub-agent-guard-plugin.js +12 -9
  118. package/dist/sub-agent-guard-plugin.js.map +1 -1
  119. package/dist/tui/chat-history.d.ts +29 -0
  120. package/dist/tui/chat-history.d.ts.map +1 -0
  121. package/dist/tui/chat-history.js +55 -0
  122. package/dist/tui/chat-history.js.map +1 -0
  123. package/dist/tui/chat-session.d.ts +144 -13
  124. package/dist/tui/chat-session.d.ts.map +1 -1
  125. package/dist/tui/chat-session.js +312 -73
  126. package/dist/tui/chat-session.js.map +1 -1
  127. package/dist/tui/components.d.ts +109 -6
  128. package/dist/tui/components.d.ts.map +1 -1
  129. package/dist/tui/components.js +177 -12
  130. package/dist/tui/components.js.map +1 -1
  131. package/dist/tui/config-wizard/detail.d.ts +18 -10
  132. package/dist/tui/config-wizard/detail.d.ts.map +1 -1
  133. package/dist/tui/config-wizard/detail.js +53 -46
  134. package/dist/tui/config-wizard/detail.js.map +1 -1
  135. package/dist/tui/config-wizard/engine.d.ts +2 -2
  136. package/dist/tui/config-wizard/engine.d.ts.map +1 -1
  137. package/dist/tui/config-wizard/engine.js +48 -26
  138. package/dist/tui/config-wizard/engine.js.map +1 -1
  139. package/dist/tui/config-wizard/fields.d.ts +3 -1
  140. package/dist/tui/config-wizard/fields.d.ts.map +1 -1
  141. package/dist/tui/config-wizard/fields.js +202 -167
  142. package/dist/tui/config-wizard/fields.js.map +1 -1
  143. package/dist/tui/config-wizard/frame.js +1 -1
  144. package/dist/tui/config-wizard/kv-editor.d.ts.map +1 -1
  145. package/dist/tui/config-wizard/kv-editor.js +13 -5
  146. package/dist/tui/config-wizard/kv-editor.js.map +1 -1
  147. package/dist/tui/config-wizard/list.d.ts +3 -1
  148. package/dist/tui/config-wizard/list.d.ts.map +1 -1
  149. package/dist/tui/config-wizard/list.js +4 -4
  150. package/dist/tui/config-wizard/list.js.map +1 -1
  151. package/dist/tui/config-wizard/mcp-helpers.d.ts.map +1 -1
  152. package/dist/tui/config-wizard/mcp-helpers.js +4 -3
  153. package/dist/tui/config-wizard/mcp-helpers.js.map +1 -1
  154. package/dist/tui/config-wizard/menu.d.ts.map +1 -1
  155. package/dist/tui/config-wizard/menu.js +33 -21
  156. package/dist/tui/config-wizard/menu.js.map +1 -1
  157. package/dist/tui/config-wizard/prompt-editor.d.ts +8 -1
  158. package/dist/tui/config-wizard/prompt-editor.d.ts.map +1 -1
  159. package/dist/tui/config-wizard/prompt-editor.js +11 -7
  160. package/dist/tui/config-wizard/prompt-editor.js.map +1 -1
  161. package/dist/tui/config-wizard/prompt.d.ts.map +1 -1
  162. package/dist/tui/config-wizard/prompt.js +8 -7
  163. package/dist/tui/config-wizard/prompt.js.map +1 -1
  164. package/dist/tui/config-wizard/step-agents.d.ts.map +1 -1
  165. package/dist/tui/config-wizard/step-agents.js +50 -29
  166. package/dist/tui/config-wizard/step-agents.js.map +1 -1
  167. package/dist/tui/config-wizard/step-defaults.d.ts.map +1 -1
  168. package/dist/tui/config-wizard/step-defaults.js +77 -27
  169. package/dist/tui/config-wizard/step-defaults.js.map +1 -1
  170. package/dist/tui/config-wizard/step-endpoints.d.ts.map +1 -1
  171. package/dist/tui/config-wizard/step-endpoints.js +27 -14
  172. package/dist/tui/config-wizard/step-endpoints.js.map +1 -1
  173. package/dist/tui/config-wizard/step-mcp.d.ts.map +1 -1
  174. package/dist/tui/config-wizard/step-mcp.js +29 -25
  175. package/dist/tui/config-wizard/step-mcp.js.map +1 -1
  176. package/dist/tui/config-wizard/step-models.d.ts.map +1 -1
  177. package/dist/tui/config-wizard/step-models.js +98 -43
  178. package/dist/tui/config-wizard/step-models.js.map +1 -1
  179. package/dist/tui/config-wizard/step-new-endpoint.d.ts.map +1 -1
  180. package/dist/tui/config-wizard/step-new-endpoint.js +16 -12
  181. package/dist/tui/config-wizard/step-new-endpoint.js.map +1 -1
  182. package/dist/tui/config-wizard/step-simple.d.ts.map +1 -1
  183. package/dist/tui/config-wizard/step-simple.js +18 -17
  184. package/dist/tui/config-wizard/step-simple.js.map +1 -1
  185. package/dist/tui/config-wizard/types.d.ts +31 -3
  186. package/dist/tui/config-wizard/types.d.ts.map +1 -1
  187. package/dist/tui/config-wizard/types.js.map +1 -1
  188. package/dist/tui/file-index.d.ts +38 -0
  189. package/dist/tui/file-index.d.ts.map +1 -0
  190. package/dist/tui/file-index.js +117 -0
  191. package/dist/tui/file-index.js.map +1 -0
  192. package/dist/tui/index.d.ts +17 -1
  193. package/dist/tui/index.d.ts.map +1 -1
  194. package/dist/tui/index.js +105 -49
  195. package/dist/tui/index.js.map +1 -1
  196. package/dist/tui/input-editing.d.ts +52 -0
  197. package/dist/tui/input-editing.d.ts.map +1 -0
  198. package/dist/tui/input-editing.js +91 -0
  199. package/dist/tui/input-editing.js.map +1 -0
  200. package/dist/tui/key-debug.d.ts +62 -0
  201. package/dist/tui/key-debug.d.ts.map +1 -0
  202. package/dist/tui/key-debug.js +92 -0
  203. package/dist/tui/key-debug.js.map +1 -0
  204. package/dist/tui/mention.d.ts +47 -0
  205. package/dist/tui/mention.d.ts.map +1 -0
  206. package/dist/tui/mention.js +152 -0
  207. package/dist/tui/mention.js.map +1 -0
  208. package/dist/tui/mouse.d.ts +55 -0
  209. package/dist/tui/mouse.d.ts.map +1 -0
  210. package/dist/tui/mouse.js +74 -0
  211. package/dist/tui/mouse.js.map +1 -0
  212. package/dist/tui/phase.d.ts +64 -0
  213. package/dist/tui/phase.d.ts.map +1 -0
  214. package/dist/tui/phase.js +112 -0
  215. package/dist/tui/phase.js.map +1 -0
  216. package/dist/tui/screens/agent-tabs.d.ts +53 -0
  217. package/dist/tui/screens/agent-tabs.d.ts.map +1 -0
  218. package/dist/tui/screens/agent-tabs.js +81 -0
  219. package/dist/tui/screens/agent-tabs.js.map +1 -0
  220. package/dist/tui/screens/chat-commands.d.ts +78 -1
  221. package/dist/tui/screens/chat-commands.d.ts.map +1 -1
  222. package/dist/tui/screens/chat-commands.js +688 -157
  223. package/dist/tui/screens/chat-commands.js.map +1 -1
  224. package/dist/tui/screens/chat.d.ts +57 -1
  225. package/dist/tui/screens/chat.d.ts.map +1 -1
  226. package/dist/tui/screens/chat.js +708 -261
  227. package/dist/tui/screens/chat.js.map +1 -1
  228. package/dist/tui/screens/common-keys.d.ts +36 -0
  229. package/dist/tui/screens/common-keys.d.ts.map +1 -0
  230. package/dist/tui/screens/common-keys.js +67 -0
  231. package/dist/tui/screens/common-keys.js.map +1 -0
  232. package/dist/tui/screens/frame-buffer.d.ts.map +1 -1
  233. package/dist/tui/screens/frame-buffer.js.map +1 -1
  234. package/dist/tui/screens/handoff-choice.d.ts +37 -0
  235. package/dist/tui/screens/handoff-choice.d.ts.map +1 -0
  236. package/dist/tui/screens/handoff-choice.js +42 -0
  237. package/dist/tui/screens/handoff-choice.js.map +1 -0
  238. package/dist/tui/screens/index.d.ts +7 -5
  239. package/dist/tui/screens/index.d.ts.map +1 -1
  240. package/dist/tui/screens/index.js +6 -5
  241. package/dist/tui/screens/index.js.map +1 -1
  242. package/dist/tui/screens/input-row.d.ts +64 -0
  243. package/dist/tui/screens/input-row.d.ts.map +1 -0
  244. package/dist/tui/screens/input-row.js +67 -0
  245. package/dist/tui/screens/input-row.js.map +1 -0
  246. package/dist/tui/screens/input.d.ts +77 -1
  247. package/dist/tui/screens/input.d.ts.map +1 -1
  248. package/dist/tui/screens/input.js +125 -8
  249. package/dist/tui/screens/input.js.map +1 -1
  250. package/dist/tui/screens/layout.d.ts +49 -0
  251. package/dist/tui/screens/layout.d.ts.map +1 -1
  252. package/dist/tui/screens/layout.js +45 -7
  253. package/dist/tui/screens/layout.js.map +1 -1
  254. package/dist/tui/screens/lines.d.ts +7 -0
  255. package/dist/tui/screens/lines.d.ts.map +1 -1
  256. package/dist/tui/screens/lines.js +6 -6
  257. package/dist/tui/screens/lines.js.map +1 -1
  258. package/dist/tui/screens/messages-view.d.ts +20 -1
  259. package/dist/tui/screens/messages-view.d.ts.map +1 -1
  260. package/dist/tui/screens/messages-view.js +55 -8
  261. package/dist/tui/screens/messages-view.js.map +1 -1
  262. package/dist/tui/screens/notice-bar.d.ts +5 -0
  263. package/dist/tui/screens/notice-bar.d.ts.map +1 -0
  264. package/dist/tui/screens/notice-bar.js +21 -0
  265. package/dist/tui/screens/notice-bar.js.map +1 -0
  266. package/dist/tui/screens/notice.d.ts +44 -10
  267. package/dist/tui/screens/notice.d.ts.map +1 -1
  268. package/dist/tui/screens/notice.js +75 -15
  269. package/dist/tui/screens/notice.js.map +1 -1
  270. package/dist/tui/screens/overlays.d.ts.map +1 -1
  271. package/dist/tui/screens/overlays.js +4 -3
  272. package/dist/tui/screens/overlays.js.map +1 -1
  273. package/dist/tui/screens/render.d.ts +1 -1
  274. package/dist/tui/screens/render.d.ts.map +1 -1
  275. package/dist/tui/screens/render.js +18 -11
  276. package/dist/tui/screens/render.js.map +1 -1
  277. package/dist/tui/screens/use-chat-viewport.d.ts +22 -0
  278. package/dist/tui/screens/use-chat-viewport.d.ts.map +1 -0
  279. package/dist/tui/screens/use-chat-viewport.js +50 -0
  280. package/dist/tui/screens/use-chat-viewport.js.map +1 -0
  281. package/dist/tui/screens/use-input-editing.d.ts +69 -0
  282. package/dist/tui/screens/use-input-editing.d.ts.map +1 -0
  283. package/dist/tui/screens/use-input-editing.js +220 -0
  284. package/dist/tui/screens/use-input-editing.js.map +1 -0
  285. package/dist/tui/screens/use-overlays.d.ts +25 -0
  286. package/dist/tui/screens/use-overlays.d.ts.map +1 -0
  287. package/dist/tui/screens/use-overlays.js +32 -0
  288. package/dist/tui/screens/use-overlays.js.map +1 -0
  289. package/dist/tui/screens/use-wizard-host.d.ts +46 -0
  290. package/dist/tui/screens/use-wizard-host.d.ts.map +1 -0
  291. package/dist/tui/screens/use-wizard-host.js +123 -0
  292. package/dist/tui/screens/use-wizard-host.js.map +1 -0
  293. package/dist/tui/screens/welcome.d.ts +12 -0
  294. package/dist/tui/screens/welcome.d.ts.map +1 -0
  295. package/dist/tui/screens/welcome.js +36 -0
  296. package/dist/tui/screens/welcome.js.map +1 -0
  297. package/dist/tui/status-segments.d.ts +37 -0
  298. package/dist/tui/status-segments.d.ts.map +1 -0
  299. package/dist/tui/status-segments.js +166 -0
  300. package/dist/tui/status-segments.js.map +1 -0
  301. package/dist/tui/text.d.ts +22 -7
  302. package/dist/tui/text.d.ts.map +1 -1
  303. package/dist/tui/text.js +110 -39
  304. package/dist/tui/text.js.map +1 -1
  305. package/dist/tui/theme.d.ts +2 -0
  306. package/dist/tui/theme.d.ts.map +1 -1
  307. package/dist/tui/theme.js +2 -0
  308. package/dist/tui/theme.js.map +1 -1
  309. package/dist/tui/token-rate.d.ts +83 -0
  310. package/dist/tui/token-rate.d.ts.map +1 -0
  311. package/dist/tui/token-rate.js +195 -0
  312. package/dist/tui/token-rate.js.map +1 -0
  313. package/dist/types.d.ts +7 -8
  314. package/dist/types.d.ts.map +1 -1
  315. package/dist/user-content.d.ts +41 -0
  316. package/dist/user-content.d.ts.map +1 -0
  317. package/dist/user-content.js +37 -0
  318. package/dist/user-content.js.map +1 -0
  319. package/dist/version-compare.d.ts +37 -0
  320. package/dist/version-compare.d.ts.map +1 -0
  321. package/dist/version-compare.js +105 -0
  322. package/dist/version-compare.js.map +1 -0
  323. package/dist/version.js.map +1 -1
  324. package/package.json +7 -5
  325. package/dist/auto-migrate-confirm-plugin.d.ts +0 -58
  326. package/dist/auto-migrate-confirm-plugin.d.ts.map +0 -1
  327. package/dist/auto-migrate-confirm-plugin.js +0 -61
  328. package/dist/auto-migrate-confirm-plugin.js.map +0 -1
  329. package/dist/migration-service.d.ts +0 -15
  330. package/dist/migration-service.d.ts.map +0 -1
  331. package/dist/migration-service.js +0 -66
  332. package/dist/migration-service.js.map +0 -1
  333. package/dist/tui/screens/splash.d.ts +0 -5
  334. package/dist/tui/screens/splash.d.ts.map +0 -1
  335. package/dist/tui/screens/splash.js +0 -51
  336. package/dist/tui/screens/splash.js.map +0 -1
@@ -1,12 +1,43 @@
1
1
  /** 输入区文本折行(不含提示符 `❯ `,交由渲染层补齐);空输入用占位提示 */
2
2
  export declare function inputLines(text: string, columns: number): string[];
3
+ /** 输入区最多占用几行(超出的折行开窗滚动,不把对话区挤没) */
4
+ export declare const INPUT_MAX_ROWS = 8;
5
+ /**
6
+ * 输入区可见窗口:总行数 + 光标所在行 → `[from, to)`。
7
+ *
8
+ * 窗口**跟随光标**(而不是固定显示末尾 N 行):`←` 在行首会退到上一行,光标能一路
9
+ * 退到第一行 —— 钉住末尾的窗口会让光标“消失”在框外。光标所在行恒为窗口**末行**
10
+ * (除非已贴底),于是往上走时窗口连续上滚。
11
+ *
12
+ * 三处必须同源:`computeChatLayout` 的 `inputHeight`、渲染的 `slice(from, to)`、
13
+ * 硬件光标 y 里的行内偏移(`cursorRow − from`)。
14
+ */
15
+ export declare function inputWindow(total: number, cursorRow: number, max?: number): {
16
+ from: number;
17
+ to: number;
18
+ };
3
19
  /**
4
20
  * 计算终端硬件光标坐标(相对 Ink 输出原点),用于让 IME(输入法)候选框
5
- * 跟随编辑光标。x 为列、y 为行。
21
+ * 跟随编辑光标。x 为列、y 为行(0 起始,从整帧第一行算起)。
22
+ *
23
+ * y 必须把输入行**上方渲染的全部行**算进去,顺序与 `chat.tsx` 的渲染顺序严格一致:
24
+ *
25
+ * 对话区(`layout.lines`)→ Agent 栏目 → 通知栏(`noticeLines`)→ 附件提示行
26
+ * → 斜杠 / `@` 菜单(`hints`)→ 分隔线 → 输入行
27
+ *
28
+ * 漏算任何一段,硬件光标就会整体偏移那么多行(Ink 的 `moveUp = 总行数 − y`,
29
+ * 所以 y 少几行,光标就高几行)。历史上「通知栏」就被漏过:`/help` 这类多行通知
30
+ * 一出现,IME 候选框会浮到输入行上方好几行。
6
31
  */
7
32
  export declare function computeInputCursorPosition(input: {
8
33
  /** 对话区行数(输入区之前的行偏移基数) */
9
34
  transcriptLines: number;
35
+ /** Agent 栏目行数(位于对话区与通知栏之间;不传视为 0) */
36
+ agentTabCount?: number;
37
+ /** 通知栏行数(位于对话区与斜杠菜单之间;不传视为 0) */
38
+ noticeCount?: number;
39
+ /** 待发送附件提示行数(位于通知栏与菜单之间;不传视为 0) */
40
+ attachmentCount?: number;
10
41
  /** 斜杠命令菜单行数 */
11
42
  hintCount: number;
12
43
  /** 光标在输入框内的行 / 列(列以 code point 计) */
@@ -20,10 +51,55 @@ export declare function computeInputCursorPosition(input: {
20
51
  x: number;
21
52
  y: number;
22
53
  };
54
+ /**
55
+ * 光标上 / 下一行后的字素簇下标;已在首行按 ↑、或在末行按 ↓ 时返回 `null`。
56
+ *
57
+ * 「行」是**折行后的行**(含软折行),不是按 `\n` 切的物理行 —— 长段落在窄窗口里会被
58
+ * 拆成多行,用户看到的就是多行,光标必须跟着视觉行移动。宽度必须与实际渲染一致
59
+ * (`layoutInput` 的 `width`),否则会跨行/落错列。
60
+ *
61
+ * 列位置:目标行更短时落到行尾(与主流编辑器一致);光标不会因此跳到相邻行。
62
+ */
63
+ export declare function moveCursorRow(text: string, cursor: number, width: number, dir: -1 | 1): number | null;
23
64
  /** 是否为「单词字符」:ASCII 下为字母/数字/下划线,非 ASCII(CJK 等)一律算单词字符 */
24
65
  export declare function isWordChar(ch: string): boolean;
25
66
  /** 向左跨词后的光标位置(跳过分隔符与单词,停在词首) */
26
67
  export declare function wordLeft(text: string, cursor: number): number;
27
68
  /** 向右跨词后的光标位置(跳过单词与分隔符,停在词尾) */
28
69
  export declare function wordRight(text: string, cursor: number): number;
70
+ /**
71
+ * 向左删一个词(Ctrl+W / Alt+Backspace):删掉光标前的分隔符与单词。
72
+ * 返回删除后的文本与光标位置 —— 光标原地不动,只是前面的内容被吃掉。
73
+ */
74
+ export declare function deleteWordLeft(text: string, cursor: number): {
75
+ text: string;
76
+ cursor: number;
77
+ };
78
+ /**
79
+ * 向右删一个词(Alt+D / Ctrl+Delete):删掉光标后的分隔符与单词。
80
+ * 光标不动,后面的内容被吃掉。
81
+ */
82
+ export declare function deleteWordRight(text: string, cursor: number): {
83
+ text: string;
84
+ cursor: number;
85
+ };
86
+ /**
87
+ * 删到行首(Ctrl+U):删掉光标到本行开头(不含换行符)的内容。
88
+ *
89
+ * 语义与 readline 的 unix-line-discard / 主流 TUI 保持一致。注意 macOS 上
90
+ * iTerm2 与 Terminal.app 会把 `Cmd+Backspace` 映射成 `Ctrl+U` —— 若此处做成
91
+ * 「清空整个输入框」,Mac 用户按 ⌘⌫ 会丢掉全部草稿(多行输入时尤其致命)。
92
+ */
93
+ export declare function deleteToLineStart(text: string, cursor: number): {
94
+ text: string;
95
+ cursor: number;
96
+ };
97
+ /**
98
+ * 删到行尾(Ctrl+K):删掉光标到本行末尾(不含换行符)的内容;
99
+ * 若光标已在行尾,则连该换行符一起删掉(与 readline 的 kill-line 一致)。
100
+ */
101
+ export declare function deleteToLineEnd(text: string, cursor: number): {
102
+ text: string;
103
+ cursor: number;
104
+ };
29
105
  //# sourceMappingURL=input.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"input.d.ts","sourceRoot":"","sources":["../../../src/tui/screens/input.ts"],"names":[],"mappings":"AAKA,2CAA2C;AAC3C,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAIlE;AAED;;;GAGG;AACH,wBAAgB,0BAA0B,CAAC,KAAK,EAAE;IAChD,yBAAyB;IACzB,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,qCAAqC;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,sBAAsB;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,iBAAiB;IACjB,WAAW,EAAE,OAAO,CAAC;CACtB,GAAG;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,CAS3B;AAID,wDAAwD;AACxD,wBAAgB,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAK9C;AAED,gCAAgC;AAChC,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAM7D;AAED,gCAAgC;AAChC,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAM9D"}
1
+ {"version":3,"file":"input.d.ts","sourceRoot":"","sources":["../../../src/tui/screens/input.ts"],"names":[],"mappings":"AAMA,2CAA2C;AAC3C,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAIlE;AAED,mCAAmC;AACnC,eAAO,MAAM,cAAc,IAAI,CAAC;AAEhC;;;;;;;;;GASG;AACH,wBAAgB,WAAW,CACzB,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,EACjB,GAAG,SAAiB,GACnB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAI9B;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,0BAA0B,CAAC,KAAK,EAAE;IAChD,yBAAyB;IACzB,eAAe,EAAE,MAAM,CAAC;IACxB,qCAAqC;IACrC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iCAAiC;IACjC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,mCAAmC;IACnC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,eAAe;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,qCAAqC;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,sBAAsB;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,iBAAiB;IACjB,WAAW,EAAE,OAAO,CAAC;CACtB,GAAG;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,CAgB3B;AAID;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAC3B,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,GACV,MAAM,GAAG,IAAI,CAMf;AAID,wDAAwD;AACxD,wBAAgB,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAK9C;AAED,gCAAgC;AAChC,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAM7D;AAED,gCAAgC;AAChC,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAM9D;AASD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAQ7F;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAQ9F;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAShG;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAU9F"}
@@ -1,26 +1,77 @@
1
1
  // 由 src/tui/screens.tsx 拆分而来 —— 输入区折行 / 硬件光标 / 跨词移动
2
- import { displayWidth, layoutInput, INPUT_PREFIX_WIDTH } from "../text.js";
2
+ import { displayWidth, graphemes, layoutInput, INPUT_PREFIX_WIDTH } from "../text.js";
3
+ import { t } from "../../i18n/index.js";
3
4
  // ==================== 对话屏布局(吸底)====================
4
5
  /** 输入区文本折行(不含提示符 `❯ `,交由渲染层补齐);空输入用占位提示 */
5
6
  export function inputLines(text, columns) {
6
7
  const width = Math.max(4, columns - 4);
7
- const body = text.length > 0 ? text : "输入消息,/ 查看命令…";
8
+ const body = text.length > 0 ? text : t("input.placeholder");
8
9
  return layoutInput(body, 0, width).lines;
9
10
  }
11
+ /** 输入区最多占用几行(超出的折行开窗滚动,不把对话区挤没) */
12
+ export const INPUT_MAX_ROWS = 8;
13
+ /**
14
+ * 输入区可见窗口:总行数 + 光标所在行 → `[from, to)`。
15
+ *
16
+ * 窗口**跟随光标**(而不是固定显示末尾 N 行):`←` 在行首会退到上一行,光标能一路
17
+ * 退到第一行 —— 钉住末尾的窗口会让光标“消失”在框外。光标所在行恒为窗口**末行**
18
+ * (除非已贴底),于是往上走时窗口连续上滚。
19
+ *
20
+ * 三处必须同源:`computeChatLayout` 的 `inputHeight`、渲染的 `slice(from, to)`、
21
+ * 硬件光标 y 里的行内偏移(`cursorRow − from`)。
22
+ */
23
+ export function inputWindow(total, cursorRow, max = INPUT_MAX_ROWS) {
24
+ const size = Math.min(total, Math.max(1, max));
25
+ const from = Math.min(Math.max(0, cursorRow - size + 1), Math.max(0, total - size));
26
+ return { from, to: from + size };
27
+ }
10
28
  /**
11
29
  * 计算终端硬件光标坐标(相对 Ink 输出原点),用于让 IME(输入法)候选框
12
- * 跟随编辑光标。x 为列、y 为行。
30
+ * 跟随编辑光标。x 为列、y 为行(0 起始,从整帧第一行算起)。
31
+ *
32
+ * y 必须把输入行**上方渲染的全部行**算进去,顺序与 `chat.tsx` 的渲染顺序严格一致:
33
+ *
34
+ * 对话区(`layout.lines`)→ Agent 栏目 → 通知栏(`noticeLines`)→ 附件提示行
35
+ * → 斜杠 / `@` 菜单(`hints`)→ 分隔线 → 输入行
36
+ *
37
+ * 漏算任何一段,硬件光标就会整体偏移那么多行(Ink 的 `moveUp = 总行数 − y`,
38
+ * 所以 y 少几行,光标就高几行)。历史上「通知栏」就被漏过:`/help` 这类多行通知
39
+ * 一出现,IME 候选框会浮到输入行上方好几行。
13
40
  */
14
41
  export function computeInputCursorPosition(input) {
15
42
  const before = input.placeholder
16
43
  ? ""
17
- : Array.from(input.lineText).slice(0, input.cursorCol).join("");
44
+ : graphemes(input.lineText).slice(0, input.cursorCol).join("");
18
45
  return {
19
46
  x: INPUT_PREFIX_WIDTH + displayWidth(before),
20
- // 对话区 + 斜杠菜单 + 分隔线 + 输入行内偏移
21
- y: input.transcriptLines + input.hintCount + 1 + input.cursorRow,
47
+ // 对话区 + Agent 栏目 + 通知栏 + 附件提示行 + 斜杠菜单 + 分隔线 + 输入行内偏移
48
+ y: input.transcriptLines +
49
+ (input.agentTabCount ?? 0) +
50
+ (input.noticeCount ?? 0) +
51
+ (input.attachmentCount ?? 0) +
52
+ input.hintCount +
53
+ 1 +
54
+ input.cursorRow,
22
55
  };
23
56
  }
57
+ // ==================== 上下移动光标(↑ / ↓)====================
58
+ /**
59
+ * 光标上 / 下一行后的字素簇下标;已在首行按 ↑、或在末行按 ↓ 时返回 `null`。
60
+ *
61
+ * 「行」是**折行后的行**(含软折行),不是按 `\n` 切的物理行 —— 长段落在窄窗口里会被
62
+ * 拆成多行,用户看到的就是多行,光标必须跟着视觉行移动。宽度必须与实际渲染一致
63
+ * (`layoutInput` 的 `width`),否则会跨行/落错列。
64
+ *
65
+ * 列位置:目标行更短时落到行尾(与主流编辑器一致);光标不会因此跳到相邻行。
66
+ */
67
+ export function moveCursorRow(text, cursor, width, dir) {
68
+ const layout = layoutInput(text, cursor, width);
69
+ const target = layout.cursorRow + dir;
70
+ if (target < 0 || target >= layout.lines.length)
71
+ return null;
72
+ const col = Math.min(layout.cursorCol, graphemes(layout.lines[target]).length);
73
+ return layout.rowStarts[target] + col;
74
+ }
24
75
  // ==================== 跨词移动(Ctrl/Alt + ← →)====================
25
76
  /** 是否为「单词字符」:ASCII 下为字母/数字/下划线,非 ASCII(CJK 等)一律算单词字符 */
26
77
  export function isWordChar(ch) {
@@ -33,7 +84,7 @@ export function isWordChar(ch) {
33
84
  }
34
85
  /** 向左跨词后的光标位置(跳过分隔符与单词,停在词首) */
35
86
  export function wordLeft(text, cursor) {
36
- const chars = Array.from(text);
87
+ const chars = graphemes(text);
37
88
  let i = Math.max(0, Math.min(cursor, chars.length));
38
89
  while (i > 0 && !isWordChar(chars[i - 1]))
39
90
  i -= 1;
@@ -43,7 +94,7 @@ export function wordLeft(text, cursor) {
43
94
  }
44
95
  /** 向右跨词后的光标位置(跳过单词与分隔符,停在词尾) */
45
96
  export function wordRight(text, cursor) {
46
- const chars = Array.from(text);
97
+ const chars = graphemes(text);
47
98
  let i = Math.max(0, Math.min(cursor, chars.length));
48
99
  while (i < chars.length && !isWordChar(chars[i]))
49
100
  i += 1;
@@ -51,4 +102,70 @@ export function wordRight(text, cursor) {
51
102
  i += 1;
52
103
  return i;
53
104
  }
105
+ // ==================== 按词删除(Ctrl+W / Alt+Backspace、Alt+D / Ctrl+Delete)====================
106
+ /** 光标钳制到 [0, len](按 code point 计) */
107
+ function clampCursor(chars, cursor) {
108
+ return Math.max(0, Math.min(cursor, chars.length));
109
+ }
110
+ /**
111
+ * 向左删一个词(Ctrl+W / Alt+Backspace):删掉光标前的分隔符与单词。
112
+ * 返回删除后的文本与光标位置 —— 光标原地不动,只是前面的内容被吃掉。
113
+ */
114
+ export function deleteWordLeft(text, cursor) {
115
+ const chars = graphemes(text);
116
+ const cp = clampCursor(chars, cursor);
117
+ const from = wordLeft(text, cp);
118
+ return {
119
+ text: chars.slice(0, from).join("") + chars.slice(cp).join(""),
120
+ cursor: from,
121
+ };
122
+ }
123
+ /**
124
+ * 向右删一个词(Alt+D / Ctrl+Delete):删掉光标后的分隔符与单词。
125
+ * 光标不动,后面的内容被吃掉。
126
+ */
127
+ export function deleteWordRight(text, cursor) {
128
+ const chars = graphemes(text);
129
+ const cp = clampCursor(chars, cursor);
130
+ const to = wordRight(text, cp);
131
+ return {
132
+ text: chars.slice(0, cp).join("") + chars.slice(to).join(""),
133
+ cursor: cp,
134
+ };
135
+ }
136
+ /**
137
+ * 删到行首(Ctrl+U):删掉光标到本行开头(不含换行符)的内容。
138
+ *
139
+ * 语义与 readline 的 unix-line-discard / 主流 TUI 保持一致。注意 macOS 上
140
+ * iTerm2 与 Terminal.app 会把 `Cmd+Backspace` 映射成 `Ctrl+U` —— 若此处做成
141
+ * 「清空整个输入框」,Mac 用户按 ⌘⌫ 会丢掉全部草稿(多行输入时尤其致命)。
142
+ */
143
+ export function deleteToLineStart(text, cursor) {
144
+ const chars = graphemes(text);
145
+ const cp = clampCursor(chars, cursor);
146
+ let from = cp;
147
+ while (from > 0 && chars[from - 1] !== "\n")
148
+ from -= 1;
149
+ return {
150
+ text: chars.slice(0, from).join("") + chars.slice(cp).join(""),
151
+ cursor: from,
152
+ };
153
+ }
154
+ /**
155
+ * 删到行尾(Ctrl+K):删掉光标到本行末尾(不含换行符)的内容;
156
+ * 若光标已在行尾,则连该换行符一起删掉(与 readline 的 kill-line 一致)。
157
+ */
158
+ export function deleteToLineEnd(text, cursor) {
159
+ const chars = graphemes(text);
160
+ const cp = clampCursor(chars, cursor);
161
+ let to = cp;
162
+ while (to < chars.length && chars[to] !== "\n")
163
+ to += 1;
164
+ if (to === cp && chars[cp] === "\n")
165
+ to += 1;
166
+ return {
167
+ text: chars.slice(0, cp).join("") + chars.slice(to).join(""),
168
+ cursor: cp,
169
+ };
170
+ }
54
171
  //# sourceMappingURL=input.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"input.js","sourceRoot":"","sources":["../../../src/tui/screens/input.ts"],"names":[],"mappings":"AAAA,oDAAoD;AACpD,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAE3E,qDAAqD;AAErD,2CAA2C;AAC3C,MAAM,UAAU,UAAU,CAAC,IAAY,EAAE,OAAe;IACtD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,CAAC,CAAC;IACvC,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC;IACrD,OAAO,WAAW,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,KAAK,CAAC;AAC3C,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,0BAA0B,CAAC,KAY1C;IACC,MAAM,MAAM,GAAG,KAAK,CAAC,WAAW;QAC9B,CAAC,CAAC,EAAE;QACJ,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAClE,OAAO;QACL,CAAC,EAAE,kBAAkB,GAAG,YAAY,CAAC,MAAM,CAAC;QAC5C,4BAA4B;QAC5B,CAAC,EAAE,KAAK,CAAC,eAAe,GAAG,KAAK,CAAC,SAAS,GAAG,CAAC,GAAG,KAAK,CAAC,SAAS;KACjE,CAAC;AACJ,CAAC;AAED,gEAAgE;AAEhE,wDAAwD;AACxD,MAAM,UAAU,UAAU,CAAC,EAAU;IACnC,IAAI,CAAC,EAAE;QAAE,OAAO,KAAK,CAAC;IACtB,MAAM,IAAI,GAAG,EAAE,CAAC,WAAW,CAAC,CAAC,CAAE,CAAC;IAChC,IAAI,IAAI,GAAG,GAAG;QAAE,OAAO,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC/C,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACxB,CAAC;AAED,gCAAgC;AAChC,MAAM,UAAU,QAAQ,CAAC,IAAY,EAAE,MAAc;IACnD,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/B,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IACpD,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAAE,CAAC,IAAI,CAAC,CAAC;IAClD,OAAO,CAAC,GAAG,CAAC,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAAE,CAAC,IAAI,CAAC,CAAC;IACjD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,gCAAgC;AAChC,MAAM,UAAU,SAAS,CAAC,IAAY,EAAE,MAAc;IACpD,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/B,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IACpD,OAAO,CAAC,GAAG,KAAK,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAAE,CAAC,IAAI,CAAC,CAAC;IACzD,OAAO,CAAC,GAAG,KAAK,CAAC,MAAM,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAAE,CAAC,IAAI,CAAC,CAAC;IACxD,OAAO,CAAC,CAAC;AACX,CAAC"}
1
+ {"version":3,"file":"input.js","sourceRoot":"","sources":["../../../src/tui/screens/input.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,13 @@
1
1
  import { RLine } from "./lines.js";
2
2
  /** 确认框固定高度(外 marginTop 1 + 上下边框 2 + 问题 1 + marginTop 1 + 选项 1) */
3
3
  export declare const CONFIRM_LINES = 6;
4
+ /** 底部状态栏行数下限:模型/Agent 一行 + 用量与速率一行(宽度不够时会折成更多行,
5
+ * 实际值由 `statusBarRows()` 量出后传入 `computeChatLayout({ statusBarLines })`) */
6
+ export declare const STATUS_BAR_LINES = 2;
4
7
  /** 选择覆盖层高度(相对条目数) */
5
8
  export declare function pickerLines(itemCount: number): number;
9
+ /** Agent 栏目行数:只有「存在子 Agent」时才出现,且恒为一行(超出宽度由组件截断) */
10
+ export declare const AGENT_TABS_LINES = 1;
6
11
  export interface ChatLayoutInput {
7
12
  columns: number;
8
13
  rows: number;
@@ -13,10 +18,38 @@ export interface ChatLayoutInput {
13
18
  hintCount: number;
14
19
  /** 通知栏行数(notice / error 独立栏位),缺省 0 */
15
20
  noticeCount?: number;
21
+ /**
22
+ * 待发送附件行数(粘贴图片的提示行,位于通知栏与菜单之间)。
23
+ * 与 `noticeCount` / `agentTabLines` 同类:多算或少算一行,输入框就会整体位移,
24
+ * 硬件光标(IME)也跟着偏。缺省 0。
25
+ */
26
+ attachmentLines?: number;
27
+ /**
28
+ * Agent 栏目行数(主 / 子 Agent 切换条,位于对话区与底栏之间)。
29
+ * 无子 Agent 时为 0(不占位);缺省 0。
30
+ */
31
+ agentTabLines?: number;
16
32
  overlay: "none" | "confirm" | "picker";
17
33
  pickerItems: number;
18
34
  /** 视口顶部行索引(相对整个对话行);null / undefined = 贴底(自动跟随最新) */
19
35
  viewTop?: number | null;
36
+ /**
37
+ * 状态栏实际占据的行数(由 `statusBarRows()` 实测得出 —— 它会随终端宽度折行)。
38
+ * 缺省用 `STATUS_BAR_LINES`。
39
+ */
40
+ statusBarLines?: number;
41
+ /**
42
+ * 内容不足一屏时,余量怎么分。
43
+ *
44
+ * 缺省 `bottom`:余量全部补在头部,内容贴底(对话屏的常规行为——最新一行的
45
+ * 下沿永远紧挨分隔线)。
46
+ *
47
+ * `center`:余量上下均分,内容落在对话区垂直中部 —— 只用于空对话的欢迎块
48
+ * (否则 6 行 logo + 标语只能贴顶或贴底,两个位置都不好看)。
49
+ *
50
+ * 内容超出一屏时该参数无效(此时两侧都没有余量)。
51
+ */
52
+ anchor?: "bottom" | "center";
20
53
  }
21
54
  export interface ChatLayout {
22
55
  /** 对话区(含顶部补齐空行),行数恒为 `rows - bottomLines` */
@@ -25,6 +58,14 @@ export interface ChatLayout {
25
58
  bottomLines: number;
26
59
  /** 对话框总行数(未截取前) */
27
60
  totalLines: number;
61
+ /**
62
+ * 菜单**实际**占用的行数(`min(想吃, 剩余空间)`)。
63
+ *
64
+ * 渲染(`BottomMenu.maxRows`)与硬件光标(`computeInputCursorPosition` 的
65
+ * `hintCount`)都必须从这里取,不许自己另算 —— 三处差一行,输入框与 IME 候选框
66
+ * 就会整体偏移(历史事故:通知栏被漏算)。
67
+ */
68
+ hintRows: number;
28
69
  /** 对话区可用高度(已扣除底部区域) */
29
70
  budget: number;
30
71
  /** 本次实际生效的视口顶部索引 */
@@ -32,6 +73,14 @@ export interface ChatLayout {
32
73
  /** 是否处于滚动状态(视口未贴底,下方仍有更新的内容) */
33
74
  scrolled: boolean;
34
75
  }
76
+ /**
77
+ * 把「想要的视口顶部」钳制成合法值:下限 0、上限 `totalLines - budget`。
78
+ *
79
+ * 返回 `null` 表示**已贴底**(视口顶恰好等于最大顶,或内容不足一屏)—— 调用方据此
80
+ * 清掉滚动状态,让视口重新跟随最新内容。所有滚动动作(翻页 / 按行 / 鼠标滚轮)都
81
+ * 走这一个函数,越界方向自然被吃掉,不会出现「滚过头回不来」。
82
+ */
83
+ export declare function clampViewTop(totalLines: number, budget: number, nextTop: number): number | null;
35
84
  /**
36
85
  * 计算对话屏布局:底部区域高度固定后,把「对话行」按视口截取到可用高度,顶部用空行
37
86
  * 补齐 —— 使整帧高度恒等于传入的 `rows`(调用方以 `usableFrameRows()` 预留末行),
@@ -1 +1 @@
1
- {"version":3,"file":"layout.d.ts","sourceRoot":"","sources":["../../../src/tui/screens/layout.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAGnC,kEAAkE;AAClE,eAAO,MAAM,aAAa,IAAI,CAAC;AAC/B,qBAAqB;AACrB,wBAAgB,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAErD;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,mDAAmD;IACnD,UAAU,EAAE,KAAK,EAAE,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,OAAO,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,sCAAsC;IACtC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,QAAQ,CAAC;IACvC,WAAW,EAAE,MAAM,CAAC;IACpB,qDAAqD;IACrD,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED,MAAM,WAAW,UAAU;IACzB,6CAA6C;IAC7C,KAAK,EAAE,KAAK,EAAE,CAAC;IACf,+BAA+B;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,mBAAmB;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,uBAAuB;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,oBAAoB;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,gCAAgC;IAChC,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,eAAe,GAAG,UAAU,CA2BpE"}
1
+ {"version":3,"file":"layout.d.ts","sourceRoot":"","sources":["../../../src/tui/screens/layout.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAGnC,kEAAkE;AAClE,eAAO,MAAM,aAAa,IAAI,CAAC;AAC/B;4EAC4E;AAC5E,eAAO,MAAM,gBAAgB,IAAI,CAAC;AAClC,qBAAqB;AACrB,wBAAgB,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAErD;AAED,oDAAoD;AACpD,eAAO,MAAM,gBAAgB,IAAI,CAAC;AAElC,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,mDAAmD;IACnD,UAAU,EAAE,KAAK,EAAE,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,OAAO,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,sCAAsC;IACtC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;OAIG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,QAAQ,CAAC;IACvC,WAAW,EAAE,MAAM,CAAC;IACpB,qDAAqD;IACrD,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;;;;;;;;;OAUG;IACH,MAAM,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAC;CAC9B;AAED,MAAM,WAAW,UAAU;IACzB,6CAA6C;IAC7C,KAAK,EAAE,KAAK,EAAE,CAAC;IACf,+BAA+B;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,mBAAmB;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB;;;;;;OAMG;IACH,QAAQ,EAAE,MAAM,CAAC;IACjB,uBAAuB;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,oBAAoB;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,gCAAgC;IAChC,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAI/F;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,eAAe,GAAG,UAAU,CAkDpE"}
@@ -1,10 +1,27 @@
1
- import { inputLines } from "./input.js";
1
+ import { inputLines, INPUT_MAX_ROWS } from "./input.js";
2
2
  /** 确认框固定高度(外 marginTop 1 + 上下边框 2 + 问题 1 + marginTop 1 + 选项 1) */
3
3
  export const CONFIRM_LINES = 6;
4
+ /** 底部状态栏行数下限:模型/Agent 一行 + 用量与速率一行(宽度不够时会折成更多行,
5
+ * 实际值由 `statusBarRows()` 量出后传入 `computeChatLayout({ statusBarLines })`) */
6
+ export const STATUS_BAR_LINES = 2;
4
7
  /** 选择覆盖层高度(相对条目数) */
5
8
  export function pickerLines(itemCount) {
6
9
  return 7 + itemCount;
7
10
  }
11
+ /** Agent 栏目行数:只有「存在子 Agent」时才出现,且恒为一行(超出宽度由组件截断) */
12
+ export const AGENT_TABS_LINES = 1;
13
+ /**
14
+ * 把「想要的视口顶部」钳制成合法值:下限 0、上限 `totalLines - budget`。
15
+ *
16
+ * 返回 `null` 表示**已贴底**(视口顶恰好等于最大顶,或内容不足一屏)—— 调用方据此
17
+ * 清掉滚动状态,让视口重新跟随最新内容。所有滚动动作(翻页 / 按行 / 鼠标滚轮)都
18
+ * 走这一个函数,越界方向自然被吃掉,不会出现「滚过头回不来」。
19
+ */
20
+ export function clampViewTop(totalLines, budget, nextTop) {
21
+ const maxTop = Math.max(0, totalLines - budget);
22
+ const clamped = Math.max(0, Math.min(maxTop, nextTop));
23
+ return clamped >= maxTop ? null : clamped;
24
+ }
8
25
  /**
9
26
  * 计算对话屏布局:底部区域高度固定后,把「对话行」按视口截取到可用高度,顶部用空行
10
27
  * 补齐 —— 使整帧高度恒等于传入的 `rows`(调用方以 `usableFrameRows()` 预留末行),
@@ -15,26 +32,47 @@ export function pickerLines(itemCount) {
15
32
  */
16
33
  export function computeChatLayout(input) {
17
34
  const transcript = input.transcript;
18
- const inputHeight = input.busy ? 1 : inputLines(input.input, input.columns).length;
35
+ // 输入区限高:多出来的折行由窗口滚动,而不是把对话区挤空(窗口跟随光标)
36
+ const inputHeight = input.busy ? 1 : Math.min(inputLines(input.input, input.columns).length, INPUT_MAX_ROWS);
19
37
  const overlayHeight = input.overlay === "confirm"
20
38
  ? CONFIRM_LINES
21
39
  : input.overlay === "picker"
22
40
  ? pickerLines(input.pickerItems)
23
41
  : 0;
24
42
  const noticeCount = input.noticeCount ?? 0;
25
- const bottomLines = input.overlay === "none"
26
- ? noticeCount /* 通知栏 */ + 1 /* 分隔线 */ + input.hintCount + inputHeight + 1 /* 状态栏 */
27
- : overlayHeight + 1 /* 状态栏 */;
43
+ const attachmentLines = input.attachmentLines ?? 0;
44
+ const agentTabLines = input.agentTabLines ?? 0;
45
+ const statusBarLines = Math.max(1, input.statusBarLines ?? STATUS_BAR_LINES);
46
+ /** 菜单之外、恒占的底部行(含输入框与状态栏) */
47
+ const fixedBottom = agentTabLines /* Agent 栏目 */ +
48
+ noticeCount /* 通知栏 */ +
49
+ attachmentLines /* 附件提示行 */ +
50
+ 1 /* 分隔线 */ +
51
+ inputHeight +
52
+ statusBarLines;
53
+ /**
54
+ * 菜单能吃多少行:输入框上方到屏幕顶端的**全部**剩余空间,不设固定行数上限 ——
55
+ * 放不下的候选由 `BottomMenu` 从顶端丢弃(滚动窗口)。
56
+ *
57
+ * 覆盖层(确认 / 选择器)整块替换输入区时菜单不参与布局,故归零。
58
+ */
59
+ const hintRows = input.overlay === "none"
60
+ ? Math.min(Math.max(0, input.hintCount), Math.max(0, input.rows - fixedBottom))
61
+ : 0;
62
+ const bottomLines = input.overlay === "none" ? fixedBottom + hintRows : overlayHeight + statusBarLines;
28
63
  const budget = Math.max(0, input.rows - bottomLines);
29
64
  const totalLines = transcript.length;
30
65
  const maxTop = Math.max(0, totalLines - budget);
31
66
  const top = input.viewTop == null ? maxTop : Math.min(Math.max(0, input.viewTop), maxTop);
32
67
  const viewLines = transcript.slice(top, top + budget);
33
- const padTop = Math.max(0, budget - viewLines.length);
68
+ const slack = Math.max(0, budget - viewLines.length);
69
+ const padTop = input.anchor === "center" ? Math.floor(slack / 2) : slack;
70
+ const padBottom = slack - padTop;
34
71
  const lines = [
35
72
  ...Array.from({ length: padTop }, (_, i) => ({ key: `pad-${i}`, kind: "gap", text: " " })),
36
73
  ...viewLines,
74
+ ...Array.from({ length: padBottom }, (_, i) => ({ key: `tail-${i}`, kind: "gap", text: " " })),
37
75
  ];
38
- return { lines, bottomLines, totalLines, budget, viewTop: top, scrolled: top < maxTop };
76
+ return { lines, bottomLines, totalLines, budget, viewTop: top, scrolled: top < maxTop, hintRows };
39
77
  }
40
78
  //# sourceMappingURL=layout.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"layout.js","sourceRoot":"","sources":["../../../src/tui/screens/layout.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAExC,kEAAkE;AAClE,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,CAAC;AAC/B,qBAAqB;AACrB,MAAM,UAAU,WAAW,CAAC,SAAiB;IAC3C,OAAO,CAAC,GAAG,SAAS,CAAC;AACvB,CAAC;AAiCD;;;;;;;GAOG;AACH,MAAM,UAAU,iBAAiB,CAAC,KAAsB;IACtD,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC;IAEpC,MAAM,WAAW,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;IACnF,MAAM,aAAa,GACjB,KAAK,CAAC,OAAO,KAAK,SAAS;QACzB,CAAC,CAAC,aAAa;QACf,CAAC,CAAC,KAAK,CAAC,OAAO,KAAK,QAAQ;YAC1B,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,WAAW,CAAC;YAChC,CAAC,CAAC,CAAC,CAAC;IACV,MAAM,WAAW,GAAG,KAAK,CAAC,WAAW,IAAI,CAAC,CAAC;IAC3C,MAAM,WAAW,GACf,KAAK,CAAC,OAAO,KAAK,MAAM;QACtB,CAAC,CAAC,WAAW,CAAC,SAAS,GAAG,CAAC,CAAC,SAAS,GAAG,KAAK,CAAC,SAAS,GAAG,WAAW,GAAG,CAAC,CAAC,SAAS;QACnF,CAAC,CAAC,aAAa,GAAG,CAAC,CAAC,SAAS,CAAC;IAElC,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,IAAI,GAAG,WAAW,CAAC,CAAC;IACrD,MAAM,UAAU,GAAG,UAAU,CAAC,MAAM,CAAC;IACrC,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,GAAG,MAAM,CAAC,CAAC;IAChD,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,CAAC;IAC1F,MAAM,SAAS,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,GAAG,MAAM,CAAC,CAAC;IACtD,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;IACtD,MAAM,KAAK,GAAY;QACrB,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,EAAE,IAAI,EAAE,KAAc,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;QACnG,GAAG,SAAS;KACb,CAAC;IACF,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,GAAG,MAAM,EAAE,CAAC;AAC1F,CAAC"}
1
+ {"version":3,"file":"layout.js","sourceRoot":"","sources":["../../../src/tui/screens/layout.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAExD,kEAAkE;AAClE,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,CAAC;AAC/B;4EAC4E;AAC5E,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC;AAClC,qBAAqB;AACrB,MAAM,UAAU,WAAW,CAAC,SAAiB;IAC3C,OAAO,CAAC,GAAG,SAAS,CAAC;AACvB,CAAC;AAED,oDAAoD;AACpD,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC;AAqElC;;;;;;GAMG;AACH,MAAM,UAAU,YAAY,CAAC,UAAkB,EAAE,MAAc,EAAE,OAAe;IAC9E,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,GAAG,MAAM,CAAC,CAAC;IAChD,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACvD,OAAO,OAAO,IAAI,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC;AAC5C,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,iBAAiB,CAAC,KAAsB;IACtD,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC;IAEpC,sCAAsC;IACtC,MAAM,WAAW,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAC7G,MAAM,aAAa,GACjB,KAAK,CAAC,OAAO,KAAK,SAAS;QACzB,CAAC,CAAC,aAAa;QACf,CAAC,CAAC,KAAK,CAAC,OAAO,KAAK,QAAQ;YAC1B,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,WAAW,CAAC;YAChC,CAAC,CAAC,CAAC,CAAC;IACV,MAAM,WAAW,GAAG,KAAK,CAAC,WAAW,IAAI,CAAC,CAAC;IAC3C,MAAM,eAAe,GAAG,KAAK,CAAC,eAAe,IAAI,CAAC,CAAC;IACnD,MAAM,aAAa,GAAG,KAAK,CAAC,aAAa,IAAI,CAAC,CAAC;IAC/C,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,cAAc,IAAI,gBAAgB,CAAC,CAAC;IAC7E,4BAA4B;IAC5B,MAAM,WAAW,GACf,aAAa,CAAC,cAAc;QAC5B,WAAW,CAAC,SAAS;QACrB,eAAe,CAAC,WAAW;QAC3B,CAAC,CAAC,SAAS;QACX,WAAW;QACX,cAAc,CAAC;IACjB;;;;;OAKG;IACH,MAAM,QAAQ,GACZ,KAAK,CAAC,OAAO,KAAK,MAAM;QACtB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,IAAI,GAAG,WAAW,CAAC,CAAC;QAC/E,CAAC,CAAC,CAAC,CAAC;IACR,MAAM,WAAW,GACf,KAAK,CAAC,OAAO,KAAK,MAAM,CAAC,CAAC,CAAC,WAAW,GAAG,QAAQ,CAAC,CAAC,CAAC,aAAa,GAAG,cAAc,CAAC;IAErF,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,IAAI,GAAG,WAAW,CAAC,CAAC;IACrD,MAAM,UAAU,GAAG,UAAU,CAAC,MAAM,CAAC;IACrC,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,GAAG,MAAM,CAAC,CAAC;IAChD,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,CAAC;IAC1F,MAAM,SAAS,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,GAAG,MAAM,CAAC,CAAC;IACtD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;IACrD,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IACzE,MAAM,SAAS,GAAG,KAAK,GAAG,MAAM,CAAC;IACjC,MAAM,KAAK,GAAY;QACrB,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,EAAE,IAAI,EAAE,KAAc,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;QACnG,GAAG,SAAS;QACZ,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,EAAE,KAAc,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;KACxG,CAAC;IACF,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,GAAG,MAAM,EAAE,QAAQ,EAAE,CAAC;AACpG,CAAC"}
@@ -13,6 +13,13 @@ export interface RLine {
13
13
  text: string;
14
14
  /** 着色分段;`text` 恒为这些分段的纯文本拼接(便于测试与裁剪) */
15
15
  spans?: Span[];
16
+ /**
17
+ * 整行划删除线。
18
+ *
19
+ * 目前只有一种来源:消息被标了 `omit`(已剔除出上下文,不会再发给模型)。
20
+ * 划掉而不是隐藏 —— 消息凭空消失会让人以为丢了内容,划掉则明确表示「还在,但已出列」。
21
+ */
22
+ struck?: boolean;
16
23
  }
17
24
  /** 缩进 2 列后的可用文本宽度 */
18
25
  export declare function innerWidth(columns: number): number;
@@ -1 +1 @@
1
- {"version":3,"file":"lines.d.ts","sourceRoot":"","sources":["../../../src/tui/screens/lines.ts"],"names":[],"mappings":"AAOA,MAAM,MAAM,QAAQ,GAChB,KAAK,GACL,aAAa,GACb,WAAW,GACX,WAAW,GACX,WAAW,GACX,MAAM,GACN,SAAS,GACT,QAAQ,GACR,OAAO,CAAC;AAEZ,gDAAgD;AAChD,MAAM,WAAW,IAAI;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,KAAK;IACpB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,QAAQ,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,wCAAwC;IACxC,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC;CAChB;AAED,qBAAqB;AACrB,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAElD;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,KAAK,EAAE,CAE7F;AAgHD,yCAAyC;AACzC,wBAAgB,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,EAAE,CAsB5D;AAED,oCAAoC;AACpC,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,KAAK,CAE1E;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,EAAE,CAS5D;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,KAAK,EAAE,CAsB9F"}
1
+ {"version":3,"file":"lines.d.ts","sourceRoot":"","sources":["../../../src/tui/screens/lines.ts"],"names":[],"mappings":"AAOA,MAAM,MAAM,QAAQ,GAChB,KAAK,GACL,aAAa,GACb,WAAW,GACX,WAAW,GACX,WAAW,GACX,MAAM,GACN,SAAS,GACT,QAAQ,GACR,OAAO,CAAC;AAEZ,gDAAgD;AAChD,MAAM,WAAW,IAAI;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,KAAK;IACpB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,QAAQ,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,wCAAwC;IACxC,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC;IACf;;;;;OAKG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,qBAAqB;AACrB,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAElD;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,KAAK,EAAE,CAE7F;AAuHD,yCAAyC;AACzC,wBAAgB,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,EAAE,CAsB5D;AAED,oCAAoC;AACpC,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,KAAK,CAE1E;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,EAAE,CAS5D;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,KAAK,EAAE,CAsB9F"}
@@ -1,5 +1,5 @@
1
1
  // 行渲染原语 —— 折行 / 语法高亮 / 裁剪(与「渲染来源」解耦,纯函数)
2
- import { wrapText, displayWidth } from "../text.js";
2
+ import { wrapText, displayWidth, clusterWidth, graphemes } from "../text.js";
3
3
  import { theme, syntaxStyle } from "../theme.js";
4
4
  import { highlightCode, highlightJson, splitFences } from "../highlight.js";
5
5
  /** 缩进 2 列后的可用文本宽度 */
@@ -33,7 +33,7 @@ function splitTokenLines(tokens) {
33
33
  function toCells(spans) {
34
34
  const cells = [];
35
35
  for (const s of spans) {
36
- for (const ch of s.text) {
36
+ for (const ch of graphemes(s.text)) {
37
37
  cells.push({ ch, color: s.color, dim: s.dim, bold: s.bold, italic: s.italic });
38
38
  }
39
39
  }
@@ -77,7 +77,7 @@ function wrapSpans(spans, limit, preferSpace = false) {
77
77
  lastSpace = -1;
78
78
  };
79
79
  for (const cell of cells) {
80
- const w = displayWidth(cell.ch);
80
+ const w = clusterWidth(cell.ch);
81
81
  if (row.length && width + w > max) {
82
82
  if (preferSpace && lastSpace > 0) {
83
83
  // 在最近的空格处断开:空格及其右侧内容折到下一行
@@ -85,7 +85,7 @@ function wrapSpans(spans, limit, preferSpace = false) {
85
85
  const tail = row.slice(lastSpace + 1);
86
86
  reset();
87
87
  row = tail;
88
- width = tail.reduce((sum, c) => sum + displayWidth(c.ch), 0);
88
+ width = tail.reduce((sum, c) => sum + clusterWidth(c.ch), 0);
89
89
  for (let i = tail.length - 1; i >= 0; i -= 1) {
90
90
  if (tail[i].ch === " ") {
91
91
  lastSpace = i;
@@ -117,8 +117,8 @@ export function clipSpans(spans, max) {
117
117
  let width = 0;
118
118
  for (const span of spans) {
119
119
  let text = "";
120
- for (const ch of span.text) {
121
- const w = displayWidth(ch);
120
+ for (const ch of graphemes(span.text)) {
121
+ const w = clusterWidth(ch);
122
122
  if (width + w > limit - 1) {
123
123
  if (text)
124
124
  out.push({ ...span, text });
@@ -1 +1 @@
1
- {"version":3,"file":"lines.js","sourceRoot":"","sources":["../../../src/tui/screens/lines.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"lines.js","sourceRoot":"","sources":["../../../src/tui/screens/lines.ts"],"names":[],"mappings":"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"}
@@ -2,7 +2,26 @@ import { AgentNS } from "@ai-zen/agents-core";
2
2
  import { RLine } from "./lines.js";
3
3
  /** 从消息内容提取纯文本;非文本块(图片 / 文件)以占位文本表示 */
4
4
  export declare function messageText(content: AgentNS.MessageContent | undefined): string;
5
- /** 单条消息 → 预折行(不可渲染的消息返回空数组) */
5
+ /**
6
+ * 这条消息会不会进入下一轮上下文 —— 与 core `Agent.formatHistory()` 同一判据:
7
+ * `status == undefined || status === Completed`,且未被 `omit`。
8
+ *
9
+ * 策略**不需要**在这里重新推断:`core/Agent.run()` 收尾时已经把策略结算进字段里了
10
+ * (`reconcileAbortedToolRounds()` + `reconcileAbortedMessages()`):
11
+ * - `abortedMessageStrategy: keep` → 有内容的中断消息恢复 `Completed`(进上下文);
12
+ * `drop` → 保持 `Aborted`(不进);
13
+ * - `abortedToolRoundStrategy: fill` → 整轮恢复 `Completed`;`drop` → 整轮 `omit`(不进)。
14
+ * 所以「进不进」读 `status` / `omit` 就是**结果**,渲染层不重复推导策略。
15
+ */
16
+ export declare function entersContext(message: AgentNS.Message): boolean;
17
+ /**
18
+ * 单条消息 → 预折行(不可渲染的消息返回空数组)。
19
+ *
20
+ * - `hidden`:渲染层要求彻底不出现(内部注入 / 占位消息)→ 返回空数组;
21
+ * - **不进上下文**(`!entersContext()`,如中断后按 `drop` 结算的消息、`Error`):
22
+ * 照常渲染、整行划删除线 —— 消息凭空消失会让人以为丢了内容,划掉则明确表示
23
+ * 「还在,但没发给模型」。
24
+ */
6
25
  export declare function messageToLines(message: AgentNS.Message, columns: number): RLine[];
7
26
  export declare function cachedMessageToLines(message: AgentNS.Message, columns: number): RLine[];
8
27
  /** 整段转录 → 预折行 */
@@ -1 +1 @@
1
- {"version":3,"file":"messages-view.d.ts","sourceRoot":"","sources":["../../../src/tui/screens/messages-view.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAO,EAAE,KAAK,EAAyE,MAAM,YAAY,CAAC;AAG1G,sCAAsC;AACtC,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,cAAc,GAAG,SAAS,GAAG,MAAM,CAc/E;AAED,+BAA+B;AAC/B,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,GAAG,KAAK,EAAE,CAgDjF;AA4BD,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,GAAG,KAAK,EAAE,CAOvF;AAED,iBAAiB;AACjB,wBAAgB,eAAe,CAAC,QAAQ,EAAE,OAAO,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,MAAM,GAAG,KAAK,EAAE,CAIrF"}
1
+ {"version":3,"file":"messages-view.d.ts","sourceRoot":"","sources":["../../../src/tui/screens/messages-view.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAO,EAAE,KAAK,EAAyE,MAAM,YAAY,CAAC;AAI1G,sCAAsC;AACtC,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,cAAc,GAAG,SAAS,GAAG,MAAM,CAmB/E;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,GAAG,OAAO,CAG/D;AAaD;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,GAAG,KAAK,EAAE,CAMjF;AAgFD,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,GAAG,KAAK,EAAE,CAOvF;AAED,iBAAiB;AACjB,wBAAgB,eAAe,CAAC,QAAQ,EAAE,OAAO,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,MAAM,GAAG,KAAK,EAAE,CAIrF"}