@theoremjs/agents 0.3.0 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (568) hide show
  1. package/README.md +276 -995
  2. package/esm/mod.d.ts +33 -19
  3. package/esm/mod.js +18 -11
  4. package/esm/src/cli/commands/bench.js +36 -14
  5. package/esm/src/cli/commands/detect-compile.d.ts +17 -0
  6. package/esm/src/cli/commands/detect-compile.js +22 -0
  7. package/esm/src/cli/commands/eval.d.ts +3 -3
  8. package/esm/src/cli/commands/fuzz-canary.js +55 -16
  9. package/esm/src/cli/commands/profile.js +4 -4
  10. package/esm/src/cli/commands/run.d.ts +2 -2
  11. package/esm/src/cli/commands/run.js +1 -1
  12. package/esm/src/cli/commands/test.d.ts +4 -3
  13. package/esm/src/cli/commands/test.js +2 -2
  14. package/esm/src/cli/index.js +9 -9
  15. package/esm/src/cli/matrix/fixtures.js +25 -30
  16. package/esm/src/evals/attachments.d.ts +1 -0
  17. package/esm/src/evals/attachments.js +4 -2
  18. package/esm/src/evals/breakdown.d.ts +2 -0
  19. package/esm/src/evals/breakdown.js +1 -0
  20. package/esm/src/evals/graders/answer.d.ts +3 -0
  21. package/esm/src/evals/graders/answer.js +1 -0
  22. package/esm/src/evals/graders/code.d.ts +7 -31
  23. package/esm/src/evals/graders/code.js +4 -25
  24. package/esm/src/evals/graders/judge.d.ts +4 -0
  25. package/esm/src/evals/graders/judge.js +7 -5
  26. package/esm/src/evals/graders/latency.d.ts +1 -0
  27. package/esm/src/evals/graders/latency.js +3 -2
  28. package/esm/src/evals/graders/live.d.ts +3 -0
  29. package/esm/src/evals/graders/live.js +2 -0
  30. package/esm/src/evals/graders/media.js +1 -2
  31. package/esm/src/evals/graders/shared.js +1 -1
  32. package/esm/src/evals/graders/transcript.d.ts +2 -0
  33. package/esm/src/evals/graders/transcript.js +5 -3
  34. package/esm/src/evals/mod.d.ts +1 -9
  35. package/esm/src/evals/mod.js +1 -9
  36. package/esm/src/evals/record.d.ts +6 -0
  37. package/esm/src/evals/record.js +4 -2
  38. package/esm/src/evals/rubrics/mod.d.ts +1 -1
  39. package/esm/src/evals/rubrics/mod.js +1 -1
  40. package/esm/src/evals/rubrics/mustache.js +1 -1
  41. package/esm/src/evals/rubrics/types.js +1 -1
  42. package/esm/src/evals/run.d.ts +9 -52
  43. package/esm/src/evals/run.js +12 -46
  44. package/esm/src/evals/suite.d.ts +12 -3
  45. package/esm/src/evals/suite.js +9 -4
  46. package/esm/src/evals/summary.d.ts +3 -0
  47. package/esm/src/evals/summary.js +1 -0
  48. package/esm/src/evals/trial.d.ts +3 -16
  49. package/esm/src/evals/trial.js +7 -30
  50. package/esm/src/evals/types.d.ts +30 -121
  51. package/esm/src/evals/types.js +3 -16
  52. package/esm/src/evals/verdict.d.ts +5 -0
  53. package/esm/src/evals/verdict.js +4 -1
  54. package/esm/src/guardrails/boundaries.d.ts +41 -0
  55. package/esm/src/guardrails/boundaries.js +103 -0
  56. package/esm/src/guardrails/canary-gate.d.ts +1 -0
  57. package/esm/src/guardrails/canary.d.ts +49 -15
  58. package/esm/src/guardrails/canary.js +103 -30
  59. package/esm/src/guardrails/compile-egress.d.ts +6 -5
  60. package/esm/src/guardrails/compile-egress.js +6 -5
  61. package/esm/src/guardrails/corpus/canary-egress-attacks.d.ts +3 -1
  62. package/esm/src/guardrails/corpus/canary-egress-attacks.js +4 -2
  63. package/esm/src/guardrails/corpus/fuzz-inbound.js +14 -17
  64. package/esm/src/guardrails/corpus/inbound-payloads.d.ts +2 -0
  65. package/esm/src/guardrails/corpus/inbound-payloads.js +4 -2
  66. package/esm/src/guardrails/corpus/live-attacks.d.ts +2 -0
  67. package/esm/src/guardrails/corpus/live-attacks.js +6 -1
  68. package/esm/src/guardrails/corpus/mod.d.ts +1 -1
  69. package/esm/src/guardrails/corpus/secrets.d.ts +3 -3
  70. package/esm/src/guardrails/corpus/secrets.js +2 -2
  71. package/esm/src/guardrails/corpus/strings.d.ts +1 -1
  72. package/esm/src/guardrails/corpus/strings.js +1 -1
  73. package/esm/src/guardrails/corpus/types.d.ts +5 -1
  74. package/esm/src/guardrails/credential-rules.d.ts +36 -0
  75. package/esm/src/guardrails/credential-rules.js +3001 -0
  76. package/esm/src/guardrails/credential-scan.d.ts +45 -0
  77. package/esm/src/guardrails/credential-scan.js +172 -0
  78. package/esm/src/guardrails/destinations.d.ts +45 -0
  79. package/esm/src/guardrails/destinations.js +234 -0
  80. package/esm/src/guardrails/detect-at.d.ts +107 -0
  81. package/esm/src/guardrails/detect-at.js +434 -0
  82. package/esm/src/guardrails/detect-reply.d.ts +61 -0
  83. package/esm/src/guardrails/detect-reply.js +95 -0
  84. package/esm/src/guardrails/detect-stream.d.ts +33 -0
  85. package/esm/src/guardrails/detect-stream.js +77 -0
  86. package/esm/src/guardrails/detectors.d.ts +216 -0
  87. package/esm/src/guardrails/detectors.js +503 -0
  88. package/esm/src/guardrails/egress-automata.d.ts +4 -6
  89. package/esm/src/guardrails/egress-automata.js +24095 -4572
  90. package/esm/src/guardrails/egress-compiler.d.ts +38 -16
  91. package/esm/src/guardrails/egress-compiler.js +254 -60
  92. package/esm/src/guardrails/egress-patterns.d.ts +4 -2
  93. package/esm/src/guardrails/egress-patterns.js +6 -2
  94. package/esm/src/guardrails/egress-stream.d.ts +54 -36
  95. package/esm/src/guardrails/egress-stream.js +253 -124
  96. package/esm/src/guardrails/egress-urls.d.ts +6 -3
  97. package/esm/src/guardrails/egress-urls.js +14 -22
  98. package/esm/src/guardrails/egress.d.ts +26 -86
  99. package/esm/src/guardrails/egress.js +59 -309
  100. package/esm/src/guardrails/error.d.ts +13 -8
  101. package/esm/src/guardrails/error.js +23 -18
  102. package/esm/src/guardrails/event-schemas.d.ts +46 -3
  103. package/esm/src/guardrails/event-schemas.js +12 -5
  104. package/esm/src/guardrails/events.d.ts +5 -1
  105. package/esm/src/guardrails/events.js +4 -1
  106. package/esm/src/guardrails/hints.d.ts +14 -0
  107. package/esm/src/guardrails/hints.js +57 -0
  108. package/esm/src/guardrails/hits.d.ts +7 -1
  109. package/esm/src/guardrails/hits.js +12 -1
  110. package/esm/src/guardrails/host-patterns.d.ts +85 -0
  111. package/esm/src/guardrails/host-patterns.js +173 -0
  112. package/esm/src/guardrails/injection-patterns.d.ts +6 -1
  113. package/esm/src/guardrails/injection-patterns.js +33 -1
  114. package/esm/src/guardrails/injection-reversed.d.ts +9 -0
  115. package/esm/src/guardrails/injection-reversed.js +49 -0
  116. package/esm/src/guardrails/injection.d.ts +17 -1
  117. package/esm/src/guardrails/injection.js +259 -36
  118. package/esm/src/guardrails/labels.d.ts +40 -0
  119. package/esm/src/guardrails/labels.js +874 -0
  120. package/esm/src/guardrails/live-outbound-gate.d.ts +9 -8
  121. package/esm/src/guardrails/live-outbound-gate.js +100 -107
  122. package/esm/src/guardrails/mod.d.ts +29 -21
  123. package/esm/src/guardrails/mod.js +18 -13
  124. package/esm/src/guardrails/network.d.ts +4 -0
  125. package/esm/src/guardrails/network.js +21 -19
  126. package/esm/src/guardrails/normalize.d.ts +15 -1
  127. package/esm/src/guardrails/normalize.js +34 -1
  128. package/esm/src/guardrails/policy.d.ts +2 -17
  129. package/esm/src/guardrails/policy.js +12 -41
  130. package/esm/src/guardrails/progressive-yield.d.ts +65 -24
  131. package/esm/src/guardrails/progressive-yield.js +191 -147
  132. package/esm/src/guardrails/prompt-echo.d.ts +4 -2
  133. package/esm/src/guardrails/prompt-echo.js +87 -6
  134. package/esm/src/guardrails/quota.d.ts +1 -0
  135. package/esm/src/guardrails/quota.js +1 -1
  136. package/esm/src/guardrails/rules.d.ts +20 -29
  137. package/esm/src/guardrails/rules.js +23 -30
  138. package/esm/src/guardrails/sanitize.d.ts +32 -15
  139. package/esm/src/guardrails/sanitize.js +100 -124
  140. package/esm/src/guardrails/sensitive-groups.d.ts +21 -0
  141. package/esm/src/guardrails/sensitive-groups.js +12 -0
  142. package/esm/src/guardrails/sensitive.d.ts +16 -23
  143. package/esm/src/guardrails/sensitive.js +168 -47
  144. package/esm/src/guardrails/serialize.d.ts +1 -0
  145. package/esm/src/guardrails/testing.d.ts +4 -2
  146. package/esm/src/guardrails/testing.js +4 -2
  147. package/esm/src/guardrails/theorem-error.d.ts +4 -1
  148. package/esm/src/guardrails/theorem-error.js +3 -2
  149. package/esm/src/guardrails/thought-guard.d.ts +34 -13
  150. package/esm/src/guardrails/thought-guard.js +264 -64
  151. package/esm/src/guardrails/tool-directives.d.ts +29 -10
  152. package/esm/src/guardrails/tool-directives.js +133 -47
  153. package/esm/src/guardrails/tool-leak.d.ts +26 -0
  154. package/esm/src/guardrails/tool-leak.js +45 -0
  155. package/esm/src/guardrails/tool-result.d.ts +45 -14
  156. package/esm/src/guardrails/tool-result.js +94 -70
  157. package/esm/src/guardrails/types.d.ts +79 -71
  158. package/esm/src/guardrails/types.js +11 -7
  159. package/esm/src/host/client-turn.d.ts +29 -2
  160. package/esm/src/host/client-turn.js +46 -4
  161. package/esm/src/host/mint-trace.d.ts +1 -0
  162. package/esm/src/host/mint-trace.js +3 -2
  163. package/esm/src/host/mod.d.ts +2 -2
  164. package/esm/src/host/mod.js +1 -1
  165. package/esm/src/host/readStreamingJsonStringField.js +2 -43
  166. package/esm/src/host/reply.d.ts +6 -0
  167. package/esm/src/host/reply.js +7 -1
  168. package/esm/src/interface/blocks.d.ts +3 -0
  169. package/esm/src/interface/blocks.js +84 -14
  170. package/esm/src/interface/composer-actions.d.ts +4 -0
  171. package/esm/src/interface/composer-actions.js +5 -3
  172. package/esm/src/interface/draft.d.ts +6 -0
  173. package/esm/src/interface/draft.js +22 -11
  174. package/esm/src/interface/from-profile.d.ts +13 -1
  175. package/esm/src/interface/from-profile.js +66 -31
  176. package/esm/src/interface/history.d.ts +9 -3
  177. package/esm/src/interface/history.js +33 -24
  178. package/esm/src/interface/inputs.d.ts +1 -0
  179. package/esm/src/interface/inputs.js +3 -0
  180. package/esm/src/interface/mod.d.ts +4 -2
  181. package/esm/src/interface/mod.js +3 -2
  182. package/esm/src/interface/models.d.ts +7 -0
  183. package/esm/src/interface/models.js +5 -0
  184. package/esm/src/interface/pending.d.ts +9 -0
  185. package/esm/src/interface/pending.js +9 -3
  186. package/esm/src/interface/profile-interface.js +54 -40
  187. package/esm/src/interface/session.d.ts +12 -5
  188. package/esm/src/interface/session.js +17 -10
  189. package/esm/src/interface/stop.d.ts +13 -0
  190. package/esm/src/interface/stop.js +28 -0
  191. package/esm/src/interface/tool-calls.d.ts +14 -2
  192. package/esm/src/interface/tool-calls.js +64 -10
  193. package/esm/src/interface/tool-invoke.d.ts +2 -0
  194. package/esm/src/interface/tool-invoke.js +3 -1
  195. package/esm/src/interface/tool-media.d.ts +2 -0
  196. package/esm/src/interface/tool-media.js +2 -1
  197. package/esm/src/interface/types.d.ts +105 -40
  198. package/esm/src/interface/types.js +1 -0
  199. package/esm/src/kernel/api-catalog.d.ts +85 -0
  200. package/esm/src/kernel/api-catalog.js +229 -0
  201. package/esm/src/kernel/auth/crypto.d.ts +7 -2
  202. package/esm/src/kernel/auth/crypto.js +12 -10
  203. package/esm/src/kernel/auth/oauth.d.ts +2 -1
  204. package/esm/src/kernel/auth/oauth.js +23 -22
  205. package/esm/src/kernel/auth/typed-secret.js +2 -2
  206. package/esm/src/kernel/auth/types.d.ts +13 -0
  207. package/esm/src/kernel/checkpoint.d.ts +43 -0
  208. package/esm/src/kernel/checkpoint.js +58 -0
  209. package/esm/src/kernel/default-scope.d.ts +43 -5
  210. package/esm/src/kernel/default-scope.js +54 -5
  211. package/esm/src/kernel/engine/call-trace.d.ts +19 -0
  212. package/esm/src/kernel/engine/call-trace.js +29 -0
  213. package/esm/src/kernel/engine/compaction.d.ts +6 -5
  214. package/esm/src/kernel/engine/compaction.js +12 -11
  215. package/esm/src/kernel/engine/decision.d.ts +10 -8
  216. package/esm/src/kernel/engine/decision.js +173 -146
  217. package/esm/src/kernel/engine/embedding.d.ts +8 -0
  218. package/esm/src/kernel/engine/embedding.js +118 -0
  219. package/esm/src/kernel/engine/live-inbound.d.ts +14 -4
  220. package/esm/src/kernel/engine/live-inbound.js +36 -11
  221. package/esm/src/kernel/engine/live-ingress.d.ts +6 -0
  222. package/esm/src/kernel/engine/live-ingress.js +6 -1
  223. package/esm/src/kernel/engine/repair.js +12 -12
  224. package/esm/src/kernel/engine/runner/gates.d.ts +2 -2
  225. package/esm/src/kernel/engine/runner/gates.js +287 -101
  226. package/esm/src/kernel/engine/runner/mod.d.ts +19 -5
  227. package/esm/src/kernel/engine/runner/mod.js +107 -56
  228. package/esm/src/kernel/engine/runner/nested.d.ts +32 -0
  229. package/esm/src/kernel/engine/runner/nested.js +134 -0
  230. package/esm/src/kernel/engine/runner/schema-validation.d.ts +24 -3
  231. package/esm/src/kernel/engine/runner/schema-validation.js +78 -4
  232. package/esm/src/kernel/engine/runner/stages.d.ts +1 -1
  233. package/esm/src/kernel/engine/runner/stages.js +1 -8
  234. package/esm/src/kernel/engine/runner/state.d.ts +33 -12
  235. package/esm/src/kernel/engine/runner/state.js +11 -1
  236. package/esm/src/kernel/engine/runner/step-order.d.ts +27 -0
  237. package/esm/src/kernel/engine/runner/step-order.js +165 -0
  238. package/esm/src/kernel/engine/runner/steps.d.ts +2 -2
  239. package/esm/src/kernel/engine/runner/steps.js +328 -169
  240. package/esm/src/kernel/engine/runner/stream.d.ts +42 -11
  241. package/esm/src/kernel/engine/runner/stream.js +197 -46
  242. package/esm/src/kernel/engine/runner/usage.d.ts +5 -5
  243. package/esm/src/kernel/engine/runner/usage.js +12 -14
  244. package/esm/src/kernel/engine/session/mod.d.ts +8 -6
  245. package/esm/src/kernel/engine/session/mod.js +360 -129
  246. package/esm/src/kernel/engine/session/session-trace.d.ts +10 -10
  247. package/esm/src/kernel/engine/session/session-trace.js +41 -30
  248. package/esm/src/kernel/engine/token-estimate.d.ts +10 -64
  249. package/esm/src/kernel/engine/token-estimate.js +14 -194
  250. package/esm/src/kernel/engine/tool-trace.d.ts +3 -3
  251. package/esm/src/kernel/engine/tool-trace.js +2 -1
  252. package/esm/src/kernel/engine/turn-trace.d.ts +8 -7
  253. package/esm/src/kernel/engine/turn-trace.js +28 -36
  254. package/esm/src/kernel/engine/usage.d.ts +6 -0
  255. package/esm/src/kernel/engine/usage.js +17 -0
  256. package/esm/src/kernel/interaction-parts.d.ts +3 -0
  257. package/esm/src/kernel/interaction-parts.js +18 -0
  258. package/esm/src/kernel/json.d.ts +10 -0
  259. package/esm/src/kernel/json.js +3 -0
  260. package/esm/src/kernel/mod.d.ts +38 -11
  261. package/esm/src/kernel/mod.js +22 -7
  262. package/esm/src/kernel/profile-graph.d.ts +11 -6
  263. package/esm/src/kernel/profile-graph.js +14 -7
  264. package/esm/src/kernel/profile-presence.d.ts +10 -1
  265. package/esm/src/kernel/profile-presence.js +90 -75
  266. package/esm/src/kernel/profile-scope.d.ts +7 -3
  267. package/esm/src/kernel/profile-scope.js +67 -55
  268. package/esm/src/kernel/protocols/binding.d.ts +65 -0
  269. package/esm/src/kernel/protocols/binding.js +125 -0
  270. package/esm/src/kernel/protocols/limits.d.ts +15 -0
  271. package/esm/src/kernel/protocols/limits.js +28 -0
  272. package/esm/src/kernel/protocols/mod.d.ts +5 -0
  273. package/esm/src/kernel/protocols/mod.js +5 -0
  274. package/esm/src/kernel/protocols/prices.d.ts +36 -0
  275. package/esm/src/kernel/protocols/prices.js +37 -0
  276. package/esm/src/kernel/protocols/protocol.d.ts +253 -0
  277. package/esm/src/kernel/protocols/protocol.js +253 -0
  278. package/esm/src/kernel/protocols/provider.d.ts +108 -0
  279. package/esm/src/kernel/protocols/provider.js +143 -0
  280. package/esm/src/kernel/protocols/runtime.d.ts +55 -0
  281. package/esm/src/kernel/protocols/runtime.js +534 -0
  282. package/esm/src/kernel/provider-budget.d.ts +32 -0
  283. package/esm/src/kernel/provider-budget.js +262 -0
  284. package/esm/src/kernel/provider-dispatch.d.ts +13 -0
  285. package/esm/src/kernel/provider-dispatch.js +36 -0
  286. package/esm/src/kernel/provider-live.d.ts +7 -0
  287. package/esm/src/kernel/provider-live.js +189 -0
  288. package/esm/src/kernel/provider-runtime.d.ts +57 -0
  289. package/esm/src/kernel/provider-runtime.js +524 -0
  290. package/esm/src/kernel/registry/attachments.d.ts +15 -4
  291. package/esm/src/kernel/registry/attachments.js +31 -22
  292. package/esm/src/kernel/registry/catalog.d.ts +6 -0
  293. package/esm/src/kernel/registry/catalog.js +9 -2
  294. package/esm/src/kernel/registry/embedding-rules.d.ts +28 -0
  295. package/esm/src/kernel/registry/embedding-rules.js +66 -0
  296. package/esm/src/kernel/registry/ingress.d.ts +6 -2
  297. package/esm/src/kernel/registry/ingress.js +55 -10
  298. package/esm/src/kernel/registry/kernel-registry.d.ts +3 -0
  299. package/esm/src/kernel/registry/kernel-registry.js +9 -2
  300. package/esm/src/kernel/registry/profile-outputs.js +4 -1
  301. package/esm/src/kernel/registry/profiles.d.ts +38 -14
  302. package/esm/src/kernel/registry/profiles.js +280 -205
  303. package/esm/src/kernel/registry/provider-request.d.ts +3 -3
  304. package/esm/src/kernel/registry/provider-request.js +5 -13
  305. package/esm/src/kernel/registry/resolve.d.ts +4 -1
  306. package/esm/src/kernel/registry/resolve.js +59 -58
  307. package/esm/src/kernel/registry/schemas.d.ts +3 -0
  308. package/esm/src/kernel/registry/schemas.js +3 -1
  309. package/esm/src/kernel/registry/slot-fill.d.ts +7 -0
  310. package/esm/src/kernel/registry/slot-fill.js +22 -0
  311. package/esm/src/kernel/registry/system-prompt.js +7 -8
  312. package/esm/src/kernel/registry/vault.d.ts +14 -13
  313. package/esm/src/kernel/registry/vault.js +1 -14
  314. package/esm/src/kernel/schema.d.ts +100 -46
  315. package/esm/src/kernel/schema.js +499 -257
  316. package/esm/src/kernel/scope.d.ts +12 -5
  317. package/esm/src/kernel/scope.js +23 -3
  318. package/esm/src/kernel/stages.d.ts +38 -3
  319. package/esm/src/kernel/stages.js +82 -39
  320. package/esm/src/kernel/stop.d.ts +29 -6
  321. package/esm/src/kernel/stop.js +16 -4
  322. package/esm/src/kernel/system-parts.js +6 -6
  323. package/esm/src/kernel/tools/activity-label.d.ts +12 -6
  324. package/esm/src/kernel/tools/activity-label.js +258 -32
  325. package/esm/src/kernel/tools/agent.d.ts +66 -0
  326. package/esm/src/kernel/tools/agent.js +212 -0
  327. package/esm/src/kernel/tools/coordinate.d.ts +4 -0
  328. package/esm/src/kernel/tools/coordinate.js +165 -0
  329. package/esm/src/kernel/tools/events.d.ts +21 -6
  330. package/esm/src/kernel/tools/events.js +53 -18
  331. package/esm/src/kernel/tools/execute.d.ts +47 -11
  332. package/esm/src/kernel/tools/execute.js +508 -136
  333. package/esm/src/kernel/tools/gate-answer.d.ts +12 -2
  334. package/esm/src/kernel/tools/gate-answer.js +17 -6
  335. package/esm/src/kernel/tools/handler-events.d.ts +45 -0
  336. package/esm/src/kernel/tools/handler-events.js +106 -0
  337. package/esm/src/kernel/tools/harness.d.ts +1 -0
  338. package/esm/src/kernel/tools/harness.js +2 -1
  339. package/esm/src/kernel/tools/http-limit.d.ts +27 -0
  340. package/esm/src/kernel/tools/http-limit.js +85 -0
  341. package/esm/src/kernel/tools/invoke.d.ts +27 -5
  342. package/esm/src/kernel/tools/invoke.js +223 -70
  343. package/esm/src/kernel/tools/mcp-sessions.d.ts +4 -1
  344. package/esm/src/kernel/tools/mcp-sessions.js +13 -8
  345. package/esm/src/kernel/tools/mod.d.ts +4 -3
  346. package/esm/src/kernel/tools/mod.js +3 -2
  347. package/esm/src/kernel/tools/model-text.d.ts +10 -5
  348. package/esm/src/kernel/tools/model-text.js +18 -12
  349. package/esm/src/kernel/tools/operation.d.ts +76 -0
  350. package/esm/src/kernel/tools/operation.js +100 -0
  351. package/esm/src/kernel/tools/page-answer.d.ts +8 -0
  352. package/esm/src/kernel/tools/page-answer.js +19 -0
  353. package/esm/src/kernel/tools/permission.d.ts +11 -2
  354. package/esm/src/kernel/tools/permission.js +12 -12
  355. package/esm/src/kernel/tools/project.d.ts +4 -1
  356. package/esm/src/kernel/tools/project.js +32 -2
  357. package/esm/src/kernel/tools/registry.d.ts +9 -2
  358. package/esm/src/kernel/tools/registry.js +69 -10
  359. package/esm/src/kernel/tools/remote.d.ts +40 -6
  360. package/esm/src/kernel/tools/remote.js +219 -92
  361. package/esm/src/kernel/tools/resolve.d.ts +3 -0
  362. package/esm/src/kernel/tools/resolve.js +12 -4
  363. package/esm/src/kernel/tools/run.d.ts +28 -0
  364. package/esm/src/kernel/tools/run.js +86 -0
  365. package/esm/src/kernel/tools/schema.d.ts +3 -3
  366. package/esm/src/kernel/tools/schema.js +21 -100
  367. package/esm/src/kernel/tools/signed-in-fetch.d.ts +2 -1
  368. package/esm/src/kernel/tools/signed-in-fetch.js +3 -3
  369. package/esm/src/kernel/tools/stage-run.d.ts +27 -4
  370. package/esm/src/kernel/tools/stage-run.js +75 -17
  371. package/esm/src/kernel/tools/types.d.ts +235 -25
  372. package/esm/src/kernel/tools/unchecked-output.d.ts +14 -0
  373. package/esm/src/kernel/tools/unchecked-output.js +18 -0
  374. package/esm/src/kernel/turn-events.d.ts +208 -31
  375. package/esm/src/kernel/turn-events.js +127 -9
  376. package/esm/src/kernel/types.d.ts +302 -161
  377. package/esm/src/kernel/util/base64.d.ts +2 -0
  378. package/esm/src/kernel/util/base64.js +2 -0
  379. package/esm/src/kernel/util/partial-json.d.ts +23 -0
  380. package/esm/src/kernel/util/partial-json.js +128 -0
  381. package/esm/src/kernel/util/record.d.ts +1 -0
  382. package/esm/src/kernel/util/record.js +1 -0
  383. package/esm/src/observability/destinations.d.ts +5 -0
  384. package/esm/src/observability/destinations.js +7 -2
  385. package/esm/src/observability/jsonl.d.ts +2 -2
  386. package/esm/src/observability/jsonl.js +15 -22
  387. package/esm/src/observability/mod.d.ts +3 -3
  388. package/esm/src/observability/mod.js +2 -2
  389. package/esm/src/observability/openinference.d.ts +1 -1
  390. package/esm/src/observability/openinference.js +3 -3
  391. package/esm/src/observability/otlp.d.ts +3 -0
  392. package/esm/src/observability/otlp.js +3 -3
  393. package/esm/src/observability/phoenix.d.ts +1 -0
  394. package/esm/src/observability/policy.d.ts +3 -0
  395. package/esm/src/observability/policy.js +5 -1
  396. package/esm/src/observability/resolve-policy.js +11 -5
  397. package/esm/src/observability/spans.d.ts +8 -2
  398. package/esm/src/observability/spans.js +21 -5
  399. package/esm/src/observability/trace-catalog.d.ts +19 -2
  400. package/esm/src/observability/trace-catalog.js +128 -87
  401. package/esm/src/observability/trace-record.js +22 -17
  402. package/esm/src/observability/trace-schema.d.ts +3 -0
  403. package/esm/src/observability/trace-schema.js +1 -1
  404. package/esm/src/observability/trace-sink.d.ts +1 -0
  405. package/esm/src/observability/trace-sink.js +1 -1
  406. package/esm/src/observability/trace-span.d.ts +7 -1
  407. package/esm/src/observability/trace-span.js +3 -1
  408. package/esm/src/observability/trace.d.ts +2 -0
  409. package/esm/src/observability/trace.js +4 -2
  410. package/esm/src/observability/types.d.ts +35 -11
  411. package/esm/src/observability/types.js +1 -1
  412. package/esm/src/presets/google/speech-voices.d.ts +1 -0
  413. package/esm/src/presets/google-limits.d.ts +1 -0
  414. package/esm/src/presets/google.d.ts +27 -12
  415. package/esm/src/presets/google.js +34 -25
  416. package/esm/src/presets/local.d.ts +26 -0
  417. package/esm/src/presets/local.js +30 -0
  418. package/esm/src/presets/mod.d.ts +5 -4
  419. package/esm/src/presets/mod.js +4 -4
  420. package/esm/src/presets/openrouter.d.ts +14 -1
  421. package/esm/src/presets/openrouter.js +19 -1
  422. package/esm/src/providers/embedding-limits.d.ts +7 -0
  423. package/esm/src/providers/embedding-limits.js +12 -0
  424. package/esm/src/providers/gemini/embedding-protocol.d.ts +8 -0
  425. package/esm/src/providers/gemini/embedding-protocol.js +125 -0
  426. package/esm/src/providers/gemini/interactions-protocol.d.ts +8 -0
  427. package/esm/src/providers/gemini/interactions-protocol.js +105 -0
  428. package/esm/src/providers/gemini/live-protocol.d.ts +3 -0
  429. package/esm/src/providers/gemini/live-protocol.js +191 -0
  430. package/esm/src/providers/gemini/prices.d.ts +3 -0
  431. package/esm/src/providers/gemini/prices.js +63 -0
  432. package/esm/src/providers/gemini/provider.d.ts +7 -0
  433. package/esm/src/providers/gemini/provider.js +39 -0
  434. package/esm/src/providers/google/builtins.d.ts +14 -0
  435. package/esm/src/providers/google/builtins.js +57 -0
  436. package/esm/src/providers/google/grounding.d.ts +4 -4
  437. package/esm/src/providers/google/interactions/framing.d.ts +20 -8
  438. package/esm/src/providers/google/interactions/framing.js +85 -44
  439. package/esm/src/providers/google/interactions/steps.d.ts +5 -5
  440. package/esm/src/providers/google/interactions/steps.js +4 -4
  441. package/esm/src/providers/google/interactions/stream.d.ts +10 -11
  442. package/esm/src/providers/google/interactions/stream.js +33 -100
  443. package/esm/src/providers/google/live/framing.d.ts +15 -5
  444. package/esm/src/providers/google/live/framing.js +25 -25
  445. package/esm/src/providers/google/live/stream.d.ts +6 -44
  446. package/esm/src/providers/google/live/stream.js +3 -209
  447. package/esm/src/providers/google/urls.d.ts +1 -3
  448. package/esm/src/providers/google/urls.js +1 -3
  449. package/esm/src/providers/google/usage.js +2 -2
  450. package/esm/src/providers/live.d.ts +6 -0
  451. package/esm/src/providers/live.js +6 -0
  452. package/esm/src/providers/local/embedding-protocol.d.ts +7 -0
  453. package/esm/src/providers/local/embedding-protocol.js +60 -0
  454. package/esm/src/providers/local/provider.d.ts +7 -0
  455. package/esm/src/providers/local/provider.js +28 -0
  456. package/esm/src/providers/mod.d.ts +28 -7
  457. package/esm/src/providers/mod.js +19 -3
  458. package/esm/src/providers/open-ai/protocol.d.ts +3 -0
  459. package/esm/src/providers/open-ai/protocol.js +189 -0
  460. package/esm/src/providers/openrouter/embedding-protocol.d.ts +6 -0
  461. package/esm/src/providers/openrouter/embedding-protocol.js +86 -0
  462. package/esm/src/providers/openrouter/image.d.ts +0 -9
  463. package/esm/src/providers/openrouter/image.js +0 -153
  464. package/esm/src/providers/openrouter/images-protocol.d.ts +3 -0
  465. package/esm/src/providers/openrouter/images-protocol.js +82 -0
  466. package/esm/src/providers/openrouter/openai/compat.d.ts +2 -2
  467. package/esm/src/providers/openrouter/openai/compat.js +6 -6
  468. package/esm/src/providers/openrouter/openai/image-payload.d.ts +2 -2
  469. package/esm/src/providers/openrouter/openai/reasoning-state.d.ts +2 -0
  470. package/esm/src/providers/openrouter/openai/reasoning-state.js +31 -0
  471. package/esm/src/providers/openrouter/protocol.d.ts +8 -0
  472. package/esm/src/providers/openrouter/protocol.js +171 -0
  473. package/esm/src/providers/openrouter/provider.d.ts +10 -0
  474. package/esm/src/providers/openrouter/provider.js +50 -0
  475. package/esm/src/providers/shared/carried-tool-files.d.ts +7 -0
  476. package/esm/src/providers/shared/carried-tool-files.js +43 -0
  477. package/esm/src/providers/shared/pcm.js +2 -2
  478. package/esm/src/providers/shared/protocol-events.d.ts +8 -0
  479. package/esm/src/providers/shared/protocol-events.js +20 -0
  480. package/esm/src/providers/shared/response-identity.d.ts +2 -2
  481. package/esm/src/providers/shared/retry.d.ts +17 -0
  482. package/esm/src/providers/shared/retry.js +90 -0
  483. package/esm/src/providers/shared/sse.d.ts +0 -4
  484. package/esm/src/providers/shared/sse.js +50 -36
  485. package/esm/src/providers/shared/tool-args.d.ts +6 -7
  486. package/esm/src/providers/shared/tool-args.js +10 -6
  487. package/esm/src/providers/shared/tool-draft.d.ts +16 -0
  488. package/esm/src/providers/shared/tool-draft.js +14 -0
  489. package/esm/src/providers/shared/upstream-tap.d.ts +2 -2
  490. package/esm/src/providers/shared/upstream-tape.js +1 -1
  491. package/esm/src/providers/system-one/protocol.d.ts +8 -0
  492. package/esm/src/providers/system-one/protocol.js +93 -0
  493. package/esm/src/providers/types.d.ts +48 -16
  494. package/esm/src/providers/types.js +2 -1
  495. package/esm/src/providers/typesafe/provider.d.ts +7 -0
  496. package/esm/src/providers/typesafe/provider.js +24 -0
  497. package/esm/src/surface/formats.d.ts +19 -1
  498. package/esm/src/surface/formats.js +68 -29
  499. package/esm/src/surface/mod.d.ts +4 -2
  500. package/esm/src/surface/mod.js +4 -2
  501. package/esm/src/surface/runtime.d.ts +4 -0
  502. package/esm/src/surface/runtime.js +2 -0
  503. package/esm/src/surface/tools.d.ts +2 -8
  504. package/esm/src/surface/tools.js +4 -22
  505. package/esm/src/surface/types.d.ts +6 -0
  506. package/package.json +5 -13
  507. package/esm/src/cli/commands/egress-compile.d.ts +0 -17
  508. package/esm/src/cli/commands/egress-compile.js +0 -25
  509. package/esm/src/guardrails/egress-policy.d.ts +0 -27
  510. package/esm/src/guardrails/egress-policy.js +0 -76
  511. package/esm/src/guardrails/egress-rules.d.ts +0 -54
  512. package/esm/src/guardrails/egress-rules.js +0 -49
  513. package/esm/src/guardrails/lexicon.d.ts +0 -30
  514. package/esm/src/guardrails/lexicon.js +0 -478
  515. package/esm/src/kernel/engine/media-probe/audio.d.ts +0 -7
  516. package/esm/src/kernel/engine/media-probe/audio.js +0 -342
  517. package/esm/src/kernel/engine/media-probe/bytes.d.ts +0 -6
  518. package/esm/src/kernel/engine/media-probe/bytes.js +0 -26
  519. package/esm/src/kernel/engine/media-probe/image.d.ts +0 -5
  520. package/esm/src/kernel/engine/media-probe/image.js +0 -171
  521. package/esm/src/kernel/engine/media-probe/iso-bmff.d.ts +0 -19
  522. package/esm/src/kernel/engine/media-probe/iso-bmff.js +0 -48
  523. package/esm/src/kernel/engine/media-probe/matroska.d.ts +0 -35
  524. package/esm/src/kernel/engine/media-probe/matroska.js +0 -226
  525. package/esm/src/kernel/engine/media-probe/mp4.d.ts +0 -22
  526. package/esm/src/kernel/engine/media-probe/mp4.js +0 -279
  527. package/esm/src/kernel/engine/media-probe/opus.d.ts +0 -4
  528. package/esm/src/kernel/engine/media-probe/opus.js +0 -23
  529. package/esm/src/kernel/engine/media-probe/pdf.d.ts +0 -5
  530. package/esm/src/kernel/engine/media-probe/pdf.js +0 -117
  531. package/esm/src/kernel/engine/media-probe/video.d.ts +0 -15
  532. package/esm/src/kernel/engine/media-probe/video.js +0 -49
  533. package/esm/src/presets/typesafe.d.ts +0 -2
  534. package/esm/src/presets/typesafe.js +0 -2
  535. package/esm/src/providers/create-provider.d.ts +0 -21
  536. package/esm/src/providers/create-provider.js +0 -90
  537. package/esm/src/providers/decision/usage.d.ts +0 -3
  538. package/esm/src/providers/decision/usage.js +0 -25
  539. package/esm/src/providers/google/interactions/mod.d.ts +0 -2
  540. package/esm/src/providers/google/interactions/mod.js +0 -2
  541. package/esm/src/providers/google/keys.d.ts +0 -20
  542. package/esm/src/providers/google/keys.js +0 -87
  543. package/esm/src/providers/google/live/mod.d.ts +0 -7
  544. package/esm/src/providers/google/live/mod.js +0 -7
  545. package/esm/src/providers/google/live/openapi-schema.d.ts +0 -1
  546. package/esm/src/providers/google/live/openapi-schema.js +0 -42
  547. package/esm/src/providers/google/live/session.d.ts +0 -14
  548. package/esm/src/providers/google/live/session.js +0 -150
  549. package/esm/src/providers/local/local.d.ts +0 -12
  550. package/esm/src/providers/local/local.js +0 -186
  551. package/esm/src/providers/local/mod.d.ts +0 -8
  552. package/esm/src/providers/local/mod.js +0 -8
  553. package/esm/src/providers/openrouter/cache-control.d.ts +0 -5
  554. package/esm/src/providers/openrouter/cache-control.js +0 -4
  555. package/esm/src/providers/openrouter/chat.d.ts +0 -64
  556. package/esm/src/providers/openrouter/chat.js +0 -490
  557. package/esm/src/providers/openrouter/openai/sdk-messages.d.ts +0 -10
  558. package/esm/src/providers/openrouter/openai/sdk-messages.js +0 -99
  559. package/esm/src/providers/openrouter/resolve-api-key.d.ts +0 -3
  560. package/esm/src/providers/openrouter/resolve-api-key.js +0 -8
  561. package/esm/src/providers/openrouter/speech.d.ts +0 -18
  562. package/esm/src/providers/openrouter/speech.js +0 -109
  563. package/esm/src/providers/probe.d.ts +0 -5
  564. package/esm/src/providers/probe.js +0 -15
  565. package/esm/src/providers/shared/builtin-wire.d.ts +0 -4
  566. package/esm/src/providers/shared/builtin-wire.js +0 -9
  567. package/esm/src/providers/shared/vault.d.ts +0 -13
  568. package/esm/src/providers/shared/vault.js +0 -41
@@ -1,20 +1,27 @@
1
1
  import type { TraceSink } from '../observability/trace-sink.js';
2
2
  import { type RunDecisionOptions } from './engine/decision.js';
3
+ import { type RunEmbeddingOptions } from './engine/embedding.js';
3
4
  import { type RunSessionOptions } from './engine/session/mod.js';
5
+ import type { ProviderHostOptions } from './protocols/runtime.js';
4
6
  import { type KernelRegistry } from './registry/kernel-registry.js';
5
7
  import { resolveTurnInRegistry } from './registry/resolve.js';
6
- import type { InvokeToolRequest } from './tools/types.js';
7
- import type { CompactHistoryRequest, CompactionResult, DecisionRequest, DecisionResult, LiveSession, ModelProvider, ProjectedProfile, SessionRequest, TurnEvent, TurnRequest } from './types.js';
8
+ import { type ToolCallResult, type ToolStepCallResult } from './tools/run.js';
9
+ import type { InvokeToolRequest, InvokeToolStepRequest } from './tools/types.js';
10
+ import type { CompactHistoryRequest, CompactionResult, DecisionRequest, DecisionResult, EmbeddingRequest, EmbeddingResult, LiveSession, ProjectedProfile, SessionRequest, TurnEvent, TurnRequest } from './types.js';
11
+ /** A kernel scope: its registries and the operations that run against them (turns, live sessions, history compaction, tool invocation, turn resolution, profile projection, and decisions). */
8
12
  interface KernelScope extends KernelRegistry {
9
- runTurn(req: TurnRequest, provider: ModelProvider, sinkOverride?: TraceSink): AsyncGenerator<TurnEvent>;
13
+ runTurn(req: TurnRequest, options?: ProviderHostOptions, sinkOverride?: TraceSink): AsyncGenerator<TurnEvent>;
10
14
  runSession(req: SessionRequest, options: RunSessionOptions, sinkOverride?: TraceSink): Promise<LiveSession>;
11
- compactHistory(req: CompactHistoryRequest, provider: ModelProvider, sinkOverride?: TraceSink): Promise<CompactionResult | undefined>;
15
+ compactHistory(req: CompactHistoryRequest, options?: ProviderHostOptions, sinkOverride?: TraceSink): Promise<CompactionResult | undefined>;
12
16
  invokeTool(request: InvokeToolRequest, sinkOverride?: TraceSink): AsyncGenerator<TurnEvent>;
17
+ invokeToolStep(request: InvokeToolStepRequest, sinkOverride?: TraceSink): AsyncGenerator<TurnEvent>;
18
+ runTool(request: InvokeToolRequest, sinkOverride?: TraceSink): Promise<ToolCallResult>;
19
+ runToolStep(request: InvokeToolStepRequest, sinkOverride?: TraceSink): AsyncGenerator<ToolStepCallResult>;
13
20
  resolveTurn(req: TurnRequest): ReturnType<typeof resolveTurnInRegistry>;
14
21
  projectProfile(id: string): ProjectedProfile;
15
22
  runDecision(request: DecisionRequest, options: RunDecisionOptions): Promise<DecisionResult>;
23
+ runEmbedding(request: EmbeddingRequest, options?: RunEmbeddingOptions): Promise<EmbeddingResult>;
16
24
  }
17
- /** Isolated from every other scope: a host that registers per request gives each its own. */
18
25
  declare function createKernelScope(): KernelScope;
19
26
  /** The process-wide scope behind the package's global API. */
20
27
  declare const defaultKernelScope: KernelScope;
@@ -1,23 +1,43 @@
1
1
  import { runDecisionInRegistry } from './engine/decision.js';
2
+ import { runEmbeddingInRegistry } from './engine/embedding.js';
2
3
  import { compactHistoryInRegistry, runTurnInRegistry } from './engine/runner/mod.js';
3
4
  import { runSessionInRegistry } from './engine/session/mod.js';
5
+ import { resolveRegisteredTurnModel } from './provider-dispatch.js';
4
6
  import { createKernelRegistry } from './registry/kernel-registry.js';
5
7
  import { projectProfileInRegistry, resolveTurnInRegistry } from './registry/resolve.js';
6
- import { invokeTool } from './tools/invoke.js';
8
+ import { invokeTool, invokeToolStep, startInvoke, startInvokeStep } from './tools/invoke.js';
9
+ import { settledCall, settledCalls, } from './tools/run.js';
7
10
  /** Isolated from every other scope: a host that registers per request gives each its own. */
11
+ function selectedTurnProvider(registry, req, options) {
12
+ try {
13
+ return resolveRegisteredTurnModel(registry, req.profile, req.model, options, req);
14
+ }
15
+ catch (error) {
16
+ return {
17
+ complete() {
18
+ throw error;
19
+ },
20
+ };
21
+ }
22
+ }
8
23
  function createKernelScope() {
9
24
  const registry = createKernelRegistry();
10
25
  return {
26
+ providers: registry.providers,
11
27
  tools: registry.tools,
12
28
  profiles: registry.profiles,
13
29
  schemas: registry.schemas,
14
- runTurn: (req, provider, sinkOverride) => runTurnInRegistry(registry, req, provider, sinkOverride),
30
+ runTurn: (req, options = {}, sinkOverride) => runTurnInRegistry(registry, req, selectedTurnProvider(registry, req, options), sinkOverride),
15
31
  runSession: (req, options, sinkOverride) => runSessionInRegistry(registry, req, options, sinkOverride),
16
- compactHistory: (req, provider, sinkOverride) => compactHistoryInRegistry(registry, req, provider, sinkOverride),
32
+ compactHistory: (req, options = {}, sinkOverride) => compactHistoryInRegistry(registry, req, resolveRegisteredTurnModel(registry, req.profile, req.model, options), sinkOverride),
17
33
  invokeTool: (request, sinkOverride) => invokeTool(registry, request, sinkOverride),
34
+ invokeToolStep: (request, sinkOverride) => invokeToolStep(registry, request, sinkOverride),
35
+ runTool: (request, sinkOverride) => settledCall(startInvoke(registry, request, sinkOverride)),
36
+ runToolStep: (request, sinkOverride) => settledCalls(startInvokeStep(registry, request, sinkOverride)),
18
37
  resolveTurn: (req) => resolveTurnInRegistry(registry, req),
19
38
  projectProfile: (id) => projectProfileInRegistry(registry, id),
20
39
  runDecision: (request, options) => runDecisionInRegistry(registry, request, options),
40
+ runEmbedding: (request, options = {}) => runEmbeddingInRegistry(registry, request, options),
21
41
  };
22
42
  }
23
43
  /** The process-wide scope behind the package's global API. */
@@ -2,25 +2,43 @@ import type { SpanHandle } from '../observability/trace-span.js';
2
2
  import type { StageApplyWarningCode, TurnStage } from './schema.js';
3
3
  import type { TurnStop } from './stop.js';
4
4
  import type { ModelToolResult, ToolFailure, ToolGate } from './tools/types.js';
5
- import { type AwaitingUserInput, type StageApplyWarning, type TurnEventOf } from './turn-events.js';
5
+ import type { AwaitingUserInput, StageApplyWarning, TurnEventOf } from './turn-events.js';
6
6
  import type { Profile, TurnEvent, TurnHistoryMessage } from './types.js';
7
7
  export type { AwaitingUserInput, ToolGate };
8
- export declare const STAGE_AFFORDANCES: readonly ["inject", "abort", "deny", "confirm", "mutate"];
8
+ /**
9
+ * What a stage handler can ask for: inject messages, abort, deny a tool call, ask for
10
+ * confirmation, mutate it, label it failed, or have it wait for other calls in its step.
11
+ */
12
+ export declare const STAGE_AFFORDANCES: readonly ["inject", "abort", "deny", "confirm", "mutate", "labelFailed", "waitFor"];
13
+ /** One of {@linkcode STAGE_AFFORDANCES}. */
9
14
  export type StageAffordance = (typeof STAGE_AFFORDANCES)[number];
10
15
  /** Inject still needs the inject gate at apply time. Empty = observe only. */
11
16
  export declare const STAGE_AFFORDANCE_MATRIX: Readonly<Record<TurnStage, readonly StageAffordance[]>>;
17
+ /** A call the model made in this step, as the host was shown it. */
18
+ export interface StepCall {
19
+ callId: string;
20
+ tool: string;
21
+ input: unknown;
22
+ }
12
23
  export type StageCallBag = {
13
24
  callId?: string;
14
25
  tool?: string;
15
26
  input?: unknown;
27
+ /** `pre_tool` in a turn's step: every call the model made in the step, in the order it made them. */
28
+ stepCalls?: readonly StepCall[];
16
29
  callNotStarted?: boolean;
17
30
  outputRaw?: unknown;
18
31
  outputModel?: ModelToolResult;
32
+ /** `post_tool`: the tool's past activity label, filled from the input and `outputRaw`. */
33
+ activityPast?: string;
34
+ /** `post_tool`: the tool's failed activity label, filled from the input. */
35
+ activityFailed?: string;
19
36
  failure?: ToolFailure;
20
37
  awaiting?: boolean;
21
38
  stop?: TurnStop;
22
39
  gate?: ToolGate;
23
40
  };
41
+ /** What a stage handler is given: the stage, the step, and what has happened so far. */
24
42
  export interface StageContext extends StageCallBag {
25
43
  stage: TurnStage;
26
44
  /** 1-based provider step (text) or utterance cycle index (live). */
@@ -29,6 +47,7 @@ export interface StageContext extends StageCallBag {
29
47
  /** Opaque host slot — never traced or client-forwarded by the kernel. */
30
48
  host?: unknown;
31
49
  }
50
+ /** What a stage handler returns: what it asks the turn to do. */
32
51
  export interface StageResult {
33
52
  inject?: TurnHistoryMessage[];
34
53
  /**
@@ -50,14 +69,27 @@ export interface StageResult {
50
69
  };
51
70
  /** `pre_tool`: replace the call input. `post_tool`: replace the raw output. Both re-validate. */
52
71
  mutate?: StageMutate;
72
+ /**
73
+ * `post_tool` only: the call completed, but show its failed label (`activityFailed`) on the
74
+ * terminal `tool` event. The result and the phase stay as they are.
75
+ */
76
+ labelFailed?: true;
77
+ /**
78
+ * `pre_tool` only: the call ids in `stepCalls` whose calls must settle before this call's body
79
+ * starts. A call held for confirmation is held at once and does not wait.
80
+ */
81
+ waitFor?: string[];
53
82
  }
83
+ /** A rewrite of a tool call's input or output. */
54
84
  export type StageMutate = {
55
85
  input: unknown;
56
86
  } | {
57
87
  output: unknown;
58
88
  };
89
+ /** A host function the turn calls at each stage. */
59
90
  export type StageHandler = (ctx: StageContext) => StageResult | undefined | Promise<StageResult | undefined>;
60
91
  export type { StageApplyWarning, StageApplyWarningCode };
92
+ /** A stage handler's result and the stage it came from, to be applied. */
61
93
  export interface StageApplyInput {
62
94
  stage: TurnStage;
63
95
  result: unknown;
@@ -74,6 +106,7 @@ export interface InjectUnit {
74
106
  id?: string;
75
107
  messages: TurnHistoryMessage[];
76
108
  }
109
+ /** A stage handler's result after validation: the parts the turn will act on. */
77
110
  export interface StageApplyOutput {
78
111
  inject?: InjectUnit;
79
112
  abort?: boolean | {
@@ -87,13 +120,15 @@ export interface StageApplyOutput {
87
120
  summary?: string;
88
121
  };
89
122
  mutate?: StageMutate;
123
+ labelFailed?: true;
124
+ waitFor?: string[];
90
125
  warnings: StageApplyWarning[];
91
126
  }
92
127
  /** True when the affordance is physically allowed at `stage` (ignores inject gate). */
93
128
  export declare function stageAllowsAffordance(stage: TurnStage, affordance: StageAffordance): boolean;
94
- export declare function isAwaitingUserInput(output: unknown): output is AwaitingUserInput;
95
129
  /** Never throws: invalid fields become warnings and are dropped. */
96
130
  export declare function applyStageResult(input: StageApplyInput): StageApplyOutput;
131
+ /** What a `stage` event records beside the stage: the tool call, its gate, and any injected messages. */
97
132
  export type StageEventExtra = {
98
133
  callId?: string;
99
134
  toolName?: string;
@@ -1,16 +1,28 @@
1
+ import { boundaryReader, detectEvent } from '../guardrails/detect-at.js';
1
2
  import { throwIfAborted } from '../guardrails/error.js';
2
- import { guardrailFromHits } from '../guardrails/events.js';
3
- import { detectionForTrust, resolveGuardrailPolicy } from '../guardrails/policy.js';
4
- import { sanitizeHistory } from '../guardrails/sanitize.js';
3
+ import { guardrailTurnEvent } from '../guardrails/events.js';
4
+ import { resolveGuardrailPolicy } from '../guardrails/policy.js';
5
+ import { requestRefused, sanitizeHistory } from '../guardrails/sanitize.js';
5
6
  import { guardrailAttributes } from './engine/turn-trace.js';
6
- import { awaitingUserInputSchema, } from './turn-events.js';
7
7
  import { isRecord } from './util/record.js';
8
- export const STAGE_AFFORDANCES = ['inject', 'abort', 'deny', 'confirm', 'mutate'];
8
+ /**
9
+ * What a stage handler can ask for: inject messages, abort, deny a tool call, ask for
10
+ * confirmation, mutate it, label it failed, or have it wait for other calls in its step.
11
+ */
12
+ export const STAGE_AFFORDANCES = [
13
+ 'inject',
14
+ 'abort',
15
+ 'deny',
16
+ 'confirm',
17
+ 'mutate',
18
+ 'labelFailed',
19
+ 'waitFor',
20
+ ];
9
21
  /** Inject still needs the inject gate at apply time. Empty = observe only. */
10
22
  export const STAGE_AFFORDANCE_MATRIX = Object.freeze({
11
23
  pre_turn: Object.freeze(['inject', 'abort']),
12
- pre_tool: Object.freeze(['abort', 'deny', 'confirm', 'mutate']),
13
- post_tool: Object.freeze(['inject', 'abort', 'deny', 'mutate']),
24
+ pre_tool: Object.freeze(['abort', 'deny', 'confirm', 'mutate', 'waitFor']),
25
+ post_tool: Object.freeze(['inject', 'abort', 'deny', 'mutate', 'labelFailed']),
14
26
  before_end: Object.freeze(['inject', 'abort']),
15
27
  post_turn: Object.freeze([]),
16
28
  });
@@ -22,13 +34,10 @@ export function stageAllowsAffordance(stage, affordance) {
22
34
  function warn(warnings, code, field, message) {
23
35
  warnings.push({ code, field, message });
24
36
  }
25
- export function isAwaitingUserInput(output) {
26
- return awaitingUserInputSchema.safeParse(output).success;
27
- }
28
37
  /** Drops unknown keys and rejects `role: 'tool'`; sanitizeHistory runs at the inject site. */
29
38
  function coerceInjectMessage(item, warnings) {
30
39
  if (!isRecord(item)) {
31
- warn(warnings, 'inject_invalid_messages', 'inject', 'inject entry must be an object'); // lexicon-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
40
+ warn(warnings, 'inject_invalid_messages', 'inject', 'inject entry must be an object'); // labels-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
32
41
  return undefined;
33
42
  }
34
43
  if (item.role === 'tool') {
@@ -63,14 +72,14 @@ function coerceInjectMessage(item, warnings) {
63
72
  }
64
73
  if (item.name !== undefined) {
65
74
  if (typeof item.name !== 'string') {
66
- warn(warnings, 'inject_invalid_messages', 'inject', 'inject name must be a string'); // lexicon-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
75
+ warn(warnings, 'inject_invalid_messages', 'inject', 'inject name must be a string'); // labels-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
67
76
  return undefined;
68
77
  }
69
78
  msg.name = item.name;
70
79
  }
71
80
  if (item.metadata !== undefined) {
72
81
  if (!isRecord(item.metadata)) {
73
- warn(warnings, 'inject_invalid_messages', 'inject', 'inject metadata must be a plain object'); // lexicon-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
82
+ warn(warnings, 'inject_invalid_messages', 'inject', 'inject metadata must be a plain object'); // labels-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
74
83
  return undefined;
75
84
  }
76
85
  msg.metadata = { ...item.metadata };
@@ -109,7 +118,7 @@ function injectUnit(result, warnings) {
109
118
  function applyInjectField(result, input, out) {
110
119
  if (!('inject' in result) || result.inject === undefined) {
111
120
  if (result.injectId !== undefined) {
112
- warn(out.warnings, 'inject_id_invalid', 'injectId', 'injectId without inject ignored'); // lexicon-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
121
+ warn(out.warnings, 'inject_id_invalid', 'injectId', 'injectId without inject ignored'); // labels-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
113
122
  }
114
123
  return;
115
124
  }
@@ -133,7 +142,7 @@ function applyAbortField(result, stage, out) {
133
142
  if (!('abort' in result) || result.abort === undefined)
134
143
  return;
135
144
  if (!stageAllowsAffordance(stage, 'abort')) {
136
- warn(out.warnings, 'affordance_not_allowed', 'abort', 'abort is not allowed at post_turn'); // lexicon-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
145
+ warn(out.warnings, 'affordance_not_allowed', 'abort', 'abort is not allowed at post_turn'); // labels-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
137
146
  }
138
147
  else if (result.abort === true) {
139
148
  out.abort = true;
@@ -145,17 +154,17 @@ function applyAbortField(result, stage, out) {
145
154
  out.abort = reason ? { reason } : true;
146
155
  }
147
156
  else if (result.abort !== false) {
148
- warn(out.warnings, 'abort_invalid', 'abort', 'abort must be boolean or { reason?: string }'); // lexicon-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
157
+ warn(out.warnings, 'abort_invalid', 'abort', 'abort must be boolean or { reason?: string }'); // labels-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
149
158
  }
150
159
  }
151
160
  function applyDenyField(result, stage, out) {
152
161
  if (!('deny' in result) || result.deny === undefined)
153
162
  return;
154
163
  if (!stageAllowsAffordance(stage, 'deny')) {
155
- warn(out.warnings, 'affordance_not_allowed', 'deny', `deny is not allowed at stage ${stage}`); // lexicon-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
164
+ warn(out.warnings, 'affordance_not_allowed', 'deny', `deny is not allowed at stage ${stage}`); // labels-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
156
165
  }
157
166
  else if (!isRecord(result.deny)) {
158
- warn(out.warnings, 'deny_invalid', 'deny', 'deny must be an object'); // lexicon-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
167
+ warn(out.warnings, 'deny_invalid', 'deny', 'deny must be an object'); // labels-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
159
168
  }
160
169
  else {
161
170
  const code = typeof result.deny.code === 'string' && result.deny.code.trim()
@@ -163,10 +172,23 @@ function applyDenyField(result, stage, out) {
163
172
  : 'not_authorized';
164
173
  const message = typeof result.deny.message === 'string' && result.deny.message.trim()
165
174
  ? result.deny.message.trim()
166
- : 'Tool execution not authorized'; // lexicon-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
175
+ : 'Tool execution not authorized'; // labels-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
167
176
  out.deny = { code, message };
168
177
  }
169
178
  }
179
+ function applyLabelFailedField(result, stage, out) {
180
+ if (!('labelFailed' in result) || result.labelFailed === undefined)
181
+ return;
182
+ if (!stageAllowsAffordance(stage, 'labelFailed')) {
183
+ warn(out.warnings, 'affordance_not_allowed', 'labelFailed', `labelFailed is not allowed at stage ${stage}`);
184
+ }
185
+ else if (result.labelFailed === true) {
186
+ out.labelFailed = true;
187
+ }
188
+ else if (result.labelFailed !== false) {
189
+ warn(out.warnings, 'label_failed_invalid', 'labelFailed', 'labelFailed must be true'); // labels-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
190
+ }
191
+ }
170
192
  function applyConfirmField(result, stage, out) {
171
193
  if (!('confirm' in result) || result.confirm === undefined)
172
194
  return;
@@ -186,6 +208,20 @@ function applyConfirmField(result, stage, out) {
186
208
  warn(out.warnings, 'confirm_invalid', 'confirm', 'confirm must be true or { summary?: string }');
187
209
  }
188
210
  }
211
+ function applyWaitForField(result, stage, out) {
212
+ if (!('waitFor' in result) || result.waitFor === undefined)
213
+ return;
214
+ if (!stageAllowsAffordance(stage, 'waitFor')) {
215
+ warn(out.warnings, 'affordance_not_allowed', 'waitFor', `waitFor is not allowed at stage ${stage}`);
216
+ }
217
+ else if (!Array.isArray(result.waitFor) ||
218
+ !result.waitFor.every((id) => typeof id === 'string' && id.trim() !== '')) {
219
+ warn(out.warnings, 'wait_for_invalid', 'waitFor', 'waitFor must be an array of call ids');
220
+ }
221
+ else if (result.waitFor.length > 0) {
222
+ out.waitFor = [...new Set(result.waitFor)];
223
+ }
224
+ }
189
225
  const MUTATE_SUBJECT = { pre_tool: 'input', post_tool: 'output' };
190
226
  function mutateSubject(stage) {
191
227
  return stage in MUTATE_SUBJECT ? MUTATE_SUBJECT[stage] : undefined;
@@ -200,21 +236,21 @@ function applyMutateField(result, input, out) {
200
236
  }
201
237
  const subject = mutateSubject(stage);
202
238
  if (!subject) {
203
- // Matrix allows mutate but no subject is mapped: a kernel drift, surfaced not swallowed.
239
+ // why: Matrix allows mutate but no subject is mapped: a kernel drift, surfaced not swallowed.
204
240
  warn(out.warnings, 'mutate_invalid', 'mutate',
205
- // lexicon-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
241
+ // labels-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
206
242
  `no mutate subject is defined at stage ${stage}`);
207
243
  return;
208
244
  }
209
245
  if (!isRecord(result.mutate) || result.mutate[subject] === undefined) {
210
246
  warn(out.warnings, 'mutate_invalid', 'mutate',
211
- // lexicon-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
247
+ // labels-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
212
248
  `mutate must be { ${subject}: unknown } at stage ${stage}`);
213
249
  return;
214
250
  }
215
251
  if (input.mutable === false) {
216
252
  warn(out.warnings, 'mutate_invalid', 'mutate',
217
- // lexicon-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
253
+ // labels-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
218
254
  `there is no ${subject} to replace at this ${stage} fire`);
219
255
  return;
220
256
  }
@@ -229,12 +265,12 @@ export function applyStageResult(input) {
229
265
  if (result == null)
230
266
  return out;
231
267
  if (!isRecord(result)) {
232
- warn(warnings, 'result_invalid', 'result', 'StageResult must be a plain object'); // lexicon-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
268
+ warn(warnings, 'result_invalid', 'result', 'StageResult must be a plain object'); // labels-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
233
269
  return out;
234
270
  }
235
271
  for (const key of Object.keys(result)) {
236
272
  if (!STAGE_RESULT_KEYS.has(key)) {
237
- warn(warnings, 'unknown_field', key, `unknown StageResult field "${key}" ignored`); // lexicon-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
273
+ warn(warnings, 'unknown_field', key, `unknown StageResult field "${key}" ignored`); // labels-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
238
274
  }
239
275
  }
240
276
  applyInjectField(result, input, out);
@@ -242,9 +278,10 @@ export function applyStageResult(input) {
242
278
  applyDenyField(result, stage, out);
243
279
  applyConfirmField(result, stage, out);
244
280
  applyMutateField(result, input, out);
245
- // confirm + deny together: deny wins
281
+ applyLabelFailedField(result, stage, out);
282
+ applyWaitForField(result, stage, out);
246
283
  if (out.deny && out.confirm) {
247
- warn(warnings, 'confirm_invalid', 'confirm', 'confirm ignored because deny is set'); // lexicon-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
284
+ warn(warnings, 'confirm_invalid', 'confirm', 'confirm ignored because deny is set'); // labels-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
248
285
  delete out.confirm;
249
286
  }
250
287
  return out;
@@ -294,8 +331,8 @@ function appliedAffordance(applied, key) {
294
331
  }
295
332
  /**
296
333
  * Merge per-handler applied outputs in call order. Later scalars win, `inject`
297
- * lists concatenate, warnings accumulate. `deny` beats `confirm` across handlers
298
- * exactly as it does within one return.
334
+ * lists concatenate, `waitFor` ids join, warnings accumulate. `deny` beats `confirm`
335
+ * across handlers exactly as it does within one return.
299
336
  */
300
337
  function mergeApplied(parts) {
301
338
  const out = { warnings: parts.flatMap((part) => part.warnings), inject: [] };
@@ -308,11 +345,15 @@ function mergeApplied(parts) {
308
345
  out.confirm = part.confirm;
309
346
  if (part.mutate)
310
347
  out.mutate = part.mutate;
348
+ if (part.labelFailed)
349
+ out.labelFailed = true;
350
+ if (part.waitFor)
351
+ out.waitFor = [...new Set([...(out.waitFor ?? []), ...part.waitFor])];
311
352
  if (part.inject)
312
353
  out.inject.push(part.inject);
313
354
  }
314
355
  if (out.deny && out.confirm) {
315
- warn(out.warnings, 'confirm_invalid', 'confirm', 'confirm ignored because deny is set'); // lexicon-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
356
+ warn(out.warnings, 'confirm_invalid', 'confirm', 'confirm ignored because deny is set'); // labels-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
316
357
  delete out.confirm;
317
358
  }
318
359
  return out;
@@ -342,7 +383,7 @@ async function applyHandlers(handlers, ctx, apply, signal) {
342
383
  export async function* runStage(args) {
343
384
  const { stage, step, history, handlers, guardrails, injectAllowed, injectWouldExceedMaxSteps, mutable, host, signal, span, ...bag } = args;
344
385
  throwIfAborted(signal);
345
- // Stream stage events stay lean (no outputRaw/failure). Hosts read those on
386
+ // why: Stream stage events stay lean (no outputRaw/failure). Hosts read those on
346
387
  // StageContext via onStage; tool failures also ride tool events.
347
388
  yield stageEventFields(stage, {
348
389
  callId: bag.callId,
@@ -373,16 +414,18 @@ export async function* runStage(args) {
373
414
  }
374
415
  if (applied.inject.length === 0)
375
416
  return applied;
376
- const hits = [];
377
- const detection = detectionForTrust(resolveGuardrailPolicy(guardrails), 'untrusted');
417
+ const reader = boundaryReader('injected', resolveGuardrailPolicy(guardrails).detect);
378
418
  const sanitized = applied.inject.map((unit) => ({
379
419
  ...unit,
380
- messages: sanitizeHistory(unit.messages, detection, hits),
420
+ messages: sanitizeHistory(unit.messages, reader),
381
421
  }));
382
- const redacted = guardrailFromHits('history', 'untrusted', hits, 'redact');
383
- if (redacted?.guardrail)
384
- span?.event('theorem.guardrail', guardrailAttributes(redacted.guardrail));
385
- if (redacted)
386
- yield redacted;
422
+ const found = reader.found();
423
+ const event = detectEvent('injected', found);
424
+ if (event) {
425
+ span?.event('theorem.guardrail', guardrailAttributes(event));
426
+ yield guardrailTurnEvent(event);
427
+ }
428
+ if (found.action === 'block')
429
+ throw requestRefused('injected');
387
430
  return { ...applied, inject: sanitized };
388
431
  }
@@ -1,4 +1,4 @@
1
- import { type ContinueStopKind, type ProfileType } from './schema.js';
1
+ import { type ContinueStopKind, type ProfileType, type StepLimitMode } from './schema.js';
2
2
  import type { TurnStop } from './turn-events.js';
3
3
  export type { TurnStop };
4
4
  /**
@@ -6,11 +6,13 @@ export type { TurnStop };
6
6
  * speech continue by re-sending the host's request unchanged.
7
7
  */
8
8
  export declare const CONTINUE_INSTRUCTION_TYPES: readonly ProfileType[];
9
+ /** The stop kinds that offer Continue when a profile names none. */
9
10
  export declare const DEFAULT_ALLOW_CONTINUE: readonly ContinueStopKind[];
10
11
  /** Hosts wait briefly, then continue once on their own. */
11
12
  export declare const DEFAULT_AUTO_CONTINUE: readonly ContinueStopKind[];
12
- /** Pause before the one-shot auto-continue so a flaky tunnel can settle. */
13
+ /** Pause before an auto-continue, the host's or the turn's own, so a flaky tunnel can settle. */
13
14
  export declare const AUTO_CONTINUE_DELAY_MS = 1500;
15
+ /** Which stops a profile offers Continue for, and which the host continues on its own. */
14
16
  export interface ProfileTurnResumptionSpec {
15
17
  /**
16
18
  * The host's UI policy for offering Continue: the kernel does not refuse a `continueFrom`
@@ -19,13 +21,22 @@ export interface ProfileTurnResumptionSpec {
19
21
  */
20
22
  allowContinue?: ContinueStopKind[];
21
23
  /**
22
- * Omit → length / stream_incomplete; `[]` = none. The kernel does not loop: the host
23
- * sends the `continueFrom` turn with `continuation`.
24
+ * Omit → length / stream_incomplete; `[]` = none. Apart from `allowContinue`: a stop can be
25
+ * continued without Continue being offered for it. The host sends the `continueFrom` turn
26
+ * with `continuation`. A text turn also sends a failed model call (`provider_error`,
27
+ * `stream_incomplete`) again itself when this list is set and names that stop, and the
28
+ * call gave no reply and no tool call: the turn keeps its history, its step count and
29
+ * what it has read. A failure the same call would meet again (the provider refused the
30
+ * request) is not sent again. Omitted, a turn sends nothing again.
24
31
  */
25
32
  autoContinue?: ContinueStopKind[];
26
- /** Compared against `TurnRequest.continuation`. Omit → no count cap. */
33
+ /**
34
+ * Compared against `TurnRequest.continuation`; omit → no count cap. Also how many model
35
+ * calls one text turn sends again itself; omit → one.
36
+ */
27
37
  maxContinues?: number;
28
38
  }
39
+ /** True when the stop kind can be continued. */
29
40
  export declare function isContinueStopKind(kind: string): kind is ContinueStopKind;
30
41
  /**
31
42
  * `allowSteering` is text / live only; image and speech omit it. Stop is not a profile knob:
@@ -35,6 +46,11 @@ export interface ProfileTurnBehaviourSpec {
35
46
  resumption?: ProfileTurnResumptionSpec;
36
47
  /** Default true on text / live. Gates injects only; stage events still emit. */
37
48
  allowSteering?: boolean;
49
+ /**
50
+ * Text only. What the last model call under `maxSteps` may do. Omit = `'stop'`: it may call
51
+ * tools, and if it does the turn stops as `step_limit`. `'answer'` sends it without tools.
52
+ */
53
+ atStepLimit?: StepLimitMode;
38
54
  }
39
55
  /**
40
56
  * Image / speech turn behaviour: resumption only. A continue re-sends the
@@ -52,15 +68,20 @@ export interface MediaTurnBehaviourSpec {
52
68
  export interface TurnContinueFrom {
53
69
  stop: TurnStop;
54
70
  }
71
+ /** True when the stop can be continued under the allowed kinds. */
55
72
  export declare function isResumeableStop(stop: TurnStop | undefined, allowContinue?: readonly ContinueStopKind[]): boolean;
73
+ /** True for a stop where the model call failed; the rest either finished or were stopped on purpose. */
74
+ export declare function isFailedStopKind(kind: TurnStop['kind']): boolean;
56
75
  export declare function stageAbortStop(abort: true | {
57
76
  reason?: string;
58
77
  }): TurnStop & {
59
78
  kind: 'cancelled';
60
79
  };
80
+ /** True when the user cancelled the turn. */
61
81
  export declare function isUserCancelledStop(stop: TurnStop | undefined): boolean;
62
82
  /** `policy` is the profile's `profileTurnResumption(profile)`. */
63
- export declare function shouldAutoContinue(stop: TurnStop | undefined, policy?: Pick<ProfileTurnResumptionSpec, 'allowContinue' | 'autoContinue'>): boolean;
83
+ export declare function shouldAutoContinue(stop: TurnStop | undefined, policy?: Pick<ProfileTurnResumptionSpec, 'autoContinue'>): boolean;
84
+ /** The profile's resumption policy, or `undefined` for a live profile. */
64
85
  export declare function profileTurnResumption(profile: {
65
86
  type: string;
66
87
  turnBehaviour?: ProfileTurnBehaviourSpec;
@@ -85,9 +106,11 @@ export declare function turnStopFromClientStreamEnd(opts: {
85
106
  sawTerminal: boolean;
86
107
  hadPartial?: boolean;
87
108
  }): TurnStop | null;
109
+ /** Thrown when a model call stops before it finishes, carrying the stop. */
88
110
  export declare class GenerationStopError extends Error {
89
111
  readonly name = "GenerationStopError";
90
112
  readonly stop: TurnStop;
91
113
  constructor(stop: TurnStop, message?: string);
92
114
  }
115
+ /** True when the error is a `GenerationStopError`. */
93
116
  export declare function isGenerationStopError(err: unknown): err is GenerationStopError;
@@ -1,19 +1,22 @@
1
- import { CONTINUE_STOP_KINDS } from './schema.js';
1
+ import { CONTINUE_STOP_KINDS, } from './schema.js';
2
2
  /**
3
3
  * Profile types whose continue turn sends the continue instruction. Image and
4
4
  * speech continue by re-sending the host's request unchanged.
5
5
  */
6
6
  export const CONTINUE_INSTRUCTION_TYPES = ['text'];
7
+ /** The stop kinds that offer Continue when a profile names none. */
7
8
  export const DEFAULT_ALLOW_CONTINUE = CONTINUE_STOP_KINDS;
8
9
  /** Hosts wait briefly, then continue once on their own. */
9
10
  export const DEFAULT_AUTO_CONTINUE = ['length', 'stream_incomplete'];
10
- /** Pause before the one-shot auto-continue so a flaky tunnel can settle. */
11
+ /** Pause before an auto-continue, the host's or the turn's own, so a flaky tunnel can settle. */
11
12
  export const AUTO_CONTINUE_DELAY_MS = 1_500;
12
13
  const CONTINUE_KIND_SET = new Set(CONTINUE_STOP_KINDS);
14
+ /** True when the stop kind can be continued. */
13
15
  export function isContinueStopKind(kind) {
14
16
  return CONTINUE_KIND_SET.has(kind);
15
17
  }
16
18
  const RESUMEABLE_DEFAULT = new Set(DEFAULT_ALLOW_CONTINUE);
19
+ /** True when the stop can be continued under the allowed kinds. */
17
20
  export function isResumeableStop(stop, allowContinue) {
18
21
  if (!stop)
19
22
  return false;
@@ -22,11 +25,17 @@ export function isResumeableStop(stop, allowContinue) {
22
25
  const allow = allowContinue ? new Set(allowContinue) : RESUMEABLE_DEFAULT;
23
26
  return allow.has(stop.kind);
24
27
  }
28
+ const FAILED_STOP_KINDS = new Set(['provider_error', 'stream_incomplete']);
29
+ /** True for a stop where the model call failed; the rest either finished or were stopped on purpose. */
30
+ export function isFailedStopKind(kind) {
31
+ return FAILED_STOP_KINDS.has(kind);
32
+ }
25
33
  export function stageAbortStop(abort) {
26
34
  return typeof abort === 'object' && abort.reason
27
35
  ? { kind: 'cancelled', native: abort.reason }
28
36
  : { kind: 'cancelled' };
29
37
  }
38
+ /** True when the user cancelled the turn. */
30
39
  export function isUserCancelledStop(stop) {
31
40
  return stop?.kind === 'cancelled';
32
41
  }
@@ -34,9 +43,10 @@ export function isUserCancelledStop(stop) {
34
43
  export function shouldAutoContinue(stop, policy) {
35
44
  if (!stop || !isContinueStopKind(stop.kind))
36
45
  return false;
37
- const auto = policy?.autoContinue ?? DEFAULT_AUTO_CONTINUE;
38
- return auto.includes(stop.kind) && isResumeableStop(stop, policy?.allowContinue);
46
+ // why: Offering Continue (`allowContinue`) is the host's own choice, apart from this one.
47
+ return (policy?.autoContinue ?? DEFAULT_AUTO_CONTINUE).includes(stop.kind);
39
48
  }
49
+ /** The profile's resumption policy, or `undefined` for a live profile. */
40
50
  export function profileTurnResumption(profile) {
41
51
  if (profile.type === 'live')
42
52
  return undefined;
@@ -112,6 +122,7 @@ export function turnStopFromClientStreamEnd(opts) {
112
122
  return { kind: 'cancelled' };
113
123
  return { kind: 'stream_incomplete' };
114
124
  }
125
+ /** Thrown when a model call stops before it finishes, carrying the stop. */
115
126
  export class GenerationStopError extends Error {
116
127
  name = 'GenerationStopError';
117
128
  stop;
@@ -120,6 +131,7 @@ export class GenerationStopError extends Error {
120
131
  this.stop = stop;
121
132
  }
122
133
  }
134
+ /** True when the error is a `GenerationStopError`. */
123
135
  export function isGenerationStopError(err) {
124
136
  return err instanceof GenerationStopError;
125
137
  }