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

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 (249) hide show
  1. package/CHANGELOG.md +158 -0
  2. package/README.md +43 -17
  3. package/README.zh.md +43 -17
  4. package/dist/agent-creator.d.ts.map +1 -1
  5. package/dist/agent-creator.js +32 -10
  6. package/dist/agent-creator.js.map +1 -1
  7. package/dist/agent-switch.d.ts +61 -0
  8. package/dist/agent-switch.d.ts.map +1 -0
  9. package/dist/agent-switch.js +83 -0
  10. package/dist/agent-switch.js.map +1 -0
  11. package/dist/agents-store.d.ts +6 -1
  12. package/dist/agents-store.d.ts.map +1 -1
  13. package/dist/agents-store.js +6 -1
  14. package/dist/agents-store.js.map +1 -1
  15. package/dist/auto-migrate-confirm.d.ts.map +1 -1
  16. package/dist/auto-migrate-confirm.js +2 -1
  17. package/dist/auto-migrate-confirm.js.map +1 -1
  18. package/dist/config-editor.d.ts +9 -1
  19. package/dist/config-editor.d.ts.map +1 -1
  20. package/dist/config-editor.js +30 -19
  21. package/dist/config-editor.js.map +1 -1
  22. package/dist/config.d.ts +1 -1
  23. package/dist/config.d.ts.map +1 -1
  24. package/dist/config.js +29 -13
  25. package/dist/config.js.map +1 -1
  26. package/dist/conversation-commands/registry.d.ts +123 -4
  27. package/dist/conversation-commands/registry.d.ts.map +1 -1
  28. package/dist/conversation-commands/registry.js +92 -17
  29. package/dist/conversation-commands/registry.js.map +1 -1
  30. package/dist/conversation-persist-plugin.d.ts.map +1 -1
  31. package/dist/conversation-persist-plugin.js +6 -14
  32. package/dist/conversation-persist-plugin.js.map +1 -1
  33. package/dist/conversation-repository.d.ts +68 -14
  34. package/dist/conversation-repository.d.ts.map +1 -1
  35. package/dist/conversation-repository.js +81 -23
  36. package/dist/conversation-repository.js.map +1 -1
  37. package/dist/cwd-tracker-plugin.d.ts.map +1 -1
  38. package/dist/cwd-tracker-plugin.js +6 -2
  39. package/dist/cwd-tracker-plugin.js.map +1 -1
  40. package/dist/format-time.d.ts +17 -6
  41. package/dist/format-time.d.ts.map +1 -1
  42. package/dist/format-time.js +32 -14
  43. package/dist/format-time.js.map +1 -1
  44. package/dist/handoff-service.d.ts.map +1 -1
  45. package/dist/handoff-service.js +22 -19
  46. package/dist/handoff-service.js.map +1 -1
  47. package/dist/hook.d.ts.map +1 -1
  48. package/dist/hook.js +69 -15
  49. package/dist/hook.js.map +1 -1
  50. package/dist/i18n/en-wizard.d.ts +8 -0
  51. package/dist/i18n/en-wizard.d.ts.map +1 -0
  52. package/dist/i18n/en-wizard.js +290 -0
  53. package/dist/i18n/en-wizard.js.map +1 -0
  54. package/dist/i18n/en.d.ts +7 -0
  55. package/dist/i18n/en.d.ts.map +1 -0
  56. package/dist/i18n/en.js +224 -0
  57. package/dist/i18n/en.js.map +1 -0
  58. package/dist/i18n/index.d.ts +57 -0
  59. package/dist/i18n/index.d.ts.map +1 -0
  60. package/dist/i18n/index.js +109 -0
  61. package/dist/i18n/index.js.map +1 -0
  62. package/dist/i18n/preferences.d.ts +34 -0
  63. package/dist/i18n/preferences.d.ts.map +1 -0
  64. package/dist/i18n/preferences.js +69 -0
  65. package/dist/i18n/preferences.js.map +1 -0
  66. package/dist/i18n/zh-wizard.d.ts +11 -0
  67. package/dist/i18n/zh-wizard.d.ts.map +1 -0
  68. package/dist/i18n/zh-wizard.js +293 -0
  69. package/dist/i18n/zh-wizard.js.map +1 -0
  70. package/dist/i18n/zh.d.ts +10 -0
  71. package/dist/i18n/zh.d.ts.map +1 -0
  72. package/dist/i18n/zh.js +228 -0
  73. package/dist/i18n/zh.js.map +1 -0
  74. package/dist/index.js +41 -23
  75. package/dist/index.js.map +1 -1
  76. package/dist/mcp-command.d.ts +32 -0
  77. package/dist/mcp-command.d.ts.map +1 -0
  78. package/dist/mcp-command.js +37 -0
  79. package/dist/mcp-command.js.map +1 -0
  80. package/dist/mode.d.ts +31 -4
  81. package/dist/mode.d.ts.map +1 -1
  82. package/dist/mode.js +42 -7
  83. package/dist/mode.js.map +1 -1
  84. package/dist/model-switch.d.ts.map +1 -1
  85. package/dist/model-switch.js +5 -4
  86. package/dist/model-switch.js.map +1 -1
  87. package/dist/reasoning-effort.d.ts +23 -4
  88. package/dist/reasoning-effort.d.ts.map +1 -1
  89. package/dist/reasoning-effort.js +51 -24
  90. package/dist/reasoning-effort.js.map +1 -1
  91. package/dist/sdk-log.d.ts +23 -16
  92. package/dist/sdk-log.d.ts.map +1 -1
  93. package/dist/sdk-log.js +43 -19
  94. package/dist/sdk-log.js.map +1 -1
  95. package/dist/stdio-runner.d.ts.map +1 -1
  96. package/dist/stdio-runner.js +19 -19
  97. package/dist/stdio-runner.js.map +1 -1
  98. package/dist/tui/chat-session.d.ts +27 -0
  99. package/dist/tui/chat-session.d.ts.map +1 -1
  100. package/dist/tui/chat-session.js +120 -28
  101. package/dist/tui/chat-session.js.map +1 -1
  102. package/dist/tui/components.d.ts +43 -2
  103. package/dist/tui/components.d.ts.map +1 -1
  104. package/dist/tui/components.js +97 -4
  105. package/dist/tui/components.js.map +1 -1
  106. package/dist/tui/config-wizard/detail.d.ts +12 -6
  107. package/dist/tui/config-wizard/detail.d.ts.map +1 -1
  108. package/dist/tui/config-wizard/detail.js +33 -32
  109. package/dist/tui/config-wizard/detail.js.map +1 -1
  110. package/dist/tui/config-wizard/engine.d.ts.map +1 -1
  111. package/dist/tui/config-wizard/engine.js +26 -20
  112. package/dist/tui/config-wizard/engine.js.map +1 -1
  113. package/dist/tui/config-wizard/fields.d.ts.map +1 -1
  114. package/dist/tui/config-wizard/fields.js +176 -164
  115. package/dist/tui/config-wizard/fields.js.map +1 -1
  116. package/dist/tui/config-wizard/kv-editor.d.ts.map +1 -1
  117. package/dist/tui/config-wizard/kv-editor.js +9 -5
  118. package/dist/tui/config-wizard/kv-editor.js.map +1 -1
  119. package/dist/tui/config-wizard/list.d.ts.map +1 -1
  120. package/dist/tui/config-wizard/list.js +2 -1
  121. package/dist/tui/config-wizard/list.js.map +1 -1
  122. package/dist/tui/config-wizard/mcp-helpers.d.ts.map +1 -1
  123. package/dist/tui/config-wizard/mcp-helpers.js +4 -3
  124. package/dist/tui/config-wizard/mcp-helpers.js.map +1 -1
  125. package/dist/tui/config-wizard/menu.d.ts.map +1 -1
  126. package/dist/tui/config-wizard/menu.js +32 -19
  127. package/dist/tui/config-wizard/menu.js.map +1 -1
  128. package/dist/tui/config-wizard/prompt-editor.d.ts.map +1 -1
  129. package/dist/tui/config-wizard/prompt-editor.js +4 -3
  130. package/dist/tui/config-wizard/prompt-editor.js.map +1 -1
  131. package/dist/tui/config-wizard/prompt.d.ts.map +1 -1
  132. package/dist/tui/config-wizard/prompt.js +8 -7
  133. package/dist/tui/config-wizard/prompt.js.map +1 -1
  134. package/dist/tui/config-wizard/step-agents.d.ts.map +1 -1
  135. package/dist/tui/config-wizard/step-agents.js +29 -20
  136. package/dist/tui/config-wizard/step-agents.js.map +1 -1
  137. package/dist/tui/config-wizard/step-defaults.d.ts.map +1 -1
  138. package/dist/tui/config-wizard/step-defaults.js +21 -17
  139. package/dist/tui/config-wizard/step-defaults.js.map +1 -1
  140. package/dist/tui/config-wizard/step-endpoints.d.ts.map +1 -1
  141. package/dist/tui/config-wizard/step-endpoints.js +16 -6
  142. package/dist/tui/config-wizard/step-endpoints.js.map +1 -1
  143. package/dist/tui/config-wizard/step-mcp.d.ts.map +1 -1
  144. package/dist/tui/config-wizard/step-mcp.js +17 -19
  145. package/dist/tui/config-wizard/step-mcp.js.map +1 -1
  146. package/dist/tui/config-wizard/step-models.d.ts.map +1 -1
  147. package/dist/tui/config-wizard/step-models.js +41 -26
  148. package/dist/tui/config-wizard/step-models.js.map +1 -1
  149. package/dist/tui/config-wizard/step-new-endpoint.d.ts.map +1 -1
  150. package/dist/tui/config-wizard/step-new-endpoint.js +16 -12
  151. package/dist/tui/config-wizard/step-new-endpoint.js.map +1 -1
  152. package/dist/tui/config-wizard/step-simple.d.ts.map +1 -1
  153. package/dist/tui/config-wizard/step-simple.js +18 -17
  154. package/dist/tui/config-wizard/step-simple.js.map +1 -1
  155. package/dist/tui/index.d.ts +17 -1
  156. package/dist/tui/index.d.ts.map +1 -1
  157. package/dist/tui/index.js +25 -14
  158. package/dist/tui/index.js.map +1 -1
  159. package/dist/tui/input-editing.d.ts +4 -1
  160. package/dist/tui/input-editing.d.ts.map +1 -1
  161. package/dist/tui/input-editing.js +7 -3
  162. package/dist/tui/input-editing.js.map +1 -1
  163. package/dist/tui/phase.d.ts +64 -0
  164. package/dist/tui/phase.d.ts.map +1 -0
  165. package/dist/tui/phase.js +112 -0
  166. package/dist/tui/phase.js.map +1 -0
  167. package/dist/tui/screens/chat-commands.d.ts +54 -3
  168. package/dist/tui/screens/chat-commands.d.ts.map +1 -1
  169. package/dist/tui/screens/chat-commands.js +469 -330
  170. package/dist/tui/screens/chat-commands.js.map +1 -1
  171. package/dist/tui/screens/chat.d.ts +8 -0
  172. package/dist/tui/screens/chat.d.ts.map +1 -1
  173. package/dist/tui/screens/chat.js +206 -405
  174. package/dist/tui/screens/chat.js.map +1 -1
  175. package/dist/tui/screens/common-keys.d.ts +36 -0
  176. package/dist/tui/screens/common-keys.d.ts.map +1 -0
  177. package/dist/tui/screens/common-keys.js +67 -0
  178. package/dist/tui/screens/common-keys.js.map +1 -0
  179. package/dist/tui/screens/handoff-choice.d.ts.map +1 -1
  180. package/dist/tui/screens/handoff-choice.js +4 -3
  181. package/dist/tui/screens/handoff-choice.js.map +1 -1
  182. package/dist/tui/screens/index.d.ts +1 -1
  183. package/dist/tui/screens/index.d.ts.map +1 -1
  184. package/dist/tui/screens/index.js +1 -1
  185. package/dist/tui/screens/index.js.map +1 -1
  186. package/dist/tui/screens/input-row.d.ts +64 -0
  187. package/dist/tui/screens/input-row.d.ts.map +1 -0
  188. package/dist/tui/screens/input-row.js +67 -0
  189. package/dist/tui/screens/input-row.js.map +1 -0
  190. package/dist/tui/screens/input.d.ts +11 -1
  191. package/dist/tui/screens/input.d.ts.map +1 -1
  192. package/dist/tui/screens/input.js +21 -12
  193. package/dist/tui/screens/input.js.map +1 -1
  194. package/dist/tui/screens/layout.d.ts +8 -0
  195. package/dist/tui/screens/layout.d.ts.map +1 -1
  196. package/dist/tui/screens/layout.js +6 -2
  197. package/dist/tui/screens/layout.js.map +1 -1
  198. package/dist/tui/screens/lines.d.ts.map +1 -1
  199. package/dist/tui/screens/lines.js +6 -6
  200. package/dist/tui/screens/lines.js.map +1 -1
  201. package/dist/tui/screens/messages-view.d.ts.map +1 -1
  202. package/dist/tui/screens/messages-view.js +5 -4
  203. package/dist/tui/screens/messages-view.js.map +1 -1
  204. package/dist/tui/screens/notice-bar.d.ts +5 -0
  205. package/dist/tui/screens/notice-bar.d.ts.map +1 -0
  206. package/dist/tui/screens/notice-bar.js +15 -0
  207. package/dist/tui/screens/notice-bar.js.map +1 -0
  208. package/dist/tui/screens/notice.d.ts +40 -8
  209. package/dist/tui/screens/notice.d.ts.map +1 -1
  210. package/dist/tui/screens/notice.js +75 -15
  211. package/dist/tui/screens/notice.js.map +1 -1
  212. package/dist/tui/screens/overlays.d.ts.map +1 -1
  213. package/dist/tui/screens/overlays.js +3 -2
  214. package/dist/tui/screens/overlays.js.map +1 -1
  215. package/dist/tui/screens/splash.d.ts +1 -1
  216. package/dist/tui/screens/splash.d.ts.map +1 -1
  217. package/dist/tui/screens/splash.js +5 -2
  218. package/dist/tui/screens/splash.js.map +1 -1
  219. package/dist/tui/screens/use-chat-viewport.d.ts +22 -0
  220. package/dist/tui/screens/use-chat-viewport.d.ts.map +1 -0
  221. package/dist/tui/screens/use-chat-viewport.js +50 -0
  222. package/dist/tui/screens/use-chat-viewport.js.map +1 -0
  223. package/dist/tui/screens/use-input-editing.d.ts +44 -0
  224. package/dist/tui/screens/use-input-editing.d.ts.map +1 -0
  225. package/dist/tui/screens/use-input-editing.js +192 -0
  226. package/dist/tui/screens/use-input-editing.js.map +1 -0
  227. package/dist/tui/screens/use-overlays.d.ts +25 -0
  228. package/dist/tui/screens/use-overlays.d.ts.map +1 -0
  229. package/dist/tui/screens/use-overlays.js +32 -0
  230. package/dist/tui/screens/use-overlays.js.map +1 -0
  231. package/dist/tui/screens/use-wizard-host.d.ts +35 -0
  232. package/dist/tui/screens/use-wizard-host.d.ts.map +1 -0
  233. package/dist/tui/screens/use-wizard-host.js +103 -0
  234. package/dist/tui/screens/use-wizard-host.js.map +1 -0
  235. package/dist/tui/status-segments.d.ts +37 -0
  236. package/dist/tui/status-segments.d.ts.map +1 -0
  237. package/dist/tui/status-segments.js +166 -0
  238. package/dist/tui/status-segments.js.map +1 -0
  239. package/dist/tui/text.d.ts +8 -5
  240. package/dist/tui/text.d.ts.map +1 -1
  241. package/dist/tui/text.js +95 -35
  242. package/dist/tui/text.js.map +1 -1
  243. package/dist/tui/token-rate.d.ts +83 -0
  244. package/dist/tui/token-rate.d.ts.map +1 -0
  245. package/dist/tui/token-rate.js +195 -0
  246. package/dist/tui/token-rate.js.map +1 -0
  247. package/dist/types.d.ts +0 -3
  248. package/dist/types.d.ts.map +1 -1
  249. package/package.json +4 -3
@@ -1 +1 @@
1
- {"version":3,"file":"model-switch.d.ts","sourceRoot":"","sources":["../src/model-switch.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAGH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAG1D,MAAM,WAAW,eAAe;IAC9B,kDAAkD;IAClD,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAAC;IACjE,iBAAiB;IACjB,UAAU,CAAC,EAAE,CAAC,UAAU,EAAE,eAAe,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5D,kBAAkB;IAClB,GAAG,CAAC,EAAE,IAAI,CAAC;CACZ;AAED,MAAM,WAAW,kBAAmB,SAAQ,eAAe;IACzD,MAAM,EAAE,OAAO,oBAAoB,EAAE,SAAS,CAAC;IAC/C,gCAAgC;IAChC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,iBAAiB;IAChC,iBAAiB;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,oBAAoB;IACpB,UAAU,EAAE,eAAe,CAAC;CAC7B;AAED;;;;GAIG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CA4BzF"}
1
+ {"version":3,"file":"model-switch.d.ts","sourceRoot":"","sources":["../src/model-switch.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAGH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAI1D,MAAM,WAAW,eAAe;IAC9B,kDAAkD;IAClD,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAAC;IACjE,iBAAiB;IACjB,UAAU,CAAC,EAAE,CAAC,UAAU,EAAE,eAAe,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5D,kBAAkB;IAClB,GAAG,CAAC,EAAE,IAAI,CAAC;CACZ;AAED,MAAM,WAAW,kBAAmB,SAAQ,eAAe;IACzD,MAAM,EAAE,OAAO,oBAAoB,EAAE,SAAS,CAAC;IAC/C,gCAAgC;IAChC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,iBAAiB;IAChC,iBAAiB;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,oBAAoB;IACpB,UAAU,EAAE,eAAe,CAAC;CAC7B;AAED;;;;GAIG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CA4BzF"}
@@ -29,6 +29,7 @@
29
29
  */
30
30
  import { AgentRepository } from "@ai-zen/agents-sdk";
31
31
  import { AGENTS_DIR } from "./config.js";
32
+ import { t } from "./i18n/index.js";
32
33
  /**
33
34
  * 切换模型:把目标模型写进 Agent 定义的 `modelId`,并把思考强度重置为模型默认。
34
35
  *
@@ -40,21 +41,21 @@ export async function switchModel(options) {
40
41
  const now = options.now ?? new Date();
41
42
  const model = (config.models ?? []).find((item) => item.id === modelId);
42
43
  if (!model)
43
- throw new Error(`模型 "${modelId}" 不存在`);
44
+ throw new Error(t("modelSwitch.err.modelMissing", { id: modelId }));
44
45
  const readAgent = options.readAgent ?? ((id) => new AgentRepository(AGENTS_DIR).read(id));
45
46
  const writeAgent = options.writeAgent ??
46
47
  ((definition) => new AgentRepository(AGENTS_DIR).write(definition));
47
48
  const definition = await readAgent(agentId);
48
49
  if (!definition)
49
- throw new Error(`Agent "${agentId}" 不存在`);
50
+ throw new Error(t("modelSwitch.err.agentMissing", { id: agentId }));
50
51
  const next = { ...definition, modelId, updatedAt: now.toISOString() };
51
52
  // 换模型 = 重置思考强度:旧模型的档位参数对新模型可能非法(如 GLM-5.3 不接受
52
53
  // `thinking.disabled`),所以直接清空,让目标模型走自己的 defaultParams。
53
54
  delete next.modelParams;
54
55
  await writeAgent(next);
55
- const resetHint = definition.modelParams ? " · 思考强度已重置为模型默认" : "";
56
+ const resetHint = definition.modelParams ? t("modelSwitch.resetHint") : "";
56
57
  return {
57
- summary: `已切换模型:${model.name}(${model.id})· 已写入 Agent「${agentId}」${resetHint}`,
58
+ summary: t("modelSwitch.summary", { name: model.name, id: model.id, agent: agentId, hint: resetHint }),
58
59
  definition: next,
59
60
  };
60
61
  }
@@ -1 +1 @@
1
- {"version":3,"file":"model-switch.js","sourceRoot":"","sources":["../src/model-switch.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAErD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AA0BzC;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,OAA2B;IAC3D,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;IACpC,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,SAAS,CAAC;IAC7C,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC;IAEtC,MAAM,KAAK,GAAG,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,OAAO,CAAC,CAAC;IACxE,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,OAAO,OAAO,OAAO,CAAC,CAAC;IAEnD,MAAM,SAAS,GACb,OAAO,CAAC,SAAS,IAAI,CAAC,CAAC,EAAU,EAAE,EAAE,CAAC,IAAI,eAAe,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;IAClF,MAAM,UAAU,GACd,OAAO,CAAC,UAAU;QAClB,CAAC,CAAC,UAA2B,EAAE,EAAE,CAAC,IAAI,eAAe,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC;IAEvF,MAAM,UAAU,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,CAAC;IAC5C,IAAI,CAAC,UAAU;QAAE,MAAM,IAAI,KAAK,CAAC,UAAU,OAAO,OAAO,CAAC,CAAC;IAE3D,MAAM,IAAI,GAAoB,EAAE,GAAG,UAAU,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,CAAC,WAAW,EAAE,EAAE,CAAC;IACvF,8CAA8C;IAC9C,uDAAuD;IACvD,OAAO,IAAI,CAAC,WAAW,CAAC;IACxB,MAAM,UAAU,CAAC,IAAI,CAAC,CAAC;IAEvB,MAAM,SAAS,GAAG,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE,CAAC;IAClE,OAAO;QACL,OAAO,EAAE,SAAS,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,EAAE,gBAAgB,OAAO,IAAI,SAAS,EAAE;QAC9E,UAAU,EAAE,IAAI;KACjB,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"model-switch.js","sourceRoot":"","sources":["../src/model-switch.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAErD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,CAAC,EAAE,MAAM,iBAAiB,CAAC;AA0BpC;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,OAA2B;IAC3D,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;IACpC,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,SAAS,CAAC;IAC7C,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC;IAEtC,MAAM,KAAK,GAAG,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,OAAO,CAAC,CAAC;IACxE,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,8BAA8B,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;IAEhF,MAAM,SAAS,GACb,OAAO,CAAC,SAAS,IAAI,CAAC,CAAC,EAAU,EAAE,EAAE,CAAC,IAAI,eAAe,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;IAClF,MAAM,UAAU,GACd,OAAO,CAAC,UAAU;QAClB,CAAC,CAAC,UAA2B,EAAE,EAAE,CAAC,IAAI,eAAe,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC;IAEvF,MAAM,UAAU,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,CAAC;IAC5C,IAAI,CAAC,UAAU;QAAE,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,8BAA8B,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;IAErF,MAAM,IAAI,GAAoB,EAAE,GAAG,UAAU,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,CAAC,WAAW,EAAE,EAAE,CAAC;IACvF,8CAA8C;IAC9C,uDAAuD;IACvD,OAAO,IAAI,CAAC,WAAW,CAAC;IACxB,MAAM,UAAU,CAAC,IAAI,CAAC,CAAC;IAEvB,MAAM,SAAS,GAAG,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC3E,OAAO;QACL,OAAO,EAAE,CAAC,CAAC,qBAAqB,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;QACtG,UAAU,EAAE,IAAI;KACjB,CAAC;AACJ,CAAC"}
@@ -15,13 +15,14 @@
15
15
  import type { AgentDefinition, AppConfig, Model } from "@ai-zen/agents-sdk";
16
16
  import { type ReasoningPreset, type ReasoningPresets } from "./reasoning-presets.js";
17
17
  /**
18
- * 已知档位的中文标签。
18
+ * 已知档位名清单。
19
19
  *
20
20
  * 不设成穷举映射:档位名由策略表定义(用户可自建策略、自定档位名),
21
- * 未知名字直接显示原文,比显示「?」有用得多。
21
+ * 未收录的名字直接显示原文,比显示「?」有用得多。
22
+ * 文案本身在 i18n 词典的 `effort.<档位名>` 里(中 / 英各一份)。
22
23
  */
23
- export declare const EFFORT_LABELS: Record<string, string>;
24
- /** 档位 → 显示文案(未知档位名原样显示) */
24
+ export declare const KNOWN_EFFORT_LEVELS: readonly string[];
25
+ /** 档位 → 显示文案(未收录的档位名原样显示) */
25
26
  export declare function effortLabel(level: string): string;
26
27
  /** 模型关联的策略 */
27
28
  export declare function presetOf(model: Model | null | undefined, presets: ReasoningPresets): ReasoningPreset | undefined;
@@ -45,6 +46,24 @@ export declare function effectiveParams(model?: Model | null, definition?: Pick<
45
46
  * - 没有任何声明 → 「默认」(跟随模型 `defaultParams`,如 DeepSeek 出厂只开思考不指定档位)
46
47
  */
47
48
  export declare function describeEffort(model?: Model | null, presets?: ReasoningPresets | null, definition?: Pick<AgentDefinition, "modelParams"> | null): string;
49
+ /**
50
+ * 状态栏用的思考强度视图:文案 + 是否置灰。
51
+ *
52
+ * 合成一个对象返回,是为了让调用方**一次取全**——分成两个函数调用容易出现
53
+ * 「文案更新了、置灰没跟上」这种漂移。
54
+ */
55
+ export declare function describeEffortView(model?: Model | null, presets?: ReasoningPresets | null, definition?: Pick<AgentDefinition, "modelParams"> | null): {
56
+ text: string;
57
+ dimmed: boolean;
58
+ };
59
+ /**
60
+ * 状态栏里思考强度是否该置灰 —— **不靠文案判断**。
61
+ *
62
+ * 旧实现是 `effort === "关" || effort === "—"`,而那两个字本身就是显示文案:
63
+ * 一切语言,判断就失效(英文界面下 `"off"` 永远不等于 `"关"`)。
64
+ * 这里改成基于档位值的语义判断:不可调档,或档位是 off / none。
65
+ */
66
+ export declare function effortDimmed(model?: Model | null, presets?: ReasoningPresets | null, definition?: Pick<AgentDefinition, "modelParams"> | null): boolean;
48
67
  export interface SetAgentEffortOptions {
49
68
  config: AppConfig;
50
69
  /** 思考策略表(`readReasoningPresets()` 的结果) */
@@ -1 +1 @@
1
- {"version":3,"file":"reasoning-effort.d.ts","sourceRoot":"","sources":["../src/reasoning-effort.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,KAAK,EAAE,eAAe,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAE5E,OAAO,EAML,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACtB,MAAM,wBAAwB,CAAC;AAEhC;;;;;GAKG;AACH,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAShD,CAAC;AAEF,2BAA2B;AAC3B,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEjD;AAED,cAAc;AACd,wBAAgB,QAAQ,CACtB,KAAK,EAAE,KAAK,GAAG,IAAI,GAAG,SAAS,EAC/B,OAAO,EAAE,gBAAgB,GACxB,eAAe,GAAG,SAAS,CAE7B;AAED,yBAAyB;AACzB,wBAAgB,aAAa,CAC3B,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI,EACpB,OAAO,CAAC,EAAE,gBAAgB,GAAG,IAAI,GAChC,MAAM,EAAE,CAGV;AAED,gBAAgB;AAChB,wBAAgB,YAAY,CAAC,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,IAAI,GAAG,OAAO,CAE7F;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAC7B,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI,EACpB,UAAU,CAAC,EAAE,IAAI,CAAC,eAAe,EAAE,aAAa,CAAC,GAAG,IAAI,GACvD,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAEzB;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAC5B,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI,EACpB,OAAO,CAAC,EAAE,gBAAgB,GAAG,IAAI,EACjC,UAAU,CAAC,EAAE,IAAI,CAAC,eAAe,EAAE,aAAa,CAAC,GAAG,IAAI,GACvD,MAAM,CAQR;AAED,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,SAAS,CAAC;IAClB,0CAA0C;IAC1C,OAAO,EAAE,gBAAgB,CAAC;IAC1B,2BAA2B;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,oCAAoC;IACpC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,cAAc;IACd,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAAC;IACjE,UAAU,CAAC,EAAE,CAAC,UAAU,EAAE,eAAe,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5D,GAAG,CAAC,EAAE,IAAI,CAAC;CACZ;AAED,MAAM,WAAW,oBAAoB;IACnC,UAAU,EAAE,eAAe,CAAC;IAC5B,WAAW;IACX,KAAK,EAAE,KAAK,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;GAQG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,qBAAqB,GAC7B,OAAO,CAAC,oBAAoB,CAAC,CAwD/B"}
1
+ {"version":3,"file":"reasoning-effort.d.ts","sourceRoot":"","sources":["../src/reasoning-effort.ts"],"names":[],"mappings":"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"}
@@ -14,26 +14,28 @@
14
14
  */
15
15
  import { AgentRepository } from "@ai-zen/agents-sdk";
16
16
  import { AGENTS_DIR } from "./config.js";
17
+ import { t } from "./i18n/index.js";
17
18
  import { levelsOf, matchLevel, ownedKeys, patchOf, presetFor, } from "./reasoning-presets.js";
18
19
  /**
19
- * 已知档位的中文标签。
20
+ * 已知档位名清单。
20
21
  *
21
22
  * 不设成穷举映射:档位名由策略表定义(用户可自建策略、自定档位名),
22
- * 未知名字直接显示原文,比显示「?」有用得多。
23
+ * 未收录的名字直接显示原文,比显示「?」有用得多。
24
+ * 文案本身在 i18n 词典的 `effort.<档位名>` 里(中 / 英各一份)。
23
25
  */
24
- export const EFFORT_LABELS = {
25
- off: "关",
26
- none: "关",
27
- minimal: "极低",
28
- low: "低",
29
- medium: "中",
30
- high: "高",
31
- xhigh: "极高",
32
- max: "最高",
33
- };
34
- /** 档位 → 显示文案(未知档位名原样显示) */
26
+ export const KNOWN_EFFORT_LEVELS = [
27
+ "off",
28
+ "none",
29
+ "minimal",
30
+ "low",
31
+ "medium",
32
+ "high",
33
+ "xhigh",
34
+ "max",
35
+ ];
36
+ /** 档位 → 显示文案(未收录的档位名原样显示) */
35
37
  export function effortLabel(level) {
36
- return EFFORT_LABELS[level] ?? level;
38
+ return KNOWN_EFFORT_LEVELS.includes(level) ? t(`effort.${level}`) : level;
37
39
  }
38
40
  /** 模型关联的策略 */
39
41
  export function presetOf(model, presets) {
@@ -68,14 +70,39 @@ export function effectiveParams(model, definition) {
68
70
  */
69
71
  export function describeEffort(model, presets, definition) {
70
72
  if (!presets || !isAdjustable(model, presets))
71
- return "—";
73
+ return t("effort.unsupported");
72
74
  const params = effectiveParams(model, definition);
73
75
  const matched = matchLevel(presetOf(model, presets), params);
74
76
  if (matched)
75
77
  return effortLabel(matched);
76
78
  return definition?.modelParams && Object.keys(definition.modelParams).length > 0
77
- ? "自定义"
78
- : "默认";
79
+ ? t("effort.custom")
80
+ : t("effort.default");
81
+ }
82
+ /**
83
+ * 状态栏用的思考强度视图:文案 + 是否置灰。
84
+ *
85
+ * 合成一个对象返回,是为了让调用方**一次取全**——分成两个函数调用容易出现
86
+ * 「文案更新了、置灰没跟上」这种漂移。
87
+ */
88
+ export function describeEffortView(model, presets, definition) {
89
+ return {
90
+ text: describeEffort(model, presets, definition),
91
+ dimmed: effortDimmed(model, presets, definition),
92
+ };
93
+ }
94
+ /**
95
+ * 状态栏里思考强度是否该置灰 —— **不靠文案判断**。
96
+ *
97
+ * 旧实现是 `effort === "关" || effort === "—"`,而那两个字本身就是显示文案:
98
+ * 一切语言,判断就失效(英文界面下 `"off"` 永远不等于 `"关"`)。
99
+ * 这里改成基于档位值的语义判断:不可调档,或档位是 off / none。
100
+ */
101
+ export function effortDimmed(model, presets, definition) {
102
+ if (!presets || !isAdjustable(model, presets))
103
+ return true;
104
+ const level = matchLevel(presetOf(model, presets), effectiveParams(model, definition));
105
+ return level === "off" || level === "none";
79
106
  }
80
107
  /**
81
108
  * 设置某 Agent 的思考档位:查表拿补丁 → 写进 `definition.modelParams`。
@@ -95,22 +122,22 @@ export async function setAgentEffort(options) {
95
122
  ((definition) => new AgentRepository(AGENTS_DIR).write(definition));
96
123
  const definition = await readAgent(agentId);
97
124
  if (!definition)
98
- throw new Error(`Agent "${agentId}" 不存在`);
125
+ throw new Error(t("effort.err.agentMissing", { id: agentId }));
99
126
  const modelId = definition.modelId;
100
127
  if (!modelId) {
101
- throw new Error(`Agent "${agentId}" 未绑定模型,请先为它选择模型`);
128
+ throw new Error(t("effort.err.noModel", { id: agentId }));
102
129
  }
103
130
  const model = (config.models ?? []).find((item) => item.id === modelId);
104
131
  if (!model)
105
- throw new Error(`模型 "${modelId}" 不存在,请先用 /model 或 /config 检查`);
132
+ throw new Error(t("effort.err.modelMissing", { id: modelId }));
106
133
  const preset = presetOf(model, presets);
107
134
  const allowed = levelsOf(preset);
108
135
  if (allowed.length === 0) {
109
- throw new Error(`模型 "${model.id}" 未关联可用的思考策略(reasoningPreset),无法设置思考强度`);
136
+ throw new Error(t("effort.err.noPreset", { id: model.id }));
110
137
  }
111
138
  const patch = effort === null ? undefined : patchOf(preset, effort);
112
139
  if (effort !== null && !patch) {
113
- throw new Error(`策略 "${model.reasoningPreset}" 没有档位 "${effort}"(可选:${allowed.join(" / ")})`);
140
+ throw new Error(t("effort.err.unknownLevel", { preset: model.reasoningPreset ?? "", level: effort, options: allowed.join(" / ") }));
114
141
  }
115
142
  // 先剔除思考相关键,再合并新补丁(`null` 即只剔除)
116
143
  const owned = ownedKeys(presets);
@@ -127,11 +154,11 @@ export async function setAgentEffort(options) {
127
154
  else
128
155
  delete next.modelParams;
129
156
  await writeAgent(next);
130
- const label = effort === null ? "跟随模型默认" : `「${effortLabel(effort)}」`;
157
+ const label = effort === null ? t("effort.followDefault") : t("effort.quoted", { label: effortLabel(effort) });
131
158
  return {
132
159
  definition: next,
133
160
  model,
134
- summary: `思考强度已设为 ${label} · 写入 Agent「${agentId}」(模型 ${model.id})`,
161
+ summary: t("effort.summary", { label, id: agentId, model: model.id }),
135
162
  };
136
163
  }
137
164
  //# sourceMappingURL=reasoning-effort.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"reasoning-effort.js","sourceRoot":"","sources":["../src/reasoning-effort.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"reasoning-effort.js","sourceRoot":"","sources":["../src/reasoning-effort.ts"],"names":[],"mappings":"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"}
package/dist/sdk-log.d.ts CHANGED
@@ -1,31 +1,38 @@
1
1
  /**
2
- * SDK 全局日志接管 —— 关掉库自带的 `console` 兜底。
2
+ * SDK 全局日志接管 —— 把库的日志引到独立文件。
3
3
  *
4
- * 背景:SDK 的 `getLogger()` 默认实现是 `console.log / console.warn / console.error`
5
- * (`@ai-zen/agents-sdk` 的 `shared/logger.ts`)。对通用库来说这是合理兜底,对 Ink TUI
6
- * 却是灾难 —— `console.log` 直接写 stdout,会穿到 Ink 的渲染区外面把界面撕成乱码。
7
- * 例如 `load_mcp` 有一行 `log.info(JSON.stringify(manifest, null, 2))`,未接管时整份
8
- * tools / resources 清单会砸在界面上。
4
+ * 背景:SDK 的 `getLogger()` 接口本身没问题,问题在**默认实现**是
5
+ * `console.log / console.warn / console.error`(`@ai-zen/agents-sdk` 的 `shared/logger.ts`)。
6
+ * 对通用库来说这是合理兜底,对 Ink TUI 却是灾难 —— 直接写 stdout 会穿到渲染区外面
7
+ * 把界面撕成乱码(例如 `load_mcp` 的 `log.info(JSON.stringify(manifest, null, 2))`
8
+ * 会把整份 tools / resources 清单砸在界面上)。
9
9
  *
10
- * 所以 TUI 启动第一件事就是接管:
11
- * - 默认**全部丢弃**(界面上不该出现库的内部日志,用户也读不懂);
12
- * - 需要排查时用 `AIZ_DEBUG_SDK=1` 落盘,既不污染渲染也不丢信息。
10
+ * 所以 TUI 启动时用 `setLogger()` 把 SDK 的日志出口换成**落盘实现**:
11
+ * - 日志一律进 `~/.ai-zen/logs/sdk.log`,界面上一个字都不出现;
12
+ * - 单文件 2MB 上限,超出轮转为 `sdk.log.1`,不会无限膨胀;
13
+ * - 写失败一律吞掉,磁盘满 / 权限不足绝不能拖垮 TUI。
13
14
  *
14
15
  * 用法:
15
- * aiz → SDK 日志静默
16
- * AIZ_DEBUG_SDK=1 aiz → 追加写到 <tmp>/aiz-sdk.log
17
- * AIZ_DEBUG_SDK=1 AIZ_SDK_LOG_FILE=/path aiz → 写到指定文件
16
+ * aiz → 追加写到 ~/.ai-zen/logs/sdk.log(默认开)
17
+ * AIZ_DEBUG_SDK=0 aiz → 完全静默
18
+ * AIZ_SDK_LOG_FILE=/path aiz → 写到指定文件
18
19
  *
19
- * 与 `key-debug.ts` 同一套约定(环境变量开关 + tmp 下日志文件),免得排查时记两套。
20
+ * 与 `key-debug.ts` 同一套约定(环境变量开关 + 固定日志文件),免得排查时记两套。
21
+ *
22
+ * ⚠️ 本模块只解决「日志往哪写」。SDK 内部若有地方绕过 `getLogger()` 直接抓 `console`
23
+ * (模块顶层 `const log = getLogger()` 这类快照),换 logger 是救不回来的 —— 那属于
24
+ * SDK 侧的接线问题,须在 SDK 里改为运行时取 logger,见对应 commit。
20
25
  *
21
26
  * 注意 stdio 模式不需要本模块:`stdio-runner.ts` 已把日志改道 stderr —— 那里 stdout
22
27
  * 只留给结果,日志本身是有用的。本模块只服务「界面被占用」的 TUI。
23
28
  */
24
29
  import { type Logger } from "@ai-zen/agents-sdk";
25
- /** 是否把 SDK 日志落盘(默认关闭) */
30
+ /** 是否把 SDK 日志落盘(默认开启,`AIZ_DEBUG_SDK=0` 关闭) */
26
31
  export declare const SDK_LOG_ENABLED: boolean;
27
32
  /** 日志落盘路径(测试与用户都可能改写,故导出常量) */
28
33
  export declare const SDK_LOG_FILE: string;
34
+ /** 单文件上限 2MB;超出后轮转为 `<file>.1`(只保留上一份,总量有界) */
35
+ export declare const MAX_LOG_BYTES: number;
29
36
  /** 单行日志格式:`<ISO 时间> [level] message` */
30
37
  export declare function formatSdkLogLine(level: keyof Logger, message: string, at?: Date): string;
31
38
  /**
@@ -34,10 +41,10 @@ export declare function formatSdkLogLine(level: keyof Logger, message: string, a
34
41
  * 写失败要吞掉:日志是旁路能力,磁盘满 / 权限不足时绝不能把 TUI 拖垮。
35
42
  */
36
43
  export declare function createFileLogger(file: string): Logger;
37
- /** 全静默日志器(TUI 默认) */
44
+ /** 全静默日志器(`AIZ_DEBUG_SDK=0` 时使用) */
38
45
  export declare function createSilentLogger(): Logger;
39
46
  /**
40
- * 接管 SDK 全局日志:默认静默,`AIZ_DEBUG_SDK=1` 时改为落盘。
47
+ * 接管 SDK 全局日志:默认落盘,`AIZ_DEBUG_SDK=0` 静默。
41
48
  *
42
49
  * 返回实际安装的日志器,便于测试断言 / 上层复用。
43
50
  */
@@ -1 +1 @@
1
- {"version":3,"file":"sdk-log.d.ts","sourceRoot":"","sources":["../src/sdk-log.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAGH,OAAO,EAAa,KAAK,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5D,yBAAyB;AACzB,eAAO,MAAM,eAAe,SAAoC,CAAC;AAEjE,+BAA+B;AAC/B,eAAO,MAAM,YAAY,QAAqD,CAAC;AAE/E,wCAAwC;AACxC,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,MAAM,MAAM,EACnB,OAAO,EAAE,MAAM,EACf,EAAE,GAAE,IAAiB,GACpB,MAAM,CAER;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAWrD;AAED,qBAAqB;AACrB,wBAAgB,kBAAkB,IAAI,MAAM,CAG3C;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,GAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAO,GACjD,MAAM,CAMR"}
1
+ {"version":3,"file":"sdk-log.d.ts","sourceRoot":"","sources":["../src/sdk-log.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAIH,OAAO,EAAa,KAAK,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAO5D,8CAA8C;AAC9C,eAAO,MAAM,eAAe,SAAoC,CAAC;AAEjE,+BAA+B;AAC/B,eAAO,MAAM,YAAY,QAC4C,CAAC;AAEtE,+CAA+C;AAC/C,eAAO,MAAM,aAAa,QAAkB,CAAC;AAE7C,wCAAwC;AACxC,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,MAAM,MAAM,EACnB,OAAO,EAAE,MAAM,EACf,EAAE,GAAE,IAAiB,GACpB,MAAM,CAER;AAYD;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAarD;AAED,oCAAoC;AACpC,wBAAgB,kBAAkB,IAAI,MAAM,CAG3C;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,GAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAO,GACjD,MAAM,CAMR"}
package/dist/sdk-log.js CHANGED
@@ -1,36 +1,58 @@
1
1
  /**
2
- * SDK 全局日志接管 —— 关掉库自带的 `console` 兜底。
2
+ * SDK 全局日志接管 —— 把库的日志引到独立文件。
3
3
  *
4
- * 背景:SDK 的 `getLogger()` 默认实现是 `console.log / console.warn / console.error`
5
- * (`@ai-zen/agents-sdk` 的 `shared/logger.ts`)。对通用库来说这是合理兜底,对 Ink TUI
6
- * 却是灾难 —— `console.log` 直接写 stdout,会穿到 Ink 的渲染区外面把界面撕成乱码。
7
- * 例如 `load_mcp` 有一行 `log.info(JSON.stringify(manifest, null, 2))`,未接管时整份
8
- * tools / resources 清单会砸在界面上。
4
+ * 背景:SDK 的 `getLogger()` 接口本身没问题,问题在**默认实现**是
5
+ * `console.log / console.warn / console.error`(`@ai-zen/agents-sdk` 的 `shared/logger.ts`)。
6
+ * 对通用库来说这是合理兜底,对 Ink TUI 却是灾难 —— 直接写 stdout 会穿到渲染区外面
7
+ * 把界面撕成乱码(例如 `load_mcp` 的 `log.info(JSON.stringify(manifest, null, 2))`
8
+ * 会把整份 tools / resources 清单砸在界面上)。
9
9
  *
10
- * 所以 TUI 启动第一件事就是接管:
11
- * - 默认**全部丢弃**(界面上不该出现库的内部日志,用户也读不懂);
12
- * - 需要排查时用 `AIZ_DEBUG_SDK=1` 落盘,既不污染渲染也不丢信息。
10
+ * 所以 TUI 启动时用 `setLogger()` 把 SDK 的日志出口换成**落盘实现**:
11
+ * - 日志一律进 `~/.ai-zen/logs/sdk.log`,界面上一个字都不出现;
12
+ * - 单文件 2MB 上限,超出轮转为 `sdk.log.1`,不会无限膨胀;
13
+ * - 写失败一律吞掉,磁盘满 / 权限不足绝不能拖垮 TUI。
13
14
  *
14
15
  * 用法:
15
- * aiz → SDK 日志静默
16
- * AIZ_DEBUG_SDK=1 aiz → 追加写到 <tmp>/aiz-sdk.log
17
- * AIZ_DEBUG_SDK=1 AIZ_SDK_LOG_FILE=/path aiz → 写到指定文件
16
+ * aiz → 追加写到 ~/.ai-zen/logs/sdk.log(默认开)
17
+ * AIZ_DEBUG_SDK=0 aiz → 完全静默
18
+ * AIZ_SDK_LOG_FILE=/path aiz → 写到指定文件
18
19
  *
19
- * 与 `key-debug.ts` 同一套约定(环境变量开关 + tmp 下日志文件),免得排查时记两套。
20
+ * 与 `key-debug.ts` 同一套约定(环境变量开关 + 固定日志文件),免得排查时记两套。
21
+ *
22
+ * ⚠️ 本模块只解决「日志往哪写」。SDK 内部若有地方绕过 `getLogger()` 直接抓 `console`
23
+ * (模块顶层 `const log = getLogger()` 这类快照),换 logger 是救不回来的 —— 那属于
24
+ * SDK 侧的接线问题,须在 SDK 里改为运行时取 logger,见对应 commit。
20
25
  *
21
26
  * 注意 stdio 模式不需要本模块:`stdio-runner.ts` 已把日志改道 stderr —— 那里 stdout
22
27
  * 只留给结果,日志本身是有用的。本模块只服务「界面被占用」的 TUI。
23
28
  */
24
- import { appendFileSync } from "node:fs";
29
+ import { appendFileSync, mkdirSync, renameSync, statSync } from "node:fs";
30
+ import { dirname, join } from "node:path";
25
31
  import { setLogger } from "@ai-zen/agents-sdk";
26
- /** 是否把 SDK 日志落盘(默认关闭) */
27
- export const SDK_LOG_ENABLED = process.env.AIZ_DEBUG_SDK === "1";
32
+ /** 共享根目录 `~/.ai-zen`(与 config.ts 的 AI_ZEN_DIR 同一约定) */
33
+ const AI_ZEN_DIR = process.env.AI_ZEN_DIR ||
34
+ join(process.env.HOME || process.env.USERPROFILE || "", ".ai-zen");
35
+ /** 是否把 SDK 日志落盘(默认开启,`AIZ_DEBUG_SDK=0` 关闭) */
36
+ export const SDK_LOG_ENABLED = process.env.AIZ_DEBUG_SDK !== "0";
28
37
  /** 日志落盘路径(测试与用户都可能改写,故导出常量) */
29
- export const SDK_LOG_FILE = process.env.AIZ_SDK_LOG_FILE || "/tmp/aiz-sdk.log";
38
+ export const SDK_LOG_FILE = process.env.AIZ_SDK_LOG_FILE || join(AI_ZEN_DIR, "logs", "sdk.log");
39
+ /** 单文件上限 2MB;超出后轮转为 `<file>.1`(只保留上一份,总量有界) */
40
+ export const MAX_LOG_BYTES = 2 * 1024 * 1024;
30
41
  /** 单行日志格式:`<ISO 时间> [level] message` */
31
42
  export function formatSdkLogLine(level, message, at = new Date()) {
32
43
  return `${at.toISOString()} [${level}] ${message}`;
33
44
  }
45
+ /** 大小超限时把当前文件挪成 `.1`,让下一次写入从空文件开始 */
46
+ function rotateIfNeeded(file) {
47
+ try {
48
+ if (statSync(file).size < MAX_LOG_BYTES)
49
+ return;
50
+ renameSync(file, `${file}.1`);
51
+ }
52
+ catch {
53
+ /* 文件还不存在:首次写入,无需轮转 */
54
+ }
55
+ }
34
56
  /**
35
57
  * 落盘版日志器。
36
58
  *
@@ -39,6 +61,8 @@ export function formatSdkLogLine(level, message, at = new Date()) {
39
61
  export function createFileLogger(file) {
40
62
  const write = (level) => (message) => {
41
63
  try {
64
+ mkdirSync(dirname(file), { recursive: true });
65
+ rotateIfNeeded(file);
42
66
  appendFileSync(file, `${formatSdkLogLine(level, message)}\n`);
43
67
  }
44
68
  catch {
@@ -47,13 +71,13 @@ export function createFileLogger(file) {
47
71
  };
48
72
  return { info: write("info"), warn: write("warn"), error: write("error") };
49
73
  }
50
- /** 全静默日志器(TUI 默认) */
74
+ /** 全静默日志器(`AIZ_DEBUG_SDK=0` 时使用) */
51
75
  export function createSilentLogger() {
52
76
  const noop = () => { };
53
77
  return { info: noop, warn: noop, error: noop };
54
78
  }
55
79
  /**
56
- * 接管 SDK 全局日志:默认静默,`AIZ_DEBUG_SDK=1` 时改为落盘。
80
+ * 接管 SDK 全局日志:默认落盘,`AIZ_DEBUG_SDK=0` 静默。
57
81
  *
58
82
  * 返回实际安装的日志器,便于测试断言 / 上层复用。
59
83
  */
@@ -1 +1 @@
1
- {"version":3,"file":"sdk-log.js","sourceRoot":"","sources":["../src/sdk-log.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,SAAS,EAAe,MAAM,oBAAoB,CAAC;AAE5D,yBAAyB;AACzB,MAAM,CAAC,MAAM,eAAe,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,KAAK,GAAG,CAAC;AAEjE,+BAA+B;AAC/B,MAAM,CAAC,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,kBAAkB,CAAC;AAE/E,wCAAwC;AACxC,MAAM,UAAU,gBAAgB,CAC9B,KAAmB,EACnB,OAAe,EACf,KAAW,IAAI,IAAI,EAAE;IAErB,OAAO,GAAG,EAAE,CAAC,WAAW,EAAE,KAAK,KAAK,KAAK,OAAO,EAAE,CAAC;AACrD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC3C,MAAM,KAAK,GACT,CAAC,KAAmB,EAAE,EAAE,CACxB,CAAC,OAAe,EAAQ,EAAE;QACxB,IAAI,CAAC;YACH,cAAc,CAAC,IAAI,EAAE,GAAG,gBAAgB,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;QAChE,CAAC;QAAC,MAAM,CAAC;YACP,kBAAkB;QACpB,CAAC;IACH,CAAC,CAAC;IACJ,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;AAC7E,CAAC;AAED,qBAAqB;AACrB,MAAM,UAAU,kBAAkB;IAChC,MAAM,IAAI,GAAG,GAAS,EAAE,GAAE,CAAC,CAAC;IAC5B,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;AACjD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAC9B,UAAgD,EAAE;IAElD,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,eAAe,CAAC;IACnD,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,YAAY,CAAC;IAC1C,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,kBAAkB,EAAE,CAAC;IACvE,SAAS,CAAC,MAAM,CAAC,CAAC;IAClB,OAAO,MAAM,CAAC;AAChB,CAAC"}
1
+ {"version":3,"file":"sdk-log.js","sourceRoot":"","sources":["../src/sdk-log.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"stdio-runner.d.ts","sourceRoot":"","sources":["../src/stdio-runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAe9C,MAAM,WAAW,eAAe;IAC9B,qCAAqC;IACrC,WAAW,EAAE,MAAM,CAAC;IACpB,6BAA6B;IAC7B,IAAI,EAAE,OAAO,CAAC;CACf;AAOD;;;GAGG;AACH,wBAAsB,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC,CAWjD;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAMtE;AAED,oCAAoC;AACpC,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,cAAc,GAAG,SAAS,GAAG,MAAM,CAY/E;AAwCD,6BAA6B;AAC7B,wBAAsB,QAAQ,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CAuExE"}
1
+ {"version":3,"file":"stdio-runner.d.ts","sourceRoot":"","sources":["../src/stdio-runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAc9C,MAAM,WAAW,eAAe;IAC9B,qCAAqC;IACrC,WAAW,EAAE,MAAM,CAAC;IACpB,6BAA6B;IAC7B,IAAI,EAAE,OAAO,CAAC;CACf;AAOD;;;GAGG;AACH,wBAAsB,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC,CAWjD;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAMtE;AAED,oCAAoC;AACpC,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,cAAc,GAAG,SAAS,GAAG,MAAM,CAY/E;AAwCD,6BAA6B;AAC7B,wBAAsB,QAAQ,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CAwExE"}
@@ -15,8 +15,7 @@ import { createAgent } from "./agent-creator.js";
15
15
  import { AGENTS_DIR, readConfig } from "./config.js";
16
16
  import { CwdTrackerPlugin } from "./cwd-tracker-plugin.js";
17
17
  import { SubAgentGuardInstallerPlugin } from "./sub-agent-guard-plugin.js";
18
- import { conversationRepository } from "./conversation-repository.js";
19
- import { formatShortTime } from "./format-time.js";
18
+ import { generateConversationId, persistConversation } from "./conversation-repository.js";
20
19
  /** 向 stderr 写一行(stdlib 日志统一出口) */
21
20
  function logStderr(line) {
22
21
  process.stderr.write(line.endsWith("\n") ? line : line + "\n");
@@ -64,9 +63,9 @@ export function extractText(content) {
64
63
  if (section.type === "text")
65
64
  parts.push(section.text);
66
65
  else if (section.type === "image_url")
67
- parts.push(`[图片: ${section.image_url.url}]`);
66
+ parts.push(`[Image: ${section.image_url.url}]`);
68
67
  else if (section.type === "file")
69
- parts.push(`[文件: ${section.file_id ?? section.filename ?? "内联文件"}]`);
68
+ parts.push(`[File: ${section.file_id ?? section.filename ?? "inline file"}]`);
70
69
  }
71
70
  return parts.join("\n");
72
71
  }
@@ -80,16 +79,16 @@ async function resolveTarget() {
80
79
  const definition = await new AgentRepository(AGENTS_DIR).read(agentId);
81
80
  const modelId = definition?.modelId;
82
81
  if (!modelId) {
83
- throw new Error(`Agent "${agentId}" 未绑定模型,请先运行 \`ai\` 在 /config 里为它选择模型`);
82
+ throw new Error(`Agent "${agentId}" has no model bound — run \`ai\` and pick one under /config`);
84
83
  }
85
84
  const model = config.models.find((m) => m.id === modelId);
86
85
  if (!model)
87
- throw new Error(`Agent 绑定的模型 ${modelId} 不存在`);
86
+ throw new Error(`The model "${modelId}" bound to the agent does not exist`);
88
87
  const endpoint = config.endpoints.find((e) => e.id === model.endpointId);
89
88
  if (!endpoint)
90
- throw new Error(`模型 ${modelId} 引用的端点 ${model.endpointId} 不存在`);
89
+ throw new Error(`Model "${modelId}" references endpoint "${model.endpointId}", which does not exist`);
91
90
  if (!endpoint.apiKey) {
92
- throw new Error(`端点 "${endpoint.name}" 的 API Key 未设置,请先运行 \`ai\` 进入交互界面配置`);
91
+ throw new Error(`Endpoint "${endpoint.name}" has no API key yet — run \`ai\` to configure it in the interactive UI`);
93
92
  }
94
93
  // 阈值由配置直接给出(旧字段已在 SDK 的 ConfigManager.read() 里迁移过)
95
94
  return { modelId, agentId, tokenThresholds: model.tokenThresholds };
@@ -100,10 +99,12 @@ export async function runStdio(options) {
100
99
  const stdinText = await readStdin();
101
100
  const prompt = mergePrompt(instruction, stdinText);
102
101
  if (!prompt.trim()) {
103
- logStderr("ai: 没有输入内容(请提供参数,或通过管道传入文本)");
102
+ logStderr("ai: no input (pass an argument or pipe text in)");
104
103
  return 2;
105
104
  }
106
- // 保持 stdout 纯净:SDK 全局日志与 console.log 统一改道 stderr
105
+ // 保持 stdout 纯净:SDK 全局日志走 setLogger 改道,
106
+ // 但 SDK(及第三方依赖)内部仍有**直接调用 console.log** 的地方,不经我们的 logger;
107
+ // 管道模式下那会把日志混进模型输出,所以这里连 console.log 一起改道。
107
108
  const stderrLogger = (message) => logStderr(message);
108
109
  setLogger({ info: stderrLogger, warn: stderrLogger, error: stderrLogger });
109
110
  const originalLog = console.log;
@@ -123,22 +124,21 @@ export async function runStdio(options) {
123
124
  .reverse()
124
125
  .find((m) => m.role === AgentNS.Role.Assistant);
125
126
  if (!lastAssistant || lastAssistant.status === AgentNS.MessageStatus.Error) {
126
- logStderr("ai: 模型返回错误");
127
+ logStderr("ai: the model returned an error");
127
128
  return 1;
128
129
  }
129
130
  if (save) {
130
- const name = `对话_${formatShortTime(new Date().toISOString())}`;
131
- const now = new Date().toISOString();
132
- await conversationRepository.write({
133
- id: name.replace(/[\\/:*?"<>|]/g, "_"),
131
+ // 会话名与 TUI 同源(避免两处拼接各自漂移)
132
+ const name = await persistConversation({
133
+ id: generateConversationId(),
134
134
  agentId,
135
- modelId,
136
135
  messages: agent.messages,
137
136
  cwd: process.cwd(),
138
- createdAt: now,
139
- updatedAt: now,
137
+ // 一次性管道调用只归档,不改「本目录上一轮会话」指针:
138
+ // 否则连跑几条 `cat … | ai --save` 后,下次 `ai` 会续接到最后一条管道结果上
139
+ setAsLastSession: false,
140
140
  });
141
- logStderr(`已保存对话: ${name}`);
141
+ logStderr(`Saved conversation: ${name}`);
142
142
  }
143
143
  // 结果:仅此一处写入 stdout
144
144
  const text = extractText(lastAssistant.content);
@@ -1 +1 @@
1
- {"version":3,"file":"stdio-runner.js","sourceRoot":"","sources":["../src/stdio-runner.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"stdio-runner.js","sourceRoot":"","sources":["../src/stdio-runner.ts"],"names":[],"mappings":"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"}