@theoremjs/agents 0.3.0 → 0.3.2

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 (570) hide show
  1. package/README.md +277 -995
  2. package/esm/mod.d.ts +34 -20
  3. package/esm/mod.js +19 -12
  4. package/esm/src/cli/commands/bench.js +36 -14
  5. package/esm/src/cli/commands/detect-compile.d.ts +17 -0
  6. package/esm/src/cli/commands/detect-compile.js +22 -0
  7. package/esm/src/cli/commands/eval.d.ts +3 -3
  8. package/esm/src/cli/commands/fuzz-canary.js +55 -16
  9. package/esm/src/cli/commands/profile.js +4 -4
  10. package/esm/src/cli/commands/run.d.ts +2 -2
  11. package/esm/src/cli/commands/run.js +1 -1
  12. package/esm/src/cli/commands/test.d.ts +4 -3
  13. package/esm/src/cli/commands/test.js +2 -2
  14. package/esm/src/cli/index.js +9 -9
  15. package/esm/src/cli/matrix/fixtures.js +25 -30
  16. package/esm/src/evals/attachments.d.ts +1 -0
  17. package/esm/src/evals/attachments.js +4 -2
  18. package/esm/src/evals/breakdown.d.ts +2 -0
  19. package/esm/src/evals/breakdown.js +1 -0
  20. package/esm/src/evals/graders/answer.d.ts +3 -0
  21. package/esm/src/evals/graders/answer.js +1 -0
  22. package/esm/src/evals/graders/code.d.ts +7 -31
  23. package/esm/src/evals/graders/code.js +4 -25
  24. package/esm/src/evals/graders/judge.d.ts +4 -0
  25. package/esm/src/evals/graders/judge.js +7 -5
  26. package/esm/src/evals/graders/latency.d.ts +1 -0
  27. package/esm/src/evals/graders/latency.js +3 -2
  28. package/esm/src/evals/graders/live.d.ts +3 -0
  29. package/esm/src/evals/graders/live.js +2 -0
  30. package/esm/src/evals/graders/media.js +1 -2
  31. package/esm/src/evals/graders/shared.js +1 -1
  32. package/esm/src/evals/graders/transcript.d.ts +2 -0
  33. package/esm/src/evals/graders/transcript.js +5 -3
  34. package/esm/src/evals/mod.d.ts +1 -9
  35. package/esm/src/evals/mod.js +1 -9
  36. package/esm/src/evals/record.d.ts +6 -0
  37. package/esm/src/evals/record.js +4 -2
  38. package/esm/src/evals/rubrics/mod.d.ts +1 -1
  39. package/esm/src/evals/rubrics/mod.js +1 -1
  40. package/esm/src/evals/rubrics/mustache.js +1 -1
  41. package/esm/src/evals/rubrics/types.js +1 -1
  42. package/esm/src/evals/run.d.ts +9 -52
  43. package/esm/src/evals/run.js +12 -46
  44. package/esm/src/evals/suite.d.ts +12 -3
  45. package/esm/src/evals/suite.js +9 -4
  46. package/esm/src/evals/summary.d.ts +3 -0
  47. package/esm/src/evals/summary.js +1 -0
  48. package/esm/src/evals/trial.d.ts +3 -16
  49. package/esm/src/evals/trial.js +7 -30
  50. package/esm/src/evals/types.d.ts +30 -121
  51. package/esm/src/evals/types.js +3 -16
  52. package/esm/src/evals/verdict.d.ts +5 -0
  53. package/esm/src/evals/verdict.js +4 -1
  54. package/esm/src/guardrails/boundaries.d.ts +41 -0
  55. package/esm/src/guardrails/boundaries.js +103 -0
  56. package/esm/src/guardrails/canary-gate.d.ts +1 -0
  57. package/esm/src/guardrails/canary.d.ts +49 -15
  58. package/esm/src/guardrails/canary.js +103 -30
  59. package/esm/src/guardrails/compile-egress.d.ts +6 -5
  60. package/esm/src/guardrails/compile-egress.js +6 -5
  61. package/esm/src/guardrails/corpus/canary-egress-attacks.d.ts +3 -1
  62. package/esm/src/guardrails/corpus/canary-egress-attacks.js +4 -2
  63. package/esm/src/guardrails/corpus/fuzz-inbound.js +14 -17
  64. package/esm/src/guardrails/corpus/inbound-payloads.d.ts +2 -0
  65. package/esm/src/guardrails/corpus/inbound-payloads.js +4 -2
  66. package/esm/src/guardrails/corpus/live-attacks.d.ts +2 -0
  67. package/esm/src/guardrails/corpus/live-attacks.js +6 -1
  68. package/esm/src/guardrails/corpus/mod.d.ts +1 -1
  69. package/esm/src/guardrails/corpus/secrets.d.ts +3 -3
  70. package/esm/src/guardrails/corpus/secrets.js +2 -2
  71. package/esm/src/guardrails/corpus/strings.d.ts +1 -1
  72. package/esm/src/guardrails/corpus/strings.js +1 -1
  73. package/esm/src/guardrails/corpus/types.d.ts +5 -1
  74. package/esm/src/guardrails/credential-rules.d.ts +36 -0
  75. package/esm/src/guardrails/credential-rules.js +3001 -0
  76. package/esm/src/guardrails/credential-scan.d.ts +45 -0
  77. package/esm/src/guardrails/credential-scan.js +172 -0
  78. package/esm/src/guardrails/destinations.d.ts +45 -0
  79. package/esm/src/guardrails/destinations.js +234 -0
  80. package/esm/src/guardrails/detect-at.d.ts +107 -0
  81. package/esm/src/guardrails/detect-at.js +434 -0
  82. package/esm/src/guardrails/detect-reply.d.ts +61 -0
  83. package/esm/src/guardrails/detect-reply.js +95 -0
  84. package/esm/src/guardrails/detect-stream.d.ts +33 -0
  85. package/esm/src/guardrails/detect-stream.js +77 -0
  86. package/esm/src/guardrails/detectors.d.ts +216 -0
  87. package/esm/src/guardrails/detectors.js +503 -0
  88. package/esm/src/guardrails/egress-automata.d.ts +4 -6
  89. package/esm/src/guardrails/egress-automata.js +24095 -4572
  90. package/esm/src/guardrails/egress-compiler.d.ts +38 -16
  91. package/esm/src/guardrails/egress-compiler.js +254 -60
  92. package/esm/src/guardrails/egress-patterns.d.ts +4 -2
  93. package/esm/src/guardrails/egress-patterns.js +6 -2
  94. package/esm/src/guardrails/egress-stream.d.ts +54 -36
  95. package/esm/src/guardrails/egress-stream.js +253 -124
  96. package/esm/src/guardrails/egress-urls.d.ts +6 -3
  97. package/esm/src/guardrails/egress-urls.js +14 -22
  98. package/esm/src/guardrails/egress.d.ts +26 -86
  99. package/esm/src/guardrails/egress.js +59 -309
  100. package/esm/src/guardrails/error.d.ts +13 -8
  101. package/esm/src/guardrails/error.js +25 -18
  102. package/esm/src/guardrails/event-schemas.d.ts +46 -3
  103. package/esm/src/guardrails/event-schemas.js +12 -5
  104. package/esm/src/guardrails/events.d.ts +5 -1
  105. package/esm/src/guardrails/events.js +4 -1
  106. package/esm/src/guardrails/hints.d.ts +14 -0
  107. package/esm/src/guardrails/hints.js +57 -0
  108. package/esm/src/guardrails/hits.d.ts +7 -1
  109. package/esm/src/guardrails/hits.js +12 -1
  110. package/esm/src/guardrails/host-patterns.d.ts +85 -0
  111. package/esm/src/guardrails/host-patterns.js +173 -0
  112. package/esm/src/guardrails/injection-patterns.d.ts +6 -1
  113. package/esm/src/guardrails/injection-patterns.js +33 -1
  114. package/esm/src/guardrails/injection-reversed.d.ts +9 -0
  115. package/esm/src/guardrails/injection-reversed.js +49 -0
  116. package/esm/src/guardrails/injection.d.ts +17 -1
  117. package/esm/src/guardrails/injection.js +259 -36
  118. package/esm/src/guardrails/labels.d.ts +40 -0
  119. package/esm/src/guardrails/labels.js +881 -0
  120. package/esm/src/guardrails/live-outbound-gate.d.ts +9 -8
  121. package/esm/src/guardrails/live-outbound-gate.js +100 -107
  122. package/esm/src/guardrails/mod.d.ts +30 -22
  123. package/esm/src/guardrails/mod.js +19 -14
  124. package/esm/src/guardrails/network.d.ts +4 -0
  125. package/esm/src/guardrails/network.js +21 -19
  126. package/esm/src/guardrails/normalize.d.ts +15 -1
  127. package/esm/src/guardrails/normalize.js +34 -1
  128. package/esm/src/guardrails/policy.d.ts +2 -17
  129. package/esm/src/guardrails/policy.js +12 -41
  130. package/esm/src/guardrails/progressive-yield.d.ts +65 -24
  131. package/esm/src/guardrails/progressive-yield.js +191 -147
  132. package/esm/src/guardrails/prompt-echo.d.ts +4 -2
  133. package/esm/src/guardrails/prompt-echo.js +87 -6
  134. package/esm/src/guardrails/quota.d.ts +4 -1
  135. package/esm/src/guardrails/quota.js +7 -2
  136. package/esm/src/guardrails/rules.d.ts +20 -29
  137. package/esm/src/guardrails/rules.js +23 -30
  138. package/esm/src/guardrails/sanitize.d.ts +32 -15
  139. package/esm/src/guardrails/sanitize.js +100 -124
  140. package/esm/src/guardrails/sensitive-groups.d.ts +21 -0
  141. package/esm/src/guardrails/sensitive-groups.js +12 -0
  142. package/esm/src/guardrails/sensitive.d.ts +16 -23
  143. package/esm/src/guardrails/sensitive.js +168 -47
  144. package/esm/src/guardrails/serialize.d.ts +1 -0
  145. package/esm/src/guardrails/testing.d.ts +4 -2
  146. package/esm/src/guardrails/testing.js +4 -2
  147. package/esm/src/guardrails/theorem-error.d.ts +5 -2
  148. package/esm/src/guardrails/theorem-error.js +6 -3
  149. package/esm/src/guardrails/thought-guard.d.ts +34 -13
  150. package/esm/src/guardrails/thought-guard.js +264 -64
  151. package/esm/src/guardrails/tool-directives.d.ts +29 -10
  152. package/esm/src/guardrails/tool-directives.js +133 -47
  153. package/esm/src/guardrails/tool-leak.d.ts +26 -0
  154. package/esm/src/guardrails/tool-leak.js +45 -0
  155. package/esm/src/guardrails/tool-result.d.ts +45 -14
  156. package/esm/src/guardrails/tool-result.js +94 -70
  157. package/esm/src/guardrails/types.d.ts +79 -71
  158. package/esm/src/guardrails/types.js +11 -7
  159. package/esm/src/host/client-turn.d.ts +29 -2
  160. package/esm/src/host/client-turn.js +46 -4
  161. package/esm/src/host/mint-trace.d.ts +1 -0
  162. package/esm/src/host/mint-trace.js +3 -2
  163. package/esm/src/host/mod.d.ts +2 -2
  164. package/esm/src/host/mod.js +1 -1
  165. package/esm/src/host/readStreamingJsonStringField.js +2 -43
  166. package/esm/src/host/reply.d.ts +6 -0
  167. package/esm/src/host/reply.js +8 -1
  168. package/esm/src/interface/blocks.d.ts +3 -0
  169. package/esm/src/interface/blocks.js +84 -14
  170. package/esm/src/interface/composer-actions.d.ts +4 -0
  171. package/esm/src/interface/composer-actions.js +5 -3
  172. package/esm/src/interface/draft.d.ts +6 -0
  173. package/esm/src/interface/draft.js +22 -11
  174. package/esm/src/interface/from-profile.d.ts +13 -1
  175. package/esm/src/interface/from-profile.js +66 -31
  176. package/esm/src/interface/history.d.ts +9 -3
  177. package/esm/src/interface/history.js +33 -24
  178. package/esm/src/interface/inputs.d.ts +1 -0
  179. package/esm/src/interface/inputs.js +3 -0
  180. package/esm/src/interface/mod.d.ts +4 -2
  181. package/esm/src/interface/mod.js +3 -2
  182. package/esm/src/interface/models.d.ts +7 -0
  183. package/esm/src/interface/models.js +5 -0
  184. package/esm/src/interface/pending.d.ts +9 -0
  185. package/esm/src/interface/pending.js +9 -3
  186. package/esm/src/interface/profile-interface.js +54 -40
  187. package/esm/src/interface/session.d.ts +12 -5
  188. package/esm/src/interface/session.js +17 -10
  189. package/esm/src/interface/stop.d.ts +13 -0
  190. package/esm/src/interface/stop.js +28 -0
  191. package/esm/src/interface/tool-calls.d.ts +14 -2
  192. package/esm/src/interface/tool-calls.js +64 -10
  193. package/esm/src/interface/tool-invoke.d.ts +2 -0
  194. package/esm/src/interface/tool-invoke.js +3 -1
  195. package/esm/src/interface/tool-media.d.ts +2 -0
  196. package/esm/src/interface/tool-media.js +2 -1
  197. package/esm/src/interface/types.d.ts +105 -40
  198. package/esm/src/interface/types.js +1 -0
  199. package/esm/src/kernel/api-catalog.d.ts +85 -0
  200. package/esm/src/kernel/api-catalog.js +229 -0
  201. package/esm/src/kernel/auth/crypto.d.ts +7 -2
  202. package/esm/src/kernel/auth/crypto.js +12 -10
  203. package/esm/src/kernel/auth/oauth.d.ts +2 -1
  204. package/esm/src/kernel/auth/oauth.js +23 -22
  205. package/esm/src/kernel/auth/typed-secret.js +2 -2
  206. package/esm/src/kernel/auth/types.d.ts +13 -0
  207. package/esm/src/kernel/checkpoint.d.ts +43 -0
  208. package/esm/src/kernel/checkpoint.js +58 -0
  209. package/esm/src/kernel/default-scope.d.ts +43 -5
  210. package/esm/src/kernel/default-scope.js +54 -5
  211. package/esm/src/kernel/engine/call-trace.d.ts +19 -0
  212. package/esm/src/kernel/engine/call-trace.js +29 -0
  213. package/esm/src/kernel/engine/compaction.d.ts +6 -5
  214. package/esm/src/kernel/engine/compaction.js +12 -11
  215. package/esm/src/kernel/engine/decision.d.ts +10 -8
  216. package/esm/src/kernel/engine/decision.js +174 -146
  217. package/esm/src/kernel/engine/embedding.d.ts +8 -0
  218. package/esm/src/kernel/engine/embedding.js +118 -0
  219. package/esm/src/kernel/engine/live-inbound.d.ts +14 -4
  220. package/esm/src/kernel/engine/live-inbound.js +36 -11
  221. package/esm/src/kernel/engine/live-ingress.d.ts +6 -0
  222. package/esm/src/kernel/engine/live-ingress.js +6 -1
  223. package/esm/src/kernel/engine/repair.js +12 -12
  224. package/esm/src/kernel/engine/runner/gates.d.ts +2 -2
  225. package/esm/src/kernel/engine/runner/gates.js +287 -101
  226. package/esm/src/kernel/engine/runner/mod.d.ts +19 -5
  227. package/esm/src/kernel/engine/runner/mod.js +107 -56
  228. package/esm/src/kernel/engine/runner/nested.d.ts +32 -0
  229. package/esm/src/kernel/engine/runner/nested.js +134 -0
  230. package/esm/src/kernel/engine/runner/schema-validation.d.ts +24 -3
  231. package/esm/src/kernel/engine/runner/schema-validation.js +78 -4
  232. package/esm/src/kernel/engine/runner/stages.d.ts +1 -1
  233. package/esm/src/kernel/engine/runner/stages.js +1 -8
  234. package/esm/src/kernel/engine/runner/state.d.ts +33 -12
  235. package/esm/src/kernel/engine/runner/state.js +11 -1
  236. package/esm/src/kernel/engine/runner/step-order.d.ts +27 -0
  237. package/esm/src/kernel/engine/runner/step-order.js +165 -0
  238. package/esm/src/kernel/engine/runner/steps.d.ts +2 -2
  239. package/esm/src/kernel/engine/runner/steps.js +329 -169
  240. package/esm/src/kernel/engine/runner/stream.d.ts +42 -11
  241. package/esm/src/kernel/engine/runner/stream.js +197 -46
  242. package/esm/src/kernel/engine/runner/usage.d.ts +5 -5
  243. package/esm/src/kernel/engine/runner/usage.js +12 -14
  244. package/esm/src/kernel/engine/session/mod.d.ts +8 -6
  245. package/esm/src/kernel/engine/session/mod.js +360 -129
  246. package/esm/src/kernel/engine/session/session-trace.d.ts +10 -10
  247. package/esm/src/kernel/engine/session/session-trace.js +41 -30
  248. package/esm/src/kernel/engine/token-estimate.d.ts +10 -64
  249. package/esm/src/kernel/engine/token-estimate.js +14 -194
  250. package/esm/src/kernel/engine/tool-trace.d.ts +3 -3
  251. package/esm/src/kernel/engine/tool-trace.js +2 -1
  252. package/esm/src/kernel/engine/turn-trace.d.ts +8 -7
  253. package/esm/src/kernel/engine/turn-trace.js +28 -36
  254. package/esm/src/kernel/engine/usage.d.ts +6 -0
  255. package/esm/src/kernel/engine/usage.js +17 -0
  256. package/esm/src/kernel/interaction-parts.d.ts +3 -0
  257. package/esm/src/kernel/interaction-parts.js +18 -0
  258. package/esm/src/kernel/json.d.ts +10 -0
  259. package/esm/src/kernel/json.js +3 -0
  260. package/esm/src/kernel/mod.d.ts +38 -11
  261. package/esm/src/kernel/mod.js +22 -7
  262. package/esm/src/kernel/profile-graph.d.ts +11 -6
  263. package/esm/src/kernel/profile-graph.js +14 -7
  264. package/esm/src/kernel/profile-presence.d.ts +10 -1
  265. package/esm/src/kernel/profile-presence.js +90 -75
  266. package/esm/src/kernel/profile-scope.d.ts +7 -3
  267. package/esm/src/kernel/profile-scope.js +67 -55
  268. package/esm/src/kernel/protocols/binding.d.ts +65 -0
  269. package/esm/src/kernel/protocols/binding.js +125 -0
  270. package/esm/src/kernel/protocols/limits.d.ts +15 -0
  271. package/esm/src/kernel/protocols/limits.js +28 -0
  272. package/esm/src/kernel/protocols/mod.d.ts +5 -0
  273. package/esm/src/kernel/protocols/mod.js +5 -0
  274. package/esm/src/kernel/protocols/prices.d.ts +36 -0
  275. package/esm/src/kernel/protocols/prices.js +37 -0
  276. package/esm/src/kernel/protocols/protocol.d.ts +253 -0
  277. package/esm/src/kernel/protocols/protocol.js +253 -0
  278. package/esm/src/kernel/protocols/provider.d.ts +108 -0
  279. package/esm/src/kernel/protocols/provider.js +143 -0
  280. package/esm/src/kernel/protocols/runtime.d.ts +55 -0
  281. package/esm/src/kernel/protocols/runtime.js +534 -0
  282. package/esm/src/kernel/provider-budget.d.ts +32 -0
  283. package/esm/src/kernel/provider-budget.js +262 -0
  284. package/esm/src/kernel/provider-dispatch.d.ts +13 -0
  285. package/esm/src/kernel/provider-dispatch.js +36 -0
  286. package/esm/src/kernel/provider-live.d.ts +7 -0
  287. package/esm/src/kernel/provider-live.js +189 -0
  288. package/esm/src/kernel/provider-runtime.d.ts +57 -0
  289. package/esm/src/kernel/provider-runtime.js +524 -0
  290. package/esm/src/kernel/registry/attachments.d.ts +15 -4
  291. package/esm/src/kernel/registry/attachments.js +31 -22
  292. package/esm/src/kernel/registry/catalog.d.ts +6 -0
  293. package/esm/src/kernel/registry/catalog.js +9 -2
  294. package/esm/src/kernel/registry/embedding-rules.d.ts +28 -0
  295. package/esm/src/kernel/registry/embedding-rules.js +66 -0
  296. package/esm/src/kernel/registry/ingress.d.ts +6 -2
  297. package/esm/src/kernel/registry/ingress.js +55 -10
  298. package/esm/src/kernel/registry/kernel-registry.d.ts +3 -0
  299. package/esm/src/kernel/registry/kernel-registry.js +9 -2
  300. package/esm/src/kernel/registry/profile-outputs.js +4 -1
  301. package/esm/src/kernel/registry/profiles.d.ts +38 -14
  302. package/esm/src/kernel/registry/profiles.js +280 -205
  303. package/esm/src/kernel/registry/provider-request.d.ts +3 -3
  304. package/esm/src/kernel/registry/provider-request.js +5 -13
  305. package/esm/src/kernel/registry/resolve.d.ts +4 -1
  306. package/esm/src/kernel/registry/resolve.js +59 -58
  307. package/esm/src/kernel/registry/schemas.d.ts +3 -0
  308. package/esm/src/kernel/registry/schemas.js +3 -1
  309. package/esm/src/kernel/registry/slot-fill.d.ts +7 -0
  310. package/esm/src/kernel/registry/slot-fill.js +22 -0
  311. package/esm/src/kernel/registry/system-prompt.js +7 -8
  312. package/esm/src/kernel/registry/vault.d.ts +14 -13
  313. package/esm/src/kernel/registry/vault.js +1 -14
  314. package/esm/src/kernel/schema.d.ts +100 -46
  315. package/esm/src/kernel/schema.js +499 -257
  316. package/esm/src/kernel/scope.d.ts +12 -5
  317. package/esm/src/kernel/scope.js +23 -3
  318. package/esm/src/kernel/stages.d.ts +38 -3
  319. package/esm/src/kernel/stages.js +82 -39
  320. package/esm/src/kernel/stop.d.ts +29 -6
  321. package/esm/src/kernel/stop.js +16 -4
  322. package/esm/src/kernel/system-parts.js +6 -6
  323. package/esm/src/kernel/tools/activity-label.d.ts +12 -6
  324. package/esm/src/kernel/tools/activity-label.js +258 -32
  325. package/esm/src/kernel/tools/agent.d.ts +66 -0
  326. package/esm/src/kernel/tools/agent.js +212 -0
  327. package/esm/src/kernel/tools/coordinate.d.ts +4 -0
  328. package/esm/src/kernel/tools/coordinate.js +165 -0
  329. package/esm/src/kernel/tools/events.d.ts +21 -6
  330. package/esm/src/kernel/tools/events.js +53 -18
  331. package/esm/src/kernel/tools/execute.d.ts +47 -11
  332. package/esm/src/kernel/tools/execute.js +508 -136
  333. package/esm/src/kernel/tools/gate-answer.d.ts +12 -2
  334. package/esm/src/kernel/tools/gate-answer.js +17 -6
  335. package/esm/src/kernel/tools/handler-events.d.ts +45 -0
  336. package/esm/src/kernel/tools/handler-events.js +106 -0
  337. package/esm/src/kernel/tools/harness.d.ts +1 -0
  338. package/esm/src/kernel/tools/harness.js +2 -1
  339. package/esm/src/kernel/tools/http-limit.d.ts +27 -0
  340. package/esm/src/kernel/tools/http-limit.js +85 -0
  341. package/esm/src/kernel/tools/invoke.d.ts +27 -5
  342. package/esm/src/kernel/tools/invoke.js +223 -70
  343. package/esm/src/kernel/tools/mcp-sessions.d.ts +4 -1
  344. package/esm/src/kernel/tools/mcp-sessions.js +13 -8
  345. package/esm/src/kernel/tools/mod.d.ts +4 -3
  346. package/esm/src/kernel/tools/mod.js +3 -2
  347. package/esm/src/kernel/tools/model-text.d.ts +10 -5
  348. package/esm/src/kernel/tools/model-text.js +18 -12
  349. package/esm/src/kernel/tools/operation.d.ts +76 -0
  350. package/esm/src/kernel/tools/operation.js +100 -0
  351. package/esm/src/kernel/tools/page-answer.d.ts +8 -0
  352. package/esm/src/kernel/tools/page-answer.js +19 -0
  353. package/esm/src/kernel/tools/permission.d.ts +11 -2
  354. package/esm/src/kernel/tools/permission.js +12 -12
  355. package/esm/src/kernel/tools/project.d.ts +4 -1
  356. package/esm/src/kernel/tools/project.js +32 -2
  357. package/esm/src/kernel/tools/registry.d.ts +9 -2
  358. package/esm/src/kernel/tools/registry.js +69 -10
  359. package/esm/src/kernel/tools/remote.d.ts +40 -6
  360. package/esm/src/kernel/tools/remote.js +219 -92
  361. package/esm/src/kernel/tools/resolve.d.ts +3 -0
  362. package/esm/src/kernel/tools/resolve.js +12 -4
  363. package/esm/src/kernel/tools/run.d.ts +28 -0
  364. package/esm/src/kernel/tools/run.js +86 -0
  365. package/esm/src/kernel/tools/schema.d.ts +3 -3
  366. package/esm/src/kernel/tools/schema.js +21 -100
  367. package/esm/src/kernel/tools/signed-in-fetch.d.ts +2 -1
  368. package/esm/src/kernel/tools/signed-in-fetch.js +3 -3
  369. package/esm/src/kernel/tools/stage-run.d.ts +27 -4
  370. package/esm/src/kernel/tools/stage-run.js +75 -17
  371. package/esm/src/kernel/tools/types.d.ts +235 -25
  372. package/esm/src/kernel/tools/unchecked-output.d.ts +14 -0
  373. package/esm/src/kernel/tools/unchecked-output.js +18 -0
  374. package/esm/src/kernel/turn-events.d.ts +208 -31
  375. package/esm/src/kernel/turn-events.js +127 -9
  376. package/esm/src/kernel/types.d.ts +302 -161
  377. package/esm/src/kernel/util/base64.d.ts +2 -0
  378. package/esm/src/kernel/util/base64.js +2 -0
  379. package/esm/src/kernel/util/partial-json.d.ts +23 -0
  380. package/esm/src/kernel/util/partial-json.js +128 -0
  381. package/esm/src/kernel/util/record.d.ts +1 -0
  382. package/esm/src/kernel/util/record.js +1 -0
  383. package/esm/src/observability/destinations.d.ts +5 -0
  384. package/esm/src/observability/destinations.js +7 -2
  385. package/esm/src/observability/jsonl.d.ts +2 -2
  386. package/esm/src/observability/jsonl.js +15 -22
  387. package/esm/src/observability/mod.d.ts +3 -3
  388. package/esm/src/observability/mod.js +2 -2
  389. package/esm/src/observability/openinference.d.ts +1 -1
  390. package/esm/src/observability/openinference.js +3 -3
  391. package/esm/src/observability/otlp.d.ts +3 -0
  392. package/esm/src/observability/otlp.js +3 -3
  393. package/esm/src/observability/phoenix.d.ts +1 -0
  394. package/esm/src/observability/policy.d.ts +3 -0
  395. package/esm/src/observability/policy.js +5 -1
  396. package/esm/src/observability/resolve-policy.js +11 -5
  397. package/esm/src/observability/spans.d.ts +8 -2
  398. package/esm/src/observability/spans.js +21 -5
  399. package/esm/src/observability/trace-catalog.d.ts +19 -2
  400. package/esm/src/observability/trace-catalog.js +130 -88
  401. package/esm/src/observability/trace-record.js +22 -17
  402. package/esm/src/observability/trace-schema.d.ts +3 -0
  403. package/esm/src/observability/trace-schema.js +1 -1
  404. package/esm/src/observability/trace-sink.d.ts +1 -0
  405. package/esm/src/observability/trace-sink.js +1 -1
  406. package/esm/src/observability/trace-span.d.ts +7 -1
  407. package/esm/src/observability/trace-span.js +3 -1
  408. package/esm/src/observability/trace.d.ts +2 -0
  409. package/esm/src/observability/trace.js +4 -2
  410. package/esm/src/observability/types.d.ts +35 -11
  411. package/esm/src/observability/types.js +1 -1
  412. package/esm/src/presets/google/speech-voices.d.ts +1 -0
  413. package/esm/src/presets/google-limits.d.ts +1 -0
  414. package/esm/src/presets/google.d.ts +27 -12
  415. package/esm/src/presets/google.js +34 -25
  416. package/esm/src/presets/local.d.ts +26 -0
  417. package/esm/src/presets/local.js +30 -0
  418. package/esm/src/presets/mod.d.ts +5 -4
  419. package/esm/src/presets/mod.js +4 -4
  420. package/esm/src/presets/openrouter.d.ts +14 -1
  421. package/esm/src/presets/openrouter.js +19 -1
  422. package/esm/src/providers/embedding-limits.d.ts +7 -0
  423. package/esm/src/providers/embedding-limits.js +12 -0
  424. package/esm/src/providers/gemini/embedding-protocol.d.ts +8 -0
  425. package/esm/src/providers/gemini/embedding-protocol.js +125 -0
  426. package/esm/src/providers/gemini/interactions-protocol.d.ts +8 -0
  427. package/esm/src/providers/gemini/interactions-protocol.js +102 -0
  428. package/esm/src/providers/gemini/live-protocol.d.ts +3 -0
  429. package/esm/src/providers/gemini/live-protocol.js +191 -0
  430. package/esm/src/providers/gemini/prices.d.ts +3 -0
  431. package/esm/src/providers/gemini/prices.js +63 -0
  432. package/esm/src/providers/gemini/provider.d.ts +7 -0
  433. package/esm/src/providers/gemini/provider.js +39 -0
  434. package/esm/src/providers/google/api-error.d.ts +2 -0
  435. package/esm/src/providers/google/api-error.js +26 -18
  436. package/esm/src/providers/google/builtins.d.ts +14 -0
  437. package/esm/src/providers/google/builtins.js +57 -0
  438. package/esm/src/providers/google/grounding.d.ts +4 -4
  439. package/esm/src/providers/google/interactions/framing.d.ts +20 -8
  440. package/esm/src/providers/google/interactions/framing.js +85 -44
  441. package/esm/src/providers/google/interactions/steps.d.ts +5 -5
  442. package/esm/src/providers/google/interactions/steps.js +4 -4
  443. package/esm/src/providers/google/interactions/stream.d.ts +10 -11
  444. package/esm/src/providers/google/interactions/stream.js +33 -100
  445. package/esm/src/providers/google/live/framing.d.ts +15 -5
  446. package/esm/src/providers/google/live/framing.js +25 -25
  447. package/esm/src/providers/google/live/stream.d.ts +6 -44
  448. package/esm/src/providers/google/live/stream.js +4 -210
  449. package/esm/src/providers/google/urls.d.ts +1 -3
  450. package/esm/src/providers/google/urls.js +1 -3
  451. package/esm/src/providers/google/usage.js +2 -2
  452. package/esm/src/providers/live.d.ts +6 -0
  453. package/esm/src/providers/live.js +6 -0
  454. package/esm/src/providers/local/embedding-protocol.d.ts +7 -0
  455. package/esm/src/providers/local/embedding-protocol.js +60 -0
  456. package/esm/src/providers/local/provider.d.ts +7 -0
  457. package/esm/src/providers/local/provider.js +28 -0
  458. package/esm/src/providers/mod.d.ts +28 -7
  459. package/esm/src/providers/mod.js +19 -3
  460. package/esm/src/providers/open-ai/protocol.d.ts +3 -0
  461. package/esm/src/providers/open-ai/protocol.js +189 -0
  462. package/esm/src/providers/openrouter/embedding-protocol.d.ts +6 -0
  463. package/esm/src/providers/openrouter/embedding-protocol.js +86 -0
  464. package/esm/src/providers/openrouter/image.d.ts +0 -9
  465. package/esm/src/providers/openrouter/image.js +0 -153
  466. package/esm/src/providers/openrouter/images-protocol.d.ts +3 -0
  467. package/esm/src/providers/openrouter/images-protocol.js +82 -0
  468. package/esm/src/providers/openrouter/openai/compat.d.ts +2 -2
  469. package/esm/src/providers/openrouter/openai/compat.js +6 -6
  470. package/esm/src/providers/openrouter/openai/image-payload.d.ts +2 -2
  471. package/esm/src/providers/openrouter/openai/reasoning-state.d.ts +2 -0
  472. package/esm/src/providers/openrouter/openai/reasoning-state.js +31 -0
  473. package/esm/src/providers/openrouter/protocol.d.ts +8 -0
  474. package/esm/src/providers/openrouter/protocol.js +171 -0
  475. package/esm/src/providers/openrouter/provider.d.ts +10 -0
  476. package/esm/src/providers/openrouter/provider.js +50 -0
  477. package/esm/src/providers/shared/carried-tool-files.d.ts +7 -0
  478. package/esm/src/providers/shared/carried-tool-files.js +43 -0
  479. package/esm/src/providers/shared/pcm.js +2 -2
  480. package/esm/src/providers/shared/protocol-events.d.ts +8 -0
  481. package/esm/src/providers/shared/protocol-events.js +20 -0
  482. package/esm/src/providers/shared/response-identity.d.ts +2 -2
  483. package/esm/src/providers/shared/retry.d.ts +18 -0
  484. package/esm/src/providers/shared/retry.js +89 -0
  485. package/esm/src/providers/shared/sse.d.ts +0 -4
  486. package/esm/src/providers/shared/sse.js +50 -36
  487. package/esm/src/providers/shared/tool-args.d.ts +6 -7
  488. package/esm/src/providers/shared/tool-args.js +10 -6
  489. package/esm/src/providers/shared/tool-draft.d.ts +16 -0
  490. package/esm/src/providers/shared/tool-draft.js +14 -0
  491. package/esm/src/providers/shared/upstream-tap.d.ts +2 -2
  492. package/esm/src/providers/shared/upstream-tape.js +1 -1
  493. package/esm/src/providers/system-one/protocol.d.ts +8 -0
  494. package/esm/src/providers/system-one/protocol.js +93 -0
  495. package/esm/src/providers/types.d.ts +48 -16
  496. package/esm/src/providers/types.js +2 -1
  497. package/esm/src/providers/typesafe/provider.d.ts +7 -0
  498. package/esm/src/providers/typesafe/provider.js +24 -0
  499. package/esm/src/surface/formats.d.ts +19 -1
  500. package/esm/src/surface/formats.js +68 -29
  501. package/esm/src/surface/mod.d.ts +4 -2
  502. package/esm/src/surface/mod.js +4 -2
  503. package/esm/src/surface/runtime.d.ts +4 -0
  504. package/esm/src/surface/runtime.js +2 -0
  505. package/esm/src/surface/tools.d.ts +2 -8
  506. package/esm/src/surface/tools.js +4 -22
  507. package/esm/src/surface/types.d.ts +6 -0
  508. package/package.json +5 -13
  509. package/esm/src/cli/commands/egress-compile.d.ts +0 -17
  510. package/esm/src/cli/commands/egress-compile.js +0 -25
  511. package/esm/src/guardrails/egress-policy.d.ts +0 -27
  512. package/esm/src/guardrails/egress-policy.js +0 -76
  513. package/esm/src/guardrails/egress-rules.d.ts +0 -54
  514. package/esm/src/guardrails/egress-rules.js +0 -49
  515. package/esm/src/guardrails/lexicon.d.ts +0 -30
  516. package/esm/src/guardrails/lexicon.js +0 -478
  517. package/esm/src/kernel/engine/media-probe/audio.d.ts +0 -7
  518. package/esm/src/kernel/engine/media-probe/audio.js +0 -342
  519. package/esm/src/kernel/engine/media-probe/bytes.d.ts +0 -6
  520. package/esm/src/kernel/engine/media-probe/bytes.js +0 -26
  521. package/esm/src/kernel/engine/media-probe/image.d.ts +0 -5
  522. package/esm/src/kernel/engine/media-probe/image.js +0 -171
  523. package/esm/src/kernel/engine/media-probe/iso-bmff.d.ts +0 -19
  524. package/esm/src/kernel/engine/media-probe/iso-bmff.js +0 -48
  525. package/esm/src/kernel/engine/media-probe/matroska.d.ts +0 -35
  526. package/esm/src/kernel/engine/media-probe/matroska.js +0 -226
  527. package/esm/src/kernel/engine/media-probe/mp4.d.ts +0 -22
  528. package/esm/src/kernel/engine/media-probe/mp4.js +0 -279
  529. package/esm/src/kernel/engine/media-probe/opus.d.ts +0 -4
  530. package/esm/src/kernel/engine/media-probe/opus.js +0 -23
  531. package/esm/src/kernel/engine/media-probe/pdf.d.ts +0 -5
  532. package/esm/src/kernel/engine/media-probe/pdf.js +0 -117
  533. package/esm/src/kernel/engine/media-probe/video.d.ts +0 -15
  534. package/esm/src/kernel/engine/media-probe/video.js +0 -49
  535. package/esm/src/presets/typesafe.d.ts +0 -2
  536. package/esm/src/presets/typesafe.js +0 -2
  537. package/esm/src/providers/create-provider.d.ts +0 -21
  538. package/esm/src/providers/create-provider.js +0 -90
  539. package/esm/src/providers/decision/usage.d.ts +0 -3
  540. package/esm/src/providers/decision/usage.js +0 -25
  541. package/esm/src/providers/google/interactions/mod.d.ts +0 -2
  542. package/esm/src/providers/google/interactions/mod.js +0 -2
  543. package/esm/src/providers/google/keys.d.ts +0 -20
  544. package/esm/src/providers/google/keys.js +0 -87
  545. package/esm/src/providers/google/live/mod.d.ts +0 -7
  546. package/esm/src/providers/google/live/mod.js +0 -7
  547. package/esm/src/providers/google/live/openapi-schema.d.ts +0 -1
  548. package/esm/src/providers/google/live/openapi-schema.js +0 -42
  549. package/esm/src/providers/google/live/session.d.ts +0 -14
  550. package/esm/src/providers/google/live/session.js +0 -150
  551. package/esm/src/providers/local/local.d.ts +0 -12
  552. package/esm/src/providers/local/local.js +0 -186
  553. package/esm/src/providers/local/mod.d.ts +0 -8
  554. package/esm/src/providers/local/mod.js +0 -8
  555. package/esm/src/providers/openrouter/cache-control.d.ts +0 -5
  556. package/esm/src/providers/openrouter/cache-control.js +0 -4
  557. package/esm/src/providers/openrouter/chat.d.ts +0 -64
  558. package/esm/src/providers/openrouter/chat.js +0 -490
  559. package/esm/src/providers/openrouter/openai/sdk-messages.d.ts +0 -10
  560. package/esm/src/providers/openrouter/openai/sdk-messages.js +0 -99
  561. package/esm/src/providers/openrouter/resolve-api-key.d.ts +0 -3
  562. package/esm/src/providers/openrouter/resolve-api-key.js +0 -8
  563. package/esm/src/providers/openrouter/speech.d.ts +0 -18
  564. package/esm/src/providers/openrouter/speech.js +0 -109
  565. package/esm/src/providers/probe.d.ts +0 -5
  566. package/esm/src/providers/probe.js +0 -15
  567. package/esm/src/providers/shared/builtin-wire.d.ts +0 -4
  568. package/esm/src/providers/shared/builtin-wire.js +0 -9
  569. package/esm/src/providers/shared/vault.d.ts +0 -13
  570. package/esm/src/providers/shared/vault.js +0 -41
@@ -1,342 +0,0 @@
1
- import { ascii, id3v2End, uint64, view } from './bytes.js';
2
- import { MKV_AUDIO_TRACK, matroska, opusSamplesFromNs } from './matroska.js';
3
- import { MP4_SOUND, mp4Tracks } from './mp4.js';
4
- import { OPUS_RATE } from './opus.js';
5
- const RIFF_HEADER = 12;
6
- const CHUNK_HEADER = 8;
7
- const WAV_BYTE_RATE_OFFSET = 8;
8
- function positiveSeconds(seconds) {
9
- return Number.isFinite(seconds) && seconds > 0 ? seconds : undefined;
10
- }
11
- function wavSeconds(bytes) {
12
- if (bytes.length < RIFF_HEADER ||
13
- ascii(bytes, 0, 4) !== 'RIFF' ||
14
- ascii(bytes, 8, 4) !== 'WAVE') {
15
- return undefined;
16
- }
17
- const v = view(bytes);
18
- let byteRate;
19
- let at = RIFF_HEADER;
20
- while (at + CHUNK_HEADER <= bytes.length) {
21
- const id = ascii(bytes, at, 4);
22
- const size = v.getUint32(at + 4, true);
23
- if (id === 'fmt ' && at + CHUNK_HEADER + WAV_BYTE_RATE_OFFSET + 4 <= bytes.length) {
24
- byteRate = v.getUint32(at + CHUNK_HEADER + WAV_BYTE_RATE_OFFSET, true);
25
- }
26
- if (id === 'data') {
27
- return byteRate ? positiveSeconds(size / byteRate) : undefined;
28
- }
29
- at += CHUNK_HEADER + size + (size % 2);
30
- }
31
- return undefined;
32
- }
33
- const AIFF_COMM_FRAMES = 2;
34
- const AIFF_COMM_RATE = 8;
35
- const AIFF_COMM_MIN = 18;
36
- const EXTENDED_BIAS = 16383;
37
- const EXTENDED_MANTISSA_BITS = 63;
38
- /** IEEE 754 80-bit extended float (AIFF sample rate). */
39
- function extended80(v, at) {
40
- const exponent = v.getUint16(at) & 0x7fff;
41
- const mantissa = v.getUint32(at + 2) * 2 ** 32 + v.getUint32(at + 6);
42
- return mantissa * 2 ** (exponent - EXTENDED_BIAS - EXTENDED_MANTISSA_BITS);
43
- }
44
- function aiffSeconds(bytes) {
45
- if (bytes.length < RIFF_HEADER || ascii(bytes, 0, 4) !== 'FORM')
46
- return undefined;
47
- const form = ascii(bytes, 8, 4);
48
- if (form !== 'AIFF' && form !== 'AIFC')
49
- return undefined;
50
- const v = view(bytes);
51
- let at = RIFF_HEADER;
52
- while (at + CHUNK_HEADER <= bytes.length) {
53
- const size = v.getUint32(at + 4);
54
- if (ascii(bytes, at, 4) === 'COMM') {
55
- if (size < AIFF_COMM_MIN || at + CHUNK_HEADER + AIFF_COMM_MIN > bytes.length) {
56
- return undefined;
57
- }
58
- const body = at + CHUNK_HEADER;
59
- const frames = v.getUint32(body + AIFF_COMM_FRAMES);
60
- return positiveSeconds(frames / extended80(v, body + AIFF_COMM_RATE));
61
- }
62
- at += CHUNK_HEADER + size + (size % 2);
63
- }
64
- return undefined;
65
- }
66
- const FLAC_BLOCK_HEADER = 4;
67
- const FLAC_STREAMINFO = 0;
68
- const FLAC_STREAMINFO_LENGTH = 34;
69
- const FLAC_BLOCK_TYPE_MASK = 0x7f;
70
- /** Sample rate from a FLAC STREAMINFO body (20 bits at byte 10). */
71
- function streamInfoRate(bytes, at) {
72
- if (at + FLAC_STREAMINFO_LENGTH > bytes.length)
73
- return undefined;
74
- return (bytes[at + 10] << 12) | (bytes[at + 11] << 4) | (bytes[at + 12] >> 4);
75
- }
76
- /** Seconds from a FLAC STREAMINFO body: sample rate and 36-bit total samples. */
77
- function streamInfoSeconds(bytes, at) {
78
- const rate = streamInfoRate(bytes, at);
79
- if (rate === undefined)
80
- return undefined;
81
- const samples = (bytes[at + 13] & 0x0f) * 2 ** 32 + view(bytes).getUint32(at + 14);
82
- return positiveSeconds(samples / rate);
83
- }
84
- function flacSeconds(bytes) {
85
- const at = id3v2End(bytes);
86
- if (at + 4 + FLAC_BLOCK_HEADER > bytes.length || ascii(bytes, at, 4) !== 'fLaC') {
87
- return undefined;
88
- }
89
- const header = at + 4;
90
- if ((bytes[header] & FLAC_BLOCK_TYPE_MASK) !== FLAC_STREAMINFO)
91
- return undefined;
92
- return streamInfoSeconds(bytes, header + FLAC_BLOCK_HEADER);
93
- }
94
- const OGG_PAGE_HEADER = 27;
95
- const OGG_GRANULE = 6;
96
- const OGG_SERIAL = 14;
97
- const OGG_SEGMENTS = 26;
98
- const OPUS_PRE_SKIP = 10;
99
- const VORBIS_RATE = 12;
100
- /** Ogg FLAC mapping header (9 bytes) precedes `fLaC` and the STREAMINFO block header. */
101
- const OGG_FLAC_STREAMINFO = 9 + 4 + FLAC_BLOCK_HEADER;
102
- function oggPage(bytes, at) {
103
- if (at + OGG_PAGE_HEADER > bytes.length ||
104
- ascii(bytes, at, 4) !== 'OggS' ||
105
- bytes[at + 4] !== 0) {
106
- return undefined;
107
- }
108
- const v = view(bytes);
109
- const noGranule = v.getUint32(at + OGG_GRANULE, true) === 0xffffffff &&
110
- v.getUint32(at + OGG_GRANULE + 4, true) === 0xffffffff;
111
- return {
112
- granule: noGranule ? undefined : uint64(v, at + OGG_GRANULE, true),
113
- serial: v.getUint32(at + OGG_SERIAL, true),
114
- payload: at + OGG_PAGE_HEADER + bytes[at + OGG_SEGMENTS],
115
- };
116
- }
117
- /** Granule position of the last page of `serial` that completes a packet. */
118
- function lastGranule(bytes, serial) {
119
- for (let at = bytes.length - OGG_PAGE_HEADER; at >= 0; at--) {
120
- if (bytes[at] !== 0x4f)
121
- continue;
122
- const page = oggPage(bytes, at);
123
- if (page && page.serial === serial && page.granule !== undefined)
124
- return page.granule;
125
- }
126
- return undefined;
127
- }
128
- function oggSeconds(bytes) {
129
- const first = oggPage(bytes, 0);
130
- if (!first)
131
- return undefined;
132
- const at = first.payload;
133
- const v = view(bytes);
134
- const has = (n) => at + n <= bytes.length;
135
- let rate;
136
- let preSkip = 0;
137
- if (has(OPUS_PRE_SKIP + 2) && ascii(bytes, at, 8) === 'OpusHead') {
138
- rate = OPUS_RATE;
139
- preSkip = v.getUint16(at + OPUS_PRE_SKIP, true);
140
- }
141
- else if (has(VORBIS_RATE + 4) && bytes[at] === 1 && ascii(bytes, at + 1, 6) === 'vorbis') {
142
- rate = v.getUint32(at + VORBIS_RATE, true);
143
- }
144
- else if (bytes[at] === 0x7f && has(5) && ascii(bytes, at + 1, 4) === 'FLAC') {
145
- rate = streamInfoRate(bytes, at + OGG_FLAC_STREAMINFO);
146
- }
147
- else {
148
- return undefined;
149
- }
150
- const granule = lastGranule(bytes, first.serial);
151
- if (granule === undefined || !rate)
152
- return undefined;
153
- return positiveSeconds((granule - preSkip) / rate);
154
- }
155
- /**
156
- * Decoded length of a Matroska / WebM file's audio. Unlaced Opus blocks are
157
- * summed as a decoder outputs them — packet samples less the track's
158
- * `CodecDelay` and each group's `DiscardPadding`. Otherwise the segment's
159
- * stated `Duration` is used; without one the length is unknown.
160
- */
161
- function matroskaSeconds(bytes) {
162
- const file = matroska(bytes);
163
- if (!file)
164
- return undefined;
165
- const audio = file.tracks.filter((t) => t.type === MKV_AUDIO_TRACK);
166
- const decoded = audio.map((t) => t.opusSamples === undefined ? undefined : t.opusSamples - opusSamplesFromNs(t.codecDelayNs));
167
- if (file.complete && audio.length > 0 && decoded.every((n) => n !== undefined)) {
168
- const samples = Math.max(...decoded);
169
- if (samples > 0)
170
- return positiveSeconds(samples / OPUS_RATE);
171
- }
172
- return file.durationSeconds === undefined ? undefined : positiveSeconds(file.durationSeconds);
173
- }
174
- function mp4Seconds(bytes) {
175
- return mp4Tracks(bytes)?.find((t) => t.handler === MP4_SOUND)?.decodedSeconds;
176
- }
177
- const MPEG_VERSION_1 = 3;
178
- const MPEG_VERSION_2 = 2;
179
- const MPEG_VERSION_25 = 0;
180
- const MPEG_LAYER_1 = 3;
181
- const MPEG_LAYER_2 = 2;
182
- const MPEG_LAYER_3 = 1;
183
- const MPEG_MONO = 3;
184
- const MPEG_RATES = {
185
- [MPEG_VERSION_1]: [44_100, 48_000, 32_000],
186
- [MPEG_VERSION_2]: [22_050, 24_000, 16_000],
187
- [MPEG_VERSION_25]: [11_025, 12_000, 8_000],
188
- };
189
- /** kbit/s by [version 1?][layer][index]. */
190
- const MPEG_BITRATES = {
191
- v1: {
192
- [MPEG_LAYER_1]: [0, 32, 64, 96, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 448],
193
- [MPEG_LAYER_2]: [0, 32, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384],
194
- [MPEG_LAYER_3]: [0, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320],
195
- },
196
- v2: {
197
- [MPEG_LAYER_1]: [0, 32, 48, 56, 64, 80, 96, 112, 128, 144, 160, 176, 192, 224, 256],
198
- [MPEG_LAYER_2]: [0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160],
199
- [MPEG_LAYER_3]: [0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160],
200
- },
201
- };
202
- const MPEG_HEADER = 4;
203
- const LAYER_1_SLOT = 4;
204
- const XING_FRAMES_FLAG = 0x01;
205
- /** Optional Xing fields in order — frames, bytes, TOC, quality — as [flag, width]. */
206
- const XING_FIELDS = [
207
- [0x01, 4],
208
- [0x02, 4],
209
- [0x04, 100],
210
- [0x08, 4],
211
- ];
212
- /** Encoder strings whose info tag carries encoder delay and padding (LAME and ffmpeg). */
213
- const LAME_ENCODERS = ['LAME', 'Lavf', 'Lavc'];
214
- /** 12-bit encoder delay and padding follow the 9-byte version, revision, lowpass, and gain fields. */
215
- const LAME_DELAY_PADDING = 21;
216
- const VBRI_OFFSET = 36;
217
- const VBRI_FRAMES = 14;
218
- /** Side-information length by [version 1?][mono?] — the Xing tag follows it. */
219
- const MPEG_SIDE_INFO = { v1: { mono: 17, stereo: 32 }, v2: { mono: 9, stereo: 17 } };
220
- const ADTS_RATES = [
221
- 96_000, 88_200, 64_000, 48_000, 44_100, 32_000, 24_000, 22_050, 16_000, 12_000, 11_025, 8_000,
222
- 7_350,
223
- ];
224
- const ADTS_HEADER = 7;
225
- const AAC_FRAME_SAMPLES = 1024;
226
- /** Trailing tags that may follow the last frame. */
227
- const TRAILING_TAGS = ['TAG', 'APETAGEX', 'LYRICSBEGIN'];
228
- function mpegFrame(bytes, at) {
229
- if (at + MPEG_HEADER > bytes.length || bytes[at] !== 0xff || (bytes[at + 1] & 0xe0) !== 0xe0) {
230
- return undefined;
231
- }
232
- const version = (bytes[at + 1] >> 3) & 0x03;
233
- const layer = (bytes[at + 1] >> 1) & 0x03;
234
- const bitrateIndex = bytes[at + 2] >> 4;
235
- const rateIndex = (bytes[at + 2] >> 2) & 0x03;
236
- const padding = (bytes[at + 2] >> 1) & 0x01;
237
- const mono = bytes[at + 3] >> 6 === MPEG_MONO;
238
- const rate = MPEG_RATES[version]?.[rateIndex];
239
- const family = version === MPEG_VERSION_1 ? 'v1' : 'v2';
240
- const kbps = MPEG_BITRATES[family][layer]?.[bitrateIndex];
241
- if (!rate || !kbps)
242
- return undefined;
243
- const samples = layer === MPEG_LAYER_1 ? 384 : layer === MPEG_LAYER_3 && family === 'v2' ? 576 : 1152;
244
- const length = layer === MPEG_LAYER_1
245
- ? (Math.floor((12 * kbps * 1000) / rate) + padding) * LAYER_1_SLOT
246
- : Math.floor(((samples / 8) * kbps * 1000) / rate) + padding;
247
- const sideInfo = MPEG_SIDE_INFO[family][mono ? 'mono' : 'stereo'];
248
- return { length, samples, rate, sideInfo };
249
- }
250
- /**
251
- * Audio frame count from a Xing / Info or VBRI tag in the first frame, and the
252
- * encoder delay plus padding a LAME info tag declares (samples a decoder drops).
253
- */
254
- function vbrFrames(bytes, at, frame) {
255
- const v = view(bytes);
256
- const xing = at + MPEG_HEADER + frame.sideInfo;
257
- const tag = xing + 8 <= bytes.length ? ascii(bytes, xing, 4) : '';
258
- if ((tag === 'Xing' || tag === 'Info') && v.getUint32(xing + 4) & XING_FRAMES_FLAG) {
259
- if (xing + 12 > bytes.length)
260
- return undefined;
261
- const flags = v.getUint32(xing + 4);
262
- let lame = xing + 8;
263
- for (const [flag, width] of XING_FIELDS)
264
- if (flags & flag)
265
- lame += width;
266
- return { frames: v.getUint32(xing + 8), trimmed: lameTrimmed(bytes, lame) };
267
- }
268
- const vbri = at + VBRI_OFFSET;
269
- if (vbri + VBRI_FRAMES + 4 <= bytes.length && ascii(bytes, vbri, 4) === 'VBRI') {
270
- return { frames: v.getUint32(vbri + VBRI_FRAMES), trimmed: 0 };
271
- }
272
- return undefined;
273
- }
274
- /** Encoder delay plus padding from a LAME info tag at `at`; 0 when there is none. */
275
- function lameTrimmed(bytes, at) {
276
- const fields = at + LAME_DELAY_PADDING;
277
- if (fields + 3 > bytes.length || !LAME_ENCODERS.includes(ascii(bytes, at, 4)))
278
- return 0;
279
- const delay = (bytes[fields] << 4) | (bytes[fields + 1] >> 4);
280
- const padding = ((bytes[fields + 1] & 0x0f) << 8) | bytes[fields + 2];
281
- return delay + padding;
282
- }
283
- function adtsFrame(bytes, at) {
284
- if (at + ADTS_HEADER > bytes.length || bytes[at] !== 0xff || (bytes[at + 1] & 0xf6) !== 0xf0) {
285
- return undefined;
286
- }
287
- const rate = ADTS_RATES[(bytes[at + 2] >> 2) & 0x0f];
288
- const length = ((bytes[at + 3] & 0x03) << 11) | (bytes[at + 4] << 3) | (bytes[at + 5] >> 5);
289
- const blocks = (bytes[at + 6] & 0x03) + 1;
290
- if (!rate || length < ADTS_HEADER)
291
- return undefined;
292
- return { length, samples: blocks * AAC_FRAME_SAMPLES, rate };
293
- }
294
- function atStreamEnd(bytes, at) {
295
- if (at === bytes.length)
296
- return true;
297
- return TRAILING_TAGS.some((tag) => ascii(bytes, at, tag.length) === tag);
298
- }
299
- /** Walk frames from `start`; `undefined` unless every byte up to a trailing tag is a frame. */
300
- function walkFrames(bytes, start, read) {
301
- let at = start;
302
- let seconds = 0;
303
- while (!atStreamEnd(bytes, at)) {
304
- const frame = read(at);
305
- if (!frame || at + frame.length > bytes.length)
306
- return undefined;
307
- seconds += frame.samples / frame.rate;
308
- at += frame.length;
309
- }
310
- return positiveSeconds(seconds);
311
- }
312
- function mpegAudioSeconds(bytes) {
313
- const start = id3v2End(bytes);
314
- if (adtsFrame(bytes, start))
315
- return walkFrames(bytes, start, (at) => adtsFrame(bytes, at));
316
- const first = mpegFrame(bytes, start);
317
- if (!first)
318
- return undefined;
319
- const tagged = vbrFrames(bytes, start, first);
320
- if (tagged !== undefined) {
321
- const samples = tagged.frames * first.samples;
322
- if (tagged.trimmed >= samples)
323
- return undefined;
324
- return positiveSeconds((samples - tagged.trimmed) / first.rate);
325
- }
326
- return walkFrames(bytes, start, (at) => mpegFrame(bytes, at));
327
- }
328
- /**
329
- * Identified by the bytes, not the declared MIME type. Decoded means what a decoder outputs: declared
330
- * encoder delay and padding are dropped (Opus pre-skip, `CodecDelay`, `DiscardPadding`, LAME, the MP4
331
- * edit list's leading skip); ADTS declares no delay, so its priming samples count. `undefined` when
332
- * the duration cannot be read exactly.
333
- */
334
- export function audioSeconds(bytes) {
335
- return (wavSeconds(bytes) ??
336
- aiffSeconds(bytes) ??
337
- flacSeconds(bytes) ??
338
- oggSeconds(bytes) ??
339
- matroskaSeconds(bytes) ??
340
- mp4Seconds(bytes) ??
341
- mpegAudioSeconds(bytes));
342
- }
@@ -1,6 +0,0 @@
1
- export declare function ascii(bytes: Uint8Array, offset: number, length: number): string;
2
- export declare function view(bytes: Uint8Array): DataView;
3
- /** Unsigned 64-bit read as a JS number; `undefined` above 2^53. */
4
- export declare function uint64(v: DataView, at: number, littleEndian?: boolean): number | undefined;
5
- /** Offset just past a leading ID3v2 tag, or 0 when there is none. */
6
- export declare function id3v2End(bytes: Uint8Array): number;
@@ -1,26 +0,0 @@
1
- const ID3V2_HEADER = 10;
2
- const ID3V2_FOOTER_FLAG = 0x10;
3
- const SYNCSAFE_BITS = 7;
4
- export function ascii(bytes, offset, length) {
5
- return String.fromCharCode(...bytes.subarray(offset, offset + length));
6
- }
7
- export function view(bytes) {
8
- return new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
9
- }
10
- /** Unsigned 64-bit read as a JS number; `undefined` above 2^53. */
11
- export function uint64(v, at, littleEndian = false) {
12
- const high = v.getUint32(littleEndian ? at + 4 : at, littleEndian);
13
- const low = v.getUint32(littleEndian ? at : at + 4, littleEndian);
14
- const n = high * 2 ** 32 + low;
15
- return Number.isSafeInteger(n) ? n : undefined;
16
- }
17
- /** Offset just past a leading ID3v2 tag, or 0 when there is none. */
18
- export function id3v2End(bytes) {
19
- if (bytes.length < ID3V2_HEADER || ascii(bytes, 0, 3) !== 'ID3')
20
- return 0;
21
- let size = 0;
22
- for (let i = 6; i < ID3V2_HEADER; i++)
23
- size = (size << SYNCSAFE_BITS) | (bytes[i] & 0x7f);
24
- const footer = bytes[5] & ID3V2_FOOTER_FLAG ? ID3V2_HEADER : 0;
25
- return ID3V2_HEADER + size + footer;
26
- }
@@ -1,5 +0,0 @@
1
- export interface ImageSize {
2
- width: number;
3
- height: number;
4
- }
5
- export declare function imageSize(bytes: Uint8Array): ImageSize | undefined;
@@ -1,171 +0,0 @@
1
- import { ascii, view } from './bytes.js';
2
- import { boxes, FULL_BOX_HEADER, hasBrand } from './iso-bmff.js';
3
- const PNG_SIGNATURE = [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a];
4
- const PNG_WIDTH_OFFSET = 16;
5
- const PNG_HEIGHT_OFFSET = 20;
6
- const GIF_WIDTH_OFFSET = 6;
7
- const GIF_HEIGHT_OFFSET = 8;
8
- const JPEG_SOI = 0xd8;
9
- const JPEG_MARKER = 0xff;
10
- const JPEG_SOF_FIRST = 0xc0;
11
- const JPEG_SOF_LAST = 0xcf;
12
- /** DHT, JPG extension, DAC — in the SOF range but not frame headers. */
13
- const JPEG_NOT_SOF = new Set([0xc4, 0xc8, 0xcc]);
14
- const JPEG_STANDALONE = new Set([0x01, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7]);
15
- const WEBP_CHUNK_OFFSET = 12;
16
- const WEBP_VP8_SIZE_OFFSET = 26;
17
- const WEBP_VP8L_SIZE_OFFSET = 21;
18
- const WEBP_VP8X_SIZE_OFFSET = 24;
19
- const FOURTEEN_BITS = 0x3fff;
20
- const CHUNK_HEADER = 8;
21
- function positive(size) {
22
- return size.width > 0 && size.height > 0 ? size : undefined;
23
- }
24
- function pngSize(bytes) {
25
- if (bytes.length < PNG_HEIGHT_OFFSET + 4)
26
- return undefined;
27
- if (!PNG_SIGNATURE.every((b, i) => bytes[i] === b))
28
- return undefined;
29
- const v = view(bytes);
30
- return positive({
31
- width: v.getUint32(PNG_WIDTH_OFFSET),
32
- height: v.getUint32(PNG_HEIGHT_OFFSET),
33
- });
34
- }
35
- function gifSize(bytes) {
36
- if (bytes.length < GIF_HEIGHT_OFFSET + 2 || ascii(bytes, 0, 3) !== 'GIF')
37
- return undefined;
38
- const v = view(bytes);
39
- return positive({
40
- width: v.getUint16(GIF_WIDTH_OFFSET, true),
41
- height: v.getUint16(GIF_HEIGHT_OFFSET, true),
42
- });
43
- }
44
- function jpegSize(bytes) {
45
- if (bytes[0] !== JPEG_MARKER || bytes[1] !== JPEG_SOI)
46
- return undefined;
47
- const v = view(bytes);
48
- let at = 2;
49
- while (at + 4 <= bytes.length) {
50
- if (bytes[at] !== JPEG_MARKER)
51
- return undefined;
52
- const marker = bytes[at + 1];
53
- if (marker === JPEG_MARKER) {
54
- at += 1;
55
- continue;
56
- }
57
- if (JPEG_STANDALONE.has(marker)) {
58
- at += 2;
59
- continue;
60
- }
61
- const length = v.getUint16(at + 2);
62
- if (marker >= JPEG_SOF_FIRST && marker <= JPEG_SOF_LAST && !JPEG_NOT_SOF.has(marker)) {
63
- if (at + 9 > bytes.length)
64
- return undefined;
65
- return positive({ height: v.getUint16(at + 5), width: v.getUint16(at + 7) });
66
- }
67
- at += 2 + length;
68
- }
69
- return undefined;
70
- }
71
- function webpSize(bytes) {
72
- if (bytes.length < WEBP_CHUNK_OFFSET + CHUNK_HEADER)
73
- return undefined;
74
- if (ascii(bytes, 0, 4) !== 'RIFF' || ascii(bytes, 8, 4) !== 'WEBP')
75
- return undefined;
76
- const v = view(bytes);
77
- const chunk = ascii(bytes, WEBP_CHUNK_OFFSET, 4);
78
- if (chunk === 'VP8 ' && bytes.length >= WEBP_VP8_SIZE_OFFSET + 4) {
79
- return positive({
80
- width: v.getUint16(WEBP_VP8_SIZE_OFFSET, true) & FOURTEEN_BITS,
81
- height: v.getUint16(WEBP_VP8_SIZE_OFFSET + 2, true) & FOURTEEN_BITS,
82
- });
83
- }
84
- if (chunk === 'VP8L' && bytes.length >= WEBP_VP8L_SIZE_OFFSET + 4) {
85
- const bits = v.getUint32(WEBP_VP8L_SIZE_OFFSET, true);
86
- return positive({
87
- width: (bits & FOURTEEN_BITS) + 1,
88
- height: ((bits >>> 14) & FOURTEEN_BITS) + 1,
89
- });
90
- }
91
- if (chunk === 'VP8X' && bytes.length >= WEBP_VP8X_SIZE_OFFSET + 6) {
92
- const u24 = (at) => bytes[at] | (bytes[at + 1] << 8) | (bytes[at + 2] << 16);
93
- return positive({
94
- width: u24(WEBP_VP8X_SIZE_OFFSET) + 1,
95
- height: u24(WEBP_VP8X_SIZE_OFFSET + 3) + 1,
96
- });
97
- }
98
- return undefined;
99
- }
100
- /** HEIF brands (ISO/IEC 23008-12): image, image sequence, and HEVC variants. */
101
- const HEIF_BRANDS = new Set(['mif1', 'msf1', 'heic', 'heix', 'heim', 'heis', 'hevc', 'hevx']);
102
- const IPMA_WIDE_INDEX = 0x01;
103
- const IPMA_INDEX_MASK_WIDE = 0x7fff;
104
- const IPMA_INDEX_MASK = 0x7f;
105
- /** Property indices (1-based into `ipco`) associated with `itemId` in an `ipma` box. */
106
- function itemProperties(bytes, ipma, itemId) {
107
- const v = view(bytes);
108
- const version = bytes[ipma.start];
109
- const wide = v.getUint32(ipma.start) & IPMA_WIDE_INDEX;
110
- let at = ipma.start + FULL_BOX_HEADER;
111
- if (at + 4 > ipma.end)
112
- return undefined;
113
- const entries = v.getUint32(at);
114
- at += 4;
115
- for (let e = 0; e < entries; e++) {
116
- const idSize = version < 1 ? 2 : 4;
117
- if (at + idSize + 1 > ipma.end)
118
- return undefined;
119
- const id = idSize === 2 ? v.getUint16(at) : v.getUint32(at);
120
- const count = bytes[at + idSize];
121
- at += idSize + 1;
122
- const indexSize = wide ? 2 : 1;
123
- if (at + count * indexSize > ipma.end)
124
- return undefined;
125
- if (id === itemId) {
126
- return Array.from({ length: count }, (_, i) => wide ? v.getUint16(at + i * 2) & IPMA_INDEX_MASK_WIDE : bytes[at + i] & IPMA_INDEX_MASK);
127
- }
128
- at += count * indexSize;
129
- }
130
- return undefined;
131
- }
132
- /**
133
- * HEIF / HEIC size: the `ispe` property of the primary item (`pitm`), which
134
- * for a tiled photo is the grid's full size. `undefined` when the primary item
135
- * also carries a clean-aperture crop (`clap`) — the delivered size differs.
136
- */
137
- function heifSize(bytes) {
138
- if (!hasBrand(bytes, (brand) => HEIF_BRANDS.has(brand)))
139
- return undefined;
140
- const meta = boxes(bytes).list.find((b) => b.type === 'meta');
141
- if (!meta)
142
- return undefined;
143
- const inner = boxes(bytes, meta.start + FULL_BOX_HEADER, meta.end).list;
144
- const pitm = inner.find((b) => b.type === 'pitm');
145
- const iprp = inner.find((b) => b.type === 'iprp');
146
- if (!pitm || !iprp || pitm.start + FULL_BOX_HEADER + 2 > pitm.end)
147
- return undefined;
148
- const v = view(bytes);
149
- const primary = bytes[pitm.start] === 0
150
- ? v.getUint16(pitm.start + FULL_BOX_HEADER)
151
- : v.getUint32(pitm.start + FULL_BOX_HEADER);
152
- const props = boxes(bytes, iprp.start, iprp.end).list;
153
- const ipco = props.find((b) => b.type === 'ipco');
154
- const ipma = props.find((b) => b.type === 'ipma');
155
- if (!ipco || !ipma)
156
- return undefined;
157
- const list = boxes(bytes, ipco.start, ipco.end).list;
158
- const associated = itemProperties(bytes, ipma, primary)?.map((i) => list[i - 1]);
159
- if (!associated || associated.some((b) => b?.type === 'clap'))
160
- return undefined;
161
- const ispe = associated.find((b) => b?.type === 'ispe');
162
- if (!ispe || ispe.start + FULL_BOX_HEADER + 8 > ispe.end)
163
- return undefined;
164
- return positive({
165
- width: v.getUint32(ispe.start + FULL_BOX_HEADER),
166
- height: v.getUint32(ispe.start + FULL_BOX_HEADER + 4),
167
- });
168
- }
169
- export function imageSize(bytes) {
170
- return pngSize(bytes) ?? jpegSize(bytes) ?? gifSize(bytes) ?? webpSize(bytes) ?? heifSize(bytes);
171
- }
@@ -1,19 +0,0 @@
1
- /** Version and flags that open every full box. */
2
- export declare const FULL_BOX_HEADER = 4;
3
- export interface Box {
4
- type: string;
5
- /** First payload byte (past size, type, and any large size). */
6
- start: number;
7
- /** One past the last payload byte. */
8
- end: number;
9
- }
10
- /**
11
- * Boxes laid end to end in `[start, end)`. Stops at the first box whose size
12
- * does not fit; `complete` says whether the walk reached `end` exactly.
13
- */
14
- export declare function boxes(bytes: Uint8Array, start?: number, end?: number): {
15
- list: Box[];
16
- complete: boolean;
17
- };
18
- /** True when the file opens with an `ftyp` box whose major or compatible brands meet `accept`. */
19
- export declare function hasBrand(bytes: Uint8Array, accept: (brand: string) => boolean): boolean;
@@ -1,48 +0,0 @@
1
- import { ascii, uint64, view } from './bytes.js';
2
- const BOX_HEADER = 8;
3
- const LARGE_SIZE = 1;
4
- const TO_END = 0;
5
- /** Major brand and minor version precede the compatible brands. */
6
- const FTYP_COMPATIBLE = 8;
7
- /** Version and flags that open every full box. */
8
- export const FULL_BOX_HEADER = 4;
9
- /**
10
- * Boxes laid end to end in `[start, end)`. Stops at the first box whose size
11
- * does not fit; `complete` says whether the walk reached `end` exactly.
12
- */
13
- export function boxes(bytes, start = 0, end = bytes.length) {
14
- const v = view(bytes);
15
- const list = [];
16
- let at = start;
17
- while (at + BOX_HEADER <= end) {
18
- const size32 = v.getUint32(at);
19
- const type = ascii(bytes, at + 4, 4);
20
- let header = BOX_HEADER;
21
- let size = size32;
22
- if (size32 === LARGE_SIZE) {
23
- if (at + BOX_HEADER * 2 > end)
24
- break;
25
- size = uint64(v, at + BOX_HEADER);
26
- header = BOX_HEADER * 2;
27
- }
28
- else if (size32 === TO_END) {
29
- size = end - at;
30
- }
31
- if (size === undefined || size < header || at + size > end)
32
- break;
33
- list.push({ type, start: at + header, end: at + size });
34
- at += size;
35
- }
36
- return { list, complete: at === end };
37
- }
38
- /** True when the file opens with an `ftyp` box whose major or compatible brands meet `accept`. */
39
- export function hasBrand(bytes, accept) {
40
- const ftyp = boxes(bytes).list[0];
41
- return ftyp?.type === 'ftyp' && brands(bytes, ftyp).some(accept);
42
- }
43
- function brands(bytes, ftyp) {
44
- const list = [ascii(bytes, ftyp.start, 4)];
45
- for (let at = ftyp.start + FTYP_COMPATIBLE; at + 4 <= ftyp.end; at += 4)
46
- list.push(ascii(bytes, at, 4));
47
- return list;
48
- }
@@ -1,35 +0,0 @@
1
- /** Matroska `TrackType` values. */
2
- export declare const MKV_VIDEO_TRACK = 1;
3
- export declare const MKV_AUDIO_TRACK = 2;
4
- export interface MatroskaTrack {
5
- number?: number;
6
- type?: number;
7
- codec?: string;
8
- codecDelayNs: number;
9
- defaultDurationNs?: number;
10
- pixelWidth?: number;
11
- pixelHeight?: number;
12
- /**
13
- * Decoded 48 kHz Opus samples — packet samples less each group's
14
- * `DiscardPadding`, before `CodecDelay`. `undefined` for a track that is not
15
- * Opus or has a block that cannot be read exactly (laced).
16
- */
17
- opusSamples?: number;
18
- /** Latest block timestamp, and the latest before it (ns). */
19
- lastNs?: number;
20
- previousNs?: number;
21
- }
22
- export interface Matroska {
23
- tracks: MatroskaTrack[];
24
- /** `Duration` from the segment info, in seconds. */
25
- durationSeconds?: number;
26
- /** Every element was walked to the end of the file; block sums are whole. */
27
- complete: boolean;
28
- }
29
- /** Nanoseconds as a whole count of 48 kHz Opus samples. */
30
- export declare function opusSamplesFromNs(ns: number): number;
31
- /**
32
- * `undefined` without an EBML header. A truncated or unknown-sized leaf element, or an unreadable
33
- * block header, stops the walk with `complete: false`.
34
- */
35
- export declare function matroska(bytes: Uint8Array): Matroska | undefined;