@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
@@ -14,6 +14,7 @@ import { emptyCodeResult, gitHintFor, restoreCheckpoint } from "./restore.js";
14
14
  import { GitMissingError, ShadowRepo, unsafeShadowCwd, } from "./shadow-git.js";
15
15
  import { latestShadowCommit, restoreFromShadow } from "./shadow-restore.js";
16
16
  import { CheckpointTracker } from "./tracker.js";
17
+ import { msg } from "../i18n/index.js";
17
18
  export function createCheckpointBackendFactory(settings) {
18
19
  return (ctx) => {
19
20
  if (settings.mode === "off")
@@ -33,7 +34,7 @@ export function createCheckpointBackendFactory(settings) {
33
34
  });
34
35
  if (!registered && settings.sessionsRoot !== undefined) {
35
36
  registered = true;
36
- registerSessionRoot(settings.dataDir, settings.sessionsRoot).catch((error) => ctx.log("debug", `检查点:登记会话目录失败(${String(error)})`));
37
+ registerSessionRoot(settings.dataDir, settings.sessionsRoot).catch((error) => ctx.log("debug", msg().session.checkpoints.registerFailed(String(error))));
37
38
  }
38
39
  return tracker;
39
40
  };
@@ -41,7 +42,7 @@ export function createCheckpointBackendFactory(settings) {
41
42
  let shadow = settings.mode === "shadow-git" ? undefined : null;
42
43
  const degrade = (message) => {
43
44
  shadow = null;
44
- warn(`检查点:影子 git 不可用(${message}),本会话改用 tools 模式`);
45
+ warn(msg().session.checkpoints.shadowUnavailable(message));
45
46
  };
46
47
  const getShadow = () => {
47
48
  if (shadow !== undefined)
@@ -66,7 +67,7 @@ export function createCheckpointBackendFactory(settings) {
66
67
  return snap.commit;
67
68
  }
68
69
  catch (error) {
69
- degrade(error instanceof GitMissingError ? "PATH 里找不到 git" : describe(error));
70
+ degrade(error instanceof GitMissingError ? msg().session.checkpoints.gitMissing : describe(error));
70
71
  return undefined;
71
72
  }
72
73
  };
@@ -82,7 +83,7 @@ export function createCheckpointBackendFactory(settings) {
82
83
  await get().snapshot(userEntryId, shadowCommit !== undefined ? { shadowCommit } : {});
83
84
  }
84
85
  catch (error) {
85
- warn(`检查点:建立失败(${describe(error)})`);
86
+ warn(msg().session.checkpoints.createFailed(describe(error)));
86
87
  }
87
88
  },
88
89
  hasCheckpoint: (userEntryId) => isRewindable(get().state, userEntryId, settings.keep),
@@ -117,7 +118,7 @@ export function createCheckpointBackendFactory(settings) {
117
118
  });
118
119
  }
119
120
  catch (error) {
120
- warn(`检查点:按影子提交恢复失败(${describe(error)}),改按 tools 记录恢复`);
121
+ warn(msg().session.checkpoints.shadowRestoreFailed(describe(error)));
121
122
  }
122
123
  }
123
124
  }
@@ -24,6 +24,7 @@ import { unifiedDiff } from "../tools/edit.js";
24
24
  import { DEFAULT_MAX_FILE_BYTES, hashFile, isNotFound, keyToPath, readBlob, realParentOf, } from "./blobs.js";
25
25
  import { readGitHead } from "./git-head.js";
26
26
  import { latestCheckpoint } from "./replay.js";
27
+ import { msg } from "../i18n/index.js";
27
28
  /** 单文件不恢复的原因(安全检查不通过等);`settleFile` 把它记进 `skipped`。 */
28
29
  export class RestoreSkip extends Error {
29
30
  reason;
@@ -198,7 +199,7 @@ async function removeRegular(abs, before) {
198
199
  if (now.nlink > 1)
199
200
  throw new Skip("hardlink");
200
201
  if (now.dev !== before.dev || now.ino !== before.ino)
201
- throw new Error("文件在恢复期间被替换");
202
+ throw new Error(msg().session.checkpoints.replacedDuringRestore);
202
203
  await unlink(abs);
203
204
  }
204
205
  async function writeBack(abs, bytes, record, before) {
@@ -239,7 +240,7 @@ async function writeBack(abs, bytes, record, before) {
239
240
  opened.ino !== before.ino ||
240
241
  now.dev !== opened.dev ||
241
242
  now.ino !== opened.ino) {
242
- throw new Error("文件在恢复期间被替换");
243
+ throw new Error(msg().session.checkpoints.replacedDuringRestore);
243
244
  }
244
245
  if (opened.nlink > 1)
245
246
  throw new Skip("hardlink");
@@ -5,6 +5,7 @@
5
5
  * 无效的环境变量值 warn 后忽略。`maxFileBytes` / `keep` 取配置,缺省 5 MiB / 100。
6
6
  */
7
7
  import { CHECKPOINT_MODES, DEFAULT_CHECKPOINTS_CONFIG } from "../config/types.js";
8
+ import { msg } from "../i18n/index.js";
8
9
  export function resolveCheckpointSettings(config, env = process.env, warn = () => { }) {
9
10
  const section = config?.checkpoints ?? {};
10
11
  let mode = section.mode ?? DEFAULT_CHECKPOINTS_CONFIG.mode;
@@ -13,7 +14,7 @@ export function resolveCheckpointSettings(config, env = process.env, warn = () =
13
14
  if (CHECKPOINT_MODES.includes(raw))
14
15
  mode = raw;
15
16
  else
16
- warn(`AMA_CHECKPOINTS=${raw} 无效(${CHECKPOINT_MODES.join(" | ")}),已忽略`);
17
+ warn(msg().session.checkpoints.invalidEnv(raw, CHECKPOINT_MODES));
17
18
  }
18
19
  return {
19
20
  mode,
@@ -19,6 +19,7 @@ import { mkdir, readFile, readdir, rm, stat, writeFile } from "node:fs/promises"
19
19
  import { homedir } from "node:os";
20
20
  import { join, parse, resolve } from "node:path";
21
21
  import { fileHistoryDir } from "./blobs.js";
22
+ import { msg } from "../i18n/index.js";
22
23
  export const SHADOW_DIR = "shadow";
23
24
  /** cwd 下(不含忽略的)文件数上限,超出本会话降级为 tools。 */
24
25
  export const SHADOW_MAX_FILES = 20_000;
@@ -42,9 +43,9 @@ export function shadowRepoDir(dataDir, cwd) {
42
43
  export function unsafeShadowCwd(cwd, home = homedir()) {
43
44
  const abs = resolve(cwd);
44
45
  if (parse(abs).root === abs)
45
- return "工作目录是文件系统根目录";
46
+ return msg().session.checkpoints.cwdIsRoot;
46
47
  if (home !== "" && sameDir(abs, resolve(home)))
47
- return "工作目录是家目录";
48
+ return msg().session.checkpoints.cwdIsHome;
48
49
  return undefined;
49
50
  }
50
51
  function sameDir(a, b) {
@@ -53,7 +54,7 @@ function sameDir(a, b) {
53
54
  /** git 不在 PATH(或指定的可执行文件不存在)。 */
54
55
  export class GitMissingError extends Error {
55
56
  constructor() {
56
- super("找不到 git");
57
+ super(msg().session.checkpoints.gitNotFound);
57
58
  }
58
59
  }
59
60
  export const MODE_ABSENT = "000000";
@@ -220,7 +221,7 @@ export class ShadowRepo {
220
221
  return {
221
222
  degrade: {
222
223
  reason: "too_many_files",
223
- message: `工作目录有 ${files} 个文件(上限 ${this.maxFiles})`,
224
+ message: msg().session.checkpoints.tooManyFiles(files, this.maxFiles),
224
225
  },
225
226
  };
226
227
  }
@@ -236,7 +237,7 @@ export class ShadowRepo {
236
237
  commit,
237
238
  degrade: {
238
239
  reason: "too_slow",
239
- message: `快照用了 ${(elapsed / 1000).toFixed(1)} 秒(上限 ${this.maxSnapshotMs / 1000} 秒)`,
240
+ message: msg().session.checkpoints.tooSlow((elapsed / 1000).toFixed(1), this.maxSnapshotMs / 1000),
240
241
  },
241
242
  };
242
243
  }
@@ -412,7 +413,7 @@ function runGit(git, args, options) {
412
413
  return;
413
414
  }
414
415
  const detail = errText.trim().split("\n").slice(-2).join("; ");
415
- reject(new Error(`git ${args.find((a) => !a.startsWith("--")) ?? ""} 失败(${signal ?? code})${detail === "" ? "" : `:${detail}`}`));
416
+ reject(new Error(msg().session.checkpoints.gitFailed(args.find((a) => !a.startsWith("--")) ?? "", String(signal ?? code), detail)));
416
417
  });
417
418
  child.stdin.on("error", () => undefined);
418
419
  child.stdin.end(options.input ?? "");
@@ -17,6 +17,7 @@ import { DEFAULT_MAX_FILE_BYTES, hashBytes, keyToPath } from "./blobs.js";
17
17
  import { latestCheckpoint } from "./replay.js";
18
18
  import { emptyCodeResult, restoreCheckpoint, restoreFile, settleFile, } from "./restore.js";
19
19
  import { MODE_ABSENT, MODE_EXECUTABLE, MODE_GITLINK, MODE_SYMLINK, } from "./shadow-git.js";
20
+ import { msg } from "../i18n/index.js";
20
21
  const IS_WINDOWS = process.platform === "win32";
21
22
  /** 文件顺序上最后一个带影子提交的检查点。 */
22
23
  export function latestShadowCommit(state) {
@@ -32,9 +33,9 @@ export async function restoreFromShadow(options) {
32
33
  const { repo } = options;
33
34
  const target = options.target.shadowCommit;
34
35
  if (target === undefined)
35
- throw new Error("检查点没有影子提交");
36
+ throw new Error(msg().session.checkpoints.noShadowCommit);
36
37
  if (!(await repo.hasCommit(target)))
37
- throw new Error(`影子提交 ${target.slice(0, 12)} 不存在`);
38
+ throw new Error(msg().session.checkpoints.shadowCommitMissing(target.slice(0, 12)));
38
39
  const maxBytes = options.maxFileBytes ?? DEFAULT_MAX_FILE_BYTES;
39
40
  const current = await repo.currentTree();
40
41
  const changes = (await repo.diff(target, current)).filter((c) => c.oldMode !== MODE_GITLINK && c.newMode !== MODE_GITLINK);
@@ -14,6 +14,7 @@ import { readGitHead } from "./git-head.js";
14
14
  import { DEFAULT_MAX_FILE_BYTES, hashBytes, isNotFound, keyToPath, pathKey, putBlob, realParentOf, recordFile, } from "./blobs.js";
15
15
  import { applyCheckpoint, applyTrack, emptyCheckpoints } from "./replay.js";
16
16
  import { CHECKPOINT_CUSTOM_TYPE, CHECKPOINT_TRACK_CUSTOM_TYPE, } from "./types.js";
17
+ import { msg } from "../i18n/index.js";
17
18
  /** mtime 粒度余量(FAT 2 s;其它文件系统更细)。 */
18
19
  export const MTIME_GRANULARITY_MS = 2_000;
19
20
  export class CheckpointTracker {
@@ -87,7 +88,7 @@ export class CheckpointTracker {
87
88
  this.recordedAt.set(key, at);
88
89
  }
89
90
  catch (error) {
90
- this.warn(`检查点:备份 ${key} 失败(${describe(error)}),本次写入不可回滚`);
91
+ this.warn(msg().session.checkpoints.backupFailed(key, describe(error)));
91
92
  }
92
93
  }
93
94
  afterWrite(absolutePath, content) {
@@ -95,7 +96,7 @@ export class CheckpointTracker {
95
96
  this.lastWritten.set(absolutePath, hashBytes(content));
96
97
  }
97
98
  catch (error) {
98
- this.warn(`检查点:记录 ${absolutePath} 的写入失败(${describe(error)})`);
99
+ this.warn(msg().session.checkpoints.recordFailed(absolutePath, describe(error)));
99
100
  }
100
101
  }
101
102
  /** 新回合:重拍全部已跟踪文件,追加 `ama.checkpoint`,返回它。`extra.shadowCommit` 来自影子 git。 */
@@ -114,7 +115,7 @@ export class CheckpointTracker {
114
115
  times.set(key, next.at);
115
116
  }
116
117
  catch (error) {
117
- this.warn(`检查点:快照 ${key} 失败(${describe(error)}),该文件回滚到此处时用更早的记录`);
118
+ this.warn(msg().session.checkpoints.snapshotFailed(key, describe(error)));
118
119
  }
119
120
  }
120
121
  const data = { v: 1, userEntryId, files };
@@ -10,12 +10,14 @@
10
10
  * - `--resume [id]`:下一个参数形如会话 id(无空白、不以 `-` 开头)才被当作 id;
11
11
  * 否则仍作为提示文本。显式写法 `--resume=<id>`。
12
12
  * - `--provider` 不带 `--model` 不在这里报错,由 bootstrap 第 11 步报(退出码 2)。
13
+ * - [W6-C0] `--lang zh|en` 也可写在子命令名之前(`ama --lang en doctor`);`--memory` / `--no-memory`。
13
14
  */
14
15
  import { AmaError } from "../errors.js";
15
16
  import type { ModelThinkingLevel } from "../ai/types.js";
16
17
  import { type PermissionMode } from "../permissions/types.js";
17
18
  import { type CodemodeMode, type ToolsPreset } from "../config/types.js";
18
- export declare const SUBCOMMANDS: readonly ["auth", "sessions", "models", "providers", "doctor", "config", "init", "stats"];
19
+ import { type Locale } from "../i18n/index.js";
20
+ export declare const SUBCOMMANDS: readonly ["auth", "sessions", "models", "providers", "doctor", "config", "init", "stats", "memory"];
19
21
  export type SubcommandName = (typeof SUBCOMMANDS)[number];
20
22
  export type OutputFormat = "text" | "json" | "stream-json";
21
23
  export type QuietStartup = "normal" | "header" | "silent";
@@ -80,6 +82,10 @@ export interface ParsedArgs {
80
82
  prompt?: string;
81
83
  /** 原始位置参数。 */
82
84
  positionals: string[];
85
+ /** [W6-C0] `--lang zh|en`:界面语言(`AMA_LANG` 优先,docs/i18n.md)。 */
86
+ lang?: Locale;
87
+ /** [W6-C0] `--memory` → true、`--no-memory` → false:覆盖 `memory.enabled`(W6-M)。 */
88
+ memory?: boolean;
83
89
  }
84
90
  export type ParseResult = {
85
91
  kind: "run";
@@ -88,11 +94,12 @@ export type ParseResult = {
88
94
  kind: "subcommand";
89
95
  name: SubcommandName;
90
96
  argv: string[];
97
+ lang?: Locale;
91
98
  };
92
99
  export declare class UsageError extends AmaError {
93
100
  constructor(message: string);
94
101
  }
95
- export { HELP_TEXT } from "./help-text.js";
102
+ export { helpText } from "./help-text.js";
96
103
  export declare function emptyArgs(): ParsedArgs;
97
104
  /** 解析 argv(不含 node 与脚本路径);用法错误抛 UsageError(退出码 2)。 */
98
105
  export declare function parseArgs(argv: readonly string[]): ParseResult;
package/dist/cli/args.js CHANGED
@@ -10,11 +10,13 @@
10
10
  * - `--resume [id]`:下一个参数形如会话 id(无空白、不以 `-` 开头)才被当作 id;
11
11
  * 否则仍作为提示文本。显式写法 `--resume=<id>`。
12
12
  * - `--provider` 不带 `--model` 不在这里报错,由 bootstrap 第 11 步报(退出码 2)。
13
+ * - [W6-C0] `--lang zh|en` 也可写在子命令名之前(`ama --lang en doctor`);`--memory` / `--no-memory`。
13
14
  */
14
15
  import { AmaError } from "../errors.js";
15
16
  import { PERMISSION_MODES_STRICT_FIRST } from "../permissions/types.js";
16
17
  import { canonicalPreset } from "../config/types.js";
17
18
  import { CODEMODE_MODES } from "../config/types.js";
19
+ import { LOCALES, msg } from "../i18n/index.js";
18
20
  export const SUBCOMMANDS = [
19
21
  "auth",
20
22
  "sessions",
@@ -24,6 +26,8 @@ export const SUBCOMMANDS = [
24
26
  "config",
25
27
  "init",
26
28
  "stats",
29
+ // [W6-C0] W6-M 实现(cli/subcommands/memory.ts);之前 main.ts 报「尚未提供」
30
+ "memory",
27
31
  ];
28
32
  export class UsageError extends AmaError {
29
33
  constructor(message) {
@@ -45,7 +49,7 @@ const QUIET_LEVELS = ["normal", "header", "silent"];
45
49
  /** 帮助与报错按常用顺序列出(校验集合同 TOOLS_PRESET_INPUTS;`codemode` 是 `codemode-only` 的别名)。 */
46
50
  const PRESET_CHOICES = ["default", "minimal", "codemode-only", "coordinator", "codemode"];
47
51
  const SESSION_ID_LIKE = /^[A-Za-z0-9][A-Za-z0-9._:-]*$/;
48
- export { HELP_TEXT } from "./help-text.js";
52
+ export { helpText } from "./help-text.js";
49
53
  const VALUE_OPTIONS = new Set([
50
54
  "profile",
51
55
  "host",
@@ -77,6 +81,7 @@ const VALUE_OPTIONS = new Set([
77
81
  "system-prompt",
78
82
  "system-prompt-mode",
79
83
  "from",
84
+ "lang",
80
85
  ]);
81
86
  const FLAG_ALIASES = {
82
87
  "-h": "help",
@@ -88,7 +93,7 @@ const FLAG_ALIASES = {
88
93
  function choice(option, value, choices) {
89
94
  if (choices.includes(value))
90
95
  return value;
91
- throw new UsageError(`--${option} 的取值应为 ${choices.join(" | ")}(收到 ${value})`);
96
+ throw new UsageError(msg().cli.args.invalidChoice(option, choices, value));
92
97
  }
93
98
  function list(value) {
94
99
  return value
@@ -117,7 +122,7 @@ export function emptyArgs() {
117
122
  }
118
123
  function applyValue(args, option, value) {
119
124
  if (value === "")
120
- throw new UsageError(`--${option} 的值不能为空`);
125
+ throw new UsageError(msg().cli.args.emptyValue(option));
121
126
  switch (option) {
122
127
  case "profile":
123
128
  args.profile = value;
@@ -172,7 +177,7 @@ function applyValue(args, option, value) {
172
177
  break;
173
178
  case "tui-mode":
174
179
  if (value === "fullscreen")
175
- throw new UsageError("--tui-mode fullscreen 尚未支持(第一期只有 regular)");
180
+ throw new UsageError(msg().cli.args.fullscreenUnsupported);
176
181
  args.tuiMode = choice(option, value, ["regular"]);
177
182
  break;
178
183
  case "quiet-startup":
@@ -202,14 +207,14 @@ function applyValue(args, option, value) {
202
207
  case "max-turns": {
203
208
  const turns = Number(value);
204
209
  if (!Number.isInteger(turns) || turns < 1)
205
- throw new UsageError(`--max-turns 应为正整数(收到 ${value})`);
210
+ throw new UsageError(msg().cli.args.maxTurnsPositive(value));
206
211
  args.maxTurns = turns;
207
212
  break;
208
213
  }
209
214
  case "max-cost": {
210
215
  const usd = Number(value);
211
216
  if (!Number.isFinite(usd) || usd <= 0)
212
- throw new UsageError(`--max-cost 应为正数(美元,收到 ${value})`);
217
+ throw new UsageError(msg().cli.args.maxCostPositive(value));
213
218
  args.maxCostUsd = usd;
214
219
  break;
215
220
  }
@@ -219,6 +224,9 @@ function applyValue(args, option, value) {
219
224
  case "from":
220
225
  args.from = value;
221
226
  break;
227
+ case "lang":
228
+ args.lang = choice(option, value, LOCALES);
229
+ break;
222
230
  }
223
231
  }
224
232
  function applyFlag(args, name) {
@@ -248,18 +256,27 @@ function applyFlag(args, name) {
248
256
  case "no-trust": {
249
257
  const value = name === "trust";
250
258
  if (args.trust !== undefined && args.trust !== value) {
251
- throw new UsageError("--trust 与 --no-trust 不能同时使用");
259
+ throw new UsageError(msg().cli.args.flagConflict("--trust", "--no-trust"));
252
260
  }
253
261
  args.trust = value;
254
262
  return true;
255
263
  }
264
+ case "memory":
265
+ case "no-memory": {
266
+ const value = name === "memory";
267
+ if (args.memory !== undefined && args.memory !== value)
268
+ throw new UsageError(msg().cli.args.flagConflict("--memory", "--no-memory"));
269
+ args.memory = value;
270
+ return true;
271
+ }
256
272
  default:
257
273
  return false;
258
274
  }
259
275
  }
260
276
  function validate(args) {
277
+ const m = msg().cli.args;
261
278
  if (args.print && args.mode !== undefined)
262
- throw new UsageError(`-p 与 --mode ${args.mode} 不能同时使用`);
279
+ throw new UsageError(m.printWithMode(args.mode));
263
280
  const sessionFlags = [
264
281
  args.continue ? "--continue" : undefined,
265
282
  args.resume ? "--resume" : undefined,
@@ -267,38 +284,44 @@ function validate(args) {
267
284
  args.fork !== undefined ? "--fork" : undefined,
268
285
  ].filter((f) => f !== undefined);
269
286
  if (sessionFlags.length > 1)
270
- throw new UsageError(`${sessionFlags.join(" 与 ")} 不能同时使用`);
287
+ throw new UsageError(m.flagsConflict(sessionFlags));
271
288
  if (args.noSession && sessionFlags.length > 0) {
272
- throw new UsageError(`--no-session 与 ${sessionFlags[0]} 不能同时使用`);
289
+ throw new UsageError(m.flagConflict("--no-session", sessionFlags[0] ?? ""));
273
290
  }
274
291
  if (args.apiKey !== undefined && args.model === undefined) {
275
- throw new UsageError("--api-key 需要同时给出 --model");
292
+ throw new UsageError(m.apiKeyNeedsModel);
276
293
  }
277
294
  if (args.outputFormat !== undefined && !args.print) {
278
- throw new UsageError("--output-format 只用于 -p / --print");
295
+ throw new UsageError(m.printOnly("--output-format"));
279
296
  }
280
297
  if (args.systemPromptMode !== undefined && args.systemPrompt === undefined) {
281
- throw new UsageError("--system-prompt-mode 需要同时给出 --system-prompt");
298
+ throw new UsageError(m.systemPromptModeNeedsPrompt);
282
299
  }
283
300
  if (args.maxTurns !== undefined && !args.print) {
284
- throw new UsageError("--max-turns 只用于 -p / --print");
301
+ throw new UsageError(m.printOnly("--max-turns"));
285
302
  }
286
303
  if (args.noStdin && !args.print)
287
- throw new UsageError("--no-stdin 只用于 -p / --print");
304
+ throw new UsageError(m.printOnly("--no-stdin"));
288
305
  if (args.noStdin && args.stdin)
289
- throw new UsageError("--no-stdin 与位置参数 - 不能同时使用");
306
+ throw new UsageError(m.noStdinWithDash);
290
307
  if (args.stdin && !args.print) {
291
- throw new UsageError("位置参数 - (从 stdin 读提示)只用于 -p / --print");
308
+ throw new UsageError(m.dashPrintOnly);
292
309
  }
293
310
  if (args.images.length > 0 && !args.print) {
294
- throw new UsageError("--image 只用于 -p / --print(交互界面里写 @图片路径)");
311
+ throw new UsageError(m.imagePrintOnly);
295
312
  }
296
313
  }
297
314
  /** 解析 argv(不含 node 与脚本路径);用法错误抛 UsageError(退出码 2)。 */
298
315
  export function parseArgs(argv) {
299
- const first = argv[0];
316
+ const lead = leadingLang(argv);
317
+ const first = argv[lead.next];
300
318
  if (first !== undefined && SUBCOMMANDS.includes(first)) {
301
- return { kind: "subcommand", name: first, argv: argv.slice(1) };
319
+ return {
320
+ kind: "subcommand",
321
+ name: first,
322
+ argv: argv.slice(lead.next + 1),
323
+ ...(lead.lang !== undefined ? { lang: lead.lang } : {}),
324
+ };
302
325
  }
303
326
  const args = emptyArgs();
304
327
  for (let i = 0; i < argv.length; i++) {
@@ -325,7 +348,7 @@ export function parseArgs(argv) {
325
348
  else {
326
349
  const alias = FLAG_ALIASES[token];
327
350
  if (alias === undefined)
328
- throw new UsageError(`未知选项:${token}`);
351
+ throw new UsageError(msg().cli.args.unknownOption(token));
329
352
  name = alias;
330
353
  }
331
354
  if (name === "resume") {
@@ -333,7 +356,7 @@ export function parseArgs(argv) {
333
356
  const next = argv[i + 1];
334
357
  if (inline !== undefined) {
335
358
  if (inline === "")
336
- throw new UsageError("--resume= 的 id 不能为空");
359
+ throw new UsageError(msg().cli.args.emptyResumeId);
337
360
  args.resumeId = inline;
338
361
  }
339
362
  else if (next !== undefined && SESSION_ID_LIKE.test(next)) {
@@ -347,16 +370,16 @@ export function parseArgs(argv) {
347
370
  if (value === undefined) {
348
371
  value = argv[i + 1];
349
372
  if (value === undefined)
350
- throw new UsageError(`--${name} 需要一个值`);
373
+ throw new UsageError(msg().cli.args.needsValue(name));
351
374
  i++;
352
375
  }
353
376
  applyValue(args, name, value);
354
377
  continue;
355
378
  }
356
379
  if (inline !== undefined)
357
- throw new UsageError(`--${name} 不接受值`);
380
+ throw new UsageError(msg().cli.args.noValue(name));
358
381
  if (!applyFlag(args, name))
359
- throw new UsageError(`未知选项:${token}`);
382
+ throw new UsageError(msg().cli.args.unknownOption(token));
360
383
  }
361
384
  if (args.positionals.length > 0)
362
385
  args.prompt = args.positionals.join(" ");
@@ -364,6 +387,30 @@ export function parseArgs(argv) {
364
387
  validate(args);
365
388
  return { kind: "run", args };
366
389
  }
390
+ /** [W6-C0] 子命令名之前的 `--lang X` / `--lang=X`(可重复,后者为准)。 */
391
+ function leadingLang(argv) {
392
+ let lang;
393
+ let i = 0;
394
+ for (;;) {
395
+ const token = argv[i];
396
+ if (token === "--lang" && argv[i + 1] !== undefined) {
397
+ const value = argv[i + 1];
398
+ lang = choice("lang", value, LOCALES);
399
+ i += 2;
400
+ }
401
+ else if (token?.startsWith("--lang=") === true) {
402
+ lang = choice("lang", token.slice("--lang=".length), LOCALES);
403
+ i += 1;
404
+ }
405
+ else
406
+ break;
407
+ }
408
+ // 后面不是子命令时整段交回普通解析(--lang 照常进 ParsedArgs)
409
+ const next = argv[i];
410
+ if (next === undefined || !SUBCOMMANDS.includes(next))
411
+ return { next: 0 };
412
+ return lang === undefined ? { next: i } : { lang, next: i };
413
+ }
367
414
  /** 子命令内部的小解析器:`--name value` / `--name=value` / 位置参数。 */
368
415
  export function parseSubArgs(argv, valueOptions, flagOptions = []) {
369
416
  const positionals = [];
@@ -387,14 +434,14 @@ export function parseSubArgs(argv, valueOptions, flagOptions = []) {
387
434
  if (valueOptions.includes(name)) {
388
435
  const value = eq === -1 ? argv[++i] : token.slice(eq + 1);
389
436
  if (value === undefined || value === "")
390
- throw new UsageError(`--${name} 需要一个值`);
437
+ throw new UsageError(msg().cli.args.needsValue(name));
391
438
  values.set(name, value);
392
439
  }
393
440
  else if (flagOptions.includes(name) && eq === -1) {
394
441
  flags.add(name);
395
442
  }
396
443
  else {
397
- throw new UsageError(`未知选项:${token}`);
444
+ throw new UsageError(msg().cli.args.unknownOption(token));
398
445
  }
399
446
  }
400
447
  return { positionals, values, flags };