@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,23 @@
1
+ import { type TraceRecord } from './trace-schema.js';
2
+ import { type TraceAttributeValue, type TraceSpan } from './trace-span.js';
3
+ import type { ResolvedObservabilityPolicy } from './types.js';
4
+ /** Pinned OpenTelemetry GenAI semantic conventions the attribute names follow. */
5
+ declare const TRACE_SCHEMA_URL = "https://github.com/open-telemetry/semantic-conventions-genai/tree/8ffdf56";
6
+ /** `spans` is `TraceTree.collect()` output, root first. The root gains the policy it ran under. */
7
+ declare function buildRecord(args: {
8
+ spans: TraceSpan[];
9
+ policy: ResolvedObservabilityPolicy;
10
+ /** Every canary bound in this record, the turn's and any nested turn's. */
11
+ canaries?: readonly string[];
12
+ metadata?: Record<string, unknown>;
13
+ }): Promise<TraceRecord>;
14
+ /** `undefined` for a non-reference, and for a blob, whose bytes were never stored. */
15
+ declare function contentOf(record: TraceRecord, value: TraceAttributeValue | undefined): string | undefined;
16
+ /**
17
+ * Replaces every stored reference by what it names. `{ content_sha256 }` beside other keys (a
18
+ * message part) becomes `content`; `{ json_sha256 }` beside other keys is merged under them. A
19
+ * reference whose hash is not in `content` (a blob's bytes) is kept as is.
20
+ */
21
+ declare function inlineContent(record: TraceRecord, value: unknown): unknown;
22
+ export type { TraceRecord };
23
+ export { buildRecord, contentOf, inlineContent, TRACE_SCHEMA_URL };
@@ -0,0 +1,223 @@
1
+ // Include flags drop whole attribute families or events here, in one place, so a missing field
2
+ // reads as "not recorded" and the root says which policy applied (`theorem.record.include`).
3
+ import { redactSensitiveOnly, sanitizeText } from '../guardrails/sanitize.js';
4
+ import { sha256, sha256Base64 } from '../kernel/engine/hash.js';
5
+ import { removeCanaries, tapeUpstream } from '../providers/shared/upstream-tape.js';
6
+ import { TRACE_VERSION } from './trace-schema.js';
7
+ import { isTraceBytes, isTraceContent, isTraceJson, } from './trace-span.js';
8
+ /** Pinned OpenTelemetry GenAI semantic conventions the attribute names follow. */
9
+ const TRACE_SCHEMA_URL = 'https://github.com/open-telemetry/semantic-conventions-genai/tree/8ffdf56';
10
+ const TEXT_REF = 'content_sha256';
11
+ const JSON_REF = 'json_sha256';
12
+ const USAGE_PREFIXES = ['gen_ai.usage.', 'theorem.usage.'];
13
+ const EVENT_INCLUDE = {
14
+ 'theorem.upstream.row': 'upstreamLog',
15
+ 'theorem.wire.request': 'outboundWire',
16
+ 'theorem.guardrail': 'guardrailDecisions',
17
+ };
18
+ /** Grounding events keep normalized sources; the provider's raw payload needs `evidenceRaw`. */
19
+ const RAW_ATTRIBUTE = 'raw';
20
+ /** Guardrail hits keep the matched text only under `guardrailMatchPreview`. */
21
+ const MATCH_ATTRIBUTE = 'match';
22
+ function scrubStoredText(text, scrub) {
23
+ if (scrub.sensitive && scrub.injection) {
24
+ return sanitizeText(text);
25
+ }
26
+ if (scrub.sensitive) {
27
+ return redactSensitiveOnly(text);
28
+ }
29
+ if (scrub.injection) {
30
+ return sanitizeText(text, { sanitizeInput: true, redactSensitive: false });
31
+ }
32
+ return text;
33
+ }
34
+ async function storeText(text, resolver) {
35
+ const hash = await sha256(text);
36
+ resolver.content[hash] = text;
37
+ resolver.known.set(text, hash);
38
+ return hash;
39
+ }
40
+ function markerRest(value, key) {
41
+ const { [key]: _marker, ...rest } = value;
42
+ return rest;
43
+ }
44
+ /** Pass 1: text and bytes. `$json` waits for pass 2, when every text is known. */
45
+ async function resolveContent(value, resolver) {
46
+ if (isTraceContent(value)) {
47
+ const text = removeCanaries(scrubStoredText(value.$content, resolver.scrub), resolver.canaries);
48
+ return { ...markerRest(value, '$content'), [TEXT_REF]: await storeText(text, resolver) };
49
+ }
50
+ if (isTraceBytes(value)) {
51
+ const rest = markerRest(value, '$bytes');
52
+ const digest = await sha256Base64(value.$bytes);
53
+ // Not base64: hash the text as given and say so, rather than lose the record.
54
+ return digest
55
+ ? { ...rest, content_sha256: digest.hash, bytes: digest.bytes }
56
+ : { ...rest, invalid_base64: true, text_sha256: await sha256(value.$bytes) };
57
+ }
58
+ if (isTraceJson(value)) {
59
+ return value;
60
+ }
61
+ return await mapNested(value, (nested) => resolveContent(nested, resolver));
62
+ }
63
+ function mapStrings(value, rewrite) {
64
+ if (typeof value === 'string') {
65
+ return rewrite(value);
66
+ }
67
+ if (Array.isArray(value)) {
68
+ return value.map((item) => mapStrings(item, rewrite));
69
+ }
70
+ if (value && typeof value === 'object') {
71
+ return Object.fromEntries(Object.entries(value).map(([key, nested]) => [key, mapStrings(nested, rewrite)]));
72
+ }
73
+ return value;
74
+ }
75
+ /** Scrub a row's strings, then reference any string pass 1 already stored. */
76
+ function internRow(row, resolver) {
77
+ return mapStrings(row, (text) => {
78
+ const scrubbed = scrubStoredText(text, resolver.scrub);
79
+ const hash = resolver.known.get(scrubbed);
80
+ return hash ? { [TEXT_REF]: hash } : scrubbed;
81
+ });
82
+ }
83
+ /** Pass 2: rows and bodies, interned against every text pass 1 stored. */
84
+ async function resolveJson(value, resolver) {
85
+ if (isTraceJson(value)) {
86
+ const taped = await tapeUpstream(value.$json, resolver.canaries);
87
+ const text = JSON.stringify(internRow(taped, resolver));
88
+ const hash = await sha256(text);
89
+ resolver.content[hash] = text;
90
+ return { ...markerRest(value, '$json'), [JSON_REF]: hash };
91
+ }
92
+ return await mapNested(value, (nested) => resolveJson(nested, resolver));
93
+ }
94
+ async function mapNested(value, map) {
95
+ if (Array.isArray(value)) {
96
+ return await Promise.all(value.map(map));
97
+ }
98
+ if (value && typeof value === 'object') {
99
+ const pairs = await Promise.all(Object.entries(value).map(async ([key, nested]) => [key, await map(nested)]));
100
+ return Object.fromEntries(pairs);
101
+ }
102
+ return value;
103
+ }
104
+ async function resolveAttributes(attributes, resolve) {
105
+ const pairs = await Promise.all(Object.entries(attributes).map(async ([key, value]) => [key, await resolve(value)]));
106
+ return Object.fromEntries(pairs);
107
+ }
108
+ async function resolveSpan(span, resolve) {
109
+ const events = await Promise.all(span.events.map(async (event) => ({
110
+ ...event,
111
+ attributes: await resolveAttributes(event.attributes, resolve),
112
+ })));
113
+ return { ...span, attributes: await resolveAttributes(span.attributes, resolve), events };
114
+ }
115
+ function includedAttributes(attributes, include) {
116
+ if (include.usage) {
117
+ return attributes;
118
+ }
119
+ return Object.fromEntries(Object.entries(attributes).filter(([key]) => !USAGE_PREFIXES.some((prefix) => key.startsWith(prefix))));
120
+ }
121
+ /** Guardrail hits without the text they matched. */
122
+ function withoutMatches(hits) {
123
+ return hits.map((hit) => {
124
+ if (!hit || typeof hit !== 'object' || Array.isArray(hit)) {
125
+ return hit;
126
+ }
127
+ const { [MATCH_ATTRIBUTE]: _match, ...rest } = hit;
128
+ return rest;
129
+ });
130
+ }
131
+ function includedEvent(event, include) {
132
+ const flag = EVENT_INCLUDE[event.name];
133
+ if (flag && !include[flag]) {
134
+ return undefined;
135
+ }
136
+ if (event.name === 'theorem.grounding' && !include.evidenceRaw) {
137
+ const { [RAW_ATTRIBUTE]: _raw, ...rest } = event.attributes;
138
+ return { ...event, attributes: rest };
139
+ }
140
+ const { hits } = event.attributes;
141
+ if (event.name === 'theorem.guardrail' && !include.guardrailMatchPreview && Array.isArray(hits)) {
142
+ return { ...event, attributes: { ...event.attributes, hits: withoutMatches(hits) } };
143
+ }
144
+ return event;
145
+ }
146
+ function applyInclude(span, include) {
147
+ return {
148
+ ...span,
149
+ attributes: includedAttributes(span.attributes, include),
150
+ events: span.events.flatMap((event) => includedEvent(event, include) ?? []),
151
+ };
152
+ }
153
+ function enabledKeys(flags) {
154
+ return Object.entries(flags).flatMap(([key, on]) => (on ? [key] : []));
155
+ }
156
+ /** `spans` is `TraceTree.collect()` output, root first. The root gains the policy it ran under. */
157
+ async function buildRecord(args) {
158
+ const { policy } = args;
159
+ const resolver = {
160
+ scrub: policy.scrub,
161
+ canaries: policy.scrub.canary ? (args.canaries ?? []) : [],
162
+ content: {},
163
+ known: new Map(),
164
+ };
165
+ const included = args.spans.map((span) => applyInclude(span, policy.include));
166
+ const [root] = included;
167
+ if (root) {
168
+ root.attributes = {
169
+ ...root.attributes,
170
+ 'theorem.record.include': enabledKeys(policy.include),
171
+ 'theorem.record.scrub': enabledKeys(policy.scrub),
172
+ };
173
+ }
174
+ const texts = await Promise.all(included.map((span) => resolveSpan(span, (value) => resolveContent(value, resolver))));
175
+ const spans = await Promise.all(texts.map((span) => resolveSpan(span, (value) => resolveJson(value, resolver))));
176
+ return {
177
+ v: TRACE_VERSION,
178
+ schemaUrl: TRACE_SCHEMA_URL,
179
+ resource: { ...policy.resource },
180
+ ...(args.metadata ? { metadata: args.metadata } : {}),
181
+ spans,
182
+ content: resolver.content,
183
+ };
184
+ }
185
+ /** `undefined` for a non-reference, and for a blob, whose bytes were never stored. */
186
+ function contentOf(record, value) {
187
+ if (!value || typeof value !== 'object' || Array.isArray(value)) {
188
+ return undefined;
189
+ }
190
+ const hash = value[TEXT_REF] ?? value[JSON_REF];
191
+ return typeof hash === 'string' ? record.content[hash] : undefined;
192
+ }
193
+ /**
194
+ * Replaces every stored reference by what it names. `{ content_sha256 }` beside other keys (a
195
+ * message part) becomes `content`; `{ json_sha256 }` beside other keys is merged under them. A
196
+ * reference whose hash is not in `content` (a blob's bytes) is kept as is.
197
+ */
198
+ function inlineContent(record, value) {
199
+ if (Array.isArray(value)) {
200
+ return value.map((item) => inlineContent(record, item));
201
+ }
202
+ if (!value || typeof value !== 'object') {
203
+ return value;
204
+ }
205
+ const fields = Object.fromEntries(Object.entries(value).map(([key, nested]) => [key, inlineContent(record, nested)]));
206
+ const { [TEXT_REF]: textHash, [JSON_REF]: jsonHash, ...rest } = fields;
207
+ const text = typeof textHash === 'string' ? record.content[textHash] : undefined;
208
+ if (text !== undefined) {
209
+ return Object.keys(rest).length === 0 ? text : { ...rest, content: text };
210
+ }
211
+ const json = typeof jsonHash === 'string' ? record.content[jsonHash] : undefined;
212
+ if (json === undefined) {
213
+ return fields;
214
+ }
215
+ const parsed = inlineContent(record, JSON.parse(json));
216
+ if (Object.keys(rest).length === 0) {
217
+ return parsed;
218
+ }
219
+ return parsed && typeof parsed === 'object' && !Array.isArray(parsed)
220
+ ? { ...parsed, ...rest }
221
+ : fields;
222
+ }
223
+ export { buildRecord, contentOf, inlineContent, TRACE_SCHEMA_URL };
@@ -0,0 +1,54 @@
1
+ import { z } from 'zod';
2
+ export declare const TRACE_VERSION = 3;
3
+ /** JSON-shaped attribute value (OTLP `AnyValue`). */
4
+ export type TraceAttributeValue = null | string | number | boolean | TraceAttributeValue[] | {
5
+ [key: string]: TraceAttributeValue;
6
+ };
7
+ export type TraceAttributes = Record<string, TraceAttributeValue>;
8
+ export declare const traceAttributesSchema: z.ZodType<TraceAttributes>;
9
+ /** OTLP span kind. THEOREM emits INTERNAL (agent, tool) and CLIENT (model call). */
10
+ export type TraceSpanKind = 'INTERNAL' | 'CLIENT';
11
+ /** OTLP status. `UNSET` is used for cancelled and paused spans. */
12
+ export interface TraceSpanStatus {
13
+ code: 'OK' | 'ERROR' | 'UNSET';
14
+ message?: string;
15
+ }
16
+ /** Edge to a span in an earlier trace (resume, continue, retry). */
17
+ export interface TraceSpanLink {
18
+ traceId: string;
19
+ spanId: string;
20
+ attributes: TraceAttributes;
21
+ }
22
+ export interface TraceSpanEvent {
23
+ name: string;
24
+ timeUnixNano: string;
25
+ attributes: TraceAttributes;
26
+ }
27
+ export interface TraceSpan {
28
+ traceId: string;
29
+ spanId: string;
30
+ parentSpanId?: string;
31
+ name: string;
32
+ kind: TraceSpanKind;
33
+ startTimeUnixNano: string;
34
+ endTimeUnixNano: string;
35
+ attributes: TraceAttributes;
36
+ events: TraceSpanEvent[];
37
+ links: TraceSpanLink[];
38
+ status: TraceSpanStatus;
39
+ }
40
+ /** One trace record: a turn, a host-invoked tool, or a Live session root or response. */
41
+ export interface TraceRecord {
42
+ v: typeof TRACE_VERSION;
43
+ schemaUrl: string;
44
+ /** Host-supplied process attributes (`observability.resource`), e.g. `service.name`. */
45
+ resource: TraceAttributes;
46
+ /** Host-owned metadata from the request, passed through untouched. */
47
+ metadata?: Record<string, unknown>;
48
+ /** Root first, then in start order. */
49
+ spans: TraceSpan[];
50
+ /** sha256 hex → exact scrubbed text; every hash the spans reference. */
51
+ content: Record<string, string>;
52
+ }
53
+ /** What a reader runs on a trace record from a wire; other versions fail. */
54
+ export declare const traceRecordSchema: z.ZodType<TraceRecord>;
@@ -0,0 +1,59 @@
1
+ // Each type is checked against its zod schema (`Equals`), so a field in one and not the other fails
2
+ // the build. A record crosses a wire, so a reader parses it with `traceRecordSchema` first.
3
+ import { z } from 'zod';
4
+ export const TRACE_VERSION = 3;
5
+ const traceAttributeValue = z.lazy(() => z.union([
6
+ z.null(),
7
+ z.string(),
8
+ z.number(),
9
+ z.boolean(),
10
+ z.array(traceAttributeValue),
11
+ z.record(z.string(), traceAttributeValue),
12
+ ]));
13
+ const traceAttributes = z.record(z.string(), traceAttributeValue);
14
+ true;
15
+ export const traceAttributesSchema = traceAttributes;
16
+ const traceSpanKind = z.enum(['INTERNAL', 'CLIENT']);
17
+ true;
18
+ const traceSpanStatus = z.object({
19
+ code: z.enum(['OK', 'ERROR', 'UNSET']),
20
+ message: z.string().optional(),
21
+ });
22
+ true;
23
+ const traceSpanLink = z.object({
24
+ traceId: z.string(),
25
+ spanId: z.string(),
26
+ attributes: traceAttributes,
27
+ });
28
+ true;
29
+ const traceSpanEvent = z.object({
30
+ name: z.string(),
31
+ timeUnixNano: z.string(),
32
+ attributes: traceAttributes,
33
+ });
34
+ true;
35
+ const traceSpan = z.object({
36
+ traceId: z.string(),
37
+ spanId: z.string(),
38
+ parentSpanId: z.string().optional(),
39
+ name: z.string(),
40
+ kind: traceSpanKind,
41
+ startTimeUnixNano: z.string(),
42
+ endTimeUnixNano: z.string(),
43
+ attributes: traceAttributes,
44
+ events: z.array(traceSpanEvent),
45
+ links: z.array(traceSpanLink),
46
+ status: traceSpanStatus,
47
+ });
48
+ true;
49
+ const traceRecord = z.object({
50
+ v: z.literal(TRACE_VERSION),
51
+ schemaUrl: z.string(),
52
+ resource: traceAttributes,
53
+ metadata: z.record(z.string(), z.unknown()).optional(),
54
+ spans: z.array(traceSpan),
55
+ content: z.record(z.string(), z.string()),
56
+ });
57
+ true;
58
+ /** What a reader runs on a trace record from a wire; other versions fail. */
59
+ export const traceRecordSchema = traceRecord;
@@ -0,0 +1,13 @@
1
+ import type { TraceRecord } from './trace-record.js';
2
+ /** Every destination receives it, so a host store reads the storage policy the JSONL writer does. */
3
+ export interface TraceWriteContext {
4
+ /** Days to keep the record from now; `<= 0` keeps it forever. */
5
+ retainForDays: number;
6
+ /** Size at which a file-based destination starts a new file. */
7
+ rotateAfterMiB: number;
8
+ }
9
+ export interface TraceSink {
10
+ write: (record: TraceRecord, context: TraceWriteContext) => Promise<void>;
11
+ /** Called when `writeTrace` catches a build or write failure. Must not throw. */
12
+ onError?: (err: unknown) => void;
13
+ }
@@ -0,0 +1,3 @@
1
+ // Type-only so programs that never write files (browser bundles, Workers) never pull the JSONL
2
+ // file sink into their module graph.
3
+ export {};
@@ -0,0 +1,92 @@
1
+ import type { TraceAttributes, TraceAttributeValue, TraceSpan, TraceSpanEvent, TraceSpanKind, TraceSpanLink, TraceSpanStatus } from './trace-schema.js';
2
+ /** In-memory text awaiting scrub + hash at record build. */
3
+ interface TraceContent {
4
+ [key: string]: TraceAttributeValue;
5
+ $content: string;
6
+ }
7
+ /** In-memory base64 bytes awaiting hash at record build. */
8
+ interface TraceBytes {
9
+ [key: string]: TraceAttributeValue;
10
+ $bytes: string;
11
+ }
12
+ /** In-memory provider row or wire body awaiting scrub, intern and hash at record build. */
13
+ interface TraceJson {
14
+ [key: string]: TraceAttributeValue;
15
+ $json: TraceAttributeValue;
16
+ }
17
+ interface SpanLinkInput {
18
+ traceparent: string;
19
+ attributes?: TraceAttributes;
20
+ }
21
+ interface SpanOptions {
22
+ kind?: TraceSpanKind;
23
+ attributes?: TraceAttributes;
24
+ links?: SpanLinkInput[];
25
+ /** When the span began, for work measured before the span was opened. Default: now. */
26
+ startTimeUnixNano?: string;
27
+ }
28
+ /** Handle to an open span. Every method is safe to call after `end`. */
29
+ interface SpanHandle {
30
+ readonly traceId: string;
31
+ readonly spanId: string;
32
+ /** True once `end` ran or the trace was collected. */
33
+ readonly ended: boolean;
34
+ traceparent: () => string;
35
+ child: (name: string, options?: SpanOptions) => SpanHandle;
36
+ /** Merge attributes; later values win. Ignored after `end`. */
37
+ set: (attributes: TraceAttributes) => void;
38
+ /**
39
+ * Append a timestamped event. `timeUnixNano` places an event observed before
40
+ * it could be attached (default: now). Ignored after `end`.
41
+ */
42
+ event: (name: string, attributes?: TraceAttributes, timeUnixNano?: string) => void;
43
+ /** Default status is `OK`. Second and later calls are ignored. */
44
+ end: (status?: TraceSpanStatus) => void;
45
+ msSinceStart: () => number;
46
+ /** Milliseconds from this span's end to now; `undefined` while open. */
47
+ msSinceEnd: () => number | undefined;
48
+ /** Now on the trace's clock, as span timestamps are written. */
49
+ nowUnixNano: () => string;
50
+ }
51
+ interface TraceTree {
52
+ root: SpanHandle;
53
+ /** The trace's clock; pass it to `startTrace` so related trees share one timeline. */
54
+ clock: TraceClock;
55
+ /** Closes anything still open as `ERROR` / `unclosed`; returns root first, then start order. */
56
+ collect: () => TraceSpan[];
57
+ }
58
+ interface TraceClock {
59
+ nowUnixNano: () => bigint;
60
+ }
61
+ /**
62
+ * The trace and span ids of a W3C `traceparent` THEOREM accepts (version 00,
63
+ * lowercase hex, non-zero ids), or `undefined`. For a host checking a value from
64
+ * a request before handing it to a turn, which throws on anything else.
65
+ */
66
+ declare function readTraceparent(value: string): {
67
+ traceId: string;
68
+ spanId: string;
69
+ } | undefined;
70
+ /** Throws on a malformed value: a host bug, not a runtime state. */
71
+ declare function parseTraceparent(value: string): {
72
+ traceId: string;
73
+ spanId: string;
74
+ };
75
+ declare function formatTraceparent(traceId: string, spanId: string): string;
76
+ declare function traceContent(text: string): TraceContent;
77
+ declare function traceBytes(base64: string): TraceBytes;
78
+ /** `undefined` members and non-JSON values are dropped the way `JSON.stringify` drops them. */
79
+ declare function traceJson(value: unknown): TraceJson;
80
+ declare function isTraceContent(value: unknown): value is TraceContent;
81
+ declare function isTraceBytes(value: unknown): value is TraceBytes;
82
+ declare function isTraceJson(value: unknown): value is TraceJson;
83
+ /**
84
+ * Open a root span. With `traceparent`, the root joins that trace as a child of
85
+ * the named span; without it, the root starts a new trace.
86
+ */
87
+ declare function startTrace(name: string, options?: SpanOptions & {
88
+ traceparent?: string;
89
+ clock?: TraceClock;
90
+ }): TraceTree;
91
+ export type { SpanHandle, SpanLinkInput, SpanOptions, TraceAttributes, TraceAttributeValue, TraceBytes, TraceClock, TraceContent, TraceJson, TraceSpan, TraceSpanEvent, TraceSpanKind, TraceSpanLink, TraceSpanStatus, TraceTree, };
92
+ export { formatTraceparent, isTraceBytes, isTraceContent, isTraceJson, parseTraceparent, readTraceparent, startTrace, traceBytes, traceContent, traceJson, };
@@ -0,0 +1,199 @@
1
+ // Content is held in memory as markers the record builder resolves: `$content` is scrubbed, hashed
2
+ // and moved into `TraceRecord.content`; `$bytes` is hashed and never stored; `$json` has media
3
+ // hashed and strings equal to recorded content replaced by their hash.
4
+ import { TheoremError } from '../guardrails/error.js';
5
+ import { isRecord } from '../kernel/util/record.js';
6
+ const TRACE_ID_BYTES = 16;
7
+ const SPAN_ID_BYTES = 8;
8
+ const NANOS_PER_MS = 1_000_000;
9
+ const HEX_PAD = 2;
10
+ const HEX_RADIX = 16;
11
+ const TRACEPARENT = /^00-([0-9a-f]{32})-([0-9a-f]{16})-[0-9a-f]{2}$/;
12
+ const ALL_ZERO = /^0+$/;
13
+ const SAMPLED_FLAGS = '01';
14
+ const UNCLOSED = 'unclosed';
15
+ function randomHex(bytes) {
16
+ for (;;) {
17
+ const buf = crypto.getRandomValues(new Uint8Array(bytes));
18
+ const hex = [...buf].map((b) => b.toString(HEX_RADIX).padStart(HEX_PAD, '0')).join('');
19
+ if (!ALL_ZERO.test(hex)) {
20
+ return hex;
21
+ }
22
+ }
23
+ }
24
+ /** On Cloudflare Workers both clocks advance only at I/O; the root carries `theorem.clock=io`. */
25
+ function systemClock() {
26
+ const epochMs = Date.now();
27
+ const perfStart = performance.now();
28
+ return {
29
+ nowUnixNano: () => BigInt(epochMs) * BigInt(NANOS_PER_MS) +
30
+ BigInt(Math.round((performance.now() - perfStart) * NANOS_PER_MS)),
31
+ };
32
+ }
33
+ function clockAdvancesOnlyAtIo() {
34
+ return globalThis.navigator?.userAgent === 'Cloudflare-Workers';
35
+ }
36
+ /**
37
+ * The trace and span ids of a W3C `traceparent` THEOREM accepts (version 00,
38
+ * lowercase hex, non-zero ids), or `undefined`. For a host checking a value from
39
+ * a request before handing it to a turn, which throws on anything else.
40
+ */
41
+ function readTraceparent(value) {
42
+ const match = TRACEPARENT.exec(value.trim());
43
+ const traceId = match?.[1];
44
+ const spanId = match?.[2];
45
+ if (!traceId || !spanId || ALL_ZERO.test(traceId) || ALL_ZERO.test(spanId))
46
+ return undefined;
47
+ return { traceId, spanId };
48
+ }
49
+ /** Throws on a malformed value: a host bug, not a runtime state. */
50
+ function parseTraceparent(value) {
51
+ const parsed = readTraceparent(value);
52
+ if (!parsed) {
53
+ throw new TheoremError('request', `traceparent is not a valid W3C trace context: '${value}'`);
54
+ }
55
+ return parsed;
56
+ }
57
+ function formatTraceparent(traceId, spanId) {
58
+ return `00-${traceId}-${spanId}-${SAMPLED_FLAGS}`;
59
+ }
60
+ function traceContent(text) {
61
+ return { $content: text };
62
+ }
63
+ function traceBytes(base64) {
64
+ return { $bytes: base64 };
65
+ }
66
+ /** `undefined` members and non-JSON values are dropped the way `JSON.stringify` drops them. */
67
+ function traceJson(value) {
68
+ return { $json: toAttributeValue(value) ?? null };
69
+ }
70
+ function toAttributeValue(value) {
71
+ if (typeof value === 'string' || typeof value === 'boolean') {
72
+ return value;
73
+ }
74
+ if (typeof value === 'number') {
75
+ return Number.isFinite(value) ? value : null;
76
+ }
77
+ if (value === null) {
78
+ return null;
79
+ }
80
+ if (Array.isArray(value)) {
81
+ return value.map((item) => toAttributeValue(item) ?? null);
82
+ }
83
+ if (typeof value === 'object') {
84
+ const out = {};
85
+ for (const [key, nested] of Object.entries(value)) {
86
+ const mapped = toAttributeValue(nested);
87
+ if (mapped !== undefined) {
88
+ out[key] = mapped;
89
+ }
90
+ }
91
+ return out;
92
+ }
93
+ return undefined;
94
+ }
95
+ function isMarker(value, key) {
96
+ return isRecord(value) && key in value;
97
+ }
98
+ function isTraceContent(value) {
99
+ return isMarker(value, '$content') && typeof value.$content === 'string';
100
+ }
101
+ function isTraceBytes(value) {
102
+ return isMarker(value, '$bytes') && typeof value.$bytes === 'string';
103
+ }
104
+ function isTraceJson(value) {
105
+ return isMarker(value, '$json');
106
+ }
107
+ function linkFrom(input) {
108
+ const { traceId, spanId } = parseTraceparent(input.traceparent);
109
+ return { traceId, spanId, attributes: { ...(input.attributes ?? {}) } };
110
+ }
111
+ function msBetween(fromUnixNano, clock) {
112
+ return Number(clock.nowUnixNano() - BigInt(fromUnixNano)) / NANOS_PER_MS;
113
+ }
114
+ function openHandle(state, traceId, parentSpanId, name, options) {
115
+ const entry = {
116
+ span: {
117
+ traceId,
118
+ spanId: randomHex(SPAN_ID_BYTES),
119
+ ...(parentSpanId ? { parentSpanId } : {}),
120
+ name,
121
+ kind: options?.kind ?? 'INTERNAL',
122
+ startTimeUnixNano: options?.startTimeUnixNano ?? String(state.clock.nowUnixNano()),
123
+ endTimeUnixNano: '',
124
+ attributes: { ...(options?.attributes ?? {}) },
125
+ events: [],
126
+ links: (options?.links ?? []).map(linkFrom),
127
+ status: { code: 'UNSET' },
128
+ },
129
+ ended: false,
130
+ order: state.open.length,
131
+ };
132
+ state.open.push(entry);
133
+ const { span } = entry;
134
+ return {
135
+ traceId,
136
+ spanId: span.spanId,
137
+ get ended() {
138
+ return entry.ended;
139
+ },
140
+ traceparent: () => formatTraceparent(traceId, span.spanId),
141
+ child: (childName, childOptions) => openHandle(state, traceId, span.spanId, childName, childOptions),
142
+ set: (attributes) => {
143
+ if (!entry.ended) {
144
+ Object.assign(span.attributes, attributes);
145
+ }
146
+ },
147
+ event: (eventName, attributes, timeUnixNano) => {
148
+ if (!entry.ended) {
149
+ span.events.push({
150
+ name: eventName,
151
+ timeUnixNano: timeUnixNano ?? String(state.clock.nowUnixNano()),
152
+ attributes: { ...(attributes ?? {}) },
153
+ });
154
+ }
155
+ },
156
+ end: (status) => {
157
+ if (entry.ended) {
158
+ return;
159
+ }
160
+ entry.ended = true;
161
+ span.endTimeUnixNano = String(state.clock.nowUnixNano());
162
+ span.status = status ?? { code: 'OK' };
163
+ },
164
+ msSinceStart: () => msBetween(span.startTimeUnixNano, state.clock),
165
+ msSinceEnd: () => (entry.ended ? msBetween(span.endTimeUnixNano, state.clock) : undefined),
166
+ nowUnixNano: () => String(state.clock.nowUnixNano()),
167
+ };
168
+ }
169
+ /**
170
+ * Open a root span. With `traceparent`, the root joins that trace as a child of
171
+ * the named span; without it, the root starts a new trace.
172
+ */
173
+ function startTrace(name, options = {}) {
174
+ const parent = options.traceparent ? parseTraceparent(options.traceparent) : undefined;
175
+ const state = { clock: options.clock ?? systemClock(), open: [] };
176
+ const root = openHandle(state, parent?.traceId ?? randomHex(TRACE_ID_BYTES), parent?.spanId, name, {
177
+ ...options,
178
+ attributes: {
179
+ ...(clockAdvancesOnlyAtIo() ? { 'theorem.clock': 'io' } : {}),
180
+ ...(options.attributes ?? {}),
181
+ },
182
+ });
183
+ return {
184
+ root,
185
+ clock: state.clock,
186
+ collect: () => {
187
+ const now = String(state.clock.nowUnixNano());
188
+ for (const entry of state.open) {
189
+ if (!entry.ended) {
190
+ entry.ended = true;
191
+ entry.span.endTimeUnixNano = now;
192
+ entry.span.status = { code: 'ERROR', message: UNCLOSED };
193
+ }
194
+ }
195
+ return [...state.open].sort((a, b) => a.order - b.order).map((entry) => entry.span);
196
+ },
197
+ };
198
+ }
199
+ export { formatTraceparent, isTraceBytes, isTraceContent, isTraceJson, parseTraceparent, readTraceparent, startTrace, traceBytes, traceContent, traceJson, };
@@ -0,0 +1,11 @@
1
+ import { type TraceRecord } from './trace-record.js';
2
+ import type { TraceSink } from './trace-sink.js';
3
+ import type { TraceSpan } from './trace-span.js';
4
+ import type { ResolvedObservabilityPolicy } from './types.js';
5
+ /** Trace failures never fail the turn: build and write errors go to `sink.onError`, if set. */
6
+ declare function writeTrace(sink: TraceSink, record: Promise<TraceRecord>, policy: ResolvedObservabilityPolicy): Promise<void>;
7
+ /** Like `writeTrace`, it never fails the caller. */
8
+ declare function writeSpans(sink: TraceSink, spans: TraceSpan[], policy: ResolvedObservabilityPolicy, metadata?: Record<string, unknown>): Promise<void>;
9
+ declare function noopSink(): TraceSink;
10
+ declare function memorySink(into: TraceRecord[]): TraceSink;
11
+ export { memorySink, noopSink, writeSpans, writeTrace };