@armadra/agent 0.5.0 → 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 (471) hide show
  1. package/CHANGELOG.md +177 -294
  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 +28307 -13241
  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.d.ts +58 -0
  103. package/dist/cli/choice-prompt.js +142 -0
  104. package/dist/cli/codemode-notice.js +2 -2
  105. package/dist/cli/compose-agents.js +2 -1
  106. package/dist/cli/compose-extensions.js +2 -0
  107. package/dist/cli/compose-memory.d.ts +53 -0
  108. package/dist/cli/compose-memory.js +127 -0
  109. package/dist/cli/compose-providers.d.ts +5 -0
  110. package/dist/cli/compose-providers.js +32 -2
  111. package/dist/cli/compose-session.d.ts +5 -0
  112. package/dist/cli/compose-session.js +27 -13
  113. package/dist/cli/compose-store.d.ts +2 -0
  114. package/dist/cli/compose-store.js +9 -5
  115. package/dist/cli/compose.d.ts +2 -0
  116. package/dist/cli/compose.js +13 -5
  117. package/dist/cli/default-model.d.ts +0 -2
  118. package/dist/cli/default-model.js +5 -8
  119. package/dist/cli/deps.d.ts +5 -1
  120. package/dist/cli/exit-codes.d.ts +1 -1
  121. package/dist/cli/exit-codes.js +7 -16
  122. package/dist/cli/from-prompt.js +3 -2
  123. package/dist/cli/help-text.d.ts +2 -1
  124. package/dist/cli/help-text.js +5 -99
  125. package/dist/cli/main.d.ts +5 -0
  126. package/dist/cli/main.js +21 -2
  127. package/dist/cli/proxy.js +14 -9
  128. package/dist/cli/runtime.d.ts +5 -0
  129. package/dist/cli/startup-screen.js +20 -27
  130. package/dist/cli/startup-steps.js +6 -8
  131. package/dist/cli/subcommands/auth.d.ts +6 -3
  132. package/dist/cli/subcommands/auth.js +52 -22
  133. package/dist/cli/subcommands/config-set.d.ts +21 -0
  134. package/dist/cli/subcommands/config-set.js +137 -0
  135. package/dist/cli/subcommands/config.d.ts +2 -1
  136. package/dist/cli/subcommands/config.js +51 -37
  137. package/dist/cli/subcommands/doctor.d.ts +2 -1
  138. package/dist/cli/subcommands/doctor.js +97 -58
  139. package/dist/cli/subcommands/init.d.ts +1 -1
  140. package/dist/cli/subcommands/init.js +8 -7
  141. package/dist/cli/subcommands/memory.d.ts +18 -0
  142. package/dist/cli/subcommands/memory.js +189 -0
  143. package/dist/cli/subcommands/model-meta.js +11 -9
  144. package/dist/cli/subcommands/models-cache-probe.d.ts +1 -1
  145. package/dist/cli/subcommands/models-cache-probe.js +26 -32
  146. package/dist/cli/subcommands/models-discover.d.ts +3 -0
  147. package/dist/cli/subcommands/models-discover.js +44 -21
  148. package/dist/cli/subcommands/models.d.ts +1 -1
  149. package/dist/cli/subcommands/models.js +29 -22
  150. package/dist/cli/subcommands/probe-runner.js +8 -7
  151. package/dist/cli/subcommands/providers-list.js +32 -21
  152. package/dist/cli/subcommands/providers-plan.js +24 -25
  153. package/dist/cli/subcommands/providers-probe.js +5 -6
  154. package/dist/cli/subcommands/providers.d.ts +2 -2
  155. package/dist/cli/subcommands/providers.js +48 -59
  156. package/dist/cli/subcommands/sessions-export.d.ts +1 -1
  157. package/dist/cli/subcommands/sessions-export.js +10 -9
  158. package/dist/cli/subcommands/sessions-search.d.ts +1 -1
  159. package/dist/cli/subcommands/sessions-search.js +11 -10
  160. package/dist/cli/subcommands/sessions-trace.d.ts +30 -0
  161. package/dist/cli/subcommands/sessions-trace.js +156 -0
  162. package/dist/cli/subcommands/sessions.d.ts +4 -3
  163. package/dist/cli/subcommands/sessions.js +40 -37
  164. package/dist/cli/subcommands/stats.d.ts +1 -1
  165. package/dist/cli/subcommands/stats.js +49 -30
  166. package/dist/cli/system-prompt-arg.js +3 -2
  167. package/dist/codemode/capability.js +3 -2
  168. package/dist/compaction/post-compact.d.ts +1 -0
  169. package/dist/compaction/post-compact.js +15 -1
  170. package/dist/compaction/prune-tier.d.ts +1 -1
  171. package/dist/compaction/prune-tier.js +3 -3
  172. package/dist/compaction/serialize.js +2 -1
  173. package/dist/config/auth-file.d.ts +12 -2
  174. package/dist/config/auth-file.js +32 -10
  175. package/dist/config/checker.js +12 -11
  176. package/dist/config/context-files.js +3 -2
  177. package/dist/config/edit.d.ts +106 -0
  178. package/dist/config/edit.js +350 -0
  179. package/dist/config/init.d.ts +4 -3
  180. package/dist/config/init.js +10 -18
  181. package/dist/config/json-schema.d.ts +2 -1
  182. package/dist/config/json-schema.js +101 -68
  183. package/dist/config/key-docs.d.ts +18 -7
  184. package/dist/config/key-docs.js +43 -128
  185. package/dist/config/load.js +7 -6
  186. package/dist/config/merge.d.ts +4 -1
  187. package/dist/config/merge.js +42 -22
  188. package/dist/config/paths.js +6 -5
  189. package/dist/config/profile.d.ts +5 -1
  190. package/dist/config/profile.js +7 -2
  191. package/dist/config/schema-w5.js +3 -2
  192. package/dist/config/schema-w6.d.ts +19 -0
  193. package/dist/config/schema-w6.js +115 -0
  194. package/dist/config/schema.js +34 -20
  195. package/dist/config/settings-registry.d.ts +78 -0
  196. package/dist/config/settings-registry.js +184 -0
  197. package/dist/config/types-w6.d.ts +109 -0
  198. package/dist/config/types-w6.js +19 -0
  199. package/dist/config/types.d.ts +11 -8
  200. package/dist/config/types.js +1 -0
  201. package/dist/drivers/acp/client.js +1 -1
  202. package/dist/drivers/acp/driver.js +13 -8
  203. package/dist/drivers/agents.js +4 -3
  204. package/dist/drivers/base.js +3 -2
  205. package/dist/drivers/host-runners.js +2 -1
  206. package/dist/drivers/native/claude-stream.js +12 -11
  207. package/dist/drivers/native/codex-app-server.js +17 -12
  208. package/dist/drivers/native/oneshot.js +8 -7
  209. package/dist/drivers/pool.js +1 -1
  210. package/dist/drivers/runner.d.ts +3 -1
  211. package/dist/drivers/runner.js +68 -20
  212. package/dist/drivers/turn.js +1 -1
  213. package/dist/hooks/config.js +3 -2
  214. package/dist/hooks/protocol.js +18 -12
  215. package/dist/host/api-impl.js +11 -10
  216. package/dist/host/loader.js +9 -8
  217. package/dist/host/types.d.ts +3 -0
  218. package/dist/i18n/catalog.d.ts +2169 -0
  219. package/dist/i18n/catalog.js +72 -0
  220. package/dist/i18n/format.d.ts +21 -0
  221. package/dist/i18n/format.js +58 -0
  222. package/dist/i18n/index.d.ts +58 -0
  223. package/dist/i18n/index.js +72 -0
  224. package/dist/i18n/messages/agents.d.ts +84 -0
  225. package/dist/i18n/messages/agents.js +85 -0
  226. package/dist/i18n/messages/approval.d.ts +99 -0
  227. package/dist/i18n/messages/approval.js +100 -0
  228. package/dist/i18n/messages/auth.d.ts +187 -0
  229. package/dist/i18n/messages/auth.js +189 -0
  230. package/dist/i18n/messages/cli-args.d.ts +46 -0
  231. package/dist/i18n/messages/cli-args.js +46 -0
  232. package/dist/i18n/messages/cli-help.d.ts +12 -0
  233. package/dist/i18n/messages/cli-help.js +244 -0
  234. package/dist/i18n/messages/cli.d.ts +336 -0
  235. package/dist/i18n/messages/cli.js +311 -0
  236. package/dist/i18n/messages/config-keys.d.ts +289 -0
  237. package/dist/i18n/messages/config-keys.js +292 -0
  238. package/dist/i18n/messages/config.d.ts +502 -0
  239. package/dist/i18n/messages/config.js +239 -0
  240. package/dist/i18n/messages/drivers.d.ts +123 -0
  241. package/dist/i18n/messages/drivers.js +124 -0
  242. package/dist/i18n/messages/errors.d.ts +83 -0
  243. package/dist/i18n/messages/errors.js +171 -0
  244. package/dist/i18n/messages/interactive-line.d.ts +61 -0
  245. package/dist/i18n/messages/interactive-line.js +69 -0
  246. package/dist/i18n/messages/interactive-startup.d.ts +103 -0
  247. package/dist/i18n/messages/interactive-startup.js +104 -0
  248. package/dist/i18n/messages/interactive-view.d.ts +140 -0
  249. package/dist/i18n/messages/interactive-view.js +141 -0
  250. package/dist/i18n/messages/interactive.d.ts +493 -0
  251. package/dist/i18n/messages/interactive.js +248 -0
  252. package/dist/i18n/messages/memory.d.ts +123 -0
  253. package/dist/i18n/messages/memory.js +128 -0
  254. package/dist/i18n/messages/panels.d.ts +190 -0
  255. package/dist/i18n/messages/panels.js +189 -0
  256. package/dist/i18n/messages/permissions.d.ts +126 -0
  257. package/dist/i18n/messages/permissions.js +151 -0
  258. package/dist/i18n/messages/plan.d.ts +123 -0
  259. package/dist/i18n/messages/plan.js +124 -0
  260. package/dist/i18n/messages/print.d.ts +86 -0
  261. package/dist/i18n/messages/print.js +91 -0
  262. package/dist/i18n/messages/report.d.ts +391 -0
  263. package/dist/i18n/messages/report.js +490 -0
  264. package/dist/i18n/messages/rewind.d.ts +198 -0
  265. package/dist/i18n/messages/rewind.js +217 -0
  266. package/dist/i18n/messages/session.d.ts +230 -0
  267. package/dist/i18n/messages/session.js +258 -0
  268. package/dist/i18n/messages/settings.d.ts +348 -0
  269. package/dist/i18n/messages/settings.js +336 -0
  270. package/dist/i18n/messages/subcommands-config.d.ts +111 -0
  271. package/dist/i18n/messages/subcommands-config.js +127 -0
  272. package/dist/i18n/messages/subcommands.d.ts +548 -0
  273. package/dist/i18n/messages/subcommands.js +474 -0
  274. package/dist/i18n/messages/trace.d.ts +243 -0
  275. package/dist/i18n/messages/trace.js +238 -0
  276. package/dist/i18n/types.d.ts +15 -0
  277. package/dist/i18n/types.js +7 -0
  278. package/dist/index.d.ts +6 -0
  279. package/dist/index.js +2 -0
  280. package/dist/memory/edit.d.ts +24 -0
  281. package/dist/memory/edit.js +63 -0
  282. package/dist/memory/frontmatter.d.ts +37 -0
  283. package/dist/memory/frontmatter.js +79 -0
  284. package/dist/memory/index.d.ts +28 -0
  285. package/dist/memory/index.js +126 -0
  286. package/dist/memory/lock.d.ts +17 -0
  287. package/dist/memory/lock.js +62 -0
  288. package/dist/memory/paths.d.ts +57 -0
  289. package/dist/memory/paths.js +175 -0
  290. package/dist/memory/report.d.ts +36 -0
  291. package/dist/memory/report.js +86 -0
  292. package/dist/memory/runtime.d.ts +42 -0
  293. package/dist/memory/runtime.js +36 -0
  294. package/dist/memory/secrets.d.ts +8 -0
  295. package/dist/memory/secrets.js +27 -0
  296. package/dist/memory/section.d.ts +28 -0
  297. package/dist/memory/section.js +59 -0
  298. package/dist/memory/store.d.ts +70 -0
  299. package/dist/memory/store.js +284 -0
  300. package/dist/memory/tool.d.ts +31 -0
  301. package/dist/memory/tool.js +94 -0
  302. package/dist/modes/acp/acp-events.js +2 -1
  303. package/dist/modes/acp/acp-server.js +13 -12
  304. package/dist/modes/commands-core.d.ts +17 -0
  305. package/dist/modes/commands-core.js +101 -61
  306. package/dist/modes/image-input.js +20 -6
  307. package/dist/modes/interactive/agent-bar.d.ts +95 -0
  308. package/dist/modes/interactive/agent-bar.js +248 -0
  309. package/dist/modes/interactive/agent-panels.js +27 -26
  310. package/dist/modes/interactive/agent-transcript.d.ts +47 -0
  311. package/dist/modes/interactive/agent-transcript.js +191 -0
  312. package/dist/modes/interactive/agent-ui.d.ts +36 -1
  313. package/dist/modes/interactive/agent-ui.js +180 -14
  314. package/dist/modes/interactive/agent-view.d.ts +72 -0
  315. package/dist/modes/interactive/agent-view.js +281 -0
  316. package/dist/modes/interactive/approval-dialog.js +46 -34
  317. package/dist/modes/interactive/clipboard-paste.d.ts +2 -2
  318. package/dist/modes/interactive/clipboard-paste.js +9 -4
  319. package/dist/modes/interactive/commands.d.ts +22 -1
  320. package/dist/modes/interactive/commands.js +93 -38
  321. package/dist/modes/interactive/completion.js +2 -1
  322. package/dist/modes/interactive/config-panel.d.ts +70 -0
  323. package/dist/modes/interactive/config-panel.js +319 -0
  324. package/dist/modes/interactive/config-ui.d.ts +96 -0
  325. package/dist/modes/interactive/config-ui.js +397 -0
  326. package/dist/modes/interactive/confirm-dialog.d.ts +49 -0
  327. package/dist/modes/interactive/confirm-dialog.js +120 -0
  328. package/dist/modes/interactive/event-notices.js +11 -9
  329. package/dist/modes/interactive/interactive-mode.d.ts +1 -1
  330. package/dist/modes/interactive/interactive-mode.js +25 -22
  331. package/dist/modes/interactive/key-dispatch.d.ts +18 -0
  332. package/dist/modes/interactive/key-dispatch.js +39 -13
  333. package/dist/modes/interactive/line/line-editor.js +2 -1
  334. package/dist/modes/interactive/line/line-mode.d.ts +2 -0
  335. package/dist/modes/interactive/line/line-mode.js +24 -4
  336. package/dist/modes/interactive/line/line-render.js +25 -24
  337. package/dist/modes/interactive/memory-panel.d.ts +64 -0
  338. package/dist/modes/interactive/memory-panel.js +221 -0
  339. package/dist/modes/interactive/message-view.d.ts +4 -2
  340. package/dist/modes/interactive/message-view.js +42 -33
  341. package/dist/modes/interactive/panels.js +39 -31
  342. package/dist/modes/interactive/pickers.d.ts +2 -1
  343. package/dist/modes/interactive/pickers.js +10 -6
  344. package/dist/modes/interactive/plan-command.d.ts +1 -1
  345. package/dist/modes/interactive/plan-command.js +24 -27
  346. package/dist/modes/interactive/plan-dialog.js +18 -17
  347. package/dist/modes/interactive/plan-flow.js +6 -5
  348. package/dist/modes/interactive/rewind-command.d.ts +1 -1
  349. package/dist/modes/interactive/rewind-command.js +18 -16
  350. package/dist/modes/interactive/rewind-flow.d.ts +0 -1
  351. package/dist/modes/interactive/rewind-flow.js +13 -14
  352. package/dist/modes/interactive/rewind-list.js +7 -6
  353. package/dist/modes/interactive/rewind-panel.js +40 -40
  354. package/dist/modes/interactive/rewind-text.d.ts +5 -3
  355. package/dist/modes/interactive/rewind-text.js +48 -38
  356. package/dist/modes/interactive/run-indicator.js +15 -12
  357. package/dist/modes/interactive/session-events.js +3 -2
  358. package/dist/modes/interactive/startup-header.js +22 -23
  359. package/dist/modes/interactive/startup-ui.js +41 -29
  360. package/dist/modes/interactive/status-area.d.ts +2 -0
  361. package/dist/modes/interactive/status-area.js +8 -2
  362. package/dist/modes/interactive/status-bar.js +4 -3
  363. package/dist/modes/interactive/subagent-view.js +9 -7
  364. package/dist/modes/interactive/tasks-report.d.ts +6 -0
  365. package/dist/modes/interactive/tasks-report.js +28 -31
  366. package/dist/modes/interactive/terminal-setup.d.ts +9 -0
  367. package/dist/modes/interactive/terminal-setup.js +23 -0
  368. package/dist/modes/interactive/tool-summary.js +19 -17
  369. package/dist/modes/interactive/tool-view.js +7 -4
  370. package/dist/modes/interactive/trace-view.d.ts +89 -0
  371. package/dist/modes/interactive/trace-view.js +332 -0
  372. package/dist/modes/print/print-mode.js +14 -15
  373. package/dist/modes/rpc/commands.js +7 -3
  374. package/dist/modes/rpc/rpc-mode.js +9 -3
  375. package/dist/modes/session-report.d.ts +2 -0
  376. package/dist/modes/session-report.js +101 -105
  377. package/dist/modes/startup-ui-text.js +11 -6
  378. package/dist/permissions/bypass.d.ts +30 -0
  379. package/dist/permissions/bypass.js +45 -0
  380. package/dist/permissions/memory-class.d.ts +23 -0
  381. package/dist/permissions/memory-class.js +54 -0
  382. package/dist/permissions/modes.d.ts +3 -3
  383. package/dist/permissions/modes.js +21 -16
  384. package/dist/permissions/pipeline.d.ts +1 -1
  385. package/dist/permissions/pipeline.js +9 -2
  386. package/dist/permissions/preview.js +49 -42
  387. package/dist/permissions/rules.js +5 -2
  388. package/dist/permissions/types.d.ts +4 -0
  389. package/dist/plan/store.js +2 -1
  390. package/dist/rpc.d.ts +39 -1
  391. package/dist/rpc.js +3 -0
  392. package/dist/sandbox/bash.js +11 -8
  393. package/dist/sandbox/detect.js +14 -11
  394. package/dist/sdk.d.ts +17 -1
  395. package/dist/sdk.js +29 -7
  396. package/dist/session/export.js +31 -30
  397. package/dist/session/manager.d.ts +1 -1
  398. package/dist/session/manager.js +5 -3
  399. package/dist/session/reuse.js +5 -4
  400. package/dist/session/scan.js +3 -2
  401. package/dist/session/stats-aggregate.d.ts +3 -1
  402. package/dist/session/stats-aggregate.js +5 -1
  403. package/dist/session/stats-index.js +2 -1
  404. package/dist/session/stats-scan.d.ts +4 -1
  405. package/dist/session/stats-scan.js +6 -2
  406. package/dist/session/store.d.ts +11 -0
  407. package/dist/session/store.js +48 -1
  408. package/dist/session/types.d.ts +2 -0
  409. package/dist/skills/builtin.js +2 -1
  410. package/dist/tools/image-file.d.ts +26 -1
  411. package/dist/tools/image-file.js +55 -13
  412. package/dist/tools/presets.d.ts +14 -1
  413. package/dist/tools/presets.js +3 -3
  414. package/dist/tools/registry.js +1 -1
  415. package/dist/tools/truncate.d.ts +1 -1
  416. package/dist/tools/truncate.js +2 -2
  417. package/dist/tools/types.d.ts +17 -1
  418. package/dist/trace/build-index.d.ts +91 -0
  419. package/dist/trace/build-index.js +127 -0
  420. package/dist/trace/build-nodes.d.ts +24 -0
  421. package/dist/trace/build-nodes.js +279 -0
  422. package/dist/trace/build-util.d.ts +43 -0
  423. package/dist/trace/build-util.js +120 -0
  424. package/dist/trace/build.d.ts +82 -0
  425. package/dist/trace/build.js +382 -0
  426. package/dist/trace/detail.d.ts +35 -0
  427. package/dist/trace/detail.js +205 -0
  428. package/dist/trace/flatten.d.ts +69 -0
  429. package/dist/trace/flatten.js +173 -0
  430. package/dist/trace/format.d.ts +47 -0
  431. package/dist/trace/format.js +329 -0
  432. package/dist/trace/html-template.d.ts +19 -0
  433. package/dist/trace/html-template.js +150 -0
  434. package/dist/trace/html.d.ts +104 -0
  435. package/dist/trace/html.js +292 -0
  436. package/dist/trace/preview.d.ts +29 -0
  437. package/dist/trace/preview.js +59 -0
  438. package/dist/trace/query-session.d.ts +14 -0
  439. package/dist/trace/query-session.js +38 -0
  440. package/dist/trace/query.d.ts +55 -0
  441. package/dist/trace/query.js +188 -0
  442. package/dist/trace/session.d.ts +40 -0
  443. package/dist/trace/session.js +168 -0
  444. package/dist/trace/types.d.ts +243 -0
  445. package/dist/trace/types.js +13 -0
  446. package/dist/tui/components/editor-paste.d.ts +2 -0
  447. package/dist/tui/components/editor-paste.js +6 -3
  448. package/dist/tui/components/editor.js +2 -2
  449. package/dist/tui/components/loader.d.ts +3 -0
  450. package/dist/tui/components/loader.js +14 -0
  451. package/dist/tui/components/settings-list.d.ts +61 -0
  452. package/dist/tui/components/settings-list.js +135 -0
  453. package/dist/tui/keybindings.d.ts +6 -1
  454. package/dist/tui/keybindings.js +18 -6
  455. package/dist/tui.d.ts +1 -0
  456. package/dist/tui.js +2 -0
  457. package/docs/en/host-api.md +167 -0
  458. package/docs/en/permissions.md +214 -0
  459. package/docs/en/providers.md +625 -0
  460. package/docs/en/rpc.md +361 -0
  461. package/docs/en/sessions.md +219 -0
  462. package/docs/en/tui.md +527 -0
  463. package/docs/host-api.md +18 -17
  464. package/docs/memory.md +172 -0
  465. package/docs/permissions.md +3 -2
  466. package/docs/providers.md +67 -1
  467. package/docs/rpc.md +31 -3
  468. package/docs/session-format.md +8 -2
  469. package/docs/sessions.md +29 -1
  470. package/docs/tui.md +189 -21
  471. package/package.json +8 -3
@@ -1,28 +1,46 @@
1
1
  /**
2
2
  * `ama auth set|list|remove <provider>`(设计 §3.5、§16.2 B5 验收)。[B5]
3
+ * `ama auth login|logout|status chatgpt`(docs/wave6-plan.md §4.2)。[W6-O] 实现在 auth/chatgpt/cli.ts。
3
4
  *
4
5
  * - set:key 从 stdin 读取(TTY 下不回显),不经命令行参数,避免进 shell 历史;写 auth.json 0600。
5
- * - list:只列供应商与 key 形态(字面量 / `!command` / `$ENV` 引用),从不输出 key。
6
+ * - list:只列供应商与 key 形态(字面量 / `!command` / `$ENV` 引用 / oauth 的 flavor 与计划),从不输出 key 或 token。
6
7
  * - `--auth-file <path>` 改变目标文件(缺省 `<configDir>/auth.json`)。
7
8
  */
8
9
  import { resolve } from "node:path";
10
+ import { runLogin, runLogout, runStatus } from "../../auth/chatgpt/cli.js";
9
11
  import { PROVIDER_ID_PATTERN, defaultAuthFilePath, describeAuthFile, readAuthFile, removeAuthKey, setAuthKey, } from "../../config/auth-file.js";
10
12
  import { resolveConfigDir } from "../../config/paths.js";
13
+ import { msg } from "../../i18n/index.js";
11
14
  import { parseSubArgs, UsageError } from "../args.js";
12
15
  import { ExitCode } from "../exit-codes.js";
13
- export const AUTH_USAGE = `用法:ama auth set <provider> [--auth-file <文件>] 从 stdin 读取 key
14
- ama auth list [--auth-file <文件>]
15
- ama auth remove <provider> [--auth-file <文件>]
16
- `;
17
- const KIND_TEXT = { literal: "key", command: "!命令", "env-ref": "环境变量引用" };
16
+ /** 用法文本(按当前语言)。 */
17
+ export function authUsage() {
18
+ return msg().auth.usage;
19
+ }
20
+ function kindText(entry) {
21
+ const kind = msg().auth.kind;
22
+ switch (entry.kind) {
23
+ case "literal":
24
+ return kind.literal;
25
+ case "command":
26
+ return kind.command;
27
+ case "env-ref":
28
+ return kind.envRef;
29
+ case "oauth":
30
+ return entry.flavor === undefined
31
+ ? kind.oauth
32
+ : `${kind.oauth} · ${msg().auth.oauthSummary(entry.flavor, entry.plan, entry.needsLogin === true)}`;
33
+ }
34
+ }
18
35
  function providerArg(positionals, action) {
36
+ const m = msg().auth;
19
37
  const provider = positionals[1];
20
38
  if (provider === undefined)
21
- throw new UsageError(`ama auth ${action} 需要 <provider>`);
39
+ throw new UsageError(m.needProvider(action));
22
40
  if (positionals.length > 2)
23
- throw new UsageError(`多余的参数:${positionals.slice(2).join(" ")}`);
41
+ throw new UsageError(m.extraArgs(positionals.slice(2).join(" ")));
24
42
  if (!PROVIDER_ID_PATTERN.test(provider))
25
- throw new UsageError(`供应商 id 不合法:${provider}`);
43
+ throw new UsageError(m.badProvider(provider));
26
44
  return provider;
27
45
  }
28
46
  /** 取第一行并去掉首尾空白;stdin 为空返回 ""。 */
@@ -30,40 +48,52 @@ export function extractKey(raw) {
30
48
  const line = raw.split(/\r?\n/).find((l) => l.trim() !== "") ?? "";
31
49
  return line.trim();
32
50
  }
33
- export async function runAuth(argv, io) {
34
- const { positionals, values, flags } = parseSubArgs(argv, ["auth-file"]);
51
+ export async function runAuth(argv, io, deps = {}) {
52
+ const m = msg().auth;
53
+ const { positionals, values, flags } = parseSubArgs(argv, ["auth-file", "flavor", "port"], ["paste", "device", "no-browser", "yes"]);
35
54
  const action = positionals[0];
36
55
  if (flags.has("help") || action === undefined) {
37
- io.stdout(AUTH_USAGE);
56
+ io.stdout(authUsage());
38
57
  return flags.has("help") ? ExitCode.Ok : ExitCode.Usage;
39
58
  }
40
59
  const explicit = values.get("auth-file");
41
60
  const path = explicit !== undefined
42
61
  ? resolve(io.cwd, explicit)
43
62
  : defaultAuthFilePath(resolveConfigDir({ env: io.env }));
63
+ const loginOnly = ["flavor", "port"].filter((name) => values.has(name));
64
+ const loginFlags = ["paste", "device", "no-browser", "yes"].filter((name) => flags.has(name));
65
+ if (action !== "login" && [...loginOnly, ...loginFlags].length > 0)
66
+ throw new UsageError(m.extraArgs([...loginOnly, ...loginFlags].map((n) => `--${n}`).join(" ")));
67
+ const cli = { positionals, values, flags, path };
44
68
  switch (action) {
69
+ case "login":
70
+ return runLogin(cli, io, deps);
71
+ case "logout":
72
+ return runLogout(cli, io, deps);
73
+ case "status":
74
+ return runStatus(cli, io, deps);
45
75
  case "set": {
46
76
  const provider = providerArg(positionals, "set");
47
77
  if (io.stdinIsTTY)
48
- io.stderr(`输入 ${provider} 的 API key(不回显),回车结束:`);
78
+ io.stderr(m.setPrompt(provider));
49
79
  const key = extractKey(await io.readStdin());
50
80
  if (io.stdinIsTTY)
51
81
  io.stderr("\n");
52
82
  if (key === "")
53
- throw new UsageError("没有从 stdin 读到 key");
83
+ throw new UsageError(m.noKeyFromStdin);
54
84
  setAuthKey(path, provider, key);
55
- io.stdout(`已保存 ${provider} 的 key → ${path}(0600)\n`);
85
+ io.stdout(`${m.saved(provider, path)}\n`);
56
86
  return ExitCode.Ok;
57
87
  }
58
88
  case "list": {
59
89
  if (positionals.length > 1)
60
- throw new UsageError(`多余的参数:${positionals.slice(1).join(" ")}`);
90
+ throw new UsageError(m.extraArgs(positionals.slice(1).join(" ")));
61
91
  const result = readAuthFile(path);
62
92
  for (const warning of result.warnings)
63
- io.stderr(`ama: 警告:${warning}\n`);
93
+ io.stderr(`${m.warning(warning)}\n`);
64
94
  const entries = describeAuthFile(result.file);
65
95
  if (entries.length === 0) {
66
- io.stdout(`${path}:没有保存的 key\n`);
96
+ io.stdout(`${m.listEmpty(path)}\n`);
67
97
  return ExitCode.Ok;
68
98
  }
69
99
  io.stdout(`${path}\n`);
@@ -72,20 +102,20 @@ export async function runAuth(argv, io) {
72
102
  entry.hasBaseUrl ? "baseUrl" : undefined,
73
103
  entry.envNames.length > 0 ? `env ${entry.envNames.join(",")}` : undefined,
74
104
  ].filter((x) => x !== undefined);
75
- io.stdout(` ${entry.provider.padEnd(20)} ${KIND_TEXT[entry.kind]}${extra.length > 0 ? ` · ${extra.join(" · ")}` : ""}\n`);
105
+ io.stdout(` ${entry.provider.padEnd(20)} ${kindText(entry)}${extra.length > 0 ? ` · ${extra.join(" · ")}` : ""}\n`);
76
106
  }
77
107
  return ExitCode.Ok;
78
108
  }
79
109
  case "remove": {
80
110
  const provider = providerArg(positionals, "remove");
81
111
  if (removeAuthKey(path, provider)) {
82
- io.stdout(`已删除 ${provider} 的 key(${path})\n`);
112
+ io.stdout(`${m.removed(provider, path)}\n`);
83
113
  return ExitCode.Ok;
84
114
  }
85
- io.stderr(`ama: ${path} 中没有 ${provider}\n`);
115
+ io.stderr(`${m.notFound(path, provider)}\n`);
86
116
  return ExitCode.RuntimeError;
87
117
  }
88
118
  default:
89
- throw new UsageError(`未知的 auth 子命令:${action}`);
119
+ throw new UsageError(m.unknownAction(action));
90
120
  }
91
121
  }
@@ -0,0 +1,21 @@
1
+ /**
2
+ * `ama config get | set | unset | list` (docs/wave6-plan.md §6.4, D24-D26). [W6-S]
3
+ *
4
+ * Thin layer over config/edit.ts (the `/config` panel uses the same core):
5
+ * - `get <key> [--json]`: effective value, source layer and apply tier;
6
+ * - `set <key> <value> [--project] [--json-value] [--yes]`: write one key to the user file (or the
7
+ * project file, tighten only); lists and objects need `--json-value`; `permission.mode full-auto`
8
+ * asks once on a TTY and needs `--yes` otherwise;
9
+ * - `unset <key> [--project]`;
10
+ * - `list [prefix] [--json] [--all]`: panel settings (or every settable key with `--all`).
11
+ * Unknown keys, invalid values and refused project writes exit 3 (`ExitCode.Config`). `get` / `list`
12
+ * never create the config directory. `--profile <file>` adds the host profile layer to the view.
13
+ */
14
+ import type { CliIo } from "../deps.js";
15
+ export declare const CONFIG_EDIT_ACTIONS: readonly ["get", "set", "unset", "list"];
16
+ export type ConfigEditAction = (typeof CONFIG_EDIT_ACTIONS)[number];
17
+ export interface ConfigSetDeps {
18
+ /** Ask before persisting Bypass (TTY only); default: the CLI y/N prompt. */
19
+ confirm?(question: string): Promise<boolean>;
20
+ }
21
+ export declare function runConfigEdit(action: ConfigEditAction, argv: readonly string[], io: CliIo, deps?: ConfigSetDeps): Promise<number>;
@@ -0,0 +1,137 @@
1
+ /**
2
+ * `ama config get | set | unset | list` (docs/wave6-plan.md §6.4, D24-D26). [W6-S]
3
+ *
4
+ * Thin layer over config/edit.ts (the `/config` panel uses the same core):
5
+ * - `get <key> [--json]`: effective value, source layer and apply tier;
6
+ * - `set <key> <value> [--project] [--json-value] [--yes]`: write one key to the user file (or the
7
+ * project file, tighten only); lists and objects need `--json-value`; `permission.mode full-auto`
8
+ * asks once on a TTY and needs `--yes` otherwise;
9
+ * - `unset <key> [--project]`;
10
+ * - `list [prefix] [--json] [--all]`: panel settings (or every settable key with `--all`).
11
+ * Unknown keys, invalid values and refused project writes exit 3 (`ExitCode.Config`). `get` / `list`
12
+ * never create the config directory. `--profile <file>` adds the host profile layer to the view.
13
+ */
14
+ import { msg } from "../../i18n/index.js";
15
+ import { assertSettable, formatSettingValue, getConfigValue, parseValue, readSnapshot, setConfigValue, } from "../../config/edit.js";
16
+ import { existsSync } from "node:fs";
17
+ import { join } from "node:path";
18
+ import { initConfigDir } from "../../config/init.js";
19
+ import { CONFIG_FILE, resolveConfigDir } from "../../config/paths.js";
20
+ import { loadProfile } from "../../config/profile.js";
21
+ import { settableKeys, settingSpec, settingsRegistry } from "../../config/settings-registry.js";
22
+ import { confirmContinue } from "../choice-prompt.js";
23
+ import { parseSubArgs, UsageError } from "../args.js";
24
+ import { ExitCode } from "../exit-codes.js";
25
+ export const CONFIG_EDIT_ACTIONS = ["get", "set", "unset", "list"];
26
+ function layerInput(io, profilePath) {
27
+ const input = {
28
+ configDir: resolveConfigDir({ env: io.env }),
29
+ cwd: io.cwd,
30
+ env: io.env,
31
+ };
32
+ if (profilePath !== undefined) {
33
+ const profile = loadProfile(profilePath, io.cwd);
34
+ input.profile = { config: profile.config };
35
+ input.hasProfile = true;
36
+ }
37
+ return input;
38
+ }
39
+ function applyText(key) {
40
+ const spec = settingSpec(key);
41
+ const s = msg().settings;
42
+ if (spec === undefined)
43
+ return s.cli.applyNone;
44
+ return spec.prefix === true ? `${s.apply[spec.apply]} · ${s.prefixTag}` : s.apply[spec.apply];
45
+ }
46
+ function jsonRow(value) {
47
+ const spec = settingSpec(value.key);
48
+ return {
49
+ key: value.key,
50
+ value: value.value ?? null,
51
+ source: value.source,
52
+ ...(value.envName !== undefined ? { env: value.envName } : {}),
53
+ apply: spec?.apply ?? null,
54
+ prefix: spec?.prefix === true,
55
+ project: spec?.project ?? null,
56
+ };
57
+ }
58
+ function textRow(value) {
59
+ const source = value.envName !== undefined ? `env ${value.envName}` : value.source;
60
+ return msg().settings.cli.getLine(value.key, formatSettingValue(value.value), source, applyText(value.key));
61
+ }
62
+ function scopeLabel(scope) {
63
+ return msg().settings.scope[scope];
64
+ }
65
+ function report(io, result, unset) {
66
+ const s = msg().settings;
67
+ const value = formatSettingValue(result.after.value);
68
+ io.stdout(`${unset
69
+ ? s.unsetDone(result.key, value, scopeLabel(result.scope))
70
+ : s.setDone(result.key, value, scopeLabel(result.scope))}\n`);
71
+ if (result.overriddenBy !== undefined) {
72
+ const by = result.after.envName ?? result.overriddenBy;
73
+ io.stdout(`${s.stillOverridden(result.key, by)}\n`);
74
+ }
75
+ }
76
+ /** Confirm persisting `permission.mode full-auto`: TTY asks, otherwise `--yes` is required. */
77
+ async function confirmBypass(io, yes, deps) {
78
+ const s = msg().settings.cli;
79
+ if (yes)
80
+ return true;
81
+ if (!io.stdinIsTTY) {
82
+ io.stderr(`ama: ${s.needYes}\n`);
83
+ return false;
84
+ }
85
+ const ask = deps.confirm ?? ((question) => confirmContinue({ question, env: io.env }));
86
+ if (await ask(s.confirmBypass))
87
+ return true;
88
+ io.stderr(`${s.cancelled}\n`);
89
+ return false;
90
+ }
91
+ export async function runConfigEdit(action, argv, io, deps = {}) {
92
+ const { positionals, values, flags } = parseSubArgs(argv, ["profile"], ["json", "project", "json-value", "yes", "all"]);
93
+ const s = msg().settings;
94
+ if (flags.has("help")) {
95
+ io.stdout(s.cli.usage);
96
+ return ExitCode.Ok;
97
+ }
98
+ const input = layerInput(io, values.get("profile"));
99
+ const scope = flags.has("project") ? "project" : "user";
100
+ if (action === "list") {
101
+ const snapshot = readSnapshot(input);
102
+ const prefix = positionals[0] ?? "";
103
+ const keys = (flags.has("all") ? settableKeys() : settingsRegistry().map((spec) => spec.key)).filter((key) => key.startsWith(prefix));
104
+ const rows = keys.map((key) => getConfigValue(snapshot, key));
105
+ if (flags.has("json"))
106
+ io.stdout(`${JSON.stringify(rows.map(jsonRow), null, 2)}\n`);
107
+ else
108
+ io.stdout(`${[s.cli.listHeader, ...rows.map((r) => ` ${textRow(r)}`)].join("\n")}\n`);
109
+ return ExitCode.Ok;
110
+ }
111
+ const key = positionals[0];
112
+ if (key === undefined)
113
+ throw new UsageError(s.cli.missingKey);
114
+ if (action === "get") {
115
+ assertSettable(key);
116
+ const value = getConfigValue(readSnapshot(input), key);
117
+ io.stdout(flags.has("json") ? `${JSON.stringify(jsonRow(value), null, 2)}\n` : `${textRow(value)}\n`);
118
+ return ExitCode.Ok;
119
+ }
120
+ if (action === "unset") {
121
+ report(io, setConfigValue({ ...input, scope, key, value: undefined }), true);
122
+ return ExitCode.Ok;
123
+ }
124
+ const raw = positionals.slice(1).join(" ");
125
+ if (positionals.length < 2)
126
+ throw new UsageError(s.cli.missingValue);
127
+ const value = parseValue(key, raw, flags.has("json-value"));
128
+ if (key === "permission.mode" && value === "full-auto" && scope === "user") {
129
+ if (!(await confirmBypass(io, flags.has("yes"), deps)))
130
+ return ExitCode.Config;
131
+ }
132
+ // first write to a fresh config dir: lay out config.json + config.schema.json like `ama init`
133
+ if (scope === "user" && !existsSync(join(input.configDir, CONFIG_FILE)))
134
+ initConfigDir(input.configDir);
135
+ report(io, setConfigValue({ ...input, scope, key, value }), value === undefined);
136
+ return ExitCode.Ok;
137
+ }
@@ -14,7 +14,8 @@
14
14
  import { type AmaConfig, type CodemodeMode } from "../../config/types.js";
15
15
  import type { Api, ProviderRegistryApi } from "../../ai/types.js";
16
16
  import type { CliIo, RuntimeDeps } from "../deps.js";
17
- export declare const CONFIG_USAGE = "\u7528\u6CD5\uFF1Aama config show [--json] [--profile <\u6587\u4EF6>] [--auth-file <\u6587\u4EF6>]\n [--tools-preset <\u540D>] [--codemode off|on|only]\n ama config path \u914D\u7F6E\u76EE\u5F55\u3001\u6570\u636E\u76EE\u5F55\u4E0E\u5404\u6587\u4EF6\u8DEF\u5F84\n ama config edit \u7528 $VISUAL / $EDITOR \u6253\u5F00 config.json\uFF08\u6CA1\u6709\u7F16\u8F91\u5668\u65F6\u6253\u5370\u8DEF\u5F84\uFF09\n";
17
+ /** `ama config --help` 的前半(get / set 等编辑子命令的用法接在后面)。 */
18
+ export declare const configUsage: () => string;
18
19
  type Layer = {
19
20
  name: "default" | "user" | "profile" | "project" | "cli";
20
21
  label: string;
@@ -34,26 +34,30 @@ import { ExitCode } from "../exit-codes.js";
34
34
  import { buildRegistry, loadUserLevel } from "./context.js";
35
35
  import { osSandboxStatus } from "../../sandbox/detect.js";
36
36
  import { resolveBashSandbox } from "../../sandbox/bash.js";
37
- export const CONFIG_USAGE = `用法:ama config show [--json] [--profile <文件>] [--auth-file <文件>]
38
- [--tools-preset <名>] [--codemode off|on|only]
39
- ama config path 配置目录、数据目录与各文件路径
40
- ama config edit 用 $VISUAL / $EDITOR 打开 config.json(没有编辑器时打印路径)
41
- `;
37
+ import { msg } from "../../i18n/index.js";
38
+ import { padToWidth, visibleWidth } from "../../tui/ansi.js";
39
+ import { CONFIG_EDIT_ACTIONS, runConfigEdit } from "./config-set.js";
40
+ const isEditAction = (value) => CONFIG_EDIT_ACTIONS.includes(value);
41
+ /** `ama config --help` 的前半(get / set 等编辑子命令的用法接在后面)。 */
42
+ export const configUsage = () => msg().subcommands.configShow.usage;
42
43
  /** `ama config path`:目录与文件路径,标出是否存在。 */
43
44
  function showPaths(io) {
44
45
  const configDir = resolveConfigDir({ env: io.env });
45
46
  const dataDir = resolveDataDir({ env: io.env });
46
- const mark = (path) => `${path}${existsSync(path) ? "" : " (不存在)"}`;
47
+ const m = msg().subcommands.configShow;
48
+ const mark = (path) => `${path}${existsSync(path) ? "" : m.missing}`;
49
+ const width = Math.max(...[m.configDir, m.dataDir, m.projectLevel].map(visibleWidth)) + 2;
50
+ const label = (text) => padToWidth(text, width);
47
51
  const lines = [
48
- `配置目录 ${mark(configDir)}`,
52
+ `${label(m.configDir)}${mark(configDir)}`,
49
53
  ` config.json ${mark(join(configDir, CONFIG_FILE))}`,
50
54
  ` config.schema.json ${mark(join(configDir, CONFIG_SCHEMA_FILE))}`,
51
55
  ` auth.json ${mark(join(configDir, AUTH_FILE))}`,
52
56
  ` hooks.json ${mark(join(configDir, HOOKS_FILE))}`,
53
- `数据目录 ${mark(dataDir)}`,
57
+ `${label(m.dataDir)}${mark(dataDir)}`,
54
58
  ` sessions/ ${mark(join(dataDir, "sessions"))}`,
55
59
  ` models-dev.json ${mark(modelsDevCachePath(dataDir))}`,
56
- `项目级 ${mark(projectFile(io.cwd, CONFIG_FILE))}`,
60
+ `${label(m.projectLevel)}${mark(projectFile(io.cwd, CONFIG_FILE))}`,
57
61
  ];
58
62
  io.stdout(`${lines.join("\n")}\n`);
59
63
  return ExitCode.Ok;
@@ -66,13 +70,13 @@ function editConfig(io) {
66
70
  initConfigDir(configDir);
67
71
  const editor = (io.env["VISUAL"] ?? io.env["EDITOR"] ?? "").trim();
68
72
  if (editor === "") {
69
- io.stdout(`${path}\n(没有设置 $VISUAL / $EDITOR,请用编辑器打开上面的文件)\n`);
73
+ io.stdout(msg().subcommands.configShow.noEditor(path));
70
74
  return ExitCode.Ok;
71
75
  }
72
76
  const quoted = process.platform === "win32" ? `"${path}"` : `'${path.replace(/'/g, `'\\''`)}'`;
73
77
  const result = spawnSync(`${editor} ${quoted}`, { stdio: "inherit", shell: true });
74
78
  if (result.error !== undefined || result.status !== 0) {
75
- io.stderr(`ama: 编辑器退出异常(${editor});文件在 ${path}\n`);
79
+ io.stderr(msg().subcommands.configShow.editorFailed(editor, path));
76
80
  return ExitCode.RuntimeError;
77
81
  }
78
82
  return ExitCode.Ok;
@@ -111,19 +115,20 @@ function display(path, value) {
111
115
  export async function describeModel(config, registry) {
112
116
  if (config.defaultModel !== undefined)
113
117
  return { ref: config.defaultModel, reason: "config.defaultModel" };
118
+ const m = msg().subcommands.configShow;
114
119
  if (registry === undefined)
115
- return { ref: undefined, reason: "注册表未装配" };
120
+ return { ref: undefined, reason: m.registryMissing };
116
121
  const picked = await pickDefaultModel(registry);
117
122
  if (picked === undefined)
118
123
  return { ref: undefined, reason: noModelGuidance(registry) };
119
124
  const ref = `${picked.provider.id}/${picked.model.id}`;
120
125
  if (picked.via === "local")
121
- return { ref, reason: `零配置:本地 ${picked.provider.id} 可达;${picked.rule}` };
126
+ return { ref, reason: m.zeroConfigLocal(picked.provider.id, picked.rule) };
122
127
  const key = await registry.resolveApiKey(picked.provider.id);
123
128
  const origin = key.origin !== undefined ? ` ${key.origin}` : "";
124
129
  return {
125
130
  ref,
126
- reason: `零配置:${picked.provider.id} 有 key(${key.source}${origin});${picked.rule}`,
131
+ reason: m.zeroConfigKey(picked.provider.id, `${key.source}${origin}`, picked.rule),
127
132
  };
128
133
  }
129
134
  /** config 里出现的供应商 + baseUrl 来自环境变量的内置供应商。 */
@@ -170,9 +175,10 @@ export function describeProviders(config, registry) {
170
175
  function providerLines(providers) {
171
176
  if (providers.length === 0)
172
177
  return [];
173
- const lines = ["", "供应商:"];
178
+ const m = msg().subcommands.configShow;
179
+ const lines = ["", m.providersHeading];
174
180
  for (const p of providers) {
175
- const env = p.baseUrlEnv !== undefined ? `(baseUrl 来自环境变量 ${p.baseUrlEnv})` : "";
181
+ const env = p.baseUrlEnv !== undefined ? m.baseUrlFromEnv(p.baseUrlEnv) : "";
176
182
  lines.push(` ${p.id} ${p.api} ${p.baseUrl}${env}`);
177
183
  for (const c of p.channels ?? [])
178
184
  lines.push(` @${c.name} ${c.api} ${c.baseUrl}`);
@@ -185,7 +191,8 @@ function providerLines(providers) {
185
191
  return lines;
186
192
  }
187
193
  function layersOf(level, project, effective, cli) {
188
- const layers = [{ name: "default", label: "内置缺省", value: DISPLAY_DEFAULTS }];
194
+ const m = msg().subcommands.configShow;
195
+ const layers = [{ name: "default", label: m.layerDefault, value: DISPLAY_DEFAULTS }];
189
196
  const user = loadConfigFile("config", level.userConfigPath)?.value;
190
197
  if (user !== undefined)
191
198
  layers.push({ name: "user", label: level.userConfigPath, value: user });
@@ -209,7 +216,7 @@ function layersOf(level, project, effective, cli) {
209
216
  layers.push({ name: "project", label: ".ama/config.json", value: unflatten(accepted) });
210
217
  }
211
218
  if (cli !== undefined && Object.keys(cli).length > 0)
212
- layers.push({ name: "cli", label: "命令行", value: cli });
219
+ layers.push({ name: "cli", label: m.layerCli, value: cli });
213
220
  return layers;
214
221
  }
215
222
  function unflatten(flat) {
@@ -243,14 +250,15 @@ export function sourcesOf(effective, layers) {
243
250
  export function describeCodemode(config, nodeVersion) {
244
251
  const capability = nodeVersion === undefined ? sandboxCapabilityFor(config) : detectSandboxCapability(nodeVersion);
245
252
  const resolved = resolveCodemodeMode(config, capability.strict);
253
+ const m = msg().subcommands.configShow;
246
254
  const sandbox = capability.nodeMajor >= 25
247
- ? `Node ${capability.nodeMajor} 网络已隔离`
255
+ ? m.sandboxIsolated(capability.nodeMajor)
248
256
  : capability.strict
249
- ? `Node ${capability.nodeMajor} 网络由操作系统沙箱 ${capability.os.kind} 隔离`
250
- : `Node ${capability.nodeMajor} < 25 网络未隔离`;
257
+ ? m.sandboxOs(capability.nodeMajor, capability.os.kind)
258
+ : m.sandboxNone(capability.nodeMajor);
251
259
  const reason = resolved.source === "config"
252
- ? `codemode.mode 显式设置(${sandbox})`
253
- : `跟随预设 ${resolved.preset}(${sandbox})`;
260
+ ? m.codemodeExplicit(sandbox)
261
+ : m.codemodeFollowsPreset(resolved.preset, sandbox);
254
262
  const out = {
255
263
  mode: resolved.mode,
256
264
  source: resolved.source,
@@ -270,7 +278,7 @@ function presetAliasNotes(layers) {
270
278
  for (const layer of layers) {
271
279
  const preset = layer.value?.tools?.preset;
272
280
  if (preset !== undefined && Object.hasOwn(TOOLS_PRESET_ALIASES, preset))
273
- notes.push(`${layer.name}(${layer.label})的 tools.preset 写的是旧名 ${preset},规范名 ${canonicalPreset(preset)}`);
281
+ notes.push(msg().subcommands.configShow.presetAlias(layer.name, layer.label, preset, canonicalPreset(preset)));
274
282
  }
275
283
  return notes;
276
284
  }
@@ -279,21 +287,26 @@ function choice(name, value, all) {
279
287
  return undefined;
280
288
  if (all.includes(value))
281
289
  return value;
282
- throw new UsageError(`--${name} 的取值应为 ${all.join(" | ")}(收到 ${value})`);
290
+ throw new UsageError(msg().subcommands.common.invalidChoice(`--${name}`, all, value));
283
291
  }
284
292
  export async function runConfig(argv, io, deps) {
293
+ // [W6-S] get / set / unset / list(config-set.ts)
294
+ const edit = argv.findIndex((a) => !a.startsWith("-"));
295
+ if (edit !== -1 && isEditAction(argv[edit]))
296
+ return runConfigEdit(argv[edit], [...argv.slice(0, edit), ...argv.slice(edit + 1)], io);
285
297
  const { positionals, values, flags } = parseSubArgs(argv, ["profile", "auth-file", "tools-preset", "codemode"], ["json"]);
286
298
  const action = positionals[0] ?? "show";
287
299
  if (flags.has("help")) {
288
- io.stdout(CONFIG_USAGE);
300
+ io.stdout(`${configUsage()}${msg().settings.cli.usage}`);
289
301
  return ExitCode.Ok;
290
302
  }
291
303
  if (action === "path")
292
304
  return showPaths(io);
293
305
  if (action === "edit")
294
306
  return editConfig(io);
307
+ const m = msg().subcommands.configShow;
295
308
  if (action !== "show")
296
- throw new UsageError(`未知的 config 子命令:${action}`);
309
+ throw new UsageError(m.unknownAction(action));
297
310
  const cli = {};
298
311
  const presetFlag = choice("tools-preset", values.get("tools-preset"), TOOLS_PRESET_INPUTS);
299
312
  if (presetFlag !== undefined)
@@ -338,7 +351,7 @@ export async function runConfig(argv, io, deps) {
338
351
  rows.push({
339
352
  path: "codemode.mode",
340
353
  value: codemode.mode,
341
- source: `default(${codemode.reason})`,
354
+ source: m.defaultSource(codemode.reason),
342
355
  });
343
356
  rows.sort((a, b) => (a.path < b.path ? -1 : a.path > b.path ? 1 : 0));
344
357
  if (flags.has("json")) {
@@ -350,9 +363,9 @@ export async function runConfig(argv, io, deps) {
350
363
  io.stdout(`${JSON.stringify({ model, providers, tools: preset.builtin, preset: preset.preset, codemode, bashSandbox: { active: bashSandbox.active, detail: bashSandbox.detail }, entries, layers: layers.map((l) => ({ name: l.name, file: l.label })), notes, warnings }, null, 2)}\n`);
351
364
  return ExitCode.Ok;
352
365
  }
353
- const lines = ["生效配置(来源:default 内置 ← user ← profile ← project 只能收紧 ← cli)"];
366
+ const lines = [m.heading];
354
367
  for (const layer of layers.slice(1))
355
- lines.push(` ${layer.name}:${layer.label}`);
368
+ lines.push(m.layerLine(layer.name, layer.label));
356
369
  lines.push("");
357
370
  const texts = rows.map((row) => [`${row.path} = ${display(row.path, row.value)}`, row.source]);
358
371
  const width = Math.min(60, Math.max(...texts.map(([text]) => (text ?? "").length)));
@@ -360,16 +373,17 @@ export async function runConfig(argv, io, deps) {
360
373
  lines.push(` ${(text ?? "").padEnd(width)} ${source}`);
361
374
  lines.push(...providerLines(providers));
362
375
  lines.push("");
363
- lines.push(`模型:${model.ref ?? "(无)"} ${model.reason}`);
364
- lines.push(`工具:${preset.builtin.join(", ")}(预设 ${preset.preset},codemode ${preset.codemode})`);
365
- lines.push(`codemode:${codemode.mode} ${codemode.reason}`);
376
+ lines.push(m.model(model.ref, model.reason));
377
+ lines.push(m.tools(preset.builtin.join(", "), preset.preset, preset.codemode));
378
+ lines.push(m.codemode(codemode.mode, codemode.reason));
366
379
  if (codemode.unavailable !== undefined)
367
380
  lines.push(` ${codemode.unavailable}`);
368
- lines.push(`bash 沙箱:${bashSandbox.detail}`);
381
+ lines.push(m.bashSandbox(bashSandbox.detail));
369
382
  for (const note of notes)
370
- lines.push(`提示:${note}`);
371
- for (const warning of [...warnings, ...preset.warnings])
372
- lines.push(`警告:${warning}`);
383
+ lines.push(m.note(note));
384
+ const presetWarnings = preset.warnings.map((w) => msg().session.codemode.presetWarning(w));
385
+ for (const warning of [...warnings, ...presetWarnings])
386
+ lines.push(m.warning(warning));
373
387
  io.stdout(`${lines.join("\n")}\n`);
374
388
  return ExitCode.Ok;
375
389
  }
@@ -7,5 +7,6 @@
7
7
  * [W3-B12] baseUrl 来自 `OPENAI_BASE_URL` / `ANTHROPIC_BASE_URL` 时在 key 行后标出变量与地址。
8
8
  */
9
9
  import type { CliIo, RuntimeDeps } from "../deps.js";
10
- export declare const DOCTOR_USAGE = "\u7528\u6CD5\uFF1Aama doctor [--profile <\u6587\u4EF6>] [--auth-file <\u6587\u4EF6>] [--trust | --no-trust]\n";
10
+ /** 用法(随界面语言)。 */
11
+ export declare function doctorUsage(): string;
11
12
  export declare function runDoctor(argv: readonly string[], io: CliIo, deps: RuntimeDeps | undefined): Promise<number>;