@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
@@ -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(process.cwd(), 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,OAAO,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC;YAC5C,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,5 +0,0 @@
1
- export declare const TAGLINE = "\u7EC8\u7AEF\u91CC\u7684 AI \u534F\u4F5C\u53F0";
2
- export declare function Splash({ onDone }: {
3
- onDone?: () => void;
4
- }): import("react").JSX.Element;
5
- //# sourceMappingURL=splash.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"splash.d.ts","sourceRoot":"","sources":["../../../src/tui/screens/splash.tsx"],"names":[],"mappings":"AASA,eAAO,MAAM,OAAO,mDAAgB,CAAC;AAErC,wBAAgB,MAAM,CAAC,EAAE,MAAM,EAAE,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,IAAI,CAAA;CAAE,+BA4EzD"}
@@ -1,51 +0,0 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- // 由 src/tui/screens.tsx 拆分而来 —— 启动界面 Splash
3
- import { useEffect, useRef, useState } from "react";
4
- import { Box, Text, useApp, useInput, useWindowSize } from "ink";
5
- import { theme, pickLogo, logoGradientColors } from "../theme.js";
6
- import { Spinner } from "../components.js";
7
- import { CLI_VERSION, SDK_VERSION, CORE_VERSION } from "../../version.js";
8
- // ==================== Splash(启动界面)====================
9
- export const TAGLINE = "终端里的 AI 协作台";
10
- export function Splash({ onDone }) {
11
- const { exit } = useApp();
12
- const { columns, rows } = useWindowSize();
13
- const logo = pickLogo(columns ?? 80);
14
- const [revealed, setRevealed] = useState(0);
15
- const [phase, setPhase] = useState(0);
16
- const [ready, setReady] = useState(false);
17
- const doneRef = useRef(false);
18
- const finish = () => {
19
- if (doneRef.current)
20
- return;
21
- doneRef.current = true;
22
- onDone?.();
23
- exit("done");
24
- };
25
- useEffect(() => {
26
- const revealTimer = setInterval(() => setRevealed((r) => Math.min(r + 1, logo.length)), 55);
27
- const sweepTimer = setInterval(() => setPhase((p) => Math.min(p + 0.05, 1)), 35);
28
- return () => {
29
- clearInterval(revealTimer);
30
- clearInterval(sweepTimer);
31
- };
32
- }, [logo.length]);
33
- useEffect(() => {
34
- if (revealed >= logo.length && phase >= 1)
35
- setReady(true);
36
- }, [revealed, phase, logo.length]);
37
- useEffect(() => {
38
- if (!ready)
39
- return;
40
- const timer = setTimeout(finish, 1100);
41
- return () => clearTimeout(timer);
42
- // eslint-disable-next-line react-hooks/exhaustive-deps
43
- }, [ready]);
44
- useInput(() => finish());
45
- const totalRows = rows ?? 24;
46
- const padTop = Math.max(0, Math.floor((totalRows - (logo.length + 9)) / 2));
47
- const visibleLogo = logo.slice(0, revealed);
48
- const logoColors = logoGradientColors(visibleLogo, phase);
49
- return (_jsxs(Box, { flexDirection: "column", alignItems: "center", paddingTop: padTop, width: columns, children: [_jsx(Box, { flexDirection: "column", alignItems: "center", children: visibleLogo.map((line, i) => (_jsx(Text, { children: [...line].map((ch, x) => (_jsx(Text, { color: logoColors[i]?.[x], children: ch }, x))) }, i))) }), _jsx(Box, { marginTop: 1, children: _jsx(Text, { color: theme.accent, children: TAGLINE }) }), _jsx(Box, { marginTop: 1, children: _jsxs(Text, { color: theme.dim, children: ["v", CLI_VERSION, " \u00B7 sdk ", SDK_VERSION, " \u00B7 core ", CORE_VERSION] }) }), _jsx(Box, { marginTop: 2, flexDirection: "column", alignItems: "center", children: ready ? (_jsx(Text, { color: theme.faint, children: "\u6309\u4EFB\u610F\u952E\u5F00\u59CB\u2026" })) : (_jsx(Spinner, { label: "\u6B63\u5728\u51C6\u5907" })) })] }));
50
- }
51
- //# sourceMappingURL=splash.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"splash.js","sourceRoot":"","sources":["../../../src/tui/screens/splash.tsx"],"names":[],"mappings":"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"}