@armadra/agent 0.0.0-stage → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (407) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/LICENSE +21 -0
  3. package/README.md +426 -2
  4. package/dist/agent/agent.d.ts +56 -0
  5. package/dist/agent/agent.js +129 -0
  6. package/dist/agent/loop.d.ts +51 -0
  7. package/dist/agent/loop.js +158 -0
  8. package/dist/agent/queue.d.ts +25 -0
  9. package/dist/agent/queue.js +55 -0
  10. package/dist/agent/retry.d.ts +22 -0
  11. package/dist/agent/retry.js +92 -0
  12. package/dist/agent/schema.d.ts +27 -0
  13. package/dist/agent/schema.js +186 -0
  14. package/dist/agent/session-cache.d.ts +100 -0
  15. package/dist/agent/session-cache.js +511 -0
  16. package/dist/agent/session-compaction.d.ts +49 -0
  17. package/dist/agent/session-compaction.js +251 -0
  18. package/dist/agent/session-core.d.ts +103 -0
  19. package/dist/agent/session-core.js +7 -0
  20. package/dist/agent/session-run.d.ts +55 -0
  21. package/dist/agent/session-run.js +246 -0
  22. package/dist/agent/session-state.d.ts +39 -0
  23. package/dist/agent/session-state.js +118 -0
  24. package/dist/agent/session-subagent.d.ts +54 -0
  25. package/dist/agent/session-subagent.js +157 -0
  26. package/dist/agent/session-sync.d.ts +20 -0
  27. package/dist/agent/session-sync.js +104 -0
  28. package/dist/agent/session-tools.d.ts +24 -0
  29. package/dist/agent/session-tools.js +277 -0
  30. package/dist/agent/session.d.ts +117 -0
  31. package/dist/agent/session.js +484 -0
  32. package/dist/agent/system-prompt.d.ts +49 -0
  33. package/dist/agent/system-prompt.js +121 -0
  34. package/dist/agent/tool-runner.d.ts +64 -0
  35. package/dist/agent/tool-runner.js +309 -0
  36. package/dist/agent/transform.d.ts +26 -0
  37. package/dist/agent/transform.js +171 -0
  38. package/dist/agent/types.d.ts +378 -0
  39. package/dist/agent/types.js +21 -0
  40. package/dist/ai/apis/anthropic-messages.d.ts +26 -0
  41. package/dist/ai/apis/anthropic-messages.js +214 -0
  42. package/dist/ai/apis/anthropic-request.d.ts +42 -0
  43. package/dist/ai/apis/anthropic-request.js +282 -0
  44. package/dist/ai/apis/api.d.ts +28 -0
  45. package/dist/ai/apis/api.js +102 -0
  46. package/dist/ai/apis/cache-params.d.ts +48 -0
  47. package/dist/ai/apis/cache-params.js +163 -0
  48. package/dist/ai/apis/google-generative-ai.d.ts +32 -0
  49. package/dist/ai/apis/google-generative-ai.js +249 -0
  50. package/dist/ai/apis/google-request.d.ts +40 -0
  51. package/dist/ai/apis/google-request.js +255 -0
  52. package/dist/ai/apis/openai-compat.d.ts +35 -0
  53. package/dist/ai/apis/openai-compat.js +142 -0
  54. package/dist/ai/apis/openai-completions.d.ts +28 -0
  55. package/dist/ai/apis/openai-completions.js +246 -0
  56. package/dist/ai/apis/openai-request.d.ts +35 -0
  57. package/dist/ai/apis/openai-request.js +303 -0
  58. package/dist/ai/apis/openai-responses-request.d.ts +52 -0
  59. package/dist/ai/apis/openai-responses-request.js +266 -0
  60. package/dist/ai/apis/openai-responses.d.ts +28 -0
  61. package/dist/ai/apis/openai-responses.js +303 -0
  62. package/dist/ai/apis/shared.d.ts +56 -0
  63. package/dist/ai/apis/shared.js +179 -0
  64. package/dist/ai/cache/economics.d.ts +24 -0
  65. package/dist/ai/cache/economics.js +69 -0
  66. package/dist/ai/cache/fingerprint.d.ts +17 -0
  67. package/dist/ai/cache/fingerprint.js +39 -0
  68. package/dist/ai/cache/miss.d.ts +49 -0
  69. package/dist/ai/cache/miss.js +96 -0
  70. package/dist/ai/cache/reporting.d.ts +39 -0
  71. package/dist/ai/cache/reporting.js +102 -0
  72. package/dist/ai/cache/types.d.ts +94 -0
  73. package/dist/ai/cache/types.js +19 -0
  74. package/dist/ai/cache/warmer.d.ts +94 -0
  75. package/dist/ai/cache/warmer.js +224 -0
  76. package/dist/ai/context.d.ts +35 -0
  77. package/dist/ai/context.js +114 -0
  78. package/dist/ai/cost.d.ts +21 -0
  79. package/dist/ai/cost.js +60 -0
  80. package/dist/ai/event-stream.d.ts +33 -0
  81. package/dist/ai/event-stream.js +101 -0
  82. package/dist/ai/fake/fake-provider.d.ts +68 -0
  83. package/dist/ai/fake/fake-provider.js +278 -0
  84. package/dist/ai/fake/fake-script.d.ts +69 -0
  85. package/dist/ai/fake/fake-script.js +142 -0
  86. package/dist/ai/http.d.ts +54 -0
  87. package/dist/ai/http.js +212 -0
  88. package/dist/ai/json-partial.d.ts +17 -0
  89. package/dist/ai/json-partial.js +243 -0
  90. package/dist/ai/overflow.d.ts +22 -0
  91. package/dist/ai/overflow.js +61 -0
  92. package/dist/ai/providers/auth.d.ts +71 -0
  93. package/dist/ai/providers/auth.js +202 -0
  94. package/dist/ai/providers/builtin.d.ts +23 -0
  95. package/dist/ai/providers/builtin.js +148 -0
  96. package/dist/ai/providers/catalog-data.d.ts +5 -0
  97. package/dist/ai/providers/catalog-data.js +19 -0
  98. package/dist/ai/providers/catalog.d.ts +28 -0
  99. package/dist/ai/providers/catalog.js +166 -0
  100. package/dist/ai/providers/registry.d.ts +83 -0
  101. package/dist/ai/providers/registry.js +305 -0
  102. package/dist/ai/sse.d.ts +32 -0
  103. package/dist/ai/sse.js +140 -0
  104. package/dist/ai/thinking.d.ts +42 -0
  105. package/dist/ai/thinking.js +101 -0
  106. package/dist/ai/types.d.ts +428 -0
  107. package/dist/ai/types.js +19 -0
  108. package/dist/bundle/ama-sandbox.cjs +324 -0
  109. package/dist/bundle/ama.cjs +25770 -0
  110. package/dist/bundle.d.ts +9 -0
  111. package/dist/bundle.js +15 -0
  112. package/dist/cli/args.d.ts +82 -0
  113. package/dist/cli/args.js +381 -0
  114. package/dist/cli/bootstrap.d.ts +18 -0
  115. package/dist/cli/bootstrap.js +398 -0
  116. package/dist/cli/compose-providers.d.ts +37 -0
  117. package/dist/cli/compose-providers.js +104 -0
  118. package/dist/cli/compose-session.d.ts +69 -0
  119. package/dist/cli/compose-session.js +370 -0
  120. package/dist/cli/compose-store.d.ts +24 -0
  121. package/dist/cli/compose-store.js +125 -0
  122. package/dist/cli/compose.d.ts +106 -0
  123. package/dist/cli/compose.js +206 -0
  124. package/dist/cli/default-model.d.ts +16 -0
  125. package/dist/cli/default-model.js +24 -0
  126. package/dist/cli/deps.d.ts +205 -0
  127. package/dist/cli/deps.js +12 -0
  128. package/dist/cli/exit-codes.d.ts +29 -0
  129. package/dist/cli/exit-codes.js +40 -0
  130. package/dist/cli/main.d.ts +26 -0
  131. package/dist/cli/main.js +165 -0
  132. package/dist/cli/runtime.d.ts +90 -0
  133. package/dist/cli/runtime.js +8 -0
  134. package/dist/cli/startup-screen.d.ts +15 -0
  135. package/dist/cli/startup-screen.js +56 -0
  136. package/dist/cli/startup-steps.d.ts +35 -0
  137. package/dist/cli/startup-steps.js +197 -0
  138. package/dist/cli/subcommands/auth.d.ts +12 -0
  139. package/dist/cli/subcommands/auth.js +91 -0
  140. package/dist/cli/subcommands/config.d.ts +44 -0
  141. package/dist/cli/subcommands/config.js +201 -0
  142. package/dist/cli/subcommands/context.d.ts +21 -0
  143. package/dist/cli/subcommands/context.js +41 -0
  144. package/dist/cli/subcommands/doctor.d.ts +11 -0
  145. package/dist/cli/subcommands/doctor.js +246 -0
  146. package/dist/cli/subcommands/models-cache-probe.d.ts +34 -0
  147. package/dist/cli/subcommands/models-cache-probe.js +190 -0
  148. package/dist/cli/subcommands/models-discover.d.ts +40 -0
  149. package/dist/cli/subcommands/models-discover.js +204 -0
  150. package/dist/cli/subcommands/models.d.ts +40 -0
  151. package/dist/cli/subcommands/models.js +144 -0
  152. package/dist/cli/subcommands/sessions.d.ts +11 -0
  153. package/dist/cli/subcommands/sessions.js +100 -0
  154. package/dist/codemode/capability.d.ts +37 -0
  155. package/dist/codemode/capability.js +55 -0
  156. package/dist/codemode/declarations.d.ts +44 -0
  157. package/dist/codemode/declarations.js +111 -0
  158. package/dist/codemode/host-side.d.ts +59 -0
  159. package/dist/codemode/host-side.js +253 -0
  160. package/dist/codemode/modes.d.ts +23 -0
  161. package/dist/codemode/modes.js +40 -0
  162. package/dist/codemode/protocol.d.ts +91 -0
  163. package/dist/codemode/protocol.js +114 -0
  164. package/dist/codemode/sandbox-entry.d.ts +25 -0
  165. package/dist/codemode/sandbox-entry.js +323 -0
  166. package/dist/codemode/store.d.ts +26 -0
  167. package/dist/codemode/store.js +53 -0
  168. package/dist/codemode/tool.d.ts +105 -0
  169. package/dist/codemode/tool.js +283 -0
  170. package/dist/compaction/branch-summary.d.ts +30 -0
  171. package/dist/compaction/branch-summary.js +79 -0
  172. package/dist/compaction/breaker.d.ts +32 -0
  173. package/dist/compaction/breaker.js +65 -0
  174. package/dist/compaction/cut-point.d.ts +23 -0
  175. package/dist/compaction/cut-point.js +70 -0
  176. package/dist/compaction/estimate.d.ts +30 -0
  177. package/dist/compaction/estimate.js +114 -0
  178. package/dist/compaction/prune-tier.d.ts +31 -0
  179. package/dist/compaction/prune-tier.js +83 -0
  180. package/dist/compaction/serialize.d.ts +20 -0
  181. package/dist/compaction/serialize.js +115 -0
  182. package/dist/compaction/summarize-tier.d.ts +111 -0
  183. package/dist/compaction/summarize-tier.js +305 -0
  184. package/dist/config/auth-file.d.ts +39 -0
  185. package/dist/config/auth-file.js +92 -0
  186. package/dist/config/context-files.d.ts +30 -0
  187. package/dist/config/context-files.js +77 -0
  188. package/dist/config/load.d.ts +45 -0
  189. package/dist/config/load.js +97 -0
  190. package/dist/config/merge.d.ts +73 -0
  191. package/dist/config/merge.js +248 -0
  192. package/dist/config/paths.d.ts +38 -0
  193. package/dist/config/paths.js +108 -0
  194. package/dist/config/profile.d.ts +27 -0
  195. package/dist/config/profile.js +65 -0
  196. package/dist/config/schema.d.ts +34 -0
  197. package/dist/config/schema.js +413 -0
  198. package/dist/config/trust.d.ts +42 -0
  199. package/dist/config/trust.js +122 -0
  200. package/dist/config/types.d.ts +172 -0
  201. package/dist/config/types.js +27 -0
  202. package/dist/config/write.d.ts +10 -0
  203. package/dist/config/write.js +25 -0
  204. package/dist/errors.d.ts +28 -0
  205. package/dist/errors.js +30 -0
  206. package/dist/hooks/config.d.ts +49 -0
  207. package/dist/hooks/config.js +102 -0
  208. package/dist/hooks/dispatcher.d.ts +41 -0
  209. package/dist/hooks/dispatcher.js +104 -0
  210. package/dist/hooks/matcher.d.ts +22 -0
  211. package/dist/hooks/matcher.js +108 -0
  212. package/dist/hooks/protocol.d.ts +33 -0
  213. package/dist/hooks/protocol.js +240 -0
  214. package/dist/hooks/runner.d.ts +30 -0
  215. package/dist/hooks/runner.js +143 -0
  216. package/dist/hooks/types.d.ts +147 -0
  217. package/dist/hooks/types.js +20 -0
  218. package/dist/host/api-impl.d.ts +75 -0
  219. package/dist/host/api-impl.js +173 -0
  220. package/dist/host/loader.d.ts +31 -0
  221. package/dist/host/loader.js +147 -0
  222. package/dist/host/types.d.ts +169 -0
  223. package/dist/host/types.js +14 -0
  224. package/dist/host.d.ts +5 -0
  225. package/dist/host.js +4 -0
  226. package/dist/index.d.ts +41 -0
  227. package/dist/index.js +28 -0
  228. package/dist/modes/commands-core.d.ts +44 -0
  229. package/dist/modes/commands-core.js +171 -0
  230. package/dist/modes/interactive/approval-dialog.d.ts +48 -0
  231. package/dist/modes/interactive/approval-dialog.js +202 -0
  232. package/dist/modes/interactive/commands.d.ts +41 -0
  233. package/dist/modes/interactive/commands.js +202 -0
  234. package/dist/modes/interactive/completion.d.ts +53 -0
  235. package/dist/modes/interactive/completion.js +157 -0
  236. package/dist/modes/interactive/interactive-mode.d.ts +46 -0
  237. package/dist/modes/interactive/interactive-mode.js +487 -0
  238. package/dist/modes/interactive/key-dispatch.d.ts +29 -0
  239. package/dist/modes/interactive/key-dispatch.js +107 -0
  240. package/dist/modes/interactive/line/line-editor.d.ts +50 -0
  241. package/dist/modes/interactive/line/line-editor.js +232 -0
  242. package/dist/modes/interactive/line/line-mode.d.ts +20 -0
  243. package/dist/modes/interactive/line/line-mode.js +216 -0
  244. package/dist/modes/interactive/line/line-render.d.ts +35 -0
  245. package/dist/modes/interactive/line/line-render.js +171 -0
  246. package/dist/modes/interactive/line/paste-state.d.ts +26 -0
  247. package/dist/modes/interactive/line/paste-state.js +72 -0
  248. package/dist/modes/interactive/message-view.d.ts +77 -0
  249. package/dist/modes/interactive/message-view.js +269 -0
  250. package/dist/modes/interactive/pickers.d.ts +42 -0
  251. package/dist/modes/interactive/pickers.js +115 -0
  252. package/dist/modes/interactive/startup-ui.d.ts +28 -0
  253. package/dist/modes/interactive/startup-ui.js +238 -0
  254. package/dist/modes/interactive/status-bar.d.ts +48 -0
  255. package/dist/modes/interactive/status-bar.js +139 -0
  256. package/dist/modes/interactive/tool-view.d.ts +95 -0
  257. package/dist/modes/interactive/tool-view.js +344 -0
  258. package/dist/modes/print/json-event.d.ts +15 -0
  259. package/dist/modes/print/json-event.js +39 -0
  260. package/dist/modes/print/print-mode.d.ts +15 -0
  261. package/dist/modes/print/print-mode.js +96 -0
  262. package/dist/modes/rpc/commands.d.ts +40 -0
  263. package/dist/modes/rpc/commands.js +258 -0
  264. package/dist/modes/rpc/jsonl.d.ts +16 -0
  265. package/dist/modes/rpc/jsonl.js +55 -0
  266. package/dist/modes/rpc/rpc-mode.d.ts +22 -0
  267. package/dist/modes/rpc/rpc-mode.js +153 -0
  268. package/dist/modes/session-report.d.ts +55 -0
  269. package/dist/modes/session-report.js +278 -0
  270. package/dist/modes/shared.d.ts +13 -0
  271. package/dist/modes/shared.js +52 -0
  272. package/dist/modes/startup-ui-text.d.ts +16 -0
  273. package/dist/modes/startup-ui-text.js +103 -0
  274. package/dist/permissions/broker.d.ts +47 -0
  275. package/dist/permissions/broker.js +107 -0
  276. package/dist/permissions/dangerous.d.ts +47 -0
  277. package/dist/permissions/dangerous.js +370 -0
  278. package/dist/permissions/pipeline.d.ts +51 -0
  279. package/dist/permissions/pipeline.js +181 -0
  280. package/dist/permissions/preview.d.ts +43 -0
  281. package/dist/permissions/preview.js +463 -0
  282. package/dist/permissions/rules.d.ts +58 -0
  283. package/dist/permissions/rules.js +249 -0
  284. package/dist/permissions/types.d.ts +100 -0
  285. package/dist/permissions/types.js +18 -0
  286. package/dist/rpc.d.ts +171 -0
  287. package/dist/rpc.js +13 -0
  288. package/dist/sdk.d.ts +98 -0
  289. package/dist/sdk.js +195 -0
  290. package/dist/session/manager.d.ts +70 -0
  291. package/dist/session/manager.js +278 -0
  292. package/dist/session/migrate.d.ts +19 -0
  293. package/dist/session/migrate.js +53 -0
  294. package/dist/session/projection.d.ts +50 -0
  295. package/dist/session/projection.js +180 -0
  296. package/dist/session/store.d.ts +47 -0
  297. package/dist/session/store.js +210 -0
  298. package/dist/session/tree.d.ts +21 -0
  299. package/dist/session/tree.js +88 -0
  300. package/dist/session/types.d.ts +199 -0
  301. package/dist/session/types.js +18 -0
  302. package/dist/skills/discover.d.ts +60 -0
  303. package/dist/skills/discover.js +160 -0
  304. package/dist/skills/expand.d.ts +35 -0
  305. package/dist/skills/expand.js +46 -0
  306. package/dist/skills/frontmatter.d.ts +27 -0
  307. package/dist/skills/frontmatter.js +157 -0
  308. package/dist/skills/index-prompt.d.ts +13 -0
  309. package/dist/skills/index-prompt.js +42 -0
  310. package/dist/skills/templates.d.ts +52 -0
  311. package/dist/skills/templates.js +177 -0
  312. package/dist/tools/bash.d.ts +49 -0
  313. package/dist/tools/bash.js +222 -0
  314. package/dist/tools/edit-fuzzy.d.ts +36 -0
  315. package/dist/tools/edit-fuzzy.js +129 -0
  316. package/dist/tools/edit.d.ts +38 -0
  317. package/dist/tools/edit.js +241 -0
  318. package/dist/tools/file-mutex.d.ts +8 -0
  319. package/dist/tools/file-mutex.js +29 -0
  320. package/dist/tools/glob.d.ts +44 -0
  321. package/dist/tools/glob.js +217 -0
  322. package/dist/tools/grep.d.ts +39 -0
  323. package/dist/tools/grep.js +179 -0
  324. package/dist/tools/ignore.d.ts +40 -0
  325. package/dist/tools/ignore.js +174 -0
  326. package/dist/tools/ls.d.ts +21 -0
  327. package/dist/tools/ls.js +96 -0
  328. package/dist/tools/output-accumulator.d.ts +48 -0
  329. package/dist/tools/output-accumulator.js +106 -0
  330. package/dist/tools/paths.d.ts +20 -0
  331. package/dist/tools/paths.js +58 -0
  332. package/dist/tools/presets.d.ts +71 -0
  333. package/dist/tools/presets.js +128 -0
  334. package/dist/tools/process-tree.d.ts +35 -0
  335. package/dist/tools/process-tree.js +125 -0
  336. package/dist/tools/read.d.ts +28 -0
  337. package/dist/tools/read.js +181 -0
  338. package/dist/tools/registry.d.ts +43 -0
  339. package/dist/tools/registry.js +106 -0
  340. package/dist/tools/shell.d.ts +38 -0
  341. package/dist/tools/shell.js +91 -0
  342. package/dist/tools/task.d.ts +29 -0
  343. package/dist/tools/task.js +107 -0
  344. package/dist/tools/todo.d.ts +28 -0
  345. package/dist/tools/todo.js +107 -0
  346. package/dist/tools/truncate.d.ts +44 -0
  347. package/dist/tools/truncate.js +175 -0
  348. package/dist/tools/types.d.ts +135 -0
  349. package/dist/tools/types.js +19 -0
  350. package/dist/tools/write.d.ts +20 -0
  351. package/dist/tools/write.js +84 -0
  352. package/dist/tui/ansi.d.ts +29 -0
  353. package/dist/tui/ansi.js +420 -0
  354. package/dist/tui/component.d.ts +38 -0
  355. package/dist/tui/component.js +13 -0
  356. package/dist/tui/components/box.d.ts +26 -0
  357. package/dist/tui/components/box.js +65 -0
  358. package/dist/tui/components/container.d.ts +14 -0
  359. package/dist/tui/components/container.js +39 -0
  360. package/dist/tui/components/editor-buffer.d.ts +67 -0
  361. package/dist/tui/components/editor-buffer.js +300 -0
  362. package/dist/tui/components/editor-paste.d.ts +29 -0
  363. package/dist/tui/components/editor-paste.js +64 -0
  364. package/dist/tui/components/editor.d.ts +114 -0
  365. package/dist/tui/components/editor.js +530 -0
  366. package/dist/tui/components/key-value.d.ts +29 -0
  367. package/dist/tui/components/key-value.js +48 -0
  368. package/dist/tui/components/loader.d.ts +35 -0
  369. package/dist/tui/components/loader.js +71 -0
  370. package/dist/tui/components/markdown.d.ts +90 -0
  371. package/dist/tui/components/markdown.js +462 -0
  372. package/dist/tui/components/meter.d.ts +29 -0
  373. package/dist/tui/components/meter.js +47 -0
  374. package/dist/tui/components/overlay.d.ts +24 -0
  375. package/dist/tui/components/overlay.js +52 -0
  376. package/dist/tui/components/select-list.d.ts +57 -0
  377. package/dist/tui/components/select-list.js +179 -0
  378. package/dist/tui/components/spacer.d.ts +11 -0
  379. package/dist/tui/components/spacer.js +16 -0
  380. package/dist/tui/components/text.d.ts +30 -0
  381. package/dist/tui/components/text.js +65 -0
  382. package/dist/tui/keybindings.d.ts +66 -0
  383. package/dist/tui/keybindings.js +120 -0
  384. package/dist/tui/keys.d.ts +38 -0
  385. package/dist/tui/keys.js +275 -0
  386. package/dist/tui/stdin-buffer.d.ts +41 -0
  387. package/dist/tui/stdin-buffer.js +206 -0
  388. package/dist/tui/terminal.d.ts +79 -0
  389. package/dist/tui/terminal.js +153 -0
  390. package/dist/tui/theme.d.ts +31 -0
  391. package/dist/tui/theme.js +199 -0
  392. package/dist/tui/tui.d.ts +103 -0
  393. package/dist/tui/tui.js +363 -0
  394. package/dist/tui/vt-screen.d.ts +46 -0
  395. package/dist/tui/vt-screen.js +251 -0
  396. package/dist/tui.d.ts +30 -0
  397. package/dist/tui.js +31 -0
  398. package/dist/version.d.ts +8 -0
  399. package/dist/version.js +24 -0
  400. package/docs/codemode.md +102 -0
  401. package/docs/hooks.md +196 -0
  402. package/docs/host-api.md +161 -0
  403. package/docs/providers.md +316 -0
  404. package/docs/rpc.md +253 -0
  405. package/docs/session-format.md +119 -0
  406. package/docs/tui.md +168 -0
  407. package/package.json +101 -4
package/dist/ai/sse.js ADDED
@@ -0,0 +1,140 @@
1
+ /**
2
+ * Server-Sent Events 解析(设计 §1.2 ai/sse.ts):event / data / id / 多行 data / 注释行 /
3
+ * CRLF、CR、LF 三种行尾 / UTF-8 跨块 / 首字节 BOM。
4
+ *
5
+ * 规则取自 WHATWG「Interpreting an event stream」:空行分派事件;`:` 开头是注释;字段名后的
6
+ * 第一个空格去掉;多条 data 以 LF 连接。为兼容不规范服务端,流结束时未以空行收尾的最后一个
7
+ * 事件也会分派。
8
+ */
9
+ export class SseParser {
10
+ buffer = "";
11
+ event;
12
+ data = [];
13
+ id;
14
+ hasData = false;
15
+ bomChecked = false;
16
+ /** 上一块以 CR 结尾:下一块开头的 LF 属于同一个行尾。 */
17
+ pendingCr = false;
18
+ /** 喂入一段文本,返回其中完整分派的事件。 */
19
+ feed(chunk) {
20
+ let text = chunk;
21
+ if (!this.bomChecked && text.length > 0) {
22
+ this.bomChecked = true;
23
+ if (text.charCodeAt(0) === 0xfeff)
24
+ text = text.slice(1);
25
+ }
26
+ if (this.pendingCr && text.startsWith("\n"))
27
+ text = text.slice(1);
28
+ this.pendingCr = false;
29
+ this.buffer += text;
30
+ const events = [];
31
+ let start = 0;
32
+ for (let i = 0; i < this.buffer.length; i++) {
33
+ const ch = this.buffer.charCodeAt(i);
34
+ if (ch !== 10 && ch !== 13)
35
+ continue;
36
+ const line = this.buffer.slice(start, i);
37
+ if (ch === 13) {
38
+ if (i + 1 < this.buffer.length) {
39
+ if (this.buffer.charCodeAt(i + 1) === 10)
40
+ i++;
41
+ }
42
+ else {
43
+ this.pendingCr = true;
44
+ }
45
+ }
46
+ start = i + 1;
47
+ const event = this.processLine(line);
48
+ if (event)
49
+ events.push(event);
50
+ }
51
+ this.buffer = this.buffer.slice(start);
52
+ return events;
53
+ }
54
+ /** 流结束:处理残留行,并分派未以空行收尾的事件。 */
55
+ flush() {
56
+ const events = [];
57
+ if (this.buffer.length > 0) {
58
+ const event = this.processLine(this.buffer);
59
+ if (event)
60
+ events.push(event);
61
+ this.buffer = "";
62
+ }
63
+ const last = this.dispatch();
64
+ if (last)
65
+ events.push(last);
66
+ return events;
67
+ }
68
+ processLine(line) {
69
+ if (line === "")
70
+ return this.dispatch();
71
+ if (line.startsWith(":"))
72
+ return undefined;
73
+ const colon = line.indexOf(":");
74
+ const field = colon === -1 ? line : line.slice(0, colon);
75
+ let value = colon === -1 ? "" : line.slice(colon + 1);
76
+ if (value.startsWith(" "))
77
+ value = value.slice(1);
78
+ switch (field) {
79
+ case "event":
80
+ this.event = value;
81
+ break;
82
+ case "data":
83
+ this.data.push(value);
84
+ this.hasData = true;
85
+ break;
86
+ case "id":
87
+ if (!value.includes("\0"))
88
+ this.id = value;
89
+ break;
90
+ default:
91
+ // retry 与未知字段忽略
92
+ break;
93
+ }
94
+ return undefined;
95
+ }
96
+ dispatch() {
97
+ const hadContent = this.hasData || this.event !== undefined;
98
+ const event = { event: this.event, data: this.data.join("\n"), id: this.id };
99
+ this.event = undefined;
100
+ this.data = [];
101
+ this.hasData = false;
102
+ return hadContent ? event : undefined;
103
+ }
104
+ }
105
+ /** 从字节流读 SSE 事件;`signal` 中止时停止读取(调用方据此产出 aborted)。 */
106
+ export async function* readSseEvents(body, signal) {
107
+ const reader = body.getReader();
108
+ const decoder = new TextDecoder("utf-8");
109
+ const parser = new SseParser();
110
+ const onAbort = () => {
111
+ reader.cancel().catch(() => undefined);
112
+ };
113
+ signal?.addEventListener("abort", onAbort, { once: true });
114
+ let drained = false;
115
+ try {
116
+ while (true) {
117
+ if (signal?.aborted)
118
+ return;
119
+ const { value, done } = await reader.read();
120
+ if (done)
121
+ break;
122
+ if (signal?.aborted)
123
+ return;
124
+ for (const event of parser.feed(decoder.decode(value, { stream: true })))
125
+ yield event;
126
+ }
127
+ drained = true;
128
+ for (const event of parser.feed(decoder.decode()))
129
+ yield event;
130
+ for (const event of parser.flush())
131
+ yield event;
132
+ }
133
+ finally {
134
+ signal?.removeEventListener("abort", onAbort);
135
+ // 消费者提前退出(读到终止事件即 break)或中止:取消底层流,释放连接
136
+ if (!drained)
137
+ await reader.cancel().catch(() => undefined);
138
+ reader.releaseLock();
139
+ }
140
+ }
@@ -0,0 +1,42 @@
1
+ /**
2
+ * 思考级别(设计 §3.6「思考」):用户面 off / minimal / low / medium / high / xhigh。
3
+ *
4
+ * - `getSupportedLevels(model)`:非推理模型只有 off;`thinkingLevelMap[level] === null` 的级别
5
+ * 不支持;`xhigh` 只有在映射表里显式给出时才支持。
6
+ * - `clampThinkingLevel`:不支持的级别先向上找、再向下找最近的可用级别。
7
+ * - 预算型缺省:minimal 1024 / low 2048 / medium 8192 / high 16384(xhigh 按 high);
8
+ * 与回答共享 max_tokens 时至少给回答留 1024。
9
+ */
10
+ import type { Model, ModelThinkingLevel, ThinkingLevel } from "./types.js";
11
+ export declare const THINKING_LEVELS: readonly ModelThinkingLevel[];
12
+ export declare const DEFAULT_THINKING_BUDGETS: Readonly<Record<ThinkingLevel, number>>;
13
+ /** 与回答共享 max_tokens 时留给回答的最少 token。 */
14
+ export declare const MIN_ANSWER_TOKENS = 1024;
15
+ export declare function isThinkingLevel(value: unknown): value is ModelThinkingLevel;
16
+ type ThinkingModel = Pick<Model, "reasoning" | "thinkingLevelMap">;
17
+ export declare function getSupportedLevels(model: ThinkingModel): ModelThinkingLevel[];
18
+ export declare function clampThinkingLevel(model: ThinkingModel, level: ModelThinkingLevel): ModelThinkingLevel;
19
+ /** 级别在映射表里的供应商原生值;未映射返回 undefined(调用方按协议缺省处理)。 */
20
+ export declare function mappedThinkingValue(model: ThinkingModel, level: ModelThinkingLevel): string | number | undefined;
21
+ /** 预算:映射表给数字就用数字,否则按缺省表。 */
22
+ export declare function thinkingBudget(model: ThinkingModel, level: ThinkingLevel): number;
23
+ /** 预算不超过 `ceiling - MIN_ANSWER_TOKENS`(不足时为 0)。 */
24
+ export declare function clampBudgetToAnswerRoom(budget: number, ceiling: number): number;
25
+ /**
26
+ * 预算型思考(Anthropic 老模型):budget 计入 max_tokens。`requested` 是调用方要的回答上限
27
+ * (缺省 = 模型上限);返回值 maxTokens ≤ model.maxTokens,budget < maxTokens;budget < 1024 时调用方应关闭思考(Anthropic 下限)。
28
+ */
29
+ export declare function budgetedMaxTokens(modelMaxTokens: number, requested: number | undefined, budget: number): {
30
+ maxTokens: number;
31
+ budget: number;
32
+ };
33
+ /** 离散思考级别(Google Gemini 3 的 `thinkingLevel`)。 */
34
+ export type DiscreteThinkingLevel = "minimal" | "low" | "medium" | "high";
35
+ /**
36
+ * 用户面级别 → 离散级别:映射表给字串就用字串(大小写不敏感),否则用级别本身;`xhigh` 落到
37
+ * `high`。映射值不是四个离散级别之一(例如写成了数字预算)返回 undefined,调用方改走预算。
38
+ */
39
+ export declare function discreteThinkingLevel(model: ThinkingModel, level: ThinkingLevel): DiscreteThinkingLevel | undefined;
40
+ /** 解析请求级别:缺省 off;钳位到模型支持的级别。 */
41
+ export declare function resolveThinkingLevel(model: ThinkingModel, level: ModelThinkingLevel | undefined): ModelThinkingLevel;
42
+ export {};
@@ -0,0 +1,101 @@
1
+ /**
2
+ * 思考级别(设计 §3.6「思考」):用户面 off / minimal / low / medium / high / xhigh。
3
+ *
4
+ * - `getSupportedLevels(model)`:非推理模型只有 off;`thinkingLevelMap[level] === null` 的级别
5
+ * 不支持;`xhigh` 只有在映射表里显式给出时才支持。
6
+ * - `clampThinkingLevel`:不支持的级别先向上找、再向下找最近的可用级别。
7
+ * - 预算型缺省:minimal 1024 / low 2048 / medium 8192 / high 16384(xhigh 按 high);
8
+ * 与回答共享 max_tokens 时至少给回答留 1024。
9
+ */
10
+ export const THINKING_LEVELS = [
11
+ "off",
12
+ "minimal",
13
+ "low",
14
+ "medium",
15
+ "high",
16
+ "xhigh",
17
+ ];
18
+ export const DEFAULT_THINKING_BUDGETS = {
19
+ minimal: 1024,
20
+ low: 2048,
21
+ medium: 8192,
22
+ high: 16384,
23
+ xhigh: 16384,
24
+ };
25
+ /** 与回答共享 max_tokens 时留给回答的最少 token。 */
26
+ export const MIN_ANSWER_TOKENS = 1024;
27
+ export function isThinkingLevel(value) {
28
+ return typeof value === "string" && THINKING_LEVELS.includes(value);
29
+ }
30
+ export function getSupportedLevels(model) {
31
+ if (!model.reasoning)
32
+ return ["off"];
33
+ return THINKING_LEVELS.filter((level) => {
34
+ const mapped = model.thinkingLevelMap?.[level];
35
+ if (mapped === null)
36
+ return false;
37
+ if (level === "xhigh")
38
+ return mapped !== undefined;
39
+ return true;
40
+ });
41
+ }
42
+ export function clampThinkingLevel(model, level) {
43
+ const supported = getSupportedLevels(model);
44
+ if (supported.includes(level))
45
+ return level;
46
+ const index = THINKING_LEVELS.indexOf(level);
47
+ for (let i = index + 1; i < THINKING_LEVELS.length; i++) {
48
+ const candidate = THINKING_LEVELS[i];
49
+ if (candidate !== undefined && supported.includes(candidate))
50
+ return candidate;
51
+ }
52
+ for (let i = index - 1; i >= 0; i--) {
53
+ const candidate = THINKING_LEVELS[i];
54
+ if (candidate !== undefined && supported.includes(candidate))
55
+ return candidate;
56
+ }
57
+ return supported[0] ?? "off";
58
+ }
59
+ /** 级别在映射表里的供应商原生值;未映射返回 undefined(调用方按协议缺省处理)。 */
60
+ export function mappedThinkingValue(model, level) {
61
+ const mapped = model.thinkingLevelMap?.[level];
62
+ return mapped === null ? undefined : mapped;
63
+ }
64
+ /** 预算:映射表给数字就用数字,否则按缺省表。 */
65
+ export function thinkingBudget(model, level) {
66
+ const mapped = model.thinkingLevelMap?.[level];
67
+ return typeof mapped === "number" ? mapped : DEFAULT_THINKING_BUDGETS[level];
68
+ }
69
+ /** 预算不超过 `ceiling - MIN_ANSWER_TOKENS`(不足时为 0)。 */
70
+ export function clampBudgetToAnswerRoom(budget, ceiling) {
71
+ return Math.min(budget, Math.max(0, ceiling - MIN_ANSWER_TOKENS));
72
+ }
73
+ /**
74
+ * 预算型思考(Anthropic 老模型):budget 计入 max_tokens。`requested` 是调用方要的回答上限
75
+ * (缺省 = 模型上限);返回值 maxTokens ≤ model.maxTokens,budget < maxTokens;budget < 1024 时调用方应关闭思考(Anthropic 下限)。
76
+ */
77
+ export function budgetedMaxTokens(modelMaxTokens, requested, budget) {
78
+ const maxTokens = requested === undefined ? modelMaxTokens : Math.min(requested + budget, modelMaxTokens);
79
+ let adjusted = budget;
80
+ if (maxTokens <= adjusted)
81
+ adjusted = clampBudgetToAnswerRoom(adjusted, maxTokens);
82
+ return { maxTokens, budget: Math.max(0, Math.min(adjusted, maxTokens - 1)) };
83
+ }
84
+ const DISCRETE_LEVELS = ["minimal", "low", "medium", "high"];
85
+ /**
86
+ * 用户面级别 → 离散级别:映射表给字串就用字串(大小写不敏感),否则用级别本身;`xhigh` 落到
87
+ * `high`。映射值不是四个离散级别之一(例如写成了数字预算)返回 undefined,调用方改走预算。
88
+ */
89
+ export function discreteThinkingLevel(model, level) {
90
+ const mapped = model.thinkingLevelMap?.[level];
91
+ if (typeof mapped === "number")
92
+ return undefined;
93
+ const value = typeof mapped === "string" ? mapped.toLowerCase() : level;
94
+ if (value === "xhigh")
95
+ return "high";
96
+ return DISCRETE_LEVELS.includes(value) ? value : undefined;
97
+ }
98
+ /** 解析请求级别:缺省 off;钳位到模型支持的级别。 */
99
+ export function resolveThinkingLevel(model, level) {
100
+ return clampThinkingLevel(model, level ?? "off");
101
+ }