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

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 (181) hide show
  1. package/CHANGELOG.md +356 -0
  2. package/README.md +99 -28
  3. package/README.zh.md +99 -28
  4. package/dist/agent-creator.d.ts +11 -0
  5. package/dist/agent-creator.d.ts.map +1 -1
  6. package/dist/agent-creator.js +20 -11
  7. package/dist/agent-creator.js.map +1 -1
  8. package/dist/agents-store.d.ts.map +1 -1
  9. package/dist/agents-store.js +40 -3
  10. package/dist/agents-store.js.map +1 -1
  11. package/dist/auto-migrate-confirm.d.ts +43 -0
  12. package/dist/auto-migrate-confirm.d.ts.map +1 -0
  13. package/dist/auto-migrate-confirm.js +46 -0
  14. package/dist/auto-migrate-confirm.js.map +1 -0
  15. package/dist/config-editor.d.ts +4 -4
  16. package/dist/config-editor.d.ts.map +1 -1
  17. package/dist/config-editor.js +6 -8
  18. package/dist/config-editor.js.map +1 -1
  19. package/dist/config.d.ts +23 -2
  20. package/dist/config.d.ts.map +1 -1
  21. package/dist/config.js +26 -2
  22. package/dist/config.js.map +1 -1
  23. package/dist/conversation-commands/registry.d.ts.map +1 -1
  24. package/dist/conversation-commands/registry.js +4 -1
  25. package/dist/conversation-commands/registry.js.map +1 -1
  26. package/dist/conversation-persist-plugin.d.ts +0 -1
  27. package/dist/conversation-persist-plugin.d.ts.map +1 -1
  28. package/dist/conversation-persist-plugin.js +2 -3
  29. package/dist/conversation-persist-plugin.js.map +1 -1
  30. package/dist/conversation-repository.d.ts +5 -1
  31. package/dist/conversation-repository.d.ts.map +1 -1
  32. package/dist/conversation-repository.js +1 -2
  33. package/dist/conversation-repository.js.map +1 -1
  34. package/dist/handoff-service.d.ts +19 -0
  35. package/dist/handoff-service.d.ts.map +1 -0
  36. package/dist/handoff-service.js +86 -0
  37. package/dist/handoff-service.js.map +1 -0
  38. package/dist/index.js +21 -3
  39. package/dist/index.js.map +1 -1
  40. package/dist/model-switch.d.ts +58 -0
  41. package/dist/model-switch.d.ts.map +1 -0
  42. package/dist/model-switch.js +61 -0
  43. package/dist/model-switch.js.map +1 -0
  44. package/dist/reasoning-effort.d.ts +77 -0
  45. package/dist/reasoning-effort.d.ts.map +1 -0
  46. package/dist/reasoning-effort.js +137 -0
  47. package/dist/reasoning-effort.js.map +1 -0
  48. package/dist/reasoning-presets.d.ts +34 -0
  49. package/dist/reasoning-presets.d.ts.map +1 -0
  50. package/dist/reasoning-presets.js +85 -0
  51. package/dist/reasoning-presets.js.map +1 -0
  52. package/dist/sdk-log.d.ts +48 -0
  53. package/dist/sdk-log.d.ts.map +1 -0
  54. package/dist/sdk-log.js +67 -0
  55. package/dist/sdk-log.js.map +1 -0
  56. package/dist/session-pointer.d.ts +22 -9
  57. package/dist/session-pointer.d.ts.map +1 -1
  58. package/dist/session-pointer.js +55 -23
  59. package/dist/session-pointer.js.map +1 -1
  60. package/dist/stdio-runner.d.ts.map +1 -1
  61. package/dist/stdio-runner.js +15 -13
  62. package/dist/stdio-runner.js.map +1 -1
  63. package/dist/sub-agent-guard-plugin.d.ts +5 -5
  64. package/dist/sub-agent-guard-plugin.d.ts.map +1 -1
  65. package/dist/sub-agent-guard-plugin.js +7 -7
  66. package/dist/sub-agent-guard-plugin.js.map +1 -1
  67. package/dist/tui/chat-session.d.ts +83 -59
  68. package/dist/tui/chat-session.d.ts.map +1 -1
  69. package/dist/tui/chat-session.js +161 -105
  70. package/dist/tui/chat-session.js.map +1 -1
  71. package/dist/tui/components.d.ts +7 -2
  72. package/dist/tui/components.d.ts.map +1 -1
  73. package/dist/tui/components.js +3 -3
  74. package/dist/tui/components.js.map +1 -1
  75. package/dist/tui/config-wizard/engine.js +1 -1
  76. package/dist/tui/config-wizard/engine.js.map +1 -1
  77. package/dist/tui/config-wizard/fields.d.ts +3 -1
  78. package/dist/tui/config-wizard/fields.d.ts.map +1 -1
  79. package/dist/tui/config-wizard/fields.js +58 -6
  80. package/dist/tui/config-wizard/fields.js.map +1 -1
  81. package/dist/tui/config-wizard/menu.d.ts.map +1 -1
  82. package/dist/tui/config-wizard/menu.js +2 -3
  83. package/dist/tui/config-wizard/menu.js.map +1 -1
  84. package/dist/tui/config-wizard/step-defaults.d.ts.map +1 -1
  85. package/dist/tui/config-wizard/step-defaults.js +4 -11
  86. package/dist/tui/config-wizard/step-defaults.js.map +1 -1
  87. package/dist/tui/config-wizard/types.d.ts +18 -3
  88. package/dist/tui/config-wizard/types.d.ts.map +1 -1
  89. package/dist/tui/config-wizard/wizard.d.ts.map +1 -1
  90. package/dist/tui/config-wizard/wizard.js +4 -3
  91. package/dist/tui/config-wizard/wizard.js.map +1 -1
  92. package/dist/tui/highlight.d.ts +3 -2
  93. package/dist/tui/highlight.d.ts.map +1 -1
  94. package/dist/tui/highlight.js +3 -2
  95. package/dist/tui/highlight.js.map +1 -1
  96. package/dist/tui/index.d.ts +1 -0
  97. package/dist/tui/index.d.ts.map +1 -1
  98. package/dist/tui/index.js +87 -40
  99. package/dist/tui/index.js.map +1 -1
  100. package/dist/tui/input-editing.d.ts +49 -0
  101. package/dist/tui/input-editing.d.ts.map +1 -0
  102. package/dist/tui/input-editing.js +87 -0
  103. package/dist/tui/input-editing.js.map +1 -0
  104. package/dist/tui/key-debug.d.ts +62 -0
  105. package/dist/tui/key-debug.d.ts.map +1 -0
  106. package/dist/tui/key-debug.js +92 -0
  107. package/dist/tui/key-debug.js.map +1 -0
  108. package/dist/tui/mouse.d.ts +55 -0
  109. package/dist/tui/mouse.d.ts.map +1 -0
  110. package/dist/tui/mouse.js +74 -0
  111. package/dist/tui/mouse.js.map +1 -0
  112. package/dist/tui/screens/chat-commands.d.ts +12 -2
  113. package/dist/tui/screens/chat-commands.d.ts.map +1 -1
  114. package/dist/tui/screens/chat-commands.js +204 -17
  115. package/dist/tui/screens/chat-commands.js.map +1 -1
  116. package/dist/tui/screens/chat.d.ts +2 -5
  117. package/dist/tui/screens/chat.d.ts.map +1 -1
  118. package/dist/tui/screens/chat.js +460 -98
  119. package/dist/tui/screens/chat.js.map +1 -1
  120. package/dist/tui/screens/frame-buffer.d.ts +47 -0
  121. package/dist/tui/screens/frame-buffer.d.ts.map +1 -0
  122. package/dist/tui/screens/frame-buffer.js +78 -0
  123. package/dist/tui/screens/frame-buffer.js.map +1 -0
  124. package/dist/tui/screens/handoff-choice.d.ts +37 -0
  125. package/dist/tui/screens/handoff-choice.d.ts.map +1 -0
  126. package/dist/tui/screens/handoff-choice.js +41 -0
  127. package/dist/tui/screens/handoff-choice.js.map +1 -0
  128. package/dist/tui/screens/index.d.ts +8 -8
  129. package/dist/tui/screens/index.d.ts.map +1 -1
  130. package/dist/tui/screens/index.js +7 -7
  131. package/dist/tui/screens/index.js.map +1 -1
  132. package/dist/tui/screens/input.d.ts +35 -0
  133. package/dist/tui/screens/input.d.ts.map +1 -1
  134. package/dist/tui/screens/input.js +66 -0
  135. package/dist/tui/screens/input.js.map +1 -1
  136. package/dist/tui/screens/layout.d.ts +13 -3
  137. package/dist/tui/screens/layout.d.ts.map +1 -1
  138. package/dist/tui/screens/layout.js +15 -8
  139. package/dist/tui/screens/layout.js.map +1 -1
  140. package/dist/tui/screens/lines.d.ts +12 -41
  141. package/dist/tui/screens/lines.d.ts.map +1 -1
  142. package/dist/tui/screens/lines.js +87 -95
  143. package/dist/tui/screens/lines.js.map +1 -1
  144. package/dist/tui/screens/messages-view.d.ts +10 -0
  145. package/dist/tui/screens/messages-view.d.ts.map +1 -0
  146. package/dist/tui/screens/messages-view.js +115 -0
  147. package/dist/tui/screens/messages-view.js.map +1 -0
  148. package/dist/tui/screens/notice.d.ts +32 -0
  149. package/dist/tui/screens/notice.d.ts.map +1 -0
  150. package/dist/tui/screens/notice.js +46 -0
  151. package/dist/tui/screens/notice.js.map +1 -0
  152. package/dist/tui/screens/render.d.ts +2 -4
  153. package/dist/tui/screens/render.d.ts.map +1 -1
  154. package/dist/tui/screens/render.js +7 -43
  155. package/dist/tui/screens/render.js.map +1 -1
  156. package/dist/tui/screens/splash.d.ts.map +1 -1
  157. package/dist/tui/screens/splash.js +7 -1
  158. package/dist/tui/screens/splash.js.map +1 -1
  159. package/dist/tui/text.d.ts +12 -2
  160. package/dist/tui/text.d.ts.map +1 -1
  161. package/dist/tui/text.js +17 -3
  162. package/dist/tui/text.js.map +1 -1
  163. package/dist/tui/theme.d.ts +7 -1
  164. package/dist/tui/theme.d.ts.map +1 -1
  165. package/dist/tui/theme.js +15 -3
  166. package/dist/tui/theme.js.map +1 -1
  167. package/dist/types.d.ts +7 -5
  168. package/dist/types.d.ts.map +1 -1
  169. package/package.json +3 -3
  170. package/dist/auto-migrate-confirm-plugin.d.ts +0 -58
  171. package/dist/auto-migrate-confirm-plugin.d.ts.map +0 -1
  172. package/dist/auto-migrate-confirm-plugin.js +0 -61
  173. package/dist/auto-migrate-confirm-plugin.js.map +0 -1
  174. package/dist/migration-service.d.ts +0 -15
  175. package/dist/migration-service.d.ts.map +0 -1
  176. package/dist/migration-service.js +0 -59
  177. package/dist/migration-service.js.map +0 -1
  178. package/dist/tui/screens/state.d.ts +0 -13
  179. package/dist/tui/screens/state.d.ts.map +0 -1
  180. package/dist/tui/screens/state.js +0 -75
  181. package/dist/tui/screens/state.js.map +0 -1
package/README.zh.md CHANGED
@@ -66,12 +66,79 @@ ai --version
66
66
  ╚═╝ ╚═╝╚═╝ ╚══════╝╚══════╝╚═╝ ╚═══╝
67
67
 
68
68
  终端里的 AI 协作台
69
- v1.0.0-alpha.2 · sdk x · core y
69
+ v1.0.0-alpha.20 · sdk x · core y
70
70
  ```
71
71
 
72
- 启动界面结束后**直接进入对话界面**(若存在「上一轮会话」则自动续接,否则新建对话)。对话界面采用**底部固定**布局:分隔线、输入行与状态栏(模型 · Agent · token 用量 · 生成状态)始终贴在终端底部,对话内容在其上方滚动;生成中时输入行位置显示进度指示。
72
+ 启动界面结束后**直接进入对话界面**(若存在「上一轮会话」则自动续接,否则新建对话)。对话界面采用**底部固定**布局:分隔线、输入行与状态栏(模型 · Agent · 本轮/累计 token 用量 · 生成状态)始终贴在终端底部,对话内容在其上方滚动;生成中时输入行位置显示进度指示。
73
73
 
74
- 对话界面包含:流式输出区(思考过程 / 回答正文 / 工具调用分行展示)、多行输入(`Enter` 发送、`Ctrl+N` 换行、`← →` 移动光标、`Ctrl+← →` 跨词)与内联 `/` 命令菜单(↑↓ 选择、`Tab` 补全)。工具调用以 `⚙ 名称(参数)` 展示并带 **JSON 语法高亮**,正文与思考里的**围栏代码块按语言高亮**(高亮数据来自 `highlight.js` / `lowlight`)。`Ctrl+C` 在生成中取消本轮请求、空闲时退出。
74
+ 对话界面包含:流式输出区(思考过程 / 回答正文 / 工具调用分行展示)、多行输入(`Enter` 发送、`Ctrl+N` 换行、`← →` 移动光标、`Ctrl+← →` 跨词、`Ctrl+W` / `Alt+Backspace` 删前一个词、`Alt+D` / `Ctrl+Delete` 删后一个词、`Ctrl+K` 删到行尾、`Ctrl+U` 删到行首、`PgUp`/`PgDn`(或 `Alt+V`/`Ctrl+V`)翻页、鼠标滚轮按行滚动;macOS 上另支持 `⌘← →` 跨词、`⌘⌫`/`⌘⌦` 按词删除、`⌘[`/`⌘]` 翻页、`⌘;`/`⌘'` 按行滚动(取决于终端是否上报 Cmd,见下))与内联 `/` 命令菜单(↑↓ 选择、`Tab` 补全)。工具调用以 `⚙ 名称(参数)` 展示并带 **JSON 语法高亮**,正文与思考按 **Markdown 源码着色**(标题 / 粗体 / 斜体 / 行内代码 / 列表 / 引用 / 链接),**围栏代码块按语言高亮并保留围栏标记**(高亮数据来自 `highlight.js` / `lowlight`)。`Ctrl+C` 在生成中取消本轮请求、空闲时退出。
75
+
76
+ ### 键盘与终端兼容(macOS 等)
77
+
78
+ macOS 上终端 TUI 的通行做法是 **Option 当 Meta + readline 系 Ctrl 键**:`Cmd` 不在终端协议里(`super` 只有 kitty 键盘协议才会上报,见 [kitty keyboard protocol](https://sw.kovidgoyal.net/kitty/keyboard-protocol/)),因此 `⌘` 主要留给终端自身(复制 / 粘贴 / 搜索)。本 CLI 的键位与这条路线一致。
79
+
80
+ **第一步:把 Option 设为 Meta**。macOS 终端默认不发送 Option 修饰位,不设则所有 `Option+X` 全部无效:
81
+
82
+ | 终端 | 设置 |
83
+ |------|------|
84
+ | Apple Terminal | 设置 → 描述文件 → 键盘 → 勾选「**将 Option 用作 Meta 键**」 |
85
+ | iTerm2 | Settings → Profiles → Keys → General → Left/Right Option key 设为 `Esc+` |
86
+ | VS Code / Cursor | settings 里加 `"terminal.integrated.macOptionIsMeta": true` |
87
+ | Ghostty / kitty / WezTerm | 配置文件中启用 Option-as-Alt / Option-as-Meta |
88
+
89
+ 键位一览(与 [Claude Code](https://docs.claude.com/en/docs/claude-code/interactive-mode) 对齐):
90
+
91
+ | 键位 | 作用 |
92
+ |------|------|
93
+ | `Enter` | 发送 |
94
+ | `Ctrl+J`、`Ctrl+Enter`、`Alt+Enter`、`Shift+Enter` | 换行 |
95
+ | `Ctrl+C` | 生成中:中断本轮;空闲:有草稿先清空,再按退出 |
96
+ | `Ctrl+D` | 有草稿:删光标后一个字符;空输入:连按两次退出 |
97
+ | `Esc` | 生成中:中断;否则清空草稿并回到底部 |
98
+ | `Ctrl+A` / `Ctrl+E` | 行首 / 行尾 |
99
+ | `Ctrl+P` / `Ctrl+N` | 历史上一条 / 下一条(也用于斜杠菜单选择) |
100
+ | `Ctrl+K` / `Ctrl+U` | 删到行尾 / 删到行首 |
101
+ | `Ctrl+W` | 删到前一空白(标点不切分:`src/utils/foo.ts` 一次删完) |
102
+ | `Alt+B` / `Alt+F` | 跨词移动 |
103
+ | `Alt+D`、`Alt+Backspace`、`Ctrl+Delete` | 按词删除(标点算分隔) |
104
+ | `Ctrl+Y` / `Alt+Y` | 取回刚删掉的文本 / 循环取回更早的 |
105
+ | `Ctrl+_` | 撤销上一次输入编辑 |
106
+ | `Ctrl+S` | 暂存当前草稿 / 再按恢复 |
107
+ | `Ctrl+V` | 预留:粘贴图片(**暂未实现**,按下会提示) |
108
+ | `Ctrl+L` | 清屏(保留上下文) |
109
+ | `PgUp` / `PgDn` | 应用内翻页回看 |
110
+ | 鼠标滚轮 | 按行滚动(每格 3 行)。开启鼠标上报后拖选复制需按住 `Shift`(终端原生选择);`tmux` 用户需 `set -g mouse off`,否则滚轮会先被 copy-mode 拦下 |
111
+ | `Shift+↑ ↓`、`Alt+↑ ↓`、`⌘;` / `⌘'`* | 按行滚动 |
112
+ | `\` + `Enter` | 换行(任何终端可用) |
113
+
114
+ 未实现(我们的场景没有对应物):`Ctrl+O` 转录查看器、`Ctrl+R` 反向历史搜索、`Ctrl+B` 后台任务、`Ctrl+T` 任务清单、`Shift+Tab` 权限模式。
115
+
116
+ `Ctrl+V`(Claude Code 的「粘贴图片」)**暂未实现**:按下会提示未支持。原因是它需要先解决「文件 → 内容块」的端点能力探测(Files API 上传 vs base64内联),不能简单硬编码某个端点。⌘⌫ 已被终端映射为 `Ctrl+U`,所以这里删到行首;要清空草稿用 `Esc`。
117
+
118
+ \* `⌘` 组合只有终端**启用 kitty 键盘协议**时才会带上 `super` 位(iTerm2 还需把 Cmd 映射为 Super);不支持的终端(如 Apple Terminal)只能在终端里把 `⌘` 映射成 `ESC` 序列(如 `⌘←` → `ESC[1;9D`,等价于 `Alt+←`),或直接用上表的 Alt 组合。
119
+
120
+ > macOS 的 `⌘⌫` 会被 iTerm2 / Terminal.app 映射为 `Ctrl+U`,因此本 CLI 的 `Ctrl+U` 取 readline 语义「删到行首」——若做成「清空全部」,Mac 用户按 `⌘⌫` 会丢掉整个草稿。
121
+
122
+ > `Ctrl+← →` 无效通常是系统原因:macOS 默认把它绑定给「调度中心 → 向左/向右移动一个空间」,按键在到达终端前就被截走。可在「系统设置 → 键盘 → 键盘快捷键 → 调度中心」取消勾选。
123
+
124
+ 若某个键仍然没反应,打开**按键诊断**再按一次:
125
+
126
+ ```bash
127
+ AIZ_DEBUG_KEYS=1 aiz
128
+ # 另开一个窗口
129
+ tail -f /tmp/aiz-key-debug.log
130
+ ```
131
+
132
+ 首行记录终端环境(`TERM` / `TERM_PROGRAM` 等),之后每次按键一行:
133
+
134
+ ```
135
+ key input="d" flags=[meta] raw=true
136
+ key input="" flags=[pageUp] raw=false
137
+ ```
138
+
139
+ - **按了键却没有新行** → 键被系统 / 终端截走(改系统快捷键或终端键位映射)
140
+ - **有行但 `flags` 与预期不符** → 序列已到达应用,是匹配逻辑问题(反馈时贴这一行)
141
+ - **`raw=false`** → stdin 不在 raw mode,按键被终端自己解释(例如去滚 scrollback)
75
142
 
76
143
  ### 首次配置(API Key)
77
144
 
@@ -113,26 +180,27 @@ ai --version
113
180
  | `/editor` | 使用系统编辑器(vim/nano)输入长消息 |
114
181
  | `/clear` | 清屏 |
115
182
  | `/config` | 打开配置中心(端点 / 模型 / 图片模型 / MCP 服务器 / Agent 定义 / 默认项 / 工具上限) |
183
+ | `/model` | 切换当前会话使用的模型并写入配置(写 Agent 的 `modelId`;思考强度重置为模型默认) |
184
+ | `/think` `/effort` | 切换思考强度(可选档位来自模型的思考策略表,如 `low/high/max`),写入当前 Agent 定义并立即生效;`/think default` 恢复跟随模型默认 |
116
185
  | `/key` | 设置当前端点的 API Key(保存后自动重建会话) |
117
- | `/migrate` | 手动任务迁移(生成交接文档并开启新会话) |
186
+ | `/handoff` | 编写任务交接文档(会话照旧,不弹确认) |
187
+ | `/migrate` `/migration` | 交接 + 开启新会话(清空历史,需确认) |
118
188
  | `/help` | 显示可用命令 |
119
189
 
120
- ### 任务迁移
190
+ ### 任务交接与迁移
121
191
 
122
- 当 API 响应中的 `usage.prompt_tokens` 超过模型的 `maxContextTokens` 时,系统会先**二次确认**(展示当前用量与阈值,默认「是」;选择「否」则跳过本次迁移、当前对话不受影响),确认后生成**交接文档**,汇总已完成任务、待办事项和关键决策,然后创建新会话并将交接文档注入为上下文,实现无缝衔接。确认框仅在 stdin/stdout 均为 TTY 时出现;管道、重定向等非交互场景无确认通道,保持既有自动迁移行为。
192
+ 两条命令,同一条管道:
123
193
 
124
- 你也可以在对话中随时输入 `/migrate` 手动触发迁移,而无需等待 token 超限。手动与自动迁移均委托给 SDK 的 `TaskMigrationService`,交接文档生成始终一致。
194
+ - **`/handoff`** — 原 agent 停下手头工作,用自己的工具核实真实状态(分支、未提交改动、测试、端口),把交接文档写到 `<项目>/.ai-zen/handoffs/<时间戳>-<会话id>.md`。会话照旧运行,因此可以继续打磨这份文档。
195
+ - **`/migrate`** — 同一次交接,然后把历史清空、以该文档开启新会话(断点消息只带路径,由新 agent 自己读取)。
125
196
 
126
- 同样的上下文护栏也作用于**子 Agent**:每次委派边界(`onSubAgentStart`)CLI 都会把同一个 `ContextGuardPlugin`(同一 `maxTokens`)安插到新建的子 Agent 上,因此被委派的子 Agent(含 `call_skill_sub_agent` 创建的技能子 Agent)在上下文超出硬上限时同样会被中断。该过程是透明的,正常运行的子 Agent 不受影响。
197
+ 两种执行者:`self`(默认——原 agent 在会话内写,保真度最高)与 `summary`(一次独立模型调用,便宜但有损)。`self` 失败时**单向**降级为 `summary`。可用 `/handoff summary` 或 `/migrate self` 显式指定。
127
198
 
128
- 迁移提示词模板包含:
129
- - **对话断点** — 最后一段对话原文引用
130
- - **已完成的任务** — 任务标题和产出路径
131
- - **未完成的任务** — 描述、进度、下一步
132
- - **重要记忆** — 技术偏好、踩坑记录、架构决策
133
- - **文件索引** — 关键文件及用途说明
134
- - **接手指令** — 先读文件验真、再对状态、后行动的 SOP
199
+ 当 `usage.prompt_tokens` 超过模型的 `tokenThresholds.handoff`,交互式终端会弹出三选一选择器(自交接 / 独立摘要 / 跳过);管道等非交互场景按默认执行者迁移,不阻塞。
135
200
 
201
+ 文档模板不在代码里:来自 `handoff` Skill(`~/.ai-zen/skills/handoff/SKILL.md`,由 SDK 释放并随版本同步;在 frontmatter 写 `metadata.custom: "true"` 可保留你自己的版本,也可在项目内覆盖)。完整链路、成本说明与模板章节见 [任务交接与迁移](./docs/zh/migration.md)。
202
+
203
+ 同样的上下文护栏也作用于**子 Agent**:每次委派边界(`onSubAgentStart`)CLI 都会把同一个 `ContextGuardPlugin`(同一 `maxTokens`)安插到新建的子 Agent 上,因此被委派的子 Agent(含 `call_skill_sub_agent` 创建的技能子 Agent)在上下文超出硬上限时同样会被中断。该过程是透明的,正常运行的子 Agent 不受影响。
136
204
  ### Shell 兜底钩子
137
205
 
138
206
  当你在终端输入一个不存在的命令时,自动转发给 AI 处理:
@@ -162,7 +230,7 @@ ai hook uninstall
162
230
  | 端点 / 模型 / 图片模型、MCP 服务器、Agent 定义(含 Sub-agent)、默认项、工具输出上限 | 对话内 `/config`(配置中心,全面管理) |
163
231
  | 其它高级项(Skill / 用户工具等) | 手动编辑 `~/.ai-zen/` 下的文件 |
164
232
 
165
- 其中 `maxContextTokens` 是迁移触发阈值(通常设为模型实际上下文窗口的约 25%,例如 1M tokens 的模型设为 250,000)。
233
+ 其中 `tokenThresholds` 是两条用量线:`handoff`(交接软线,超过它触发任务交接)与 `guard`(强行阻断硬线,请求前超过它中断本轮)。两者都是绝对值,建议 `guard ≈ handoff × 1.5`(`handoff` 通常设为模型实际上下文窗口的约 25%,例如 1M tokens 的模型设为 250,000)。
166
234
 
167
235
  ```jsonc
168
236
  {
@@ -180,7 +248,8 @@ ai hook uninstall
180
248
  "name": "GPT-6.1 Sol",
181
249
  "endpointId": "openai",
182
250
  "modelName": "gpt-6.1-sol",
183
- "maxContextTokens": 250000,
251
+ "tokenThresholds": { "handoff": 250000, "guard": 375000 },
252
+ "reasoningPreset": "openai",
184
253
  "custom": true
185
254
  }
186
255
  ],
@@ -193,7 +262,6 @@ ai hook uninstall
193
262
  "defaultSize": "1024x1024"
194
263
  }
195
264
  ],
196
- "defaultModel": "deepseek-flash",
197
265
  "defaultImageModel": "cogview-4",
198
266
  "defaultAgent": "default",
199
267
  "defaultMigrationModel": "deepseek-flash"
@@ -201,10 +269,13 @@ ai hook uninstall
201
269
  ```
202
270
 
203
271
  > 说明:`models` / `imageModels` 中**未标 `custom: true`** 的条目属于**出厂托管**——每次启动会与 SDK 出厂清单对齐、被替换为最新定义;自建模型请加 `"custom": true`。`endpoints` 始终保留用户配置,不受影响。
272
+ >
273
+ > 模型**不在 `config.json` 里指定**:每个 Agent 在自己的定义文件(`agents/<id>.json`)的 `modelId` 字段上绑定模型,这是运行期的唯一真相源;`/model` 切换写的也是它。
204
274
 
205
275
  ### 环境变量
206
276
 
207
277
  - `AI_ZEN_DIR` — 覆盖共享根目录(默认 `~/.ai-zen`)。CLI 运行时数据在 `$AI_ZEN_DIR/cli/`,共享资源(agents、skills、tools、MCP 等)在 `$AI_ZEN_DIR/`。
278
+ - `AIZ_DEBUG_KEYS=1` — 开启按键诊断日志(默认关闭,零开销);`AIZ_KEYS_FILE=<路径>` 可改落盘位置(默认 `/tmp/aiz-key-debug.log`)。
208
279
 
209
280
  ## 文件系统布局
210
281
 
@@ -262,25 +333,25 @@ CLI 提供 20 个内置工具,由 `@ai-zen/agents-sdk` 实现。工具可用
262
333
  | 工具 | 说明 |
263
334
  |------|------|
264
335
  | `cwd` | 获取当前工作目录 |
265
- | `readFile` | 读取文件内容(支持 `range` 分批读取) |
266
- | `inspectFile` | 勘察文件结构概况(行数、字符数、列宽分布、行尾风格),不读取内容 |
267
- | `writeFile` | 写入文件 |
336
+ | `read` | 读取文件内容(支持 `range` 分批读取) |
337
+ | `inspect_file` | 勘察文件结构概况(行数、字符数、列宽分布、行尾风格),不读取内容 |
338
+ | `write` | 写入文件 |
268
339
  | `edit` | 替换文件中的文本(单次替换) |
269
- | `batchEdit` | 批量编辑文本 |
340
+ | `batch_edit` | 批量编辑文本 |
270
341
  | `exec` | 执行 shell 命令 |
271
- | `exec_async` | 异步执行 shell 命令(立即返回,不等待结果) |
342
+ | `spawn` | 异步执行 shell 命令(立即返回,不等待结果) |
272
343
  | `mkdir` | 创建目录 |
273
344
  | `rm` | 删除文件或目录 |
274
345
  | `glob` | 通配符扫描文件 |
275
346
  | `ls` | 列出目录 |
276
347
  | `exist` | 检查路径是否存在 |
277
- | `findText` | 在文件中查找文本 |
278
- | `downloadFile` | 从 URL 下载文件 |
348
+ | `find_text` | 在文件中查找文本 |
349
+ | `download_file` | 从 URL 下载文件 |
279
350
  | `rename` | 重命名或移动文件 |
280
351
  | `copy` | 复制文件或目录 |
281
352
  | `sleep` | 等待指定毫秒数 |
282
- | `viewImage` | 查看/分析图片 — 仅视觉模型可用(`Model.vision`)。网络图片直接以 `image_url` 内容块返回;本地图片经 Files API 自动上传后以 `file` 内容块返回 |
283
- | `generateImage` | 根据描述生成图片 — 需配置 `defaultImageModel`;统一返回字符串(含图片 URL 列表与 `viewImage` / `downloadFile` 提示的 JSON),不再强制返回图片内容块 |
353
+ | `view_image` | 查看/分析图片 — 仅视觉模型可用(`Model.vision`)。网络图片直接以 `image_url` 内容块返回;本地图片经 Files API 自动上传后以 `file` 内容块返回 |
354
+ | `generate_image` | 根据描述生成图片 — 需配置 `defaultImageModel`;统一返回字符串(含图片 URL 列表与 `view_image` / `download_file` 提示的 JSON),不再强制返回图片内容块 |
284
355
 
285
356
  ### 动态工具
286
357
 
@@ -299,7 +370,7 @@ CLI 提供 20 个内置工具,由 `@ai-zen/agents-sdk` 实现。工具可用
299
370
  工具装配由 SDK 的 `Scope` 能力管线管理,分为三个阶段:
300
371
 
301
372
  1. **发现** — 扫描文件系统获取内置工具、用户工具、SubAgent、Skill 和 MCP 服务器。20 个内置工具全部无条件发现(此阶段不做过滤)
302
- 2. **过滤** — 应用权限(`allow`/`deny`)、安全排除(递归保护),以及各工具自声明的 `isAvailable(config, definition)`(在模型已知的构建阶段判断可用性;如 `viewImage` 仅视觉模型、`generateImage` 需配置 `defaultImageModel`)
373
+ 2. **过滤** — 应用权限(`allow`/`deny`)、安全排除(递归保护),以及各工具自声明的 `isAvailable(config, definition)`(在模型已知的构建阶段判断可用性;如 `view_image` 仅视觉模型、`generate_image` 需配置 `defaultImageModel`)
303
374
  3. **实例化** — 将过滤后的名称映射为 `Tool` 实例,注册动态加载器
304
375
 
305
376
  每个 Agent 拥有独立的权限配置,父 Agent 与 SubAgent 之间不继承权限。唯一的例外是 `call_skill_sub_agent` 创建的临时 Skill 子 Agent——它是临时的对话分身而非独立实体,因此沿用调用者的工具能力(不再走第二遍权限过滤)。
@@ -6,6 +6,17 @@
6
6
  */
7
7
  import { Scope, SdkAgent } from "@ai-zen/agents-sdk";
8
8
  import type { AgentNS } from "@ai-zen/agents-core";
9
+ /**
10
+ * Skill 目录列表(优先级从高到低):
11
+ * 1. 项目/.ai-zen/skills/
12
+ * 2. 项目/.agents/skills/ ← 业界通用规范
13
+ * 3. ~/.ai-zen/skills/
14
+ * 4. ~/.agents/skills/ ← 业界通用规范
15
+ *
16
+ * 同时供 Scope 装配与交接服务(读取 `handoff` Skill 正文)使用,避免两处各算一遍。
17
+ * 只返回**当前真实存在**的目录,不存在的不参与发现。
18
+ */
19
+ export declare function listSkillDirs(): string[];
9
20
  export declare function getScope(): Promise<Scope>;
10
21
  /**
11
22
  * 重置 Scope 单例:释放当前 Scope(断开 MCP 连接等),下次 `getScope()` 按磁盘配置重建。
@@ -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;;;;;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"}
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;;;;;;;;;GASG;AACH,wBAAgB,aAAa,IAAI,MAAM,EAAE,CAOxC;AAED,wBAAsB,QAAQ,IAAI,OAAO,CAAC,KAAK,CAAC,CAqC/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"}
@@ -13,6 +13,24 @@ import { readConfig } from "./config.js";
13
13
  let _scope = null;
14
14
  /** existsSync 的别名,用于数组 .filter() 场景 */
15
15
  const exists = existsSync;
16
+ /**
17
+ * Skill 目录列表(优先级从高到低):
18
+ * 1. 项目/.ai-zen/skills/
19
+ * 2. 项目/.agents/skills/ ← 业界通用规范
20
+ * 3. ~/.ai-zen/skills/
21
+ * 4. ~/.agents/skills/ ← 业界通用规范
22
+ *
23
+ * 同时供 Scope 装配与交接服务(读取 `handoff` Skill 正文)使用,避免两处各算一遍。
24
+ * 只返回**当前真实存在**的目录,不存在的不参与发现。
25
+ */
26
+ export function listSkillDirs() {
27
+ return [
28
+ PROJECT_SKILLS_DIR,
29
+ PROJECT_AGENTS_SKILLS_DIR,
30
+ SKILLS_DIR,
31
+ USER_AGENTS_SKILLS_DIR,
32
+ ].filter(exists);
33
+ }
16
34
  export async function getScope() {
17
35
  if (_scope)
18
36
  return _scope;
@@ -30,17 +48,8 @@ export async function getScope() {
30
48
  join(AI_ZEN_DIR, "mcp.json"),
31
49
  USER_AGENTS_MCP_CONFIG_FILE,
32
50
  ].filter(exists);
33
- // Skills 目录优先级(从高到低):
34
- // 1. 项目/.ai-zen/skills/
35
- // 2. 项目/.agents/skills/ ← 业界通用规范
36
- // 3. ~/.ai-zen/skills/
37
- // 4. ~/.agents/skills/ ← 业界通用规范
38
- const skillsPaths = [
39
- PROJECT_SKILLS_DIR,
40
- PROJECT_AGENTS_SKILLS_DIR,
41
- SKILLS_DIR,
42
- USER_AGENTS_SKILLS_DIR,
43
- ].filter(exists);
51
+ // Skills 目录优先级(从高到低):见 listSkillDirs()
52
+ const skillsPaths = listSkillDirs();
44
53
  _scope = new Scope({
45
54
  config,
46
55
  agentsDir: AGENTS_DIR,
@@ -1 +1 @@
1
- {"version":3,"file":"agent-creator.js","sourceRoot":"","sources":["../src/agent-creator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"agent-creator.js","sourceRoot":"","sources":["../src/agent-creator.ts"],"names":[],"mappings":"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"}
@@ -1 +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"}
1
+ {"version":3,"file":"agents-store.d.ts","sourceRoot":"","sources":["../src/agents-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,KAAK,EAAE,eAAe,EAA+B,MAAM,oBAAoB,CAAC;AAIvF,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,CAiC1D"}
@@ -9,7 +9,8 @@
9
9
  * 与「快照 + 写操作」的组装,便于 TUI 与单测共用。
10
10
  */
11
11
  import { AgentRepository } from "@ai-zen/agents-sdk";
12
- import { AGENTS_DIR, SUB_AGENTS_DIR } from "./config.js";
12
+ import { AGENTS_DIR, SUB_AGENTS_DIR, readConfig, readReasoningPresets } from "./config.js";
13
+ import { patchOf, presetFor } from "./reasoning-presets.js";
13
14
  /** 某个 kind 对应的定义目录 */
14
15
  export function agentDir(kind) {
15
16
  return kind === "agent" ? AGENTS_DIR : SUB_AGENTS_DIR;
@@ -43,8 +44,44 @@ export function createAgentStore(agents, subAgents) {
43
44
  }
44
45
  /** 从磁盘读取 Agent / Sub-agent 快照,并附带真实读写能力 */
45
46
  export async function readAgentStore() {
46
- const agents = await new AgentRepository(AGENTS_DIR).list();
47
- const subAgents = await new AgentRepository(SUB_AGENTS_DIR).list();
47
+ const repoAgents = new AgentRepository(AGENTS_DIR);
48
+ const repoSubAgents = new AgentRepository(SUB_AGENTS_DIR);
49
+ const [rawAgents, rawSubAgents] = await Promise.all([repoAgents.list(), repoSubAgents.list()]);
50
+ // 旧版 `/think` 把档位名写在 `reasoningEffort` 上;现在档位在写入时就展开成参数。
51
+ // 这里做一次性迁移:能查到策略就展开进 `modelParams`,查不到就只删旧字段。
52
+ const isLegacy = (def) => "reasoningEffort" in def;
53
+ const legacy = (defs) => defs.filter(isLegacy);
54
+ const needsMigration = legacy(rawAgents).length + legacy(rawSubAgents).length > 0;
55
+ if (!needsMigration)
56
+ return createAgentStore(rawAgents, rawSubAgents);
57
+ const [config, presets] = await Promise.all([readConfig(), readReasoningPresets()]);
58
+ const migrate = async (repo, defs) => {
59
+ const out = [];
60
+ for (const def of defs) {
61
+ if (!isLegacy(def)) {
62
+ out.push(def);
63
+ continue;
64
+ }
65
+ out.push(await migrateDefinition(repo, def, config, presets));
66
+ }
67
+ return out;
68
+ };
69
+ const agents = await migrate(repoAgents, rawAgents);
70
+ const subAgents = await migrate(repoSubAgents, rawSubAgents);
48
71
  return createAgentStore(agents, subAgents);
49
72
  }
73
+ /** 把旧 `reasoningEffort` 展开成 `modelParams` 并写回(只跑一次:写完旧字段就没了) */
74
+ async function migrateDefinition(repo, def, config, presets) {
75
+ const { reasoningEffort, ...rest } = def;
76
+ // 模型只认 Agent 定义自身的 modelId(配置层已无 defaultModel)
77
+ const modelId = rest.modelId;
78
+ const model = (config.models ?? []).find((item) => item.id === modelId);
79
+ const preset = model ? presetFor(model.id, model.reasoningPreset, presets) : undefined;
80
+ const patch = reasoningEffort ? patchOf(preset, reasoningEffort) : undefined;
81
+ const next = patch
82
+ ? { ...rest, modelParams: { ...(rest.modelParams ?? {}), ...patch } }
83
+ : rest;
84
+ await repo.write(next);
85
+ return next;
86
+ }
50
87
  //# sourceMappingURL=agents-store.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"agents-store.js","sourceRoot":"","sources":["../src/agents-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAErD,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAKzD,sBAAsB;AACtB,MAAM,UAAU,QAAQ,CAAC,IAAe;IACtC,OAAO,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,cAAc,CAAC;AACxD,CAAC;AAED,gBAAgB;AAChB,MAAM,UAAU,cAAc,CAAC,IAAe;IAC5C,OAAO,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC;AAClD,CAAC;AAUD,oBAAoB;AACpB,MAAM,UAAU,SAAS,CAAC,KAAiB,EAAE,IAAe;IAC1D,OAAO,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC;AAC3D,CAAC;AAED,wBAAwB;AACxB,MAAM,UAAU,mBAAmB,CACjC,KAAiB,EACjB,IAAe,EACf,EAAsB;IAEtB,IAAI,CAAC,EAAE;QAAE,OAAO,SAAS,CAAC;IAC1B,OAAO,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;AAC7D,CAAC;AAED,yBAAyB;AACzB,MAAM,UAAU,gBAAgB,CAAC,MAAyB,EAAE,SAA4B;IACtF,OAAO;QACL,MAAM;QACN,SAAS;QACT,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE;YACxB,MAAM,IAAI,eAAe,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACvD,CAAC;QACD,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE;YACzB,MAAM,IAAI,eAAe,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACvD,CAAC;KACF,CAAC;AACJ,CAAC;AAED,2CAA2C;AAC3C,MAAM,CAAC,KAAK,UAAU,cAAc;IAClC,MAAM,MAAM,GAAG,MAAM,IAAI,eAAe,CAAC,UAAU,CAAC,CAAC,IAAI,EAAE,CAAC;IAC5D,MAAM,SAAS,GAAG,MAAM,IAAI,eAAe,CAAC,cAAc,CAAC,CAAC,IAAI,EAAE,CAAC;IACnE,OAAO,gBAAgB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;AAC7C,CAAC"}
1
+ {"version":3,"file":"agents-store.js","sourceRoot":"","sources":["../src/agents-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * 自动迁移的「执行者选择」入口(CLI 层)。
3
+ *
4
+ * 背景:SDK 的 `AutoMigratePlugin` 在 `usage.prompt_tokens` 超过阈值时触发迁移,
5
+ * 但「谁来写交接文档」是产品决策——保真度高的**原 agent 自交接**,还是便宜的**独立摘要**。
6
+ * SDK 已把该决策抽象为 `resolveMode` 回调,CLI 在这里把它接到「用户三选一」上:
7
+ * 原 agent 自交接 / 独立摘要 / 跳过本次迁移。
8
+ *
9
+ * 边界(保持 SDK 的分工,不重复实现「何时迁移」的语义):
10
+ * - **何时迁移**:`AutoMigratePlugin`(阈值判断 + busy 让行);
11
+ * - **用什么执行者**:本模块的 `resolveMode`;
12
+ * - **实际怎么交接**:共享的 `HandoffService`(与 `/migrate`、`/handoff` 同一条链路)。
13
+ *
14
+ * 交互约定:
15
+ * - 仅在 stdin 与 stdout **均为 TTY**(人类交互终端)时询问;
16
+ * - 非交互环境(管道、重定向、e2e 脚本)没有选择通道,直接按 `defaultMode` 迁移,
17
+ * 不阻塞等待输入、不额外输出,管道语义不变;
18
+ * - 选择器默认高亮 `self`(保真),Esc/取消 = 跳过本次迁移,不影响当前对话
19
+ * (历史未被剔除);只要仍处于超限状态,下次发送后还会再问。
20
+ */
21
+ import { AutoMigratePlugin, type AutoMigrateTriggerInfo, type HandoffMode, type HandoffService } from "@ai-zen/agents-sdk";
22
+ export interface AutoMigrateModeOptions {
23
+ /** 交接服务实例(与 `/migrate`、`/handoff` 共用同一实例) */
24
+ service: HandoffService;
25
+ /** 交接阈值(`tokenThresholds.handoff`):prompt_tokens 超过它即触发迁移 */
26
+ handoffTokens: number;
27
+ /**
28
+ * 用户的执行者选择(由调用方注入:TUI 用选择器浮层)。
29
+ * 返回 `null` 表示跳过本次迁移。
30
+ */
31
+ choose: (info: AutoMigrateTriggerInfo) => Promise<HandoffMode | null>;
32
+ /** 非交互环境下的执行者,默认 `self` */
33
+ defaultMode?: HandoffMode;
34
+ /** 是否需要向用户确认;默认「stdin 与 stdout 均为 TTY」。可注入,便于单测 */
35
+ shouldConfirm?: () => boolean;
36
+ /** 输出信息(如「已跳过本次迁移」);由调用方注入(TUI 走 Ink notice),默认丢弃 */
37
+ log?: (text: string) => void;
38
+ }
39
+ /** 默认交互判定:仅当 stdin 与 stdout 均为 TTY 时才具备选择通道 */
40
+ export declare function canPromptUser(): boolean;
41
+ /** 构造带「执行者选择」的自动迁移插件 */
42
+ export declare function createAutoMigratePlugin(options: AutoMigrateModeOptions): AutoMigratePlugin;
43
+ //# sourceMappingURL=auto-migrate-confirm.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auto-migrate-confirm.d.ts","sourceRoot":"","sources":["../src/auto-migrate-confirm.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EACL,iBAAiB,EACjB,KAAK,sBAAsB,EAC3B,KAAK,WAAW,EAChB,KAAK,cAAc,EACpB,MAAM,oBAAoB,CAAC;AAE5B,MAAM,WAAW,sBAAsB;IACrC,6CAA6C;IAC7C,OAAO,EAAE,cAAc,CAAC;IACxB,6DAA6D;IAC7D,aAAa,EAAE,MAAM,CAAC;IACtB;;;OAGG;IACH,MAAM,EAAE,CAAC,IAAI,EAAE,sBAAsB,KAAK,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IACtE,2BAA2B;IAC3B,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,mDAAmD;IACnD,aAAa,CAAC,EAAE,MAAM,OAAO,CAAC;IAC9B,qDAAqD;IACrD,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAC9B;AAED,+CAA+C;AAC/C,wBAAgB,aAAa,IAAI,OAAO,CAEvC;AAED,wBAAwB;AACxB,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,sBAAsB,GAAG,iBAAiB,CA4B1F"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * 自动迁移的「执行者选择」入口(CLI 层)。
3
+ *
4
+ * 背景:SDK 的 `AutoMigratePlugin` 在 `usage.prompt_tokens` 超过阈值时触发迁移,
5
+ * 但「谁来写交接文档」是产品决策——保真度高的**原 agent 自交接**,还是便宜的**独立摘要**。
6
+ * SDK 已把该决策抽象为 `resolveMode` 回调,CLI 在这里把它接到「用户三选一」上:
7
+ * 原 agent 自交接 / 独立摘要 / 跳过本次迁移。
8
+ *
9
+ * 边界(保持 SDK 的分工,不重复实现「何时迁移」的语义):
10
+ * - **何时迁移**:`AutoMigratePlugin`(阈值判断 + busy 让行);
11
+ * - **用什么执行者**:本模块的 `resolveMode`;
12
+ * - **实际怎么交接**:共享的 `HandoffService`(与 `/migrate`、`/handoff` 同一条链路)。
13
+ *
14
+ * 交互约定:
15
+ * - 仅在 stdin 与 stdout **均为 TTY**(人类交互终端)时询问;
16
+ * - 非交互环境(管道、重定向、e2e 脚本)没有选择通道,直接按 `defaultMode` 迁移,
17
+ * 不阻塞等待输入、不额外输出,管道语义不变;
18
+ * - 选择器默认高亮 `self`(保真),Esc/取消 = 跳过本次迁移,不影响当前对话
19
+ * (历史未被剔除);只要仍处于超限状态,下次发送后还会再问。
20
+ */
21
+ import { AutoMigratePlugin, } from "@ai-zen/agents-sdk";
22
+ /** 默认交互判定:仅当 stdin 与 stdout 均为 TTY 时才具备选择通道 */
23
+ export function canPromptUser() {
24
+ return Boolean(process.stdin.isTTY && process.stdout.isTTY);
25
+ }
26
+ /** 构造带「执行者选择」的自动迁移插件 */
27
+ export function createAutoMigratePlugin(options) {
28
+ const { service, handoffTokens, choose, defaultMode = "self", shouldConfirm = canPromptUser, log = () => { }, } = options;
29
+ return new AutoMigratePlugin({
30
+ service,
31
+ handoffTokens,
32
+ resolveMode: async (info) => {
33
+ // 非交互环境:没有选择通道,按默认执行者迁移(不阻塞、不额外输出)
34
+ if (!shouldConfirm())
35
+ return defaultMode;
36
+ const mode = await choose(info);
37
+ if (mode == null) {
38
+ // 合并为单条:notice 通道只保留最新一条,拆成两行会被后者覆盖
39
+ log("⏭️ 已跳过本次任务迁移;可随时输入 /migrate 手动迁移,若继续增长至严重超限对话会被安全护栏中断。");
40
+ return null;
41
+ }
42
+ return mode;
43
+ },
44
+ });
45
+ }
46
+ //# sourceMappingURL=auto-migrate-confirm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auto-migrate-confirm.js","sourceRoot":"","sources":["../src/auto-migrate-confirm.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EACL,iBAAiB,GAIlB,MAAM,oBAAoB,CAAC;AAoB5B,+CAA+C;AAC/C,MAAM,UAAU,aAAa;IAC3B,OAAO,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC9D,CAAC;AAED,wBAAwB;AACxB,MAAM,UAAU,uBAAuB,CAAC,OAA+B;IACrE,MAAM,EACJ,OAAO,EACP,aAAa,EACb,MAAM,EACN,WAAW,GAAG,MAAM,EACpB,aAAa,GAAG,aAAa,EAC7B,GAAG,GAAG,GAAG,EAAE,GAAE,CAAC,GACf,GAAG,OAAO,CAAC;IAEZ,OAAO,IAAI,iBAAiB,CAAC;QAC3B,OAAO;QACP,aAAa;QACb,WAAW,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;YAC1B,mCAAmC;YACnC,IAAI,CAAC,aAAa,EAAE;gBAAE,OAAO,WAAW,CAAC;YAEzC,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;YAChC,IAAI,IAAI,IAAI,IAAI,EAAE,CAAC;gBACjB,oCAAoC;gBACpC,GAAG,CACD,wDAAwD,CACzD,CAAC;gBACF,OAAO,IAAI,CAAC;YACd,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;KACF,CAAC,CAAC;AACL,CAAC"}
@@ -55,8 +55,6 @@ export declare function apiKeyGuide(baseUrl: string | undefined): ApiKeyGuide;
55
55
  export declare function setEndpointApiKey(config: AppConfig, endpointId: string, apiKey: string): AppConfig;
56
56
  /** 写入某端点的 Base URL(去除首尾空白) */
57
57
  export declare function setEndpointBaseUrl(config: AppConfig, endpointId: string, baseUrl: string): AppConfig;
58
- /** 设置默认模型(传 `undefined` 表示清空,交由 SDK 回退出厂默认) */
59
- export declare function setDefaultModel(config: AppConfig, modelId: string | undefined): AppConfig;
60
58
  /** 由端点名派生唯一的端点 id */
61
59
  export declare function uniqueEndpointId(config: AppConfig, name: string): string;
62
60
  /** 由模型名派生唯一的模型 id */
@@ -79,8 +77,10 @@ export declare function removeEndpoint(config: AppConfig, endpointId: string): A
79
77
  /** 通用模型字段改写(不可变) */
80
78
  export declare function updateModel(config: AppConfig, modelId: string, patch: Partial<Model>): AppConfig;
81
79
  /**
82
- * 删除模型;若 `defaultModel` / `defaultMigrationModel` 指向它,
83
- * 则改指剩余的第一个模型(无剩余模型则清空)。
80
+ * 删除模型;若 `defaultMigrationModel` 指向它,则改指剩余的第一个模型(无剩余则清空)。
81
+ *
82
+ * 模型真相源是 `AgentDefinition.modelId`(不在配置里),所以这里无需处理任何
83
+ * 「默认模型」——删除后由 `createAgent` 报错引导用户重选,而不是静默回退。
84
84
  */
85
85
  export declare function removeModel(config: AppConfig, modelId: string): AppConfig;
86
86
  /** 新增模型(id 由名称派生;默认 `custom: true`,避免被 SDK 出厂清单托管覆盖) */
@@ -1 +1 @@
1
- {"version":3,"file":"config-editor.d.ts","sourceRoot":"","sources":["../src/config-editor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config-editor.d.ts","sourceRoot":"","sources":["../src/config-editor.ts"],"names":[],"mappings":"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"}
@@ -103,10 +103,6 @@ export function setEndpointBaseUrl(config, endpointId, baseUrl) {
103
103
  endpoints: config.endpoints.map((endpoint) => endpoint.id === endpointId ? { ...endpoint, baseUrl: baseUrl.trim() } : endpoint),
104
104
  };
105
105
  }
106
- /** 设置默认模型(传 `undefined` 表示清空,交由 SDK 回退出厂默认) */
107
- export function setDefaultModel(config, modelId) {
108
- return { ...config, defaultModel: modelId };
109
- }
110
106
  /** 由名称派生唯一 id:小写、非字母数字折叠为 `-`,冲突时追加序号 */
111
107
  function deriveUniqueId(taken, name, fallback) {
112
108
  const base = name.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "").slice(0, 32) || fallback;
@@ -161,8 +157,10 @@ export function updateModel(config, modelId, patch) {
161
157
  };
162
158
  }
163
159
  /**
164
- * 删除模型;若 `defaultModel` / `defaultMigrationModel` 指向它,
165
- * 则改指剩余的第一个模型(无剩余模型则清空)。
160
+ * 删除模型;若 `defaultMigrationModel` 指向它,则改指剩余的第一个模型(无剩余则清空)。
161
+ *
162
+ * 模型真相源是 `AgentDefinition.modelId`(不在配置里),所以这里无需处理任何
163
+ * 「默认模型」——删除后由 `createAgent` 报错引导用户重选,而不是静默回退。
166
164
  */
167
165
  export function removeModel(config, modelId) {
168
166
  const models = config.models.filter((model) => model.id !== modelId);
@@ -171,7 +169,6 @@ export function removeModel(config, modelId) {
171
169
  return {
172
170
  ...config,
173
171
  models,
174
- defaultModel: config.defaultModel && ids.has(config.defaultModel) ? config.defaultModel : fallback,
175
172
  defaultMigrationModel: config.defaultMigrationModel && ids.has(config.defaultMigrationModel)
176
173
  ? config.defaultMigrationModel
177
174
  : fallback,
@@ -185,7 +182,8 @@ export function addModel(config, input) {
185
182
  name: input.name.trim() || id,
186
183
  endpointId: input.endpointId,
187
184
  modelName: input.modelName?.trim() || id,
188
- maxContextTokens: 128_000,
185
+ // 交接软线 128K / 阻断硬线 192K(与 SDK 迁移兜底一致)
186
+ tokenThresholds: { handoff: 128_000, guard: 192_000 },
189
187
  custom: true,
190
188
  };
191
189
  return { config: { ...config, models: [...config.models, model] }, model };