@theoremjs/agents 0.0.0-stage → 0.3.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 (514) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +1264 -2
  3. package/esm/_dnt.polyfills.d.ts +66 -0
  4. package/esm/_dnt.polyfills.js +51 -0
  5. package/esm/mod.d.ts +65 -0
  6. package/esm/mod.js +42 -0
  7. package/esm/package.json +3 -0
  8. package/esm/src/cli/bin.d.ts +7 -0
  9. package/esm/src/cli/bin.js +9 -0
  10. package/esm/src/cli/commands/bench.d.ts +6 -0
  11. package/esm/src/cli/commands/bench.js +458 -0
  12. package/esm/src/cli/commands/egress-compile.d.ts +17 -0
  13. package/esm/src/cli/commands/egress-compile.js +25 -0
  14. package/esm/src/cli/commands/eval.d.ts +37 -0
  15. package/esm/src/cli/commands/eval.js +190 -0
  16. package/esm/src/cli/commands/fuzz-canary.d.ts +15 -0
  17. package/esm/src/cli/commands/fuzz-canary.js +202 -0
  18. package/esm/src/cli/commands/fuzz-guardrails.d.ts +2 -0
  19. package/esm/src/cli/commands/fuzz-guardrails.js +5 -0
  20. package/esm/src/cli/commands/profile.d.ts +2 -0
  21. package/esm/src/cli/commands/profile.js +80 -0
  22. package/esm/src/cli/commands/run.d.ts +13 -0
  23. package/esm/src/cli/commands/run.js +45 -0
  24. package/esm/src/cli/commands/test.d.ts +25 -0
  25. package/esm/src/cli/commands/test.js +143 -0
  26. package/esm/src/cli/event-log.d.ts +15 -0
  27. package/esm/src/cli/event-log.js +136 -0
  28. package/esm/src/cli/index.d.ts +10 -0
  29. package/esm/src/cli/index.js +267 -0
  30. package/esm/src/cli/matrix/fixtures.d.ts +10 -0
  31. package/esm/src/cli/matrix/fixtures.js +72 -0
  32. package/esm/src/cli/matrix/synthesizer.d.ts +18 -0
  33. package/esm/src/cli/matrix/synthesizer.js +103 -0
  34. package/esm/src/evals/attachments.d.ts +4 -0
  35. package/esm/src/evals/attachments.js +53 -0
  36. package/esm/src/evals/breakdown.d.ts +28 -0
  37. package/esm/src/evals/breakdown.js +68 -0
  38. package/esm/src/evals/graders/answer.d.ts +13 -0
  39. package/esm/src/evals/graders/answer.js +133 -0
  40. package/esm/src/evals/graders/code.d.ts +64 -0
  41. package/esm/src/evals/graders/code.js +205 -0
  42. package/esm/src/evals/graders/judge.d.ts +20 -0
  43. package/esm/src/evals/graders/judge.js +365 -0
  44. package/esm/src/evals/graders/latency.d.ts +5 -0
  45. package/esm/src/evals/graders/latency.js +81 -0
  46. package/esm/src/evals/graders/live.d.ts +11 -0
  47. package/esm/src/evals/graders/live.js +40 -0
  48. package/esm/src/evals/graders/media.d.ts +18 -0
  49. package/esm/src/evals/graders/media.js +92 -0
  50. package/esm/src/evals/graders/shared.d.ts +11 -0
  51. package/esm/src/evals/graders/shared.js +62 -0
  52. package/esm/src/evals/graders/transcript.d.ts +17 -0
  53. package/esm/src/evals/graders/transcript.js +200 -0
  54. package/esm/src/evals/mod.d.ts +42 -0
  55. package/esm/src/evals/mod.js +30 -0
  56. package/esm/src/evals/record.d.ts +35 -0
  57. package/esm/src/evals/record.js +105 -0
  58. package/esm/src/evals/rubrics/catalog.d.ts +148 -0
  59. package/esm/src/evals/rubrics/catalog.js +846 -0
  60. package/esm/src/evals/rubrics/mod.d.ts +24 -0
  61. package/esm/src/evals/rubrics/mod.js +55 -0
  62. package/esm/src/evals/rubrics/mustache.d.ts +23 -0
  63. package/esm/src/evals/rubrics/mustache.js +154 -0
  64. package/esm/src/evals/rubrics/types.d.ts +54 -0
  65. package/esm/src/evals/rubrics/types.js +74 -0
  66. package/esm/src/evals/run.d.ts +118 -0
  67. package/esm/src/evals/run.js +452 -0
  68. package/esm/src/evals/suite.d.ts +19 -0
  69. package/esm/src/evals/suite.js +92 -0
  70. package/esm/src/evals/summary.d.ts +32 -0
  71. package/esm/src/evals/summary.js +30 -0
  72. package/esm/src/evals/trial.d.ts +27 -0
  73. package/esm/src/evals/trial.js +158 -0
  74. package/esm/src/evals/types.d.ts +260 -0
  75. package/esm/src/evals/types.js +126 -0
  76. package/esm/src/evals/verdict.d.ts +18 -0
  77. package/esm/src/evals/verdict.js +45 -0
  78. package/esm/src/guardrails/canary-gate.d.ts +21 -0
  79. package/esm/src/guardrails/canary-gate.js +40 -0
  80. package/esm/src/guardrails/canary.d.ts +112 -0
  81. package/esm/src/guardrails/canary.js +901 -0
  82. package/esm/src/guardrails/compile-egress.d.ts +11 -0
  83. package/esm/src/guardrails/compile-egress.js +11 -0
  84. package/esm/src/guardrails/corpus/canary-egress-attacks.d.ts +22 -0
  85. package/esm/src/guardrails/corpus/canary-egress-attacks.js +303 -0
  86. package/esm/src/guardrails/corpus/fuzz-inbound.d.ts +5 -0
  87. package/esm/src/guardrails/corpus/fuzz-inbound.js +202 -0
  88. package/esm/src/guardrails/corpus/inbound-payloads.d.ts +3 -0
  89. package/esm/src/guardrails/corpus/inbound-payloads.js +118 -0
  90. package/esm/src/guardrails/corpus/live-attacks.d.ts +13 -0
  91. package/esm/src/guardrails/corpus/live-attacks.js +224 -0
  92. package/esm/src/guardrails/corpus/mod.d.ts +7 -0
  93. package/esm/src/guardrails/corpus/mod.js +4 -0
  94. package/esm/src/guardrails/corpus/secrets.d.ts +12 -0
  95. package/esm/src/guardrails/corpus/secrets.js +16 -0
  96. package/esm/src/guardrails/corpus/strings.d.ts +23 -0
  97. package/esm/src/guardrails/corpus/strings.js +29 -0
  98. package/esm/src/guardrails/corpus/types.d.ts +32 -0
  99. package/esm/src/guardrails/corpus/types.js +1 -0
  100. package/esm/src/guardrails/egress-automata.d.ts +14 -0
  101. package/esm/src/guardrails/egress-automata.js +6059 -0
  102. package/esm/src/guardrails/egress-compiler.d.ts +33 -0
  103. package/esm/src/guardrails/egress-compiler.js +237 -0
  104. package/esm/src/guardrails/egress-patterns.d.ts +24 -0
  105. package/esm/src/guardrails/egress-patterns.js +32 -0
  106. package/esm/src/guardrails/egress-policy.d.ts +27 -0
  107. package/esm/src/guardrails/egress-policy.js +76 -0
  108. package/esm/src/guardrails/egress-rules.d.ts +54 -0
  109. package/esm/src/guardrails/egress-rules.js +49 -0
  110. package/esm/src/guardrails/egress-stream.d.ts +105 -0
  111. package/esm/src/guardrails/egress-stream.js +645 -0
  112. package/esm/src/guardrails/egress-urls.d.ts +83 -0
  113. package/esm/src/guardrails/egress-urls.js +917 -0
  114. package/esm/src/guardrails/egress.d.ts +106 -0
  115. package/esm/src/guardrails/egress.js +374 -0
  116. package/esm/src/guardrails/error.d.ts +26 -0
  117. package/esm/src/guardrails/error.js +91 -0
  118. package/esm/src/guardrails/event-schemas.d.ts +57 -0
  119. package/esm/src/guardrails/event-schemas.js +41 -0
  120. package/esm/src/guardrails/events.d.ts +9 -0
  121. package/esm/src/guardrails/events.js +42 -0
  122. package/esm/src/guardrails/hits.d.ts +8 -0
  123. package/esm/src/guardrails/hits.js +19 -0
  124. package/esm/src/guardrails/injection-patterns.d.ts +15 -0
  125. package/esm/src/guardrails/injection-patterns.js +94 -0
  126. package/esm/src/guardrails/injection.d.ts +14 -0
  127. package/esm/src/guardrails/injection.js +237 -0
  128. package/esm/src/guardrails/lexicon.d.ts +30 -0
  129. package/esm/src/guardrails/lexicon.js +478 -0
  130. package/esm/src/guardrails/live-outbound-gate.d.ts +54 -0
  131. package/esm/src/guardrails/live-outbound-gate.js +305 -0
  132. package/esm/src/guardrails/mod.d.ts +46 -0
  133. package/esm/src/guardrails/mod.js +29 -0
  134. package/esm/src/guardrails/network.d.ts +42 -0
  135. package/esm/src/guardrails/network.js +328 -0
  136. package/esm/src/guardrails/normalize.d.ts +6 -0
  137. package/esm/src/guardrails/normalize.js +132 -0
  138. package/esm/src/guardrails/policy.d.ts +19 -0
  139. package/esm/src/guardrails/policy.js +50 -0
  140. package/esm/src/guardrails/progressive-yield.d.ts +69 -0
  141. package/esm/src/guardrails/progressive-yield.js +237 -0
  142. package/esm/src/guardrails/prompt-echo.d.ts +38 -0
  143. package/esm/src/guardrails/prompt-echo.js +225 -0
  144. package/esm/src/guardrails/quota.d.ts +20 -0
  145. package/esm/src/guardrails/quota.js +80 -0
  146. package/esm/src/guardrails/rules.d.ts +56 -0
  147. package/esm/src/guardrails/rules.js +54 -0
  148. package/esm/src/guardrails/sanitize.d.ts +23 -0
  149. package/esm/src/guardrails/sanitize.js +184 -0
  150. package/esm/src/guardrails/sensitive.d.ts +29 -0
  151. package/esm/src/guardrails/sensitive.js +113 -0
  152. package/esm/src/guardrails/serialize.d.ts +14 -0
  153. package/esm/src/guardrails/serialize.js +37 -0
  154. package/esm/src/guardrails/testing.d.ts +9 -0
  155. package/esm/src/guardrails/testing.js +8 -0
  156. package/esm/src/guardrails/theorem-error.d.ts +18 -0
  157. package/esm/src/guardrails/theorem-error.js +53 -0
  158. package/esm/src/guardrails/thought-guard.d.ts +55 -0
  159. package/esm/src/guardrails/thought-guard.js +464 -0
  160. package/esm/src/guardrails/tool-directives.d.ts +19 -0
  161. package/esm/src/guardrails/tool-directives.js +109 -0
  162. package/esm/src/guardrails/tool-result.d.ts +61 -0
  163. package/esm/src/guardrails/tool-result.js +248 -0
  164. package/esm/src/guardrails/types.d.ts +242 -0
  165. package/esm/src/guardrails/types.js +54 -0
  166. package/esm/src/host/client-turn.d.ts +9 -0
  167. package/esm/src/host/client-turn.js +38 -0
  168. package/esm/src/host/mint-trace.d.ts +28 -0
  169. package/esm/src/host/mint-trace.js +59 -0
  170. package/esm/src/host/mod.d.ts +13 -0
  171. package/esm/src/host/mod.js +11 -0
  172. package/esm/src/host/readStreamingJsonStringField.d.ts +2 -0
  173. package/esm/src/host/readStreamingJsonStringField.js +68 -0
  174. package/esm/src/host/reply.d.ts +7 -0
  175. package/esm/src/host/reply.js +35 -0
  176. package/esm/src/interface/blocks.d.ts +8 -0
  177. package/esm/src/interface/blocks.js +213 -0
  178. package/esm/src/interface/composer-actions.d.ts +20 -0
  179. package/esm/src/interface/composer-actions.js +31 -0
  180. package/esm/src/interface/draft.d.ts +14 -0
  181. package/esm/src/interface/draft.js +28 -0
  182. package/esm/src/interface/from-profile.d.ts +12 -0
  183. package/esm/src/interface/from-profile.js +144 -0
  184. package/esm/src/interface/history.d.ts +40 -0
  185. package/esm/src/interface/history.js +269 -0
  186. package/esm/src/interface/inputs.d.ts +10 -0
  187. package/esm/src/interface/inputs.js +64 -0
  188. package/esm/src/interface/mod.d.ts +31 -0
  189. package/esm/src/interface/mod.js +21 -0
  190. package/esm/src/interface/models.d.ts +19 -0
  191. package/esm/src/interface/models.js +45 -0
  192. package/esm/src/interface/pending.d.ts +48 -0
  193. package/esm/src/interface/pending.js +146 -0
  194. package/esm/src/interface/profile-interface.d.ts +4 -0
  195. package/esm/src/interface/profile-interface.js +223 -0
  196. package/esm/src/interface/session.d.ts +64 -0
  197. package/esm/src/interface/session.js +121 -0
  198. package/esm/src/interface/tool-calls.d.ts +20 -0
  199. package/esm/src/interface/tool-calls.js +73 -0
  200. package/esm/src/interface/tool-invoke.d.ts +4 -0
  201. package/esm/src/interface/tool-invoke.js +20 -0
  202. package/esm/src/interface/tool-media.d.ts +9 -0
  203. package/esm/src/interface/tool-media.js +112 -0
  204. package/esm/src/interface/types.d.ts +213 -0
  205. package/esm/src/interface/types.js +4 -0
  206. package/esm/src/kernel/auth/credential-source.d.ts +23 -0
  207. package/esm/src/kernel/auth/credential-source.js +11 -0
  208. package/esm/src/kernel/auth/crypto.d.ts +51 -0
  209. package/esm/src/kernel/auth/crypto.js +161 -0
  210. package/esm/src/kernel/auth/mod.d.ts +5 -0
  211. package/esm/src/kernel/auth/mod.js +5 -0
  212. package/esm/src/kernel/auth/oauth.d.ts +17 -0
  213. package/esm/src/kernel/auth/oauth.js +438 -0
  214. package/esm/src/kernel/auth/scope-refusal.d.ts +9 -0
  215. package/esm/src/kernel/auth/scope-refusal.js +8 -0
  216. package/esm/src/kernel/auth/typed-secret.d.ts +13 -0
  217. package/esm/src/kernel/auth/typed-secret.js +23 -0
  218. package/esm/src/kernel/auth/types.d.ts +139 -0
  219. package/esm/src/kernel/auth/types.js +1 -0
  220. package/esm/src/kernel/default-scope.d.ts +34 -0
  221. package/esm/src/kernel/default-scope.js +72 -0
  222. package/esm/src/kernel/engine/compaction.d.ts +70 -0
  223. package/esm/src/kernel/engine/compaction.js +202 -0
  224. package/esm/src/kernel/engine/decision.d.ts +41 -0
  225. package/esm/src/kernel/engine/decision.js +412 -0
  226. package/esm/src/kernel/engine/hash.d.ts +6 -0
  227. package/esm/src/kernel/engine/hash.js +22 -0
  228. package/esm/src/kernel/engine/live-inbound.d.ts +9 -0
  229. package/esm/src/kernel/engine/live-inbound.js +19 -0
  230. package/esm/src/kernel/engine/live-ingress.d.ts +9 -0
  231. package/esm/src/kernel/engine/live-ingress.js +37 -0
  232. package/esm/src/kernel/engine/media-probe/audio.d.ts +7 -0
  233. package/esm/src/kernel/engine/media-probe/audio.js +342 -0
  234. package/esm/src/kernel/engine/media-probe/bytes.d.ts +6 -0
  235. package/esm/src/kernel/engine/media-probe/bytes.js +26 -0
  236. package/esm/src/kernel/engine/media-probe/image.d.ts +5 -0
  237. package/esm/src/kernel/engine/media-probe/image.js +171 -0
  238. package/esm/src/kernel/engine/media-probe/iso-bmff.d.ts +19 -0
  239. package/esm/src/kernel/engine/media-probe/iso-bmff.js +48 -0
  240. package/esm/src/kernel/engine/media-probe/matroska.d.ts +35 -0
  241. package/esm/src/kernel/engine/media-probe/matroska.js +226 -0
  242. package/esm/src/kernel/engine/media-probe/mp4.d.ts +22 -0
  243. package/esm/src/kernel/engine/media-probe/mp4.js +279 -0
  244. package/esm/src/kernel/engine/media-probe/opus.d.ts +4 -0
  245. package/esm/src/kernel/engine/media-probe/opus.js +23 -0
  246. package/esm/src/kernel/engine/media-probe/pdf.d.ts +5 -0
  247. package/esm/src/kernel/engine/media-probe/pdf.js +117 -0
  248. package/esm/src/kernel/engine/media-probe/video.d.ts +15 -0
  249. package/esm/src/kernel/engine/media-probe/video.js +49 -0
  250. package/esm/src/kernel/engine/record.d.ts +3 -0
  251. package/esm/src/kernel/engine/record.js +11 -0
  252. package/esm/src/kernel/engine/repair.d.ts +7 -0
  253. package/esm/src/kernel/engine/repair.js +36 -0
  254. package/esm/src/kernel/engine/runner/gates.d.ts +5 -0
  255. package/esm/src/kernel/engine/runner/gates.js +322 -0
  256. package/esm/src/kernel/engine/runner/mod.d.ts +15 -0
  257. package/esm/src/kernel/engine/runner/mod.js +574 -0
  258. package/esm/src/kernel/engine/runner/schema-validation.d.ts +14 -0
  259. package/esm/src/kernel/engine/runner/schema-validation.js +105 -0
  260. package/esm/src/kernel/engine/runner/stages.d.ts +28 -0
  261. package/esm/src/kernel/engine/runner/stages.js +48 -0
  262. package/esm/src/kernel/engine/runner/state.d.ts +76 -0
  263. package/esm/src/kernel/engine/runner/state.js +40 -0
  264. package/esm/src/kernel/engine/runner/steps.d.ts +14 -0
  265. package/esm/src/kernel/engine/runner/steps.js +360 -0
  266. package/esm/src/kernel/engine/runner/stream.d.ts +40 -0
  267. package/esm/src/kernel/engine/runner/stream.js +225 -0
  268. package/esm/src/kernel/engine/runner/usage.d.ts +45 -0
  269. package/esm/src/kernel/engine/runner/usage.js +150 -0
  270. package/esm/src/kernel/engine/session/mod.d.ts +31 -0
  271. package/esm/src/kernel/engine/session/mod.js +951 -0
  272. package/esm/src/kernel/engine/session/session-trace.d.ts +115 -0
  273. package/esm/src/kernel/engine/session/session-trace.js +489 -0
  274. package/esm/src/kernel/engine/token-estimate.d.ts +77 -0
  275. package/esm/src/kernel/engine/token-estimate.js +218 -0
  276. package/esm/src/kernel/engine/tool-trace.d.ts +58 -0
  277. package/esm/src/kernel/engine/tool-trace.js +131 -0
  278. package/esm/src/kernel/engine/tree.d.ts +2 -0
  279. package/esm/src/kernel/engine/tree.js +17 -0
  280. package/esm/src/kernel/engine/turn-trace.d.ts +118 -0
  281. package/esm/src/kernel/engine/turn-trace.js +863 -0
  282. package/esm/src/kernel/engine/usage.d.ts +30 -0
  283. package/esm/src/kernel/engine/usage.js +134 -0
  284. package/esm/src/kernel/interaction-parts.d.ts +10 -0
  285. package/esm/src/kernel/interaction-parts.js +22 -0
  286. package/esm/src/kernel/mod.d.ts +47 -0
  287. package/esm/src/kernel/mod.js +30 -0
  288. package/esm/src/kernel/profile-graph.d.ts +140 -0
  289. package/esm/src/kernel/profile-graph.js +151 -0
  290. package/esm/src/kernel/profile-presence.d.ts +9 -0
  291. package/esm/src/kernel/profile-presence.js +143 -0
  292. package/esm/src/kernel/profile-scope.d.ts +36 -0
  293. package/esm/src/kernel/profile-scope.js +262 -0
  294. package/esm/src/kernel/registry/attachments.d.ts +35 -0
  295. package/esm/src/kernel/registry/attachments.js +211 -0
  296. package/esm/src/kernel/registry/catalog.d.ts +19 -0
  297. package/esm/src/kernel/registry/catalog.js +78 -0
  298. package/esm/src/kernel/registry/ingress.d.ts +8 -0
  299. package/esm/src/kernel/registry/ingress.js +134 -0
  300. package/esm/src/kernel/registry/kernel-registry.d.ts +12 -0
  301. package/esm/src/kernel/registry/kernel-registry.js +8 -0
  302. package/esm/src/kernel/registry/profile-outputs.d.ts +3 -0
  303. package/esm/src/kernel/registry/profile-outputs.js +7 -0
  304. package/esm/src/kernel/registry/profiles.d.ts +92 -0
  305. package/esm/src/kernel/registry/profiles.js +698 -0
  306. package/esm/src/kernel/registry/provider-request.d.ts +6 -0
  307. package/esm/src/kernel/registry/provider-request.js +42 -0
  308. package/esm/src/kernel/registry/resolve.d.ts +14 -0
  309. package/esm/src/kernel/registry/resolve.js +237 -0
  310. package/esm/src/kernel/registry/schemas.d.ts +9 -0
  311. package/esm/src/kernel/registry/schemas.js +25 -0
  312. package/esm/src/kernel/registry/sole-model.d.ts +2 -0
  313. package/esm/src/kernel/registry/sole-model.js +4 -0
  314. package/esm/src/kernel/registry/system-prompt.d.ts +8 -0
  315. package/esm/src/kernel/registry/system-prompt.js +33 -0
  316. package/esm/src/kernel/registry/system-role.d.ts +3 -0
  317. package/esm/src/kernel/registry/system-role.js +9 -0
  318. package/esm/src/kernel/registry/vault.d.ts +13 -0
  319. package/esm/src/kernel/registry/vault.js +14 -0
  320. package/esm/src/kernel/schema.d.ts +172 -0
  321. package/esm/src/kernel/schema.js +653 -0
  322. package/esm/src/kernel/scope.d.ts +22 -0
  323. package/esm/src/kernel/scope.js +25 -0
  324. package/esm/src/kernel/stages.d.ts +141 -0
  325. package/esm/src/kernel/stages.js +388 -0
  326. package/esm/src/kernel/stop.d.ts +93 -0
  327. package/esm/src/kernel/stop.js +125 -0
  328. package/esm/src/kernel/system-parts.d.ts +26 -0
  329. package/esm/src/kernel/system-parts.js +98 -0
  330. package/esm/src/kernel/tools/activity-label.d.ts +16 -0
  331. package/esm/src/kernel/tools/activity-label.js +209 -0
  332. package/esm/src/kernel/tools/events.d.ts +51 -0
  333. package/esm/src/kernel/tools/events.js +149 -0
  334. package/esm/src/kernel/tools/execute.d.ts +64 -0
  335. package/esm/src/kernel/tools/execute.js +801 -0
  336. package/esm/src/kernel/tools/gate-answer.d.ts +50 -0
  337. package/esm/src/kernel/tools/gate-answer.js +54 -0
  338. package/esm/src/kernel/tools/harness.d.ts +16 -0
  339. package/esm/src/kernel/tools/harness.js +42 -0
  340. package/esm/src/kernel/tools/invoke.d.ts +10 -0
  341. package/esm/src/kernel/tools/invoke.js +129 -0
  342. package/esm/src/kernel/tools/mcp-sessions.d.ts +20 -0
  343. package/esm/src/kernel/tools/mcp-sessions.js +64 -0
  344. package/esm/src/kernel/tools/mod.d.ts +9 -0
  345. package/esm/src/kernel/tools/mod.js +6 -0
  346. package/esm/src/kernel/tools/model-text.d.ts +11 -0
  347. package/esm/src/kernel/tools/model-text.js +25 -0
  348. package/esm/src/kernel/tools/permission.d.ts +6 -0
  349. package/esm/src/kernel/tools/permission.js +38 -0
  350. package/esm/src/kernel/tools/project.d.ts +8 -0
  351. package/esm/src/kernel/tools/project.js +25 -0
  352. package/esm/src/kernel/tools/registry.d.ts +20 -0
  353. package/esm/src/kernel/tools/registry.js +84 -0
  354. package/esm/src/kernel/tools/remote.d.ts +110 -0
  355. package/esm/src/kernel/tools/remote.js +998 -0
  356. package/esm/src/kernel/tools/resolve.d.ts +28 -0
  357. package/esm/src/kernel/tools/resolve.js +259 -0
  358. package/esm/src/kernel/tools/schema.d.ts +10 -0
  359. package/esm/src/kernel/tools/schema.js +174 -0
  360. package/esm/src/kernel/tools/signed-in-fetch.d.ts +18 -0
  361. package/esm/src/kernel/tools/signed-in-fetch.js +45 -0
  362. package/esm/src/kernel/tools/stage-run.d.ts +93 -0
  363. package/esm/src/kernel/tools/stage-run.js +140 -0
  364. package/esm/src/kernel/tools/types.d.ts +287 -0
  365. package/esm/src/kernel/tools/types.js +1 -0
  366. package/esm/src/kernel/turn-events.d.ts +599 -0
  367. package/esm/src/kernel/turn-events.js +425 -0
  368. package/esm/src/kernel/types.d.ts +884 -0
  369. package/esm/src/kernel/types.js +1 -0
  370. package/esm/src/kernel/util/base64.d.ts +2 -0
  371. package/esm/src/kernel/util/base64.js +13 -0
  372. package/esm/src/kernel/util/exact-type.d.ts +31 -0
  373. package/esm/src/kernel/util/exact-type.js +1 -0
  374. package/esm/src/kernel/util/find-last.d.ts +3 -0
  375. package/esm/src/kernel/util/find-last.js +9 -0
  376. package/esm/src/kernel/util/mime.d.ts +2 -0
  377. package/esm/src/kernel/util/mime.js +4 -0
  378. package/esm/src/kernel/util/record.d.ts +1 -0
  379. package/esm/src/kernel/util/record.js +3 -0
  380. package/esm/src/observability/destinations.d.ts +9 -0
  381. package/esm/src/observability/destinations.js +38 -0
  382. package/esm/src/observability/jsonl.d.ts +18 -0
  383. package/esm/src/observability/jsonl.js +117 -0
  384. package/esm/src/observability/mod.d.ts +22 -0
  385. package/esm/src/observability/mod.js +16 -0
  386. package/esm/src/observability/openinference.d.ts +11 -0
  387. package/esm/src/observability/openinference.js +205 -0
  388. package/esm/src/observability/otlp.d.ts +68 -0
  389. package/esm/src/observability/otlp.js +98 -0
  390. package/esm/src/observability/phoenix.d.ts +29 -0
  391. package/esm/src/observability/phoenix.js +71 -0
  392. package/esm/src/observability/policy.d.ts +14 -0
  393. package/esm/src/observability/policy.js +69 -0
  394. package/esm/src/observability/resolve-policy.d.ts +8 -0
  395. package/esm/src/observability/resolve-policy.js +58 -0
  396. package/esm/src/observability/spans.d.ts +16 -0
  397. package/esm/src/observability/spans.js +56 -0
  398. package/esm/src/observability/trace-catalog.d.ts +111 -0
  399. package/esm/src/observability/trace-catalog.js +865 -0
  400. package/esm/src/observability/trace-record.d.ts +23 -0
  401. package/esm/src/observability/trace-record.js +223 -0
  402. package/esm/src/observability/trace-schema.d.ts +54 -0
  403. package/esm/src/observability/trace-schema.js +59 -0
  404. package/esm/src/observability/trace-sink.d.ts +13 -0
  405. package/esm/src/observability/trace-sink.js +3 -0
  406. package/esm/src/observability/trace-span.d.ts +92 -0
  407. package/esm/src/observability/trace-span.js +199 -0
  408. package/esm/src/observability/trace.d.ts +11 -0
  409. package/esm/src/observability/trace.js +35 -0
  410. package/esm/src/observability/types.d.ts +85 -0
  411. package/esm/src/observability/types.js +3 -0
  412. package/esm/src/presets/google/speech-voices.d.ts +8 -0
  413. package/esm/src/presets/google/speech-voices.js +38 -0
  414. package/esm/src/presets/google-limits.d.ts +12 -0
  415. package/esm/src/presets/google-limits.js +18 -0
  416. package/esm/src/presets/google.d.ts +104 -0
  417. package/esm/src/presets/google.js +188 -0
  418. package/esm/src/presets/mod.d.ts +10 -0
  419. package/esm/src/presets/mod.js +9 -0
  420. package/esm/src/presets/openrouter.d.ts +13 -0
  421. package/esm/src/presets/openrouter.js +13 -0
  422. package/esm/src/presets/typesafe.d.ts +2 -0
  423. package/esm/src/presets/typesafe.js +2 -0
  424. package/esm/src/providers/create-provider.d.ts +21 -0
  425. package/esm/src/providers/create-provider.js +90 -0
  426. package/esm/src/providers/decision/usage.d.ts +3 -0
  427. package/esm/src/providers/decision/usage.js +25 -0
  428. package/esm/src/providers/google/api-error.d.ts +8 -0
  429. package/esm/src/providers/google/api-error.js +123 -0
  430. package/esm/src/providers/google/grounding.d.ts +5 -0
  431. package/esm/src/providers/google/grounding.js +226 -0
  432. package/esm/src/providers/google/interactions/framing.d.ts +15 -0
  433. package/esm/src/providers/google/interactions/framing.js +263 -0
  434. package/esm/src/providers/google/interactions/mod.d.ts +2 -0
  435. package/esm/src/providers/google/interactions/mod.js +2 -0
  436. package/esm/src/providers/google/interactions/steps.d.ts +12 -0
  437. package/esm/src/providers/google/interactions/steps.js +200 -0
  438. package/esm/src/providers/google/interactions/stream.d.ts +24 -0
  439. package/esm/src/providers/google/interactions/stream.js +297 -0
  440. package/esm/src/providers/google/keys.d.ts +20 -0
  441. package/esm/src/providers/google/keys.js +87 -0
  442. package/esm/src/providers/google/live/framing.d.ts +51 -0
  443. package/esm/src/providers/google/live/framing.js +597 -0
  444. package/esm/src/providers/google/live/mod.d.ts +7 -0
  445. package/esm/src/providers/google/live/mod.js +7 -0
  446. package/esm/src/providers/google/live/openapi-schema.d.ts +1 -0
  447. package/esm/src/providers/google/live/openapi-schema.js +42 -0
  448. package/esm/src/providers/google/live/session.d.ts +14 -0
  449. package/esm/src/providers/google/live/session.js +150 -0
  450. package/esm/src/providers/google/live/stream.d.ts +51 -0
  451. package/esm/src/providers/google/live/stream.js +263 -0
  452. package/esm/src/providers/google/thinking.d.ts +3 -0
  453. package/esm/src/providers/google/thinking.js +8 -0
  454. package/esm/src/providers/google/urls.d.ts +6 -0
  455. package/esm/src/providers/google/urls.js +6 -0
  456. package/esm/src/providers/google/usage.d.ts +7 -0
  457. package/esm/src/providers/google/usage.js +49 -0
  458. package/esm/src/providers/local/local.d.ts +12 -0
  459. package/esm/src/providers/local/local.js +186 -0
  460. package/esm/src/providers/local/mod.d.ts +8 -0
  461. package/esm/src/providers/local/mod.js +8 -0
  462. package/esm/src/providers/mod.d.ts +11 -0
  463. package/esm/src/providers/mod.js +7 -0
  464. package/esm/src/providers/openrouter/cache-control.d.ts +5 -0
  465. package/esm/src/providers/openrouter/cache-control.js +4 -0
  466. package/esm/src/providers/openrouter/chat.d.ts +64 -0
  467. package/esm/src/providers/openrouter/chat.js +490 -0
  468. package/esm/src/providers/openrouter/image.d.ts +24 -0
  469. package/esm/src/providers/openrouter/image.js +187 -0
  470. package/esm/src/providers/openrouter/openai/compat.d.ts +19 -0
  471. package/esm/src/providers/openrouter/openai/compat.js +162 -0
  472. package/esm/src/providers/openrouter/openai/image-payload.d.ts +9 -0
  473. package/esm/src/providers/openrouter/openai/image-payload.js +115 -0
  474. package/esm/src/providers/openrouter/openai/sdk-messages.d.ts +10 -0
  475. package/esm/src/providers/openrouter/openai/sdk-messages.js +99 -0
  476. package/esm/src/providers/openrouter/openai/usage.d.ts +8 -0
  477. package/esm/src/providers/openrouter/openai/usage.js +56 -0
  478. package/esm/src/providers/openrouter/resolve-api-key.d.ts +3 -0
  479. package/esm/src/providers/openrouter/resolve-api-key.js +8 -0
  480. package/esm/src/providers/openrouter/speech.d.ts +18 -0
  481. package/esm/src/providers/openrouter/speech.js +109 -0
  482. package/esm/src/providers/probe.d.ts +5 -0
  483. package/esm/src/providers/probe.js +15 -0
  484. package/esm/src/providers/shared/builtin-wire.d.ts +4 -0
  485. package/esm/src/providers/shared/builtin-wire.js +9 -0
  486. package/esm/src/providers/shared/pcm.d.ts +14 -0
  487. package/esm/src/providers/shared/pcm.js +78 -0
  488. package/esm/src/providers/shared/response-identity.d.ts +11 -0
  489. package/esm/src/providers/shared/response-identity.js +12 -0
  490. package/esm/src/providers/shared/sse.d.ts +10 -0
  491. package/esm/src/providers/shared/sse.js +79 -0
  492. package/esm/src/providers/shared/structured-output.d.ts +4 -0
  493. package/esm/src/providers/shared/structured-output.js +11 -0
  494. package/esm/src/providers/shared/tool-args.d.ts +25 -0
  495. package/esm/src/providers/shared/tool-args.js +84 -0
  496. package/esm/src/providers/shared/upstream-tap.d.ts +8 -0
  497. package/esm/src/providers/shared/upstream-tap.js +85 -0
  498. package/esm/src/providers/shared/upstream-tape.d.ts +6 -0
  499. package/esm/src/providers/shared/upstream-tape.js +88 -0
  500. package/esm/src/providers/shared/vault.d.ts +13 -0
  501. package/esm/src/providers/shared/vault.js +41 -0
  502. package/esm/src/providers/types.d.ts +19 -0
  503. package/esm/src/providers/types.js +1 -0
  504. package/esm/src/surface/formats.d.ts +28 -0
  505. package/esm/src/surface/formats.js +139 -0
  506. package/esm/src/surface/mod.d.ts +14 -0
  507. package/esm/src/surface/mod.js +10 -0
  508. package/esm/src/surface/runtime.d.ts +40 -0
  509. package/esm/src/surface/runtime.js +439 -0
  510. package/esm/src/surface/tools.d.ts +15 -0
  511. package/esm/src/surface/tools.js +80 -0
  512. package/esm/src/surface/types.d.ts +104 -0
  513. package/esm/src/surface/types.js +4 -0
  514. package/package.json +108 -4
@@ -0,0 +1,223 @@
1
+ import { z } from 'zod';
2
+ import { LEXICON_KEYS } from '../guardrails/lexicon.js';
3
+ import { CACHE_MODES, CACHE_TTLS, COMPACTION_METERS, COMPACTION_TIMINGS, CONTINUE_STOP_KINDS, KEY_SLOT_NAME, LIVE_ACTIVITY_HANDLINGS, LIVE_END_SENSITIVITIES, LIVE_START_SENSITIVITIES, PROTOCOLS, PROVIDERS, SPEECH_AUDIO_FORMATS, STREAM_MODES, THINKING_LEVELS, } from '../kernel/schema.js';
4
+ import { traceAttributesSchema } from '../observability/trace-schema.js';
5
+ const modelBinding = z.object({
6
+ protocol: z.enum(PROTOCOLS),
7
+ provider: z.enum(PROVIDERS),
8
+ apiId: z.string(),
9
+ efforts: z.record(z.string(), z.enum(THINKING_LEVELS)).optional(),
10
+ defaultEffort: z.string().optional(),
11
+ allowEffortSelect: z.boolean().optional(),
12
+ summaries: z.boolean().optional(),
13
+ maxOutputTokens: z.number().optional(),
14
+ temperature: z.number().optional(),
15
+ builtInTools: z.array(z.string()).optional(),
16
+ key: z.string().regex(KEY_SLOT_NAME).optional(),
17
+ fallbackKey: z.string().regex(KEY_SLOT_NAME).optional(),
18
+ compaction: z
19
+ .object({
20
+ maxTokens: z.number(),
21
+ compactAt: z.number(),
22
+ previousExchanges: z.number(),
23
+ profile: z.string().optional(),
24
+ timing: z.enum(COMPACTION_TIMINGS),
25
+ meter: z.enum(COMPACTION_METERS).optional(),
26
+ })
27
+ .optional(),
28
+ cache: z.object({ mode: z.enum(CACHE_MODES), ttl: z.enum(CACHE_TTLS).optional() }).optional(),
29
+ store: z.boolean().optional(),
30
+ persistViaInteractionId: z.boolean().optional(),
31
+ server: z.string().optional(),
32
+ });
33
+ const outputs = z.object({
34
+ structured: z
35
+ .union([
36
+ z.string(),
37
+ z.object({ by: z.string(), map: z.record(z.string(), z.string()), fallback: z.string() }),
38
+ z.null(),
39
+ ])
40
+ .optional(),
41
+ streaming: z
42
+ .object({ mode: z.enum(STREAM_MODES).optional(), streamThoughts: z.boolean().optional() })
43
+ .optional(),
44
+ });
45
+ const sensitiveGroups = z.object({
46
+ ids: z.boolean(),
47
+ financial: z.boolean(),
48
+ network: z.boolean(),
49
+ credentials: z.boolean(),
50
+ });
51
+ const urlCheck = z.union([
52
+ z.literal(false),
53
+ z.object({ hosts: z.array(z.string()), fromTools: z.boolean() }),
54
+ ]);
55
+ const guardrails = z.object({
56
+ quota: z.object({ perDay: z.number() }).optional(),
57
+ canary: z.boolean(),
58
+ sanitizeInput: z.boolean(),
59
+ redactSensitive: sensitiveGroups,
60
+ hasEgress: z.boolean(),
61
+ egressChecks: z
62
+ .object({
63
+ sensitive: sensitiveGroups,
64
+ boundary: z.boolean(),
65
+ injection: z.boolean(),
66
+ images: urlCheck,
67
+ links: urlCheck,
68
+ })
69
+ .nullable(),
70
+ });
71
+ const observability = z.object({
72
+ record: z.boolean(),
73
+ writeTo: z.union([z.literal(false), z.string()]).optional(),
74
+ sampleRate: z.number(),
75
+ include: z.object({
76
+ upstreamLog: z.boolean(),
77
+ outboundWire: z.boolean(),
78
+ evidenceRaw: z.boolean(),
79
+ usage: z.boolean(),
80
+ guardrailDecisions: z.boolean(),
81
+ guardrailMatchPreview: z.boolean(),
82
+ }),
83
+ scrub: z.object({ sensitive: z.boolean(), injection: z.boolean(), canary: z.boolean() }),
84
+ resource: traceAttributesSchema,
85
+ retainForDays: z.number(),
86
+ rotateAfterMiB: z.number(),
87
+ hasOnWriteError: z.boolean(),
88
+ });
89
+ const inputs = z.object({
90
+ text: z.boolean(),
91
+ attachments: z.object({ accept: z.array(z.string()), acceptAttr: z.string() }).nullable(),
92
+ voice: z.object({ accept: z.array(z.string()) }).nullable(),
93
+ maxFiles: z.number().optional(),
94
+ maxBytes: z.number().optional(),
95
+ maxTurnBytes: z.number().optional(),
96
+ limitsByMime: z.record(z.string(), z.number()).optional(),
97
+ slots: z.record(z.string(), z.array(z.string())).optional(),
98
+ });
99
+ const resumption = z.object({
100
+ allowContinue: z.array(z.enum(CONTINUE_STOP_KINDS)).optional(),
101
+ autoContinue: z.array(z.enum(CONTINUE_STOP_KINDS)).optional(),
102
+ maxContinues: z.number().optional(),
103
+ });
104
+ const mediaTurnBehaviour = z.object({ resumption: resumption.optional() });
105
+ const tools = z.object({ allow: z.array(z.string()), t2Loader: z.string().optional() });
106
+ const common = {
107
+ id: z.string(),
108
+ models: z.record(z.string(), modelBinding),
109
+ defaultModel: z.string(),
110
+ allowModelSelect: z.boolean().optional(),
111
+ maxSteps: z.number().optional(),
112
+ key: z.string().regex(KEY_SLOT_NAME).optional(),
113
+ fallbackKey: z.string().regex(KEY_SLOT_NAME).optional(),
114
+ lexicon: z.partialRecord(z.enum(LEXICON_KEYS), z.string()),
115
+ guardrails: guardrails.optional(),
116
+ observability: observability.optional(),
117
+ };
118
+ const systemPrompt = z.union([
119
+ z.string(),
120
+ z
121
+ .array(z.union([z.string(), z.strictObject({ private: z.string().min(1) })]))
122
+ .min(1)
123
+ .readonly(),
124
+ ]);
125
+ const identity = z.object({
126
+ handle: z.string(),
127
+ system: systemPrompt.optional(),
128
+ systemByRole: z.record(z.string(), systemPrompt).optional(),
129
+ });
130
+ const profileInterface = z.discriminatedUnion('type', [
131
+ z.object({
132
+ ...common,
133
+ type: z.literal('text'),
134
+ identity,
135
+ outputs: outputs.optional(),
136
+ inputs,
137
+ tools,
138
+ turnBehaviour: z
139
+ .object({ resumption: resumption.optional(), allowSteering: z.boolean().optional() })
140
+ .optional(),
141
+ canStop: z.literal(true),
142
+ allowSteering: z.boolean(),
143
+ }),
144
+ z.object({
145
+ ...common,
146
+ type: z.literal('image'),
147
+ identity,
148
+ outputs: outputs.optional(),
149
+ image: z.object({
150
+ aspectRatio: z.string().optional(),
151
+ resolution: z.string().optional(),
152
+ mimeType: z.string().optional(),
153
+ quality: z.string().optional(),
154
+ background: z.string().optional(),
155
+ n: z.number().int().min(1).optional(),
156
+ seed: z.number().int().optional(),
157
+ outputCompression: z.number().int().min(0).max(100).optional(),
158
+ references: z
159
+ .array(z.union([
160
+ z.object({ mimeType: z.string(), data: z.string(), name: z.string().optional() }),
161
+ z.object({ mimeType: z.string(), uri: z.string(), name: z.string().optional() }),
162
+ ]))
163
+ .optional(),
164
+ includeText: z.boolean().optional(),
165
+ }),
166
+ inputs,
167
+ tools,
168
+ turnBehaviour: mediaTurnBehaviour.optional(),
169
+ canStop: z.literal(true),
170
+ }),
171
+ z.object({
172
+ ...common,
173
+ type: z.literal('speech'),
174
+ identity: z.object({ handle: z.string() }),
175
+ outputs: outputs.optional(),
176
+ speech: z.object({
177
+ voice: z.string().optional(),
178
+ format: z.enum(SPEECH_AUDIO_FORMATS).optional(),
179
+ }),
180
+ inputs,
181
+ turnBehaviour: mediaTurnBehaviour.optional(),
182
+ canStop: z.literal(true),
183
+ }),
184
+ z.object({
185
+ ...common,
186
+ type: z.literal('live'),
187
+ identity,
188
+ live: z.object({
189
+ ingress: z
190
+ .object({
191
+ audio: z.boolean().optional(),
192
+ video: z.boolean().optional(),
193
+ text: z.boolean().optional(),
194
+ })
195
+ .optional(),
196
+ voice: z.string().optional(),
197
+ vad: z
198
+ .object({
199
+ activityHandling: z.enum(LIVE_ACTIVITY_HANDLINGS).optional(),
200
+ startSensitivity: z.enum(LIVE_START_SENSITIVITIES).optional(),
201
+ endSensitivity: z.enum(LIVE_END_SENSITIVITIES).optional(),
202
+ prefixPaddingMs: z.number().optional(),
203
+ silenceDurationMs: z.number().optional(),
204
+ })
205
+ .optional(),
206
+ sessionResumption: z.boolean().optional(),
207
+ contextCompression: z
208
+ .object({
209
+ triggerTokens: z.number().optional(),
210
+ slidingWindow: z.object({ targetTokens: z.number().optional() }),
211
+ })
212
+ .optional(),
213
+ transcription: z
214
+ .object({ input: z.boolean().optional(), output: z.boolean().optional() })
215
+ .optional(),
216
+ }),
217
+ tools: z.object({ allow: z.array(z.string()) }),
218
+ turnBehaviour: z.object({ allowSteering: z.boolean().optional() }).optional(),
219
+ }),
220
+ ]);
221
+ true;
222
+ /** `ProfileInterface`, checked: unnamed fields are dropped, a malformed one fails. */
223
+ export const profileInterfaceSchema = profileInterface;
@@ -0,0 +1,64 @@
1
+ import type { ToolGateAuth } from '../kernel/tools/gate-answer.js';
2
+ import type { ToolGate, TurnToolSnapshot } from '../kernel/tools/types.js';
3
+ import type { ModelId, ToolId, TurnEvent, TurnHistoryMessage } from '../kernel/types.js';
4
+ import type { TranscriptBlock, UserTurnDraft } from './types.js';
5
+ export type { ToolGateAuth };
6
+ export type GatedToolContext = {
7
+ name: string;
8
+ callId: string;
9
+ arguments: Record<string, unknown>;
10
+ /** The call's `ToolCallRequest.thoughtSignature`, for recording the call in history. */
11
+ thoughtSignature?: string;
12
+ gateKind: ToolGate['kind'];
13
+ permission?: ToolGate['permission'];
14
+ summary?: string;
15
+ /** Set on a sign-in gate. */
16
+ auth?: ToolGateAuth;
17
+ };
18
+ export type AwaitingToolContext = {
19
+ name: string;
20
+ callId: string;
21
+ arguments: Record<string, unknown>;
22
+ kind: string;
23
+ prompt: string;
24
+ options?: string[];
25
+ };
26
+ export type InterfaceTurnSession = {
27
+ history: TurnHistoryMessage[];
28
+ /** Google Interactions id for server-side continuity; cleared on branch. */
29
+ previousInteractionId?: string;
30
+ sessionPermissions: string[];
31
+ /** Last turn `tokens.input` for compaction meter `timing: 'before'`. */
32
+ inputTokens?: number;
33
+ /** Host override for compaction meter `history`. */
34
+ historyTokens?: number;
35
+ /** Active pre_tool gate awaiting host resume. */
36
+ gatedTool: GatedToolContext | null;
37
+ /** Completed ask_user (or similar) awaiting host UI — turn may already be done. */
38
+ awaitingTool: AwaitingToolContext | null;
39
+ /** Kernel events for the assistant segment still in flight (gate / resume / continue). */
40
+ assistantEvents: TurnEvent[];
41
+ /** User draft for the turn that produced `assistantEvents`. */
42
+ pendingUserDraft: UserTurnDraft | null;
43
+ /** Snapshot from the last gate `done` event — pass to `invokeTool({ snapshot })`. */
44
+ toolSnapshot?: TurnToolSnapshot;
45
+ /** T2 tool ids promoted during the current assistant segment (loader `loaded` outputs). */
46
+ promotedToolIds: ToolId[];
47
+ /** User-selected model id when `allowModelSelect` is enabled on the profile. */
48
+ selectedModel?: ModelId;
49
+ /** Selected effort alias when the active model has `allowEffortSelect`. */
50
+ selectedEffort?: string;
51
+ };
52
+ declare function emptyInterfaceTurnSession(): InterfaceTurnSession;
53
+ /**
54
+ * Every call still waiting on its gate, in the order the model made them. One
55
+ * step can leave several: a gate holds only its own call.
56
+ */
57
+ declare function gatedToolsFromEvents(events: readonly TurnEvent[]): GatedToolContext[];
58
+ /** The gate the user answers next: the first call still waiting. */
59
+ declare function gatedToolFromEvents(events: readonly TurnEvent[]): GatedToolContext | null;
60
+ declare function awaitingFromEvents(events: readonly TurnEvent[]): AwaitingToolContext | null;
61
+ declare function applyTurnEventsToSession(session: InterfaceTurnSession, events: readonly TurnEvent[]): InterfaceTurnSession;
62
+ /** Drops `previousInteractionId` so the next turn sends the rebuilt history, not a stale handle. */
63
+ declare function branchInterfaceTurnSession(session: InterfaceTurnSession, blocks: readonly TranscriptBlock[]): InterfaceTurnSession;
64
+ export { applyTurnEventsToSession, awaitingFromEvents, branchInterfaceTurnSession, emptyInterfaceTurnSession, gatedToolFromEvents, gatedToolsFromEvents, };
@@ -0,0 +1,121 @@
1
+ import { isAwaitingUserInput } from '../kernel/stages.js';
2
+ import { findLast } from '../kernel/util/find-last.js';
3
+ import { historyFromTranscriptBlocks } from './history.js';
4
+ import { toolCallsOf } from './tool-calls.js';
5
+ import { promotedToolIdsFromEvents, toolSnapshotFromEvents } from './tool-invoke.js';
6
+ function emptyInterfaceTurnSession() {
7
+ return {
8
+ history: [],
9
+ sessionPermissions: [],
10
+ gatedTool: null,
11
+ awaitingTool: null,
12
+ assistantEvents: [],
13
+ pendingUserDraft: null,
14
+ promotedToolIds: [],
15
+ };
16
+ }
17
+ /**
18
+ * Every call still waiting on its gate, in the order the model made them. One
19
+ * step can leave several: a gate holds only its own call.
20
+ */
21
+ function gatedToolsFromEvents(events) {
22
+ const paused = events.some((event) => event.type === 'done' && (event.stop.kind === 'gate' || event.stop.kind === 'tool'));
23
+ if (!paused)
24
+ return [];
25
+ return toolCallsOf(events).flatMap((call) => {
26
+ if (call.state?.phase !== 'gate')
27
+ return [];
28
+ const { gate } = call.state;
29
+ return [
30
+ {
31
+ name: call.name,
32
+ callId: call.callId,
33
+ arguments: call.arguments,
34
+ ...(call.thoughtSignature ? { thoughtSignature: call.thoughtSignature } : {}),
35
+ gateKind: gate.kind,
36
+ permission: gate.permission,
37
+ summary: gate.summary,
38
+ ...(gate.kind === 'auth'
39
+ ? {
40
+ auth: {
41
+ slot: gate.authChallenge.slot,
42
+ authType: gate.authChallenge.authType,
43
+ service: gate.authChallenge.service,
44
+ },
45
+ }
46
+ : {}),
47
+ },
48
+ ];
49
+ });
50
+ }
51
+ /** The gate the user answers next: the first call still waiting. */
52
+ function gatedToolFromEvents(events) {
53
+ return gatedToolsFromEvents(events)[0] ?? null;
54
+ }
55
+ function awaitingFromEvents(events) {
56
+ const call = findLast(toolCallsOf(events), (c) => c.state?.phase === 'complete');
57
+ if (call?.state?.phase !== 'complete')
58
+ return null;
59
+ const { output } = call.state;
60
+ if (!isAwaitingUserInput(output))
61
+ return null;
62
+ return {
63
+ name: call.name,
64
+ callId: call.callId,
65
+ arguments: call.arguments,
66
+ kind: output.kind,
67
+ prompt: output.prompt,
68
+ options: output.options,
69
+ };
70
+ }
71
+ function applyTurnEventsToSession(session, events) {
72
+ let previousInteractionId = session.previousInteractionId;
73
+ let inputTokens = session.inputTokens;
74
+ let historyTokens = session.historyTokens;
75
+ let toolSnapshot = session.toolSnapshot;
76
+ let promotedToolIds = session.promotedToolIds;
77
+ for (const event of events) {
78
+ if ((event.type === 'tokens' || event.type === 'done') && event.interactionId) {
79
+ previousInteractionId = event.interactionId;
80
+ }
81
+ // A call's own input size, not the turn's sum (`done.tokens`).
82
+ if (event.type === 'tokens' && event.tokens.input) {
83
+ inputTokens = event.tokens.input;
84
+ }
85
+ if (event.type === 'done' && event.compaction?.tokens !== undefined) {
86
+ historyTokens = event.compaction.tokens;
87
+ }
88
+ }
89
+ const snapshotFromDone = toolSnapshotFromEvents(events);
90
+ if (snapshotFromDone) {
91
+ toolSnapshot = snapshotFromDone;
92
+ }
93
+ const newPromoted = promotedToolIdsFromEvents(events);
94
+ if (newPromoted.length > 0) {
95
+ promotedToolIds = [...new Set([...promotedToolIds, ...newPromoted])];
96
+ }
97
+ const gated = gatedToolFromEvents(events);
98
+ return {
99
+ ...session,
100
+ previousInteractionId,
101
+ inputTokens,
102
+ historyTokens,
103
+ gatedTool: gated,
104
+ awaitingTool: awaitingFromEvents(events),
105
+ toolSnapshot,
106
+ promotedToolIds,
107
+ };
108
+ }
109
+ /** Drops `previousInteractionId` so the next turn sends the rebuilt history, not a stale handle. */
110
+ function branchInterfaceTurnSession(session, blocks) {
111
+ return {
112
+ ...emptyInterfaceTurnSession(),
113
+ history: historyFromTranscriptBlocks(blocks),
114
+ sessionPermissions: [...session.sessionPermissions],
115
+ inputTokens: session.inputTokens,
116
+ historyTokens: session.historyTokens,
117
+ selectedModel: session.selectedModel,
118
+ selectedEffort: session.selectedEffort,
119
+ };
120
+ }
121
+ export { applyTurnEventsToSession, awaitingFromEvents, branchInterfaceTurnSession, emptyInterfaceTurnSession, gatedToolFromEvents, gatedToolsFromEvents, };
@@ -0,0 +1,20 @@
1
+ import type { ToolCallEvent, TurnEvent, TurnEventOf } from '../kernel/types.js';
2
+ import type { ToolCall } from './types.js';
3
+ /**
4
+ * The raw call comes first for every call (`turnEventSchema`); a phase for a call never made is a
5
+ * broken stream.
6
+ */
7
+ declare function applyToolEvent(call: ToolCall | undefined, tool: ToolCallEvent): ToolCall;
8
+ /** Every call in `events`, in the order the model made them. */
9
+ declare function toolCallsOf(events: readonly TurnEvent[]): ToolCall[];
10
+ /** The arguments a call ran with: the user's edit, else the model's. */
11
+ declare function toolCallRanWith(call: ToolCall): Record<string, unknown>;
12
+ /** A tool event that settles its call: the call completed or failed. */
13
+ type SettledToolCallEvent = TurnEventOf<'tool'> & {
14
+ tool: Extract<ToolCallEvent, {
15
+ phase: 'complete' | 'error';
16
+ }>;
17
+ };
18
+ declare function settlesToolCall(event: TurnEvent, callId: string): event is SettledToolCallEvent;
19
+ export type { SettledToolCallEvent };
20
+ export { applyToolEvent, settlesToolCall, toolCallRanWith, toolCallsOf };
@@ -0,0 +1,73 @@
1
+ // The model's raw call is the one owner of a call's arguments. The transcript, the interface
2
+ // session and history read calls through this fold only.
3
+ import { TheoremError } from '../guardrails/error.js';
4
+ /**
5
+ * The raw call comes first for every call (`turnEventSchema`); a phase for a call never made is a
6
+ * broken stream.
7
+ */
8
+ function applyToolEvent(call, tool) {
9
+ if (tool.phase === undefined) {
10
+ return {
11
+ name: tool.name,
12
+ callId: tool.callId,
13
+ arguments: tool.arguments,
14
+ ...(tool.thoughtSignature ? { thoughtSignature: tool.thoughtSignature } : {}),
15
+ ...(tool.stepId ? { stepId: tool.stepId } : {}),
16
+ artifacts: [],
17
+ };
18
+ }
19
+ if (call === undefined) {
20
+ throw new TheoremError('bad_response', `Tool event '${tool.phase}' for call '${tool.callId}' arrived before the call.`);
21
+ }
22
+ switch (tool.phase) {
23
+ case 'running': {
24
+ // A resumed call runs again: it is open until its next settle.
25
+ const { endedAt: _settled, ...open } = call;
26
+ return {
27
+ ...open,
28
+ state: tool,
29
+ startedAt: tool.at,
30
+ ...(tool.edited ? { edited: tool.edited } : {}),
31
+ ...(tool.activity ? { activity: tool.activity } : {}),
32
+ };
33
+ }
34
+ case 'complete':
35
+ return {
36
+ ...call,
37
+ state: tool,
38
+ endedAt: tool.at,
39
+ ...(tool.activityPast ? { activityPast: tool.activityPast } : {}),
40
+ };
41
+ case 'error':
42
+ case 'cancel':
43
+ case 'gate':
44
+ return { ...call, state: tool, endedAt: tool.at };
45
+ case 'artifact':
46
+ return { ...call, artifacts: [...call.artifacts, tool.artifact] };
47
+ case 'progress':
48
+ case 'trace':
49
+ case 'warning':
50
+ return call;
51
+ }
52
+ }
53
+ /** Every call in `events`, in the order the model made them. */
54
+ function toolCallsOf(events) {
55
+ const calls = new Map();
56
+ for (const event of events) {
57
+ if (event.type !== 'tool')
58
+ continue;
59
+ const { tool } = event;
60
+ calls.set(tool.callId, applyToolEvent(calls.get(tool.callId), tool));
61
+ }
62
+ return [...calls.values()];
63
+ }
64
+ /** The arguments a call ran with: the user's edit, else the model's. */
65
+ function toolCallRanWith(call) {
66
+ return call.edited?.to ?? call.arguments;
67
+ }
68
+ function settlesToolCall(event, callId) {
69
+ if (event.type !== 'tool' || event.tool.callId !== callId)
70
+ return false;
71
+ return event.tool.phase === 'complete' || event.tool.phase === 'error';
72
+ }
73
+ export { applyToolEvent, settlesToolCall, toolCallRanWith, toolCallsOf };
@@ -0,0 +1,4 @@
1
+ import type { ToolId, TurnEvent, TurnToolSnapshot } from '../kernel/types.js';
2
+ declare function promotedToolIdsFromEvents(events: readonly TurnEvent[]): ToolId[];
3
+ declare function toolSnapshotFromEvents(events: readonly TurnEvent[]): TurnToolSnapshot | undefined;
4
+ export { promotedToolIdsFromEvents, toolSnapshotFromEvents };
@@ -0,0 +1,20 @@
1
+ import { extractLoadedIds } from '../kernel/tools/resolve.js';
2
+ import { findLast } from '../kernel/util/find-last.js';
3
+ function promotedToolIdsFromEvents(events) {
4
+ const ids = new Set();
5
+ for (const event of events) {
6
+ if (event.type !== 'tool' || event.tool.phase !== 'complete') {
7
+ continue;
8
+ }
9
+ for (const id of extractLoadedIds(event.tool.output) ?? []) {
10
+ ids.add(id);
11
+ }
12
+ }
13
+ return [...ids];
14
+ }
15
+ function toolSnapshotFromEvents(events) {
16
+ // Only a `done` that stopped on `tool` or `gate` carries one (`DoneEvent`).
17
+ const done = findLast(events, (event) => event.type === 'done' && event.tools !== undefined);
18
+ return done?.type === 'done' ? done.tools : undefined;
19
+ }
20
+ export { promotedToolIdsFromEvents, toolSnapshotFromEvents };
@@ -0,0 +1,9 @@
1
+ export type PromotedToolMedia = {
2
+ url: string;
3
+ mimeType: string;
4
+ /** A smaller copy of the same file, when the output also carried one. */
5
+ previewUrl?: string;
6
+ };
7
+ export declare function promotedMediaFromUrlString(raw: string): PromotedToolMedia | undefined;
8
+ /** One file at several sizes is promoted once: `url` its largest copy, `previewUrl` its smallest. */
9
+ export declare function collectPromotedMediaFromToolOutput(output: unknown): PromotedToolMedia[];
@@ -0,0 +1,112 @@
1
+ const EXT_MIME = {
2
+ avif: 'image/avif',
3
+ gif: 'image/gif',
4
+ heic: 'image/heic',
5
+ heif: 'image/heif',
6
+ jpeg: 'image/jpeg',
7
+ jpg: 'image/jpeg',
8
+ png: 'image/png',
9
+ svg: 'image/svg+xml',
10
+ webp: 'image/webp',
11
+ mp4: 'video/mp4',
12
+ webm: 'video/webm',
13
+ mov: 'video/quicktime',
14
+ ogv: 'video/ogg',
15
+ mp3: 'audio/mpeg',
16
+ m4a: 'audio/mp4',
17
+ ogg: 'audio/ogg',
18
+ wav: 'audio/wav',
19
+ };
20
+ function mimeForPathname(pathname) {
21
+ const base = pathname.split('/').pop() ?? pathname;
22
+ const dot = base.lastIndexOf('.');
23
+ if (dot <= 0 || dot === base.length - 1)
24
+ return undefined;
25
+ const ext = base.slice(dot + 1).toLowerCase();
26
+ return EXT_MIME[ext];
27
+ }
28
+ export function promotedMediaFromUrlString(raw) {
29
+ const trimmed = raw.trim();
30
+ if (trimmed.length === 0)
31
+ return undefined;
32
+ let parsed;
33
+ try {
34
+ parsed = new URL(trimmed);
35
+ }
36
+ catch {
37
+ return undefined;
38
+ }
39
+ if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:')
40
+ return undefined;
41
+ const mimeType = mimeForPathname(parsed.pathname);
42
+ if (!mimeType)
43
+ return undefined;
44
+ return { url: parsed.href, mimeType };
45
+ }
46
+ /** MediaWiki resizes: `…/thumb/<a>/<ab>/<File>/<N>px-<File>` is `<N>` wide; the original is `…/<a>/<ab>/<File>`. */
47
+ const MEDIAWIKI_THUMB = /^(.*)\/thumb(\/.+\/([^/]+))\/(\d+)px-\3(?:\.[a-z0-9]+)?$/i;
48
+ /**
49
+ * The underlying file, so one picture at several sizes counts once (Wikipedia
50
+ * summaries carry `thumbnail` and `originalimage`, sometimes on different
51
+ * wikimedia.org hosts). `width` ranks copies; the original ranks highest.
52
+ */
53
+ function mediaAsset(url) {
54
+ const parsed = new URL(url);
55
+ const site = parsed.hostname.split('.').slice(-2).join('.');
56
+ // Tracking parameters never change the file; other query parameters may.
57
+ for (const name of [...parsed.searchParams.keys()]) {
58
+ if (name.startsWith('utm_'))
59
+ parsed.searchParams.delete(name);
60
+ }
61
+ const thumb = MEDIAWIKI_THUMB.exec(parsed.pathname);
62
+ const pathname = thumb ? `${thumb[1]}${thumb[2]}` : parsed.pathname;
63
+ return {
64
+ key: `${site}${pathname}${parsed.search}`,
65
+ width: thumb ? Number(thumb[4]) : Number.POSITIVE_INFINITY,
66
+ };
67
+ }
68
+ /** One file at several sizes is promoted once: `url` its largest copy, `previewUrl` its smallest. */
69
+ export function collectPromotedMediaFromToolOutput(output) {
70
+ const seen = new Map();
71
+ const out = [];
72
+ const visit = (value) => {
73
+ if (typeof value === 'string') {
74
+ const media = promotedMediaFromUrlString(value);
75
+ if (!media)
76
+ return;
77
+ const asset = mediaAsset(media.url);
78
+ const prior = seen.get(asset.key);
79
+ if (!prior) {
80
+ seen.set(asset.key, { index: out.length, largest: asset.width, smallest: asset.width });
81
+ out.push(media);
82
+ return;
83
+ }
84
+ const current = out[prior.index];
85
+ if (asset.width > prior.largest) {
86
+ prior.largest = asset.width;
87
+ out[prior.index] = {
88
+ ...current,
89
+ url: media.url,
90
+ previewUrl: current.previewUrl ?? current.url,
91
+ };
92
+ }
93
+ else if (asset.width < prior.smallest) {
94
+ prior.smallest = asset.width;
95
+ out[prior.index] = { ...current, previewUrl: media.url };
96
+ }
97
+ return;
98
+ }
99
+ if (Array.isArray(value)) {
100
+ for (const item of value)
101
+ visit(item);
102
+ return;
103
+ }
104
+ if (value !== null && typeof value === 'object') {
105
+ for (const nested of Object.values(value)) {
106
+ visit(nested);
107
+ }
108
+ }
109
+ };
110
+ visit(output);
111
+ return out;
112
+ }