@theoremjs/agents 0.0.0-stage → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (588) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +545 -2
  3. package/esm/_dnt.polyfills.d.ts +66 -0
  4. package/esm/_dnt.polyfills.js +51 -0
  5. package/esm/mod.d.ts +79 -0
  6. package/esm/mod.js +49 -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 +480 -0
  12. package/esm/src/cli/commands/detect-compile.d.ts +17 -0
  13. package/esm/src/cli/commands/detect-compile.js +22 -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 +241 -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 +26 -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 +67 -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 +5 -0
  35. package/esm/src/evals/attachments.js +55 -0
  36. package/esm/src/evals/breakdown.d.ts +30 -0
  37. package/esm/src/evals/breakdown.js +69 -0
  38. package/esm/src/evals/graders/answer.d.ts +16 -0
  39. package/esm/src/evals/graders/answer.js +134 -0
  40. package/esm/src/evals/graders/code.d.ts +40 -0
  41. package/esm/src/evals/graders/code.js +184 -0
  42. package/esm/src/evals/graders/judge.d.ts +24 -0
  43. package/esm/src/evals/graders/judge.js +367 -0
  44. package/esm/src/evals/graders/latency.d.ts +6 -0
  45. package/esm/src/evals/graders/latency.js +82 -0
  46. package/esm/src/evals/graders/live.d.ts +14 -0
  47. package/esm/src/evals/graders/live.js +42 -0
  48. package/esm/src/evals/graders/media.d.ts +18 -0
  49. package/esm/src/evals/graders/media.js +91 -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 +19 -0
  53. package/esm/src/evals/graders/transcript.js +202 -0
  54. package/esm/src/evals/mod.d.ts +34 -0
  55. package/esm/src/evals/mod.js +22 -0
  56. package/esm/src/evals/record.d.ts +41 -0
  57. package/esm/src/evals/record.js +107 -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 +75 -0
  67. package/esm/src/evals/run.js +418 -0
  68. package/esm/src/evals/suite.d.ts +28 -0
  69. package/esm/src/evals/suite.js +97 -0
  70. package/esm/src/evals/summary.d.ts +35 -0
  71. package/esm/src/evals/summary.js +31 -0
  72. package/esm/src/evals/trial.d.ts +14 -0
  73. package/esm/src/evals/trial.js +135 -0
  74. package/esm/src/evals/types.d.ts +169 -0
  75. package/esm/src/evals/types.js +113 -0
  76. package/esm/src/evals/verdict.d.ts +23 -0
  77. package/esm/src/evals/verdict.js +48 -0
  78. package/esm/src/guardrails/boundaries.d.ts +41 -0
  79. package/esm/src/guardrails/boundaries.js +103 -0
  80. package/esm/src/guardrails/canary-gate.d.ts +22 -0
  81. package/esm/src/guardrails/canary-gate.js +40 -0
  82. package/esm/src/guardrails/canary.d.ts +146 -0
  83. package/esm/src/guardrails/canary.js +974 -0
  84. package/esm/src/guardrails/compile-egress.d.ts +12 -0
  85. package/esm/src/guardrails/compile-egress.js +12 -0
  86. package/esm/src/guardrails/corpus/canary-egress-attacks.d.ts +24 -0
  87. package/esm/src/guardrails/corpus/canary-egress-attacks.js +305 -0
  88. package/esm/src/guardrails/corpus/fuzz-inbound.d.ts +5 -0
  89. package/esm/src/guardrails/corpus/fuzz-inbound.js +199 -0
  90. package/esm/src/guardrails/corpus/inbound-payloads.d.ts +5 -0
  91. package/esm/src/guardrails/corpus/inbound-payloads.js +120 -0
  92. package/esm/src/guardrails/corpus/live-attacks.d.ts +15 -0
  93. package/esm/src/guardrails/corpus/live-attacks.js +229 -0
  94. package/esm/src/guardrails/corpus/mod.d.ts +7 -0
  95. package/esm/src/guardrails/corpus/mod.js +4 -0
  96. package/esm/src/guardrails/corpus/secrets.d.ts +12 -0
  97. package/esm/src/guardrails/corpus/secrets.js +16 -0
  98. package/esm/src/guardrails/corpus/strings.d.ts +23 -0
  99. package/esm/src/guardrails/corpus/strings.js +29 -0
  100. package/esm/src/guardrails/corpus/types.d.ts +36 -0
  101. package/esm/src/guardrails/corpus/types.js +1 -0
  102. package/esm/src/guardrails/credential-rules.d.ts +36 -0
  103. package/esm/src/guardrails/credential-rules.js +3001 -0
  104. package/esm/src/guardrails/credential-scan.d.ts +45 -0
  105. package/esm/src/guardrails/credential-scan.js +172 -0
  106. package/esm/src/guardrails/destinations.d.ts +45 -0
  107. package/esm/src/guardrails/destinations.js +234 -0
  108. package/esm/src/guardrails/detect-at.d.ts +107 -0
  109. package/esm/src/guardrails/detect-at.js +434 -0
  110. package/esm/src/guardrails/detect-reply.d.ts +61 -0
  111. package/esm/src/guardrails/detect-reply.js +95 -0
  112. package/esm/src/guardrails/detect-stream.d.ts +33 -0
  113. package/esm/src/guardrails/detect-stream.js +77 -0
  114. package/esm/src/guardrails/detectors.d.ts +216 -0
  115. package/esm/src/guardrails/detectors.js +503 -0
  116. package/esm/src/guardrails/egress-automata.d.ts +12 -0
  117. package/esm/src/guardrails/egress-automata.js +25582 -0
  118. package/esm/src/guardrails/egress-compiler.d.ts +55 -0
  119. package/esm/src/guardrails/egress-compiler.js +431 -0
  120. package/esm/src/guardrails/egress-patterns.d.ts +26 -0
  121. package/esm/src/guardrails/egress-patterns.js +36 -0
  122. package/esm/src/guardrails/egress-stream.d.ts +123 -0
  123. package/esm/src/guardrails/egress-stream.js +774 -0
  124. package/esm/src/guardrails/egress-urls.d.ts +86 -0
  125. package/esm/src/guardrails/egress-urls.js +909 -0
  126. package/esm/src/guardrails/egress.d.ts +46 -0
  127. package/esm/src/guardrails/egress.js +124 -0
  128. package/esm/src/guardrails/error.d.ts +31 -0
  129. package/esm/src/guardrails/error.js +96 -0
  130. package/esm/src/guardrails/event-schemas.d.ts +100 -0
  131. package/esm/src/guardrails/event-schemas.js +48 -0
  132. package/esm/src/guardrails/events.d.ts +13 -0
  133. package/esm/src/guardrails/events.js +45 -0
  134. package/esm/src/guardrails/hints.d.ts +14 -0
  135. package/esm/src/guardrails/hints.js +57 -0
  136. package/esm/src/guardrails/hits.d.ts +14 -0
  137. package/esm/src/guardrails/hits.js +30 -0
  138. package/esm/src/guardrails/host-patterns.d.ts +85 -0
  139. package/esm/src/guardrails/host-patterns.js +173 -0
  140. package/esm/src/guardrails/injection-patterns.d.ts +20 -0
  141. package/esm/src/guardrails/injection-patterns.js +126 -0
  142. package/esm/src/guardrails/injection-reversed.d.ts +9 -0
  143. package/esm/src/guardrails/injection-reversed.js +49 -0
  144. package/esm/src/guardrails/injection.d.ts +30 -0
  145. package/esm/src/guardrails/injection.js +460 -0
  146. package/esm/src/guardrails/labels.d.ts +40 -0
  147. package/esm/src/guardrails/labels.js +874 -0
  148. package/esm/src/guardrails/live-outbound-gate.d.ts +55 -0
  149. package/esm/src/guardrails/live-outbound-gate.js +298 -0
  150. package/esm/src/guardrails/mod.d.ts +54 -0
  151. package/esm/src/guardrails/mod.js +34 -0
  152. package/esm/src/guardrails/network.d.ts +46 -0
  153. package/esm/src/guardrails/network.js +330 -0
  154. package/esm/src/guardrails/normalize.d.ts +20 -0
  155. package/esm/src/guardrails/normalize.js +165 -0
  156. package/esm/src/guardrails/policy.d.ts +4 -0
  157. package/esm/src/guardrails/policy.js +21 -0
  158. package/esm/src/guardrails/progressive-yield.d.ts +110 -0
  159. package/esm/src/guardrails/progressive-yield.js +281 -0
  160. package/esm/src/guardrails/prompt-echo.d.ts +40 -0
  161. package/esm/src/guardrails/prompt-echo.js +306 -0
  162. package/esm/src/guardrails/quota.d.ts +21 -0
  163. package/esm/src/guardrails/quota.js +80 -0
  164. package/esm/src/guardrails/rules.d.ts +47 -0
  165. package/esm/src/guardrails/rules.js +47 -0
  166. package/esm/src/guardrails/sanitize.d.ts +40 -0
  167. package/esm/src/guardrails/sanitize.js +160 -0
  168. package/esm/src/guardrails/sensitive-groups.d.ts +21 -0
  169. package/esm/src/guardrails/sensitive-groups.js +12 -0
  170. package/esm/src/guardrails/sensitive.d.ts +22 -0
  171. package/esm/src/guardrails/sensitive.js +234 -0
  172. package/esm/src/guardrails/serialize.d.ts +15 -0
  173. package/esm/src/guardrails/serialize.js +37 -0
  174. package/esm/src/guardrails/testing.d.ts +11 -0
  175. package/esm/src/guardrails/testing.js +10 -0
  176. package/esm/src/guardrails/theorem-error.d.ts +21 -0
  177. package/esm/src/guardrails/theorem-error.js +54 -0
  178. package/esm/src/guardrails/thought-guard.d.ts +76 -0
  179. package/esm/src/guardrails/thought-guard.js +664 -0
  180. package/esm/src/guardrails/tool-directives.d.ts +38 -0
  181. package/esm/src/guardrails/tool-directives.js +195 -0
  182. package/esm/src/guardrails/tool-leak.d.ts +26 -0
  183. package/esm/src/guardrails/tool-leak.js +45 -0
  184. package/esm/src/guardrails/tool-result.d.ts +92 -0
  185. package/esm/src/guardrails/tool-result.js +272 -0
  186. package/esm/src/guardrails/types.d.ts +250 -0
  187. package/esm/src/guardrails/types.js +58 -0
  188. package/esm/src/host/client-turn.d.ts +36 -0
  189. package/esm/src/host/client-turn.js +80 -0
  190. package/esm/src/host/mint-trace.d.ts +29 -0
  191. package/esm/src/host/mint-trace.js +60 -0
  192. package/esm/src/host/mod.d.ts +13 -0
  193. package/esm/src/host/mod.js +11 -0
  194. package/esm/src/host/readStreamingJsonStringField.d.ts +2 -0
  195. package/esm/src/host/readStreamingJsonStringField.js +27 -0
  196. package/esm/src/host/reply.d.ts +13 -0
  197. package/esm/src/host/reply.js +41 -0
  198. package/esm/src/interface/blocks.d.ts +11 -0
  199. package/esm/src/interface/blocks.js +283 -0
  200. package/esm/src/interface/composer-actions.d.ts +24 -0
  201. package/esm/src/interface/composer-actions.js +33 -0
  202. package/esm/src/interface/draft.d.ts +20 -0
  203. package/esm/src/interface/draft.js +39 -0
  204. package/esm/src/interface/from-profile.d.ts +24 -0
  205. package/esm/src/interface/from-profile.js +179 -0
  206. package/esm/src/interface/history.d.ts +46 -0
  207. package/esm/src/interface/history.js +278 -0
  208. package/esm/src/interface/inputs.d.ts +11 -0
  209. package/esm/src/interface/inputs.js +67 -0
  210. package/esm/src/interface/mod.d.ts +33 -0
  211. package/esm/src/interface/mod.js +22 -0
  212. package/esm/src/interface/models.d.ts +26 -0
  213. package/esm/src/interface/models.js +50 -0
  214. package/esm/src/interface/pending.d.ts +57 -0
  215. package/esm/src/interface/pending.js +152 -0
  216. package/esm/src/interface/profile-interface.d.ts +4 -0
  217. package/esm/src/interface/profile-interface.js +237 -0
  218. package/esm/src/interface/session.d.ts +71 -0
  219. package/esm/src/interface/session.js +128 -0
  220. package/esm/src/interface/stop.d.ts +13 -0
  221. package/esm/src/interface/stop.js +28 -0
  222. package/esm/src/interface/tool-calls.d.ts +32 -0
  223. package/esm/src/interface/tool-calls.js +127 -0
  224. package/esm/src/interface/tool-invoke.d.ts +6 -0
  225. package/esm/src/interface/tool-invoke.js +22 -0
  226. package/esm/src/interface/tool-media.d.ts +11 -0
  227. package/esm/src/interface/tool-media.js +113 -0
  228. package/esm/src/interface/types.d.ts +278 -0
  229. package/esm/src/interface/types.js +5 -0
  230. package/esm/src/kernel/api-catalog.d.ts +85 -0
  231. package/esm/src/kernel/api-catalog.js +229 -0
  232. package/esm/src/kernel/auth/credential-source.d.ts +23 -0
  233. package/esm/src/kernel/auth/credential-source.js +11 -0
  234. package/esm/src/kernel/auth/crypto.d.ts +56 -0
  235. package/esm/src/kernel/auth/crypto.js +163 -0
  236. package/esm/src/kernel/auth/mod.d.ts +5 -0
  237. package/esm/src/kernel/auth/mod.js +5 -0
  238. package/esm/src/kernel/auth/oauth.d.ts +18 -0
  239. package/esm/src/kernel/auth/oauth.js +439 -0
  240. package/esm/src/kernel/auth/scope-refusal.d.ts +9 -0
  241. package/esm/src/kernel/auth/scope-refusal.js +8 -0
  242. package/esm/src/kernel/auth/typed-secret.d.ts +13 -0
  243. package/esm/src/kernel/auth/typed-secret.js +23 -0
  244. package/esm/src/kernel/auth/types.d.ts +152 -0
  245. package/esm/src/kernel/auth/types.js +1 -0
  246. package/esm/src/kernel/checkpoint.d.ts +43 -0
  247. package/esm/src/kernel/checkpoint.js +58 -0
  248. package/esm/src/kernel/default-scope.d.ts +72 -0
  249. package/esm/src/kernel/default-scope.js +121 -0
  250. package/esm/src/kernel/engine/call-trace.d.ts +19 -0
  251. package/esm/src/kernel/engine/call-trace.js +29 -0
  252. package/esm/src/kernel/engine/compaction.d.ts +71 -0
  253. package/esm/src/kernel/engine/compaction.js +203 -0
  254. package/esm/src/kernel/engine/decision.d.ts +43 -0
  255. package/esm/src/kernel/engine/decision.js +439 -0
  256. package/esm/src/kernel/engine/embedding.d.ts +8 -0
  257. package/esm/src/kernel/engine/embedding.js +118 -0
  258. package/esm/src/kernel/engine/hash.d.ts +6 -0
  259. package/esm/src/kernel/engine/hash.js +22 -0
  260. package/esm/src/kernel/engine/live-inbound.d.ts +19 -0
  261. package/esm/src/kernel/engine/live-inbound.js +44 -0
  262. package/esm/src/kernel/engine/live-ingress.d.ts +15 -0
  263. package/esm/src/kernel/engine/live-ingress.js +42 -0
  264. package/esm/src/kernel/engine/record.d.ts +3 -0
  265. package/esm/src/kernel/engine/record.js +11 -0
  266. package/esm/src/kernel/engine/repair.d.ts +7 -0
  267. package/esm/src/kernel/engine/repair.js +36 -0
  268. package/esm/src/kernel/engine/runner/gates.d.ts +5 -0
  269. package/esm/src/kernel/engine/runner/gates.js +508 -0
  270. package/esm/src/kernel/engine/runner/mod.d.ts +29 -0
  271. package/esm/src/kernel/engine/runner/mod.js +625 -0
  272. package/esm/src/kernel/engine/runner/nested.d.ts +32 -0
  273. package/esm/src/kernel/engine/runner/nested.js +134 -0
  274. package/esm/src/kernel/engine/runner/schema-validation.d.ts +35 -0
  275. package/esm/src/kernel/engine/runner/schema-validation.js +179 -0
  276. package/esm/src/kernel/engine/runner/stages.d.ts +28 -0
  277. package/esm/src/kernel/engine/runner/stages.js +41 -0
  278. package/esm/src/kernel/engine/runner/state.d.ts +97 -0
  279. package/esm/src/kernel/engine/runner/state.js +50 -0
  280. package/esm/src/kernel/engine/runner/step-order.d.ts +27 -0
  281. package/esm/src/kernel/engine/runner/step-order.js +165 -0
  282. package/esm/src/kernel/engine/runner/steps.d.ts +14 -0
  283. package/esm/src/kernel/engine/runner/steps.js +519 -0
  284. package/esm/src/kernel/engine/runner/stream.d.ts +71 -0
  285. package/esm/src/kernel/engine/runner/stream.js +376 -0
  286. package/esm/src/kernel/engine/runner/usage.d.ts +45 -0
  287. package/esm/src/kernel/engine/runner/usage.js +148 -0
  288. package/esm/src/kernel/engine/session/mod.d.ts +33 -0
  289. package/esm/src/kernel/engine/session/mod.js +1182 -0
  290. package/esm/src/kernel/engine/session/session-trace.d.ts +115 -0
  291. package/esm/src/kernel/engine/session/session-trace.js +500 -0
  292. package/esm/src/kernel/engine/token-estimate.d.ts +23 -0
  293. package/esm/src/kernel/engine/token-estimate.js +38 -0
  294. package/esm/src/kernel/engine/tool-trace.d.ts +58 -0
  295. package/esm/src/kernel/engine/tool-trace.js +132 -0
  296. package/esm/src/kernel/engine/tree.d.ts +2 -0
  297. package/esm/src/kernel/engine/tree.js +17 -0
  298. package/esm/src/kernel/engine/turn-trace.d.ts +119 -0
  299. package/esm/src/kernel/engine/turn-trace.js +855 -0
  300. package/esm/src/kernel/engine/usage.d.ts +36 -0
  301. package/esm/src/kernel/engine/usage.js +151 -0
  302. package/esm/src/kernel/interaction-parts.d.ts +13 -0
  303. package/esm/src/kernel/interaction-parts.js +40 -0
  304. package/esm/src/kernel/json.d.ts +10 -0
  305. package/esm/src/kernel/json.js +3 -0
  306. package/esm/src/kernel/mod.d.ts +74 -0
  307. package/esm/src/kernel/mod.js +45 -0
  308. package/esm/src/kernel/profile-graph.d.ts +145 -0
  309. package/esm/src/kernel/profile-graph.js +158 -0
  310. package/esm/src/kernel/profile-presence.d.ts +18 -0
  311. package/esm/src/kernel/profile-presence.js +158 -0
  312. package/esm/src/kernel/profile-scope.d.ts +40 -0
  313. package/esm/src/kernel/profile-scope.js +274 -0
  314. package/esm/src/kernel/protocols/binding.d.ts +65 -0
  315. package/esm/src/kernel/protocols/binding.js +125 -0
  316. package/esm/src/kernel/protocols/limits.d.ts +15 -0
  317. package/esm/src/kernel/protocols/limits.js +28 -0
  318. package/esm/src/kernel/protocols/mod.d.ts +5 -0
  319. package/esm/src/kernel/protocols/mod.js +5 -0
  320. package/esm/src/kernel/protocols/prices.d.ts +36 -0
  321. package/esm/src/kernel/protocols/prices.js +37 -0
  322. package/esm/src/kernel/protocols/protocol.d.ts +253 -0
  323. package/esm/src/kernel/protocols/protocol.js +253 -0
  324. package/esm/src/kernel/protocols/provider.d.ts +108 -0
  325. package/esm/src/kernel/protocols/provider.js +143 -0
  326. package/esm/src/kernel/protocols/runtime.d.ts +55 -0
  327. package/esm/src/kernel/protocols/runtime.js +534 -0
  328. package/esm/src/kernel/provider-budget.d.ts +32 -0
  329. package/esm/src/kernel/provider-budget.js +262 -0
  330. package/esm/src/kernel/provider-dispatch.d.ts +13 -0
  331. package/esm/src/kernel/provider-dispatch.js +36 -0
  332. package/esm/src/kernel/provider-live.d.ts +7 -0
  333. package/esm/src/kernel/provider-live.js +189 -0
  334. package/esm/src/kernel/provider-runtime.d.ts +57 -0
  335. package/esm/src/kernel/provider-runtime.js +524 -0
  336. package/esm/src/kernel/registry/attachments.d.ts +46 -0
  337. package/esm/src/kernel/registry/attachments.js +220 -0
  338. package/esm/src/kernel/registry/catalog.d.ts +25 -0
  339. package/esm/src/kernel/registry/catalog.js +85 -0
  340. package/esm/src/kernel/registry/embedding-rules.d.ts +28 -0
  341. package/esm/src/kernel/registry/embedding-rules.js +66 -0
  342. package/esm/src/kernel/registry/ingress.d.ts +12 -0
  343. package/esm/src/kernel/registry/ingress.js +179 -0
  344. package/esm/src/kernel/registry/kernel-registry.d.ts +15 -0
  345. package/esm/src/kernel/registry/kernel-registry.js +15 -0
  346. package/esm/src/kernel/registry/profile-outputs.d.ts +3 -0
  347. package/esm/src/kernel/registry/profile-outputs.js +10 -0
  348. package/esm/src/kernel/registry/profiles.d.ts +116 -0
  349. package/esm/src/kernel/registry/profiles.js +773 -0
  350. package/esm/src/kernel/registry/provider-request.d.ts +6 -0
  351. package/esm/src/kernel/registry/provider-request.js +34 -0
  352. package/esm/src/kernel/registry/resolve.d.ts +17 -0
  353. package/esm/src/kernel/registry/resolve.js +238 -0
  354. package/esm/src/kernel/registry/schemas.d.ts +12 -0
  355. package/esm/src/kernel/registry/schemas.js +27 -0
  356. package/esm/src/kernel/registry/slot-fill.d.ts +7 -0
  357. package/esm/src/kernel/registry/slot-fill.js +22 -0
  358. package/esm/src/kernel/registry/sole-model.d.ts +2 -0
  359. package/esm/src/kernel/registry/sole-model.js +4 -0
  360. package/esm/src/kernel/registry/system-prompt.d.ts +8 -0
  361. package/esm/src/kernel/registry/system-prompt.js +32 -0
  362. package/esm/src/kernel/registry/system-role.d.ts +3 -0
  363. package/esm/src/kernel/registry/system-role.js +9 -0
  364. package/esm/src/kernel/registry/vault.d.ts +14 -0
  365. package/esm/src/kernel/registry/vault.js +1 -0
  366. package/esm/src/kernel/schema.d.ts +226 -0
  367. package/esm/src/kernel/schema.js +895 -0
  368. package/esm/src/kernel/scope.d.ts +29 -0
  369. package/esm/src/kernel/scope.js +45 -0
  370. package/esm/src/kernel/stages.d.ts +176 -0
  371. package/esm/src/kernel/stages.js +431 -0
  372. package/esm/src/kernel/stop.d.ts +116 -0
  373. package/esm/src/kernel/stop.js +137 -0
  374. package/esm/src/kernel/system-parts.d.ts +26 -0
  375. package/esm/src/kernel/system-parts.js +98 -0
  376. package/esm/src/kernel/tools/activity-label.d.ts +22 -0
  377. package/esm/src/kernel/tools/activity-label.js +435 -0
  378. package/esm/src/kernel/tools/agent.d.ts +66 -0
  379. package/esm/src/kernel/tools/agent.js +212 -0
  380. package/esm/src/kernel/tools/coordinate.d.ts +4 -0
  381. package/esm/src/kernel/tools/coordinate.js +165 -0
  382. package/esm/src/kernel/tools/events.d.ts +66 -0
  383. package/esm/src/kernel/tools/events.js +184 -0
  384. package/esm/src/kernel/tools/execute.d.ts +100 -0
  385. package/esm/src/kernel/tools/execute.js +1173 -0
  386. package/esm/src/kernel/tools/gate-answer.d.ts +60 -0
  387. package/esm/src/kernel/tools/gate-answer.js +65 -0
  388. package/esm/src/kernel/tools/handler-events.d.ts +45 -0
  389. package/esm/src/kernel/tools/handler-events.js +106 -0
  390. package/esm/src/kernel/tools/harness.d.ts +17 -0
  391. package/esm/src/kernel/tools/harness.js +43 -0
  392. package/esm/src/kernel/tools/http-limit.d.ts +27 -0
  393. package/esm/src/kernel/tools/http-limit.js +85 -0
  394. package/esm/src/kernel/tools/invoke.d.ts +32 -0
  395. package/esm/src/kernel/tools/invoke.js +282 -0
  396. package/esm/src/kernel/tools/mcp-sessions.d.ts +23 -0
  397. package/esm/src/kernel/tools/mcp-sessions.js +69 -0
  398. package/esm/src/kernel/tools/mod.d.ts +10 -0
  399. package/esm/src/kernel/tools/mod.js +7 -0
  400. package/esm/src/kernel/tools/model-text.d.ts +16 -0
  401. package/esm/src/kernel/tools/model-text.js +31 -0
  402. package/esm/src/kernel/tools/operation.d.ts +76 -0
  403. package/esm/src/kernel/tools/operation.js +100 -0
  404. package/esm/src/kernel/tools/page-answer.d.ts +8 -0
  405. package/esm/src/kernel/tools/page-answer.js +19 -0
  406. package/esm/src/kernel/tools/permission.d.ts +15 -0
  407. package/esm/src/kernel/tools/permission.js +38 -0
  408. package/esm/src/kernel/tools/project.d.ts +11 -0
  409. package/esm/src/kernel/tools/project.js +55 -0
  410. package/esm/src/kernel/tools/registry.d.ts +27 -0
  411. package/esm/src/kernel/tools/registry.js +143 -0
  412. package/esm/src/kernel/tools/remote.d.ts +144 -0
  413. package/esm/src/kernel/tools/remote.js +1125 -0
  414. package/esm/src/kernel/tools/resolve.d.ts +31 -0
  415. package/esm/src/kernel/tools/resolve.js +267 -0
  416. package/esm/src/kernel/tools/run.d.ts +28 -0
  417. package/esm/src/kernel/tools/run.js +86 -0
  418. package/esm/src/kernel/tools/schema.d.ts +10 -0
  419. package/esm/src/kernel/tools/schema.js +95 -0
  420. package/esm/src/kernel/tools/signed-in-fetch.d.ts +19 -0
  421. package/esm/src/kernel/tools/signed-in-fetch.js +45 -0
  422. package/esm/src/kernel/tools/stage-run.d.ts +116 -0
  423. package/esm/src/kernel/tools/stage-run.js +198 -0
  424. package/esm/src/kernel/tools/types.d.ts +497 -0
  425. package/esm/src/kernel/tools/types.js +1 -0
  426. package/esm/src/kernel/tools/unchecked-output.d.ts +14 -0
  427. package/esm/src/kernel/tools/unchecked-output.js +18 -0
  428. package/esm/src/kernel/turn-events.d.ts +776 -0
  429. package/esm/src/kernel/turn-events.js +543 -0
  430. package/esm/src/kernel/types.d.ts +1025 -0
  431. package/esm/src/kernel/types.js +1 -0
  432. package/esm/src/kernel/util/base64.d.ts +4 -0
  433. package/esm/src/kernel/util/base64.js +15 -0
  434. package/esm/src/kernel/util/exact-type.d.ts +31 -0
  435. package/esm/src/kernel/util/exact-type.js +1 -0
  436. package/esm/src/kernel/util/find-last.d.ts +3 -0
  437. package/esm/src/kernel/util/find-last.js +9 -0
  438. package/esm/src/kernel/util/mime.d.ts +2 -0
  439. package/esm/src/kernel/util/mime.js +4 -0
  440. package/esm/src/kernel/util/partial-json.d.ts +23 -0
  441. package/esm/src/kernel/util/partial-json.js +128 -0
  442. package/esm/src/kernel/util/record.d.ts +2 -0
  443. package/esm/src/kernel/util/record.js +4 -0
  444. package/esm/src/observability/destinations.d.ts +14 -0
  445. package/esm/src/observability/destinations.js +43 -0
  446. package/esm/src/observability/jsonl.d.ts +18 -0
  447. package/esm/src/observability/jsonl.js +110 -0
  448. package/esm/src/observability/mod.d.ts +22 -0
  449. package/esm/src/observability/mod.js +16 -0
  450. package/esm/src/observability/openinference.d.ts +11 -0
  451. package/esm/src/observability/openinference.js +205 -0
  452. package/esm/src/observability/otlp.d.ts +71 -0
  453. package/esm/src/observability/otlp.js +98 -0
  454. package/esm/src/observability/phoenix.d.ts +30 -0
  455. package/esm/src/observability/phoenix.js +71 -0
  456. package/esm/src/observability/policy.d.ts +17 -0
  457. package/esm/src/observability/policy.js +73 -0
  458. package/esm/src/observability/resolve-policy.d.ts +8 -0
  459. package/esm/src/observability/resolve-policy.js +64 -0
  460. package/esm/src/observability/spans.d.ts +22 -0
  461. package/esm/src/observability/spans.js +72 -0
  462. package/esm/src/observability/trace-catalog.d.ts +128 -0
  463. package/esm/src/observability/trace-catalog.js +906 -0
  464. package/esm/src/observability/trace-record.d.ts +23 -0
  465. package/esm/src/observability/trace-record.js +228 -0
  466. package/esm/src/observability/trace-schema.d.ts +57 -0
  467. package/esm/src/observability/trace-schema.js +59 -0
  468. package/esm/src/observability/trace-sink.d.ts +14 -0
  469. package/esm/src/observability/trace-sink.js +3 -0
  470. package/esm/src/observability/trace-span.d.ts +98 -0
  471. package/esm/src/observability/trace-span.js +201 -0
  472. package/esm/src/observability/trace.d.ts +13 -0
  473. package/esm/src/observability/trace.js +37 -0
  474. package/esm/src/observability/types.d.ts +109 -0
  475. package/esm/src/observability/types.js +3 -0
  476. package/esm/src/presets/google/speech-voices.d.ts +9 -0
  477. package/esm/src/presets/google/speech-voices.js +38 -0
  478. package/esm/src/presets/google-limits.d.ts +13 -0
  479. package/esm/src/presets/google-limits.js +18 -0
  480. package/esm/src/presets/google.d.ts +119 -0
  481. package/esm/src/presets/google.js +197 -0
  482. package/esm/src/presets/local.d.ts +26 -0
  483. package/esm/src/presets/local.js +30 -0
  484. package/esm/src/presets/mod.d.ts +11 -0
  485. package/esm/src/presets/mod.js +9 -0
  486. package/esm/src/presets/openrouter.d.ts +26 -0
  487. package/esm/src/presets/openrouter.js +31 -0
  488. package/esm/src/providers/embedding-limits.d.ts +7 -0
  489. package/esm/src/providers/embedding-limits.js +12 -0
  490. package/esm/src/providers/gemini/embedding-protocol.d.ts +8 -0
  491. package/esm/src/providers/gemini/embedding-protocol.js +125 -0
  492. package/esm/src/providers/gemini/interactions-protocol.d.ts +8 -0
  493. package/esm/src/providers/gemini/interactions-protocol.js +105 -0
  494. package/esm/src/providers/gemini/live-protocol.d.ts +3 -0
  495. package/esm/src/providers/gemini/live-protocol.js +191 -0
  496. package/esm/src/providers/gemini/prices.d.ts +3 -0
  497. package/esm/src/providers/gemini/prices.js +63 -0
  498. package/esm/src/providers/gemini/provider.d.ts +7 -0
  499. package/esm/src/providers/gemini/provider.js +39 -0
  500. package/esm/src/providers/google/api-error.d.ts +8 -0
  501. package/esm/src/providers/google/api-error.js +123 -0
  502. package/esm/src/providers/google/builtins.d.ts +14 -0
  503. package/esm/src/providers/google/builtins.js +57 -0
  504. package/esm/src/providers/google/grounding.d.ts +5 -0
  505. package/esm/src/providers/google/grounding.js +226 -0
  506. package/esm/src/providers/google/interactions/framing.d.ts +27 -0
  507. package/esm/src/providers/google/interactions/framing.js +304 -0
  508. package/esm/src/providers/google/interactions/steps.d.ts +12 -0
  509. package/esm/src/providers/google/interactions/steps.js +200 -0
  510. package/esm/src/providers/google/interactions/stream.d.ts +23 -0
  511. package/esm/src/providers/google/interactions/stream.js +230 -0
  512. package/esm/src/providers/google/live/framing.d.ts +61 -0
  513. package/esm/src/providers/google/live/framing.js +597 -0
  514. package/esm/src/providers/google/live/stream.d.ts +13 -0
  515. package/esm/src/providers/google/live/stream.js +57 -0
  516. package/esm/src/providers/google/thinking.d.ts +3 -0
  517. package/esm/src/providers/google/thinking.js +8 -0
  518. package/esm/src/providers/google/urls.d.ts +4 -0
  519. package/esm/src/providers/google/urls.js +4 -0
  520. package/esm/src/providers/google/usage.d.ts +7 -0
  521. package/esm/src/providers/google/usage.js +49 -0
  522. package/esm/src/providers/live.d.ts +6 -0
  523. package/esm/src/providers/live.js +6 -0
  524. package/esm/src/providers/local/embedding-protocol.d.ts +7 -0
  525. package/esm/src/providers/local/embedding-protocol.js +60 -0
  526. package/esm/src/providers/local/provider.d.ts +7 -0
  527. package/esm/src/providers/local/provider.js +28 -0
  528. package/esm/src/providers/mod.d.ts +32 -0
  529. package/esm/src/providers/mod.js +23 -0
  530. package/esm/src/providers/open-ai/protocol.d.ts +3 -0
  531. package/esm/src/providers/open-ai/protocol.js +189 -0
  532. package/esm/src/providers/openrouter/embedding-protocol.d.ts +6 -0
  533. package/esm/src/providers/openrouter/embedding-protocol.js +86 -0
  534. package/esm/src/providers/openrouter/image.d.ts +15 -0
  535. package/esm/src/providers/openrouter/image.js +34 -0
  536. package/esm/src/providers/openrouter/images-protocol.d.ts +3 -0
  537. package/esm/src/providers/openrouter/images-protocol.js +82 -0
  538. package/esm/src/providers/openrouter/openai/compat.d.ts +19 -0
  539. package/esm/src/providers/openrouter/openai/compat.js +162 -0
  540. package/esm/src/providers/openrouter/openai/image-payload.d.ts +9 -0
  541. package/esm/src/providers/openrouter/openai/image-payload.js +115 -0
  542. package/esm/src/providers/openrouter/openai/reasoning-state.d.ts +2 -0
  543. package/esm/src/providers/openrouter/openai/reasoning-state.js +31 -0
  544. package/esm/src/providers/openrouter/openai/usage.d.ts +8 -0
  545. package/esm/src/providers/openrouter/openai/usage.js +56 -0
  546. package/esm/src/providers/openrouter/protocol.d.ts +8 -0
  547. package/esm/src/providers/openrouter/protocol.js +171 -0
  548. package/esm/src/providers/openrouter/provider.d.ts +10 -0
  549. package/esm/src/providers/openrouter/provider.js +50 -0
  550. package/esm/src/providers/shared/carried-tool-files.d.ts +7 -0
  551. package/esm/src/providers/shared/carried-tool-files.js +43 -0
  552. package/esm/src/providers/shared/pcm.d.ts +14 -0
  553. package/esm/src/providers/shared/pcm.js +78 -0
  554. package/esm/src/providers/shared/protocol-events.d.ts +8 -0
  555. package/esm/src/providers/shared/protocol-events.js +20 -0
  556. package/esm/src/providers/shared/response-identity.d.ts +11 -0
  557. package/esm/src/providers/shared/response-identity.js +12 -0
  558. package/esm/src/providers/shared/retry.d.ts +17 -0
  559. package/esm/src/providers/shared/retry.js +90 -0
  560. package/esm/src/providers/shared/sse.d.ts +6 -0
  561. package/esm/src/providers/shared/sse.js +93 -0
  562. package/esm/src/providers/shared/structured-output.d.ts +4 -0
  563. package/esm/src/providers/shared/structured-output.js +11 -0
  564. package/esm/src/providers/shared/tool-args.d.ts +24 -0
  565. package/esm/src/providers/shared/tool-args.js +88 -0
  566. package/esm/src/providers/shared/tool-draft.d.ts +16 -0
  567. package/esm/src/providers/shared/tool-draft.js +14 -0
  568. package/esm/src/providers/shared/upstream-tap.d.ts +8 -0
  569. package/esm/src/providers/shared/upstream-tap.js +85 -0
  570. package/esm/src/providers/shared/upstream-tape.d.ts +6 -0
  571. package/esm/src/providers/shared/upstream-tape.js +88 -0
  572. package/esm/src/providers/system-one/protocol.d.ts +8 -0
  573. package/esm/src/providers/system-one/protocol.js +93 -0
  574. package/esm/src/providers/types.d.ts +51 -0
  575. package/esm/src/providers/types.js +2 -0
  576. package/esm/src/providers/typesafe/provider.d.ts +7 -0
  577. package/esm/src/providers/typesafe/provider.js +24 -0
  578. package/esm/src/surface/formats.d.ts +46 -0
  579. package/esm/src/surface/formats.js +178 -0
  580. package/esm/src/surface/mod.d.ts +16 -0
  581. package/esm/src/surface/mod.js +12 -0
  582. package/esm/src/surface/runtime.d.ts +44 -0
  583. package/esm/src/surface/runtime.js +441 -0
  584. package/esm/src/surface/tools.d.ts +9 -0
  585. package/esm/src/surface/tools.js +62 -0
  586. package/esm/src/surface/types.d.ts +110 -0
  587. package/esm/src/surface/types.js +4 -0
  588. package/package.json +100 -4
@@ -0,0 +1,205 @@
1
+ /**
2
+ * OpenInference attributes for Phoenix, whose message views, reasoning tokens, and cost read only
3
+ * OpenInference names; they are copied beside the semconv names so `toOtlpJson` stays neutral.
4
+ *
5
+ * @module
6
+ */
7
+ import "../../_dnt.polyfills.js";
8
+ import { isRecord } from '../kernel/util/record.js';
9
+ import { inlineContent } from './trace-record.js';
10
+ const MODEL_CALLS = new Set(['chat', 'generate_content']);
11
+ const AGENT_CALLS = new Set(['invoke_agent']);
12
+ /** A decision (`theorem.decision.*`): one model call over JSON state, with no messages. */
13
+ const DECISION = 'decide';
14
+ /** Eval spans carry no semconv operation: a trial grades one turn, a run chains the trials. */
15
+ const EVAL_KINDS = {
16
+ 'theorem.eval.trial': 'EVALUATOR',
17
+ 'theorem.eval.run': 'CHAIN',
18
+ };
19
+ /** Model calls only: a viewer sums usage across a trace, and an agent span's is already a sum. */
20
+ function openInferenceUsage(attributes) {
21
+ const reasoning = attributes['gen_ai.usage.reasoning.output_tokens'];
22
+ const cost = attributes['theorem.usage.cost_usd'];
23
+ return {
24
+ ...(typeof reasoning === 'number'
25
+ ? { 'llm.token_count.completion_details.reasoning': reasoning }
26
+ : {}),
27
+ // why: A partial cost would read as the call's total; it keeps only its theorem.* name.
28
+ ...(typeof cost === 'number' && attributes['theorem.usage.cost_partial'] !== true
29
+ ? { 'llm.cost.total': cost }
30
+ : {}),
31
+ };
32
+ }
33
+ function messagesOf(record, value) {
34
+ const inlined = inlineContent(record, value);
35
+ if (!Array.isArray(inlined))
36
+ return [];
37
+ return inlined.flatMap((message) => {
38
+ if (!isRecord(message) || typeof message.role !== 'string')
39
+ return [];
40
+ const parts = Array.isArray(message.parts) ? message.parts.filter(isRecord) : [];
41
+ return [{ role: message.role, parts: parts }];
42
+ });
43
+ }
44
+ function partText(part) {
45
+ if (part.type === 'text' && typeof part.content === 'string')
46
+ return part.content;
47
+ if (part.type === 'structured' && part.content !== undefined)
48
+ return JSON.stringify(part.content);
49
+ if (part.type === 'tool_call' || part.type === 'tool_call_response')
50
+ return undefined;
51
+ if (typeof part.modality === 'string')
52
+ return `[${part.modality}]`;
53
+ return undefined;
54
+ }
55
+ /** A text part that repeats the structured part's JSON is shown once, as the JSON. */
56
+ function repeatsStructured(part, structured) {
57
+ if (structured === undefined || part.type !== 'text' || typeof part.content !== 'string') {
58
+ return false;
59
+ }
60
+ try {
61
+ return JSON.stringify(JSON.parse(part.content)) === JSON.stringify(structured.content);
62
+ }
63
+ catch {
64
+ return false;
65
+ }
66
+ }
67
+ function messageText(message) {
68
+ const structured = message.parts.find((part) => part.type === 'structured');
69
+ return message.parts
70
+ .filter((part) => !repeatsStructured(part, structured))
71
+ .flatMap((part) => partText(part) ?? [])
72
+ .join('\n');
73
+ }
74
+ function messageAttributes(prefix, message) {
75
+ const out = { [`${prefix}.message.role`]: message.role };
76
+ const text = messageText(message);
77
+ if (text !== '')
78
+ out[`${prefix}.message.content`] = text;
79
+ let calls = 0;
80
+ for (const part of message.parts) {
81
+ if (part.type === 'tool_call') {
82
+ const call = `${prefix}.message.tool_calls.${calls}.tool_call`;
83
+ calls += 1;
84
+ if (typeof part.id === 'string')
85
+ out[`${call}.id`] = part.id;
86
+ if (typeof part.name === 'string')
87
+ out[`${call}.function.name`] = part.name;
88
+ if (typeof part.arguments === 'string')
89
+ out[`${call}.function.arguments`] = part.arguments;
90
+ }
91
+ else if (part.type === 'tool_call_response') {
92
+ if (typeof part.id === 'string')
93
+ out[`${prefix}.message.tool_call_id`] = part.id;
94
+ if (typeof part.response === 'string')
95
+ out[`${prefix}.message.content`] = part.response;
96
+ }
97
+ }
98
+ return out;
99
+ }
100
+ function messagesAttributes(key, messages) {
101
+ return Object.assign({}, ...messages.map((message, index) => messageAttributes(`${key}.${index}`, message)));
102
+ }
103
+ /** `input.value` / `output.value`: the text a person would read, else the messages as JSON. */
104
+ function valueAttributes(side, messages) {
105
+ if (messages.length === 0)
106
+ return {};
107
+ const texts = messages.map(messageText).filter((text) => text !== '');
108
+ if (texts.length === messages.length && texts.length === 1 && texts[0] !== undefined) {
109
+ return { [`${side}.value`]: texts[0], [`${side}.mime_type`]: 'text/plain' };
110
+ }
111
+ return {
112
+ [`${side}.value`]: JSON.stringify(messages.map((message) => ({ role: message.role, content: messageText(message) }))),
113
+ [`${side}.mime_type`]: 'application/json',
114
+ };
115
+ }
116
+ function openInferenceModelMessages(record, span) {
117
+ const system = messagesOf(record, span.attributes['gen_ai.system_instructions'] === undefined
118
+ ? undefined
119
+ : [{ role: 'system', parts: span.attributes['gen_ai.system_instructions'] }]);
120
+ const input = [...system, ...messagesOf(record, span.attributes['gen_ai.input.messages'])];
121
+ const output = messagesOf(record, span.attributes['gen_ai.output.messages'] ?? span.attributes['theorem.output.delivered']);
122
+ return {
123
+ ...messagesAttributes('llm.input_messages', input),
124
+ ...messagesAttributes('llm.output_messages', output),
125
+ ...valueAttributes('input', input.filter((message) => message.role !== 'system')),
126
+ ...valueAttributes('output', output),
127
+ };
128
+ }
129
+ function openInferenceAgentValues(record, span) {
130
+ return {
131
+ ...valueAttributes('input', messagesOf(record, span.attributes['gen_ai.input.messages'])),
132
+ ...valueAttributes('output', messagesOf(record, span.attributes['gen_ai.output.messages'])),
133
+ };
134
+ }
135
+ function jsonValue(record, side, value) {
136
+ if (value === undefined)
137
+ return {};
138
+ return {
139
+ [`${side}.value`]: JSON.stringify(inlineContent(record, value)),
140
+ [`${side}.mime_type`]: 'application/json',
141
+ };
142
+ }
143
+ /**
144
+ * Phoenix derives no kind for an operation semconv does not name, and has no price for Jev, so
145
+ * the kind, model, tokens, and cost are stated. It has no messages, so Phoenix cannot replay it.
146
+ */
147
+ function openInferenceDecision(record, span) {
148
+ const { attributes } = span;
149
+ const input = attributes['gen_ai.usage.input_tokens'];
150
+ const output = attributes['gen_ai.usage.output_tokens'];
151
+ const model = attributes['gen_ai.response.model'] ?? attributes['gen_ai.request.model'];
152
+ return {
153
+ 'openinference.span.kind': 'LLM',
154
+ ...(typeof model === 'string' ? { 'llm.model_name': model } : {}),
155
+ ...(typeof attributes['gen_ai.provider.name'] === 'string'
156
+ ? { 'llm.provider': attributes['gen_ai.provider.name'] }
157
+ : {}),
158
+ ...(typeof input === 'number' ? { 'llm.token_count.prompt': input } : {}),
159
+ ...(typeof output === 'number' ? { 'llm.token_count.completion': output } : {}),
160
+ ...(typeof input === 'number' && typeof output === 'number'
161
+ ? { 'llm.token_count.total': input + output }
162
+ : {}),
163
+ ...openInferenceUsage(attributes),
164
+ ...jsonValue(record, 'input', attributes['theorem.decision.state']),
165
+ ...jsonValue(record, 'output', attributes['theorem.decision.answers']),
166
+ };
167
+ }
168
+ function withSpanAttributes(record, span) {
169
+ const operation = span.attributes['gen_ai.operation.name'];
170
+ if (MODEL_CALLS.has(operation)) {
171
+ return {
172
+ ...span,
173
+ attributes: {
174
+ ...span.attributes,
175
+ ...openInferenceUsage(span.attributes),
176
+ ...openInferenceModelMessages(record, span),
177
+ },
178
+ };
179
+ }
180
+ if (AGENT_CALLS.has(operation)) {
181
+ return {
182
+ ...span,
183
+ attributes: { ...span.attributes, ...openInferenceAgentValues(record, span) },
184
+ };
185
+ }
186
+ if (operation === DECISION) {
187
+ return {
188
+ ...span,
189
+ attributes: { ...span.attributes, ...openInferenceDecision(record, span) },
190
+ };
191
+ }
192
+ const evalKind = EVAL_KINDS[span.name];
193
+ if (evalKind !== undefined) {
194
+ return { ...span, attributes: { ...span.attributes, 'openinference.span.kind': evalKind } };
195
+ }
196
+ return span;
197
+ }
198
+ /** Pure: input records are not changed. Export with `toOtlpJson(withOpenInference(records))`. */
199
+ function withOpenInference(records) {
200
+ return records.map((record) => ({
201
+ ...record,
202
+ spans: record.spans.map((span) => withSpanAttributes(record, span)),
203
+ }));
204
+ }
205
+ export { withOpenInference };
@@ -0,0 +1,71 @@
1
+ import { type TraceRecord } from './trace-record.js';
2
+ /** An OTLP/JSON attribute value. */
3
+ type OtlpAnyValue = {
4
+ stringValue: string;
5
+ } | {
6
+ boolValue: boolean;
7
+ } | {
8
+ intValue: string;
9
+ } | {
10
+ doubleValue: number;
11
+ } | {
12
+ arrayValue: {
13
+ values: OtlpAnyValue[];
14
+ };
15
+ } | {
16
+ kvlistValue: {
17
+ values: OtlpKeyValue[];
18
+ };
19
+ };
20
+ /** An OTLP/JSON attribute: a key and its value. */
21
+ interface OtlpKeyValue {
22
+ key: string;
23
+ value: OtlpAnyValue;
24
+ }
25
+ /** A span as OTLP/JSON carries it. */
26
+ interface OtlpSpan {
27
+ traceId: string;
28
+ spanId: string;
29
+ parentSpanId?: string;
30
+ name: string;
31
+ kind: number;
32
+ startTimeUnixNano: string;
33
+ endTimeUnixNano: string;
34
+ attributes: OtlpKeyValue[];
35
+ events: {
36
+ timeUnixNano: string;
37
+ name: string;
38
+ attributes: OtlpKeyValue[];
39
+ }[];
40
+ links: {
41
+ traceId: string;
42
+ spanId: string;
43
+ attributes: OtlpKeyValue[];
44
+ }[];
45
+ status: {
46
+ code: number;
47
+ message?: string;
48
+ };
49
+ }
50
+ /** An OTLP/JSON `ExportTraceServiceRequest` (the body of `POST /v1/traces`). */
51
+ interface OtlpTraceRequest {
52
+ resourceSpans: {
53
+ resource: {
54
+ attributes: OtlpKeyValue[];
55
+ };
56
+ scopeSpans: {
57
+ scope: {
58
+ name: string;
59
+ };
60
+ schemaUrl: string;
61
+ spans: OtlpSpan[];
62
+ }[];
63
+ }[];
64
+ }
65
+ /**
66
+ * One resource per record, one scope, with every stored reference inlined. For a backend that
67
+ * takes protobuf only, send this through an OpenTelemetry Collector.
68
+ */
69
+ declare function toOtlpJson(records: readonly TraceRecord[]): OtlpTraceRequest;
70
+ export type { OtlpAnyValue, OtlpKeyValue, OtlpSpan, OtlpTraceRequest };
71
+ export { toOtlpJson };
@@ -0,0 +1,98 @@
1
+ // why: OTLP has no record-level slot for `TraceRecord.metadata` (the resource is the service's
2
+ // identity), so each key lands on the record's top spans as `theorem.metadata.<key>`.
3
+ import { inlineContent } from './trace-record.js';
4
+ const SCOPE_NAME = '@theoremjs/agents';
5
+ const SPAN_KIND = { INTERNAL: 1, CLIENT: 3 };
6
+ const STATUS_CODE = { UNSET: 0, OK: 1, ERROR: 2 };
7
+ function anyValue(value) {
8
+ if (typeof value === 'string') {
9
+ return { stringValue: value };
10
+ }
11
+ if (typeof value === 'boolean') {
12
+ return { boolValue: value };
13
+ }
14
+ if (typeof value === 'number') {
15
+ // why: int64 is a decimal string in OTLP/JSON.
16
+ return Number.isInteger(value) ? { intValue: String(value) } : { doubleValue: value };
17
+ }
18
+ if (Array.isArray(value)) {
19
+ return { arrayValue: { values: value.flatMap((item) => anyValue(item) ?? []) } };
20
+ }
21
+ if (value && typeof value === 'object') {
22
+ return { kvlistValue: { values: keyValues(value) } };
23
+ }
24
+ // why: null / undefined: OTLP has no empty value, so the key is left out.
25
+ return undefined;
26
+ }
27
+ function keyValues(fields) {
28
+ return Object.entries(fields).flatMap(([key, field]) => {
29
+ const value = anyValue(field);
30
+ return value ? [{ key, value }] : [];
31
+ });
32
+ }
33
+ function inlined(record, attributes) {
34
+ return keyValues(inlineContent(record, attributes));
35
+ }
36
+ const METADATA_PREFIX = 'theorem.metadata.';
37
+ function metadataAttributes(record) {
38
+ return keyValues(record.metadata ?? {}).map(({ key, value }) => ({
39
+ key: `${METADATA_PREFIX}${key}`,
40
+ value,
41
+ }));
42
+ }
43
+ /** Includes the root, which may hang under a host `traceparent` span that lives elsewhere. */
44
+ function topSpanIds(record) {
45
+ const ids = new Set(record.spans.map((span) => span.spanId));
46
+ return new Set(record.spans
47
+ .filter((span) => !(span.parentSpanId && ids.has(span.parentSpanId)))
48
+ .map((span) => span.spanId));
49
+ }
50
+ function otlpSpan(record, span, metadata) {
51
+ return {
52
+ traceId: span.traceId,
53
+ spanId: span.spanId,
54
+ ...(span.parentSpanId ? { parentSpanId: span.parentSpanId } : {}),
55
+ name: span.name,
56
+ kind: SPAN_KIND[span.kind],
57
+ startTimeUnixNano: span.startTimeUnixNano,
58
+ endTimeUnixNano: span.endTimeUnixNano,
59
+ attributes: [...inlined(record, span.attributes), ...metadata],
60
+ events: span.events.map((event) => ({
61
+ timeUnixNano: event.timeUnixNano,
62
+ name: event.name,
63
+ attributes: inlined(record, event.attributes),
64
+ })),
65
+ links: span.links.map((link) => ({
66
+ traceId: link.traceId,
67
+ spanId: link.spanId,
68
+ attributes: inlined(record, link.attributes),
69
+ })),
70
+ status: {
71
+ code: STATUS_CODE[span.status.code],
72
+ ...(span.status.message ? { message: span.status.message } : {}),
73
+ },
74
+ };
75
+ }
76
+ /**
77
+ * One resource per record, one scope, with every stored reference inlined. For a backend that
78
+ * takes protobuf only, send this through an OpenTelemetry Collector.
79
+ */
80
+ function toOtlpJson(records) {
81
+ return {
82
+ resourceSpans: records.map((record) => {
83
+ const top = topSpanIds(record);
84
+ const metadata = metadataAttributes(record);
85
+ return {
86
+ resource: { attributes: keyValues(record.resource) },
87
+ scopeSpans: [
88
+ {
89
+ scope: { name: SCOPE_NAME },
90
+ schemaUrl: record.schemaUrl,
91
+ spans: record.spans.map((span) => otlpSpan(record, span, top.has(span.spanId) ? metadata : [])),
92
+ },
93
+ ],
94
+ };
95
+ }),
96
+ };
97
+ }
98
+ export { toOtlpJson };
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Eval results as Phoenix span annotations, which Phoenix reads over REST
3
+ * (`POST /v1/span_annotations`), not OTLP. Pure: it builds the body, the host posts it.
4
+ *
5
+ * @module
6
+ */
7
+ import "../../_dnt.polyfills.js";
8
+ import { type TraceRecord } from './trace-record.js';
9
+ /** A Phoenix annotation on a judged trial span: its name, whether an LLM judge or a code grader produced it, the result, and metadata. */
10
+ interface PhoenixSpanAnnotation {
11
+ /** The judged root span, as OTLP hex. */
12
+ span_id: string;
13
+ name: string;
14
+ /** `LLM` for a judge's result, `CODE` for a code grader's. */
15
+ annotator_kind: 'LLM' | 'CODE';
16
+ result: {
17
+ label?: string;
18
+ score?: number;
19
+ explanation?: string;
20
+ };
21
+ metadata: Record<string, string | number | boolean>;
22
+ }
23
+ /**
24
+ * Each annotation lands on the root the trial judged. Send as
25
+ * `{ data: phoenixAnnotations(records) }`; Phoenix keeps one annotation per span and name, so
26
+ * grading a record again replaces them.
27
+ */
28
+ declare function phoenixAnnotations(records: readonly TraceRecord[]): PhoenixSpanAnnotation[];
29
+ export type { PhoenixSpanAnnotation };
30
+ export { phoenixAnnotations };
@@ -0,0 +1,71 @@
1
+ /**
2
+ * Eval results as Phoenix span annotations, which Phoenix reads over REST
3
+ * (`POST /v1/span_annotations`), not OTLP. Pure: it builds the body, the host posts it.
4
+ *
5
+ * @module
6
+ */
7
+ import "../../_dnt.polyfills.js";
8
+ import { inlineContent } from './trace-record.js';
9
+ const TRIAL_SPAN = 'theorem.eval.trial';
10
+ const RESULT_EVENT = 'gen_ai.evaluation.result';
11
+ function scalar(value) {
12
+ return typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean'
13
+ ? value
14
+ : undefined;
15
+ }
16
+ function present(entries) {
17
+ const kept = {};
18
+ for (const [key, value] of Object.entries(entries))
19
+ if (value !== undefined)
20
+ kept[key] = value;
21
+ return kept;
22
+ }
23
+ /** `undefined` when the policy did not keep the explanation. */
24
+ function explanationOf(record, value) {
25
+ if (value === undefined)
26
+ return undefined;
27
+ const text = inlineContent(record, value);
28
+ return typeof text === 'string' ? text : undefined;
29
+ }
30
+ function annotation(record, span, attributes) {
31
+ const name = attributes['gen_ai.evaluation.name'];
32
+ if (typeof name !== 'string')
33
+ return undefined;
34
+ const label = attributes['gen_ai.evaluation.score.label'];
35
+ const score = attributes['gen_ai.evaluation.score.value'];
36
+ const explanation = explanationOf(record, attributes['gen_ai.evaluation.explanation']);
37
+ return {
38
+ span_id: span.parentSpanId,
39
+ name,
40
+ annotator_kind: attributes['theorem.evaluation.source'] === 'model' ? 'LLM' : 'CODE',
41
+ result: {
42
+ ...(typeof label === 'string' ? { label } : {}),
43
+ ...(typeof score === 'number' ? { score } : {}),
44
+ ...(explanation === undefined ? {} : { explanation }),
45
+ },
46
+ metadata: present({
47
+ suite: scalar(span.attributes['theorem.evaluation.suite']),
48
+ case: scalar(span.attributes['theorem.evaluation.case']),
49
+ trial: scalar(span.attributes['theorem.evaluation.trial']),
50
+ passed: scalar(attributes['theorem.evaluation.passed']),
51
+ error_type: scalar(attributes['error.type']),
52
+ grader_version: scalar(attributes['theorem.evaluation.grader.version']),
53
+ }),
54
+ };
55
+ }
56
+ /**
57
+ * Each annotation lands on the root the trial judged. Send as
58
+ * `{ data: phoenixAnnotations(records) }`; Phoenix keeps one annotation per span and name, so
59
+ * grading a record again replaces them.
60
+ */
61
+ function phoenixAnnotations(records) {
62
+ return records.flatMap((record) => record.spans.flatMap((span) => {
63
+ if (span.name !== TRIAL_SPAN || span.parentSpanId === undefined)
64
+ return [];
65
+ const trial = { ...span, parentSpanId: span.parentSpanId };
66
+ return span.events
67
+ .filter((event) => event.name === RESULT_EVENT)
68
+ .flatMap((event) => annotation(record, trial, event.attributes) ?? []);
69
+ }));
70
+ }
71
+ export { phoenixAnnotations };
@@ -0,0 +1,17 @@
1
+ import type { ProfileGuardrailsSpec } from '../guardrails/types.js';
2
+ import type { TraceSink } from './trace-sink.js';
3
+ import type { ProfileObservabilitySpec, ResolvedObservabilityPolicy } from './types.js';
4
+ /**
5
+ * Precedence: explicit `override` (runTurn's third arg), then profile `writeTo`, then noop. An
6
+ * override always records, ignoring `sampleRate`, so tests and one-off capture are deterministic.
7
+ */
8
+ declare function resolveTraceWriter(args: {
9
+ override?: TraceSink;
10
+ observability?: ProfileObservabilitySpec;
11
+ /** The profile's guardrails: the patterns a host gave its detectors clean the record too. */
12
+ guardrails?: ProfileGuardrailsSpec;
13
+ }): {
14
+ sink: TraceSink;
15
+ policy: ResolvedObservabilityPolicy;
16
+ };
17
+ export { resolveTraceWriter };
@@ -0,0 +1,73 @@
1
+ import { resolveGuardrailPolicy } from '../guardrails/policy.js';
2
+ import { requireTraceDestination } from './destinations.js';
3
+ import { resolveObservabilityPolicy } from './resolve-policy.js';
4
+ import { noopSink } from './trace.js';
5
+ function bindOnWriteError(sink, onWriteError) {
6
+ if (!onWriteError && !sink.onError) {
7
+ return sink;
8
+ }
9
+ return {
10
+ write: (record, context) => sink.write(record, context),
11
+ onError: sink.onError ?? onWriteError,
12
+ };
13
+ }
14
+ /** Trace-id bits the sampling decision reads: the low 32 (8 hex digits). */
15
+ const SAMPLE_HEX_DIGITS = 8;
16
+ const SAMPLE_SPACE = 2 ** 32;
17
+ /**
18
+ * Decided by trace id (OpenTelemetry `TraceIdRatioBased`), so every record of one trace (a turn,
19
+ * its specialists, a Live session's responses, a host's cutout) is kept or dropped together.
20
+ */
21
+ function traceSampled(record, sampleRate) {
22
+ const traceId = record.spans[0]?.traceId ?? '';
23
+ return Number.parseInt(traceId.slice(-SAMPLE_HEX_DIGITS), 16) / SAMPLE_SPACE < sampleRate;
24
+ }
25
+ function withSampleRate(sink, sampleRate) {
26
+ if (sampleRate >= 1) {
27
+ return sink;
28
+ }
29
+ if (sampleRate <= 0) {
30
+ return noopSink();
31
+ }
32
+ return {
33
+ write: async (record, context) => {
34
+ if (traceSampled(record, sampleRate)) {
35
+ await sink.write(record, context);
36
+ }
37
+ },
38
+ onError: sink.onError,
39
+ };
40
+ }
41
+ function sinkFromWriteTo(writeTo, policy) {
42
+ if (writeTo === undefined || writeTo === false) {
43
+ return noopSink();
44
+ }
45
+ if (typeof writeTo !== 'string') {
46
+ return bindOnWriteError(writeTo, policy.onWriteError);
47
+ }
48
+ return bindOnWriteError(requireTraceDestination(writeTo), policy.onWriteError);
49
+ }
50
+ /**
51
+ * Precedence: explicit `override` (runTurn's third arg), then profile `writeTo`, then noop. An
52
+ * override always records, ignoring `sampleRate`, so tests and one-off capture are deterministic.
53
+ */
54
+ function resolveTraceWriter(args) {
55
+ const policy = {
56
+ ...resolveObservabilityPolicy(args.observability),
57
+ detect: resolveGuardrailPolicy(args.guardrails).detect,
58
+ };
59
+ if (args.override) {
60
+ return {
61
+ policy,
62
+ sink: bindOnWriteError(args.override, policy.onWriteError),
63
+ };
64
+ }
65
+ if (!policy.record) {
66
+ return { policy, sink: noopSink() };
67
+ }
68
+ return {
69
+ policy,
70
+ sink: withSampleRate(sinkFromWriteTo(policy.writeTo, policy), policy.sampleRate),
71
+ };
72
+ }
73
+ export { resolveTraceWriter };
@@ -0,0 +1,8 @@
1
+ import type { ProfileObservabilitySpec, ResolvedObservabilityPolicy } from './types.js';
2
+ /** Default record retention in days; `<= 0` keeps records forever. */
3
+ declare const DEFAULT_RETAIN_DAYS = 14;
4
+ /** Default JSONL file size, in MiB, before the writer rotates to a new file. */
5
+ declare const DEFAULT_ROTATE_MIB = 32;
6
+ /** An omitted block or `writeTo: false` resolves `record: false`; `sampleRate` applies at write. */
7
+ declare function resolveObservabilityPolicy(spec: ProfileObservabilitySpec | undefined): ResolvedObservabilityPolicy;
8
+ export { DEFAULT_RETAIN_DAYS, DEFAULT_ROTATE_MIB, resolveObservabilityPolicy };
@@ -0,0 +1,64 @@
1
+ // why: Pure, with no sinks or file system, so kernel type consumers never pull the JSONL sink into their
2
+ // graph.
3
+ import { TheoremError } from '../guardrails/error.js';
4
+ /** Default record retention in days; `<= 0` keeps records forever. */
5
+ const DEFAULT_RETAIN_DAYS = 14;
6
+ /** Default JSONL file size, in MiB, before the writer rotates to a new file. */
7
+ const DEFAULT_ROTATE_MIB = 32;
8
+ function resolveInclude(spec) {
9
+ // why: No authored block records only through an explicit capture sink (tests,
10
+ // `runTurn(..., sink)`), which keeps wire and raw evidence. Authored blocks
11
+ // default those two off.
12
+ const authored = spec !== undefined;
13
+ return {
14
+ upstreamLog: spec?.include?.upstreamLog ?? true,
15
+ outboundWire: spec?.include?.outboundWire ?? !authored,
16
+ evidenceRaw: spec?.include?.evidenceRaw ?? !authored,
17
+ usage: spec?.include?.usage ?? true,
18
+ guardrailDecisions: spec?.include?.guardrailDecisions ?? true,
19
+ guardrailMatchPreview: spec?.include?.guardrailMatchPreview ?? false,
20
+ };
21
+ }
22
+ function resolveSwitch(spec) {
23
+ if (spec === undefined || typeof spec === 'boolean')
24
+ return spec ?? true;
25
+ const sides = { theorem: spec.theorem ?? true, host: spec.host ?? true };
26
+ return (sides.theorem || sides.host) && sides;
27
+ }
28
+ function resolveScrub(spec) {
29
+ return {
30
+ sensitive: resolveSwitch(spec?.scrub?.sensitive),
31
+ injection: resolveSwitch(spec?.scrub?.injection),
32
+ canary: resolveSwitch(spec?.scrub?.canary),
33
+ };
34
+ }
35
+ function clampSampleRate(value) {
36
+ if (value === undefined) {
37
+ return 1;
38
+ }
39
+ if (!Number.isFinite(value)) {
40
+ throw new TheoremError('config', 'observability.sampleRate must be a finite number');
41
+ }
42
+ if (value < 0 || value > 1) {
43
+ throw new TheoremError('config', 'observability.sampleRate must be between 0 and 1 inclusive');
44
+ }
45
+ return value;
46
+ }
47
+ /** An omitted block or `writeTo: false` resolves `record: false`; `sampleRate` applies at write. */
48
+ function resolveObservabilityPolicy(spec) {
49
+ const writeTo = spec?.writeTo;
50
+ const sampleRate = clampSampleRate(spec?.sampleRate);
51
+ const record = spec !== undefined && writeTo !== false && writeTo !== undefined;
52
+ return {
53
+ record,
54
+ writeTo,
55
+ sampleRate,
56
+ include: resolveInclude(spec),
57
+ scrub: resolveScrub(spec),
58
+ resource: { ...(spec?.resource ?? {}) },
59
+ retainForDays: spec?.retainForDays ?? DEFAULT_RETAIN_DAYS,
60
+ rotateAfterMiB: spec?.rotateAfterMiB ?? DEFAULT_ROTATE_MIB,
61
+ onWriteError: spec?.onWriteError,
62
+ };
63
+ }
64
+ export { DEFAULT_RETAIN_DAYS, DEFAULT_ROTATE_MIB, resolveObservabilityPolicy };
@@ -0,0 +1,22 @@
1
+ declare const OMIT_INJECTION = "[omitted - injection]";
2
+ declare const OMIT_SENSITIVE = "[omitted -sensitive]";
3
+ declare const OMIT_CANARY = "[omitted - canary]";
4
+ type RedactKind = 'injection' | 'sensitive' | 'canary' | 'prompt' | 'image' | 'link' | 'tool' | 'directive' | 'host';
5
+ interface RedactSpan {
6
+ start: number;
7
+ end: number;
8
+ kind: RedactKind;
9
+ /** The name of the host's pattern that matched; unset for a match of Theorem's own. */
10
+ name?: string;
11
+ /** What about the match makes it one, for a detector that finds more than one thing. */
12
+ signal?: string;
13
+ }
14
+ declare function blobAt(match: RegExpMatchArray): {
15
+ blob: string;
16
+ index: number;
17
+ } | undefined;
18
+ declare function mergeSpans(spans: RedactSpan[]): RedactSpan[];
19
+ declare function applySpans(text: string, spans: RedactSpan[]): string;
20
+ declare function spansFromPatterns(text: string, patterns: RegExp[], kind: RedactKind): RedactSpan[];
21
+ export type { RedactKind, RedactSpan };
22
+ export { applySpans, blobAt, mergeSpans, OMIT_CANARY, OMIT_INJECTION, OMIT_SENSITIVE, spansFromPatterns, };