@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,855 @@
1
+ import { errorKind } from '../../guardrails/error.js';
2
+ import { traceBytes, traceContent, traceJson, } from '../../observability/trace-span.js';
3
+ import { historyMessageParts } from '../interaction-parts.js';
4
+ import { isFailedStopKind } from '../stop.js';
5
+ import { findLast } from '../util/find-last.js';
6
+ import { asRecord } from './record.js';
7
+ import { sumEventTokens } from './usage.js';
8
+ const MS_PER_S = 1000;
9
+ const HTTP_ERROR = 400;
10
+ const HTTP_ROWS = new Set(['http_request', 'http_response', 'http_error_body', 'http_throw']);
11
+ /** Modalities semconv names under `gen_ai.usage.*`; others go under `theorem.usage.*`. */
12
+ const SEMCONV_MODALITIES = new Set(['text', 'image', 'audio']);
13
+ /** Stop kinds with a semconv `finish_reason` member; others keep the kernel's name. */
14
+ const FINISH_REASON = {
15
+ completed: 'stop',
16
+ length: 'length',
17
+ tool: 'tool_call',
18
+ filtered: 'content_filter',
19
+ provider_error: 'error',
20
+ };
21
+ function mediaModality(mimeType) {
22
+ const [kind] = mimeType.split('/');
23
+ return kind === 'application' || kind === 'text' || !kind ? 'document' : kind;
24
+ }
25
+ function tracePart(part) {
26
+ if (part.type === 'text') {
27
+ return { type: 'text', ...traceContent(part.text) };
28
+ }
29
+ if ('uri' in part) {
30
+ return { type: 'uri', modality: part.type, mime_type: part.mimeType, uri: part.uri };
31
+ }
32
+ return { type: 'blob', modality: part.type, mime_type: part.mimeType, ...traceBytes(part.data) };
33
+ }
34
+ function traceMessage(msg) {
35
+ const media = historyMessageParts(msg).map(tracePart);
36
+ if (msg.role === 'tool') {
37
+ const response = {
38
+ type: 'tool_call_response',
39
+ ...(msg.tool_call_id ? { id: msg.tool_call_id } : {}),
40
+ response: traceContent(msg.content ?? ''),
41
+ };
42
+ const extra = (msg.parts ?? []).map(tracePart);
43
+ return { role: 'tool', parts: [response, ...extra] };
44
+ }
45
+ const calls = (msg.tool_calls ?? []).map((call) => ({
46
+ type: 'tool_call',
47
+ id: call.id,
48
+ name: call.function.name,
49
+ arguments: traceContent(call.function.arguments),
50
+ }));
51
+ return { role: msg.role, parts: [...media, ...calls] };
52
+ }
53
+ /** Keyed by the call's usage record, which continuations already chain. */
54
+ const callMessages = new WeakMap();
55
+ /** Everything the model reads on `usage`'s call, and where the wire payload starts. */
56
+ function inputMessages(usage) {
57
+ const { conversation } = usage;
58
+ if ('previous' in conversation) {
59
+ const previous = callMessages.get(conversation.previous);
60
+ const stored = [...(previous?.input ?? []), ...(previous?.output ? [previous.output] : [])];
61
+ return {
62
+ input: [...stored, ...conversation.continuation.map(traceMessage)],
63
+ sentFrom: stored.length,
64
+ };
65
+ }
66
+ const opening = conversation.input.length > 0
67
+ ? [{ role: 'user', parts: conversation.input.map(tracePart) }]
68
+ : [];
69
+ return { input: [...conversation.history.map(traceMessage), ...opening] };
70
+ }
71
+ /** Output parts folded from provider events: adjacent deltas of one kind merge. */
72
+ class OutputFold {
73
+ parts = [];
74
+ open;
75
+ /** Each call's `tool_call` part by `callId`, for the failure that follows a malformed one. */
76
+ calls = new Map();
77
+ add(event, nowUnixNano) {
78
+ switch (event.type) {
79
+ case 'text':
80
+ this.appendText('text', event.text);
81
+ return;
82
+ case 'thought':
83
+ this.appendText('reasoning', event.text);
84
+ return;
85
+ case 'tool':
86
+ this.addTool(event.tool);
87
+ return;
88
+ case 'structured':
89
+ this.push({ type: 'structured', content: traceJson(event.structured ?? null) });
90
+ return;
91
+ case 'media':
92
+ this.push(mediaPart(event.media));
93
+ return;
94
+ case 'evidence': {
95
+ const { evidence } = event;
96
+ // why: Live transcription: labelled, never taken for the model's own text.
97
+ if (evidence.kind === 'input_transcription' || evidence.kind === 'output_transcription') {
98
+ this.appendText('text', event.text ?? '', evidence.kind, evidence.interim);
99
+ return;
100
+ }
101
+ const part = serverToolPart(evidence, nowUnixNano);
102
+ if (part)
103
+ this.push(part);
104
+ return;
105
+ }
106
+ case 'tool_draft':
107
+ case 'structured_draft':
108
+ // why: A preview of the call or reply that follows; that one is recorded whole.
109
+ return;
110
+ default:
111
+ return;
112
+ }
113
+ }
114
+ appendText(type, text,
115
+ /** A transcription kind, when the text is the provider's transcript. */
116
+ source, interim) {
117
+ if (!text)
118
+ return;
119
+ const key = `${type}:${source ?? ''}:${interim ? 'interim' : ''}`;
120
+ if (this.open?.key === key) {
121
+ this.open.text += text;
122
+ Object.assign(this.open.part, traceContent(this.open.text));
123
+ return;
124
+ }
125
+ const part = {
126
+ type,
127
+ ...traceContent(text),
128
+ ...optional('theorem.source', source),
129
+ ...(interim ? { 'theorem.interim': true } : {}),
130
+ };
131
+ this.parts.push(part);
132
+ this.open = { key, text, part };
133
+ }
134
+ /**
135
+ * The model's call as a `tool_call` part. A malformed call's failure follows
136
+ * it from the provider; the part then records the text the model sent.
137
+ */
138
+ addTool(tool) {
139
+ if (tool.phase === undefined) {
140
+ const part = toolCallPart(tool);
141
+ this.calls.set(tool.callId, part);
142
+ this.push(part);
143
+ return;
144
+ }
145
+ const call = this.calls.get(tool.callId);
146
+ const sent = tool.phase === 'error' ? sentArgumentsText(tool.failure) : undefined;
147
+ if (call && sent !== undefined)
148
+ Object.assign(call, { arguments: traceContent(sent) });
149
+ }
150
+ push(part) {
151
+ this.parts.push(part);
152
+ this.open = undefined;
153
+ }
154
+ }
155
+ /** The provider's raw text for arguments that did not parse (`details.raw`). */
156
+ function sentArgumentsText(failure) {
157
+ const raw = asRecord(failure?.details)?.raw;
158
+ return typeof raw === 'string' ? raw : undefined;
159
+ }
160
+ /**
161
+ * A tool call's arguments as the model sent them. Malformed arguments keep the
162
+ * provider's raw text; parsed ones are the same JSON the kernel sends back in
163
+ * history, so both hash alike.
164
+ */
165
+ function toolArgumentsText(call) {
166
+ return sentArgumentsText(call.failure) ?? JSON.stringify(call.arguments);
167
+ }
168
+ function toolCallPart(call) {
169
+ return {
170
+ type: 'tool_call',
171
+ id: call.callId,
172
+ name: call.name,
173
+ arguments: traceContent(toolArgumentsText(call)),
174
+ };
175
+ }
176
+ function mediaPart(media) {
177
+ return {
178
+ type: 'blob',
179
+ modality: mediaModality(media.mimeType),
180
+ mime_type: media.mimeType,
181
+ ...traceBytes(media.data),
182
+ };
183
+ }
184
+ const CALL_SUFFIX = '_call';
185
+ const RESULT_SUFFIX = '_result';
186
+ function serverToolStep(evidence) {
187
+ switch (evidence.kind) {
188
+ case 'code_execution_call':
189
+ return { side: 'call', name: 'code_execution', id: evidence.id };
190
+ case 'code_execution_result':
191
+ return { side: 'result', name: 'code_execution', id: evidence.callId };
192
+ case 'provider_step': {
193
+ const { step, raw } = evidence;
194
+ if (step.endsWith(CALL_SUFFIX)) {
195
+ const id = typeof raw?.id === 'string' ? raw.id : undefined;
196
+ return { side: 'call', name: step.slice(0, -CALL_SUFFIX.length), id };
197
+ }
198
+ if (step.endsWith(RESULT_SUFFIX)) {
199
+ const id = typeof raw?.call_id === 'string' ? raw.call_id : undefined;
200
+ return { side: 'result', name: step.slice(0, -RESULT_SUFFIX.length), id };
201
+ }
202
+ return undefined;
203
+ }
204
+ default:
205
+ return undefined;
206
+ }
207
+ }
208
+ /**
209
+ * A provider-run tool step as a semconv server tool part. The kernel sees a
210
+ * step only once it is whole, so its arrival is `theorem.observed_end`; the
211
+ * row events hold every earlier row's arrival.
212
+ */
213
+ function serverToolPart(evidence, nowUnixNano) {
214
+ const step = serverToolStep(evidence);
215
+ if (!step)
216
+ return undefined;
217
+ const observed = {
218
+ 'theorem.observed_end': nowUnixNano,
219
+ ...(evidence.partial ? { 'theorem.partial': true } : {}),
220
+ };
221
+ const payload = { ...traceJson(evidence.raw ?? {}), type: step.name };
222
+ if (step.side === 'call') {
223
+ return {
224
+ type: 'server_tool_call',
225
+ ...optional('id', step.id),
226
+ name: step.name,
227
+ server_tool_call: payload,
228
+ ...observed,
229
+ };
230
+ }
231
+ return {
232
+ type: 'server_tool_call_response',
233
+ ...optional('id', step.id),
234
+ server_tool_call_response: payload,
235
+ ...observed,
236
+ };
237
+ }
238
+ /** The raw evidence payload is recorded only with `evidenceRaw`. */
239
+ function groundingEvent(event) {
240
+ switch (event.type) {
241
+ case 'grounding': {
242
+ const { searchHtml, metadata, chunks } = event.grounding;
243
+ if (!searchHtml && !metadata && !chunks)
244
+ return undefined;
245
+ return {
246
+ ...(searchHtml ? { search_html: traceContent(searchHtml) } : {}),
247
+ ...(metadata || chunks ? { raw: traceJson({ metadata, chunks }) } : {}),
248
+ };
249
+ }
250
+ case 'citation':
251
+ return { sources: traceJson(event.sources) };
252
+ case 'evidence': {
253
+ const { evidence } = event;
254
+ if (serverToolStep(evidence))
255
+ return undefined;
256
+ if (evidence.kind === 'input_transcription' || evidence.kind === 'output_transcription') {
257
+ return undefined;
258
+ }
259
+ return {
260
+ provider: evidence.provider,
261
+ ...(evidence.raw ? { raw: traceJson(evidence.raw) } : {}),
262
+ };
263
+ }
264
+ default:
265
+ return undefined;
266
+ }
267
+ }
268
+ /**
269
+ * A guardrail decision as `theorem.guardrail` event attributes. The matched
270
+ * substring stays exact (not scrubbed: scrubbing it would erase what it shows);
271
+ * the record drops it unless the profile includes `guardrailMatchPreview`.
272
+ */
273
+ function guardrailAttributes(guardrail) {
274
+ return {
275
+ stage: guardrail.stage,
276
+ trust: guardrail.trust,
277
+ action: guardrail.action,
278
+ hits: guardrail.hits.map((hit) => ({
279
+ rule: hit.rule,
280
+ severity: hit.severity,
281
+ ...(hit.span ? { start: hit.span.start, end: hit.span.end } : {}),
282
+ ...optional('match', hit.match),
283
+ ...optional('label', hit.label),
284
+ ...optional('doc', hit.doc),
285
+ })),
286
+ ...(guardrail.provenance ? { provenance: { ...guardrail.provenance } } : {}),
287
+ ...(guardrail.errorInternal ? { error: traceContent(guardrail.errorInternal) } : {}),
288
+ };
289
+ }
290
+ /** What a stream check looked at, for its pass record. */
291
+ const STREAM_CHECK_STAGE = {
292
+ output_stream: 'output_delta',
293
+ stream_canary: 'output_delta',
294
+ tool_draft: 'tool_call',
295
+ live_output: 'live_outbound',
296
+ };
297
+ /**
298
+ * One timed guardrail check as `theorem.guardrail` attributes: its decision,
299
+ * or a pass (`allow`, no hits) when it let the text through. Trace only; the
300
+ * host still hears about hits alone.
301
+ */
302
+ function guardrailCheckAttributes(check, durationMs, guardrail, passed) {
303
+ return {
304
+ ...(guardrail
305
+ ? guardrailAttributes(guardrail)
306
+ : { stage: passed.stage, trust: passed.trust, action: 'allow', hits: [] }),
307
+ check,
308
+ duration_ms: durationMs,
309
+ };
310
+ }
311
+ function modalityAttributes(byModality) {
312
+ const out = {};
313
+ for (const side of ['input', 'output']) {
314
+ for (const [modality, count] of Object.entries(byModality?.[side] ?? {})) {
315
+ const family = SEMCONV_MODALITIES.has(modality) ? 'gen_ai' : 'theorem';
316
+ out[`${family}.usage.${modality}.${side}_tokens`] = count;
317
+ }
318
+ }
319
+ return out;
320
+ }
321
+ function optional(key, value) {
322
+ return value === undefined ? {} : { [key]: value };
323
+ }
324
+ function usageAttributes(tokens) {
325
+ return {
326
+ 'gen_ai.usage.input_tokens': tokens.input,
327
+ 'gen_ai.usage.output_tokens': tokens.output,
328
+ ...optional('gen_ai.usage.reasoning.output_tokens', tokens.thinking),
329
+ ...optional('gen_ai.usage.cache_read.input_tokens', tokens.cached),
330
+ ...optional('gen_ai.usage.cache_write.input_tokens', tokens.cacheWrite),
331
+ ...optional('theorem.usage.tool_use.input_tokens', tokens.toolUse),
332
+ ...modalityAttributes(tokens.byModality),
333
+ ...(tokens.grounding
334
+ ? {
335
+ 'theorem.usage.grounding': tokens.grounding.map((entry) => ({
336
+ type: entry.type,
337
+ count: entry.count,
338
+ ...optional('search_query_count', entry.searchQueryCount),
339
+ })),
340
+ }
341
+ : {}),
342
+ ...optional('theorem.usage.cost_usd', tokens.cost?.usd),
343
+ ...optional('theorem.usage.upstream_cost_usd', tokens.cost?.upstreamUsd),
344
+ ...(tokens.cost?.partial ? { 'theorem.usage.cost_partial': true } : {}),
345
+ ...(tokens.estimated?.length ? { 'theorem.usage.estimated': [...tokens.estimated] } : {}),
346
+ ...(tokens.unknownMedia ? { 'theorem.usage.unknown_media': { ...tokens.unknownMedia } } : {}),
347
+ };
348
+ }
349
+ function operationName(transport) {
350
+ return transport === 'turn' ? 'chat' : 'generate_content';
351
+ }
352
+ /** `gen_ai.provider.name`: the name the provider's preset states; else the binding's server, when declared. */
353
+ function providerName(binding) {
354
+ if (!binding)
355
+ return undefined;
356
+ return binding.provider;
357
+ }
358
+ function outputType(req, transport) {
359
+ // why: Live answers in audio: its setup asks for `responseModalities: ['AUDIO']` (live/framing.ts).
360
+ if (transport === 'live')
361
+ return 'speech';
362
+ if (req.structured)
363
+ return 'json';
364
+ if (req.image)
365
+ return 'image';
366
+ if (req.speech)
367
+ return 'speech';
368
+ return 'text';
369
+ }
370
+ function requestAttributes(req, binding, transport) {
371
+ const provider = providerName(binding);
372
+ return {
373
+ 'gen_ai.operation.name': operationName(transport),
374
+ ...optional('gen_ai.provider.name', provider),
375
+ 'gen_ai.request.model': req.apiId,
376
+ 'theorem.model.id': req.model,
377
+ ...optional('theorem.key_slot', binding?.keySlot),
378
+ ...optional('gen_ai.request.temperature', req.temperature),
379
+ ...optional('gen_ai.request.max_tokens', req.maxOutputTokens),
380
+ ...optional('gen_ai.request.reasoning.level', req.thinking),
381
+ 'gen_ai.system_instructions': [{ type: 'text', ...traceContent(req.system) }],
382
+ ...(req.wireTools?.length
383
+ ? { 'gen_ai.tool.definitions': traceContent(JSON.stringify(req.wireTools)) }
384
+ : {}),
385
+ 'gen_ai.output.type': outputType(req, transport),
386
+ ...controlAttributes(req),
387
+ };
388
+ }
389
+ /**
390
+ * Request controls semconv has no names for, as requested. Builtins are named
391
+ * by id only; their args are left to the wire body (`outboundWire`): the Maps
392
+ * location locates the user.
393
+ */
394
+ function controlAttributes(req) {
395
+ const { image, speech, live } = req;
396
+ return {
397
+ 'theorem.request.builtins': req.builtins.map((b) => b.id),
398
+ ...optional('theorem.request.summaries', req.summaries),
399
+ ...optional('theorem.request.structured', req.structured?.id),
400
+ ...optional('theorem.request.session_id', req.sessionId),
401
+ ...(image
402
+ ? {
403
+ 'theorem.request.image': {
404
+ ...optional('mime_type', image.mimeType),
405
+ ...optional('aspect_ratio', image.aspectRatio),
406
+ ...optional('resolution', image.resolution),
407
+ ...optional('quality', image.quality),
408
+ ...optional('background', image.background),
409
+ ...optional('n', image.n),
410
+ ...optional('seed', image.seed),
411
+ ...optional('output_compression', image.outputCompression),
412
+ include_text: image.includeText,
413
+ },
414
+ }
415
+ : {}),
416
+ ...(speech
417
+ ? {
418
+ 'theorem.request.speech': {
419
+ ...optional('voice', speech.voice),
420
+ ...optional('speed', speech.speed),
421
+ ...optional('format', speech.format),
422
+ },
423
+ }
424
+ : {}),
425
+ ...(live ? { 'theorem.request.live': liveAttributes(live, req) } : {}),
426
+ };
427
+ }
428
+ /** Live session setup as sent. A resumption handle is a credential: only its presence is kept. */
429
+ function liveAttributes(live, req) {
430
+ const { vad, transcription } = live;
431
+ return {
432
+ ...optional('voice', live.voice),
433
+ ...(vad
434
+ ? {
435
+ vad: {
436
+ ...optional('activity_handling', vad.activityHandling),
437
+ ...optional('start_sensitivity', vad.startSensitivity),
438
+ ...optional('end_sensitivity', vad.endSensitivity),
439
+ ...optional('prefix_padding_ms', vad.prefixPaddingMs),
440
+ ...optional('silence_duration_ms', vad.silenceDurationMs),
441
+ },
442
+ }
443
+ : {}),
444
+ ...optional('session_resumption', live.sessionResumption),
445
+ ...(live.contextCompression
446
+ ? {
447
+ context_compression: {
448
+ mechanism: 'sliding_window',
449
+ ...optional('trigger_tokens', live.contextCompression.triggerTokens),
450
+ ...optional('target_tokens', live.contextCompression.slidingWindow.targetTokens),
451
+ },
452
+ }
453
+ : {}),
454
+ ...(transcription
455
+ ? {
456
+ transcription: {
457
+ ...optional('input', transcription.input),
458
+ ...optional('output', transcription.output),
459
+ },
460
+ }
461
+ : {}),
462
+ resumed: Boolean(req.providerState),
463
+ };
464
+ }
465
+ function headerAttributes(prefix, headers) {
466
+ if (!headers || typeof headers !== 'object')
467
+ return {};
468
+ return Object.fromEntries(Object.entries(headers).map(([key, value]) => [`${prefix}.${key}`, [String(value)]]));
469
+ }
470
+ function urlAttributes(url) {
471
+ if (typeof url !== 'string')
472
+ return {};
473
+ const parsed = URL.canParse(url) ? new URL(url) : undefined;
474
+ // why: The path only: a query can carry credentials.
475
+ return parsed ? { 'server.address': parsed.hostname, 'url.path': parsed.pathname } : {};
476
+ }
477
+ /** POST spans of one call, opened and closed from the adapter's tap rows. */
478
+ class HttpTries {
479
+ call;
480
+ tries = 0;
481
+ current;
482
+ last;
483
+ /** Status of the latest response; how a try still open at call end ended. */
484
+ lastStatus;
485
+ awaitingFirstChunk = false;
486
+ streamed = false;
487
+ constructor(call) {
488
+ this.call = call;
489
+ }
490
+ /** Handle one tap row; returns false for a provider data row. */
491
+ row(row) {
492
+ const type = typeof row.eventType === 'string' ? row.eventType : undefined;
493
+ if (!type || !HTTP_ROWS.has(type)) {
494
+ this.firstChunk();
495
+ return false;
496
+ }
497
+ if (type === 'http_request')
498
+ this.open(row);
499
+ else if (type === 'http_response')
500
+ this.response(row);
501
+ else if (type === 'http_error_body')
502
+ this.errorBody(row);
503
+ else
504
+ this.thrown(row);
505
+ return true;
506
+ }
507
+ open(row) {
508
+ this.current?.end();
509
+ const backoff = this.last?.msSinceEnd();
510
+ this.current = this.call.child(String(row.method ?? 'GET'), {
511
+ kind: 'CLIENT',
512
+ attributes: {
513
+ 'http.request.method': String(row.method ?? 'GET'),
514
+ ...urlAttributes(row.url),
515
+ 'http.request.resend_count': this.tries,
516
+ ...(typeof row.keySlot === 'string' ? { 'theorem.key_slot': row.keySlot } : {}),
517
+ ...optional('theorem.retry.backoff_ms', backoff),
518
+ ...headerAttributes('http.request.header', row.headers),
519
+ },
520
+ });
521
+ this.tries += 1;
522
+ // why: The body sent decides, not the profile: an adapter may stream or buffer regardless.
523
+ this.streamed = asRecord(row.body)?.stream === true;
524
+ if (this.streamed)
525
+ this.call.set({ 'gen_ai.request.stream': true });
526
+ if ('body' in row) {
527
+ this.current.event('theorem.wire.request', { body: traceJson(row.body) });
528
+ }
529
+ else if (typeof row.bodyKind === 'string') {
530
+ this.current.event('theorem.wire.request', { body_kind: row.bodyKind });
531
+ }
532
+ if (typeof row.keySlot === 'string')
533
+ this.call.set({ 'theorem.key_slot': row.keySlot });
534
+ }
535
+ response(row) {
536
+ const status = typeof row.status === 'number' ? row.status : undefined;
537
+ this.lastStatus = status;
538
+ this.current?.set({
539
+ ...optional('http.response.status_code', status),
540
+ ...headerAttributes('http.response.header', row.headers),
541
+ });
542
+ if (status !== undefined && status >= HTTP_ERROR) {
543
+ this.current?.set({ 'error.type': String(status) });
544
+ }
545
+ else {
546
+ // why: Streamed or buffered, the first data row is the reply's first chunk: a buffered body is its one chunk.
547
+ this.awaitingFirstChunk = true;
548
+ }
549
+ }
550
+ errorBody(row) {
551
+ this.current?.event('theorem.upstream.row', { row: traceJson(row) });
552
+ this.close({ code: 'ERROR', message: String(this.lastStatus ?? 'error') });
553
+ }
554
+ thrown(row) {
555
+ const name = typeof row.name === 'string' ? row.name : 'Error';
556
+ this.current?.event('exception', {
557
+ 'exception.type': name,
558
+ 'exception.message': traceContent(String(row.message ?? '')),
559
+ });
560
+ this.current?.set({ 'error.type': name });
561
+ this.close({ code: 'ERROR', message: name });
562
+ }
563
+ firstChunk() {
564
+ if (!(this.awaitingFirstChunk && this.current))
565
+ return;
566
+ this.awaitingFirstChunk = false;
567
+ this.call.set({
568
+ 'gen_ai.response.time_to_first_chunk': this.current.msSinceStart() / MS_PER_S,
569
+ });
570
+ }
571
+ close(status) {
572
+ if (!this.current)
573
+ return;
574
+ this.current.end(status);
575
+ this.last = this.current;
576
+ this.current = undefined;
577
+ }
578
+ }
579
+ /**
580
+ * How a try still open at call end (a streamed body) ended: by its HTTP status
581
+ * and whether reading it threw. A provider error inside a 200 body is the
582
+ * call's failure, not the try's.
583
+ */
584
+ function httpStatus(status, cancelled, thrown) {
585
+ if (status !== undefined && status >= HTTP_ERROR) {
586
+ return { code: 'ERROR', message: String(status) };
587
+ }
588
+ if (thrown !== undefined) {
589
+ return { code: 'ERROR', message: errorKind(thrown) };
590
+ }
591
+ return cancelled ? { code: 'UNSET' } : { code: 'OK' };
592
+ }
593
+ /** The class a thrown value is recorded under (`exception.type`); `error.type` is its kind. */
594
+ function errorName(err) {
595
+ return err instanceof Error ? err.name : 'Error';
596
+ }
597
+ function recordException(span, err) {
598
+ span.event('exception', {
599
+ 'exception.type': errorName(err),
600
+ 'exception.message': traceContent(err instanceof Error ? err.message : String(err)),
601
+ ...(err instanceof Error && err.stack
602
+ ? { 'exception.stacktrace': traceContent(err.stack) }
603
+ : {}),
604
+ });
605
+ }
606
+ /** Close a root that a throw ended: the exception, its kind as `error.type`, and ERROR. */
607
+ function endThrownSpan(span, err) {
608
+ recordException(span, err);
609
+ const kind = errorKind(err);
610
+ span.set({ 'error.type': kind });
611
+ span.end({ code: 'ERROR', message: kind });
612
+ }
613
+ /** Each stream check that ran on a call and never acted, as one pass with its total time and runs. */
614
+ function recordStreamPasses(span, checks) {
615
+ for (const [check, timed] of checks) {
616
+ if (timed.decided)
617
+ continue;
618
+ span.event('theorem.guardrail', {
619
+ ...guardrailCheckAttributes(check, timed.ms, undefined, {
620
+ stage: STREAM_CHECK_STAGE[check],
621
+ trust: 'untrusted',
622
+ }),
623
+ runs: timed.runs,
624
+ });
625
+ }
626
+ }
627
+ /** Every stream check's time on a call, summed: `theorem.guardrail.stream_ms`, when any ran. */
628
+ function streamGuardMs(checks) {
629
+ let ms = 0;
630
+ for (const timed of checks.values())
631
+ ms += timed.ms;
632
+ return ms > 0 ? { 'theorem.guardrail.stream_ms': ms } : {};
633
+ }
634
+ /** Stops where the model did not finish its output: no finish reason, status `UNSET`. */
635
+ const STOPPED_CALLS = new Set(['cancelled', 'interrupted']);
636
+ function callOutcome(stop, failure) {
637
+ const stopped = stop !== undefined && STOPPED_CALLS.has(stop.kind);
638
+ const finish = stop && !stopped ? (FINISH_REASON[stop.kind] ?? stop.kind) : undefined;
639
+ if (failure) {
640
+ return {
641
+ stopped,
642
+ finish,
643
+ status: { code: 'ERROR', message: failure },
644
+ attributes: { 'error.type': failure },
645
+ };
646
+ }
647
+ return { stopped, finish, status: { code: stopped ? 'UNSET' : 'OK' }, attributes: {} };
648
+ }
649
+ function responseAttributes(response, native, transport) {
650
+ const reported = !native
651
+ ? {}
652
+ : transport === 'turn'
653
+ ? { 'gen_ai.response.finish_reasons': [native] }
654
+ : { 'gen_ai.response.status': native };
655
+ return {
656
+ ...optional('gen_ai.response.id', response?.id || undefined),
657
+ ...optional('gen_ai.response.model', response?.model || undefined),
658
+ ...reported,
659
+ };
660
+ }
661
+ /**
662
+ * `open` places the span: a child of the turn's root, or the root of a Live response's own record.
663
+ * `usage.conversation` is read again at the end, since a Live response sets it only when it closes.
664
+ */
665
+ function startCallTrace(open, args) {
666
+ const { req, usage, transport } = args;
667
+ const opening = inputMessages(usage);
668
+ const span = open(`${operationName(transport)} ${req.apiId}`, {
669
+ kind: 'CLIENT',
670
+ attributes: {
671
+ ...requestAttributes(req, args.binding, transport),
672
+ 'gen_ai.input.messages': opening.input,
673
+ ...optional('theorem.input.sent_from', opening.sentFrom),
674
+ 'theorem.step': args.step,
675
+ ...optional('theorem.attempt', args.attempt),
676
+ },
677
+ });
678
+ const http = new HttpTries(span);
679
+ const output = new OutputFold();
680
+ const heard = new OutputFold();
681
+ const errors = [];
682
+ let response;
683
+ let native;
684
+ let firstText = false;
685
+ const streamChecks = new Map();
686
+ /** The stream check that ran last: a decision right after it is that check's. */
687
+ let lastCheck;
688
+ return {
689
+ span,
690
+ tap: (row) => {
691
+ if (!http.row(row))
692
+ span.event('theorem.upstream.row', { row: traceJson(row) });
693
+ },
694
+ observe: (event) => {
695
+ if (event.type === 'evidence' && event.evidence.kind === 'input_transcription') {
696
+ heard.add(event, span.nowUnixNano());
697
+ return;
698
+ }
699
+ output.add(event, span.nowUnixNano());
700
+ if (event.type === 'text' && !firstText) {
701
+ firstText = true;
702
+ span.set({ 'theorem.response.time_to_first_text': span.msSinceStart() / MS_PER_S });
703
+ }
704
+ const grounding = groundingEvent(event);
705
+ if (grounding)
706
+ span.event('theorem.grounding', grounding);
707
+ if (event.type === 'error')
708
+ errors.push(event);
709
+ if (event.type === 'response')
710
+ response = event.response;
711
+ if (event.type === 'done')
712
+ native = event.stop.native ?? native;
713
+ },
714
+ guardrail: (guardrail) => {
715
+ const timed = lastCheck ? streamChecks.get(lastCheck) : undefined;
716
+ if (!(lastCheck && timed) || timed.decided) {
717
+ span.event('theorem.guardrail', guardrailAttributes(guardrail));
718
+ return;
719
+ }
720
+ timed.decided = true;
721
+ span.event('theorem.guardrail', {
722
+ ...guardrailCheckAttributes(lastCheck, timed.ms, guardrail, {
723
+ stage: STREAM_CHECK_STAGE[lastCheck],
724
+ trust: 'untrusted',
725
+ }),
726
+ runs: timed.runs,
727
+ });
728
+ },
729
+ guardTime: (check, ms) => {
730
+ const timed = streamChecks.get(check) ?? { ms: 0, runs: 0, decided: false };
731
+ timed.ms += ms;
732
+ timed.runs += 1;
733
+ streamChecks.set(check, timed);
734
+ lastCheck = check;
735
+ },
736
+ end: (end) => {
737
+ for (const error of errors) {
738
+ span.event('exception', {
739
+ 'exception.type': error.errorKind,
740
+ 'exception.message': traceContent(error.errorInternal ?? error.error ?? ''),
741
+ });
742
+ }
743
+ if (end.thrown !== undefined)
744
+ recordException(span, end.thrown);
745
+ recordStreamPasses(span, streamChecks);
746
+ const lastError = errors.at(-1);
747
+ const failure = end.thrown !== undefined ? errorKind(end.thrown) : lastError?.errorKind;
748
+ const outcome = callOutcome(end.stop, failure);
749
+ const outputMessage = {
750
+ role: 'assistant',
751
+ parts: output.parts,
752
+ ...optional('finish_reason', outcome.finish),
753
+ };
754
+ const { input } = inputMessages(usage);
755
+ // why: A continuation replays what the model read, not the provider's transcript of it.
756
+ callMessages.set(usage, { input, output: outputMessage });
757
+ const transcript = heard.parts.length > 0 ? [{ role: 'user', parts: heard.parts }] : [];
758
+ http.close(httpStatus(http.lastStatus, outcome.stopped, end.thrown));
759
+ span.set({
760
+ 'gen_ai.input.messages': [...input, ...transcript],
761
+ 'gen_ai.output.messages': [outputMessage],
762
+ ...(end.tokens ? usageAttributes(end.tokens) : {}),
763
+ ...responseAttributes(response, outcome.stopped ? undefined : native, transport),
764
+ ...optional('theorem.stop.kind', end.stop?.kind),
765
+ ...streamGuardMs(streamChecks),
766
+ ...outcome.attributes,
767
+ });
768
+ span.end(outcome.status);
769
+ },
770
+ };
771
+ }
772
+ /** The host's new input as one user message, exactly as it arrived (before ingress). */
773
+ function turnInputMessages(input) {
774
+ const media = [...(input?.attachments ?? []), ...(input?.voice ?? [])].map((blob) => 'uri' in blob
775
+ ? {
776
+ type: 'uri',
777
+ modality: mediaModality(blob.mimeType),
778
+ mime_type: blob.mimeType,
779
+ uri: blob.uri,
780
+ }
781
+ : {
782
+ type: 'blob',
783
+ modality: mediaModality(blob.mimeType),
784
+ mime_type: blob.mimeType,
785
+ ...traceBytes(blob.data),
786
+ });
787
+ const parts = [...(input?.text ? [{ type: 'text', ...traceContent(input.text) }] : []), ...media];
788
+ return parts.length > 0 ? [{ role: 'user', parts }] : [];
789
+ }
790
+ function traceLinks(links) {
791
+ return (links ?? []).map((link) => ({
792
+ traceparent: link.traceparent,
793
+ attributes: {
794
+ 'theorem.link.kind': link.kind,
795
+ ...optional('theorem.stop.kind', link.stop),
796
+ },
797
+ }));
798
+ }
799
+ function turnSpanOptions(req) {
800
+ return {
801
+ kind: 'INTERNAL',
802
+ attributes: {
803
+ 'gen_ai.operation.name': 'invoke_agent',
804
+ 'gen_ai.agent.name': req.profile,
805
+ ...optional('gen_ai.conversation.id', req.conversationId),
806
+ 'gen_ai.input.messages': turnInputMessages(req.input),
807
+ ...optional('theorem.request.effort', req.effort),
808
+ ...optional('theorem.request.model_select', req.model),
809
+ ...optional('theorem.project.id', req.projectId),
810
+ },
811
+ links: traceLinks(req.links),
812
+ };
813
+ }
814
+ const FINISHED_STOPS = new Set(['completed', 'length', 'generation_complete']);
815
+ /**
816
+ * Close a turn's `invoke_agent` span. Usage is the sum of this turn's own
817
+ * calls; a nested turn (compaction) carries its own.
818
+ */
819
+ function endTurnSpan(root, end) {
820
+ const tokens = sumEventTokens(end.seen);
821
+ const done = findLast(end.seen, (ev) => ev.type === 'done');
822
+ const stop = done?.stop.kind;
823
+ const errorEvent = findLast(end.seen, (ev) => ev.type === 'error');
824
+ const publicError = errorEvent?.error;
825
+ const threw = end.thrown !== undefined;
826
+ if (threw)
827
+ recordException(root, end.thrown);
828
+ const failed = threw || (stop !== undefined && isFailedStopKind(stop));
829
+ const failure = threw ? errorKind(end.thrown) : (errorEvent?.errorKind ?? stop);
830
+ // why: What the host received, beside each call's `output.messages` (what the model produced).
831
+ const delivered = {
832
+ role: 'assistant',
833
+ parts: end.delivered.parts,
834
+ ...optional('finish_reason', callOutcome(done?.stop, undefined).finish),
835
+ };
836
+ root.set({
837
+ 'gen_ai.output.messages': [delivered],
838
+ ...(tokens ? usageAttributes(tokens) : {}),
839
+ ...(stop ? { 'theorem.stop.kind': stop } : {}),
840
+ 'theorem.attempts': end.attempts,
841
+ 'theorem.steps': end.calls,
842
+ ...(end.seen.some((ev) => ev.type === 'compaction' && ev.outcome === 'compacted')
843
+ ? { 'gen_ai.conversation.compacted': true }
844
+ : {}),
845
+ ...(failed && publicError ? { 'theorem.error.public': traceContent(publicError) } : {}),
846
+ ...(failed && failure ? { 'error.type': failure } : {}),
847
+ });
848
+ if (failed) {
849
+ root.end({ code: 'ERROR', ...(failure ? { message: failure } : {}) });
850
+ }
851
+ else {
852
+ root.end(stop && !FINISHED_STOPS.has(stop) ? { code: 'UNSET' } : { code: 'OK' });
853
+ }
854
+ }
855
+ export { endThrownSpan, endTurnSpan, guardrailAttributes, guardrailCheckAttributes, OutputFold, optional, recordException, startCallTrace, toolArgumentsText, traceLinks, tracePart, turnSpanOptions, urlAttributes, usageAttributes, };