@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
@@ -1,13 +1,16 @@
1
1
  import type { ApiKeyCredential, BearerCredential } from '../auth/types.js';
2
2
  import type { ToolPermission } from '../schema.js';
3
3
  import type { ToolAuthChallenge } from '../turn-events.js';
4
- import type { InvokeToolResume } from './types.js';
4
+ import type { InvokeToolResume, PageAnswer } from './types.js';
5
5
  /** What a sign-in gate asks for, minus the challenge's OAuth details. */
6
6
  export type ToolGateAuth = Pick<ToolAuthChallenge, 'slot' | 'authType' | 'service'>;
7
7
  /** A bad value is refused when `owner` is built, not when a gate expires. */
8
8
  export declare function resolveGateTtlMs(owner: string, gateTtlMs: number | undefined): number;
9
+ /** True when the gate has waited as long as its time limit. */
9
10
  export declare function gateExpired(createdAt: number, now: number, ttlMs: number): boolean;
11
+ /** How a user can answer a tool gate: approve it, deny it, or walk away. */
10
12
  export declare const GATE_DECISIONS: readonly ["approve", "deny", "abandon"];
13
+ /** One of {@linkcode GATE_DECISIONS}. */
11
14
  export type GateDecision = (typeof GATE_DECISIONS)[number];
12
15
  /** `edited.from` is the input the model proposed. */
13
16
  export type GateAnswer = {
@@ -18,10 +21,11 @@ export type GateAnswer = {
18
21
  } | {
19
22
  decision: 'deny' | 'abandon';
20
23
  };
21
- /** `signIn` when the gate answered is a sign-in, so a refusal tells the model so. */
24
+ /** `signIn` when the gate answered is a sign-in, so the model is told the person signed in or why not. */
22
25
  export declare function resumeForAnswer(answer: GateAnswer, signIn?: boolean): InvokeToolResume;
23
26
  /** Only a `session_consent` approval lasts the session; any other gate is approved for this call only. */
24
27
  export declare function sessionPermissionsAfterApproval(sessionPermissions: readonly string[], toolName: string, permission?: ToolPermission): string[];
28
+ /** The user's answer to a held tool call. */
25
29
  export type GateAnswerRequest = {
26
30
  callId: string;
27
31
  decision: GateDecision;
@@ -29,14 +33,19 @@ export type GateAnswerRequest = {
29
33
  input?: unknown;
30
34
  /** The key typed at a sign-in gate; approvals only. */
31
35
  secret?: string;
36
+ /** The page's answer at a `page` gate; approvals only. */
37
+ page?: PageAnswer;
32
38
  };
39
+ /** A tool call held at a gate, with what answering it needs. */
33
40
  export type HeldGatedCall = {
41
+ gateKind?: import('../schema.js').ToolGateKind;
34
42
  name: string;
35
43
  arguments: Record<string, unknown>;
36
44
  permission?: ToolPermission;
37
45
  /** Absent on any gate other than sign-in. */
38
46
  auth?: ToolGateAuth;
39
47
  };
48
+ /** A tool call's gate once answered: how the call resumes and the permissions after. */
40
49
  export type AnsweredGate = {
41
50
  resume: InvokeToolResume;
42
51
  input: unknown;
@@ -45,6 +54,7 @@ export type AnsweredGate = {
45
54
  slot: string;
46
55
  credential: BearerCredential | ApiKeyCredential;
47
56
  };
57
+ page?: PageAnswer;
48
58
  };
49
59
  /** Shared by `createTheoremHandler` and `runSession`. A refused key throws, so the gate keeps waiting for another. */
50
60
  export declare function answerGatedCall(request: GateAnswerRequest, call: HeldGatedCall, sessionPermissions: readonly string[]): AnsweredGate;
@@ -9,14 +9,20 @@ export function resolveGateTtlMs(owner, gateTtlMs) {
9
9
  }
10
10
  return ttl;
11
11
  }
12
+ /** True when the gate has waited as long as its time limit. */
12
13
  export function gateExpired(createdAt, now, ttlMs) {
13
14
  return now - createdAt >= ttlMs;
14
15
  }
16
+ /** How a user can answer a tool gate: approve it, deny it, or walk away. */
15
17
  export const GATE_DECISIONS = ['approve', 'deny', 'abandon'];
16
- /** `signIn` when the gate answered is a sign-in, so a refusal tells the model so. */
18
+ /** `signIn` when the gate answered is a sign-in, so the model is told the person signed in or why not. */
17
19
  export function resumeForAnswer(answer, signIn = false) {
18
20
  if (answer.decision === 'approve') {
19
- return answer.edited ? { granted: true, edited: answer.edited } : { granted: true };
21
+ return {
22
+ granted: true,
23
+ ...(answer.edited ? { edited: answer.edited } : {}),
24
+ ...(signIn ? { signIn } : {}),
25
+ };
20
26
  }
21
27
  return {
22
28
  granted: false,
@@ -33,9 +39,10 @@ export function sessionPermissionsAfterApproval(sessionPermissions, toolName, pe
33
39
  }
34
40
  /** Shared by `createTheoremHandler` and `runSession`. A refused key throws, so the gate keeps waiting for another. */
35
41
  export function answerGatedCall(request, call, sessionPermissions) {
36
- const { callId, decision, input, secret } = request;
37
- if ((input !== undefined || secret !== undefined) && decision !== 'approve') {
38
- throw new TheoremError('request', `only an approval takes edited input or a secret (call ${callId})`);
42
+ const { callId, decision, input, secret, page } = request;
43
+ const approvalOnly = input !== undefined || secret !== undefined || page !== undefined;
44
+ if (approvalOnly && decision !== 'approve') {
45
+ throw new TheoremError('request', `only an approval takes edited input, a secret, or a page answer (call ${callId})`);
39
46
  }
40
47
  if (decision !== 'approve') {
41
48
  return {
@@ -46,9 +53,13 @@ export function answerGatedCall(request, call, sessionPermissions) {
46
53
  }
47
54
  const typed = secret === undefined ? undefined : credentialForSignInGate(call.auth, secret);
48
55
  return {
49
- resume: resumeForAnswer(input === undefined ? { decision } : { decision, edited: { from: call.arguments } }),
56
+ resume: {
57
+ ...resumeForAnswer(input === undefined ? { decision } : { decision, edited: { from: call.arguments } }, call.auth !== undefined),
58
+ ...(call.gateKind ? { gateKind: call.gateKind } : {}),
59
+ },
50
60
  input: input ?? call.arguments,
51
61
  sessionPermissions: sessionPermissionsAfterApproval(sessionPermissions, call.name, call.permission),
52
62
  ...(typed ? { typed } : {}),
63
+ ...(page ? { page } : {}),
53
64
  };
54
65
  }
@@ -0,0 +1,45 @@
1
+ import type { ToolBoundary } from '../../guardrails/boundaries.js';
2
+ import type { Provenance, ResolvedGuardrailPolicy } from '../../guardrails/types.js';
3
+ import type { TurnEvent } from '../types.js';
4
+ import { type ToolCallBase } from './events.js';
5
+ import type { ToolStreamEvent } from './types.js';
6
+ /** A handler's event as the tool phase it is, unchecked. */
7
+ export declare function yieldHandlerSideEvent(base: ToolCallBase, event: Exclude<ToolStreamEvent, {
8
+ kind: 'complete';
9
+ }>): Generator<TurnEvent>;
10
+ /** What a handler's events are read against: what its output is read against at the end. */
11
+ export interface HandlerEventChecks {
12
+ profileId: string;
13
+ provenance: Provenance;
14
+ policy: ResolvedGuardrailPolicy;
15
+ /** `tool_output_<kind>`. */
16
+ boundary: ToolBoundary;
17
+ /** `tool_shown_<kind>`: what its artifacts and trace are read at. */
18
+ shown: ToolBoundary;
19
+ callableTools: readonly string[];
20
+ /** Whether the host sees the handler's drafts (`outputs.streaming.mode` `sse`). */
21
+ drafts: boolean;
22
+ }
23
+ /**
24
+ * A handler's events before its output, as the host may see them; an HTTP tool's body as it arrives
25
+ * comes through here as drafts too. Its `progress` is read whole at
26
+ * the output's boundary: one a check stops is not sent, and its guardrail event is. Its drafts are
27
+ * read piece by piece there, as one text: a match stops the rest of them, and the output's own
28
+ * check reports it.
29
+ */
30
+ export declare class HandlerEvents {
31
+ private readonly base;
32
+ private readonly checks;
33
+ private readonly drafts;
34
+ constructor(base: ToolCallBase, checks: HandlerEventChecks | undefined);
35
+ show(event: Exclude<ToolStreamEvent, {
36
+ kind: 'complete';
37
+ }>): AsyncGenerator<TurnEvent>;
38
+ /** The drafts' tail the gate still holds, once the handler has returned. */
39
+ end(): Generator<TurnEvent>;
40
+ private draft;
41
+ /** `value` as the person is shown it, read at `tool_shown_<kind>`; one a match blocks is not sent. */
42
+ private shown;
43
+ /** Whether a check at the output's boundary stops `data`; a flag lets it through unreported. */
44
+ private progressStops;
45
+ }
@@ -0,0 +1,106 @@
1
+ import { createDraftGate, DraftReader, } from '../../guardrails/progressive-yield.js';
2
+ import { guardShownValue, guardToolResult } from '../../guardrails/tool-result.js';
3
+ import { toolEvent } from './events.js';
4
+ /** A handler's event as the tool phase it is, unchecked. */
5
+ export function* yieldHandlerSideEvent(base, event) {
6
+ if (event.kind === 'progress') {
7
+ yield toolEvent(base, { phase: 'progress', data: event.data });
8
+ }
9
+ else if (event.kind === 'draft') {
10
+ yield toolEvent(base, { phase: 'draft', text: event.text });
11
+ }
12
+ else if (event.kind === 'trace') {
13
+ yield toolEvent(base, { phase: 'trace', step: event.step });
14
+ }
15
+ else if (event.kind === 'artifact') {
16
+ yield toolEvent(base, { phase: 'artifact', artifact: event.artifact });
17
+ }
18
+ else if (event.kind === 'warning') {
19
+ yield toolEvent(base, { phase: 'warning', warning: event.warning });
20
+ }
21
+ }
22
+ /**
23
+ * A handler's events before its output, as the host may see them; an HTTP tool's body as it arrives
24
+ * comes through here as drafts too. Its `progress` is read whole at
25
+ * the output's boundary: one a check stops is not sent, and its guardrail event is. Its drafts are
26
+ * read piece by piece there, as one text: a match stops the rest of them, and the output's own
27
+ * check reports it.
28
+ */
29
+ export class HandlerEvents {
30
+ base;
31
+ checks;
32
+ drafts;
33
+ constructor(base, checks) {
34
+ this.base = base;
35
+ this.checks = checks;
36
+ if (checks?.drafts)
37
+ this.drafts = new DraftReader(() => draftGate(checks));
38
+ }
39
+ async *show(event) {
40
+ if (event.kind === 'draft') {
41
+ yield* this.draft(event.text);
42
+ return;
43
+ }
44
+ if (event.kind === 'progress' && (yield* this.progressStops(event.data)))
45
+ return;
46
+ if (event.kind === 'artifact') {
47
+ const artifact = yield* this.shown(event.artifact);
48
+ if (artifact.shown)
49
+ yield* yieldHandlerSideEvent(this.base, { ...event, artifact: artifact.value });
50
+ return;
51
+ }
52
+ if (event.kind === 'trace') {
53
+ const step = yield* this.shown(event.step);
54
+ if (step.shown) {
55
+ yield* yieldHandlerSideEvent(this.base, {
56
+ ...event,
57
+ step: step.value,
58
+ });
59
+ }
60
+ return;
61
+ }
62
+ yield* yieldHandlerSideEvent(this.base, event);
63
+ }
64
+ /** The drafts' tail the gate still holds, once the handler has returned. */
65
+ *end() {
66
+ const text = this.drafts?.end();
67
+ if (text)
68
+ yield toolEvent(this.base, { phase: 'draft', text });
69
+ }
70
+ async *draft(piece) {
71
+ const text = await this.drafts?.read(piece);
72
+ if (text)
73
+ yield toolEvent(this.base, { phase: 'draft', text });
74
+ }
75
+ /** `value` as the person is shown it, read at `tool_shown_<kind>`; one a match blocks is not sent. */
76
+ *shown(value) {
77
+ const checks = this.checks;
78
+ if (!checks)
79
+ return { shown: true, value };
80
+ const read = guardShownValue(value, checks.provenance, checks.policy, checks.shown);
81
+ if (read.event)
82
+ yield { type: 'guardrail', guardrail: read.event };
83
+ return 'value' in read ? { shown: true, value: read.value } : { shown: false };
84
+ }
85
+ /** Whether a check at the output's boundary stops `data`; a flag lets it through unreported. */
86
+ *progressStops(data) {
87
+ const checks = this.checks;
88
+ if (!checks)
89
+ return false;
90
+ const { event, text } = guardToolResult('', data, checks.provenance, checks.policy, checks.boundary, checks.callableTools);
91
+ if (text !== undefined && (event === undefined || event.action === 'flag'))
92
+ return false;
93
+ if (event)
94
+ yield { type: 'guardrail', guardrail: event };
95
+ return true;
96
+ }
97
+ }
98
+ /** The gate a handler's drafts are read through, at the output's boundary. */
99
+ function draftGate(checks) {
100
+ return createDraftGate(checks.policy, {
101
+ stage: 'tool_result',
102
+ trust: 'untrusted',
103
+ profileId: checks.profileId,
104
+ provenance: checks.provenance,
105
+ }, checks.boundary, { callable: checks.callableTools });
106
+ }
@@ -11,6 +11,7 @@ type AskOutput = AskInput & {
11
11
  };
12
12
  /** A scope of its own registers it with `tools.register`. */
13
13
  declare const askUserTool: ToolDefinitionInput<AskInput, AskOutput>;
14
+ /** Registers the harness tools, currently `askUserTool`, in the default registry. */
14
15
  declare function registerHarnessTools(): void;
15
16
  export type { AskInput, AskKind, AskOutput };
16
17
  export { askUserTool, registerHarnessTools };
@@ -16,7 +16,7 @@ const AskOutputSchema = z.object({
16
16
  const askUserTool = {
17
17
  type: 'function',
18
18
  name: 'ask_user',
19
- description: 'Ask the user a question (completes with awaiting_user_input)', // lexicon-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
19
+ description: 'Ask the user a question (completes with awaiting_user_input)', // labels-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
20
20
  category: 'conversation',
21
21
  access: 'read-only',
22
22
  paths: ['*'],
@@ -36,6 +36,7 @@ const askUserTool = {
36
36
  return out;
37
37
  },
38
38
  };
39
+ /** Registers the harness tools, currently `askUserTool`, in the default registry. */
39
40
  function registerHarnessTools() {
40
41
  registerTool(askUserTool);
41
42
  }
@@ -0,0 +1,27 @@
1
+ import { type Wait } from '../../providers/shared/retry.js';
2
+ import type { HttpToolLimit } from './types.js';
3
+ /** Time as the limit reads it; a test passes its own. */
4
+ export interface LimitClock {
5
+ now: () => number;
6
+ wait: Wait;
7
+ }
8
+ /** A place taken for one request. `answered` gives the service's reply, or nothing when the send threw. */
9
+ export interface LimitPlace {
10
+ answered: (response?: Response) => void;
11
+ }
12
+ /** No place opens within a call's wait budget: when the next one opens, or `undefined` while every request is unanswered. */
13
+ export interface LimitFull {
14
+ full: true;
15
+ limit: HttpToolLimit;
16
+ opensInMs: number | undefined;
17
+ }
18
+ /**
19
+ * Takes a place in the tool's window for one request. A request holds its place from send
20
+ * until a window after its answer, so requests the network delivers unevenly still land
21
+ * within the limit. A 429 with `Retry-After` holds every request of the tool until then.
22
+ * A call waits for a place at most the same five seconds a retry may wait; past that it
23
+ * gets `LimitFull` and sends nothing. A call is one place, its retries and redirects included.
24
+ */
25
+ export declare function takeLimitPlace(tool: object, limit: HttpToolLimit, signal?: AbortSignal | null, clock?: LimitClock): Promise<LimitPlace | LimitFull>;
26
+ /** The request sent in a place; its answer, or its failure, frees the place. */
27
+ export declare function answeredIn(place: LimitPlace | undefined, sending: Promise<Response>): Promise<Response>;
@@ -0,0 +1,85 @@
1
+ import { retryAfterMs, WAIT_BUDGET_MS, waitDefault, } from '../../providers/shared/retry.js';
2
+ const SYSTEM_CLOCK = { now: Date.now, wait: waitDefault };
3
+ /** Keyed by the registered tool, so a scope's tool has its own window and nothing is looked up by name. */
4
+ const windows = new WeakMap();
5
+ function windowOf(tool) {
6
+ const known = windows.get(tool);
7
+ if (known)
8
+ return known;
9
+ const fresh = { places: [], heldUntil: 0, waiting: new Set() };
10
+ windows.set(tool, fresh);
11
+ return fresh;
12
+ }
13
+ /** The first moment a place is free, `Infinity` while every place's request is unanswered. */
14
+ function nextOpening(window, limit, now) {
15
+ window.places = window.places.filter((place) => place.opensAt > now);
16
+ const freeAt = window.places.length < limit.requests
17
+ ? now
18
+ : Math.min(...window.places.map((place) => place.opensAt));
19
+ return Math.max(freeAt, window.heldUntil);
20
+ }
21
+ /** Returns when a place frees early (an answer) or the wait ends; the caller's abort rejects. */
22
+ async function waitForChange(window, ms, signal, clock) {
23
+ const changed = new AbortController();
24
+ const wake = () => changed.abort();
25
+ window.waiting.add(wake);
26
+ try {
27
+ await clock.wait(ms, signal ? AbortSignal.any([signal, changed.signal]) : changed.signal);
28
+ }
29
+ catch (err) {
30
+ if (signal?.aborted || !changed.signal.aborted)
31
+ throw err;
32
+ }
33
+ finally {
34
+ window.waiting.delete(wake);
35
+ }
36
+ }
37
+ /**
38
+ * Takes a place in the tool's window for one request. A request holds its place from send
39
+ * until a window after its answer, so requests the network delivers unevenly still land
40
+ * within the limit. A 429 with `Retry-After` holds every request of the tool until then.
41
+ * A call waits for a place at most the same five seconds a retry may wait; past that it
42
+ * gets `LimitFull` and sends nothing. A call is one place, its retries and redirects included.
43
+ */
44
+ export async function takeLimitPlace(tool, limit, signal, clock = SYSTEM_CLOCK) {
45
+ const window = windowOf(tool);
46
+ const deadline = clock.now() + WAIT_BUDGET_MS;
47
+ for (;;) {
48
+ const now = clock.now();
49
+ const opening = nextOpening(window, limit, now);
50
+ if (opening <= now) {
51
+ const place = { opensAt: Number.POSITIVE_INFINITY };
52
+ window.places.push(place);
53
+ return {
54
+ answered: (response) => {
55
+ const at = clock.now();
56
+ place.opensAt = at + limit.windowMs;
57
+ const after = response?.status === 429 ? retryAfterMs(response.headers, at) : undefined;
58
+ if (after !== undefined) {
59
+ window.heldUntil = Math.max(window.heldUntil, at + after);
60
+ }
61
+ for (const wake of window.waiting)
62
+ wake();
63
+ },
64
+ };
65
+ }
66
+ if (opening > deadline && opening !== Number.POSITIVE_INFINITY) {
67
+ return { full: true, limit, opensInMs: opening - now };
68
+ }
69
+ if (now >= deadline)
70
+ return { full: true, limit, opensInMs: undefined };
71
+ await waitForChange(window, Math.min(opening, deadline) - now, signal, clock);
72
+ }
73
+ }
74
+ /** The request sent in a place; its answer, or its failure, frees the place. */
75
+ export async function answeredIn(place, sending) {
76
+ try {
77
+ const response = await sending;
78
+ place?.answered(response);
79
+ return response;
80
+ }
81
+ catch (err) {
82
+ place?.answered();
83
+ throw err;
84
+ }
85
+ }
@@ -1,10 +1,32 @@
1
1
  import type { TraceSink } from '../../observability/trace-sink.js';
2
2
  import type { KernelRegistry } from '../registry/kernel-registry.js';
3
3
  import type { TurnEvent } from '../types.js';
4
- import type { InvokeToolRequest } from './types.js';
4
+ import type { InvokeToolRequest, InvokeToolStepRequest } from './types.js';
5
+ /** A call's name and the id it goes by, known before any of its events. */
6
+ export interface StartedCall {
7
+ name: string;
8
+ callId: string;
9
+ }
10
+ /** A started invoke: its call and its events. */
11
+ export interface StartedInvoke extends StartedCall {
12
+ events: AsyncGenerator<TurnEvent>;
13
+ }
14
+ declare function invokeTool(registry: KernelRegistry, request: InvokeToolRequest, sinkOverride?: TraceSink): AsyncGenerator<TurnEvent>;
15
+ declare function startInvoke(registry: KernelRegistry, request: InvokeToolRequest, sinkOverride?: TraceSink): StartedInvoke;
5
16
  /**
6
- * The trace record is written however the call ends, including an early stop or a failure before
7
- * the tool. An unknown profile is recorded under the standard observability policy: there is none to read.
17
+ * Runs the host's calls as one step, the way a turn runs the model's. Every call the step names
18
+ * itself is announced with the step's id before any runs. With `tools.parallel` they run side by
19
+ * side, otherwise one at a time in the order given; a call whose `pre_tool` answers `waitFor`
20
+ * starts once those calls in the step settle. Each call's events arrive as it gives them, and its
21
+ * terminal `tool` event says it settled. The calls share one snapshot. A call that gates waits for
22
+ * its own approval while the others run; the step then ends `gate`. One trace record holds a span
23
+ * per call under the step's root, rooted under the host span when one is given.
8
24
  */
9
- declare function invokeTool(registry: KernelRegistry, request: InvokeToolRequest, sinkOverride?: TraceSink): AsyncGenerator<TurnEvent>;
10
- export { invokeTool };
25
+ declare function invokeToolStep(registry: KernelRegistry, request: InvokeToolStepRequest, sinkOverride?: TraceSink): AsyncGenerator<TurnEvent>;
26
+ /** A started step: its calls in the order given, and the step's events. */
27
+ export interface StartedStep {
28
+ calls: StartedCall[];
29
+ events: AsyncGenerator<TurnEvent>;
30
+ }
31
+ declare function startInvokeStep(registry: KernelRegistry, request: InvokeToolStepRequest, sinkOverride?: TraceSink): StartedStep;
32
+ export { invokeTool, invokeToolStep, startInvoke, startInvokeStep };