@ai-zen/cli 1.0.0-alpha.3 → 1.0.0-alpha.30

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 (338) hide show
  1. package/CHANGELOG.md +885 -0
  2. package/LICENSE +21 -0
  3. package/README.md +135 -30
  4. package/README.zh.md +135 -30
  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 +89 -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 +247 -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 +251 -0
  82. package/dist/i18n/zh.js.map +1 -0
  83. package/dist/index.js +72 -25
  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 +177 -57
  124. package/dist/tui/chat-session.d.ts.map +1 -1
  125. package/dist/tui/chat-session.js +362 -126
  126. package/dist/tui/chat-session.js.map +1 -1
  127. package/dist/tui/components.d.ts +113 -7
  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 +18 -1
  193. package/dist/tui/index.d.ts.map +1 -1
  194. package/dist/tui/index.js +107 -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 +82 -3
  221. package/dist/tui/screens/chat-commands.d.ts.map +1 -1
  222. package/dist/tui/screens/chat-commands.js +688 -160
  223. package/dist/tui/screens/chat-commands.js.map +1 -1
  224. package/dist/tui/screens/chat.d.ts +57 -5
  225. package/dist/tui/screens/chat.d.ts.map +1 -1
  226. package/dist/tui/screens/chat.js +799 -304
  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 +47 -0
  233. package/dist/tui/screens/frame-buffer.d.ts.map +1 -0
  234. package/dist/tui/screens/frame-buffer.js +78 -0
  235. package/dist/tui/screens/frame-buffer.js.map +1 -0
  236. package/dist/tui/screens/handoff-choice.d.ts +37 -0
  237. package/dist/tui/screens/handoff-choice.d.ts.map +1 -0
  238. package/dist/tui/screens/handoff-choice.js +42 -0
  239. package/dist/tui/screens/handoff-choice.js.map +1 -0
  240. package/dist/tui/screens/index.d.ts +11 -9
  241. package/dist/tui/screens/index.d.ts.map +1 -1
  242. package/dist/tui/screens/index.js +9 -8
  243. package/dist/tui/screens/index.js.map +1 -1
  244. package/dist/tui/screens/input-row.d.ts +64 -0
  245. package/dist/tui/screens/input-row.d.ts.map +1 -0
  246. package/dist/tui/screens/input-row.js +67 -0
  247. package/dist/tui/screens/input-row.js.map +1 -0
  248. package/dist/tui/screens/input.d.ts +77 -1
  249. package/dist/tui/screens/input.d.ts.map +1 -1
  250. package/dist/tui/screens/input.js +125 -8
  251. package/dist/tui/screens/input.js.map +1 -1
  252. package/dist/tui/screens/layout.d.ts +42 -3
  253. package/dist/tui/screens/layout.d.ts.map +1 -1
  254. package/dist/tui/screens/layout.js +43 -13
  255. package/dist/tui/screens/layout.js.map +1 -1
  256. package/dist/tui/screens/lines.d.ts +6 -36
  257. package/dist/tui/screens/lines.d.ts.map +1 -1
  258. package/dist/tui/screens/lines.js +8 -71
  259. package/dist/tui/screens/lines.js.map +1 -1
  260. package/dist/tui/screens/messages-view.d.ts +29 -0
  261. package/dist/tui/screens/messages-view.d.ts.map +1 -0
  262. package/dist/tui/screens/messages-view.js +162 -0
  263. package/dist/tui/screens/messages-view.js.map +1 -0
  264. package/dist/tui/screens/notice-bar.d.ts +5 -0
  265. package/dist/tui/screens/notice-bar.d.ts.map +1 -0
  266. package/dist/tui/screens/notice-bar.js +21 -0
  267. package/dist/tui/screens/notice-bar.js.map +1 -0
  268. package/dist/tui/screens/notice.d.ts +66 -0
  269. package/dist/tui/screens/notice.d.ts.map +1 -0
  270. package/dist/tui/screens/notice.js +106 -0
  271. package/dist/tui/screens/notice.js.map +1 -0
  272. package/dist/tui/screens/overlays.d.ts.map +1 -1
  273. package/dist/tui/screens/overlays.js +4 -3
  274. package/dist/tui/screens/overlays.js.map +1 -1
  275. package/dist/tui/screens/render.d.ts +2 -4
  276. package/dist/tui/screens/render.d.ts.map +1 -1
  277. package/dist/tui/screens/render.js +19 -50
  278. package/dist/tui/screens/render.js.map +1 -1
  279. package/dist/tui/screens/splash.d.ts +1 -1
  280. package/dist/tui/screens/splash.d.ts.map +1 -1
  281. package/dist/tui/screens/splash.js +12 -3
  282. package/dist/tui/screens/splash.js.map +1 -1
  283. package/dist/tui/screens/use-chat-viewport.d.ts +22 -0
  284. package/dist/tui/screens/use-chat-viewport.d.ts.map +1 -0
  285. package/dist/tui/screens/use-chat-viewport.js +50 -0
  286. package/dist/tui/screens/use-chat-viewport.js.map +1 -0
  287. package/dist/tui/screens/use-input-editing.d.ts +69 -0
  288. package/dist/tui/screens/use-input-editing.d.ts.map +1 -0
  289. package/dist/tui/screens/use-input-editing.js +220 -0
  290. package/dist/tui/screens/use-input-editing.js.map +1 -0
  291. package/dist/tui/screens/use-overlays.d.ts +25 -0
  292. package/dist/tui/screens/use-overlays.d.ts.map +1 -0
  293. package/dist/tui/screens/use-overlays.js +32 -0
  294. package/dist/tui/screens/use-overlays.js.map +1 -0
  295. package/dist/tui/screens/use-wizard-host.d.ts +46 -0
  296. package/dist/tui/screens/use-wizard-host.d.ts.map +1 -0
  297. package/dist/tui/screens/use-wizard-host.js +123 -0
  298. package/dist/tui/screens/use-wizard-host.js.map +1 -0
  299. package/dist/tui/status-segments.d.ts +37 -0
  300. package/dist/tui/status-segments.d.ts.map +1 -0
  301. package/dist/tui/status-segments.js +166 -0
  302. package/dist/tui/status-segments.js.map +1 -0
  303. package/dist/tui/text.d.ts +27 -7
  304. package/dist/tui/text.d.ts.map +1 -1
  305. package/dist/tui/text.js +116 -38
  306. package/dist/tui/text.js.map +1 -1
  307. package/dist/tui/theme.d.ts +2 -0
  308. package/dist/tui/theme.d.ts.map +1 -1
  309. package/dist/tui/theme.js +2 -0
  310. package/dist/tui/theme.js.map +1 -1
  311. package/dist/tui/token-rate.d.ts +83 -0
  312. package/dist/tui/token-rate.d.ts.map +1 -0
  313. package/dist/tui/token-rate.js +195 -0
  314. package/dist/tui/token-rate.js.map +1 -0
  315. package/dist/types.d.ts +7 -8
  316. package/dist/types.d.ts.map +1 -1
  317. package/dist/user-content.d.ts +41 -0
  318. package/dist/user-content.d.ts.map +1 -0
  319. package/dist/user-content.js +37 -0
  320. package/dist/user-content.js.map +1 -0
  321. package/dist/version-compare.d.ts +37 -0
  322. package/dist/version-compare.d.ts.map +1 -0
  323. package/dist/version-compare.js +105 -0
  324. package/dist/version-compare.js.map +1 -0
  325. package/dist/version.js.map +1 -1
  326. package/package.json +5 -4
  327. package/dist/auto-migrate-confirm-plugin.d.ts +0 -58
  328. package/dist/auto-migrate-confirm-plugin.d.ts.map +0 -1
  329. package/dist/auto-migrate-confirm-plugin.js +0 -61
  330. package/dist/auto-migrate-confirm-plugin.js.map +0 -1
  331. package/dist/migration-service.d.ts +0 -15
  332. package/dist/migration-service.d.ts.map +0 -1
  333. package/dist/migration-service.js +0 -59
  334. package/dist/migration-service.js.map +0 -1
  335. package/dist/tui/screens/state.d.ts +0 -30
  336. package/dist/tui/screens/state.d.ts.map +0 -1
  337. package/dist/tui/screens/state.js +0 -100
  338. package/dist/tui/screens/state.js.map +0 -1
@@ -1,13 +1,22 @@
1
1
  /**
2
2
  * 统一时间格式化工具
3
3
  *
4
- * 所有用户可见的时间文案统一使用 dayjs + zh-cn locale,
5
- * 确保各种场景(会话列表、会话标签等)显示一致。
4
+ * 所有用户可见的时间文案统一走本模块,格式随界面语言变化:
5
+ * - 中文:`7月1日 14:30`、`昨天 14:30`
6
+ * - 英文:`Jul 1, 14:30`、`Yesterday 14:30`
7
+ *
8
+ * 语言从 `i18n` 现取(不同模块级常量),因此 `/lang` 切完下一帧就生效。
9
+ * 例外:`formatFileStamp()` 用于**文件名 / 会话 id**,不随语言变(否则新旧文件混排)。
6
10
  */
7
11
  import dayjs from "dayjs";
8
12
  import "dayjs/locale/zh-cn.js";
9
- // 全局设置中文 locale
13
+ import { getLocale, t } from "./i18n/index.js";
14
+ // dayjs 自身的全局默认(仅兜底;实际格式化按当前界面语言逐次指定)
10
15
  dayjs.locale("zh-cn");
16
+ /** 当前界面语言对应的 dayjs locale 名 */
17
+ function dayjsLocale() {
18
+ return getLocale() === "zh" ? "zh-cn" : "en";
19
+ }
11
20
  /**
12
21
  * 格式化时间戳为"相对时间"(用于列表展示)
13
22
  *
@@ -18,39 +27,48 @@ dayjs.locale("zh-cn");
18
27
  * - 更早: YYYY年M月D日 HH:mm
19
28
  */
20
29
  export function formatRelativeTime(isoString) {
21
- const d = dayjs(isoString);
30
+ const d = dayjs(isoString).locale(dayjsLocale());
22
31
  const now = dayjs();
23
32
  if (d.isSame(now, "day")) {
24
33
  return d.format("HH:mm");
25
34
  }
26
35
  if (d.isSame(now.subtract(1, "day"), "day")) {
27
- return `昨天 ${d.format("HH:mm")}`;
36
+ return t("time.yesterday", { time: d.format("HH:mm") });
28
37
  }
29
38
  if (d.isSame(now, "year")) {
30
- return d.format("M月D日 HH:mm");
39
+ return d.format(t("time.pattern.thisYear"));
31
40
  }
32
- return d.format("YYYY年M月D日 HH:mm");
41
+ return d.format(t("time.pattern.older"));
33
42
  }
34
43
  /**
35
- * 格式化时间戳为完整中文格式(用于详情展示)
36
- * 例:2025年7月1日 14:30:00
44
+ * 格式化时间戳为完整格式(用于详情展示)
45
+ * 例(中):2025年7月1日 14:30:00 (英):Jul 1, 2025 14:30:00
37
46
  */
38
47
  export function formatFullTime(isoString) {
39
- return dayjs(isoString).format("YYYY年M月D日 HH:mm:ss");
48
+ return dayjs(isoString).locale(dayjsLocale()).format(t("time.pattern.full"));
49
+ }
50
+ /**
51
+ * 文件名安全的时间戳:全下划线、纯数字,用作会话 id。
52
+ * 例:2026_10_28_00_56_34
53
+ *
54
+ * **刻意不随界面语言变**:它进了文件名与会话 id,跟着语言变会让历史文件与新文件混排。
55
+ */
56
+ export function formatFileStamp(isoString) {
57
+ return dayjs(isoString).format("YYYY_MM_DD_HH_mm_ss");
40
58
  }
41
59
  /**
42
- * 格式化时间戳为保存名称用的格式,兼容文件名
43
- * 例:2025年07月01日_14时30分00秒
60
+ * 紧凑时间戳(列表/详情提示显示用),随界面语言变:
61
+ * 中文 `2025年07月01日15时30分00秒`,英文 `Jul 1, 2025 15:30:00`。
44
62
  */
45
63
  export function formatShortTime(isoString) {
46
- return dayjs(isoString).format("YYYY年MM月DD日HH时mm分ss秒");
64
+ return dayjs(isoString).locale(dayjsLocale()).format(t("time.pattern.short"));
47
65
  }
48
66
  /**
49
67
  * 格式化消息数量+时间(用于会话标签;当前暂无调用点,保留供 P1 主菜单复用)
50
68
  * 例:12 条消息, 今天 14:30
51
69
  */
52
70
  export function formatMessageTime(messageCount, isoString) {
53
- return `${messageCount} 条消息, ${formatRelativeTime(isoString)}`;
71
+ return t("time.messageCount", { n: messageCount, time: formatRelativeTime(isoString) });
54
72
  }
55
73
  /**
56
74
  * 格式化文件大小为人类可读格式
@@ -1 +1 @@
1
- {"version":3,"file":"format-time.js","sourceRoot":"","sources":["../src/format-time.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,uBAAuB,CAAC;AAE/B,gBAAgB;AAChB,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AAEtB;;;;;;;;GAQG;AACH,MAAM,UAAU,kBAAkB,CAAC,SAAiB;IAClD,MAAM,CAAC,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC;IAC3B,MAAM,GAAG,GAAG,KAAK,EAAE,CAAC;IAEpB,IAAI,CAAC,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC3B,CAAC;IACD,IAAI,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC;QAC5C,OAAO,MAAM,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;IACnC,CAAC;IACD,IAAI,CAAC,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,CAAC;QAC1B,OAAO,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;IAChC,CAAC;IACD,OAAO,CAAC,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;AACrC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,SAAiB;IAC9C,OAAO,KAAK,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;AACvD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,SAAiB;IAC/C,OAAO,KAAK,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,sBAAsB,CAAC,CAAC;AACzD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,YAAoB,EAAE,SAAiB;IACvE,OAAO,GAAG,YAAY,SAAS,kBAAkB,CAAC,SAAS,CAAC,EAAE,CAAC;AACjE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,KAAa;IAC1C,IAAI,KAAK,GAAG,IAAI;QAAE,OAAO,GAAG,KAAK,IAAI,CAAC;IACtC,IAAI,KAAK,GAAG,IAAI,GAAG,IAAI;QAAE,OAAO,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;IAClE,OAAO,GAAG,CAAC,KAAK,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;AACpD,CAAC"}
1
+ {"version":3,"file":"format-time.js","sourceRoot":"","sources":["../src/format-time.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,uBAAuB,CAAC;AAC/B,OAAO,EAAE,SAAS,EAAE,CAAC,EAAE,MAAM,iBAAiB,CAAC;AAE/C,sCAAsC;AACtC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AAEtB,+BAA+B;AAC/B,SAAS,WAAW;IAClB,OAAO,SAAS,EAAE,KAAK,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;AAC/C,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,kBAAkB,CAAC,SAAiB;IAClD,MAAM,CAAC,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;IACjD,MAAM,GAAG,GAAG,KAAK,EAAE,CAAC;IAEpB,IAAI,CAAC,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC3B,CAAC;IACD,IAAI,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC;QAC5C,OAAO,CAAC,CAAC,gBAAgB,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC1D,CAAC;IACD,IAAI,CAAC,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,CAAC;QAC1B,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC;IAC9C,CAAC;IACD,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC;AAC3C,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,SAAiB;IAC9C,OAAO,KAAK,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC;AAC/E,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,SAAiB;IAC/C,OAAO,KAAK,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC;AACxD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,SAAiB;IAC/C,OAAO,KAAK,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC;AAChF,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,YAAoB,EAAE,SAAiB;IACvE,OAAO,CAAC,CAAC,mBAAmB,EAAE,EAAE,CAAC,EAAE,YAAY,EAAE,IAAI,EAAE,kBAAkB,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;AAC1F,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,KAAa;IAC1C,IAAI,KAAK,GAAG,IAAI;QAAE,OAAO,GAAG,KAAK,IAAI,CAAC;IACtC,IAAI,KAAK,GAAG,IAAI,GAAG,IAAI;QAAE,OAAO,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;IAClE,OAAO,GAAG,CAAC,KAAK,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;AACpD,CAAC"}
@@ -0,0 +1,19 @@
1
+ import { HandoffService, type HandoffMode } from "@ai-zen/agents-sdk";
2
+ import type { ConversationContext } from "./types.js";
3
+ /** 执行者的中文名(供提示文案使用) */
4
+ export declare function describeMode(mode: HandoffMode): string;
5
+ /**
6
+ * 创建 CLI 交接服务实例(自动迁移与 `/migrate` / `/handoff` 共用同一个实例)。
7
+ *
8
+ * 分工:
9
+ * - **SDK**:`handoff()`(停工 → 写文档 → 校验 → 失败降级)与 `migrate()`(+ 清历史、注入断点);
10
+ * - **CLI(本函数)**:只补产品侧副作用——进度提示、旧会话存档、新会话落盘与指针更新。
11
+ *
12
+ * @param ctx 当前会话上下文(先建后回填 handoffService;钩子直接引用该对象)
13
+ */
14
+ export declare function createHandoffService(ctx: ConversationContext, options?: {
15
+ log?: (text: string) => void;
16
+ /** 交接文档目录;默认项目级 `<cwd>/.ai-zen/handoffs`(测试/多工作区可覆盖) */
17
+ handoffDir?: string;
18
+ }): HandoffService;
19
+ //# sourceMappingURL=handoff-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handoff-service.d.ts","sourceRoot":"","sources":["../src/handoff-service.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EAEd,KAAK,WAAW,EACjB,MAAM,oBAAoB,CAAC;AAQ5B,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAGtD,uBAAuB;AACvB,wBAAgB,YAAY,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,CAEtD;AAED;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAClC,GAAG,EAAE,mBAAmB,EACxB,OAAO,GAAE;IACP,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7B,wDAAwD;IACxD,UAAU,CAAC,EAAE,MAAM,CAAC;CAChB,GACL,cAAc,CA4EhB"}
@@ -0,0 +1,89 @@
1
+ import { HandoffService, } from "@ai-zen/agents-sdk";
2
+ import { saveConversation, persistConversation, generateConversationId, } from "./conversation-repository.js";
3
+ import { PROJECT_HANDOFFS_DIR } from "./config.js";
4
+ import { listSkillDirs } from "./agent-creator.js";
5
+ import { t } from "./i18n/index.js";
6
+ /** 执行者的中文名(供提示文案使用) */
7
+ export function describeMode(mode) {
8
+ return mode === "self" ? t("handoff.mode.self") : t("handoff.mode.summary");
9
+ }
10
+ /**
11
+ * 创建 CLI 交接服务实例(自动迁移与 `/migrate` / `/handoff` 共用同一个实例)。
12
+ *
13
+ * 分工:
14
+ * - **SDK**:`handoff()`(停工 → 写文档 → 校验 → 失败降级)与 `migrate()`(+ 清历史、注入断点);
15
+ * - **CLI(本函数)**:只补产品侧副作用——进度提示、旧会话存档、新会话落盘与指针更新。
16
+ *
17
+ * @param ctx 当前会话上下文(先建后回填 handoffService;钩子直接引用该对象)
18
+ */
19
+ export function createHandoffService(ctx, options = {}) {
20
+ // 进度/结果一律经 `log` 上报(TUI 走 Ink notice 块),不直接 console.log 污染画面
21
+ const log = options.log ?? (() => { });
22
+ return new HandoffService({
23
+ // 交接文档落在项目内,便于随仓库共享与评审
24
+ handoffDir: options.handoffDir ?? PROJECT_HANDOFFS_DIR,
25
+ // CLI 采用物理剔除模式:迁移后不保留历史消息,仅保留系统提示 + 交接断点
26
+ strategy: "prune",
27
+ // 交接模板的唯一真相源:磁盘上的 handoff Skill(出厂随 SDK 释放,可被项目级覆盖)
28
+ skillDirs: listSkillDirs(),
29
+ onBeforeHandoff: (hctx) => {
30
+ const { promptTokens, handoffTokens } = hctx;
31
+ const isAuto = promptTokens != null && handoffTokens != null;
32
+ if (isAuto) {
33
+ log(t("handoff.autoDetected", {
34
+ used: promptTokens,
35
+ limit: handoffTokens,
36
+ mode: describeMode(hctx.requestedMode),
37
+ }));
38
+ }
39
+ else {
40
+ log(t("handoff.writing", { mode: describeMode(hctx.requestedMode) }));
41
+ }
42
+ },
43
+ onHandoff: async (hctx) => {
44
+ // 降级时告知用户:请求的执行者与实际执行者不一致
45
+ if (hctx.mode !== hctx.requestedMode) {
46
+ log(t("handoff.degraded", {
47
+ requested: describeMode(hctx.requestedMode),
48
+ mode: describeMode(hctx.mode),
49
+ }));
50
+ }
51
+ log(t("handoff.path", { path: hctx.handoffPath }));
52
+ // 迁移前(历史尚未剔除)保存旧对话:此时已包含交接回合,可完整审计
53
+ if (hctx.migrating) {
54
+ await saveConversation(ctx);
55
+ log(t("handoff.savedConversation", { name: ctx.currentName }));
56
+ }
57
+ },
58
+ onMigrated: async (hctx) => {
59
+ // 清空「最近一次用量」:prune 已把上下文物理重置(仅留系统提示 + 交接断点),
60
+ // 但 lastUsage 仍是迁移前/交接回合的 prompt_tokens。若不清理,下一次发送时
61
+ // ContextGuardPlugin(`onInnerLoopStart` 以 tokenThresholds.guard 为硬上限)会拿这个
62
+ // 陈旧值判定,立即抛出「上下文严重超限」而中断——用户表现为「迁移完成后第一条
63
+ // 消息就被总上下文保护插件拦截」。置空后护栏首轮无据可查而放行,待下一次响应
64
+ // 以真实(已大幅缩小的)用量回填。
65
+ hctx.agent.lastUsage = undefined;
66
+ // 迁移开启新会话:分配新的会话 id 与名称
67
+ const id = generateConversationId();
68
+ ctx.currentId = id;
69
+ ctx.currentName = id;
70
+ log(t("handoff.migrated", { n: hctx.agent.messages.length }));
71
+ log(t("handoff.migratedHint"));
72
+ // 迁移后立即把新开场白落盘为独立会话文件,并更新「上一轮会话 id」指针,
73
+ // 避免迁移发生在 onAfterSend(ConversationPersistPlugin 的 onInnerLoopEnd
74
+ // 已不再触发)导致迁移后的新对话未被及时落盘、用户中途退出时丢失。
75
+ try {
76
+ await persistConversation({
77
+ id,
78
+ agentId: ctx.agentId,
79
+ messages: hctx.agent.messages,
80
+ cwd: process.cwd(),
81
+ });
82
+ }
83
+ catch (err) {
84
+ log(t("handoff.persistFailed", { error: err?.message ?? err }));
85
+ }
86
+ },
87
+ });
88
+ }
89
+ //# sourceMappingURL=handoff-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handoff-service.js","sourceRoot":"","sources":["../src/handoff-service.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"hook.d.ts","sourceRoot":"","sources":["../src/hook.ts"],"names":[],"mappings":"AA8DA,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CA4BjD;AAED,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAuBnD"}
1
+ {"version":3,"file":"hook.d.ts","sourceRoot":"","sources":["../src/hook.ts"],"names":[],"mappings":"AA+GA,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAmCjD;AAED,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAuBnD"}
package/dist/hook.js CHANGED
@@ -1,7 +1,11 @@
1
1
  import { homedir } from "node:os";
2
2
  import { join } from "node:path";
3
3
  import { promises as fs } from "node:fs";
4
- /** 当前标记(ai hook 时代) */
4
+ import { t } from "./i18n/index.js";
5
+ /** 当前标记(ai hook 时代)
6
+ *
7
+ * **不得翻译**:这两行是写进 rc 文件的代码块标记,靠它识别「哪段是本工具的」;
8
+ * 翻了字面串就再也找不到旧块,用户会冒出一堆重复 hook。 */
5
9
  const MARKER_START = "# === ai hook (开始) ===";
6
10
  const MARKER_END = "# === ai hook (结束) ===";
7
11
  /** 历史标记(aiz hook 时代,用于平滑迁移) */
@@ -19,8 +23,52 @@ function detectShell() {
19
23
  }
20
24
  return null;
21
25
  }
26
+ /**
27
+ * 生成被写入 rc 文件的钩子函数体。
28
+ *
29
+ * 关键:必须带 `--tui`。钩子的发起场景是「人坐在交互终端前把命令敲错了」,
30
+ * 不是脚本调用——所以要把原命令带进 TUI 当首条消息(`ai --tui --new "$@"`),
31
+ * 而不是落到管道模式吐一段字就退出(那样没有历史、不能追问)。
32
+ *
33
+ * 另带 `--new`:钩子会话**总是开新的一条对话**,不续接该目录的上一轮会话。
34
+ * 敲错一次命令就把内容追加进原有的长对话里,上下文和会话名都会被打乱。
35
+ * `"$@"` 保留分词,避免原本带空格的参数被拼坏。
36
+ */
22
37
  function hookCode(hookFn) {
23
- return ["", MARKER_START, `${hookFn}() {`, ' ai "$@"', "}", MARKER_END, ""].join("\n");
38
+ return ["", MARKER_START, `${hookFn}() {`, ' ai --tui --new "$@"', "}", MARKER_END, ""].join("\n");
39
+ }
40
+ /** 规范化钩子块(去空行、逐行 trim),用于判断已安装的内容是否就是当前版本 */
41
+ function normalizeBlock(block) {
42
+ return block
43
+ .split("\n")
44
+ .map((line) => line.trim())
45
+ .filter(Boolean)
46
+ .join("\n");
47
+ }
48
+ /**
49
+ * 取出文件中**全部**已安装的钩子块(含首尾标记),按出现顺序。
50
+ *
51
+ * 这里刻意返回数组而不是第一块:rc 里可能残留多个块(老版本 + 新版本各写了一次),
52
+ * 只看第一块会出现「第一块恰好是最新版 → 判定为已安装 → 后面的旧块永远留着」。
53
+ */
54
+ function readHookBlocks(content) {
55
+ const lines = content.split("\n");
56
+ const blocks = [];
57
+ let start = -1;
58
+ for (const [index, line] of lines.entries()) {
59
+ const trimmed = line.trim();
60
+ if (start < 0) {
61
+ if (trimmed === MARKER_START)
62
+ start = index;
63
+ continue;
64
+ }
65
+ if (trimmed === MARKER_END) {
66
+ blocks.push(lines.slice(start, index + 1).join("\n"));
67
+ start = -1;
68
+ }
69
+ }
70
+ // 只有开头标记、没有结尾标记的残缺块不算「已安装」——交给安装路径整段清理
71
+ return blocks;
24
72
  }
25
73
  /**
26
74
  * 移除文件中所有 hook 代码块(含历史 aiz 标记),返回清理后的内容;
@@ -53,7 +101,7 @@ function stripHookBlocks(content) {
53
101
  export async function installHook() {
54
102
  const shell = detectShell();
55
103
  if (!shell) {
56
- console.error("❌ 不支持的 shell(仅支持 bash / zsh)");
104
+ console.error(t("hook.unsupportedShell"));
57
105
  process.exit(1);
58
106
  }
59
107
  let current = "";
@@ -63,24 +111,30 @@ export async function installHook() {
63
111
  catch {
64
112
  // 文件不存在:视为空内容
65
113
  }
66
- if (current.includes(MARKER_START)) {
67
- console.log("ℹ️ ai hook 已安装,无需重复操作");
114
+ const desired = hookCode(shell.hookFn);
115
+ // 已安装的判定条件是「**恰好一块**且内容与当前版本一致」。
116
+ // 内容不一致(如升级后给钩子加了 `--new`)或残留多块(老版本 + 新版本各写过一次)
117
+ // 都要走重写路径,否则用户升不上去、或者旧块永远留在 rc 里。
118
+ const installedBlocks = readHookBlocks(current);
119
+ if (installedBlocks.length === 1 && normalizeBlock(installedBlocks[0]) === normalizeBlock(desired)) {
120
+ console.log(t("hook.alreadyInstalled"));
68
121
  return;
69
122
  }
70
- // 迁移:先移除历史 aiz 块,再写入新块
123
+ const refreshed = installedBlocks.length > 0;
124
+ // 统一走「先清掉所有已装块(含历史 aiz 块),再写入当前版本」
71
125
  const { content: cleaned, removed } = stripHookBlocks(current);
72
126
  const base = cleaned.replace(/\n+$/, "");
73
- await fs.writeFile(shell.rcFile, base + "\n" + hookCode(shell.hookFn), "utf-8");
74
- console.log(`✅ ai hook 已安装到 ${shell.rcFile}`);
127
+ await fs.writeFile(shell.rcFile, base + "\n" + desired, "utf-8");
128
+ console.log(refreshed ? t("hook.updated", { file: shell.rcFile }) : t("hook.installed", { file: shell.rcFile }));
75
129
  if (removed)
76
- console.log(" (已自动升级旧版 aiz hook)");
77
- console.log(` 重启终端或执行 source ${shell.rcFile} 即可生效`);
78
- console.log(` 之后输入不存在的命令会自动转发给 AI 处理`);
130
+ console.log(t("hook.upgraded"));
131
+ console.log(t("hook.restartHint", { file: shell.rcFile }));
132
+ console.log(t("hook.forwardHint"));
79
133
  }
80
134
  export async function uninstallHook() {
81
135
  const shell = detectShell();
82
136
  if (!shell) {
83
- console.error("❌ 不支持的 shell(仅支持 bash / zsh)");
137
+ console.error(t("hook.unsupportedShell"));
84
138
  process.exit(1);
85
139
  }
86
140
  let content;
@@ -88,15 +142,15 @@ export async function uninstallHook() {
88
142
  content = await fs.readFile(shell.rcFile, "utf-8");
89
143
  }
90
144
  catch {
91
- console.log("ℹ️ ai hook 未安装(文件不存在)");
145
+ console.log(t("hook.notInstalledNoFile"));
92
146
  return;
93
147
  }
94
148
  const { content: cleaned, removed } = stripHookBlocks(content);
95
149
  if (!removed) {
96
- console.log("ℹ️ ai hook 未安装");
150
+ console.log(t("hook.notInstalled"));
97
151
  return;
98
152
  }
99
153
  await fs.writeFile(shell.rcFile, cleaned, "utf-8");
100
- console.log(`✅ ai hook 已从 ${shell.rcFile} 卸载`);
154
+ console.log(t("hook.uninstalled", { file: shell.rcFile }));
101
155
  }
102
156
  //# sourceMappingURL=hook.js.map
package/dist/hook.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"hook.js","sourceRoot":"","sources":["../src/hook.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"hook.js","sourceRoot":"","sources":["../src/hook.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * English entries — Configuration center (`/config` wizard).
3
+ *
4
+ * Kept separate from `en.ts` for the same reason as `zh-wizard.ts`: the wizard is the
5
+ * densest text area in the CLI. `index.ts` merges both tables, so `t()` sees one map.
6
+ */
7
+ export declare const en: Record<string, string>;
8
+ //# sourceMappingURL=en-wizard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"en-wizard.d.ts","sourceRoot":"","sources":["../../src/i18n/en-wizard.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,eAAO,MAAM,EAAE,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAqTrC,CAAC"}