@ai-zen/cli 1.0.0-alpha.20 → 1.0.0-alpha.23

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 (261) hide show
  1. package/CHANGELOG.md +205 -0
  2. package/README.md +45 -17
  3. package/README.zh.md +45 -17
  4. package/dist/agent-creator.d.ts.map +1 -1
  5. package/dist/agent-creator.js +32 -10
  6. package/dist/agent-creator.js.map +1 -1
  7. package/dist/agent-switch.d.ts +61 -0
  8. package/dist/agent-switch.d.ts.map +1 -0
  9. package/dist/agent-switch.js +83 -0
  10. package/dist/agent-switch.js.map +1 -0
  11. package/dist/agents-store.d.ts +6 -1
  12. package/dist/agents-store.d.ts.map +1 -1
  13. package/dist/agents-store.js +6 -1
  14. package/dist/agents-store.js.map +1 -1
  15. package/dist/auto-migrate-confirm.d.ts.map +1 -1
  16. package/dist/auto-migrate-confirm.js +2 -1
  17. package/dist/auto-migrate-confirm.js.map +1 -1
  18. package/dist/config-editor.d.ts +9 -1
  19. package/dist/config-editor.d.ts.map +1 -1
  20. package/dist/config-editor.js +30 -19
  21. package/dist/config-editor.js.map +1 -1
  22. package/dist/config.d.ts +1 -1
  23. package/dist/config.d.ts.map +1 -1
  24. package/dist/config.js +29 -13
  25. package/dist/config.js.map +1 -1
  26. package/dist/conversation-commands/registry.d.ts +123 -4
  27. package/dist/conversation-commands/registry.d.ts.map +1 -1
  28. package/dist/conversation-commands/registry.js +92 -17
  29. package/dist/conversation-commands/registry.js.map +1 -1
  30. package/dist/conversation-persist-plugin.d.ts.map +1 -1
  31. package/dist/conversation-persist-plugin.js +6 -14
  32. package/dist/conversation-persist-plugin.js.map +1 -1
  33. package/dist/conversation-repository.d.ts +68 -14
  34. package/dist/conversation-repository.d.ts.map +1 -1
  35. package/dist/conversation-repository.js +81 -23
  36. package/dist/conversation-repository.js.map +1 -1
  37. package/dist/cwd-tracker-plugin.d.ts.map +1 -1
  38. package/dist/cwd-tracker-plugin.js +6 -2
  39. package/dist/cwd-tracker-plugin.js.map +1 -1
  40. package/dist/format-time.d.ts +17 -6
  41. package/dist/format-time.d.ts.map +1 -1
  42. package/dist/format-time.js +32 -14
  43. package/dist/format-time.js.map +1 -1
  44. package/dist/handoff-service.d.ts.map +1 -1
  45. package/dist/handoff-service.js +22 -19
  46. package/dist/handoff-service.js.map +1 -1
  47. package/dist/hook.d.ts.map +1 -1
  48. package/dist/hook.js +69 -15
  49. package/dist/hook.js.map +1 -1
  50. package/dist/i18n/en-wizard.d.ts +8 -0
  51. package/dist/i18n/en-wizard.d.ts.map +1 -0
  52. package/dist/i18n/en-wizard.js +290 -0
  53. package/dist/i18n/en-wizard.js.map +1 -0
  54. package/dist/i18n/en.d.ts +7 -0
  55. package/dist/i18n/en.d.ts.map +1 -0
  56. package/dist/i18n/en.js +223 -0
  57. package/dist/i18n/en.js.map +1 -0
  58. package/dist/i18n/index.d.ts +57 -0
  59. package/dist/i18n/index.d.ts.map +1 -0
  60. package/dist/i18n/index.js +109 -0
  61. package/dist/i18n/index.js.map +1 -0
  62. package/dist/i18n/preferences.d.ts +34 -0
  63. package/dist/i18n/preferences.d.ts.map +1 -0
  64. package/dist/i18n/preferences.js +69 -0
  65. package/dist/i18n/preferences.js.map +1 -0
  66. package/dist/i18n/zh-wizard.d.ts +11 -0
  67. package/dist/i18n/zh-wizard.d.ts.map +1 -0
  68. package/dist/i18n/zh-wizard.js +293 -0
  69. package/dist/i18n/zh-wizard.js.map +1 -0
  70. package/dist/i18n/zh.d.ts +10 -0
  71. package/dist/i18n/zh.d.ts.map +1 -0
  72. package/dist/i18n/zh.js +227 -0
  73. package/dist/i18n/zh.js.map +1 -0
  74. package/dist/index.js +41 -23
  75. package/dist/index.js.map +1 -1
  76. package/dist/mcp-command.d.ts +32 -0
  77. package/dist/mcp-command.d.ts.map +1 -0
  78. package/dist/mcp-command.js +37 -0
  79. package/dist/mcp-command.js.map +1 -0
  80. package/dist/mode.d.ts +31 -4
  81. package/dist/mode.d.ts.map +1 -1
  82. package/dist/mode.js +42 -7
  83. package/dist/mode.js.map +1 -1
  84. package/dist/model-switch.d.ts.map +1 -1
  85. package/dist/model-switch.js +5 -4
  86. package/dist/model-switch.js.map +1 -1
  87. package/dist/reasoning-effort.d.ts +23 -4
  88. package/dist/reasoning-effort.d.ts.map +1 -1
  89. package/dist/reasoning-effort.js +51 -24
  90. package/dist/reasoning-effort.js.map +1 -1
  91. package/dist/sdk-log.d.ts +23 -16
  92. package/dist/sdk-log.d.ts.map +1 -1
  93. package/dist/sdk-log.js +43 -19
  94. package/dist/sdk-log.js.map +1 -1
  95. package/dist/stdio-runner.d.ts.map +1 -1
  96. package/dist/stdio-runner.js +19 -19
  97. package/dist/stdio-runner.js.map +1 -1
  98. package/dist/sub-agent-guard-plugin.d.ts +5 -2
  99. package/dist/sub-agent-guard-plugin.d.ts.map +1 -1
  100. package/dist/sub-agent-guard-plugin.js +5 -2
  101. package/dist/sub-agent-guard-plugin.js.map +1 -1
  102. package/dist/tui/chat-session.d.ts +73 -0
  103. package/dist/tui/chat-session.d.ts.map +1 -1
  104. package/dist/tui/chat-session.js +167 -33
  105. package/dist/tui/chat-session.js.map +1 -1
  106. package/dist/tui/components.d.ts +43 -2
  107. package/dist/tui/components.d.ts.map +1 -1
  108. package/dist/tui/components.js +97 -4
  109. package/dist/tui/components.js.map +1 -1
  110. package/dist/tui/config-wizard/detail.d.ts +12 -6
  111. package/dist/tui/config-wizard/detail.d.ts.map +1 -1
  112. package/dist/tui/config-wizard/detail.js +33 -32
  113. package/dist/tui/config-wizard/detail.js.map +1 -1
  114. package/dist/tui/config-wizard/engine.d.ts.map +1 -1
  115. package/dist/tui/config-wizard/engine.js +26 -20
  116. package/dist/tui/config-wizard/engine.js.map +1 -1
  117. package/dist/tui/config-wizard/fields.d.ts.map +1 -1
  118. package/dist/tui/config-wizard/fields.js +176 -164
  119. package/dist/tui/config-wizard/fields.js.map +1 -1
  120. package/dist/tui/config-wizard/kv-editor.d.ts.map +1 -1
  121. package/dist/tui/config-wizard/kv-editor.js +9 -5
  122. package/dist/tui/config-wizard/kv-editor.js.map +1 -1
  123. package/dist/tui/config-wizard/list.d.ts.map +1 -1
  124. package/dist/tui/config-wizard/list.js +2 -1
  125. package/dist/tui/config-wizard/list.js.map +1 -1
  126. package/dist/tui/config-wizard/mcp-helpers.d.ts.map +1 -1
  127. package/dist/tui/config-wizard/mcp-helpers.js +4 -3
  128. package/dist/tui/config-wizard/mcp-helpers.js.map +1 -1
  129. package/dist/tui/config-wizard/menu.d.ts.map +1 -1
  130. package/dist/tui/config-wizard/menu.js +32 -19
  131. package/dist/tui/config-wizard/menu.js.map +1 -1
  132. package/dist/tui/config-wizard/prompt-editor.d.ts.map +1 -1
  133. package/dist/tui/config-wizard/prompt-editor.js +4 -3
  134. package/dist/tui/config-wizard/prompt-editor.js.map +1 -1
  135. package/dist/tui/config-wizard/prompt.d.ts.map +1 -1
  136. package/dist/tui/config-wizard/prompt.js +8 -7
  137. package/dist/tui/config-wizard/prompt.js.map +1 -1
  138. package/dist/tui/config-wizard/step-agents.d.ts.map +1 -1
  139. package/dist/tui/config-wizard/step-agents.js +29 -20
  140. package/dist/tui/config-wizard/step-agents.js.map +1 -1
  141. package/dist/tui/config-wizard/step-defaults.d.ts.map +1 -1
  142. package/dist/tui/config-wizard/step-defaults.js +21 -17
  143. package/dist/tui/config-wizard/step-defaults.js.map +1 -1
  144. package/dist/tui/config-wizard/step-endpoints.d.ts.map +1 -1
  145. package/dist/tui/config-wizard/step-endpoints.js +16 -6
  146. package/dist/tui/config-wizard/step-endpoints.js.map +1 -1
  147. package/dist/tui/config-wizard/step-mcp.d.ts.map +1 -1
  148. package/dist/tui/config-wizard/step-mcp.js +17 -19
  149. package/dist/tui/config-wizard/step-mcp.js.map +1 -1
  150. package/dist/tui/config-wizard/step-models.d.ts.map +1 -1
  151. package/dist/tui/config-wizard/step-models.js +41 -26
  152. package/dist/tui/config-wizard/step-models.js.map +1 -1
  153. package/dist/tui/config-wizard/step-new-endpoint.d.ts.map +1 -1
  154. package/dist/tui/config-wizard/step-new-endpoint.js +16 -12
  155. package/dist/tui/config-wizard/step-new-endpoint.js.map +1 -1
  156. package/dist/tui/config-wizard/step-simple.d.ts.map +1 -1
  157. package/dist/tui/config-wizard/step-simple.js +18 -17
  158. package/dist/tui/config-wizard/step-simple.js.map +1 -1
  159. package/dist/tui/index.d.ts +17 -1
  160. package/dist/tui/index.d.ts.map +1 -1
  161. package/dist/tui/index.js +25 -14
  162. package/dist/tui/index.js.map +1 -1
  163. package/dist/tui/input-editing.d.ts +4 -1
  164. package/dist/tui/input-editing.d.ts.map +1 -1
  165. package/dist/tui/input-editing.js +7 -3
  166. package/dist/tui/input-editing.js.map +1 -1
  167. package/dist/tui/phase.d.ts +64 -0
  168. package/dist/tui/phase.d.ts.map +1 -0
  169. package/dist/tui/phase.js +112 -0
  170. package/dist/tui/phase.js.map +1 -0
  171. package/dist/tui/screens/agent-tabs.d.ts +53 -0
  172. package/dist/tui/screens/agent-tabs.d.ts.map +1 -0
  173. package/dist/tui/screens/agent-tabs.js +81 -0
  174. package/dist/tui/screens/agent-tabs.js.map +1 -0
  175. package/dist/tui/screens/chat-commands.d.ts +54 -3
  176. package/dist/tui/screens/chat-commands.d.ts.map +1 -1
  177. package/dist/tui/screens/chat-commands.js +469 -330
  178. package/dist/tui/screens/chat-commands.js.map +1 -1
  179. package/dist/tui/screens/chat.d.ts +8 -0
  180. package/dist/tui/screens/chat.d.ts.map +1 -1
  181. package/dist/tui/screens/chat.js +263 -406
  182. package/dist/tui/screens/chat.js.map +1 -1
  183. package/dist/tui/screens/common-keys.d.ts +36 -0
  184. package/dist/tui/screens/common-keys.d.ts.map +1 -0
  185. package/dist/tui/screens/common-keys.js +67 -0
  186. package/dist/tui/screens/common-keys.js.map +1 -0
  187. package/dist/tui/screens/handoff-choice.d.ts.map +1 -1
  188. package/dist/tui/screens/handoff-choice.js +4 -3
  189. package/dist/tui/screens/handoff-choice.js.map +1 -1
  190. package/dist/tui/screens/index.d.ts +3 -1
  191. package/dist/tui/screens/index.d.ts.map +1 -1
  192. package/dist/tui/screens/index.js +2 -1
  193. package/dist/tui/screens/index.js.map +1 -1
  194. package/dist/tui/screens/input-row.d.ts +64 -0
  195. package/dist/tui/screens/input-row.d.ts.map +1 -0
  196. package/dist/tui/screens/input-row.js +67 -0
  197. package/dist/tui/screens/input-row.js.map +1 -0
  198. package/dist/tui/screens/input.d.ts +13 -1
  199. package/dist/tui/screens/input.d.ts.map +1 -1
  200. package/dist/tui/screens/input.js +26 -12
  201. package/dist/tui/screens/input.js.map +1 -1
  202. package/dist/tui/screens/layout.d.ts +15 -0
  203. package/dist/tui/screens/layout.d.ts.map +1 -1
  204. package/dist/tui/screens/layout.js +14 -2
  205. package/dist/tui/screens/layout.js.map +1 -1
  206. package/dist/tui/screens/lines.d.ts.map +1 -1
  207. package/dist/tui/screens/lines.js +6 -6
  208. package/dist/tui/screens/lines.js.map +1 -1
  209. package/dist/tui/screens/messages-view.d.ts.map +1 -1
  210. package/dist/tui/screens/messages-view.js +5 -4
  211. package/dist/tui/screens/messages-view.js.map +1 -1
  212. package/dist/tui/screens/notice-bar.d.ts +5 -0
  213. package/dist/tui/screens/notice-bar.d.ts.map +1 -0
  214. package/dist/tui/screens/notice-bar.js +15 -0
  215. package/dist/tui/screens/notice-bar.js.map +1 -0
  216. package/dist/tui/screens/notice.d.ts +40 -8
  217. package/dist/tui/screens/notice.d.ts.map +1 -1
  218. package/dist/tui/screens/notice.js +75 -15
  219. package/dist/tui/screens/notice.js.map +1 -1
  220. package/dist/tui/screens/overlays.d.ts.map +1 -1
  221. package/dist/tui/screens/overlays.js +3 -2
  222. package/dist/tui/screens/overlays.js.map +1 -1
  223. package/dist/tui/screens/splash.d.ts +1 -1
  224. package/dist/tui/screens/splash.d.ts.map +1 -1
  225. package/dist/tui/screens/splash.js +5 -2
  226. package/dist/tui/screens/splash.js.map +1 -1
  227. package/dist/tui/screens/use-chat-viewport.d.ts +22 -0
  228. package/dist/tui/screens/use-chat-viewport.d.ts.map +1 -0
  229. package/dist/tui/screens/use-chat-viewport.js +50 -0
  230. package/dist/tui/screens/use-chat-viewport.js.map +1 -0
  231. package/dist/tui/screens/use-input-editing.d.ts +44 -0
  232. package/dist/tui/screens/use-input-editing.d.ts.map +1 -0
  233. package/dist/tui/screens/use-input-editing.js +192 -0
  234. package/dist/tui/screens/use-input-editing.js.map +1 -0
  235. package/dist/tui/screens/use-overlays.d.ts +25 -0
  236. package/dist/tui/screens/use-overlays.d.ts.map +1 -0
  237. package/dist/tui/screens/use-overlays.js +32 -0
  238. package/dist/tui/screens/use-overlays.js.map +1 -0
  239. package/dist/tui/screens/use-wizard-host.d.ts +35 -0
  240. package/dist/tui/screens/use-wizard-host.d.ts.map +1 -0
  241. package/dist/tui/screens/use-wizard-host.js +103 -0
  242. package/dist/tui/screens/use-wizard-host.js.map +1 -0
  243. package/dist/tui/status-segments.d.ts +37 -0
  244. package/dist/tui/status-segments.d.ts.map +1 -0
  245. package/dist/tui/status-segments.js +166 -0
  246. package/dist/tui/status-segments.js.map +1 -0
  247. package/dist/tui/text.d.ts +8 -5
  248. package/dist/tui/text.d.ts.map +1 -1
  249. package/dist/tui/text.js +95 -35
  250. package/dist/tui/text.js.map +1 -1
  251. package/dist/tui/theme.d.ts +2 -0
  252. package/dist/tui/theme.d.ts.map +1 -1
  253. package/dist/tui/theme.js +2 -0
  254. package/dist/tui/theme.js.map +1 -1
  255. package/dist/tui/token-rate.d.ts +83 -0
  256. package/dist/tui/token-rate.d.ts.map +1 -0
  257. package/dist/tui/token-rate.js +195 -0
  258. package/dist/tui/token-rate.js.map +1 -0
  259. package/dist/types.d.ts +0 -3
  260. package/dist/types.d.ts.map +1 -1
  261. package/package.json +4 -3
@@ -7,43 +7,93 @@
7
7
  * 「上一轮会话 id」指针(session-pointer.ts)随每次落盘更新,供下次启动续接。
8
8
  */
9
9
  import { promises as fs } from "node:fs";
10
- import { join } from "node:path";
10
+ import { dirname, join } from "node:path";
11
11
  import { EntityRepository } from "@ai-zen/agents-sdk";
12
+ import { AgentNS } from "@ai-zen/agents-core";
12
13
  import { CONVERSATIONS_DIR } from "./config.js";
13
- import { formatShortTime } from "./format-time.js";
14
+ import { formatFileStamp } from "./format-time.js";
14
15
  import { writeLastSession } from "./session-pointer.js";
15
- /** 会话仓储:每个会话一个 JSON 文件(${conversationsDir}/${id}.json) */
16
- export const conversationRepository = new EntityRepository(CONVERSATIONS_DIR);
17
16
  /**
18
- * 生成文件名安全的会话 id(语义化中文时间戳,天然不含非法字符)。
19
- * 形如 `对话_2025年07月01日14时30分00秒`。
17
+ * 会话仓储:每个会话一个 JSON 文件(${conversationsDir}/${id}.json),**写盘是原子的**。
18
+ *
19
+ * 为什么要覆写 `write()`:SDK 的实现是直接 `fs.writeFile`,进程在写一半时被杀
20
+ * (Ctrl+C、OOM、断电)就留下半截 JSON,`read()` 解析失败返回 null —— 整段历史
21
+ * 就此丢失。会话文件可达数 MB,写入窗口并不小。这里改成「写临时文件 → rename」:
22
+ * 同一文件系统内 rename 是原子操作,任何时刻读到的要么是旧文件、要么是完整新文件。
23
+ *
24
+ * 临时文件名为 `<id>.json.tmp`:`list()` 按 `.json` 后缀过滤,不会把它当成会话。
25
+ */
26
+ class AtomicConversationRepository extends EntityRepository {
27
+ async write(entity) {
28
+ const target = this.path(entity.id);
29
+ const tmp = `${target}.tmp`;
30
+ await fs.mkdir(dirname(target), { recursive: true });
31
+ await fs.writeFile(tmp, JSON.stringify(entity, null, 2), "utf-8");
32
+ await fs.rename(tmp, target);
33
+ }
34
+ }
35
+ export const conversationRepository = new AtomicConversationRepository(CONVERSATIONS_DIR);
36
+ /**
37
+ * 生成文件名安全的会话 id:英文前缀 + 全下划线时间戳,中英一致。
38
+ * 形如 `chat_2026_10_28_00_56_34`。
20
39
  */
21
40
  export function generateConversationId(date = new Date()) {
22
- return `对话_${formatShortTime(date.toISOString())}`.replace(/[\\/:*?"<>|]/g, "_");
41
+ return `chat_${formatFileStamp(date.toISOString())}`;
23
42
  }
24
43
  /**
25
- * 保存当前对话到 conversations 目录,并更新「上一轮会话 id」指针。
26
- * 迁移前落盘旧会话(onBeforeMigrate)、手动 /save 等场景共同调用,保证 id 计算一致。
44
+ * 落盘一份会话 —— **唯一的写入入口**。
45
+ *
46
+ * 此前「读旧记录拿 createdAt → 写 → 更新指针」这段在 5 个地方各写了一遍,并且已经
47
+ * 漂移:`saveConversation()` 漏写 `cwd`、stdio 的 `--save` 不更新指针、还写了一个已
48
+ * 废弃的 `modelId`。收敛到这里后,各处差异只剩「是否更新指针」一个显式开关。
27
49
  */
28
- export async function saveConversation(ctx) {
29
- const id = ctx.currentId || generateConversationId();
30
- const existing = await conversationRepository.read(id);
50
+ export async function persistConversation(input) {
51
+ const existing = await conversationRepository.read(input.id);
31
52
  const now = new Date().toISOString();
32
53
  await conversationRepository.write({
33
- id,
34
- agentId: ctx.agentId || "default",
35
- messages: ctx.agent.messages,
54
+ id: input.id,
55
+ agentId: input.agentId || "default",
56
+ messages: input.messages,
57
+ cwd: input.cwd,
36
58
  createdAt: existing?.createdAt ?? now,
37
59
  updatedAt: now,
38
60
  });
39
- await writeLastSession(process.cwd(), id);
40
- return id;
61
+ if (input.setAsLastSession !== false)
62
+ await writeLastSession(input.cwd, input.id);
63
+ return input.id;
64
+ }
65
+ /**
66
+ * 保存当前对话(交接前落盘旧会话时用):以 `ctx` 为真相源,走统一的写入入口。
67
+ */
68
+ export async function saveConversation(ctx) {
69
+ return persistConversation({
70
+ id: ctx.currentId || generateConversationId(),
71
+ agentId: ctx.agentId,
72
+ messages: ctx.agent.messages,
73
+ cwd: process.cwd(),
74
+ });
41
75
  }
76
+ /** 摘要最大字符数(渲染侧还会按终端宽度再裁一次) */
77
+ const PREVIEW_MAX = 80;
42
78
  /**
43
- * 列出已保存的会话(仅读文件名与 mtime,不解析 JSON 内容,快),按更新时间倒序。
44
- * 供对话内 `/load` 选择器使用。
79
+ * 会话摘要:首条用户消息的第一行。
80
+ *
81
+ * 会话 id 是时间戳(`chat_2026_10_28_00_56_34`),直接当标签列出来完全分不清哪条是哪条。
82
+ * 取首行而不是整段:`CwdTrackerPlugin` 会在消息末尾追加工作目录注记,末尾对辨认无意义。
83
+ */
84
+ export function conversationPreview(conversation) {
85
+ const first = conversation?.messages?.find((m) => m.role === AgentNS.Role.User);
86
+ const content = typeof first?.content === "string" ? first.content : "";
87
+ const line = content.split("\n").find((part) => part.trim()) ?? "";
88
+ return line.trim().slice(0, PREVIEW_MAX);
89
+ }
90
+ /**
91
+ * 列出已保存的会话,按更新时间倒序。供对话内 `/load` 选择器使用。
92
+ *
93
+ * 先只 stat(快),排序后**只为将要显示的那几条**解析内容取摘要 —— 会话攒到上百条时,
94
+ * 逐个 `JSON.parse` 会明显拖慢 `/load`。
45
95
  */
46
- export async function listConversations() {
96
+ export async function listConversations(options) {
47
97
  try {
48
98
  await fs.access(CONVERSATIONS_DIR);
49
99
  }
@@ -51,19 +101,27 @@ export async function listConversations() {
51
101
  return [];
52
102
  }
53
103
  const files = await fs.readdir(CONVERSATIONS_DIR);
54
- const result = [];
104
+ const stats = [];
55
105
  for (const file of files) {
56
106
  if (!file.endsWith(".json"))
57
107
  continue;
58
108
  const id = file.replace(/\.json$/, "");
59
109
  try {
60
110
  const st = await fs.stat(join(CONVERSATIONS_DIR, file));
61
- result.push({ id, name: id, updatedAt: st.mtime.toISOString(), size: st.size });
111
+ stats.push({ id, name: id, updatedAt: st.mtime.toISOString(), size: st.size });
62
112
  }
63
113
  catch {
64
114
  /* 跳过读取失败的条目 */
65
115
  }
66
116
  }
67
- return result.sort((a, b) => new Date(b.updatedAt).getTime() - new Date(a.updatedAt).getTime());
117
+ stats.sort((a, b) => new Date(b.updatedAt).getTime() - new Date(a.updatedAt).getTime());
118
+ // `previewLimit` 必填:默认 0(=全部无摘要)是个静默陷阱 —— 漏传不会报错,
119
+ // 只会让列表变成一堆谁也分不清的时间戳 id。
120
+ const withPreview = await Promise.all(stats.map(async (item, index) => {
121
+ if (index >= options.previewLimit)
122
+ return { ...item, preview: "" };
123
+ return { ...item, preview: conversationPreview(await conversationRepository.read(item.id)) };
124
+ }));
125
+ return withPreview;
68
126
  }
69
127
  //# sourceMappingURL=conversation-repository.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"conversation-repository.js","sourceRoot":"","sources":["../src/conversation-repository.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAkBxD,0DAA0D;AAC1D,MAAM,CAAC,MAAM,sBAAsB,GAAG,IAAI,gBAAgB,CAAe,iBAAiB,CAAC,CAAC;AAE5F;;;GAGG;AACH,MAAM,UAAU,sBAAsB,CAAC,OAAa,IAAI,IAAI,EAAE;IAC5D,OAAO,MAAM,eAAe,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,eAAe,EAAE,GAAG,CAAC,CAAC;AACnF,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,GAAwB;IAC7D,MAAM,EAAE,GAAG,GAAG,CAAC,SAAS,IAAI,sBAAsB,EAAE,CAAC;IACrD,MAAM,QAAQ,GAAG,MAAM,sBAAsB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACvD,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACrC,MAAM,sBAAsB,CAAC,KAAK,CAAC;QACjC,EAAE;QACF,OAAO,EAAE,GAAG,CAAC,OAAO,IAAI,SAAS;QACjC,QAAQ,EAAE,GAAG,CAAC,KAAK,CAAC,QAAQ;QAC5B,SAAS,EAAE,QAAQ,EAAE,SAAS,IAAI,GAAG;QACrC,SAAS,EAAE,GAAG;KACf,CAAC,CAAC;IACH,MAAM,gBAAgB,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC;IAC1C,OAAO,EAAE,CAAC;AACZ,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB;IAGrC,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;IACrC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAClD,MAAM,MAAM,GAAyE,EAAE,CAAC;IACxF,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;YAAE,SAAS;QACtC,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QACvC,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,IAAI,CAAC,CAAC,CAAC;YACxD,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;QAClF,CAAC;QAAC,MAAM,CAAC;YACP,eAAe;QACjB,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;AAClG,CAAC"}
1
+ {"version":3,"file":"conversation-repository.js","sourceRoot":"","sources":["../src/conversation-repository.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"cwd-tracker-plugin.d.ts","sourceRoot":"","sources":["../src/cwd-tracker-plugin.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEnE,qBAAa,gBAAiB,YAAW,WAAW;IAClD,8BAA8B;IAC9B,OAAO,CAAC,OAAO,CAAuB;IAEhC,gBAAgB,CAAC,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;CAmBxD"}
1
+ {"version":3,"file":"cwd-tracker-plugin.d.ts","sourceRoot":"","sources":["../src/cwd-tracker-plugin.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEnE,qBAAa,gBAAiB,YAAW,WAAW;IAClD,8BAA8B;IAC9B,OAAO,CAAC,OAAO,CAAuB;IAEhC,gBAAgB,CAAC,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;CAuBxD"}
@@ -45,8 +45,12 @@ export class CwdTrackerPlugin {
45
45
  .find((m) => m.role === AgentNS.Role.User && typeof m.content === "string");
46
46
  if (!lastUserMsg || typeof lastUserMsg.content !== "string")
47
47
  return;
48
- const prefix = isFirstTime ? "" : "\n\n[工作目录变更]";
49
- lastUserMsg.content += `${prefix}\n当前工作目录: ${currentCwd}`;
48
+ // 注入给模型的提示词:用英文,并显式标注「系统注入」—— 翻存档 / 交接文档时
49
+ // 一眼能分辨哪些内容不是用户敲的。(协议内容,不走 i18n)
50
+ const tag = isFirstTime
51
+ ? "[system-injected: current working directory — not written by the user]"
52
+ : "[system-injected: working directory changed — not written by the user]";
53
+ lastUserMsg.content += `\n\n${tag}\nCurrent working directory: ${currentCwd}`;
50
54
  }
51
55
  }
52
56
  //# sourceMappingURL=cwd-tracker-plugin.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"cwd-tracker-plugin.js","sourceRoot":"","sources":["../src/cwd-tracker-plugin.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAG9C,MAAM,OAAO,gBAAgB;IAC3B,8BAA8B;IACtB,OAAO,GAAkB,IAAI,CAAC;IAEtC,KAAK,CAAC,gBAAgB,CAAC,GAAgB;QACrC,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;QAEjC,gBAAgB;QAChB,IAAI,IAAI,CAAC,OAAO,KAAK,UAAU;YAAE,OAAO;QAExC,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,KAAK,IAAI,CAAC;QAC1C,IAAI,CAAC,OAAO,GAAG,UAAU,CAAC;QAE1B,gCAAgC;QAChC,MAAM,WAAW,GAAG,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC;aACxC,OAAO,EAAE;aACT,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,OAAO,CAAC,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC;QAE9E,IAAI,CAAC,WAAW,IAAI,OAAO,WAAW,CAAC,OAAO,KAAK,QAAQ;YAAE,OAAO;QAEpE,MAAM,MAAM,GAAG,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,cAAc,CAAC;QACjD,WAAW,CAAC,OAAO,IAAI,GAAG,MAAM,aAAa,UAAU,EAAE,CAAC;IAC5D,CAAC;CACF"}
1
+ {"version":3,"file":"cwd-tracker-plugin.js","sourceRoot":"","sources":["../src/cwd-tracker-plugin.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAG9C,MAAM,OAAO,gBAAgB;IAC3B,8BAA8B;IACtB,OAAO,GAAkB,IAAI,CAAC;IAEtC,KAAK,CAAC,gBAAgB,CAAC,GAAgB;QACrC,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;QAEjC,gBAAgB;QAChB,IAAI,IAAI,CAAC,OAAO,KAAK,UAAU;YAAE,OAAO;QAExC,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,KAAK,IAAI,CAAC;QAC1C,IAAI,CAAC,OAAO,GAAG,UAAU,CAAC;QAE1B,gCAAgC;QAChC,MAAM,WAAW,GAAG,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC;aACxC,OAAO,EAAE;aACT,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,OAAO,CAAC,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC;QAE9E,IAAI,CAAC,WAAW,IAAI,OAAO,WAAW,CAAC,OAAO,KAAK,QAAQ;YAAE,OAAO;QAEpE,0CAA0C;QAC1C,iCAAiC;QACjC,MAAM,GAAG,GAAG,WAAW;YACrB,CAAC,CAAC,wEAAwE;YAC1E,CAAC,CAAC,wEAAwE,CAAC;QAC7E,WAAW,CAAC,OAAO,IAAI,OAAO,GAAG,gCAAgC,UAAU,EAAE,CAAC;IAChF,CAAC;CACF"}
@@ -1,8 +1,12 @@
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/locale/zh-cn.js";
8
12
  /**
@@ -16,13 +20,20 @@ import "dayjs/locale/zh-cn.js";
16
20
  */
17
21
  export declare function formatRelativeTime(isoString: string): string;
18
22
  /**
19
- * 格式化时间戳为完整中文格式(用于详情展示)
20
- * 例:2025年7月1日 14:30:00
23
+ * 格式化时间戳为完整格式(用于详情展示)
24
+ * 例(中):2025年7月1日 14:30:00 (英):Jul 1, 2025 14:30:00
21
25
  */
22
26
  export declare function formatFullTime(isoString: string): string;
23
27
  /**
24
- * 格式化时间戳为保存名称用的格式,兼容文件名
25
- * 例:2025年07月01日_14时30分00秒
28
+ * 文件名安全的时间戳:全下划线、纯数字,用作会话 id。
29
+ * 例:2026_10_28_00_56_34
30
+ *
31
+ * **刻意不随界面语言变**:它进了文件名与会话 id,跟着语言变会让历史文件与新文件混排。
32
+ */
33
+ export declare function formatFileStamp(isoString: string): string;
34
+ /**
35
+ * 紧凑时间戳(列表/详情提示显示用),随界面语言变:
36
+ * 中文 `2025年07月01日15时30分00秒`,英文 `Jul 1, 2025 15:30:00`。
26
37
  */
27
38
  export declare function formatShortTime(isoString: string): string;
28
39
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"format-time.d.ts","sourceRoot":"","sources":["../src/format-time.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,uBAAuB,CAAC;AAK/B;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAc5D;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAExD;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAEzD;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAEjF;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAIpD"}
1
+ {"version":3,"file":"format-time.d.ts","sourceRoot":"","sources":["../src/format-time.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,uBAAuB,CAAC;AAW/B;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAc5D;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAExD;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAEzD;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAEzD;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAEjF;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAIpD"}
@@ -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"}
@@ -1 +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;AAS5B,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEtD,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,CAuEhB"}
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"}
@@ -1,11 +1,11 @@
1
1
  import { HandoffService, } from "@ai-zen/agents-sdk";
2
- import { saveConversation, conversationRepository, generateConversationId, } from "./conversation-repository.js";
3
- import { writeLastSession } from "./session-pointer.js";
2
+ import { saveConversation, persistConversation, generateConversationId, } from "./conversation-repository.js";
4
3
  import { PROJECT_HANDOFFS_DIR } from "./config.js";
5
4
  import { listSkillDirs } from "./agent-creator.js";
5
+ import { t } from "./i18n/index.js";
6
6
  /** 执行者的中文名(供提示文案使用) */
7
7
  export function describeMode(mode) {
8
- return mode === "self" ? "原 agent 自交接" : "独立摘要";
8
+ return mode === "self" ? t("handoff.mode.self") : t("handoff.mode.summary");
9
9
  }
10
10
  /**
11
11
  * 创建 CLI 交接服务实例(自动迁移与 `/migrate` / `/handoff` 共用同一个实例)。
@@ -27,24 +27,32 @@ export function createHandoffService(ctx, options = {}) {
27
27
  // 交接模板的唯一真相源:磁盘上的 handoff Skill(出厂随 SDK 释放,可被项目级覆盖)
28
28
  skillDirs: listSkillDirs(),
29
29
  onBeforeHandoff: (hctx) => {
30
- const isAuto = hctx.promptTokens != null && hctx.handoffTokens != null;
30
+ const { promptTokens, handoffTokens } = hctx;
31
+ const isAuto = promptTokens != null && handoffTokens != null;
31
32
  if (isAuto) {
32
- log(`📋 检测到上下文即将超限(${hctx.promptTokens}/${hctx.handoffTokens} tokens),正在交接(${describeMode(hctx.requestedMode)})…`);
33
+ log(t("handoff.autoDetected", {
34
+ used: promptTokens,
35
+ limit: handoffTokens,
36
+ mode: describeMode(hctx.requestedMode),
37
+ }));
33
38
  }
34
39
  else {
35
- log(`📋 正在编写任务交接文档(${describeMode(hctx.requestedMode)})…`);
40
+ log(t("handoff.writing", { mode: describeMode(hctx.requestedMode) }));
36
41
  }
37
42
  },
38
43
  onHandoff: async (hctx) => {
39
44
  // 降级时告知用户:请求的执行者与实际执行者不一致
40
45
  if (hctx.mode !== hctx.requestedMode) {
41
- log(`⚠️ ${describeMode(hctx.requestedMode)}未能产出文档,已降级为${describeMode(hctx.mode)}`);
46
+ log(t("handoff.degraded", {
47
+ requested: describeMode(hctx.requestedMode),
48
+ mode: describeMode(hctx.mode),
49
+ }));
42
50
  }
43
- log(`📄 交接文档:${hctx.handoffPath}`);
51
+ log(t("handoff.path", { path: hctx.handoffPath }));
44
52
  // 迁移前(历史尚未剔除)保存旧对话:此时已包含交接回合,可完整审计
45
53
  if (hctx.migrating) {
46
54
  await saveConversation(ctx);
47
- log(`✅ 原对话已保存:${ctx.currentName}`);
55
+ log(t("handoff.savedConversation", { name: ctx.currentName }));
48
56
  }
49
57
  },
50
58
  onMigrated: async (hctx) => {
@@ -59,26 +67,21 @@ export function createHandoffService(ctx, options = {}) {
59
67
  const id = generateConversationId();
60
68
  ctx.currentId = id;
61
69
  ctx.currentName = id;
62
- log(`🚀 任务迁移完成,已开启新会话(共 ${hctx.agent.messages.length} 条消息)`);
63
- log("💡 新助手会先读取交接文档,随后即可继续推进任务。");
70
+ log(t("handoff.migrated", { n: hctx.agent.messages.length }));
71
+ log(t("handoff.migratedHint"));
64
72
  // 迁移后立即把新开场白落盘为独立会话文件,并更新「上一轮会话 id」指针,
65
73
  // 避免迁移发生在 onAfterSend(ConversationPersistPlugin 的 onInnerLoopEnd
66
74
  // 已不再触发)导致迁移后的新对话未被及时落盘、用户中途退出时丢失。
67
75
  try {
68
- const existing = await conversationRepository.read(id);
69
- const now = new Date().toISOString();
70
- await conversationRepository.write({
76
+ await persistConversation({
71
77
  id,
72
- agentId: ctx.agentId || "default",
78
+ agentId: ctx.agentId,
73
79
  messages: hctx.agent.messages,
74
80
  cwd: process.cwd(),
75
- createdAt: existing?.createdAt ?? now,
76
- updatedAt: now,
77
81
  });
78
- await writeLastSession(process.cwd(), id);
79
82
  }
80
83
  catch (err) {
81
- log(`⚠️ 迁移后会话落盘失败:${err?.message ?? err}`);
84
+ log(t("handoff.persistFailed", { error: err?.message ?? err }));
82
85
  }
83
86
  },
84
87
  });
@@ -1 +1 @@
1
- {"version":3,"file":"handoff-service.js","sourceRoot":"","sources":["../src/handoff-service.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,GAGf,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,gBAAgB,EAChB,sBAAsB,EACtB,sBAAsB,GACvB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAGnD,uBAAuB;AACvB,MAAM,UAAU,YAAY,CAAC,IAAiB;IAC5C,OAAO,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC;AAClD,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,oBAAoB,CAClC,GAAwB,EACxB,UAII,EAAE;IAEN,6DAA6D;IAC7D,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IAEtC,OAAO,IAAI,cAAc,CAAC;QACxB,uBAAuB;QACvB,UAAU,EAAE,OAAO,CAAC,UAAU,IAAI,oBAAoB;QACtD,yCAAyC;QACzC,QAAQ,EAAE,OAAO;QACjB,oDAAoD;QACpD,SAAS,EAAE,aAAa,EAAE;QAC1B,eAAe,EAAE,CAAC,IAAoB,EAAE,EAAE;YACxC,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,IAAI,IAAI,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC;YACvE,IAAI,MAAM,EAAE,CAAC;gBACX,GAAG,CACD,iBAAiB,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,aAAa,iBAAiB,YAAY,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAC9G,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,GAAG,CAAC,iBAAiB,YAAY,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;YAC7D,CAAC;QACH,CAAC;QACD,SAAS,EAAE,KAAK,EAAE,IAAoB,EAAE,EAAE;YACxC,0BAA0B;YAC1B,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,aAAa,EAAE,CAAC;gBACrC,GAAG,CAAC,MAAM,YAAY,CAAC,IAAI,CAAC,aAAa,CAAC,cAAc,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACrF,CAAC;YACD,GAAG,CAAC,WAAW,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;YAEnC,mCAAmC;YACnC,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;gBACnB,MAAM,gBAAgB,CAAC,GAAG,CAAC,CAAC;gBAC5B,GAAG,CAAC,YAAY,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC;YACrC,CAAC;QACH,CAAC;QACD,UAAU,EAAE,KAAK,EAAE,IAAoB,EAAE,EAAE;YACzC,6CAA6C;YAC7C,oDAAoD;YACpD,0EAA0E;YAC1E,yCAAyC;YACzC,wCAAwC;YACxC,mBAAmB;YACnB,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,SAAS,CAAC;YAEjC,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,4BAA4B,CAAC,CAAC;YAElC,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,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
+ {"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,CAwSrC,CAAC"}