@armadra/agent 0.3.0 → 0.5.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 (527) hide show
  1. package/CHANGELOG.md +257 -0
  2. package/README.md +263 -95
  3. package/THIRD_PARTY_NOTICES.md +34 -0
  4. package/dist/acp.d.ts +18 -0
  5. package/dist/acp.js +19 -0
  6. package/dist/agent/limits.d.ts +38 -0
  7. package/dist/agent/limits.js +127 -0
  8. package/dist/agent/loop-guard.d.ts +38 -0
  9. package/dist/agent/loop-guard.js +95 -0
  10. package/dist/agent/loop.d.ts +4 -0
  11. package/dist/agent/loop.js +7 -0
  12. package/dist/agent/prompt-rules.d.ts +12 -0
  13. package/dist/agent/prompt-rules.js +18 -0
  14. package/dist/agent/reminders.d.ts +59 -0
  15. package/dist/agent/reminders.js +327 -0
  16. package/dist/agent/retry.d.ts +1 -1
  17. package/dist/agent/retry.js +2 -1
  18. package/dist/agent/session-cache.d.ts +5 -0
  19. package/dist/agent/session-cache.js +18 -2
  20. package/dist/agent/session-classifier.d.ts +18 -0
  21. package/dist/agent/session-classifier.js +105 -0
  22. package/dist/agent/session-compaction.d.ts +35 -6
  23. package/dist/agent/session-compaction.js +157 -31
  24. package/dist/agent/session-core.d.ts +40 -1
  25. package/dist/agent/session-extensions.d.ts +61 -0
  26. package/dist/agent/session-extensions.js +129 -0
  27. package/dist/agent/session-images.d.ts +23 -0
  28. package/dist/agent/session-images.js +97 -0
  29. package/dist/agent/session-plan.d.ts +21 -0
  30. package/dist/agent/session-plan.js +524 -0
  31. package/dist/agent/session-rewind.d.ts +81 -0
  32. package/dist/agent/session-rewind.js +354 -0
  33. package/dist/agent/session-run.d.ts +28 -1
  34. package/dist/agent/session-run.js +157 -6
  35. package/dist/agent/session-settings.d.ts +49 -0
  36. package/dist/agent/session-settings.js +95 -0
  37. package/dist/agent/session-subagent.d.ts +36 -24
  38. package/dist/agent/session-subagent.js +259 -129
  39. package/dist/agent/session-sync.d.ts +10 -3
  40. package/dist/agent/session-sync.js +37 -8
  41. package/dist/agent/session-telemetry.d.ts +39 -0
  42. package/dist/agent/session-telemetry.js +231 -0
  43. package/dist/agent/session-tools.js +63 -3
  44. package/dist/agent/session.d.ts +33 -29
  45. package/dist/agent/session.js +91 -126
  46. package/dist/agent/subagent-registry.d.ts +91 -0
  47. package/dist/agent/subagent-registry.js +494 -0
  48. package/dist/agent/system-prompt.d.ts +6 -3
  49. package/dist/agent/system-prompt.js +7 -2
  50. package/dist/agent/tool-runner.d.ts +8 -1
  51. package/dist/agent/tool-runner.js +72 -6
  52. package/dist/agent/types-w5.d.ts +192 -0
  53. package/dist/agent/types-w5.js +10 -0
  54. package/dist/agent/types.d.ts +55 -4
  55. package/dist/agent/types.js +2 -0
  56. package/dist/agent/worktree.d.ts +36 -0
  57. package/dist/agent/worktree.js +86 -0
  58. package/dist/agents/builtin.d.ts +14 -0
  59. package/dist/agents/builtin.js +39 -0
  60. package/dist/agents/catalog.d.ts +43 -0
  61. package/dist/agents/catalog.js +82 -0
  62. package/dist/agents/discover.d.ts +35 -0
  63. package/dist/agents/discover.js +83 -0
  64. package/dist/agents/external.d.ts +82 -0
  65. package/dist/agents/external.js +326 -0
  66. package/dist/agents/parse.d.ts +18 -0
  67. package/dist/agents/parse.js +116 -0
  68. package/dist/agents/result.d.ts +32 -0
  69. package/dist/agents/result.js +67 -0
  70. package/dist/agents/task-control.d.ts +17 -0
  71. package/dist/agents/task-control.js +17 -0
  72. package/dist/agents/task-record.d.ts +78 -0
  73. package/dist/agents/task-record.js +141 -0
  74. package/dist/agents/types.d.ts +46 -0
  75. package/dist/agents/types.js +8 -0
  76. package/dist/ai/apis/anthropic-compat.d.ts +36 -0
  77. package/dist/ai/apis/anthropic-compat.js +92 -0
  78. package/dist/ai/apis/anthropic-messages.js +3 -2
  79. package/dist/ai/apis/anthropic-request.d.ts +7 -6
  80. package/dist/ai/apis/anthropic-request.js +10 -28
  81. package/dist/ai/apis/cache-params.d.ts +11 -2
  82. package/dist/ai/apis/cache-params.js +25 -6
  83. package/dist/ai/apis/google-generative-ai.js +3 -2
  84. package/dist/ai/apis/openai-compat.d.ts +4 -1
  85. package/dist/ai/apis/openai-compat.js +8 -1
  86. package/dist/ai/apis/openai-completions.js +3 -2
  87. package/dist/ai/apis/openai-responses.js +3 -2
  88. package/dist/ai/http.d.ts +28 -6
  89. package/dist/ai/http.js +41 -8
  90. package/dist/ai/image-limits.d.ts +45 -0
  91. package/dist/ai/image-limits.js +68 -0
  92. package/dist/ai/providers/builtin.d.ts +18 -6
  93. package/dist/ai/providers/builtin.js +135 -6
  94. package/dist/ai/providers/catalog-data.js +17 -13
  95. package/dist/ai/providers/catalog.d.ts +60 -7
  96. package/dist/ai/providers/catalog.js +197 -38
  97. package/dist/ai/providers/channels.d.ts +33 -3
  98. package/dist/ai/providers/channels.js +108 -7
  99. package/dist/ai/providers/enrich.d.ts +6 -3
  100. package/dist/ai/providers/enrich.js +19 -4
  101. package/dist/ai/providers/models-dev-cache.d.ts +28 -24
  102. package/dist/ai/providers/models-dev-cache.js +92 -78
  103. package/dist/ai/providers/models-dev-data.d.ts +7 -0
  104. package/dist/ai/providers/models-dev-data.js +32 -0
  105. package/dist/ai/providers/models-dev-snapshot.d.ts +50 -0
  106. package/dist/ai/providers/models-dev-snapshot.js +137 -0
  107. package/dist/ai/providers/models-dev.d.ts +51 -10
  108. package/dist/ai/providers/models-dev.js +132 -39
  109. package/dist/ai/providers/registry.d.ts +28 -11
  110. package/dist/ai/providers/registry.js +112 -65
  111. package/dist/ai/providers/suggest.d.ts +18 -0
  112. package/dist/ai/providers/suggest.js +72 -0
  113. package/dist/ai/sse.d.ts +6 -2
  114. package/dist/ai/sse.js +22 -2
  115. package/dist/ai/types.d.ts +37 -4
  116. package/dist/ai/types.js +5 -0
  117. package/dist/bundle/ama.cjs +41979 -21147
  118. package/dist/checkpoints/backend.d.ts +61 -0
  119. package/dist/checkpoints/backend.js +135 -0
  120. package/dist/checkpoints/blobs.d.ts +60 -0
  121. package/dist/checkpoints/blobs.js +203 -0
  122. package/dist/checkpoints/gc.d.ts +47 -0
  123. package/dist/checkpoints/gc.js +144 -0
  124. package/dist/checkpoints/git-head.d.ts +15 -0
  125. package/dist/checkpoints/git-head.js +89 -0
  126. package/dist/checkpoints/index.d.ts +17 -0
  127. package/dist/checkpoints/index.js +17 -0
  128. package/dist/checkpoints/replay.d.ts +48 -0
  129. package/dist/checkpoints/replay.js +154 -0
  130. package/dist/checkpoints/restore.d.ts +86 -0
  131. package/dist/checkpoints/restore.js +263 -0
  132. package/dist/checkpoints/settings.d.ts +14 -0
  133. package/dist/checkpoints/settings.js +23 -0
  134. package/dist/checkpoints/shadow-git.d.ts +108 -0
  135. package/dist/checkpoints/shadow-git.js +491 -0
  136. package/dist/checkpoints/shadow-restore.d.ts +25 -0
  137. package/dist/checkpoints/shadow-restore.js +128 -0
  138. package/dist/checkpoints/tracker.d.ts +64 -0
  139. package/dist/checkpoints/tracker.js +192 -0
  140. package/dist/checkpoints/types.d.ts +99 -0
  141. package/dist/checkpoints/types.js +12 -0
  142. package/dist/cli/args.d.ts +26 -7
  143. package/dist/cli/args.js +75 -82
  144. package/dist/cli/bootstrap.js +40 -4
  145. package/dist/cli/codemode-notice.d.ts +21 -0
  146. package/dist/cli/codemode-notice.js +56 -0
  147. package/dist/cli/compose-agents.d.ts +27 -0
  148. package/dist/cli/compose-agents.js +111 -0
  149. package/dist/cli/compose-extensions.d.ts +29 -0
  150. package/dist/cli/compose-extensions.js +44 -0
  151. package/dist/cli/compose-session.d.ts +8 -0
  152. package/dist/cli/compose-session.js +76 -2
  153. package/dist/cli/compose-store.d.ts +1 -1
  154. package/dist/cli/compose-store.js +3 -1
  155. package/dist/cli/compose.d.ts +17 -4
  156. package/dist/cli/compose.js +60 -14
  157. package/dist/cli/default-model.d.ts +38 -1
  158. package/dist/cli/default-model.js +96 -9
  159. package/dist/cli/deps.d.ts +42 -0
  160. package/dist/cli/exit-codes.d.ts +12 -0
  161. package/dist/cli/exit-codes.js +15 -0
  162. package/dist/cli/fake-visibility.d.ts +13 -0
  163. package/dist/cli/fake-visibility.js +26 -0
  164. package/dist/cli/from-prompt.d.ts +18 -0
  165. package/dist/cli/from-prompt.js +49 -0
  166. package/dist/cli/help-text.d.ts +4 -0
  167. package/dist/cli/help-text.js +102 -0
  168. package/dist/cli/main.d.ts +9 -2
  169. package/dist/cli/main.js +77 -3
  170. package/dist/cli/proxy.d.ts +51 -0
  171. package/dist/cli/proxy.js +135 -0
  172. package/dist/cli/startup-screen.d.ts +29 -0
  173. package/dist/cli/startup-screen.js +51 -2
  174. package/dist/cli/startup-steps.d.ts +1 -1
  175. package/dist/cli/startup-steps.js +21 -13
  176. package/dist/cli/subcommands/config.d.ts +22 -3
  177. package/dist/cli/subcommands/config.js +119 -21
  178. package/dist/cli/subcommands/context.js +4 -1
  179. package/dist/cli/subcommands/doctor.js +33 -1
  180. package/dist/cli/subcommands/init.js +2 -1
  181. package/dist/cli/subcommands/models-discover.d.ts +15 -9
  182. package/dist/cli/subcommands/models-discover.js +58 -52
  183. package/dist/cli/subcommands/models.d.ts +2 -0
  184. package/dist/cli/subcommands/models.js +33 -14
  185. package/dist/cli/subcommands/probe-runner.d.ts +96 -0
  186. package/dist/cli/subcommands/probe-runner.js +264 -0
  187. package/dist/cli/subcommands/providers-probe.d.ts +34 -0
  188. package/dist/cli/subcommands/providers-probe.js +87 -0
  189. package/dist/cli/subcommands/providers.d.ts +3 -2
  190. package/dist/cli/subcommands/providers.js +53 -51
  191. package/dist/cli/subcommands/sessions-export.d.ts +10 -0
  192. package/dist/cli/subcommands/sessions-export.js +59 -0
  193. package/dist/cli/subcommands/sessions-search.d.ts +13 -0
  194. package/dist/cli/subcommands/sessions-search.js +103 -0
  195. package/dist/cli/subcommands/sessions.d.ts +6 -3
  196. package/dist/cli/subcommands/sessions.js +58 -3
  197. package/dist/cli/subcommands/stats.d.ts +17 -0
  198. package/dist/cli/subcommands/stats.js +198 -0
  199. package/dist/cli/system-prompt-arg.d.ts +11 -0
  200. package/dist/cli/system-prompt-arg.js +34 -0
  201. package/dist/codemode/capability.d.ts +24 -7
  202. package/dist/codemode/capability.js +38 -10
  203. package/dist/codemode/host-side.d.ts +14 -0
  204. package/dist/codemode/host-side.js +24 -1
  205. package/dist/codemode/modes.d.ts +4 -11
  206. package/dist/codemode/modes.js +5 -27
  207. package/dist/codemode/tool.d.ts +18 -14
  208. package/dist/codemode/tool.js +76 -31
  209. package/dist/compaction/breaker.d.ts +25 -9
  210. package/dist/compaction/breaker.js +47 -17
  211. package/dist/compaction/estimate.d.ts +11 -3
  212. package/dist/compaction/estimate.js +64 -22
  213. package/dist/compaction/image-budget.d.ts +45 -0
  214. package/dist/compaction/image-budget.js +115 -0
  215. package/dist/compaction/post-compact.d.ts +38 -0
  216. package/dist/compaction/post-compact.js +152 -0
  217. package/dist/compaction/protect.d.ts +27 -0
  218. package/dist/compaction/protect.js +56 -0
  219. package/dist/compaction/prune-tier.d.ts +58 -12
  220. package/dist/compaction/prune-tier.js +120 -54
  221. package/dist/compaction/summarize-tier.d.ts +23 -4
  222. package/dist/compaction/summarize-tier.js +100 -29
  223. package/dist/config/checker.d.ts +28 -0
  224. package/dist/config/checker.js +97 -0
  225. package/dist/config/init.d.ts +6 -2
  226. package/dist/config/init.js +12 -5
  227. package/dist/config/json-schema.d.ts +1 -0
  228. package/dist/config/json-schema.js +98 -4
  229. package/dist/config/key-docs.d.ts +22 -0
  230. package/dist/config/key-docs.js +174 -0
  231. package/dist/config/merge.d.ts +12 -9
  232. package/dist/config/merge.js +102 -13
  233. package/dist/config/profile.d.ts +2 -0
  234. package/dist/config/profile.js +2 -0
  235. package/dist/config/schema-w5.d.ts +18 -0
  236. package/dist/config/schema-w5.js +109 -0
  237. package/dist/config/schema.d.ts +5 -9
  238. package/dist/config/schema.js +91 -118
  239. package/dist/config/types-w5.d.ts +118 -0
  240. package/dist/config/types-w5.js +20 -0
  241. package/dist/config/types.d.ts +84 -7
  242. package/dist/config/types.js +29 -1
  243. package/dist/drivers/acp/client.d.ts +57 -0
  244. package/dist/drivers/acp/client.js +160 -0
  245. package/dist/drivers/acp/driver.d.ts +31 -0
  246. package/dist/drivers/acp/driver.js +274 -0
  247. package/dist/drivers/acp/testing/fake-agent-main.d.ts +5 -0
  248. package/dist/drivers/acp/testing/fake-agent-main.js +7 -0
  249. package/dist/drivers/acp/testing/fake-agent.d.ts +27 -0
  250. package/dist/drivers/acp/testing/fake-agent.js +211 -0
  251. package/dist/drivers/acp/types.d.ts +285 -0
  252. package/dist/drivers/acp/types.js +36 -0
  253. package/dist/drivers/agents.d.ts +58 -0
  254. package/dist/drivers/agents.js +142 -0
  255. package/dist/drivers/base.d.ts +35 -0
  256. package/dist/drivers/base.js +59 -0
  257. package/dist/drivers/catalog.d.ts +46 -0
  258. package/dist/drivers/catalog.js +167 -0
  259. package/dist/drivers/env.d.ts +20 -0
  260. package/dist/drivers/env.js +46 -0
  261. package/dist/drivers/host-runners.d.ts +18 -0
  262. package/dist/drivers/host-runners.js +45 -0
  263. package/dist/drivers/jsonrpc.d.ts +58 -0
  264. package/dist/drivers/jsonrpc.js +180 -0
  265. package/dist/drivers/native/claude-normalize.d.ts +46 -0
  266. package/dist/drivers/native/claude-normalize.js +106 -0
  267. package/dist/drivers/native/claude-stream.d.ts +29 -0
  268. package/dist/drivers/native/claude-stream.js +456 -0
  269. package/dist/drivers/native/codex-app-server.d.ts +26 -0
  270. package/dist/drivers/native/codex-app-server.js +407 -0
  271. package/dist/drivers/native/codex-normalize.d.ts +38 -0
  272. package/dist/drivers/native/codex-normalize.js +124 -0
  273. package/dist/drivers/native/oneshot.d.ts +28 -0
  274. package/dist/drivers/native/oneshot.js +312 -0
  275. package/dist/drivers/permissions.d.ts +40 -0
  276. package/dist/drivers/permissions.js +92 -0
  277. package/dist/drivers/pids.d.ts +32 -0
  278. package/dist/drivers/pids.js +93 -0
  279. package/dist/drivers/pool.d.ts +28 -0
  280. package/dist/drivers/pool.js +96 -0
  281. package/dist/drivers/probe.d.ts +47 -0
  282. package/dist/drivers/probe.js +172 -0
  283. package/dist/drivers/process.d.ts +48 -0
  284. package/dist/drivers/process.js +100 -0
  285. package/dist/drivers/runner.d.ts +61 -0
  286. package/dist/drivers/runner.js +388 -0
  287. package/dist/drivers/store.d.ts +49 -0
  288. package/dist/drivers/store.js +91 -0
  289. package/dist/drivers/turn.d.ts +41 -0
  290. package/dist/drivers/turn.js +99 -0
  291. package/dist/drivers/types.d.ts +122 -0
  292. package/dist/drivers/types.js +11 -0
  293. package/dist/git/info.d.ts +75 -0
  294. package/dist/git/info.js +191 -0
  295. package/dist/hooks/protocol.js +6 -1
  296. package/dist/hooks/types.d.ts +10 -1
  297. package/dist/hooks/types.js +2 -0
  298. package/dist/host/api-impl.d.ts +7 -0
  299. package/dist/host/api-impl.js +15 -0
  300. package/dist/host/types.d.ts +24 -2
  301. package/dist/host/types.js +4 -0
  302. package/dist/index.d.ts +3 -0
  303. package/dist/index.js +1 -0
  304. package/dist/modes/acp/acp-events.d.ts +46 -0
  305. package/dist/modes/acp/acp-events.js +233 -0
  306. package/dist/modes/acp/acp-mode.d.ts +17 -0
  307. package/dist/modes/acp/acp-mode.js +47 -0
  308. package/dist/modes/acp/acp-server.d.ts +79 -0
  309. package/dist/modes/acp/acp-server.js +315 -0
  310. package/dist/modes/commands-core.d.ts +7 -1
  311. package/dist/modes/commands-core.js +61 -5
  312. package/dist/modes/image-input.d.ts +12 -4
  313. package/dist/modes/image-input.js +22 -5
  314. package/dist/modes/interactive/agent-panels.d.ts +14 -0
  315. package/dist/modes/interactive/agent-panels.js +103 -0
  316. package/dist/modes/interactive/agent-ui.d.ts +73 -0
  317. package/dist/modes/interactive/agent-ui.js +234 -0
  318. package/dist/modes/interactive/approval-dialog.d.ts +40 -7
  319. package/dist/modes/interactive/approval-dialog.js +192 -35
  320. package/dist/modes/interactive/approval-merge.d.ts +41 -0
  321. package/dist/modes/interactive/approval-merge.js +89 -0
  322. package/dist/modes/interactive/clipboard-paste.d.ts +18 -0
  323. package/dist/modes/interactive/clipboard-paste.js +28 -0
  324. package/dist/modes/interactive/commands.d.ts +20 -3
  325. package/dist/modes/interactive/commands.js +75 -16
  326. package/dist/modes/interactive/double-esc.d.ts +20 -0
  327. package/dist/modes/interactive/double-esc.js +34 -0
  328. package/dist/modes/interactive/event-notices.d.ts +32 -0
  329. package/dist/modes/interactive/event-notices.js +79 -0
  330. package/dist/modes/interactive/external-editor.d.ts +16 -0
  331. package/dist/modes/interactive/external-editor.js +39 -0
  332. package/dist/modes/interactive/interactive-mode.d.ts +16 -2
  333. package/dist/modes/interactive/interactive-mode.js +184 -202
  334. package/dist/modes/interactive/key-dispatch.d.ts +18 -2
  335. package/dist/modes/interactive/key-dispatch.js +53 -6
  336. package/dist/modes/interactive/line/line-mode.d.ts +3 -1
  337. package/dist/modes/interactive/line/line-mode.js +28 -9
  338. package/dist/modes/interactive/line/line-render.d.ts +6 -1
  339. package/dist/modes/interactive/line/line-render.js +66 -8
  340. package/dist/modes/interactive/message-view.d.ts +49 -10
  341. package/dist/modes/interactive/message-view.js +262 -46
  342. package/dist/modes/interactive/panels.d.ts +35 -0
  343. package/dist/modes/interactive/panels.js +157 -0
  344. package/dist/modes/interactive/pickers.d.ts +23 -2
  345. package/dist/modes/interactive/pickers.js +48 -15
  346. package/dist/modes/interactive/plan-command.d.ts +40 -0
  347. package/dist/modes/interactive/plan-command.js +129 -0
  348. package/dist/modes/interactive/plan-dialog.d.ts +98 -0
  349. package/dist/modes/interactive/plan-dialog.js +290 -0
  350. package/dist/modes/interactive/plan-flow.d.ts +34 -0
  351. package/dist/modes/interactive/plan-flow.js +98 -0
  352. package/dist/modes/interactive/rewind-command.d.ts +31 -0
  353. package/dist/modes/interactive/rewind-command.js +106 -0
  354. package/dist/modes/interactive/rewind-flow.d.ts +37 -0
  355. package/dist/modes/interactive/rewind-flow.js +151 -0
  356. package/dist/modes/interactive/rewind-list.d.ts +36 -0
  357. package/dist/modes/interactive/rewind-list.js +123 -0
  358. package/dist/modes/interactive/rewind-panel.d.ts +77 -0
  359. package/dist/modes/interactive/rewind-panel.js +309 -0
  360. package/dist/modes/interactive/rewind-text.d.ts +40 -0
  361. package/dist/modes/interactive/rewind-text.js +139 -0
  362. package/dist/modes/interactive/run-indicator.d.ts +51 -0
  363. package/dist/modes/interactive/run-indicator.js +189 -0
  364. package/dist/modes/interactive/session-events.d.ts +24 -0
  365. package/dist/modes/interactive/session-events.js +96 -0
  366. package/dist/modes/interactive/startup-header.d.ts +40 -0
  367. package/dist/modes/interactive/startup-header.js +169 -0
  368. package/dist/modes/interactive/status-area.d.ts +73 -0
  369. package/dist/modes/interactive/status-area.js +190 -0
  370. package/dist/modes/interactive/status-bar.d.ts +107 -16
  371. package/dist/modes/interactive/status-bar.js +306 -81
  372. package/dist/modes/interactive/status-line.d.ts +33 -0
  373. package/dist/modes/interactive/status-line.js +113 -0
  374. package/dist/modes/interactive/subagent-view.d.ts +56 -0
  375. package/dist/modes/interactive/subagent-view.js +154 -0
  376. package/dist/modes/interactive/tasks-report.d.ts +27 -0
  377. package/dist/modes/interactive/tasks-report.js +114 -0
  378. package/dist/modes/interactive/tool-summary.d.ts +46 -0
  379. package/dist/modes/interactive/tool-summary.js +218 -0
  380. package/dist/modes/interactive/tool-view.d.ts +58 -15
  381. package/dist/modes/interactive/tool-view.js +233 -145
  382. package/dist/modes/print/print-mode.d.ts +40 -4
  383. package/dist/modes/print/print-mode.js +161 -8
  384. package/dist/modes/rpc/commands.d.ts +9 -0
  385. package/dist/modes/rpc/commands.js +49 -0
  386. package/dist/modes/rpc/rpc-mode.js +7 -1
  387. package/dist/modes/session-report.d.ts +11 -0
  388. package/dist/modes/session-report.js +48 -1
  389. package/dist/permissions/auto-safe.d.ts +65 -0
  390. package/dist/permissions/auto-safe.js +547 -0
  391. package/dist/permissions/classifier.d.ts +68 -0
  392. package/dist/permissions/classifier.js +186 -0
  393. package/dist/permissions/dangerous.d.ts +5 -0
  394. package/dist/permissions/dangerous.js +1 -1
  395. package/dist/permissions/modes.d.ts +30 -0
  396. package/dist/permissions/modes.js +78 -0
  397. package/dist/permissions/pipeline.d.ts +72 -6
  398. package/dist/permissions/pipeline.js +306 -11
  399. package/dist/permissions/protected.d.ts +19 -0
  400. package/dist/permissions/protected.js +74 -0
  401. package/dist/permissions/readonly-bash.d.ts +30 -0
  402. package/dist/permissions/readonly-bash.js +118 -0
  403. package/dist/permissions/rules.js +3 -0
  404. package/dist/permissions/types.d.ts +92 -3
  405. package/dist/permissions/types.js +3 -0
  406. package/dist/plan/compose.d.ts +9 -0
  407. package/dist/plan/compose.js +19 -0
  408. package/dist/plan/controller.d.ts +71 -0
  409. package/dist/plan/controller.js +27 -0
  410. package/dist/plan/done-markers.d.ts +17 -0
  411. package/dist/plan/done-markers.js +51 -0
  412. package/dist/plan/extract.d.ts +29 -0
  413. package/dist/plan/extract.js +160 -0
  414. package/dist/plan/prompts.d.ts +36 -0
  415. package/dist/plan/prompts.js +89 -0
  416. package/dist/plan/store.d.ts +37 -0
  417. package/dist/plan/store.js +90 -0
  418. package/dist/rpc.d.ts +58 -2
  419. package/dist/rpc.js +7 -0
  420. package/dist/sandbox/bash.d.ts +74 -0
  421. package/dist/sandbox/bash.js +126 -0
  422. package/dist/sandbox/detect.d.ts +48 -0
  423. package/dist/sandbox/detect.js +149 -0
  424. package/dist/sandbox/index.d.ts +5 -0
  425. package/dist/sandbox/index.js +5 -0
  426. package/dist/sandbox/profile.d.ts +33 -0
  427. package/dist/sandbox/profile.js +76 -0
  428. package/dist/sandbox/wrap.d.ts +29 -0
  429. package/dist/sandbox/wrap.js +117 -0
  430. package/dist/sdk.d.ts +42 -5
  431. package/dist/sdk.js +34 -4
  432. package/dist/session/export.d.ts +32 -0
  433. package/dist/session/export.js +187 -0
  434. package/dist/session/redact.d.ts +15 -0
  435. package/dist/session/redact.js +55 -0
  436. package/dist/session/reuse.d.ts +33 -0
  437. package/dist/session/reuse.js +86 -0
  438. package/dist/session/scan.d.ts +34 -0
  439. package/dist/session/scan.js +140 -0
  440. package/dist/session/search.d.ts +52 -0
  441. package/dist/session/search.js +211 -0
  442. package/dist/session/stats-aggregate.d.ts +63 -0
  443. package/dist/session/stats-aggregate.js +163 -0
  444. package/dist/session/stats-index.d.ts +26 -0
  445. package/dist/session/stats-index.js +91 -0
  446. package/dist/session/stats-scan.d.ts +54 -0
  447. package/dist/session/stats-scan.js +236 -0
  448. package/dist/session/types.d.ts +3 -1
  449. package/dist/session/types.js +1 -0
  450. package/dist/skills/builtin.d.ts +31 -0
  451. package/dist/skills/builtin.js +109 -0
  452. package/dist/skills/discover.d.ts +2 -1
  453. package/dist/skills/index-prompt.js +5 -8
  454. package/dist/tools/background-jobs.d.ts +71 -0
  455. package/dist/tools/background-jobs.js +198 -0
  456. package/dist/tools/bash.d.ts +53 -1
  457. package/dist/tools/bash.js +158 -7
  458. package/dist/tools/clipboard-image.d.ts +44 -0
  459. package/dist/tools/clipboard-image.js +148 -0
  460. package/dist/tools/edit.d.ts +2 -0
  461. package/dist/tools/edit.js +18 -3
  462. package/dist/tools/image-file.d.ts +38 -3
  463. package/dist/tools/image-file.js +81 -10
  464. package/dist/tools/image-resize.d.ts +58 -0
  465. package/dist/tools/image-resize.js +97 -0
  466. package/dist/tools/presets.d.ts +40 -8
  467. package/dist/tools/presets.js +65 -19
  468. package/dist/tools/read.d.ts +5 -2
  469. package/dist/tools/read.js +13 -10
  470. package/dist/tools/registry.d.ts +7 -1
  471. package/dist/tools/registry.js +27 -4
  472. package/dist/tools/task-ctl.d.ts +22 -0
  473. package/dist/tools/task-ctl.js +116 -0
  474. package/dist/tools/task.d.ts +22 -10
  475. package/dist/tools/task.js +66 -26
  476. package/dist/tools/todo.d.ts +22 -2
  477. package/dist/tools/todo.js +58 -14
  478. package/dist/tools/truncate.d.ts +15 -0
  479. package/dist/tools/truncate.js +25 -0
  480. package/dist/tools/types.d.ts +113 -0
  481. package/dist/tools/types.js +5 -0
  482. package/dist/tools/write.js +3 -0
  483. package/dist/tui/component.d.ts +8 -2
  484. package/dist/tui/component.js +3 -1
  485. package/dist/tui/components/box.d.ts +6 -1
  486. package/dist/tui/components/box.js +16 -6
  487. package/dist/tui/components/card.d.ts +23 -0
  488. package/dist/tui/components/card.js +37 -0
  489. package/dist/tui/components/editor-history.d.ts +6 -0
  490. package/dist/tui/components/editor-history.js +45 -0
  491. package/dist/tui/components/editor-paste.d.ts +1 -1
  492. package/dist/tui/components/editor-paste.js +4 -4
  493. package/dist/tui/components/editor.d.ts +11 -5
  494. package/dist/tui/components/editor.js +52 -58
  495. package/dist/tui/components/key-value.d.ts +3 -0
  496. package/dist/tui/components/key-value.js +16 -6
  497. package/dist/tui/components/loader.d.ts +37 -7
  498. package/dist/tui/components/loader.js +84 -21
  499. package/dist/tui/components/markdown.d.ts +5 -1
  500. package/dist/tui/components/markdown.js +45 -21
  501. package/dist/tui/components/meter.d.ts +3 -3
  502. package/dist/tui/components/meter.js +13 -11
  503. package/dist/tui/components/select-list.d.ts +23 -1
  504. package/dist/tui/components/select-list.js +76 -13
  505. package/dist/tui/glyphs.d.ts +72 -0
  506. package/dist/tui/glyphs.js +118 -0
  507. package/dist/tui/keybindings.d.ts +5 -0
  508. package/dist/tui/keybindings.js +5 -0
  509. package/dist/tui/theme.d.ts +30 -6
  510. package/dist/tui/theme.js +103 -17
  511. package/dist/tui.d.ts +4 -2
  512. package/dist/tui.js +3 -1
  513. package/docs/acp.md +78 -0
  514. package/docs/agents.md +250 -0
  515. package/docs/codemode.md +28 -10
  516. package/docs/hooks.md +36 -32
  517. package/docs/permissions.md +212 -0
  518. package/docs/plan.md +107 -0
  519. package/docs/providers.md +261 -62
  520. package/docs/rewind-plan.md +181 -0
  521. package/docs/rpc.md +127 -40
  522. package/docs/sandbox.md +215 -0
  523. package/docs/session-format.md +43 -22
  524. package/docs/sessions.md +174 -0
  525. package/docs/tui-design.md +751 -0
  526. package/docs/tui.md +260 -64
  527. package/package.json +15 -2
@@ -0,0 +1,50 @@
1
+ /**
2
+ * 入库的 models.dev 快照(docs/wave5-plan.md §2.1、docs/providers.md「模型元数据」)。
3
+ *
4
+ * `models-dev/*.json` 由 `scripts/update-models-dev.mjs` 生成并内联进 `models-dev-data.ts`(单 bundle,
5
+ * 运行时不读 JSON 文件、不联网)。本模块解析内联数据,并提供与脚本同一口径的 `buildSnapshot()`
6
+ * (`ama models refresh` 用它裁剪联网拉到的 api.json)与新旧对比 `diffSnapshots()`。
7
+ */
8
+ import { ModelsDevIndex, type ModelsDevData, type ModelsDevModel, type ModelsDevProvider } from "./models-dev.js";
9
+ export interface SnapshotMeta {
10
+ /** ISO 8601;只在内容 sha256 变化时更新。 */
11
+ fetchedAt: string;
12
+ license: string;
13
+ sha256: string;
14
+ source: string;
15
+ upstream: string;
16
+ }
17
+ /** 收录清单(`models-dev/_providers.json`):供应商 id 与 OpenRouter 一类聚合商的前缀白名单。 */
18
+ export interface SnapshotList {
19
+ providers: string[];
20
+ prefixes?: Record<string, string[]>;
21
+ }
22
+ export declare function snapshotMeta(): SnapshotMeta;
23
+ export declare function snapshotList(): SnapshotList;
24
+ /** 文件形状(模型不带 id)→ 运行时形状(补 id)。 */
25
+ export declare function fromSnapshotFile(file: {
26
+ id: string;
27
+ name?: string;
28
+ api?: string;
29
+ models: Record<string, Omit<ModelsDevModel, "id">>;
30
+ }): ModelsDevProvider;
31
+ /** 运行时形状 → 文件形状(去掉模型 id 与 tool_call,与脚本写出的 JSON 一致)。 */
32
+ export declare function toSnapshotFile(provider: ModelsDevProvider): unknown;
33
+ /** 内置快照(同一进程只解析一次;调用方不得修改)。 */
34
+ export declare function builtinSnapshot(): ModelsDevData;
35
+ export declare function builtinSnapshotIndex(): ModelsDevIndex;
36
+ /**
37
+ * 按清单裁剪 api.json(与脚本同一口径)。`only` 只取其中几家。校验失败抛错:顶层不是对象、
38
+ * 清单里的供应商缺失或过滤后没有模型(防止上游改版把数据清空)。
39
+ */
40
+ export declare function buildSnapshot(raw: unknown, snapshot?: SnapshotList, only?: readonly string[]): ModelsDevData;
41
+ export interface SnapshotDiff {
42
+ added: string[];
43
+ removed: string[];
44
+ /** `provider/model:context a → b;cost …`。 */
45
+ changed: string[];
46
+ }
47
+ /** 新旧对比(与脚本摘要同一口径);只比较 `after` 里出现的供应商。 */
48
+ export declare function diffSnapshots(before: ModelsDevData, after: ModelsDevData): SnapshotDiff;
49
+ /** 快照 ⊕ 覆盖:同 provider/model 以覆盖为准,其余沿用快照。 */
50
+ export declare function mergeSnapshot(base: ModelsDevData, override: ModelsDevData): ModelsDevData;
@@ -0,0 +1,137 @@
1
+ /**
2
+ * 入库的 models.dev 快照(docs/wave5-plan.md §2.1、docs/providers.md「模型元数据」)。
3
+ *
4
+ * `models-dev/*.json` 由 `scripts/update-models-dev.mjs` 生成并内联进 `models-dev-data.ts`(单 bundle,
5
+ * 运行时不读 JSON 文件、不联网)。本模块解析内联数据,并提供与脚本同一口径的 `buildSnapshot()`
6
+ * (`ama models refresh` 用它裁剪联网拉到的 api.json)与新旧对比 `diffSnapshots()`。
7
+ */
8
+ import { MODELS_DEV_SOURCES } from "./models-dev-data.js";
9
+ import { ModelsDevIndex, keepForSnapshot, trimProvider, } from "./models-dev.js";
10
+ function parse(id) {
11
+ const text = MODELS_DEV_SOURCES[id];
12
+ if (text === undefined)
13
+ throw new Error(`models.dev 快照缺少 ${id}`);
14
+ return JSON.parse(text);
15
+ }
16
+ let meta;
17
+ let list;
18
+ let data;
19
+ let index;
20
+ export function snapshotMeta() {
21
+ meta ??= parse("_meta");
22
+ return meta;
23
+ }
24
+ export function snapshotList() {
25
+ list ??= parse("_providers");
26
+ return list;
27
+ }
28
+ /** 文件形状(模型不带 id)→ 运行时形状(补 id)。 */
29
+ export function fromSnapshotFile(file) {
30
+ const models = {};
31
+ for (const [id, model] of Object.entries(file.models))
32
+ models[id] = { id, ...model };
33
+ return {
34
+ id: file.id,
35
+ ...(file.name !== undefined ? { name: file.name } : {}),
36
+ ...(file.api !== undefined ? { api: file.api } : {}),
37
+ models,
38
+ };
39
+ }
40
+ /** 运行时形状 → 文件形状(去掉模型 id 与 tool_call,与脚本写出的 JSON 一致)。 */
41
+ export function toSnapshotFile(provider) {
42
+ const models = {};
43
+ for (const [id, model] of Object.entries(provider.models)) {
44
+ const { id: _id, tool_call: _toolCall, ...rest } = model;
45
+ models[id] = rest;
46
+ }
47
+ return { ...provider, models };
48
+ }
49
+ /** 内置快照(同一进程只解析一次;调用方不得修改)。 */
50
+ export function builtinSnapshot() {
51
+ if (data === undefined) {
52
+ const out = {};
53
+ for (const id of snapshotList().providers)
54
+ out[id] = fromSnapshotFile(parse(id));
55
+ data = out;
56
+ }
57
+ return data;
58
+ }
59
+ export function builtinSnapshotIndex() {
60
+ index ??= new ModelsDevIndex(builtinSnapshot());
61
+ return index;
62
+ }
63
+ function isRecord(value) {
64
+ return typeof value === "object" && value !== null && !Array.isArray(value);
65
+ }
66
+ /**
67
+ * 按清单裁剪 api.json(与脚本同一口径)。`only` 只取其中几家。校验失败抛错:顶层不是对象、
68
+ * 清单里的供应商缺失或过滤后没有模型(防止上游改版把数据清空)。
69
+ */
70
+ export function buildSnapshot(raw, snapshot = snapshotList(), only) {
71
+ if (!isRecord(raw))
72
+ throw new Error("api.json 顶层不是对象");
73
+ const out = {};
74
+ for (const id of only ?? snapshot.providers) {
75
+ const provider = raw[id];
76
+ if (!isRecord(provider))
77
+ throw new Error(`api.json 缺少供应商 ${id}`);
78
+ const prefixes = snapshot.prefixes?.[id];
79
+ const trimmed = trimProvider(id, provider, (modelId, model) => keepForSnapshot(model) &&
80
+ (prefixes === undefined || prefixes.some((p) => modelId.startsWith(`${p}/`))));
81
+ if (Object.keys(trimmed.models).length === 0)
82
+ throw new Error(`${id} 过滤后没有模型`);
83
+ for (const model of Object.values(trimmed.models))
84
+ delete model.tool_call;
85
+ out[id] = trimmed;
86
+ }
87
+ return out;
88
+ }
89
+ function priceText(model) {
90
+ const c = model.cost;
91
+ return c === undefined
92
+ ? "无"
93
+ : `${c.input}/${c.output}/${c.cache_read ?? "-"}/${c.cache_write ?? "-"}`;
94
+ }
95
+ /** 新旧对比(与脚本摘要同一口径);只比较 `after` 里出现的供应商。 */
96
+ export function diffSnapshots(before, after) {
97
+ const out = { added: [], removed: [], changed: [] };
98
+ for (const [providerId, provider] of Object.entries(after)) {
99
+ const old = before[providerId]?.models ?? {};
100
+ for (const id of Object.keys(old))
101
+ if (provider.models[id] === undefined)
102
+ out.removed.push(`${providerId}/${id}`);
103
+ for (const [id, next] of Object.entries(provider.models)) {
104
+ const prev = old[id];
105
+ if (prev === undefined) {
106
+ out.added.push(`${providerId}/${id}`);
107
+ continue;
108
+ }
109
+ const parts = [];
110
+ for (const key of ["context", "output"]) {
111
+ if (prev.limit?.[key] !== next.limit?.[key])
112
+ parts.push(`${key} ${prev.limit?.[key] ?? "无"} → ${next.limit?.[key] ?? "无"}`);
113
+ }
114
+ if (priceText(prev) !== priceText(next))
115
+ parts.push(`cost ${priceText(prev)} → ${priceText(next)}`);
116
+ if (parts.length > 0)
117
+ out.changed.push(`${providerId}/${id}:${parts.join(";")}`);
118
+ }
119
+ }
120
+ out.added.sort();
121
+ out.removed.sort();
122
+ out.changed.sort();
123
+ return out;
124
+ }
125
+ /** 快照 ⊕ 覆盖:同 provider/model 以覆盖为准,其余沿用快照。 */
126
+ export function mergeSnapshot(base, override) {
127
+ const out = { ...base };
128
+ for (const [id, provider] of Object.entries(override)) {
129
+ const prev = base[id];
130
+ out[id] = {
131
+ ...prev,
132
+ ...provider,
133
+ models: { ...prev?.models, ...provider.models },
134
+ };
135
+ }
136
+ return out;
137
+ }
@@ -9,10 +9,24 @@
9
9
  * 本模块只做纯计算(不读文件、不联网);缓存与拉取在 models-dev-cache.ts。
10
10
  */
11
11
  import type { ModelCost } from "../types.js";
12
- /** 用到的模型字段(name、推理、工具调用、输入模态、上下限、价格、canonical);其余写缓存时丢掉。 */
12
+ /** 价格($/1M token);input 与 output 都有才保留。 */
13
+ export interface ModelsDevPrices {
14
+ input: number;
15
+ output: number;
16
+ cache_read?: number;
17
+ cache_write?: number;
18
+ }
19
+ /**
20
+ * 用到的模型字段(models.dev 原名);其余裁剪时丢掉。快照只多存 family / knowledge /
21
+ * release_date / limit.input / 价格档位 / interleaved / status(docs/wave5-plan.md §2.1)。
22
+ */
13
23
  export interface ModelsDevModel {
14
24
  id: string;
15
25
  name?: string;
26
+ family?: string;
27
+ /** 知识截止(`YYYY-MM` / `YYYY-MM-DD`)。 */
28
+ knowledge?: string;
29
+ release_date?: string;
16
30
  reasoning?: boolean;
17
31
  tool_call?: boolean;
18
32
  modalities?: {
@@ -20,25 +34,37 @@ export interface ModelsDevModel {
20
34
  };
21
35
  limit?: {
22
36
  context?: number;
23
- output?: number;
24
- };
25
- cost?: {
26
37
  input?: number;
27
38
  output?: number;
28
- cache_read?: number;
29
- cache_write?: number;
30
39
  };
40
+ cost?: ModelsDevPrices & {
41
+ context_over_200k?: ModelsDevPrices;
42
+ tiers?: (ModelsDevPrices & {
43
+ tier: {
44
+ size: number;
45
+ type: "context";
46
+ };
47
+ })[];
48
+ };
49
+ interleaved?: true | {
50
+ field: string;
51
+ };
52
+ /** 只留 beta(deprecated 在快照里已过滤)。 */
53
+ status?: "beta";
31
54
  canonical_model_id?: string;
32
55
  }
33
56
  export interface ModelsDevProvider {
34
57
  id: string;
35
58
  name?: string;
59
+ /** 供应商级 OpenAI / Anthropic 兼容 baseUrl(协议线索,展示用)。 */
60
+ api?: string;
36
61
  models: Record<string, ModelsDevModel>;
37
62
  }
38
63
  export type ModelsDevData = Record<string, ModelsDevProvider>;
39
64
  /**
40
- * 原厂供应商(models.dev 的供应商 id,顺序即优先级)。通义在 `alibaba`、Llama 在 `llama`、
41
- * 智谱国际站在 `zai`;models.dev 没有 `qwen` / `meta` 这样的供应商 id。
65
+ * 原厂供应商(models.dev 的供应商 id,顺序即优先级)。通义在 `alibaba`、Meta 在 `meta`(Llama API
66
+ * 在 `llama`)、智谱国际站在 `zai`、豆包在 `volcengine`、混元在 `tencent-tokenhub`;models.dev 没有
67
+ * `qwen` 这样的供应商 id。
42
68
  */
43
69
  export declare const FIRST_PARTY_PROVIDERS: readonly string[];
44
70
  /** maxTokens 的上限:models.dev 给原厂上限(常与上下文相同),每次请求都会作为 max_tokens 发出。 */
@@ -66,7 +92,22 @@ export interface ModelsDevFields {
66
92
  cost?: ModelCost;
67
93
  /** models.dev 的 tool_call;Model 上没有对应字段,只用于展示与写入过滤。 */
68
94
  toolCall?: boolean;
95
+ family?: string;
96
+ knowledge?: string;
97
+ releaseDate?: string;
98
+ inputLimit?: number;
99
+ status?: "beta";
69
100
  }
101
+ /**
102
+ * 映射口径:`custom`(自定义模型补全,缺省)maxTokens 封顶 64k、缺的缓存价按输入价;
103
+ * `catalog`(内置目录继承)maxTokens 不封顶(目录模型的输出上限就是原厂值,有意调小的写在目录里)、
104
+ * 缺的缓存价记 0(与目录一贯写法一致:没有单独计价)。
105
+ */
106
+ export type ModelsDevMapping = "custom" | "catalog";
107
+ /** 快照过滤:丢 deprecated、输出不含文本、上下文为 0 / 缺失、tool_call:false(docs/wave5-plan.md §2.1)。 */
108
+ export declare function keepForSnapshot(raw: unknown): boolean;
109
+ /** 裁剪一家供应商;`keep` 给出时只留它放行的模型(模型 id 按字典序)。 */
110
+ export declare function trimProvider(providerId: string, provider: Record<string, unknown>, keep?: (modelId: string, raw: unknown) => boolean): ModelsDevProvider;
70
111
  /** 校验并裁剪 api.json:只留用到的字段;形状不对的供应商 / 模型跳过。整体不是对象抛错。 */
71
112
  export declare function trimModelsDev(raw: unknown): ModelsDevData;
72
113
  /**
@@ -90,8 +131,8 @@ export declare class ModelsDevIndex {
90
131
  match(id: string, explicit?: string): ModelsDevMatch | undefined;
91
132
  private choose;
92
133
  }
93
- /** models.dev 条目 → ama Model 字段(规则见 docs/providers.md)。 */
94
- export declare function modelsDevFields(model: ModelsDevModel): ModelsDevFields;
134
+ /** models.dev 条目 → ama Model 字段(规则见 docs/providers.md「模型元数据」)。 */
135
+ export declare function modelsDevFields(model: ModelsDevModel, mapping?: ModelsDevMapping): ModelsDevFields;
95
136
  /** 可由 models.dev 补的 Model 字段(展示来源用)。 */
96
137
  export declare const ENRICHABLE_FIELDS: readonly ["contextWindow", "maxTokens", "input", "reasoning", "cost"];
97
138
  export type EnrichableField = (typeof ENRICHABLE_FIELDS)[number];
@@ -9,8 +9,9 @@
9
9
  * 本模块只做纯计算(不读文件、不联网);缓存与拉取在 models-dev-cache.ts。
10
10
  */
11
11
  /**
12
- * 原厂供应商(models.dev 的供应商 id,顺序即优先级)。通义在 `alibaba`、Llama 在 `llama`、
13
- * 智谱国际站在 `zai`;models.dev 没有 `qwen` / `meta` 这样的供应商 id。
12
+ * 原厂供应商(models.dev 的供应商 id,顺序即优先级)。通义在 `alibaba`、Meta 在 `meta`(Llama API
13
+ * 在 `llama`)、智谱国际站在 `zai`、豆包在 `volcengine`、混元在 `tencent-tokenhub`;models.dev 没有
14
+ * `qwen` 这样的供应商 id。
14
15
  */
15
16
  export const FIRST_PARTY_PROVIDERS = [
16
17
  "anthropic",
@@ -27,10 +28,14 @@ export const FIRST_PARTY_PROVIDERS = [
27
28
  "mistral",
28
29
  "minimax",
29
30
  "minimax-cn",
31
+ "meta",
30
32
  "llama",
31
33
  "cohere",
32
34
  "xiaomi",
33
35
  "stepfun",
36
+ "stepfun-ai",
37
+ "volcengine",
38
+ "tencent-tokenhub",
34
39
  "perplexity",
35
40
  "ai21",
36
41
  "upstage",
@@ -50,16 +55,59 @@ function nonNegative(value) {
50
55
  function strings(value) {
51
56
  return Array.isArray(value) ? value.filter((v) => typeof v === "string") : undefined;
52
57
  }
58
+ function prices(value) {
59
+ if (!isRecord(value))
60
+ return undefined;
61
+ const input = nonNegative(value["input"]);
62
+ const output = nonNegative(value["output"]);
63
+ if (input === undefined || output === undefined)
64
+ return undefined;
65
+ const out = { input, output };
66
+ const read = nonNegative(value["cache_read"]);
67
+ if (read !== undefined)
68
+ out.cache_read = read;
69
+ const write = nonNegative(value["cache_write"]);
70
+ if (write !== undefined)
71
+ out.cache_write = write;
72
+ return out;
73
+ }
74
+ function trimCost(value) {
75
+ const base = prices(value);
76
+ if (base === undefined || !isRecord(value))
77
+ return undefined;
78
+ const out = base;
79
+ const over = prices(value["context_over_200k"]);
80
+ if (over !== undefined)
81
+ out.context_over_200k = over;
82
+ const tiers = [];
83
+ for (const tier of Array.isArray(value["tiers"]) ? value["tiers"] : []) {
84
+ const p = prices(tier);
85
+ const spec = isRecord(tier) ? tier["tier"] : undefined;
86
+ const size = isRecord(spec) ? positive(spec["size"]) : undefined;
87
+ if (p !== undefined && size !== undefined && isRecord(spec) && spec["type"] === "context")
88
+ tiers.push({ ...p, tier: { size, type: "context" } });
89
+ }
90
+ if (tiers.length > 0)
91
+ out.tiers = tiers;
92
+ return out;
93
+ }
94
+ /** 字段裁剪(不过滤);与 scripts/update-models-dev.mjs 的 trimModel 同一口径,另多留 tool_call。 */
53
95
  function trimModel(id, raw) {
54
96
  const out = { id };
55
- if (typeof raw["name"] === "string")
56
- out.name = raw["name"];
97
+ for (const key of ["name", "family", "knowledge", "release_date"]) {
98
+ const v = raw[key];
99
+ if (typeof v === "string" && v !== "")
100
+ out[key] = v;
101
+ }
57
102
  for (const key of ["reasoning", "tool_call"]) {
58
- if (typeof raw[key] === "boolean")
59
- out[key] = raw[key];
103
+ const v = raw[key];
104
+ if (typeof v === "boolean")
105
+ out[key] = v;
60
106
  }
61
107
  if (typeof raw["canonical_model_id"] === "string")
62
108
  out.canonical_model_id = raw["canonical_model_id"];
109
+ if (raw["status"] === "beta")
110
+ out.status = "beta";
63
111
  const modalities = raw["modalities"];
64
112
  if (isRecord(modalities)) {
65
113
  const input = strings(modalities["input"]);
@@ -68,25 +116,55 @@ function trimModel(id, raw) {
68
116
  }
69
117
  const limit = raw["limit"];
70
118
  if (isRecord(limit)) {
71
- const context = positive(limit["context"]);
72
- const output = positive(limit["output"]);
73
- out.limit = {
74
- ...(context !== undefined ? { context } : {}),
75
- ...(output !== undefined ? { output } : {}),
76
- };
77
- }
78
- const cost = raw["cost"];
79
- if (isRecord(cost)) {
80
- const c = {};
81
- for (const key of ["input", "output", "cache_read", "cache_write"]) {
82
- const v = nonNegative(cost[key]);
119
+ const l = {};
120
+ for (const key of ["context", "input", "output"]) {
121
+ const v = positive(limit[key]);
83
122
  if (v !== undefined)
84
- c[key] = v;
123
+ l[key] = v;
85
124
  }
86
- out.cost = c;
125
+ if (Object.keys(l).length > 0)
126
+ out.limit = l;
87
127
  }
128
+ const cost = trimCost(raw["cost"]);
129
+ if (cost !== undefined)
130
+ out.cost = cost;
131
+ const interleaved = raw["interleaved"];
132
+ if (interleaved === true)
133
+ out.interleaved = true;
134
+ else if (isRecord(interleaved) && typeof interleaved["field"] === "string")
135
+ out.interleaved = { field: interleaved["field"] };
88
136
  return out;
89
137
  }
138
+ /** 快照过滤:丢 deprecated、输出不含文本、上下文为 0 / 缺失、tool_call:false(docs/wave5-plan.md §2.1)。 */
139
+ export function keepForSnapshot(raw) {
140
+ if (!isRecord(raw))
141
+ return false;
142
+ if (raw["status"] === "deprecated" || raw["tool_call"] === false)
143
+ return false;
144
+ const modalities = raw["modalities"];
145
+ const output = isRecord(modalities) ? strings(modalities["output"]) : undefined;
146
+ if (output !== undefined && !output.includes("text"))
147
+ return false;
148
+ const limit = raw["limit"];
149
+ return isRecord(limit) && positive(limit["context"]) !== undefined;
150
+ }
151
+ /** 裁剪一家供应商;`keep` 给出时只留它放行的模型(模型 id 按字典序)。 */
152
+ export function trimProvider(providerId, provider, keep) {
153
+ const models = {};
154
+ const rawModels = isRecord(provider["models"]) ? provider["models"] : {};
155
+ for (const modelId of Object.keys(rawModels).sort()) {
156
+ const model = rawModels[modelId];
157
+ if (!isRecord(model) || (keep !== undefined && !keep(modelId, model)))
158
+ continue;
159
+ models[modelId] = trimModel(modelId, model);
160
+ }
161
+ return {
162
+ id: providerId,
163
+ ...(typeof provider["name"] === "string" ? { name: provider["name"] } : {}),
164
+ ...(typeof provider["api"] === "string" ? { api: provider["api"] } : {}),
165
+ models,
166
+ };
167
+ }
90
168
  /** 校验并裁剪 api.json:只留用到的字段;形状不对的供应商 / 模型跳过。整体不是对象抛错。 */
91
169
  export function trimModelsDev(raw) {
92
170
  if (!isRecord(raw))
@@ -95,16 +173,7 @@ export function trimModelsDev(raw) {
95
173
  for (const [providerId, provider] of Object.entries(raw)) {
96
174
  if (!isRecord(provider) || !isRecord(provider["models"]))
97
175
  continue;
98
- const models = {};
99
- for (const [modelId, model] of Object.entries(provider["models"])) {
100
- if (isRecord(model))
101
- models[modelId] = trimModel(modelId, model);
102
- }
103
- out[providerId] = {
104
- id: providerId,
105
- ...(typeof provider["name"] === "string" ? { name: provider["name"] } : {}),
106
- models,
107
- };
176
+ out[providerId] = trimProvider(providerId, provider);
108
177
  }
109
178
  return out;
110
179
  }
@@ -260,8 +329,17 @@ export class ModelsDevIndex {
260
329
  return match;
261
330
  }
262
331
  }
263
- /** models.dev 条目 → ama Model 字段(规则见 docs/providers.md)。 */
264
- export function modelsDevFields(model) {
332
+ function toCost(p, mapping) {
333
+ const missing = mapping === "catalog" ? 0 : p.input;
334
+ return {
335
+ input: p.input,
336
+ output: p.output,
337
+ cacheRead: p.cache_read ?? missing,
338
+ cacheWrite: p.cache_write ?? missing,
339
+ };
340
+ }
341
+ /** models.dev 条目 → ama Model 字段(规则见 docs/providers.md「模型元数据」)。 */
342
+ export function modelsDevFields(model, mapping = "custom") {
265
343
  const out = {};
266
344
  if (model.name !== undefined)
267
345
  out.name = model.name;
@@ -270,8 +348,12 @@ export function modelsDevFields(model) {
270
348
  out.contextWindow = Math.floor(context);
271
349
  const output = positive(model.limit?.output);
272
350
  if (output !== undefined) {
273
- out.maxTokens = Math.floor(Math.min(output, MODELS_DEV_MAX_OUTPUT, context ?? output));
351
+ const cap = mapping === "catalog" ? output : MODELS_DEV_MAX_OUTPUT;
352
+ out.maxTokens = Math.floor(Math.min(output, cap, context ?? output));
274
353
  }
354
+ const inputLimit = positive(model.limit?.input);
355
+ if (inputLimit !== undefined && inputLimit !== context)
356
+ out.inputLimit = Math.floor(inputLimit);
275
357
  const input = model.modalities?.input;
276
358
  if (input !== undefined)
277
359
  out.input = input.includes("image") ? ["text", "image"] : ["text"];
@@ -281,13 +363,24 @@ export function modelsDevFields(model) {
281
363
  out.toolCall = model.tool_call;
282
364
  const cost = model.cost;
283
365
  if (cost?.input !== undefined && cost.output !== undefined) {
284
- out.cost = {
285
- input: cost.input,
286
- output: cost.output,
287
- cacheRead: cost.cache_read ?? cost.input,
288
- cacheWrite: cost.cache_write ?? cost.input,
289
- };
366
+ out.cost = toCost(cost, mapping);
367
+ // 档位:优先通用 tiers;只有 context_over_200k 时折成 200k 一档。
368
+ const tiers = cost.tiers !== undefined && cost.tiers.length > 0
369
+ ? cost.tiers.map((t) => ({ inputTokensAbove: t.tier.size, ...toCost(t, mapping) }))
370
+ : cost.context_over_200k !== undefined
371
+ ? [{ inputTokensAbove: 200_000, ...toCost(cost.context_over_200k, mapping) }]
372
+ : [];
373
+ if (tiers.length > 0)
374
+ out.cost.tiers = tiers.sort((a, b) => a.inputTokensAbove - b.inputTokensAbove);
290
375
  }
376
+ if (model.family !== undefined)
377
+ out.family = model.family;
378
+ if (model.knowledge !== undefined)
379
+ out.knowledge = model.knowledge;
380
+ if (model.release_date !== undefined)
381
+ out.releaseDate = model.release_date;
382
+ if (model.status === "beta")
383
+ out.status = "beta";
291
384
  return out;
292
385
  }
293
386
  /** 可由 models.dev 补的 Model 字段(展示来源用)。 */
@@ -19,14 +19,21 @@
19
19
  * 重新物化(协议、地址、headers、compat 取渠道的,模型级 api / baseUrl 仍覆盖);渠道 key 经
20
20
  * `resolveApiKey(provider, channel)`。没有 `channels` 的供应商行为不变。
21
21
  *
22
+ * 内置渠道([W5-M2],builtin.ts):用户 `channels` 同名字段级覆盖、新名追加,`defaultChannel` 用户优先
23
+ * (也可只写 `defaultChannel`,或只写 `api` 选同协议的内置渠道);目录模型缺省挂全部渠道、缺省渠道在前。
24
+ * 用户(config / auth.json / `*_BASE_URL`)改了供应商级 baseUrl 而没写自己的 `channels` 时,内置渠道作废,
25
+ * 按单渠道回落(`api` 取用户写的或内置的回落协议)。
26
+ *
22
27
  * models.dev(enrich.ts):config 里缺元数据的自定义模型与合成模型,用传入的索引(只读缓存)补
23
- * contextWindow / maxTokens / input / reasoning / cost,来源记在 `modelMetadata()`;内置目录不补。
28
+ * contextWindow / maxTokens / input / reasoning / cost,来源记在 `modelMetadata()`;内置目录按同一索引
29
+ * (快照 ⊕ `ama models refresh` 的覆盖)在 catalog.ts 合并,缺字段的条目退回内置快照。
24
30
  */
25
31
  import type { AmaConfig } from "../../config/types.js";
26
32
  import { ApiRegistry } from "../apis/api.js";
27
- import type { Api, ApiImplementation, ApiKeyResolution, Model, ModelLookup, ProviderChannel, ProviderData, ProviderRegistryApi } from "../types.js";
33
+ import type { Api, ApiImplementation, ApiKeyResolution, Model, ModelLookup, ProviderData, ProviderRegistryApi } from "../types.js";
28
34
  import { type KeyResolverOptions } from "./auth.js";
29
35
  import { type ModelMetadata, type ModelsDevSource } from "./enrich.js";
36
+ export { materializeModel } from "./channels.js";
30
37
  export type ModelSource = "builtin" | "config" | "discovered";
31
38
  export interface ProviderRegistryOptions {
32
39
  config?: AmaConfig | undefined;
@@ -48,14 +55,6 @@ export interface ModelEntry {
48
55
  provider: ProviderData;
49
56
  source: ModelSource;
50
57
  }
51
- /**
52
- * 物化:模型补齐供应商级字段(不可变:返回新对象)。给了 `channel` 时协议与地址取渠道的(模型级
53
- * `explicit` 覆盖优先),headers / compat 按 供应商 ← 渠道 ← 模型 合并,并记下渠道名。
54
- */
55
- export declare function materializeModel(model: Model, provider: ProviderData, channel?: ProviderChannel, explicit?: {
56
- api?: Api | undefined;
57
- baseUrl?: string | undefined;
58
- }): Model;
59
58
  export declare class ProviderRegistry implements ProviderRegistryApi {
60
59
  readonly warnings: string[];
61
60
  private readonly providers;
@@ -64,6 +63,10 @@ export declare class ProviderRegistry implements ProviderRegistryApi {
64
63
  private readonly envBaseUrls;
65
64
  /** baseUrl 指向非官方主机的内置供应商:接受目录外的 model id。 */
66
65
  private readonly relayed;
66
+ /** config 里写了自己 `channels` 的供应商(内置渠道不因改 baseUrl 作废)。 */
67
+ private readonly userChannels;
68
+ /** config 里写了供应商级 `api` 的供应商(单渠道回落时目录模型跟它走)。 */
69
+ private readonly userApi;
67
70
  /** `provider/model` → 物化前的模型(多渠道供应商切换渠道时重新物化)。 */
68
71
  private readonly raw;
69
72
  /** `provider/model` → 元数据来源与 models.dev 匹配。 */
@@ -73,6 +76,13 @@ export declare class ProviderRegistry implements ProviderRegistryApi {
73
76
  private readonly keys;
74
77
  private readonly onWarning;
75
78
  constructor(options?: ProviderRegistryOptions);
79
+ /** 内置目录(快照 ⊕ 用户刷新);刷新数据出任何问题都退回内置快照,不让启动失败。 */
80
+ private loadCatalog;
81
+ /**
82
+ * 内置供应商定渠道:供应商级 api / baseUrl 取缺省渠道的(discover 等单地址的用法看它);用户没指定渠道的
83
+ * 模型挂全部渠道(缺省在前)。渠道已作废的去掉模型上残留的 `channels`。
84
+ */
85
+ private settleBuiltinChannels;
76
86
  private warn;
77
87
  /** 物化并记下原始模型;多渠道供应商用模型的首选渠道。 */
78
88
  private materialize;
@@ -90,10 +100,17 @@ export declare class ProviderRegistry implements ProviderRegistryApi {
90
100
  /** 追加 / 替换模型(例如本地枚举得到的 ollama 模型)。 */
91
101
  addModels(providerId: string, models: readonly Model[], source?: ModelSource): void;
92
102
  private synthesize;
93
- /** 按渠道取模型:渠道不在模型的 channels 里 → 列出可用渠道。 */
103
+ /** 按渠道取模型:渠道不在模型的 channels 里 → channel_not_found,列出可用渠道。 */
94
104
  private withChannel;
105
+ /**
106
+ * `provider/model`、`provider/model@渠道` 或裸模型 id。`@` 先按渠道解析(id 里本来就带 `@` 且已登记的
107
+ * 模型除外),中转供应商的「未登记即合成」不会把 `@渠道` 吞进模型 id。失败的 reason:供应商不存在 →
108
+ * provider_not_found(候选是编辑距离最近的供应商);渠道不存在 → channel_not_found;模型不存在 →
109
+ * not_found(候选是最接近的模型)。
110
+ */
95
111
  findModel(ref: string): ModelLookup;
96
112
  private findPlain;
113
+ /** 最接近的模型(包含关系优先,其次编辑距离),`provider/id` 形式。 */
97
114
  private similar;
98
115
  hasConfiguredKey(providerId: string): boolean;
99
116
  resolveApiKey(providerId: string, channel?: string): Promise<ApiKeyResolution>;