@theoremjs/agents 0.3.0 → 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 (568) hide show
  1. package/README.md +276 -995
  2. package/esm/mod.d.ts +33 -19
  3. package/esm/mod.js +18 -11
  4. package/esm/src/cli/commands/bench.js +36 -14
  5. package/esm/src/cli/commands/detect-compile.d.ts +17 -0
  6. package/esm/src/cli/commands/detect-compile.js +22 -0
  7. package/esm/src/cli/commands/eval.d.ts +3 -3
  8. package/esm/src/cli/commands/fuzz-canary.js +55 -16
  9. package/esm/src/cli/commands/profile.js +4 -4
  10. package/esm/src/cli/commands/run.d.ts +2 -2
  11. package/esm/src/cli/commands/run.js +1 -1
  12. package/esm/src/cli/commands/test.d.ts +4 -3
  13. package/esm/src/cli/commands/test.js +2 -2
  14. package/esm/src/cli/index.js +9 -9
  15. package/esm/src/cli/matrix/fixtures.js +25 -30
  16. package/esm/src/evals/attachments.d.ts +1 -0
  17. package/esm/src/evals/attachments.js +4 -2
  18. package/esm/src/evals/breakdown.d.ts +2 -0
  19. package/esm/src/evals/breakdown.js +1 -0
  20. package/esm/src/evals/graders/answer.d.ts +3 -0
  21. package/esm/src/evals/graders/answer.js +1 -0
  22. package/esm/src/evals/graders/code.d.ts +7 -31
  23. package/esm/src/evals/graders/code.js +4 -25
  24. package/esm/src/evals/graders/judge.d.ts +4 -0
  25. package/esm/src/evals/graders/judge.js +7 -5
  26. package/esm/src/evals/graders/latency.d.ts +1 -0
  27. package/esm/src/evals/graders/latency.js +3 -2
  28. package/esm/src/evals/graders/live.d.ts +3 -0
  29. package/esm/src/evals/graders/live.js +2 -0
  30. package/esm/src/evals/graders/media.js +1 -2
  31. package/esm/src/evals/graders/shared.js +1 -1
  32. package/esm/src/evals/graders/transcript.d.ts +2 -0
  33. package/esm/src/evals/graders/transcript.js +5 -3
  34. package/esm/src/evals/mod.d.ts +1 -9
  35. package/esm/src/evals/mod.js +1 -9
  36. package/esm/src/evals/record.d.ts +6 -0
  37. package/esm/src/evals/record.js +4 -2
  38. package/esm/src/evals/rubrics/mod.d.ts +1 -1
  39. package/esm/src/evals/rubrics/mod.js +1 -1
  40. package/esm/src/evals/rubrics/mustache.js +1 -1
  41. package/esm/src/evals/rubrics/types.js +1 -1
  42. package/esm/src/evals/run.d.ts +9 -52
  43. package/esm/src/evals/run.js +12 -46
  44. package/esm/src/evals/suite.d.ts +12 -3
  45. package/esm/src/evals/suite.js +9 -4
  46. package/esm/src/evals/summary.d.ts +3 -0
  47. package/esm/src/evals/summary.js +1 -0
  48. package/esm/src/evals/trial.d.ts +3 -16
  49. package/esm/src/evals/trial.js +7 -30
  50. package/esm/src/evals/types.d.ts +30 -121
  51. package/esm/src/evals/types.js +3 -16
  52. package/esm/src/evals/verdict.d.ts +5 -0
  53. package/esm/src/evals/verdict.js +4 -1
  54. package/esm/src/guardrails/boundaries.d.ts +41 -0
  55. package/esm/src/guardrails/boundaries.js +103 -0
  56. package/esm/src/guardrails/canary-gate.d.ts +1 -0
  57. package/esm/src/guardrails/canary.d.ts +49 -15
  58. package/esm/src/guardrails/canary.js +103 -30
  59. package/esm/src/guardrails/compile-egress.d.ts +6 -5
  60. package/esm/src/guardrails/compile-egress.js +6 -5
  61. package/esm/src/guardrails/corpus/canary-egress-attacks.d.ts +3 -1
  62. package/esm/src/guardrails/corpus/canary-egress-attacks.js +4 -2
  63. package/esm/src/guardrails/corpus/fuzz-inbound.js +14 -17
  64. package/esm/src/guardrails/corpus/inbound-payloads.d.ts +2 -0
  65. package/esm/src/guardrails/corpus/inbound-payloads.js +4 -2
  66. package/esm/src/guardrails/corpus/live-attacks.d.ts +2 -0
  67. package/esm/src/guardrails/corpus/live-attacks.js +6 -1
  68. package/esm/src/guardrails/corpus/mod.d.ts +1 -1
  69. package/esm/src/guardrails/corpus/secrets.d.ts +3 -3
  70. package/esm/src/guardrails/corpus/secrets.js +2 -2
  71. package/esm/src/guardrails/corpus/strings.d.ts +1 -1
  72. package/esm/src/guardrails/corpus/strings.js +1 -1
  73. package/esm/src/guardrails/corpus/types.d.ts +5 -1
  74. package/esm/src/guardrails/credential-rules.d.ts +36 -0
  75. package/esm/src/guardrails/credential-rules.js +3001 -0
  76. package/esm/src/guardrails/credential-scan.d.ts +45 -0
  77. package/esm/src/guardrails/credential-scan.js +172 -0
  78. package/esm/src/guardrails/destinations.d.ts +45 -0
  79. package/esm/src/guardrails/destinations.js +234 -0
  80. package/esm/src/guardrails/detect-at.d.ts +107 -0
  81. package/esm/src/guardrails/detect-at.js +434 -0
  82. package/esm/src/guardrails/detect-reply.d.ts +61 -0
  83. package/esm/src/guardrails/detect-reply.js +95 -0
  84. package/esm/src/guardrails/detect-stream.d.ts +33 -0
  85. package/esm/src/guardrails/detect-stream.js +77 -0
  86. package/esm/src/guardrails/detectors.d.ts +216 -0
  87. package/esm/src/guardrails/detectors.js +503 -0
  88. package/esm/src/guardrails/egress-automata.d.ts +4 -6
  89. package/esm/src/guardrails/egress-automata.js +24095 -4572
  90. package/esm/src/guardrails/egress-compiler.d.ts +38 -16
  91. package/esm/src/guardrails/egress-compiler.js +254 -60
  92. package/esm/src/guardrails/egress-patterns.d.ts +4 -2
  93. package/esm/src/guardrails/egress-patterns.js +6 -2
  94. package/esm/src/guardrails/egress-stream.d.ts +54 -36
  95. package/esm/src/guardrails/egress-stream.js +253 -124
  96. package/esm/src/guardrails/egress-urls.d.ts +6 -3
  97. package/esm/src/guardrails/egress-urls.js +14 -22
  98. package/esm/src/guardrails/egress.d.ts +26 -86
  99. package/esm/src/guardrails/egress.js +59 -309
  100. package/esm/src/guardrails/error.d.ts +13 -8
  101. package/esm/src/guardrails/error.js +23 -18
  102. package/esm/src/guardrails/event-schemas.d.ts +46 -3
  103. package/esm/src/guardrails/event-schemas.js +12 -5
  104. package/esm/src/guardrails/events.d.ts +5 -1
  105. package/esm/src/guardrails/events.js +4 -1
  106. package/esm/src/guardrails/hints.d.ts +14 -0
  107. package/esm/src/guardrails/hints.js +57 -0
  108. package/esm/src/guardrails/hits.d.ts +7 -1
  109. package/esm/src/guardrails/hits.js +12 -1
  110. package/esm/src/guardrails/host-patterns.d.ts +85 -0
  111. package/esm/src/guardrails/host-patterns.js +173 -0
  112. package/esm/src/guardrails/injection-patterns.d.ts +6 -1
  113. package/esm/src/guardrails/injection-patterns.js +33 -1
  114. package/esm/src/guardrails/injection-reversed.d.ts +9 -0
  115. package/esm/src/guardrails/injection-reversed.js +49 -0
  116. package/esm/src/guardrails/injection.d.ts +17 -1
  117. package/esm/src/guardrails/injection.js +259 -36
  118. package/esm/src/guardrails/labels.d.ts +40 -0
  119. package/esm/src/guardrails/labels.js +874 -0
  120. package/esm/src/guardrails/live-outbound-gate.d.ts +9 -8
  121. package/esm/src/guardrails/live-outbound-gate.js +100 -107
  122. package/esm/src/guardrails/mod.d.ts +29 -21
  123. package/esm/src/guardrails/mod.js +18 -13
  124. package/esm/src/guardrails/network.d.ts +4 -0
  125. package/esm/src/guardrails/network.js +21 -19
  126. package/esm/src/guardrails/normalize.d.ts +15 -1
  127. package/esm/src/guardrails/normalize.js +34 -1
  128. package/esm/src/guardrails/policy.d.ts +2 -17
  129. package/esm/src/guardrails/policy.js +12 -41
  130. package/esm/src/guardrails/progressive-yield.d.ts +65 -24
  131. package/esm/src/guardrails/progressive-yield.js +191 -147
  132. package/esm/src/guardrails/prompt-echo.d.ts +4 -2
  133. package/esm/src/guardrails/prompt-echo.js +87 -6
  134. package/esm/src/guardrails/quota.d.ts +1 -0
  135. package/esm/src/guardrails/quota.js +1 -1
  136. package/esm/src/guardrails/rules.d.ts +20 -29
  137. package/esm/src/guardrails/rules.js +23 -30
  138. package/esm/src/guardrails/sanitize.d.ts +32 -15
  139. package/esm/src/guardrails/sanitize.js +100 -124
  140. package/esm/src/guardrails/sensitive-groups.d.ts +21 -0
  141. package/esm/src/guardrails/sensitive-groups.js +12 -0
  142. package/esm/src/guardrails/sensitive.d.ts +16 -23
  143. package/esm/src/guardrails/sensitive.js +168 -47
  144. package/esm/src/guardrails/serialize.d.ts +1 -0
  145. package/esm/src/guardrails/testing.d.ts +4 -2
  146. package/esm/src/guardrails/testing.js +4 -2
  147. package/esm/src/guardrails/theorem-error.d.ts +4 -1
  148. package/esm/src/guardrails/theorem-error.js +3 -2
  149. package/esm/src/guardrails/thought-guard.d.ts +34 -13
  150. package/esm/src/guardrails/thought-guard.js +264 -64
  151. package/esm/src/guardrails/tool-directives.d.ts +29 -10
  152. package/esm/src/guardrails/tool-directives.js +133 -47
  153. package/esm/src/guardrails/tool-leak.d.ts +26 -0
  154. package/esm/src/guardrails/tool-leak.js +45 -0
  155. package/esm/src/guardrails/tool-result.d.ts +45 -14
  156. package/esm/src/guardrails/tool-result.js +94 -70
  157. package/esm/src/guardrails/types.d.ts +79 -71
  158. package/esm/src/guardrails/types.js +11 -7
  159. package/esm/src/host/client-turn.d.ts +29 -2
  160. package/esm/src/host/client-turn.js +46 -4
  161. package/esm/src/host/mint-trace.d.ts +1 -0
  162. package/esm/src/host/mint-trace.js +3 -2
  163. package/esm/src/host/mod.d.ts +2 -2
  164. package/esm/src/host/mod.js +1 -1
  165. package/esm/src/host/readStreamingJsonStringField.js +2 -43
  166. package/esm/src/host/reply.d.ts +6 -0
  167. package/esm/src/host/reply.js +7 -1
  168. package/esm/src/interface/blocks.d.ts +3 -0
  169. package/esm/src/interface/blocks.js +84 -14
  170. package/esm/src/interface/composer-actions.d.ts +4 -0
  171. package/esm/src/interface/composer-actions.js +5 -3
  172. package/esm/src/interface/draft.d.ts +6 -0
  173. package/esm/src/interface/draft.js +22 -11
  174. package/esm/src/interface/from-profile.d.ts +13 -1
  175. package/esm/src/interface/from-profile.js +66 -31
  176. package/esm/src/interface/history.d.ts +9 -3
  177. package/esm/src/interface/history.js +33 -24
  178. package/esm/src/interface/inputs.d.ts +1 -0
  179. package/esm/src/interface/inputs.js +3 -0
  180. package/esm/src/interface/mod.d.ts +4 -2
  181. package/esm/src/interface/mod.js +3 -2
  182. package/esm/src/interface/models.d.ts +7 -0
  183. package/esm/src/interface/models.js +5 -0
  184. package/esm/src/interface/pending.d.ts +9 -0
  185. package/esm/src/interface/pending.js +9 -3
  186. package/esm/src/interface/profile-interface.js +54 -40
  187. package/esm/src/interface/session.d.ts +12 -5
  188. package/esm/src/interface/session.js +17 -10
  189. package/esm/src/interface/stop.d.ts +13 -0
  190. package/esm/src/interface/stop.js +28 -0
  191. package/esm/src/interface/tool-calls.d.ts +14 -2
  192. package/esm/src/interface/tool-calls.js +64 -10
  193. package/esm/src/interface/tool-invoke.d.ts +2 -0
  194. package/esm/src/interface/tool-invoke.js +3 -1
  195. package/esm/src/interface/tool-media.d.ts +2 -0
  196. package/esm/src/interface/tool-media.js +2 -1
  197. package/esm/src/interface/types.d.ts +105 -40
  198. package/esm/src/interface/types.js +1 -0
  199. package/esm/src/kernel/api-catalog.d.ts +85 -0
  200. package/esm/src/kernel/api-catalog.js +229 -0
  201. package/esm/src/kernel/auth/crypto.d.ts +7 -2
  202. package/esm/src/kernel/auth/crypto.js +12 -10
  203. package/esm/src/kernel/auth/oauth.d.ts +2 -1
  204. package/esm/src/kernel/auth/oauth.js +23 -22
  205. package/esm/src/kernel/auth/typed-secret.js +2 -2
  206. package/esm/src/kernel/auth/types.d.ts +13 -0
  207. package/esm/src/kernel/checkpoint.d.ts +43 -0
  208. package/esm/src/kernel/checkpoint.js +58 -0
  209. package/esm/src/kernel/default-scope.d.ts +43 -5
  210. package/esm/src/kernel/default-scope.js +54 -5
  211. package/esm/src/kernel/engine/call-trace.d.ts +19 -0
  212. package/esm/src/kernel/engine/call-trace.js +29 -0
  213. package/esm/src/kernel/engine/compaction.d.ts +6 -5
  214. package/esm/src/kernel/engine/compaction.js +12 -11
  215. package/esm/src/kernel/engine/decision.d.ts +10 -8
  216. package/esm/src/kernel/engine/decision.js +173 -146
  217. package/esm/src/kernel/engine/embedding.d.ts +8 -0
  218. package/esm/src/kernel/engine/embedding.js +118 -0
  219. package/esm/src/kernel/engine/live-inbound.d.ts +14 -4
  220. package/esm/src/kernel/engine/live-inbound.js +36 -11
  221. package/esm/src/kernel/engine/live-ingress.d.ts +6 -0
  222. package/esm/src/kernel/engine/live-ingress.js +6 -1
  223. package/esm/src/kernel/engine/repair.js +12 -12
  224. package/esm/src/kernel/engine/runner/gates.d.ts +2 -2
  225. package/esm/src/kernel/engine/runner/gates.js +287 -101
  226. package/esm/src/kernel/engine/runner/mod.d.ts +19 -5
  227. package/esm/src/kernel/engine/runner/mod.js +107 -56
  228. package/esm/src/kernel/engine/runner/nested.d.ts +32 -0
  229. package/esm/src/kernel/engine/runner/nested.js +134 -0
  230. package/esm/src/kernel/engine/runner/schema-validation.d.ts +24 -3
  231. package/esm/src/kernel/engine/runner/schema-validation.js +78 -4
  232. package/esm/src/kernel/engine/runner/stages.d.ts +1 -1
  233. package/esm/src/kernel/engine/runner/stages.js +1 -8
  234. package/esm/src/kernel/engine/runner/state.d.ts +33 -12
  235. package/esm/src/kernel/engine/runner/state.js +11 -1
  236. package/esm/src/kernel/engine/runner/step-order.d.ts +27 -0
  237. package/esm/src/kernel/engine/runner/step-order.js +165 -0
  238. package/esm/src/kernel/engine/runner/steps.d.ts +2 -2
  239. package/esm/src/kernel/engine/runner/steps.js +328 -169
  240. package/esm/src/kernel/engine/runner/stream.d.ts +42 -11
  241. package/esm/src/kernel/engine/runner/stream.js +197 -46
  242. package/esm/src/kernel/engine/runner/usage.d.ts +5 -5
  243. package/esm/src/kernel/engine/runner/usage.js +12 -14
  244. package/esm/src/kernel/engine/session/mod.d.ts +8 -6
  245. package/esm/src/kernel/engine/session/mod.js +360 -129
  246. package/esm/src/kernel/engine/session/session-trace.d.ts +10 -10
  247. package/esm/src/kernel/engine/session/session-trace.js +41 -30
  248. package/esm/src/kernel/engine/token-estimate.d.ts +10 -64
  249. package/esm/src/kernel/engine/token-estimate.js +14 -194
  250. package/esm/src/kernel/engine/tool-trace.d.ts +3 -3
  251. package/esm/src/kernel/engine/tool-trace.js +2 -1
  252. package/esm/src/kernel/engine/turn-trace.d.ts +8 -7
  253. package/esm/src/kernel/engine/turn-trace.js +28 -36
  254. package/esm/src/kernel/engine/usage.d.ts +6 -0
  255. package/esm/src/kernel/engine/usage.js +17 -0
  256. package/esm/src/kernel/interaction-parts.d.ts +3 -0
  257. package/esm/src/kernel/interaction-parts.js +18 -0
  258. package/esm/src/kernel/json.d.ts +10 -0
  259. package/esm/src/kernel/json.js +3 -0
  260. package/esm/src/kernel/mod.d.ts +38 -11
  261. package/esm/src/kernel/mod.js +22 -7
  262. package/esm/src/kernel/profile-graph.d.ts +11 -6
  263. package/esm/src/kernel/profile-graph.js +14 -7
  264. package/esm/src/kernel/profile-presence.d.ts +10 -1
  265. package/esm/src/kernel/profile-presence.js +90 -75
  266. package/esm/src/kernel/profile-scope.d.ts +7 -3
  267. package/esm/src/kernel/profile-scope.js +67 -55
  268. package/esm/src/kernel/protocols/binding.d.ts +65 -0
  269. package/esm/src/kernel/protocols/binding.js +125 -0
  270. package/esm/src/kernel/protocols/limits.d.ts +15 -0
  271. package/esm/src/kernel/protocols/limits.js +28 -0
  272. package/esm/src/kernel/protocols/mod.d.ts +5 -0
  273. package/esm/src/kernel/protocols/mod.js +5 -0
  274. package/esm/src/kernel/protocols/prices.d.ts +36 -0
  275. package/esm/src/kernel/protocols/prices.js +37 -0
  276. package/esm/src/kernel/protocols/protocol.d.ts +253 -0
  277. package/esm/src/kernel/protocols/protocol.js +253 -0
  278. package/esm/src/kernel/protocols/provider.d.ts +108 -0
  279. package/esm/src/kernel/protocols/provider.js +143 -0
  280. package/esm/src/kernel/protocols/runtime.d.ts +55 -0
  281. package/esm/src/kernel/protocols/runtime.js +534 -0
  282. package/esm/src/kernel/provider-budget.d.ts +32 -0
  283. package/esm/src/kernel/provider-budget.js +262 -0
  284. package/esm/src/kernel/provider-dispatch.d.ts +13 -0
  285. package/esm/src/kernel/provider-dispatch.js +36 -0
  286. package/esm/src/kernel/provider-live.d.ts +7 -0
  287. package/esm/src/kernel/provider-live.js +189 -0
  288. package/esm/src/kernel/provider-runtime.d.ts +57 -0
  289. package/esm/src/kernel/provider-runtime.js +524 -0
  290. package/esm/src/kernel/registry/attachments.d.ts +15 -4
  291. package/esm/src/kernel/registry/attachments.js +31 -22
  292. package/esm/src/kernel/registry/catalog.d.ts +6 -0
  293. package/esm/src/kernel/registry/catalog.js +9 -2
  294. package/esm/src/kernel/registry/embedding-rules.d.ts +28 -0
  295. package/esm/src/kernel/registry/embedding-rules.js +66 -0
  296. package/esm/src/kernel/registry/ingress.d.ts +6 -2
  297. package/esm/src/kernel/registry/ingress.js +55 -10
  298. package/esm/src/kernel/registry/kernel-registry.d.ts +3 -0
  299. package/esm/src/kernel/registry/kernel-registry.js +9 -2
  300. package/esm/src/kernel/registry/profile-outputs.js +4 -1
  301. package/esm/src/kernel/registry/profiles.d.ts +38 -14
  302. package/esm/src/kernel/registry/profiles.js +280 -205
  303. package/esm/src/kernel/registry/provider-request.d.ts +3 -3
  304. package/esm/src/kernel/registry/provider-request.js +5 -13
  305. package/esm/src/kernel/registry/resolve.d.ts +4 -1
  306. package/esm/src/kernel/registry/resolve.js +59 -58
  307. package/esm/src/kernel/registry/schemas.d.ts +3 -0
  308. package/esm/src/kernel/registry/schemas.js +3 -1
  309. package/esm/src/kernel/registry/slot-fill.d.ts +7 -0
  310. package/esm/src/kernel/registry/slot-fill.js +22 -0
  311. package/esm/src/kernel/registry/system-prompt.js +7 -8
  312. package/esm/src/kernel/registry/vault.d.ts +14 -13
  313. package/esm/src/kernel/registry/vault.js +1 -14
  314. package/esm/src/kernel/schema.d.ts +100 -46
  315. package/esm/src/kernel/schema.js +499 -257
  316. package/esm/src/kernel/scope.d.ts +12 -5
  317. package/esm/src/kernel/scope.js +23 -3
  318. package/esm/src/kernel/stages.d.ts +38 -3
  319. package/esm/src/kernel/stages.js +82 -39
  320. package/esm/src/kernel/stop.d.ts +29 -6
  321. package/esm/src/kernel/stop.js +16 -4
  322. package/esm/src/kernel/system-parts.js +6 -6
  323. package/esm/src/kernel/tools/activity-label.d.ts +12 -6
  324. package/esm/src/kernel/tools/activity-label.js +258 -32
  325. package/esm/src/kernel/tools/agent.d.ts +66 -0
  326. package/esm/src/kernel/tools/agent.js +212 -0
  327. package/esm/src/kernel/tools/coordinate.d.ts +4 -0
  328. package/esm/src/kernel/tools/coordinate.js +165 -0
  329. package/esm/src/kernel/tools/events.d.ts +21 -6
  330. package/esm/src/kernel/tools/events.js +53 -18
  331. package/esm/src/kernel/tools/execute.d.ts +47 -11
  332. package/esm/src/kernel/tools/execute.js +508 -136
  333. package/esm/src/kernel/tools/gate-answer.d.ts +12 -2
  334. package/esm/src/kernel/tools/gate-answer.js +17 -6
  335. package/esm/src/kernel/tools/handler-events.d.ts +45 -0
  336. package/esm/src/kernel/tools/handler-events.js +106 -0
  337. package/esm/src/kernel/tools/harness.d.ts +1 -0
  338. package/esm/src/kernel/tools/harness.js +2 -1
  339. package/esm/src/kernel/tools/http-limit.d.ts +27 -0
  340. package/esm/src/kernel/tools/http-limit.js +85 -0
  341. package/esm/src/kernel/tools/invoke.d.ts +27 -5
  342. package/esm/src/kernel/tools/invoke.js +223 -70
  343. package/esm/src/kernel/tools/mcp-sessions.d.ts +4 -1
  344. package/esm/src/kernel/tools/mcp-sessions.js +13 -8
  345. package/esm/src/kernel/tools/mod.d.ts +4 -3
  346. package/esm/src/kernel/tools/mod.js +3 -2
  347. package/esm/src/kernel/tools/model-text.d.ts +10 -5
  348. package/esm/src/kernel/tools/model-text.js +18 -12
  349. package/esm/src/kernel/tools/operation.d.ts +76 -0
  350. package/esm/src/kernel/tools/operation.js +100 -0
  351. package/esm/src/kernel/tools/page-answer.d.ts +8 -0
  352. package/esm/src/kernel/tools/page-answer.js +19 -0
  353. package/esm/src/kernel/tools/permission.d.ts +11 -2
  354. package/esm/src/kernel/tools/permission.js +12 -12
  355. package/esm/src/kernel/tools/project.d.ts +4 -1
  356. package/esm/src/kernel/tools/project.js +32 -2
  357. package/esm/src/kernel/tools/registry.d.ts +9 -2
  358. package/esm/src/kernel/tools/registry.js +69 -10
  359. package/esm/src/kernel/tools/remote.d.ts +40 -6
  360. package/esm/src/kernel/tools/remote.js +219 -92
  361. package/esm/src/kernel/tools/resolve.d.ts +3 -0
  362. package/esm/src/kernel/tools/resolve.js +12 -4
  363. package/esm/src/kernel/tools/run.d.ts +28 -0
  364. package/esm/src/kernel/tools/run.js +86 -0
  365. package/esm/src/kernel/tools/schema.d.ts +3 -3
  366. package/esm/src/kernel/tools/schema.js +21 -100
  367. package/esm/src/kernel/tools/signed-in-fetch.d.ts +2 -1
  368. package/esm/src/kernel/tools/signed-in-fetch.js +3 -3
  369. package/esm/src/kernel/tools/stage-run.d.ts +27 -4
  370. package/esm/src/kernel/tools/stage-run.js +75 -17
  371. package/esm/src/kernel/tools/types.d.ts +235 -25
  372. package/esm/src/kernel/tools/unchecked-output.d.ts +14 -0
  373. package/esm/src/kernel/tools/unchecked-output.js +18 -0
  374. package/esm/src/kernel/turn-events.d.ts +208 -31
  375. package/esm/src/kernel/turn-events.js +127 -9
  376. package/esm/src/kernel/types.d.ts +302 -161
  377. package/esm/src/kernel/util/base64.d.ts +2 -0
  378. package/esm/src/kernel/util/base64.js +2 -0
  379. package/esm/src/kernel/util/partial-json.d.ts +23 -0
  380. package/esm/src/kernel/util/partial-json.js +128 -0
  381. package/esm/src/kernel/util/record.d.ts +1 -0
  382. package/esm/src/kernel/util/record.js +1 -0
  383. package/esm/src/observability/destinations.d.ts +5 -0
  384. package/esm/src/observability/destinations.js +7 -2
  385. package/esm/src/observability/jsonl.d.ts +2 -2
  386. package/esm/src/observability/jsonl.js +15 -22
  387. package/esm/src/observability/mod.d.ts +3 -3
  388. package/esm/src/observability/mod.js +2 -2
  389. package/esm/src/observability/openinference.d.ts +1 -1
  390. package/esm/src/observability/openinference.js +3 -3
  391. package/esm/src/observability/otlp.d.ts +3 -0
  392. package/esm/src/observability/otlp.js +3 -3
  393. package/esm/src/observability/phoenix.d.ts +1 -0
  394. package/esm/src/observability/policy.d.ts +3 -0
  395. package/esm/src/observability/policy.js +5 -1
  396. package/esm/src/observability/resolve-policy.js +11 -5
  397. package/esm/src/observability/spans.d.ts +8 -2
  398. package/esm/src/observability/spans.js +21 -5
  399. package/esm/src/observability/trace-catalog.d.ts +19 -2
  400. package/esm/src/observability/trace-catalog.js +128 -87
  401. package/esm/src/observability/trace-record.js +22 -17
  402. package/esm/src/observability/trace-schema.d.ts +3 -0
  403. package/esm/src/observability/trace-schema.js +1 -1
  404. package/esm/src/observability/trace-sink.d.ts +1 -0
  405. package/esm/src/observability/trace-sink.js +1 -1
  406. package/esm/src/observability/trace-span.d.ts +7 -1
  407. package/esm/src/observability/trace-span.js +3 -1
  408. package/esm/src/observability/trace.d.ts +2 -0
  409. package/esm/src/observability/trace.js +4 -2
  410. package/esm/src/observability/types.d.ts +35 -11
  411. package/esm/src/observability/types.js +1 -1
  412. package/esm/src/presets/google/speech-voices.d.ts +1 -0
  413. package/esm/src/presets/google-limits.d.ts +1 -0
  414. package/esm/src/presets/google.d.ts +27 -12
  415. package/esm/src/presets/google.js +34 -25
  416. package/esm/src/presets/local.d.ts +26 -0
  417. package/esm/src/presets/local.js +30 -0
  418. package/esm/src/presets/mod.d.ts +5 -4
  419. package/esm/src/presets/mod.js +4 -4
  420. package/esm/src/presets/openrouter.d.ts +14 -1
  421. package/esm/src/presets/openrouter.js +19 -1
  422. package/esm/src/providers/embedding-limits.d.ts +7 -0
  423. package/esm/src/providers/embedding-limits.js +12 -0
  424. package/esm/src/providers/gemini/embedding-protocol.d.ts +8 -0
  425. package/esm/src/providers/gemini/embedding-protocol.js +125 -0
  426. package/esm/src/providers/gemini/interactions-protocol.d.ts +8 -0
  427. package/esm/src/providers/gemini/interactions-protocol.js +105 -0
  428. package/esm/src/providers/gemini/live-protocol.d.ts +3 -0
  429. package/esm/src/providers/gemini/live-protocol.js +191 -0
  430. package/esm/src/providers/gemini/prices.d.ts +3 -0
  431. package/esm/src/providers/gemini/prices.js +63 -0
  432. package/esm/src/providers/gemini/provider.d.ts +7 -0
  433. package/esm/src/providers/gemini/provider.js +39 -0
  434. package/esm/src/providers/google/builtins.d.ts +14 -0
  435. package/esm/src/providers/google/builtins.js +57 -0
  436. package/esm/src/providers/google/grounding.d.ts +4 -4
  437. package/esm/src/providers/google/interactions/framing.d.ts +20 -8
  438. package/esm/src/providers/google/interactions/framing.js +85 -44
  439. package/esm/src/providers/google/interactions/steps.d.ts +5 -5
  440. package/esm/src/providers/google/interactions/steps.js +4 -4
  441. package/esm/src/providers/google/interactions/stream.d.ts +10 -11
  442. package/esm/src/providers/google/interactions/stream.js +33 -100
  443. package/esm/src/providers/google/live/framing.d.ts +15 -5
  444. package/esm/src/providers/google/live/framing.js +25 -25
  445. package/esm/src/providers/google/live/stream.d.ts +6 -44
  446. package/esm/src/providers/google/live/stream.js +3 -209
  447. package/esm/src/providers/google/urls.d.ts +1 -3
  448. package/esm/src/providers/google/urls.js +1 -3
  449. package/esm/src/providers/google/usage.js +2 -2
  450. package/esm/src/providers/live.d.ts +6 -0
  451. package/esm/src/providers/live.js +6 -0
  452. package/esm/src/providers/local/embedding-protocol.d.ts +7 -0
  453. package/esm/src/providers/local/embedding-protocol.js +60 -0
  454. package/esm/src/providers/local/provider.d.ts +7 -0
  455. package/esm/src/providers/local/provider.js +28 -0
  456. package/esm/src/providers/mod.d.ts +28 -7
  457. package/esm/src/providers/mod.js +19 -3
  458. package/esm/src/providers/open-ai/protocol.d.ts +3 -0
  459. package/esm/src/providers/open-ai/protocol.js +189 -0
  460. package/esm/src/providers/openrouter/embedding-protocol.d.ts +6 -0
  461. package/esm/src/providers/openrouter/embedding-protocol.js +86 -0
  462. package/esm/src/providers/openrouter/image.d.ts +0 -9
  463. package/esm/src/providers/openrouter/image.js +0 -153
  464. package/esm/src/providers/openrouter/images-protocol.d.ts +3 -0
  465. package/esm/src/providers/openrouter/images-protocol.js +82 -0
  466. package/esm/src/providers/openrouter/openai/compat.d.ts +2 -2
  467. package/esm/src/providers/openrouter/openai/compat.js +6 -6
  468. package/esm/src/providers/openrouter/openai/image-payload.d.ts +2 -2
  469. package/esm/src/providers/openrouter/openai/reasoning-state.d.ts +2 -0
  470. package/esm/src/providers/openrouter/openai/reasoning-state.js +31 -0
  471. package/esm/src/providers/openrouter/protocol.d.ts +8 -0
  472. package/esm/src/providers/openrouter/protocol.js +171 -0
  473. package/esm/src/providers/openrouter/provider.d.ts +10 -0
  474. package/esm/src/providers/openrouter/provider.js +50 -0
  475. package/esm/src/providers/shared/carried-tool-files.d.ts +7 -0
  476. package/esm/src/providers/shared/carried-tool-files.js +43 -0
  477. package/esm/src/providers/shared/pcm.js +2 -2
  478. package/esm/src/providers/shared/protocol-events.d.ts +8 -0
  479. package/esm/src/providers/shared/protocol-events.js +20 -0
  480. package/esm/src/providers/shared/response-identity.d.ts +2 -2
  481. package/esm/src/providers/shared/retry.d.ts +17 -0
  482. package/esm/src/providers/shared/retry.js +90 -0
  483. package/esm/src/providers/shared/sse.d.ts +0 -4
  484. package/esm/src/providers/shared/sse.js +50 -36
  485. package/esm/src/providers/shared/tool-args.d.ts +6 -7
  486. package/esm/src/providers/shared/tool-args.js +10 -6
  487. package/esm/src/providers/shared/tool-draft.d.ts +16 -0
  488. package/esm/src/providers/shared/tool-draft.js +14 -0
  489. package/esm/src/providers/shared/upstream-tap.d.ts +2 -2
  490. package/esm/src/providers/shared/upstream-tape.js +1 -1
  491. package/esm/src/providers/system-one/protocol.d.ts +8 -0
  492. package/esm/src/providers/system-one/protocol.js +93 -0
  493. package/esm/src/providers/types.d.ts +48 -16
  494. package/esm/src/providers/types.js +2 -1
  495. package/esm/src/providers/typesafe/provider.d.ts +7 -0
  496. package/esm/src/providers/typesafe/provider.js +24 -0
  497. package/esm/src/surface/formats.d.ts +19 -1
  498. package/esm/src/surface/formats.js +68 -29
  499. package/esm/src/surface/mod.d.ts +4 -2
  500. package/esm/src/surface/mod.js +4 -2
  501. package/esm/src/surface/runtime.d.ts +4 -0
  502. package/esm/src/surface/runtime.js +2 -0
  503. package/esm/src/surface/tools.d.ts +2 -8
  504. package/esm/src/surface/tools.js +4 -22
  505. package/esm/src/surface/types.d.ts +6 -0
  506. package/package.json +5 -13
  507. package/esm/src/cli/commands/egress-compile.d.ts +0 -17
  508. package/esm/src/cli/commands/egress-compile.js +0 -25
  509. package/esm/src/guardrails/egress-policy.d.ts +0 -27
  510. package/esm/src/guardrails/egress-policy.js +0 -76
  511. package/esm/src/guardrails/egress-rules.d.ts +0 -54
  512. package/esm/src/guardrails/egress-rules.js +0 -49
  513. package/esm/src/guardrails/lexicon.d.ts +0 -30
  514. package/esm/src/guardrails/lexicon.js +0 -478
  515. package/esm/src/kernel/engine/media-probe/audio.d.ts +0 -7
  516. package/esm/src/kernel/engine/media-probe/audio.js +0 -342
  517. package/esm/src/kernel/engine/media-probe/bytes.d.ts +0 -6
  518. package/esm/src/kernel/engine/media-probe/bytes.js +0 -26
  519. package/esm/src/kernel/engine/media-probe/image.d.ts +0 -5
  520. package/esm/src/kernel/engine/media-probe/image.js +0 -171
  521. package/esm/src/kernel/engine/media-probe/iso-bmff.d.ts +0 -19
  522. package/esm/src/kernel/engine/media-probe/iso-bmff.js +0 -48
  523. package/esm/src/kernel/engine/media-probe/matroska.d.ts +0 -35
  524. package/esm/src/kernel/engine/media-probe/matroska.js +0 -226
  525. package/esm/src/kernel/engine/media-probe/mp4.d.ts +0 -22
  526. package/esm/src/kernel/engine/media-probe/mp4.js +0 -279
  527. package/esm/src/kernel/engine/media-probe/opus.d.ts +0 -4
  528. package/esm/src/kernel/engine/media-probe/opus.js +0 -23
  529. package/esm/src/kernel/engine/media-probe/pdf.d.ts +0 -5
  530. package/esm/src/kernel/engine/media-probe/pdf.js +0 -117
  531. package/esm/src/kernel/engine/media-probe/video.d.ts +0 -15
  532. package/esm/src/kernel/engine/media-probe/video.js +0 -49
  533. package/esm/src/presets/typesafe.d.ts +0 -2
  534. package/esm/src/presets/typesafe.js +0 -2
  535. package/esm/src/providers/create-provider.d.ts +0 -21
  536. package/esm/src/providers/create-provider.js +0 -90
  537. package/esm/src/providers/decision/usage.d.ts +0 -3
  538. package/esm/src/providers/decision/usage.js +0 -25
  539. package/esm/src/providers/google/interactions/mod.d.ts +0 -2
  540. package/esm/src/providers/google/interactions/mod.js +0 -2
  541. package/esm/src/providers/google/keys.d.ts +0 -20
  542. package/esm/src/providers/google/keys.js +0 -87
  543. package/esm/src/providers/google/live/mod.d.ts +0 -7
  544. package/esm/src/providers/google/live/mod.js +0 -7
  545. package/esm/src/providers/google/live/openapi-schema.d.ts +0 -1
  546. package/esm/src/providers/google/live/openapi-schema.js +0 -42
  547. package/esm/src/providers/google/live/session.d.ts +0 -14
  548. package/esm/src/providers/google/live/session.js +0 -150
  549. package/esm/src/providers/local/local.d.ts +0 -12
  550. package/esm/src/providers/local/local.js +0 -186
  551. package/esm/src/providers/local/mod.d.ts +0 -8
  552. package/esm/src/providers/local/mod.js +0 -8
  553. package/esm/src/providers/openrouter/cache-control.d.ts +0 -5
  554. package/esm/src/providers/openrouter/cache-control.js +0 -4
  555. package/esm/src/providers/openrouter/chat.d.ts +0 -64
  556. package/esm/src/providers/openrouter/chat.js +0 -490
  557. package/esm/src/providers/openrouter/openai/sdk-messages.d.ts +0 -10
  558. package/esm/src/providers/openrouter/openai/sdk-messages.js +0 -99
  559. package/esm/src/providers/openrouter/resolve-api-key.d.ts +0 -3
  560. package/esm/src/providers/openrouter/resolve-api-key.js +0 -8
  561. package/esm/src/providers/openrouter/speech.d.ts +0 -18
  562. package/esm/src/providers/openrouter/speech.js +0 -109
  563. package/esm/src/providers/probe.d.ts +0 -5
  564. package/esm/src/providers/probe.js +0 -15
  565. package/esm/src/providers/shared/builtin-wire.d.ts +0 -4
  566. package/esm/src/providers/shared/builtin-wire.js +0 -9
  567. package/esm/src/providers/shared/vault.d.ts +0 -13
  568. package/esm/src/providers/shared/vault.js +0 -41
@@ -1,7 +1,7 @@
1
- import { canaryNote, userDataNote } from '../../../guardrails/canary.js';
2
- import { isAbortError, TheoremError, throwIfAborted, withPublicWording, } from '../../../guardrails/error.js';
1
+ import { canaryNote, contextNote, profileCanary, userDataNote, } from '../../../guardrails/canary.js';
2
+ import { isAbortError, TheoremError, throwIfAborted, withPublicLabels, } from '../../../guardrails/error.js';
3
3
  import { projectGuardrailTurnEvent } from '../../../guardrails/events.js';
4
- import { lexiconText } from '../../../guardrails/lexicon.js';
4
+ import { labelText } from '../../../guardrails/labels.js';
5
5
  import { sanitizeTurnRequestWithEvents } from '../../../guardrails/sanitize.js';
6
6
  import { resolveTraceWriter } from '../../../observability/policy.js';
7
7
  import { resolveObservabilityPolicy } from '../../../observability/resolve-policy.js';
@@ -9,17 +9,18 @@ import { writeTrace } from '../../../observability/trace.js';
9
9
  import { buildRecord } from '../../../observability/trace-record.js';
10
10
  import { startTrace, traceContent, } from '../../../observability/trace-span.js';
11
11
  import { profileTypesForField } from '../../profile-scope.js';
12
- import { requireModelBinding } from '../../registry/catalog.js';
12
+ import { hostAgentModel, nestedTurnModel } from '../../provider-dispatch.js';
13
+ import { profileInputs, requireModelBinding } from '../../registry/catalog.js';
13
14
  import { resolveTurnInRegistry } from '../../registry/resolve.js';
14
15
  import { bindSystem } from '../../system-parts.js';
15
16
  import { cloneTurnToolSnapshot, expandT1Policy } from '../../tools/resolve.js';
16
- import { turnDoneOf } from '../../turn-events.js';
17
+ import { keptReply, turnDoneOf } from '../../turn-events.js';
17
18
  import { findLast } from '../../util/find-last.js';
18
19
  import { compactionMeter, compactionResult, compactorHistory, resolveCompactionTokens, shouldCompact, splitForCompaction, } from '../compaction.js';
19
- import { mediaTokenFamily } from '../token-estimate.js';
20
20
  import { endThrownSpan, endTurnSpan, guardrailAttributes, guardrailCheckAttributes, OutputFold, turnSpanOptions, } from '../turn-trace.js';
21
- import { sumEventTokens } from '../usage.js';
21
+ import { sumEventTokens, sumTurnTokens } from '../usage.js';
22
22
  import { runAttemptsWithValidation } from './gates.js';
23
+ import { createAgentCaller, NESTED_THROWS, turnError } from './nested.js';
23
24
  import { applyTurnStage } from './stages.js';
24
25
  import { openTurnState } from './state.js';
25
26
  import { shouldSkipStreamEvent } from './stream.js';
@@ -32,8 +33,8 @@ const MS_PER_S = 1000;
32
33
  * through here, so it is where an error gets the user's wording.
33
34
  */
34
35
  function deliver(ctx, event) {
35
- const out = withPublicWording(event, ctx.known?.lexicon);
36
- if (out.type === 'text' && !ctx.shownText) {
36
+ const out = withPublicLabels(event, ctx.known?.labels);
37
+ if ((out.type === 'text' || out.type === 'structured_draft') && !ctx.shownText) {
37
38
  ctx.shownText = true;
38
39
  ctx.root.set({ 'theorem.turn.time_to_first_text': ctx.root.msSinceStart() / MS_PER_S });
39
40
  }
@@ -50,19 +51,27 @@ function* emitObservedStage(ctx, stageEv, profile) {
50
51
  function getCompactionSpec(profile, modelId) {
51
52
  return profile.models[modelId]?.compaction;
52
53
  }
53
- /** Errors only the host can fix: the compactor throws them rather than failing quietly every turn. */
54
54
  /** A turn's tools when it offers none: an agent summarising its own history. */
55
55
  function noTools() {
56
56
  return { builtins: [], gated: [], visible: [], executable: [], wire: [] };
57
57
  }
58
- const COMPACTOR_THROWS = new Set(['config', 'request', 'auth', 'internal']);
59
- function turnError(events) {
60
- return events.find((e) => e.type === 'error');
58
+ /**
59
+ * Run `req` as a turn under `parent`: its spans join that record, it writes
60
+ * none of its own, and it shares the record's canaries. A compactor's turn and
61
+ * an agent tool's call both run here.
62
+ */
63
+ function runNestedTurn(args) {
64
+ const ctx = newTraceCtx(args.registry, args.req, args.parent.child(`invoke_agent ${args.req.profile}`, turnSpanOptions(args.req)), args.canaries);
65
+ ctx.agentDepth = args.agentDepth;
66
+ if (args.compacting)
67
+ ctx.compacting = args.compacting;
68
+ ctx.observability = resolveObservabilityPolicy(ctx.known?.observability);
69
+ return runTracedTurn(ctx, nestedTurnModel(args.provider, args.req.profile, args.req.model, args.req));
61
70
  }
62
71
  /**
63
72
  * Run the compaction profile as a turn under `span`: its spans join that
64
73
  * record and it writes none of its own. Anything short of a completed,
65
- * non-empty summary is a failure; the host's abort and `COMPACTOR_THROWS`
74
+ * non-empty summary is a failure; the host's abort and `NESTED_THROWS`
66
75
  * errors are thrown. With no `spec.profile` the owner compacts itself, on the
67
76
  * model it is compacting for and with no tools.
68
77
  */
@@ -75,24 +84,29 @@ async function runCompactor(args) {
75
84
  return { droppedMedia, failure: { unreadable: true } };
76
85
  const req = {
77
86
  profile: compactorId,
78
- // The turn already passed model selection; its default needs no naming.
87
+ // why: The turn already passed model selection; its default needs no naming.
79
88
  ...(self && args.model !== compactor.defaultModel ? { model: args.model } : {}),
80
- input: { text: lexiconText('compaction.request', {}, compactor.lexicon), history },
89
+ input: { text: labelText('compaction.request', {}, compactor.labels), history },
81
90
  signal: args.signal,
82
91
  };
83
- const ctx = newTraceCtx(args.registry, req, args.parent.child(`invoke_agent ${req.profile}`, turnSpanOptions(req)), args.canaries);
84
- ctx.compacting = self ? 'self' : 'other';
85
- ctx.observability = resolveObservabilityPolicy(ctx.known?.observability);
86
92
  const events = [];
87
93
  try {
88
- for await (const event of runTracedTurn(ctx, args.provider)) {
94
+ for await (const event of runNestedTurn({
95
+ registry: args.registry,
96
+ req,
97
+ provider: args.provider,
98
+ parent: args.parent,
99
+ canaries: args.canaries,
100
+ agentDepth: 0,
101
+ compacting: self ? 'self' : 'other',
102
+ })) {
89
103
  events.push(event);
90
104
  }
91
105
  }
92
106
  catch (err) {
93
107
  throwIfAborted(args.signal);
94
108
  const error = err instanceof TheoremError ? err.kind : 'internal';
95
- if (COMPACTOR_THROWS.has(error))
109
+ if (NESTED_THROWS.has(error))
96
110
  throw err;
97
111
  return { droppedMedia, failure: { error } };
98
112
  }
@@ -101,7 +115,7 @@ async function runCompactor(args) {
101
115
  const usage = tokens ? { tokens } : {};
102
116
  const stop = findLast(events, (e) => e.type === 'done')?.stop.kind;
103
117
  const reported = turnError(events);
104
- if (reported && COMPACTOR_THROWS.has(reported.errorKind)) {
118
+ if (reported && NESTED_THROWS.has(reported.errorKind)) {
105
119
  throw new TheoremError(reported.errorKind, `Compactor '${compactorId}' failed: ${reported.errorInternal ?? reported.error}`);
106
120
  }
107
121
  const error = reported?.errorKind;
@@ -112,9 +126,10 @@ async function runCompactor(args) {
112
126
  ...usage,
113
127
  };
114
128
  }
115
- const structured = findLast(events, (e) => e.type === 'structured')?.structured;
129
+ const reply = keptReply(events);
130
+ const structured = findLast(reply, (e) => e.type === 'structured')?.structured;
116
131
  const summary = structured === undefined
117
- ? events.flatMap((e) => (e.type === 'text' ? [e.text] : [])).join('')
132
+ ? reply.flatMap((e) => (e.type === 'text' ? [e.text] : [])).join('')
118
133
  : JSON.stringify(structured);
119
134
  if (!summary.trim()) {
120
135
  return { droppedMedia, failure: { stop, empty: true }, ...usage };
@@ -157,7 +172,6 @@ async function compactHistoryBeforeTurn(args) {
157
172
  const decision = await resolveCompactionTokens({
158
173
  spec: args.spec,
159
174
  input: args.input,
160
- family: args.family,
161
175
  });
162
176
  const needed = decision !== undefined && (await shouldCompact(decision, args.spec));
163
177
  const attributes = compactionDecision(args.spec, decision, needed);
@@ -165,7 +179,7 @@ async function compactHistoryBeforeTurn(args) {
165
179
  args.parent.event('theorem.compaction', attributes);
166
180
  return undefined;
167
181
  }
168
- const split = await splitForCompaction(args.history, args.spec, args.family);
182
+ const split = await splitForCompaction(args.history, args.spec);
169
183
  if (split.toCompact.length === 0) {
170
184
  args.parent.event('theorem.compaction', attributes);
171
185
  return undefined;
@@ -195,7 +209,6 @@ async function attachAfterCompaction(event, args) {
195
209
  spec: args.spec,
196
210
  input: args.input,
197
211
  prompt,
198
- family: args.family,
199
212
  });
200
213
  const needed = decision !== undefined && (await shouldCompact(decision, args.spec));
201
214
  args.span.event('theorem.compaction', compactionDecision(args.spec, decision, needed));
@@ -222,7 +235,7 @@ async function* emitTurn(args) {
222
235
  profile,
223
236
  generation,
224
237
  trace: args.trace,
225
- mediaFamily: args.mediaFamily,
238
+ ...(args.agents ? { agents: args.agents } : {}),
226
239
  });
227
240
  args.outState.state = state;
228
241
  const pre = yield* applyTurnStage({
@@ -257,9 +270,14 @@ async function* emitTurn(args) {
257
270
  return;
258
271
  }
259
272
  yield* runAttemptsWithValidation(safe, profile, generation, system, provider, state);
260
- const tokens = sumEventTokens(state.allEmittedEvents);
273
+ const tokens = sumTurnTokens(state.allEmittedEvents);
261
274
  const done = turnDoneOf({
262
275
  stop: state.lastStop ?? { kind: 'completed' },
276
+ ...(state.providerState &&
277
+ !('providerContinuation' in profile && profile.providerContinuation?.history === 'stateless') &&
278
+ (!state.lastStop || ['completed', 'tool', 'gate'].includes(state.lastStop.kind))
279
+ ? { providerState: state.providerState }
280
+ : {}),
263
281
  traceparent: state.trace.root.traceparent(),
264
282
  ...(tokens ? { tokens } : {}),
265
283
  }, cloneTurnToolSnapshot(generation.tools));
@@ -277,7 +295,7 @@ async function* streamTurnEvents(ctx, profile, gen, provider, compactionSpec) {
277
295
  system: ctx.system,
278
296
  provider,
279
297
  trace: ctx.trace,
280
- mediaFamily: ctx.mediaFamily,
298
+ agents: ctx.agents,
281
299
  outState: ctx,
282
300
  })) {
283
301
  const attached = await maybeAttachAfter(event, ctx, gen, compactionSpec);
@@ -285,7 +303,7 @@ async function* streamTurnEvents(ctx, profile, gen, provider, compactionSpec) {
285
303
  if (!shouldSkipStreamEvent(out, profile))
286
304
  yield deliver(ctx, out);
287
305
  if (out.type === 'done' && ctx.state) {
288
- // Skip duplicate post_turn when pre_turn abort already emitted it inside emitTurn.
306
+ // why: Skip duplicate post_turn when pre_turn abort already emitted it inside emitTurn.
289
307
  const alreadyPost = ctx.state.allEmittedEvents.some((e) => e.type === 'stage' && e.stage === 'post_turn');
290
308
  if (!alreadyPost) {
291
309
  for await (const stageEv of applyTurnStage({
@@ -314,6 +332,7 @@ function newTraceCtx(registry, req, root, canaries) {
314
332
  delivered: new OutputFold(),
315
333
  root,
316
334
  compacting: false,
335
+ agentDepth: 0,
317
336
  canary: '',
318
337
  canaries,
319
338
  };
@@ -357,6 +376,7 @@ async function* runTurnInRegistry(registry, req, provider, sinkOverride) {
357
376
  const { sink, policy } = resolveTraceWriter({
358
377
  override: sinkOverride,
359
378
  observability: ctx.known?.observability,
379
+ guardrails: ctx.known?.guardrails,
360
380
  });
361
381
  ctx.observability = policy;
362
382
  try {
@@ -383,14 +403,13 @@ async function* emitCancelledDoneAfterAbort(ctx) {
383
403
  const gen = ctx.generation;
384
404
  if (!(profile && gen && ctx.safe && ctx.trace))
385
405
  return;
386
- // The turn's own state when it got that far, so post_turn sees the history the model saw.
406
+ // why: The turn's own state when it got that far, so post_turn sees the history the model saw.
387
407
  const state = ctx.state ??
388
408
  openTurnState({
389
409
  tools: ctx.registry.tools,
390
410
  profile,
391
411
  generation: gen,
392
412
  trace: ctx.trace,
393
- mediaFamily: ctx.mediaFamily,
394
413
  allEmittedEvents: [...ctx.seen],
395
414
  });
396
415
  for await (const stageEv of applyTurnStage({
@@ -412,7 +431,7 @@ async function* runTurnBody(ctx, provider) {
412
431
  const checkMs = performance.now() - checkStart;
413
432
  ctx.safe = sanitized.request;
414
433
  const hits = sanitized.events.filter((event) => event.type === 'guardrail');
415
- // The check's time rides on its last decision, or on a pass when it found nothing.
434
+ // why: The check's time rides on its last decision, or on a pass when it found nothing.
416
435
  if (hits.length === 0) {
417
436
  ctx.root.event('theorem.guardrail', guardrailCheckAttributes('input', checkMs, undefined, { stage: 'input', trust: 'untrusted' }));
418
437
  }
@@ -424,48 +443,82 @@ async function* runTurnBody(ctx, provider) {
424
443
  }
425
444
  yield deliver(ctx, projectForObs(event, ctx.observability));
426
445
  }
446
+ if (sanitized.refusal)
447
+ throw sanitized.refusal;
427
448
  const { profile, generation: gen } = resolveTurnInRegistry(ctx.registry, ctx.safe);
428
449
  await expandT1Policy(ctx.registry.tools, gen.tools, profile, ctx.safe);
429
450
  if (ctx.compacting === 'self')
430
451
  gen.tools = noTools();
431
452
  gen.builtins = gen.tools.builtins;
453
+ if (gen.canary)
454
+ gen.canary = await profileCanary(profile.id, gen.resolvedSystem);
432
455
  ctx.generation = gen;
433
456
  ctx.canary = gen.canary;
434
457
  ctx.canaries.push(gen.canary);
435
458
  const binding = profile.models[gen.model];
436
- ctx.mediaFamily = binding ? mediaTokenFamily(binding) : undefined;
437
459
  ctx.trace = { root: ctx.root, attempt: 0, calls: 0, binding };
460
+ if (!ctx.compacting)
461
+ ctx.agents = agentCallerFor(ctx, provider, binding);
438
462
  throwIfAborted(ctx.safe.signal);
439
463
  const compactionSpec = ctx.compacting ? undefined : getCompactionSpec(profile, gen.model);
440
464
  const compaction = await maybeCompactBefore(ctx, profile, gen, compactionSpec, provider);
441
465
  if (compaction)
442
466
  yield deliver(ctx, projectForObs(compaction, ctx.observability));
443
467
  ctx.system = bindSystem(gen.resolvedSystem, [
444
- canaryNote(ctx.canary, profile.lexicon),
468
+ canaryNote(ctx.canary, profile.labels),
445
469
  profileTypesForField('identity.system').includes(profile.type)
446
- ? userDataNote(profile.lexicon)
470
+ ? userDataNote(profile.labels)
447
471
  : '',
472
+ profileInputs(profile)?.context ? contextNote(profile.labels) : '',
448
473
  ]);
449
474
  yield* streamTurnEvents(ctx, profile, gen, provider, compactionSpec);
450
475
  }
476
+ /** The turn's agent tool calls: each runs nested under its tool's span, in this record. */
477
+ function agentCallerFor(ctx, provider, own) {
478
+ return createAgentCaller({
479
+ registry: ctx.registry,
480
+ req: ctx.safe ?? ctx.req,
481
+ provider,
482
+ own,
483
+ depth: ctx.agentDepth,
484
+ runNested: (nested) => runNestedTurn({ ...nested, registry: ctx.registry, canaries: ctx.canaries }),
485
+ });
486
+ }
487
+ /**
488
+ * A host's own call's agent tools: the host's provider, or the one `onAgentCall`
489
+ * returns, runs each. Its nested turns bind their canaries into `canaries`.
490
+ */
491
+ function invokeAgentCaller(registry, request, canaries) {
492
+ return createAgentCaller({
493
+ registry,
494
+ req: request,
495
+ provider: request.provider ? hostAgentModel(registry, request.provider) : undefined,
496
+ own: undefined,
497
+ depth: 0,
498
+ runNested: (nested) => runNestedTurn({ ...nested, registry, canaries }),
499
+ });
500
+ }
501
+ /**
502
+ * A live session's agent tools: the session's own provider options, or those
503
+ * `onAgentCall` returns, run each. Its nested turns bind their canaries into
504
+ * `canaries`.
505
+ */
506
+ function sessionAgentCaller(registry, req, options, canaries) {
507
+ return createAgentCaller({
508
+ registry,
509
+ req: { ...req, execution: options.execution },
510
+ provider: hostAgentModel(registry, options),
511
+ own: undefined,
512
+ depth: 0,
513
+ runNested: (nested) => runNestedTurn({ ...nested, registry, canaries }),
514
+ });
515
+ }
451
516
  /**
452
517
  * The turn's provider runs the compactor only when it is the one the compactor
453
518
  * would get: a text profile on the same protocol and provider.
454
519
  */
455
520
  function compactorProvider(ctx, profile, spec, provider) {
456
- if (ctx.req.compactionProvider)
457
- return ctx.req.compactionProvider;
458
- if (spec.profile === undefined)
459
- return provider;
460
- const compactor = ctx.registry.profiles.get(spec.profile);
461
- const own = ctx.trace?.binding;
462
- const theirs = compactor.models[compactor.defaultModel];
463
- if (profile.type !== 'text' ||
464
- own?.provider !== theirs?.provider ||
465
- own?.protocol !== theirs?.protocol) {
466
- throw new TheoremError('config', `Profile ${profile.id} compacts with '${spec.profile}', which this turn's provider cannot run; pass compactionProvider`);
467
- }
468
- return provider;
521
+ return nestedTurnModel(provider, spec.profile ?? profile.id, spec.profile ? undefined : ctx.req.model);
469
522
  }
470
523
  async function maybeCompactBefore(ctx, profile, gen, compactionSpec, provider) {
471
524
  if (!(compactionSpec?.timing === 'before' && ctx.safe))
@@ -478,7 +531,6 @@ async function maybeCompactBefore(ctx, profile, gen, compactionSpec, provider) {
478
531
  owner: profile.id,
479
532
  model: gen.model,
480
533
  spec: compactionSpec,
481
- family: ctx.mediaFamily,
482
534
  history: gen.history,
483
535
  input: ctx.safe.input,
484
536
  provider: compactor,
@@ -496,7 +548,6 @@ async function maybeAttachAfter(event, ctx, gen, compactionSpec) {
496
548
  }
497
549
  return await attachAfterCompaction(event, {
498
550
  spec: compactionSpec,
499
- family: ctx.mediaFamily,
500
551
  history: gen.history ?? [],
501
552
  input: ctx.safe.input,
502
553
  seen: ctx.seen,
@@ -505,7 +556,7 @@ async function maybeAttachAfter(event, ctx, gen, compactionSpec) {
505
556
  }
506
557
  /**
507
558
  * `timing: 'after'`: run the compactor on the history `done.compaction` carried,
508
- * with the same split, failure rules and trace as `before`. `provider` runs the
559
+ * with the same split, failure rules, and trace as `before`. `provider` runs the
509
560
  * compactor. `undefined` when the split leaves nothing to compact.
510
561
  */
511
562
  async function compactHistoryInRegistry(registry, req, provider, sinkOverride) {
@@ -516,8 +567,7 @@ async function compactHistoryInRegistry(registry, req, provider, sinkOverride) {
516
567
  if (!spec) {
517
568
  throw new TheoremError('config', `Profile ${profile.id} model '${model}' has no compaction`);
518
569
  }
519
- const family = mediaTokenFamily(binding);
520
- const split = await splitForCompaction(req.history, spec, family);
570
+ const split = await splitForCompaction(req.history, spec);
521
571
  if (split.toCompact.length === 0)
522
572
  return undefined;
523
573
  const turnReq = {
@@ -532,6 +582,7 @@ async function compactHistoryInRegistry(registry, req, provider, sinkOverride) {
532
582
  const { sink, policy } = resolveTraceWriter({
533
583
  override: sinkOverride,
534
584
  observability: profile.observability,
585
+ guardrails: profile.guardrails,
535
586
  });
536
587
  const canaries = [];
537
588
  try {
@@ -571,4 +622,4 @@ async function compactHistoryInRegistry(registry, req, provider, sinkOverride) {
571
622
  }), policy);
572
623
  }
573
624
  }
574
- export { compactHistoryInRegistry, runTurnInRegistry };
625
+ export { compactHistoryInRegistry, invokeAgentCaller, runTurnInRegistry, sessionAgentCaller };
@@ -0,0 +1,32 @@
1
+ import type { ErrorKind } from '../../../guardrails/error.js';
2
+ import type { SpanHandle } from '../../../observability/trace-span.js';
3
+ import type { KernelRegistry } from '../../registry/kernel-registry.js';
4
+ import { type AgentCaller } from '../../tools/agent.js';
5
+ import type { ModelBinding, TurnEvent, TurnEventOf, TurnModel, TurnRequest } from '../../types.js';
6
+ /** Errors only the host can fix: a nested turn throws them rather than failing quietly every call. */
7
+ declare const NESTED_THROWS: ReadonlySet<ErrorKind>;
8
+ declare function turnError(events: readonly TurnEvent[]): TurnEventOf<'error'> | undefined;
9
+ /** Runs one turn of a profile under a parent span, sharing the parent's record and canaries. */
10
+ type RunNestedTurn = (args: {
11
+ req: TurnRequest;
12
+ provider: TurnModel;
13
+ parent: SpanHandle;
14
+ agentDepth: number;
15
+ }) => AsyncGenerator<TurnEvent>;
16
+ /**
17
+ * Agent tool calls for one turn. `own` is the turn's model binding: its
18
+ * provider runs a called agent on the same provider and protocol, and the
19
+ * host's hook supplies any other. Without `own` (an invoke) the provider is
20
+ * the host's own choice and runs as given.
21
+ */
22
+ declare function createAgentCaller(args: {
23
+ registry: KernelRegistry;
24
+ req: Pick<TurnRequest, 'onAgentCall' | 'metadata' | 'execution' | 'pageExecution'>;
25
+ provider: TurnModel | undefined;
26
+ own: ModelBinding | undefined;
27
+ /** 0 for the host's own turn or invoke. */
28
+ depth: number;
29
+ runNested: RunNestedTurn;
30
+ }): AgentCaller;
31
+ export type { RunNestedTurn };
32
+ export { createAgentCaller, NESTED_THROWS, turnError };
@@ -0,0 +1,134 @@
1
+ import { errorCopyText, isAbortError, TheoremError, throwIfAborted, toErrorEvent, } from '../../../guardrails/error.js';
2
+ import { labelText } from '../../../guardrails/labels.js';
3
+ import { nestedTurnModel, resolveRegisteredTurnModel } from '../../provider-dispatch.js';
4
+ import { agentProfileProblem, agentToolOutputOf, splitHostInput, } from '../../tools/agent.js';
5
+ import { findLast } from '../../util/find-last.js';
6
+ import { sumEventTokens } from '../usage.js';
7
+ /** Errors only the host can fix: a nested turn throws them rather than failing quietly every call. */
8
+ const NESTED_THROWS = new Set(['config', 'request', 'auth', 'internal']);
9
+ function turnError(events) {
10
+ return events.find((e) => e.type === 'error');
11
+ }
12
+ /**
13
+ * Agent tool calls for one turn. `own` is the turn's model binding: its
14
+ * provider runs a called agent on the same provider and protocol, and the
15
+ * host's hook supplies any other. Without `own` (an invoke) the provider is
16
+ * the host's own choice and runs as given.
17
+ */
18
+ function createAgentCaller(args) {
19
+ const calls = new Map();
20
+ const { registry, req } = args;
21
+ return {
22
+ async *run({ tool, callId, input, caller, span, signal }) {
23
+ const labels = caller.labels;
24
+ const settled = (code, kind, message) => ({
25
+ failure: { code, kind, message },
26
+ });
27
+ const made = calls.get(tool.name) ?? 0;
28
+ if (tool.maxCallsPerTurn !== undefined && made >= tool.maxCallsPerTurn) {
29
+ return settled('call_limit', 'declined', labelText('tool.agent_call_limit', { tool: tool.name }, labels));
30
+ }
31
+ calls.set(tool.name, made + 1);
32
+ const profile = registry.profiles.get(tool.profile);
33
+ const problem = agentProfileProblem(profile, (name) => registry.tools.get(name));
34
+ if (problem) {
35
+ throw new TheoremError('config', `Agent tool "${tool.name}" can't run '${tool.profile}': ${problem}`);
36
+ }
37
+ const { sent: modelInput, hostInput } = splitHostInput(tool, input);
38
+ if (hostInput && !req.onAgentCall) {
39
+ throw new TheoremError('config', `Agent tool "${tool.name}" declares host fields, which need the request's onAgentCall`);
40
+ }
41
+ const shaped = await req.onAgentCall?.({
42
+ tool: tool.name,
43
+ callId,
44
+ profile: tool.profile,
45
+ input: modelInput,
46
+ ...(hostInput ? { hostInput } : {}),
47
+ caller: caller.id,
48
+ depth: args.depth + 1,
49
+ ...(req.metadata ? { metadata: req.metadata } : {}),
50
+ ...(signal ? { signal } : {}),
51
+ });
52
+ if (shaped && 'refuse' in shaped) {
53
+ return settled('refused_by_host', 'declined', shaped.refuse);
54
+ }
55
+ const { provider: hostProvider, ...fields } = shaped ?? {};
56
+ const provider = agentProvider(args, profile.id, fields.model, hostProvider);
57
+ if (!span) {
58
+ throw new TheoremError('internal', `Agent tool "${tool.name}" ran without a span`); // labels-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
59
+ }
60
+ const { speech, ...sent } = modelInput;
61
+ const events = [];
62
+ try {
63
+ for await (const event of args.runNested({
64
+ req: {
65
+ ...(speech ? { speech } : {}),
66
+ ...fields,
67
+ profile: tool.profile,
68
+ execution: req.execution,
69
+ pageExecution: req.pageExecution,
70
+ input: fields.input ?? sent,
71
+ ...(signal ? { signal } : {}),
72
+ ...(req.onAgentCall ? { onAgentCall: req.onAgentCall } : {}),
73
+ },
74
+ provider,
75
+ parent: span,
76
+ agentDepth: args.depth + 1,
77
+ })) {
78
+ events.push(event);
79
+ yield event;
80
+ }
81
+ }
82
+ catch (err) {
83
+ // why: A turn refused before it starts (a file the agent does not take) throws; the caller's model reads it like any other failed call.
84
+ if (!(err instanceof TheoremError) || NESTED_THROWS.has(err.kind) || isAbortError(err)) {
85
+ throw err;
86
+ }
87
+ events.push(toErrorEvent(err));
88
+ }
89
+ throwIfAborted(signal);
90
+ return agentRunOf(events, tool.name, tool.profile, labels);
91
+ },
92
+ };
93
+ }
94
+ /** The provider an agent's turn runs on: the host's for this call, else the caller's, else the registry's. */
95
+ function agentProvider(from, profileId, model, hostProvider) {
96
+ if (hostProvider)
97
+ return resolveRegisteredTurnModel(from.registry, profileId, model, hostProvider);
98
+ if (from.provider)
99
+ return nestedTurnModel(from.provider, profileId, model);
100
+ return resolveRegisteredTurnModel(from.registry, profileId, model, {});
101
+ }
102
+ /** The agent's reply, or why there is none. Errors only the host can fix are thrown. */
103
+ function agentRunOf(events, toolName, profileId, labels) {
104
+ const done = findLast(events, (e) => e.type === 'done');
105
+ const tokens = done?.tokens ?? sumEventTokens(events);
106
+ const usage = tokens ? { tokens } : {};
107
+ const reported = turnError(events);
108
+ if (reported && NESTED_THROWS.has(reported.errorKind)) {
109
+ throw new TheoremError(reported.errorKind, `Agent '${profileId}' failed: ${reported.errorInternal ?? reported.error}`);
110
+ }
111
+ const stop = done?.stop.kind;
112
+ if (stop !== 'completed' || reported) {
113
+ const failed = labelText('tool.agent_failed', { tool: toolName }, labels);
114
+ // why: Reasons the agent's turn named (a file it does not take, a model that is busy) let the caller's model correct the call or say why.
115
+ const reason = reported?.errorCopy
116
+ ? errorCopyText(reported.errorCopy, labels)
117
+ : reported?.error;
118
+ return {
119
+ failure: {
120
+ code: 'agent_failed',
121
+ kind: reported?.errorKind ?? 'failed',
122
+ message: reason ? `${failed}\n${reason}` : failed,
123
+ details: {
124
+ agent: profileId,
125
+ ...(stop ? { stop } : {}),
126
+ ...(reported?.errorCopy ? { reasons: reported.errorCopy } : {}),
127
+ },
128
+ },
129
+ ...usage,
130
+ };
131
+ }
132
+ return { output: agentToolOutputOf(events), ...usage };
133
+ }
134
+ export { createAgentCaller, NESTED_THROWS, turnError };
@@ -1,4 +1,4 @@
1
- import type { ProfileValidator } from '../../types.js';
1
+ import type { ItemCheckTurn, ProfileItemRule, ProfileValidator } from '../../types.js';
2
2
  interface ValidationFailure {
3
3
  path: string;
4
4
  error: string;
@@ -9,6 +9,27 @@ declare function isAbsent(value: unknown): boolean;
9
9
  * paths and for optional paths that are present. Throws when the root is not an object schema.
10
10
  */
11
11
  declare function collectValidationFailures(jsonSchema: Record<string, unknown>, structured: unknown, fields: Record<string, ProfileValidator> | undefined, slots?: Record<string, string>): Promise<ValidationFailure[]>;
12
+ /**
13
+ * Whether a validator keyed by `path` can run against `jsonSchema`: each segment is a
14
+ * property or required key of an object schema, as `collectValidationFailures` walks it.
15
+ */
16
+ declare function schemaReaches(jsonSchema: Record<string, unknown>, path: string): boolean;
12
17
  declare function formatValidationFailures(failures: ValidationFailure[]): string;
13
- export type { ValidationFailure };
14
- export { collectValidationFailures, formatValidationFailures, isAbsent };
18
+ /** One list item an item rule refused: where it sat, the item, and why. */
19
+ interface ItemFailure {
20
+ path: string;
21
+ index: number;
22
+ item: unknown;
23
+ reason: string;
24
+ onFail: ProfileItemRule['onFail'];
25
+ }
26
+ /** The value at a dotted path, reached through object properties only. */
27
+ declare function valueAt(structured: unknown, path: string): unknown;
28
+ /** `structured` with the list at `path` replaced; every object on the way is copied. */
29
+ declare function withListAt(structured: unknown, path: string, list: unknown[]): unknown;
30
+ /** Each item an item rule refuses, in the reply's own order. A path with no list has no items. */
31
+ declare function collectItemFailures(structured: unknown, items: Record<string, ProfileItemRule> | undefined, turn: ItemCheckTurn): Promise<ItemFailure[]>;
32
+ /** The schema of one item of the list at `path`, or `undefined` when the path reaches no list with one. */
33
+ declare function itemSchemaAt(jsonSchema: Record<string, unknown>, path: string): Record<string, unknown> | undefined;
34
+ export type { ItemFailure, ValidationFailure };
35
+ export { collectItemFailures, collectValidationFailures, formatValidationFailures, isAbsent, itemSchemaAt, schemaReaches, valueAt, withListAt, };