@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
@@ -0,0 +1,189 @@
1
+ /**
2
+ * `ama memory list|show|edit|rm|path|enable|disable`(docs/wave6-plan.md §3.5)。[W6-M]
3
+ *
4
+ * - 作用域按用户级配置(`memory.scopes`,缺省 user + project);项目作用域以 cwd 定位,需项目已受信任
5
+ * (trust.json 记录),否则跳过并提示。`memory.enabled` 为 false 时照样能看、能改(条目保留但不使用)。
6
+ * - `list` / `show` / `path` 只读;`edit` 在 `$EDITOR` 里改副本,存回时同样查凭据与上限;`rm` 在终端里确认,
7
+ * 非终端需 `--yes`。
8
+ * - `enable` / `disable` 经 `config/edit.ts`(W6-S)改用户级 `config.json` 的 `memory.enabled`(校验、原子写 + `.bak`)。
9
+ */
10
+ import { loadConfigFile } from "../../config/load.js";
11
+ import { CONFIG_FILE, resolveConfigDir, resolveDataDir, userFile } from "../../config/paths.js";
12
+ import { findTrustEntry, readTrustFile } from "../../config/trust.js";
13
+ import { ConfigEditError, setConfigValue } from "../../config/edit.js";
14
+ import { msg } from "../../i18n/index.js";
15
+ import { editMemory } from "../../memory/edit.js";
16
+ import { logicalPath, projectRootOf, standaloneRoots, } from "../../memory/paths.js";
17
+ import { findOne, listText, memoryErrorText, scopeSummaries } from "../../memory/report.js";
18
+ import { DEFAULT_MEMORY_LIMITS, MemoryStore } from "../../memory/store.js";
19
+ import { editExternally } from "../../modes/interactive/external-editor.js";
20
+ import { parseSubArgs, UsageError } from "../args.js";
21
+ import { confirmContinue } from "../choice-prompt.js";
22
+ import { ExitCode } from "../exit-codes.js";
23
+ function load(io) {
24
+ const configDir = resolveConfigDir({ env: io.env });
25
+ const dataDir = resolveDataDir({ env: io.env });
26
+ const configPath = userFile({ configDir }, CONFIG_FILE);
27
+ const memory = loadConfigFile("config", configPath)?.value.memory ?? {};
28
+ const scopes = memory.scopes ?? ["user", "project"];
29
+ const notes = [];
30
+ let projectRoot;
31
+ if (scopes.includes("project")) {
32
+ const trusted = findTrustEntry(readTrustFile(configDir).entries, io.cwd)?.trusted === true;
33
+ if (trusted)
34
+ projectRoot = projectRootOf(io.cwd);
35
+ else
36
+ notes.push(msg().memory.cli.untrusted(io.cwd));
37
+ }
38
+ if (memory.enabled !== true)
39
+ notes.push(msg().memory.cli.disabledNote);
40
+ const roots = standaloneRoots({ dataDir, projectRoot, user: scopes.includes("user") });
41
+ const limits = {
42
+ indexMaxBytes: memory.indexMaxBytes ?? DEFAULT_MEMORY_LIMITS.indexMaxBytes,
43
+ fileMaxBytes: memory.fileMaxBytes ?? DEFAULT_MEMORY_LIMITS.fileMaxBytes,
44
+ maxFiles: memory.maxFiles ?? DEFAULT_MEMORY_LIMITS.maxFiles,
45
+ };
46
+ const store = new MemoryStore(roots, limits, projectRoot === undefined ? {} : { projectRoot });
47
+ return { store, notes };
48
+ }
49
+ function scopeFilter(store, raw) {
50
+ if (raw === undefined || raw === "all")
51
+ return store.scopes();
52
+ if (raw !== "user" && raw !== "project")
53
+ throw new UsageError(msg().memory.cli.unknownScope(raw));
54
+ return store.scopes().filter((s) => s === raw);
55
+ }
56
+ /** 改用户级 `memory.enabled`(W6-S 的编辑核心:写前重读、只改这一项、校验、原子写 + `.bak`)。 */
57
+ function setEnabled(io, enabled) {
58
+ const m = msg().memory.cli;
59
+ try {
60
+ const result = setConfigValue({
61
+ configDir: resolveConfigDir({ env: io.env }),
62
+ cwd: io.cwd,
63
+ env: io.env,
64
+ scope: "user",
65
+ key: "memory.enabled",
66
+ value: enabled,
67
+ });
68
+ io.stdout(`${enabled ? m.enabled(result.path) : m.disabled(result.path)}\n`);
69
+ return ExitCode.Ok;
70
+ }
71
+ catch (error) {
72
+ if (!(error instanceof ConfigEditError))
73
+ throw error;
74
+ io.stderr(`${error.message}\n`);
75
+ return ExitCode.Config;
76
+ }
77
+ }
78
+ export async function runMemory(argv, io, deps = {}) {
79
+ const m = msg().memory;
80
+ const { positionals, values, flags } = parseSubArgs(argv, ["scope"], ["json", "yes"]);
81
+ const [sub, ...rest] = positionals;
82
+ if (flags.has("help") || sub === undefined) {
83
+ io.stdout(m.cli.usage);
84
+ return sub === undefined && !flags.has("help") ? ExitCode.Usage : ExitCode.Ok;
85
+ }
86
+ const ctx = load(io);
87
+ const { store } = ctx;
88
+ const name = rest.join(" ");
89
+ const notes = () => {
90
+ for (const note of ctx.notes)
91
+ io.stderr(`${note}\n`);
92
+ };
93
+ try {
94
+ switch (sub) {
95
+ case "list": {
96
+ const scopes = scopeFilter(store, values.get("scope"));
97
+ if (flags.has("json")) {
98
+ const out = scopeSummaries(store, scopes).map((s) => ({
99
+ scope: s.scope,
100
+ path: logicalPath(s.scope),
101
+ dir: store.root(s.scope),
102
+ indexBytes: s.indexBytes,
103
+ omitted: s.omitted,
104
+ entries: s.entries,
105
+ }));
106
+ io.stdout(`${JSON.stringify(out, null, 2)}\n`);
107
+ }
108
+ else
109
+ io.stdout(`${listText(store, { scopes })}\n`);
110
+ notes();
111
+ return ExitCode.Ok;
112
+ }
113
+ case "path": {
114
+ for (const scope of scopeFilter(store, values.get("scope")))
115
+ io.stdout(`${scope}\t${store.root(scope) ?? ""}\n`);
116
+ notes();
117
+ return ExitCode.Ok;
118
+ }
119
+ case "show": {
120
+ if (name === "")
121
+ throw new UsageError(m.cli.needName(sub));
122
+ const found = findOne(store, name);
123
+ if (!found.ok) {
124
+ io.stderr(`${found.message}\n`);
125
+ return ExitCode.Usage;
126
+ }
127
+ io.stdout(`${(store.readRaw(found.entry) ?? "").trimEnd()}\n`);
128
+ return ExitCode.Ok;
129
+ }
130
+ case "edit": {
131
+ const scope = values.get("scope");
132
+ const target = name !== "" ? name : scope === undefined ? undefined : scopeFilter(store, scope)[0];
133
+ const edit = deps.edit ??
134
+ ((text, file) => editExternally(text, file, {
135
+ env: io.env,
136
+ suspend: () => undefined,
137
+ resume: () => undefined,
138
+ }));
139
+ const outcome = await editMemory(store, target, edit);
140
+ if (outcome.status === "not_found") {
141
+ io.stderr(`${outcome.message}\n`);
142
+ return ExitCode.Usage;
143
+ }
144
+ io.stdout(`${outcome.status === "saved"
145
+ ? m.command.saved(outcome.path)
146
+ : outcome.status === "cancelled"
147
+ ? m.command.editCancelled
148
+ : m.command.unchanged}\n`);
149
+ return ExitCode.Ok;
150
+ }
151
+ case "rm": {
152
+ if (name === "")
153
+ throw new UsageError(m.cli.needName(sub));
154
+ const found = findOne(store, name);
155
+ if (!found.ok) {
156
+ io.stderr(`${found.message}\n`);
157
+ return ExitCode.Usage;
158
+ }
159
+ const path = logicalPath(found.entry.scope, found.entry.file);
160
+ if (!flags.has("yes")) {
161
+ if (!io.stdinIsTTY && deps.confirm === undefined) {
162
+ io.stderr(`${m.cli.needsYes}\n`);
163
+ return ExitCode.Usage;
164
+ }
165
+ const question = m.cli.confirmRemove(path);
166
+ const ok = await (deps.confirm ?? ((q) => confirmContinue({ question: q, env: io.env })))(question);
167
+ if (!ok)
168
+ return ExitCode.Ok;
169
+ }
170
+ await store.remove(found.entry);
171
+ io.stdout(`${m.command.deleted(path)}\n`);
172
+ return ExitCode.Ok;
173
+ }
174
+ case "enable":
175
+ case "disable":
176
+ return setEnabled(io, sub === "enable");
177
+ default:
178
+ throw new UsageError(m.cli.usage.trimEnd());
179
+ }
180
+ }
181
+ catch (error) {
182
+ if (error instanceof UsageError) {
183
+ io.stderr(`${error.message}\n`);
184
+ return ExitCode.Usage;
185
+ }
186
+ io.stderr(`${memoryErrorText(error)}\n`);
187
+ return ExitCode.RuntimeError;
188
+ }
189
+ }
@@ -4,6 +4,7 @@
4
4
  */
5
5
  import { sourceText } from "../../ai/providers/enrich.js";
6
6
  import { matchLabel } from "../../ai/providers/models-dev.js";
7
+ import { msg } from "../../i18n/index.js";
7
8
  export function compactTokens(n) {
8
9
  if (n === undefined)
9
10
  return "?";
@@ -20,12 +21,13 @@ export function metadataOf(registry, providerId, modelId) {
20
21
  }
21
22
  /** `ctx 262k · out 64k · 思考 · 图片 · 渠道 chat,messages`。 */
22
23
  export function modelFlags(model) {
24
+ const t = msg().subcommands.modelMeta;
23
25
  return [
24
26
  `ctx ${compactTokens(model.contextWindow)}`,
25
27
  `out ${compactTokens(model.maxTokens)}`,
26
- model.reasoning ? "思考" : undefined,
27
- model.input.includes("image") ? "图片" : undefined,
28
- model.channels !== undefined ? `渠道 ${model.channels.join(",")}` : undefined,
28
+ model.reasoning ? t.reasoning : undefined,
29
+ model.input.includes("image") ? t.image : undefined,
30
+ model.channels !== undefined ? t.channels(model.channels) : undefined,
29
31
  ]
30
32
  .filter((x) => x !== undefined)
31
33
  .join(" · ");
@@ -40,15 +42,15 @@ export function sourcesLine(metadata) {
40
42
  const values = Object.values(metadata.sources);
41
43
  if (values.every((s) => s === "catalog" || s === "default") && !metadata.looked)
42
44
  return undefined;
45
+ const t = msg().subcommands.modelMeta;
43
46
  const label = {
44
47
  contextWindow: "ctx",
45
48
  maxTokens: "out",
46
- input: "图片",
47
- reasoning: "思考",
48
- cost: "价格",
49
+ input: t.image,
50
+ reasoning: t.reasoning,
51
+ cost: t.price,
49
52
  };
50
53
  const parts = Object.keys(label).map((field) => `${label[field]} ${sourceText(metadata.sources[field])}`);
51
- const match = metadata.looked ? `;models.dev ${matchLabel(metadata.match)}` : "";
52
- const tools = metadata.toolCall === false ? ";不支持工具调用" : "";
53
- return `来源 ${parts.join(" · ")}${match}${tools}`;
54
+ const match = metadata.looked ? matchLabel(metadata.match) : undefined;
55
+ return t.sources(parts, match, metadata.toolCall === false);
54
56
  }
@@ -14,6 +14,7 @@ import { priceTokens } from "../../ai/cost.js";
14
14
  import { UsageError } from "../args.js";
15
15
  import { confirmContinue } from "../choice-prompt.js";
16
16
  import { ExitCode } from "../exit-codes.js";
17
+ import { msg } from "../../i18n/index.js";
17
18
  export const PROBE_DEFAULT_TOKENS = 2048;
18
19
  export const PROBE_DEFAULT_GAP_MS = 3000;
19
20
  export const PROBE_REQUEST_TIMEOUT_MS = 60_000;
@@ -56,17 +57,16 @@ export function judgeProbe(first, second) {
56
57
  return any === 0 ? "silent" : "inconclusive";
57
58
  }
58
59
  export function probeAdvice(verdict, model, samples = []) {
60
+ const t = msg().subcommands.cacheProbe;
59
61
  if (verdict === "silent") {
60
62
  // 实测:同一中转的 Kimi 间隔 3 s 两次都是 0、间隔更久才命中——字段存在时提示写入延迟的可能
61
- const present = samples.some((s) => s.cacheReported === true)
62
- ? "(响应里有缓存字段但恒为 0;也可能是缓存写入有延迟,可加大 --gap-ms 再测一次)"
63
- : "";
64
- return `可在 config 里设 providers.${model.provider}.compat.cacheReporting: "silent",状态栏将显示未报告${present}`;
63
+ const present = samples.some((s) => s.cacheReported === true);
64
+ return t.adviceSilent(model.provider, present);
65
65
  }
66
66
  if (verdict === "inconclusive")
67
- return "第二次只读到少量缓存或只有写入:可能是缓存粒度或 TTL 问题,可加大 --tokens 或缩短 --gap-ms 重试";
67
+ return t.adviceInconclusive;
68
68
  if (model.promptCache === undefined)
69
- return `可自填 promptCache.short 以启用保温(providers.${model.provider}.modelOverrides: [{ "id": "${model.id}", "promptCache": { "short": 300 } }])`;
69
+ return t.advicePromptCache(model.provider, model.id);
70
70
  return undefined;
71
71
  }
72
72
  function intOption(ctx, name, fallback, min) {
@@ -75,12 +75,13 @@ function intOption(ctx, name, fallback, min) {
75
75
  return fallback;
76
76
  const value = Number(raw);
77
77
  if (!Number.isInteger(value) || value < min)
78
- throw new UsageError(`--${name} 应为不小于 ${min} 的整数`);
78
+ throw new UsageError(msg().subcommands.cacheProbe.intAtLeast(name, min));
79
79
  return value;
80
80
  }
81
81
  function sampleLine(index, s) {
82
- const field = s.cacheReported === undefined ? "?" : s.cacheReported ? "有" : "无";
83
- return `#${index} input ${s.input} · cacheRead ${s.cacheRead} · cacheWrite ${s.cacheWrite} · 缓存字段 ${field}`;
82
+ const t = msg().subcommands.cacheProbe;
83
+ const field = s.cacheReported === undefined ? "?" : s.cacheReported ? t.yes : t.no;
84
+ return t.sample(index, s.input, s.cacheRead, s.cacheWrite, field);
84
85
  }
85
86
  async function run(ctx) {
86
87
  const { io, registry } = ctx;
@@ -90,31 +91,33 @@ async function run(ctx) {
90
91
  const json = ctx.flags.has("json");
91
92
  const found = registry.findModel(ref);
92
93
  if (!found.ok) {
93
- io.stderr(`ama: 模型不存在:${ref}\n`);
94
+ io.stderr(msg().subcommands.common.modelNotFound(ref));
94
95
  return ExitCode.NoModel;
95
96
  }
96
97
  const { model, provider } = found;
97
98
  const key = await registry.resolveApiKey(provider.id, model.channel);
98
99
  if (key.apiKey === undefined && provider.requiresApiKey) {
99
- io.stderr(`ama: ${provider.id} 没有 API key(ama auth set ${provider.id})\n`);
100
+ io.stderr(msg().subcommands.common.noApiKey(provider.id));
100
101
  return ExitCode.NoModel;
101
102
  }
102
103
  const api = registry.getApi(model.api);
103
104
  if (api === undefined) {
104
- io.stderr(`ama: 协议 ${model.api} 尚未实现\n`);
105
+ io.stderr(msg().subcommands.common.apiNotImplemented(model.api));
105
106
  return ExitCode.RuntimeError;
106
107
  }
107
108
  const estimate = priceTokens(model, { input: tokens * 2, output: 32 });
108
109
  const name = `${provider.id}/${model.id}`;
109
- const head = `cache-probe ${name}(${model.api})· 前缀约 ${tokens} token · 间隔 ${gapMs} ms\n预估花费:${estimate === undefined ? "$?" : `$${estimate.toFixed(4)}`}(两次 × ${tokens} token × 目录价)\n`;
110
+ const t = msg().subcommands.cacheProbe;
111
+ const cost = estimate === undefined ? "$?" : `$${estimate.toFixed(4)}`;
112
+ const head = t.head(name, model.api, tokens, gapMs, cost);
110
113
  (json ? io.stderr : io.stdout)(head);
111
114
  if (!ctx.flags.has("yes")) {
112
115
  if (!io.stdinIsTTY) {
113
- io.stderr("ama: cache-probe 会发两次计费请求,非交互环境需加 --yes\n");
116
+ io.stderr(t.needsYes);
114
117
  return ExitCode.Usage;
115
118
  }
116
119
  if (!(await confirmContinue({ env: io.env }))) {
117
- io.stderr("ama: 已取消\n");
120
+ io.stderr(msg().subcommands.common.cancelled);
118
121
  return ExitCode.Ok;
119
122
  }
120
123
  }
@@ -136,7 +139,7 @@ async function run(ctx) {
136
139
  })
137
140
  .result();
138
141
  if (message.stopReason === "error" || message.stopReason === "aborted") {
139
- io.stderr(`ama: 第 ${i + 1} 次请求失败:${message.errorMessage ?? message.stopReason}\n`);
142
+ io.stderr(t.requestFailed(i + 1, message.errorMessage ?? message.stopReason));
140
143
  return ExitCode.RuntimeError;
141
144
  }
142
145
  samples.push(sampleOf(message.usage));
@@ -161,14 +164,14 @@ async function run(ctx) {
161
164
  return ExitCode.Ok;
162
165
  }
163
166
  const share = first.promptTokens > 0
164
- ? `(第二次读到前缀的 ${Math.round((second.cacheRead / first.promptTokens) * 100)}%)`
167
+ ? t.share(Math.round((second.cacheRead / first.promptTokens) * 100))
165
168
  : "";
166
169
  io.stdout([
167
170
  sampleLine(1, first),
168
171
  sampleLine(2, second),
169
- ...(fields.length > 0 ? [`usage 字段(${model.api} 读取):${fields.join(" / ")}`] : []),
170
- `判定:${verdict}${share}`,
171
- ...(advice !== undefined ? [`建议:${advice}`] : []),
172
+ ...(fields.length > 0 ? [t.usageFields(model.api, fields)] : []),
173
+ t.verdict(verdict, share),
174
+ ...(advice !== undefined ? [t.advice(advice)] : []),
172
175
  ].join("\n") + "\n");
173
176
  return ExitCode.Ok;
174
177
  }
@@ -16,6 +16,9 @@
16
16
  *
17
17
  * models.dev:列表之后按需刷新缓存(24 小时内不重拉),每个模型标出上下文、输出、图片、工具调用与
18
18
  * 匹配结果;`--write` 跳过 models.dev 标明不支持工具调用的模型。元数据不写进配置——运行时从缓存补。
19
+ *
20
+ * [W6-O] `chatgpt`:按登录的 flavor 调对应后端的模型列表(SIWC `GET /v1/models` 筛 `visibility: list`;codex
21
+ * `GET /models?client_version=…`),只取 slug 与显示名;`--probe` 不适用(订阅后端只有一种协议)。
19
22
  */
20
23
  import type { Api, Model, ProviderData, ProviderRegistryApi } from "../../ai/types.js";
21
24
  import type { ModelsAction } from "./models.js";
@@ -16,8 +16,14 @@
16
16
  *
17
17
  * models.dev:列表之后按需刷新缓存(24 小时内不重拉),每个模型标出上下文、输出、图片、工具调用与
18
18
  * 匹配结果;`--write` 跳过 models.dev 标明不支持工具调用的模型。元数据不写进配置——运行时从缓存补。
19
+ *
20
+ * [W6-O] `chatgpt`:按登录的 flavor 调对应后端的模型列表(SIWC `GET /v1/models` 筛 `visibility: list`;codex
21
+ * `GET /models?client_version=…`),只取 slug 与显示名;`--probe` 不适用(订阅后端只有一种协议)。
19
22
  */
20
23
  import { authHeaders, mergeHeaders } from "../../ai/http.js";
24
+ import { listChatGptModels } from "../../auth/chatgpt/backend-client.js";
25
+ import { CHATGPT_PROVIDER_ID } from "../../auth/chatgpt/presets.js";
26
+ import { liveToken } from "../../auth/oauth/live.js";
21
27
  import { discoverLocalModels, materializeModel } from "../../ai/providers/registry.js";
22
28
  import { withCustomDefaults } from "../../ai/providers/catalog.js";
23
29
  import { describeModelsDev, loadModelsDevIndex } from "../../ai/providers/models-dev-cache.js";
@@ -26,6 +32,7 @@ import { existsSync } from "node:fs";
26
32
  import { loadConfigFile } from "../../config/load.js";
27
33
  import { writeConfigFile } from "../../config/write.js";
28
34
  import { UsageError } from "../args.js";
35
+ import { msg } from "../../i18n/index.js";
29
36
  import { ExitCode } from "../exit-codes.js";
30
37
  import { compactTokens } from "./model-meta.js";
31
38
  import { describeProbePlan, parseProbeTuning, ProbeProgress, ProbeScheduler, } from "./probe-runner.js";
@@ -47,6 +54,23 @@ export function modelsUrl(provider) {
47
54
  }
48
55
  export async function discoverModels(provider, apiKey, options = {}) {
49
56
  const timeoutMs = options.timeoutMs ?? DISCOVER_TIMEOUT_MS;
57
+ if (provider.id === CHATGPT_PROVIDER_ID && apiKey !== undefined) {
58
+ const live = liveToken(apiKey);
59
+ const flavor = live?.flavor ?? (provider.defaultChannel === "codex" ? "codex" : "siwc");
60
+ const channel = provider.channels?.find((c) => c.name === flavor);
61
+ const models = await listChatGptModels(fetch, channel?.baseUrl ?? provider.baseUrl, {
62
+ flavor,
63
+ accessToken: apiKey,
64
+ accountId: live?.accountId,
65
+ originator: channel?.headers?.["originator"],
66
+ });
67
+ return models.map((m) => {
68
+ const model = withCustomDefaults({ id: m.id }, provider.id, provider.api);
69
+ if (m.name !== undefined)
70
+ model.name = m.name;
71
+ return model;
72
+ });
73
+ }
50
74
  if (!provider.requiresApiKey && apiKey === undefined)
51
75
  return discoverLocalModels(provider, { timeoutMs });
52
76
  const anthropic = provider.api === "anthropic-messages";
@@ -114,17 +138,18 @@ function parseLimit(raw) {
114
138
  return DEFAULT_PROBE_LIMIT;
115
139
  const n = Number(raw);
116
140
  if (!Number.isInteger(n) || n < 1)
117
- throw new UsageError(`--limit 需要正整数:${raw}`);
141
+ throw new UsageError(msg().subcommands.discover.limitPositive(raw));
118
142
  return n;
119
143
  }
120
144
  /** 把新条目合并进用户级 config.json;返回写入条数。 */
121
145
  function writeEntries(ctx, provider, entries, notes) {
122
146
  const { io } = ctx;
147
+ const m = msg().subcommands.discover;
123
148
  const path = ctx.level.userConfigPath;
124
149
  const config = structuredClone(loadConfigFile("config", path)?.value ?? { version: 1 });
125
150
  const providers = (config.providers ??= {});
126
151
  if (providers[provider.id] === undefined && !provider.builtin) {
127
- io.stderr(`ama: ${provider.id} 不在用户级配置(${path})里,未写入\n`);
152
+ io.stderr(m.notInUserConfig(provider.id, path));
128
153
  return 0;
129
154
  }
130
155
  const target = (providers[provider.id] ??= {});
@@ -133,34 +158,33 @@ function writeEntries(ctx, provider, entries, notes) {
133
158
  const added = entries.filter((entry) => !existing.has(entry.id));
134
159
  const kept = entries.length - added.length;
135
160
  if (added.length === 0) {
136
- io.stdout(`\n没有新模型要写入${kept > 0 ? `(${kept} 个已存在,未覆盖)` : ""}\n`);
161
+ io.stdout(m.nothingToWrite(kept));
137
162
  return 0;
138
163
  }
139
164
  models.push(...added);
140
165
  const backup = existsSync(path);
141
166
  writeConfigFile(path, config, { backup: true });
142
- io.stdout(`\n已写入 ${path}:${provider.id} 新增 ${added.length} 个模型` +
143
- `${kept > 0 ? `,${kept} 个已存在未覆盖` : ""}${backup ? `(原文件备份为 ${path}.bak)` : ""}\n`);
167
+ io.stdout(m.written(path, provider.id, added.length, kept, backup));
144
168
  if (notes.noTools.size > 0)
145
- io.stdout(`跳过不支持工具调用的模型(models.dev):${[...notes.noTools].join(", ")}\n`);
169
+ io.stdout(m.skippedNoTools([...notes.noTools].join(", ")));
146
170
  const blind = added.filter((entry) => notes.unmatched.has(entry.id)).map((entry) => entry.id);
147
171
  if (blind.length > 0)
148
- io.stderr(`ama: 警告:${blind.join(", ")} 在 models.dev 未匹配,没有 contextWindow,自动压缩关闭;` +
149
- `需要时在 config.json 里补上或写 modelsDev\n`);
172
+ io.stderr(m.unmatchedWarning(blind.join(", ")));
150
173
  return added.length;
151
174
  }
152
175
  async function run(ctx) {
153
176
  const { io, registry } = ctx;
177
+ const m = msg().subcommands.discover;
154
178
  const id = ctx.args[0] ?? "";
155
179
  const limit = parseLimit(ctx.values.get("limit"));
156
180
  const provider = registry.get(id);
157
181
  if (provider === undefined) {
158
- io.stderr(`ama: 供应商不存在:${id}\n`);
182
+ io.stderr(msg().subcommands.common.providerNotFound(id));
159
183
  return ExitCode.NoModel;
160
184
  }
161
185
  const key = await registry.resolveApiKey(provider.id);
162
186
  if (key.apiKey === undefined && provider.requiresApiKey) {
163
- io.stderr(`ama: ${provider.id} 没有 API key(ama auth set ${provider.id})\n`);
187
+ io.stderr(msg().subcommands.common.noApiKey(provider.id));
164
188
  return ExitCode.NoModel;
165
189
  }
166
190
  let found;
@@ -168,11 +192,11 @@ async function run(ctx) {
168
192
  found = await discoverModels(provider, key.apiKey);
169
193
  }
170
194
  catch (error) {
171
- io.stderr(`ama: ${provider.id} 模型列表获取失败:${error.message}\n`);
195
+ io.stderr(m.listFailed(provider.id, error.message));
172
196
  return ExitCode.RuntimeError;
173
197
  }
174
198
  const configured = new Map(provider.models.map((m) => [m.id, m]));
175
- io.stdout(`${provider.id}:发现 ${found.length} 个模型(${modelsUrl(provider)})\n`);
199
+ io.stdout(m.found(provider.id, found.length, modelsUrl(provider)));
176
200
  // models.dev 只读本地(快照 ⊕ `ama models refresh` 的覆盖),不联网。
177
201
  const mdIndex = loadModelsDevIndex(ctx.level.dataDir);
178
202
  io.stdout(`${describeModelsDev(ctx.level.dataDir)}\n`);
@@ -187,14 +211,14 @@ async function run(ctx) {
187
211
  if (match === undefined)
188
212
  unmatched.add(model.id);
189
213
  const meta = fields === undefined
190
- ? " models.dev 未匹配"
214
+ ? m.unmatched
191
215
  : ` ctx ${compactTokens(fields.contextWindow)} · out ${compactTokens(fields.maxTokens)}` +
192
- `${fields.input?.includes("image") ? " · 图片" : ""}${fields.reasoning ? " · 思考" : ""}` +
193
- `${fields.toolCall === false ? " · 不支持工具调用" : ""} · ${matchLabel(match)}`;
194
- io.stdout(` ${model.id}${known !== undefined ? ` 已配置(${known.api})` : ""}${meta}\n`);
216
+ `${fields.input?.includes("image") ? m.image : ""}${fields.reasoning ? m.reasoning : ""}` +
217
+ `${fields.toolCall === false ? m.noTools : ""} · ${matchLabel(match)}`;
218
+ io.stdout(` ${model.id}${known !== undefined ? m.configured(known.api) : ""}${meta}\n`);
195
219
  }
196
220
  const write = ctx.flags.has("write");
197
- if (!ctx.flags.has("probe")) {
221
+ if (!ctx.flags.has("probe") || provider.id === CHATGPT_PROVIDER_ID) {
198
222
  if (write)
199
223
  writeEntries(ctx, provider, found.filter((m) => !noTools.has(m.id)).map((m) => ({ id: m.id })), { noTools, unmatched });
200
224
  return ExitCode.Ok;
@@ -203,15 +227,14 @@ async function run(ctx) {
203
227
  const count = Math.min(limit, ids.length);
204
228
  const order = probeOrder(provider);
205
229
  const tuning = parseProbeTuning(ctx.values);
206
- io.stdout(`\n探测协议:${count} 个模型(${order.join(" → ")}),最多 ${count * order.length} 次请求` +
207
- `${ids.length > count ? `;另有 ${ids.length - count} 个超出 --limit ${limit},未探测` : ""}\n` +
230
+ io.stdout(m.probeHeader(count, order.join(" → "), count * order.length, ids.length - count, limit) +
208
231
  `${describeProbePlan(count * order.length, tuning.concurrency, tuning.timeoutMs)}\n`);
209
232
  let stopped;
210
233
  const progress = new ProbeProgress(io.stdout, io.stdoutIsTTY, count);
211
234
  const probed = await probeModelApis(registry, provider, ids, limit, {
212
235
  ...tuning,
213
236
  onSettled: () => progress.tick(),
214
- onResult: (modelId, api) => progress.line(` ${modelId} ${api ?? "不可用(三种协议均失败)"}\n`),
237
+ onResult: (modelId, api) => progress.line(` ${modelId} ${api ?? m.unavailable}\n`),
215
238
  onStop: (reason) => (stopped = reason),
216
239
  });
217
240
  progress.finish();
@@ -224,7 +247,7 @@ async function run(ctx) {
224
247
  writeEntries(ctx, provider, entries, { noTools, unmatched });
225
248
  }
226
249
  if (stopped !== undefined) {
227
- io.stderr(`ama: 探测提前停止(${stopped})\n`);
250
+ io.stderr(m.probeStopped(stopped));
228
251
  return ExitCode.RuntimeError;
229
252
  }
230
253
  return ExitCode.Ok;
@@ -38,5 +38,5 @@ export interface ModelsAction {
38
38
  export declare const CHECK_TIMEOUT_MS = 30000;
39
39
  /** 动作表:键是子命令名,顺序即用法文本顺序。 */
40
40
  export declare const MODELS_ACTIONS: Readonly<Record<string, ModelsAction>>;
41
- export declare const MODELS_USAGE: string;
41
+ export declare function modelsUsage(): string;
42
42
  export declare function runModels(argv: readonly string[], io: CliIo, deps: Pick<RuntimeDeps, "providers"> | undefined): Promise<number>;