@theoremjs/agents 0.3.0 → 0.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (570) hide show
  1. package/README.md +277 -995
  2. package/esm/mod.d.ts +34 -20
  3. package/esm/mod.js +19 -12
  4. package/esm/src/cli/commands/bench.js +36 -14
  5. package/esm/src/cli/commands/detect-compile.d.ts +17 -0
  6. package/esm/src/cli/commands/detect-compile.js +22 -0
  7. package/esm/src/cli/commands/eval.d.ts +3 -3
  8. package/esm/src/cli/commands/fuzz-canary.js +55 -16
  9. package/esm/src/cli/commands/profile.js +4 -4
  10. package/esm/src/cli/commands/run.d.ts +2 -2
  11. package/esm/src/cli/commands/run.js +1 -1
  12. package/esm/src/cli/commands/test.d.ts +4 -3
  13. package/esm/src/cli/commands/test.js +2 -2
  14. package/esm/src/cli/index.js +9 -9
  15. package/esm/src/cli/matrix/fixtures.js +25 -30
  16. package/esm/src/evals/attachments.d.ts +1 -0
  17. package/esm/src/evals/attachments.js +4 -2
  18. package/esm/src/evals/breakdown.d.ts +2 -0
  19. package/esm/src/evals/breakdown.js +1 -0
  20. package/esm/src/evals/graders/answer.d.ts +3 -0
  21. package/esm/src/evals/graders/answer.js +1 -0
  22. package/esm/src/evals/graders/code.d.ts +7 -31
  23. package/esm/src/evals/graders/code.js +4 -25
  24. package/esm/src/evals/graders/judge.d.ts +4 -0
  25. package/esm/src/evals/graders/judge.js +7 -5
  26. package/esm/src/evals/graders/latency.d.ts +1 -0
  27. package/esm/src/evals/graders/latency.js +3 -2
  28. package/esm/src/evals/graders/live.d.ts +3 -0
  29. package/esm/src/evals/graders/live.js +2 -0
  30. package/esm/src/evals/graders/media.js +1 -2
  31. package/esm/src/evals/graders/shared.js +1 -1
  32. package/esm/src/evals/graders/transcript.d.ts +2 -0
  33. package/esm/src/evals/graders/transcript.js +5 -3
  34. package/esm/src/evals/mod.d.ts +1 -9
  35. package/esm/src/evals/mod.js +1 -9
  36. package/esm/src/evals/record.d.ts +6 -0
  37. package/esm/src/evals/record.js +4 -2
  38. package/esm/src/evals/rubrics/mod.d.ts +1 -1
  39. package/esm/src/evals/rubrics/mod.js +1 -1
  40. package/esm/src/evals/rubrics/mustache.js +1 -1
  41. package/esm/src/evals/rubrics/types.js +1 -1
  42. package/esm/src/evals/run.d.ts +9 -52
  43. package/esm/src/evals/run.js +12 -46
  44. package/esm/src/evals/suite.d.ts +12 -3
  45. package/esm/src/evals/suite.js +9 -4
  46. package/esm/src/evals/summary.d.ts +3 -0
  47. package/esm/src/evals/summary.js +1 -0
  48. package/esm/src/evals/trial.d.ts +3 -16
  49. package/esm/src/evals/trial.js +7 -30
  50. package/esm/src/evals/types.d.ts +30 -121
  51. package/esm/src/evals/types.js +3 -16
  52. package/esm/src/evals/verdict.d.ts +5 -0
  53. package/esm/src/evals/verdict.js +4 -1
  54. package/esm/src/guardrails/boundaries.d.ts +41 -0
  55. package/esm/src/guardrails/boundaries.js +103 -0
  56. package/esm/src/guardrails/canary-gate.d.ts +1 -0
  57. package/esm/src/guardrails/canary.d.ts +49 -15
  58. package/esm/src/guardrails/canary.js +103 -30
  59. package/esm/src/guardrails/compile-egress.d.ts +6 -5
  60. package/esm/src/guardrails/compile-egress.js +6 -5
  61. package/esm/src/guardrails/corpus/canary-egress-attacks.d.ts +3 -1
  62. package/esm/src/guardrails/corpus/canary-egress-attacks.js +4 -2
  63. package/esm/src/guardrails/corpus/fuzz-inbound.js +14 -17
  64. package/esm/src/guardrails/corpus/inbound-payloads.d.ts +2 -0
  65. package/esm/src/guardrails/corpus/inbound-payloads.js +4 -2
  66. package/esm/src/guardrails/corpus/live-attacks.d.ts +2 -0
  67. package/esm/src/guardrails/corpus/live-attacks.js +6 -1
  68. package/esm/src/guardrails/corpus/mod.d.ts +1 -1
  69. package/esm/src/guardrails/corpus/secrets.d.ts +3 -3
  70. package/esm/src/guardrails/corpus/secrets.js +2 -2
  71. package/esm/src/guardrails/corpus/strings.d.ts +1 -1
  72. package/esm/src/guardrails/corpus/strings.js +1 -1
  73. package/esm/src/guardrails/corpus/types.d.ts +5 -1
  74. package/esm/src/guardrails/credential-rules.d.ts +36 -0
  75. package/esm/src/guardrails/credential-rules.js +3001 -0
  76. package/esm/src/guardrails/credential-scan.d.ts +45 -0
  77. package/esm/src/guardrails/credential-scan.js +172 -0
  78. package/esm/src/guardrails/destinations.d.ts +45 -0
  79. package/esm/src/guardrails/destinations.js +234 -0
  80. package/esm/src/guardrails/detect-at.d.ts +107 -0
  81. package/esm/src/guardrails/detect-at.js +434 -0
  82. package/esm/src/guardrails/detect-reply.d.ts +61 -0
  83. package/esm/src/guardrails/detect-reply.js +95 -0
  84. package/esm/src/guardrails/detect-stream.d.ts +33 -0
  85. package/esm/src/guardrails/detect-stream.js +77 -0
  86. package/esm/src/guardrails/detectors.d.ts +216 -0
  87. package/esm/src/guardrails/detectors.js +503 -0
  88. package/esm/src/guardrails/egress-automata.d.ts +4 -6
  89. package/esm/src/guardrails/egress-automata.js +24095 -4572
  90. package/esm/src/guardrails/egress-compiler.d.ts +38 -16
  91. package/esm/src/guardrails/egress-compiler.js +254 -60
  92. package/esm/src/guardrails/egress-patterns.d.ts +4 -2
  93. package/esm/src/guardrails/egress-patterns.js +6 -2
  94. package/esm/src/guardrails/egress-stream.d.ts +54 -36
  95. package/esm/src/guardrails/egress-stream.js +253 -124
  96. package/esm/src/guardrails/egress-urls.d.ts +6 -3
  97. package/esm/src/guardrails/egress-urls.js +14 -22
  98. package/esm/src/guardrails/egress.d.ts +26 -86
  99. package/esm/src/guardrails/egress.js +59 -309
  100. package/esm/src/guardrails/error.d.ts +13 -8
  101. package/esm/src/guardrails/error.js +25 -18
  102. package/esm/src/guardrails/event-schemas.d.ts +46 -3
  103. package/esm/src/guardrails/event-schemas.js +12 -5
  104. package/esm/src/guardrails/events.d.ts +5 -1
  105. package/esm/src/guardrails/events.js +4 -1
  106. package/esm/src/guardrails/hints.d.ts +14 -0
  107. package/esm/src/guardrails/hints.js +57 -0
  108. package/esm/src/guardrails/hits.d.ts +7 -1
  109. package/esm/src/guardrails/hits.js +12 -1
  110. package/esm/src/guardrails/host-patterns.d.ts +85 -0
  111. package/esm/src/guardrails/host-patterns.js +173 -0
  112. package/esm/src/guardrails/injection-patterns.d.ts +6 -1
  113. package/esm/src/guardrails/injection-patterns.js +33 -1
  114. package/esm/src/guardrails/injection-reversed.d.ts +9 -0
  115. package/esm/src/guardrails/injection-reversed.js +49 -0
  116. package/esm/src/guardrails/injection.d.ts +17 -1
  117. package/esm/src/guardrails/injection.js +259 -36
  118. package/esm/src/guardrails/labels.d.ts +40 -0
  119. package/esm/src/guardrails/labels.js +881 -0
  120. package/esm/src/guardrails/live-outbound-gate.d.ts +9 -8
  121. package/esm/src/guardrails/live-outbound-gate.js +100 -107
  122. package/esm/src/guardrails/mod.d.ts +30 -22
  123. package/esm/src/guardrails/mod.js +19 -14
  124. package/esm/src/guardrails/network.d.ts +4 -0
  125. package/esm/src/guardrails/network.js +21 -19
  126. package/esm/src/guardrails/normalize.d.ts +15 -1
  127. package/esm/src/guardrails/normalize.js +34 -1
  128. package/esm/src/guardrails/policy.d.ts +2 -17
  129. package/esm/src/guardrails/policy.js +12 -41
  130. package/esm/src/guardrails/progressive-yield.d.ts +65 -24
  131. package/esm/src/guardrails/progressive-yield.js +191 -147
  132. package/esm/src/guardrails/prompt-echo.d.ts +4 -2
  133. package/esm/src/guardrails/prompt-echo.js +87 -6
  134. package/esm/src/guardrails/quota.d.ts +4 -1
  135. package/esm/src/guardrails/quota.js +7 -2
  136. package/esm/src/guardrails/rules.d.ts +20 -29
  137. package/esm/src/guardrails/rules.js +23 -30
  138. package/esm/src/guardrails/sanitize.d.ts +32 -15
  139. package/esm/src/guardrails/sanitize.js +100 -124
  140. package/esm/src/guardrails/sensitive-groups.d.ts +21 -0
  141. package/esm/src/guardrails/sensitive-groups.js +12 -0
  142. package/esm/src/guardrails/sensitive.d.ts +16 -23
  143. package/esm/src/guardrails/sensitive.js +168 -47
  144. package/esm/src/guardrails/serialize.d.ts +1 -0
  145. package/esm/src/guardrails/testing.d.ts +4 -2
  146. package/esm/src/guardrails/testing.js +4 -2
  147. package/esm/src/guardrails/theorem-error.d.ts +5 -2
  148. package/esm/src/guardrails/theorem-error.js +6 -3
  149. package/esm/src/guardrails/thought-guard.d.ts +34 -13
  150. package/esm/src/guardrails/thought-guard.js +264 -64
  151. package/esm/src/guardrails/tool-directives.d.ts +29 -10
  152. package/esm/src/guardrails/tool-directives.js +133 -47
  153. package/esm/src/guardrails/tool-leak.d.ts +26 -0
  154. package/esm/src/guardrails/tool-leak.js +45 -0
  155. package/esm/src/guardrails/tool-result.d.ts +45 -14
  156. package/esm/src/guardrails/tool-result.js +94 -70
  157. package/esm/src/guardrails/types.d.ts +79 -71
  158. package/esm/src/guardrails/types.js +11 -7
  159. package/esm/src/host/client-turn.d.ts +29 -2
  160. package/esm/src/host/client-turn.js +46 -4
  161. package/esm/src/host/mint-trace.d.ts +1 -0
  162. package/esm/src/host/mint-trace.js +3 -2
  163. package/esm/src/host/mod.d.ts +2 -2
  164. package/esm/src/host/mod.js +1 -1
  165. package/esm/src/host/readStreamingJsonStringField.js +2 -43
  166. package/esm/src/host/reply.d.ts +6 -0
  167. package/esm/src/host/reply.js +8 -1
  168. package/esm/src/interface/blocks.d.ts +3 -0
  169. package/esm/src/interface/blocks.js +84 -14
  170. package/esm/src/interface/composer-actions.d.ts +4 -0
  171. package/esm/src/interface/composer-actions.js +5 -3
  172. package/esm/src/interface/draft.d.ts +6 -0
  173. package/esm/src/interface/draft.js +22 -11
  174. package/esm/src/interface/from-profile.d.ts +13 -1
  175. package/esm/src/interface/from-profile.js +66 -31
  176. package/esm/src/interface/history.d.ts +9 -3
  177. package/esm/src/interface/history.js +33 -24
  178. package/esm/src/interface/inputs.d.ts +1 -0
  179. package/esm/src/interface/inputs.js +3 -0
  180. package/esm/src/interface/mod.d.ts +4 -2
  181. package/esm/src/interface/mod.js +3 -2
  182. package/esm/src/interface/models.d.ts +7 -0
  183. package/esm/src/interface/models.js +5 -0
  184. package/esm/src/interface/pending.d.ts +9 -0
  185. package/esm/src/interface/pending.js +9 -3
  186. package/esm/src/interface/profile-interface.js +54 -40
  187. package/esm/src/interface/session.d.ts +12 -5
  188. package/esm/src/interface/session.js +17 -10
  189. package/esm/src/interface/stop.d.ts +13 -0
  190. package/esm/src/interface/stop.js +28 -0
  191. package/esm/src/interface/tool-calls.d.ts +14 -2
  192. package/esm/src/interface/tool-calls.js +64 -10
  193. package/esm/src/interface/tool-invoke.d.ts +2 -0
  194. package/esm/src/interface/tool-invoke.js +3 -1
  195. package/esm/src/interface/tool-media.d.ts +2 -0
  196. package/esm/src/interface/tool-media.js +2 -1
  197. package/esm/src/interface/types.d.ts +105 -40
  198. package/esm/src/interface/types.js +1 -0
  199. package/esm/src/kernel/api-catalog.d.ts +85 -0
  200. package/esm/src/kernel/api-catalog.js +229 -0
  201. package/esm/src/kernel/auth/crypto.d.ts +7 -2
  202. package/esm/src/kernel/auth/crypto.js +12 -10
  203. package/esm/src/kernel/auth/oauth.d.ts +2 -1
  204. package/esm/src/kernel/auth/oauth.js +23 -22
  205. package/esm/src/kernel/auth/typed-secret.js +2 -2
  206. package/esm/src/kernel/auth/types.d.ts +13 -0
  207. package/esm/src/kernel/checkpoint.d.ts +43 -0
  208. package/esm/src/kernel/checkpoint.js +58 -0
  209. package/esm/src/kernel/default-scope.d.ts +43 -5
  210. package/esm/src/kernel/default-scope.js +54 -5
  211. package/esm/src/kernel/engine/call-trace.d.ts +19 -0
  212. package/esm/src/kernel/engine/call-trace.js +29 -0
  213. package/esm/src/kernel/engine/compaction.d.ts +6 -5
  214. package/esm/src/kernel/engine/compaction.js +12 -11
  215. package/esm/src/kernel/engine/decision.d.ts +10 -8
  216. package/esm/src/kernel/engine/decision.js +174 -146
  217. package/esm/src/kernel/engine/embedding.d.ts +8 -0
  218. package/esm/src/kernel/engine/embedding.js +118 -0
  219. package/esm/src/kernel/engine/live-inbound.d.ts +14 -4
  220. package/esm/src/kernel/engine/live-inbound.js +36 -11
  221. package/esm/src/kernel/engine/live-ingress.d.ts +6 -0
  222. package/esm/src/kernel/engine/live-ingress.js +6 -1
  223. package/esm/src/kernel/engine/repair.js +12 -12
  224. package/esm/src/kernel/engine/runner/gates.d.ts +2 -2
  225. package/esm/src/kernel/engine/runner/gates.js +287 -101
  226. package/esm/src/kernel/engine/runner/mod.d.ts +19 -5
  227. package/esm/src/kernel/engine/runner/mod.js +107 -56
  228. package/esm/src/kernel/engine/runner/nested.d.ts +32 -0
  229. package/esm/src/kernel/engine/runner/nested.js +134 -0
  230. package/esm/src/kernel/engine/runner/schema-validation.d.ts +24 -3
  231. package/esm/src/kernel/engine/runner/schema-validation.js +78 -4
  232. package/esm/src/kernel/engine/runner/stages.d.ts +1 -1
  233. package/esm/src/kernel/engine/runner/stages.js +1 -8
  234. package/esm/src/kernel/engine/runner/state.d.ts +33 -12
  235. package/esm/src/kernel/engine/runner/state.js +11 -1
  236. package/esm/src/kernel/engine/runner/step-order.d.ts +27 -0
  237. package/esm/src/kernel/engine/runner/step-order.js +165 -0
  238. package/esm/src/kernel/engine/runner/steps.d.ts +2 -2
  239. package/esm/src/kernel/engine/runner/steps.js +329 -169
  240. package/esm/src/kernel/engine/runner/stream.d.ts +42 -11
  241. package/esm/src/kernel/engine/runner/stream.js +197 -46
  242. package/esm/src/kernel/engine/runner/usage.d.ts +5 -5
  243. package/esm/src/kernel/engine/runner/usage.js +12 -14
  244. package/esm/src/kernel/engine/session/mod.d.ts +8 -6
  245. package/esm/src/kernel/engine/session/mod.js +360 -129
  246. package/esm/src/kernel/engine/session/session-trace.d.ts +10 -10
  247. package/esm/src/kernel/engine/session/session-trace.js +41 -30
  248. package/esm/src/kernel/engine/token-estimate.d.ts +10 -64
  249. package/esm/src/kernel/engine/token-estimate.js +14 -194
  250. package/esm/src/kernel/engine/tool-trace.d.ts +3 -3
  251. package/esm/src/kernel/engine/tool-trace.js +2 -1
  252. package/esm/src/kernel/engine/turn-trace.d.ts +8 -7
  253. package/esm/src/kernel/engine/turn-trace.js +28 -36
  254. package/esm/src/kernel/engine/usage.d.ts +6 -0
  255. package/esm/src/kernel/engine/usage.js +17 -0
  256. package/esm/src/kernel/interaction-parts.d.ts +3 -0
  257. package/esm/src/kernel/interaction-parts.js +18 -0
  258. package/esm/src/kernel/json.d.ts +10 -0
  259. package/esm/src/kernel/json.js +3 -0
  260. package/esm/src/kernel/mod.d.ts +38 -11
  261. package/esm/src/kernel/mod.js +22 -7
  262. package/esm/src/kernel/profile-graph.d.ts +11 -6
  263. package/esm/src/kernel/profile-graph.js +14 -7
  264. package/esm/src/kernel/profile-presence.d.ts +10 -1
  265. package/esm/src/kernel/profile-presence.js +90 -75
  266. package/esm/src/kernel/profile-scope.d.ts +7 -3
  267. package/esm/src/kernel/profile-scope.js +67 -55
  268. package/esm/src/kernel/protocols/binding.d.ts +65 -0
  269. package/esm/src/kernel/protocols/binding.js +125 -0
  270. package/esm/src/kernel/protocols/limits.d.ts +15 -0
  271. package/esm/src/kernel/protocols/limits.js +28 -0
  272. package/esm/src/kernel/protocols/mod.d.ts +5 -0
  273. package/esm/src/kernel/protocols/mod.js +5 -0
  274. package/esm/src/kernel/protocols/prices.d.ts +36 -0
  275. package/esm/src/kernel/protocols/prices.js +37 -0
  276. package/esm/src/kernel/protocols/protocol.d.ts +253 -0
  277. package/esm/src/kernel/protocols/protocol.js +253 -0
  278. package/esm/src/kernel/protocols/provider.d.ts +108 -0
  279. package/esm/src/kernel/protocols/provider.js +143 -0
  280. package/esm/src/kernel/protocols/runtime.d.ts +55 -0
  281. package/esm/src/kernel/protocols/runtime.js +534 -0
  282. package/esm/src/kernel/provider-budget.d.ts +32 -0
  283. package/esm/src/kernel/provider-budget.js +262 -0
  284. package/esm/src/kernel/provider-dispatch.d.ts +13 -0
  285. package/esm/src/kernel/provider-dispatch.js +36 -0
  286. package/esm/src/kernel/provider-live.d.ts +7 -0
  287. package/esm/src/kernel/provider-live.js +189 -0
  288. package/esm/src/kernel/provider-runtime.d.ts +57 -0
  289. package/esm/src/kernel/provider-runtime.js +524 -0
  290. package/esm/src/kernel/registry/attachments.d.ts +15 -4
  291. package/esm/src/kernel/registry/attachments.js +31 -22
  292. package/esm/src/kernel/registry/catalog.d.ts +6 -0
  293. package/esm/src/kernel/registry/catalog.js +9 -2
  294. package/esm/src/kernel/registry/embedding-rules.d.ts +28 -0
  295. package/esm/src/kernel/registry/embedding-rules.js +66 -0
  296. package/esm/src/kernel/registry/ingress.d.ts +6 -2
  297. package/esm/src/kernel/registry/ingress.js +55 -10
  298. package/esm/src/kernel/registry/kernel-registry.d.ts +3 -0
  299. package/esm/src/kernel/registry/kernel-registry.js +9 -2
  300. package/esm/src/kernel/registry/profile-outputs.js +4 -1
  301. package/esm/src/kernel/registry/profiles.d.ts +38 -14
  302. package/esm/src/kernel/registry/profiles.js +280 -205
  303. package/esm/src/kernel/registry/provider-request.d.ts +3 -3
  304. package/esm/src/kernel/registry/provider-request.js +5 -13
  305. package/esm/src/kernel/registry/resolve.d.ts +4 -1
  306. package/esm/src/kernel/registry/resolve.js +59 -58
  307. package/esm/src/kernel/registry/schemas.d.ts +3 -0
  308. package/esm/src/kernel/registry/schemas.js +3 -1
  309. package/esm/src/kernel/registry/slot-fill.d.ts +7 -0
  310. package/esm/src/kernel/registry/slot-fill.js +22 -0
  311. package/esm/src/kernel/registry/system-prompt.js +7 -8
  312. package/esm/src/kernel/registry/vault.d.ts +14 -13
  313. package/esm/src/kernel/registry/vault.js +1 -14
  314. package/esm/src/kernel/schema.d.ts +100 -46
  315. package/esm/src/kernel/schema.js +499 -257
  316. package/esm/src/kernel/scope.d.ts +12 -5
  317. package/esm/src/kernel/scope.js +23 -3
  318. package/esm/src/kernel/stages.d.ts +38 -3
  319. package/esm/src/kernel/stages.js +82 -39
  320. package/esm/src/kernel/stop.d.ts +29 -6
  321. package/esm/src/kernel/stop.js +16 -4
  322. package/esm/src/kernel/system-parts.js +6 -6
  323. package/esm/src/kernel/tools/activity-label.d.ts +12 -6
  324. package/esm/src/kernel/tools/activity-label.js +258 -32
  325. package/esm/src/kernel/tools/agent.d.ts +66 -0
  326. package/esm/src/kernel/tools/agent.js +212 -0
  327. package/esm/src/kernel/tools/coordinate.d.ts +4 -0
  328. package/esm/src/kernel/tools/coordinate.js +165 -0
  329. package/esm/src/kernel/tools/events.d.ts +21 -6
  330. package/esm/src/kernel/tools/events.js +53 -18
  331. package/esm/src/kernel/tools/execute.d.ts +47 -11
  332. package/esm/src/kernel/tools/execute.js +508 -136
  333. package/esm/src/kernel/tools/gate-answer.d.ts +12 -2
  334. package/esm/src/kernel/tools/gate-answer.js +17 -6
  335. package/esm/src/kernel/tools/handler-events.d.ts +45 -0
  336. package/esm/src/kernel/tools/handler-events.js +106 -0
  337. package/esm/src/kernel/tools/harness.d.ts +1 -0
  338. package/esm/src/kernel/tools/harness.js +2 -1
  339. package/esm/src/kernel/tools/http-limit.d.ts +27 -0
  340. package/esm/src/kernel/tools/http-limit.js +85 -0
  341. package/esm/src/kernel/tools/invoke.d.ts +27 -5
  342. package/esm/src/kernel/tools/invoke.js +223 -70
  343. package/esm/src/kernel/tools/mcp-sessions.d.ts +4 -1
  344. package/esm/src/kernel/tools/mcp-sessions.js +13 -8
  345. package/esm/src/kernel/tools/mod.d.ts +4 -3
  346. package/esm/src/kernel/tools/mod.js +3 -2
  347. package/esm/src/kernel/tools/model-text.d.ts +10 -5
  348. package/esm/src/kernel/tools/model-text.js +18 -12
  349. package/esm/src/kernel/tools/operation.d.ts +76 -0
  350. package/esm/src/kernel/tools/operation.js +100 -0
  351. package/esm/src/kernel/tools/page-answer.d.ts +8 -0
  352. package/esm/src/kernel/tools/page-answer.js +19 -0
  353. package/esm/src/kernel/tools/permission.d.ts +11 -2
  354. package/esm/src/kernel/tools/permission.js +12 -12
  355. package/esm/src/kernel/tools/project.d.ts +4 -1
  356. package/esm/src/kernel/tools/project.js +32 -2
  357. package/esm/src/kernel/tools/registry.d.ts +9 -2
  358. package/esm/src/kernel/tools/registry.js +69 -10
  359. package/esm/src/kernel/tools/remote.d.ts +40 -6
  360. package/esm/src/kernel/tools/remote.js +219 -92
  361. package/esm/src/kernel/tools/resolve.d.ts +3 -0
  362. package/esm/src/kernel/tools/resolve.js +12 -4
  363. package/esm/src/kernel/tools/run.d.ts +28 -0
  364. package/esm/src/kernel/tools/run.js +86 -0
  365. package/esm/src/kernel/tools/schema.d.ts +3 -3
  366. package/esm/src/kernel/tools/schema.js +21 -100
  367. package/esm/src/kernel/tools/signed-in-fetch.d.ts +2 -1
  368. package/esm/src/kernel/tools/signed-in-fetch.js +3 -3
  369. package/esm/src/kernel/tools/stage-run.d.ts +27 -4
  370. package/esm/src/kernel/tools/stage-run.js +75 -17
  371. package/esm/src/kernel/tools/types.d.ts +235 -25
  372. package/esm/src/kernel/tools/unchecked-output.d.ts +14 -0
  373. package/esm/src/kernel/tools/unchecked-output.js +18 -0
  374. package/esm/src/kernel/turn-events.d.ts +208 -31
  375. package/esm/src/kernel/turn-events.js +127 -9
  376. package/esm/src/kernel/types.d.ts +302 -161
  377. package/esm/src/kernel/util/base64.d.ts +2 -0
  378. package/esm/src/kernel/util/base64.js +2 -0
  379. package/esm/src/kernel/util/partial-json.d.ts +23 -0
  380. package/esm/src/kernel/util/partial-json.js +128 -0
  381. package/esm/src/kernel/util/record.d.ts +1 -0
  382. package/esm/src/kernel/util/record.js +1 -0
  383. package/esm/src/observability/destinations.d.ts +5 -0
  384. package/esm/src/observability/destinations.js +7 -2
  385. package/esm/src/observability/jsonl.d.ts +2 -2
  386. package/esm/src/observability/jsonl.js +15 -22
  387. package/esm/src/observability/mod.d.ts +3 -3
  388. package/esm/src/observability/mod.js +2 -2
  389. package/esm/src/observability/openinference.d.ts +1 -1
  390. package/esm/src/observability/openinference.js +3 -3
  391. package/esm/src/observability/otlp.d.ts +3 -0
  392. package/esm/src/observability/otlp.js +3 -3
  393. package/esm/src/observability/phoenix.d.ts +1 -0
  394. package/esm/src/observability/policy.d.ts +3 -0
  395. package/esm/src/observability/policy.js +5 -1
  396. package/esm/src/observability/resolve-policy.js +11 -5
  397. package/esm/src/observability/spans.d.ts +8 -2
  398. package/esm/src/observability/spans.js +21 -5
  399. package/esm/src/observability/trace-catalog.d.ts +19 -2
  400. package/esm/src/observability/trace-catalog.js +130 -88
  401. package/esm/src/observability/trace-record.js +22 -17
  402. package/esm/src/observability/trace-schema.d.ts +3 -0
  403. package/esm/src/observability/trace-schema.js +1 -1
  404. package/esm/src/observability/trace-sink.d.ts +1 -0
  405. package/esm/src/observability/trace-sink.js +1 -1
  406. package/esm/src/observability/trace-span.d.ts +7 -1
  407. package/esm/src/observability/trace-span.js +3 -1
  408. package/esm/src/observability/trace.d.ts +2 -0
  409. package/esm/src/observability/trace.js +4 -2
  410. package/esm/src/observability/types.d.ts +35 -11
  411. package/esm/src/observability/types.js +1 -1
  412. package/esm/src/presets/google/speech-voices.d.ts +1 -0
  413. package/esm/src/presets/google-limits.d.ts +1 -0
  414. package/esm/src/presets/google.d.ts +27 -12
  415. package/esm/src/presets/google.js +34 -25
  416. package/esm/src/presets/local.d.ts +26 -0
  417. package/esm/src/presets/local.js +30 -0
  418. package/esm/src/presets/mod.d.ts +5 -4
  419. package/esm/src/presets/mod.js +4 -4
  420. package/esm/src/presets/openrouter.d.ts +14 -1
  421. package/esm/src/presets/openrouter.js +19 -1
  422. package/esm/src/providers/embedding-limits.d.ts +7 -0
  423. package/esm/src/providers/embedding-limits.js +12 -0
  424. package/esm/src/providers/gemini/embedding-protocol.d.ts +8 -0
  425. package/esm/src/providers/gemini/embedding-protocol.js +125 -0
  426. package/esm/src/providers/gemini/interactions-protocol.d.ts +8 -0
  427. package/esm/src/providers/gemini/interactions-protocol.js +102 -0
  428. package/esm/src/providers/gemini/live-protocol.d.ts +3 -0
  429. package/esm/src/providers/gemini/live-protocol.js +191 -0
  430. package/esm/src/providers/gemini/prices.d.ts +3 -0
  431. package/esm/src/providers/gemini/prices.js +63 -0
  432. package/esm/src/providers/gemini/provider.d.ts +7 -0
  433. package/esm/src/providers/gemini/provider.js +39 -0
  434. package/esm/src/providers/google/api-error.d.ts +2 -0
  435. package/esm/src/providers/google/api-error.js +26 -18
  436. package/esm/src/providers/google/builtins.d.ts +14 -0
  437. package/esm/src/providers/google/builtins.js +57 -0
  438. package/esm/src/providers/google/grounding.d.ts +4 -4
  439. package/esm/src/providers/google/interactions/framing.d.ts +20 -8
  440. package/esm/src/providers/google/interactions/framing.js +85 -44
  441. package/esm/src/providers/google/interactions/steps.d.ts +5 -5
  442. package/esm/src/providers/google/interactions/steps.js +4 -4
  443. package/esm/src/providers/google/interactions/stream.d.ts +10 -11
  444. package/esm/src/providers/google/interactions/stream.js +33 -100
  445. package/esm/src/providers/google/live/framing.d.ts +15 -5
  446. package/esm/src/providers/google/live/framing.js +25 -25
  447. package/esm/src/providers/google/live/stream.d.ts +6 -44
  448. package/esm/src/providers/google/live/stream.js +4 -210
  449. package/esm/src/providers/google/urls.d.ts +1 -3
  450. package/esm/src/providers/google/urls.js +1 -3
  451. package/esm/src/providers/google/usage.js +2 -2
  452. package/esm/src/providers/live.d.ts +6 -0
  453. package/esm/src/providers/live.js +6 -0
  454. package/esm/src/providers/local/embedding-protocol.d.ts +7 -0
  455. package/esm/src/providers/local/embedding-protocol.js +60 -0
  456. package/esm/src/providers/local/provider.d.ts +7 -0
  457. package/esm/src/providers/local/provider.js +28 -0
  458. package/esm/src/providers/mod.d.ts +28 -7
  459. package/esm/src/providers/mod.js +19 -3
  460. package/esm/src/providers/open-ai/protocol.d.ts +3 -0
  461. package/esm/src/providers/open-ai/protocol.js +189 -0
  462. package/esm/src/providers/openrouter/embedding-protocol.d.ts +6 -0
  463. package/esm/src/providers/openrouter/embedding-protocol.js +86 -0
  464. package/esm/src/providers/openrouter/image.d.ts +0 -9
  465. package/esm/src/providers/openrouter/image.js +0 -153
  466. package/esm/src/providers/openrouter/images-protocol.d.ts +3 -0
  467. package/esm/src/providers/openrouter/images-protocol.js +82 -0
  468. package/esm/src/providers/openrouter/openai/compat.d.ts +2 -2
  469. package/esm/src/providers/openrouter/openai/compat.js +6 -6
  470. package/esm/src/providers/openrouter/openai/image-payload.d.ts +2 -2
  471. package/esm/src/providers/openrouter/openai/reasoning-state.d.ts +2 -0
  472. package/esm/src/providers/openrouter/openai/reasoning-state.js +31 -0
  473. package/esm/src/providers/openrouter/protocol.d.ts +8 -0
  474. package/esm/src/providers/openrouter/protocol.js +171 -0
  475. package/esm/src/providers/openrouter/provider.d.ts +10 -0
  476. package/esm/src/providers/openrouter/provider.js +50 -0
  477. package/esm/src/providers/shared/carried-tool-files.d.ts +7 -0
  478. package/esm/src/providers/shared/carried-tool-files.js +43 -0
  479. package/esm/src/providers/shared/pcm.js +2 -2
  480. package/esm/src/providers/shared/protocol-events.d.ts +8 -0
  481. package/esm/src/providers/shared/protocol-events.js +20 -0
  482. package/esm/src/providers/shared/response-identity.d.ts +2 -2
  483. package/esm/src/providers/shared/retry.d.ts +18 -0
  484. package/esm/src/providers/shared/retry.js +89 -0
  485. package/esm/src/providers/shared/sse.d.ts +0 -4
  486. package/esm/src/providers/shared/sse.js +50 -36
  487. package/esm/src/providers/shared/tool-args.d.ts +6 -7
  488. package/esm/src/providers/shared/tool-args.js +10 -6
  489. package/esm/src/providers/shared/tool-draft.d.ts +16 -0
  490. package/esm/src/providers/shared/tool-draft.js +14 -0
  491. package/esm/src/providers/shared/upstream-tap.d.ts +2 -2
  492. package/esm/src/providers/shared/upstream-tape.js +1 -1
  493. package/esm/src/providers/system-one/protocol.d.ts +8 -0
  494. package/esm/src/providers/system-one/protocol.js +93 -0
  495. package/esm/src/providers/types.d.ts +48 -16
  496. package/esm/src/providers/types.js +2 -1
  497. package/esm/src/providers/typesafe/provider.d.ts +7 -0
  498. package/esm/src/providers/typesafe/provider.js +24 -0
  499. package/esm/src/surface/formats.d.ts +19 -1
  500. package/esm/src/surface/formats.js +68 -29
  501. package/esm/src/surface/mod.d.ts +4 -2
  502. package/esm/src/surface/mod.js +4 -2
  503. package/esm/src/surface/runtime.d.ts +4 -0
  504. package/esm/src/surface/runtime.js +2 -0
  505. package/esm/src/surface/tools.d.ts +2 -8
  506. package/esm/src/surface/tools.js +4 -22
  507. package/esm/src/surface/types.d.ts +6 -0
  508. package/package.json +5 -13
  509. package/esm/src/cli/commands/egress-compile.d.ts +0 -17
  510. package/esm/src/cli/commands/egress-compile.js +0 -25
  511. package/esm/src/guardrails/egress-policy.d.ts +0 -27
  512. package/esm/src/guardrails/egress-policy.js +0 -76
  513. package/esm/src/guardrails/egress-rules.d.ts +0 -54
  514. package/esm/src/guardrails/egress-rules.js +0 -49
  515. package/esm/src/guardrails/lexicon.d.ts +0 -30
  516. package/esm/src/guardrails/lexicon.js +0 -478
  517. package/esm/src/kernel/engine/media-probe/audio.d.ts +0 -7
  518. package/esm/src/kernel/engine/media-probe/audio.js +0 -342
  519. package/esm/src/kernel/engine/media-probe/bytes.d.ts +0 -6
  520. package/esm/src/kernel/engine/media-probe/bytes.js +0 -26
  521. package/esm/src/kernel/engine/media-probe/image.d.ts +0 -5
  522. package/esm/src/kernel/engine/media-probe/image.js +0 -171
  523. package/esm/src/kernel/engine/media-probe/iso-bmff.d.ts +0 -19
  524. package/esm/src/kernel/engine/media-probe/iso-bmff.js +0 -48
  525. package/esm/src/kernel/engine/media-probe/matroska.d.ts +0 -35
  526. package/esm/src/kernel/engine/media-probe/matroska.js +0 -226
  527. package/esm/src/kernel/engine/media-probe/mp4.d.ts +0 -22
  528. package/esm/src/kernel/engine/media-probe/mp4.js +0 -279
  529. package/esm/src/kernel/engine/media-probe/opus.d.ts +0 -4
  530. package/esm/src/kernel/engine/media-probe/opus.js +0 -23
  531. package/esm/src/kernel/engine/media-probe/pdf.d.ts +0 -5
  532. package/esm/src/kernel/engine/media-probe/pdf.js +0 -117
  533. package/esm/src/kernel/engine/media-probe/video.d.ts +0 -15
  534. package/esm/src/kernel/engine/media-probe/video.js +0 -49
  535. package/esm/src/presets/typesafe.d.ts +0 -2
  536. package/esm/src/presets/typesafe.js +0 -2
  537. package/esm/src/providers/create-provider.d.ts +0 -21
  538. package/esm/src/providers/create-provider.js +0 -90
  539. package/esm/src/providers/decision/usage.d.ts +0 -3
  540. package/esm/src/providers/decision/usage.js +0 -25
  541. package/esm/src/providers/google/interactions/mod.d.ts +0 -2
  542. package/esm/src/providers/google/interactions/mod.js +0 -2
  543. package/esm/src/providers/google/keys.d.ts +0 -20
  544. package/esm/src/providers/google/keys.js +0 -87
  545. package/esm/src/providers/google/live/mod.d.ts +0 -7
  546. package/esm/src/providers/google/live/mod.js +0 -7
  547. package/esm/src/providers/google/live/openapi-schema.d.ts +0 -1
  548. package/esm/src/providers/google/live/openapi-schema.js +0 -42
  549. package/esm/src/providers/google/live/session.d.ts +0 -14
  550. package/esm/src/providers/google/live/session.js +0 -150
  551. package/esm/src/providers/local/local.d.ts +0 -12
  552. package/esm/src/providers/local/local.js +0 -186
  553. package/esm/src/providers/local/mod.d.ts +0 -8
  554. package/esm/src/providers/local/mod.js +0 -8
  555. package/esm/src/providers/openrouter/cache-control.d.ts +0 -5
  556. package/esm/src/providers/openrouter/cache-control.js +0 -4
  557. package/esm/src/providers/openrouter/chat.d.ts +0 -64
  558. package/esm/src/providers/openrouter/chat.js +0 -490
  559. package/esm/src/providers/openrouter/openai/sdk-messages.d.ts +0 -10
  560. package/esm/src/providers/openrouter/openai/sdk-messages.js +0 -99
  561. package/esm/src/providers/openrouter/resolve-api-key.d.ts +0 -3
  562. package/esm/src/providers/openrouter/resolve-api-key.js +0 -8
  563. package/esm/src/providers/openrouter/speech.d.ts +0 -18
  564. package/esm/src/providers/openrouter/speech.js +0 -109
  565. package/esm/src/providers/probe.d.ts +0 -5
  566. package/esm/src/providers/probe.js +0 -15
  567. package/esm/src/providers/shared/builtin-wire.d.ts +0 -4
  568. package/esm/src/providers/shared/builtin-wire.js +0 -9
  569. package/esm/src/providers/shared/vault.d.ts +0 -13
  570. package/esm/src/providers/shared/vault.js +0 -41
@@ -4,17 +4,17 @@ function partProblem(part) {
4
4
  if (typeof part === 'string')
5
5
  return undefined;
6
6
  if (typeof part !== 'object' || part === null || Array.isArray(part)) {
7
- return 'must be a string or { private: string }'; // lexicon-exempt: developer contract error
7
+ return 'must be a string or { private: string }'; // labels-exempt: developer contract error
8
8
  }
9
9
  const keys = Object.keys(part);
10
10
  if (keys.length !== 1 || keys[0] !== 'private') {
11
- return 'must have exactly one key, private'; // lexicon-exempt: developer contract error
11
+ return 'must have exactly one key, private'; // labels-exempt: developer contract error
12
12
  }
13
13
  const text = part.private;
14
14
  if (typeof text !== 'string')
15
- return 'must be a string'; // lexicon-exempt: developer contract error
15
+ return 'must be a string'; // labels-exempt: developer contract error
16
16
  if (text === '')
17
- return 'must not be empty'; // lexicon-exempt: developer contract error
17
+ return 'must not be empty'; // labels-exempt: developer contract error
18
18
  return undefined;
19
19
  }
20
20
  /** What is wrong with `prompt` as a system prompt, `where` naming it, or undefined. */
@@ -22,9 +22,9 @@ function systemPromptProblem(prompt, where) {
22
22
  if (typeof prompt === 'string')
23
23
  return undefined;
24
24
  if (!Array.isArray(prompt))
25
- return `${where} must be a string or an array of parts`; // lexicon-exempt: developer contract error
25
+ return `${where} must be a string or an array of parts`; // labels-exempt: developer contract error
26
26
  if (prompt.length === 0)
27
- return `${where} must not be an empty array`; // lexicon-exempt: developer contract error
27
+ return `${where} must not be an empty array`; // labels-exempt: developer contract error
28
28
  for (const [at, part] of prompt.entries()) {
29
29
  const problem = partProblem(part);
30
30
  if (!problem)
@@ -1,16 +1,22 @@
1
+ /** One line of wording, or a list of lines read top to bottom: the first that fits is shown. */
2
+ export type LabelTemplate = string | readonly string[];
3
+ /** A tool's name as a label shows it: `manage_alert` reads "manage alert". */
4
+ export declare function toolNameInWords(name: string): string;
1
5
  /**
2
- * Fills each `{path}` or `{path|fallback}` from the call. Only text and numbers fill; a placeholder
3
- * with no value and no fallback leaves the whole label `undefined`, and the transcript names the tool.
6
+ * Fills each `{path}` or `{path|fallback}` from the call. Only text and numbers fill; a line fits
7
+ * when every placeholder has a value or a fallback and its `when` holds. A list shows its first
8
+ * line that fits, and a run of `+` lines shows every member that fits, joined in words. When no
9
+ * line fits the label is `undefined`, and the transcript names the tool.
4
10
  */
5
- export declare function fillActivityLabel(template: string | undefined, values: {
11
+ export declare function fillActivityLabel(template: LabelTemplate | undefined, values: {
6
12
  input: unknown;
7
13
  output?: unknown;
8
14
  }): string | undefined;
9
15
  /**
10
- * Why a label can't fill from these JSON schemas, as a sentence for its author, or `undefined`
11
- * when every placeholder can. Pass `output` for a Done label.
16
+ * Why a label can't be used with these JSON schemas, as a sentence for its author, or `undefined`
17
+ * when it can. Pass `output` for a Done label. A list must end on a line that always fits.
12
18
  */
13
- export declare function activityLabelProblem(template: string, schemas: {
19
+ export declare function activityLabelProblem(template: LabelTemplate, schemas: {
14
20
  input: unknown;
15
21
  output?: unknown;
16
22
  }): string | undefined;
@@ -1,18 +1,21 @@
1
1
  import { isRecord } from '../util/record.js';
2
- const MAX_VALUE_CHARS = 40;
3
2
  const PLACEHOLDER = /\{\{?([^{}]*)\}\}?/g;
4
- // Control and bidi-override characters would let a tool's output restyle or reorder the label.
3
+ // why: Control and bidi-override characters would let a tool's output restyle or reorder the label.
5
4
  const UNPRINTABLE = /[\p{Cc}\p{Cf}]/gu;
6
5
  const INDEX = /^-?\d+$/;
7
6
  const ISO_DATE = /^(\d{4})-(\d{2})-(\d{2})(?:[T ](\d{2}):(\d{2})(?::\d{2}(?:\.\d+)?)?(?:Z|[+-]\d{2}:?\d{2})?)?$/;
8
7
  const NUMBER = new Intl.NumberFormat(undefined, { maximumFractionDigits: 2 });
9
- // Dates show the wall-clock time as the tool wrote it, not converted to the server's zone.
8
+ // why: Dates show the wall-clock time as the tool wrote it, not converted to the server's zone.
10
9
  const DAY = new Intl.DateTimeFormat(undefined, { dateStyle: 'medium', timeZone: 'UTC' });
11
10
  const DAY_TIME = new Intl.DateTimeFormat(undefined, {
12
11
  dateStyle: 'medium',
13
12
  timeStyle: 'short',
14
13
  timeZone: 'UTC',
15
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.*)$/;
16
19
  function parsePlaceholder(raw) {
17
20
  const bar = raw.indexOf('|');
18
21
  if (bar < 0)
@@ -64,22 +67,75 @@ function labelValue(value) {
64
67
  if (typeof value !== 'string')
65
68
  return undefined;
66
69
  const text = value.replace(UNPRINTABLE, ' ').replace(/\s+/g, ' ').trim();
67
- const chars = [...(dateText(text) ?? text)];
68
- if (chars.length === 0)
69
- return undefined;
70
- if (chars.length <= MAX_VALUE_CHARS)
71
- return chars.join('');
72
- const head = chars.slice(0, MAX_VALUE_CHARS - 1).join('');
73
- return `${head.trimEnd()}…`;
70
+ return (dateText(text) ?? text) || undefined;
74
71
  }
75
- /**
76
- * Fills each `{path}` or `{path|fallback}` from the call. Only text and numbers fill; a placeholder
77
- * with no value and no fallback leaves the whole label `undefined`, and the transcript names the tool.
78
- */
79
- export function fillActivityLabel(template, values) {
80
- if (!template?.trim())
81
- return undefined;
82
- const sides = 'output' in values ? ['input', 'output'] : ['input'];
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) {
83
139
  let missing = false;
84
140
  const filled = template.replace(PLACEHOLDER, (_, raw) => {
85
141
  const { path, fallback } = parsePlaceholder(raw);
@@ -95,6 +151,30 @@ export function fillActivityLabel(template, values) {
95
151
  const text = filled.replace(/\s+/g, ' ').trim();
96
152
  return missing || !text ? undefined : text;
97
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
+ }
98
178
  const HOLDS_RANK = ['value', 'group', 'flag', 'missing'];
99
179
  function schemaTypes(node) {
100
180
  const types = Array.isArray(node.type) ? node.type : [node.type];
@@ -128,10 +208,18 @@ function leavesAt(node, path) {
128
208
  const types = schemaTypes(node);
129
209
  if (types.length && types.every((type) => type === 'boolean'))
130
210
  return [];
131
- const group = types.includes('array') || types.includes('object') || schemaBranches(node).length;
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
+ }
132
220
  return group ? placeholdersAt(node, path) : [path];
133
221
  }
134
- // A schema that doesn't say what's there ($ref, no properties, no items) is taken on trust.
222
+ // why: A schema that doesn't say what's there ($ref, no properties, no items) is taken on trust.
135
223
  function schemaPathHolds(node, keys, walked) {
136
224
  if (!isRecord(node) || '$ref' in node)
137
225
  return { holds: 'value' };
@@ -169,27 +257,24 @@ function tryInstead(paths) {
169
257
  const shown = [...new Set(paths)].slice(0, 4).map((path) => `{${path}}`);
170
258
  if (shown.length === 0)
171
259
  return '';
172
- const list = shown.length === 1 ? shown[0] : `${shown.slice(0, -1).join(', ')} or ${shown.at(-1)}`;
260
+ const list = shown.length === 1
261
+ ? shown[0]
262
+ : `${shown.slice(0, -1).join(', ')}${shown.length > 2 ? ',' : ''} or ${shown.at(-1)}`;
173
263
  return ` Try ${list}.`;
174
264
  }
175
- /**
176
- * Why a label can't fill from these JSON schemas, as a sentence for its author, or `undefined`
177
- * when every placeholder can. Pass `output` for a Done label.
178
- */
179
- export function activityLabelProblem(template, schemas) {
180
- const sides = 'output' in schemas ? ['input', 'output'] : ['input'];
265
+ function placeholderProblem(template, schemas, sides) {
181
266
  for (const match of template.matchAll(PLACEHOLDER)) {
182
267
  const { path } = parsePlaceholder(match[1] ?? '');
183
268
  if (!path) {
184
269
  const example = placeholdersAt(schemas.input, '')[0] ?? 'name';
185
- return `Put a field name between the braces, like {${example}}.`; // lexicon-exempt: builder diagnostic
270
+ return `Put a field name between the braces, like {${example}}.`; // labels-exempt: builder diagnostic
186
271
  }
187
272
  const paths = routes(path, sides);
188
273
  const [route] = paths;
189
274
  if (!route)
190
275
  continue;
191
276
  if (route.prefixed && !sides.includes(route.side)) {
192
- return `{${path}} is only there once the call is done; use it in the Done label.`; // lexicon-exempt: builder diagnostic
277
+ return `{${path}} is only there once the call is done; use it in the Done label.`; // labels-exempt: builder diagnostic
193
278
  }
194
279
  const found = mergeHolds(paths.map(({ side, keys, prefixed }) => schemaPathHolds(schemas[side], keys, prefixed ? side : '')));
195
280
  if (found.holds === 'value')
@@ -199,11 +284,152 @@ export function activityLabelProblem(template, schemas) {
199
284
  const near = all.filter((candidate) => candidate.split('.')[depth] === route.keys[0]);
200
285
  const from = route.prefixed ? route.side : sides.join(' or ');
201
286
  const reason = {
202
- missing: `is not a field of this tool's ${from}.`, // lexicon-exempt: builder diagnostic
203
- group: 'is a list or group; a label shows text or a number.', // lexicon-exempt: builder diagnostic
204
- flag: 'is true or false; a label shows text or a number.', // lexicon-exempt: builder diagnostic
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
205
290
  }[found.holds];
206
291
  return `{${path}} ${reason}${tryInstead(near.length ? near : all)}`;
207
292
  }
208
293
  return undefined;
209
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, };