@ai-zen/cli 1.0.0-alpha.9 → 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 +1334 -275
  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 +708 -261
  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 -66
  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
package/dist/config.d.ts CHANGED
@@ -17,6 +17,13 @@
17
17
  * ├── conversations/ ← 对话记录
18
18
  * └── last-session.json ← 「各 cwd 上一轮会话 id」指针(cwd → id)
19
19
  *
20
+ * 项目/.ai-zen/ ← 项目级配置与产物
21
+ * ├── skills/ ← 项目级 Skill
22
+ * ├── tools/ ← 项目级工具
23
+ * ├── sub-agents/ ← 项目级子 Agent
24
+ * ├── mcp.json ← 项目级 MCP 配置
25
+ * └── handoffs/ ← 交接文档(任务交接的落盘产物)
26
+ *
20
27
  * ~/.agents/ ← 业界通用规范(如 Cursor、Windsurf、Cline)
21
28
  * ├── skills/ ← 用户级 Skill
22
29
  * └── mcp.json ← 用户级 MCP 配置
@@ -38,28 +45,57 @@
38
45
  * 3. ~/.ai-zen/skills/
39
46
  * 4. ~/.agents/skills/
40
47
  */
41
- import type { AppConfig } from "@ai-zen/agents-sdk";
42
- export declare const AI_ZEN_DIR: string;
43
- export declare const CLI_DIR: string;
44
- export declare const CONFIG_FILE: string;
45
- export declare const CONVERSATIONS_DIR: string;
46
- export declare const AGENTS_DIR: string;
47
- export declare const SUB_AGENTS_DIR: string;
48
- export declare const SKILLS_DIR: string;
49
- export declare const TOOLS_DIR: string;
48
+ import type { AppConfig, ReasoningPresets } from "@ai-zen/agents-sdk";
49
+ /**
50
+ * 全部路径都导出为 `let`:ESM 的 import 是**活绑定**,导入方每次取值都读到最新值
51
+ * (实测:跨模块 import 的常量在 `refreshPaths()` 之后立刻是新目录),所以 `refreshPaths()`
52
+ * 不需要召回任何引用点。
53
+ *
54
+ * **会失效的是快照**:在模块顶层把路径塞进常量或实例(`const POINTER_FILE = join(CLI_DIR, …)`、
55
+ * `new Repo(CONVERSATIONS_DIR)`、`new ConfigManager(CONFIG_FILE)`)—— 那个值在模块求值那一刻就定死了。
56
+ * 这类地方一律改成函数(`pointerFile()` / `conversationRepository()` / `configManager()`),
57
+ * 由调用时机决定读哪个目录。
58
+ */
59
+ export declare let AI_ZEN_DIR: string;
60
+ export declare let CLI_DIR: string;
61
+ export declare let CONFIG_FILE: string;
62
+ export declare let CONVERSATIONS_DIR: string;
63
+ export declare let AGENTS_DIR: string;
64
+ export declare let SUB_AGENTS_DIR: string;
65
+ export declare let SKILLS_DIR: string;
66
+ export declare let TOOLS_DIR: string;
50
67
  export declare const PROJECT_SUB_AGENTS_DIR: string;
51
68
  export declare const PROJECT_SKILLS_DIR: string;
52
69
  export declare const PROJECT_TOOLS_DIR: string;
53
- export declare const USER_AGENTS_SKILLS_DIR: string;
54
- export declare const USER_AGENTS_MCP_CONFIG_FILE: string;
70
+ /**
71
+ * 交接文档目录(项目级):`<cwd>/.ai-zen/handoffs/`。
72
+ *
73
+ * 交接文档是「人也能直接读」的产物,放在项目内便于随仓库共享/评审;
74
+ * 目录由交接时的 write 工具或服务落盘时自动创建,无需预先建立。
75
+ */
76
+ export declare const PROJECT_HANDOFFS_DIR: string;
77
+ export declare let USER_AGENTS_SKILLS_DIR: string;
78
+ export declare let USER_AGENTS_MCP_CONFIG_FILE: string;
55
79
  export declare const PROJECT_AGENTS_DIR: string;
56
80
  export declare const PROJECT_AGENTS_SKILLS_DIR: string;
57
81
  export declare const PROJECT_AGENTS_MCP_CONFIG_FILE: string;
58
- export declare const MCP_CONFIG_FILE: string;
82
+ export declare let MCP_CONFIG_FILE: string;
59
83
  export declare const PROJECT_MCP_CONFIG_FILE: string;
60
84
  export declare const SHARED_MCP_CONFIG_FILE: string;
61
85
  /**
62
- * 确保配置目录和默认文件存在。
86
+ * 重新解析全部路径(**仅测试使用**)。
87
+ *
88
+ * 生产代码从不在运行期改 `AI_ZEN_DIR`,所以业务路径上不需要调用它。它存在只是因为
89
+ * 测试会给每个用例换一个临时目录,而进程内共享模块(`vitest isolate: false`)时,
90
+ * 模块顶层的路径常量只在首次加载时算过一次。
91
+ *
92
+ * 调用后:导入方靠活绑定自动看到新值(见文件顶部注释);持有快照的模块由各自的
93
+ * 工厂/重置负责 —— 测试侧统一走 `src/test-support/temp-dir.ts` 的 `useTempAiZenDir()`,
94
+ * 它保证「设 env + 刷新路径 + 收尾还原」三件事一起做。
95
+ */
96
+ export declare function refreshPaths(): void;
97
+ /**
98
+ * 确保配置目录和默认文件存在(进程内只真正执行一次)。
63
99
  *
64
100
  * 共享实体(Agent、SubAgent、Skill 目录等)委托给 SDK 的 ConfigManager.bootstrap()。
65
101
  * CLI 自身的运行时目录(conversations/)由本函数额外创建。
@@ -67,6 +103,13 @@ export declare const SHARED_MCP_CONFIG_FILE: string;
67
103
  */
68
104
  export declare function ensureConfigDir(): Promise<void>;
69
105
  export declare function readConfig(): Promise<AppConfig>;
106
+ /**
107
+ * 读取思考策略表(`~/.ai-zen/reasoning-presets.json`)。
108
+ *
109
+ * 这张表**只属于 CLI**:档位与参数补丁的对应关系是产品的编织知识,不在 SDK 里。
110
+ * 文件缺失或损坏时回落到出厂种子。
111
+ */
112
+ export declare function readReasoningPresets(): Promise<ReasoningPresets>;
70
113
  export declare function saveConfig(config: AppConfig): Promise<void>;
71
114
  /** MCP 配置的作用域:全局(~/.ai-zen/mcp.json) / 项目(<cwd>/.ai-zen/mcp.json) */
72
115
  export type McpScope = "global" | "project";
@@ -101,10 +144,26 @@ export interface McpConfig {
101
144
  /** 作用域对应的 mcp.json 路径 */
102
145
  export declare function mcpConfigPath(scope: McpScope): string;
103
146
  /**
104
- * 读取指定路径的 mcp.json,不存在 / 解析失败时返回空结构。
147
+ * 读取 mcp.json 的结果。
148
+ *
149
+ * 「文件不存在」与「读取 / 解析失败」必须分开:前者是正常的空配置,后者是文件已损坏。
150
+ * 以前两者都返回 `{ mcpServers: {} }`,于是损坏的文件在配置中心里看起来「没有服务器」,
151
+ * 用户一保存就把原内容整个覆盖掉 —— 静默丢数据。
152
+ */
153
+ export type McpReadResult = {
154
+ ok: true;
155
+ config: McpConfig;
156
+ } | {
157
+ ok: false;
158
+ error: string;
159
+ };
160
+ /** 读失败时按空配置继续(仅用于「读来只为做判断」的场景;界面上要显示损坏由编辑屏负责) */
161
+ export declare function mcpConfigOrEmpty(result: McpReadResult): McpConfig;
162
+ /**
163
+ * 读取指定路径的 mcp.json。
105
164
  * 采用业界标准 `mcpServers` 顶层字段(与 SDK discoverMcpServers 一致)。
106
165
  */
107
- export declare function readMcpConfigAt(path: string): Promise<McpConfig>;
166
+ export declare function readMcpConfigAt(path: string): Promise<McpReadResult>;
108
167
  /**
109
168
  * 原子写入指定路径的 mcp.json(必要时创建父目录)。
110
169
  */
@@ -112,11 +171,11 @@ export declare function writeMcpConfigAt(path: string, mcpConfig: McpConfig): Pr
112
171
  /**
113
172
  * 读取某个作用域的 mcp.json(默认全局 ~/.ai-zen/mcp.json)。
114
173
  */
115
- export declare function readMcpConfig(scope?: McpScope): Promise<McpConfig>;
174
+ export declare function readMcpConfig(scope?: McpScope): Promise<McpReadResult>;
116
175
  /**
117
176
  * 原子写入某个作用域的 mcp.json(默认全局 ~/.ai-zen/mcp.json)。
118
177
  */
119
178
  export declare function writeMcpConfig(mcpConfig: McpConfig, scope?: McpScope): Promise<void>;
120
179
  /** 读取项目级 <cwd>/.ai-zen/mcp.json(等价于 readMcpConfig("project")) */
121
- export declare function readProjectMcpConfig(): Promise<McpConfig>;
180
+ export declare function readProjectMcpConfig(): Promise<McpReadResult>;
122
181
  //# sourceMappingURL=config.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
package/dist/config.js CHANGED
@@ -17,6 +17,13 @@
17
17
  * ├── conversations/ ← 对话记录
18
18
  * └── last-session.json ← 「各 cwd 上一轮会话 id」指针(cwd → id)
19
19
  *
20
+ * 项目/.ai-zen/ ← 项目级配置与产物
21
+ * ├── skills/ ← 项目级 Skill
22
+ * ├── tools/ ← 项目级工具
23
+ * ├── sub-agents/ ← 项目级子 Agent
24
+ * ├── mcp.json ← 项目级 MCP 配置
25
+ * └── handoffs/ ← 交接文档(任务交接的落盘产物)
26
+ *
20
27
  * ~/.agents/ ← 业界通用规范(如 Cursor、Windsurf、Cline)
21
28
  * ├── skills/ ← 用户级 Skill
22
29
  * └── mcp.json ← 用户级 MCP 配置
@@ -40,94 +47,191 @@
40
47
  */
41
48
  import { promises as fs } from "fs";
42
49
  import { dirname, join } from "path";
43
- import { ConfigManager as SdkConfigManager } from "@ai-zen/agents-sdk";
50
+ import { ConfigManager as SdkConfigManager, getLogger } from "@ai-zen/agents-sdk";
51
+ import { t } from "./i18n/index.js";
44
52
  // ==================== 根目录 ====================
45
- export const AI_ZEN_DIR = process.env.AI_ZEN_DIR || join(process.env.HOME || process.env.USERPROFILE || "", ".ai-zen");
53
+ /**
54
+ * 解析配置根目录:显式 `AI_ZEN_DIR` 优先,否则 `$HOME/.ai-zen`。
55
+ *
56
+ * 单独抽成函数是为了让 {@link refreshPaths} 能在测试用例之间重算。
57
+ */
58
+ function resolveRoot() {
59
+ return (process.env.AI_ZEN_DIR || join(process.env.HOME || process.env.USERPROFILE || "", ".ai-zen"));
60
+ }
61
+ /**
62
+ * 全部路径都导出为 `let`:ESM 的 import 是**活绑定**,导入方每次取值都读到最新值
63
+ * (实测:跨模块 import 的常量在 `refreshPaths()` 之后立刻是新目录),所以 `refreshPaths()`
64
+ * 不需要召回任何引用点。
65
+ *
66
+ * **会失效的是快照**:在模块顶层把路径塞进常量或实例(`const POINTER_FILE = join(CLI_DIR, …)`、
67
+ * `new Repo(CONVERSATIONS_DIR)`、`new ConfigManager(CONFIG_FILE)`)—— 那个值在模块求值那一刻就定死了。
68
+ * 这类地方一律改成函数(`pointerFile()` / `conversationRepository()` / `configManager()`),
69
+ * 由调用时机决定读哪个目录。
70
+ */
71
+ export let AI_ZEN_DIR = resolveRoot();
46
72
  // ==================== CLI 运行时目录 ====================
47
- export const CLI_DIR = join(AI_ZEN_DIR, "cli");
48
- export const CONFIG_FILE = join(AI_ZEN_DIR, "config.json");
49
- export const CONVERSATIONS_DIR = join(CLI_DIR, "conversations");
73
+ export let CLI_DIR = join(AI_ZEN_DIR, "cli");
74
+ export let CONFIG_FILE = join(AI_ZEN_DIR, "config.json");
75
+ export let CONVERSATIONS_DIR = join(CLI_DIR, "conversations");
50
76
  // ==================== 共享目录 ====================
51
- export const AGENTS_DIR = join(AI_ZEN_DIR, "agents");
52
- export const SUB_AGENTS_DIR = join(AI_ZEN_DIR, "sub-agents");
53
- export const SKILLS_DIR = join(AI_ZEN_DIR, "skills");
54
- export const TOOLS_DIR = join(AI_ZEN_DIR, "tools");
77
+ export let AGENTS_DIR = join(AI_ZEN_DIR, "agents");
78
+ export let SUB_AGENTS_DIR = join(AI_ZEN_DIR, "sub-agents");
79
+ export let SKILLS_DIR = join(AI_ZEN_DIR, "skills");
80
+ export let TOOLS_DIR = join(AI_ZEN_DIR, "tools");
55
81
  // ==================== 项目级目录(基于 CWD)====================
56
82
  export const PROJECT_SUB_AGENTS_DIR = join(process.cwd(), ".ai-zen", "sub-agents");
57
83
  export const PROJECT_SKILLS_DIR = join(process.cwd(), ".ai-zen", "skills");
58
84
  export const PROJECT_TOOLS_DIR = join(process.cwd(), ".ai-zen", "tools");
85
+ /**
86
+ * 交接文档目录(项目级):`<cwd>/.ai-zen/handoffs/`。
87
+ *
88
+ * 交接文档是「人也能直接读」的产物,放在项目内便于随仓库共享/评审;
89
+ * 目录由交接时的 write 工具或服务落盘时自动创建,无需预先建立。
90
+ */
91
+ export const PROJECT_HANDOFFS_DIR = join(process.cwd(), ".ai-zen", "handoffs");
59
92
  // ==================== 业界通用规范 ~/.agents/ 目录 ====================
60
- const USER_AGENTS_DIR = join(process.env.HOME || process.env.USERPROFILE || "", ".agents");
61
- export const USER_AGENTS_SKILLS_DIR = join(USER_AGENTS_DIR, "skills");
62
- export const USER_AGENTS_MCP_CONFIG_FILE = join(USER_AGENTS_DIR, "mcp.json");
93
+ function resolveUserAgentsDir() {
94
+ return join(process.env.HOME || process.env.USERPROFILE || "", ".agents");
95
+ }
96
+ let USER_AGENTS_DIR = resolveUserAgentsDir();
97
+ export let USER_AGENTS_SKILLS_DIR = join(USER_AGENTS_DIR, "skills");
98
+ export let USER_AGENTS_MCP_CONFIG_FILE = join(USER_AGENTS_DIR, "mcp.json");
63
99
  // ==================== 业界通用规范 项目/.agents/ 目录 ====================
64
100
  export const PROJECT_AGENTS_DIR = join(process.cwd(), ".agents");
65
101
  export const PROJECT_AGENTS_SKILLS_DIR = join(PROJECT_AGENTS_DIR, "skills");
66
102
  export const PROJECT_AGENTS_MCP_CONFIG_FILE = join(PROJECT_AGENTS_DIR, "mcp.json");
67
103
  // ==================== MCP 配置 ====================
68
- export const MCP_CONFIG_FILE = join(AI_ZEN_DIR, "mcp.json");
104
+ export let MCP_CONFIG_FILE = join(AI_ZEN_DIR, "mcp.json");
69
105
  export const PROJECT_MCP_CONFIG_FILE = join(process.cwd(), ".ai-zen", "mcp.json");
70
106
  export const SHARED_MCP_CONFIG_FILE = join(process.cwd(), ".mcp.json");
71
107
  // ==================== SDK ConfigManager ====================
72
- const sdkConfigMgr = new SdkConfigManager(CONFIG_FILE);
108
+ /**
109
+ * 按**当前** `CONFIG_FILE` 造一个 ConfigManager。
110
+ *
111
+ * 不缓存实例:`ConfigManager` 在构造时固化路径,缓存它等于把路径也缓存了 ——
112
+ * 进程内共享模块时(测试换 `AI_ZEN_DIR`)就会一直读写旧目录。构造本身很轻,
113
+ * 重活(bootstrap / 解析)在 `read()` 里,且由 `ensureConfigDir()` 兜住只做一次。
114
+ */
115
+ function configManager() {
116
+ return new SdkConfigManager(CONFIG_FILE);
117
+ }
73
118
  // ==================== 目录初始化 ====================
74
119
  /**
75
- * 确保配置目录和默认文件存在。
120
+ * 一次性初始化的 Promise(进程生命周期内只跑一次)。
121
+ *
122
+ * 为什么必须缓存 **Promise** 而不是「已初始化」布尔:`readConfig()` 内部就会调它,而
123
+ * `readConfig()` 被 TUI 的 effect、命令层、`createAgent()`、`getScope()` 反复调用 ——
124
+ * 等于每次读配置都重跑一遍全量初始化(bootstrap + 多次 stat/mkdir)。而布尔判据在
125
+ * `await` 窗口期内不成立,并发调用会一起穿透、重复 bootstrap。
126
+ */
127
+ let initPromise = null;
128
+ /**
129
+ * 重新解析全部路径(**仅测试使用**)。
130
+ *
131
+ * 生产代码从不在运行期改 `AI_ZEN_DIR`,所以业务路径上不需要调用它。它存在只是因为
132
+ * 测试会给每个用例换一个临时目录,而进程内共享模块(`vitest isolate: false`)时,
133
+ * 模块顶层的路径常量只在首次加载时算过一次。
134
+ *
135
+ * 调用后:导入方靠活绑定自动看到新值(见文件顶部注释);持有快照的模块由各自的
136
+ * 工厂/重置负责 —— 测试侧统一走 `src/test-support/temp-dir.ts` 的 `useTempAiZenDir()`,
137
+ * 它保证「设 env + 刷新路径 + 收尾还原」三件事一起做。
138
+ */
139
+ export function refreshPaths() {
140
+ AI_ZEN_DIR = resolveRoot();
141
+ CLI_DIR = join(AI_ZEN_DIR, "cli");
142
+ CONFIG_FILE = join(AI_ZEN_DIR, "config.json");
143
+ CONVERSATIONS_DIR = join(CLI_DIR, "conversations");
144
+ AGENTS_DIR = join(AI_ZEN_DIR, "agents");
145
+ SUB_AGENTS_DIR = join(AI_ZEN_DIR, "sub-agents");
146
+ SKILLS_DIR = join(AI_ZEN_DIR, "skills");
147
+ TOOLS_DIR = join(AI_ZEN_DIR, "tools");
148
+ MCP_CONFIG_FILE = join(AI_ZEN_DIR, "mcp.json");
149
+ USER_AGENTS_DIR = resolveUserAgentsDir();
150
+ USER_AGENTS_SKILLS_DIR = join(USER_AGENTS_DIR, "skills");
151
+ USER_AGENTS_MCP_CONFIG_FILE = join(USER_AGENTS_DIR, "mcp.json");
152
+ // 一次性初始化缓存是按旧目录算的,必须作废,否则新目录永远不会被 bootstrap
153
+ initPromise = null;
154
+ }
155
+ /**
156
+ * 确保配置目录和默认文件存在(进程内只真正执行一次)。
76
157
  *
77
158
  * 共享实体(Agent、SubAgent、Skill 目录等)委托给 SDK 的 ConfigManager.bootstrap()。
78
159
  * CLI 自身的运行时目录(conversations/)由本函数额外创建。
79
160
  * SDK 的出厂默认配置会自动写入 config.json(如果不存在)。
80
161
  */
81
162
  export async function ensureConfigDir() {
82
- // SDK bootstrap:目录 + config.json + default Agent + default SubAgent
83
- await sdkConfigMgr.bootstrap();
84
- // CLI 运行时目录
85
- const cliDirs = [CLI_DIR, CONVERSATIONS_DIR];
86
- for (const dir of cliDirs) {
163
+ if (!initPromise) {
164
+ initPromise = initOnce().catch((error) => {
165
+ // 失败不缓存:否则一次瞬时故障(如磁盘短暂只读)会让整个进程永久失能
166
+ initPromise = null;
167
+ throw error;
168
+ });
169
+ }
170
+ return initPromise;
171
+ }
172
+ async function initOnce() {
173
+ // SDK bootstrap:目录 + config.json + default Agent + default SubAgent + 出厂思考策略表
174
+ await configManager().bootstrap();
175
+ // CLI 运行时目录(recursive 模式已存在时不报错,无需先 access 探测)
176
+ for (const dir of [CLI_DIR, CONVERSATIONS_DIR]) {
87
177
  try {
88
- await fs.access(dir);
178
+ await fs.mkdir(dir, { recursive: true });
89
179
  }
90
- catch {
91
- try {
92
- await fs.mkdir(dir, { recursive: true });
93
- }
94
- catch {
95
- console.warn(`⚠️ 无法创建目录: ${dir}`);
96
- }
180
+ catch (error) {
181
+ // 走统一日志出口:TUI 下已改道落盘、stdio 下走 stderr。
182
+ // 这里不能用 console.warn —— 那会绕过日志系统,界面里看不见、日志文件里也查不到。
183
+ getLogger().warn(t("app.mkdirFailed", { dir, error: error?.message ?? error }));
97
184
  }
98
185
  }
99
186
  }
100
187
  // ==================== 配置读写 ====================
101
188
  export async function readConfig() {
102
189
  await ensureConfigDir();
103
- return await sdkConfigMgr.read();
190
+ return await configManager().read();
191
+ }
192
+ /**
193
+ * 读取思考策略表(`~/.ai-zen/reasoning-presets.json`)。
194
+ *
195
+ * 这张表**只属于 CLI**:档位与参数补丁的对应关系是产品的编织知识,不在 SDK 里。
196
+ * 文件缺失或损坏时回落到出厂种子。
197
+ */
198
+ export async function readReasoningPresets() {
199
+ // 表归 SDK 管(CLI / 桌面端共享),此处只做透传;缺失/损坏时 SDK 会回落出厂种子
200
+ return await configManager().readReasoningPresets();
104
201
  }
105
202
  export async function saveConfig(config) {
106
203
  await ensureConfigDir();
107
- await sdkConfigMgr.write(config);
204
+ await configManager().write(config);
108
205
  }
109
206
  /** 作用域对应的 mcp.json 路径 */
110
207
  export function mcpConfigPath(scope) {
111
208
  return scope === "project" ? PROJECT_MCP_CONFIG_FILE : MCP_CONFIG_FILE;
112
209
  }
210
+ /** 读失败时按空配置继续(仅用于「读来只为做判断」的场景;界面上要显示损坏由编辑屏负责) */
211
+ export function mcpConfigOrEmpty(result) {
212
+ return result.ok ? result.config : { mcpServers: {} };
213
+ }
113
214
  /**
114
- * 读取指定路径的 mcp.json,不存在 / 解析失败时返回空结构。
215
+ * 读取指定路径的 mcp.json。
115
216
  * 采用业界标准 `mcpServers` 顶层字段(与 SDK discoverMcpServers 一致)。
116
217
  */
117
218
  export async function readMcpConfigAt(path) {
219
+ let raw;
118
220
  try {
119
- await fs.access(path);
221
+ raw = await fs.readFile(path, "utf-8");
120
222
  }
121
- catch {
122
- return { mcpServers: {} };
223
+ catch (cause) {
224
+ // 只有「文件不存在」算正常空配置;权限 / 是目录这类真错误照样报上去
225
+ if (cause?.code === "ENOENT")
226
+ return { ok: true, config: { mcpServers: {} } };
227
+ return { ok: false, error: cause?.message ?? String(cause) };
123
228
  }
124
229
  try {
125
- const raw = JSON.parse(await fs.readFile(path, "utf-8"));
126
- // 兼容并归一:以 mcpServers 为准,缺失时回退到空的 mcpServers
127
- return { mcpServers: raw.mcpServers ?? {} };
230
+ const parsed = JSON.parse(raw);
231
+ return { ok: true, config: { mcpServers: parsed.mcpServers ?? {} } };
128
232
  }
129
- catch {
130
- return { mcpServers: {} };
233
+ catch (cause) {
234
+ return { ok: false, error: cause?.message ?? String(cause) };
131
235
  }
132
236
  }
133
237
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8CG;AAEH,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,IAAI,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,aAAa,IAAI,gBAAgB,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAElF,OAAO,EAAE,CAAC,EAAE,MAAM,iBAAiB,CAAC;AAEpC,gDAAgD;AAEhD;;;;GAIG;AACH,SAAS,WAAW;IAClB,OAAO,CACL,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,EAAE,EAAE,SAAS,CAAC,CAC7F,CAAC;AACJ,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,CAAC,IAAI,UAAU,GAAG,WAAW,EAAE,CAAC;AAEtC,sDAAsD;AAEtD,MAAM,CAAC,IAAI,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;AAC7C,MAAM,CAAC,IAAI,WAAW,GAAG,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;AACzD,MAAM,CAAC,IAAI,iBAAiB,GAAG,IAAI,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;AAE9D,iDAAiD;AAEjD,MAAM,CAAC,IAAI,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;AACnD,MAAM,CAAC,IAAI,cAAc,GAAG,IAAI,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;AAC3D,MAAM,CAAC,IAAI,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;AACnD,MAAM,CAAC,IAAI,SAAS,GAAG,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;AAEjD,yDAAyD;AAEzD,MAAM,CAAC,MAAM,sBAAsB,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC;AACnF,MAAM,CAAC,MAAM,kBAAkB,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;AAC3E,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;AACzE;;;;;GAKG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;AAE/E,iEAAiE;AAEjE,SAAS,oBAAoB;IAC3B,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,EAAE,EAAE,SAAS,CAAC,CAAC;AAC5E,CAAC;AAED,IAAI,eAAe,GAAG,oBAAoB,EAAE,CAAC;AAE7C,MAAM,CAAC,IAAI,sBAAsB,GAAG,IAAI,CAAC,eAAe,EAAE,QAAQ,CAAC,CAAC;AACpE,MAAM,CAAC,IAAI,2BAA2B,GAAG,IAAI,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC;AAE3E,kEAAkE;AAElE,MAAM,CAAC,MAAM,kBAAkB,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,SAAS,CAAC,CAAC;AACjE,MAAM,CAAC,MAAM,yBAAyB,GAAG,IAAI,CAAC,kBAAkB,EAAE,QAAQ,CAAC,CAAC;AAC5E,MAAM,CAAC,MAAM,8BAA8B,GAAG,IAAI,CAAC,kBAAkB,EAAE,UAAU,CAAC,CAAC;AAEnF,mDAAmD;AAEnD,MAAM,CAAC,IAAI,eAAe,GAAG,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;AAC1D,MAAM,CAAC,MAAM,uBAAuB,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;AAClF,MAAM,CAAC,MAAM,sBAAsB,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,WAAW,CAAC,CAAC;AAEvE,8DAA8D;AAE9D;;;;;;GAMG;AACH,SAAS,aAAa;IACpB,OAAO,IAAI,gBAAgB,CAAC,WAAW,CAAC,CAAC;AAC3C,CAAC;AAED,kDAAkD;AAElD;;;;;;;GAOG;AACH,IAAI,WAAW,GAAyB,IAAI,CAAC;AAE7C;;;;;;;;;;GAUG;AACH,MAAM,UAAU,YAAY;IAC1B,UAAU,GAAG,WAAW,EAAE,CAAC;IAC3B,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;IAClC,WAAW,GAAG,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;IAC9C,iBAAiB,GAAG,IAAI,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;IACnD,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;IACxC,cAAc,GAAG,IAAI,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;IAChD,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;IACxC,SAAS,GAAG,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IACtC,eAAe,GAAG,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;IAC/C,eAAe,GAAG,oBAAoB,EAAE,CAAC;IACzC,sBAAsB,GAAG,IAAI,CAAC,eAAe,EAAE,QAAQ,CAAC,CAAC;IACzD,2BAA2B,GAAG,IAAI,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC;IAChE,4CAA4C;IAC5C,WAAW,GAAG,IAAI,CAAC;AACrB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe;IACnC,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,WAAW,GAAG,QAAQ,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;YACvC,oCAAoC;YACpC,WAAW,GAAG,IAAI,CAAC;YACnB,MAAM,KAAK,CAAC;QACd,CAAC,CAAC,CAAC;IACL,CAAC;IACD,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,KAAK,UAAU,QAAQ;IACrB,8EAA8E;IAC9E,MAAM,aAAa,EAAE,CAAC,SAAS,EAAE,CAAC;IAElC,+CAA+C;IAC/C,KAAK,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,iBAAiB,CAAC,EAAE,CAAC;QAC/C,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3C,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,sCAAsC;YACtC,mDAAmD;YACnD,SAAS,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,iBAAiB,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC;QAClF,CAAC;IACH,CAAC;AACH,CAAC;AAED,iDAAiD;AAEjD,MAAM,CAAC,KAAK,UAAU,UAAU;IAC9B,MAAM,eAAe,EAAE,CAAC;IACxB,OAAO,MAAM,aAAa,EAAE,CAAC,IAAI,EAAE,CAAC;AACtC,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB;IACxC,kDAAkD;IAClD,OAAO,MAAM,aAAa,EAAE,CAAC,oBAAoB,EAAE,CAAC;AACtD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,MAAiB;IAChD,MAAM,eAAe,EAAE,CAAC;IACxB,MAAM,aAAa,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;AACtC,CAAC;AAsCD,yBAAyB;AACzB,MAAM,UAAU,aAAa,CAAC,KAAe;IAC3C,OAAO,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,eAAe,CAAC;AACzE,CAAC;AAWD,iDAAiD;AACjD,MAAM,UAAU,gBAAgB,CAAC,MAAqB;IACpD,OAAO,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC;AACxD,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,IAAY;IAChD,IAAI,GAAW,CAAC;IAChB,IAAI,CAAC;QACH,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACzC,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,qCAAqC;QACrC,IAAI,KAAK,EAAE,IAAI,KAAK,QAAQ;YAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,EAAE,CAAC;QAC9E,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;IAC/D,CAAC;IACD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAuB,CAAC;QACrD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,IAAI,EAAE,EAAE,EAAE,CAAC;IACvE,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;IAC/D,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,IAAY,EAAE,SAAoB;IACvE,MAAM,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACnD,MAAM,GAAG,GAAG,IAAI,GAAG,MAAM,CAAC;IAC1B,MAAM,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IACrE,MAAM,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;AAC7B,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,KAAK,GAAa,QAAQ;IAC5D,OAAO,eAAe,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;AAC/C,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,SAAoB,EAAE,KAAK,GAAa,QAAQ;IACnF,MAAM,gBAAgB,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,SAAS,CAAC,CAAC;AAC1D,CAAC;AAED,iEAAiE;AACjE,MAAM,CAAC,KAAK,UAAU,oBAAoB;IACxC,OAAO,eAAe,CAAC,uBAAuB,CAAC,CAAC;AAClD,CAAC"}
@@ -13,12 +13,134 @@ export interface CommandMeta {
13
13
  /** 主命令名(不含 `/` 前缀),同时是处理函数表的键 */
14
14
  name: string;
15
15
  /** 等价别名(不含 `/` 前缀) */
16
- aliases?: string[];
17
- /** 一句话说明 */
18
- description: string;
16
+ aliases?: readonly string[];
17
+ /**
18
+ * 一句话说明的 i18n key。
19
+ *
20
+ * 这里存 **key 而不是文案**:本模块是纯数据,加载时机靠前(甚至早于语言初始化),
21
+ * 存成文案就定死了「加载那一刻的语言」。渲染时由 `getCommandHints()` 用 `t()` 现取。
22
+ */
23
+ descriptionKey: string;
24
+ /**
25
+ * 执行期间会调用模型(较慢,几十秒)。
26
+ *
27
+ * 宿主据此**拦住输入框**:否则用户以为没反应、继续打字,按键会被静默吞进隐藏的
28
+ * 输入缓冲,等命令结束后才突然冒出来(迁移过程中出现过这个 bug)。
29
+ * 这是命令的属性而不是宿主的白名单 —— 新增命令只改本文件,宿主自动跟上。
30
+ */
31
+ blocksInput?: boolean;
19
32
  }
20
- /** 命令元数据表(数组顺序即展示顺序) */
33
+ /**
34
+ * 命令元数据表(数组顺序即展示顺序)。
35
+ *
36
+ * 用 `as const` 声明以保留命令名的字面量类型,从而派生出 `CommandName`:
37
+ * 命令处理器表以 `Record<CommandName, …>` 声明,于是「新增命令但忘了写处理器」是
38
+ * **编译错误**,而不是运行时静默落到「未知命令」。
39
+ *
40
+ * 但 `as const` 的代价是联合类型里**没有别名的条目压根没有 `aliases` 字段**,
41
+ * 遍历时访问会报错。所以这里只把它作为内部字面量,对外导出的
42
+ * {@link COMMAND_REGISTRY} 放宽成 `readonly CommandMeta[]` —— 类型保护一分不少,
43
+ * 而所有遍历点都能直接读 `command.aliases`,不需要额外的取值 helper。
44
+ */
45
+ declare const REGISTRY_ENTRIES: readonly [{
46
+ readonly name: "save";
47
+ readonly descriptionKey: "cmd.save.desc";
48
+ }, {
49
+ readonly name: "load";
50
+ readonly descriptionKey: "cmd.load.desc";
51
+ }, {
52
+ readonly name: "new";
53
+ readonly descriptionKey: "cmd.new.desc";
54
+ }, {
55
+ readonly name: "back";
56
+ readonly descriptionKey: "cmd.back.desc";
57
+ }, {
58
+ readonly name: "editor";
59
+ readonly descriptionKey: "cmd.editor.desc";
60
+ }, {
61
+ readonly name: "clear";
62
+ readonly descriptionKey: "cmd.clear.desc";
63
+ }, {
64
+ readonly name: "config";
65
+ readonly descriptionKey: "cmd.config.desc";
66
+ }, {
67
+ readonly name: "model";
68
+ readonly descriptionKey: "cmd.model.desc";
69
+ }, {
70
+ readonly name: "agent";
71
+ readonly descriptionKey: "cmd.agent.desc";
72
+ }, {
73
+ readonly name: "reload";
74
+ readonly descriptionKey: "cmd.reload.desc";
75
+ }, {
76
+ readonly name: "update";
77
+ readonly descriptionKey: "cmd.update.desc";
78
+ readonly blocksInput: true;
79
+ }, {
80
+ readonly name: "mcp";
81
+ readonly descriptionKey: "cmd.mcp.desc";
82
+ }, {
83
+ readonly name: "lang";
84
+ readonly descriptionKey: "cmd.lang.desc";
85
+ }, {
86
+ readonly name: "think";
87
+ readonly aliases: readonly ["effort"];
88
+ readonly descriptionKey: "cmd.think.desc";
89
+ }, {
90
+ readonly name: "key";
91
+ readonly descriptionKey: "cmd.key.desc";
92
+ }, {
93
+ readonly name: "handoff";
94
+ readonly descriptionKey: "cmd.handoff.desc";
95
+ readonly blocksInput: true;
96
+ }, {
97
+ readonly name: "migrate";
98
+ readonly descriptionKey: "cmd.migrate.desc";
99
+ readonly blocksInput: true;
100
+ }, {
101
+ readonly name: "help";
102
+ readonly descriptionKey: "cmd.help.desc";
103
+ }, {
104
+ readonly name: "exit";
105
+ readonly aliases: readonly ["quit"];
106
+ readonly descriptionKey: "cmd.exit.desc";
107
+ }];
108
+ /** 命令主名的字面量联合(别名已归一到主名) */
109
+ export type CommandName = (typeof REGISTRY_ENTRIES)[number]["name"];
110
+ /** 命令元数据表:值来自上面的字面量,类型放宽到 `readonly CommandMeta[]` 便于遍历 */
21
111
  export declare const COMMAND_REGISTRY: readonly CommandMeta[];
112
+ /**
113
+ * 把命令名(含别名)归一到主名;未知命令返回 `undefined`。
114
+ *
115
+ * `/think` 与 `/effort` 是同一条命令的两种写法,处理器只按主名注册一份。
116
+ */
117
+ export declare function canonicalCommandName(name: string): CommandName | undefined;
118
+ /** 命中命令的元数据(别名可查) */
119
+ export declare function findCommand(name: string): CommandMeta | undefined;
120
+ /** 该命令执行期间是否应拦住输入框(见 {@link CommandMeta.blocksInput}) */
121
+ export declare function commandBlocksInput(name: string): boolean;
122
+ /**
123
+ * 从原始输入里取命令参数(首个 token 之后的全部 token)。
124
+ *
125
+ * 与 {@link parseCommandInput} 共用 {@link splitCommandInput},保证「命令名边界」与
126
+ * 「参数边界」用的是同一把尺子。
127
+ */
128
+ export declare function parseCommandArgs(text: string): string[];
129
+ /**
130
+ * 解析斜杠输入:`/migrate summary` → `{ name: "migrate", args: ["summary"] }`。
131
+ *
132
+ * 命令名的解析**只有这一处**:此前宿主自己也 `slice(1).split(/\s+/)[0]` 了一遍,
133
+ * 于是「命令名怎么算」在命令层与宿主层各有一份实现。
134
+ *
135
+ * 注意「只打了个 `/`」也算命令(`name` 为空串):宿主按斜杠前缀分流,空命令名
136
+ * 落到「未知命令」——与拆出本函数之前的行为一致。
137
+ *
138
+ * @returns 非斜杠输入返回 `null`
139
+ */
140
+ export declare function parseCommandInput(text: string): {
141
+ name: string;
142
+ args: string[];
143
+ } | null;
22
144
  /** 命令展示条目:等价写法(如 `/exit` `/quit`)折叠为一条 */
23
145
  export interface CommandHint {
24
146
  /** 全部等价写法(不含 `/` 前缀),首个为主命令名 */
@@ -42,4 +164,5 @@ export declare const COMMAND_LABEL_WIDTH: number;
42
164
  export declare function matchCommandHints(keyword: string): CommandHint[];
43
165
  /** 全部命令名(含别名,升序),供启动横幅等场景展示 */
44
166
  export declare function getCommandNames(): string[];
167
+ export {};
45
168
  //# sourceMappingURL=registry.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/conversation-commands/registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,iBAAiB;AACjB,MAAM,WAAW,WAAW;IAC1B,iCAAiC;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,sBAAsB;IACtB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,YAAY;IACZ,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,wBAAwB;AACxB,eAAO,MAAM,gBAAgB,EAAE,SAAS,WAAW,EAalD,CAAC;AAEF,0CAA0C;AAC1C,MAAM,WAAW,WAAW;IAC1B,gCAAgC;IAChC,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,6BAA6B;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,YAAY;IACZ,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,wBAAwB;AACxB,wBAAgB,eAAe,IAAI,WAAW,EAAE,CAS/C;AAED;;;GAGG;AACH,eAAO,MAAM,mBAAmB,QACqC,CAAC;AAEtE;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,EAAE,CAOhE;AAED,+BAA+B;AAC/B,wBAAgB,eAAe,IAAI,MAAM,EAAE,CAM1C"}
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/conversation-commands/registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,iBAAiB;AACjB,MAAM,WAAW,WAAW;IAC1B,iCAAiC;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,sBAAsB;IACtB,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC5B;;;;;OAKG;IACH,cAAc,EAAE,MAAM,CAAC;IACvB;;;;;;OAMG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED;;;;;;;;;;;GAWG;AACH,QAAA,MAAM,gBAAgB;mBACZ,MAAM;6BAAkB,eAAe;;mBACvC,MAAM;6BAAkB,eAAe;;mBACvC,KAAK;6BAAkB,cAAc;;mBACrC,MAAM;6BAAkB,eAAe;;mBACvC,QAAQ;6BAAkB,iBAAiB;;mBAC3C,OAAO;6BAAkB,gBAAgB;;mBACzC,QAAQ;6BAAkB,iBAAiB;;mBAC3C,OAAO;6BAAkB,gBAAgB;;mBACzC,OAAO;6BAAkB,gBAAgB;;mBACzC,QAAQ;6BAAkB,iBAAiB;;mBAC3C,QAAQ;6BAAkB,iBAAiB;;;mBAC3C,KAAK;6BAAkB,cAAc;;mBACrC,MAAM;6BAAkB,eAAe;;mBACvC,OAAO;;6BAAuC,gBAAgB;;mBAC9D,KAAK;6BAAkB,cAAc;;mBACrC,SAAS;6BAAkB,kBAAkB;;;mBAC7C,SAAS;6BAAkB,kBAAkB;;;mBAC7C,MAAM;6BAAkB,eAAe;;mBAEvC,MAAM;;6BAAqC,eAAe;EACzB,CAAC;AAE5C,2BAA2B;AAC3B,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC;AAEpE,2DAA2D;AAC3D,eAAO,MAAM,gBAAgB,EAAE,SAAS,WAAW,EAAqB,CAAC;AAEzE;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,CAO1E;AAED,qBAAqB;AACrB,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,CAGjE;AAED,yDAAyD;AACzD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAExD;AAcD;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAEvD;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,GAAG,IAAI,CAIvF;AAED,0CAA0C;AAC1C,MAAM,WAAW,WAAW;IAC1B,gCAAgC;IAChC,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,6BAA6B;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,YAAY;IACZ,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,wBAAwB;AACxB,wBAAgB,eAAe,IAAI,WAAW,EAAE,CAS/C;AAED;;;GAGG;AACH,eAAO,MAAM,mBAAmB,QACqC,CAAC;AAEtE;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,EAAE,CAOhE;AAED,+BAA+B;AAC/B,wBAAgB,eAAe,IAAI,MAAM,EAAE,CAM1C"}