@armadra/agent 0.5.1 → 0.6.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 (467) hide show
  1. package/CHANGELOG.md +177 -304
  2. package/CHANGELOG.zh-CN.md +442 -0
  3. package/README.md +408 -364
  4. package/README.zh-CN.md +705 -0
  5. package/dist/agent/session-plan.js +2 -2
  6. package/dist/agent/session-state.d.ts +3 -0
  7. package/dist/agent/session-state.js +20 -0
  8. package/dist/agent/session-subagent.d.ts +15 -1
  9. package/dist/agent/session-subagent.js +26 -3
  10. package/dist/agent/session-telemetry.d.ts +16 -2
  11. package/dist/agent/session-telemetry.js +29 -7
  12. package/dist/agent/session-tools.js +5 -2
  13. package/dist/agent/session-trace-writer.d.ts +27 -0
  14. package/dist/agent/session-trace-writer.js +253 -0
  15. package/dist/agent/session.d.ts +2 -0
  16. package/dist/agent/session.js +12 -0
  17. package/dist/agent/subagent-direct.d.ts +20 -0
  18. package/dist/agent/subagent-direct.js +76 -0
  19. package/dist/agent/subagent-registry.d.ts +8 -1
  20. package/dist/agent/subagent-registry.js +28 -1
  21. package/dist/agent/system-prompt.d.ts +3 -1
  22. package/dist/agent/system-prompt.js +3 -0
  23. package/dist/agent/tool-runner.d.ts +2 -1
  24. package/dist/agent/tool-runner.js +5 -4
  25. package/dist/agent/types-w6.d.ts +39 -0
  26. package/dist/agent/types-w6.js +4 -0
  27. package/dist/agent/types.d.ts +5 -2
  28. package/dist/agents/external.js +1 -1
  29. package/dist/agents/task-record.d.ts +74 -1
  30. package/dist/agents/task-record.js +100 -0
  31. package/dist/ai/apis/cache-params.js +2 -1
  32. package/dist/ai/apis/chatgpt-backend.d.ts +52 -0
  33. package/dist/ai/apis/chatgpt-backend.js +224 -0
  34. package/dist/ai/apis/chatgpt-rate-limits.d.ts +26 -0
  35. package/dist/ai/apis/chatgpt-rate-limits.js +91 -0
  36. package/dist/ai/apis/openai-responses-request.d.ts +2 -1
  37. package/dist/ai/apis/openai-responses-request.js +8 -2
  38. package/dist/ai/apis/openai-responses.d.ts +2 -0
  39. package/dist/ai/apis/openai-responses.js +51 -16
  40. package/dist/ai/overflow.d.ts +1 -1
  41. package/dist/ai/overflow.js +10 -7
  42. package/dist/ai/providers/auth.d.ts +15 -2
  43. package/dist/ai/providers/auth.js +69 -2
  44. package/dist/ai/providers/builtin.js +27 -0
  45. package/dist/ai/providers/catalog-data.js +1 -0
  46. package/dist/ai/providers/enrich.js +2 -7
  47. package/dist/ai/providers/models-dev-cache.js +15 -19
  48. package/dist/ai/providers/models-dev-snapshot.js +8 -7
  49. package/dist/ai/providers/models-dev.js +5 -15
  50. package/dist/ai/providers/suggest.js +2 -16
  51. package/dist/ai/types.d.ts +27 -1
  52. package/dist/auth/chatgpt/backend-client.d.ts +26 -0
  53. package/dist/auth/chatgpt/backend-client.js +74 -0
  54. package/dist/auth/chatgpt/claims.d.ts +17 -0
  55. package/dist/auth/chatgpt/claims.js +46 -0
  56. package/dist/auth/chatgpt/cli.d.ts +33 -0
  57. package/dist/auth/chatgpt/cli.js +252 -0
  58. package/dist/auth/chatgpt/doctor.d.ts +17 -0
  59. package/dist/auth/chatgpt/doctor.js +36 -0
  60. package/dist/auth/chatgpt/host-id.d.ts +7 -0
  61. package/dist/auth/chatgpt/host-id.js +26 -0
  62. package/dist/auth/chatgpt/login.d.ts +30 -0
  63. package/dist/auth/chatgpt/login.js +130 -0
  64. package/dist/auth/chatgpt/presets.d.ts +66 -0
  65. package/dist/auth/chatgpt/presets.js +120 -0
  66. package/dist/auth/chatgpt/quota-text.d.ts +13 -0
  67. package/dist/auth/chatgpt/quota-text.js +36 -0
  68. package/dist/auth/oauth/browser.d.ts +12 -0
  69. package/dist/auth/oauth/browser.js +27 -0
  70. package/dist/auth/oauth/callback-server.d.ts +47 -0
  71. package/dist/auth/oauth/callback-server.js +147 -0
  72. package/dist/auth/oauth/flows.d.ts +62 -0
  73. package/dist/auth/oauth/flows.js +113 -0
  74. package/dist/auth/oauth/jwt.d.ts +24 -0
  75. package/dist/auth/oauth/jwt.js +81 -0
  76. package/dist/auth/oauth/live.d.ts +21 -0
  77. package/dist/auth/oauth/live.js +25 -0
  78. package/dist/auth/oauth/oidc.d.ts +26 -0
  79. package/dist/auth/oauth/oidc.js +72 -0
  80. package/dist/auth/oauth/pkce.d.ts +15 -0
  81. package/dist/auth/oauth/pkce.js +20 -0
  82. package/dist/auth/oauth/refresh.d.ts +35 -0
  83. package/dist/auth/oauth/refresh.js +129 -0
  84. package/dist/auth/oauth/token-client.d.ts +33 -0
  85. package/dist/auth/oauth/token-client.js +121 -0
  86. package/dist/auth/oauth/token-store.d.ts +23 -0
  87. package/dist/auth/oauth/token-store.js +125 -0
  88. package/dist/auth/testing/fake-oauth.d.ts +73 -0
  89. package/dist/auth/testing/fake-oauth.js +271 -0
  90. package/dist/auth/testing/refresh-child.d.ts +5 -0
  91. package/dist/auth/testing/refresh-child.js +16 -0
  92. package/dist/bundle/ama.cjs +25928 -11144
  93. package/dist/checkpoints/backend.js +6 -5
  94. package/dist/checkpoints/restore.js +3 -2
  95. package/dist/checkpoints/settings.js +2 -1
  96. package/dist/checkpoints/shadow-git.js +7 -6
  97. package/dist/checkpoints/shadow-restore.js +3 -2
  98. package/dist/checkpoints/tracker.js +4 -3
  99. package/dist/cli/args.d.ts +9 -2
  100. package/dist/cli/args.js +74 -27
  101. package/dist/cli/bootstrap.js +53 -31
  102. package/dist/cli/choice-prompt.js +8 -6
  103. package/dist/cli/codemode-notice.js +2 -2
  104. package/dist/cli/compose-agents.js +2 -1
  105. package/dist/cli/compose-extensions.js +2 -0
  106. package/dist/cli/compose-memory.d.ts +53 -0
  107. package/dist/cli/compose-memory.js +127 -0
  108. package/dist/cli/compose-providers.d.ts +5 -0
  109. package/dist/cli/compose-providers.js +32 -2
  110. package/dist/cli/compose-session.d.ts +5 -0
  111. package/dist/cli/compose-session.js +27 -13
  112. package/dist/cli/compose-store.d.ts +2 -0
  113. package/dist/cli/compose-store.js +9 -5
  114. package/dist/cli/compose.d.ts +2 -0
  115. package/dist/cli/compose.js +13 -5
  116. package/dist/cli/default-model.d.ts +0 -2
  117. package/dist/cli/default-model.js +5 -8
  118. package/dist/cli/deps.d.ts +5 -1
  119. package/dist/cli/exit-codes.d.ts +1 -1
  120. package/dist/cli/exit-codes.js +7 -16
  121. package/dist/cli/from-prompt.js +3 -2
  122. package/dist/cli/help-text.d.ts +2 -1
  123. package/dist/cli/help-text.js +5 -99
  124. package/dist/cli/main.d.ts +5 -0
  125. package/dist/cli/main.js +21 -2
  126. package/dist/cli/proxy.js +14 -9
  127. package/dist/cli/runtime.d.ts +5 -0
  128. package/dist/cli/startup-screen.js +20 -27
  129. package/dist/cli/startup-steps.js +6 -8
  130. package/dist/cli/subcommands/auth.d.ts +6 -3
  131. package/dist/cli/subcommands/auth.js +52 -22
  132. package/dist/cli/subcommands/config-set.d.ts +21 -0
  133. package/dist/cli/subcommands/config-set.js +137 -0
  134. package/dist/cli/subcommands/config.d.ts +2 -1
  135. package/dist/cli/subcommands/config.js +51 -37
  136. package/dist/cli/subcommands/doctor.d.ts +2 -1
  137. package/dist/cli/subcommands/doctor.js +97 -58
  138. package/dist/cli/subcommands/init.d.ts +1 -1
  139. package/dist/cli/subcommands/init.js +8 -7
  140. package/dist/cli/subcommands/memory.d.ts +18 -0
  141. package/dist/cli/subcommands/memory.js +189 -0
  142. package/dist/cli/subcommands/model-meta.js +11 -9
  143. package/dist/cli/subcommands/models-cache-probe.js +23 -20
  144. package/dist/cli/subcommands/models-discover.d.ts +3 -0
  145. package/dist/cli/subcommands/models-discover.js +44 -21
  146. package/dist/cli/subcommands/models.d.ts +1 -1
  147. package/dist/cli/subcommands/models.js +29 -22
  148. package/dist/cli/subcommands/probe-runner.js +8 -7
  149. package/dist/cli/subcommands/providers-list.js +32 -21
  150. package/dist/cli/subcommands/providers-plan.js +24 -25
  151. package/dist/cli/subcommands/providers-probe.js +5 -6
  152. package/dist/cli/subcommands/providers.d.ts +1 -1
  153. package/dist/cli/subcommands/providers.js +45 -50
  154. package/dist/cli/subcommands/sessions-export.d.ts +1 -1
  155. package/dist/cli/subcommands/sessions-export.js +10 -9
  156. package/dist/cli/subcommands/sessions-search.d.ts +1 -1
  157. package/dist/cli/subcommands/sessions-search.js +11 -10
  158. package/dist/cli/subcommands/sessions-trace.d.ts +30 -0
  159. package/dist/cli/subcommands/sessions-trace.js +156 -0
  160. package/dist/cli/subcommands/sessions.d.ts +4 -3
  161. package/dist/cli/subcommands/sessions.js +40 -37
  162. package/dist/cli/subcommands/stats.d.ts +1 -1
  163. package/dist/cli/subcommands/stats.js +49 -30
  164. package/dist/cli/system-prompt-arg.js +3 -2
  165. package/dist/codemode/capability.js +3 -2
  166. package/dist/compaction/post-compact.d.ts +1 -0
  167. package/dist/compaction/post-compact.js +15 -1
  168. package/dist/compaction/prune-tier.d.ts +1 -1
  169. package/dist/compaction/prune-tier.js +3 -3
  170. package/dist/compaction/serialize.js +2 -1
  171. package/dist/config/auth-file.d.ts +12 -2
  172. package/dist/config/auth-file.js +32 -10
  173. package/dist/config/checker.js +12 -11
  174. package/dist/config/context-files.js +3 -2
  175. package/dist/config/edit.d.ts +106 -0
  176. package/dist/config/edit.js +350 -0
  177. package/dist/config/init.d.ts +4 -3
  178. package/dist/config/init.js +10 -18
  179. package/dist/config/json-schema.d.ts +2 -1
  180. package/dist/config/json-schema.js +101 -68
  181. package/dist/config/key-docs.d.ts +18 -7
  182. package/dist/config/key-docs.js +43 -128
  183. package/dist/config/load.js +7 -6
  184. package/dist/config/merge.d.ts +4 -1
  185. package/dist/config/merge.js +42 -22
  186. package/dist/config/paths.js +6 -5
  187. package/dist/config/profile.d.ts +5 -1
  188. package/dist/config/profile.js +7 -2
  189. package/dist/config/schema-w5.js +3 -2
  190. package/dist/config/schema-w6.d.ts +19 -0
  191. package/dist/config/schema-w6.js +115 -0
  192. package/dist/config/schema.js +34 -20
  193. package/dist/config/settings-registry.d.ts +78 -0
  194. package/dist/config/settings-registry.js +184 -0
  195. package/dist/config/types-w6.d.ts +109 -0
  196. package/dist/config/types-w6.js +19 -0
  197. package/dist/config/types.d.ts +11 -8
  198. package/dist/config/types.js +1 -0
  199. package/dist/drivers/acp/client.js +1 -1
  200. package/dist/drivers/acp/driver.js +13 -8
  201. package/dist/drivers/agents.js +4 -3
  202. package/dist/drivers/base.js +3 -2
  203. package/dist/drivers/host-runners.js +2 -1
  204. package/dist/drivers/native/claude-stream.js +12 -11
  205. package/dist/drivers/native/codex-app-server.js +17 -12
  206. package/dist/drivers/native/oneshot.js +8 -7
  207. package/dist/drivers/pool.js +1 -1
  208. package/dist/drivers/runner.d.ts +3 -1
  209. package/dist/drivers/runner.js +68 -20
  210. package/dist/drivers/turn.js +1 -1
  211. package/dist/hooks/config.js +3 -2
  212. package/dist/hooks/protocol.js +18 -12
  213. package/dist/host/api-impl.js +11 -10
  214. package/dist/host/loader.js +9 -8
  215. package/dist/host/types.d.ts +3 -0
  216. package/dist/i18n/catalog.d.ts +2169 -0
  217. package/dist/i18n/catalog.js +72 -0
  218. package/dist/i18n/format.d.ts +21 -0
  219. package/dist/i18n/format.js +58 -0
  220. package/dist/i18n/index.d.ts +58 -0
  221. package/dist/i18n/index.js +72 -0
  222. package/dist/i18n/messages/agents.d.ts +84 -0
  223. package/dist/i18n/messages/agents.js +85 -0
  224. package/dist/i18n/messages/approval.d.ts +99 -0
  225. package/dist/i18n/messages/approval.js +100 -0
  226. package/dist/i18n/messages/auth.d.ts +187 -0
  227. package/dist/i18n/messages/auth.js +189 -0
  228. package/dist/i18n/messages/cli-args.d.ts +46 -0
  229. package/dist/i18n/messages/cli-args.js +46 -0
  230. package/dist/i18n/messages/cli-help.d.ts +12 -0
  231. package/dist/i18n/messages/cli-help.js +244 -0
  232. package/dist/i18n/messages/cli.d.ts +336 -0
  233. package/dist/i18n/messages/cli.js +311 -0
  234. package/dist/i18n/messages/config-keys.d.ts +289 -0
  235. package/dist/i18n/messages/config-keys.js +292 -0
  236. package/dist/i18n/messages/config.d.ts +502 -0
  237. package/dist/i18n/messages/config.js +239 -0
  238. package/dist/i18n/messages/drivers.d.ts +123 -0
  239. package/dist/i18n/messages/drivers.js +124 -0
  240. package/dist/i18n/messages/errors.d.ts +83 -0
  241. package/dist/i18n/messages/errors.js +171 -0
  242. package/dist/i18n/messages/interactive-line.d.ts +61 -0
  243. package/dist/i18n/messages/interactive-line.js +69 -0
  244. package/dist/i18n/messages/interactive-startup.d.ts +103 -0
  245. package/dist/i18n/messages/interactive-startup.js +104 -0
  246. package/dist/i18n/messages/interactive-view.d.ts +140 -0
  247. package/dist/i18n/messages/interactive-view.js +141 -0
  248. package/dist/i18n/messages/interactive.d.ts +493 -0
  249. package/dist/i18n/messages/interactive.js +248 -0
  250. package/dist/i18n/messages/memory.d.ts +123 -0
  251. package/dist/i18n/messages/memory.js +128 -0
  252. package/dist/i18n/messages/panels.d.ts +190 -0
  253. package/dist/i18n/messages/panels.js +189 -0
  254. package/dist/i18n/messages/permissions.d.ts +126 -0
  255. package/dist/i18n/messages/permissions.js +151 -0
  256. package/dist/i18n/messages/plan.d.ts +123 -0
  257. package/dist/i18n/messages/plan.js +124 -0
  258. package/dist/i18n/messages/print.d.ts +86 -0
  259. package/dist/i18n/messages/print.js +91 -0
  260. package/dist/i18n/messages/report.d.ts +391 -0
  261. package/dist/i18n/messages/report.js +490 -0
  262. package/dist/i18n/messages/rewind.d.ts +198 -0
  263. package/dist/i18n/messages/rewind.js +217 -0
  264. package/dist/i18n/messages/session.d.ts +230 -0
  265. package/dist/i18n/messages/session.js +258 -0
  266. package/dist/i18n/messages/settings.d.ts +348 -0
  267. package/dist/i18n/messages/settings.js +336 -0
  268. package/dist/i18n/messages/subcommands-config.d.ts +111 -0
  269. package/dist/i18n/messages/subcommands-config.js +127 -0
  270. package/dist/i18n/messages/subcommands.d.ts +548 -0
  271. package/dist/i18n/messages/subcommands.js +474 -0
  272. package/dist/i18n/messages/trace.d.ts +243 -0
  273. package/dist/i18n/messages/trace.js +238 -0
  274. package/dist/i18n/types.d.ts +15 -0
  275. package/dist/i18n/types.js +7 -0
  276. package/dist/index.d.ts +6 -0
  277. package/dist/index.js +2 -0
  278. package/dist/memory/edit.d.ts +24 -0
  279. package/dist/memory/edit.js +63 -0
  280. package/dist/memory/frontmatter.d.ts +37 -0
  281. package/dist/memory/frontmatter.js +79 -0
  282. package/dist/memory/index.d.ts +28 -0
  283. package/dist/memory/index.js +126 -0
  284. package/dist/memory/lock.d.ts +17 -0
  285. package/dist/memory/lock.js +62 -0
  286. package/dist/memory/paths.d.ts +57 -0
  287. package/dist/memory/paths.js +175 -0
  288. package/dist/memory/report.d.ts +36 -0
  289. package/dist/memory/report.js +86 -0
  290. package/dist/memory/runtime.d.ts +42 -0
  291. package/dist/memory/runtime.js +36 -0
  292. package/dist/memory/secrets.d.ts +8 -0
  293. package/dist/memory/secrets.js +27 -0
  294. package/dist/memory/section.d.ts +28 -0
  295. package/dist/memory/section.js +59 -0
  296. package/dist/memory/store.d.ts +70 -0
  297. package/dist/memory/store.js +284 -0
  298. package/dist/memory/tool.d.ts +31 -0
  299. package/dist/memory/tool.js +94 -0
  300. package/dist/modes/acp/acp-events.js +2 -1
  301. package/dist/modes/acp/acp-server.js +13 -12
  302. package/dist/modes/commands-core.d.ts +11 -0
  303. package/dist/modes/commands-core.js +93 -62
  304. package/dist/modes/image-input.js +20 -6
  305. package/dist/modes/interactive/agent-bar.d.ts +95 -0
  306. package/dist/modes/interactive/agent-bar.js +248 -0
  307. package/dist/modes/interactive/agent-panels.js +27 -26
  308. package/dist/modes/interactive/agent-transcript.d.ts +47 -0
  309. package/dist/modes/interactive/agent-transcript.js +191 -0
  310. package/dist/modes/interactive/agent-ui.d.ts +36 -1
  311. package/dist/modes/interactive/agent-ui.js +180 -14
  312. package/dist/modes/interactive/agent-view.d.ts +72 -0
  313. package/dist/modes/interactive/agent-view.js +281 -0
  314. package/dist/modes/interactive/approval-dialog.js +46 -34
  315. package/dist/modes/interactive/clipboard-paste.d.ts +2 -2
  316. package/dist/modes/interactive/clipboard-paste.js +9 -4
  317. package/dist/modes/interactive/commands.d.ts +19 -1
  318. package/dist/modes/interactive/commands.js +84 -40
  319. package/dist/modes/interactive/completion.js +2 -1
  320. package/dist/modes/interactive/config-panel.d.ts +70 -0
  321. package/dist/modes/interactive/config-panel.js +319 -0
  322. package/dist/modes/interactive/config-ui.d.ts +96 -0
  323. package/dist/modes/interactive/config-ui.js +397 -0
  324. package/dist/modes/interactive/confirm-dialog.js +6 -7
  325. package/dist/modes/interactive/event-notices.js +11 -9
  326. package/dist/modes/interactive/interactive-mode.d.ts +1 -1
  327. package/dist/modes/interactive/interactive-mode.js +19 -22
  328. package/dist/modes/interactive/key-dispatch.d.ts +12 -0
  329. package/dist/modes/interactive/key-dispatch.js +24 -9
  330. package/dist/modes/interactive/line/line-editor.js +2 -1
  331. package/dist/modes/interactive/line/line-mode.js +18 -7
  332. package/dist/modes/interactive/line/line-render.js +25 -24
  333. package/dist/modes/interactive/memory-panel.d.ts +64 -0
  334. package/dist/modes/interactive/memory-panel.js +221 -0
  335. package/dist/modes/interactive/message-view.d.ts +4 -2
  336. package/dist/modes/interactive/message-view.js +42 -33
  337. package/dist/modes/interactive/panels.js +39 -31
  338. package/dist/modes/interactive/pickers.d.ts +2 -1
  339. package/dist/modes/interactive/pickers.js +10 -6
  340. package/dist/modes/interactive/plan-command.d.ts +1 -1
  341. package/dist/modes/interactive/plan-command.js +24 -27
  342. package/dist/modes/interactive/plan-dialog.js +18 -17
  343. package/dist/modes/interactive/plan-flow.js +6 -5
  344. package/dist/modes/interactive/rewind-command.d.ts +1 -1
  345. package/dist/modes/interactive/rewind-command.js +18 -16
  346. package/dist/modes/interactive/rewind-flow.d.ts +0 -1
  347. package/dist/modes/interactive/rewind-flow.js +13 -14
  348. package/dist/modes/interactive/rewind-list.js +7 -6
  349. package/dist/modes/interactive/rewind-panel.js +40 -40
  350. package/dist/modes/interactive/rewind-text.d.ts +5 -3
  351. package/dist/modes/interactive/rewind-text.js +48 -38
  352. package/dist/modes/interactive/run-indicator.js +15 -12
  353. package/dist/modes/interactive/session-events.js +3 -2
  354. package/dist/modes/interactive/startup-header.js +22 -23
  355. package/dist/modes/interactive/startup-ui.js +38 -30
  356. package/dist/modes/interactive/status-area.d.ts +2 -0
  357. package/dist/modes/interactive/status-area.js +8 -2
  358. package/dist/modes/interactive/status-bar.js +4 -3
  359. package/dist/modes/interactive/subagent-view.js +9 -7
  360. package/dist/modes/interactive/tasks-report.d.ts +6 -0
  361. package/dist/modes/interactive/tasks-report.js +28 -31
  362. package/dist/modes/interactive/terminal-setup.d.ts +9 -0
  363. package/dist/modes/interactive/terminal-setup.js +23 -0
  364. package/dist/modes/interactive/tool-summary.js +19 -17
  365. package/dist/modes/interactive/tool-view.js +7 -4
  366. package/dist/modes/interactive/trace-view.d.ts +89 -0
  367. package/dist/modes/interactive/trace-view.js +332 -0
  368. package/dist/modes/print/print-mode.js +14 -15
  369. package/dist/modes/rpc/commands.js +7 -3
  370. package/dist/modes/rpc/rpc-mode.js +9 -3
  371. package/dist/modes/session-report.d.ts +2 -0
  372. package/dist/modes/session-report.js +101 -105
  373. package/dist/modes/startup-ui-text.js +11 -6
  374. package/dist/permissions/bypass.d.ts +8 -10
  375. package/dist/permissions/bypass.js +19 -10
  376. package/dist/permissions/memory-class.d.ts +23 -0
  377. package/dist/permissions/memory-class.js +54 -0
  378. package/dist/permissions/modes.d.ts +3 -3
  379. package/dist/permissions/modes.js +21 -16
  380. package/dist/permissions/pipeline.d.ts +1 -1
  381. package/dist/permissions/pipeline.js +9 -2
  382. package/dist/permissions/preview.js +49 -42
  383. package/dist/permissions/rules.js +5 -2
  384. package/dist/permissions/types.d.ts +4 -0
  385. package/dist/plan/store.js +2 -1
  386. package/dist/rpc.d.ts +39 -1
  387. package/dist/rpc.js +3 -0
  388. package/dist/sandbox/bash.js +11 -8
  389. package/dist/sandbox/detect.js +14 -11
  390. package/dist/sdk.d.ts +17 -1
  391. package/dist/sdk.js +29 -7
  392. package/dist/session/export.js +31 -30
  393. package/dist/session/manager.d.ts +1 -1
  394. package/dist/session/manager.js +5 -3
  395. package/dist/session/reuse.js +5 -4
  396. package/dist/session/scan.js +3 -2
  397. package/dist/session/stats-aggregate.d.ts +3 -1
  398. package/dist/session/stats-aggregate.js +5 -1
  399. package/dist/session/stats-index.js +2 -1
  400. package/dist/session/stats-scan.d.ts +4 -1
  401. package/dist/session/stats-scan.js +6 -2
  402. package/dist/session/store.d.ts +11 -0
  403. package/dist/session/store.js +48 -1
  404. package/dist/session/types.d.ts +2 -0
  405. package/dist/skills/builtin.js +2 -1
  406. package/dist/tools/image-file.d.ts +26 -1
  407. package/dist/tools/image-file.js +55 -13
  408. package/dist/tools/presets.d.ts +14 -1
  409. package/dist/tools/presets.js +3 -3
  410. package/dist/tools/registry.js +1 -1
  411. package/dist/tools/truncate.d.ts +1 -1
  412. package/dist/tools/truncate.js +2 -2
  413. package/dist/tools/types.d.ts +17 -1
  414. package/dist/trace/build-index.d.ts +91 -0
  415. package/dist/trace/build-index.js +127 -0
  416. package/dist/trace/build-nodes.d.ts +24 -0
  417. package/dist/trace/build-nodes.js +279 -0
  418. package/dist/trace/build-util.d.ts +43 -0
  419. package/dist/trace/build-util.js +120 -0
  420. package/dist/trace/build.d.ts +82 -0
  421. package/dist/trace/build.js +382 -0
  422. package/dist/trace/detail.d.ts +35 -0
  423. package/dist/trace/detail.js +205 -0
  424. package/dist/trace/flatten.d.ts +69 -0
  425. package/dist/trace/flatten.js +173 -0
  426. package/dist/trace/format.d.ts +47 -0
  427. package/dist/trace/format.js +329 -0
  428. package/dist/trace/html-template.d.ts +19 -0
  429. package/dist/trace/html-template.js +150 -0
  430. package/dist/trace/html.d.ts +104 -0
  431. package/dist/trace/html.js +292 -0
  432. package/dist/trace/preview.d.ts +29 -0
  433. package/dist/trace/preview.js +59 -0
  434. package/dist/trace/query-session.d.ts +14 -0
  435. package/dist/trace/query-session.js +38 -0
  436. package/dist/trace/query.d.ts +55 -0
  437. package/dist/trace/query.js +188 -0
  438. package/dist/trace/session.d.ts +40 -0
  439. package/dist/trace/session.js +168 -0
  440. package/dist/trace/types.d.ts +243 -0
  441. package/dist/trace/types.js +13 -0
  442. package/dist/tui/components/editor-paste.d.ts +2 -0
  443. package/dist/tui/components/editor-paste.js +6 -3
  444. package/dist/tui/components/editor.js +2 -2
  445. package/dist/tui/components/loader.d.ts +3 -0
  446. package/dist/tui/components/loader.js +14 -0
  447. package/dist/tui/components/settings-list.d.ts +61 -0
  448. package/dist/tui/components/settings-list.js +135 -0
  449. package/dist/tui/keybindings.d.ts +5 -0
  450. package/dist/tui/keybindings.js +17 -5
  451. package/dist/tui.d.ts +1 -0
  452. package/dist/tui.js +2 -0
  453. package/docs/en/host-api.md +167 -0
  454. package/docs/en/permissions.md +214 -0
  455. package/docs/en/providers.md +625 -0
  456. package/docs/en/rpc.md +361 -0
  457. package/docs/en/sessions.md +219 -0
  458. package/docs/en/tui.md +527 -0
  459. package/docs/host-api.md +18 -17
  460. package/docs/memory.md +172 -0
  461. package/docs/permissions.md +2 -2
  462. package/docs/providers.md +67 -1
  463. package/docs/rpc.md +31 -3
  464. package/docs/session-format.md +8 -2
  465. package/docs/sessions.md +29 -1
  466. package/docs/tui.md +132 -3
  467. package/package.json +8 -3
@@ -17,6 +17,7 @@ import { AmaError } from "../errors.js";
17
17
  import { defaultSetTimer } from "./base.js";
18
18
  import { buildChildEnv } from "./env.js";
19
19
  import { askHuman, clampMode, supportedMode } from "./permissions.js";
20
+ import { msg } from "../i18n/index.js";
20
21
  export const RUN_TIMEOUT_MS = 30 * 60 * 1000;
21
22
  export const IDLE_CLOSE_MS = 10 * 60 * 1000;
22
23
  function toUsage(turn) {
@@ -50,13 +51,13 @@ function statusOf(turn, timedOut, stopped) {
50
51
  return "failed";
51
52
  }
52
53
  }
53
- /** 最终报告:最终文本 + 工具摘要 / 触及文件(给协调者当资料,不是指令)。 */
54
+ /** 最终报告:最终文本 + 工具摘要 / 触及文件(给协调者当资料,不是指令;[W6-C0] 标题固定英文)。 */
54
55
  export function reportText(turn) {
55
56
  const parts = [turn.finalText.trim()];
56
57
  if (turn.toolSummary.length > 0)
57
- parts.push(`工具调用:\n${turn.toolSummary.map((l) => `- ${l}`).join("\n")}`);
58
+ parts.push(`Tool calls:\n${turn.toolSummary.map((l) => `- ${l}`).join("\n")}`);
58
59
  if (turn.filesTouched.length > 0)
59
- parts.push(`修改的文件:\n${turn.filesTouched.map((f) => `- ${f}`).join("\n")}`);
60
+ parts.push(`Files changed:\n${turn.filesTouched.map((f) => `- ${f}`).join("\n")}`);
60
61
  return parts.filter((p) => p !== "").join("\n\n");
61
62
  }
62
63
  function failed(text, sessionId, runner) {
@@ -77,7 +78,7 @@ export class ProcessRunner {
77
78
  this.deps = deps;
78
79
  this.drivers = Array.isArray(driver) ? driver : [driver];
79
80
  if (this.drivers.length === 0)
80
- throw new AmaError("invalid_arguments", "ProcessRunner 需要至少一个驱动");
81
+ throw new AmaError("invalid_arguments", "ProcessRunner needs at least one driver");
81
82
  this.id = deps.id ?? this.drivers[0].agentId;
82
83
  }
83
84
  get agentId() {
@@ -93,12 +94,12 @@ export class ProcessRunner {
93
94
  for (const driver of this.drivers) {
94
95
  const probe = await driver.probe();
95
96
  if (!probe.installed) {
96
- reasons.push(`${driver.kind} 未安装`);
97
+ reasons.push(`${driver.kind} is not installed`);
97
98
  continue;
98
99
  }
99
100
  const usable = supportedMode(mode, probe.capabilities.modes);
100
101
  if (usable === undefined) {
101
- reasons.push(`${driver.kind} 不支持「${mode}」`);
102
+ reasons.push(`${driver.kind} does not support "${mode}"`);
102
103
  continue;
103
104
  }
104
105
  const warning = probe.warning;
@@ -109,14 +110,14 @@ export class ProcessRunner {
109
110
  ...(warning !== undefined ? { warning } : {}),
110
111
  };
111
112
  }
112
- throw new AmaError("agent_unavailable", `外部 Agent ${this.id} 不可用(${reasons.join(";")})`);
113
+ throw new AmaError("agent_unavailable", `external agent ${this.id} is unavailable (${reasons.join("; ")})`);
113
114
  }
114
115
  async start(request) {
115
116
  if (!this.deps.trusted(request.cwd))
116
- throw new AmaError("agent_untrusted", `目录 ${request.cwd} 尚未被 ama 信任,不能在这里启动外部 Agent(它会执行项目里的 hooks 与配置);先运行 ama trust`);
117
+ throw new AmaError("agent_untrusted", `${request.cwd} is not trusted by ama, so external agents cannot start here (they run the project's hooks and config); run ama trust there first`);
117
118
  const budget = this.deps.config?.sessionBudgetUsd;
118
119
  if (budget !== undefined && (this.deps.store?.totalUsd() ?? 0) >= budget)
119
- throw new AmaError("budget_exhausted", `本会话外部 Agent 预算 $${budget} 已用尽`);
120
+ throw new AmaError("budget_exhausted", `external agent budget for this session ($${budget}) is used up`);
120
121
  const entry = agentEntry(this.deps.config, this.agentId);
121
122
  const mode = clampMode(request.mode, this.deps.parentMode?.(), entry?.maxMode);
122
123
  const chosen = await this.choose(mode);
@@ -141,13 +142,15 @@ class ProcessHandle {
141
142
  deps;
142
143
  session;
143
144
  sessionId = "";
144
- chain = Promise.resolve(failed("尚未运行", "", ""));
145
+ chain = Promise.resolve(failed("not started", "", ""));
145
146
  busy = false;
146
147
  turns = 0;
147
148
  stopped = false;
148
149
  lifetime = new AbortController();
149
150
  clearIdle;
150
151
  agent;
152
+ /** [W6-C0] 本回合工具的骨架(id → 种类 / 状态 / 起止),回合结束写 `turn_trace`。 */
153
+ turnTools = new Map();
151
154
  constructor(runner, chosen, request, deps) {
152
155
  this.runner = runner;
153
156
  this.chosen = chosen;
@@ -165,7 +168,7 @@ class ProcessHandle {
165
168
  request.onEvent({
166
169
  type: "notice",
167
170
  level: "info",
168
- text: `${this.agent} 以「${chosen.mode}」模式运行(请求的是「${request.mode}」,外部 Agent 不得比 ama 当前模式宽)`,
171
+ text: msg().drivers.agent.modeClamped(this.agent, chosen.mode, request.mode),
169
172
  });
170
173
  }
171
174
  get id() {
@@ -199,7 +202,7 @@ class ProcessHandle {
199
202
  }
200
203
  async send(text) {
201
204
  if (this.stopped)
202
- throw new AmaError("agent_closed", `${this.agent} 已停止`);
205
+ throw new AmaError("agent_closed", `${this.agent} stopped`);
203
206
  if (this.busy && this.session?.steer !== undefined && this.chosen.capabilities.steer) {
204
207
  await this.session.steer([{ type: "text", text }]);
205
208
  return;
@@ -238,7 +241,18 @@ class ProcessHandle {
238
241
  case "thought_delta":
239
242
  this.emit({ type: "thought", delta: event.text });
240
243
  return;
241
- case "tool_call":
244
+ case "tool_call": {
245
+ const at = this.now();
246
+ const skeleton = this.turnTools.get(event.id) ?? {
247
+ kind: event.kind,
248
+ status: "in_progress",
249
+ startedAt: at,
250
+ };
251
+ if (event.status === "completed" || event.status === "failed") {
252
+ skeleton.status = event.status;
253
+ skeleton.endedAt = at;
254
+ }
255
+ this.turnTools.set(event.id, skeleton);
242
256
  if (event.status === "pending")
243
257
  return;
244
258
  this.emit({
@@ -249,8 +263,11 @@ class ProcessHandle {
249
263
  : event.status === "failed"
250
264
  ? "failed"
251
265
  : "completed",
266
+ id: event.id,
267
+ at,
252
268
  });
253
269
  return;
270
+ }
254
271
  case "notice":
255
272
  this.emit({ type: "notice", level: event.level, text: event.text });
256
273
  return;
@@ -265,7 +282,7 @@ class ProcessHandle {
265
282
  this.emit({
266
283
  type: "notice",
267
284
  level: "warn",
268
- text: `${this.agent} 超出美元预算,已中断`,
285
+ text: msg().drivers.agent.overBudget(this.agent),
269
286
  });
270
287
  cancel();
271
288
  }
@@ -275,33 +292,61 @@ class ProcessHandle {
275
292
  return;
276
293
  }
277
294
  }
295
+ now() {
296
+ return (this.deps.now ?? Date.now)();
297
+ }
298
+ /** [W6-C0] 回合骨架:只有种类、状态、时间与计数(不含工具标题、命令行、路径)。 */
299
+ emitTurnTrace(startedAt, stopReason, filesTouched) {
300
+ const tools = [...this.turnTools.values()];
301
+ this.turnTools = new Map();
302
+ this.emit({
303
+ type: "turn_trace",
304
+ trace: {
305
+ sessionId: this.sessionId,
306
+ turn: this.turns,
307
+ startedAt,
308
+ endedAt: this.now(),
309
+ stopReason,
310
+ tools,
311
+ toolCount: tools.length,
312
+ filesTouched,
313
+ },
314
+ });
315
+ }
278
316
  /** 关掉空闲进程后再续聊:能续接的以 resume 重开。 */
279
317
  async ensureSession() {
280
318
  if (this.session !== undefined)
281
319
  return this.session;
282
320
  if (this.chosen.capabilities.resume === "none" || this.sessionId === "")
283
- throw new AmaError("agent_closed", `${this.agent} 会话已因空闲关闭且不支持续接`);
321
+ throw new AmaError("agent_closed", `${this.agent} session was closed while idle and cannot be resumed`);
284
322
  await this.open(this.sessionId);
285
323
  return this.session;
286
324
  }
287
325
  async runTurn(text) {
288
326
  if (this.stopped)
289
- return failed(`${this.agent} 已停止`, this.sessionId, this.runner.id);
327
+ return failed(`${this.agent} stopped`, this.sessionId, this.runner.id);
290
328
  this.clearIdle?.();
291
329
  let release;
292
330
  const setTimer = this.deps.setTimer ?? defaultSetTimer;
293
331
  let timedOut = false;
332
+ let turnStartedAt;
294
333
  try {
295
334
  release = await this.deps.pool.acquire(this.agent, this.lifetime.signal);
296
335
  const session = this.session ?? (await this.ensureSession());
297
336
  this.busy = true;
298
337
  this.turns += 1;
338
+ turnStartedAt = this.now();
339
+ this.turnTools = new Map();
299
340
  this.emit({ type: "turn", turn: this.turns });
300
341
  const turnCost = { usd: 0 };
301
342
  const cancel = () => void session.cancel();
302
343
  const clearTimeout = setTimer(() => {
303
344
  timedOut = true;
304
- this.emit({ type: "notice", level: "warn", text: `${this.agent} 运行超时,已中断` });
345
+ this.emit({
346
+ type: "notice",
347
+ level: "warn",
348
+ text: msg().drivers.agent.timedOut(this.agent),
349
+ });
305
350
  cancel();
306
351
  }, this.deps.timeoutMs ?? RUN_TIMEOUT_MS);
307
352
  const onAbort = () => cancel();
@@ -344,10 +389,11 @@ class ProcessHandle {
344
389
  this.emit({ type: "usage", usage, unit, amount });
345
390
  }
346
391
  const status = statusOf(turn, timedOut, this.stopped);
392
+ this.emitTurnTrace(turnStartedAt, timedOut ? "timeout" : turn.stopReason, turn.filesTouched.length);
347
393
  this.armIdle();
348
394
  return {
349
395
  text: timedOut
350
- ? `${this.agent} 运行超时被中断。${turn.finalText !== "" ? `\n\n${reportText(turn)}` : ""}`
396
+ ? `${this.agent} timed out and was interrupted.${turn.finalText !== "" ? `\n\n${reportText(turn)}` : ""}`
351
397
  : reportText(turn),
352
398
  usage,
353
399
  stopReason: timedOut ? "timeout" : turn.stopReason,
@@ -357,12 +403,14 @@ class ProcessHandle {
357
403
  };
358
404
  }
359
405
  catch (error) {
406
+ if (turnStartedAt !== undefined)
407
+ this.emitTurnTrace(turnStartedAt, this.stopped ? "cancelled" : "error", 0);
360
408
  if (this.stopped)
361
409
  return {
362
- ...failed(`${this.agent} 已停止`, this.sessionId, this.runner.id),
410
+ ...failed(`${this.agent} stopped`, this.sessionId, this.runner.id),
363
411
  status: "aborted",
364
412
  };
365
- return failed(`${this.agent} 失败:${error.message}`, this.sessionId, this.runner.id);
413
+ return failed(`${this.agent} failed: ${error.message}`, this.sessionId, this.runner.id);
366
414
  }
367
415
  finally {
368
416
  release?.();
@@ -78,7 +78,7 @@ export class TurnCollector {
78
78
  const summary = lines.length > TOOL_SUMMARY_LINES
79
79
  ? [
80
80
  ...lines.slice(0, TOOL_SUMMARY_LINES - 1),
81
- `… 另有 ${lines.length - TOOL_SUMMARY_LINES + 1} 次工具调用`,
81
+ `… ${lines.length - TOOL_SUMMARY_LINES + 1} more tool calls`,
82
82
  ]
83
83
  : lines;
84
84
  const result = {
@@ -13,6 +13,7 @@ import { HOOKS_FILE, projectFile, userFile } from "../config/paths.js";
13
13
  import { HOOK_TIMEOUT_MAX_MS } from "../config/schema.js";
14
14
  import { checkMatcher } from "./matcher.js";
15
15
  import { HOOK_EVENTS } from "./types.js";
16
+ import { msg } from "../i18n/index.js";
16
17
  export const DEFAULT_HOOK_TIMEOUT_MS = 60_000;
17
18
  export function clampTimeout(value, fallback) {
18
19
  const v = value ?? fallback;
@@ -53,7 +54,7 @@ function validateMatchers(file, config) {
53
54
  });
54
55
  }
55
56
  if (problems.length > 0) {
56
- throw new StartupError("config_invalid", `配置文件无效:\n ${problems.map((p) => `${file}: ${p}`).join("\n ")}`, 3);
57
+ throw new StartupError("config_invalid", msg().drivers.hooks.configInvalid(problems.map((p) => `${file}: ${p}`).join("\n ")), 3);
57
58
  }
58
59
  }
59
60
  function readLayer(source, file, required) {
@@ -84,7 +85,7 @@ export function loadHookConfigs(input) {
84
85
  else if (existsSync(projectPath)) {
85
86
  // 未信任时不解析内容(不让不可信文件的语法错误阻断启动),只看存在性。
86
87
  skippedProject = projectPath;
87
- warnings.push(`${projectPath}: 项目未信任,跳过项目级 Hook(用 --trust 或在交互模式确认信任)`);
88
+ warnings.push(msg().drivers.hooks.projectUntrusted(projectPath));
88
89
  }
89
90
  const result = {
90
91
  hooks: flattenHookLayers(layers, input.defaultTimeoutMs ?? DEFAULT_HOOK_TIMEOUT_MS),
@@ -6,6 +6,7 @@
6
6
  * 合并:决策最严 `deny > block > ask > allow`;`updatedInput` / `updatedPrompt` 只接受唯一
7
7
  * 一个返回者(多个则全部忽略并 warning);`additionalContext` / `customInstructions` 按配置顺序拼接。
8
8
  */
9
+ import { msg } from "../i18n/index.js";
9
10
  export const DECISION_SEVERITY = {
10
11
  deny: 4,
11
12
  block: 3,
@@ -60,7 +61,7 @@ export function parseHookOutput(stdout) {
60
61
  output.decision = decision;
61
62
  }
62
63
  else {
63
- warnings.push(`未知 decision:${JSON.stringify(decision)}`);
64
+ warnings.push(msg().drivers.hooks.unknownDecision(JSON.stringify(decision)));
64
65
  }
65
66
  }
66
67
  for (const key of [
@@ -75,7 +76,7 @@ export function parseHookOutput(stdout) {
75
76
  if (typeof v === "string")
76
77
  output[key] = v;
77
78
  else
78
- warnings.push(`${key} 应为字符串`);
79
+ warnings.push(msg().drivers.hooks.notString(key));
79
80
  }
80
81
  if ("updatedInput" in raw)
81
82
  output.updatedInput = raw["updatedInput"];
@@ -85,8 +86,9 @@ export function parseHookOutput(stdout) {
85
86
  output.suppressOutput = true;
86
87
  return { output, warnings };
87
88
  }
88
- function describe(result) {
89
- return `Hook ${result.event}「${result.command}」`;
89
+ /** [W6-C0] 回给模型的阻止理由固定英文(警告仍给人看)。 */
90
+ function describeForModel(result) {
91
+ return `Hook ${result.event} "${result.command}"`;
90
92
  }
91
93
  function normalizeDecision(event, decision) {
92
94
  const accepted = ACCEPTED[event];
@@ -101,23 +103,27 @@ function normalizeDecision(event, decision) {
101
103
  export function interpretResult(result) {
102
104
  const event = result.event;
103
105
  if (result.timedOut) {
104
- const message = `${describe(result)} 超时(${result.durationMs} ms)`;
106
+ const message = msg().drivers.hooks.timedOut(event, result.command, result.durationMs);
105
107
  if (event === "PreToolUse")
106
- return { decision: "deny", reason: message, warning: message, useOutput: false };
108
+ return {
109
+ decision: "deny",
110
+ reason: `${describeForModel(result)} timed out (${result.durationMs} ms)`,
111
+ warning: message,
112
+ useOutput: false,
113
+ };
107
114
  return { warning: message, useOutput: false };
108
115
  }
109
116
  if (result.exitCode === 2) {
110
117
  const decision = blockingDecision(event);
111
- const reason = result.stderr.trim() || `${describe(result)} 以退出码 2 阻止`;
118
+ const reason = result.stderr.trim() || `${describeForModel(result)} blocked with exit code 2`;
112
119
  if (decision === undefined)
113
120
  return { useOutput: false };
114
121
  return { decision, reason, useOutput: false };
115
122
  }
116
123
  if (result.exitCode !== 0) {
117
124
  const tail = result.stderr.trim().split("\n").slice(-3).join(" | ");
118
- const code = result.exitCode === null ? "被信号终止" : `退出码 ${result.exitCode}`;
119
125
  return {
120
- warning: `${describe(result)} 失败(${code})${tail === "" ? "" : `:${tail}`}`,
126
+ warning: msg().drivers.hooks.failed(event, result.command, result.exitCode, tail),
121
127
  useOutput: false,
122
128
  };
123
129
  }
@@ -128,7 +134,7 @@ export function interpretResult(result) {
128
134
  if (decision === undefined) {
129
135
  return {
130
136
  useOutput: true,
131
- warning: `${describe(result)} 的 decision "${output.decision}" 对 ${event} 无效,已忽略`,
137
+ warning: msg().drivers.hooks.invalidDecision(event, result.command, output.decision),
132
138
  };
133
139
  }
134
140
  const interpreted = { decision, useOutput: true };
@@ -200,12 +206,12 @@ export function mergeResults(results, extraWarnings = []) {
200
206
  outcome.hasUpdatedInput = true;
201
207
  }
202
208
  else if (inputs.length > 1) {
203
- warnings.push(`${inputs.length} 个 Hook 同时返回 updatedInput,全部忽略`);
209
+ warnings.push(msg().drivers.hooks.multipleInputs(inputs.length));
204
210
  }
205
211
  if (prompts.length === 1 && prompts[0] !== undefined)
206
212
  outcome.updatedPrompt = prompts[0];
207
213
  else if (prompts.length > 1)
208
- warnings.push(`${prompts.length} 个 Hook 同时返回 updatedPrompt,全部忽略`);
214
+ warnings.push(msg().drivers.hooks.multiplePrompts(prompts.length));
209
215
  const additionalContext = joinTexts(contexts);
210
216
  if (additionalContext !== undefined)
211
217
  outcome.additionalContext = additionalContext;
@@ -14,6 +14,7 @@ import { HostRunnerRegistry } from "../drivers/host-runners.js";
14
14
  import { AmaError } from "../errors.js";
15
15
  import { AMA_VERSION } from "../version.js";
16
16
  import { HOST_API_VERSION } from "./types.js";
17
+ import { msg } from "../i18n/index.js";
17
18
  /** 进程内事件总线(宿主观察 AgentEvents)。 */
18
19
  export class AgentEventBus {
19
20
  handlers = new Map();
@@ -42,7 +43,7 @@ export class AgentEventBus {
42
43
  await handler(event);
43
44
  }
44
45
  catch (error) {
45
- this.log("error", `宿主事件处理器异常(${name})`, error);
46
+ this.log("error", msg().drivers.host.handlerFailed(name), error);
46
47
  }
47
48
  }
48
49
  }
@@ -55,16 +56,16 @@ export function hostRunnersOf(api) {
55
56
  }
56
57
  function validateTool(tool) {
57
58
  if (typeof tool !== "object" || tool === null) {
58
- throw new AmaError("invalid_arguments", "tools.register:工具定义应为对象");
59
+ throw new AmaError("invalid_arguments", msg().drivers.host.toolNotObject);
59
60
  }
60
61
  if (typeof tool.name !== "string" || !TOOL_NAME.test(tool.name)) {
61
- throw new AmaError("invalid_arguments", `tools.register:工具名不合法:${String(tool.name)}`);
62
+ throw new AmaError("invalid_arguments", msg().drivers.host.toolBadName(String(tool.name)));
62
63
  }
63
64
  if (typeof tool.execute !== "function") {
64
- throw new AmaError("invalid_arguments", `tools.register:${tool.name} 缺少 execute()`);
65
+ throw new AmaError("invalid_arguments", msg().drivers.host.toolNoExecute(tool.name));
65
66
  }
66
67
  if (!["read", "write", "execute"].includes(tool.permission)) {
67
- throw new AmaError("invalid_arguments", `tools.register:${tool.name} 的 permission 不合法`);
68
+ throw new AmaError("invalid_arguments", msg().drivers.host.toolBadPermission(tool.name));
68
69
  }
69
70
  }
70
71
  export function createHostApi(deps) {
@@ -97,7 +98,7 @@ export function createHostApi(deps) {
97
98
  register(tool) {
98
99
  validateTool(tool);
99
100
  if (deps.tools.get(tool.name) !== undefined) {
100
- throw new AmaError("tool_exists", `tools.register:工具 ${tool.name} 已存在`);
101
+ throw new AmaError("tool_exists", msg().drivers.host.toolExists(tool.name));
101
102
  }
102
103
  deps.tools.register(tool, "host");
103
104
  registeredTools.push(tool.name);
@@ -112,10 +113,10 @@ export function createHostApi(deps) {
112
113
  instructions: Object.freeze({
113
114
  add(source) {
114
115
  if (source.kind === "file" && typeof source.path !== "string") {
115
- throw new AmaError("invalid_arguments", "instructions.add:file 需要 path");
116
+ throw new AmaError("invalid_arguments", msg().drivers.host.instructionNeedsPath);
116
117
  }
117
118
  if (source.kind === "text" && typeof source.text !== "string") {
118
- throw new AmaError("invalid_arguments", "instructions.add:text 需要 text");
119
+ throw new AmaError("invalid_arguments", msg().drivers.host.instructionNeedsText);
119
120
  }
120
121
  instructions.push({ ...source });
121
122
  },
@@ -126,7 +127,7 @@ export function createHostApi(deps) {
126
127
  approvals: Object.freeze({
127
128
  setBroker(next) {
128
129
  if (typeof next?.ask !== "function") {
129
- throw new AmaError("invalid_arguments", "approvals.setBroker:broker 需要 ask()");
130
+ throw new AmaError("invalid_arguments", msg().drivers.host.brokerNeedsAsk);
130
131
  }
131
132
  broker = next;
132
133
  },
@@ -155,7 +156,7 @@ export function createHostApi(deps) {
155
156
  cache: Object.freeze({
156
157
  onWarmingDecision(handler) {
157
158
  if (typeof handler !== "function") {
158
- throw new AmaError("invalid_arguments", "cache.onWarmingDecision:需要函数");
159
+ throw new AmaError("invalid_arguments", msg().drivers.host.warmingNeedsFunction);
159
160
  }
160
161
  warmingHandlers.push(handler);
161
162
  return () => {
@@ -15,6 +15,7 @@ import { isAbsolute, resolve } from "node:path";
15
15
  import { pathToFileURL } from "node:url";
16
16
  import { StartupError } from "../errors.js";
17
17
  import { HOST_API_VERSION } from "./types.js";
18
+ import { msg } from "../i18n/index.js";
18
19
  const EXIT_HOST = 6;
19
20
  const EXIT_HOST_VERSION = 78;
20
21
  export const HOST_CREATE_TIMEOUT_MS = 10_000;
@@ -66,25 +67,25 @@ export function extractHostModule(namespace, label) {
66
67
  }
67
68
  const found = candidates.find((c) => isRecord(c) && ("hostApi" in c || "create" in c));
68
69
  if (!isRecord(found))
69
- throw loadFailure(`${label}: 不是宿主适配器模块(缺少 hostApi / create 导出)`);
70
+ throw loadFailure(msg().drivers.host.notAdapter(label));
70
71
  if (found["hostApi"] !== HOST_API_VERSION) {
71
- throw new StartupError("host_version_mismatch", `${label}: 宿主适配器 hostApi=${String(found["hostApi"])},ama 需要 ${HOST_API_VERSION}`, EXIT_HOST_VERSION);
72
+ throw new StartupError("host_version_mismatch", msg().drivers.host.versionMismatch(label, String(found["hostApi"]), HOST_API_VERSION), EXIT_HOST_VERSION);
72
73
  }
73
74
  if (typeof found["create"] !== "function")
74
- throw loadFailure(`${label}: 缺少 create(api) 函数`);
75
+ throw loadFailure(msg().drivers.host.noCreate(label));
75
76
  return found;
76
77
  }
77
78
  /** 加载并校验适配器模块。 */
78
79
  export async function loadHostModule(spec, cwd = process.cwd()) {
79
80
  const path = isAbsolute(spec) ? spec : resolve(cwd, spec);
80
81
  if (!existsSync(path))
81
- throw loadFailure(`宿主适配器不存在:${path}`);
82
+ throw loadFailure(msg().drivers.host.notFound(path));
82
83
  let namespace;
83
84
  try {
84
85
  namespace = await importModule(path);
85
86
  }
86
87
  catch (error) {
87
- throw loadFailure(`宿主适配器加载失败:${path}:${errorText(error)}`, error);
88
+ throw loadFailure(msg().drivers.host.loadFailed(path, errorText(error)), error);
88
89
  }
89
90
  return extractHostModule(namespace, path);
90
91
  }
@@ -92,7 +93,7 @@ export async function loadHostModule(spec, cwd = process.cwd()) {
92
93
  export async function createAdapter(module, api, label, timeoutMs = HOST_CREATE_TIMEOUT_MS) {
93
94
  let timer;
94
95
  const timeout = new Promise((_, reject) => {
95
- timer = setTimeout(() => reject(loadFailure(`${label}: create() 超过 ${timeoutMs} ms 未返回`)), timeoutMs);
96
+ timer = setTimeout(() => reject(loadFailure(msg().drivers.host.createTimeout(label, timeoutMs))), timeoutMs);
96
97
  });
97
98
  let adapter;
98
99
  try {
@@ -101,7 +102,7 @@ export async function createAdapter(module, api, label, timeoutMs = HOST_CREATE_
101
102
  catch (error) {
102
103
  if (error instanceof StartupError)
103
104
  throw error;
104
- throw loadFailure(`${label}: create() 失败:${errorText(error)}`, error);
105
+ throw loadFailure(msg().drivers.host.createFailed(label, errorText(error)), error);
105
106
  }
106
107
  finally {
107
108
  clearTimeout(timer);
@@ -109,7 +110,7 @@ export async function createAdapter(module, api, label, timeoutMs = HOST_CREATE_
109
110
  if (adapter === undefined || adapter === null)
110
111
  return undefined;
111
112
  if (typeof adapter !== "object" || typeof adapter.id !== "string" || adapter.id === "") {
112
- throw loadFailure(`${label}: create() 返回的适配器缺少 id`);
113
+ throw loadFailure(msg().drivers.host.noId(label));
113
114
  }
114
115
  return adapter;
115
116
  }
@@ -19,6 +19,7 @@ import type { CacheMiss, WarmingDecisionHandler } from "../ai/cache/types.js";
19
19
  import type { HookEvent } from "../hooks/types.js";
20
20
  import type { ApprovalBroker, ApprovalDecision } from "../permissions/types.js";
21
21
  import type { SubagentRunner, ToolDefinition } from "../tools/types.js";
22
+ import type { QuotaUpdateEvent } from "../agent/types-w6.js";
22
23
  import type { PlanProposedEvent, PlanResolvedEvent, SubagentEndEvent, SubagentStartEvent } from "../agent/types-w5.js";
23
24
  export type { ActionPreview, ActionPreviewTarget, ApprovalBroker, ApprovalDecision, ApprovalReason, ApprovalRequest, ApprovalRequestContext, } from "../permissions/types.js";
24
25
  export type { RunnerHandle, SubagentEvent, SubagentRunRequest, SubagentRunner, ToolAnnotations, ToolContext, ToolDefinition, ToolExecutionMode, ToolPermission, ToolResult, } from "../tools/types.js";
@@ -115,6 +116,8 @@ export interface AgentEvents {
115
116
  /** [W5-C0] 计划提出 / 审批结果。 */
116
117
  plan_proposed: Omit<PlanProposedEvent, "type">;
117
118
  plan_resolved: Omit<PlanResolvedEvent, "type">;
119
+ /** [W6-O] ChatGPT 订阅配额更新(docs/wave6-plan.md §4.5)。 */
120
+ quota_update: Omit<QuotaUpdateEvent, "type">;
118
121
  }
119
122
  /** [W5-C0] 宿主注入的 runner:`id` 即 `task(agent=<id>)` 的名字,`description` 进 task 工具描述。 */
120
123
  export type HostRunner = SubagentRunner & {