@armadra/agent 0.5.1 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (467) hide show
  1. package/CHANGELOG.md +177 -304
  2. package/CHANGELOG.zh-CN.md +442 -0
  3. package/README.md +408 -364
  4. package/README.zh-CN.md +705 -0
  5. package/dist/agent/session-plan.js +2 -2
  6. package/dist/agent/session-state.d.ts +3 -0
  7. package/dist/agent/session-state.js +20 -0
  8. package/dist/agent/session-subagent.d.ts +15 -1
  9. package/dist/agent/session-subagent.js +26 -3
  10. package/dist/agent/session-telemetry.d.ts +16 -2
  11. package/dist/agent/session-telemetry.js +29 -7
  12. package/dist/agent/session-tools.js +5 -2
  13. package/dist/agent/session-trace-writer.d.ts +27 -0
  14. package/dist/agent/session-trace-writer.js +253 -0
  15. package/dist/agent/session.d.ts +2 -0
  16. package/dist/agent/session.js +12 -0
  17. package/dist/agent/subagent-direct.d.ts +20 -0
  18. package/dist/agent/subagent-direct.js +76 -0
  19. package/dist/agent/subagent-registry.d.ts +8 -1
  20. package/dist/agent/subagent-registry.js +28 -1
  21. package/dist/agent/system-prompt.d.ts +3 -1
  22. package/dist/agent/system-prompt.js +3 -0
  23. package/dist/agent/tool-runner.d.ts +2 -1
  24. package/dist/agent/tool-runner.js +5 -4
  25. package/dist/agent/types-w6.d.ts +39 -0
  26. package/dist/agent/types-w6.js +4 -0
  27. package/dist/agent/types.d.ts +5 -2
  28. package/dist/agents/external.js +1 -1
  29. package/dist/agents/task-record.d.ts +74 -1
  30. package/dist/agents/task-record.js +100 -0
  31. package/dist/ai/apis/cache-params.js +2 -1
  32. package/dist/ai/apis/chatgpt-backend.d.ts +52 -0
  33. package/dist/ai/apis/chatgpt-backend.js +224 -0
  34. package/dist/ai/apis/chatgpt-rate-limits.d.ts +26 -0
  35. package/dist/ai/apis/chatgpt-rate-limits.js +91 -0
  36. package/dist/ai/apis/openai-responses-request.d.ts +2 -1
  37. package/dist/ai/apis/openai-responses-request.js +8 -2
  38. package/dist/ai/apis/openai-responses.d.ts +2 -0
  39. package/dist/ai/apis/openai-responses.js +51 -16
  40. package/dist/ai/overflow.d.ts +1 -1
  41. package/dist/ai/overflow.js +10 -7
  42. package/dist/ai/providers/auth.d.ts +15 -2
  43. package/dist/ai/providers/auth.js +69 -2
  44. package/dist/ai/providers/builtin.js +27 -0
  45. package/dist/ai/providers/catalog-data.js +1 -0
  46. package/dist/ai/providers/enrich.js +2 -7
  47. package/dist/ai/providers/models-dev-cache.js +15 -19
  48. package/dist/ai/providers/models-dev-snapshot.js +8 -7
  49. package/dist/ai/providers/models-dev.js +5 -15
  50. package/dist/ai/providers/suggest.js +2 -16
  51. package/dist/ai/types.d.ts +27 -1
  52. package/dist/auth/chatgpt/backend-client.d.ts +26 -0
  53. package/dist/auth/chatgpt/backend-client.js +74 -0
  54. package/dist/auth/chatgpt/claims.d.ts +17 -0
  55. package/dist/auth/chatgpt/claims.js +46 -0
  56. package/dist/auth/chatgpt/cli.d.ts +33 -0
  57. package/dist/auth/chatgpt/cli.js +252 -0
  58. package/dist/auth/chatgpt/doctor.d.ts +17 -0
  59. package/dist/auth/chatgpt/doctor.js +36 -0
  60. package/dist/auth/chatgpt/host-id.d.ts +7 -0
  61. package/dist/auth/chatgpt/host-id.js +26 -0
  62. package/dist/auth/chatgpt/login.d.ts +30 -0
  63. package/dist/auth/chatgpt/login.js +130 -0
  64. package/dist/auth/chatgpt/presets.d.ts +66 -0
  65. package/dist/auth/chatgpt/presets.js +120 -0
  66. package/dist/auth/chatgpt/quota-text.d.ts +13 -0
  67. package/dist/auth/chatgpt/quota-text.js +36 -0
  68. package/dist/auth/oauth/browser.d.ts +12 -0
  69. package/dist/auth/oauth/browser.js +27 -0
  70. package/dist/auth/oauth/callback-server.d.ts +47 -0
  71. package/dist/auth/oauth/callback-server.js +147 -0
  72. package/dist/auth/oauth/flows.d.ts +62 -0
  73. package/dist/auth/oauth/flows.js +113 -0
  74. package/dist/auth/oauth/jwt.d.ts +24 -0
  75. package/dist/auth/oauth/jwt.js +81 -0
  76. package/dist/auth/oauth/live.d.ts +21 -0
  77. package/dist/auth/oauth/live.js +25 -0
  78. package/dist/auth/oauth/oidc.d.ts +26 -0
  79. package/dist/auth/oauth/oidc.js +72 -0
  80. package/dist/auth/oauth/pkce.d.ts +15 -0
  81. package/dist/auth/oauth/pkce.js +20 -0
  82. package/dist/auth/oauth/refresh.d.ts +35 -0
  83. package/dist/auth/oauth/refresh.js +129 -0
  84. package/dist/auth/oauth/token-client.d.ts +33 -0
  85. package/dist/auth/oauth/token-client.js +121 -0
  86. package/dist/auth/oauth/token-store.d.ts +23 -0
  87. package/dist/auth/oauth/token-store.js +125 -0
  88. package/dist/auth/testing/fake-oauth.d.ts +73 -0
  89. package/dist/auth/testing/fake-oauth.js +271 -0
  90. package/dist/auth/testing/refresh-child.d.ts +5 -0
  91. package/dist/auth/testing/refresh-child.js +16 -0
  92. package/dist/bundle/ama.cjs +25928 -11144
  93. package/dist/checkpoints/backend.js +6 -5
  94. package/dist/checkpoints/restore.js +3 -2
  95. package/dist/checkpoints/settings.js +2 -1
  96. package/dist/checkpoints/shadow-git.js +7 -6
  97. package/dist/checkpoints/shadow-restore.js +3 -2
  98. package/dist/checkpoints/tracker.js +4 -3
  99. package/dist/cli/args.d.ts +9 -2
  100. package/dist/cli/args.js +74 -27
  101. package/dist/cli/bootstrap.js +53 -31
  102. package/dist/cli/choice-prompt.js +8 -6
  103. package/dist/cli/codemode-notice.js +2 -2
  104. package/dist/cli/compose-agents.js +2 -1
  105. package/dist/cli/compose-extensions.js +2 -0
  106. package/dist/cli/compose-memory.d.ts +53 -0
  107. package/dist/cli/compose-memory.js +127 -0
  108. package/dist/cli/compose-providers.d.ts +5 -0
  109. package/dist/cli/compose-providers.js +32 -2
  110. package/dist/cli/compose-session.d.ts +5 -0
  111. package/dist/cli/compose-session.js +27 -13
  112. package/dist/cli/compose-store.d.ts +2 -0
  113. package/dist/cli/compose-store.js +9 -5
  114. package/dist/cli/compose.d.ts +2 -0
  115. package/dist/cli/compose.js +13 -5
  116. package/dist/cli/default-model.d.ts +0 -2
  117. package/dist/cli/default-model.js +5 -8
  118. package/dist/cli/deps.d.ts +5 -1
  119. package/dist/cli/exit-codes.d.ts +1 -1
  120. package/dist/cli/exit-codes.js +7 -16
  121. package/dist/cli/from-prompt.js +3 -2
  122. package/dist/cli/help-text.d.ts +2 -1
  123. package/dist/cli/help-text.js +5 -99
  124. package/dist/cli/main.d.ts +5 -0
  125. package/dist/cli/main.js +21 -2
  126. package/dist/cli/proxy.js +14 -9
  127. package/dist/cli/runtime.d.ts +5 -0
  128. package/dist/cli/startup-screen.js +20 -27
  129. package/dist/cli/startup-steps.js +6 -8
  130. package/dist/cli/subcommands/auth.d.ts +6 -3
  131. package/dist/cli/subcommands/auth.js +52 -22
  132. package/dist/cli/subcommands/config-set.d.ts +21 -0
  133. package/dist/cli/subcommands/config-set.js +137 -0
  134. package/dist/cli/subcommands/config.d.ts +2 -1
  135. package/dist/cli/subcommands/config.js +51 -37
  136. package/dist/cli/subcommands/doctor.d.ts +2 -1
  137. package/dist/cli/subcommands/doctor.js +97 -58
  138. package/dist/cli/subcommands/init.d.ts +1 -1
  139. package/dist/cli/subcommands/init.js +8 -7
  140. package/dist/cli/subcommands/memory.d.ts +18 -0
  141. package/dist/cli/subcommands/memory.js +189 -0
  142. package/dist/cli/subcommands/model-meta.js +11 -9
  143. package/dist/cli/subcommands/models-cache-probe.js +23 -20
  144. package/dist/cli/subcommands/models-discover.d.ts +3 -0
  145. package/dist/cli/subcommands/models-discover.js +44 -21
  146. package/dist/cli/subcommands/models.d.ts +1 -1
  147. package/dist/cli/subcommands/models.js +29 -22
  148. package/dist/cli/subcommands/probe-runner.js +8 -7
  149. package/dist/cli/subcommands/providers-list.js +32 -21
  150. package/dist/cli/subcommands/providers-plan.js +24 -25
  151. package/dist/cli/subcommands/providers-probe.js +5 -6
  152. package/dist/cli/subcommands/providers.d.ts +1 -1
  153. package/dist/cli/subcommands/providers.js +45 -50
  154. package/dist/cli/subcommands/sessions-export.d.ts +1 -1
  155. package/dist/cli/subcommands/sessions-export.js +10 -9
  156. package/dist/cli/subcommands/sessions-search.d.ts +1 -1
  157. package/dist/cli/subcommands/sessions-search.js +11 -10
  158. package/dist/cli/subcommands/sessions-trace.d.ts +30 -0
  159. package/dist/cli/subcommands/sessions-trace.js +156 -0
  160. package/dist/cli/subcommands/sessions.d.ts +4 -3
  161. package/dist/cli/subcommands/sessions.js +40 -37
  162. package/dist/cli/subcommands/stats.d.ts +1 -1
  163. package/dist/cli/subcommands/stats.js +49 -30
  164. package/dist/cli/system-prompt-arg.js +3 -2
  165. package/dist/codemode/capability.js +3 -2
  166. package/dist/compaction/post-compact.d.ts +1 -0
  167. package/dist/compaction/post-compact.js +15 -1
  168. package/dist/compaction/prune-tier.d.ts +1 -1
  169. package/dist/compaction/prune-tier.js +3 -3
  170. package/dist/compaction/serialize.js +2 -1
  171. package/dist/config/auth-file.d.ts +12 -2
  172. package/dist/config/auth-file.js +32 -10
  173. package/dist/config/checker.js +12 -11
  174. package/dist/config/context-files.js +3 -2
  175. package/dist/config/edit.d.ts +106 -0
  176. package/dist/config/edit.js +350 -0
  177. package/dist/config/init.d.ts +4 -3
  178. package/dist/config/init.js +10 -18
  179. package/dist/config/json-schema.d.ts +2 -1
  180. package/dist/config/json-schema.js +101 -68
  181. package/dist/config/key-docs.d.ts +18 -7
  182. package/dist/config/key-docs.js +43 -128
  183. package/dist/config/load.js +7 -6
  184. package/dist/config/merge.d.ts +4 -1
  185. package/dist/config/merge.js +42 -22
  186. package/dist/config/paths.js +6 -5
  187. package/dist/config/profile.d.ts +5 -1
  188. package/dist/config/profile.js +7 -2
  189. package/dist/config/schema-w5.js +3 -2
  190. package/dist/config/schema-w6.d.ts +19 -0
  191. package/dist/config/schema-w6.js +115 -0
  192. package/dist/config/schema.js +34 -20
  193. package/dist/config/settings-registry.d.ts +78 -0
  194. package/dist/config/settings-registry.js +184 -0
  195. package/dist/config/types-w6.d.ts +109 -0
  196. package/dist/config/types-w6.js +19 -0
  197. package/dist/config/types.d.ts +11 -8
  198. package/dist/config/types.js +1 -0
  199. package/dist/drivers/acp/client.js +1 -1
  200. package/dist/drivers/acp/driver.js +13 -8
  201. package/dist/drivers/agents.js +4 -3
  202. package/dist/drivers/base.js +3 -2
  203. package/dist/drivers/host-runners.js +2 -1
  204. package/dist/drivers/native/claude-stream.js +12 -11
  205. package/dist/drivers/native/codex-app-server.js +17 -12
  206. package/dist/drivers/native/oneshot.js +8 -7
  207. package/dist/drivers/pool.js +1 -1
  208. package/dist/drivers/runner.d.ts +3 -1
  209. package/dist/drivers/runner.js +68 -20
  210. package/dist/drivers/turn.js +1 -1
  211. package/dist/hooks/config.js +3 -2
  212. package/dist/hooks/protocol.js +18 -12
  213. package/dist/host/api-impl.js +11 -10
  214. package/dist/host/loader.js +9 -8
  215. package/dist/host/types.d.ts +3 -0
  216. package/dist/i18n/catalog.d.ts +2169 -0
  217. package/dist/i18n/catalog.js +72 -0
  218. package/dist/i18n/format.d.ts +21 -0
  219. package/dist/i18n/format.js +58 -0
  220. package/dist/i18n/index.d.ts +58 -0
  221. package/dist/i18n/index.js +72 -0
  222. package/dist/i18n/messages/agents.d.ts +84 -0
  223. package/dist/i18n/messages/agents.js +85 -0
  224. package/dist/i18n/messages/approval.d.ts +99 -0
  225. package/dist/i18n/messages/approval.js +100 -0
  226. package/dist/i18n/messages/auth.d.ts +187 -0
  227. package/dist/i18n/messages/auth.js +189 -0
  228. package/dist/i18n/messages/cli-args.d.ts +46 -0
  229. package/dist/i18n/messages/cli-args.js +46 -0
  230. package/dist/i18n/messages/cli-help.d.ts +12 -0
  231. package/dist/i18n/messages/cli-help.js +244 -0
  232. package/dist/i18n/messages/cli.d.ts +336 -0
  233. package/dist/i18n/messages/cli.js +311 -0
  234. package/dist/i18n/messages/config-keys.d.ts +289 -0
  235. package/dist/i18n/messages/config-keys.js +292 -0
  236. package/dist/i18n/messages/config.d.ts +502 -0
  237. package/dist/i18n/messages/config.js +239 -0
  238. package/dist/i18n/messages/drivers.d.ts +123 -0
  239. package/dist/i18n/messages/drivers.js +124 -0
  240. package/dist/i18n/messages/errors.d.ts +83 -0
  241. package/dist/i18n/messages/errors.js +171 -0
  242. package/dist/i18n/messages/interactive-line.d.ts +61 -0
  243. package/dist/i18n/messages/interactive-line.js +69 -0
  244. package/dist/i18n/messages/interactive-startup.d.ts +103 -0
  245. package/dist/i18n/messages/interactive-startup.js +104 -0
  246. package/dist/i18n/messages/interactive-view.d.ts +140 -0
  247. package/dist/i18n/messages/interactive-view.js +141 -0
  248. package/dist/i18n/messages/interactive.d.ts +493 -0
  249. package/dist/i18n/messages/interactive.js +248 -0
  250. package/dist/i18n/messages/memory.d.ts +123 -0
  251. package/dist/i18n/messages/memory.js +128 -0
  252. package/dist/i18n/messages/panels.d.ts +190 -0
  253. package/dist/i18n/messages/panels.js +189 -0
  254. package/dist/i18n/messages/permissions.d.ts +126 -0
  255. package/dist/i18n/messages/permissions.js +151 -0
  256. package/dist/i18n/messages/plan.d.ts +123 -0
  257. package/dist/i18n/messages/plan.js +124 -0
  258. package/dist/i18n/messages/print.d.ts +86 -0
  259. package/dist/i18n/messages/print.js +91 -0
  260. package/dist/i18n/messages/report.d.ts +391 -0
  261. package/dist/i18n/messages/report.js +490 -0
  262. package/dist/i18n/messages/rewind.d.ts +198 -0
  263. package/dist/i18n/messages/rewind.js +217 -0
  264. package/dist/i18n/messages/session.d.ts +230 -0
  265. package/dist/i18n/messages/session.js +258 -0
  266. package/dist/i18n/messages/settings.d.ts +348 -0
  267. package/dist/i18n/messages/settings.js +336 -0
  268. package/dist/i18n/messages/subcommands-config.d.ts +111 -0
  269. package/dist/i18n/messages/subcommands-config.js +127 -0
  270. package/dist/i18n/messages/subcommands.d.ts +548 -0
  271. package/dist/i18n/messages/subcommands.js +474 -0
  272. package/dist/i18n/messages/trace.d.ts +243 -0
  273. package/dist/i18n/messages/trace.js +238 -0
  274. package/dist/i18n/types.d.ts +15 -0
  275. package/dist/i18n/types.js +7 -0
  276. package/dist/index.d.ts +6 -0
  277. package/dist/index.js +2 -0
  278. package/dist/memory/edit.d.ts +24 -0
  279. package/dist/memory/edit.js +63 -0
  280. package/dist/memory/frontmatter.d.ts +37 -0
  281. package/dist/memory/frontmatter.js +79 -0
  282. package/dist/memory/index.d.ts +28 -0
  283. package/dist/memory/index.js +126 -0
  284. package/dist/memory/lock.d.ts +17 -0
  285. package/dist/memory/lock.js +62 -0
  286. package/dist/memory/paths.d.ts +57 -0
  287. package/dist/memory/paths.js +175 -0
  288. package/dist/memory/report.d.ts +36 -0
  289. package/dist/memory/report.js +86 -0
  290. package/dist/memory/runtime.d.ts +42 -0
  291. package/dist/memory/runtime.js +36 -0
  292. package/dist/memory/secrets.d.ts +8 -0
  293. package/dist/memory/secrets.js +27 -0
  294. package/dist/memory/section.d.ts +28 -0
  295. package/dist/memory/section.js +59 -0
  296. package/dist/memory/store.d.ts +70 -0
  297. package/dist/memory/store.js +284 -0
  298. package/dist/memory/tool.d.ts +31 -0
  299. package/dist/memory/tool.js +94 -0
  300. package/dist/modes/acp/acp-events.js +2 -1
  301. package/dist/modes/acp/acp-server.js +13 -12
  302. package/dist/modes/commands-core.d.ts +11 -0
  303. package/dist/modes/commands-core.js +93 -62
  304. package/dist/modes/image-input.js +20 -6
  305. package/dist/modes/interactive/agent-bar.d.ts +95 -0
  306. package/dist/modes/interactive/agent-bar.js +248 -0
  307. package/dist/modes/interactive/agent-panels.js +27 -26
  308. package/dist/modes/interactive/agent-transcript.d.ts +47 -0
  309. package/dist/modes/interactive/agent-transcript.js +191 -0
  310. package/dist/modes/interactive/agent-ui.d.ts +36 -1
  311. package/dist/modes/interactive/agent-ui.js +180 -14
  312. package/dist/modes/interactive/agent-view.d.ts +72 -0
  313. package/dist/modes/interactive/agent-view.js +281 -0
  314. package/dist/modes/interactive/approval-dialog.js +46 -34
  315. package/dist/modes/interactive/clipboard-paste.d.ts +2 -2
  316. package/dist/modes/interactive/clipboard-paste.js +9 -4
  317. package/dist/modes/interactive/commands.d.ts +19 -1
  318. package/dist/modes/interactive/commands.js +84 -40
  319. package/dist/modes/interactive/completion.js +2 -1
  320. package/dist/modes/interactive/config-panel.d.ts +70 -0
  321. package/dist/modes/interactive/config-panel.js +319 -0
  322. package/dist/modes/interactive/config-ui.d.ts +96 -0
  323. package/dist/modes/interactive/config-ui.js +397 -0
  324. package/dist/modes/interactive/confirm-dialog.js +6 -7
  325. package/dist/modes/interactive/event-notices.js +11 -9
  326. package/dist/modes/interactive/interactive-mode.d.ts +1 -1
  327. package/dist/modes/interactive/interactive-mode.js +19 -22
  328. package/dist/modes/interactive/key-dispatch.d.ts +12 -0
  329. package/dist/modes/interactive/key-dispatch.js +24 -9
  330. package/dist/modes/interactive/line/line-editor.js +2 -1
  331. package/dist/modes/interactive/line/line-mode.js +18 -7
  332. package/dist/modes/interactive/line/line-render.js +25 -24
  333. package/dist/modes/interactive/memory-panel.d.ts +64 -0
  334. package/dist/modes/interactive/memory-panel.js +221 -0
  335. package/dist/modes/interactive/message-view.d.ts +4 -2
  336. package/dist/modes/interactive/message-view.js +42 -33
  337. package/dist/modes/interactive/panels.js +39 -31
  338. package/dist/modes/interactive/pickers.d.ts +2 -1
  339. package/dist/modes/interactive/pickers.js +10 -6
  340. package/dist/modes/interactive/plan-command.d.ts +1 -1
  341. package/dist/modes/interactive/plan-command.js +24 -27
  342. package/dist/modes/interactive/plan-dialog.js +18 -17
  343. package/dist/modes/interactive/plan-flow.js +6 -5
  344. package/dist/modes/interactive/rewind-command.d.ts +1 -1
  345. package/dist/modes/interactive/rewind-command.js +18 -16
  346. package/dist/modes/interactive/rewind-flow.d.ts +0 -1
  347. package/dist/modes/interactive/rewind-flow.js +13 -14
  348. package/dist/modes/interactive/rewind-list.js +7 -6
  349. package/dist/modes/interactive/rewind-panel.js +40 -40
  350. package/dist/modes/interactive/rewind-text.d.ts +5 -3
  351. package/dist/modes/interactive/rewind-text.js +48 -38
  352. package/dist/modes/interactive/run-indicator.js +15 -12
  353. package/dist/modes/interactive/session-events.js +3 -2
  354. package/dist/modes/interactive/startup-header.js +22 -23
  355. package/dist/modes/interactive/startup-ui.js +38 -30
  356. package/dist/modes/interactive/status-area.d.ts +2 -0
  357. package/dist/modes/interactive/status-area.js +8 -2
  358. package/dist/modes/interactive/status-bar.js +4 -3
  359. package/dist/modes/interactive/subagent-view.js +9 -7
  360. package/dist/modes/interactive/tasks-report.d.ts +6 -0
  361. package/dist/modes/interactive/tasks-report.js +28 -31
  362. package/dist/modes/interactive/terminal-setup.d.ts +9 -0
  363. package/dist/modes/interactive/terminal-setup.js +23 -0
  364. package/dist/modes/interactive/tool-summary.js +19 -17
  365. package/dist/modes/interactive/tool-view.js +7 -4
  366. package/dist/modes/interactive/trace-view.d.ts +89 -0
  367. package/dist/modes/interactive/trace-view.js +332 -0
  368. package/dist/modes/print/print-mode.js +14 -15
  369. package/dist/modes/rpc/commands.js +7 -3
  370. package/dist/modes/rpc/rpc-mode.js +9 -3
  371. package/dist/modes/session-report.d.ts +2 -0
  372. package/dist/modes/session-report.js +101 -105
  373. package/dist/modes/startup-ui-text.js +11 -6
  374. package/dist/permissions/bypass.d.ts +8 -10
  375. package/dist/permissions/bypass.js +19 -10
  376. package/dist/permissions/memory-class.d.ts +23 -0
  377. package/dist/permissions/memory-class.js +54 -0
  378. package/dist/permissions/modes.d.ts +3 -3
  379. package/dist/permissions/modes.js +21 -16
  380. package/dist/permissions/pipeline.d.ts +1 -1
  381. package/dist/permissions/pipeline.js +9 -2
  382. package/dist/permissions/preview.js +49 -42
  383. package/dist/permissions/rules.js +5 -2
  384. package/dist/permissions/types.d.ts +4 -0
  385. package/dist/plan/store.js +2 -1
  386. package/dist/rpc.d.ts +39 -1
  387. package/dist/rpc.js +3 -0
  388. package/dist/sandbox/bash.js +11 -8
  389. package/dist/sandbox/detect.js +14 -11
  390. package/dist/sdk.d.ts +17 -1
  391. package/dist/sdk.js +29 -7
  392. package/dist/session/export.js +31 -30
  393. package/dist/session/manager.d.ts +1 -1
  394. package/dist/session/manager.js +5 -3
  395. package/dist/session/reuse.js +5 -4
  396. package/dist/session/scan.js +3 -2
  397. package/dist/session/stats-aggregate.d.ts +3 -1
  398. package/dist/session/stats-aggregate.js +5 -1
  399. package/dist/session/stats-index.js +2 -1
  400. package/dist/session/stats-scan.d.ts +4 -1
  401. package/dist/session/stats-scan.js +6 -2
  402. package/dist/session/store.d.ts +11 -0
  403. package/dist/session/store.js +48 -1
  404. package/dist/session/types.d.ts +2 -0
  405. package/dist/skills/builtin.js +2 -1
  406. package/dist/tools/image-file.d.ts +26 -1
  407. package/dist/tools/image-file.js +55 -13
  408. package/dist/tools/presets.d.ts +14 -1
  409. package/dist/tools/presets.js +3 -3
  410. package/dist/tools/registry.js +1 -1
  411. package/dist/tools/truncate.d.ts +1 -1
  412. package/dist/tools/truncate.js +2 -2
  413. package/dist/tools/types.d.ts +17 -1
  414. package/dist/trace/build-index.d.ts +91 -0
  415. package/dist/trace/build-index.js +127 -0
  416. package/dist/trace/build-nodes.d.ts +24 -0
  417. package/dist/trace/build-nodes.js +279 -0
  418. package/dist/trace/build-util.d.ts +43 -0
  419. package/dist/trace/build-util.js +120 -0
  420. package/dist/trace/build.d.ts +82 -0
  421. package/dist/trace/build.js +382 -0
  422. package/dist/trace/detail.d.ts +35 -0
  423. package/dist/trace/detail.js +205 -0
  424. package/dist/trace/flatten.d.ts +69 -0
  425. package/dist/trace/flatten.js +173 -0
  426. package/dist/trace/format.d.ts +47 -0
  427. package/dist/trace/format.js +329 -0
  428. package/dist/trace/html-template.d.ts +19 -0
  429. package/dist/trace/html-template.js +150 -0
  430. package/dist/trace/html.d.ts +104 -0
  431. package/dist/trace/html.js +292 -0
  432. package/dist/trace/preview.d.ts +29 -0
  433. package/dist/trace/preview.js +59 -0
  434. package/dist/trace/query-session.d.ts +14 -0
  435. package/dist/trace/query-session.js +38 -0
  436. package/dist/trace/query.d.ts +55 -0
  437. package/dist/trace/query.js +188 -0
  438. package/dist/trace/session.d.ts +40 -0
  439. package/dist/trace/session.js +168 -0
  440. package/dist/trace/types.d.ts +243 -0
  441. package/dist/trace/types.js +13 -0
  442. package/dist/tui/components/editor-paste.d.ts +2 -0
  443. package/dist/tui/components/editor-paste.js +6 -3
  444. package/dist/tui/components/editor.js +2 -2
  445. package/dist/tui/components/loader.d.ts +3 -0
  446. package/dist/tui/components/loader.js +14 -0
  447. package/dist/tui/components/settings-list.d.ts +61 -0
  448. package/dist/tui/components/settings-list.js +135 -0
  449. package/dist/tui/keybindings.d.ts +5 -0
  450. package/dist/tui/keybindings.js +17 -5
  451. package/dist/tui.d.ts +1 -0
  452. package/dist/tui.js +2 -0
  453. package/docs/en/host-api.md +167 -0
  454. package/docs/en/permissions.md +214 -0
  455. package/docs/en/providers.md +625 -0
  456. package/docs/en/rpc.md +361 -0
  457. package/docs/en/sessions.md +219 -0
  458. package/docs/en/tui.md +527 -0
  459. package/docs/host-api.md +18 -17
  460. package/docs/memory.md +172 -0
  461. package/docs/permissions.md +2 -2
  462. package/docs/providers.md +67 -1
  463. package/docs/rpc.md +31 -3
  464. package/docs/session-format.md +8 -2
  465. package/docs/sessions.md +29 -1
  466. package/docs/tui.md +132 -3
  467. package/package.json +8 -3
@@ -0,0 +1,52 @@
1
+ /**
2
+ * openai-responses 的 ChatGPT 订阅后端(compat `chatgptBackend`;docs/wave6-plan.md §4.1、§4.6、D14、D17)。[W6-O]
3
+ *
4
+ * - 请求体:强制 `store:false`、`stream:true`、`input` 数组;按后端删禁用字段(SIWC 15 个;codex 5 个,保留
5
+ * `prompt_cache_key`);SIWC 不发 `role:"system"` item(改 developer);`instructionsMode: "developer-message"`
6
+ * 时系统提示改放 input 开头的 developer 消息;`toolsInNamespace` 时工具改放 `additional_tools` 输入项(形状待
7
+ * 真账户实测);`unsupported_capability` 报过的字段本进程内不再发;
8
+ * - 请求头:两者 `Authorization: Bearer`;codex 另加 `ChatGPT-Account-ID`(来自活 token 登记)、`originator`(渠道
9
+ * headers,缺省 `codex_cli_rs`)、`session-id` / `x-client-request-id`;
10
+ * - 出错恢复(每种至多一次):401 → 强制刷新重试;SIWC 400 `subscription_sharing_unsupported_capability` → 删去
11
+ * `error.param` 重试;codex 400 `Instructions are not valid` → 本会话切 developer-message 重试;
12
+ * - 错误映射(文案带码前缀,宿主按码判断):429 配额 → `quota_exceeded`(不重试);失效 → `auth_expired`;
13
+ * SIWC 403 `subscription_sharing_user_not_eligible` → `not_eligible`;503 留给会话层现有重试;
14
+ * - 用量:`cost = 0`、`billing: "subscription"`。
15
+ */
16
+ import { type LiveToken } from "../../auth/oauth/live.js";
17
+ import type { HttpError } from "../http.js";
18
+ import type { Model, OpenAIResponsesCompat, StreamOptions, Usage } from "../types.js";
19
+ type Json = Record<string, unknown>;
20
+ export type ChatGptBackend = "siwc" | "codex";
21
+ export declare const SIWC_FORBIDDEN_FIELDS: readonly ["background", "conversation", "max_output_tokens", "max_tool_calls", "metadata", "moderation", "multi_agent", "prompt", "prompt_cache_retention", "safety_identifier", "temperature", "top_logprobs", "top_p", "truncation", "user"];
22
+ export declare const CODEX_FORBIDDEN_FIELDS: readonly ["max_output_tokens", "temperature", "top_p", "prompt_cache_retention", "prompt_cache_options"];
23
+ export declare function sessionKeyOf(model: Model, options: StreamOptions): string;
24
+ /** 测试用。 */
25
+ export declare function resetChatGptState(): void;
26
+ export declare function instructionsModeOf(model: Model, compat: OpenAIResponsesCompat, options: StreamOptions): "native" | "developer-message";
27
+ export declare function transformChatGptBody(body: Json, model: Model, compat: OpenAIResponsesCompat, options: StreamOptions): Json;
28
+ /** 发请求前:needsLogin 直接报 auth_expired;登录 flavor 与渠道不符报错。 */
29
+ export declare function chatgptPrecheck(model: Model, compat: OpenAIResponsesCompat, apiKey?: string): void;
30
+ export declare function chatgptHeaders(compat: OpenAIResponsesCompat, options: StreamOptions, apiKey: string | undefined): Record<string, string>;
31
+ /** 包一层 onResponse:解析响应头里的配额。 */
32
+ export declare function quotaOnResponse(compat: OpenAIResponsesCompat, options: StreamOptions): ((status: number, headers: Headers) => void) | undefined;
33
+ /** SSE 里的 `codex.rate_limits`:处理了返回 true。 */
34
+ export declare function handleChatGptEvent(data: Json, options: StreamOptions): boolean;
35
+ /** 订阅计费:按零价计成本(cost 全 0),用量标 `billing: "subscription"`。 */
36
+ export declare function subscriptionModel(model: Model, usage: Usage): Model;
37
+ export type Recovery = {
38
+ kind: "refresh";
39
+ live: LiveToken;
40
+ } | {
41
+ kind: "retry";
42
+ } | {
43
+ kind: "fail";
44
+ error: Error;
45
+ } | {
46
+ kind: "none";
47
+ };
48
+ /**
49
+ * HTTP 错误 → 恢复动作或映射后的错误。`tried`:本次请求已用过的恢复(每种至多一次)。
50
+ */
51
+ export declare function recoverChatGptError(error: HttpError, model: Model, compat: OpenAIResponsesCompat, options: StreamOptions, apiKey: string | undefined, tried: Set<string>): Recovery;
52
+ export {};
@@ -0,0 +1,224 @@
1
+ /**
2
+ * openai-responses 的 ChatGPT 订阅后端(compat `chatgptBackend`;docs/wave6-plan.md §4.1、§4.6、D14、D17)。[W6-O]
3
+ *
4
+ * - 请求体:强制 `store:false`、`stream:true`、`input` 数组;按后端删禁用字段(SIWC 15 个;codex 5 个,保留
5
+ * `prompt_cache_key`);SIWC 不发 `role:"system"` item(改 developer);`instructionsMode: "developer-message"`
6
+ * 时系统提示改放 input 开头的 developer 消息;`toolsInNamespace` 时工具改放 `additional_tools` 输入项(形状待
7
+ * 真账户实测);`unsupported_capability` 报过的字段本进程内不再发;
8
+ * - 请求头:两者 `Authorization: Bearer`;codex 另加 `ChatGPT-Account-ID`(来自活 token 登记)、`originator`(渠道
9
+ * headers,缺省 `codex_cli_rs`)、`session-id` / `x-client-request-id`;
10
+ * - 出错恢复(每种至多一次):401 → 强制刷新重试;SIWC 400 `subscription_sharing_unsupported_capability` → 删去
11
+ * `error.param` 重试;codex 400 `Instructions are not valid` → 本会话切 developer-message 重试;
12
+ * - 错误映射(文案带码前缀,宿主按码判断):429 配额 → `quota_exceeded`(不重试);失效 → `auth_expired`;
13
+ * SIWC 403 `subscription_sharing_user_not_eligible` → `not_eligible`;503 留给会话层现有重试;
14
+ * - 用量:`cost = 0`、`billing: "subscription"`。
15
+ */
16
+ import { liveToken } from "../../auth/oauth/live.js";
17
+ import { authExpiredError } from "../../auth/oauth/refresh.js";
18
+ import { parseQuotaHeaders, parseRateLimitEvent, quotaFromLimitError, } from "./chatgpt-rate-limits.js";
19
+ export const SIWC_FORBIDDEN_FIELDS = [
20
+ "background",
21
+ "conversation",
22
+ "max_output_tokens",
23
+ "max_tool_calls",
24
+ "metadata",
25
+ "moderation",
26
+ "multi_agent",
27
+ "prompt",
28
+ "prompt_cache_retention",
29
+ "safety_identifier",
30
+ "temperature",
31
+ "top_logprobs",
32
+ "top_p",
33
+ "truncation",
34
+ "user",
35
+ ];
36
+ export const CODEX_FORBIDDEN_FIELDS = [
37
+ "max_output_tokens",
38
+ "temperature",
39
+ "top_p",
40
+ "prompt_cache_retention",
41
+ "prompt_cache_options",
42
+ ];
43
+ /** 本会话已切 developer-message 的会话键;`unsupported_capability` 报过的 `provider/model` → 字段。 */
44
+ const developerMode = new Set();
45
+ const strippedFields = new Map();
46
+ export function sessionKeyOf(model, options) {
47
+ return options.sessionId ?? `${model.provider}/${model.id}`;
48
+ }
49
+ /** 测试用。 */
50
+ export function resetChatGptState() {
51
+ developerMode.clear();
52
+ strippedFields.clear();
53
+ }
54
+ export function instructionsModeOf(model, compat, options) {
55
+ return developerMode.has(sessionKeyOf(model, options))
56
+ ? "developer-message"
57
+ : (compat.instructionsMode ?? "native");
58
+ }
59
+ export function transformChatGptBody(body, model, compat, options) {
60
+ const backend = compat.chatgptBackend;
61
+ const out = { ...body };
62
+ const forbidden = backend === "siwc" ? SIWC_FORBIDDEN_FIELDS : CODEX_FORBIDDEN_FIELDS;
63
+ for (const field of forbidden)
64
+ delete out[field];
65
+ for (const field of strippedFields.get(`${model.provider}/${model.id}`) ?? [])
66
+ delete out[field];
67
+ out["store"] = false;
68
+ out["stream"] = true;
69
+ let input = Array.isArray(out["input"]) ? [...out["input"]] : [];
70
+ if (backend === "siwc")
71
+ input = input.map((item) => item["role"] === "system" ? { ...item, role: "developer" } : item);
72
+ if (instructionsModeOf(model, compat, options) === "developer-message" &&
73
+ typeof out["instructions"] === "string") {
74
+ input.unshift({ role: "developer", content: out["instructions"] });
75
+ delete out["instructions"];
76
+ }
77
+ if (compat.toolsInNamespace === true && Array.isArray(out["tools"])) {
78
+ input.unshift({ type: "additional_tools", tools: out["tools"] });
79
+ delete out["tools"];
80
+ }
81
+ out["input"] = input;
82
+ return out;
83
+ }
84
+ /** 发请求前:needsLogin 直接报 auth_expired;登录 flavor 与渠道不符报错。 */
85
+ export function chatgptPrecheck(model, compat, apiKey) {
86
+ const live = liveToken(apiKey);
87
+ if (live === undefined)
88
+ return;
89
+ if (live.needsLogin === true)
90
+ throw authExpiredError(live.provider);
91
+ if (live.flavor !== compat.chatgptBackend) {
92
+ throw new Error(`chatgpt_flavor_mismatch: logged in with ${live.flavor} but ${model.provider}/${model.id} uses the ${String(compat.chatgptBackend)} channel; run \`ama auth login ${live.provider} --flavor ${String(compat.chatgptBackend)}\` or switch channel`);
93
+ }
94
+ }
95
+ export function chatgptHeaders(compat, options, apiKey) {
96
+ if (compat.chatgptBackend !== "codex")
97
+ return {};
98
+ const headers = {};
99
+ const accountId = liveToken(apiKey)?.accountId;
100
+ if (accountId !== undefined)
101
+ headers["ChatGPT-Account-ID"] = accountId;
102
+ if (options.sessionId !== undefined) {
103
+ headers["session-id"] = options.sessionId;
104
+ headers["x-client-request-id"] = options.sessionId;
105
+ }
106
+ return headers;
107
+ }
108
+ /** 包一层 onResponse:解析响应头里的配额。 */
109
+ export function quotaOnResponse(compat, options) {
110
+ if (compat.chatgptBackend !== "codex" || options.onQuota === undefined)
111
+ return options.onResponse;
112
+ return (status, headers) => {
113
+ options.onResponse?.(status, headers);
114
+ const quota = parseQuotaHeaders(headers);
115
+ if (quota !== undefined)
116
+ emitQuota(options, quota);
117
+ };
118
+ }
119
+ function emitQuota(options, quota) {
120
+ try {
121
+ options.onQuota?.(quota);
122
+ }
123
+ catch {
124
+ // 观察者出错不影响请求
125
+ }
126
+ }
127
+ /** SSE 里的 `codex.rate_limits`:处理了返回 true。 */
128
+ export function handleChatGptEvent(data, options) {
129
+ const quota = parseRateLimitEvent(data);
130
+ if (quota === undefined)
131
+ return data["type"] === "codex.rate_limits";
132
+ emitQuota(options, quota);
133
+ return true;
134
+ }
135
+ /** 订阅计费:按零价计成本(cost 全 0),用量标 `billing: "subscription"`。 */
136
+ export function subscriptionModel(model, usage) {
137
+ usage.billing = "subscription";
138
+ return { ...model, cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 } };
139
+ }
140
+ function errorBody(body) {
141
+ try {
142
+ const value = JSON.parse(body);
143
+ const error = value["error"];
144
+ if (typeof error === "object" && error !== null)
145
+ return error;
146
+ return value;
147
+ }
148
+ catch {
149
+ return {};
150
+ }
151
+ }
152
+ function codeOf(error) {
153
+ const code = error["code"] ?? error["type"];
154
+ return typeof code === "string" ? code : "";
155
+ }
156
+ /** 订阅配额耗尽(不重试);其余 429(普通限流)留给会话层的退避重试。 */
157
+ const QUOTA_CODES = new Set([
158
+ "subscription_sharing_usage_limit_exceeded",
159
+ "usage_limit_reached",
160
+ "usage_not_included",
161
+ "insufficient_quota",
162
+ ]);
163
+ function resetText(quota) {
164
+ const at = quota?.primary?.resetsAt;
165
+ return at === undefined ? "" : ` (resets at ${new Date(at).toISOString()})`;
166
+ }
167
+ /**
168
+ * HTTP 错误 → 恢复动作或映射后的错误。`tried`:本次请求已用过的恢复(每种至多一次)。
169
+ */
170
+ export function recoverChatGptError(error, model, compat, options, apiKey, tried) {
171
+ const backend = compat.chatgptBackend;
172
+ const body = errorBody(error.body);
173
+ const code = codeOf(body);
174
+ const provider = model.provider;
175
+ if (error.status === 429 && QUOTA_CODES.has(code)) {
176
+ const quota = quotaFromLimitError(body);
177
+ emitQuota(options, quota);
178
+ const what = code === "usage_not_included"
179
+ ? "your ChatGPT plan does not include this usage"
180
+ : "ChatGPT plan usage limit reached";
181
+ return {
182
+ kind: "fail",
183
+ error: new Error(`quota_exceeded: ${what}; quota exceeded${resetText(quota)}; see https://chatgpt.com/settings/usage`),
184
+ };
185
+ }
186
+ if (error.status === 401) {
187
+ const live = liveToken(apiKey);
188
+ if (live !== undefined && !tried.has("refresh")) {
189
+ tried.add("refresh");
190
+ return { kind: "refresh", live };
191
+ }
192
+ return { kind: "fail", error: authExpiredError(provider) };
193
+ }
194
+ if (backend === "siwc" &&
195
+ error.status === 403 &&
196
+ code === "subscription_sharing_user_not_eligible")
197
+ return {
198
+ kind: "fail",
199
+ error: new Error("not_eligible: this ChatGPT account cannot share plan usage with ama (403 subscription_sharing_user_not_eligible)"),
200
+ };
201
+ if (backend === "siwc" &&
202
+ error.status === 400 &&
203
+ code === "subscription_sharing_unsupported_capability" &&
204
+ !tried.has("strip")) {
205
+ const param = typeof body["param"] === "string" ? body["param"].split(/[.[]/)[0] : undefined;
206
+ if (param !== undefined && param !== "" && param !== "input" && param !== "model") {
207
+ tried.add("strip");
208
+ const key = `${model.provider}/${model.id}`;
209
+ const set = strippedFields.get(key) ?? new Set();
210
+ set.add(param);
211
+ strippedFields.set(key, set);
212
+ return { kind: "retry" };
213
+ }
214
+ }
215
+ if (backend === "codex" &&
216
+ error.status === 400 &&
217
+ /instructions are not valid/i.test(error.body) &&
218
+ !tried.has("instructions")) {
219
+ tried.add("instructions");
220
+ developerMode.add(sessionKeyOf(model, options));
221
+ return { kind: "retry" };
222
+ }
223
+ return { kind: "none" };
224
+ }
@@ -0,0 +1,26 @@
1
+ /**
2
+ * ChatGPT 订阅配额解析(docs/wave6-plan.md §4.1 配额行、D17;R6 §1.2 配额三行)。[W6-O]
3
+ *
4
+ * - 响应头(codex flavor):`x-codex-primary-used-percent` / `-window-minutes` / `-reset-at`(epoch 秒),
5
+ * `secondary` 同形;
6
+ * - SSE(codex flavor):`{"type":"codex.rate_limits","plan_type",…,"rate_limits":{"primary":{used_percent,
7
+ * window_minutes,reset_at},"secondary":…}}`;
8
+ * - `GET /wham/usage`(codex flavor,`ama auth status` 用):`{plan_type, rate_limit:{primary_window:{used_percent,
9
+ * limit_window_seconds, reset_at}, secondary_window}}`——私有格式,解析失败静默;
10
+ * - 429(两种 flavor):`resets_at`(秒)→ primary 用满。
11
+ *
12
+ * 输出统一为 `QuotaSnapshot`,时间换成 epoch 毫秒;会话层转成 `quota_update` 事件。
13
+ */
14
+ import type { QuotaWindow } from "../../agent/types-w6.js";
15
+ export interface QuotaSnapshot {
16
+ planType?: string;
17
+ primary?: QuotaWindow;
18
+ secondary?: QuotaWindow;
19
+ }
20
+ type Json = Record<string, unknown>;
21
+ export declare function parseQuotaHeaders(headers: Pick<Headers, "get">, family?: string): QuotaSnapshot | undefined;
22
+ export declare function parseRateLimitEvent(data: Json): QuotaSnapshot | undefined;
23
+ export declare function parseUsagePayload(value: unknown): QuotaSnapshot | undefined;
24
+ /** 429 体里的 `resets_at`(秒)→ primary 用满。 */
25
+ export declare function quotaFromLimitError(error: Json): QuotaSnapshot;
26
+ export {};
@@ -0,0 +1,91 @@
1
+ /**
2
+ * ChatGPT 订阅配额解析(docs/wave6-plan.md §4.1 配额行、D17;R6 §1.2 配额三行)。[W6-O]
3
+ *
4
+ * - 响应头(codex flavor):`x-codex-primary-used-percent` / `-window-minutes` / `-reset-at`(epoch 秒),
5
+ * `secondary` 同形;
6
+ * - SSE(codex flavor):`{"type":"codex.rate_limits","plan_type",…,"rate_limits":{"primary":{used_percent,
7
+ * window_minutes,reset_at},"secondary":…}}`;
8
+ * - `GET /wham/usage`(codex flavor,`ama auth status` 用):`{plan_type, rate_limit:{primary_window:{used_percent,
9
+ * limit_window_seconds, reset_at}, secondary_window}}`——私有格式,解析失败静默;
10
+ * - 429(两种 flavor):`resets_at`(秒)→ primary 用满。
11
+ *
12
+ * 输出统一为 `QuotaSnapshot`,时间换成 epoch 毫秒;会话层转成 `quota_update` 事件。
13
+ */
14
+ function num(value) {
15
+ const n = typeof value === "string" && value.trim() !== "" ? Number(value) : value;
16
+ return typeof n === "number" && Number.isFinite(n) ? n : undefined;
17
+ }
18
+ function obj(value) {
19
+ return typeof value === "object" && value !== null && !Array.isArray(value)
20
+ ? value
21
+ : undefined;
22
+ }
23
+ function window(used, minutes, resetSeconds) {
24
+ const usedPercent = num(used);
25
+ if (usedPercent === undefined)
26
+ return undefined;
27
+ const out = { usedPercent: Math.max(0, Math.min(100, usedPercent)) };
28
+ const m = num(minutes);
29
+ if (m !== undefined)
30
+ out.windowMinutes = m;
31
+ const reset = num(resetSeconds);
32
+ if (reset !== undefined && reset > 0)
33
+ out.resetsAt = reset * 1000;
34
+ return out;
35
+ }
36
+ function snapshot(primary, secondary, plan) {
37
+ const out = {};
38
+ if (typeof plan === "string" && plan !== "")
39
+ out.planType = plan;
40
+ if (primary !== undefined)
41
+ out.primary = primary;
42
+ if (secondary !== undefined)
43
+ out.secondary = secondary;
44
+ return primary === undefined && secondary === undefined ? undefined : out;
45
+ }
46
+ export function parseQuotaHeaders(headers, family = "codex") {
47
+ const p = `x-${family}`;
48
+ const get = (name) => headers.get(`${p}-${name}`);
49
+ return snapshot(window(get("primary-used-percent"), get("primary-window-minutes"), get("primary-reset-at")), window(get("secondary-used-percent"), get("secondary-window-minutes"), get("secondary-reset-at")), undefined);
50
+ }
51
+ export function parseRateLimitEvent(data) {
52
+ if (data["type"] !== "codex.rate_limits")
53
+ return undefined;
54
+ const limits = obj(data["rate_limits"]);
55
+ const w = (value) => {
56
+ const o = obj(value);
57
+ return o === undefined
58
+ ? undefined
59
+ : window(o["used_percent"], o["window_minutes"], o["reset_at"]);
60
+ };
61
+ return snapshot(w(limits?.["primary"]), w(limits?.["secondary"]), data["plan_type"]);
62
+ }
63
+ export function parseUsagePayload(value) {
64
+ const body = obj(value);
65
+ const limit = obj(body?.["rate_limit"]);
66
+ const w = (raw) => {
67
+ const o = obj(raw);
68
+ if (o === undefined)
69
+ return undefined;
70
+ const seconds = num(o["limit_window_seconds"]);
71
+ return window(o["used_percent"], seconds === undefined ? undefined : seconds / 60, o["reset_at"]);
72
+ };
73
+ const out = snapshot(w(limit?.["primary_window"]), w(limit?.["secondary_window"]), body?.["plan_type"]);
74
+ if (out === undefined && typeof body?.["plan_type"] === "string")
75
+ return { planType: body["plan_type"] };
76
+ return out;
77
+ }
78
+ /** 429 体里的 `resets_at`(秒)→ primary 用满。 */
79
+ export function quotaFromLimitError(error) {
80
+ const reset = num(error["resets_at"]);
81
+ const minutes = num(error["limit_window_minutes"]);
82
+ const primary = { usedPercent: 100 };
83
+ if (reset !== undefined)
84
+ primary.resetsAt = reset * 1000;
85
+ if (minutes !== undefined)
86
+ primary.windowMinutes = minutes;
87
+ const out = { primary };
88
+ if (typeof error["plan_type"] === "string")
89
+ out.planType = error["plan_type"];
90
+ return out;
91
+ }
@@ -17,7 +17,8 @@
17
17
  * 时发,`cacheRetention: "none"` 不发;`long` 在 `supportsExplicitPromptCacheMode` 时发
18
18
  * `prompt_cache_options: {ttl:"30m"}`,否则在 `supportsLongCacheRetention` 时发
19
19
  * `prompt_cache_retention: "24h"`,两者都不支持按 short;
20
- * - `toolChoice: "none"`(有工具时)→ `tool_choice: "none"`。
20
+ * - `toolChoice: "none"`(有工具时)→ `tool_choice: "none"`;
21
+ * - [W6-O] compat `chatgptBackend`(ChatGPT 订阅后端):最后经 chatgpt-backend.ts 按后端白名单改写。
21
22
  */
22
23
  import type { AssistantMessage, Model, ModelThinkingLevel, OpenAIResponsesCompat, ProviderData, StreamOptions, ToolResultMessage, TranscriptContext, UserMessage } from "../types.js";
23
24
  type Json = Record<string, unknown>;
@@ -17,16 +17,21 @@
17
17
  * 时发,`cacheRetention: "none"` 不发;`long` 在 `supportsExplicitPromptCacheMode` 时发
18
18
  * `prompt_cache_options: {ttl:"30m"}`,否则在 `supportsLongCacheRetention` 时发
19
19
  * `prompt_cache_retention: "24h"`,两者都不支持按 short;
20
- * - `toolChoice: "none"`(有工具时)→ `tool_choice: "none"`。
20
+ * - `toolChoice: "none"`(有工具时)→ `tool_choice: "none"`;
21
+ * - [W6-O] compat `chatgptBackend`(ChatGPT 订阅后端):最后经 chatgpt-backend.ts 按后端白名单改写。
21
22
  */
22
23
  import { contentText, normalizeContext, sanitizeText } from "../context.js";
23
24
  import { clampThinkingLevel, mappedThinkingValue } from "../thinking.js";
24
25
  import { resolveCacheRetention, resolvePromptCacheCompat } from "./cache-params.js";
26
+ import { transformChatGptBody } from "./chatgpt-backend.js";
25
27
  import { isStrictCompatible } from "./openai-request.js";
26
28
  export const RESPONSES_API = "openai-responses";
27
29
  const RESPONSES_COMPAT_KEYS = [
28
30
  "supportsReasoningSummary",
29
31
  "supportsStore",
32
+ "chatgptBackend",
33
+ "instructionsMode",
34
+ "toolsInNamespace",
30
35
  ];
31
36
  /** 缺省(未知的 Responses 兼容服务):不要 summary、不发 store。 */
32
37
  export const CONSERVATIVE_RESPONSES_COMPAT = {
@@ -262,5 +267,6 @@ export function buildResponsesRequest(model, context, options) {
262
267
  const providerLevel = applyReasoning(body, model, compat, level);
263
268
  if (model.samplingParams)
264
269
  Object.assign(body, model.samplingParams);
265
- return { body, compat, thinkingLevel: level, providerThinkingLevel: providerLevel };
270
+ const final = compat.chatgptBackend === undefined ? body : transformChatGptBody(body, model, compat, options);
271
+ return { body: final, compat, thinkingLevel: level, providerThinkingLevel: providerLevel };
266
272
  }
@@ -13,6 +13,8 @@
13
13
  * - usage:input = input_tokens − input_tokens_details.cached_tokens,reasoning =
14
14
  * output_tokens_details.reasoning_tokens(已含在 output_tokens 里);cached_tokens 出现(含 0)即
15
15
  * `cacheReported: true`。
16
+ * - [W6-O] compat `chatgptBackend`:请求头、配额、出错恢复(401 刷新 / 删不支持字段 / instructions 回退,各一次)、
17
+ * 错误映射与订阅用量见 chatgpt-backend.ts。
16
18
  */
17
19
  import type { ApiImplementation, OpenAIResponsesCompat, Usage } from "../types.js";
18
20
  type Json = Record<string, unknown>;
@@ -13,11 +13,14 @@
13
13
  * - usage:input = input_tokens − input_tokens_details.cached_tokens,reasoning =
14
14
  * output_tokens_details.reasoning_tokens(已含在 output_tokens 里);cached_tokens 出现(含 0)即
15
15
  * `cacheReported: true`。
16
+ * - [W6-O] compat `chatgptBackend`:请求头、配额、出错恢复(401 刷新 / 删不支持字段 / instructions 回退,各一次)、
17
+ * 错误映射与订阅用量见 chatgpt-backend.ts。
16
18
  */
17
19
  import { AssistantEventStreamImpl } from "../event-stream.js";
18
- import { authHeaders, describeErrorJson, idleTimeoutOf, joinUrl, mergeHeaders, USER_AGENT, } from "../http.js";
20
+ import { HttpError, authHeaders, describeErrorJson, idleTimeoutOf, joinUrl, mergeHeaders, USER_AGENT, } from "../http.js";
19
21
  import { readSseEvents } from "../sse.js";
20
22
  import { affinityHeaders, postWithCacheFallback, resolveCacheRetention } from "./cache-params.js";
23
+ import { chatgptHeaders, chatgptPrecheck, handleChatGptEvent, subscriptionModel, quotaOnResponse, recoverChatGptError, } from "./chatgpt-backend.js";
21
24
  import { buildResponsesRequest, detectResponsesCompat, encodeMessageSignature, } from "./openai-responses-request.js";
22
25
  import { BlockTracker, ProviderStopError, STREAM_ENDED_MESSAGE, createOutput, finishDone, finishError, requireApiKey, } from "./shared.js";
23
26
  function num(value) {
@@ -231,27 +234,55 @@ function handleEvent(data, state, tracker) {
231
234
  return false;
232
235
  }
233
236
  }
234
- function buildHeaders(model, options) {
235
- return mergeHeaders({ "content-type": "application/json", accept: "text/event-stream", "user-agent": USER_AGENT }, authHeaders(options.apiKey, model.authHeader, "authorization-bearer"), affinityHeaders(model, "openai-responses", options.sessionId, resolveCacheRetention(options.cacheRetention)), model.headers, options.headers);
237
+ function buildHeaders(model, options, compat) {
238
+ return mergeHeaders({ "content-type": "application/json", accept: "text/event-stream", "user-agent": USER_AGENT }, authHeaders(options.apiKey, model.authHeader, "authorization-bearer"), affinityHeaders(model, "openai-responses", options.sessionId, resolveCacheRetention(options.cacheRetention)), chatgptHeaders(compat, options, options.apiKey), model.headers, options.headers);
236
239
  }
237
- async function run(stream, model, context, options) {
238
- const tracker = new BlockTracker(stream, createOutput(model));
239
- try {
240
+ /** 发请求;ChatGPT 后端按 chatgpt-backend.ts 做至多各一次的恢复(刷新 token / 删字段 / instructions 回退)。 */
241
+ async function post(model, context, initial, tracker) {
242
+ let options = initial;
243
+ const tried = new Set();
244
+ for (;;) {
240
245
  const request = buildResponsesRequest(model, context, options);
241
246
  tracker.output.thinkingLevel = request.thinkingLevel;
242
247
  if (request.providerThinkingLevel !== undefined) {
243
248
  tracker.output.providerThinkingLevel = request.providerThinkingLevel;
244
249
  }
250
+ const compat = request.compat;
251
+ const chatgpt = compat.chatgptBackend !== undefined;
252
+ if (chatgpt)
253
+ chatgptPrecheck(model, compat, options.apiKey);
245
254
  const replaced = options.onPayload?.(request.body);
246
255
  const baseUrl = model.baseUrl ?? "https://api.openai.com/v1";
247
- const response = await postWithCacheFallback(model, joinUrl(baseUrl, "/responses"), {
248
- headers: buildHeaders(model, options),
249
- body: replaced === undefined ? request.body : replaced,
250
- signal: options.signal,
251
- timeoutMs: options.timeoutMs,
252
- idleTimeoutMs: idleTimeoutOf(options),
253
- onResponse: options.onResponse,
254
- });
256
+ try {
257
+ const response = await postWithCacheFallback(model, joinUrl(baseUrl, "/responses"), {
258
+ headers: buildHeaders(model, options, compat),
259
+ body: replaced === undefined ? request.body : replaced,
260
+ signal: options.signal,
261
+ timeoutMs: options.timeoutMs,
262
+ idleTimeoutMs: idleTimeoutOf(options),
263
+ onResponse: chatgpt ? quotaOnResponse(compat, options) : options.onResponse,
264
+ });
265
+ return { response, options, compat };
266
+ }
267
+ catch (error) {
268
+ if (!chatgpt || !(error instanceof HttpError))
269
+ throw error;
270
+ const recovery = recoverChatGptError(error, model, compat, options, options.apiKey, tried);
271
+ if (recovery.kind === "fail")
272
+ throw recovery.error;
273
+ if (recovery.kind === "none")
274
+ throw error;
275
+ if (recovery.kind === "refresh")
276
+ options = { ...options, apiKey: await recovery.live.refresh() };
277
+ }
278
+ }
279
+ }
280
+ async function run(stream, model, context, options) {
281
+ const tracker = new BlockTracker(stream, createOutput(model));
282
+ let subscription = false;
283
+ try {
284
+ const { response, compat } = await post(model, context, options, tracker);
285
+ subscription = compat.chatgptBackend !== undefined;
255
286
  stream.push({ type: "start", partial: tracker.output });
256
287
  const state = {
257
288
  byOutput: new Map(),
@@ -274,6 +305,8 @@ async function run(stream, model, context, options) {
274
305
  }
275
306
  if (data["type"] === undefined && sse.event)
276
307
  data["type"] = sse.event;
308
+ if (subscription && handleChatGptEvent(data, options))
309
+ continue;
277
310
  if (handleEvent(data, state, tracker)) {
278
311
  finished = true;
279
312
  break;
@@ -286,10 +319,12 @@ async function run(stream, model, context, options) {
286
319
  if (state.stop.reason === "error")
287
320
  throw new ProviderStopError(state.stop.message);
288
321
  const reason = state.stop.reason === "stop" && tracker.hasToolCalls ? "toolUse" : state.stop.reason;
289
- finishDone(stream, tracker, model, reason);
322
+ const billed = subscription ? subscriptionModel(model, tracker.output.usage) : model;
323
+ finishDone(stream, tracker, billed, reason);
290
324
  }
291
325
  catch (error) {
292
- finishError(stream, tracker, model, error, options.signal);
326
+ const billed = subscription ? subscriptionModel(model, tracker.output.usage) : model;
327
+ finishError(stream, tracker, billed, error, options.signal);
293
328
  }
294
329
  }
295
330
  function stream(model, context, options) {
@@ -10,7 +10,7 @@
10
10
  * 文案表只记录各家文档或实测中出现过的句式;新增供应商时用真实溢出请求取样后补一条。
11
11
  */
12
12
  import type { AssistantMessage } from "./types.js";
13
- /** [正则, 来源说明]。 */
13
+ /** [正则, 来源说明]。来源说明只是给维护者看的出处记录(不显示、不发给模型),统一写英文。 */
14
14
  export declare const OVERFLOW_PATTERNS: readonly (readonly [RegExp, string])[];
15
15
  /** 错误文本是否表示上下文溢出。 */
16
16
  export declare function isOverflowErrorText(text: string): boolean;
@@ -9,29 +9,32 @@
9
9
  *
10
10
  * 文案表只记录各家文档或实测中出现过的句式;新增供应商时用真实溢出请求取样后补一条。
11
11
  */
12
- /** [正则, 来源说明]。 */
12
+ /** [正则, 来源说明]。来源说明只是给维护者看的出处记录(不显示、不发给模型),统一写英文。 */
13
13
  export const OVERFLOW_PATTERNS = [
14
14
  [/prompt is too long/i, "Anthropic: prompt is too long: N tokens > M maximum"],
15
15
  [/request_too_large/i, "Anthropic: 413 request_too_large"],
16
16
  [/exceeds the context window/i, "OpenAI: Your input exceeds the context window of this model"],
17
17
  [/maximum context length is \d+ tokens/i, "OpenAI / OpenRouter / DeepSeek"],
18
- [/exceeds (?:the )?(?:model'?s )?maximum context length/i, "OpenAI 兼容网关(vLLM / LiteLLM)"],
18
+ [
19
+ /exceeds (?:the )?(?:model'?s )?maximum context length/i,
20
+ "OpenAI-compatible gateways (vLLM / LiteLLM)",
21
+ ],
19
22
  [/input token count.*exceeds the maximum/i, "Google Gemini"],
20
23
  [
21
24
  /exceeds the maximum number of tokens allowed/i,
22
- "Google Gemini(无 input token count 前缀的变体)",
25
+ "Google Gemini (variant without the input token count prefix)",
23
26
  ],
24
27
  [/maximum prompt length is \d+/i, "xAI"],
25
28
  [/reduce the length of the messages/i, "Groq"],
26
29
  [/too large for model with \d+ maximum context length/i, "Mistral"],
27
30
  [/exceeded model token limit/i, "Moonshot / Kimi"],
28
- [/prompt (?:too long|exceeds max length)/i, "智谱 GLM(code 1261)/ Ollama"],
31
+ [/prompt (?:too long|exceeds max length)/i, "Zhipu GLM (code 1261) / Ollama"],
29
32
  [/range of input length should be/i, "DashScope / Qwen"],
30
33
  [/greater than the context length/i, "LM Studio"],
31
34
  [/exceeds the available context size/i, "llama.cpp server"],
32
- [/context[_ ]length[_ ]exceeded/i, "通用:context_length_exceeded"],
33
- [/model_context_window_exceeded/i, "通用:finish_reason 文本化"],
34
- [/token limit exceeded/i, "通用"],
35
+ [/context[_ ]length[_ ]exceeded/i, "generic: context_length_exceeded"],
36
+ [/model_context_window_exceeded/i, "generic: finish_reason as text"],
37
+ [/token limit exceeded/i, "generic"],
35
38
  ];
36
39
  /** 命中这些的不算溢出(限流 / 配额)。 */
37
40
  const NOT_OVERFLOW = [/rate[ _-]?limit/i, /too many requests/i, /\b429\b/];
@@ -10,8 +10,14 @@
10
10
  * auth.json 的 `apiKey` 以 `!` 开头 = 执行命令取值(stdout 去首尾空白;超时 10 s;空输出或
11
11
  * 非零退出视为未配置,继续找下一来源);同一命令进程内只执行一次。
12
12
  * 密钥只出现在 `resolve()` 的返回值里:warning 文案不含密钥与命令输出。
13
+ *
14
+ * [W6-O] auth.json 的 OAuth 条目(`type: "oauth"`,ChatGPT 登录)在 ②③ 的位置解析:每次从磁盘重读(绕过
15
+ * `fileCache`),临近过期经 `auth/oauth/refresh.ts` 刷新(跨进程锁),返回 `{ source: "oauth" }`,并把 token 的
16
+ * 上下文登记进 `auth/oauth/live.ts` 供协议层取账户 id、401 时强制刷新。永久失效(needsLogin)时仍返回旧 token
17
+ * 并在登记里标 needsLogin,协议层据此直接报 `auth_expired`(不发请求)。
13
18
  */
14
- import type { AuthFile } from "../../config/types.js";
19
+ import { type RefreshDeps } from "../../auth/oauth/refresh.js";
20
+ import type { ApiKeyAuthEntry, AuthFile } from "../../config/types.js";
15
21
  import type { ApiKeyResolution, ProviderData } from "../types.js";
16
22
  export type KeyProvider = Pick<ProviderData, "id" | "envKeys" | "requiresApiKey">;
17
23
  export interface KeyResolverOptions {
@@ -32,10 +38,13 @@ export interface KeyResolverOptions {
32
38
  onWarning?: ((message: string) => void) | undefined;
33
39
  /** `!command` 超时,缺省 10 000。 */
34
40
  commandTimeoutMs?: number | undefined;
41
+ /** [W6-O] OAuth 刷新的依赖(fetch、配置 `auth.chatgpt`、测试注入)。 */
42
+ oauth?: RefreshDeps | undefined;
35
43
  }
36
44
  /** 用户级配置目录:AMA_CONFIG_DIR > %APPDATA%\ama > $XDG_CONFIG_HOME/ama > ~/.config/ama。 */
37
45
  export declare function defaultConfigDir(env?: NodeJS.ProcessEnv): string;
38
- type AuthEntry = AuthFile["providers"][string];
46
+ /** API key 条目;OAuth 条目(`type: "oauth"`)走 `oauthPath()` + token 存储。 */
47
+ type AuthEntry = ApiKeyAuthEntry;
39
48
  /** 读 auth.json;不存在返回 undefined;格式错误 / 权限过宽记 warning。 */
40
49
  export declare function readAuthFile(path: string, onWarning?: (message: string) => void): AuthFile | undefined;
41
50
  /**
@@ -57,6 +66,10 @@ export declare class ApiKeyResolver {
57
66
  entry: AuthEntry;
58
67
  path: string;
59
68
  } | undefined;
69
+ /** [W6-O] 第一个给该供应商写了条目的 auth.json 若是 OAuth 条目,返回其路径。 */
70
+ oauthPath(providerId: string): string | undefined;
71
+ private register;
72
+ private fromOAuth;
60
73
  private runCommand;
61
74
  private fromAuthFiles;
62
75
  private fromConfig;