@armadra/agent 0.5.1 → 0.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (486) hide show
  1. package/CHANGELOG.md +203 -304
  2. package/CHANGELOG.zh-CN.md +462 -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/discovered-cache.d.ts +48 -0
  47. package/dist/ai/providers/discovered-cache.js +102 -0
  48. package/dist/ai/providers/enrich.js +2 -7
  49. package/dist/ai/providers/model-visibility.d.ts +33 -0
  50. package/dist/ai/providers/model-visibility.js +70 -0
  51. package/dist/ai/providers/models-dev-cache.js +15 -19
  52. package/dist/ai/providers/models-dev-snapshot.js +8 -7
  53. package/dist/ai/providers/models-dev.js +5 -15
  54. package/dist/ai/providers/registry.d.ts +2 -0
  55. package/dist/ai/providers/registry.js +6 -1
  56. package/dist/ai/providers/suggest.js +2 -16
  57. package/dist/ai/types.d.ts +27 -1
  58. package/dist/auth/chatgpt/backend-client.d.ts +26 -0
  59. package/dist/auth/chatgpt/backend-client.js +74 -0
  60. package/dist/auth/chatgpt/claims.d.ts +17 -0
  61. package/dist/auth/chatgpt/claims.js +46 -0
  62. package/dist/auth/chatgpt/cli.d.ts +35 -0
  63. package/dist/auth/chatgpt/cli.js +279 -0
  64. package/dist/auth/chatgpt/doctor.d.ts +17 -0
  65. package/dist/auth/chatgpt/doctor.js +36 -0
  66. package/dist/auth/chatgpt/host-id.d.ts +7 -0
  67. package/dist/auth/chatgpt/host-id.js +26 -0
  68. package/dist/auth/chatgpt/login.d.ts +30 -0
  69. package/dist/auth/chatgpt/login.js +130 -0
  70. package/dist/auth/chatgpt/presets.d.ts +66 -0
  71. package/dist/auth/chatgpt/presets.js +120 -0
  72. package/dist/auth/chatgpt/quota-text.d.ts +13 -0
  73. package/dist/auth/chatgpt/quota-text.js +36 -0
  74. package/dist/auth/oauth/browser.d.ts +12 -0
  75. package/dist/auth/oauth/browser.js +27 -0
  76. package/dist/auth/oauth/callback-server.d.ts +47 -0
  77. package/dist/auth/oauth/callback-server.js +147 -0
  78. package/dist/auth/oauth/flows.d.ts +62 -0
  79. package/dist/auth/oauth/flows.js +113 -0
  80. package/dist/auth/oauth/jwt.d.ts +24 -0
  81. package/dist/auth/oauth/jwt.js +81 -0
  82. package/dist/auth/oauth/live.d.ts +21 -0
  83. package/dist/auth/oauth/live.js +25 -0
  84. package/dist/auth/oauth/oidc.d.ts +26 -0
  85. package/dist/auth/oauth/oidc.js +72 -0
  86. package/dist/auth/oauth/pkce.d.ts +15 -0
  87. package/dist/auth/oauth/pkce.js +20 -0
  88. package/dist/auth/oauth/refresh.d.ts +35 -0
  89. package/dist/auth/oauth/refresh.js +129 -0
  90. package/dist/auth/oauth/token-client.d.ts +33 -0
  91. package/dist/auth/oauth/token-client.js +121 -0
  92. package/dist/auth/oauth/token-store.d.ts +23 -0
  93. package/dist/auth/oauth/token-store.js +125 -0
  94. package/dist/auth/testing/fake-oauth.d.ts +73 -0
  95. package/dist/auth/testing/fake-oauth.js +271 -0
  96. package/dist/auth/testing/refresh-child.d.ts +5 -0
  97. package/dist/auth/testing/refresh-child.js +16 -0
  98. package/dist/bundle/ama.cjs +26532 -11045
  99. package/dist/checkpoints/backend.js +6 -5
  100. package/dist/checkpoints/restore.js +3 -2
  101. package/dist/checkpoints/settings.js +2 -1
  102. package/dist/checkpoints/shadow-git.js +7 -6
  103. package/dist/checkpoints/shadow-restore.js +3 -2
  104. package/dist/checkpoints/tracker.js +4 -3
  105. package/dist/cli/args.d.ts +9 -2
  106. package/dist/cli/args.js +74 -27
  107. package/dist/cli/bootstrap.js +53 -31
  108. package/dist/cli/choice-prompt.js +8 -6
  109. package/dist/cli/codemode-notice.js +2 -2
  110. package/dist/cli/compose-agents.js +2 -1
  111. package/dist/cli/compose-extensions.js +2 -0
  112. package/dist/cli/compose-memory.d.ts +53 -0
  113. package/dist/cli/compose-memory.js +127 -0
  114. package/dist/cli/compose-providers.d.ts +6 -0
  115. package/dist/cli/compose-providers.js +38 -2
  116. package/dist/cli/compose-session.d.ts +5 -0
  117. package/dist/cli/compose-session.js +27 -13
  118. package/dist/cli/compose-store.d.ts +2 -0
  119. package/dist/cli/compose-store.js +9 -5
  120. package/dist/cli/compose.d.ts +2 -0
  121. package/dist/cli/compose.js +13 -5
  122. package/dist/cli/default-model.d.ts +0 -2
  123. package/dist/cli/default-model.js +5 -8
  124. package/dist/cli/deps.d.ts +5 -1
  125. package/dist/cli/exit-codes.d.ts +1 -1
  126. package/dist/cli/exit-codes.js +7 -16
  127. package/dist/cli/from-prompt.js +3 -2
  128. package/dist/cli/help-text.d.ts +2 -1
  129. package/dist/cli/help-text.js +5 -99
  130. package/dist/cli/main.d.ts +5 -0
  131. package/dist/cli/main.js +21 -2
  132. package/dist/cli/proxy.js +14 -9
  133. package/dist/cli/runtime.d.ts +5 -0
  134. package/dist/cli/startup-screen.js +20 -27
  135. package/dist/cli/startup-steps.js +6 -8
  136. package/dist/cli/subcommands/auth.d.ts +6 -3
  137. package/dist/cli/subcommands/auth.js +52 -22
  138. package/dist/cli/subcommands/config-set.d.ts +21 -0
  139. package/dist/cli/subcommands/config-set.js +145 -0
  140. package/dist/cli/subcommands/config.d.ts +2 -1
  141. package/dist/cli/subcommands/config.js +51 -37
  142. package/dist/cli/subcommands/doctor.d.ts +2 -1
  143. package/dist/cli/subcommands/doctor.js +97 -58
  144. package/dist/cli/subcommands/init.d.ts +1 -1
  145. package/dist/cli/subcommands/init.js +8 -7
  146. package/dist/cli/subcommands/memory.d.ts +18 -0
  147. package/dist/cli/subcommands/memory.js +189 -0
  148. package/dist/cli/subcommands/model-meta.js +11 -9
  149. package/dist/cli/subcommands/models-cache-probe.js +23 -20
  150. package/dist/cli/subcommands/models-discover.d.ts +4 -0
  151. package/dist/cli/subcommands/models-discover.js +60 -21
  152. package/dist/cli/subcommands/models-enable.d.ts +13 -0
  153. package/dist/cli/subcommands/models-enable.js +145 -0
  154. package/dist/cli/subcommands/models.d.ts +3 -1
  155. package/dist/cli/subcommands/models.js +39 -24
  156. package/dist/cli/subcommands/probe-runner.js +8 -7
  157. package/dist/cli/subcommands/providers-list.js +32 -21
  158. package/dist/cli/subcommands/providers-plan.js +24 -25
  159. package/dist/cli/subcommands/providers-probe.js +5 -6
  160. package/dist/cli/subcommands/providers.d.ts +1 -1
  161. package/dist/cli/subcommands/providers.js +45 -50
  162. package/dist/cli/subcommands/sessions-export.d.ts +1 -1
  163. package/dist/cli/subcommands/sessions-export.js +10 -9
  164. package/dist/cli/subcommands/sessions-search.d.ts +1 -1
  165. package/dist/cli/subcommands/sessions-search.js +11 -10
  166. package/dist/cli/subcommands/sessions-trace.d.ts +30 -0
  167. package/dist/cli/subcommands/sessions-trace.js +156 -0
  168. package/dist/cli/subcommands/sessions.d.ts +4 -3
  169. package/dist/cli/subcommands/sessions.js +40 -37
  170. package/dist/cli/subcommands/stats.d.ts +1 -1
  171. package/dist/cli/subcommands/stats.js +49 -30
  172. package/dist/cli/system-prompt-arg.js +3 -2
  173. package/dist/codemode/capability.js +3 -2
  174. package/dist/compaction/post-compact.d.ts +1 -0
  175. package/dist/compaction/post-compact.js +15 -1
  176. package/dist/compaction/prune-tier.d.ts +1 -1
  177. package/dist/compaction/prune-tier.js +3 -3
  178. package/dist/compaction/serialize.js +2 -1
  179. package/dist/config/auth-file.d.ts +12 -2
  180. package/dist/config/auth-file.js +32 -10
  181. package/dist/config/checker.js +12 -11
  182. package/dist/config/context-files.js +3 -2
  183. package/dist/config/edit.d.ts +106 -0
  184. package/dist/config/edit.js +350 -0
  185. package/dist/config/init.d.ts +4 -3
  186. package/dist/config/init.js +10 -18
  187. package/dist/config/json-schema.d.ts +2 -1
  188. package/dist/config/json-schema.js +102 -69
  189. package/dist/config/key-docs.d.ts +18 -7
  190. package/dist/config/key-docs.js +43 -128
  191. package/dist/config/load.js +7 -6
  192. package/dist/config/merge.d.ts +4 -1
  193. package/dist/config/merge.js +42 -22
  194. package/dist/config/paths.js +6 -5
  195. package/dist/config/profile.d.ts +5 -1
  196. package/dist/config/profile.js +7 -2
  197. package/dist/config/schema-w5.js +12 -4
  198. package/dist/config/schema-w6.d.ts +19 -0
  199. package/dist/config/schema-w6.js +115 -0
  200. package/dist/config/schema.js +34 -20
  201. package/dist/config/settings-registry.d.ts +81 -0
  202. package/dist/config/settings-registry.js +185 -0
  203. package/dist/config/types-w5.d.ts +7 -0
  204. package/dist/config/types-w5.js +2 -0
  205. package/dist/config/types-w6.d.ts +109 -0
  206. package/dist/config/types-w6.js +19 -0
  207. package/dist/config/types.d.ts +11 -8
  208. package/dist/config/types.js +1 -0
  209. package/dist/drivers/acp/client.js +1 -1
  210. package/dist/drivers/acp/driver.js +13 -8
  211. package/dist/drivers/agents.js +4 -3
  212. package/dist/drivers/base.js +3 -2
  213. package/dist/drivers/host-runners.js +2 -1
  214. package/dist/drivers/native/claude-stream.js +12 -11
  215. package/dist/drivers/native/codex-app-server.js +17 -12
  216. package/dist/drivers/native/oneshot.js +8 -7
  217. package/dist/drivers/pool.js +1 -1
  218. package/dist/drivers/runner.d.ts +3 -1
  219. package/dist/drivers/runner.js +68 -20
  220. package/dist/drivers/turn.js +1 -1
  221. package/dist/hooks/config.js +3 -2
  222. package/dist/hooks/protocol.js +18 -12
  223. package/dist/host/api-impl.js +11 -10
  224. package/dist/host/loader.js +9 -8
  225. package/dist/host/types.d.ts +3 -0
  226. package/dist/i18n/catalog.d.ts +2209 -0
  227. package/dist/i18n/catalog.js +72 -0
  228. package/dist/i18n/format.d.ts +21 -0
  229. package/dist/i18n/format.js +58 -0
  230. package/dist/i18n/index.d.ts +58 -0
  231. package/dist/i18n/index.js +72 -0
  232. package/dist/i18n/messages/agents.d.ts +84 -0
  233. package/dist/i18n/messages/agents.js +85 -0
  234. package/dist/i18n/messages/approval.d.ts +99 -0
  235. package/dist/i18n/messages/approval.js +100 -0
  236. package/dist/i18n/messages/auth.d.ts +189 -0
  237. package/dist/i18n/messages/auth.js +201 -0
  238. package/dist/i18n/messages/cli-args.d.ts +46 -0
  239. package/dist/i18n/messages/cli-args.js +46 -0
  240. package/dist/i18n/messages/cli-help.d.ts +12 -0
  241. package/dist/i18n/messages/cli-help.js +248 -0
  242. package/dist/i18n/messages/cli.d.ts +336 -0
  243. package/dist/i18n/messages/cli.js +311 -0
  244. package/dist/i18n/messages/config-keys.d.ts +293 -0
  245. package/dist/i18n/messages/config-keys.js +296 -0
  246. package/dist/i18n/messages/config.d.ts +508 -0
  247. package/dist/i18n/messages/config.js +241 -0
  248. package/dist/i18n/messages/drivers.d.ts +123 -0
  249. package/dist/i18n/messages/drivers.js +124 -0
  250. package/dist/i18n/messages/errors.d.ts +83 -0
  251. package/dist/i18n/messages/errors.js +171 -0
  252. package/dist/i18n/messages/interactive-line.d.ts +61 -0
  253. package/dist/i18n/messages/interactive-line.js +69 -0
  254. package/dist/i18n/messages/interactive-startup.d.ts +99 -0
  255. package/dist/i18n/messages/interactive-startup.js +100 -0
  256. package/dist/i18n/messages/interactive-view.d.ts +140 -0
  257. package/dist/i18n/messages/interactive-view.js +141 -0
  258. package/dist/i18n/messages/interactive.d.ts +489 -0
  259. package/dist/i18n/messages/interactive.js +248 -0
  260. package/dist/i18n/messages/memory.d.ts +123 -0
  261. package/dist/i18n/messages/memory.js +128 -0
  262. package/dist/i18n/messages/panels.d.ts +233 -0
  263. package/dist/i18n/messages/panels.js +232 -0
  264. package/dist/i18n/messages/permissions.d.ts +126 -0
  265. package/dist/i18n/messages/permissions.js +151 -0
  266. package/dist/i18n/messages/plan.d.ts +123 -0
  267. package/dist/i18n/messages/plan.js +124 -0
  268. package/dist/i18n/messages/print.d.ts +86 -0
  269. package/dist/i18n/messages/print.js +91 -0
  270. package/dist/i18n/messages/report.d.ts +391 -0
  271. package/dist/i18n/messages/report.js +490 -0
  272. package/dist/i18n/messages/rewind.d.ts +198 -0
  273. package/dist/i18n/messages/rewind.js +217 -0
  274. package/dist/i18n/messages/session.d.ts +230 -0
  275. package/dist/i18n/messages/session.js +258 -0
  276. package/dist/i18n/messages/settings.d.ts +355 -0
  277. package/dist/i18n/messages/settings.js +343 -0
  278. package/dist/i18n/messages/subcommands-config.d.ts +113 -0
  279. package/dist/i18n/messages/subcommands-config.js +129 -0
  280. package/dist/i18n/messages/subcommands-models.d.ts +34 -0
  281. package/dist/i18n/messages/subcommands-models.js +34 -0
  282. package/dist/i18n/messages/subcommands.d.ts +576 -0
  283. package/dist/i18n/messages/subcommands.js +477 -0
  284. package/dist/i18n/messages/trace.d.ts +243 -0
  285. package/dist/i18n/messages/trace.js +238 -0
  286. package/dist/i18n/types.d.ts +15 -0
  287. package/dist/i18n/types.js +7 -0
  288. package/dist/index.d.ts +6 -0
  289. package/dist/index.js +2 -0
  290. package/dist/memory/edit.d.ts +24 -0
  291. package/dist/memory/edit.js +63 -0
  292. package/dist/memory/frontmatter.d.ts +37 -0
  293. package/dist/memory/frontmatter.js +79 -0
  294. package/dist/memory/index.d.ts +28 -0
  295. package/dist/memory/index.js +126 -0
  296. package/dist/memory/lock.d.ts +17 -0
  297. package/dist/memory/lock.js +62 -0
  298. package/dist/memory/paths.d.ts +57 -0
  299. package/dist/memory/paths.js +175 -0
  300. package/dist/memory/report.d.ts +36 -0
  301. package/dist/memory/report.js +86 -0
  302. package/dist/memory/runtime.d.ts +42 -0
  303. package/dist/memory/runtime.js +36 -0
  304. package/dist/memory/secrets.d.ts +8 -0
  305. package/dist/memory/secrets.js +27 -0
  306. package/dist/memory/section.d.ts +28 -0
  307. package/dist/memory/section.js +59 -0
  308. package/dist/memory/store.d.ts +70 -0
  309. package/dist/memory/store.js +284 -0
  310. package/dist/memory/tool.d.ts +31 -0
  311. package/dist/memory/tool.js +94 -0
  312. package/dist/modes/acp/acp-events.js +2 -1
  313. package/dist/modes/acp/acp-server.js +13 -12
  314. package/dist/modes/commands-core.d.ts +11 -0
  315. package/dist/modes/commands-core.js +93 -62
  316. package/dist/modes/image-input.js +20 -6
  317. package/dist/modes/interactive/agent-bar.d.ts +95 -0
  318. package/dist/modes/interactive/agent-bar.js +248 -0
  319. package/dist/modes/interactive/agent-panels.js +27 -26
  320. package/dist/modes/interactive/agent-transcript.d.ts +47 -0
  321. package/dist/modes/interactive/agent-transcript.js +191 -0
  322. package/dist/modes/interactive/agent-ui.d.ts +36 -1
  323. package/dist/modes/interactive/agent-ui.js +180 -14
  324. package/dist/modes/interactive/agent-view.d.ts +72 -0
  325. package/dist/modes/interactive/agent-view.js +281 -0
  326. package/dist/modes/interactive/approval-dialog.js +46 -34
  327. package/dist/modes/interactive/clipboard-paste.d.ts +2 -2
  328. package/dist/modes/interactive/clipboard-paste.js +9 -4
  329. package/dist/modes/interactive/commands.d.ts +22 -1
  330. package/dist/modes/interactive/commands.js +100 -49
  331. package/dist/modes/interactive/completion.js +2 -1
  332. package/dist/modes/interactive/config-panel.d.ts +70 -0
  333. package/dist/modes/interactive/config-panel.js +319 -0
  334. package/dist/modes/interactive/config-ui.d.ts +96 -0
  335. package/dist/modes/interactive/config-ui.js +397 -0
  336. package/dist/modes/interactive/confirm-dialog.js +6 -7
  337. package/dist/modes/interactive/event-notices.js +11 -9
  338. package/dist/modes/interactive/interactive-mode.d.ts +1 -1
  339. package/dist/modes/interactive/interactive-mode.js +21 -22
  340. package/dist/modes/interactive/key-dispatch.d.ts +12 -0
  341. package/dist/modes/interactive/key-dispatch.js +24 -9
  342. package/dist/modes/interactive/line/line-editor.js +2 -1
  343. package/dist/modes/interactive/line/line-mode.js +18 -7
  344. package/dist/modes/interactive/line/line-render.js +25 -24
  345. package/dist/modes/interactive/memory-panel.d.ts +64 -0
  346. package/dist/modes/interactive/memory-panel.js +221 -0
  347. package/dist/modes/interactive/message-view.d.ts +4 -2
  348. package/dist/modes/interactive/message-view.js +42 -33
  349. package/dist/modes/interactive/model-items.d.ts +45 -0
  350. package/dist/modes/interactive/model-items.js +134 -0
  351. package/dist/modes/interactive/model-picker.d.ts +57 -0
  352. package/dist/modes/interactive/model-picker.js +191 -0
  353. package/dist/modes/interactive/panels.js +39 -31
  354. package/dist/modes/interactive/pickers.d.ts +2 -1
  355. package/dist/modes/interactive/pickers.js +10 -6
  356. package/dist/modes/interactive/plan-command.d.ts +1 -1
  357. package/dist/modes/interactive/plan-command.js +24 -27
  358. package/dist/modes/interactive/plan-dialog.js +18 -17
  359. package/dist/modes/interactive/plan-flow.js +6 -5
  360. package/dist/modes/interactive/rewind-command.d.ts +1 -1
  361. package/dist/modes/interactive/rewind-command.js +18 -16
  362. package/dist/modes/interactive/rewind-flow.d.ts +0 -1
  363. package/dist/modes/interactive/rewind-flow.js +13 -14
  364. package/dist/modes/interactive/rewind-list.js +7 -6
  365. package/dist/modes/interactive/rewind-panel.js +40 -40
  366. package/dist/modes/interactive/rewind-text.d.ts +5 -3
  367. package/dist/modes/interactive/rewind-text.js +48 -38
  368. package/dist/modes/interactive/run-indicator.js +15 -12
  369. package/dist/modes/interactive/session-events.js +3 -2
  370. package/dist/modes/interactive/startup-header.js +22 -23
  371. package/dist/modes/interactive/startup-ui.d.ts +3 -9
  372. package/dist/modes/interactive/startup-ui.js +44 -88
  373. package/dist/modes/interactive/status-area.d.ts +2 -0
  374. package/dist/modes/interactive/status-area.js +8 -2
  375. package/dist/modes/interactive/status-bar.js +4 -3
  376. package/dist/modes/interactive/subagent-view.js +9 -7
  377. package/dist/modes/interactive/tasks-report.d.ts +6 -0
  378. package/dist/modes/interactive/tasks-report.js +28 -31
  379. package/dist/modes/interactive/terminal-setup.d.ts +9 -0
  380. package/dist/modes/interactive/terminal-setup.js +23 -0
  381. package/dist/modes/interactive/tool-summary.js +19 -17
  382. package/dist/modes/interactive/tool-view.js +7 -4
  383. package/dist/modes/interactive/trace-view.d.ts +89 -0
  384. package/dist/modes/interactive/trace-view.js +332 -0
  385. package/dist/modes/print/print-mode.js +14 -15
  386. package/dist/modes/rpc/commands.js +7 -3
  387. package/dist/modes/rpc/rpc-mode.js +9 -3
  388. package/dist/modes/session-report.d.ts +2 -0
  389. package/dist/modes/session-report.js +101 -105
  390. package/dist/modes/startup-ui-text.js +11 -6
  391. package/dist/permissions/bypass.d.ts +8 -10
  392. package/dist/permissions/bypass.js +19 -10
  393. package/dist/permissions/memory-class.d.ts +23 -0
  394. package/dist/permissions/memory-class.js +54 -0
  395. package/dist/permissions/modes.d.ts +3 -3
  396. package/dist/permissions/modes.js +21 -16
  397. package/dist/permissions/pipeline.d.ts +1 -1
  398. package/dist/permissions/pipeline.js +9 -2
  399. package/dist/permissions/preview.js +49 -42
  400. package/dist/permissions/rules.js +5 -2
  401. package/dist/permissions/types.d.ts +4 -0
  402. package/dist/plan/store.js +2 -1
  403. package/dist/rpc.d.ts +39 -1
  404. package/dist/rpc.js +3 -0
  405. package/dist/sandbox/bash.js +11 -8
  406. package/dist/sandbox/detect.js +14 -11
  407. package/dist/sdk.d.ts +17 -1
  408. package/dist/sdk.js +29 -7
  409. package/dist/session/export.js +31 -30
  410. package/dist/session/manager.d.ts +1 -1
  411. package/dist/session/manager.js +5 -3
  412. package/dist/session/reuse.js +5 -4
  413. package/dist/session/scan.js +3 -2
  414. package/dist/session/stats-aggregate.d.ts +3 -1
  415. package/dist/session/stats-aggregate.js +5 -1
  416. package/dist/session/stats-index.js +2 -1
  417. package/dist/session/stats-scan.d.ts +4 -1
  418. package/dist/session/stats-scan.js +6 -2
  419. package/dist/session/store.d.ts +11 -0
  420. package/dist/session/store.js +48 -1
  421. package/dist/session/types.d.ts +2 -0
  422. package/dist/skills/builtin.js +2 -1
  423. package/dist/tools/image-file.d.ts +26 -1
  424. package/dist/tools/image-file.js +55 -13
  425. package/dist/tools/presets.d.ts +14 -1
  426. package/dist/tools/presets.js +3 -3
  427. package/dist/tools/registry.js +1 -1
  428. package/dist/tools/truncate.d.ts +1 -1
  429. package/dist/tools/truncate.js +2 -2
  430. package/dist/tools/types.d.ts +17 -1
  431. package/dist/trace/build-index.d.ts +91 -0
  432. package/dist/trace/build-index.js +127 -0
  433. package/dist/trace/build-nodes.d.ts +24 -0
  434. package/dist/trace/build-nodes.js +279 -0
  435. package/dist/trace/build-util.d.ts +43 -0
  436. package/dist/trace/build-util.js +120 -0
  437. package/dist/trace/build.d.ts +82 -0
  438. package/dist/trace/build.js +382 -0
  439. package/dist/trace/detail.d.ts +35 -0
  440. package/dist/trace/detail.js +205 -0
  441. package/dist/trace/flatten.d.ts +69 -0
  442. package/dist/trace/flatten.js +173 -0
  443. package/dist/trace/format.d.ts +47 -0
  444. package/dist/trace/format.js +329 -0
  445. package/dist/trace/html-template.d.ts +19 -0
  446. package/dist/trace/html-template.js +150 -0
  447. package/dist/trace/html.d.ts +104 -0
  448. package/dist/trace/html.js +292 -0
  449. package/dist/trace/preview.d.ts +29 -0
  450. package/dist/trace/preview.js +59 -0
  451. package/dist/trace/query-session.d.ts +14 -0
  452. package/dist/trace/query-session.js +38 -0
  453. package/dist/trace/query.d.ts +55 -0
  454. package/dist/trace/query.js +188 -0
  455. package/dist/trace/session.d.ts +40 -0
  456. package/dist/trace/session.js +168 -0
  457. package/dist/trace/types.d.ts +243 -0
  458. package/dist/trace/types.js +13 -0
  459. package/dist/tui/components/editor-paste.d.ts +2 -0
  460. package/dist/tui/components/editor-paste.js +6 -3
  461. package/dist/tui/components/editor.js +2 -2
  462. package/dist/tui/components/loader.d.ts +3 -0
  463. package/dist/tui/components/loader.js +14 -0
  464. package/dist/tui/components/select-list.d.ts +2 -0
  465. package/dist/tui/components/select-list.js +7 -0
  466. package/dist/tui/components/settings-list.d.ts +61 -0
  467. package/dist/tui/components/settings-list.js +135 -0
  468. package/dist/tui/keybindings.d.ts +5 -0
  469. package/dist/tui/keybindings.js +17 -5
  470. package/dist/tui.d.ts +1 -0
  471. package/dist/tui.js +2 -0
  472. package/docs/en/host-api.md +167 -0
  473. package/docs/en/permissions.md +214 -0
  474. package/docs/en/providers.md +627 -0
  475. package/docs/en/rpc.md +361 -0
  476. package/docs/en/sessions.md +219 -0
  477. package/docs/en/tui.md +534 -0
  478. package/docs/host-api.md +18 -17
  479. package/docs/memory.md +172 -0
  480. package/docs/permissions.md +2 -2
  481. package/docs/providers.md +73 -1
  482. package/docs/rpc.md +31 -3
  483. package/docs/session-format.md +8 -2
  484. package/docs/sessions.md +29 -1
  485. package/docs/tui.md +140 -4
  486. package/package.json +8 -3
@@ -15,7 +15,10 @@ import type { Api, AuthHeader, CacheRetention, Model, ModelThinkingLevel, Provid
15
15
  import type { PermissionMode } from "../permissions/types.js";
16
16
  import type { CheckpointMode } from "../checkpoints/types.js";
17
17
  import type { AmaConfigW5, PruneConfig, StatusLineMode } from "./types-w5.js";
18
+ import type { AmaConfigW6, AuthFileEntry, ProfileMemoryOptions, UiConfigW6 } from "./types-w6.js";
18
19
  export type * from "./types-w5.js";
20
+ export type * from "./types-w6.js";
21
+ export { AGENT_BAR_MODES, CHATGPT_FLAVORS, LANGUAGE_SETTINGS, MEMORY_SCOPES, MEMORY_SUBAGENT_MODES, apiKeyEntry, isOAuthEntry, } from "./types-w6.js";
19
22
  export { AGENTS_RESERVED_KEYS, IMAGE_RESIZE_MODES, PLAN_BASH_MODES_STRICT_FIRST, PLAN_UNATTENDED_MODES, STATUS_LINE_MODES, agentEntry, } from "./types-w5.js";
20
23
  export declare const CONFIG_FILE_VERSION: 1;
21
24
  /**
@@ -130,7 +133,7 @@ export interface CodemodeConfig {
130
133
  export interface HooksSettings {
131
134
  timeoutMs?: number;
132
135
  }
133
- export interface UiConfig {
136
+ export interface UiConfig extends UiConfigW6 {
134
137
  /** auto 按 `COLORFGBG` / `TERM_PROGRAM` 猜(不发查询序列),猜不出用 dark。 */
135
138
  theme?: "dark" | "light" | "auto";
136
139
  markdown?: boolean;
@@ -209,7 +212,7 @@ export interface SandboxConfig {
209
212
  writable?: string[];
210
213
  }
211
214
  /** config.json(用户级 / 项目级 / profile.config 同形状;项目级只接受受限字段,§10.2)。 */
212
- export interface AmaConfig extends AmaConfigW5 {
215
+ export interface AmaConfig extends AmaConfigW5, AmaConfigW6 {
213
216
  version: typeof CONFIG_FILE_VERSION;
214
217
  /** `provider/model-id`。 */
215
218
  defaultModel?: string;
@@ -228,14 +231,10 @@ export interface AmaConfig extends AmaConfigW5 {
228
231
  checkpoints?: CheckpointsConfig;
229
232
  sandbox?: SandboxConfig;
230
233
  }
231
- /** auth.json(0600)。 */
234
+ /** auth.json(0600)。[W6-C0] 条目可以是 API key 或 OAuth(`isOAuthEntry` / `apiKeyEntry` 区分)。 */
232
235
  export interface AuthFile {
233
236
  version: typeof CONFIG_FILE_VERSION;
234
- providers: Record<string, {
235
- apiKey: string;
236
- env?: Record<string, string>;
237
- baseUrl?: string;
238
- }>;
237
+ providers: Record<string, AuthFileEntry>;
239
238
  }
240
239
  /** profile.json(宿主用,§10.3;与 Armadra 文档 B §2.4 一致);路径必须是绝对路径,不含密钥。 */
241
240
  export interface ProfileFile {
@@ -253,6 +252,10 @@ export interface ProfileFile {
253
252
  sessionDir?: string;
254
253
  config?: string;
255
254
  trustProject?: boolean;
255
+ /** [W6-C0] 宿主界面语言(跟随画布);优先于配置的 `ui.language`,`AMA_LANG` / `--lang` 仍更优先。 */
256
+ language?: "zh" | "en";
257
+ /** [W6-C0] 记忆(W6-M):缺省禁用;`enabled: true` 时 `dir` 必填(按工作空间隔离的绝对路径)。 */
258
+ memory?: ProfileMemoryOptions;
256
259
  }
257
260
  export interface TrustEntry {
258
261
  path: string;
@@ -10,6 +10,7 @@
10
10
  * (W5-C0)第五波配置键(docs/wave5-plan.md §9):新段的形状在 types-w5.ts(`AmaConfigW5` 并入
11
11
  * `AmaConfig`),已有段加 `ui.statusLine`、`compaction.prune / pruneExclude`、profile `agentDirs`。
12
12
  */
13
+ export { AGENT_BAR_MODES, CHATGPT_FLAVORS, LANGUAGE_SETTINGS, MEMORY_SCOPES, MEMORY_SUBAGENT_MODES, apiKeyEntry, isOAuthEntry, } from "./types-w6.js";
13
14
  export { AGENTS_RESERVED_KEYS, IMAGE_RESIZE_MODES, PLAN_BASH_MODES_STRICT_FIRST, PLAN_UNATTENDED_MODES, STATUS_LINE_MODES, agentEntry, } from "./types-w5.js";
14
15
  export const CONFIG_FILE_VERSION = 1;
15
16
  /** 渠道名:不含 `/` 与 `@`(`provider/model@channel`)。 */
@@ -66,7 +66,7 @@ export class AcpClient {
66
66
  ...(this.options.clientInfo !== undefined ? { clientInfo: this.options.clientInfo } : {}),
67
67
  }, signal);
68
68
  if (result.protocolVersion !== ACP_PROTOCOL_VERSION)
69
- throw new RpcError(RPC_ERRORS.invalidRequest, `ACP 协议版本不兼容:Agent ${String(result.protocolVersion)},客户端 ${ACP_PROTOCOL_VERSION}`);
69
+ throw new RpcError(RPC_ERRORS.invalidRequest, `incompatible ACP protocol version: agent ${String(result.protocolVersion)}, client ${ACP_PROTOCOL_VERSION}`);
70
70
  this.initResult = result;
71
71
  return result;
72
72
  }
@@ -14,6 +14,7 @@ import { stderrHint } from "../process.js";
14
14
  import { TurnCollector, oneLine } from "../turn.js";
15
15
  import { AcpClient } from "./client.js";
16
16
  import { AMA_VERSION } from "../../version.js";
17
+ import { msg } from "../../i18n/index.js";
17
18
  export function toAcpContent(blocks, images) {
18
19
  const out = [];
19
20
  for (const block of blocks) {
@@ -111,7 +112,7 @@ export class AcpDriver {
111
112
  if (error instanceof AmaError)
112
113
  throw error;
113
114
  const hint = stderrHint(transport);
114
- throw new AmaError("agent_start_failed", `${this.agentId}:ACP 启动失败(${error.message})${hint !== "" ? `:${hint}` : ""}`, { cause: error });
115
+ throw new AmaError("agent_start_failed", `${this.agentId}: ACP failed to start (${error.message})${hint !== "" ? `: ${hint}` : ""}`, { cause: error });
115
116
  }
116
117
  return session;
117
118
  }
@@ -164,7 +165,7 @@ class AcpDriverSession {
164
165
  this.id = options.resume;
165
166
  }
166
167
  else {
167
- this.notices.push(`${this.agentId} 不支持续接会话,已新开`);
168
+ this.notices.push(msg().drivers.agent.resumeUnsupported(this.agentId));
168
169
  }
169
170
  }
170
171
  if (this.id === "") {
@@ -178,17 +179,17 @@ class AcpDriverSession {
178
179
  await this.client.setMode(this.id, modeId);
179
180
  }
180
181
  else if (isReadOnlyMode(options.mode)) {
181
- throw new AmaError("agent_mode_unsupported", `${this.agentId} 没有与 ama「${options.mode}」对应的只读模式,不能以它的缺省模式代替`);
182
+ throw new AmaError("agent_mode_unsupported", `${this.agentId} has no read-only mode matching ama's "${options.mode}"; its default mode cannot stand in for it`);
182
183
  }
183
184
  else if (modes != null) {
184
- this.notices.push(`${this.agentId} 没有「${options.mode}」模式,按它自己的缺省模式运行(需要授权的操作仍交给你)`);
185
+ this.notices.push(msg().drivers.agent.noMatchingMode(this.agentId, options.mode));
185
186
  }
186
187
  }
187
188
  async prompt(content, hooks) {
188
189
  if (this.closed)
189
- throw new AmaError("agent_closed", `${this.agentId} 会话已关闭`);
190
+ throw new AmaError("agent_closed", `${this.agentId} session is closed`);
190
191
  if (this.running !== undefined)
191
- throw new AmaError("busy", `${this.agentId} 正在运行`);
192
+ throw new AmaError("busy", `${this.agentId} is already running`);
192
193
  const turn = new TurnCollector((e) => hooks.onEvent(e));
193
194
  for (const text of this.notices.splice(0))
194
195
  turn.push({ type: "notice", level: "info", text });
@@ -196,7 +197,11 @@ class AcpDriverSession {
196
197
  this.turn = turn;
197
198
  const images = this.client.supportsImages();
198
199
  if (!images && content.some((b) => b.type === "image"))
199
- turn.push({ type: "notice", level: "warn", text: `${this.agentId} 不接受图片,已省略` });
200
+ turn.push({
201
+ type: "notice",
202
+ level: "warn",
203
+ text: msg().drivers.agent.noImages(this.agentId),
204
+ });
200
205
  const request = this.client.prompt(this.id, toAcpContent(content, images));
201
206
  this.running = request;
202
207
  try {
@@ -204,7 +209,7 @@ class AcpDriverSession {
204
209
  if (this.client.isOpen)
205
210
  throw error;
206
211
  const hint = stderrHint(this.transport);
207
- throw new AmaError("agent_exited", `${this.agentId} 进程已退出${hint !== "" ? `:${hint}` : ""}`, {
212
+ throw new AmaError("agent_exited", `${this.agentId} process exited${hint !== "" ? `: ${hint}` : ""}`, {
208
213
  cause: error,
209
214
  });
210
215
  });
@@ -22,6 +22,7 @@ import { poolFromConfig } from "./pool.js";
22
22
  import { ProgramProbe } from "./probe.js";
23
23
  import { spawnTransport } from "./process.js";
24
24
  import { ProcessRunner } from "./runner.js";
25
+ import { msg } from "../i18n/index.js";
25
26
  /** 按候选种类建驱动。 */
26
27
  export function createDriver(agentId, candidate, deps) {
27
28
  switch (candidate.kind) {
@@ -55,7 +56,7 @@ export class ExternalAgents {
55
56
  .reapOrphans()
56
57
  .then((killed) => {
57
58
  if (killed.length > 0)
58
- options.log?.("info", `清理了上次遗留的外部 Agent 进程:${killed.join(", ")}`);
59
+ options.log?.("info", msg().drivers.agent.reapedOrphans(killed.join(", ")));
59
60
  })
60
61
  .catch(() => undefined);
61
62
  }
@@ -82,13 +83,13 @@ export class ExternalAgents {
82
83
  if (hosted !== undefined)
83
84
  return hosted;
84
85
  if (this.options.hosted)
85
- throw new AmaError("agent_host_only", `嵌入宿主时外部 Agent 由宿主提供:「${spec}」没有被宿主注入(ama 不自行启动外部 CLI)`);
86
+ throw new AmaError("agent_host_only", `when embedded, external agents come from the host: "${spec}" was not provided by the host (ama does not start external CLIs itself)`);
86
87
  const cached = this.runners.get(spec);
87
88
  if (cached !== undefined)
88
89
  return cached;
89
90
  const found = candidatesFor(spec);
90
91
  if (found === undefined)
91
- throw new AmaError("agent_unknown", `未知的外部 Agent:${spec}`);
92
+ throw new AmaError("agent_unknown", `unknown external agent: ${spec}`);
92
93
  const drivers = found.candidates.map((c) => createDriver(found.agentId, c, this.driverDeps));
93
94
  const o = this.options;
94
95
  const runner = new ProcessRunner(drivers, {
@@ -4,6 +4,7 @@
4
4
  import { candidateCapabilities } from "./catalog.js";
5
5
  import { versionSatisfies } from "./probe.js";
6
6
  import { spawnTransport } from "./process.js";
7
+ import { msg } from "../i18n/index.js";
7
8
  /** 中断后等回合结束的宽限;过了关 stdin,再 SIGTERM 进程树(§5.2 cancel)。 */
8
9
  export const CANCEL_GRACE_MS = 15_000;
9
10
  export function defaultSetTimer(fn, ms) {
@@ -32,7 +33,7 @@ export async function probeCandidate(candidate, deps) {
32
33
  if (candidate.verified !== undefined &&
33
34
  located.version !== undefined &&
34
35
  !versionSatisfies(located.version, candidate.verified))
35
- out.warning = `${candidate.program} ${located.version} 不在已验证区间 ${candidate.verified},协议可能有变化`;
36
+ out.warning = msg().drivers.agent.unverifiedVersion(candidate.program, located.version, candidate.verified);
36
37
  return out;
37
38
  }
38
39
  /**
@@ -44,7 +45,7 @@ export function armCancelWatchdog(transport, turnDone, deps) {
44
45
  let fired = false;
45
46
  const clear = setTimer(() => {
46
47
  fired = true;
47
- deps.log?.("warn", "外部 Agent 中断后未在宽限内结束回合,关闭进程");
48
+ deps.log?.("warn", msg().drivers.agent.cancelGraceExpired);
48
49
  void transport.terminate();
49
50
  }, deps.cancelGraceMs ?? CANCEL_GRACE_MS);
50
51
  void turnDone.finally(() => {
@@ -6,12 +6,13 @@
6
6
  * `onChange` 供 `/agents` / RPC `get_agents` 的缓存刷新。
7
7
  */
8
8
  import { AmaError } from "../errors.js";
9
+ import { msg } from "../i18n/index.js";
9
10
  export class HostRunnerRegistry {
10
11
  runners = new Map();
11
12
  listeners = new Set();
12
13
  provide(runner) {
13
14
  if (typeof runner?.id !== "string" || runner.id === "" || typeof runner.start !== "function")
14
- throw new AmaError("invalid_arguments", "runners.provide:需要带 id 与 start 的 runner");
15
+ throw new AmaError("invalid_arguments", msg().drivers.host.runnerNeedsIdStart);
15
16
  this.runners.set(runner.id, runner);
16
17
  this.changed();
17
18
  return () => {
@@ -21,6 +21,7 @@ import { armCancelWatchdog, probeCandidate, spawnOf } from "../base.js";
21
21
  import { stderrHint } from "../process.js";
22
22
  import { TurnCollector, oneLine } from "../turn.js";
23
23
  import { CLAUDE_QUESTION_TOOLS, claudePermissionMode, claudeStopReason, claudeTodos, claudeToolKind, claudeToolLocations, claudeToolTitle, sessionScopedSuggestions, } from "./claude-normalize.js";
24
+ import { msg as messages } from "../../i18n/index.js";
24
25
  export function claudeArgs(options, sessionId, manualName = "manual") {
25
26
  const args = [
26
27
  "-p",
@@ -93,7 +94,7 @@ export class ClaudeStreamDriver {
93
94
  }
94
95
  catch (error) {
95
96
  await session.close();
96
- throw new AmaError("agent_start_failed", `${this.agentId}:启动失败(${error.message})${stderrHint(transport) !== "" ? `:${stderrHint(transport)}` : ""}`, { cause: error });
97
+ throw new AmaError("agent_start_failed", `${this.agentId}: failed to start (${error.message})${stderrHint(transport) !== "" ? `: ${stderrHint(transport)}` : ""}`, { cause: error });
97
98
  }
98
99
  return session;
99
100
  }
@@ -143,14 +144,14 @@ class ClaudeStreamSession {
143
144
  catch (error) {
144
145
  if (this.exited || signal.aborted)
145
146
  throw error;
146
- this.deps.log?.("debug", `${this.agentId}: initialize 未被接受(${error.message})`);
147
+ this.deps.log?.("debug", messages().drivers.agent.initializeRejected(this.agentId, error.message));
147
148
  }
148
149
  }
149
150
  async prompt(content, hooks) {
150
151
  if (this.closed || this.exited)
151
- throw new AmaError("agent_closed", `${this.agentId} 会话已关闭`);
152
+ throw new AmaError("agent_closed", `${this.agentId} session is closed`);
152
153
  if (this.running !== undefined)
153
- throw new AmaError("busy", `${this.agentId} 正在运行`);
154
+ throw new AmaError("busy", `${this.agentId} is already running`);
154
155
  const turn = new TurnCollector((e) => hooks.onEvent(e));
155
156
  for (const text of this.notices.splice(0))
156
157
  turn.push({ type: "notice", level: "warn", text });
@@ -177,7 +178,7 @@ class ClaudeStreamSession {
177
178
  }
178
179
  async steer(content) {
179
180
  if (this.closed || this.exited)
180
- throw new AmaError("agent_closed", `${this.agentId} 会话已关闭`);
181
+ throw new AmaError("agent_closed", `${this.agentId} session is closed`);
181
182
  this.write(userLine(content));
182
183
  }
183
184
  async cancel() {
@@ -224,18 +225,18 @@ class ClaudeStreamSession {
224
225
  turn.push({
225
226
  type: "notice",
226
227
  level: "info",
227
- text: `${this.agentId} 有 ${denials} 次操作因无人审批被拒绝`,
228
+ text: messages().drivers.agent.denials(this.agentId, denials),
228
229
  });
229
230
  if (result.subtype === "error_max_budget_usd")
230
231
  turn.push({
231
232
  type: "notice",
232
233
  level: "warn",
233
- text: `${this.agentId} 达到美元预算上限,已停止`,
234
+ text: messages().drivers.agent.budgetStop(this.agentId),
234
235
  });
235
236
  const stop = claudeStopReason(result, this.interrupted);
236
237
  if (stop === undefined) {
237
238
  const detail = result.errors?.join("; ") ?? result.result ?? result.subtype ?? "unknown";
238
- throw new AmaError("agent_failed", `${this.agentId} 回合失败:${oneLine(detail, 300)}`);
239
+ throw new AmaError("agent_failed", `${this.agentId} turn failed: ${oneLine(detail, 300)}`);
239
240
  }
240
241
  return turn.result(stop);
241
242
  }
@@ -261,7 +262,7 @@ class ClaudeStreamSession {
261
262
  this.exited = true;
262
263
  for (const controller of this.permissions.values())
263
264
  controller.abort();
264
- const error = new AmaError("agent_exited", `${this.agentId} 进程已退出${stderrHint(this.transport) !== "" ? `:${stderrHint(this.transport)}` : ""}`);
265
+ const error = new AmaError("agent_exited", `${this.agentId} process exited${stderrHint(this.transport) !== "" ? `: ${stderrHint(this.transport)}` : ""}`);
265
266
  for (const pending of this.controls.values())
266
267
  pending.reject(error);
267
268
  this.controls.clear();
@@ -273,7 +274,7 @@ class ClaudeStreamSession {
273
274
  msg = JSON.parse(line);
274
275
  }
275
276
  catch {
276
- this.deps.log?.("debug", `${this.agentId}: 非 JSON 输出`);
277
+ this.deps.log?.("debug", messages().drivers.agent.nonJson(this.agentId));
277
278
  return;
278
279
  }
279
280
  switch (msg["type"]) {
@@ -396,7 +397,7 @@ class ClaudeStreamSession {
396
397
  this.turn?.push({
397
398
  type: "notice",
398
399
  level: "warn",
399
- text: `${this.agentId} 想向你提问(${name});ama 不代答,已请它把问题写进最终回复`,
400
+ text: messages().drivers.agent.askedQuestion(this.agentId, name),
400
401
  });
401
402
  this.respond(requestId, {
402
403
  behavior: "deny",
@@ -19,6 +19,7 @@ import { JsonRpcPeer, RpcError } from "../jsonrpc.js";
19
19
  import { stderrHint } from "../process.js";
20
20
  import { TurnCollector, oneLine } from "../turn.js";
21
21
  import { codexDecision, codexPlan, codexPolicy, codexToolEvent, grantedProfile, readTokens, } from "./codex-normalize.js";
22
+ import { msg } from "../../i18n/index.js";
22
23
  const DECISION_OPTIONS = [
23
24
  { optionId: "accept", kind: "allow_once" },
24
25
  { optionId: "acceptForSession", kind: "allow_always" },
@@ -58,7 +59,7 @@ export class CodexAppServerDriver {
58
59
  await session.close();
59
60
  if (error instanceof AmaError)
60
61
  throw error;
61
- throw new AmaError("agent_start_failed", `${this.agentId}:app-server 启动失败(${error.message})${stderrHint(transport) !== "" ? `:${stderrHint(transport)}` : ""}`, { cause: error });
62
+ throw new AmaError("agent_start_failed", `${this.agentId}: app-server failed to start (${error.message})${stderrHint(transport) !== "" ? `: ${stderrHint(transport)}` : ""}`, { cause: error });
62
63
  }
63
64
  return session;
64
65
  }
@@ -125,25 +126,29 @@ class CodexSession {
125
126
  catch (error) {
126
127
  if (signal.aborted || !(error instanceof RpcError))
127
128
  throw error;
128
- this.notices.push(`${this.agentId} 找不到会话 ${options.resume},已新开`);
129
+ this.notices.push(msg().drivers.agent.resumeNotFound(this.agentId, options.resume));
129
130
  }
130
131
  }
131
132
  const started = await this.peer.request("thread/start", common, signal);
132
133
  const id = started.thread?.id;
133
134
  if (typeof id !== "string" || id === "")
134
- throw new Error("thread/start 没有返回 thread.id");
135
+ throw new Error("thread/start returned no thread.id");
135
136
  this.threadId = id;
136
137
  }
137
138
  async prompt(content, hooks) {
138
139
  if (this.closed || !this.peer.isOpen)
139
- throw new AmaError("agent_closed", `${this.agentId} 会话已关闭`);
140
+ throw new AmaError("agent_closed", `${this.agentId} session is closed`);
140
141
  if (this.running !== undefined)
141
- throw new AmaError("busy", `${this.agentId} 正在运行`);
142
+ throw new AmaError("busy", `${this.agentId} is already running`);
142
143
  const turn = new TurnCollector((e) => hooks.onEvent(e));
143
144
  for (const text of this.notices.splice(0))
144
145
  turn.push({ type: "notice", level: "info", text });
145
146
  if (content.some((b) => b.type === "image"))
146
- turn.push({ type: "notice", level: "warn", text: `${this.agentId} 驱动暂不传图片,已省略` });
147
+ turn.push({
148
+ type: "notice",
149
+ level: "warn",
150
+ text: msg().drivers.agent.noImagesDriver(this.agentId),
151
+ });
147
152
  this.turn = turn;
148
153
  this.hooks = hooks;
149
154
  this.messages.clear();
@@ -151,7 +156,7 @@ class CodexSession {
151
156
  this.interruptRequested = false;
152
157
  const completed = new Promise((resolve) => (this.finishTurn = resolve));
153
158
  const closed = this.peer.closed.then(() => {
154
- throw new AmaError("agent_exited", `${this.agentId} 进程已退出${stderrHint(this.transport) !== "" ? `:${stderrHint(this.transport)}` : ""}`);
159
+ throw new AmaError("agent_exited", `${this.agentId} process exited${stderrHint(this.transport) !== "" ? `: ${stderrHint(this.transport)}` : ""}`);
155
160
  });
156
161
  void closed.catch(() => undefined);
157
162
  this.running = (async () => {
@@ -180,7 +185,7 @@ class CodexSession {
180
185
  }
181
186
  async steer(content) {
182
187
  if (this.turnId === undefined)
183
- throw new AmaError("not_running", `${this.agentId} 没有进行中的回合`);
188
+ throw new AmaError("not_running", `${this.agentId} has no turn in progress`);
184
189
  await this.peer.request("turn/steer", {
185
190
  threadId: this.threadId,
186
191
  input: textInput(content),
@@ -240,7 +245,7 @@ class CodexSession {
240
245
  return turn.result("cancelled");
241
246
  if (status === "failed") {
242
247
  const error = (turnInfo["error"] ?? {});
243
- throw new AmaError("agent_failed", `${this.agentId} 回合失败:${oneLine(String(error["message"] ?? "unknown"), 300)}`);
248
+ throw new AmaError("agent_failed", `${this.agentId} turn failed: ${oneLine(String(error["message"] ?? "unknown"), 300)}`);
244
249
  }
245
250
  return turn.result("end_turn");
246
251
  }
@@ -311,7 +316,7 @@ class CodexSession {
311
316
  turn.push({
312
317
  type: "notice",
313
318
  level: "warn",
314
- text: `${this.agentId}:${oneLine(String(error["message"] ?? "error"), 200)}${params["willRetry"] === true ? "(重试中)" : ""}`,
319
+ text: msg().drivers.agent.error(this.agentId, oneLine(String(error["message"] ?? "error"), 200), params["willRetry"] === true),
315
320
  });
316
321
  return;
317
322
  }
@@ -390,14 +395,14 @@ class CodexSession {
390
395
  this.turn?.push({
391
396
  type: "notice",
392
397
  level: "warn",
393
- text: `${this.agentId} 想向你提问;ama 不代答,请让它把问题写进最终回复`,
398
+ text: msg().drivers.agent.askedQuestionCodex(this.agentId),
394
399
  });
395
400
  throw new RpcError(-32601, "The coordinator cannot relay interactive questions");
396
401
  case "mcpServer/elicitation/request":
397
402
  this.turn?.push({
398
403
  type: "notice",
399
404
  level: "warn",
400
- text: `${this.agentId} 的 MCP 服务器请求输入;ama 不代答,已取消`,
405
+ text: msg().drivers.agent.mcpElicitation(this.agentId),
401
406
  });
402
407
  return { action: "cancel", content: null, _meta: null };
403
408
  default:
@@ -15,6 +15,7 @@ import { isReadOnlyMode, probeCandidate, spawnOf } from "../base.js";
15
15
  import { stderrHint } from "../process.js";
16
16
  import { TurnCollector, oneLine } from "../turn.js";
17
17
  import { claudeStopReason } from "./claude-normalize.js";
18
+ import { msg as messages } from "../../i18n/index.js";
18
19
  export function oneshotArgs(dialect, options, session, prompt) {
19
20
  switch (dialect) {
20
21
  case "claude": {
@@ -66,7 +67,7 @@ export class OneshotDriver {
66
67
  }
67
68
  async open(options) {
68
69
  if (!isReadOnlyMode(options.mode))
69
- throw new AmaError("agent_mode_unsupported", `${this.agentId} 只有一次性打印模式可用,它不能审批,只能用于只读(plan)任务`);
70
+ throw new AmaError("agent_mode_unsupported", `${this.agentId} only has a one-shot print mode, which cannot ask for approval; use it for read-only (plan) tasks only`);
70
71
  const probed = await probeCandidate(this.candidate, this.deps);
71
72
  const dialect = this.candidate.oneshot ?? "claude";
72
73
  return new OneshotSession(this.agentId, dialect, probed.path ?? this.candidate.program, options, this.deps);
@@ -97,16 +98,16 @@ class OneshotSession {
97
98
  }
98
99
  async prompt(content, hooks) {
99
100
  if (this.closed)
100
- throw new AmaError("agent_closed", `${this.agentId} 会话已关闭`);
101
+ throw new AmaError("agent_closed", `${this.agentId} session is closed`);
101
102
  if (this.transport !== undefined)
102
- throw new AmaError("busy", `${this.agentId} 正在运行`);
103
+ throw new AmaError("busy", `${this.agentId} is already running`);
103
104
  const turn = new TurnCollector((e) => hooks.onEvent(e));
104
105
  const text = content.map((b) => (b.type === "text" ? b.text : "")).join("\n");
105
106
  if (content.some((b) => b.type === "image"))
106
107
  turn.push({
107
108
  type: "notice",
108
109
  level: "warn",
109
- text: `${this.agentId} 一次性模式不传图片,已省略`,
110
+ text: messages().drivers.agent.noImagesOneshot(this.agentId),
110
111
  });
111
112
  const resume = this.resumable && this.id !== "";
112
113
  const transport = spawnOf(this.deps)({
@@ -147,7 +148,7 @@ class OneshotSession {
147
148
  if (this.interrupted)
148
149
  return turn.result("cancelled");
149
150
  if (failure !== undefined || code !== 0)
150
- throw new AmaError("agent_failed", `${this.agentId} 失败:${oneLine(failure ?? (stderrHint(transport) || `退出码 ${String(code)}`), 300)}`);
151
+ throw new AmaError("agent_failed", `${this.agentId} failed: ${oneLine(failure ?? (stderrHint(transport) || `exit code ${String(code)}`), 300)}`);
151
152
  this.resumable = this.dialect !== "gemini" && this.id !== "";
152
153
  return turn.result("end_turn");
153
154
  }
@@ -169,7 +170,7 @@ class OneshotSession {
169
170
  if (result === undefined) {
170
171
  if (this.interrupted)
171
172
  return turn.result("cancelled");
172
- throw new AmaError("agent_failed", `${this.agentId} 没有输出结果(退出码 ${String(code)}):${stderrHint(transport)}`);
173
+ throw new AmaError("agent_failed", `${this.agentId} produced no result (exit code ${String(code)}): ${stderrHint(transport)}`);
173
174
  }
174
175
  if (typeof result.session_id === "string")
175
176
  this.id = result.session_id;
@@ -186,7 +187,7 @@ class OneshotSession {
186
187
  turn.setFinalText(result.result);
187
188
  const stop = claudeStopReason(result, this.interrupted);
188
189
  if (stop === undefined)
189
- throw new AmaError("agent_failed", `${this.agentId} 失败:${oneLine(result.result ?? result.subtype ?? "", 300)}`);
190
+ throw new AmaError("agent_failed", `${this.agentId} failed: ${oneLine(result.result ?? result.subtype ?? "", 300)}`);
190
191
  return turn.result(stop);
191
192
  }
192
193
  /** codex exec --json 的一行;返回失败信息(turn.failed / error)。 */
@@ -82,7 +82,7 @@ export class DriverPool {
82
82
  }
83
83
  }
84
84
  function abortedError() {
85
- return new AmaError("aborted", "外部 Agent 排队时被中断");
85
+ return new AmaError("aborted", "external agent was interrupted while queued");
86
86
  }
87
87
  /** 按配置建池(`agents.maxConcurrent`、`agents.<id>.maxConcurrent`)。 */
88
88
  export function poolFromConfig(config) {
@@ -40,9 +40,11 @@ export interface ProcessRunnerDeps {
40
40
  timeoutMs?: number;
41
41
  idleMs?: number;
42
42
  setTimer?(fn: () => void, ms: number): () => void;
43
+ /** [W6-C0] 轨迹计时的时钟(测试注入);缺省 Date.now。 */
44
+ now?(): number;
43
45
  log?(level: "debug" | "info" | "warn", message: string): void;
44
46
  }
45
- /** 最终报告:最终文本 + 工具摘要 / 触及文件(给协调者当资料,不是指令)。 */
47
+ /** 最终报告:最终文本 + 工具摘要 / 触及文件(给协调者当资料,不是指令;[W6-C0] 标题固定英文)。 */
46
48
  export declare function reportText(turn: DriverTurnResult): string;
47
49
  export declare class ProcessRunner implements SubagentRunner {
48
50
  private readonly deps;