@theoremjs/agents 0.3.0 → 0.3.2

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 (570) hide show
  1. package/README.md +277 -995
  2. package/esm/mod.d.ts +34 -20
  3. package/esm/mod.js +19 -12
  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 +25 -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 +881 -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 +30 -22
  123. package/esm/src/guardrails/mod.js +19 -14
  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 +4 -1
  135. package/esm/src/guardrails/quota.js +7 -2
  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 +5 -2
  148. package/esm/src/guardrails/theorem-error.js +6 -3
  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 +8 -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 +174 -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 +329 -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 +130 -88
  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 +102 -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/api-error.d.ts +2 -0
  435. package/esm/src/providers/google/api-error.js +26 -18
  436. package/esm/src/providers/google/builtins.d.ts +14 -0
  437. package/esm/src/providers/google/builtins.js +57 -0
  438. package/esm/src/providers/google/grounding.d.ts +4 -4
  439. package/esm/src/providers/google/interactions/framing.d.ts +20 -8
  440. package/esm/src/providers/google/interactions/framing.js +85 -44
  441. package/esm/src/providers/google/interactions/steps.d.ts +5 -5
  442. package/esm/src/providers/google/interactions/steps.js +4 -4
  443. package/esm/src/providers/google/interactions/stream.d.ts +10 -11
  444. package/esm/src/providers/google/interactions/stream.js +33 -100
  445. package/esm/src/providers/google/live/framing.d.ts +15 -5
  446. package/esm/src/providers/google/live/framing.js +25 -25
  447. package/esm/src/providers/google/live/stream.d.ts +6 -44
  448. package/esm/src/providers/google/live/stream.js +4 -210
  449. package/esm/src/providers/google/urls.d.ts +1 -3
  450. package/esm/src/providers/google/urls.js +1 -3
  451. package/esm/src/providers/google/usage.js +2 -2
  452. package/esm/src/providers/live.d.ts +6 -0
  453. package/esm/src/providers/live.js +6 -0
  454. package/esm/src/providers/local/embedding-protocol.d.ts +7 -0
  455. package/esm/src/providers/local/embedding-protocol.js +60 -0
  456. package/esm/src/providers/local/provider.d.ts +7 -0
  457. package/esm/src/providers/local/provider.js +28 -0
  458. package/esm/src/providers/mod.d.ts +28 -7
  459. package/esm/src/providers/mod.js +19 -3
  460. package/esm/src/providers/open-ai/protocol.d.ts +3 -0
  461. package/esm/src/providers/open-ai/protocol.js +189 -0
  462. package/esm/src/providers/openrouter/embedding-protocol.d.ts +6 -0
  463. package/esm/src/providers/openrouter/embedding-protocol.js +86 -0
  464. package/esm/src/providers/openrouter/image.d.ts +0 -9
  465. package/esm/src/providers/openrouter/image.js +0 -153
  466. package/esm/src/providers/openrouter/images-protocol.d.ts +3 -0
  467. package/esm/src/providers/openrouter/images-protocol.js +82 -0
  468. package/esm/src/providers/openrouter/openai/compat.d.ts +2 -2
  469. package/esm/src/providers/openrouter/openai/compat.js +6 -6
  470. package/esm/src/providers/openrouter/openai/image-payload.d.ts +2 -2
  471. package/esm/src/providers/openrouter/openai/reasoning-state.d.ts +2 -0
  472. package/esm/src/providers/openrouter/openai/reasoning-state.js +31 -0
  473. package/esm/src/providers/openrouter/protocol.d.ts +8 -0
  474. package/esm/src/providers/openrouter/protocol.js +171 -0
  475. package/esm/src/providers/openrouter/provider.d.ts +10 -0
  476. package/esm/src/providers/openrouter/provider.js +50 -0
  477. package/esm/src/providers/shared/carried-tool-files.d.ts +7 -0
  478. package/esm/src/providers/shared/carried-tool-files.js +43 -0
  479. package/esm/src/providers/shared/pcm.js +2 -2
  480. package/esm/src/providers/shared/protocol-events.d.ts +8 -0
  481. package/esm/src/providers/shared/protocol-events.js +20 -0
  482. package/esm/src/providers/shared/response-identity.d.ts +2 -2
  483. package/esm/src/providers/shared/retry.d.ts +18 -0
  484. package/esm/src/providers/shared/retry.js +89 -0
  485. package/esm/src/providers/shared/sse.d.ts +0 -4
  486. package/esm/src/providers/shared/sse.js +50 -36
  487. package/esm/src/providers/shared/tool-args.d.ts +6 -7
  488. package/esm/src/providers/shared/tool-args.js +10 -6
  489. package/esm/src/providers/shared/tool-draft.d.ts +16 -0
  490. package/esm/src/providers/shared/tool-draft.js +14 -0
  491. package/esm/src/providers/shared/upstream-tap.d.ts +2 -2
  492. package/esm/src/providers/shared/upstream-tape.js +1 -1
  493. package/esm/src/providers/system-one/protocol.d.ts +8 -0
  494. package/esm/src/providers/system-one/protocol.js +93 -0
  495. package/esm/src/providers/types.d.ts +48 -16
  496. package/esm/src/providers/types.js +2 -1
  497. package/esm/src/providers/typesafe/provider.d.ts +7 -0
  498. package/esm/src/providers/typesafe/provider.js +24 -0
  499. package/esm/src/surface/formats.d.ts +19 -1
  500. package/esm/src/surface/formats.js +68 -29
  501. package/esm/src/surface/mod.d.ts +4 -2
  502. package/esm/src/surface/mod.js +4 -2
  503. package/esm/src/surface/runtime.d.ts +4 -0
  504. package/esm/src/surface/runtime.js +2 -0
  505. package/esm/src/surface/tools.d.ts +2 -8
  506. package/esm/src/surface/tools.js +4 -22
  507. package/esm/src/surface/types.d.ts +6 -0
  508. package/package.json +5 -13
  509. package/esm/src/cli/commands/egress-compile.d.ts +0 -17
  510. package/esm/src/cli/commands/egress-compile.js +0 -25
  511. package/esm/src/guardrails/egress-policy.d.ts +0 -27
  512. package/esm/src/guardrails/egress-policy.js +0 -76
  513. package/esm/src/guardrails/egress-rules.d.ts +0 -54
  514. package/esm/src/guardrails/egress-rules.js +0 -49
  515. package/esm/src/guardrails/lexicon.d.ts +0 -30
  516. package/esm/src/guardrails/lexicon.js +0 -478
  517. package/esm/src/kernel/engine/media-probe/audio.d.ts +0 -7
  518. package/esm/src/kernel/engine/media-probe/audio.js +0 -342
  519. package/esm/src/kernel/engine/media-probe/bytes.d.ts +0 -6
  520. package/esm/src/kernel/engine/media-probe/bytes.js +0 -26
  521. package/esm/src/kernel/engine/media-probe/image.d.ts +0 -5
  522. package/esm/src/kernel/engine/media-probe/image.js +0 -171
  523. package/esm/src/kernel/engine/media-probe/iso-bmff.d.ts +0 -19
  524. package/esm/src/kernel/engine/media-probe/iso-bmff.js +0 -48
  525. package/esm/src/kernel/engine/media-probe/matroska.d.ts +0 -35
  526. package/esm/src/kernel/engine/media-probe/matroska.js +0 -226
  527. package/esm/src/kernel/engine/media-probe/mp4.d.ts +0 -22
  528. package/esm/src/kernel/engine/media-probe/mp4.js +0 -279
  529. package/esm/src/kernel/engine/media-probe/opus.d.ts +0 -4
  530. package/esm/src/kernel/engine/media-probe/opus.js +0 -23
  531. package/esm/src/kernel/engine/media-probe/pdf.d.ts +0 -5
  532. package/esm/src/kernel/engine/media-probe/pdf.js +0 -117
  533. package/esm/src/kernel/engine/media-probe/video.d.ts +0 -15
  534. package/esm/src/kernel/engine/media-probe/video.js +0 -49
  535. package/esm/src/presets/typesafe.d.ts +0 -2
  536. package/esm/src/presets/typesafe.js +0 -2
  537. package/esm/src/providers/create-provider.d.ts +0 -21
  538. package/esm/src/providers/create-provider.js +0 -90
  539. package/esm/src/providers/decision/usage.d.ts +0 -3
  540. package/esm/src/providers/decision/usage.js +0 -25
  541. package/esm/src/providers/google/interactions/mod.d.ts +0 -2
  542. package/esm/src/providers/google/interactions/mod.js +0 -2
  543. package/esm/src/providers/google/keys.d.ts +0 -20
  544. package/esm/src/providers/google/keys.js +0 -87
  545. package/esm/src/providers/google/live/mod.d.ts +0 -7
  546. package/esm/src/providers/google/live/mod.js +0 -7
  547. package/esm/src/providers/google/live/openapi-schema.d.ts +0 -1
  548. package/esm/src/providers/google/live/openapi-schema.js +0 -42
  549. package/esm/src/providers/google/live/session.d.ts +0 -14
  550. package/esm/src/providers/google/live/session.js +0 -150
  551. package/esm/src/providers/local/local.d.ts +0 -12
  552. package/esm/src/providers/local/local.js +0 -186
  553. package/esm/src/providers/local/mod.d.ts +0 -8
  554. package/esm/src/providers/local/mod.js +0 -8
  555. package/esm/src/providers/openrouter/cache-control.d.ts +0 -5
  556. package/esm/src/providers/openrouter/cache-control.js +0 -4
  557. package/esm/src/providers/openrouter/chat.d.ts +0 -64
  558. package/esm/src/providers/openrouter/chat.js +0 -490
  559. package/esm/src/providers/openrouter/openai/sdk-messages.d.ts +0 -10
  560. package/esm/src/providers/openrouter/openai/sdk-messages.js +0 -99
  561. package/esm/src/providers/openrouter/resolve-api-key.d.ts +0 -3
  562. package/esm/src/providers/openrouter/resolve-api-key.js +0 -8
  563. package/esm/src/providers/openrouter/speech.d.ts +0 -18
  564. package/esm/src/providers/openrouter/speech.js +0 -109
  565. package/esm/src/providers/probe.d.ts +0 -5
  566. package/esm/src/providers/probe.js +0 -15
  567. package/esm/src/providers/shared/builtin-wire.d.ts +0 -4
  568. package/esm/src/providers/shared/builtin-wire.js +0 -9
  569. package/esm/src/providers/shared/vault.d.ts +0 -13
  570. package/esm/src/providers/shared/vault.js +0 -41
@@ -5,6 +5,8 @@ export declare function pathMatches(catalogPaths?: string[], turnPath?: string):
5
5
  export declare function applyBuiltinMutualExclusions(tools: ToolRegistry, requested: string[]): string[];
6
6
  export declare function profileToolAllow(profile: Profile): readonly ToolId[];
7
7
  export declare function profileToolsSpec(profile: Profile): ProfileToolsSpec | undefined;
8
+ /** `tools.parallel` as the profile sets it: whether a step's calls run side by side. */
9
+ export declare function profileToolsParallel(profile: Profile): boolean | undefined;
8
10
  export declare function resolveAllowedCustomToolIds(tools: ToolRegistry, profile: Profile, req: TurnRequest): ToolId[];
9
11
  export declare function resolveModelBuiltinIds(tools: ToolRegistry, profile: ModelProfile, req: TurnRequest, modelId: ModelId): ToolId[];
10
12
  export declare function wireForTool(tools: ToolRegistry, name: string): WireFunctionTool | undefined;
@@ -15,6 +17,7 @@ export declare function promoteBuiltin(tools: ToolRegistry, state: TurnToolSnaps
15
17
  export declare function initialVisible(tools: ToolRegistry, profile: Profile, gated: ToolId[]): ToolId[];
16
18
  export declare function initialBuiltins(tools: ToolRegistry, profile: Profile, gated: ToolId[]): ToolId[];
17
19
  export declare function resolveTurnTools(tools: ToolRegistry, profile: Profile, req: TurnRequest, modelId: ModelId | undefined): TurnToolSnapshot;
20
+ /** Resolves the tools a turn may call into a snapshot, then applies the profile's `t1Policy` to it. */
18
21
  export declare function prepareTurnToolSnapshot(tools: ToolRegistry, profile: Profile, req: TurnRequest, modelId: ModelId | undefined): Promise<TurnToolSnapshot>;
19
22
  /** So concurrent host invokes do not share mutable state. */
20
23
  export declare function cloneTurnToolSnapshot(state: TurnToolSnapshot): TurnToolSnapshot;
@@ -30,6 +30,10 @@ export function profileToolAllow(profile) {
30
30
  export function profileToolsSpec(profile) {
31
31
  return profile.type === 'text' || profile.type === 'image' ? profile.tools : undefined;
32
32
  }
33
+ /** `tools.parallel` as the profile sets it: whether a step's calls run side by side. */
34
+ export function profileToolsParallel(profile) {
35
+ return 'tools' in profile ? profile.tools.parallel : undefined;
36
+ }
33
37
  export function resolveAllowedCustomToolIds(tools, profile, req) {
34
38
  return profileToolAllow(profile).filter((id) => {
35
39
  const tool = tools.get(id);
@@ -117,7 +121,10 @@ export function initialBuiltins(tools, profile, gated) {
117
121
  }
118
122
  export function resolveTurnTools(tools, profile, req, modelId) {
119
123
  const customAllowed = resolveAllowedCustomToolIds(tools, profile, req);
120
- const modelBuiltins = profile.type === 'host' || profile.type === 'decision' || modelId === undefined
124
+ const modelBuiltins = profile.type === 'host' ||
125
+ profile.type === 'decision' ||
126
+ profile.type === 'embedding' ||
127
+ modelId === undefined
121
128
  ? []
122
129
  : resolveModelBuiltinIds(tools, profile, req, modelId);
123
130
  const gated = [...customAllowed, ...modelBuiltins];
@@ -134,6 +141,7 @@ export function resolveTurnTools(tools, profile, req, modelId) {
134
141
  wire: buildWire(tools, visible),
135
142
  };
136
143
  }
144
+ /** Resolves the tools a turn may call into a snapshot, then applies the profile's `t1Policy` to it. */
137
145
  export async function prepareTurnToolSnapshot(tools, profile, req, modelId) {
138
146
  const snapshot = resolveTurnTools(tools, profile, req, modelId);
139
147
  await expandT1Policy(tools, snapshot, profile, req);
@@ -174,14 +182,14 @@ export async function expandT1Policy(tools, state, profile, req) {
174
182
  });
175
183
  }
176
184
  if (!Array.isArray(selected)) {
177
- throw new TheoremError('config', `Profile '${profile.id}' tools.t1Policy must return ToolId[]`); // lexicon-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
185
+ throw new TheoremError('config', `Profile '${profile.id}' tools.t1Policy must return ToolId[]`); // labels-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
178
186
  }
179
187
  for (const id of selected) {
180
188
  if (!state.gated.includes(id)) {
181
189
  continue;
182
190
  }
183
191
  const tool = tools.get(id);
184
- if (!tool || tool.loadTier === 'T0') {
192
+ if (tool?.loadTier !== 'T2') {
185
193
  continue;
186
194
  }
187
195
  if (tool.type === 'builtin') {
@@ -216,7 +224,7 @@ export function promoteLoadedTools(tools, state, loaded, profile) {
216
224
  failure: {
217
225
  code: 'invalid_output',
218
226
  kind: 'bad_response',
219
- message: 'tools.t2Loader loaded ids must be plain strings', // lexicon-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
227
+ message: 'tools.t2Loader loaded ids must be plain strings', // labels-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
220
228
  },
221
229
  };
222
230
  }
@@ -0,0 +1,28 @@
1
+ /**
2
+ * A call's end, for a host that wants how a call settled rather than its stream:
3
+ * `settledCall` and `settledCalls` read a started `invokeTool` or `invokeToolStep` and give each
4
+ * call's terminal `tool` event with every event it emitted. `runTool` and `runToolStep` use them.
5
+ */
6
+ import type { ToolPhaseEvent, TurnEvent } from '../turn-events.js';
7
+ import type { StartedInvoke, StartedStep } from './invoke.js';
8
+ /** The phase a call ends on: it completed, a gate held it, or it failed. */
9
+ export type SettledToolCall = Extract<ToolPhaseEvent, {
10
+ phase: 'complete' | 'gate' | 'error';
11
+ }> & {
12
+ /** Kernel-issued identity; a gate's resume carries it. */
13
+ operationId?: string;
14
+ };
15
+ /** A settled call, every event it emitted in order, and the last activity label it ran under. */
16
+ export type ToolCallResult = SettledToolCall & {
17
+ events: TurnEvent[];
18
+ activity?: string;
19
+ };
20
+ /** A step's call, settled: its place in the step's `calls` beside its result. */
21
+ export type ToolStepCallResult = ToolCallResult & {
22
+ index: number;
23
+ };
24
+ /** Run one call to its end. */
25
+ declare function settledCall(started: StartedInvoke): Promise<ToolCallResult>;
26
+ /** Run a step's calls, yielding each one's result as it settles; a call the step never settled comes last. */
27
+ declare function settledCalls(started: StartedStep): AsyncGenerator<ToolStepCallResult>;
28
+ export { settledCall, settledCalls };
@@ -0,0 +1,86 @@
1
+ /**
2
+ * A call's end, for a host that wants how a call settled rather than its stream:
3
+ * `settledCall` and `settledCalls` read a started `invokeTool` or `invokeToolStep` and give each
4
+ * call's terminal `tool` event with every event it emitted. `runTool` and `runToolStep` use them.
5
+ */
6
+ import { labelText } from '../../guardrails/labels.js';
7
+ function isSettled(tool) {
8
+ return tool.phase === 'complete' || tool.phase === 'gate' || tool.phase === 'error';
9
+ }
10
+ function foldTool(fold, tool) {
11
+ if (tool.phase === 'running')
12
+ fold.activity = tool.activity ?? fold.activity;
13
+ if (isSettled(tool))
14
+ fold.settled = tool;
15
+ }
16
+ /** The call's result; a call that never settled failed as the invoke's own error says, else as not run. */
17
+ function settle(fold, invokeError) {
18
+ const settled = fold.settled ?? {
19
+ phase: 'error',
20
+ name: fold.name,
21
+ callId: fold.callId,
22
+ at: Date.now(),
23
+ failure: {
24
+ code: 'invoke_failed',
25
+ kind: invokeError?.errorKind ?? 'internal',
26
+ message: invokeError?.errorInternal ??
27
+ invokeError?.error ??
28
+ labelText('tool.did_not_run', { tool: fold.name }),
29
+ },
30
+ };
31
+ return {
32
+ ...settled,
33
+ events: fold.events,
34
+ ...(fold.activity ? { activity: fold.activity } : {}),
35
+ };
36
+ }
37
+ /** Run one call to its end. */
38
+ async function settledCall(started) {
39
+ const fold = {
40
+ name: started.name,
41
+ callId: started.callId,
42
+ events: [],
43
+ };
44
+ let invokeError;
45
+ for await (const event of started.events) {
46
+ fold.events.push(event);
47
+ if (event.type === 'error')
48
+ invokeError = event;
49
+ if (event.type === 'tool' && event.tool.callId === started.callId) {
50
+ foldTool(fold, event.tool);
51
+ }
52
+ }
53
+ return settle(fold, invokeError);
54
+ }
55
+ /** Run a step's calls, yielding each one's result as it settles; a call the step never settled comes last. */
56
+ async function* settledCalls(started) {
57
+ const folds = started.calls.map(({ name, callId }) => ({
58
+ name,
59
+ callId,
60
+ events: [],
61
+ }));
62
+ const byCallId = new Map(started.calls.map(({ callId }, index) => [callId, index]));
63
+ const yielded = new Set();
64
+ let invokeError;
65
+ for await (const event of started.events) {
66
+ if (event.type === 'error')
67
+ invokeError = event;
68
+ if (event.type !== 'tool')
69
+ continue;
70
+ const index = byCallId.get(event.tool.callId);
71
+ const fold = index === undefined ? undefined : folds[index];
72
+ if (index === undefined || !fold)
73
+ continue;
74
+ fold.events.push(event);
75
+ foldTool(fold, event.tool);
76
+ if (fold.settled && !yielded.has(index)) {
77
+ yielded.add(index);
78
+ yield { ...settle(fold, invokeError), index };
79
+ }
80
+ }
81
+ for (const [index, fold] of folds.entries()) {
82
+ if (!yielded.has(index))
83
+ yield { ...settle(fold, invokeError), index };
84
+ }
85
+ }
86
+ export { settledCall, settledCalls };
@@ -1,9 +1,9 @@
1
1
  import { type ZodType } from 'zod';
2
2
  export type JsonSchema = Record<string, unknown>;
3
- declare function validateToolInputSchema(schema: JsonSchema, mode?: 'gemini' | 'structural'): void;
4
- declare function validateToolOutputSchema(schema: JsonSchema, mode?: 'gemini' | 'structural'): void;
3
+ /** A structural check only: what a provider accepts is its own API's answer. */
4
+ declare function validateToolSchema(schema: JsonSchema, label: 'input' | 'output'): void;
5
5
  declare function jsonSchemaFromZod(schema: ZodType, io?: 'input' | 'output'): JsonSchema;
6
- export { jsonSchemaFromZod, validateToolInputSchema, validateToolOutputSchema };
6
+ export { jsonSchemaFromZod, validateToolSchema };
7
7
  /** Strips prototype-pollution keys before validation. */
8
8
  export declare function plainToolInput(input: unknown): unknown;
9
9
  /** A placeholder in the scheme or authority would let tool input choose where the credential goes. */
@@ -1,153 +1,74 @@
1
1
  import { z } from 'zod';
2
2
  import { TheoremError } from '../../guardrails/error.js';
3
- const GEMINI_SUPPORTED_SCHEMA_KEYS = [
4
- 'type',
5
- 'format',
6
- 'title',
7
- 'description',
8
- 'nullable',
9
- 'enum',
10
- 'default',
11
- 'example',
12
- 'items',
13
- 'minItems',
14
- 'maxItems',
15
- 'properties',
16
- 'required',
17
- 'propertyOrdering',
18
- 'minProperties',
19
- 'maxProperties',
20
- 'minimum',
21
- 'maximum',
22
- 'pattern',
23
- 'minLength',
24
- 'maxLength',
25
- 'anyOf',
26
- 'oneOf',
27
- ];
28
- function validateGeminiKeys(schema, path, errors) {
29
- for (const key of Object.keys(schema)) {
30
- if (!GEMINI_SUPPORTED_SCHEMA_KEYS.includes(key)) {
31
- errors.push(`${path}: unsupported Gemini schema key '${key}'`); // lexicon-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
32
- }
33
- }
34
- }
35
- function validateSchemaShape(schema, path, mode, errors) {
3
+ function validateSchemaShape(schema, path, errors) {
36
4
  if (!schema || typeof schema !== 'object' || Array.isArray(schema)) {
37
- errors.push(`${path}: schema must be an object`); // lexicon-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
5
+ errors.push(`${path}: schema must be an object`); // labels-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
38
6
  return false;
39
7
  }
40
8
  const hasType = typeof schema.type === 'string' || Array.isArray(schema.type);
41
9
  const hasCombinator = schema.anyOf !== undefined || schema.oneOf !== undefined;
42
10
  if (!hasType && !hasCombinator) {
43
- if (mode === 'structural' && path !== '$') {
11
+ if (path !== '$') {
44
12
  return true;
45
13
  }
46
- errors.push(`${path}: missing type or combinator`); // lexicon-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
47
- }
48
- if (mode === 'gemini') {
49
- validateGeminiKeys(schema, path, errors);
14
+ errors.push(`${path}: missing type or combinator`); // labels-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
50
15
  }
51
16
  if (schema.type === 'array' && schema.items === undefined) {
52
- errors.push(`${path}: array schema must define items`); // lexicon-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
17
+ errors.push(`${path}: array schema must define items`); // labels-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
53
18
  }
54
19
  return true;
55
20
  }
56
- function walkSchemaProperties(props, required, path, mode, errors) {
21
+ function walkSchemaProperties(props, required, path, errors) {
57
22
  const reqList = Array.isArray(required) ? required : [];
58
23
  for (const req of reqList) {
59
- if (typeof req === 'string' && !(req in props)) {
60
- errors.push(`${path}: required key '${req}' missing from properties`); // lexicon-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
24
+ if (typeof req === 'string' && !Object.hasOwn(props, req)) {
25
+ errors.push(`${path}: required key '${req}' missing from properties`); // labels-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
61
26
  }
62
27
  }
63
28
  for (const [key, child] of Object.entries(props)) {
64
29
  if (child && typeof child === 'object') {
65
- walkSchema(child, `${path}.properties.${key}`, mode, errors);
30
+ walkSchema(child, `${path}.properties.${key}`, errors);
66
31
  }
67
32
  }
68
33
  }
69
- function walkSchema(schema, path, mode, errors) {
70
- if (!validateSchemaShape(schema, path, mode, errors))
34
+ function walkSchema(schema, path, errors) {
35
+ if (!validateSchemaShape(schema, path, errors))
71
36
  return;
72
37
  const props = schema.properties;
73
38
  if (props && typeof props === 'object' && !Array.isArray(props)) {
74
- walkSchemaProperties(props, schema.required, path, mode, errors);
39
+ walkSchemaProperties(props, schema.required, path, errors);
75
40
  }
76
41
  if (schema.items && typeof schema.items === 'object' && !Array.isArray(schema.items)) {
77
- walkSchema(schema.items, `${path}.items`, mode, errors);
42
+ walkSchema(schema.items, `${path}.items`, errors);
78
43
  }
79
44
  for (const combinator of ['anyOf', 'oneOf']) {
80
45
  const branch = schema[combinator];
81
46
  if (Array.isArray(branch)) {
82
47
  branch.forEach((entry, index) => {
83
48
  if (entry && typeof entry === 'object') {
84
- walkSchema(entry, `${path}.${combinator}[${index}]`, mode, errors);
49
+ walkSchema(entry, `${path}.${combinator}[${index}]`, errors);
85
50
  }
86
51
  });
87
52
  }
88
53
  }
89
54
  }
90
- function validateToolWireSchema(schema, mode = 'gemini', label = 'input') {
55
+ /** A structural check only: what a provider accepts is its own API's answer. */
56
+ function validateToolSchema(schema, label) {
91
57
  const errors = [];
92
- walkSchema(schema, '$', mode, errors);
58
+ walkSchema(schema, '$', errors);
93
59
  if (errors.length > 0) {
94
- throw new TheoremError('config', `Invalid tool ${label} schema: ${errors.join('; ')}`); // lexicon-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
95
- }
96
- }
97
- function validateToolInputSchema(schema, mode = 'gemini') {
98
- validateToolWireSchema(schema, mode, 'input');
99
- }
100
- function validateToolOutputSchema(schema, mode = 'structural') {
101
- validateToolWireSchema(schema, mode, 'output');
102
- }
103
- function stripProperties(value) {
104
- const props = {};
105
- if (value && typeof value === 'object' && !Array.isArray(value)) {
106
- for (const [propKey, propValue] of Object.entries(value)) {
107
- if (propValue && typeof propValue === 'object') {
108
- props[propKey] = stripUnsupportedGeminiKeys(propValue);
109
- }
110
- }
111
- }
112
- return props;
113
- }
114
- function stripBranches(branches) {
115
- return branches.map((entry) => entry && typeof entry === 'object' ? stripUnsupportedGeminiKeys(entry) : entry);
116
- }
117
- function stripUnsupportedGeminiKeys(schema) {
118
- const out = {};
119
- for (const [key, value] of Object.entries(schema)) {
120
- if (!GEMINI_SUPPORTED_SCHEMA_KEYS.includes(key)) {
121
- continue;
122
- }
123
- if (key === 'properties') {
124
- out.properties = stripProperties(value);
125
- continue;
126
- }
127
- if (key === 'items' && value && typeof value === 'object' && !Array.isArray(value)) {
128
- out.items = stripUnsupportedGeminiKeys(value);
129
- continue;
130
- }
131
- if ((key === 'anyOf' || key === 'oneOf') && Array.isArray(value)) {
132
- out[key] = stripBranches(value);
133
- continue;
134
- }
135
- out[key] = value;
60
+ throw new TheoremError('config', `Invalid tool ${label} schema: ${errors.join('; ')}`); // labels-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
136
61
  }
137
- return out;
138
62
  }
139
63
  function jsonSchemaFromZod(schema, io = 'output') {
140
- const json = z.toJSONSchema(schema, {
141
- target: 'openApi3',
142
- io,
143
- });
64
+ const json = z.toJSONSchema(schema, { target: 'draft-7', io });
144
65
  delete json.$schema;
145
66
  if (!json.type) {
146
67
  json.type = 'object';
147
68
  }
148
- return stripUnsupportedGeminiKeys(json);
69
+ return json;
149
70
  }
150
- export { jsonSchemaFromZod, validateToolInputSchema, validateToolOutputSchema };
71
+ export { jsonSchemaFromZod, validateToolSchema };
151
72
  /** Strips prototype-pollution keys before validation. */
152
73
  export function plainToolInput(input) {
153
74
  if (input === null || typeof input !== 'object') {
@@ -5,7 +5,7 @@
5
5
  * @module
6
6
  */
7
7
  import type { RequestChecks } from './events.js';
8
- import { type CredentialRefusal } from './remote.js';
8
+ import { type CredentialQuery, type CredentialRefusal } from './remote.js';
9
9
  import type { SignedInFetch, ToolContext } from './types.js';
10
10
  /** Thrown by a signed-in fetch when the service refuses the credential; the kernel settles it. */
11
11
  export declare class CredentialRefusedError extends Error {
@@ -14,5 +14,6 @@ export declare class CredentialRefusedError extends Error {
14
14
  }
15
15
  export declare function signedInFetch(prepared: {
16
16
  authHeaders: Record<string, string>;
17
+ query?: CredentialQuery;
17
18
  audience?: string;
18
19
  }, ctx: ToolContext, checks: RequestChecks): SignedInFetch;
@@ -7,12 +7,12 @@
7
7
  import { fetchGuarded } from '../../guardrails/network.js';
8
8
  import { TheoremError } from '../../guardrails/theorem-error.js';
9
9
  import { toolNetworkPolicy } from './events.js';
10
- import { audienceMismatch, credentialRefusal, refusalAsksForSignIn, } from './remote.js';
10
+ import { audienceMismatch, credentialRefusal, refusalAsksForSignIn, withCredentialQuery, } from './remote.js';
11
11
  /** Thrown by a signed-in fetch when the service refuses the credential; the kernel settles it. */
12
12
  export class CredentialRefusedError extends Error {
13
13
  refusal;
14
14
  constructor(refusal) {
15
- super(`The service refused the credential (HTTP ${refusal.status}).`); // lexicon-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
15
+ super(`The service refused the credential (HTTP ${refusal.status}).`); // labels-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
16
16
  this.name = 'CredentialRefusedError';
17
17
  this.refusal = refusal;
18
18
  }
@@ -23,7 +23,7 @@ export function signedInFetch(prepared, ctx, checks) {
23
23
  const mismatch = audienceMismatch(prepared.audience, target);
24
24
  if (mismatch)
25
25
  throw new TheoremError('config', mismatch);
26
- const response = await fetchGuarded(target.href, {
26
+ const response = await fetchGuarded(withCredentialQuery(target, prepared.query).href, {
27
27
  method: request.method ?? 'GET',
28
28
  headers: request.headers,
29
29
  body: request.body,
@@ -1,10 +1,21 @@
1
1
  import type { z } from 'zod';
2
- import { type LexiconOverrides } from '../../guardrails/lexicon.js';
2
+ import { type LabelOverrides } from '../../guardrails/labels.js';
3
3
  import type { SpanHandle } from '../../observability/trace-span.js';
4
- import { type InjectUnit, type StageHandler, type StageResult } from '../stages.js';
4
+ import type { ToolAccess } from '../schema.js';
5
+ import { type InjectUnit, type StageHandler, type StageResult, type StepCall } from '../stages.js';
5
6
  import type { Profile, TurnEvent, TurnHistoryMessage } from '../types.js';
6
7
  import { type ToolCallBase } from './events.js';
7
- import type { ModelToolResult, ToolContext, ToolFailure, ToolGate } from './types.js';
8
+ import type { ModelToolResult, ToolContext, ToolFailure, ToolGate, ToolLabels } from './types.js';
9
+ /** How a call's wait for other calls in its step ended: they settled, or the wait cannot end. */
10
+ export type StepWaitOutcome = {
11
+ ok: true;
12
+ } | {
13
+ ok: false;
14
+ reason: 'unknown' | 'cycle';
15
+ callIds: string[];
16
+ };
17
+ /** Holds `callId` until the calls it names have settled. */
18
+ export type StepWait = (callId: string, waitFor: readonly string[]) => Promise<StepWaitOutcome>;
8
19
  export interface ToolStageSupport {
9
20
  /** In order: request `onStage`, then turn/session ambient. */
10
21
  handlers: StageHandler[];
@@ -17,6 +28,12 @@ export interface ToolStageSupport {
17
28
  host?: unknown;
18
29
  signal?: AbortSignal;
19
30
  span?: SpanHandle;
31
+ /** The step's calls, shown to `pre_tool`. Unset outside a turn's step. */
32
+ stepCalls?: readonly StepCall[];
33
+ /** Holds a call for the calls its `pre_tool` `waitFor` names. Unset outside a turn's step. */
34
+ wait?: StepWait;
35
+ /** The host sees a handler's drafts: `outputs.streaming.mode` `sse`. Unset outside a turn's step. */
36
+ drafts?: boolean;
20
37
  }
21
38
  export type PreBodyOutcome = {
22
39
  ok: true;
@@ -31,6 +48,7 @@ export type PreBodyOutcome = {
31
48
  ok: false;
32
49
  kind: 'gated';
33
50
  gate: ToolGate;
51
+ input?: unknown;
34
52
  } | {
35
53
  ok: false;
36
54
  kind: 'failed';
@@ -52,6 +70,7 @@ export type PostToolStageOutcome = {
52
70
  mutate?: {
53
71
  output: unknown;
54
72
  };
73
+ labelFailed?: true;
55
74
  };
56
75
  /** Tool `preTool` → host `pre_tool` → mutate re-parse. */
57
76
  export declare function runPreToolPipeline(args: {
@@ -60,6 +79,8 @@ export declare function runPreToolPipeline(args: {
60
79
  input: {
61
80
  safeParse: (value: unknown) => z.ZodSafeParseResult<unknown>;
62
81
  };
82
+ access: ToolAccess;
83
+ labels?: ToolLabels;
63
84
  preTool?: (input: never, ctx: ToolContext) => StageResult | undefined | Promise<StageResult | undefined>;
64
85
  };
65
86
  input: unknown;
@@ -75,6 +96,8 @@ export declare function runPostToolStages(args: {
75
96
  callNotStarted?: boolean;
76
97
  outputRaw?: unknown;
77
98
  outputModel?: ModelToolResult;
99
+ activityPast?: string;
100
+ activityFailed?: string;
78
101
  failure?: ToolFailure;
79
102
  awaiting?: boolean;
80
103
  /** False when there is no completed output for `mutate` to replace. */
@@ -89,5 +112,5 @@ export declare function emitGateSettlement(args: {
89
112
  gate: ToolGate;
90
113
  callId: string;
91
114
  toolName: string;
92
- lexicon: LexiconOverrides | undefined;
115
+ labels: LabelOverrides | undefined;
93
116
  }): AsyncGenerator<TurnEvent, string | undefined>;
@@ -1,7 +1,9 @@
1
- import { lexiconText } from '../../guardrails/lexicon.js';
1
+ import { labelText } from '../../guardrails/labels.js';
2
+ import { jsonObjectSchema } from '../json.js';
2
3
  import { runStage, stageEventFields, } from '../stages.js';
3
4
  import { toolEvent } from './events.js';
4
- import { isGateResumeGranted } from './permission.js';
5
+ import { operationWireValue } from './operation.js';
6
+ import { gateDetails, isGateResumeGranted } from './permission.js';
5
7
  import { plainToolInput } from './schema.js';
6
8
  function defaultToolStageSupport(ctx) {
7
9
  return {
@@ -18,8 +20,11 @@ function defaultToolStageSupport(ctx) {
18
20
  export async function* runPreToolPipeline(args) {
19
21
  const { tool, ctx, base, stages } = args;
20
22
  let toolPreTool;
21
- // An approval skips the tool's own check it already passed — unless the user edited the arguments.
22
- const approvedAsIs = isGateResumeGranted(ctx.resume) && ctx.resume?.edited === undefined;
23
+ // why: An approval skips the tool's own check it already passed — unless the user edited the arguments.
24
+ const approvedAsIs = isGateResumeGranted(ctx.resume) &&
25
+ ctx.resume?.edited === undefined &&
26
+ ctx.resume?.gateKind !== 'permission' &&
27
+ ctx.resume?.gateKind !== 'auth';
23
28
  if (tool.preTool && !approvedAsIs) {
24
29
  toolPreTool = (await tool.preTool(args.input, ctx)) ?? undefined;
25
30
  }
@@ -32,31 +37,61 @@ export async function* runPreToolPipeline(args) {
32
37
  callId: base.callId,
33
38
  input: args.input,
34
39
  toolPreTool,
40
+ details: gateDetails(tool, args.input),
35
41
  });
36
42
  if (!pre.ok) {
37
- if (pre.kind === 'gated')
43
+ if (pre.kind === 'gated') {
44
+ if ('input' in pre) {
45
+ const candidate = pre.input;
46
+ const parsed = tool.input.safeParse(plainToolInput(candidate));
47
+ if (!parsed.success) {
48
+ return {
49
+ ok: false,
50
+ kind: 'failed',
51
+ failure: {
52
+ code: 'invalid_input',
53
+ kind: 'bad_response',
54
+ message: labelText('tool.input_invalid_after_mutate', {}, ctx.profile.labels),
55
+ details: parsed.error.flatten(),
56
+ },
57
+ };
58
+ }
59
+ pre.gate = {
60
+ ...pre.gate,
61
+ ...gateDetails(tool, parsed.data),
62
+ preparedArguments: jsonObjectSchema.parse(operationWireValue(plainToolInput(candidate))),
63
+ };
64
+ }
65
+ yield stageEventFields('pre_tool', {
66
+ callId: base.callId,
67
+ toolName: tool.name,
68
+ callNotStarted: true,
69
+ gate: pre.gate,
70
+ });
38
71
  yield toolEvent(base, { phase: 'gate', gate: pre.gate });
72
+ }
39
73
  return pre;
40
74
  }
41
- if (!pre.mutated)
42
- return { ok: true, input: pre.input };
43
- const reparsed = tool.input.safeParse(plainToolInput(pre.input));
44
- if (!reparsed.success) {
75
+ const reparsed = pre.mutated ? tool.input.safeParse(plainToolInput(pre.input)) : undefined;
76
+ if (reparsed && !reparsed.success) {
45
77
  return {
46
78
  ok: false,
47
79
  kind: 'failed',
48
80
  failure: {
49
81
  code: 'invalid_input',
50
82
  kind: 'bad_response',
51
- message: lexiconText('tool.input_invalid_after_mutate', {}, args.ctx.profile.lexicon),
83
+ message: labelText('tool.input_invalid_after_mutate', {}, args.ctx.profile.labels),
52
84
  details: reparsed.error.flatten(),
53
85
  },
54
86
  };
55
87
  }
56
- return { ok: true, input: reparsed.data };
88
+ const waitFailure = await waitForStepCalls(stages, base.callId, tool.name, pre.waitFor, ctx.profile.labels);
89
+ if (waitFailure)
90
+ return { ok: false, kind: 'failed', failure: waitFailure };
91
+ return { ok: true, input: reparsed ? reparsed.data : pre.input };
57
92
  }
58
93
  async function* runPreToolStages(args) {
59
- const { stages, toolName, callId, input, toolPreTool } = args;
94
+ const { stages, toolName, callId, input, toolPreTool, details } = args;
60
95
  const applied = yield* runStage({
61
96
  stage: 'pre_tool',
62
97
  step: stages.step,
@@ -70,6 +105,7 @@ async function* runPreToolStages(args) {
70
105
  callId,
71
106
  tool: toolName,
72
107
  input,
108
+ ...(stages.stepCalls ? { stepCalls: stages.stepCalls } : {}),
73
109
  });
74
110
  if (applied.abort) {
75
111
  return { ok: false, kind: 'aborted', aborted: applied.abort };
@@ -87,14 +123,35 @@ async function* runPreToolStages(args) {
87
123
  kind: 'confirmation',
88
124
  tool: toolName,
89
125
  ...(applied.confirm.summary ? { summary: applied.confirm.summary } : {}),
126
+ ...details,
127
+ };
128
+ return {
129
+ ok: false,
130
+ kind: 'gated',
131
+ gate,
132
+ ...(applied.mutate && 'input' in applied.mutate ? { input: applied.mutate.input } : {}),
90
133
  };
91
- yield stageEventFields('pre_tool', { callId, toolName, callNotStarted: true, gate });
92
- return { ok: false, kind: 'gated', gate };
93
134
  }
135
+ const waitFor = applied.waitFor ? { waitFor: applied.waitFor } : {};
94
136
  if (applied.mutate && 'input' in applied.mutate) {
95
- return { ok: true, input: applied.mutate.input, mutated: true };
137
+ return { ok: true, input: applied.mutate.input, mutated: true, ...waitFor };
96
138
  }
97
- return { ok: true, input, mutated: false };
139
+ return { ok: true, input, mutated: false, ...waitFor };
140
+ }
141
+ /** Holds the call for the calls its `pre_tool` named; a wait that cannot end fails the call. */
142
+ async function waitForStepCalls(stages, callId, toolName, waitFor, labels) {
143
+ if (!waitFor)
144
+ return undefined;
145
+ const outcome = stages?.wait
146
+ ? await stages.wait(callId, waitFor)
147
+ : { ok: false, reason: 'unknown', callIds: [...waitFor] };
148
+ if (outcome.ok)
149
+ return undefined;
150
+ return {
151
+ code: outcome.reason === 'unknown' ? 'wait_unknown' : 'wait_cycle',
152
+ kind: 'request',
153
+ message: labelText(outcome.reason === 'unknown' ? 'tool.wait_unknown' : 'tool.wait_cycle', { tool: toolName, calls: outcome.callIds.join(', ') }, labels),
154
+ };
98
155
  }
99
156
  export async function* runPostToolStages(args) {
100
157
  const { stages, toolName, callId, mutable, ...call } = args;
@@ -118,6 +175,7 @@ export async function* runPostToolStages(args) {
118
175
  ...(applied.abort !== undefined ? { abort: applied.abort } : {}),
119
176
  ...(applied.deny ? { deny: applied.deny } : {}),
120
177
  ...(applied.mutate && 'output' in applied.mutate ? { mutate: applied.mutate } : {}),
178
+ ...(applied.labelFailed ? { labelFailed: true } : {}),
121
179
  inject: applied.inject,
122
180
  };
123
181
  }
@@ -133,7 +191,7 @@ export async function* emitGateSettlement(args) {
133
191
  gate: args.gate,
134
192
  });
135
193
  const readBack = args.gate.kind === 'auth'
136
- ? lexiconText('sign_in.pending', { service: args.gate.authChallenge.service }, args.lexicon)
194
+ ? labelText('sign_in.pending', { service: args.gate.authChallenge.service }, args.labels)
137
195
  : undefined;
138
196
  yield toolEvent(args.base, { phase: 'gate', gate: args.gate, ...(readBack ? { readBack } : {}) });
139
197
  return readBack;