@ai-zen/cli 1.0.0-alpha.2 → 1.0.0-alpha.22

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 (311) hide show
  1. package/CHANGELOG.md +514 -0
  2. package/README.md +136 -39
  3. package/README.zh.md +136 -39
  4. package/dist/agent-creator.d.ts +11 -0
  5. package/dist/agent-creator.d.ts.map +1 -1
  6. package/dist/agent-creator.js +52 -21
  7. package/dist/agent-creator.js.map +1 -1
  8. package/dist/agent-switch.d.ts +61 -0
  9. package/dist/agent-switch.d.ts.map +1 -0
  10. package/dist/agent-switch.js +83 -0
  11. package/dist/agent-switch.js.map +1 -0
  12. package/dist/agents-store.d.ts +6 -1
  13. package/dist/agents-store.d.ts.map +1 -1
  14. package/dist/agents-store.js +46 -4
  15. package/dist/agents-store.js.map +1 -1
  16. package/dist/auto-migrate-confirm.d.ts +43 -0
  17. package/dist/auto-migrate-confirm.d.ts.map +1 -0
  18. package/dist/auto-migrate-confirm.js +47 -0
  19. package/dist/auto-migrate-confirm.js.map +1 -0
  20. package/dist/config-editor.d.ts +13 -5
  21. package/dist/config-editor.d.ts.map +1 -1
  22. package/dist/config-editor.js +36 -27
  23. package/dist/config-editor.js.map +1 -1
  24. package/dist/config.d.ts +24 -3
  25. package/dist/config.d.ts.map +1 -1
  26. package/dist/config.js +55 -15
  27. package/dist/config.js.map +1 -1
  28. package/dist/conversation-commands/registry.d.ts +123 -4
  29. package/dist/conversation-commands/registry.d.ts.map +1 -1
  30. package/dist/conversation-commands/registry.js +92 -14
  31. package/dist/conversation-commands/registry.js.map +1 -1
  32. package/dist/conversation-persist-plugin.d.ts +0 -1
  33. package/dist/conversation-persist-plugin.d.ts.map +1 -1
  34. package/dist/conversation-persist-plugin.js +7 -16
  35. package/dist/conversation-persist-plugin.js.map +1 -1
  36. package/dist/conversation-repository.d.ts +71 -13
  37. package/dist/conversation-repository.d.ts.map +1 -1
  38. package/dist/conversation-repository.js +81 -24
  39. package/dist/conversation-repository.js.map +1 -1
  40. package/dist/cwd-tracker-plugin.d.ts.map +1 -1
  41. package/dist/cwd-tracker-plugin.js +6 -2
  42. package/dist/cwd-tracker-plugin.js.map +1 -1
  43. package/dist/format-time.d.ts +17 -6
  44. package/dist/format-time.d.ts.map +1 -1
  45. package/dist/format-time.js +32 -14
  46. package/dist/format-time.js.map +1 -1
  47. package/dist/handoff-service.d.ts +19 -0
  48. package/dist/handoff-service.d.ts.map +1 -0
  49. package/dist/handoff-service.js +89 -0
  50. package/dist/handoff-service.js.map +1 -0
  51. package/dist/hook.d.ts.map +1 -1
  52. package/dist/hook.js +69 -15
  53. package/dist/hook.js.map +1 -1
  54. package/dist/i18n/en-wizard.d.ts +8 -0
  55. package/dist/i18n/en-wizard.d.ts.map +1 -0
  56. package/dist/i18n/en-wizard.js +290 -0
  57. package/dist/i18n/en-wizard.js.map +1 -0
  58. package/dist/i18n/en.d.ts +7 -0
  59. package/dist/i18n/en.d.ts.map +1 -0
  60. package/dist/i18n/en.js +224 -0
  61. package/dist/i18n/en.js.map +1 -0
  62. package/dist/i18n/index.d.ts +57 -0
  63. package/dist/i18n/index.d.ts.map +1 -0
  64. package/dist/i18n/index.js +109 -0
  65. package/dist/i18n/index.js.map +1 -0
  66. package/dist/i18n/preferences.d.ts +34 -0
  67. package/dist/i18n/preferences.d.ts.map +1 -0
  68. package/dist/i18n/preferences.js +69 -0
  69. package/dist/i18n/preferences.js.map +1 -0
  70. package/dist/i18n/zh-wizard.d.ts +11 -0
  71. package/dist/i18n/zh-wizard.d.ts.map +1 -0
  72. package/dist/i18n/zh-wizard.js +293 -0
  73. package/dist/i18n/zh-wizard.js.map +1 -0
  74. package/dist/i18n/zh.d.ts +10 -0
  75. package/dist/i18n/zh.d.ts.map +1 -0
  76. package/dist/i18n/zh.js +228 -0
  77. package/dist/i18n/zh.js.map +1 -0
  78. package/dist/index.js +61 -25
  79. package/dist/index.js.map +1 -1
  80. package/dist/mcp-command.d.ts +32 -0
  81. package/dist/mcp-command.d.ts.map +1 -0
  82. package/dist/mcp-command.js +37 -0
  83. package/dist/mcp-command.js.map +1 -0
  84. package/dist/mode.d.ts +31 -4
  85. package/dist/mode.d.ts.map +1 -1
  86. package/dist/mode.js +42 -7
  87. package/dist/mode.js.map +1 -1
  88. package/dist/model-switch.d.ts +58 -0
  89. package/dist/model-switch.d.ts.map +1 -0
  90. package/dist/model-switch.js +62 -0
  91. package/dist/model-switch.js.map +1 -0
  92. package/dist/reasoning-effort.d.ts +96 -0
  93. package/dist/reasoning-effort.d.ts.map +1 -0
  94. package/dist/reasoning-effort.js +164 -0
  95. package/dist/reasoning-effort.js.map +1 -0
  96. package/dist/reasoning-presets.d.ts +34 -0
  97. package/dist/reasoning-presets.d.ts.map +1 -0
  98. package/dist/reasoning-presets.js +85 -0
  99. package/dist/reasoning-presets.js.map +1 -0
  100. package/dist/sdk-log.d.ts +55 -0
  101. package/dist/sdk-log.d.ts.map +1 -0
  102. package/dist/sdk-log.js +91 -0
  103. package/dist/sdk-log.js.map +1 -0
  104. package/dist/session-pointer.d.ts +22 -9
  105. package/dist/session-pointer.d.ts.map +1 -1
  106. package/dist/session-pointer.js +55 -23
  107. package/dist/session-pointer.js.map +1 -1
  108. package/dist/stdio-runner.d.ts.map +1 -1
  109. package/dist/stdio-runner.js +32 -30
  110. package/dist/stdio-runner.js.map +1 -1
  111. package/dist/sub-agent-guard-plugin.d.ts +5 -5
  112. package/dist/sub-agent-guard-plugin.d.ts.map +1 -1
  113. package/dist/sub-agent-guard-plugin.js +7 -7
  114. package/dist/sub-agent-guard-plugin.js.map +1 -1
  115. package/dist/tui/chat-session.d.ts +110 -59
  116. package/dist/tui/chat-session.d.ts.map +1 -1
  117. package/dist/tui/chat-session.js +268 -120
  118. package/dist/tui/chat-session.js.map +1 -1
  119. package/dist/tui/components.d.ts +48 -2
  120. package/dist/tui/components.d.ts.map +1 -1
  121. package/dist/tui/components.js +96 -3
  122. package/dist/tui/components.js.map +1 -1
  123. package/dist/tui/config-wizard/detail.d.ts +12 -6
  124. package/dist/tui/config-wizard/detail.d.ts.map +1 -1
  125. package/dist/tui/config-wizard/detail.js +33 -32
  126. package/dist/tui/config-wizard/detail.js.map +1 -1
  127. package/dist/tui/config-wizard/engine.d.ts.map +1 -1
  128. package/dist/tui/config-wizard/engine.js +27 -21
  129. package/dist/tui/config-wizard/engine.js.map +1 -1
  130. package/dist/tui/config-wizard/fields.d.ts +3 -1
  131. package/dist/tui/config-wizard/fields.d.ts.map +1 -1
  132. package/dist/tui/config-wizard/fields.js +216 -152
  133. package/dist/tui/config-wizard/fields.js.map +1 -1
  134. package/dist/tui/config-wizard/kv-editor.d.ts.map +1 -1
  135. package/dist/tui/config-wizard/kv-editor.js +9 -5
  136. package/dist/tui/config-wizard/kv-editor.js.map +1 -1
  137. package/dist/tui/config-wizard/list.d.ts.map +1 -1
  138. package/dist/tui/config-wizard/list.js +2 -1
  139. package/dist/tui/config-wizard/list.js.map +1 -1
  140. package/dist/tui/config-wizard/mcp-helpers.d.ts.map +1 -1
  141. package/dist/tui/config-wizard/mcp-helpers.js +4 -3
  142. package/dist/tui/config-wizard/mcp-helpers.js.map +1 -1
  143. package/dist/tui/config-wizard/menu.d.ts.map +1 -1
  144. package/dist/tui/config-wizard/menu.js +33 -21
  145. package/dist/tui/config-wizard/menu.js.map +1 -1
  146. package/dist/tui/config-wizard/prompt-editor.d.ts.map +1 -1
  147. package/dist/tui/config-wizard/prompt-editor.js +4 -3
  148. package/dist/tui/config-wizard/prompt-editor.js.map +1 -1
  149. package/dist/tui/config-wizard/prompt.d.ts.map +1 -1
  150. package/dist/tui/config-wizard/prompt.js +8 -7
  151. package/dist/tui/config-wizard/prompt.js.map +1 -1
  152. package/dist/tui/config-wizard/step-agents.d.ts.map +1 -1
  153. package/dist/tui/config-wizard/step-agents.js +29 -20
  154. package/dist/tui/config-wizard/step-agents.js.map +1 -1
  155. package/dist/tui/config-wizard/step-defaults.d.ts.map +1 -1
  156. package/dist/tui/config-wizard/step-defaults.js +24 -27
  157. package/dist/tui/config-wizard/step-defaults.js.map +1 -1
  158. package/dist/tui/config-wizard/step-endpoints.d.ts.map +1 -1
  159. package/dist/tui/config-wizard/step-endpoints.js +16 -6
  160. package/dist/tui/config-wizard/step-endpoints.js.map +1 -1
  161. package/dist/tui/config-wizard/step-mcp.d.ts.map +1 -1
  162. package/dist/tui/config-wizard/step-mcp.js +17 -19
  163. package/dist/tui/config-wizard/step-mcp.js.map +1 -1
  164. package/dist/tui/config-wizard/step-models.d.ts.map +1 -1
  165. package/dist/tui/config-wizard/step-models.js +41 -26
  166. package/dist/tui/config-wizard/step-models.js.map +1 -1
  167. package/dist/tui/config-wizard/step-new-endpoint.d.ts.map +1 -1
  168. package/dist/tui/config-wizard/step-new-endpoint.js +16 -12
  169. package/dist/tui/config-wizard/step-new-endpoint.js.map +1 -1
  170. package/dist/tui/config-wizard/step-simple.d.ts.map +1 -1
  171. package/dist/tui/config-wizard/step-simple.js +18 -17
  172. package/dist/tui/config-wizard/step-simple.js.map +1 -1
  173. package/dist/tui/config-wizard/types.d.ts +18 -3
  174. package/dist/tui/config-wizard/types.d.ts.map +1 -1
  175. package/dist/tui/config-wizard/wizard.d.ts.map +1 -1
  176. package/dist/tui/config-wizard/wizard.js +4 -3
  177. package/dist/tui/config-wizard/wizard.js.map +1 -1
  178. package/dist/tui/highlight.d.ts +3 -2
  179. package/dist/tui/highlight.d.ts.map +1 -1
  180. package/dist/tui/highlight.js +3 -2
  181. package/dist/tui/highlight.js.map +1 -1
  182. package/dist/tui/index.d.ts +18 -1
  183. package/dist/tui/index.d.ts.map +1 -1
  184. package/dist/tui/index.js +107 -49
  185. package/dist/tui/index.js.map +1 -1
  186. package/dist/tui/input-editing.d.ts +52 -0
  187. package/dist/tui/input-editing.d.ts.map +1 -0
  188. package/dist/tui/input-editing.js +91 -0
  189. package/dist/tui/input-editing.js.map +1 -0
  190. package/dist/tui/key-debug.d.ts +62 -0
  191. package/dist/tui/key-debug.d.ts.map +1 -0
  192. package/dist/tui/key-debug.js +92 -0
  193. package/dist/tui/key-debug.js.map +1 -0
  194. package/dist/tui/mouse.d.ts +55 -0
  195. package/dist/tui/mouse.d.ts.map +1 -0
  196. package/dist/tui/mouse.js +74 -0
  197. package/dist/tui/mouse.js.map +1 -0
  198. package/dist/tui/phase.d.ts +64 -0
  199. package/dist/tui/phase.d.ts.map +1 -0
  200. package/dist/tui/phase.js +112 -0
  201. package/dist/tui/phase.js.map +1 -0
  202. package/dist/tui/screens/chat-commands.d.ts +64 -3
  203. package/dist/tui/screens/chat-commands.d.ts.map +1 -1
  204. package/dist/tui/screens/chat-commands.js +483 -157
  205. package/dist/tui/screens/chat-commands.js.map +1 -1
  206. package/dist/tui/screens/chat.d.ts +10 -5
  207. package/dist/tui/screens/chat.d.ts.map +1 -1
  208. package/dist/tui/screens/chat.js +464 -301
  209. package/dist/tui/screens/chat.js.map +1 -1
  210. package/dist/tui/screens/common-keys.d.ts +36 -0
  211. package/dist/tui/screens/common-keys.d.ts.map +1 -0
  212. package/dist/tui/screens/common-keys.js +67 -0
  213. package/dist/tui/screens/common-keys.js.map +1 -0
  214. package/dist/tui/screens/frame-buffer.d.ts +47 -0
  215. package/dist/tui/screens/frame-buffer.d.ts.map +1 -0
  216. package/dist/tui/screens/frame-buffer.js +78 -0
  217. package/dist/tui/screens/frame-buffer.js.map +1 -0
  218. package/dist/tui/screens/handoff-choice.d.ts +37 -0
  219. package/dist/tui/screens/handoff-choice.d.ts.map +1 -0
  220. package/dist/tui/screens/handoff-choice.js +42 -0
  221. package/dist/tui/screens/handoff-choice.js.map +1 -0
  222. package/dist/tui/screens/index.d.ts +8 -8
  223. package/dist/tui/screens/index.d.ts.map +1 -1
  224. package/dist/tui/screens/index.js +7 -7
  225. package/dist/tui/screens/index.js.map +1 -1
  226. package/dist/tui/screens/input-row.d.ts +64 -0
  227. package/dist/tui/screens/input-row.d.ts.map +1 -0
  228. package/dist/tui/screens/input-row.js +67 -0
  229. package/dist/tui/screens/input-row.js.map +1 -0
  230. package/dist/tui/screens/input.d.ts +46 -1
  231. package/dist/tui/screens/input.d.ts.map +1 -1
  232. package/dist/tui/screens/input.js +83 -8
  233. package/dist/tui/screens/input.js.map +1 -1
  234. package/dist/tui/screens/layout.d.ts +21 -3
  235. package/dist/tui/screens/layout.d.ts.map +1 -1
  236. package/dist/tui/screens/layout.js +20 -9
  237. package/dist/tui/screens/layout.js.map +1 -1
  238. package/dist/tui/screens/lines.d.ts +12 -41
  239. package/dist/tui/screens/lines.d.ts.map +1 -1
  240. package/dist/tui/screens/lines.js +90 -98
  241. package/dist/tui/screens/lines.js.map +1 -1
  242. package/dist/tui/screens/messages-view.d.ts +10 -0
  243. package/dist/tui/screens/messages-view.d.ts.map +1 -0
  244. package/dist/tui/screens/messages-view.js +116 -0
  245. package/dist/tui/screens/messages-view.js.map +1 -0
  246. package/dist/tui/screens/notice-bar.d.ts +5 -0
  247. package/dist/tui/screens/notice-bar.d.ts.map +1 -0
  248. package/dist/tui/screens/notice-bar.js +15 -0
  249. package/dist/tui/screens/notice-bar.js.map +1 -0
  250. package/dist/tui/screens/notice.d.ts +64 -0
  251. package/dist/tui/screens/notice.d.ts.map +1 -0
  252. package/dist/tui/screens/notice.js +106 -0
  253. package/dist/tui/screens/notice.js.map +1 -0
  254. package/dist/tui/screens/overlays.d.ts.map +1 -1
  255. package/dist/tui/screens/overlays.js +3 -2
  256. package/dist/tui/screens/overlays.js.map +1 -1
  257. package/dist/tui/screens/render.d.ts +2 -4
  258. package/dist/tui/screens/render.d.ts.map +1 -1
  259. package/dist/tui/screens/render.js +7 -43
  260. package/dist/tui/screens/render.js.map +1 -1
  261. package/dist/tui/screens/splash.d.ts +1 -1
  262. package/dist/tui/screens/splash.d.ts.map +1 -1
  263. package/dist/tui/screens/splash.js +12 -3
  264. package/dist/tui/screens/splash.js.map +1 -1
  265. package/dist/tui/screens/use-chat-viewport.d.ts +22 -0
  266. package/dist/tui/screens/use-chat-viewport.d.ts.map +1 -0
  267. package/dist/tui/screens/use-chat-viewport.js +50 -0
  268. package/dist/tui/screens/use-chat-viewport.js.map +1 -0
  269. package/dist/tui/screens/use-input-editing.d.ts +44 -0
  270. package/dist/tui/screens/use-input-editing.d.ts.map +1 -0
  271. package/dist/tui/screens/use-input-editing.js +192 -0
  272. package/dist/tui/screens/use-input-editing.js.map +1 -0
  273. package/dist/tui/screens/use-overlays.d.ts +25 -0
  274. package/dist/tui/screens/use-overlays.d.ts.map +1 -0
  275. package/dist/tui/screens/use-overlays.js +32 -0
  276. package/dist/tui/screens/use-overlays.js.map +1 -0
  277. package/dist/tui/screens/use-wizard-host.d.ts +35 -0
  278. package/dist/tui/screens/use-wizard-host.d.ts.map +1 -0
  279. package/dist/tui/screens/use-wizard-host.js +103 -0
  280. package/dist/tui/screens/use-wizard-host.js.map +1 -0
  281. package/dist/tui/status-segments.d.ts +37 -0
  282. package/dist/tui/status-segments.d.ts.map +1 -0
  283. package/dist/tui/status-segments.js +166 -0
  284. package/dist/tui/status-segments.js.map +1 -0
  285. package/dist/tui/text.d.ts +20 -7
  286. package/dist/tui/text.d.ts.map +1 -1
  287. package/dist/tui/text.js +111 -37
  288. package/dist/tui/text.js.map +1 -1
  289. package/dist/tui/theme.d.ts +7 -1
  290. package/dist/tui/theme.d.ts.map +1 -1
  291. package/dist/tui/theme.js +15 -3
  292. package/dist/tui/theme.js.map +1 -1
  293. package/dist/tui/token-rate.d.ts +83 -0
  294. package/dist/tui/token-rate.d.ts.map +1 -0
  295. package/dist/tui/token-rate.js +195 -0
  296. package/dist/tui/token-rate.js.map +1 -0
  297. package/dist/types.d.ts +7 -8
  298. package/dist/types.d.ts.map +1 -1
  299. package/package.json +4 -3
  300. package/dist/auto-migrate-confirm-plugin.d.ts +0 -58
  301. package/dist/auto-migrate-confirm-plugin.d.ts.map +0 -1
  302. package/dist/auto-migrate-confirm-plugin.js +0 -61
  303. package/dist/auto-migrate-confirm-plugin.js.map +0 -1
  304. package/dist/migration-service.d.ts +0 -15
  305. package/dist/migration-service.d.ts.map +0 -1
  306. package/dist/migration-service.js +0 -59
  307. package/dist/migration-service.js.map +0 -1
  308. package/dist/tui/screens/state.d.ts +0 -13
  309. package/dist/tui/screens/state.d.ts.map +0 -1
  310. package/dist/tui/screens/state.js +0 -75
  311. package/dist/tui/screens/state.js.map +0 -1
@@ -0,0 +1,195 @@
1
+ /**
2
+ * 生成过程的 token 速率统计 —— 纯逻辑,不依赖 React / Ink / SDK
3
+ *
4
+ * 需求是「每秒接收多少 token」,而 SDK 只在**每个请求的最后一个 chunk** 才给出
5
+ * `usage`(`stream_options.include_usage`),拿不到逐 token 的用量。所以这里分两路:
6
+ *
7
+ * - **实时速率**:按增量字符估算 token,用 2 秒滑动窗口算(`live`)。它必须靠估算,
8
+ * 否则要等一整轮结束才有数字,就谈不上「实时」;
9
+ * - **本轮平均**:一轮结束时优先用真实 `completion_tokens`(累加多轮工具调用),
10
+ * 除以「首字 → 末字」的时间跨度(`average`)。这段时间不含开头的等待首字。
11
+ *
12
+ * 两者口径不同,展示上也分开(生成中显示实时,结束后显示本轮平均)——把估算值
13
+ * 和精确值混成一个数字才是真的误导。
14
+ */
15
+ /** 实时速率的滑动窗口:取值越小越「跳」,越大越迟钝 */
16
+ export const LIVE_WINDOW_MS = 2000;
17
+ /** 计算速率的最小时间跨度:太短会把「首包爆发」放大成离谱的高速率 */
18
+ export const MIN_SPAN_MS = 400;
19
+ /** 全角 / CJK 字符范围(这些字符在主流分词器里约占 0.7 个 token) */
20
+ const CJK = /[\u2e80-\u9fff\u3000-\u303f\uff00-\uffef\uac00-\ud7af]/;
21
+ /**
22
+ * 按字符估算 token 数(浮点,调用方决定何时取整)。
23
+ *
24
+ * 权重取值依据:中文/全角约 0.7 token 一个字(DeepSeek / GLM 系分词器实测区间
25
+ * 0.6~0.8),其余非空白字符约 0.25(≈4 字符一个 token),空白约 0.1(多半与前词
26
+ * 合并,但不为零)。这是**估算**,用于实时速率;精确值一律以 `usage` 为准。
27
+ */
28
+ export function estimateTokens(text) {
29
+ if (!text)
30
+ return 0;
31
+ let tokens = 0;
32
+ for (const char of text) {
33
+ if (/\s/.test(char))
34
+ tokens += 0.1;
35
+ else
36
+ tokens += CJK.test(char) ? 0.7 : 0.25;
37
+ }
38
+ return tokens;
39
+ }
40
+ /**
41
+ * 从流式 chunk 里取出「本次新增的输出文本」:正文 + 思考 + 工具参数。
42
+ *
43
+ * 三者都是模型实打实吐出来的 token,只统计正文会低估(尤其推理模型的思考段)。
44
+ */
45
+ export function deltaText(chunk) {
46
+ const delta = chunk?.choices?.[0]?.delta;
47
+ if (!delta)
48
+ return "";
49
+ let text = "";
50
+ const content = delta.content;
51
+ if (typeof content === "string") {
52
+ text += content;
53
+ }
54
+ else if (Array.isArray(content)) {
55
+ for (const section of content) {
56
+ if (section && typeof section.text === "string")
57
+ text += section.text;
58
+ }
59
+ }
60
+ if (typeof delta.reasoning_content === "string")
61
+ text += delta.reasoning_content;
62
+ if (Array.isArray(delta.tool_calls)) {
63
+ for (const call of delta.tool_calls) {
64
+ if (typeof call?.function?.name === "string")
65
+ text += call.function.name;
66
+ if (typeof call?.function?.arguments === "string")
67
+ text += call.function.arguments;
68
+ }
69
+ }
70
+ return text;
71
+ }
72
+ /** 无数据的快照(状态栏据此不显示速率段) */
73
+ export const IDLE_RATE = { live: null, average: null, running: false };
74
+ /**
75
+ * 速率统计器。
76
+ *
77
+ * 生命周期由调用方驱动:`begin()`(一轮开始)→ 若干个 `addDelta()` / `addExact()`
78
+ * → `finish()`(一轮结束)。时间一律可注入,便于单测不依赖真实时钟。
79
+ */
80
+ export class TokenRateMeter {
81
+ samples = [];
82
+ /** 估算的累计输出 token */
83
+ estimated = 0;
84
+ /** 真实 `completion_tokens` 累加(多轮工具调用逐轮相加) */
85
+ exact = 0;
86
+ startedAt = null;
87
+ firstOutputAt = null;
88
+ lastOutputAt = null;
89
+ finished = false;
90
+ averageValue = null;
91
+ /** 一轮开始:清空上一轮的所有状态 */
92
+ begin(now = Date.now()) {
93
+ this.samples = [];
94
+ this.estimated = 0;
95
+ this.exact = 0;
96
+ this.startedAt = now;
97
+ this.firstOutputAt = null;
98
+ this.lastOutputAt = null;
99
+ this.finished = false;
100
+ this.averageValue = null;
101
+ }
102
+ /** 收到一段增量文本:累加估算 token 并打点 */
103
+ addDelta(text, now = Date.now()) {
104
+ const tokens = estimateTokens(text);
105
+ if (tokens <= 0)
106
+ return;
107
+ if (this.startedAt == null)
108
+ this.begin(now);
109
+ this.estimated += tokens;
110
+ this.firstOutputAt ??= now;
111
+ this.lastOutputAt = now;
112
+ this.samples.push({ t: now, tokens: this.estimated });
113
+ this.trim(now);
114
+ }
115
+ /** 收到真实用量(流末 chunk 的 `usage.completion_tokens`),多轮累加 */
116
+ addExact(completionTokens) {
117
+ if (typeof completionTokens !== "number" || !Number.isFinite(completionTokens))
118
+ return;
119
+ if (completionTokens <= 0)
120
+ return;
121
+ this.exact += completionTokens;
122
+ }
123
+ /**
124
+ * 一轮结束:算本轮平均速率。
125
+ *
126
+ * 分子优先用真实 `completion_tokens`;分母是「首字 → 末字」的跨度,即真正在接收
127
+ * 内容的那段时间 —— 不含开头的排队等首字,也避免把整轮的思考停顿算成慢。
128
+ */
129
+ finish(now = Date.now()) {
130
+ this.finished = true;
131
+ const tokens = this.exact > 0 ? this.exact : this.estimated;
132
+ const from = this.firstOutputAt ?? this.startedAt;
133
+ const to = this.lastOutputAt ?? now;
134
+ if (tokens <= 0 || from == null) {
135
+ this.averageValue = null;
136
+ return;
137
+ }
138
+ const spanMs = to - from;
139
+ this.averageValue = spanMs >= MIN_SPAN_MS ? tokens / (spanMs / 1000) : null;
140
+ }
141
+ /** 当前快照(供状态栏直接渲染) */
142
+ snapshot(now = Date.now()) {
143
+ if (this.startedAt == null)
144
+ return IDLE_RATE;
145
+ if (this.finished)
146
+ return { live: null, average: this.averageValue, running: false };
147
+ return { live: this.liveRate(now), average: null, running: true };
148
+ }
149
+ /** 清空(退出 / 重建会话时调用) */
150
+ reset() {
151
+ this.samples = [];
152
+ this.estimated = 0;
153
+ this.exact = 0;
154
+ this.startedAt = null;
155
+ this.firstOutputAt = null;
156
+ this.lastOutputAt = null;
157
+ this.finished = false;
158
+ this.averageValue = null;
159
+ }
160
+ /** 最近窗口的估算速率;窗口内没动静时返回 0(停顿本来就该显示 0,而不是上一秒的高值) */
161
+ liveRate(now) {
162
+ if (this.samples.length === 0)
163
+ return null;
164
+ // 跨度从**首字**算起:把等首字的排队时间算进来会把速率稀释成端到端吞吐,
165
+ // 首字之后才开始计时间,同时也顺手挡掉了「首包爆发」被放大成离谱高值的问题。
166
+ const from = this.firstOutputAt ?? this.startedAt;
167
+ const windowStart = Math.max(from, now - LIVE_WINDOW_MS);
168
+ const spanMs = now - windowStart;
169
+ if (spanMs < MIN_SPAN_MS)
170
+ return null;
171
+ // 窗口起点对应的累计值:取最后一个不晚于窗口起点的采样
172
+ let base = 0;
173
+ for (const sample of this.samples) {
174
+ if (sample.t <= windowStart)
175
+ base = sample.tokens;
176
+ else
177
+ break;
178
+ }
179
+ return Math.max(0, this.estimated - base) / (spanMs / 1000);
180
+ }
181
+ /** 丢掉窗口外的采样(保留一个窗口起点之前的锚点,用于算基准值) */
182
+ trim(now) {
183
+ const cutoff = now - LIVE_WINDOW_MS;
184
+ let keepFrom = 0;
185
+ for (let i = 0; i < this.samples.length; i += 1) {
186
+ if (this.samples[i].t <= cutoff)
187
+ keepFrom = i;
188
+ else
189
+ break;
190
+ }
191
+ if (keepFrom > 0)
192
+ this.samples = this.samples.slice(keepFrom);
193
+ }
194
+ }
195
+ //# sourceMappingURL=token-rate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-rate.js","sourceRoot":"","sources":["../../src/tui/token-rate.ts"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -6,18 +6,17 @@
6
6
  */
7
7
  export type { AppConfig, Endpoint, Model, ImageModel, AgentDefinition, AgentPermissions, McpServerConfig, McpServerManifest, } from "@ai-zen/agents-sdk";
8
8
  export type { Conversation } from "./conversation-repository.js";
9
- import type { SdkAgent, TaskMigrationService } from "@ai-zen/agents-sdk";
9
+ import type { SdkAgent, HandoffService } from "@ai-zen/agents-sdk";
10
10
  export interface ConversationContext {
11
11
  agent: SdkAgent;
12
- input: string;
13
12
  currentName: string;
14
- modelId: string;
15
- currentId: string | undefined;
13
+ currentId: string;
16
14
  agentId: string | undefined;
17
- running: boolean;
18
- shouldSend?: boolean;
19
- /** 迁移服务实例:自动迁移(AutoMigratePlugin)与手动迁移(/migrate 命令)共用同一实例。先建 ctx 再回填(migrate 前必已赋值) */
20
- migrationService?: TaskMigrationService;
15
+ /**
16
+ * 交接服务实例:自动迁移、`/migrate`、`/handoff` 共用同一实例。
17
+ * 先建 ctx 再回填(交接前必已赋值)。
18
+ */
19
+ handoffService?: HandoffService;
21
20
  }
22
21
  export type CommandHandler = (ctx: ConversationContext) => Promise<void>;
23
22
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,YAAY,EACV,SAAS,EACT,QAAQ,EACR,KAAK,EACL,UAAU,EACV,eAAe,EACf,gBAAgB,EAChB,eAAe,EACf,iBAAiB,GAClB,MAAM,oBAAoB,CAAC;AAE5B,YAAY,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAGjE,OAAO,KAAK,EAAE,QAAQ,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAEzE,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,QAAQ,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,uFAAuF;IACvF,gBAAgB,CAAC,EAAE,oBAAoB,CAAC;CACzC;AAED,MAAM,MAAM,cAAc,GAAG,CAAC,GAAG,EAAE,mBAAmB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,YAAY,EACV,SAAS,EACT,QAAQ,EACR,KAAK,EACL,UAAU,EACV,eAAe,EACf,gBAAgB,EAChB,eAAe,EACf,iBAAiB,GAClB,MAAM,oBAAoB,CAAC;AAE5B,YAAY,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAGjE,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEnE,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,QAAQ,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B;;;OAGG;IACH,cAAc,CAAC,EAAE,cAAc,CAAC;CACjC;AAED,MAAM,MAAM,cAAc,GAAG,CAAC,GAAG,EAAE,mBAAmB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ai-zen/cli",
3
- "version": "1.0.0-alpha.2",
3
+ "version": "1.0.0-alpha.22",
4
4
  "description": "AI-ZEN CLI - dual-mode AI terminal: pure stdio pipelines and an interactive TUI",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -21,14 +21,15 @@
21
21
  "author": "LZQCN",
22
22
  "license": "MIT",
23
23
  "dependencies": {
24
- "@ai-zen/agents-core": "^4.3.0",
25
- "@ai-zen/agents-sdk": "1.0.0-alpha.3",
24
+ "@ai-zen/agents-core": "^4.5.3",
25
+ "@ai-zen/agents-sdk": "1.0.0-alpha.21",
26
26
  "@modelcontextprotocol/sdk": "^1.29.0",
27
27
  "dayjs": "^1.11.21",
28
28
  "highlight.js": "^11.12.0",
29
29
  "ink": "^7.1.1",
30
30
  "lowlight": "^3.3.0",
31
31
  "react": "^19.3.0",
32
+ "string-width": "^8.3.0",
32
33
  "zod": "^4.4.3"
33
34
  },
34
35
  "devDependencies": {
@@ -1,58 +0,0 @@
1
- /**
2
- * AutoMigrateConfirmPlugin — 自动迁移「二次确认」插件(CLI 层)。
3
- *
4
- * 背景:SDK 的 `AutoMigratePlugin` 在 `usage.prompt_tokens` 超过阈值时**静默**触发迁移,
5
- * 而迁移会保存当前对话并以交接文档开启新会话。为让用户对这次「上下文切换」有知情权与
6
- * 否决权,CLI 在自动迁移前补一道二次确认。
7
- *
8
- * 职责边界(沿用 SDK 的分工,不重复实现「何时迁移」的语义):
9
- * - 是否触发:本插件先向用户确认,得到许可后委托基类的 `onAfterSend` 完成阈值判断与迁移调用;
10
- * - 实际迁移:仍由共享的 `TaskMigrationService` 实例执行(与 /migrate 手动迁移同一条链路)。
11
- * 因此本插件的增量仅有一处:在超阈值与调用迁移之间插入一次确认。
12
- *
13
- * 交互约定:
14
- * - 仅在 stdin 与 stdout **均为 TTY**(人类交互终端)时询问;
15
- * - 非交互环境(管道、重定向、e2e 脚本)没有确认通道,保持既有行为——直接自动迁移,
16
- * 不阻塞等待输入、不额外输出,管道语义不变;
17
- * - 确认框默认「是」(回车即迁移),与 /migrate 手动迁移的默认值保持一致;
18
- * - 用户拒绝时仅跳过**本次**迁移,不记录任何隐式状态:只要仍处于超限状态,下次发送后
19
- * 会再次询问;跳过不影响当前对话(历史未被剔除,语义与迁移前一致)。
20
- */
21
- import { AutoMigratePlugin } from "@ai-zen/agents-sdk";
22
- import type { SendContext, TaskMigrationService } from "@ai-zen/agents-sdk";
23
- /** 触发自动迁移时的用量信息(供确认文案与自定义询问实现使用) */
24
- export interface AutoMigrateTriggerInfo {
25
- /** 当前 prompt token 用量 */
26
- promptTokens: number;
27
- /** 上下文阈值(当前模型的 maxContextTokens) */
28
- maxTokens: number;
29
- }
30
- export interface AutoMigrateConfirmOptions {
31
- /** 迁移服务实例(与手动迁移 /migrate 共用同一实例) */
32
- service: TaskMigrationService;
33
- /** 触发迁移的上下文阈值 */
34
- maxTokens: number;
35
- /** 是否需要向用户确认;默认「stdin 与 stdout 均为 TTY」。可注入,便于单测 */
36
- shouldConfirm?: () => boolean;
37
- /**
38
- * 确认实现,由调用方注入(例如 TUI 的 Ink 确认框)。本模块不再内置任何交互 UI;
39
- * 仅当 `shouldConfirm()` 为真时才会被调用。
40
- */
41
- confirm: (info: AutoMigrateTriggerInfo) => Promise<boolean>;
42
- /** 输出信息(如「已跳过本次迁移」);由调用方注入(TUI 走 Ink notice),默认丢弃 */
43
- log?: (text: string) => void;
44
- }
45
- /** 默认交互判定:仅当 stdin 与 stdout 均为 TTY 时才具备确认通道 */
46
- export declare function canPromptUser(): boolean;
47
- /**
48
- * 自动迁移二次确认插件。
49
- *
50
- * 继承 SDK 的 `AutoMigratePlugin` 以复用其触发语义(阈值判断 + 委托共享迁移服务),
51
- * 仅在「超阈值」与「调用迁移」之间插入一次用户确认。
52
- */
53
- export declare class AutoMigrateConfirmPlugin extends AutoMigratePlugin {
54
- private readonly confirmOptions;
55
- constructor(options: AutoMigrateConfirmOptions);
56
- onAfterSend(ctx: SendContext): Promise<void>;
57
- }
58
- //# sourceMappingURL=auto-migrate-confirm-plugin.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"auto-migrate-confirm-plugin.d.ts","sourceRoot":"","sources":["../src/auto-migrate-confirm-plugin.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,KAAK,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAE5E,oCAAoC;AACpC,MAAM,WAAW,sBAAsB;IACrC,yBAAyB;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,oCAAoC;IACpC,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,yBAAyB;IACxC,oCAAoC;IACpC,OAAO,EAAE,oBAAoB,CAAC;IAC9B,iBAAiB;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,mDAAmD;IACnD,aAAa,CAAC,EAAE,MAAM,OAAO,CAAC;IAC9B;;;OAGG;IACH,OAAO,EAAE,CAAC,IAAI,EAAE,sBAAsB,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC5D,qDAAqD;IACrD,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAC9B;AAED,+CAA+C;AAC/C,wBAAgB,aAAa,IAAI,OAAO,CAEvC;AAED;;;;;GAKG;AACH,qBAAa,wBAAyB,SAAQ,iBAAiB;IAC7D,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA4B;gBAE/C,OAAO,EAAE,yBAAyB;IAKxC,WAAW,CAAC,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;CA2BnD"}
@@ -1,61 +0,0 @@
1
- /**
2
- * AutoMigrateConfirmPlugin — 自动迁移「二次确认」插件(CLI 层)。
3
- *
4
- * 背景:SDK 的 `AutoMigratePlugin` 在 `usage.prompt_tokens` 超过阈值时**静默**触发迁移,
5
- * 而迁移会保存当前对话并以交接文档开启新会话。为让用户对这次「上下文切换」有知情权与
6
- * 否决权,CLI 在自动迁移前补一道二次确认。
7
- *
8
- * 职责边界(沿用 SDK 的分工,不重复实现「何时迁移」的语义):
9
- * - 是否触发:本插件先向用户确认,得到许可后委托基类的 `onAfterSend` 完成阈值判断与迁移调用;
10
- * - 实际迁移:仍由共享的 `TaskMigrationService` 实例执行(与 /migrate 手动迁移同一条链路)。
11
- * 因此本插件的增量仅有一处:在超阈值与调用迁移之间插入一次确认。
12
- *
13
- * 交互约定:
14
- * - 仅在 stdin 与 stdout **均为 TTY**(人类交互终端)时询问;
15
- * - 非交互环境(管道、重定向、e2e 脚本)没有确认通道,保持既有行为——直接自动迁移,
16
- * 不阻塞等待输入、不额外输出,管道语义不变;
17
- * - 确认框默认「是」(回车即迁移),与 /migrate 手动迁移的默认值保持一致;
18
- * - 用户拒绝时仅跳过**本次**迁移,不记录任何隐式状态:只要仍处于超限状态,下次发送后
19
- * 会再次询问;跳过不影响当前对话(历史未被剔除,语义与迁移前一致)。
20
- */
21
- import { AutoMigratePlugin } from "@ai-zen/agents-sdk";
22
- /** 默认交互判定:仅当 stdin 与 stdout 均为 TTY 时才具备确认通道 */
23
- export function canPromptUser() {
24
- return Boolean(process.stdin.isTTY && process.stdout.isTTY);
25
- }
26
- /**
27
- * 自动迁移二次确认插件。
28
- *
29
- * 继承 SDK 的 `AutoMigratePlugin` 以复用其触发语义(阈值判断 + 委托共享迁移服务),
30
- * 仅在「超阈值」与「调用迁移」之间插入一次用户确认。
31
- */
32
- export class AutoMigrateConfirmPlugin extends AutoMigratePlugin {
33
- confirmOptions;
34
- constructor(options) {
35
- super({ service: options.service, maxTokens: options.maxTokens });
36
- this.confirmOptions = options;
37
- }
38
- async onAfterSend(ctx) {
39
- const { maxTokens, shouldConfirm = canPromptUser, confirm, log = () => { } } = this.confirmOptions;
40
- const promptTokens = ctx.agent.lastUsage?.prompt_tokens;
41
- // 未超阈值(或无用量信息):无需询问,交由基类按原语义处理
42
- if (promptTokens == null || promptTokens <= maxTokens) {
43
- await super.onAfterSend(ctx);
44
- return;
45
- }
46
- // 非交互环境:没有确认通道,保持既有「静默自动迁移」行为,不阻塞、不额外输出
47
- if (!shouldConfirm()) {
48
- await super.onAfterSend(ctx);
49
- return;
50
- }
51
- const confirmed = await confirm({ promptTokens, maxTokens });
52
- if (!confirmed) {
53
- log("⏭️ 已跳过本次任务迁移,继续当前对话。");
54
- log("💡 上下文仍接近上限:可随时输入 /migrate 手动迁移;若继续增长至严重超限,对话会被安全护栏中断。");
55
- return;
56
- }
57
- // 用户已确认:交由基类完成「触发 + 委托共享迁移服务」的原逻辑
58
- await super.onAfterSend(ctx);
59
- }
60
- }
61
- //# sourceMappingURL=auto-migrate-confirm-plugin.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"auto-migrate-confirm-plugin.js","sourceRoot":"","sources":["../src/auto-migrate-confirm-plugin.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AA2BvD,+CAA+C;AAC/C,MAAM,UAAU,aAAa;IAC3B,OAAO,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC9D,CAAC;AAED;;;;;GAKG;AACH,MAAM,OAAO,wBAAyB,SAAQ,iBAAiB;IAC5C,cAAc,CAA4B;IAE3D,YAAY,OAAkC;QAC5C,KAAK,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;QAClE,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC;IAChC,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,GAAgB;QAChC,MAAM,EAAE,SAAS,EAAE,aAAa,GAAG,aAAa,EAAE,OAAO,EAAE,GAAG,GAAG,GAAG,EAAE,GAAE,CAAC,EAAE,GAAG,IAAI,CAAC,cAAc,CAAC;QAElG,MAAM,YAAY,GAAG,GAAG,CAAC,KAAK,CAAC,SAAS,EAAE,aAAa,CAAC;QAExD,+BAA+B;QAC/B,IAAI,YAAY,IAAI,IAAI,IAAI,YAAY,IAAI,SAAS,EAAE,CAAC;YACtD,MAAM,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;YAC7B,OAAO;QACT,CAAC;QAED,wCAAwC;QACxC,IAAI,CAAC,aAAa,EAAE,EAAE,CAAC;YACrB,MAAM,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;YAC7B,OAAO;QACT,CAAC;QAED,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,EAAE,YAAY,EAAE,SAAS,EAAE,CAAC,CAAC;QAC7D,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,GAAG,CAAC,sBAAsB,CAAC,CAAC;YAC5B,GAAG,CAAC,wDAAwD,CAAC,CAAC;YAC9D,OAAO;QACT,CAAC;QAED,kCAAkC;QAClC,MAAM,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IAC/B,CAAC;CACF"}
@@ -1,15 +0,0 @@
1
- import { TaskMigrationService } from "@ai-zen/agents-sdk";
2
- import type { ConversationContext } from "./types.js";
3
- /**
4
- * 创建 CLI 迁移服务实例(自动迁移与手动迁移共用同一个实例)。
5
- *
6
- * 迁移前后处理统一收敛于此:保存旧对话 / 开启新会话 / 落盘草稿。
7
- * 自动迁移由 AutoMigratePlugin 触发,手动迁移由 /migrate 命令触发,
8
- * 两者都委托给本服务实例的 migrate(),从而保证行为一致、避免重复实现。
9
- *
10
- * @param ctx 当前会话上下文(先建后回填 migrationService;钩子直接引用该对象)
11
- */
12
- export declare function createMigrationService(ctx: ConversationContext, options?: {
13
- log?: (text: string) => void;
14
- }): TaskMigrationService;
15
- //# sourceMappingURL=migration-service.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"migration-service.d.ts","sourceRoot":"","sources":["../src/migration-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAyB,MAAM,oBAAoB,CAAC;AAOjF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEtD;;;;;;;;GAQG;AACH,wBAAgB,sBAAsB,CACpC,GAAG,EAAE,mBAAmB,EACxB,OAAO,GAAE;IAAE,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;CAAO,GAC7C,oBAAoB,CAgDtB"}
@@ -1,59 +0,0 @@
1
- import { TaskMigrationService } from "@ai-zen/agents-sdk";
2
- import { saveConversation, conversationRepository, generateConversationId, } from "./conversation-repository.js";
3
- import { writeLastSession } from "./session-pointer.js";
4
- /**
5
- * 创建 CLI 迁移服务实例(自动迁移与手动迁移共用同一个实例)。
6
- *
7
- * 迁移前后处理统一收敛于此:保存旧对话 / 开启新会话 / 落盘草稿。
8
- * 自动迁移由 AutoMigratePlugin 触发,手动迁移由 /migrate 命令触发,
9
- * 两者都委托给本服务实例的 migrate(),从而保证行为一致、避免重复实现。
10
- *
11
- * @param ctx 当前会话上下文(先建后回填 migrationService;钩子直接引用该对象)
12
- */
13
- export function createMigrationService(ctx, options = {}) {
14
- // 进度/结果一律经 `log` 上报(TUI 走 Ink notice 块),不再直接 console.log 污染画面
15
- const log = options.log ?? (() => { });
16
- return new TaskMigrationService({
17
- // CLI 采用物理剔除模式:迁移后不保留历史消息,仅保留系统提示 + 交接断点。
18
- strategy: "prune",
19
- onBeforeMigrate: async (mctx) => {
20
- // 自动迁移由 AutoMigratePlugin 传入 promptTokens/maxTokens;手动迁移为 undefined。
21
- const isAuto = mctx.promptTokens != null && mctx.maxTokens != null;
22
- log(isAuto
23
- ? `📋 检测到上下文即将超限(${mctx.promptTokens}/${mctx.maxTokens} tokens),正在自动生成交接文档以延续对话…`
24
- : "📋 正在生成任务交接文档…");
25
- // 迁移前 agent.messages 仍是完整旧历史,先保存旧对话
26
- await saveConversation(ctx);
27
- log(`✅ 原对话已保存:${ctx.currentName}`);
28
- },
29
- onMigrated: async (mctx) => {
30
- // 迁移开启新会话:分配新的会话 id 与名称
31
- const id = generateConversationId();
32
- ctx.currentId = id;
33
- ctx.currentName = id;
34
- log(`🚀 任务迁移完成,已开启新会话(共 ${mctx.agent.messages.length} 条消息)`);
35
- log("💡 新助手已通过交接文档了解此前的工作,可继续提问。");
36
- // 迁移后立即把新开场白落盘为独立会话文件,并更新「上一轮会话 id」指针,
37
- // 避免迁移发生在 onAfterSend(ConversationPersistPlugin 的 onInnerLoopEnd
38
- // 已不再触发)导致迁移后的新对话未被及时落盘、用户中途退出时丢失。
39
- try {
40
- const existing = await conversationRepository.read(id);
41
- const now = new Date().toISOString();
42
- await conversationRepository.write({
43
- id,
44
- agentId: ctx.agentId || "default",
45
- modelId: ctx.modelId,
46
- messages: mctx.agent.messages,
47
- cwd: process.cwd(),
48
- createdAt: existing?.createdAt ?? now,
49
- updatedAt: now,
50
- });
51
- await writeLastSession(id);
52
- }
53
- catch (err) {
54
- log(`⚠️ 迁移后会话落盘失败:${err?.message ?? err}`);
55
- }
56
- },
57
- });
58
- }
59
- //# sourceMappingURL=migration-service.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"migration-service.js","sourceRoot":"","sources":["../src/migration-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAyB,MAAM,oBAAoB,CAAC;AACjF,OAAO,EACL,gBAAgB,EAChB,sBAAsB,EACtB,sBAAsB,GACvB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAGxD;;;;;;;;GAQG;AACH,MAAM,UAAU,sBAAsB,CACpC,GAAwB,EACxB,UAA4C,EAAE;IAE9C,8DAA8D;IAC9D,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IACtC,OAAO,IAAI,oBAAoB,CAAC;QAC9B,0CAA0C;QAC1C,QAAQ,EAAE,OAAO;QACjB,eAAe,EAAE,KAAK,EAAE,IAAsB,EAAE,EAAE;YAChD,qEAAqE;YACrE,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,IAAI,IAAI,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC;YACnE,GAAG,CACD,MAAM;gBACJ,CAAC,CAAC,iBAAiB,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,SAAS,2BAA2B;gBACjF,CAAC,CAAC,gBAAgB,CACrB,CAAC;YACF,oCAAoC;YACpC,MAAM,gBAAgB,CAAC,GAAG,CAAC,CAAC;YAC5B,GAAG,CAAC,YAAY,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC;QACrC,CAAC;QACD,UAAU,EAAE,KAAK,EAAE,IAAsB,EAAE,EAAE;YAC3C,wBAAwB;YACxB,MAAM,EAAE,GAAG,sBAAsB,EAAE,CAAC;YACpC,GAAG,CAAC,SAAS,GAAG,EAAE,CAAC;YACnB,GAAG,CAAC,WAAW,GAAG,EAAE,CAAC;YAErB,GAAG,CAAC,sBAAsB,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,OAAO,CAAC,CAAC;YAC7D,GAAG,CAAC,6BAA6B,CAAC,CAAC;YAEnC,uCAAuC;YACvC,iEAAiE;YACjE,mCAAmC;YACnC,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,MAAM,sBAAsB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACvD,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;gBACrC,MAAM,sBAAsB,CAAC,KAAK,CAAC;oBACjC,EAAE;oBACF,OAAO,EAAE,GAAG,CAAC,OAAO,IAAI,SAAS;oBACjC,OAAO,EAAE,GAAG,CAAC,OAAO;oBACpB,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ;oBAC7B,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;oBAClB,SAAS,EAAE,QAAQ,EAAE,SAAS,IAAI,GAAG;oBACrC,SAAS,EAAE,GAAG;iBACf,CAAC,CAAC;gBACH,MAAM,gBAAgB,CAAC,EAAE,CAAC,CAAC;YAC7B,CAAC;YAAC,OAAO,GAAQ,EAAE,CAAC;gBAClB,GAAG,CAAC,gBAAgB,GAAG,EAAE,OAAO,IAAI,GAAG,EAAE,CAAC,CAAC;YAC7C,CAAC;QACH,CAAC;KACF,CAAC,CAAC;AACL,CAAC"}
@@ -1,13 +0,0 @@
1
- import { ChatEvent } from "../chat-session.js";
2
- import { Block, LiveAssistant } from "./lines.js";
3
- export interface ChatState {
4
- blocks: Block[];
5
- live: LiveAssistant | null;
6
- }
7
- export type ChatAction = ChatEvent | {
8
- type: "clear";
9
- };
10
- export declare let blockSeq: number;
11
- export declare const nextId: () => number;
12
- export declare function chatReducer(state: ChatState, action: ChatAction): ChatState;
13
- //# sourceMappingURL=state.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../../src/tui/screens/state.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAIlD,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,IAAI,EAAE,aAAa,GAAG,IAAI,CAAC;CAC5B;AAED,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,CAAC;AAEvD,eAAO,IAAI,QAAQ,QAAI,CAAC;AACxB,eAAO,MAAM,MAAM,cAAmB,CAAC;AAEvC,wBAAgB,WAAW,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,GAAG,SAAS,CAmE3E"}
@@ -1,75 +0,0 @@
1
- export let blockSeq = 0;
2
- export const nextId = () => ++blockSeq;
3
- export function chatReducer(state, action) {
4
- switch (action.type) {
5
- case "clear":
6
- return { blocks: [], live: null };
7
- case "user":
8
- return {
9
- blocks: [...state.blocks, { id: nextId(), kind: "user", text: action.text }],
10
- live: { reasoning: "", content: "", tools: [], sub: null, roundBase: 0 },
11
- };
12
- case "assistant-start":
13
- // 每次 API 请求(含一轮内并行调用后的后续轮次)都会触发:把本轮工具调用的
14
- // 起始下标锚到当前已收集的工具数,使新一轮 index 从 0 起也落到新的一行。
15
- return {
16
- ...state,
17
- live: state.live
18
- ? { ...state.live, roundBase: state.live.tools.length }
19
- : { reasoning: "", content: "", tools: [], sub: null, roundBase: 0 },
20
- };
21
- case "reasoning":
22
- return state.live
23
- ? { ...state, live: { ...state.live, reasoning: state.live.reasoning + action.text } }
24
- : state;
25
- case "content":
26
- return state.live
27
- ? { ...state, live: { ...state.live, content: state.live.content + action.text } }
28
- : state;
29
- case "tool": {
30
- if (!state.live)
31
- return state;
32
- // 落到「本轮起始下标 + 本轮内 index」:同一轮内的分片按 index 归并(并行调用
33
- // 各占一行),跨轮的同 index 因 roundBase 不同而分段,不再相互拼接。
34
- const pos = (state.live.roundBase ?? 0) + Math.max(0, action.index ?? 0);
35
- const tools = [...state.live.tools];
36
- // 保持数组稠密(避免稀疏空位在渲染时被 for...of 迭代为 undefined)
37
- while (tools.length < pos)
38
- tools.push({ name: "", args: "" });
39
- const prev = tools[pos] ?? { name: "", args: "" };
40
- tools[pos] = {
41
- name: prev.name + (action.name ?? ""),
42
- args: prev.args + (action.args ?? ""),
43
- };
44
- return { ...state, live: { ...state.live, tools } };
45
- }
46
- case "subagent-start":
47
- return state.live ? { ...state, live: { ...state.live, sub: action.name } } : state;
48
- case "subagent-end":
49
- return state.live ? { ...state, live: { ...state.live, sub: null } } : state;
50
- case "notice":
51
- return {
52
- ...state,
53
- blocks: [...state.blocks, { id: nextId(), kind: "notice", tone: "info", text: action.text }],
54
- };
55
- case "error":
56
- return {
57
- ...state,
58
- blocks: [...state.blocks, { id: nextId(), kind: "notice", tone: "error", text: action.text }],
59
- };
60
- case "done": {
61
- if (!state.live)
62
- return state;
63
- const { reasoning, content, tools } = state.live;
64
- // 请求失败时 live 可能为空壳(无思考/内容/工具)——不产生空白的 AI 块
65
- const isEmpty = !reasoning.trim() && !content.trim() && !tools.some((t) => t.name);
66
- if (isEmpty)
67
- return { ...state, live: null };
68
- const finished = { id: nextId(), kind: "assistant", reasoning, content, tools };
69
- return { blocks: [...state.blocks, finished], live: null };
70
- }
71
- default:
72
- return state;
73
- }
74
- }
75
- //# sourceMappingURL=state.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"state.js","sourceRoot":"","sources":["../../../src/tui/screens/state.ts"],"names":[],"mappings":"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"}