@theoremjs/agents 0.0.0-stage → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (588) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +545 -2
  3. package/esm/_dnt.polyfills.d.ts +66 -0
  4. package/esm/_dnt.polyfills.js +51 -0
  5. package/esm/mod.d.ts +79 -0
  6. package/esm/mod.js +49 -0
  7. package/esm/package.json +3 -0
  8. package/esm/src/cli/bin.d.ts +7 -0
  9. package/esm/src/cli/bin.js +9 -0
  10. package/esm/src/cli/commands/bench.d.ts +6 -0
  11. package/esm/src/cli/commands/bench.js +480 -0
  12. package/esm/src/cli/commands/detect-compile.d.ts +17 -0
  13. package/esm/src/cli/commands/detect-compile.js +22 -0
  14. package/esm/src/cli/commands/eval.d.ts +37 -0
  15. package/esm/src/cli/commands/eval.js +190 -0
  16. package/esm/src/cli/commands/fuzz-canary.d.ts +15 -0
  17. package/esm/src/cli/commands/fuzz-canary.js +241 -0
  18. package/esm/src/cli/commands/fuzz-guardrails.d.ts +2 -0
  19. package/esm/src/cli/commands/fuzz-guardrails.js +5 -0
  20. package/esm/src/cli/commands/profile.d.ts +2 -0
  21. package/esm/src/cli/commands/profile.js +80 -0
  22. package/esm/src/cli/commands/run.d.ts +13 -0
  23. package/esm/src/cli/commands/run.js +45 -0
  24. package/esm/src/cli/commands/test.d.ts +26 -0
  25. package/esm/src/cli/commands/test.js +143 -0
  26. package/esm/src/cli/event-log.d.ts +15 -0
  27. package/esm/src/cli/event-log.js +136 -0
  28. package/esm/src/cli/index.d.ts +10 -0
  29. package/esm/src/cli/index.js +267 -0
  30. package/esm/src/cli/matrix/fixtures.d.ts +10 -0
  31. package/esm/src/cli/matrix/fixtures.js +67 -0
  32. package/esm/src/cli/matrix/synthesizer.d.ts +18 -0
  33. package/esm/src/cli/matrix/synthesizer.js +103 -0
  34. package/esm/src/evals/attachments.d.ts +5 -0
  35. package/esm/src/evals/attachments.js +55 -0
  36. package/esm/src/evals/breakdown.d.ts +30 -0
  37. package/esm/src/evals/breakdown.js +69 -0
  38. package/esm/src/evals/graders/answer.d.ts +16 -0
  39. package/esm/src/evals/graders/answer.js +134 -0
  40. package/esm/src/evals/graders/code.d.ts +40 -0
  41. package/esm/src/evals/graders/code.js +184 -0
  42. package/esm/src/evals/graders/judge.d.ts +24 -0
  43. package/esm/src/evals/graders/judge.js +367 -0
  44. package/esm/src/evals/graders/latency.d.ts +6 -0
  45. package/esm/src/evals/graders/latency.js +82 -0
  46. package/esm/src/evals/graders/live.d.ts +14 -0
  47. package/esm/src/evals/graders/live.js +42 -0
  48. package/esm/src/evals/graders/media.d.ts +18 -0
  49. package/esm/src/evals/graders/media.js +91 -0
  50. package/esm/src/evals/graders/shared.d.ts +11 -0
  51. package/esm/src/evals/graders/shared.js +62 -0
  52. package/esm/src/evals/graders/transcript.d.ts +19 -0
  53. package/esm/src/evals/graders/transcript.js +202 -0
  54. package/esm/src/evals/mod.d.ts +34 -0
  55. package/esm/src/evals/mod.js +22 -0
  56. package/esm/src/evals/record.d.ts +41 -0
  57. package/esm/src/evals/record.js +107 -0
  58. package/esm/src/evals/rubrics/catalog.d.ts +148 -0
  59. package/esm/src/evals/rubrics/catalog.js +846 -0
  60. package/esm/src/evals/rubrics/mod.d.ts +24 -0
  61. package/esm/src/evals/rubrics/mod.js +55 -0
  62. package/esm/src/evals/rubrics/mustache.d.ts +23 -0
  63. package/esm/src/evals/rubrics/mustache.js +154 -0
  64. package/esm/src/evals/rubrics/types.d.ts +54 -0
  65. package/esm/src/evals/rubrics/types.js +74 -0
  66. package/esm/src/evals/run.d.ts +75 -0
  67. package/esm/src/evals/run.js +418 -0
  68. package/esm/src/evals/suite.d.ts +28 -0
  69. package/esm/src/evals/suite.js +97 -0
  70. package/esm/src/evals/summary.d.ts +35 -0
  71. package/esm/src/evals/summary.js +31 -0
  72. package/esm/src/evals/trial.d.ts +14 -0
  73. package/esm/src/evals/trial.js +135 -0
  74. package/esm/src/evals/types.d.ts +169 -0
  75. package/esm/src/evals/types.js +113 -0
  76. package/esm/src/evals/verdict.d.ts +23 -0
  77. package/esm/src/evals/verdict.js +48 -0
  78. package/esm/src/guardrails/boundaries.d.ts +41 -0
  79. package/esm/src/guardrails/boundaries.js +103 -0
  80. package/esm/src/guardrails/canary-gate.d.ts +22 -0
  81. package/esm/src/guardrails/canary-gate.js +40 -0
  82. package/esm/src/guardrails/canary.d.ts +146 -0
  83. package/esm/src/guardrails/canary.js +974 -0
  84. package/esm/src/guardrails/compile-egress.d.ts +12 -0
  85. package/esm/src/guardrails/compile-egress.js +12 -0
  86. package/esm/src/guardrails/corpus/canary-egress-attacks.d.ts +24 -0
  87. package/esm/src/guardrails/corpus/canary-egress-attacks.js +305 -0
  88. package/esm/src/guardrails/corpus/fuzz-inbound.d.ts +5 -0
  89. package/esm/src/guardrails/corpus/fuzz-inbound.js +199 -0
  90. package/esm/src/guardrails/corpus/inbound-payloads.d.ts +5 -0
  91. package/esm/src/guardrails/corpus/inbound-payloads.js +120 -0
  92. package/esm/src/guardrails/corpus/live-attacks.d.ts +15 -0
  93. package/esm/src/guardrails/corpus/live-attacks.js +229 -0
  94. package/esm/src/guardrails/corpus/mod.d.ts +7 -0
  95. package/esm/src/guardrails/corpus/mod.js +4 -0
  96. package/esm/src/guardrails/corpus/secrets.d.ts +12 -0
  97. package/esm/src/guardrails/corpus/secrets.js +16 -0
  98. package/esm/src/guardrails/corpus/strings.d.ts +23 -0
  99. package/esm/src/guardrails/corpus/strings.js +29 -0
  100. package/esm/src/guardrails/corpus/types.d.ts +36 -0
  101. package/esm/src/guardrails/corpus/types.js +1 -0
  102. package/esm/src/guardrails/credential-rules.d.ts +36 -0
  103. package/esm/src/guardrails/credential-rules.js +3001 -0
  104. package/esm/src/guardrails/credential-scan.d.ts +45 -0
  105. package/esm/src/guardrails/credential-scan.js +172 -0
  106. package/esm/src/guardrails/destinations.d.ts +45 -0
  107. package/esm/src/guardrails/destinations.js +234 -0
  108. package/esm/src/guardrails/detect-at.d.ts +107 -0
  109. package/esm/src/guardrails/detect-at.js +434 -0
  110. package/esm/src/guardrails/detect-reply.d.ts +61 -0
  111. package/esm/src/guardrails/detect-reply.js +95 -0
  112. package/esm/src/guardrails/detect-stream.d.ts +33 -0
  113. package/esm/src/guardrails/detect-stream.js +77 -0
  114. package/esm/src/guardrails/detectors.d.ts +216 -0
  115. package/esm/src/guardrails/detectors.js +503 -0
  116. package/esm/src/guardrails/egress-automata.d.ts +12 -0
  117. package/esm/src/guardrails/egress-automata.js +25582 -0
  118. package/esm/src/guardrails/egress-compiler.d.ts +55 -0
  119. package/esm/src/guardrails/egress-compiler.js +431 -0
  120. package/esm/src/guardrails/egress-patterns.d.ts +26 -0
  121. package/esm/src/guardrails/egress-patterns.js +36 -0
  122. package/esm/src/guardrails/egress-stream.d.ts +123 -0
  123. package/esm/src/guardrails/egress-stream.js +774 -0
  124. package/esm/src/guardrails/egress-urls.d.ts +86 -0
  125. package/esm/src/guardrails/egress-urls.js +909 -0
  126. package/esm/src/guardrails/egress.d.ts +46 -0
  127. package/esm/src/guardrails/egress.js +124 -0
  128. package/esm/src/guardrails/error.d.ts +31 -0
  129. package/esm/src/guardrails/error.js +96 -0
  130. package/esm/src/guardrails/event-schemas.d.ts +100 -0
  131. package/esm/src/guardrails/event-schemas.js +48 -0
  132. package/esm/src/guardrails/events.d.ts +13 -0
  133. package/esm/src/guardrails/events.js +45 -0
  134. package/esm/src/guardrails/hints.d.ts +14 -0
  135. package/esm/src/guardrails/hints.js +57 -0
  136. package/esm/src/guardrails/hits.d.ts +14 -0
  137. package/esm/src/guardrails/hits.js +30 -0
  138. package/esm/src/guardrails/host-patterns.d.ts +85 -0
  139. package/esm/src/guardrails/host-patterns.js +173 -0
  140. package/esm/src/guardrails/injection-patterns.d.ts +20 -0
  141. package/esm/src/guardrails/injection-patterns.js +126 -0
  142. package/esm/src/guardrails/injection-reversed.d.ts +9 -0
  143. package/esm/src/guardrails/injection-reversed.js +49 -0
  144. package/esm/src/guardrails/injection.d.ts +30 -0
  145. package/esm/src/guardrails/injection.js +460 -0
  146. package/esm/src/guardrails/labels.d.ts +40 -0
  147. package/esm/src/guardrails/labels.js +874 -0
  148. package/esm/src/guardrails/live-outbound-gate.d.ts +55 -0
  149. package/esm/src/guardrails/live-outbound-gate.js +298 -0
  150. package/esm/src/guardrails/mod.d.ts +54 -0
  151. package/esm/src/guardrails/mod.js +34 -0
  152. package/esm/src/guardrails/network.d.ts +46 -0
  153. package/esm/src/guardrails/network.js +330 -0
  154. package/esm/src/guardrails/normalize.d.ts +20 -0
  155. package/esm/src/guardrails/normalize.js +165 -0
  156. package/esm/src/guardrails/policy.d.ts +4 -0
  157. package/esm/src/guardrails/policy.js +21 -0
  158. package/esm/src/guardrails/progressive-yield.d.ts +110 -0
  159. package/esm/src/guardrails/progressive-yield.js +281 -0
  160. package/esm/src/guardrails/prompt-echo.d.ts +40 -0
  161. package/esm/src/guardrails/prompt-echo.js +306 -0
  162. package/esm/src/guardrails/quota.d.ts +21 -0
  163. package/esm/src/guardrails/quota.js +80 -0
  164. package/esm/src/guardrails/rules.d.ts +47 -0
  165. package/esm/src/guardrails/rules.js +47 -0
  166. package/esm/src/guardrails/sanitize.d.ts +40 -0
  167. package/esm/src/guardrails/sanitize.js +160 -0
  168. package/esm/src/guardrails/sensitive-groups.d.ts +21 -0
  169. package/esm/src/guardrails/sensitive-groups.js +12 -0
  170. package/esm/src/guardrails/sensitive.d.ts +22 -0
  171. package/esm/src/guardrails/sensitive.js +234 -0
  172. package/esm/src/guardrails/serialize.d.ts +15 -0
  173. package/esm/src/guardrails/serialize.js +37 -0
  174. package/esm/src/guardrails/testing.d.ts +11 -0
  175. package/esm/src/guardrails/testing.js +10 -0
  176. package/esm/src/guardrails/theorem-error.d.ts +21 -0
  177. package/esm/src/guardrails/theorem-error.js +54 -0
  178. package/esm/src/guardrails/thought-guard.d.ts +76 -0
  179. package/esm/src/guardrails/thought-guard.js +664 -0
  180. package/esm/src/guardrails/tool-directives.d.ts +38 -0
  181. package/esm/src/guardrails/tool-directives.js +195 -0
  182. package/esm/src/guardrails/tool-leak.d.ts +26 -0
  183. package/esm/src/guardrails/tool-leak.js +45 -0
  184. package/esm/src/guardrails/tool-result.d.ts +92 -0
  185. package/esm/src/guardrails/tool-result.js +272 -0
  186. package/esm/src/guardrails/types.d.ts +250 -0
  187. package/esm/src/guardrails/types.js +58 -0
  188. package/esm/src/host/client-turn.d.ts +36 -0
  189. package/esm/src/host/client-turn.js +80 -0
  190. package/esm/src/host/mint-trace.d.ts +29 -0
  191. package/esm/src/host/mint-trace.js +60 -0
  192. package/esm/src/host/mod.d.ts +13 -0
  193. package/esm/src/host/mod.js +11 -0
  194. package/esm/src/host/readStreamingJsonStringField.d.ts +2 -0
  195. package/esm/src/host/readStreamingJsonStringField.js +27 -0
  196. package/esm/src/host/reply.d.ts +13 -0
  197. package/esm/src/host/reply.js +41 -0
  198. package/esm/src/interface/blocks.d.ts +11 -0
  199. package/esm/src/interface/blocks.js +283 -0
  200. package/esm/src/interface/composer-actions.d.ts +24 -0
  201. package/esm/src/interface/composer-actions.js +33 -0
  202. package/esm/src/interface/draft.d.ts +20 -0
  203. package/esm/src/interface/draft.js +39 -0
  204. package/esm/src/interface/from-profile.d.ts +24 -0
  205. package/esm/src/interface/from-profile.js +179 -0
  206. package/esm/src/interface/history.d.ts +46 -0
  207. package/esm/src/interface/history.js +278 -0
  208. package/esm/src/interface/inputs.d.ts +11 -0
  209. package/esm/src/interface/inputs.js +67 -0
  210. package/esm/src/interface/mod.d.ts +33 -0
  211. package/esm/src/interface/mod.js +22 -0
  212. package/esm/src/interface/models.d.ts +26 -0
  213. package/esm/src/interface/models.js +50 -0
  214. package/esm/src/interface/pending.d.ts +57 -0
  215. package/esm/src/interface/pending.js +152 -0
  216. package/esm/src/interface/profile-interface.d.ts +4 -0
  217. package/esm/src/interface/profile-interface.js +237 -0
  218. package/esm/src/interface/session.d.ts +71 -0
  219. package/esm/src/interface/session.js +128 -0
  220. package/esm/src/interface/stop.d.ts +13 -0
  221. package/esm/src/interface/stop.js +28 -0
  222. package/esm/src/interface/tool-calls.d.ts +32 -0
  223. package/esm/src/interface/tool-calls.js +127 -0
  224. package/esm/src/interface/tool-invoke.d.ts +6 -0
  225. package/esm/src/interface/tool-invoke.js +22 -0
  226. package/esm/src/interface/tool-media.d.ts +11 -0
  227. package/esm/src/interface/tool-media.js +113 -0
  228. package/esm/src/interface/types.d.ts +278 -0
  229. package/esm/src/interface/types.js +5 -0
  230. package/esm/src/kernel/api-catalog.d.ts +85 -0
  231. package/esm/src/kernel/api-catalog.js +229 -0
  232. package/esm/src/kernel/auth/credential-source.d.ts +23 -0
  233. package/esm/src/kernel/auth/credential-source.js +11 -0
  234. package/esm/src/kernel/auth/crypto.d.ts +56 -0
  235. package/esm/src/kernel/auth/crypto.js +163 -0
  236. package/esm/src/kernel/auth/mod.d.ts +5 -0
  237. package/esm/src/kernel/auth/mod.js +5 -0
  238. package/esm/src/kernel/auth/oauth.d.ts +18 -0
  239. package/esm/src/kernel/auth/oauth.js +439 -0
  240. package/esm/src/kernel/auth/scope-refusal.d.ts +9 -0
  241. package/esm/src/kernel/auth/scope-refusal.js +8 -0
  242. package/esm/src/kernel/auth/typed-secret.d.ts +13 -0
  243. package/esm/src/kernel/auth/typed-secret.js +23 -0
  244. package/esm/src/kernel/auth/types.d.ts +152 -0
  245. package/esm/src/kernel/auth/types.js +1 -0
  246. package/esm/src/kernel/checkpoint.d.ts +43 -0
  247. package/esm/src/kernel/checkpoint.js +58 -0
  248. package/esm/src/kernel/default-scope.d.ts +72 -0
  249. package/esm/src/kernel/default-scope.js +121 -0
  250. package/esm/src/kernel/engine/call-trace.d.ts +19 -0
  251. package/esm/src/kernel/engine/call-trace.js +29 -0
  252. package/esm/src/kernel/engine/compaction.d.ts +71 -0
  253. package/esm/src/kernel/engine/compaction.js +203 -0
  254. package/esm/src/kernel/engine/decision.d.ts +43 -0
  255. package/esm/src/kernel/engine/decision.js +439 -0
  256. package/esm/src/kernel/engine/embedding.d.ts +8 -0
  257. package/esm/src/kernel/engine/embedding.js +118 -0
  258. package/esm/src/kernel/engine/hash.d.ts +6 -0
  259. package/esm/src/kernel/engine/hash.js +22 -0
  260. package/esm/src/kernel/engine/live-inbound.d.ts +19 -0
  261. package/esm/src/kernel/engine/live-inbound.js +44 -0
  262. package/esm/src/kernel/engine/live-ingress.d.ts +15 -0
  263. package/esm/src/kernel/engine/live-ingress.js +42 -0
  264. package/esm/src/kernel/engine/record.d.ts +3 -0
  265. package/esm/src/kernel/engine/record.js +11 -0
  266. package/esm/src/kernel/engine/repair.d.ts +7 -0
  267. package/esm/src/kernel/engine/repair.js +36 -0
  268. package/esm/src/kernel/engine/runner/gates.d.ts +5 -0
  269. package/esm/src/kernel/engine/runner/gates.js +508 -0
  270. package/esm/src/kernel/engine/runner/mod.d.ts +29 -0
  271. package/esm/src/kernel/engine/runner/mod.js +625 -0
  272. package/esm/src/kernel/engine/runner/nested.d.ts +32 -0
  273. package/esm/src/kernel/engine/runner/nested.js +134 -0
  274. package/esm/src/kernel/engine/runner/schema-validation.d.ts +35 -0
  275. package/esm/src/kernel/engine/runner/schema-validation.js +179 -0
  276. package/esm/src/kernel/engine/runner/stages.d.ts +28 -0
  277. package/esm/src/kernel/engine/runner/stages.js +41 -0
  278. package/esm/src/kernel/engine/runner/state.d.ts +97 -0
  279. package/esm/src/kernel/engine/runner/state.js +50 -0
  280. package/esm/src/kernel/engine/runner/step-order.d.ts +27 -0
  281. package/esm/src/kernel/engine/runner/step-order.js +165 -0
  282. package/esm/src/kernel/engine/runner/steps.d.ts +14 -0
  283. package/esm/src/kernel/engine/runner/steps.js +519 -0
  284. package/esm/src/kernel/engine/runner/stream.d.ts +71 -0
  285. package/esm/src/kernel/engine/runner/stream.js +376 -0
  286. package/esm/src/kernel/engine/runner/usage.d.ts +45 -0
  287. package/esm/src/kernel/engine/runner/usage.js +148 -0
  288. package/esm/src/kernel/engine/session/mod.d.ts +33 -0
  289. package/esm/src/kernel/engine/session/mod.js +1182 -0
  290. package/esm/src/kernel/engine/session/session-trace.d.ts +115 -0
  291. package/esm/src/kernel/engine/session/session-trace.js +500 -0
  292. package/esm/src/kernel/engine/token-estimate.d.ts +23 -0
  293. package/esm/src/kernel/engine/token-estimate.js +38 -0
  294. package/esm/src/kernel/engine/tool-trace.d.ts +58 -0
  295. package/esm/src/kernel/engine/tool-trace.js +132 -0
  296. package/esm/src/kernel/engine/tree.d.ts +2 -0
  297. package/esm/src/kernel/engine/tree.js +17 -0
  298. package/esm/src/kernel/engine/turn-trace.d.ts +119 -0
  299. package/esm/src/kernel/engine/turn-trace.js +855 -0
  300. package/esm/src/kernel/engine/usage.d.ts +36 -0
  301. package/esm/src/kernel/engine/usage.js +151 -0
  302. package/esm/src/kernel/interaction-parts.d.ts +13 -0
  303. package/esm/src/kernel/interaction-parts.js +40 -0
  304. package/esm/src/kernel/json.d.ts +10 -0
  305. package/esm/src/kernel/json.js +3 -0
  306. package/esm/src/kernel/mod.d.ts +74 -0
  307. package/esm/src/kernel/mod.js +45 -0
  308. package/esm/src/kernel/profile-graph.d.ts +145 -0
  309. package/esm/src/kernel/profile-graph.js +158 -0
  310. package/esm/src/kernel/profile-presence.d.ts +18 -0
  311. package/esm/src/kernel/profile-presence.js +158 -0
  312. package/esm/src/kernel/profile-scope.d.ts +40 -0
  313. package/esm/src/kernel/profile-scope.js +274 -0
  314. package/esm/src/kernel/protocols/binding.d.ts +65 -0
  315. package/esm/src/kernel/protocols/binding.js +125 -0
  316. package/esm/src/kernel/protocols/limits.d.ts +15 -0
  317. package/esm/src/kernel/protocols/limits.js +28 -0
  318. package/esm/src/kernel/protocols/mod.d.ts +5 -0
  319. package/esm/src/kernel/protocols/mod.js +5 -0
  320. package/esm/src/kernel/protocols/prices.d.ts +36 -0
  321. package/esm/src/kernel/protocols/prices.js +37 -0
  322. package/esm/src/kernel/protocols/protocol.d.ts +253 -0
  323. package/esm/src/kernel/protocols/protocol.js +253 -0
  324. package/esm/src/kernel/protocols/provider.d.ts +108 -0
  325. package/esm/src/kernel/protocols/provider.js +143 -0
  326. package/esm/src/kernel/protocols/runtime.d.ts +55 -0
  327. package/esm/src/kernel/protocols/runtime.js +534 -0
  328. package/esm/src/kernel/provider-budget.d.ts +32 -0
  329. package/esm/src/kernel/provider-budget.js +262 -0
  330. package/esm/src/kernel/provider-dispatch.d.ts +13 -0
  331. package/esm/src/kernel/provider-dispatch.js +36 -0
  332. package/esm/src/kernel/provider-live.d.ts +7 -0
  333. package/esm/src/kernel/provider-live.js +189 -0
  334. package/esm/src/kernel/provider-runtime.d.ts +57 -0
  335. package/esm/src/kernel/provider-runtime.js +524 -0
  336. package/esm/src/kernel/registry/attachments.d.ts +46 -0
  337. package/esm/src/kernel/registry/attachments.js +220 -0
  338. package/esm/src/kernel/registry/catalog.d.ts +25 -0
  339. package/esm/src/kernel/registry/catalog.js +85 -0
  340. package/esm/src/kernel/registry/embedding-rules.d.ts +28 -0
  341. package/esm/src/kernel/registry/embedding-rules.js +66 -0
  342. package/esm/src/kernel/registry/ingress.d.ts +12 -0
  343. package/esm/src/kernel/registry/ingress.js +179 -0
  344. package/esm/src/kernel/registry/kernel-registry.d.ts +15 -0
  345. package/esm/src/kernel/registry/kernel-registry.js +15 -0
  346. package/esm/src/kernel/registry/profile-outputs.d.ts +3 -0
  347. package/esm/src/kernel/registry/profile-outputs.js +10 -0
  348. package/esm/src/kernel/registry/profiles.d.ts +116 -0
  349. package/esm/src/kernel/registry/profiles.js +773 -0
  350. package/esm/src/kernel/registry/provider-request.d.ts +6 -0
  351. package/esm/src/kernel/registry/provider-request.js +34 -0
  352. package/esm/src/kernel/registry/resolve.d.ts +17 -0
  353. package/esm/src/kernel/registry/resolve.js +238 -0
  354. package/esm/src/kernel/registry/schemas.d.ts +12 -0
  355. package/esm/src/kernel/registry/schemas.js +27 -0
  356. package/esm/src/kernel/registry/slot-fill.d.ts +7 -0
  357. package/esm/src/kernel/registry/slot-fill.js +22 -0
  358. package/esm/src/kernel/registry/sole-model.d.ts +2 -0
  359. package/esm/src/kernel/registry/sole-model.js +4 -0
  360. package/esm/src/kernel/registry/system-prompt.d.ts +8 -0
  361. package/esm/src/kernel/registry/system-prompt.js +32 -0
  362. package/esm/src/kernel/registry/system-role.d.ts +3 -0
  363. package/esm/src/kernel/registry/system-role.js +9 -0
  364. package/esm/src/kernel/registry/vault.d.ts +14 -0
  365. package/esm/src/kernel/registry/vault.js +1 -0
  366. package/esm/src/kernel/schema.d.ts +226 -0
  367. package/esm/src/kernel/schema.js +895 -0
  368. package/esm/src/kernel/scope.d.ts +29 -0
  369. package/esm/src/kernel/scope.js +45 -0
  370. package/esm/src/kernel/stages.d.ts +176 -0
  371. package/esm/src/kernel/stages.js +431 -0
  372. package/esm/src/kernel/stop.d.ts +116 -0
  373. package/esm/src/kernel/stop.js +137 -0
  374. package/esm/src/kernel/system-parts.d.ts +26 -0
  375. package/esm/src/kernel/system-parts.js +98 -0
  376. package/esm/src/kernel/tools/activity-label.d.ts +22 -0
  377. package/esm/src/kernel/tools/activity-label.js +435 -0
  378. package/esm/src/kernel/tools/agent.d.ts +66 -0
  379. package/esm/src/kernel/tools/agent.js +212 -0
  380. package/esm/src/kernel/tools/coordinate.d.ts +4 -0
  381. package/esm/src/kernel/tools/coordinate.js +165 -0
  382. package/esm/src/kernel/tools/events.d.ts +66 -0
  383. package/esm/src/kernel/tools/events.js +184 -0
  384. package/esm/src/kernel/tools/execute.d.ts +100 -0
  385. package/esm/src/kernel/tools/execute.js +1173 -0
  386. package/esm/src/kernel/tools/gate-answer.d.ts +60 -0
  387. package/esm/src/kernel/tools/gate-answer.js +65 -0
  388. package/esm/src/kernel/tools/handler-events.d.ts +45 -0
  389. package/esm/src/kernel/tools/handler-events.js +106 -0
  390. package/esm/src/kernel/tools/harness.d.ts +17 -0
  391. package/esm/src/kernel/tools/harness.js +43 -0
  392. package/esm/src/kernel/tools/http-limit.d.ts +27 -0
  393. package/esm/src/kernel/tools/http-limit.js +85 -0
  394. package/esm/src/kernel/tools/invoke.d.ts +32 -0
  395. package/esm/src/kernel/tools/invoke.js +282 -0
  396. package/esm/src/kernel/tools/mcp-sessions.d.ts +23 -0
  397. package/esm/src/kernel/tools/mcp-sessions.js +69 -0
  398. package/esm/src/kernel/tools/mod.d.ts +10 -0
  399. package/esm/src/kernel/tools/mod.js +7 -0
  400. package/esm/src/kernel/tools/model-text.d.ts +16 -0
  401. package/esm/src/kernel/tools/model-text.js +31 -0
  402. package/esm/src/kernel/tools/operation.d.ts +76 -0
  403. package/esm/src/kernel/tools/operation.js +100 -0
  404. package/esm/src/kernel/tools/page-answer.d.ts +8 -0
  405. package/esm/src/kernel/tools/page-answer.js +19 -0
  406. package/esm/src/kernel/tools/permission.d.ts +15 -0
  407. package/esm/src/kernel/tools/permission.js +38 -0
  408. package/esm/src/kernel/tools/project.d.ts +11 -0
  409. package/esm/src/kernel/tools/project.js +55 -0
  410. package/esm/src/kernel/tools/registry.d.ts +27 -0
  411. package/esm/src/kernel/tools/registry.js +143 -0
  412. package/esm/src/kernel/tools/remote.d.ts +144 -0
  413. package/esm/src/kernel/tools/remote.js +1125 -0
  414. package/esm/src/kernel/tools/resolve.d.ts +31 -0
  415. package/esm/src/kernel/tools/resolve.js +267 -0
  416. package/esm/src/kernel/tools/run.d.ts +28 -0
  417. package/esm/src/kernel/tools/run.js +86 -0
  418. package/esm/src/kernel/tools/schema.d.ts +10 -0
  419. package/esm/src/kernel/tools/schema.js +95 -0
  420. package/esm/src/kernel/tools/signed-in-fetch.d.ts +19 -0
  421. package/esm/src/kernel/tools/signed-in-fetch.js +45 -0
  422. package/esm/src/kernel/tools/stage-run.d.ts +116 -0
  423. package/esm/src/kernel/tools/stage-run.js +198 -0
  424. package/esm/src/kernel/tools/types.d.ts +497 -0
  425. package/esm/src/kernel/tools/types.js +1 -0
  426. package/esm/src/kernel/tools/unchecked-output.d.ts +14 -0
  427. package/esm/src/kernel/tools/unchecked-output.js +18 -0
  428. package/esm/src/kernel/turn-events.d.ts +776 -0
  429. package/esm/src/kernel/turn-events.js +543 -0
  430. package/esm/src/kernel/types.d.ts +1025 -0
  431. package/esm/src/kernel/types.js +1 -0
  432. package/esm/src/kernel/util/base64.d.ts +4 -0
  433. package/esm/src/kernel/util/base64.js +15 -0
  434. package/esm/src/kernel/util/exact-type.d.ts +31 -0
  435. package/esm/src/kernel/util/exact-type.js +1 -0
  436. package/esm/src/kernel/util/find-last.d.ts +3 -0
  437. package/esm/src/kernel/util/find-last.js +9 -0
  438. package/esm/src/kernel/util/mime.d.ts +2 -0
  439. package/esm/src/kernel/util/mime.js +4 -0
  440. package/esm/src/kernel/util/partial-json.d.ts +23 -0
  441. package/esm/src/kernel/util/partial-json.js +128 -0
  442. package/esm/src/kernel/util/record.d.ts +2 -0
  443. package/esm/src/kernel/util/record.js +4 -0
  444. package/esm/src/observability/destinations.d.ts +14 -0
  445. package/esm/src/observability/destinations.js +43 -0
  446. package/esm/src/observability/jsonl.d.ts +18 -0
  447. package/esm/src/observability/jsonl.js +110 -0
  448. package/esm/src/observability/mod.d.ts +22 -0
  449. package/esm/src/observability/mod.js +16 -0
  450. package/esm/src/observability/openinference.d.ts +11 -0
  451. package/esm/src/observability/openinference.js +205 -0
  452. package/esm/src/observability/otlp.d.ts +71 -0
  453. package/esm/src/observability/otlp.js +98 -0
  454. package/esm/src/observability/phoenix.d.ts +30 -0
  455. package/esm/src/observability/phoenix.js +71 -0
  456. package/esm/src/observability/policy.d.ts +17 -0
  457. package/esm/src/observability/policy.js +73 -0
  458. package/esm/src/observability/resolve-policy.d.ts +8 -0
  459. package/esm/src/observability/resolve-policy.js +64 -0
  460. package/esm/src/observability/spans.d.ts +22 -0
  461. package/esm/src/observability/spans.js +72 -0
  462. package/esm/src/observability/trace-catalog.d.ts +128 -0
  463. package/esm/src/observability/trace-catalog.js +906 -0
  464. package/esm/src/observability/trace-record.d.ts +23 -0
  465. package/esm/src/observability/trace-record.js +228 -0
  466. package/esm/src/observability/trace-schema.d.ts +57 -0
  467. package/esm/src/observability/trace-schema.js +59 -0
  468. package/esm/src/observability/trace-sink.d.ts +14 -0
  469. package/esm/src/observability/trace-sink.js +3 -0
  470. package/esm/src/observability/trace-span.d.ts +98 -0
  471. package/esm/src/observability/trace-span.js +201 -0
  472. package/esm/src/observability/trace.d.ts +13 -0
  473. package/esm/src/observability/trace.js +37 -0
  474. package/esm/src/observability/types.d.ts +109 -0
  475. package/esm/src/observability/types.js +3 -0
  476. package/esm/src/presets/google/speech-voices.d.ts +9 -0
  477. package/esm/src/presets/google/speech-voices.js +38 -0
  478. package/esm/src/presets/google-limits.d.ts +13 -0
  479. package/esm/src/presets/google-limits.js +18 -0
  480. package/esm/src/presets/google.d.ts +119 -0
  481. package/esm/src/presets/google.js +197 -0
  482. package/esm/src/presets/local.d.ts +26 -0
  483. package/esm/src/presets/local.js +30 -0
  484. package/esm/src/presets/mod.d.ts +11 -0
  485. package/esm/src/presets/mod.js +9 -0
  486. package/esm/src/presets/openrouter.d.ts +26 -0
  487. package/esm/src/presets/openrouter.js +31 -0
  488. package/esm/src/providers/embedding-limits.d.ts +7 -0
  489. package/esm/src/providers/embedding-limits.js +12 -0
  490. package/esm/src/providers/gemini/embedding-protocol.d.ts +8 -0
  491. package/esm/src/providers/gemini/embedding-protocol.js +125 -0
  492. package/esm/src/providers/gemini/interactions-protocol.d.ts +8 -0
  493. package/esm/src/providers/gemini/interactions-protocol.js +105 -0
  494. package/esm/src/providers/gemini/live-protocol.d.ts +3 -0
  495. package/esm/src/providers/gemini/live-protocol.js +191 -0
  496. package/esm/src/providers/gemini/prices.d.ts +3 -0
  497. package/esm/src/providers/gemini/prices.js +63 -0
  498. package/esm/src/providers/gemini/provider.d.ts +7 -0
  499. package/esm/src/providers/gemini/provider.js +39 -0
  500. package/esm/src/providers/google/api-error.d.ts +8 -0
  501. package/esm/src/providers/google/api-error.js +123 -0
  502. package/esm/src/providers/google/builtins.d.ts +14 -0
  503. package/esm/src/providers/google/builtins.js +57 -0
  504. package/esm/src/providers/google/grounding.d.ts +5 -0
  505. package/esm/src/providers/google/grounding.js +226 -0
  506. package/esm/src/providers/google/interactions/framing.d.ts +27 -0
  507. package/esm/src/providers/google/interactions/framing.js +304 -0
  508. package/esm/src/providers/google/interactions/steps.d.ts +12 -0
  509. package/esm/src/providers/google/interactions/steps.js +200 -0
  510. package/esm/src/providers/google/interactions/stream.d.ts +23 -0
  511. package/esm/src/providers/google/interactions/stream.js +230 -0
  512. package/esm/src/providers/google/live/framing.d.ts +61 -0
  513. package/esm/src/providers/google/live/framing.js +597 -0
  514. package/esm/src/providers/google/live/stream.d.ts +13 -0
  515. package/esm/src/providers/google/live/stream.js +57 -0
  516. package/esm/src/providers/google/thinking.d.ts +3 -0
  517. package/esm/src/providers/google/thinking.js +8 -0
  518. package/esm/src/providers/google/urls.d.ts +4 -0
  519. package/esm/src/providers/google/urls.js +4 -0
  520. package/esm/src/providers/google/usage.d.ts +7 -0
  521. package/esm/src/providers/google/usage.js +49 -0
  522. package/esm/src/providers/live.d.ts +6 -0
  523. package/esm/src/providers/live.js +6 -0
  524. package/esm/src/providers/local/embedding-protocol.d.ts +7 -0
  525. package/esm/src/providers/local/embedding-protocol.js +60 -0
  526. package/esm/src/providers/local/provider.d.ts +7 -0
  527. package/esm/src/providers/local/provider.js +28 -0
  528. package/esm/src/providers/mod.d.ts +32 -0
  529. package/esm/src/providers/mod.js +23 -0
  530. package/esm/src/providers/open-ai/protocol.d.ts +3 -0
  531. package/esm/src/providers/open-ai/protocol.js +189 -0
  532. package/esm/src/providers/openrouter/embedding-protocol.d.ts +6 -0
  533. package/esm/src/providers/openrouter/embedding-protocol.js +86 -0
  534. package/esm/src/providers/openrouter/image.d.ts +15 -0
  535. package/esm/src/providers/openrouter/image.js +34 -0
  536. package/esm/src/providers/openrouter/images-protocol.d.ts +3 -0
  537. package/esm/src/providers/openrouter/images-protocol.js +82 -0
  538. package/esm/src/providers/openrouter/openai/compat.d.ts +19 -0
  539. package/esm/src/providers/openrouter/openai/compat.js +162 -0
  540. package/esm/src/providers/openrouter/openai/image-payload.d.ts +9 -0
  541. package/esm/src/providers/openrouter/openai/image-payload.js +115 -0
  542. package/esm/src/providers/openrouter/openai/reasoning-state.d.ts +2 -0
  543. package/esm/src/providers/openrouter/openai/reasoning-state.js +31 -0
  544. package/esm/src/providers/openrouter/openai/usage.d.ts +8 -0
  545. package/esm/src/providers/openrouter/openai/usage.js +56 -0
  546. package/esm/src/providers/openrouter/protocol.d.ts +8 -0
  547. package/esm/src/providers/openrouter/protocol.js +171 -0
  548. package/esm/src/providers/openrouter/provider.d.ts +10 -0
  549. package/esm/src/providers/openrouter/provider.js +50 -0
  550. package/esm/src/providers/shared/carried-tool-files.d.ts +7 -0
  551. package/esm/src/providers/shared/carried-tool-files.js +43 -0
  552. package/esm/src/providers/shared/pcm.d.ts +14 -0
  553. package/esm/src/providers/shared/pcm.js +78 -0
  554. package/esm/src/providers/shared/protocol-events.d.ts +8 -0
  555. package/esm/src/providers/shared/protocol-events.js +20 -0
  556. package/esm/src/providers/shared/response-identity.d.ts +11 -0
  557. package/esm/src/providers/shared/response-identity.js +12 -0
  558. package/esm/src/providers/shared/retry.d.ts +17 -0
  559. package/esm/src/providers/shared/retry.js +90 -0
  560. package/esm/src/providers/shared/sse.d.ts +6 -0
  561. package/esm/src/providers/shared/sse.js +93 -0
  562. package/esm/src/providers/shared/structured-output.d.ts +4 -0
  563. package/esm/src/providers/shared/structured-output.js +11 -0
  564. package/esm/src/providers/shared/tool-args.d.ts +24 -0
  565. package/esm/src/providers/shared/tool-args.js +88 -0
  566. package/esm/src/providers/shared/tool-draft.d.ts +16 -0
  567. package/esm/src/providers/shared/tool-draft.js +14 -0
  568. package/esm/src/providers/shared/upstream-tap.d.ts +8 -0
  569. package/esm/src/providers/shared/upstream-tap.js +85 -0
  570. package/esm/src/providers/shared/upstream-tape.d.ts +6 -0
  571. package/esm/src/providers/shared/upstream-tape.js +88 -0
  572. package/esm/src/providers/system-one/protocol.d.ts +8 -0
  573. package/esm/src/providers/system-one/protocol.js +93 -0
  574. package/esm/src/providers/types.d.ts +51 -0
  575. package/esm/src/providers/types.js +2 -0
  576. package/esm/src/providers/typesafe/provider.d.ts +7 -0
  577. package/esm/src/providers/typesafe/provider.js +24 -0
  578. package/esm/src/surface/formats.d.ts +46 -0
  579. package/esm/src/surface/formats.js +178 -0
  580. package/esm/src/surface/mod.d.ts +16 -0
  581. package/esm/src/surface/mod.js +12 -0
  582. package/esm/src/surface/runtime.d.ts +44 -0
  583. package/esm/src/surface/runtime.js +441 -0
  584. package/esm/src/surface/tools.d.ts +9 -0
  585. package/esm/src/surface/tools.js +62 -0
  586. package/esm/src/surface/types.d.ts +110 -0
  587. package/esm/src/surface/types.js +4 -0
  588. package/package.json +100 -4
@@ -0,0 +1,435 @@
1
+ import { isRecord } from '../util/record.js';
2
+ const PLACEHOLDER = /\{\{?([^{}]*)\}\}?/g;
3
+ // why: Control and bidi-override characters would let a tool's output restyle or reorder the label.
4
+ const UNPRINTABLE = /[\p{Cc}\p{Cf}]/gu;
5
+ const INDEX = /^-?\d+$/;
6
+ const ISO_DATE = /^(\d{4})-(\d{2})-(\d{2})(?:[T ](\d{2}):(\d{2})(?::\d{2}(?:\.\d+)?)?(?:Z|[+-]\d{2}:?\d{2})?)?$/;
7
+ const NUMBER = new Intl.NumberFormat(undefined, { maximumFractionDigits: 2 });
8
+ // why: Dates show the wall-clock time as the tool wrote it, not converted to the server's zone.
9
+ const DAY = new Intl.DateTimeFormat(undefined, { dateStyle: 'medium', timeZone: 'UTC' });
10
+ const DAY_TIME = new Intl.DateTimeFormat(undefined, {
11
+ dateStyle: 'medium',
12
+ timeStyle: 'short',
13
+ timeZone: 'UTC',
14
+ });
15
+ const JOINED = /^\+\s+/;
16
+ /** The colon that ends a line's condition: the first one followed by a space or the line's end. */
17
+ const WHEN_ENDS = /:(?:\s|$)/;
18
+ const CHECK = /^(\S+) is (?:(not) )?(\S.*)$/;
19
+ function parsePlaceholder(raw) {
20
+ const bar = raw.indexOf('|');
21
+ if (bar < 0)
22
+ return { path: raw.trim() };
23
+ return { path: raw.slice(0, bar).trim(), fallback: raw.slice(bar + 1).trim() };
24
+ }
25
+ /** `input.x` and `output.x` read one side; a bare path reads the input, then the output. */
26
+ function routes(path, sides) {
27
+ const keys = path.split('.');
28
+ const [head, ...rest] = keys;
29
+ if ((head === 'input' || head === 'output') && rest.length) {
30
+ return [{ side: head, keys: rest, prefixed: true }];
31
+ }
32
+ return sides.map((side) => ({ side, keys, prefixed: false }));
33
+ }
34
+ function valueAt(source, keys) {
35
+ let value = source;
36
+ for (const key of keys) {
37
+ if (Array.isArray(value)) {
38
+ if (key === 'length')
39
+ value = value.length;
40
+ else if (INDEX.test(key))
41
+ value = value.at(Number(key));
42
+ else
43
+ return undefined;
44
+ }
45
+ else if (isRecord(value) && Object.hasOwn(value, key))
46
+ value = value[key];
47
+ else
48
+ return undefined;
49
+ }
50
+ return value;
51
+ }
52
+ function dateText(text) {
53
+ const match = ISO_DATE.exec(text);
54
+ if (!match)
55
+ return undefined;
56
+ const [year = 0, month = 0, day = 0, hour = 0, minute = 0] = match
57
+ .slice(1)
58
+ .map((part) => Number(part ?? 0));
59
+ const at = new Date(Date.UTC(year, month - 1, day, hour, minute));
60
+ if (Number.isNaN(at.getTime()) || at.getUTCDate() !== day)
61
+ return undefined;
62
+ return (match[4] === undefined ? DAY : DAY_TIME).format(at);
63
+ }
64
+ function labelValue(value) {
65
+ if (typeof value === 'number')
66
+ return Number.isFinite(value) ? NUMBER.format(value) : undefined;
67
+ if (typeof value !== 'string')
68
+ return undefined;
69
+ const text = value.replace(UNPRINTABLE, ' ').replace(/\s+/g, ' ').trim();
70
+ return (dateText(text) ?? text) || undefined;
71
+ }
72
+ function parseChecks(raw) {
73
+ const checks = [];
74
+ // why: one space between words first, so no pattern below can try a run of spaces two ways.
75
+ for (const part of raw.replace(/\s+/g, ' ').split(' and ')) {
76
+ const match = CHECK.exec(part.trim());
77
+ const [, path, not, expected] = match ?? [];
78
+ if (!path || !expected)
79
+ return 'unreadable';
80
+ const literal = expected.trim();
81
+ checks.push({ path, negated: Boolean(not), expected: literal === 'null' ? null : literal });
82
+ }
83
+ return checks;
84
+ }
85
+ /** `+ when status is archived: archiving {name}` is a joined line, with one check, then its text. */
86
+ function parseLine(raw) {
87
+ const joined = JOINED.test(raw);
88
+ const rest = raw.replace(JOINED, '').trim();
89
+ if (!/^when(\s|$)/.test(rest))
90
+ return { joined, when: [], text: rest };
91
+ const end = rest.search(WHEN_ENDS);
92
+ if (end < 0)
93
+ return { joined, when: 'unreadable', text: '' };
94
+ return { joined, when: parseChecks(rest.slice(4, end)), text: rest.slice(end + 1).trim() };
95
+ }
96
+ function entriesOf(template) {
97
+ const raw = typeof template === 'string' ? [template] : template;
98
+ const entries = [];
99
+ raw.forEach((text, index) => {
100
+ const line = parseLine(text);
101
+ const last = entries.at(-1);
102
+ if (line.joined && last?.joined)
103
+ last.lines.push({ line, number: index + 1 });
104
+ else
105
+ entries.push({ joined: line.joined, lines: [{ line, number: index + 1 }] });
106
+ });
107
+ return entries;
108
+ }
109
+ /** The input keys a check reads, or `undefined` when it names the output. */
110
+ function checkKeys(path) {
111
+ const [route] = routes(path, ['input']);
112
+ return route?.side === 'input' ? route.keys : undefined;
113
+ }
114
+ // why: "is not" is the plain opposite of "is", so a field the model left out is not any value.
115
+ function checkHolds(check, input) {
116
+ const keys = checkKeys(check.path);
117
+ if (!keys)
118
+ return false;
119
+ const value = valueAt(input, keys);
120
+ const comparable = typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean';
121
+ const is = check.expected === null ? value === null : comparable && `${value}` === check.expected;
122
+ return is !== check.negated;
123
+ }
124
+ /** "a", "a and b", "a, b, and c". */
125
+ function joinedInWords(parts) {
126
+ if (parts.length <= 1)
127
+ return parts[0] ?? '';
128
+ return `${parts.slice(0, -1).join(', ')}${parts.length > 2 ? ',' : ''} and ${parts.at(-1)}`;
129
+ }
130
+ /** A tool's name as a label shows it: `manage_alert` reads "manage alert". */
131
+ export function toolNameInWords(name) {
132
+ return name
133
+ .replace(/([a-z\d])([A-Z])/g, '$1 $2')
134
+ .replace(/[_-]+/g, ' ')
135
+ .trim()
136
+ .toLowerCase();
137
+ }
138
+ function fillText(template, values, sides) {
139
+ let missing = false;
140
+ const filled = template.replace(PLACEHOLDER, (_, raw) => {
141
+ const { path, fallback } = parsePlaceholder(raw);
142
+ const value = path
143
+ ? routes(path, sides)
144
+ .map((route) => labelValue(valueAt(values[route.side], route.keys)))
145
+ .find((text) => text !== undefined)
146
+ : undefined;
147
+ if (value === undefined && fallback === undefined)
148
+ missing = true;
149
+ return value ?? fallback ?? '';
150
+ });
151
+ const text = filled.replace(/\s+/g, ' ').trim();
152
+ return missing || !text ? undefined : text;
153
+ }
154
+ /**
155
+ * Fills each `{path}` or `{path|fallback}` from the call. Only text and numbers fill; a line fits
156
+ * when every placeholder has a value or a fallback and its `when` holds. A list shows its first
157
+ * line that fits, and a run of `+` lines shows every member that fits, joined in words. When no
158
+ * line fits the label is `undefined`, and the transcript names the tool.
159
+ */
160
+ export function fillActivityLabel(template, values) {
161
+ if (template === undefined)
162
+ return undefined;
163
+ const sides = 'output' in values ? ['input', 'output'] : ['input'];
164
+ for (const entry of entriesOf(template)) {
165
+ const fitting = entry.lines.flatMap(({ line }) => {
166
+ if (line.when === 'unreadable')
167
+ return [];
168
+ if (!line.when.every((check) => checkHolds(check, values.input)))
169
+ return [];
170
+ const text = fillText(line.text, values, sides);
171
+ return text === undefined ? [] : [text];
172
+ });
173
+ if (fitting.length)
174
+ return joinedInWords(fitting);
175
+ }
176
+ return undefined;
177
+ }
178
+ const HOLDS_RANK = ['value', 'group', 'flag', 'missing'];
179
+ function schemaTypes(node) {
180
+ const types = Array.isArray(node.type) ? node.type : [node.type];
181
+ return types.filter((type) => typeof type === 'string' && type !== 'null');
182
+ }
183
+ function schemaBranches(node) {
184
+ return [node.anyOf, node.oneOf, node.allOf].flatMap((list) => Array.isArray(list) ? list.filter(isRecord) : []);
185
+ }
186
+ function mergeHolds(found) {
187
+ const holds = HOLDS_RANK.find((rank) => found.some((entry) => entry.holds === rank)) ?? 'missing';
188
+ const same = found.filter((entry) => entry.holds === holds);
189
+ return { holds, instead: same.flatMap((entry) => entry.instead ?? []) };
190
+ }
191
+ /** The paths under `node` a label can show, for suggestions. */
192
+ function placeholdersAt(node, prefix) {
193
+ const at = (key) => (prefix ? `${prefix}.${key}` : key);
194
+ if (!isRecord(node))
195
+ return [];
196
+ const branches = schemaBranches(node);
197
+ if (branches.length)
198
+ return branches.flatMap((branch) => placeholdersAt(branch, prefix));
199
+ if (schemaTypes(node).includes('array'))
200
+ return leavesAt(node.items, at('0'));
201
+ if (!isRecord(node.properties))
202
+ return [];
203
+ return Object.entries(node.properties).flatMap(([key, child]) => leavesAt(child, at(key)));
204
+ }
205
+ function leavesAt(node, path) {
206
+ if (!isRecord(node) || '$ref' in node)
207
+ return [path];
208
+ const types = schemaTypes(node);
209
+ if (types.length && types.every((type) => type === 'boolean'))
210
+ return [];
211
+ const branches = schemaBranches(node);
212
+ // why: A branch of text or null (a nullable field) is still one value a label can show.
213
+ const nested = branches.some((branch) => schemaTypes(branch).some((type) => type === 'array' || type === 'object'));
214
+ const group = types.includes('array') || types.includes('object') || nested;
215
+ if (!group && branches.length) {
216
+ return branches.every((branch) => schemaTypes(branch).every((type) => type === 'boolean'))
217
+ ? []
218
+ : [path];
219
+ }
220
+ return group ? placeholdersAt(node, path) : [path];
221
+ }
222
+ // why: A schema that doesn't say what's there ($ref, no properties, no items) is taken on trust.
223
+ function schemaPathHolds(node, keys, walked) {
224
+ if (!isRecord(node) || '$ref' in node)
225
+ return { holds: 'value' };
226
+ const branches = schemaBranches(node);
227
+ if (branches.length) {
228
+ return mergeHolds(branches.map((branch) => schemaPathHolds(branch, keys, walked)));
229
+ }
230
+ const types = schemaTypes(node);
231
+ const [key, ...rest] = keys;
232
+ if (key === undefined) {
233
+ if (types.length && types.every((type) => type === 'boolean'))
234
+ return { holds: 'flag' };
235
+ if (types.includes('array') || types.includes('object')) {
236
+ return { holds: 'group', instead: placeholdersAt(node, walked) };
237
+ }
238
+ return { holds: 'value' };
239
+ }
240
+ const next = walked ? `${walked}.${key}` : key;
241
+ const missing = { holds: 'missing', instead: placeholdersAt(node, walked) };
242
+ if (types.includes('array')) {
243
+ if (key === 'length')
244
+ return rest.length ? missing : { holds: 'value' };
245
+ if (INDEX.test(key)) {
246
+ return isRecord(node.items) ? schemaPathHolds(node.items, rest, next) : { holds: 'value' };
247
+ }
248
+ }
249
+ if (isRecord(node.properties)) {
250
+ return Object.hasOwn(node.properties, key)
251
+ ? schemaPathHolds(node.properties[key], rest, next)
252
+ : missing;
253
+ }
254
+ return types.length === 0 || types.includes('object') ? { holds: 'value' } : missing;
255
+ }
256
+ function tryInstead(paths) {
257
+ const shown = [...new Set(paths)].slice(0, 4).map((path) => `{${path}}`);
258
+ if (shown.length === 0)
259
+ return '';
260
+ const list = shown.length === 1
261
+ ? shown[0]
262
+ : `${shown.slice(0, -1).join(', ')}${shown.length > 2 ? ',' : ''} or ${shown.at(-1)}`;
263
+ return ` Try ${list}.`;
264
+ }
265
+ function placeholderProblem(template, schemas, sides) {
266
+ for (const match of template.matchAll(PLACEHOLDER)) {
267
+ const { path } = parsePlaceholder(match[1] ?? '');
268
+ if (!path) {
269
+ const example = placeholdersAt(schemas.input, '')[0] ?? 'name';
270
+ return `Put a field name between the braces, like {${example}}.`; // labels-exempt: builder diagnostic
271
+ }
272
+ const paths = routes(path, sides);
273
+ const [route] = paths;
274
+ if (!route)
275
+ continue;
276
+ if (route.prefixed && !sides.includes(route.side)) {
277
+ return `{${path}} is only there once the call is done; use it in the Done label.`; // labels-exempt: builder diagnostic
278
+ }
279
+ const found = mergeHolds(paths.map(({ side, keys, prefixed }) => schemaPathHolds(schemas[side], keys, prefixed ? side : '')));
280
+ if (found.holds === 'value')
281
+ continue;
282
+ const all = found.instead ?? [];
283
+ const depth = route.prefixed ? 1 : 0;
284
+ const near = all.filter((candidate) => candidate.split('.')[depth] === route.keys[0]);
285
+ const from = route.prefixed ? route.side : sides.join(' or ');
286
+ const reason = {
287
+ missing: `is not a field of this tool's ${from}.`, // labels-exempt: builder diagnostic
288
+ group: 'is a list or group; a label shows text or a number.', // labels-exempt: builder diagnostic
289
+ flag: 'is true or false; a label shows text or a number.', // labels-exempt: builder diagnostic
290
+ }[found.holds];
291
+ return `{${path}} ${reason}${tryInstead(near.length ? near : all)}`;
292
+ }
293
+ return undefined;
294
+ }
295
+ const OPEN_LEAF = { texts: 'any', nullable: true };
296
+ function rawTypes(node) {
297
+ const types = Array.isArray(node.type) ? node.type : [node.type];
298
+ return types.filter((type) => typeof type === 'string');
299
+ }
300
+ function leafOf(node) {
301
+ const listed = Array.isArray(node.enum) ? node.enum : 'const' in node ? [node.const] : undefined;
302
+ if (listed) {
303
+ return {
304
+ texts: listed.filter((value) => value !== null).map((value) => `${value}`),
305
+ nullable: listed.includes(null),
306
+ };
307
+ }
308
+ const types = rawTypes(node);
309
+ if (types.length === 0)
310
+ return OPEN_LEAF;
311
+ const shown = types.filter((type) => type !== 'null');
312
+ const flag = shown.every((type) => type === 'boolean');
313
+ return {
314
+ texts: flag ? (shown.length ? ['true', 'false'] : []) : 'any',
315
+ nullable: types.includes('null'),
316
+ };
317
+ }
318
+ // why: A schema that doesn't say what's there ($ref, no properties, no items) is taken on trust.
319
+ function schemaLeavesAt(node, keys) {
320
+ if (!isRecord(node) || '$ref' in node)
321
+ return [OPEN_LEAF];
322
+ const branches = schemaBranches(node);
323
+ if (branches.length)
324
+ return branches.flatMap((branch) => schemaLeavesAt(branch, keys));
325
+ const [key, ...rest] = keys;
326
+ if (key === undefined)
327
+ return [leafOf(node)];
328
+ const types = schemaTypes(node);
329
+ if (types.includes('array')) {
330
+ if (key === 'length')
331
+ return rest.length ? [] : [{ texts: 'any', nullable: false }];
332
+ if (INDEX.test(key))
333
+ return schemaLeavesAt(node.items, rest);
334
+ }
335
+ if (isRecord(node.properties)) {
336
+ return Object.hasOwn(node.properties, key) ? schemaLeavesAt(node.properties[key], rest) : [];
337
+ }
338
+ return types.length === 0 && rawTypes(node).length === 0 ? [OPEN_LEAF] : [];
339
+ }
340
+ /** The input's own field names, flags included: what a `when` can compare. */
341
+ function inputFields(node) {
342
+ if (!isRecord(node))
343
+ return [];
344
+ const branches = schemaBranches(node).flatMap(inputFields);
345
+ const own = isRecord(node.properties) ? Object.keys(node.properties) : [];
346
+ return [...new Set([...own, ...branches])];
347
+ }
348
+ function oneOf(values) {
349
+ const shown = [...new Set(values)].map((value) => `"${value}"`);
350
+ return shown.length <= 1
351
+ ? (shown[0] ?? '')
352
+ : `${shown.slice(0, -1).join(', ')}${shown.length > 2 ? ',' : ''} or ${shown.at(-1)}`;
353
+ }
354
+ function checkProblem(check, input) {
355
+ const keys = checkKeys(check.path);
356
+ if (!keys) {
357
+ return `A "when" reads what the model sent; "${check.path}" is only there once the call is done.`; // labels-exempt: builder diagnostic
358
+ }
359
+ const found = schemaPathHolds(input, keys, '');
360
+ if (found.holds === 'missing') {
361
+ const fields = inputFields(input).slice(0, 4);
362
+ const tryThese = fields.length ? ` Try ${oneOf(fields)}.` : ''; // labels-exempt: builder diagnostic
363
+ return `"${check.path}" in the "when" is not a field of this tool's input.${tryThese}`; // labels-exempt: builder diagnostic
364
+ }
365
+ if (found.holds === 'group') {
366
+ return `"${check.path}" in the "when" is a list or group; a "when" compares text, a number, or true or false.`; // labels-exempt: builder diagnostic
367
+ }
368
+ const leaves = schemaLeavesAt(input, keys);
369
+ if (check.expected === null) {
370
+ return leaves.some((leaf) => leaf.nullable) ? undefined : `"${check.path}" is never null.`; // labels-exempt: builder diagnostic
371
+ }
372
+ const texts = [];
373
+ for (const leaf of leaves) {
374
+ if (leaf.texts === 'any')
375
+ return undefined;
376
+ texts.push(...leaf.texts);
377
+ }
378
+ if (texts.includes(check.expected))
379
+ return undefined;
380
+ const itIs = texts.length ? ` It is ${oneOf(texts)}.` : ''; // labels-exempt: builder diagnostic
381
+ return `"${check.path}" is never "${check.expected}".${itIs}`; // labels-exempt: builder diagnostic
382
+ }
383
+ function lineProblem(line, schemas, sides, mustShow) {
384
+ if (line.when === 'unreadable') {
385
+ return 'A line that opens with "when" needs a condition and a colon, like "when status is archived: archiving {name}". A condition uses "is", "is not", "is null", and "and".'; // labels-exempt: builder diagnostic
386
+ }
387
+ for (const check of line.when) {
388
+ const problem = checkProblem(check, schemas.input);
389
+ if (problem)
390
+ return problem;
391
+ }
392
+ if (!line.text && (mustShow || line.when.length)) {
393
+ return 'It has no wording to show.'; // labels-exempt: builder diagnostic
394
+ }
395
+ return placeholderProblem(line.text, schemas, sides);
396
+ }
397
+ /** Whether a line shows for every call: no `when`, and a fallback on every placeholder. */
398
+ function alwaysFits(line) {
399
+ if (line.when === 'unreadable' || line.when.length)
400
+ return false;
401
+ let open = false;
402
+ const settled = line.text.replace(PLACEHOLDER, (_, raw) => {
403
+ const { fallback } = parsePlaceholder(raw);
404
+ if (fallback === undefined)
405
+ open = true;
406
+ return fallback ?? '';
407
+ });
408
+ return !open && settled.trim().length > 0;
409
+ }
410
+ function listProblem(entries) {
411
+ const fits = entries.map((entry) => entry.lines.some(({ line }) => alwaysFits(line)));
412
+ const early = fits.slice(0, -1).indexOf(true);
413
+ if (early >= 0) {
414
+ const number = entries[early]?.lines.find(({ line }) => alwaysFits(line))?.number;
415
+ return `Line ${number} always fits, so the lines below it are never read. Move it to the end.`; // labels-exempt: builder diagnostic
416
+ }
417
+ if (fits.at(-1))
418
+ return undefined;
419
+ return 'The last line must always fit, so every call gets a label: no "when", and a fallback on every {value}, like "saving the item".'; // labels-exempt: builder diagnostic
420
+ }
421
+ /**
422
+ * Why a label can't be used with these JSON schemas, as a sentence for its author, or `undefined`
423
+ * when it can. Pass `output` for a Done label. A list must end on a line that always fits.
424
+ */
425
+ export function activityLabelProblem(template, schemas) {
426
+ const sides = 'output' in schemas ? ['input', 'output'] : ['input'];
427
+ const listed = typeof template !== 'string';
428
+ const entries = entriesOf(template);
429
+ for (const { line, number } of entries.flatMap((entry) => entry.lines)) {
430
+ const problem = lineProblem(line, schemas, sides, listed);
431
+ if (problem)
432
+ return listed ? `Line ${number}: ${problem}` : problem; // labels-exempt: builder diagnostic
433
+ }
434
+ return listed ? listProblem(entries) : undefined;
435
+ }
@@ -0,0 +1,66 @@
1
+ import { z } from 'zod';
2
+ import type { ToolOrigin } from '../../guardrails/types.js';
3
+ import type { SpanHandle } from '../../observability/trace-span.js';
4
+ import type { Profile, ProfileId, ProfileInputsSpec, TurnEvent, TurnTokens } from '../types.js';
5
+ import type { AgentToolDef, AgentToolInput, AgentToolOutput, RegisteredAgentTool, RegisteredTool, ToolFailure } from './types.js';
6
+ /** How one agent tool call settled, with what the called agent used. */
7
+ type AgentRun = {
8
+ output: AgentToolOutput;
9
+ tokens?: TurnTokens;
10
+ } | {
11
+ failure: ToolFailure;
12
+ tokens?: TurnTokens;
13
+ };
14
+ /** Runs agent tool calls for one turn, which supplies the scope, provider, and hook. */
15
+ interface AgentCaller {
16
+ run(call: {
17
+ tool: RegisteredAgentTool;
18
+ callId: string;
19
+ input: AgentToolInput;
20
+ caller: Profile;
21
+ /** The call's `execute_tool` span; the agent's turn opens under it. */
22
+ span?: SpanHandle;
23
+ signal?: AbortSignal;
24
+ }): AsyncGenerator<TurnEvent, AgentRun>;
25
+ }
26
+ /** A call that settled without a reply; the model reads `failure`. */
27
+ declare class AgentCallFailed extends Error {
28
+ readonly failure: ToolFailure;
29
+ constructor(failure: ToolFailure);
30
+ }
31
+ /**
32
+ * What the model sent, split into what goes to the called agent and what only the host reads.
33
+ *
34
+ * why: A host field is the host's own word for something (an id it resolves); the called profile does not take it, so it never reaches the agent's turn.
35
+ */
36
+ declare function splitHostInput(tool: Pick<AgentToolDef, 'hostFields'>, input: AgentToolInput): {
37
+ sent: AgentToolInput;
38
+ hostInput?: Record<string, unknown>;
39
+ };
40
+ /**
41
+ * The input of an agent tool that runs `agent`: text, and each channel the
42
+ * profile's `inputs` declares. Anything else is refused, never dropped. The
43
+ * called turn's own ingress checks MIME types and sizes.
44
+ */
45
+ declare function agentToolInputFor(agent: Pick<Profile, 'type'> & {
46
+ inputs?: Pick<ProfileInputsSpec, 'attachments' | 'voice' | 'slots'>;
47
+ }, tool?: Pick<AgentToolDef, 'name' | 'fieldText' | 'hostFields' | 'hostOnly'>): z.ZodType<AgentToolInput>;
48
+ declare const agentToolOutput: z.ZodType<AgentToolOutput>;
49
+ /** Why `profile` can't be run by an agent tool, or `undefined` when it can. */
50
+ declare function agentProfileProblem(profile: Profile, find: (name: string) => RegisteredTool | undefined): string | undefined;
51
+ /** The profile an agent tool runs; throws `config` when the tool can't run it. */
52
+ declare function agentToolProfile(def: AgentToolDef, findProfile: (id: ProfileId) => Profile | undefined, findTool: (name: string) => RegisteredTool | undefined): Profile;
53
+ /** An agent with no tools of its own read only what it was sent; one with tools may have read outside content. */
54
+ declare function agentToolOrigin(profile: Profile | undefined): ToolOrigin;
55
+ /**
56
+ * The called agent's reply: its text or its last structured reply, its media as parts, and what it cited.
57
+ *
58
+ * why: A structured reply's text is the same JSON as a string, so returning both would have the caller's model read the answer twice.
59
+ */
60
+ declare function agentToolOutputOf(turn: readonly TurnEvent[]): AgentToolOutput;
61
+ declare function normalizeAgent(def: AgentToolDef, input: z.ZodType<AgentToolInput>, schemas: {
62
+ inputSchema: Record<string, unknown>;
63
+ outputSchema: Record<string, unknown>;
64
+ }): RegisteredAgentTool;
65
+ export type { AgentCaller, AgentRun };
66
+ export { AgentCallFailed, agentProfileProblem, agentToolInputFor, agentToolOrigin, agentToolOutput, agentToolOutputOf, agentToolProfile, normalizeAgent, splitHostInput, };