@ai-zen/cli 1.0.0-alpha.9 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (336) hide show
  1. package/CHANGELOG.md +1334 -275
  2. package/LICENSE +21 -0
  3. package/README.md +136 -31
  4. package/README.zh.md +136 -31
  5. package/dist/agent-creator.d.ts +11 -0
  6. package/dist/agent-creator.d.ts.map +1 -1
  7. package/dist/agent-creator.js +50 -20
  8. package/dist/agent-creator.js.map +1 -1
  9. package/dist/agent-switch.d.ts +61 -0
  10. package/dist/agent-switch.d.ts.map +1 -0
  11. package/dist/agent-switch.js +83 -0
  12. package/dist/agent-switch.js.map +1 -0
  13. package/dist/agents-store.d.ts +6 -1
  14. package/dist/agents-store.d.ts.map +1 -1
  15. package/dist/agents-store.js +46 -4
  16. package/dist/agents-store.js.map +1 -1
  17. package/dist/auto-migrate-confirm.d.ts +43 -0
  18. package/dist/auto-migrate-confirm.d.ts.map +1 -0
  19. package/dist/auto-migrate-confirm.js +47 -0
  20. package/dist/auto-migrate-confirm.js.map +1 -0
  21. package/dist/clipboard.d.ts +68 -0
  22. package/dist/clipboard.d.ts.map +1 -0
  23. package/dist/clipboard.js +177 -0
  24. package/dist/clipboard.js.map +1 -0
  25. package/dist/config-editor.d.ts +42 -5
  26. package/dist/config-editor.d.ts.map +1 -1
  27. package/dist/config-editor.js +80 -27
  28. package/dist/config-editor.js.map +1 -1
  29. package/dist/config.d.ts +76 -17
  30. package/dist/config.d.ts.map +1 -1
  31. package/dist/config.js +143 -39
  32. package/dist/config.js.map +1 -1
  33. package/dist/conversation-commands/registry.d.ts +127 -4
  34. package/dist/conversation-commands/registry.d.ts.map +1 -1
  35. package/dist/conversation-commands/registry.js +93 -14
  36. package/dist/conversation-commands/registry.js.map +1 -1
  37. package/dist/conversation-persist-plugin.d.ts +0 -1
  38. package/dist/conversation-persist-plugin.d.ts.map +1 -1
  39. package/dist/conversation-persist-plugin.js +7 -16
  40. package/dist/conversation-persist-plugin.js.map +1 -1
  41. package/dist/conversation-repository.d.ts +79 -18
  42. package/dist/conversation-repository.d.ts.map +1 -1
  43. package/dist/conversation-repository.js +96 -30
  44. package/dist/conversation-repository.js.map +1 -1
  45. package/dist/cwd-tracker-plugin.d.ts.map +1 -1
  46. package/dist/cwd-tracker-plugin.js +22 -7
  47. package/dist/cwd-tracker-plugin.js.map +1 -1
  48. package/dist/format-time.d.ts +17 -6
  49. package/dist/format-time.d.ts.map +1 -1
  50. package/dist/format-time.js +32 -14
  51. package/dist/format-time.js.map +1 -1
  52. package/dist/handoff-service.d.ts +19 -0
  53. package/dist/handoff-service.d.ts.map +1 -0
  54. package/dist/handoff-service.js +85 -0
  55. package/dist/handoff-service.js.map +1 -0
  56. package/dist/hook.d.ts.map +1 -1
  57. package/dist/hook.js +69 -15
  58. package/dist/hook.js.map +1 -1
  59. package/dist/i18n/en-wizard.d.ts +8 -0
  60. package/dist/i18n/en-wizard.d.ts.map +1 -0
  61. package/dist/i18n/en-wizard.js +303 -0
  62. package/dist/i18n/en-wizard.js.map +1 -0
  63. package/dist/i18n/en.d.ts +7 -0
  64. package/dist/i18n/en.d.ts.map +1 -0
  65. package/dist/i18n/en.js +245 -0
  66. package/dist/i18n/en.js.map +1 -0
  67. package/dist/i18n/index.d.ts +57 -0
  68. package/dist/i18n/index.d.ts.map +1 -0
  69. package/dist/i18n/index.js +109 -0
  70. package/dist/i18n/index.js.map +1 -0
  71. package/dist/i18n/preferences.d.ts +37 -0
  72. package/dist/i18n/preferences.d.ts.map +1 -0
  73. package/dist/i18n/preferences.js +73 -0
  74. package/dist/i18n/preferences.js.map +1 -0
  75. package/dist/i18n/zh-wizard.d.ts +11 -0
  76. package/dist/i18n/zh-wizard.d.ts.map +1 -0
  77. package/dist/i18n/zh-wizard.js +306 -0
  78. package/dist/i18n/zh-wizard.js.map +1 -0
  79. package/dist/i18n/zh.d.ts +10 -0
  80. package/dist/i18n/zh.d.ts.map +1 -0
  81. package/dist/i18n/zh.js +249 -0
  82. package/dist/i18n/zh.js.map +1 -0
  83. package/dist/index.js +52 -23
  84. package/dist/index.js.map +1 -1
  85. package/dist/mcp-command.d.ts +32 -0
  86. package/dist/mcp-command.d.ts.map +1 -0
  87. package/dist/mcp-command.js +37 -0
  88. package/dist/mcp-command.js.map +1 -0
  89. package/dist/mode.d.ts +31 -4
  90. package/dist/mode.d.ts.map +1 -1
  91. package/dist/mode.js +42 -7
  92. package/dist/mode.js.map +1 -1
  93. package/dist/model-switch.d.ts +58 -0
  94. package/dist/model-switch.d.ts.map +1 -0
  95. package/dist/model-switch.js +62 -0
  96. package/dist/model-switch.js.map +1 -0
  97. package/dist/reasoning-effort.d.ts +96 -0
  98. package/dist/reasoning-effort.d.ts.map +1 -0
  99. package/dist/reasoning-effort.js +164 -0
  100. package/dist/reasoning-effort.js.map +1 -0
  101. package/dist/reasoning-presets.d.ts +34 -0
  102. package/dist/reasoning-presets.d.ts.map +1 -0
  103. package/dist/reasoning-presets.js +85 -0
  104. package/dist/reasoning-presets.js.map +1 -0
  105. package/dist/sdk-log.d.ts +84 -0
  106. package/dist/sdk-log.d.ts.map +1 -0
  107. package/dist/sdk-log.js +167 -0
  108. package/dist/sdk-log.js.map +1 -0
  109. package/dist/session-pointer.d.ts.map +1 -1
  110. package/dist/session-pointer.js +10 -4
  111. package/dist/session-pointer.js.map +1 -1
  112. package/dist/stdio-runner.d.ts.map +1 -1
  113. package/dist/stdio-runner.js +32 -30
  114. package/dist/stdio-runner.js.map +1 -1
  115. package/dist/sub-agent-guard-plugin.d.ts +10 -7
  116. package/dist/sub-agent-guard-plugin.d.ts.map +1 -1
  117. package/dist/sub-agent-guard-plugin.js +12 -9
  118. package/dist/sub-agent-guard-plugin.js.map +1 -1
  119. package/dist/tui/chat-history.d.ts +29 -0
  120. package/dist/tui/chat-history.d.ts.map +1 -0
  121. package/dist/tui/chat-history.js +55 -0
  122. package/dist/tui/chat-history.js.map +1 -0
  123. package/dist/tui/chat-session.d.ts +144 -13
  124. package/dist/tui/chat-session.d.ts.map +1 -1
  125. package/dist/tui/chat-session.js +312 -73
  126. package/dist/tui/chat-session.js.map +1 -1
  127. package/dist/tui/components.d.ts +109 -6
  128. package/dist/tui/components.d.ts.map +1 -1
  129. package/dist/tui/components.js +177 -12
  130. package/dist/tui/components.js.map +1 -1
  131. package/dist/tui/config-wizard/detail.d.ts +18 -10
  132. package/dist/tui/config-wizard/detail.d.ts.map +1 -1
  133. package/dist/tui/config-wizard/detail.js +53 -46
  134. package/dist/tui/config-wizard/detail.js.map +1 -1
  135. package/dist/tui/config-wizard/engine.d.ts +2 -2
  136. package/dist/tui/config-wizard/engine.d.ts.map +1 -1
  137. package/dist/tui/config-wizard/engine.js +48 -26
  138. package/dist/tui/config-wizard/engine.js.map +1 -1
  139. package/dist/tui/config-wizard/fields.d.ts +3 -1
  140. package/dist/tui/config-wizard/fields.d.ts.map +1 -1
  141. package/dist/tui/config-wizard/fields.js +202 -167
  142. package/dist/tui/config-wizard/fields.js.map +1 -1
  143. package/dist/tui/config-wizard/frame.js +1 -1
  144. package/dist/tui/config-wizard/kv-editor.d.ts.map +1 -1
  145. package/dist/tui/config-wizard/kv-editor.js +13 -5
  146. package/dist/tui/config-wizard/kv-editor.js.map +1 -1
  147. package/dist/tui/config-wizard/list.d.ts +3 -1
  148. package/dist/tui/config-wizard/list.d.ts.map +1 -1
  149. package/dist/tui/config-wizard/list.js +4 -4
  150. package/dist/tui/config-wizard/list.js.map +1 -1
  151. package/dist/tui/config-wizard/mcp-helpers.d.ts.map +1 -1
  152. package/dist/tui/config-wizard/mcp-helpers.js +4 -3
  153. package/dist/tui/config-wizard/mcp-helpers.js.map +1 -1
  154. package/dist/tui/config-wizard/menu.d.ts.map +1 -1
  155. package/dist/tui/config-wizard/menu.js +33 -21
  156. package/dist/tui/config-wizard/menu.js.map +1 -1
  157. package/dist/tui/config-wizard/prompt-editor.d.ts +8 -1
  158. package/dist/tui/config-wizard/prompt-editor.d.ts.map +1 -1
  159. package/dist/tui/config-wizard/prompt-editor.js +11 -7
  160. package/dist/tui/config-wizard/prompt-editor.js.map +1 -1
  161. package/dist/tui/config-wizard/prompt.d.ts.map +1 -1
  162. package/dist/tui/config-wizard/prompt.js +8 -7
  163. package/dist/tui/config-wizard/prompt.js.map +1 -1
  164. package/dist/tui/config-wizard/step-agents.d.ts.map +1 -1
  165. package/dist/tui/config-wizard/step-agents.js +50 -29
  166. package/dist/tui/config-wizard/step-agents.js.map +1 -1
  167. package/dist/tui/config-wizard/step-defaults.d.ts.map +1 -1
  168. package/dist/tui/config-wizard/step-defaults.js +77 -27
  169. package/dist/tui/config-wizard/step-defaults.js.map +1 -1
  170. package/dist/tui/config-wizard/step-endpoints.d.ts.map +1 -1
  171. package/dist/tui/config-wizard/step-endpoints.js +27 -14
  172. package/dist/tui/config-wizard/step-endpoints.js.map +1 -1
  173. package/dist/tui/config-wizard/step-mcp.d.ts.map +1 -1
  174. package/dist/tui/config-wizard/step-mcp.js +29 -25
  175. package/dist/tui/config-wizard/step-mcp.js.map +1 -1
  176. package/dist/tui/config-wizard/step-models.d.ts.map +1 -1
  177. package/dist/tui/config-wizard/step-models.js +98 -43
  178. package/dist/tui/config-wizard/step-models.js.map +1 -1
  179. package/dist/tui/config-wizard/step-new-endpoint.d.ts.map +1 -1
  180. package/dist/tui/config-wizard/step-new-endpoint.js +16 -12
  181. package/dist/tui/config-wizard/step-new-endpoint.js.map +1 -1
  182. package/dist/tui/config-wizard/step-simple.d.ts.map +1 -1
  183. package/dist/tui/config-wizard/step-simple.js +18 -17
  184. package/dist/tui/config-wizard/step-simple.js.map +1 -1
  185. package/dist/tui/config-wizard/types.d.ts +31 -3
  186. package/dist/tui/config-wizard/types.d.ts.map +1 -1
  187. package/dist/tui/config-wizard/types.js.map +1 -1
  188. package/dist/tui/file-index.d.ts +38 -0
  189. package/dist/tui/file-index.d.ts.map +1 -0
  190. package/dist/tui/file-index.js +117 -0
  191. package/dist/tui/file-index.js.map +1 -0
  192. package/dist/tui/index.d.ts +17 -1
  193. package/dist/tui/index.d.ts.map +1 -1
  194. package/dist/tui/index.js +105 -49
  195. package/dist/tui/index.js.map +1 -1
  196. package/dist/tui/input-editing.d.ts +52 -0
  197. package/dist/tui/input-editing.d.ts.map +1 -0
  198. package/dist/tui/input-editing.js +91 -0
  199. package/dist/tui/input-editing.js.map +1 -0
  200. package/dist/tui/key-debug.d.ts +62 -0
  201. package/dist/tui/key-debug.d.ts.map +1 -0
  202. package/dist/tui/key-debug.js +92 -0
  203. package/dist/tui/key-debug.js.map +1 -0
  204. package/dist/tui/mention.d.ts +47 -0
  205. package/dist/tui/mention.d.ts.map +1 -0
  206. package/dist/tui/mention.js +152 -0
  207. package/dist/tui/mention.js.map +1 -0
  208. package/dist/tui/mouse.d.ts +55 -0
  209. package/dist/tui/mouse.d.ts.map +1 -0
  210. package/dist/tui/mouse.js +74 -0
  211. package/dist/tui/mouse.js.map +1 -0
  212. package/dist/tui/phase.d.ts +64 -0
  213. package/dist/tui/phase.d.ts.map +1 -0
  214. package/dist/tui/phase.js +112 -0
  215. package/dist/tui/phase.js.map +1 -0
  216. package/dist/tui/screens/agent-tabs.d.ts +53 -0
  217. package/dist/tui/screens/agent-tabs.d.ts.map +1 -0
  218. package/dist/tui/screens/agent-tabs.js +81 -0
  219. package/dist/tui/screens/agent-tabs.js.map +1 -0
  220. package/dist/tui/screens/chat-commands.d.ts +78 -1
  221. package/dist/tui/screens/chat-commands.d.ts.map +1 -1
  222. package/dist/tui/screens/chat-commands.js +688 -157
  223. package/dist/tui/screens/chat-commands.js.map +1 -1
  224. package/dist/tui/screens/chat.d.ts +57 -1
  225. package/dist/tui/screens/chat.d.ts.map +1 -1
  226. package/dist/tui/screens/chat.js +708 -261
  227. package/dist/tui/screens/chat.js.map +1 -1
  228. package/dist/tui/screens/common-keys.d.ts +36 -0
  229. package/dist/tui/screens/common-keys.d.ts.map +1 -0
  230. package/dist/tui/screens/common-keys.js +67 -0
  231. package/dist/tui/screens/common-keys.js.map +1 -0
  232. package/dist/tui/screens/frame-buffer.d.ts.map +1 -1
  233. package/dist/tui/screens/frame-buffer.js.map +1 -1
  234. package/dist/tui/screens/handoff-choice.d.ts +37 -0
  235. package/dist/tui/screens/handoff-choice.d.ts.map +1 -0
  236. package/dist/tui/screens/handoff-choice.js +42 -0
  237. package/dist/tui/screens/handoff-choice.js.map +1 -0
  238. package/dist/tui/screens/index.d.ts +7 -5
  239. package/dist/tui/screens/index.d.ts.map +1 -1
  240. package/dist/tui/screens/index.js +6 -5
  241. package/dist/tui/screens/index.js.map +1 -1
  242. package/dist/tui/screens/input-row.d.ts +64 -0
  243. package/dist/tui/screens/input-row.d.ts.map +1 -0
  244. package/dist/tui/screens/input-row.js +67 -0
  245. package/dist/tui/screens/input-row.js.map +1 -0
  246. package/dist/tui/screens/input.d.ts +77 -1
  247. package/dist/tui/screens/input.d.ts.map +1 -1
  248. package/dist/tui/screens/input.js +125 -8
  249. package/dist/tui/screens/input.js.map +1 -1
  250. package/dist/tui/screens/layout.d.ts +49 -0
  251. package/dist/tui/screens/layout.d.ts.map +1 -1
  252. package/dist/tui/screens/layout.js +45 -7
  253. package/dist/tui/screens/layout.js.map +1 -1
  254. package/dist/tui/screens/lines.d.ts +7 -0
  255. package/dist/tui/screens/lines.d.ts.map +1 -1
  256. package/dist/tui/screens/lines.js +6 -6
  257. package/dist/tui/screens/lines.js.map +1 -1
  258. package/dist/tui/screens/messages-view.d.ts +20 -1
  259. package/dist/tui/screens/messages-view.d.ts.map +1 -1
  260. package/dist/tui/screens/messages-view.js +55 -8
  261. package/dist/tui/screens/messages-view.js.map +1 -1
  262. package/dist/tui/screens/notice-bar.d.ts +5 -0
  263. package/dist/tui/screens/notice-bar.d.ts.map +1 -0
  264. package/dist/tui/screens/notice-bar.js +21 -0
  265. package/dist/tui/screens/notice-bar.js.map +1 -0
  266. package/dist/tui/screens/notice.d.ts +44 -10
  267. package/dist/tui/screens/notice.d.ts.map +1 -1
  268. package/dist/tui/screens/notice.js +75 -15
  269. package/dist/tui/screens/notice.js.map +1 -1
  270. package/dist/tui/screens/overlays.d.ts.map +1 -1
  271. package/dist/tui/screens/overlays.js +4 -3
  272. package/dist/tui/screens/overlays.js.map +1 -1
  273. package/dist/tui/screens/render.d.ts +1 -1
  274. package/dist/tui/screens/render.d.ts.map +1 -1
  275. package/dist/tui/screens/render.js +18 -11
  276. package/dist/tui/screens/render.js.map +1 -1
  277. package/dist/tui/screens/use-chat-viewport.d.ts +22 -0
  278. package/dist/tui/screens/use-chat-viewport.d.ts.map +1 -0
  279. package/dist/tui/screens/use-chat-viewport.js +50 -0
  280. package/dist/tui/screens/use-chat-viewport.js.map +1 -0
  281. package/dist/tui/screens/use-input-editing.d.ts +69 -0
  282. package/dist/tui/screens/use-input-editing.d.ts.map +1 -0
  283. package/dist/tui/screens/use-input-editing.js +220 -0
  284. package/dist/tui/screens/use-input-editing.js.map +1 -0
  285. package/dist/tui/screens/use-overlays.d.ts +25 -0
  286. package/dist/tui/screens/use-overlays.d.ts.map +1 -0
  287. package/dist/tui/screens/use-overlays.js +32 -0
  288. package/dist/tui/screens/use-overlays.js.map +1 -0
  289. package/dist/tui/screens/use-wizard-host.d.ts +46 -0
  290. package/dist/tui/screens/use-wizard-host.d.ts.map +1 -0
  291. package/dist/tui/screens/use-wizard-host.js +123 -0
  292. package/dist/tui/screens/use-wizard-host.js.map +1 -0
  293. package/dist/tui/screens/welcome.d.ts +12 -0
  294. package/dist/tui/screens/welcome.d.ts.map +1 -0
  295. package/dist/tui/screens/welcome.js +36 -0
  296. package/dist/tui/screens/welcome.js.map +1 -0
  297. package/dist/tui/status-segments.d.ts +37 -0
  298. package/dist/tui/status-segments.d.ts.map +1 -0
  299. package/dist/tui/status-segments.js +166 -0
  300. package/dist/tui/status-segments.js.map +1 -0
  301. package/dist/tui/text.d.ts +22 -7
  302. package/dist/tui/text.d.ts.map +1 -1
  303. package/dist/tui/text.js +110 -39
  304. package/dist/tui/text.js.map +1 -1
  305. package/dist/tui/theme.d.ts +2 -0
  306. package/dist/tui/theme.d.ts.map +1 -1
  307. package/dist/tui/theme.js +2 -0
  308. package/dist/tui/theme.js.map +1 -1
  309. package/dist/tui/token-rate.d.ts +83 -0
  310. package/dist/tui/token-rate.d.ts.map +1 -0
  311. package/dist/tui/token-rate.js +195 -0
  312. package/dist/tui/token-rate.js.map +1 -0
  313. package/dist/types.d.ts +7 -8
  314. package/dist/types.d.ts.map +1 -1
  315. package/dist/user-content.d.ts +41 -0
  316. package/dist/user-content.d.ts.map +1 -0
  317. package/dist/user-content.js +37 -0
  318. package/dist/user-content.js.map +1 -0
  319. package/dist/version-compare.d.ts +37 -0
  320. package/dist/version-compare.d.ts.map +1 -0
  321. package/dist/version-compare.js +105 -0
  322. package/dist/version-compare.js.map +1 -0
  323. package/dist/version.js.map +1 -1
  324. package/package.json +7 -5
  325. package/dist/auto-migrate-confirm-plugin.d.ts +0 -58
  326. package/dist/auto-migrate-confirm-plugin.d.ts.map +0 -1
  327. package/dist/auto-migrate-confirm-plugin.js +0 -61
  328. package/dist/auto-migrate-confirm-plugin.js.map +0 -1
  329. package/dist/migration-service.d.ts +0 -15
  330. package/dist/migration-service.d.ts.map +0 -1
  331. package/dist/migration-service.js +0 -66
  332. package/dist/migration-service.js.map +0 -1
  333. package/dist/tui/screens/splash.d.ts +0 -5
  334. package/dist/tui/screens/splash.d.ts.map +0 -1
  335. package/dist/tui/screens/splash.js +0 -51
  336. package/dist/tui/screens/splash.js.map +0 -1
@@ -0,0 +1,84 @@
1
+ /**
2
+ * SDK 全局日志接管 —— 把库的日志引到独立文件。
3
+ *
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
+ *
10
+ * 所以 TUI 启动时用 `setLogger()` 把 SDK 的日志出口换成**落盘实现**:
11
+ * - 日志一律进 `~/.ai-zen/logs/sdk.log`,界面上一个字都不出现;
12
+ * - 单文件 2MB 上限,超出轮转为 `sdk.log.1`,不会无限膨胀;
13
+ * - 写失败一律吞掉,磁盘满 / 权限不足绝不能拖垮 TUI。
14
+ *
15
+ * 用法:
16
+ * aiz → 追加写到 ~/.ai-zen/logs/sdk.log(默认开)
17
+ * AIZ_DEBUG_SDK=0 aiz → 完全静默
18
+ * AIZ_SDK_LOG_FILE=/path aiz → 写到指定文件
19
+ *
20
+ * 与 `key-debug.ts` 同一套约定(环境变量开关 + 固定日志文件),免得排查时记两套。
21
+ *
22
+ * ⚠️ 本模块只解决「日志往哪写」。SDK 内部若有地方绕过 `getLogger()` 直接抓 `console`
23
+ * (模块顶层 `const log = getLogger()` 这类快照),换 logger 是救不回来的 —— 那属于
24
+ * SDK 侧的接线问题,须在 SDK 里改为运行时取 logger,见对应 commit。
25
+ *
26
+ * 注意 stdio 模式不需要本模块:`stdio-runner.ts` 已把日志改道 stderr —— 那里 stdout
27
+ * 只留给结果,日志本身是有用的。本模块只服务「界面被占用」的 TUI。
28
+ */
29
+ import { type Logger } from "@ai-zen/agents-sdk";
30
+ /**
31
+ * 日志落盘路径(测试与用户都可能改写,故每次重新解析)。
32
+ *
33
+ * 不在模块加载时固化成常量:`AI_ZEN_DIR` 是活绑定,测试会在用例之间改它 ——
34
+ * 而**顶层常量**拿到的才是快照。
35
+ */
36
+ export declare function sdkLogFile(root?: string): string;
37
+ /** 是否把 SDK 日志落盘(默认开启,`AIZ_DEBUG_SDK=0` 关闭) */
38
+ export declare function sdkLogEnabled(): boolean;
39
+ /** 单文件上限 2MB;超出后轮转为 `<file>.1`(只保留上一份,总量有界) */
40
+ export declare const MAX_LOG_BYTES: number;
41
+ /** 单行日志格式:`<ISO 时间> [level] message` */
42
+ export declare function formatSdkLogLine(level: keyof Logger, message: string, at?: Date): string;
43
+ /** 通知栏 sink:`warn` / `error` 上界面,`info` 只进文件 */
44
+ export type SdkNoticeSink = (level: "warn" | "error", message: string) => void;
45
+ /**
46
+ * 每会话上栏封顶。
47
+ *
48
+ * SDK 的日志量按「每次请求 / 每次刷新」计,不封顶会把栏位和 React 状态一起冲垮;
49
+ * 封顶后补一句「剩下的看文件」,信息不丢,界面也不废。
50
+ */
51
+ export declare const MAX_SDK_NOTICES = 20;
52
+ /**
53
+ * 重置全部模块级投递状态(**仅测试使用**)。
54
+ *
55
+ * 去重表与封顶计数器是进程级单例:进程内共享模块跑测试时,前一个用例上过栏的文案
56
+ * 会让后一个用例看不见同一条日志,表现为“日志没出来”的假失败。
57
+ */
58
+ export declare function resetSdkLogState(): void;
59
+ /**
60
+ * 注册 / 注销通知栏 sink(`null` 表示界面还没起来 / 已卸载)。
61
+ *
62
+ * **晚绑定是必须的**:`installSdkLogger()` 跑在 Ink 渲染之前(启动期日志不能写 stdout),
63
+ * 而通知栏活在 `Chat` 的 React state 里。启动期先入环形缓冲,注册时补推。
64
+ * 没注册时 SDK 日志照旧只进文件。
65
+ */
66
+ export declare function setSdkNoticeSink(sink: SdkNoticeSink | null): void;
67
+ /**
68
+ * 落盘版日志器。
69
+ *
70
+ * 写失败要吞掉:日志是旁路能力,磁盘满 / 权限不足时绝不能把 TUI 拖垮。
71
+ */
72
+ export declare function createFileLogger(file: string): Logger;
73
+ /** 全静默日志器(`AIZ_DEBUG_SDK=0` 时使用) */
74
+ export declare function createSilentLogger(): Logger;
75
+ /**
76
+ * 接管 SDK 全局日志:默认落盘,`AIZ_DEBUG_SDK=0` 静默。
77
+ *
78
+ * 返回实际安装的日志器,便于测试断言 / 上层复用。
79
+ */
80
+ export declare function installSdkLogger(options?: {
81
+ enabled?: boolean;
82
+ file?: string;
83
+ }): Logger;
84
+ //# sourceMappingURL=sdk-log.d.ts.map
@@ -0,0 +1 @@
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;AAG5D;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,IAAI,GAAE,MAAmB,GAAG,MAAM,CAE5D;AAED,8CAA8C;AAC9C,wBAAgB,aAAa,IAAI,OAAO,CAEvC;AAED,+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,gDAAgD;AAChD,MAAM,MAAM,aAAa,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;AAE/E;;;;;GAKG;AACH,eAAO,MAAM,eAAe,KAAK,CAAC;AAalC;;;;;GAKG;AACH,wBAAgB,gBAAgB,IAAI,IAAI,CAMvC;AAsBD;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI,GAAG,IAAI,CAIjE;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAgBrD;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"}
@@ -0,0 +1,167 @@
1
+ /**
2
+ * SDK 全局日志接管 —— 把库的日志引到独立文件。
3
+ *
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
+ *
10
+ * 所以 TUI 启动时用 `setLogger()` 把 SDK 的日志出口换成**落盘实现**:
11
+ * - 日志一律进 `~/.ai-zen/logs/sdk.log`,界面上一个字都不出现;
12
+ * - 单文件 2MB 上限,超出轮转为 `sdk.log.1`,不会无限膨胀;
13
+ * - 写失败一律吞掉,磁盘满 / 权限不足绝不能拖垮 TUI。
14
+ *
15
+ * 用法:
16
+ * aiz → 追加写到 ~/.ai-zen/logs/sdk.log(默认开)
17
+ * AIZ_DEBUG_SDK=0 aiz → 完全静默
18
+ * AIZ_SDK_LOG_FILE=/path aiz → 写到指定文件
19
+ *
20
+ * 与 `key-debug.ts` 同一套约定(环境变量开关 + 固定日志文件),免得排查时记两套。
21
+ *
22
+ * ⚠️ 本模块只解决「日志往哪写」。SDK 内部若有地方绕过 `getLogger()` 直接抓 `console`
23
+ * (模块顶层 `const log = getLogger()` 这类快照),换 logger 是救不回来的 —— 那属于
24
+ * SDK 侧的接线问题,须在 SDK 里改为运行时取 logger,见对应 commit。
25
+ *
26
+ * 注意 stdio 模式不需要本模块:`stdio-runner.ts` 已把日志改道 stderr —— 那里 stdout
27
+ * 只留给结果,日志本身是有用的。本模块只服务「界面被占用」的 TUI。
28
+ */
29
+ import { appendFileSync, mkdirSync, renameSync, statSync } from "node:fs";
30
+ import { dirname, join } from "node:path";
31
+ import { setLogger } from "@ai-zen/agents-sdk";
32
+ import { AI_ZEN_DIR } from "./config.js";
33
+ /**
34
+ * 日志落盘路径(测试与用户都可能改写,故每次重新解析)。
35
+ *
36
+ * 不在模块加载时固化成常量:`AI_ZEN_DIR` 是活绑定,测试会在用例之间改它 ——
37
+ * 而**顶层常量**拿到的才是快照。
38
+ */
39
+ export function sdkLogFile(root = AI_ZEN_DIR) {
40
+ return process.env.AIZ_SDK_LOG_FILE || join(root, "logs", "sdk.log");
41
+ }
42
+ /** 是否把 SDK 日志落盘(默认开启,`AIZ_DEBUG_SDK=0` 关闭) */
43
+ export function sdkLogEnabled() {
44
+ return process.env.AIZ_DEBUG_SDK !== "0";
45
+ }
46
+ /** 单文件上限 2MB;超出后轮转为 `<file>.1`(只保留上一份,总量有界) */
47
+ export const MAX_LOG_BYTES = 2 * 1024 * 1024;
48
+ /** 单行日志格式:`<ISO 时间> [level] message` */
49
+ export function formatSdkLogLine(level, message, at = new Date()) {
50
+ return `${at.toISOString()} [${level}] ${message}`;
51
+ }
52
+ /** 大小超限时把当前文件挪成 `.1`,让下一次写入从空文件开始 */
53
+ function rotateIfNeeded(file) {
54
+ try {
55
+ if (statSync(file).size < MAX_LOG_BYTES)
56
+ return;
57
+ renameSync(file, `${file}.1`);
58
+ }
59
+ catch {
60
+ /* 文件还不存在:首次写入,无需轮转 */
61
+ }
62
+ }
63
+ /**
64
+ * 每会话上栏封顶。
65
+ *
66
+ * SDK 的日志量按「每次请求 / 每次刷新」计,不封顶会把栏位和 React 状态一起冲垮;
67
+ * 封顶后补一句「剩下的看文件」,信息不丢,界面也不废。
68
+ */
69
+ export const MAX_SDK_NOTICES = 20;
70
+ /** 界面起来之前最多攒几条(启动期的问题恰恰最该看见,但不能无限攒) */
71
+ const MAX_PENDING_NOTICES = 5;
72
+ let noticeSink = null;
73
+ let delivered = 0;
74
+ let capReported = false;
75
+ /** 上过栏的文案:同一句话反复刷(例如每轮都失败一次)只显示第一次 */
76
+ const deliveredOnce = new Set();
77
+ /** 界面还没起来时攒下的 warn / error,注册 sink 时补推 */
78
+ const pending = [];
79
+ /**
80
+ * 重置全部模块级投递状态(**仅测试使用**)。
81
+ *
82
+ * 去重表与封顶计数器是进程级单例:进程内共享模块跑测试时,前一个用例上过栏的文案
83
+ * 会让后一个用例看不见同一条日志,表现为“日志没出来”的假失败。
84
+ */
85
+ export function resetSdkLogState() {
86
+ noticeSink = null;
87
+ delivered = 0;
88
+ capReported = false;
89
+ deliveredOnce.clear();
90
+ pending.length = 0;
91
+ }
92
+ function deliver(level, message) {
93
+ if (!message)
94
+ return;
95
+ if (!noticeSink) {
96
+ pending.push({ level, message });
97
+ if (pending.length > MAX_PENDING_NOTICES)
98
+ pending.shift();
99
+ return;
100
+ }
101
+ if (deliveredOnce.has(message))
102
+ return;
103
+ if (delivered >= MAX_SDK_NOTICES) {
104
+ if (!capReported) {
105
+ capReported = true;
106
+ noticeSink("warn", `More SDK warnings suppressed — see ${sdkLogFile()}`);
107
+ }
108
+ return;
109
+ }
110
+ deliveredOnce.add(message);
111
+ delivered += 1;
112
+ noticeSink(level, message);
113
+ }
114
+ /**
115
+ * 注册 / 注销通知栏 sink(`null` 表示界面还没起来 / 已卸载)。
116
+ *
117
+ * **晚绑定是必须的**:`installSdkLogger()` 跑在 Ink 渲染之前(启动期日志不能写 stdout),
118
+ * 而通知栏活在 `Chat` 的 React state 里。启动期先入环形缓冲,注册时补推。
119
+ * 没注册时 SDK 日志照旧只进文件。
120
+ */
121
+ export function setSdkNoticeSink(sink) {
122
+ noticeSink = sink;
123
+ if (!sink)
124
+ return;
125
+ for (const item of pending.splice(0))
126
+ deliver(item.level, item.message);
127
+ }
128
+ /**
129
+ * 落盘版日志器。
130
+ *
131
+ * 写失败要吞掉:日志是旁路能力,磁盘满 / 权限不足时绝不能把 TUI 拖垮。
132
+ */
133
+ export function createFileLogger(file) {
134
+ const write = (level) => (message) => {
135
+ try {
136
+ mkdirSync(dirname(file), { recursive: true });
137
+ rotateIfNeeded(file);
138
+ appendFileSync(file, `${formatSdkLogLine(level, message)}\n`);
139
+ }
140
+ catch {
141
+ /* 诊断失败绝不能影响主流程 */
142
+ }
143
+ // warn / error 额外上通知栏:文件是事后取证,界面上还得让人当场看见。
144
+ // info 只进文件 —— SDK 打 info 很密(mcp manifest / 工具发现),上栏等于刷屏。
145
+ if (level !== "info")
146
+ deliver(level, message);
147
+ };
148
+ return { info: write("info"), warn: write("warn"), error: write("error") };
149
+ }
150
+ /** 全静默日志器(`AIZ_DEBUG_SDK=0` 时使用) */
151
+ export function createSilentLogger() {
152
+ const noop = () => { };
153
+ return { info: noop, warn: noop, error: noop };
154
+ }
155
+ /**
156
+ * 接管 SDK 全局日志:默认落盘,`AIZ_DEBUG_SDK=0` 静默。
157
+ *
158
+ * 返回实际安装的日志器,便于测试断言 / 上层复用。
159
+ */
160
+ export function installSdkLogger(options = {}) {
161
+ const enabled = options.enabled ?? sdkLogEnabled();
162
+ const file = options.file ?? sdkLogFile();
163
+ const logger = enabled ? createFileLogger(file) : createSilentLogger();
164
+ setLogger(logger);
165
+ return logger;
166
+ }
167
+ //# sourceMappingURL=sdk-log.js.map
@@ -0,0 +1 @@
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":"session-pointer.d.ts","sourceRoot":"","sources":["../src/session-pointer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AASH,kBAAkB;AAClB,MAAM,WAAW,cAAc;IAC7B,qBAAqB;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,sBAAsB;IACtB,SAAS,EAAE,MAAM,CAAC;CACnB;AA2CD,sCAAsC;AACtC,wBAAsB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAGjF;AAED,yCAAyC;AACzC,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAI7E;AAED,8BAA8B;AAC9B,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAKjE"}
1
+ {"version":3,"file":"session-pointer.d.ts","sourceRoot":"","sources":["../src/session-pointer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAeH,kBAAkB;AAClB,MAAM,WAAW,cAAc;IAC7B,qBAAqB;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,sBAAsB;IACtB,SAAS,EAAE,MAAM,CAAC;CACnB;AA2CD,sCAAsC;AACtC,wBAAsB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAGjF;AAED,yCAAyC;AACzC,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAI7E;AAED,8BAA8B;AAC9B,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAKjE"}
@@ -22,14 +22,20 @@
22
22
  import { promises as fs } from "node:fs";
23
23
  import { join } from "node:path";
24
24
  import { CLI_DIR } from "./config.js";
25
- const POINTER_FILE = join(CLI_DIR, "last-session.json");
25
+ /**
26
+ * 指针文件路径。每次调用重新拼接:`CLI_DIR` 是会变的活绑定(测试会在用例之间换
27
+ * `AI_ZEN_DIR`),**在模块顶层固化成常量**才是快照。
28
+ */
29
+ function pointerFile() {
30
+ return join(CLI_DIR, "last-session.json");
31
+ }
26
32
  const FILE_VERSION = 1;
27
33
  /** 读取整份指针文件;不存在 / 损坏 / 旧版格式时返回空结构 */
28
34
  async function readPointerFile() {
29
35
  const empty = { version: FILE_VERSION, sessions: {} };
30
36
  let parsed;
31
37
  try {
32
- parsed = JSON.parse(await fs.readFile(POINTER_FILE, "utf-8"));
38
+ parsed = JSON.parse(await fs.readFile(pointerFile(), "utf-8"));
33
39
  }
34
40
  catch {
35
41
  return empty;
@@ -55,9 +61,9 @@ async function writePointerFile(file) {
55
61
  catch {
56
62
  await fs.mkdir(CLI_DIR, { recursive: true });
57
63
  }
58
- const tmp = `${POINTER_FILE}.tmp`;
64
+ const tmp = `${pointerFile()}.tmp`;
59
65
  await fs.writeFile(tmp, JSON.stringify(file, null, 2), "utf-8");
60
- await fs.rename(tmp, POINTER_FILE);
66
+ await fs.rename(tmp, pointerFile());
61
67
  }
62
68
  /** 读取指定工作目录的「上一轮会话 id」;无记录时返回 null */
63
69
  export async function readLastSession(cwd) {
@@ -1 +1 @@
1
- {"version":3,"file":"session-pointer.js","sourceRoot":"","sources":["../src/session-pointer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAEtC,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,EAAE,mBAAmB,CAAC,CAAC;AACxD,MAAM,YAAY,GAAG,CAAC,CAAC;AAgBvB,qCAAqC;AACrC,KAAK,UAAU,eAAe;IAC5B,MAAM,KAAK,GAAgB,EAAE,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;IACnE,IAAI,MAAW,CAAC;IAChB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC,CAAC;IAChE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;IACD,uCAAuC;IACvC,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,OAAO,MAAM,CAAC,QAAQ,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,KAAK,IAAI,EAAE,CAAC;QAC7G,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,QAAQ,GAAmC,EAAE,CAAC;IACpD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,QAAmC,CAAC,EAAE,CAAC;QACtF,MAAM,CAAC,GAAG,KAAuC,CAAC;QAClD,IAAI,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,OAAO,CAAC,CAAC,EAAE,KAAK,QAAQ,IAAI,CAAC,CAAC,EAAE,EAAE,CAAC;YACnE,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;QAC9F,CAAC;IACH,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAC;AAC7C,CAAC;AAED,8CAA8C;AAC9C,KAAK,UAAU,gBAAgB,CAAC,IAAiB;IAC/C,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC3B,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/C,CAAC;IACD,MAAM,GAAG,GAAG,GAAG,YAAY,MAAM,CAAC;IAClC,MAAM,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IAChE,MAAM,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;AACrC,CAAC;AAED,sCAAsC;AACtC,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,GAAW;IAC/C,MAAM,IAAI,GAAG,MAAM,eAAe,EAAE,CAAC;IACrC,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC;AACpC,CAAC;AAED,yCAAyC;AACzC,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,GAAW,EAAE,EAAU;IAC5D,MAAM,IAAI,GAAG,MAAM,eAAe,EAAE,CAAC;IACrC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC;IACjE,MAAM,gBAAgB,CAAC,IAAI,CAAC,CAAC;AAC/B,CAAC;AAED,8BAA8B;AAC9B,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,GAAW;IAChD,MAAM,IAAI,GAAG,MAAM,eAAe,EAAE,CAAC;IACrC,IAAI,CAAC,CAAC,GAAG,IAAI,IAAI,CAAC,QAAQ,CAAC;QAAE,OAAO;IACpC,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IAC1B,MAAM,gBAAgB,CAAC,IAAI,CAAC,CAAC;AAC/B,CAAC"}
1
+ {"version":3,"file":"session-pointer.js","sourceRoot":"","sources":["../src/session-pointer.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;AAa9C,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;AAoCD,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"}
@@ -10,13 +10,12 @@
10
10
  * 该模式不落盘(不写草稿 / 对话存档),仅当显式 `--save` 时保存对话存档。
11
11
  */
12
12
  import { AgentNS } from "@ai-zen/agents-core";
13
- import { AutoRefreshToolsPlugin, ContextGuardPlugin, setLogger, } from "@ai-zen/agents-sdk";
13
+ import { AgentRepository, AutoRefreshToolsPlugin, ContextGuardPlugin, setLogger, } from "@ai-zen/agents-sdk";
14
14
  import { createAgent } from "./agent-creator.js";
15
- import { readConfig } from "./config.js";
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
  }
@@ -76,21 +75,23 @@ export function extractText(content) {
76
75
  */
77
76
  async function resolveTarget() {
78
77
  const config = await readConfig();
79
- const modelId = config.defaultModel ?? config.models[0]?.id;
80
- if (!modelId)
81
- throw new Error("没有可用的模型,请先运行 `ai` 完成配置");
78
+ const agentId = config.defaultAgent ?? "default";
79
+ const definition = await new AgentRepository(AGENTS_DIR).read(agentId);
80
+ const modelId = definition?.modelId;
81
+ if (!modelId) {
82
+ throw new Error(`Agent "${agentId}" has no model bound — run \`ai\` and pick one under /config`);
83
+ }
82
84
  const model = config.models.find((m) => m.id === modelId);
83
85
  if (!model)
84
- throw new Error(`默认模型 ${modelId} 不存在`);
86
+ throw new Error(`The model "${modelId}" bound to the agent does not exist`);
85
87
  const endpoint = config.endpoints.find((e) => e.id === model.endpointId);
86
88
  if (!endpoint)
87
- throw new Error(`模型 ${modelId} 引用的端点 ${model.endpointId} 不存在`);
89
+ throw new Error(`Model "${modelId}" references endpoint "${model.endpointId}", which does not exist`);
88
90
  if (!endpoint.apiKey) {
89
- 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`);
90
92
  }
91
- const maxTokens = model.maxContextTokens ??
92
- (model.maxContextChars ? Math.floor(model.maxContextChars / 4) : undefined);
93
- return { modelId, agentId: config.defaultAgent ?? "default", maxTokens };
93
+ // 阈值由配置直接给出(旧字段已在 SDK 的 ConfigManager.read() 里迁移过)
94
+ return { modelId, agentId, tokenThresholds: model.tokenThresholds };
94
95
  }
95
96
  /** 运行一次纯 stdio 对话,返回进程退出码 */
96
97
  export async function runStdio(options) {
@@ -98,22 +99,24 @@ export async function runStdio(options) {
98
99
  const stdinText = await readStdin();
99
100
  const prompt = mergePrompt(instruction, stdinText);
100
101
  if (!prompt.trim()) {
101
- logStderr("ai: 没有输入内容(请提供参数,或通过管道传入文本)");
102
+ logStderr("ai: no input (pass an argument or pipe text in)");
102
103
  return 2;
103
104
  }
104
- // 保持 stdout 纯净:SDK 全局日志与 console.log 统一改道 stderr
105
+ // 保持 stdout 纯净:SDK 全局日志走 setLogger 改道,
106
+ // 但 SDK(及第三方依赖)内部仍有**直接调用 console.log** 的地方,不经我们的 logger;
107
+ // 管道模式下那会把日志混进模型输出,所以这里连 console.log 一起改道。
105
108
  const stderrLogger = (message) => logStderr(message);
106
109
  setLogger({ info: stderrLogger, warn: stderrLogger, error: stderrLogger });
107
110
  const originalLog = console.log;
108
111
  console.log = (...args) => logStderr(args.map((a) => String(a)).join(" "));
109
112
  try {
110
- const { modelId, agentId, maxTokens } = await resolveTarget();
113
+ const { modelId, agentId, tokenThresholds } = await resolveTarget();
111
114
  const agent = await createAgent({ agentId });
112
115
  agent.use(new CwdTrackerPlugin());
113
116
  agent.use(new AutoRefreshToolsPlugin());
114
- if (maxTokens && maxTokens > 0) {
115
- agent.use(new ContextGuardPlugin({ maxTokens }));
116
- agent.use(new SubAgentGuardInstallerPlugin({ maxTokens }));
117
+ if (tokenThresholds) {
118
+ agent.use(new ContextGuardPlugin({ guardTokens: tokenThresholds.guard }));
119
+ agent.use(new SubAgentGuardInstallerPlugin({ guardTokens: tokenThresholds.guard }));
117
120
  }
118
121
  await agent.init();
119
122
  const messages = await agent.send(prompt);
@@ -121,22 +124,21 @@ export async function runStdio(options) {
121
124
  .reverse()
122
125
  .find((m) => m.role === AgentNS.Role.Assistant);
123
126
  if (!lastAssistant || lastAssistant.status === AgentNS.MessageStatus.Error) {
124
- logStderr("ai: 模型返回错误");
127
+ logStderr("ai: the model returned an error");
125
128
  return 1;
126
129
  }
127
130
  if (save) {
128
- const name = `对话_${formatShortTime(new Date().toISOString())}`;
129
- const now = new Date().toISOString();
130
- await conversationRepository.write({
131
- id: name.replace(/[\\/:*?"<>|]/g, "_"),
131
+ // 会话名与 TUI 同源(避免两处拼接各自漂移)
132
+ const name = await persistConversation({
133
+ id: generateConversationId(),
132
134
  agentId,
133
- modelId,
134
135
  messages: agent.messages,
135
136
  cwd: process.cwd(),
136
- createdAt: now,
137
- updatedAt: now,
137
+ // 一次性管道调用只归档,不改「本目录上一轮会话」指针:
138
+ // 否则连跑几条 `cat … | ai --save` 后,下次 `ai` 会续接到最后一条管道结果上
139
+ setAsLastSession: false,
138
140
  });
139
- logStderr(`已保存对话: ${name}`);
141
+ logStderr(`Saved conversation: ${name}`);
140
142
  }
141
143
  // 结果:仅此一处写入 stdout
142
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":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAO,EACL,eAAe,EACf,sBAAsB,EACtB,kBAAkB,EAClB,SAAS,GACV,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,4BAA4B,EAAE,MAAM,6BAA6B,CAAC;AAE3E,OAAO,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAS3F,kCAAkC;AAClC,SAAS,SAAS,CAAC,IAAY;IAC7B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;AACjE,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS;IAC7B,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK;QAAE,OAAO,EAAE,CAAC;IACnC,IAAI,CAAC;QACH,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YACxC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAe,CAAC,CAAC,CAAC;QAC7E,CAAC;QACD,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IACxE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,WAAW,CAAC,WAAmB,EAAE,KAAa;IAC5D,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,EAAE,CAAC;IAChC,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IACzC,IAAI,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE;QAAE,OAAO,GAAG,IAAI,OAAO,IAAI,EAAE,CAAC;IACrD,IAAI,IAAI;QAAE,OAAO,IAAI,CAAC;IACtB,OAAO,IAAI,CAAC;AACd,CAAC;AAED,oCAAoC;AACpC,MAAM,UAAU,WAAW,CAAC,OAA2C;IACrE,IAAI,OAAO,IAAI,IAAI;QAAE,OAAO,EAAE,CAAC;IAC/B,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,OAAO,OAAO,CAAC;IAEhD,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,OAAO,IAAI,OAAO,EAAE,CAAC;QAC9B,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM;YAAE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;aACjD,IAAI,OAAO,CAAC,IAAI,KAAK,WAAW;YAAE,KAAK,CAAC,IAAI,CAAC,WAAW,OAAO,CAAC,SAAS,CAAC,GAAG,GAAG,CAAC,CAAC;aAClF,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM;YAC9B,KAAK,CAAC,IAAI,CAAC,UAAU,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,QAAQ,IAAI,aAAa,GAAG,CAAC,CAAC;IAClF,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AASD;;;GAGG;AACH,KAAK,UAAU,aAAa;IAC1B,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;IAElC,MAAM,OAAO,GAAG,MAAM,CAAC,YAAY,IAAI,SAAS,CAAC;IACjD,MAAM,UAAU,GAAG,MAAM,IAAI,eAAe,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACvE,MAAM,OAAO,GAAG,UAAU,EAAE,OAAO,CAAC;IACpC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CACb,UAAU,OAAO,8DAA8D,CAChF,CAAC;IACJ,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC,CAAC;IAC1D,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,cAAc,OAAO,qCAAqC,CAAC,CAAC;IAExF,MAAM,QAAQ,GAAG,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,CAAC,UAAU,CAAC,CAAC;IACzE,IAAI,CAAC,QAAQ;QAAE,MAAM,IAAI,KAAK,CAAC,UAAU,OAAO,0BAA0B,KAAK,CAAC,UAAU,yBAAyB,CAAC,CAAC;IACrH,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CACb,aAAa,QAAQ,CAAC,IAAI,yEAAyE,CACpG,CAAC;IACJ,CAAC;IAED,mDAAmD;IACnD,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,KAAK,CAAC,eAAe,EAAE,CAAC;AACtE,CAAC;AAED,6BAA6B;AAC7B,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,OAAwB;IACrD,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC;IAEtC,MAAM,SAAS,GAAG,MAAM,SAAS,EAAE,CAAC;IACpC,MAAM,MAAM,GAAG,WAAW,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;IAEnD,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;QACnB,SAAS,CAAC,iDAAiD,CAAC,CAAC;QAC7D,OAAO,CAAC,CAAC;IACX,CAAC;IAED,uCAAuC;IACvC,0DAA0D;IAC1D,2CAA2C;IAC3C,MAAM,YAAY,GAAG,CAAC,OAAe,EAAQ,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IACnE,SAAS,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC,CAAC;IAC3E,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC;IAChC,OAAO,CAAC,GAAG,GAAG,CAAC,GAAG,IAAe,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAEtF,IAAI,CAAC;QACH,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,GAAG,MAAM,aAAa,EAAE,CAAC;QAEpE,MAAM,KAAK,GAAG,MAAM,WAAW,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;QAC7C,KAAK,CAAC,GAAG,CAAC,IAAI,gBAAgB,EAAE,CAAC,CAAC;QAClC,KAAK,CAAC,GAAG,CAAC,IAAI,sBAAsB,EAAE,CAAC,CAAC;QACxC,IAAI,eAAe,EAAE,CAAC;YACpB,KAAK,CAAC,GAAG,CAAC,IAAI,kBAAkB,CAAC,EAAE,WAAW,EAAE,eAAe,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YAC1E,KAAK,CAAC,GAAG,CAAC,IAAI,4BAA4B,CAAC,EAAE,WAAW,EAAE,eAAe,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QACtF,CAAC;QACD,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC;QAEnB,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAE1C,MAAM,aAAa,GAAG,CAAC,GAAG,QAAQ,CAAC;aAChC,OAAO,EAAE;aACT,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAElD,IAAI,CAAC,aAAa,IAAI,aAAa,CAAC,MAAM,KAAK,OAAO,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;YAC3E,SAAS,CAAC,iCAAiC,CAAC,CAAC;YAC7C,OAAO,CAAC,CAAC;QACX,CAAC;QAED,IAAI,IAAI,EAAE,CAAC;YACT,0BAA0B;YAC1B,MAAM,IAAI,GAAG,MAAM,mBAAmB,CAAC;gBACrC,EAAE,EAAE,sBAAsB,EAAE;gBAC5B,OAAO;gBACP,QAAQ,EAAE,KAAK,CAAC,QAAQ;gBACxB,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;gBAClB,6BAA6B;gBAC7B,qDAAqD;gBACrD,gBAAgB,EAAE,KAAK;aACxB,CAAC,CAAC;YACH,SAAS,CAAC,uBAAuB,IAAI,EAAE,CAAC,CAAC;QAC3C,CAAC;QAED,mBAAmB;QACnB,MAAM,IAAI,GAAG,WAAW,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;QAChD,IAAI,IAAI;YAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;QACzE,OAAO,CAAC,CAAC;IACX,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,SAAS,CAAC,OAAO,KAAK,EAAE,OAAO,IAAI,KAAK,EAAE,CAAC,CAAC;QAC5C,OAAO,CAAC,CAAC;IACX,CAAC;YAAS,CAAC;QACT,oCAAoC;QACpC,SAAS,CAAC;YACR,IAAI,EAAE,WAAW;YACjB,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,KAAK,EAAE,OAAO,CAAC,KAAK;SACrB,CAAC,CAAC;QACH,OAAO,CAAC,GAAG,GAAG,WAAW,CAAC;IAC5B,CAAC;AACH,CAAC"}
@@ -12,8 +12,8 @@
12
12
  * init)。
13
13
  *
14
14
  * 约束口径(与主 Agent 一致,仅此一项):把主 Agent 同款的 `ContextGuardPlugin` 装到子 Agent 上
15
- * —— 同一 `maxTokens`(当前模型 `maxContextTokens`)、同样不传 ratio(沿用 SDK 默认 1.5),
16
- * 使「上下文 token 超过 maxTokens × 1.5 即中断」对子 Agent 同样成立。
15
+ * —— 同一个 `guardTokens`(当前模型的 `tokenThresholds.guard`),使「请求前用量超过硬线即中断」
16
+ * 对子 Agent 同样成立。
17
17
  * **不设**轮次上限,**不设**工具调用次数上限。
18
18
  *
19
19
  * 中断语义:抛错即结束子 Agent 的 run;异常经 `AgentTool` 的 finally(分发 onSubAgentEnd)
@@ -21,14 +21,17 @@
21
21
  * (`执行工具 X 时出错: …`),父 Agent 继续下一轮——即「软中断」:停掉越界的子 Agent,但不
22
22
  * 终止用户对话(如需硬停,父 Agent 须设 allowJsonParseError=false)。
23
23
  *
24
- * 覆盖范围:仅覆盖 core 的 `AgentTool` / `AgentToolLazy` 两条委派路径(均分发 onSubAgentStart)。
25
- * SDK 的 `call_skill_sub_agent`(技能子 Agent)不分发该钩子,暂不覆盖。
24
+ * 覆盖范围:core 只有两条委派路径(`AgentTool` / `AgentToolLazy`),均分发 onSubAgentStart,
25
+ * 故本插件对**全部**子 Agent 生效。SDK 的 `call_skill_sub_agent`(技能子 Agent)也走
26
+ * `AgentToolLazy`(见 `skillTools.ts`:工具由 AgentToolLazy 承载,复用统一的委派边界),
27
+ * 同样被覆盖——早期版本的注释说它「不分发该钩子」,那个说法在 skill 子 Agent 统一到
28
+ * core 委派原语之后已不成立。
26
29
  */
27
30
  import type { AgentPlugin } from "@ai-zen/agents-sdk";
28
31
  import type { SubAgentContext } from "@ai-zen/agents-core";
29
32
  export interface SubAgentGuardOptions {
30
- /** 子 Agent 的上下文 token 阈值;与主 Agent 同源(当前模型的 `maxContextTokens`) */
31
- maxTokens: number;
33
+ /** 强行阻断阈值;与主 Agent 同源(当前模型的 `tokenThresholds.guard`) */
34
+ guardTokens: number;
32
35
  }
33
36
  /**
34
37
  * 子 Agent 护栏安装器(装在**宿主 Agent** 上)。
@@ -38,7 +41,7 @@ export interface SubAgentGuardOptions {
38
41
  * 由 `ContextGuardPlugin` 按阈值决定。
39
42
  */
40
43
  export declare class SubAgentGuardInstallerPlugin implements AgentPlugin {
41
- private readonly maxTokens;
44
+ private readonly guardTokens;
42
45
  constructor(options: SubAgentGuardOptions);
43
46
  onSubAgentStart({ subAgent }: SubAgentContext): void;
44
47
  }
@@ -1 +1 @@
1
- {"version":3,"file":"sub-agent-guard-plugin.d.ts","sourceRoot":"","sources":["../src/sub-agent-guard-plugin.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAE3D,MAAM,WAAW,oBAAoB;IACnC,kEAAkE;IAClE,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;GAMG;AACH,qBAAa,4BAA6B,YAAW,WAAW;IAC9D,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;gBAEvB,OAAO,EAAE,oBAAoB;IAIzC,eAAe,CAAC,EAAE,QAAQ,EAAE,EAAE,eAAe,GAAG,IAAI;CASrD"}
1
+ {"version":3,"file":"sub-agent-guard-plugin.d.ts","sourceRoot":"","sources":["../src/sub-agent-guard-plugin.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAE3D,MAAM,WAAW,oBAAoB;IACnC,wDAAwD;IACxD,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;;;;;GAMG;AACH,qBAAa,4BAA6B,YAAW,WAAW;IAC9D,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IAErC,YAAY,OAAO,EAAE,oBAAoB,EAExC;IAED,eAAe,CAAC,EAAE,QAAQ,EAAE,EAAE,eAAe,GAAG,IAAI,CAQnD;CACF"}
@@ -12,8 +12,8 @@
12
12
  * init)。
13
13
  *
14
14
  * 约束口径(与主 Agent 一致,仅此一项):把主 Agent 同款的 `ContextGuardPlugin` 装到子 Agent 上
15
- * —— 同一 `maxTokens`(当前模型 `maxContextTokens`)、同样不传 ratio(沿用 SDK 默认 1.5),
16
- * 使「上下文 token 超过 maxTokens × 1.5 即中断」对子 Agent 同样成立。
15
+ * —— 同一个 `guardTokens`(当前模型的 `tokenThresholds.guard`),使「请求前用量超过硬线即中断」
16
+ * 对子 Agent 同样成立。
17
17
  * **不设**轮次上限,**不设**工具调用次数上限。
18
18
  *
19
19
  * 中断语义:抛错即结束子 Agent 的 run;异常经 `AgentTool` 的 finally(分发 onSubAgentEnd)
@@ -21,8 +21,11 @@
21
21
  * (`执行工具 X 时出错: …`),父 Agent 继续下一轮——即「软中断」:停掉越界的子 Agent,但不
22
22
  * 终止用户对话(如需硬停,父 Agent 须设 allowJsonParseError=false)。
23
23
  *
24
- * 覆盖范围:仅覆盖 core 的 `AgentTool` / `AgentToolLazy` 两条委派路径(均分发 onSubAgentStart)。
25
- * SDK 的 `call_skill_sub_agent`(技能子 Agent)不分发该钩子,暂不覆盖。
24
+ * 覆盖范围:core 只有两条委派路径(`AgentTool` / `AgentToolLazy`),均分发 onSubAgentStart,
25
+ * 故本插件对**全部**子 Agent 生效。SDK 的 `call_skill_sub_agent`(技能子 Agent)也走
26
+ * `AgentToolLazy`(见 `skillTools.ts`:工具由 AgentToolLazy 承载,复用统一的委派边界),
27
+ * 同样被覆盖——早期版本的注释说它「不分发该钩子」,那个说法在 skill 子 Agent 统一到
28
+ * core 委派原语之后已不成立。
26
29
  */
27
30
  import { ContextGuardPlugin } from "@ai-zen/agents-sdk";
28
31
  /**
@@ -33,15 +36,15 @@ import { ContextGuardPlugin } from "@ai-zen/agents-sdk";
33
36
  * 由 `ContextGuardPlugin` 按阈值决定。
34
37
  */
35
38
  export class SubAgentGuardInstallerPlugin {
36
- maxTokens;
39
+ guardTokens;
37
40
  constructor(options) {
38
- this.maxTokens = options.maxTokens;
41
+ this.guardTokens = options.guardTokens;
39
42
  }
40
43
  onSubAgentStart({ subAgent }) {
41
- // 与主 Agent 完全同款:同一 maxTokens,不传 ratio(沿用 ContextGuardPlugin 默认 1.5)
42
- subAgent.use(new ContextGuardPlugin({ maxTokens: this.maxTokens }));
44
+ // 与主 Agent 完全同款:同一个 guardTokens 绝对阈值
45
+ subAgent.use(new ContextGuardPlugin({ guardTokens: this.guardTokens }));
43
46
  // 传染到孙级:子 Agent 若再委派,其子 Agent 同样被安插
44
- subAgent.use(new SubAgentGuardInstallerPlugin({ maxTokens: this.maxTokens }));
47
+ subAgent.use(new SubAgentGuardInstallerPlugin({ guardTokens: this.guardTokens }));
45
48
  }
46
49
  }
47
50
  //# sourceMappingURL=sub-agent-guard-plugin.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"sub-agent-guard-plugin.js","sourceRoot":"","sources":["../src/sub-agent-guard-plugin.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AASxD;;;;;;GAMG;AACH,MAAM,OAAO,4BAA4B;IACtB,SAAS,CAAS;IAEnC,YAAY,OAA6B;QACvC,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;IACrC,CAAC;IAED,eAAe,CAAC,EAAE,QAAQ,EAAmB;QAC3C,oEAAoE;QACpE,QAAQ,CAAC,GAAG,CAAC,IAAI,kBAAkB,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;QAEpE,oCAAoC;QACpC,QAAQ,CAAC,GAAG,CACV,IAAI,4BAA4B,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,CAChE,CAAC;IACJ,CAAC;CACF"}
1
+ {"version":3,"file":"sub-agent-guard-plugin.js","sourceRoot":"","sources":["../src/sub-agent-guard-plugin.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AASxD;;;;;;GAMG;AACH,MAAM,OAAO,4BAA4B;IACtB,WAAW,CAAS;IAErC,YAAY,OAA6B;QACvC,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;IACzC,CAAC;IAED,eAAe,CAAC,EAAE,QAAQ,EAAmB;QAC3C,qCAAqC;QACrC,QAAQ,CAAC,GAAG,CAAC,IAAI,kBAAkB,CAAC,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;QAExE,oCAAoC;QACpC,QAAQ,CAAC,GAAG,CACV,IAAI,4BAA4B,CAAC,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,CACpE,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * `↑` 历史的唯一数据源 —— 直接派生自 `session.messages` 里的用户消息。
3
+ *
4
+ * ## 为什么不另存一份历史
5
+ *
6
+ * 旧实现在 `useInputEditing` 内部维护 `string[]`:只有文本。于是 `↑` 翻回一条**带图片**
7
+ * 的消息时图片静默丢失,用户直接回车就把「图 + 文」重发成了纯文本 —— 看起来什么都没少,
8
+ * 但模型收到的完全不同。而真相本来就在 messages 的内容段里(`Ctrl+V` 粘贴的图会以
9
+ * `image_url` 的 data URL 落进用户消息),派生出来即可,不需要第二份会漂移的副本。
10
+ *
11
+ * ## 还原不了的情况(刻意如此)
12
+ *
13
+ * 走 Files API 上传过的图片在消息里是 `file_id`,本地没有副本 —— 这种只恢复文本,
14
+ * 不塞一个空壳附件(重发时才会真的丢图,而不是假装有)。
15
+ */
16
+ import { AgentNS } from "@ai-zen/agents-core";
17
+ import type { ClipboardImage } from "../clipboard.js";
18
+ /** 一条可再次编辑的草稿:文本 + 附件 */
19
+ export interface HistoryEntry {
20
+ text: string;
21
+ images: readonly ClipboardImage[];
22
+ }
23
+ /**
24
+ * 用户消息 → 草稿列表(按发送顺序,**最后一条最新**)。
25
+ *
26
+ * `↑` 从末尾往回走,与「最近说过的话先翻出来」一致。
27
+ */
28
+ export declare function userDrafts(messages: readonly AgentNS.Message[]): HistoryEntry[];
29
+ //# sourceMappingURL=chat-history.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-history.d.ts","sourceRoot":"","sources":["../../src/tui/chat-history.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAGtD,yBAAyB;AACzB,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,SAAS,cAAc,EAAE,CAAC;CACnC;AA6BD;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,SAAS,OAAO,CAAC,OAAO,EAAE,GAAG,YAAY,EAAE,CAE/E"}