@ai-zen/cli 1.0.0-alpha.8 → 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 +1340 -269
  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 +751 -265
  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 -59
  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
@@ -0,0 +1,83 @@
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 declare const LIVE_WINDOW_MS = 2000;
17
+ /** 计算速率的最小时间跨度:太短会把「首包爆发」放大成离谱的高速率 */
18
+ export declare const MIN_SPAN_MS = 400;
19
+ /**
20
+ * 按字符估算 token 数(浮点,调用方决定何时取整)。
21
+ *
22
+ * 权重取值依据:中文/全角约 0.7 token 一个字(DeepSeek / GLM 系分词器实测区间
23
+ * 0.6~0.8),其余非空白字符约 0.25(≈4 字符一个 token),空白约 0.1(多半与前词
24
+ * 合并,但不为零)。这是**估算**,用于实时速率;精确值一律以 `usage` 为准。
25
+ */
26
+ export declare function estimateTokens(text: string): number;
27
+ /**
28
+ * 从流式 chunk 里取出「本次新增的输出文本」:正文 + 思考 + 工具参数。
29
+ *
30
+ * 三者都是模型实打实吐出来的 token,只统计正文会低估(尤其推理模型的思考段)。
31
+ */
32
+ export declare function deltaText(chunk: any): string;
33
+ /** 一次快照:生成中看 `live`,结束后看 `average` */
34
+ export interface RateSample {
35
+ /** 实时速率(token/秒,最近窗口估算);无数据时为 null */
36
+ live: number | null;
37
+ /** 本轮平均速率(token/秒,优先真实 usage);一轮未结束时为 null */
38
+ average: number | null;
39
+ /** 本轮是否仍在生成 */
40
+ running: boolean;
41
+ }
42
+ /** 无数据的快照(状态栏据此不显示速率段) */
43
+ export declare const IDLE_RATE: RateSample;
44
+ /**
45
+ * 速率统计器。
46
+ *
47
+ * 生命周期由调用方驱动:`begin()`(一轮开始)→ 若干个 `addDelta()` / `addExact()`
48
+ * → `finish()`(一轮结束)。时间一律可注入,便于单测不依赖真实时钟。
49
+ */
50
+ export declare class TokenRateMeter {
51
+ private samples;
52
+ /** 估算的累计输出 token */
53
+ private estimated;
54
+ /** 真实 `completion_tokens` 累加(多轮工具调用逐轮相加) */
55
+ private exact;
56
+ private startedAt;
57
+ private firstOutputAt;
58
+ private lastOutputAt;
59
+ private finished;
60
+ private averageValue;
61
+ /** 一轮开始:清空上一轮的所有状态 */
62
+ begin(now?: number): void;
63
+ /** 收到一段增量文本:累加估算 token 并打点 */
64
+ addDelta(text: string, now?: number): void;
65
+ /** 收到真实用量(流末 chunk 的 `usage.completion_tokens`),多轮累加 */
66
+ addExact(completionTokens: number | undefined | null): void;
67
+ /**
68
+ * 一轮结束:算本轮平均速率。
69
+ *
70
+ * 分子优先用真实 `completion_tokens`;分母是「首字 → 末字」的跨度,即真正在接收
71
+ * 内容的那段时间 —— 不含开头的排队等首字,也避免把整轮的思考停顿算成慢。
72
+ */
73
+ finish(now?: number): void;
74
+ /** 当前快照(供状态栏直接渲染) */
75
+ snapshot(now?: number): RateSample;
76
+ /** 清空(退出 / 重建会话时调用) */
77
+ reset(): void;
78
+ /** 最近窗口的估算速率;窗口内没动静时返回 0(停顿本来就该显示 0,而不是上一秒的高值) */
79
+ private liveRate;
80
+ /** 丢掉窗口外的采样(保留一个窗口起点之前的锚点,用于算基准值) */
81
+ private trim;
82
+ }
83
+ //# sourceMappingURL=token-rate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-rate.d.ts","sourceRoot":"","sources":["../../src/tui/token-rate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,+BAA+B;AAC/B,eAAO,MAAM,cAAc,OAAO,CAAC;AAEnC,sCAAsC;AACtC,eAAO,MAAM,WAAW,MAAM,CAAC;AAK/B;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAQnD;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,GAAG,GAAG,MAAM,CAqB5C;AAED,sCAAsC;AACtC,MAAM,WAAW,UAAU;IACzB,sCAAsC;IACtC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,8CAA8C;IAC9C,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,eAAe;IACf,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,0BAA0B;AAC1B,eAAO,MAAM,SAAS,EAAE,UAA0D,CAAC;AASnF;;;;;GAKG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,OAAO,CAAgB;IAC/B,oBAAoB;IACpB,OAAO,CAAC,SAAS,CAAK;IACtB,4CAA4C;IAC5C,OAAO,CAAC,KAAK,CAAK;IAClB,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,aAAa,CAAuB;IAC5C,OAAO,CAAC,YAAY,CAAuB;IAC3C,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,YAAY,CAAuB;IAE3C,sBAAsB;IACtB,KAAK,CAAC,GAAG,GAAE,MAAmB,GAAG,IAAI,CASpC;IAED,8BAA8B;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,GAAE,MAAmB,GAAG,IAAI,CASrD;IAED,wDAAwD;IACxD,QAAQ,CAAC,gBAAgB,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,IAAI,CAI1D;IAED;;;;;OAKG;IACH,MAAM,CAAC,GAAG,GAAE,MAAmB,GAAG,IAAI,CAWrC;IAED,qBAAqB;IACrB,QAAQ,CAAC,GAAG,GAAE,MAAmB,GAAG,UAAU,CAI7C;IAED,uBAAuB;IACvB,KAAK,IAAI,IAAI,CASZ;IAED,kDAAkD;IAClD,OAAO,CAAC,QAAQ;IAkBhB,qCAAqC;IACrC,OAAO,CAAC,IAAI;CASb"}
@@ -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"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * 「用户输入 + 粘贴的图片」→ 发给 core 的消息内容(`MessageContent`)。
3
+ *
4
+ * ## 为什么单独一个文件
5
+ *
6
+ * 这里是 `Ctrl+V` 粘贴图片链路的**唯一决策点**:几张图、走 Files API 还是内联、
7
+ * 模型不支持视觉时怎么办、转换失败要不要放弃 —— 全是纯逻辑(IO 由 SDK 的
8
+ * `fileToContentSection()` 负责,且可注入),因此可以脱离终端与网络单测。
9
+ *
10
+ * ## 三态输出,绝不「假成功」
11
+ *
12
+ * · 一张图都没转成功 → **退回纯文本**(用户至少把话说出去了,不会静默丢消息);
13
+ * · 部分成功 → 发成功的那几张,失败原因进 `warnings`;
14
+ * · 传输降级(上传失败转内联、模型不支持视觉转文本提示)→ 照发,SDK 的
15
+ * `warning` 透传给通知栏。
16
+ *
17
+ * 文本段永远排在**第一个**:`formatHistory()` 原样把内容块发给 API,而多数端点
18
+ * 对「图在文前」的处理是把提示词放到图片之后,指令容易被图片切断。
19
+ */
20
+ import type { AgentNS } from "@ai-zen/agents-core";
21
+ import { fileToContentSection } from "@ai-zen/agents-sdk";
22
+ import type { AppConfig } from "@ai-zen/agents-sdk";
23
+ import type { ClipboardImage } from "./clipboard.js";
24
+ export interface BuildUserContentInput {
25
+ text: string;
26
+ images?: readonly ClipboardImage[];
27
+ /** 当前配置(用于按模型反查端点与视觉能力) */
28
+ config: AppConfig;
29
+ /** 发给 API 的模型名(core 的 `agent.model`)——`file_id` 是端点维度资源,必须按实发模型定位 */
30
+ apiModelName?: string;
31
+ /** 依赖注入(测试用);默认走 SDK 的统一转换入口 */
32
+ convert?: typeof fileToContentSection;
33
+ }
34
+ export interface BuildUserContentResult {
35
+ content: AgentNS.MessageContent;
36
+ /** 降级 / 失败说明(供通知栏),无问题时为空数组 */
37
+ warnings: string[];
38
+ }
39
+ /** 粘贴的图片 → 内容块;失败的那张跳过并记一条说明 */
40
+ export declare function buildUserContent(input: BuildUserContentInput): Promise<BuildUserContentResult>;
41
+ //# sourceMappingURL=user-content.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user-content.d.ts","sourceRoot":"","sources":["../src/user-content.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,oBAAoB,EAA2B,MAAM,oBAAoB,CAAC;AACnF,OAAO,KAAK,EAAE,SAAS,EAAc,MAAM,oBAAoB,CAAC;AAChE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAErD,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,SAAS,cAAc,EAAE,CAAC;IACnC,2BAA2B;IAC3B,MAAM,EAAE,SAAS,CAAC;IAClB,qEAAqE;IACrE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gCAAgC;IAChC,OAAO,CAAC,EAAE,OAAO,oBAAoB,CAAC;CACvC;AAED,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,OAAO,CAAC,cAAc,CAAC;IAChC,+BAA+B;IAC/B,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAQD,gCAAgC;AAChC,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,qBAAqB,GAAG,OAAO,CAAC,sBAAsB,CAAC,CA2BpG"}
@@ -0,0 +1,37 @@
1
+ import { fileToContentSection, resolveModelAndEndpoint } from "@ai-zen/agents-sdk";
2
+ /** `image/png` → `png`(文件名后缀,部分端点按扩展名判类型) */
3
+ function extOf(mime) {
4
+ const slash = mime.indexOf("/");
5
+ return slash < 0 ? "png" : mime.slice(slash + 1);
6
+ }
7
+ /** 粘贴的图片 → 内容块;失败的那张跳过并记一条说明 */
8
+ export async function buildUserContent(input) {
9
+ const images = input.images ?? [];
10
+ if (images.length === 0)
11
+ return { content: input.text, warnings: [] };
12
+ const convert = input.convert ?? fileToContentSection;
13
+ const { model, endpoint } = resolveModelAndEndpoint(input.config, input.apiModelName);
14
+ const sections = [];
15
+ const warnings = [];
16
+ for (const [index, image] of images.entries()) {
17
+ const source = {
18
+ base64: image.base64,
19
+ mime: image.mime,
20
+ filename: `pasted-${index + 1}.${extOf(image.mime)}`,
21
+ };
22
+ try {
23
+ const result = await convert({ source, endpoint, model });
24
+ sections.push(result.section);
25
+ if (result.warning)
26
+ warnings.push(result.warning);
27
+ }
28
+ catch (error) {
29
+ // 单张失败不影响其他张:体积超内联上限、端点拒绝上传等都在这里收敛
30
+ warnings.push(error?.message ? String(error.message) : String(error));
31
+ }
32
+ }
33
+ if (sections.length === 0)
34
+ return { content: input.text, warnings };
35
+ return { content: [{ type: "text", text: input.text }, ...sections], warnings };
36
+ }
37
+ //# sourceMappingURL=user-content.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user-content.js","sourceRoot":"","sources":["../src/user-content.ts"],"names":[],"mappings":"AAoBA,OAAO,EAAE,oBAAoB,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAqBnF,6CAA6C;AAC7C,SAAS,KAAK,CAAC,IAAY;IACzB,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAChC,OAAO,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;AACnD,CAAC;AAED,gCAAgC;AAChC,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,KAA4B;IACjE,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,EAAE,CAAC;IAClC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;IAEtE,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,IAAI,oBAAoB,CAAC;IACtD,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,uBAAuB,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC;IAEtF,MAAM,QAAQ,GAAoC,EAAE,CAAC;IACrD,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,KAAK,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC;QAC9C,MAAM,MAAM,GAAe;YACzB,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,QAAQ,EAAE,UAAU,KAAK,GAAG,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE;SACrD,CAAC;QACF,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;YAC1D,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAC9B,IAAI,MAAM,CAAC,OAAO;gBAAE,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACpD,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,mCAAmC;YACnC,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QACxE,CAAC;IACH,CAAC;IAED,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,IAAI,EAAE,QAAQ,EAAE,CAAC;IACpE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,EAAE,GAAG,QAAQ,CAAC,EAAE,QAAQ,EAAE,CAAC;AAClF,CAAC"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * 版本号比较 —— 只回答「谁更新」这一个问题。
3
+ *
4
+ * 语义照 semver 2.0 的比较规则(`X.Y.Z[-pre][+build]`):
5
+ * - 核心段按数字比,缺省补 0;
6
+ * - **有预发布标识的更小**(`1.0.0-alpha.23 < 1.0.0`);
7
+ * - 预发布标识逐个比:纯数字比数值、数字**小于**非数字、非数字按 ASCII 比;
8
+ * 前缀全相同则标识少的更小(`1.0.0-alpha < 1.0.0-alpha.1`);
9
+ * - 构建元数据(`+xxx`)不参与比较。
10
+ *
11
+ * 为什么不引 `semver` 包:CLI 只在这一处比版本号(`/update` 从 registry 的多个
12
+ * dist-tag 里挑最新的那个),为它多挂一份依赖不划算;而这段规则稳定、可穷举测试。
13
+ *
14
+ * 无法解析的版本号一律返回 `null`(调用方跳过),绝不抛错——版本号来自网络,
15
+ * 不该因为 registry 上有个畸形 tag 就让命令崩掉。
16
+ */
17
+ export interface ParsedVersion {
18
+ /** 核心段(数字数组,通常是 3 段) */
19
+ core: number[];
20
+ /** 预发布标识(`alpha.23` → `["alpha", "23"]`);无预发布为空数组 */
21
+ pre: string[];
22
+ }
23
+ /** 解析版本号;畸形返回 `null` */
24
+ export declare function parseVersion(version: string): ParsedVersion | null;
25
+ /**
26
+ * 比较两个版本号:`a` 更新返回正数、`b` 更新返回负数、相同返回 0。
27
+ * 任一方无法解析时返回 `null`。
28
+ */
29
+ export declare function compareVersions(a: string, b: string): number | null;
30
+ /**
31
+ * 从一组版本号里挑最新的(忽略无法解析的条目);全都不合法时返回 `undefined`。
32
+ *
33
+ * `/update` 用它把 registry 上**所有** dist-tag 折叠成一个目标版本:只认 `latest`
34
+ * 会漏掉「alpha 比正式版更新」的实际发布状态,只认 `alpha` 又会在正式版追上后装旧版。
35
+ */
36
+ export declare function pickNewest(versions: Iterable<string>): string | undefined;
37
+ //# sourceMappingURL=version-compare.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version-compare.d.ts","sourceRoot":"","sources":["../src/version-compare.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,MAAM,WAAW,aAAa;IAC5B,wBAAwB;IACxB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,qDAAqD;IACrD,GAAG,EAAE,MAAM,EAAE,CAAC;CACf;AAID,wBAAwB;AACxB,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAgBlE;AAaD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CA2BnE;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,MAAM,GAAG,SAAS,CAOzE"}
@@ -0,0 +1,105 @@
1
+ /**
2
+ * 版本号比较 —— 只回答「谁更新」这一个问题。
3
+ *
4
+ * 语义照 semver 2.0 的比较规则(`X.Y.Z[-pre][+build]`):
5
+ * - 核心段按数字比,缺省补 0;
6
+ * - **有预发布标识的更小**(`1.0.0-alpha.23 < 1.0.0`);
7
+ * - 预发布标识逐个比:纯数字比数值、数字**小于**非数字、非数字按 ASCII 比;
8
+ * 前缀全相同则标识少的更小(`1.0.0-alpha < 1.0.0-alpha.1`);
9
+ * - 构建元数据(`+xxx`)不参与比较。
10
+ *
11
+ * 为什么不引 `semver` 包:CLI 只在这一处比版本号(`/update` 从 registry 的多个
12
+ * dist-tag 里挑最新的那个),为它多挂一份依赖不划算;而这段规则稳定、可穷举测试。
13
+ *
14
+ * 无法解析的版本号一律返回 `null`(调用方跳过),绝不抛错——版本号来自网络,
15
+ * 不该因为 registry 上有个畸形 tag 就让命令崩掉。
16
+ */
17
+ const NUMERIC = /^\d+$/;
18
+ /** 解析版本号;畸形返回 `null` */
19
+ export function parseVersion(version) {
20
+ if (typeof version !== "string")
21
+ return null;
22
+ // 容忍 `v1.2.3` 写法与首尾空白
23
+ const trimmed = version.trim().replace(/^v/i, "");
24
+ if (!trimmed)
25
+ return null;
26
+ // 构建元数据不参与比较
27
+ const plus = trimmed.indexOf("+");
28
+ const noBuild = plus >= 0 ? trimmed.slice(0, plus) : trimmed;
29
+ // 预发布段从**第一个** `-` 开始(`1.0.0-alpha-beta` 的预发布标识是 `alpha-beta`)
30
+ const dash = noBuild.indexOf("-");
31
+ const coreText = dash >= 0 ? noBuild.slice(0, dash) : noBuild;
32
+ const preText = dash >= 0 ? noBuild.slice(dash + 1) : "";
33
+ const parts = coreText.split(".");
34
+ if (!parts.every((part) => NUMERIC.test(part)))
35
+ return null;
36
+ return { core: parts.map(Number), pre: preText ? preText.split(".") : [] };
37
+ }
38
+ /** 单个预发布标识比较:数字按数值,数字 < 非数字,非数字按 ASCII */
39
+ function compareIdentifier(a, b) {
40
+ const aNumeric = NUMERIC.test(a);
41
+ const bNumeric = NUMERIC.test(b);
42
+ if (aNumeric && bNumeric)
43
+ return Number(a) - Number(b);
44
+ if (aNumeric)
45
+ return -1;
46
+ if (bNumeric)
47
+ return 1;
48
+ if (a === b)
49
+ return 0;
50
+ return a < b ? -1 : 1;
51
+ }
52
+ /**
53
+ * 比较两个版本号:`a` 更新返回正数、`b` 更新返回负数、相同返回 0。
54
+ * 任一方无法解析时返回 `null`。
55
+ */
56
+ export function compareVersions(a, b) {
57
+ const pa = parseVersion(a);
58
+ const pb = parseVersion(b);
59
+ if (!pa || !pb)
60
+ return null;
61
+ const coreLength = Math.max(pa.core.length, pb.core.length);
62
+ for (let i = 0; i < coreLength; i += 1) {
63
+ const diff = (pa.core[i] ?? 0) - (pb.core[i] ?? 0);
64
+ if (diff !== 0)
65
+ return diff > 0 ? 1 : -1;
66
+ }
67
+ // 核心段相同:有预发布标识的更小(1.0.0-alpha < 1.0.0)
68
+ if (pa.pre.length === 0 && pb.pre.length === 0)
69
+ return 0;
70
+ if (pa.pre.length === 0)
71
+ return 1;
72
+ if (pb.pre.length === 0)
73
+ return -1;
74
+ const preLength = Math.max(pa.pre.length, pb.pre.length);
75
+ for (let i = 0; i < preLength; i += 1) {
76
+ const left = pa.pre[i];
77
+ const right = pb.pre[i];
78
+ // 前缀相同 → 标识少的更小(1.0.0-alpha < 1.0.0-alpha.1)
79
+ if (left === undefined)
80
+ return -1;
81
+ if (right === undefined)
82
+ return 1;
83
+ const diff = compareIdentifier(left, right);
84
+ if (diff !== 0)
85
+ return diff > 0 ? 1 : -1;
86
+ }
87
+ return 0;
88
+ }
89
+ /**
90
+ * 从一组版本号里挑最新的(忽略无法解析的条目);全都不合法时返回 `undefined`。
91
+ *
92
+ * `/update` 用它把 registry 上**所有** dist-tag 折叠成一个目标版本:只认 `latest`
93
+ * 会漏掉「alpha 比正式版更新」的实际发布状态,只认 `alpha` 又会在正式版追上后装旧版。
94
+ */
95
+ export function pickNewest(versions) {
96
+ let newest;
97
+ for (const version of versions) {
98
+ if (!parseVersion(version))
99
+ continue;
100
+ if (newest === undefined || (compareVersions(version, newest) ?? 0) > 0)
101
+ newest = version;
102
+ }
103
+ return newest;
104
+ }
105
+ //# sourceMappingURL=version-compare.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version-compare.js","sourceRoot":"","sources":["../src/version-compare.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AAEvC,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAM/C,mCAAmC;AACnC,SAAS,cAAc,CAAC,IAAY;IAClC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAY,CAAC;QACrC,OAAO,GAAG,CAAC,OAAO,IAAI,SAAS,CAAC;IAClC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,mCAAmC;AACnC,MAAM,CAAC,MAAM,WAAW,GAAG,cAAc,CAAC,iBAAiB,CAAC,CAAC;AAE7D,gCAAgC;AAChC,MAAM,CAAC,MAAM,WAAW,GAAG,cAAc,CAAC,iCAAiC,CAAC,CAAC;AAE7E,iCAAiC;AACjC,MAAM,CAAC,MAAM,YAAY,GAAG,cAAc,CAAC,kCAAkC,CAAC,CAAC;AAQ/E,MAAM,UAAU,WAAW;IACzB,OAAO,EAAE,GAAG,EAAE,WAAW,EAAE,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;AACpE,CAAC"}
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AAEvC,MAAM,OAAO,GAAG,aAAa,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC;AAM/C,mCAAmC;AACnC,SAAS,cAAc,CAAC,IAAY;IAClC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAY,CAAC;QACrC,OAAO,GAAG,CAAC,OAAO,IAAI,SAAS,CAAC;IAClC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,mCAAmC;AACnC,MAAM,CAAC,MAAM,WAAW,GAAG,cAAc,CAAC,iBAAiB,CAAC,CAAC;AAE7D,gCAAgC;AAChC,MAAM,CAAC,MAAM,WAAW,GAAG,cAAc,CAAC,iCAAiC,CAAC,CAAC;AAE7E,iCAAiC;AACjC,MAAM,CAAC,MAAM,YAAY,GAAG,cAAc,CAAC,kCAAkC,CAAC,CAAC;AAQ/E,MAAM,UAAU,WAAW;IACzB,OAAO,EAAE,GAAG,EAAE,WAAW,EAAE,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;AACpE,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ai-zen/cli",
3
- "version": "1.0.0-alpha.8",
3
+ "version": "1.0.0",
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.5.1",
25
- "@ai-zen/agents-sdk": "1.0.0-alpha.9",
24
+ "@ai-zen/agents-core": "^4.5.4",
25
+ "@ai-zen/agents-sdk": "1.0.0",
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": {
@@ -38,8 +39,9 @@
38
39
  "dotenv": "^17.4.2",
39
40
  "ink-testing-library": "^4.0.0",
40
41
  "rimraf": "^6.0.0",
41
- "typescript": "^5.3.3",
42
- "vitest": "^4.1.9"
42
+ "typescript": "^7.0.2",
43
+ "vite": "^8.3.5",
44
+ "vitest": "^5.1.0"
43
45
  },
44
46
  "files": [
45
47
  "dist",