@armadra/agent 0.5.1 → 0.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (486) hide show
  1. package/CHANGELOG.md +203 -304
  2. package/CHANGELOG.zh-CN.md +462 -0
  3. package/README.md +408 -364
  4. package/README.zh-CN.md +705 -0
  5. package/dist/agent/session-plan.js +2 -2
  6. package/dist/agent/session-state.d.ts +3 -0
  7. package/dist/agent/session-state.js +20 -0
  8. package/dist/agent/session-subagent.d.ts +15 -1
  9. package/dist/agent/session-subagent.js +26 -3
  10. package/dist/agent/session-telemetry.d.ts +16 -2
  11. package/dist/agent/session-telemetry.js +29 -7
  12. package/dist/agent/session-tools.js +5 -2
  13. package/dist/agent/session-trace-writer.d.ts +27 -0
  14. package/dist/agent/session-trace-writer.js +253 -0
  15. package/dist/agent/session.d.ts +2 -0
  16. package/dist/agent/session.js +12 -0
  17. package/dist/agent/subagent-direct.d.ts +20 -0
  18. package/dist/agent/subagent-direct.js +76 -0
  19. package/dist/agent/subagent-registry.d.ts +8 -1
  20. package/dist/agent/subagent-registry.js +28 -1
  21. package/dist/agent/system-prompt.d.ts +3 -1
  22. package/dist/agent/system-prompt.js +3 -0
  23. package/dist/agent/tool-runner.d.ts +2 -1
  24. package/dist/agent/tool-runner.js +5 -4
  25. package/dist/agent/types-w6.d.ts +39 -0
  26. package/dist/agent/types-w6.js +4 -0
  27. package/dist/agent/types.d.ts +5 -2
  28. package/dist/agents/external.js +1 -1
  29. package/dist/agents/task-record.d.ts +74 -1
  30. package/dist/agents/task-record.js +100 -0
  31. package/dist/ai/apis/cache-params.js +2 -1
  32. package/dist/ai/apis/chatgpt-backend.d.ts +52 -0
  33. package/dist/ai/apis/chatgpt-backend.js +224 -0
  34. package/dist/ai/apis/chatgpt-rate-limits.d.ts +26 -0
  35. package/dist/ai/apis/chatgpt-rate-limits.js +91 -0
  36. package/dist/ai/apis/openai-responses-request.d.ts +2 -1
  37. package/dist/ai/apis/openai-responses-request.js +8 -2
  38. package/dist/ai/apis/openai-responses.d.ts +2 -0
  39. package/dist/ai/apis/openai-responses.js +51 -16
  40. package/dist/ai/overflow.d.ts +1 -1
  41. package/dist/ai/overflow.js +10 -7
  42. package/dist/ai/providers/auth.d.ts +15 -2
  43. package/dist/ai/providers/auth.js +69 -2
  44. package/dist/ai/providers/builtin.js +27 -0
  45. package/dist/ai/providers/catalog-data.js +1 -0
  46. package/dist/ai/providers/discovered-cache.d.ts +48 -0
  47. package/dist/ai/providers/discovered-cache.js +102 -0
  48. package/dist/ai/providers/enrich.js +2 -7
  49. package/dist/ai/providers/model-visibility.d.ts +33 -0
  50. package/dist/ai/providers/model-visibility.js +70 -0
  51. package/dist/ai/providers/models-dev-cache.js +15 -19
  52. package/dist/ai/providers/models-dev-snapshot.js +8 -7
  53. package/dist/ai/providers/models-dev.js +5 -15
  54. package/dist/ai/providers/registry.d.ts +2 -0
  55. package/dist/ai/providers/registry.js +6 -1
  56. package/dist/ai/providers/suggest.js +2 -16
  57. package/dist/ai/types.d.ts +27 -1
  58. package/dist/auth/chatgpt/backend-client.d.ts +26 -0
  59. package/dist/auth/chatgpt/backend-client.js +74 -0
  60. package/dist/auth/chatgpt/claims.d.ts +17 -0
  61. package/dist/auth/chatgpt/claims.js +46 -0
  62. package/dist/auth/chatgpt/cli.d.ts +35 -0
  63. package/dist/auth/chatgpt/cli.js +279 -0
  64. package/dist/auth/chatgpt/doctor.d.ts +17 -0
  65. package/dist/auth/chatgpt/doctor.js +36 -0
  66. package/dist/auth/chatgpt/host-id.d.ts +7 -0
  67. package/dist/auth/chatgpt/host-id.js +26 -0
  68. package/dist/auth/chatgpt/login.d.ts +30 -0
  69. package/dist/auth/chatgpt/login.js +130 -0
  70. package/dist/auth/chatgpt/presets.d.ts +66 -0
  71. package/dist/auth/chatgpt/presets.js +120 -0
  72. package/dist/auth/chatgpt/quota-text.d.ts +13 -0
  73. package/dist/auth/chatgpt/quota-text.js +36 -0
  74. package/dist/auth/oauth/browser.d.ts +12 -0
  75. package/dist/auth/oauth/browser.js +27 -0
  76. package/dist/auth/oauth/callback-server.d.ts +47 -0
  77. package/dist/auth/oauth/callback-server.js +147 -0
  78. package/dist/auth/oauth/flows.d.ts +62 -0
  79. package/dist/auth/oauth/flows.js +113 -0
  80. package/dist/auth/oauth/jwt.d.ts +24 -0
  81. package/dist/auth/oauth/jwt.js +81 -0
  82. package/dist/auth/oauth/live.d.ts +21 -0
  83. package/dist/auth/oauth/live.js +25 -0
  84. package/dist/auth/oauth/oidc.d.ts +26 -0
  85. package/dist/auth/oauth/oidc.js +72 -0
  86. package/dist/auth/oauth/pkce.d.ts +15 -0
  87. package/dist/auth/oauth/pkce.js +20 -0
  88. package/dist/auth/oauth/refresh.d.ts +35 -0
  89. package/dist/auth/oauth/refresh.js +129 -0
  90. package/dist/auth/oauth/token-client.d.ts +33 -0
  91. package/dist/auth/oauth/token-client.js +121 -0
  92. package/dist/auth/oauth/token-store.d.ts +23 -0
  93. package/dist/auth/oauth/token-store.js +125 -0
  94. package/dist/auth/testing/fake-oauth.d.ts +73 -0
  95. package/dist/auth/testing/fake-oauth.js +271 -0
  96. package/dist/auth/testing/refresh-child.d.ts +5 -0
  97. package/dist/auth/testing/refresh-child.js +16 -0
  98. package/dist/bundle/ama.cjs +26532 -11045
  99. package/dist/checkpoints/backend.js +6 -5
  100. package/dist/checkpoints/restore.js +3 -2
  101. package/dist/checkpoints/settings.js +2 -1
  102. package/dist/checkpoints/shadow-git.js +7 -6
  103. package/dist/checkpoints/shadow-restore.js +3 -2
  104. package/dist/checkpoints/tracker.js +4 -3
  105. package/dist/cli/args.d.ts +9 -2
  106. package/dist/cli/args.js +74 -27
  107. package/dist/cli/bootstrap.js +53 -31
  108. package/dist/cli/choice-prompt.js +8 -6
  109. package/dist/cli/codemode-notice.js +2 -2
  110. package/dist/cli/compose-agents.js +2 -1
  111. package/dist/cli/compose-extensions.js +2 -0
  112. package/dist/cli/compose-memory.d.ts +53 -0
  113. package/dist/cli/compose-memory.js +127 -0
  114. package/dist/cli/compose-providers.d.ts +6 -0
  115. package/dist/cli/compose-providers.js +38 -2
  116. package/dist/cli/compose-session.d.ts +5 -0
  117. package/dist/cli/compose-session.js +27 -13
  118. package/dist/cli/compose-store.d.ts +2 -0
  119. package/dist/cli/compose-store.js +9 -5
  120. package/dist/cli/compose.d.ts +2 -0
  121. package/dist/cli/compose.js +13 -5
  122. package/dist/cli/default-model.d.ts +0 -2
  123. package/dist/cli/default-model.js +5 -8
  124. package/dist/cli/deps.d.ts +5 -1
  125. package/dist/cli/exit-codes.d.ts +1 -1
  126. package/dist/cli/exit-codes.js +7 -16
  127. package/dist/cli/from-prompt.js +3 -2
  128. package/dist/cli/help-text.d.ts +2 -1
  129. package/dist/cli/help-text.js +5 -99
  130. package/dist/cli/main.d.ts +5 -0
  131. package/dist/cli/main.js +21 -2
  132. package/dist/cli/proxy.js +14 -9
  133. package/dist/cli/runtime.d.ts +5 -0
  134. package/dist/cli/startup-screen.js +20 -27
  135. package/dist/cli/startup-steps.js +6 -8
  136. package/dist/cli/subcommands/auth.d.ts +6 -3
  137. package/dist/cli/subcommands/auth.js +52 -22
  138. package/dist/cli/subcommands/config-set.d.ts +21 -0
  139. package/dist/cli/subcommands/config-set.js +145 -0
  140. package/dist/cli/subcommands/config.d.ts +2 -1
  141. package/dist/cli/subcommands/config.js +51 -37
  142. package/dist/cli/subcommands/doctor.d.ts +2 -1
  143. package/dist/cli/subcommands/doctor.js +97 -58
  144. package/dist/cli/subcommands/init.d.ts +1 -1
  145. package/dist/cli/subcommands/init.js +8 -7
  146. package/dist/cli/subcommands/memory.d.ts +18 -0
  147. package/dist/cli/subcommands/memory.js +189 -0
  148. package/dist/cli/subcommands/model-meta.js +11 -9
  149. package/dist/cli/subcommands/models-cache-probe.js +23 -20
  150. package/dist/cli/subcommands/models-discover.d.ts +4 -0
  151. package/dist/cli/subcommands/models-discover.js +60 -21
  152. package/dist/cli/subcommands/models-enable.d.ts +13 -0
  153. package/dist/cli/subcommands/models-enable.js +145 -0
  154. package/dist/cli/subcommands/models.d.ts +3 -1
  155. package/dist/cli/subcommands/models.js +39 -24
  156. package/dist/cli/subcommands/probe-runner.js +8 -7
  157. package/dist/cli/subcommands/providers-list.js +32 -21
  158. package/dist/cli/subcommands/providers-plan.js +24 -25
  159. package/dist/cli/subcommands/providers-probe.js +5 -6
  160. package/dist/cli/subcommands/providers.d.ts +1 -1
  161. package/dist/cli/subcommands/providers.js +45 -50
  162. package/dist/cli/subcommands/sessions-export.d.ts +1 -1
  163. package/dist/cli/subcommands/sessions-export.js +10 -9
  164. package/dist/cli/subcommands/sessions-search.d.ts +1 -1
  165. package/dist/cli/subcommands/sessions-search.js +11 -10
  166. package/dist/cli/subcommands/sessions-trace.d.ts +30 -0
  167. package/dist/cli/subcommands/sessions-trace.js +156 -0
  168. package/dist/cli/subcommands/sessions.d.ts +4 -3
  169. package/dist/cli/subcommands/sessions.js +40 -37
  170. package/dist/cli/subcommands/stats.d.ts +1 -1
  171. package/dist/cli/subcommands/stats.js +49 -30
  172. package/dist/cli/system-prompt-arg.js +3 -2
  173. package/dist/codemode/capability.js +3 -2
  174. package/dist/compaction/post-compact.d.ts +1 -0
  175. package/dist/compaction/post-compact.js +15 -1
  176. package/dist/compaction/prune-tier.d.ts +1 -1
  177. package/dist/compaction/prune-tier.js +3 -3
  178. package/dist/compaction/serialize.js +2 -1
  179. package/dist/config/auth-file.d.ts +12 -2
  180. package/dist/config/auth-file.js +32 -10
  181. package/dist/config/checker.js +12 -11
  182. package/dist/config/context-files.js +3 -2
  183. package/dist/config/edit.d.ts +106 -0
  184. package/dist/config/edit.js +350 -0
  185. package/dist/config/init.d.ts +4 -3
  186. package/dist/config/init.js +10 -18
  187. package/dist/config/json-schema.d.ts +2 -1
  188. package/dist/config/json-schema.js +102 -69
  189. package/dist/config/key-docs.d.ts +18 -7
  190. package/dist/config/key-docs.js +43 -128
  191. package/dist/config/load.js +7 -6
  192. package/dist/config/merge.d.ts +4 -1
  193. package/dist/config/merge.js +42 -22
  194. package/dist/config/paths.js +6 -5
  195. package/dist/config/profile.d.ts +5 -1
  196. package/dist/config/profile.js +7 -2
  197. package/dist/config/schema-w5.js +12 -4
  198. package/dist/config/schema-w6.d.ts +19 -0
  199. package/dist/config/schema-w6.js +115 -0
  200. package/dist/config/schema.js +34 -20
  201. package/dist/config/settings-registry.d.ts +81 -0
  202. package/dist/config/settings-registry.js +185 -0
  203. package/dist/config/types-w5.d.ts +7 -0
  204. package/dist/config/types-w5.js +2 -0
  205. package/dist/config/types-w6.d.ts +109 -0
  206. package/dist/config/types-w6.js +19 -0
  207. package/dist/config/types.d.ts +11 -8
  208. package/dist/config/types.js +1 -0
  209. package/dist/drivers/acp/client.js +1 -1
  210. package/dist/drivers/acp/driver.js +13 -8
  211. package/dist/drivers/agents.js +4 -3
  212. package/dist/drivers/base.js +3 -2
  213. package/dist/drivers/host-runners.js +2 -1
  214. package/dist/drivers/native/claude-stream.js +12 -11
  215. package/dist/drivers/native/codex-app-server.js +17 -12
  216. package/dist/drivers/native/oneshot.js +8 -7
  217. package/dist/drivers/pool.js +1 -1
  218. package/dist/drivers/runner.d.ts +3 -1
  219. package/dist/drivers/runner.js +68 -20
  220. package/dist/drivers/turn.js +1 -1
  221. package/dist/hooks/config.js +3 -2
  222. package/dist/hooks/protocol.js +18 -12
  223. package/dist/host/api-impl.js +11 -10
  224. package/dist/host/loader.js +9 -8
  225. package/dist/host/types.d.ts +3 -0
  226. package/dist/i18n/catalog.d.ts +2209 -0
  227. package/dist/i18n/catalog.js +72 -0
  228. package/dist/i18n/format.d.ts +21 -0
  229. package/dist/i18n/format.js +58 -0
  230. package/dist/i18n/index.d.ts +58 -0
  231. package/dist/i18n/index.js +72 -0
  232. package/dist/i18n/messages/agents.d.ts +84 -0
  233. package/dist/i18n/messages/agents.js +85 -0
  234. package/dist/i18n/messages/approval.d.ts +99 -0
  235. package/dist/i18n/messages/approval.js +100 -0
  236. package/dist/i18n/messages/auth.d.ts +189 -0
  237. package/dist/i18n/messages/auth.js +201 -0
  238. package/dist/i18n/messages/cli-args.d.ts +46 -0
  239. package/dist/i18n/messages/cli-args.js +46 -0
  240. package/dist/i18n/messages/cli-help.d.ts +12 -0
  241. package/dist/i18n/messages/cli-help.js +248 -0
  242. package/dist/i18n/messages/cli.d.ts +336 -0
  243. package/dist/i18n/messages/cli.js +311 -0
  244. package/dist/i18n/messages/config-keys.d.ts +293 -0
  245. package/dist/i18n/messages/config-keys.js +296 -0
  246. package/dist/i18n/messages/config.d.ts +508 -0
  247. package/dist/i18n/messages/config.js +241 -0
  248. package/dist/i18n/messages/drivers.d.ts +123 -0
  249. package/dist/i18n/messages/drivers.js +124 -0
  250. package/dist/i18n/messages/errors.d.ts +83 -0
  251. package/dist/i18n/messages/errors.js +171 -0
  252. package/dist/i18n/messages/interactive-line.d.ts +61 -0
  253. package/dist/i18n/messages/interactive-line.js +69 -0
  254. package/dist/i18n/messages/interactive-startup.d.ts +99 -0
  255. package/dist/i18n/messages/interactive-startup.js +100 -0
  256. package/dist/i18n/messages/interactive-view.d.ts +140 -0
  257. package/dist/i18n/messages/interactive-view.js +141 -0
  258. package/dist/i18n/messages/interactive.d.ts +489 -0
  259. package/dist/i18n/messages/interactive.js +248 -0
  260. package/dist/i18n/messages/memory.d.ts +123 -0
  261. package/dist/i18n/messages/memory.js +128 -0
  262. package/dist/i18n/messages/panels.d.ts +233 -0
  263. package/dist/i18n/messages/panels.js +232 -0
  264. package/dist/i18n/messages/permissions.d.ts +126 -0
  265. package/dist/i18n/messages/permissions.js +151 -0
  266. package/dist/i18n/messages/plan.d.ts +123 -0
  267. package/dist/i18n/messages/plan.js +124 -0
  268. package/dist/i18n/messages/print.d.ts +86 -0
  269. package/dist/i18n/messages/print.js +91 -0
  270. package/dist/i18n/messages/report.d.ts +391 -0
  271. package/dist/i18n/messages/report.js +490 -0
  272. package/dist/i18n/messages/rewind.d.ts +198 -0
  273. package/dist/i18n/messages/rewind.js +217 -0
  274. package/dist/i18n/messages/session.d.ts +230 -0
  275. package/dist/i18n/messages/session.js +258 -0
  276. package/dist/i18n/messages/settings.d.ts +355 -0
  277. package/dist/i18n/messages/settings.js +343 -0
  278. package/dist/i18n/messages/subcommands-config.d.ts +113 -0
  279. package/dist/i18n/messages/subcommands-config.js +129 -0
  280. package/dist/i18n/messages/subcommands-models.d.ts +34 -0
  281. package/dist/i18n/messages/subcommands-models.js +34 -0
  282. package/dist/i18n/messages/subcommands.d.ts +576 -0
  283. package/dist/i18n/messages/subcommands.js +477 -0
  284. package/dist/i18n/messages/trace.d.ts +243 -0
  285. package/dist/i18n/messages/trace.js +238 -0
  286. package/dist/i18n/types.d.ts +15 -0
  287. package/dist/i18n/types.js +7 -0
  288. package/dist/index.d.ts +6 -0
  289. package/dist/index.js +2 -0
  290. package/dist/memory/edit.d.ts +24 -0
  291. package/dist/memory/edit.js +63 -0
  292. package/dist/memory/frontmatter.d.ts +37 -0
  293. package/dist/memory/frontmatter.js +79 -0
  294. package/dist/memory/index.d.ts +28 -0
  295. package/dist/memory/index.js +126 -0
  296. package/dist/memory/lock.d.ts +17 -0
  297. package/dist/memory/lock.js +62 -0
  298. package/dist/memory/paths.d.ts +57 -0
  299. package/dist/memory/paths.js +175 -0
  300. package/dist/memory/report.d.ts +36 -0
  301. package/dist/memory/report.js +86 -0
  302. package/dist/memory/runtime.d.ts +42 -0
  303. package/dist/memory/runtime.js +36 -0
  304. package/dist/memory/secrets.d.ts +8 -0
  305. package/dist/memory/secrets.js +27 -0
  306. package/dist/memory/section.d.ts +28 -0
  307. package/dist/memory/section.js +59 -0
  308. package/dist/memory/store.d.ts +70 -0
  309. package/dist/memory/store.js +284 -0
  310. package/dist/memory/tool.d.ts +31 -0
  311. package/dist/memory/tool.js +94 -0
  312. package/dist/modes/acp/acp-events.js +2 -1
  313. package/dist/modes/acp/acp-server.js +13 -12
  314. package/dist/modes/commands-core.d.ts +11 -0
  315. package/dist/modes/commands-core.js +93 -62
  316. package/dist/modes/image-input.js +20 -6
  317. package/dist/modes/interactive/agent-bar.d.ts +95 -0
  318. package/dist/modes/interactive/agent-bar.js +248 -0
  319. package/dist/modes/interactive/agent-panels.js +27 -26
  320. package/dist/modes/interactive/agent-transcript.d.ts +47 -0
  321. package/dist/modes/interactive/agent-transcript.js +191 -0
  322. package/dist/modes/interactive/agent-ui.d.ts +36 -1
  323. package/dist/modes/interactive/agent-ui.js +180 -14
  324. package/dist/modes/interactive/agent-view.d.ts +72 -0
  325. package/dist/modes/interactive/agent-view.js +281 -0
  326. package/dist/modes/interactive/approval-dialog.js +46 -34
  327. package/dist/modes/interactive/clipboard-paste.d.ts +2 -2
  328. package/dist/modes/interactive/clipboard-paste.js +9 -4
  329. package/dist/modes/interactive/commands.d.ts +22 -1
  330. package/dist/modes/interactive/commands.js +100 -49
  331. package/dist/modes/interactive/completion.js +2 -1
  332. package/dist/modes/interactive/config-panel.d.ts +70 -0
  333. package/dist/modes/interactive/config-panel.js +319 -0
  334. package/dist/modes/interactive/config-ui.d.ts +96 -0
  335. package/dist/modes/interactive/config-ui.js +397 -0
  336. package/dist/modes/interactive/confirm-dialog.js +6 -7
  337. package/dist/modes/interactive/event-notices.js +11 -9
  338. package/dist/modes/interactive/interactive-mode.d.ts +1 -1
  339. package/dist/modes/interactive/interactive-mode.js +21 -22
  340. package/dist/modes/interactive/key-dispatch.d.ts +12 -0
  341. package/dist/modes/interactive/key-dispatch.js +24 -9
  342. package/dist/modes/interactive/line/line-editor.js +2 -1
  343. package/dist/modes/interactive/line/line-mode.js +18 -7
  344. package/dist/modes/interactive/line/line-render.js +25 -24
  345. package/dist/modes/interactive/memory-panel.d.ts +64 -0
  346. package/dist/modes/interactive/memory-panel.js +221 -0
  347. package/dist/modes/interactive/message-view.d.ts +4 -2
  348. package/dist/modes/interactive/message-view.js +42 -33
  349. package/dist/modes/interactive/model-items.d.ts +45 -0
  350. package/dist/modes/interactive/model-items.js +134 -0
  351. package/dist/modes/interactive/model-picker.d.ts +57 -0
  352. package/dist/modes/interactive/model-picker.js +191 -0
  353. package/dist/modes/interactive/panels.js +39 -31
  354. package/dist/modes/interactive/pickers.d.ts +2 -1
  355. package/dist/modes/interactive/pickers.js +10 -6
  356. package/dist/modes/interactive/plan-command.d.ts +1 -1
  357. package/dist/modes/interactive/plan-command.js +24 -27
  358. package/dist/modes/interactive/plan-dialog.js +18 -17
  359. package/dist/modes/interactive/plan-flow.js +6 -5
  360. package/dist/modes/interactive/rewind-command.d.ts +1 -1
  361. package/dist/modes/interactive/rewind-command.js +18 -16
  362. package/dist/modes/interactive/rewind-flow.d.ts +0 -1
  363. package/dist/modes/interactive/rewind-flow.js +13 -14
  364. package/dist/modes/interactive/rewind-list.js +7 -6
  365. package/dist/modes/interactive/rewind-panel.js +40 -40
  366. package/dist/modes/interactive/rewind-text.d.ts +5 -3
  367. package/dist/modes/interactive/rewind-text.js +48 -38
  368. package/dist/modes/interactive/run-indicator.js +15 -12
  369. package/dist/modes/interactive/session-events.js +3 -2
  370. package/dist/modes/interactive/startup-header.js +22 -23
  371. package/dist/modes/interactive/startup-ui.d.ts +3 -9
  372. package/dist/modes/interactive/startup-ui.js +44 -88
  373. package/dist/modes/interactive/status-area.d.ts +2 -0
  374. package/dist/modes/interactive/status-area.js +8 -2
  375. package/dist/modes/interactive/status-bar.js +4 -3
  376. package/dist/modes/interactive/subagent-view.js +9 -7
  377. package/dist/modes/interactive/tasks-report.d.ts +6 -0
  378. package/dist/modes/interactive/tasks-report.js +28 -31
  379. package/dist/modes/interactive/terminal-setup.d.ts +9 -0
  380. package/dist/modes/interactive/terminal-setup.js +23 -0
  381. package/dist/modes/interactive/tool-summary.js +19 -17
  382. package/dist/modes/interactive/tool-view.js +7 -4
  383. package/dist/modes/interactive/trace-view.d.ts +89 -0
  384. package/dist/modes/interactive/trace-view.js +332 -0
  385. package/dist/modes/print/print-mode.js +14 -15
  386. package/dist/modes/rpc/commands.js +7 -3
  387. package/dist/modes/rpc/rpc-mode.js +9 -3
  388. package/dist/modes/session-report.d.ts +2 -0
  389. package/dist/modes/session-report.js +101 -105
  390. package/dist/modes/startup-ui-text.js +11 -6
  391. package/dist/permissions/bypass.d.ts +8 -10
  392. package/dist/permissions/bypass.js +19 -10
  393. package/dist/permissions/memory-class.d.ts +23 -0
  394. package/dist/permissions/memory-class.js +54 -0
  395. package/dist/permissions/modes.d.ts +3 -3
  396. package/dist/permissions/modes.js +21 -16
  397. package/dist/permissions/pipeline.d.ts +1 -1
  398. package/dist/permissions/pipeline.js +9 -2
  399. package/dist/permissions/preview.js +49 -42
  400. package/dist/permissions/rules.js +5 -2
  401. package/dist/permissions/types.d.ts +4 -0
  402. package/dist/plan/store.js +2 -1
  403. package/dist/rpc.d.ts +39 -1
  404. package/dist/rpc.js +3 -0
  405. package/dist/sandbox/bash.js +11 -8
  406. package/dist/sandbox/detect.js +14 -11
  407. package/dist/sdk.d.ts +17 -1
  408. package/dist/sdk.js +29 -7
  409. package/dist/session/export.js +31 -30
  410. package/dist/session/manager.d.ts +1 -1
  411. package/dist/session/manager.js +5 -3
  412. package/dist/session/reuse.js +5 -4
  413. package/dist/session/scan.js +3 -2
  414. package/dist/session/stats-aggregate.d.ts +3 -1
  415. package/dist/session/stats-aggregate.js +5 -1
  416. package/dist/session/stats-index.js +2 -1
  417. package/dist/session/stats-scan.d.ts +4 -1
  418. package/dist/session/stats-scan.js +6 -2
  419. package/dist/session/store.d.ts +11 -0
  420. package/dist/session/store.js +48 -1
  421. package/dist/session/types.d.ts +2 -0
  422. package/dist/skills/builtin.js +2 -1
  423. package/dist/tools/image-file.d.ts +26 -1
  424. package/dist/tools/image-file.js +55 -13
  425. package/dist/tools/presets.d.ts +14 -1
  426. package/dist/tools/presets.js +3 -3
  427. package/dist/tools/registry.js +1 -1
  428. package/dist/tools/truncate.d.ts +1 -1
  429. package/dist/tools/truncate.js +2 -2
  430. package/dist/tools/types.d.ts +17 -1
  431. package/dist/trace/build-index.d.ts +91 -0
  432. package/dist/trace/build-index.js +127 -0
  433. package/dist/trace/build-nodes.d.ts +24 -0
  434. package/dist/trace/build-nodes.js +279 -0
  435. package/dist/trace/build-util.d.ts +43 -0
  436. package/dist/trace/build-util.js +120 -0
  437. package/dist/trace/build.d.ts +82 -0
  438. package/dist/trace/build.js +382 -0
  439. package/dist/trace/detail.d.ts +35 -0
  440. package/dist/trace/detail.js +205 -0
  441. package/dist/trace/flatten.d.ts +69 -0
  442. package/dist/trace/flatten.js +173 -0
  443. package/dist/trace/format.d.ts +47 -0
  444. package/dist/trace/format.js +329 -0
  445. package/dist/trace/html-template.d.ts +19 -0
  446. package/dist/trace/html-template.js +150 -0
  447. package/dist/trace/html.d.ts +104 -0
  448. package/dist/trace/html.js +292 -0
  449. package/dist/trace/preview.d.ts +29 -0
  450. package/dist/trace/preview.js +59 -0
  451. package/dist/trace/query-session.d.ts +14 -0
  452. package/dist/trace/query-session.js +38 -0
  453. package/dist/trace/query.d.ts +55 -0
  454. package/dist/trace/query.js +188 -0
  455. package/dist/trace/session.d.ts +40 -0
  456. package/dist/trace/session.js +168 -0
  457. package/dist/trace/types.d.ts +243 -0
  458. package/dist/trace/types.js +13 -0
  459. package/dist/tui/components/editor-paste.d.ts +2 -0
  460. package/dist/tui/components/editor-paste.js +6 -3
  461. package/dist/tui/components/editor.js +2 -2
  462. package/dist/tui/components/loader.d.ts +3 -0
  463. package/dist/tui/components/loader.js +14 -0
  464. package/dist/tui/components/select-list.d.ts +2 -0
  465. package/dist/tui/components/select-list.js +7 -0
  466. package/dist/tui/components/settings-list.d.ts +61 -0
  467. package/dist/tui/components/settings-list.js +135 -0
  468. package/dist/tui/keybindings.d.ts +5 -0
  469. package/dist/tui/keybindings.js +17 -5
  470. package/dist/tui.d.ts +1 -0
  471. package/dist/tui.js +2 -0
  472. package/docs/en/host-api.md +167 -0
  473. package/docs/en/permissions.md +214 -0
  474. package/docs/en/providers.md +627 -0
  475. package/docs/en/rpc.md +361 -0
  476. package/docs/en/sessions.md +219 -0
  477. package/docs/en/tui.md +534 -0
  478. package/docs/host-api.md +18 -17
  479. package/docs/memory.md +172 -0
  480. package/docs/permissions.md +2 -2
  481. package/docs/providers.md +73 -1
  482. package/docs/rpc.md +31 -3
  483. package/docs/session-format.md +8 -2
  484. package/docs/sessions.md +29 -1
  485. package/docs/tui.md +140 -4
  486. package/package.json +8 -3
@@ -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,10 @@
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` 不适用(订阅后端只有一种协议)。结果另写进
22
+ * 发现缓存 `<dataDir>/models/discovered/chatgpt.json`(discovered-cache.ts),`/model` 选择器由此列出。
19
23
  */
20
24
  import type { Api, Model, ProviderData, ProviderRegistryApi } from "../../ai/types.js";
21
25
  import type { ModelsAction } from "./models.js";
@@ -16,9 +16,17 @@
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` 不适用(订阅后端只有一种协议)。结果另写进
22
+ * 发现缓存 `<dataDir>/models/discovered/chatgpt.json`(discovered-cache.ts),`/model` 选择器由此列出。
19
23
  */
20
24
  import { authHeaders, mergeHeaders } from "../../ai/http.js";
25
+ import { listChatGptModels } from "../../auth/chatgpt/backend-client.js";
26
+ import { CHATGPT_PROVIDER_ID } from "../../auth/chatgpt/presets.js";
27
+ import { liveToken } from "../../auth/oauth/live.js";
21
28
  import { discoverLocalModels, materializeModel } from "../../ai/providers/registry.js";
29
+ import { writeDiscoveredCache } from "../../ai/providers/discovered-cache.js";
22
30
  import { withCustomDefaults } from "../../ai/providers/catalog.js";
23
31
  import { describeModelsDev, loadModelsDevIndex } from "../../ai/providers/models-dev-cache.js";
24
32
  import { matchLabel, modelsDevFields } from "../../ai/providers/models-dev.js";
@@ -26,6 +34,7 @@ import { existsSync } from "node:fs";
26
34
  import { loadConfigFile } from "../../config/load.js";
27
35
  import { writeConfigFile } from "../../config/write.js";
28
36
  import { UsageError } from "../args.js";
37
+ import { msg } from "../../i18n/index.js";
29
38
  import { ExitCode } from "../exit-codes.js";
30
39
  import { compactTokens } from "./model-meta.js";
31
40
  import { describeProbePlan, parseProbeTuning, ProbeProgress, ProbeScheduler, } from "./probe-runner.js";
@@ -47,6 +56,23 @@ export function modelsUrl(provider) {
47
56
  }
48
57
  export async function discoverModels(provider, apiKey, options = {}) {
49
58
  const timeoutMs = options.timeoutMs ?? DISCOVER_TIMEOUT_MS;
59
+ if (provider.id === CHATGPT_PROVIDER_ID && apiKey !== undefined) {
60
+ const live = liveToken(apiKey);
61
+ const flavor = live?.flavor ?? (provider.defaultChannel === "codex" ? "codex" : "siwc");
62
+ const channel = provider.channels?.find((c) => c.name === flavor);
63
+ const models = await listChatGptModels(fetch, channel?.baseUrl ?? provider.baseUrl, {
64
+ flavor,
65
+ accessToken: apiKey,
66
+ accountId: live?.accountId,
67
+ originator: channel?.headers?.["originator"],
68
+ });
69
+ return models.map((m) => {
70
+ const model = withCustomDefaults({ id: m.id }, provider.id, provider.api);
71
+ if (m.name !== undefined)
72
+ model.name = m.name;
73
+ return model;
74
+ });
75
+ }
50
76
  if (!provider.requiresApiKey && apiKey === undefined)
51
77
  return discoverLocalModels(provider, { timeoutMs });
52
78
  const anthropic = provider.api === "anthropic-messages";
@@ -114,17 +140,18 @@ function parseLimit(raw) {
114
140
  return DEFAULT_PROBE_LIMIT;
115
141
  const n = Number(raw);
116
142
  if (!Number.isInteger(n) || n < 1)
117
- throw new UsageError(`--limit 需要正整数:${raw}`);
143
+ throw new UsageError(msg().subcommands.discover.limitPositive(raw));
118
144
  return n;
119
145
  }
120
146
  /** 把新条目合并进用户级 config.json;返回写入条数。 */
121
147
  function writeEntries(ctx, provider, entries, notes) {
122
148
  const { io } = ctx;
149
+ const m = msg().subcommands.discover;
123
150
  const path = ctx.level.userConfigPath;
124
151
  const config = structuredClone(loadConfigFile("config", path)?.value ?? { version: 1 });
125
152
  const providers = (config.providers ??= {});
126
153
  if (providers[provider.id] === undefined && !provider.builtin) {
127
- io.stderr(`ama: ${provider.id} 不在用户级配置(${path})里,未写入\n`);
154
+ io.stderr(m.notInUserConfig(provider.id, path));
128
155
  return 0;
129
156
  }
130
157
  const target = (providers[provider.id] ??= {});
@@ -133,34 +160,33 @@ function writeEntries(ctx, provider, entries, notes) {
133
160
  const added = entries.filter((entry) => !existing.has(entry.id));
134
161
  const kept = entries.length - added.length;
135
162
  if (added.length === 0) {
136
- io.stdout(`\n没有新模型要写入${kept > 0 ? `(${kept} 个已存在,未覆盖)` : ""}\n`);
163
+ io.stdout(m.nothingToWrite(kept));
137
164
  return 0;
138
165
  }
139
166
  models.push(...added);
140
167
  const backup = existsSync(path);
141
168
  writeConfigFile(path, config, { backup: true });
142
- io.stdout(`\n已写入 ${path}:${provider.id} 新增 ${added.length} 个模型` +
143
- `${kept > 0 ? `,${kept} 个已存在未覆盖` : ""}${backup ? `(原文件备份为 ${path}.bak)` : ""}\n`);
169
+ io.stdout(m.written(path, provider.id, added.length, kept, backup));
144
170
  if (notes.noTools.size > 0)
145
- io.stdout(`跳过不支持工具调用的模型(models.dev):${[...notes.noTools].join(", ")}\n`);
171
+ io.stdout(m.skippedNoTools([...notes.noTools].join(", ")));
146
172
  const blind = added.filter((entry) => notes.unmatched.has(entry.id)).map((entry) => entry.id);
147
173
  if (blind.length > 0)
148
- io.stderr(`ama: 警告:${blind.join(", ")} 在 models.dev 未匹配,没有 contextWindow,自动压缩关闭;` +
149
- `需要时在 config.json 里补上或写 modelsDev\n`);
174
+ io.stderr(m.unmatchedWarning(blind.join(", ")));
150
175
  return added.length;
151
176
  }
152
177
  async function run(ctx) {
153
178
  const { io, registry } = ctx;
179
+ const m = msg().subcommands.discover;
154
180
  const id = ctx.args[0] ?? "";
155
181
  const limit = parseLimit(ctx.values.get("limit"));
156
182
  const provider = registry.get(id);
157
183
  if (provider === undefined) {
158
- io.stderr(`ama: 供应商不存在:${id}\n`);
184
+ io.stderr(msg().subcommands.common.providerNotFound(id));
159
185
  return ExitCode.NoModel;
160
186
  }
161
187
  const key = await registry.resolveApiKey(provider.id);
162
188
  if (key.apiKey === undefined && provider.requiresApiKey) {
163
- io.stderr(`ama: ${provider.id} 没有 API key(ama auth set ${provider.id})\n`);
189
+ io.stderr(msg().subcommands.common.noApiKey(provider.id));
164
190
  return ExitCode.NoModel;
165
191
  }
166
192
  let found;
@@ -168,11 +194,13 @@ async function run(ctx) {
168
194
  found = await discoverModels(provider, key.apiKey);
169
195
  }
170
196
  catch (error) {
171
- io.stderr(`ama: ${provider.id} 模型列表获取失败:${error.message}\n`);
197
+ io.stderr(m.listFailed(provider.id, error.message));
172
198
  return ExitCode.RuntimeError;
173
199
  }
174
200
  const configured = new Map(provider.models.map((m) => [m.id, m]));
175
- io.stdout(`${provider.id}:发现 ${found.length} 个模型(${modelsUrl(provider)})\n`);
201
+ io.stdout(m.found(provider.id, found.length, modelsUrl(provider)));
202
+ if (provider.id === CHATGPT_PROVIDER_ID)
203
+ cacheChatGpt(ctx, found, key.apiKey);
176
204
  // models.dev 只读本地(快照 ⊕ `ama models refresh` 的覆盖),不联网。
177
205
  const mdIndex = loadModelsDevIndex(ctx.level.dataDir);
178
206
  io.stdout(`${describeModelsDev(ctx.level.dataDir)}\n`);
@@ -187,14 +215,14 @@ async function run(ctx) {
187
215
  if (match === undefined)
188
216
  unmatched.add(model.id);
189
217
  const meta = fields === undefined
190
- ? " models.dev 未匹配"
218
+ ? m.unmatched
191
219
  : ` 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`);
220
+ `${fields.input?.includes("image") ? m.image : ""}${fields.reasoning ? m.reasoning : ""}` +
221
+ `${fields.toolCall === false ? m.noTools : ""} · ${matchLabel(match)}`;
222
+ io.stdout(` ${model.id}${known !== undefined ? m.configured(known.api) : ""}${meta}\n`);
195
223
  }
196
224
  const write = ctx.flags.has("write");
197
- if (!ctx.flags.has("probe")) {
225
+ if (!ctx.flags.has("probe") || provider.id === CHATGPT_PROVIDER_ID) {
198
226
  if (write)
199
227
  writeEntries(ctx, provider, found.filter((m) => !noTools.has(m.id)).map((m) => ({ id: m.id })), { noTools, unmatched });
200
228
  return ExitCode.Ok;
@@ -203,15 +231,14 @@ async function run(ctx) {
203
231
  const count = Math.min(limit, ids.length);
204
232
  const order = probeOrder(provider);
205
233
  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` +
234
+ io.stdout(m.probeHeader(count, order.join(" → "), count * order.length, ids.length - count, limit) +
208
235
  `${describeProbePlan(count * order.length, tuning.concurrency, tuning.timeoutMs)}\n`);
209
236
  let stopped;
210
237
  const progress = new ProbeProgress(io.stdout, io.stdoutIsTTY, count);
211
238
  const probed = await probeModelApis(registry, provider, ids, limit, {
212
239
  ...tuning,
213
240
  onSettled: () => progress.tick(),
214
- onResult: (modelId, api) => progress.line(` ${modelId} ${api ?? "不可用(三种协议均失败)"}\n`),
241
+ onResult: (modelId, api) => progress.line(` ${modelId} ${api ?? m.unavailable}\n`),
215
242
  onStop: (reason) => (stopped = reason),
216
243
  });
217
244
  progress.finish();
@@ -224,11 +251,23 @@ async function run(ctx) {
224
251
  writeEntries(ctx, provider, entries, { noTools, unmatched });
225
252
  }
226
253
  if (stopped !== undefined) {
227
- io.stderr(`ama: 探测提前停止(${stopped})\n`);
254
+ io.stderr(m.probeStopped(stopped));
228
255
  return ExitCode.RuntimeError;
229
256
  }
230
257
  return ExitCode.Ok;
231
258
  }
259
+ /** chatgpt 的发现结果写进发现缓存(选择器与注册表读它);写失败不影响列表输出。 */
260
+ function cacheChatGpt(ctx, found, apiKey) {
261
+ try {
262
+ const flavor = liveToken(apiKey)?.flavor;
263
+ const models = found.map((m) => ({ id: m.id, ...(m.name !== m.id ? { name: m.name } : {}) }));
264
+ const path = writeDiscoveredCache(ctx.level.dataDir, CHATGPT_PROVIDER_ID, { models, flavor });
265
+ ctx.io.stdout(msg().subcommands.discover.cached(path));
266
+ }
267
+ catch (error) {
268
+ ctx.io.stderr(`ama: ${error.message}\n`);
269
+ }
270
+ }
232
271
  export const DISCOVER_ACTION = {
233
272
  usage: "ama models discover <provider> [--probe] [--write] [--limit <n>] [--concurrency <n>] [--probe-timeout <ms>]",
234
273
  required: "<provider>",
@@ -0,0 +1,13 @@
1
+ /**
2
+ * `ama models enable <ref…>` / `ama models disable <ref…>` / `ama models list --enabled`:编辑与查看用户级
3
+ * `models.enabled`(模型选择器的显式清单,见 ai/providers/model-visibility.ts)。
4
+ *
5
+ * 写回走 config/edit.ts(重读目标文件、校验、`.bak` 备份、原子写);`models` 只认用户级,没有 `--project`。
6
+ * 引用要是 `provider/model[@channel]` 或 `provider/*`,供应商必须存在;模型不在模型表里只警告(中转站与
7
+ * 订阅后端接受任意 id)。清单移空时删掉这个键。
8
+ */
9
+ import type { ModelsAction, ModelsActionContext } from "./models.js";
10
+ /** `ama models list --enabled`:清单(及各项供应商状态);没设清单时列出选择器缺省显示的模型。 */
11
+ export declare function listEnabled(ctx: ModelsActionContext): Promise<number>;
12
+ export declare const ENABLE_ACTION: ModelsAction;
13
+ export declare const DISABLE_ACTION: ModelsAction;
@@ -0,0 +1,145 @@
1
+ /**
2
+ * `ama models enable <ref…>` / `ama models disable <ref…>` / `ama models list --enabled`:编辑与查看用户级
3
+ * `models.enabled`(模型选择器的显式清单,见 ai/providers/model-visibility.ts)。
4
+ *
5
+ * 写回走 config/edit.ts(重读目标文件、校验、`.bak` 备份、原子写);`models` 只认用户级,没有 `--project`。
6
+ * 引用要是 `provider/model[@channel]` 或 `provider/*`,供应商必须存在;模型不在模型表里只警告(中转站与
7
+ * 订阅后端接受任意 id)。清单移空时删掉这个键。
8
+ */
9
+ import { accessReady, addEnabled, enabledList, providerAccess, removeEnabled, splitEnabledRef, } from "../../ai/providers/model-visibility.js";
10
+ import { readSnapshot, setConfigValue } from "../../config/edit.js";
11
+ import { MODELS_ENABLED_REF } from "../../config/types-w5.js";
12
+ import { msg } from "../../i18n/index.js";
13
+ import { UsageError } from "../args.js";
14
+ import { ExitCode } from "../exit-codes.js";
15
+ function layerInput(ctx) {
16
+ const input = {
17
+ configDir: ctx.level.configDir,
18
+ cwd: ctx.io.cwd,
19
+ env: ctx.io.env,
20
+ };
21
+ if (ctx.level.profile !== undefined) {
22
+ input.profile = { config: ctx.level.profile.config };
23
+ input.hasProfile = true;
24
+ }
25
+ return input;
26
+ }
27
+ /** 校验引用;供应商不存在返回退出码,模型不在表里只警告。 */
28
+ function checkRefs(ctx, refs) {
29
+ const m = msg().subcommands.modelsEnabled;
30
+ for (const ref of refs) {
31
+ const parts = splitEnabledRef(ref);
32
+ if (!MODELS_ENABLED_REF.test(ref) || parts === undefined)
33
+ throw new UsageError(m.badRef(ref));
34
+ const provider = ctx.registry.get(parts.provider);
35
+ if (provider === undefined) {
36
+ ctx.io.stderr(msg().subcommands.common.providerNotFound(parts.provider));
37
+ return ExitCode.NoModel;
38
+ }
39
+ if (parts.model !== "*" &&
40
+ provider.models.length > 0 &&
41
+ !provider.models.some((model) => model.id === parts.model))
42
+ ctx.io.stderr(m.unknownModel(ref));
43
+ }
44
+ return undefined;
45
+ }
46
+ function userList(input) {
47
+ return enabledList(readSnapshot(input).user?.models?.enabled);
48
+ }
49
+ async function enable(ctx) {
50
+ const m = msg().subcommands.modelsEnabled;
51
+ const refs = [...new Set(ctx.args)];
52
+ const bad = checkRefs(ctx, refs);
53
+ if (bad !== undefined)
54
+ return bad;
55
+ const input = layerInput(ctx);
56
+ const current = userList(input);
57
+ const fresh = refs.filter((ref) => !(current ?? []).includes(ref));
58
+ if (fresh.length === 0) {
59
+ ctx.io.stdout(m.alreadyListed(refs.join(", ")));
60
+ return ExitCode.Ok;
61
+ }
62
+ const result = setConfigValue({
63
+ ...input,
64
+ scope: "user",
65
+ key: "models.enabled",
66
+ value: addEnabled(current, fresh),
67
+ });
68
+ ctx.io.stdout(m.added(fresh.join(", "), result.path));
69
+ return ExitCode.Ok;
70
+ }
71
+ async function disable(ctx) {
72
+ const m = msg().subcommands.modelsEnabled;
73
+ const refs = [...new Set(ctx.args)];
74
+ for (const ref of refs)
75
+ if (!MODELS_ENABLED_REF.test(ref))
76
+ throw new UsageError(m.badRef(ref));
77
+ const input = layerInput(ctx);
78
+ const current = userList(input) ?? [];
79
+ const listed = refs.filter((ref) => current.includes(ref));
80
+ const missing = refs.filter((ref) => !current.includes(ref));
81
+ if (missing.length > 0)
82
+ ctx.io.stderr(m.notListed(missing.join(", ")));
83
+ if (listed.length === 0)
84
+ return missing.length > 0 ? ExitCode.RuntimeError : ExitCode.Ok;
85
+ const next = removeEnabled(current, listed);
86
+ const result = setConfigValue({ ...input, scope: "user", key: "models.enabled", value: next });
87
+ ctx.io.stdout(next === undefined ? m.cleared(result.path) : m.removed(listed.join(", "), result.path));
88
+ return ExitCode.Ok;
89
+ }
90
+ /** `ama models list --enabled`:清单(及各项供应商状态);没设清单时列出选择器缺省显示的模型。 */
91
+ export async function listEnabled(ctx) {
92
+ const m = msg().subcommands.modelsEnabled;
93
+ const labels = msg().panels.model;
94
+ const list = enabledList(ctx.level.merged.config.models?.enabled);
95
+ const status = async (providerId) => {
96
+ const provider = ctx.registry.get(providerId);
97
+ if (provider === undefined)
98
+ return "?";
99
+ const access = await providerAccess(ctx.registry, provider);
100
+ return access === "none" ? labels.noKey : labels[access];
101
+ };
102
+ if (list !== undefined) {
103
+ ctx.io.stdout(m.listHeader(ctx.level.userConfigPath));
104
+ for (const ref of list) {
105
+ const parts = splitEnabledRef(ref);
106
+ const provider = parts === undefined ? undefined : ctx.registry.get(parts.provider);
107
+ const known = parts === undefined ||
108
+ parts.model === "*" ||
109
+ provider === undefined ||
110
+ provider.models.length === 0 ||
111
+ provider.models.some((model) => model.id === parts.model);
112
+ const notes = [
113
+ parts === undefined ? "?" : await status(parts.provider),
114
+ ...(known ? [] : [m.notInTable]),
115
+ ];
116
+ ctx.io.stdout(` ${ref} ${notes.join(" · ")}\n`);
117
+ }
118
+ return ExitCode.Ok;
119
+ }
120
+ ctx.io.stdout(m.listUnset);
121
+ let shown = 0;
122
+ for (const provider of ctx.registry.list()) {
123
+ const access = await providerAccess(ctx.registry, provider);
124
+ if (!accessReady(access))
125
+ continue;
126
+ const label = access === "none" ? labels.noKey : labels[access];
127
+ for (const model of provider.models) {
128
+ ctx.io.stdout(` ${provider.id}/${model.id} ${label}\n`);
129
+ shown++;
130
+ }
131
+ }
132
+ if (shown === 0)
133
+ ctx.io.stdout(m.nothing);
134
+ return ExitCode.Ok;
135
+ }
136
+ export const ENABLE_ACTION = {
137
+ usage: "ama models enable <provider/model[@channel]|provider/*>…",
138
+ required: "<provider/model>",
139
+ run: enable,
140
+ };
141
+ export const DISABLE_ACTION = {
142
+ usage: "ama models disable <provider/model[@channel]|provider/*>…",
143
+ required: "<provider/model>",
144
+ run: disable,
145
+ };
@@ -9,6 +9,8 @@
9
9
  * 选项表与必填位置参数都从表里来。
10
10
  *
11
11
  * [W5-M1] `refresh`:models.dev 显式刷新(`refresh-catalog` 保留为别名)。
12
+ *
13
+ * `enable` / `disable` / `list --enabled`:模型选择器清单 `models.enabled`(models-enable.ts)。
12
14
  */
13
15
  import type { ProviderRegistryApi } from "../../ai/types.js";
14
16
  import type { CliIo, RuntimeDeps } from "../deps.js";
@@ -38,5 +40,5 @@ export interface ModelsAction {
38
40
  export declare const CHECK_TIMEOUT_MS = 30000;
39
41
  /** 动作表:键是子命令名,顺序即用法文本顺序。 */
40
42
  export declare const MODELS_ACTIONS: Readonly<Record<string, ModelsAction>>;
41
- export declare const MODELS_USAGE: string;
43
+ export declare function modelsUsage(): string;
42
44
  export declare function runModels(argv: readonly string[], io: CliIo, deps: Pick<RuntimeDeps, "providers"> | undefined): Promise<number>;