@ai-zen/cli 0.9.0 → 1.0.0-alpha.1

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 (298) hide show
  1. package/CHANGELOG.md +42 -1
  2. package/README.md +94 -40
  3. package/README.zh.md +94 -40
  4. package/dist/agent-creator.d.ts +7 -1
  5. package/dist/agent-creator.d.ts.map +1 -1
  6. package/dist/agent-creator.js +16 -1
  7. package/dist/agent-creator.js.map +1 -1
  8. package/dist/agents-store.d.ts +33 -0
  9. package/dist/agents-store.d.ts.map +1 -0
  10. package/dist/agents-store.js +50 -0
  11. package/dist/agents-store.js.map +1 -0
  12. package/dist/auto-migrate-confirm-plugin.d.ts +7 -7
  13. package/dist/auto-migrate-confirm-plugin.d.ts.map +1 -1
  14. package/dist/auto-migrate-confirm-plugin.js +3 -21
  15. package/dist/auto-migrate-confirm-plugin.js.map +1 -1
  16. package/dist/config-editor.d.ts +201 -0
  17. package/dist/config-editor.d.ts.map +1 -0
  18. package/dist/config-editor.js +511 -0
  19. package/dist/config-editor.js.map +1 -0
  20. package/dist/config.d.ts +41 -16
  21. package/dist/config.d.ts.map +1 -1
  22. package/dist/config.js +32 -29
  23. package/dist/config.js.map +1 -1
  24. package/dist/conversation-commands/registry.d.ts +4 -5
  25. package/dist/conversation-commands/registry.d.ts.map +1 -1
  26. package/dist/conversation-commands/registry.js +9 -6
  27. package/dist/conversation-commands/registry.js.map +1 -1
  28. package/dist/conversation-persist-plugin.d.ts +25 -0
  29. package/dist/conversation-persist-plugin.d.ts.map +1 -0
  30. package/dist/conversation-persist-plugin.js +44 -0
  31. package/dist/conversation-persist-plugin.js.map +1 -0
  32. package/dist/conversation-repository.d.ts +19 -2
  33. package/dist/conversation-repository.d.ts.map +1 -1
  34. package/dist/conversation-repository.js +48 -5
  35. package/dist/conversation-repository.js.map +1 -1
  36. package/dist/format-time.d.ts +2 -2
  37. package/dist/format-time.js +2 -2
  38. package/dist/hook.d.ts.map +1 -1
  39. package/dist/hook.js +58 -46
  40. package/dist/hook.js.map +1 -1
  41. package/dist/index.js +65 -36
  42. package/dist/index.js.map +1 -1
  43. package/dist/migration-service.d.ts +3 -1
  44. package/dist/migration-service.d.ts.map +1 -1
  45. package/dist/migration-service.js +26 -23
  46. package/dist/migration-service.js.map +1 -1
  47. package/dist/mode.d.ts +56 -0
  48. package/dist/mode.d.ts.map +1 -0
  49. package/dist/mode.js +83 -0
  50. package/dist/mode.js.map +1 -0
  51. package/dist/session-pointer.d.ts +22 -0
  52. package/dist/session-pointer.d.ts.map +1 -0
  53. package/dist/session-pointer.js +49 -0
  54. package/dist/session-pointer.js.map +1 -0
  55. package/dist/stdio-runner.d.ts +34 -0
  56. package/dist/stdio-runner.d.ts.map +1 -0
  57. package/dist/stdio-runner.js +161 -0
  58. package/dist/stdio-runner.js.map +1 -0
  59. package/dist/tui/chat-session.d.ts +100 -0
  60. package/dist/tui/chat-session.d.ts.map +1 -0
  61. package/dist/tui/chat-session.js +263 -0
  62. package/dist/tui/chat-session.js.map +1 -0
  63. package/dist/tui/components.d.ts +44 -0
  64. package/dist/tui/components.d.ts.map +1 -0
  65. package/dist/tui/components.js +62 -0
  66. package/dist/tui/components.js.map +1 -0
  67. package/dist/tui/config-wizard/detail.d.ts +51 -0
  68. package/dist/tui/config-wizard/detail.d.ts.map +1 -0
  69. package/dist/tui/config-wizard/detail.js +273 -0
  70. package/dist/tui/config-wizard/detail.js.map +1 -0
  71. package/dist/tui/config-wizard/engine.d.ts +36 -0
  72. package/dist/tui/config-wizard/engine.d.ts.map +1 -0
  73. package/dist/tui/config-wizard/engine.js +187 -0
  74. package/dist/tui/config-wizard/engine.js.map +1 -0
  75. package/dist/tui/config-wizard/fields.d.ts +24 -0
  76. package/dist/tui/config-wizard/fields.d.ts.map +1 -0
  77. package/dist/tui/config-wizard/fields.js +411 -0
  78. package/dist/tui/config-wizard/fields.js.map +1 -0
  79. package/dist/tui/config-wizard/frame.d.ts +27 -0
  80. package/dist/tui/config-wizard/frame.d.ts.map +1 -0
  81. package/dist/tui/config-wizard/frame.js +28 -0
  82. package/dist/tui/config-wizard/frame.js.map +1 -0
  83. package/dist/tui/config-wizard/index.d.ts +6 -0
  84. package/dist/tui/config-wizard/index.d.ts.map +1 -0
  85. package/dist/tui/config-wizard/index.js +7 -0
  86. package/dist/tui/config-wizard/index.js.map +1 -0
  87. package/dist/tui/config-wizard/kv-editor.d.ts +18 -0
  88. package/dist/tui/config-wizard/kv-editor.d.ts.map +1 -0
  89. package/dist/tui/config-wizard/kv-editor.js +116 -0
  90. package/dist/tui/config-wizard/kv-editor.js.map +1 -0
  91. package/dist/tui/config-wizard/list.d.ts +13 -0
  92. package/dist/tui/config-wizard/list.d.ts.map +1 -0
  93. package/dist/tui/config-wizard/list.js +29 -0
  94. package/dist/tui/config-wizard/list.js.map +1 -0
  95. package/dist/tui/config-wizard/mcp-helpers.d.ts +9 -0
  96. package/dist/tui/config-wizard/mcp-helpers.d.ts.map +1 -0
  97. package/dist/tui/config-wizard/mcp-helpers.js +19 -0
  98. package/dist/tui/config-wizard/mcp-helpers.js.map +1 -0
  99. package/dist/tui/config-wizard/menu.d.ts +18 -0
  100. package/dist/tui/config-wizard/menu.d.ts.map +1 -0
  101. package/dist/tui/config-wizard/menu.js +70 -0
  102. package/dist/tui/config-wizard/menu.js.map +1 -0
  103. package/dist/tui/config-wizard/prompt-editor.d.ts +24 -0
  104. package/dist/tui/config-wizard/prompt-editor.d.ts.map +1 -0
  105. package/dist/tui/config-wizard/prompt-editor.js +83 -0
  106. package/dist/tui/config-wizard/prompt-editor.js.map +1 -0
  107. package/dist/tui/config-wizard/prompt.d.ts +57 -0
  108. package/dist/tui/config-wizard/prompt.d.ts.map +1 -0
  109. package/dist/tui/config-wizard/prompt.js +130 -0
  110. package/dist/tui/config-wizard/prompt.js.map +1 -0
  111. package/dist/tui/config-wizard/step-agents.d.ts +4 -0
  112. package/dist/tui/config-wizard/step-agents.d.ts.map +1 -0
  113. package/dist/tui/config-wizard/step-agents.js +110 -0
  114. package/dist/tui/config-wizard/step-agents.js.map +1 -0
  115. package/dist/tui/config-wizard/step-defaults.d.ts +4 -0
  116. package/dist/tui/config-wizard/step-defaults.d.ts.map +1 -0
  117. package/dist/tui/config-wizard/step-defaults.js +76 -0
  118. package/dist/tui/config-wizard/step-defaults.js.map +1 -0
  119. package/dist/tui/config-wizard/step-endpoints.d.ts +4 -0
  120. package/dist/tui/config-wizard/step-endpoints.d.ts.map +1 -0
  121. package/dist/tui/config-wizard/step-endpoints.js +43 -0
  122. package/dist/tui/config-wizard/step-endpoints.js.map +1 -0
  123. package/dist/tui/config-wizard/step-mcp.d.ts +4 -0
  124. package/dist/tui/config-wizard/step-mcp.d.ts.map +1 -0
  125. package/dist/tui/config-wizard/step-mcp.js +97 -0
  126. package/dist/tui/config-wizard/step-mcp.js.map +1 -0
  127. package/dist/tui/config-wizard/step-menu.d.ts +4 -0
  128. package/dist/tui/config-wizard/step-menu.d.ts.map +1 -0
  129. package/dist/tui/config-wizard/step-menu.js +28 -0
  130. package/dist/tui/config-wizard/step-menu.js.map +1 -0
  131. package/dist/tui/config-wizard/step-models.d.ts +4 -0
  132. package/dist/tui/config-wizard/step-models.d.ts.map +1 -0
  133. package/dist/tui/config-wizard/step-models.js +114 -0
  134. package/dist/tui/config-wizard/step-models.js.map +1 -0
  135. package/dist/tui/config-wizard/step-new-endpoint.d.ts +4 -0
  136. package/dist/tui/config-wizard/step-new-endpoint.d.ts.map +1 -0
  137. package/dist/tui/config-wizard/step-new-endpoint.js +54 -0
  138. package/dist/tui/config-wizard/step-new-endpoint.js.map +1 -0
  139. package/dist/tui/config-wizard/step-simple.d.ts +4 -0
  140. package/dist/tui/config-wizard/step-simple.d.ts.map +1 -0
  141. package/dist/tui/config-wizard/step-simple.js +55 -0
  142. package/dist/tui/config-wizard/step-simple.js.map +1 -0
  143. package/dist/tui/config-wizard/types.d.ts +138 -0
  144. package/dist/tui/config-wizard/types.d.ts.map +1 -0
  145. package/dist/tui/config-wizard/types.js +12 -0
  146. package/dist/tui/config-wizard/types.js.map +1 -0
  147. package/dist/tui/config-wizard/wizard.d.ts +9 -0
  148. package/dist/tui/config-wizard/wizard.d.ts.map +1 -0
  149. package/dist/tui/config-wizard/wizard.js +33 -0
  150. package/dist/tui/config-wizard/wizard.js.map +1 -0
  151. package/dist/tui/highlight.d.ts +34 -0
  152. package/dist/tui/highlight.d.ts.map +1 -0
  153. package/dist/tui/highlight.js +116 -0
  154. package/dist/tui/highlight.js.map +1 -0
  155. package/dist/tui/index.d.ts +33 -0
  156. package/dist/tui/index.d.ts.map +1 -0
  157. package/dist/tui/index.js +265 -0
  158. package/dist/tui/index.js.map +1 -0
  159. package/dist/tui/screens/chat-commands.d.ts +27 -0
  160. package/dist/tui/screens/chat-commands.d.ts.map +1 -0
  161. package/dist/tui/screens/chat-commands.js +176 -0
  162. package/dist/tui/screens/chat-commands.js.map +1 -0
  163. package/dist/tui/screens/chat.d.ts +25 -0
  164. package/dist/tui/screens/chat.d.ts.map +1 -0
  165. package/dist/tui/screens/chat.js +494 -0
  166. package/dist/tui/screens/chat.js.map +1 -0
  167. package/dist/tui/screens/index.d.ts +13 -0
  168. package/dist/tui/screens/index.d.ts.map +1 -0
  169. package/dist/tui/screens/index.js +14 -0
  170. package/dist/tui/screens/index.js.map +1 -0
  171. package/dist/tui/screens/input.d.ts +29 -0
  172. package/dist/tui/screens/input.d.ts.map +1 -0
  173. package/dist/tui/screens/input.js +54 -0
  174. package/dist/tui/screens/input.js.map +1 -0
  175. package/dist/tui/screens/layout.d.ts +42 -0
  176. package/dist/tui/screens/layout.d.ts.map +1 -0
  177. package/dist/tui/screens/layout.js +45 -0
  178. package/dist/tui/screens/layout.js.map +1 -0
  179. package/dist/tui/screens/lines.d.ts +71 -0
  180. package/dist/tui/screens/lines.d.ts.map +1 -0
  181. package/dist/tui/screens/lines.js +198 -0
  182. package/dist/tui/screens/lines.js.map +1 -0
  183. package/dist/tui/screens/overlays.d.ts +12 -0
  184. package/dist/tui/screens/overlays.d.ts.map +1 -0
  185. package/dist/tui/screens/overlays.js +34 -0
  186. package/dist/tui/screens/overlays.js.map +1 -0
  187. package/dist/tui/screens/render.d.ts +9 -0
  188. package/dist/tui/screens/render.d.ts.map +1 -0
  189. package/dist/tui/screens/render.js +97 -0
  190. package/dist/tui/screens/render.js.map +1 -0
  191. package/dist/tui/screens/splash.d.ts +5 -0
  192. package/dist/tui/screens/splash.d.ts.map +1 -0
  193. package/dist/tui/screens/splash.js +51 -0
  194. package/dist/tui/screens/splash.js.map +1 -0
  195. package/dist/tui/screens/state.d.ts +13 -0
  196. package/dist/tui/screens/state.d.ts.map +1 -0
  197. package/dist/tui/screens/state.js +75 -0
  198. package/dist/tui/screens/state.js.map +1 -0
  199. package/dist/tui/text.d.ts +71 -0
  200. package/dist/tui/text.d.ts.map +1 -0
  201. package/dist/tui/text.js +191 -0
  202. package/dist/tui/text.js.map +1 -0
  203. package/dist/tui/theme.d.ts +62 -0
  204. package/dist/tui/theme.d.ts.map +1 -0
  205. package/dist/tui/theme.js +120 -0
  206. package/dist/tui/theme.js.map +1 -0
  207. package/dist/types.d.ts +1 -2
  208. package/dist/types.d.ts.map +1 -1
  209. package/dist/types.js +1 -1
  210. package/package.json +11 -6
  211. package/dist/config-wizard.d.ts +0 -6
  212. package/dist/config-wizard.d.ts.map +0 -1
  213. package/dist/config-wizard.js +0 -46
  214. package/dist/config-wizard.js.map +0 -1
  215. package/dist/conversation-commands/back.d.ts +0 -3
  216. package/dist/conversation-commands/back.d.ts.map +0 -1
  217. package/dist/conversation-commands/back.js +0 -144
  218. package/dist/conversation-commands/back.js.map +0 -1
  219. package/dist/conversation-commands/clear.d.ts +0 -3
  220. package/dist/conversation-commands/clear.d.ts.map +0 -1
  221. package/dist/conversation-commands/clear.js +0 -8
  222. package/dist/conversation-commands/clear.js.map +0 -1
  223. package/dist/conversation-commands/editor.d.ts +0 -3
  224. package/dist/conversation-commands/editor.d.ts.map +0 -1
  225. package/dist/conversation-commands/editor.js +0 -15
  226. package/dist/conversation-commands/editor.js.map +0 -1
  227. package/dist/conversation-commands/exit.d.ts +0 -3
  228. package/dist/conversation-commands/exit.d.ts.map +0 -1
  229. package/dist/conversation-commands/exit.js +0 -37
  230. package/dist/conversation-commands/exit.js.map +0 -1
  231. package/dist/conversation-commands/help.d.ts +0 -3
  232. package/dist/conversation-commands/help.d.ts.map +0 -1
  233. package/dist/conversation-commands/help.js +0 -10
  234. package/dist/conversation-commands/help.js.map +0 -1
  235. package/dist/conversation-commands/index.d.ts +0 -13
  236. package/dist/conversation-commands/index.d.ts.map +0 -1
  237. package/dist/conversation-commands/index.js +0 -66
  238. package/dist/conversation-commands/index.js.map +0 -1
  239. package/dist/conversation-commands/migrate.d.ts +0 -12
  240. package/dist/conversation-commands/migrate.d.ts.map +0 -1
  241. package/dist/conversation-commands/migrate.js +0 -56
  242. package/dist/conversation-commands/migrate.js.map +0 -1
  243. package/dist/conversation-commands/new.d.ts +0 -3
  244. package/dist/conversation-commands/new.d.ts.map +0 -1
  245. package/dist/conversation-commands/new.js +0 -45
  246. package/dist/conversation-commands/new.js.map +0 -1
  247. package/dist/conversation-commands/save.d.ts +0 -3
  248. package/dist/conversation-commands/save.d.ts.map +0 -1
  249. package/dist/conversation-commands/save.js +0 -32
  250. package/dist/conversation-commands/save.js.map +0 -1
  251. package/dist/conversation-runner.d.ts +0 -17
  252. package/dist/conversation-runner.d.ts.map +0 -1
  253. package/dist/conversation-runner.js +0 -176
  254. package/dist/conversation-runner.js.map +0 -1
  255. package/dist/delta-renderer.d.ts +0 -33
  256. package/dist/delta-renderer.d.ts.map +0 -1
  257. package/dist/delta-renderer.js +0 -120
  258. package/dist/delta-renderer.js.map +0 -1
  259. package/dist/draft-plugin.d.ts +0 -19
  260. package/dist/draft-plugin.d.ts.map +0 -1
  261. package/dist/draft-plugin.js +0 -30
  262. package/dist/draft-plugin.js.map +0 -1
  263. package/dist/draft-repository.d.ts +0 -34
  264. package/dist/draft-repository.d.ts.map +0 -1
  265. package/dist/draft-repository.js +0 -64
  266. package/dist/draft-repository.js.map +0 -1
  267. package/dist/menus/agents.d.ts +0 -5
  268. package/dist/menus/agents.d.ts.map +0 -1
  269. package/dist/menus/agents.js +0 -219
  270. package/dist/menus/agents.js.map +0 -1
  271. package/dist/menus/common.d.ts +0 -41
  272. package/dist/menus/common.d.ts.map +0 -1
  273. package/dist/menus/common.js +0 -104
  274. package/dist/menus/common.js.map +0 -1
  275. package/dist/menus/config-display.d.ts +0 -2
  276. package/dist/menus/config-display.d.ts.map +0 -1
  277. package/dist/menus/config-display.js +0 -82
  278. package/dist/menus/config-display.js.map +0 -1
  279. package/dist/menus/config.d.ts +0 -8
  280. package/dist/menus/config.d.ts.map +0 -1
  281. package/dist/menus/config.js +0 -407
  282. package/dist/menus/config.js.map +0 -1
  283. package/dist/menus/conversations.d.ts +0 -20
  284. package/dist/menus/conversations.d.ts.map +0 -1
  285. package/dist/menus/conversations.js +0 -83
  286. package/dist/menus/conversations.js.map +0 -1
  287. package/dist/menus/index.d.ts +0 -5
  288. package/dist/menus/index.d.ts.map +0 -1
  289. package/dist/menus/index.js +0 -59
  290. package/dist/menus/index.js.map +0 -1
  291. package/dist/menus/start-conversation.d.ts +0 -16
  292. package/dist/menus/start-conversation.d.ts.map +0 -1
  293. package/dist/menus/start-conversation.js +0 -176
  294. package/dist/menus/start-conversation.js.map +0 -1
  295. package/dist/slash-hint-prompt.d.ts +0 -41
  296. package/dist/slash-hint-prompt.d.ts.map +0 -1
  297. package/dist/slash-hint-prompt.js +0 -92
  298. package/dist/slash-hint-prompt.js.map +0 -1
package/CHANGELOG.md CHANGED
@@ -1,4 +1,45 @@
1
- # Changelog
1
+ ## [1.0.0-alpha.1] - 2026-09-30
2
+
3
+ > 本版本汇总**相对上一发布版本 `0.9.0`** 的全部变化。
4
+
5
+ ### 💥 破坏性变更
6
+
7
+ - **启动命令由 `aiz` / `zen` 改为 `ai`** —— `package.json` 的 `bin` 改为 `{ "ai", "aiz", "zen" }`;`aiz` / `zen` 作为**过渡别名**保留,未来版本移除。
8
+ - **引入双模式运行,两种模式互不混合** —— 带位置参数、或 stdin/stdout 非 TTY(管道 / 重定向 / CI)时启用**纯 stdio 模式**:无任何额外交互,最终 assistant 文本以纯文本写入 `stdout`(零 ANSI / emoji 前缀 / spinner),日志、进度、工具过程与错误摘要一律走 `stderr`,成功退出码 `0`、失败非 `0`、默认不落盘;仅在**无参数且 stdin/stdout 均为 TTY** 时进入 **TUI 模式**。
9
+ - **交互界面整体重写为 Ink(React)全屏 TUI** —— 取代原 inquirer 行式对话;随之**移除主菜单**(`/menu` 与 `src/menus/*`)以及 `inquirer` / `@types/inquirer` / `chalk` 依赖。
10
+
11
+ ### ✨ 新增
12
+
13
+ - **TUI 全屏交互界面(Ink + React)**:
14
+ - 动画渐变 ASCII 启动界面,结束后直接进入对话(有上一轮会话则自动续接);
15
+ - 对话区**吸底**(分隔线 / 输入行 / 状态栏固定底部,整帧高度恒为「终端行数 − 1」以避开 Ink 全屏分支);
16
+ - 流式输出(思考 / 正文 / 工具调用分行)、历史按行裁剪自底滚动;
17
+ - **多行输入**(`Enter` 发送、`Ctrl+N` / `Ctrl+J` 换行)与**光标编辑**(`←`/`→`/`Home`/`End`/`Backspace`/`Delete`,`Ctrl`/`Meta` + `←`/`→` 跨词,反显光标 + 硬件光标同步);
18
+ - **应用内翻页**(`PgUp`/`PgDn` 翻页、`Shift`/`Alt` + `↑`/`↓` 单行滚动、发送自动回底);
19
+ - 输入历史、内联 `/` 命令菜单、状态栏、确认框。
20
+ - **语法高亮**:工具调用参数按 **JSON** 高亮、正文与思考里的**围栏代码块**按语言高亮。高亮**数据**委托 `highlight.js`(经 `lowlight` 产出 hast),CLI 仅把 `hljs-*` scope 映射为 Ink `<Text>` 颜色 —— 与同为 Ink/React 的 Google Gemini CLI 做法一致。
21
+ - **对话内命令**:`/help`、`/load`、`/clear`、`/new`、`/save`、`/config`、`/key`、`/migrate`、`/back`、`/editor`、`/exit`(`registry.ts` 为命令清单唯一来源,`/help` 与输入补全自动同步)。
22
+ - **首启凭据引导 + 配置中心(Ink 原生)**:端点缺 API Key 时先弹凭据设置屏;`/config` 配置中心管理端点、模型、图片模型、默认项(默认模型 / 图片模型 / Agent / 迁移模型)、工具输出上限、**MCP 服务器**(全局 / 项目作用域)与 **Agent 定义**(顶层 Agent + Sub-agent,含四维权限);编辑「出厂托管」条目自动转 `custom: true`,危险操作二次确认并做引用守卫。
23
+ - **多行文本走系统编辑器**:Agent 提示词、Sub-agent 函数说明 / 参数 schema 等多行字段按 `Enter` 调起 `$EDITOR`(Windows 默认 `notepad`);参数 schema 以 `.json` 打开并即时校验。
24
+ - **会话持久化改革:会话即文件 + 单指针** —— 每轮结束落盘、`cli/last-session.json` 记录上一轮会话 id、首条消息后才落盘、`/save` 幂等;继续 / 加载时按消息重建历史。
25
+ - **纯 stdio 模式配套**:`ai --help` / `-h`、`ai --version` / `-v`、`ai --save`;SDK 日志与 `console.log` 统一改道 `stderr` 以保证 stdout 纯净。
26
+ - **IME 候选框跟随光标**:用 Ink `useCursor()` 把硬件光标同步到编辑光标,中文输入法候选框正确定位。
27
+
28
+ ### 🔧 变更
29
+
30
+ - **依赖**:新增 `ink` / `react`(运行时)、`ink-testing-library` / `@types/react`(开发);新增语法高亮 `highlight.js` / `lowlight`(运行时)与 `@types/hast`(开发);**移除** `inquirer` / `@types/inquirer` / `chalk`。
31
+ - **升级 `@ai-zen/agents-sdk`**:`1.0.0-alpha.0` → `1.0.0-alpha.1` → `1.0.0-alpha.2`(出厂模型目录刷新、模型清单托管、默认 `mcp.json` 增补 `chrome-devtools` 等;CLI 侧代码零改动)。
32
+ - **TUI 输出统一走 Ink**:迁移进度、会话落盘失败等提示不再 `console.log` / `console.warn` 直写终端(会撕裂 Ink 帧),改为经回调渲染为 notice 块;启动 Logo 渐变也改为 Ink 逐字符 `<Text color>`。
33
+ - **配置向导 / 覆盖层统一「吸底」布局**,列表项与键位提示裁成**严格单行**,修复 VS Code 终端里内容被裁切的问题。
34
+ - **终端状态安全与干净退出**:`SIGINT` / `SIGTERM` / 未捕获异常均卸载 Ink、恢复 raw mode 与光标;`Ctrl+C` 语义为「忙时取消本轮、空闲时退出」;退出显式暂停 stdin 并终止进程(`farewell()`)。
35
+ - **移除旧行式链路(死代码)**:`src/conversation-runner.ts`、`src/slash-hint-prompt.ts`、`src/delta-renderer.ts`、inquirer 版 `src/config-wizard.ts`、`src/draft-*.ts` 等;新增 `src/mode.ts` / `src/stdio-runner.ts` / `src/session-pointer.ts` / `src/conversation-persist-plugin.ts` / `src/config-editor.ts` 与 `src/tui/*` 新实现。
36
+ - 文档:中英 README 与 `docs/zh|en/*` 同步(运行模式、`ai` 命令名、配置中心、多行编辑器等),`docs/manifest.json` 同步。
37
+
38
+ ### ✅ 测试
39
+
40
+ - 全量单测 **13 文件 / 224 例**,`tsc --noEmit` 与 `npm run build` 零错误;e2e **12 例**真连 DeepSeek API(覆盖双模式、stdio 纯净性、退出码、`--save` 落盘)。
41
+ - 新增测试文件:`mode.test.ts`、`stdio-runner.test.ts`、`theme.test.ts`、`screens.test.tsx`、`tui/config-wizard.test.tsx`、`tui/agent-prompt.test.tsx`、`tui/highlight.test.ts`、`sub-agent-guard-plugin.test.ts`、`auto-migrate-confirm-plugin.test.ts`、`conversation-commands/registry.test.ts`。
42
+ - 真实 PTY 实测:启动 → 对话 → 流式 → `/load` → `/clear` → 退出交还 shell;首启凭据链路;配置中心各子屏。
2
43
 
3
44
  ## [0.9.0] - 2026-09-30
4
45
 
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # @ai-zen/cli
2
2
 
3
- A command-line interface for AI agents, built on `@ai-zen/agents-sdk` and `@ai-zen/agents-core`. Provides an interactive conversation terminal with built-in file system tools, sub-agent orchestration, and skill management.
3
+ A command-line interface for AI agents, built on `@ai-zen/agents-sdk` and `@ai-zen/agents-core`. It runs in **two modes**: an interactive terminal (TUI) for conversations with the AI, and a pure stdio mode for scripts, pipes, and the shell fallback hook. It ships built-in file system tools and supports MCP integration, sub-agent orchestration, and skill management.
4
4
 
5
5
  ## Installation
6
6
 
@@ -20,42 +20,78 @@ pnpm build
20
20
  npm install -g .
21
21
  ```
22
22
 
23
+ ## Run Modes
24
+
25
+ The CLI has two **non-mixing** run modes, chosen automatically from the launch arguments and the terminal environment:
26
+
27
+ | Mode | Trigger | Audience | Behavior |
28
+ |------|---------|----------|----------|
29
+ | **Pure stdio** | Arguments present, **or** stdin/stdout is not a TTY (pipe, redirect, CI) | Scripts, pipes, shell fallback hook | No extra interaction; reads input and writes the **final answer as plain text to stdout** |
30
+ | **TUI** | No arguments and both stdin/stdout are TTYs | Human users | Interactive chat UI |
31
+
32
+ In pure stdio mode, logs / progress / tool activity / error summaries all go to **stderr**; stdout carries the result only (no ANSI, no emoji prefix, no spinner). Exit code is `0` on success and non-zero on failure. Nothing is persisted by default (no conversation archive).
33
+
23
34
  ## Quick Start
24
35
 
25
36
  ```bash
26
- # Interactive main menu
27
- zen
37
+ # TUI: no arguments, interactive terminal
38
+ ai
39
+
40
+ # Pure stdio: argument is the prompt, result goes to stdout
41
+ ai Hello, introduce yourself.
28
42
 
29
- # Quick chat (pass message as argument)
30
- zen Hello, introduce yourself.
43
+ # Pipe: stdin is the content, the argument is the instruction
44
+ cat README.md | ai "summarize in three sentences"
45
+
46
+ # Persist: off by default, opt in with --save
47
+ ai --save "name this function for me"
48
+
49
+ # Help / version
50
+ ai --help
51
+ ai --version
31
52
  ```
32
53
 
33
- ## Main Menu
54
+ > The legacy command names `aiz` / `zen` still work as transition aliases in this version and will be removed in a future release.
34
55
 
35
- Run `zen` to enter the main menu:
56
+ ## Interface (TUI)
57
+
58
+ When run with no arguments on an interactive terminal, the CLI opens a full-screen interface built with **Ink (React)**. It starts with an animated, gradient ASCII splash:
36
59
 
37
60
  ```
38
- 🤖 Welcome to AI-Zen CLI
39
-
40
- ? Select an action:
41
- ▶️ Continue last unfinished conversation (if draft exists)
42
- 💬 Start a new conversation
43
- 📂 Continue a saved conversation
44
- 📋 Manage saved conversations
45
- 🤖 Manage Agents
46
- ⚙️ Configuration
47
- ❌ Exit
61
+ █████╗ ██╗ ███████╗███████╗███╗ ██╗
62
+ ██╔══██╗██║ ╚══███╔╝██╔════╝████╗ ██║
63
+ ███████║██║ ███╔╝ █████╗ ██╔██╗ ██║
64
+ ██╔══██║██║ ███╔╝ ██╔══╝ ██║╚██╗██║
65
+ ██║ ██║██║ ███████╗███████╗██║ ╚████║
66
+ ╚═╝ ╚═╝╚═╝ ╚══════╝╚══════╝╚═╝ ╚═══╝
67
+
68
+ AI workbench in your terminal
69
+ v1.0.0-alpha.1 · sdk x · core y
48
70
  ```
49
71
 
50
- ### Draft Recovery
72
+ After the splash, you land **directly in the chat screen** (resuming the last session if there is one, otherwise starting a new conversation). The chat screen is **bottom-pinned**: a divider, the input line, and the status bar (model · agent · token usage · generating) always sit at the bottom of the terminal, while the conversation scrolls above them. While generating, the spinner replaces the input line.
73
+
74
+ The chat screen provides a streaming output area (reasoning / answer / tool calls on separate lines), a multiline input (`Enter` sends; `Ctrl+N` inserts a newline; `← →` move the cursor, `Ctrl+← →` by word), and an inline `/` command menu (↑↓ to choose, `Tab` to complete). Tool calls render as `⚙ name(args)` with **JSON syntax highlighting**, and fenced code blocks in the answer / reasoning are **syntax-highlighted by language** (highlight data from `highlight.js` via `lowlight`). `Ctrl+C` cancels the current request while generating, and exits when idle.
51
75
 
52
- If you exit a conversation without saving (or the process is killed), the conversation is **automatically saved as a draft**. Next time you start `zen`, you'll see:
76
+ ### First-run setup (API Key)
77
+
78
+ On first launch, if the endpoint bound to the selected model has no API Key yet, a **credential screen** appears instead of an error:
53
79
 
54
80
  ```
55
- ▶️ Continue last unfinished conversation (12 messages, 2025/1/1 12:00:00)
56
- 💬 Start a new conversation (discard draft)
81
+ ? First-run setup · Set the API Key for DeepSeek
82
+ Endpoint: DeepSeek · https://api.deepseek.com/v1
83
+ Current: not set
84
+ Get a key at: https://platform.deepseek.com/api_keys
85
+ Saving enters the chat immediately (Esc aborts and exits).
86
+ ❯ ▏
57
87
  ```
58
88
 
89
+ `Enter` saves it (to `~/.ai-zen/config.json`) and drops you straight into the chat; `Tab` toggles plaintext, `Esc` aborts. Inside the chat, `/key` changes the **current endpoint's** key (the session is rebuilt on save, so it applies immediately) and `/config` opens the configuration center (default model / endpoint management: a list of [add endpoint] plus each endpoint; select one to edit its API key / base URL in place).
90
+
91
+ ### Session Recovery
92
+
93
+ Every conversation is persisted directly as its own file (`cli/conversations/<id>.json`) while you chat — there is no separate draft store. A single pointer (`cli/last-session.json`) remembers the **last session id**; next time you start `ai`, that session is **resumed automatically** so you pick up where you left off.
94
+
59
95
  ### Conversation Commands
60
96
 
61
97
  While in a conversation, all commands start with `/`. Typing `/` lists the available commands, with descriptions, right below the input line; typing more characters narrows the candidates by prefix:
@@ -65,16 +101,19 @@ While in a conversation, all commands start with `/`. Typing `/` lists the avail
65
101
  /back Undo messages (roll back to a specific point and resend)
66
102
  ```
67
103
 
68
- > Hints are display-only and do not change submission semantics: Enter always submits exactly what you typed, and commands are matched by their full names. An unrecognized `/xxx` command reports "Unknown command".
104
+ > Typing `/` lists candidate commands below the input line (↑↓ to choose, `Tab` to complete, `Enter` to submit/run). Commands are matched by their full names; an unrecognized `/xxx` reports "Unknown command".
69
105
 
70
106
  | Command | Description |
71
107
  |---------|-------------|
72
- | `/exit` `/quit` | Exit the conversation (prompts to save) |
73
- | `/save` | Save the current conversation |
108
+ | `/exit` `/quit` | Exit the conversation |
109
+ | `/save` | Save the current conversation (it is already flushed on every turn) |
110
+ | `/load` | Load a saved conversation (replaces the current session) |
74
111
  | `/new` | Reset the conversation (clear history) |
75
112
  | `/back` | Undo messages (roll back to a specific point and resend) |
76
113
  | `/editor` | Open system editor for long-form input |
77
114
  | `/clear` | Clear the screen |
115
+ | `/config` | Open the configuration center (endpoints / models / image models / MCP servers / agent definitions / defaults / tool-output cap) |
116
+ | `/key` | Set the API Key of the current endpoint (rebuilds the session on save) |
78
117
  | `/migrate` | Manually trigger task migration (generate handoff doc & start a new session) |
79
118
  | `/help` | Show available commands |
80
119
 
@@ -100,19 +139,30 @@ When you type an unrecognized command in your terminal, it can be automatically
100
139
 
101
140
  ```bash
102
141
  # Install the hook
103
- zen hook install
142
+ ai hook install
104
143
 
105
144
  # After that, try typing something random:
106
145
  > what's the weather today?
107
146
  # This will be forwarded to AI instead of showing "command not found"
108
147
 
109
148
  # Uninstall
110
- zen hook uninstall
149
+ ai hook uninstall
111
150
  ```
112
151
 
152
+ The hook calls `ai "$@"` (pure stdio mode) so the answer is printed in your current shell session. If you previously installed the legacy `aiz` hook, re-running `ai hook install` upgrades it automatically; you can also run `ai hook uninstall` first.
153
+
113
154
  ## Configuration
114
155
 
115
- Configuration is stored in `~/.ai-zen/config.json` (or `$AI_ZEN_DIR/config.json` if set), shared with other AI-Zen clients. The `maxContextTokens` field on each model sets the migration threshold (typically ~25% of the model's actual context window, e.g. 250,000 for a 1M-token model).
156
+ Configuration is stored in `~/.ai-zen/config.json` (or `$AI_ZEN_DIR/config.json` if set), shared with other AI-Zen clients and used as the **single source of truth**. The TUI can edit the common fields for you:
157
+
158
+ | Scenario | How |
159
+ |----------|-----|
160
+ | First launch, endpoint has no key | The **credential screen** appears automatically |
161
+ | Change the current model's endpoint key | `/key` in the chat (session rebuilt on save) |
162
+ | Endpoints / models / image models, MCP servers, agent definitions (incl. sub-agents), defaults, tool-output cap | `/config` (the configuration center — full management) |
163
+ | Other advanced fields (skills / user tools, …) | Edit the files under `~/.ai-zen/` manually |
164
+
165
+ The `maxContextTokens` field on each model sets the migration threshold (typically ~25% of the model's actual context window, e.g. 250,000 for a 1M-token model).
116
166
 
117
167
  ```jsonc
118
168
  {
@@ -126,11 +176,12 @@ Configuration is stored in `~/.ai-zen/config.json` (or `$AI_ZEN_DIR/config.json`
126
176
  ],
127
177
  "models": [
128
178
  {
129
- "id": "gpt-5.5",
130
- "name": "GPT-5.5",
179
+ "id": "gpt-6.1-sol",
180
+ "name": "GPT-6.1 Sol",
131
181
  "endpointId": "openai",
132
- "modelName": "gpt-5.5",
133
- "maxContextTokens": 250000
182
+ "modelName": "gpt-6.1-sol",
183
+ "maxContextTokens": 250000,
184
+ "custom": true
134
185
  }
135
186
  ],
136
187
  "imageModels": [
@@ -142,13 +193,15 @@ Configuration is stored in `~/.ai-zen/config.json` (or `$AI_ZEN_DIR/config.json`
142
193
  "defaultSize": "1024x1024"
143
194
  }
144
195
  ],
145
- "defaultModel": "deepseek-v4-flash",
196
+ "defaultModel": "deepseek-flash",
146
197
  "defaultImageModel": "cogview-4",
147
198
  "defaultAgent": "default",
148
- "defaultMigrationModel": "deepseek-v4-flash"
199
+ "defaultMigrationModel": "deepseek-flash"
149
200
  }
150
201
  ```
151
202
 
203
+ > Note: entries in `models` / `imageModels` **without `custom: true`** are **factory-managed** — on every launch they are reconciled with (and replaced by) the SDK factory catalog; add `"custom": true` for your own entries. `endpoints` are never managed and always keep your configuration.
204
+
152
205
  ### Environment Variable
153
206
 
154
207
  - `AI_ZEN_DIR` — Override the shared root directory (default: `~/.ai-zen`). CLI runtime data goes to `$AI_ZEN_DIR/cli/`, and shared resources (agents, skills, tools, MCP, etc.) go to `$AI_ZEN_DIR/`.
@@ -160,7 +213,7 @@ Configuration is stored in `~/.ai-zen/config.json` (or `$AI_ZEN_DIR/config.json`
160
213
  ├── config.json ← Endpoints & models (shared with other AI-Zen clients)
161
214
  ├── cli/ ← CLI runtime data
162
215
  │ ├── conversations/ ← CLI conversations
163
- │ └── drafts/ ← CLI drafts
216
+ │ └── last-session.json ← Pointer to the last session id
164
217
  ├── agents/ ← Agent definitions (shared)
165
218
  │ ├── default.json ← Default agent (created on first run)
166
219
  │ └── my-custom-agent.json
@@ -304,13 +357,14 @@ The OAuth 2.0 authorization flow (the `oauth` field in `mcp.json`) has its types
304
357
 
305
358
  | ID | Name | Endpoint |
306
359
  |----|------|----------|
307
- | `gpt-5.5` | GPT-5.5 | OpenAI |
308
- | `glm-5.1` | GLM-5.1 | ZhipuAI |
309
- | `glm-5v-turbo` | GLM-5V-Turbo (vision) | ZhipuAI |
360
+ | `gpt-6-astra` | GPT-6 Astra | OpenAI |
361
+ | `gpt-6.1-sol` | GPT-6.1 Sol | OpenAI |
362
+ | `gpt-6-luna` | GPT-6 Luna | OpenAI |
363
+ | `glm-5.3` | GLM-5.3 | ZhipuAI |
364
+ | `glm-5.3-flash` | GLM-5.3-Flash (vision) | ZhipuAI |
365
+ | `glm-5.3-flashx` | GLM-5.3-FlashX (vision) | ZhipuAI |
310
366
  | `glm-4.7-flash` | GLM-4.7-Flash | ZhipuAI |
311
- | `deepseek-v4-pro` | DeepSeek-V4-Pro | DeepSeek |
312
- | `deepseek-v4-flash` | DeepSeek-V4-Flash | DeepSeek (**default**) |
313
- | `deepseek-v4-flash-vision-exp` | DeepSeek-V4-Flash-Vision-Exp (vision) | DeepSeek |
367
+ | `deepseek-flash` | DeepSeek-V4.1-Flash (vision) | DeepSeek (**default**) |
314
368
 
315
369
  ## Development
316
370
 
package/README.zh.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # @ai-zen/cli
2
2
 
3
- AI Agent 命令行界面,基于 `@ai-zen/agents-sdk` 和 `@ai-zen/agents-core` 构建。提供交互式对话终端,内置文件系统操作工具,支持 MCP 协议集成外部工具、子 Agent 编排和 Skill 管理。
3
+ AI Agent 命令行界面,基于 `@ai-zen/agents-sdk` 和 `@ai-zen/agents-core` 构建。提供**双模式**运行:交互式终端(TUI)用于人与 AI 对话,纯 stdio 模式用于脚本、管道与 shell 兜底钩子。内置文件系统操作工具,支持 MCP 协议集成外部工具、子 Agent 编排和 Skill 管理。
4
4
 
5
5
  ## 安装
6
6
 
@@ -20,42 +20,78 @@ pnpm build
20
20
  npm install -g .
21
21
  ```
22
22
 
23
+ ## 运行模式
24
+
25
+ CLI 有两种**互不混合**的运行模式,由启动参数与终端环境自动判定:
26
+
27
+ | 模式 | 触发条件 | 面向对象 | 核心行为 |
28
+ |------|----------|----------|----------|
29
+ | **纯 stdio** | 带参数,**或** stdin/stdout 非 TTY(管道、重定向、CI) | 脚本、管道、shell 兜底钩子 | 无任何额外交互;读入文本,把**最终回答以纯文本写入 stdout** |
30
+ | **TUI** | 无参数且 stdin/stdout 均为 TTY | 人类用户 | 交互式对话界面 |
31
+
32
+ 纯 stdio 模式下,日志 / 进度 / 工具过程 / 错误摘要一律走 **stderr**,stdout 只有结果本身(零 ANSI、零 emoji 前缀、零 spinner);成功退出码 `0`,失败非 `0`。默认**不落盘**(不写对话存档)。
33
+
23
34
  ## 快速使用
24
35
 
25
36
  ```bash
26
- # 交互式主菜单
27
- zen
37
+ # TUI:无参数且处于交互终端
38
+ ai
39
+
40
+ # 纯 stdio:参数即提示词,结果写入 stdout
41
+ ai 你好,请介绍一下你自己。
28
42
 
29
- # 快速对话(参数作为初始消息)
30
- zen 你好,请介绍一下你自己。
43
+ # 管道:stdin 作为内容,参数作为指令
44
+ cat README.md | ai "用三句话总结"
45
+
46
+ # 落盘:默认不保存,需要时显式 --save
47
+ ai --save "帮我给这个函数起个名字"
48
+
49
+ # 帮助 / 版本
50
+ ai --help
51
+ ai --version
31
52
  ```
32
53
 
33
- ## 主菜单
54
+ > 旧命令名 `aiz` / `zen` 作为过渡别名在当前版本仍可用,未来版本会移除。
34
55
 
35
- 运行 `zen` 进入主菜单:
56
+ ## 界面(TUI)
57
+
58
+ 无参数且处于交互终端时,进入由 **Ink(React)** 打造的全屏界面。启动先呈现动画渐变的 ASCII 启动界面:
36
59
 
37
60
  ```
38
- 🤖 欢迎使用 AI-Zen CLI
39
-
40
- ? 请选择操作:
41
- ▶️ 继续上次未完成的对话 (如有草稿)
42
- 💬 开始新对话
43
- 📂 继续已保存的对话
44
- 📋 管理已保存的对话
45
- 🤖 管理 Agents
46
- ⚙️ 配置管理
47
- ❌ 退出
61
+ █████╗ ██╗ ███████╗███████╗███╗ ██╗
62
+ ██╔══██╗██║ ╚══███╔╝██╔════╝████╗ ██║
63
+ ███████║██║ ███╔╝ █████╗ ██╔██╗ ██║
64
+ ██╔══██║██║ ███╔╝ ██╔══╝ ██║╚██╗██║
65
+ ██║ ██║██║ ███████╗███████╗██║ ╚████║
66
+ ╚═╝ ╚═╝╚═╝ ╚══════╝╚══════╝╚═╝ ╚═══╝
67
+
68
+ 终端里的 AI 协作台
69
+ v1.0.0-alpha.1 · sdk x · core y
48
70
  ```
49
71
 
50
- ### 草稿恢复
72
+ 启动界面结束后**直接进入对话界面**(若存在「上一轮会话」则自动续接,否则新建对话)。对话界面采用**底部固定**布局:分隔线、输入行与状态栏(模型 · Agent · token 用量 · 生成状态)始终贴在终端底部,对话内容在其上方滚动;生成中时输入行位置显示进度指示。
73
+
74
+ 对话界面包含:流式输出区(思考过程 / 回答正文 / 工具调用分行展示)、多行输入(`Enter` 发送、`Ctrl+N` 换行、`← →` 移动光标、`Ctrl+← →` 跨词)与内联 `/` 命令菜单(↑↓ 选择、`Tab` 补全)。工具调用以 `⚙ 名称(参数)` 展示并带 **JSON 语法高亮**,正文与思考里的**围栏代码块按语言高亮**(高亮数据来自 `highlight.js` / `lowlight`)。`Ctrl+C` 在生成中取消本轮请求、空闲时退出。
51
75
 
52
- 如果退出对话时没有保存(或进程被强制杀死),对话内容会**自动保存为草稿**。下次启动 `zen` 时会看到:
76
+ ### 首次配置(API Key)
77
+
78
+ 首次启动时若所选模型绑定的端点还没有 API Key,会**先弹出凭据设置屏**,而不是报错退出:
53
79
 
54
80
  ```
55
- ▶️ 继续上次未完成的对话 (12 条消息, 2025/1/1 12:00:00)
56
- 💬 开始新对话(放弃草稿)
81
+ ? 首次配置 · 设置 DeepSeek 的 API Key
82
+ 端点:DeepSeek · https://api.deepseek.com/v1
83
+ 当前:未设置
84
+ DeepSeek 申请地址:https://platform.deepseek.com/api_keys
85
+ 保存后立即进入对话(Esc 放弃并退出)。
86
+ ❯ ▏
57
87
  ```
58
88
 
89
+ `Enter` 保存并直接进入对话(写入 `~/.ai-zen/config.json`),`Tab` 切明文核对,`Esc` 放弃。进入对话后仍可用 `/key` 修改**当前端点**的 Key(保存后自动重建会话,立即生效)、用 `/config` 打开配置中心(默认模型 / 端点管理:列表含「+ 新建端点」与各端点,选中端点后可就地编辑 API Key / Base URL)。
90
+
91
+ ### 会话恢复
92
+
93
+ 每个会话都会在对话过程中**直接落盘为独立文件**(`cli/conversations/<id>.json`),不再有单独的草稿存储。一个指针文件(`cli/last-session.json`)记录**上一轮会话 id**;下次启动 `ai` 会**自动续接该会话**,接着上次继续。
94
+
59
95
  ### 对话命令
60
96
 
61
97
  对话中输入的所有命令以 `/` 开头。输入 `/` 会在输入行下方实时列出可用命令及说明,继续输入即按前缀收敛候选:
@@ -65,16 +101,19 @@ zen 你好,请介绍一下你自己。
65
101
  /back 撤回消息(可修改后重发)
66
102
  ```
67
103
 
68
- > 提示仅作展示,不改变提交语义:回车始终提交当前输入原文,命令按完整名称精确匹配;输入未识别的 `/xxx` 命令会提示「未知命令」。
104
+ > 输入 `/` 会在输入行下方实时列出候选命令(↑↓ 选择、`Tab` 补全、`Enter` 提交/执行);命令按完整名称匹配,输入未识别的 `/xxx` 会提示「未知命令」。
69
105
 
70
106
  | 命令 | 说明 |
71
107
  |------|------|
72
- | `/exit` `/quit` | 退出对话(会提示是否保存) |
73
- | `/save` | 保存当前对话 |
108
+ | `/exit` `/quit` | 退出对话 |
109
+ | `/save` | 保存当前对话(会话本就每轮实时落盘) |
110
+ | `/load` | 加载已保存的对话(替换当前会话) |
74
111
  | `/new` | 重置会话(清空历史) |
75
112
  | `/back` | 撤回消息(回退到指定位置并可编辑后重发) |
76
113
  | `/editor` | 使用系统编辑器(vim/nano)输入长消息 |
77
114
  | `/clear` | 清屏 |
115
+ | `/config` | 打开配置中心(端点 / 模型 / 图片模型 / MCP 服务器 / Agent 定义 / 默认项 / 工具上限) |
116
+ | `/key` | 设置当前端点的 API Key(保存后自动重建会话) |
78
117
  | `/migrate` | 手动任务迁移(生成交接文档并开启新会话) |
79
118
  | `/help` | 显示可用命令 |
80
119
 
@@ -100,19 +139,30 @@ zen 你好,请介绍一下你自己。
100
139
 
101
140
  ```bash
102
141
  # 安装钩子
103
- zen hook install
142
+ ai hook install
104
143
 
105
144
  # 之后随便输入点什么:
106
145
  > 今天天气怎么样?
107
146
  # 这条消息会被转发给 AI,而不是显示 "command not found"
108
147
 
109
148
  # 卸载钩子
110
- zen hook uninstall
149
+ ai hook uninstall
111
150
  ```
112
151
 
152
+ 钩子函数体调用的是 `ai "$@"`(纯 stdio 模式),答案就地写入当前 shell 会话。若此前安装过旧版 `aiz` 钩子,重新执行 `ai hook install` 会自动升级;也可先 `ai hook uninstall` 再安装。
153
+
113
154
  ## 配置管理
114
155
 
115
- 配置文件存储在 `~/.ai-zen/config.json`(或 `$AI_ZEN_DIR/config.json`),与其他 AI-Zen 客户端共享。其中 `maxContextTokens` 是迁移触发阈值(通常设为模型实际上下文窗口的约 25%,例如 1M tokens 的模型设为 250,000)。
156
+ 配置文件存储在 `~/.ai-zen/config.json`(或 `$AI_ZEN_DIR/config.json`),与其他 AI-Zen 客户端共享,是**唯一数据源**。常用项可在 TUI 内直接编辑,无需手改 JSON:
157
+
158
+ | 场景 | 做法 |
159
+ |------|------|
160
+ | 首次启动、端点缺 Key | 启动时自动弹出**凭据设置屏** |
161
+ | 修改当前模型所用端点的 Key | 对话内 `/key`(保存后自动重建会话) |
162
+ | 端点 / 模型 / 图片模型、MCP 服务器、Agent 定义(含 Sub-agent)、默认项、工具输出上限 | 对话内 `/config`(配置中心,全面管理) |
163
+ | 其它高级项(Skill / 用户工具等) | 手动编辑 `~/.ai-zen/` 下的文件 |
164
+
165
+ 其中 `maxContextTokens` 是迁移触发阈值(通常设为模型实际上下文窗口的约 25%,例如 1M tokens 的模型设为 250,000)。
116
166
 
117
167
  ```jsonc
118
168
  {
@@ -126,11 +176,12 @@ zen hook uninstall
126
176
  ],
127
177
  "models": [
128
178
  {
129
- "id": "gpt-5.5",
130
- "name": "GPT-5.5",
179
+ "id": "gpt-6.1-sol",
180
+ "name": "GPT-6.1 Sol",
131
181
  "endpointId": "openai",
132
- "modelName": "gpt-5.5",
133
- "maxContextTokens": 250000
182
+ "modelName": "gpt-6.1-sol",
183
+ "maxContextTokens": 250000,
184
+ "custom": true
134
185
  }
135
186
  ],
136
187
  "imageModels": [
@@ -142,13 +193,15 @@ zen hook uninstall
142
193
  "defaultSize": "1024x1024"
143
194
  }
144
195
  ],
145
- "defaultModel": "deepseek-v4-flash",
196
+ "defaultModel": "deepseek-flash",
146
197
  "defaultImageModel": "cogview-4",
147
198
  "defaultAgent": "default",
148
- "defaultMigrationModel": "deepseek-v4-flash"
199
+ "defaultMigrationModel": "deepseek-flash"
149
200
  }
150
201
  ```
151
202
 
203
+ > 说明:`models` / `imageModels` 中**未标 `custom: true`** 的条目属于**出厂托管**——每次启动会与 SDK 出厂清单对齐、被替换为最新定义;自建模型请加 `"custom": true`。`endpoints` 始终保留用户配置,不受影响。
204
+
152
205
  ### 环境变量
153
206
 
154
207
  - `AI_ZEN_DIR` — 覆盖共享根目录(默认 `~/.ai-zen`)。CLI 运行时数据在 `$AI_ZEN_DIR/cli/`,共享资源(agents、skills、tools、MCP 等)在 `$AI_ZEN_DIR/`。
@@ -160,7 +213,7 @@ zen hook uninstall
160
213
  ├── config.json ← 端点与模型配置(与其他 AI-Zen 客户端共享)
161
214
  ├── cli/ ← CLI 运行时数据
162
215
  │ ├── conversations/ ← CLI 对话记录
163
- │ └── drafts/ ← CLI 草稿
216
+ │ └── last-session.json ← 「上一轮会话 id」指针
164
217
  ├── agents/ ← Agent 定义(共享)
165
218
  │ ├── default.json ← 默认 Agent(首次运行自动创建)
166
219
  │ └── my-custom-agent.json
@@ -304,13 +357,14 @@ OAuth 2.0 授权流程(`mcp.json` 中的 `oauth` 字段)已定义类型和
304
357
 
305
358
  | ID | 名称 | 端点 |
306
359
  |----|------|------|
307
- | `gpt-5.5` | GPT-5.5 | OpenAI |
308
- | `glm-5.1` | GLM-5.1 | 智谱AI |
309
- | `glm-5v-turbo` | GLM-5V-Turbo(视觉) | 智谱AI |
360
+ | `gpt-6-astra` | GPT-6 Astra | OpenAI |
361
+ | `gpt-6.1-sol` | GPT-6.1 Sol | OpenAI |
362
+ | `gpt-6-luna` | GPT-6 Luna | OpenAI |
363
+ | `glm-5.3` | GLM-5.3 | 智谱AI |
364
+ | `glm-5.3-flash` | GLM-5.3-Flash(视觉) | 智谱AI |
365
+ | `glm-5.3-flashx` | GLM-5.3-FlashX(视觉) | 智谱AI |
310
366
  | `glm-4.7-flash` | GLM-4.7-Flash | 智谱AI |
311
- | `deepseek-v4-pro` | DeepSeek-V4-Pro | DeepSeek |
312
- | `deepseek-v4-flash` | DeepSeek-V4-Flash | DeepSeek(**默认模型**) |
313
- | `deepseek-v4-flash-vision-exp` | DeepSeek-V4-Flash-Vision-Exp(视觉) | DeepSeek |
367
+ | `deepseek-flash` | DeepSeek-V4.1-Flash(视觉) | DeepSeek(**默认模型**) |
314
368
 
315
369
  ## 开发
316
370
 
@@ -7,7 +7,13 @@
7
7
  import { Scope, SdkAgent } from "@ai-zen/agents-sdk";
8
8
  import type { AgentNS } from "@ai-zen/agents-core";
9
9
  export declare function getScope(): Promise<Scope>;
10
- export declare function resetScope(): void;
10
+ /**
11
+ * 重置 Scope 单例:释放当前 Scope(断开 MCP 连接等),下次 `getScope()` 按磁盘配置重建。
12
+ *
13
+ * 配置变更后(如 TUI 的 `/config` 改了端点凭据)必须调用:Scope 的 `config` 只在创建时
14
+ * 读取一次,不重建则新配置不生效。`_scope` 是同步置空的,便于并发调用方立刻拿到新实例。
15
+ */
16
+ export declare function resetScope(): Promise<void>;
11
17
  export interface CreateAgentOptions {
12
18
  messages?: AgentNS.Message[];
13
19
  agentId?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"agent-creator.d.ts","sourceRoot":"","sources":["../src/agent-creator.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EACL,KAAK,EAGL,QAAQ,EACT,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAiBnD,wBAAsB,QAAQ,IAAI,OAAO,CAAC,KAAK,CAAC,CA8C/C;AAED,wBAAgB,UAAU,IAAI,IAAI,CAEjC;AAID,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wBAAsB,WAAW,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,QAAQ,CAAC,CAchF"}
1
+ {"version":3,"file":"agent-creator.d.ts","sourceRoot":"","sources":["../src/agent-creator.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EACL,KAAK,EAGL,QAAQ,EACT,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAiBnD,wBAAsB,QAAQ,IAAI,OAAO,CAAC,KAAK,CAAC,CA8C/C;AAED;;;;;GAKG;AACH,wBAAsB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAShD;AAID,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wBAAsB,WAAW,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,QAAQ,CAAC,CAchF"}
@@ -53,8 +53,23 @@ export async function getScope() {
53
53
  await _scope.init();
54
54
  return _scope;
55
55
  }
56
- export function resetScope() {
56
+ /**
57
+ * 重置 Scope 单例:释放当前 Scope(断开 MCP 连接等),下次 `getScope()` 按磁盘配置重建。
58
+ *
59
+ * 配置变更后(如 TUI 的 `/config` 改了端点凭据)必须调用:Scope 的 `config` 只在创建时
60
+ * 读取一次,不重建则新配置不生效。`_scope` 是同步置空的,便于并发调用方立刻拿到新实例。
61
+ */
62
+ export async function resetScope() {
63
+ const scope = _scope;
57
64
  _scope = null;
65
+ if (!scope)
66
+ return;
67
+ try {
68
+ await scope.dispose();
69
+ }
70
+ catch {
71
+ /* 释放失败不影响后续重建 */
72
+ }
58
73
  }
59
74
  export async function createAgent(options) {
60
75
  const { messages, agentId } = options;
@@ -1 +1 @@
1
- {"version":3,"file":"agent-creator.js","sourceRoot":"","sources":["../src/agent-creator.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EACL,KAAK,EACL,QAAQ,EACR,WAAW,IAAI,cAAc,GAE9B,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EACL,UAAU,EAAE,cAAc,EAAE,UAAU,EAAE,SAAS,EACjD,UAAU,EACV,sBAAsB,EAAE,kBAAkB,EAAE,iBAAiB,EAC7D,sBAAsB,EAAE,2BAA2B,EACnD,yBAAyB,EAAE,8BAA8B,GAC1D,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,wDAAwD;AAExD,IAAI,MAAM,GAAiB,IAAI,CAAC;AAEhC,uCAAuC;AACvC,MAAM,MAAM,GAAG,UAAU,CAAC;AAE1B,MAAM,CAAC,KAAK,UAAU,QAAQ;IAC5B,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC;IAE1B,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;IAElC,qBAAqB;IACrB,oBAAoB;IACpB,2BAA2B;IAC3B,8CAA8C;IAC9C,0BAA0B;IAC1B,gDAAgD;IAChD,MAAM,QAAQ,GAAG;QACf,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,WAAW,CAAC;QAChC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,UAAU,CAAC;QAC1C,8BAA8B;QAC9B,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC;QAC5B,2BAA2B;KAC5B,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAEjB,sBAAsB;IACtB,0BAA0B;IAC1B,8CAA8C;IAC9C,yBAAyB;IACzB,gDAAgD;IAChD,MAAM,WAAW,GAAG;QAClB,kBAAkB;QAClB,yBAAyB;QACzB,UAAU;QACV,sBAAsB;KACvB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAEjB,MAAM,GAAG,IAAI,KAAK,CAAC;QACjB,MAAM;QACN,SAAS,EAAE,UAAU;KACtB,CAAC,CAAC,GAAG,CACJ,GAAG,QAAQ,CAAC;QACV,cAAc,EAAE,CAAC,sBAAsB,EAAE,cAAc,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC;QACvE,WAAW;QACX,UAAU,EAAE,CAAC,iBAAiB,EAAE,SAAS,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC;QACzD,QAAQ;KACT,CAAC,CACH,CAAC;IAEF,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;IAEpB,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,MAAM,GAAG,IAAI,CAAC;AAChB,CAAC;AASD,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,OAA2B;IAC3D,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;IACtC,MAAM,KAAK,GAAG,MAAM,QAAQ,EAAE,CAAC;IAE/B,wCAAwC;IACxC,MAAM,KAAK,GAAG,MAAM,cAAc,CAAC,KAAK,EAAE,OAAO,IAAI,SAAS,CAAC,CAAC;IAEhE,wBAAwB;IACxB,kDAAkD;IAClD,IAAI,QAAQ,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpC,KAAK,CAAC,QAAQ,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC;IACjC,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
1
+ {"version":3,"file":"agent-creator.js","sourceRoot":"","sources":["../src/agent-creator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Agent / Sub-agent 定义仓储 —— CLI 层
3
+ *
4
+ * 管理两处定义目录(均为「每实体一个 JSON,文件名 = `<id>.json`」):
5
+ * - 顶层 Agent:`~/.ai-zen/agents/*.json`(`/config`「默认 Agent」可选的那些)
6
+ * - 子 Agent: `~/.ai-zen/sub-agents/*.json`(可被委派,额外带 `function` 定义)
7
+ *
8
+ * 单文件读写委托 SDK 的 `AgentRepository`(`EntityRepository`),本模块只做「按 kind 分派」
9
+ * 与「快照 + 写操作」的组装,便于 TUI 与单测共用。
10
+ */
11
+ import type { AgentDefinition } from "@ai-zen/agents-sdk";
12
+ /** Agent 定义的类型:顶层 Agent / 子 Agent */
13
+ export type AgentKind = "agent" | "subagent";
14
+ /** 某个 kind 对应的定义目录 */
15
+ export declare function agentDir(kind: AgentKind): string;
16
+ /** kind 的中文名 */
17
+ export declare function agentKindLabel(kind: AgentKind): string;
18
+ /** 「Agent 定义」管理用的仓储:快照 + 写 / 删操作 */
19
+ export interface AgentStore {
20
+ agents: AgentDefinition[];
21
+ subAgents: AgentDefinition[];
22
+ save: (kind: AgentKind, def: AgentDefinition) => Promise<void>;
23
+ remove: (kind: AgentKind, id: string) => Promise<void>;
24
+ }
25
+ /** 取某 kind 的定义列表 */
26
+ export declare function agentList(store: AgentStore, kind: AgentKind): AgentDefinition[];
27
+ /** 按 id 查找某 kind 的定义 */
28
+ export declare function findAgentDefinition(store: AgentStore, kind: AgentKind, id: string | undefined): AgentDefinition | undefined;
29
+ /** 用给定快照 + 真实文件读写构造仓储 */
30
+ export declare function createAgentStore(agents: AgentDefinition[], subAgents: AgentDefinition[]): AgentStore;
31
+ /** 从磁盘读取 Agent / Sub-agent 快照,并附带真实读写能力 */
32
+ export declare function readAgentStore(): Promise<AgentStore>;
33
+ //# sourceMappingURL=agents-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agents-store.d.ts","sourceRoot":"","sources":["../src/agents-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAG1D,qCAAqC;AACrC,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,UAAU,CAAC;AAE7C,sBAAsB;AACtB,wBAAgB,QAAQ,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,CAEhD;AAED,gBAAgB;AAChB,wBAAgB,cAAc,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,CAEtD;AAED,oCAAoC;AACpC,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,SAAS,EAAE,eAAe,EAAE,CAAC;IAC7B,IAAI,EAAE,CAAC,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,eAAe,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/D,MAAM,EAAE,CAAC,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACxD;AAED,oBAAoB;AACpB,wBAAgB,SAAS,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,GAAG,eAAe,EAAE,CAE/E;AAED,wBAAwB;AACxB,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,UAAU,EACjB,IAAI,EAAE,SAAS,EACf,EAAE,EAAE,MAAM,GAAG,SAAS,GACrB,eAAe,GAAG,SAAS,CAG7B;AAED,yBAAyB;AACzB,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,eAAe,EAAE,EAAE,SAAS,EAAE,eAAe,EAAE,GAAG,UAAU,CAWpG;AAED,2CAA2C;AAC3C,wBAAsB,cAAc,IAAI,OAAO,CAAC,UAAU,CAAC,CAI1D"}