@theoremjs/agents 0.0.0-stage → 0.3.0

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 (514) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +1264 -2
  3. package/esm/_dnt.polyfills.d.ts +66 -0
  4. package/esm/_dnt.polyfills.js +51 -0
  5. package/esm/mod.d.ts +65 -0
  6. package/esm/mod.js +42 -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 +458 -0
  12. package/esm/src/cli/commands/egress-compile.d.ts +17 -0
  13. package/esm/src/cli/commands/egress-compile.js +25 -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 +202 -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 +25 -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 +72 -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 +4 -0
  35. package/esm/src/evals/attachments.js +53 -0
  36. package/esm/src/evals/breakdown.d.ts +28 -0
  37. package/esm/src/evals/breakdown.js +68 -0
  38. package/esm/src/evals/graders/answer.d.ts +13 -0
  39. package/esm/src/evals/graders/answer.js +133 -0
  40. package/esm/src/evals/graders/code.d.ts +64 -0
  41. package/esm/src/evals/graders/code.js +205 -0
  42. package/esm/src/evals/graders/judge.d.ts +20 -0
  43. package/esm/src/evals/graders/judge.js +365 -0
  44. package/esm/src/evals/graders/latency.d.ts +5 -0
  45. package/esm/src/evals/graders/latency.js +81 -0
  46. package/esm/src/evals/graders/live.d.ts +11 -0
  47. package/esm/src/evals/graders/live.js +40 -0
  48. package/esm/src/evals/graders/media.d.ts +18 -0
  49. package/esm/src/evals/graders/media.js +92 -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 +17 -0
  53. package/esm/src/evals/graders/transcript.js +200 -0
  54. package/esm/src/evals/mod.d.ts +42 -0
  55. package/esm/src/evals/mod.js +30 -0
  56. package/esm/src/evals/record.d.ts +35 -0
  57. package/esm/src/evals/record.js +105 -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 +118 -0
  67. package/esm/src/evals/run.js +452 -0
  68. package/esm/src/evals/suite.d.ts +19 -0
  69. package/esm/src/evals/suite.js +92 -0
  70. package/esm/src/evals/summary.d.ts +32 -0
  71. package/esm/src/evals/summary.js +30 -0
  72. package/esm/src/evals/trial.d.ts +27 -0
  73. package/esm/src/evals/trial.js +158 -0
  74. package/esm/src/evals/types.d.ts +260 -0
  75. package/esm/src/evals/types.js +126 -0
  76. package/esm/src/evals/verdict.d.ts +18 -0
  77. package/esm/src/evals/verdict.js +45 -0
  78. package/esm/src/guardrails/canary-gate.d.ts +21 -0
  79. package/esm/src/guardrails/canary-gate.js +40 -0
  80. package/esm/src/guardrails/canary.d.ts +112 -0
  81. package/esm/src/guardrails/canary.js +901 -0
  82. package/esm/src/guardrails/compile-egress.d.ts +11 -0
  83. package/esm/src/guardrails/compile-egress.js +11 -0
  84. package/esm/src/guardrails/corpus/canary-egress-attacks.d.ts +22 -0
  85. package/esm/src/guardrails/corpus/canary-egress-attacks.js +303 -0
  86. package/esm/src/guardrails/corpus/fuzz-inbound.d.ts +5 -0
  87. package/esm/src/guardrails/corpus/fuzz-inbound.js +202 -0
  88. package/esm/src/guardrails/corpus/inbound-payloads.d.ts +3 -0
  89. package/esm/src/guardrails/corpus/inbound-payloads.js +118 -0
  90. package/esm/src/guardrails/corpus/live-attacks.d.ts +13 -0
  91. package/esm/src/guardrails/corpus/live-attacks.js +224 -0
  92. package/esm/src/guardrails/corpus/mod.d.ts +7 -0
  93. package/esm/src/guardrails/corpus/mod.js +4 -0
  94. package/esm/src/guardrails/corpus/secrets.d.ts +12 -0
  95. package/esm/src/guardrails/corpus/secrets.js +16 -0
  96. package/esm/src/guardrails/corpus/strings.d.ts +23 -0
  97. package/esm/src/guardrails/corpus/strings.js +29 -0
  98. package/esm/src/guardrails/corpus/types.d.ts +32 -0
  99. package/esm/src/guardrails/corpus/types.js +1 -0
  100. package/esm/src/guardrails/egress-automata.d.ts +14 -0
  101. package/esm/src/guardrails/egress-automata.js +6059 -0
  102. package/esm/src/guardrails/egress-compiler.d.ts +33 -0
  103. package/esm/src/guardrails/egress-compiler.js +237 -0
  104. package/esm/src/guardrails/egress-patterns.d.ts +24 -0
  105. package/esm/src/guardrails/egress-patterns.js +32 -0
  106. package/esm/src/guardrails/egress-policy.d.ts +27 -0
  107. package/esm/src/guardrails/egress-policy.js +76 -0
  108. package/esm/src/guardrails/egress-rules.d.ts +54 -0
  109. package/esm/src/guardrails/egress-rules.js +49 -0
  110. package/esm/src/guardrails/egress-stream.d.ts +105 -0
  111. package/esm/src/guardrails/egress-stream.js +645 -0
  112. package/esm/src/guardrails/egress-urls.d.ts +83 -0
  113. package/esm/src/guardrails/egress-urls.js +917 -0
  114. package/esm/src/guardrails/egress.d.ts +106 -0
  115. package/esm/src/guardrails/egress.js +374 -0
  116. package/esm/src/guardrails/error.d.ts +26 -0
  117. package/esm/src/guardrails/error.js +91 -0
  118. package/esm/src/guardrails/event-schemas.d.ts +57 -0
  119. package/esm/src/guardrails/event-schemas.js +41 -0
  120. package/esm/src/guardrails/events.d.ts +9 -0
  121. package/esm/src/guardrails/events.js +42 -0
  122. package/esm/src/guardrails/hits.d.ts +8 -0
  123. package/esm/src/guardrails/hits.js +19 -0
  124. package/esm/src/guardrails/injection-patterns.d.ts +15 -0
  125. package/esm/src/guardrails/injection-patterns.js +94 -0
  126. package/esm/src/guardrails/injection.d.ts +14 -0
  127. package/esm/src/guardrails/injection.js +237 -0
  128. package/esm/src/guardrails/lexicon.d.ts +30 -0
  129. package/esm/src/guardrails/lexicon.js +478 -0
  130. package/esm/src/guardrails/live-outbound-gate.d.ts +54 -0
  131. package/esm/src/guardrails/live-outbound-gate.js +305 -0
  132. package/esm/src/guardrails/mod.d.ts +46 -0
  133. package/esm/src/guardrails/mod.js +29 -0
  134. package/esm/src/guardrails/network.d.ts +42 -0
  135. package/esm/src/guardrails/network.js +328 -0
  136. package/esm/src/guardrails/normalize.d.ts +6 -0
  137. package/esm/src/guardrails/normalize.js +132 -0
  138. package/esm/src/guardrails/policy.d.ts +19 -0
  139. package/esm/src/guardrails/policy.js +50 -0
  140. package/esm/src/guardrails/progressive-yield.d.ts +69 -0
  141. package/esm/src/guardrails/progressive-yield.js +237 -0
  142. package/esm/src/guardrails/prompt-echo.d.ts +38 -0
  143. package/esm/src/guardrails/prompt-echo.js +225 -0
  144. package/esm/src/guardrails/quota.d.ts +20 -0
  145. package/esm/src/guardrails/quota.js +80 -0
  146. package/esm/src/guardrails/rules.d.ts +56 -0
  147. package/esm/src/guardrails/rules.js +54 -0
  148. package/esm/src/guardrails/sanitize.d.ts +23 -0
  149. package/esm/src/guardrails/sanitize.js +184 -0
  150. package/esm/src/guardrails/sensitive.d.ts +29 -0
  151. package/esm/src/guardrails/sensitive.js +113 -0
  152. package/esm/src/guardrails/serialize.d.ts +14 -0
  153. package/esm/src/guardrails/serialize.js +37 -0
  154. package/esm/src/guardrails/testing.d.ts +9 -0
  155. package/esm/src/guardrails/testing.js +8 -0
  156. package/esm/src/guardrails/theorem-error.d.ts +18 -0
  157. package/esm/src/guardrails/theorem-error.js +53 -0
  158. package/esm/src/guardrails/thought-guard.d.ts +55 -0
  159. package/esm/src/guardrails/thought-guard.js +464 -0
  160. package/esm/src/guardrails/tool-directives.d.ts +19 -0
  161. package/esm/src/guardrails/tool-directives.js +109 -0
  162. package/esm/src/guardrails/tool-result.d.ts +61 -0
  163. package/esm/src/guardrails/tool-result.js +248 -0
  164. package/esm/src/guardrails/types.d.ts +242 -0
  165. package/esm/src/guardrails/types.js +54 -0
  166. package/esm/src/host/client-turn.d.ts +9 -0
  167. package/esm/src/host/client-turn.js +38 -0
  168. package/esm/src/host/mint-trace.d.ts +28 -0
  169. package/esm/src/host/mint-trace.js +59 -0
  170. package/esm/src/host/mod.d.ts +13 -0
  171. package/esm/src/host/mod.js +11 -0
  172. package/esm/src/host/readStreamingJsonStringField.d.ts +2 -0
  173. package/esm/src/host/readStreamingJsonStringField.js +68 -0
  174. package/esm/src/host/reply.d.ts +7 -0
  175. package/esm/src/host/reply.js +35 -0
  176. package/esm/src/interface/blocks.d.ts +8 -0
  177. package/esm/src/interface/blocks.js +213 -0
  178. package/esm/src/interface/composer-actions.d.ts +20 -0
  179. package/esm/src/interface/composer-actions.js +31 -0
  180. package/esm/src/interface/draft.d.ts +14 -0
  181. package/esm/src/interface/draft.js +28 -0
  182. package/esm/src/interface/from-profile.d.ts +12 -0
  183. package/esm/src/interface/from-profile.js +144 -0
  184. package/esm/src/interface/history.d.ts +40 -0
  185. package/esm/src/interface/history.js +269 -0
  186. package/esm/src/interface/inputs.d.ts +10 -0
  187. package/esm/src/interface/inputs.js +64 -0
  188. package/esm/src/interface/mod.d.ts +31 -0
  189. package/esm/src/interface/mod.js +21 -0
  190. package/esm/src/interface/models.d.ts +19 -0
  191. package/esm/src/interface/models.js +45 -0
  192. package/esm/src/interface/pending.d.ts +48 -0
  193. package/esm/src/interface/pending.js +146 -0
  194. package/esm/src/interface/profile-interface.d.ts +4 -0
  195. package/esm/src/interface/profile-interface.js +223 -0
  196. package/esm/src/interface/session.d.ts +64 -0
  197. package/esm/src/interface/session.js +121 -0
  198. package/esm/src/interface/tool-calls.d.ts +20 -0
  199. package/esm/src/interface/tool-calls.js +73 -0
  200. package/esm/src/interface/tool-invoke.d.ts +4 -0
  201. package/esm/src/interface/tool-invoke.js +20 -0
  202. package/esm/src/interface/tool-media.d.ts +9 -0
  203. package/esm/src/interface/tool-media.js +112 -0
  204. package/esm/src/interface/types.d.ts +213 -0
  205. package/esm/src/interface/types.js +4 -0
  206. package/esm/src/kernel/auth/credential-source.d.ts +23 -0
  207. package/esm/src/kernel/auth/credential-source.js +11 -0
  208. package/esm/src/kernel/auth/crypto.d.ts +51 -0
  209. package/esm/src/kernel/auth/crypto.js +161 -0
  210. package/esm/src/kernel/auth/mod.d.ts +5 -0
  211. package/esm/src/kernel/auth/mod.js +5 -0
  212. package/esm/src/kernel/auth/oauth.d.ts +17 -0
  213. package/esm/src/kernel/auth/oauth.js +438 -0
  214. package/esm/src/kernel/auth/scope-refusal.d.ts +9 -0
  215. package/esm/src/kernel/auth/scope-refusal.js +8 -0
  216. package/esm/src/kernel/auth/typed-secret.d.ts +13 -0
  217. package/esm/src/kernel/auth/typed-secret.js +23 -0
  218. package/esm/src/kernel/auth/types.d.ts +139 -0
  219. package/esm/src/kernel/auth/types.js +1 -0
  220. package/esm/src/kernel/default-scope.d.ts +34 -0
  221. package/esm/src/kernel/default-scope.js +72 -0
  222. package/esm/src/kernel/engine/compaction.d.ts +70 -0
  223. package/esm/src/kernel/engine/compaction.js +202 -0
  224. package/esm/src/kernel/engine/decision.d.ts +41 -0
  225. package/esm/src/kernel/engine/decision.js +412 -0
  226. package/esm/src/kernel/engine/hash.d.ts +6 -0
  227. package/esm/src/kernel/engine/hash.js +22 -0
  228. package/esm/src/kernel/engine/live-inbound.d.ts +9 -0
  229. package/esm/src/kernel/engine/live-inbound.js +19 -0
  230. package/esm/src/kernel/engine/live-ingress.d.ts +9 -0
  231. package/esm/src/kernel/engine/live-ingress.js +37 -0
  232. package/esm/src/kernel/engine/media-probe/audio.d.ts +7 -0
  233. package/esm/src/kernel/engine/media-probe/audio.js +342 -0
  234. package/esm/src/kernel/engine/media-probe/bytes.d.ts +6 -0
  235. package/esm/src/kernel/engine/media-probe/bytes.js +26 -0
  236. package/esm/src/kernel/engine/media-probe/image.d.ts +5 -0
  237. package/esm/src/kernel/engine/media-probe/image.js +171 -0
  238. package/esm/src/kernel/engine/media-probe/iso-bmff.d.ts +19 -0
  239. package/esm/src/kernel/engine/media-probe/iso-bmff.js +48 -0
  240. package/esm/src/kernel/engine/media-probe/matroska.d.ts +35 -0
  241. package/esm/src/kernel/engine/media-probe/matroska.js +226 -0
  242. package/esm/src/kernel/engine/media-probe/mp4.d.ts +22 -0
  243. package/esm/src/kernel/engine/media-probe/mp4.js +279 -0
  244. package/esm/src/kernel/engine/media-probe/opus.d.ts +4 -0
  245. package/esm/src/kernel/engine/media-probe/opus.js +23 -0
  246. package/esm/src/kernel/engine/media-probe/pdf.d.ts +5 -0
  247. package/esm/src/kernel/engine/media-probe/pdf.js +117 -0
  248. package/esm/src/kernel/engine/media-probe/video.d.ts +15 -0
  249. package/esm/src/kernel/engine/media-probe/video.js +49 -0
  250. package/esm/src/kernel/engine/record.d.ts +3 -0
  251. package/esm/src/kernel/engine/record.js +11 -0
  252. package/esm/src/kernel/engine/repair.d.ts +7 -0
  253. package/esm/src/kernel/engine/repair.js +36 -0
  254. package/esm/src/kernel/engine/runner/gates.d.ts +5 -0
  255. package/esm/src/kernel/engine/runner/gates.js +322 -0
  256. package/esm/src/kernel/engine/runner/mod.d.ts +15 -0
  257. package/esm/src/kernel/engine/runner/mod.js +574 -0
  258. package/esm/src/kernel/engine/runner/schema-validation.d.ts +14 -0
  259. package/esm/src/kernel/engine/runner/schema-validation.js +105 -0
  260. package/esm/src/kernel/engine/runner/stages.d.ts +28 -0
  261. package/esm/src/kernel/engine/runner/stages.js +48 -0
  262. package/esm/src/kernel/engine/runner/state.d.ts +76 -0
  263. package/esm/src/kernel/engine/runner/state.js +40 -0
  264. package/esm/src/kernel/engine/runner/steps.d.ts +14 -0
  265. package/esm/src/kernel/engine/runner/steps.js +360 -0
  266. package/esm/src/kernel/engine/runner/stream.d.ts +40 -0
  267. package/esm/src/kernel/engine/runner/stream.js +225 -0
  268. package/esm/src/kernel/engine/runner/usage.d.ts +45 -0
  269. package/esm/src/kernel/engine/runner/usage.js +150 -0
  270. package/esm/src/kernel/engine/session/mod.d.ts +31 -0
  271. package/esm/src/kernel/engine/session/mod.js +951 -0
  272. package/esm/src/kernel/engine/session/session-trace.d.ts +115 -0
  273. package/esm/src/kernel/engine/session/session-trace.js +489 -0
  274. package/esm/src/kernel/engine/token-estimate.d.ts +77 -0
  275. package/esm/src/kernel/engine/token-estimate.js +218 -0
  276. package/esm/src/kernel/engine/tool-trace.d.ts +58 -0
  277. package/esm/src/kernel/engine/tool-trace.js +131 -0
  278. package/esm/src/kernel/engine/tree.d.ts +2 -0
  279. package/esm/src/kernel/engine/tree.js +17 -0
  280. package/esm/src/kernel/engine/turn-trace.d.ts +118 -0
  281. package/esm/src/kernel/engine/turn-trace.js +863 -0
  282. package/esm/src/kernel/engine/usage.d.ts +30 -0
  283. package/esm/src/kernel/engine/usage.js +134 -0
  284. package/esm/src/kernel/interaction-parts.d.ts +10 -0
  285. package/esm/src/kernel/interaction-parts.js +22 -0
  286. package/esm/src/kernel/mod.d.ts +47 -0
  287. package/esm/src/kernel/mod.js +30 -0
  288. package/esm/src/kernel/profile-graph.d.ts +140 -0
  289. package/esm/src/kernel/profile-graph.js +151 -0
  290. package/esm/src/kernel/profile-presence.d.ts +9 -0
  291. package/esm/src/kernel/profile-presence.js +143 -0
  292. package/esm/src/kernel/profile-scope.d.ts +36 -0
  293. package/esm/src/kernel/profile-scope.js +262 -0
  294. package/esm/src/kernel/registry/attachments.d.ts +35 -0
  295. package/esm/src/kernel/registry/attachments.js +211 -0
  296. package/esm/src/kernel/registry/catalog.d.ts +19 -0
  297. package/esm/src/kernel/registry/catalog.js +78 -0
  298. package/esm/src/kernel/registry/ingress.d.ts +8 -0
  299. package/esm/src/kernel/registry/ingress.js +134 -0
  300. package/esm/src/kernel/registry/kernel-registry.d.ts +12 -0
  301. package/esm/src/kernel/registry/kernel-registry.js +8 -0
  302. package/esm/src/kernel/registry/profile-outputs.d.ts +3 -0
  303. package/esm/src/kernel/registry/profile-outputs.js +7 -0
  304. package/esm/src/kernel/registry/profiles.d.ts +92 -0
  305. package/esm/src/kernel/registry/profiles.js +698 -0
  306. package/esm/src/kernel/registry/provider-request.d.ts +6 -0
  307. package/esm/src/kernel/registry/provider-request.js +42 -0
  308. package/esm/src/kernel/registry/resolve.d.ts +14 -0
  309. package/esm/src/kernel/registry/resolve.js +237 -0
  310. package/esm/src/kernel/registry/schemas.d.ts +9 -0
  311. package/esm/src/kernel/registry/schemas.js +25 -0
  312. package/esm/src/kernel/registry/sole-model.d.ts +2 -0
  313. package/esm/src/kernel/registry/sole-model.js +4 -0
  314. package/esm/src/kernel/registry/system-prompt.d.ts +8 -0
  315. package/esm/src/kernel/registry/system-prompt.js +33 -0
  316. package/esm/src/kernel/registry/system-role.d.ts +3 -0
  317. package/esm/src/kernel/registry/system-role.js +9 -0
  318. package/esm/src/kernel/registry/vault.d.ts +13 -0
  319. package/esm/src/kernel/registry/vault.js +14 -0
  320. package/esm/src/kernel/schema.d.ts +172 -0
  321. package/esm/src/kernel/schema.js +653 -0
  322. package/esm/src/kernel/scope.d.ts +22 -0
  323. package/esm/src/kernel/scope.js +25 -0
  324. package/esm/src/kernel/stages.d.ts +141 -0
  325. package/esm/src/kernel/stages.js +388 -0
  326. package/esm/src/kernel/stop.d.ts +93 -0
  327. package/esm/src/kernel/stop.js +125 -0
  328. package/esm/src/kernel/system-parts.d.ts +26 -0
  329. package/esm/src/kernel/system-parts.js +98 -0
  330. package/esm/src/kernel/tools/activity-label.d.ts +16 -0
  331. package/esm/src/kernel/tools/activity-label.js +209 -0
  332. package/esm/src/kernel/tools/events.d.ts +51 -0
  333. package/esm/src/kernel/tools/events.js +149 -0
  334. package/esm/src/kernel/tools/execute.d.ts +64 -0
  335. package/esm/src/kernel/tools/execute.js +801 -0
  336. package/esm/src/kernel/tools/gate-answer.d.ts +50 -0
  337. package/esm/src/kernel/tools/gate-answer.js +54 -0
  338. package/esm/src/kernel/tools/harness.d.ts +16 -0
  339. package/esm/src/kernel/tools/harness.js +42 -0
  340. package/esm/src/kernel/tools/invoke.d.ts +10 -0
  341. package/esm/src/kernel/tools/invoke.js +129 -0
  342. package/esm/src/kernel/tools/mcp-sessions.d.ts +20 -0
  343. package/esm/src/kernel/tools/mcp-sessions.js +64 -0
  344. package/esm/src/kernel/tools/mod.d.ts +9 -0
  345. package/esm/src/kernel/tools/mod.js +6 -0
  346. package/esm/src/kernel/tools/model-text.d.ts +11 -0
  347. package/esm/src/kernel/tools/model-text.js +25 -0
  348. package/esm/src/kernel/tools/permission.d.ts +6 -0
  349. package/esm/src/kernel/tools/permission.js +38 -0
  350. package/esm/src/kernel/tools/project.d.ts +8 -0
  351. package/esm/src/kernel/tools/project.js +25 -0
  352. package/esm/src/kernel/tools/registry.d.ts +20 -0
  353. package/esm/src/kernel/tools/registry.js +84 -0
  354. package/esm/src/kernel/tools/remote.d.ts +110 -0
  355. package/esm/src/kernel/tools/remote.js +998 -0
  356. package/esm/src/kernel/tools/resolve.d.ts +28 -0
  357. package/esm/src/kernel/tools/resolve.js +259 -0
  358. package/esm/src/kernel/tools/schema.d.ts +10 -0
  359. package/esm/src/kernel/tools/schema.js +174 -0
  360. package/esm/src/kernel/tools/signed-in-fetch.d.ts +18 -0
  361. package/esm/src/kernel/tools/signed-in-fetch.js +45 -0
  362. package/esm/src/kernel/tools/stage-run.d.ts +93 -0
  363. package/esm/src/kernel/tools/stage-run.js +140 -0
  364. package/esm/src/kernel/tools/types.d.ts +287 -0
  365. package/esm/src/kernel/tools/types.js +1 -0
  366. package/esm/src/kernel/turn-events.d.ts +599 -0
  367. package/esm/src/kernel/turn-events.js +425 -0
  368. package/esm/src/kernel/types.d.ts +884 -0
  369. package/esm/src/kernel/types.js +1 -0
  370. package/esm/src/kernel/util/base64.d.ts +2 -0
  371. package/esm/src/kernel/util/base64.js +13 -0
  372. package/esm/src/kernel/util/exact-type.d.ts +31 -0
  373. package/esm/src/kernel/util/exact-type.js +1 -0
  374. package/esm/src/kernel/util/find-last.d.ts +3 -0
  375. package/esm/src/kernel/util/find-last.js +9 -0
  376. package/esm/src/kernel/util/mime.d.ts +2 -0
  377. package/esm/src/kernel/util/mime.js +4 -0
  378. package/esm/src/kernel/util/record.d.ts +1 -0
  379. package/esm/src/kernel/util/record.js +3 -0
  380. package/esm/src/observability/destinations.d.ts +9 -0
  381. package/esm/src/observability/destinations.js +38 -0
  382. package/esm/src/observability/jsonl.d.ts +18 -0
  383. package/esm/src/observability/jsonl.js +117 -0
  384. package/esm/src/observability/mod.d.ts +22 -0
  385. package/esm/src/observability/mod.js +16 -0
  386. package/esm/src/observability/openinference.d.ts +11 -0
  387. package/esm/src/observability/openinference.js +205 -0
  388. package/esm/src/observability/otlp.d.ts +68 -0
  389. package/esm/src/observability/otlp.js +98 -0
  390. package/esm/src/observability/phoenix.d.ts +29 -0
  391. package/esm/src/observability/phoenix.js +71 -0
  392. package/esm/src/observability/policy.d.ts +14 -0
  393. package/esm/src/observability/policy.js +69 -0
  394. package/esm/src/observability/resolve-policy.d.ts +8 -0
  395. package/esm/src/observability/resolve-policy.js +58 -0
  396. package/esm/src/observability/spans.d.ts +16 -0
  397. package/esm/src/observability/spans.js +56 -0
  398. package/esm/src/observability/trace-catalog.d.ts +111 -0
  399. package/esm/src/observability/trace-catalog.js +865 -0
  400. package/esm/src/observability/trace-record.d.ts +23 -0
  401. package/esm/src/observability/trace-record.js +223 -0
  402. package/esm/src/observability/trace-schema.d.ts +54 -0
  403. package/esm/src/observability/trace-schema.js +59 -0
  404. package/esm/src/observability/trace-sink.d.ts +13 -0
  405. package/esm/src/observability/trace-sink.js +3 -0
  406. package/esm/src/observability/trace-span.d.ts +92 -0
  407. package/esm/src/observability/trace-span.js +199 -0
  408. package/esm/src/observability/trace.d.ts +11 -0
  409. package/esm/src/observability/trace.js +35 -0
  410. package/esm/src/observability/types.d.ts +85 -0
  411. package/esm/src/observability/types.js +3 -0
  412. package/esm/src/presets/google/speech-voices.d.ts +8 -0
  413. package/esm/src/presets/google/speech-voices.js +38 -0
  414. package/esm/src/presets/google-limits.d.ts +12 -0
  415. package/esm/src/presets/google-limits.js +18 -0
  416. package/esm/src/presets/google.d.ts +104 -0
  417. package/esm/src/presets/google.js +188 -0
  418. package/esm/src/presets/mod.d.ts +10 -0
  419. package/esm/src/presets/mod.js +9 -0
  420. package/esm/src/presets/openrouter.d.ts +13 -0
  421. package/esm/src/presets/openrouter.js +13 -0
  422. package/esm/src/presets/typesafe.d.ts +2 -0
  423. package/esm/src/presets/typesafe.js +2 -0
  424. package/esm/src/providers/create-provider.d.ts +21 -0
  425. package/esm/src/providers/create-provider.js +90 -0
  426. package/esm/src/providers/decision/usage.d.ts +3 -0
  427. package/esm/src/providers/decision/usage.js +25 -0
  428. package/esm/src/providers/google/api-error.d.ts +8 -0
  429. package/esm/src/providers/google/api-error.js +123 -0
  430. package/esm/src/providers/google/grounding.d.ts +5 -0
  431. package/esm/src/providers/google/grounding.js +226 -0
  432. package/esm/src/providers/google/interactions/framing.d.ts +15 -0
  433. package/esm/src/providers/google/interactions/framing.js +263 -0
  434. package/esm/src/providers/google/interactions/mod.d.ts +2 -0
  435. package/esm/src/providers/google/interactions/mod.js +2 -0
  436. package/esm/src/providers/google/interactions/steps.d.ts +12 -0
  437. package/esm/src/providers/google/interactions/steps.js +200 -0
  438. package/esm/src/providers/google/interactions/stream.d.ts +24 -0
  439. package/esm/src/providers/google/interactions/stream.js +297 -0
  440. package/esm/src/providers/google/keys.d.ts +20 -0
  441. package/esm/src/providers/google/keys.js +87 -0
  442. package/esm/src/providers/google/live/framing.d.ts +51 -0
  443. package/esm/src/providers/google/live/framing.js +597 -0
  444. package/esm/src/providers/google/live/mod.d.ts +7 -0
  445. package/esm/src/providers/google/live/mod.js +7 -0
  446. package/esm/src/providers/google/live/openapi-schema.d.ts +1 -0
  447. package/esm/src/providers/google/live/openapi-schema.js +42 -0
  448. package/esm/src/providers/google/live/session.d.ts +14 -0
  449. package/esm/src/providers/google/live/session.js +150 -0
  450. package/esm/src/providers/google/live/stream.d.ts +51 -0
  451. package/esm/src/providers/google/live/stream.js +263 -0
  452. package/esm/src/providers/google/thinking.d.ts +3 -0
  453. package/esm/src/providers/google/thinking.js +8 -0
  454. package/esm/src/providers/google/urls.d.ts +6 -0
  455. package/esm/src/providers/google/urls.js +6 -0
  456. package/esm/src/providers/google/usage.d.ts +7 -0
  457. package/esm/src/providers/google/usage.js +49 -0
  458. package/esm/src/providers/local/local.d.ts +12 -0
  459. package/esm/src/providers/local/local.js +186 -0
  460. package/esm/src/providers/local/mod.d.ts +8 -0
  461. package/esm/src/providers/local/mod.js +8 -0
  462. package/esm/src/providers/mod.d.ts +11 -0
  463. package/esm/src/providers/mod.js +7 -0
  464. package/esm/src/providers/openrouter/cache-control.d.ts +5 -0
  465. package/esm/src/providers/openrouter/cache-control.js +4 -0
  466. package/esm/src/providers/openrouter/chat.d.ts +64 -0
  467. package/esm/src/providers/openrouter/chat.js +490 -0
  468. package/esm/src/providers/openrouter/image.d.ts +24 -0
  469. package/esm/src/providers/openrouter/image.js +187 -0
  470. package/esm/src/providers/openrouter/openai/compat.d.ts +19 -0
  471. package/esm/src/providers/openrouter/openai/compat.js +162 -0
  472. package/esm/src/providers/openrouter/openai/image-payload.d.ts +9 -0
  473. package/esm/src/providers/openrouter/openai/image-payload.js +115 -0
  474. package/esm/src/providers/openrouter/openai/sdk-messages.d.ts +10 -0
  475. package/esm/src/providers/openrouter/openai/sdk-messages.js +99 -0
  476. package/esm/src/providers/openrouter/openai/usage.d.ts +8 -0
  477. package/esm/src/providers/openrouter/openai/usage.js +56 -0
  478. package/esm/src/providers/openrouter/resolve-api-key.d.ts +3 -0
  479. package/esm/src/providers/openrouter/resolve-api-key.js +8 -0
  480. package/esm/src/providers/openrouter/speech.d.ts +18 -0
  481. package/esm/src/providers/openrouter/speech.js +109 -0
  482. package/esm/src/providers/probe.d.ts +5 -0
  483. package/esm/src/providers/probe.js +15 -0
  484. package/esm/src/providers/shared/builtin-wire.d.ts +4 -0
  485. package/esm/src/providers/shared/builtin-wire.js +9 -0
  486. package/esm/src/providers/shared/pcm.d.ts +14 -0
  487. package/esm/src/providers/shared/pcm.js +78 -0
  488. package/esm/src/providers/shared/response-identity.d.ts +11 -0
  489. package/esm/src/providers/shared/response-identity.js +12 -0
  490. package/esm/src/providers/shared/sse.d.ts +10 -0
  491. package/esm/src/providers/shared/sse.js +79 -0
  492. package/esm/src/providers/shared/structured-output.d.ts +4 -0
  493. package/esm/src/providers/shared/structured-output.js +11 -0
  494. package/esm/src/providers/shared/tool-args.d.ts +25 -0
  495. package/esm/src/providers/shared/tool-args.js +84 -0
  496. package/esm/src/providers/shared/upstream-tap.d.ts +8 -0
  497. package/esm/src/providers/shared/upstream-tap.js +85 -0
  498. package/esm/src/providers/shared/upstream-tape.d.ts +6 -0
  499. package/esm/src/providers/shared/upstream-tape.js +88 -0
  500. package/esm/src/providers/shared/vault.d.ts +13 -0
  501. package/esm/src/providers/shared/vault.js +41 -0
  502. package/esm/src/providers/types.d.ts +19 -0
  503. package/esm/src/providers/types.js +1 -0
  504. package/esm/src/surface/formats.d.ts +28 -0
  505. package/esm/src/surface/formats.js +139 -0
  506. package/esm/src/surface/mod.d.ts +14 -0
  507. package/esm/src/surface/mod.js +10 -0
  508. package/esm/src/surface/runtime.d.ts +40 -0
  509. package/esm/src/surface/runtime.js +439 -0
  510. package/esm/src/surface/tools.d.ts +15 -0
  511. package/esm/src/surface/tools.js +80 -0
  512. package/esm/src/surface/types.d.ts +104 -0
  513. package/esm/src/surface/types.js +4 -0
  514. package/package.json +108 -4
@@ -0,0 +1,50 @@
1
+ import type { ApiKeyCredential, BearerCredential } from '../auth/types.js';
2
+ import type { ToolPermission } from '../schema.js';
3
+ import type { ToolAuthChallenge } from '../turn-events.js';
4
+ import type { InvokeToolResume } from './types.js';
5
+ /** What a sign-in gate asks for, minus the challenge's OAuth details. */
6
+ export type ToolGateAuth = Pick<ToolAuthChallenge, 'slot' | 'authType' | 'service'>;
7
+ /** A bad value is refused when `owner` is built, not when a gate expires. */
8
+ export declare function resolveGateTtlMs(owner: string, gateTtlMs: number | undefined): number;
9
+ export declare function gateExpired(createdAt: number, now: number, ttlMs: number): boolean;
10
+ export declare const GATE_DECISIONS: readonly ["approve", "deny", "abandon"];
11
+ export type GateDecision = (typeof GATE_DECISIONS)[number];
12
+ /** `edited.from` is the input the model proposed. */
13
+ export type GateAnswer = {
14
+ decision: 'approve';
15
+ edited?: {
16
+ from: Record<string, unknown>;
17
+ };
18
+ } | {
19
+ decision: 'deny' | 'abandon';
20
+ };
21
+ /** `signIn` when the gate answered is a sign-in, so a refusal tells the model so. */
22
+ export declare function resumeForAnswer(answer: GateAnswer, signIn?: boolean): InvokeToolResume;
23
+ /** Only a `session_consent` approval lasts the session; any other gate is approved for this call only. */
24
+ export declare function sessionPermissionsAfterApproval(sessionPermissions: readonly string[], toolName: string, permission?: ToolPermission): string[];
25
+ export type GateAnswerRequest = {
26
+ callId: string;
27
+ decision: GateDecision;
28
+ /** The user's edit; approvals only. */
29
+ input?: unknown;
30
+ /** The key typed at a sign-in gate; approvals only. */
31
+ secret?: string;
32
+ };
33
+ export type HeldGatedCall = {
34
+ name: string;
35
+ arguments: Record<string, unknown>;
36
+ permission?: ToolPermission;
37
+ /** Absent on any gate other than sign-in. */
38
+ auth?: ToolGateAuth;
39
+ };
40
+ export type AnsweredGate = {
41
+ resume: InvokeToolResume;
42
+ input: unknown;
43
+ sessionPermissions: string[];
44
+ typed?: {
45
+ slot: string;
46
+ credential: BearerCredential | ApiKeyCredential;
47
+ };
48
+ };
49
+ /** Shared by `createTheoremHandler` and `runSession`. A refused key throws, so the gate keeps waiting for another. */
50
+ export declare function answerGatedCall(request: GateAnswerRequest, call: HeldGatedCall, sessionPermissions: readonly string[]): AnsweredGate;
@@ -0,0 +1,54 @@
1
+ import { TheoremError } from '../../guardrails/error.js';
2
+ import { credentialForSignInGate } from '../auth/typed-secret.js';
3
+ const DEFAULT_GATE_TTL_MS = 30 * 60 * 1000;
4
+ /** A bad value is refused when `owner` is built, not when a gate expires. */
5
+ export function resolveGateTtlMs(owner, gateTtlMs) {
6
+ const ttl = gateTtlMs ?? DEFAULT_GATE_TTL_MS;
7
+ if (!Number.isFinite(ttl) || ttl <= 0) {
8
+ throw new TheoremError('config', `${owner} gateTtlMs must be a positive number of milliseconds; got ${ttl}.`);
9
+ }
10
+ return ttl;
11
+ }
12
+ export function gateExpired(createdAt, now, ttlMs) {
13
+ return now - createdAt >= ttlMs;
14
+ }
15
+ export const GATE_DECISIONS = ['approve', 'deny', 'abandon'];
16
+ /** `signIn` when the gate answered is a sign-in, so a refusal tells the model so. */
17
+ export function resumeForAnswer(answer, signIn = false) {
18
+ if (answer.decision === 'approve') {
19
+ return answer.edited ? { granted: true, edited: answer.edited } : { granted: true };
20
+ }
21
+ return {
22
+ granted: false,
23
+ cause: answer.decision === 'deny' ? 'declined' : 'abandoned',
24
+ ...(signIn ? { signIn } : {}),
25
+ };
26
+ }
27
+ /** Only a `session_consent` approval lasts the session; any other gate is approved for this call only. */
28
+ export function sessionPermissionsAfterApproval(sessionPermissions, toolName, permission) {
29
+ if (permission !== 'session_consent' || sessionPermissions.includes(toolName)) {
30
+ return [...sessionPermissions];
31
+ }
32
+ return [...sessionPermissions, toolName];
33
+ }
34
+ /** Shared by `createTheoremHandler` and `runSession`. A refused key throws, so the gate keeps waiting for another. */
35
+ export function answerGatedCall(request, call, sessionPermissions) {
36
+ const { callId, decision, input, secret } = request;
37
+ if ((input !== undefined || secret !== undefined) && decision !== 'approve') {
38
+ throw new TheoremError('request', `only an approval takes edited input or a secret (call ${callId})`);
39
+ }
40
+ if (decision !== 'approve') {
41
+ return {
42
+ resume: resumeForAnswer({ decision }, call.auth !== undefined),
43
+ input: call.arguments,
44
+ sessionPermissions: [...sessionPermissions],
45
+ };
46
+ }
47
+ const typed = secret === undefined ? undefined : credentialForSignInGate(call.auth, secret);
48
+ return {
49
+ resume: resumeForAnswer(input === undefined ? { decision } : { decision, edited: { from: call.arguments } }),
50
+ input: input ?? call.arguments,
51
+ sessionPermissions: sessionPermissionsAfterApproval(sessionPermissions, call.name, call.permission),
52
+ ...(typed ? { typed } : {}),
53
+ };
54
+ }
@@ -0,0 +1,16 @@
1
+ import { AWAITING_USER_INPUT_STATUS } from '../schema.js';
2
+ import type { ToolDefinitionInput } from './types.js';
3
+ type AskKind = 'confirm' | 'choice' | 'text';
4
+ type AskInput = {
5
+ kind: AskKind;
6
+ prompt: string;
7
+ options?: string[];
8
+ };
9
+ type AskOutput = AskInput & {
10
+ status: typeof AWAITING_USER_INPUT_STATUS;
11
+ };
12
+ /** A scope of its own registers it with `tools.register`. */
13
+ declare const askUserTool: ToolDefinitionInput<AskInput, AskOutput>;
14
+ declare function registerHarnessTools(): void;
15
+ export type { AskInput, AskKind, AskOutput };
16
+ export { askUserTool, registerHarnessTools };
@@ -0,0 +1,42 @@
1
+ import { z } from 'zod';
2
+ import { registerTool } from '../default-scope.js';
3
+ import { AWAITING_USER_INPUT_STATUS } from '../schema.js';
4
+ const AskInputSchema = z.object({
5
+ kind: z.enum(['confirm', 'choice', 'text']),
6
+ prompt: z.string().trim().min(1),
7
+ options: z.array(z.string()).optional(),
8
+ });
9
+ const AskOutputSchema = z.object({
10
+ status: z.literal(AWAITING_USER_INPUT_STATUS),
11
+ kind: z.enum(['confirm', 'choice', 'text']),
12
+ prompt: z.string().trim().min(1),
13
+ options: z.array(z.string()).optional(),
14
+ });
15
+ /** A scope of its own registers it with `tools.register`. */
16
+ const askUserTool = {
17
+ type: 'function',
18
+ name: 'ask_user',
19
+ description: 'Ask the user a question (completes with awaiting_user_input)', // lexicon-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
20
+ category: 'conversation',
21
+ access: 'read-only',
22
+ paths: ['*'],
23
+ loadTier: 'T0',
24
+ permission: 'auto',
25
+ input: AskInputSchema,
26
+ output: AskOutputSchema,
27
+ handler: (input) => {
28
+ const out = {
29
+ status: AWAITING_USER_INPUT_STATUS,
30
+ kind: input.kind,
31
+ prompt: input.prompt,
32
+ };
33
+ if (input.kind === 'choice' && input.options?.length) {
34
+ out.options = input.options;
35
+ }
36
+ return out;
37
+ },
38
+ };
39
+ function registerHarnessTools() {
40
+ registerTool(askUserTool);
41
+ }
42
+ export { askUserTool, registerHarnessTools };
@@ -0,0 +1,10 @@
1
+ import type { TraceSink } from '../../observability/trace-sink.js';
2
+ import type { KernelRegistry } from '../registry/kernel-registry.js';
3
+ import type { TurnEvent } from '../types.js';
4
+ import type { InvokeToolRequest } from './types.js';
5
+ /**
6
+ * The trace record is written however the call ends, including an early stop or a failure before
7
+ * the tool. An unknown profile is recorded under the standard observability policy: there is none to read.
8
+ */
9
+ declare function invokeTool(registry: KernelRegistry, request: InvokeToolRequest, sinkOverride?: TraceSink): AsyncGenerator<TurnEvent>;
10
+ export { invokeTool };
@@ -0,0 +1,129 @@
1
+ import { isAbortError, TheoremError, toErrorEvent, withPublicWording, } from '../../guardrails/error.js';
2
+ import { resolveTraceWriter } from '../../observability/policy.js';
3
+ import { writeSpans } from '../../observability/trace.js';
4
+ import { startTrace, } from '../../observability/trace-span.js';
5
+ import { startToolTrace, toolSpanName } from '../engine/tool-trace.js';
6
+ import { optional, traceLinks } from '../engine/turn-trace.js';
7
+ import { pickModel } from '../registry/resolve.js';
8
+ import { turnDoneOf } from '../turn-events.js';
9
+ import { failureEvent, newCallId, toolCallArguments, toolCallRequestEvent } from './events.js';
10
+ import { executeRegisteredTool } from './execute.js';
11
+ import { cloneTurnToolSnapshot, prepareTurnToolSnapshot, promoteLoadedTools } from './resolve.js';
12
+ import { plainToolInput } from './schema.js';
13
+ function turnRequestFromInvoke(request) {
14
+ return {
15
+ profile: request.profile,
16
+ path: request.path,
17
+ sessionPermissions: request.sessionPermissions,
18
+ input: request.turnInput,
19
+ model: request.model,
20
+ host: request.host,
21
+ };
22
+ }
23
+ async function prepareInvokeSnapshot(registry, request, profile) {
24
+ const req = turnRequestFromInvoke(request);
25
+ if (profile.type === 'decision') {
26
+ throw new TheoremError('request', `Profile ${profile.id}: type 'decision' cannot invoke tools`); // lexicon-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
27
+ }
28
+ const model = profile.type === 'host' ? undefined : pickModel(profile, request.model);
29
+ return await prepareTurnToolSnapshot(registry.tools, profile, req, model);
30
+ }
31
+ /**
32
+ * The trace record is written however the call ends, including an early stop or a failure before
33
+ * the tool. An unknown profile is recorded under the standard observability policy: there is none to read.
34
+ */
35
+ async function* invokeTool(registry, request, sinkOverride) {
36
+ const known = registry.profiles.find(request.profile);
37
+ const { sink, policy } = resolveTraceWriter({
38
+ override: sinkOverride,
39
+ observability: known?.observability,
40
+ });
41
+ const callId = request.callId ?? newCallId(request.name);
42
+ const tree = startTrace(toolSpanName(request.name), {
43
+ attributes: {
44
+ 'gen_ai.agent.name': request.profile,
45
+ ...optional('gen_ai.conversation.id', request.conversationId),
46
+ },
47
+ links: traceLinks(request.links),
48
+ ...(request.traceparent ? { traceparent: request.traceparent } : {}),
49
+ });
50
+ const openSpan = (_name, attributes) => {
51
+ tree.root.set(attributes);
52
+ return tree.root;
53
+ };
54
+ const failBeforeTool = (end) => startToolTrace(openSpan, {
55
+ name: request.name,
56
+ callId,
57
+ call: { arguments: toolCallArguments(plainToolInput(request.input)) },
58
+ }).end(end);
59
+ try {
60
+ const lexicon = known?.lexicon;
61
+ const traceparent = tree.root.traceparent();
62
+ for await (const event of invokeTraced(registry, request, callId, openSpan, failBeforeTool, traceparent)) {
63
+ yield withPublicWording(event, lexicon);
64
+ }
65
+ }
66
+ catch (err) {
67
+ failBeforeTool(isAbortError(err) ? { outcome: 'cancelled' } : { outcome: 'error', thrown: err });
68
+ throw err;
69
+ }
70
+ finally {
71
+ await writeSpans(sink, tree.collect(), policy, request.metadata);
72
+ }
73
+ }
74
+ async function* invokeTraced(registry, request, callId, openSpan, failBeforeTool, traceparent) {
75
+ const profile = registry.profiles.get(request.profile);
76
+ const snapshot = request.snapshot
77
+ ? cloneTurnToolSnapshot(request.snapshot)
78
+ : await prepareInvokeSnapshot(registry, request, profile);
79
+ // A model's call was already announced by its turn.
80
+ if (request.callId === undefined) {
81
+ yield toolCallRequestEvent({ name: request.name, callId }, toolCallArguments(request.input));
82
+ }
83
+ if (request.promoted?.length) {
84
+ const { failure } = promoteLoadedTools(registry.tools, snapshot, request.promoted, profile);
85
+ if (failure) {
86
+ failBeforeTool({ outcome: 'error', failure });
87
+ yield failureEvent({ name: request.name, callId }, failure);
88
+ yield { type: 'done', stop: { kind: 'completed' }, traceparent };
89
+ return;
90
+ }
91
+ }
92
+ let gated = false;
93
+ try {
94
+ const handlers = request.onStage ? [request.onStage] : [];
95
+ const settlement = yield* executeRegisteredTool({
96
+ tools: registry.tools,
97
+ profile,
98
+ name: request.name,
99
+ input: request.input,
100
+ callId,
101
+ ctx: {
102
+ sessionPermissions: request.sessionPermissions,
103
+ credentials: request.credentials,
104
+ resolveHost: request.resolveHost,
105
+ path: request.path,
106
+ signal: request.signal,
107
+ resume: request.resume,
108
+ host: request.host,
109
+ },
110
+ snapshot,
111
+ openSpan,
112
+ stages: {
113
+ handlers,
114
+ profile,
115
+ step: 1,
116
+ history: () => [],
117
+ injectAllowed: false,
118
+ host: request.host,
119
+ signal: request.signal,
120
+ },
121
+ });
122
+ gated = settlement.gated !== undefined;
123
+ }
124
+ catch (err) {
125
+ yield toErrorEvent(err);
126
+ }
127
+ yield turnDoneOf({ stop: { kind: gated ? 'gate' : 'completed' }, traceparent }, snapshot);
128
+ }
129
+ export { invokeTool };
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Sessions for MCP servers that refuse a call without one. A session is a cache, not state: it
3
+ * lives in memory on one tool registry, is never persisted, and losing it costs one reopen.
4
+ */
5
+ export type McpSession = {
6
+ id: string;
7
+ protocolVersion: string;
8
+ };
9
+ export interface McpSessionCache {
10
+ get(key: string): McpSession | undefined;
11
+ /** Parallel callers for one key share a single `open`. */
12
+ open(key: string, open: () => Promise<McpSession>): Promise<McpSession>;
13
+ /** Only drops the session if it's still `id`, so a late expiry can't evict a newer one. */
14
+ drop(key: string, id: string): void;
15
+ clear(): void;
16
+ }
17
+ export declare function createMcpSessionCache(now?: () => number): McpSessionCache;
18
+ export declare function isMcpSessionId(value: string | null): value is string;
19
+ /** One session per server and credential; the credential is hashed, never kept. */
20
+ export declare function mcpSessionKey(url: string, headers: Record<string, string>): Promise<string>;
@@ -0,0 +1,64 @@
1
+ /**
2
+ * Sessions for MCP servers that refuse a call without one. A session is a cache, not state: it
3
+ * lives in memory on one tool registry, is never persisted, and losing it costs one reopen.
4
+ */
5
+ const MAX_SESSIONS = 256;
6
+ const IDLE_MS = 30 * 60 * 1000;
7
+ // The spec allows visible ASCII only; the cap keeps a server from bloating every later request.
8
+ const SESSION_ID = /^[\x21-\x7E]{1,256}$/;
9
+ export function createMcpSessionCache(now = Date.now) {
10
+ const sessions = new Map();
11
+ const pending = new Map();
12
+ return {
13
+ get(key) {
14
+ const entry = sessions.get(key);
15
+ if (!entry)
16
+ return undefined;
17
+ sessions.delete(key);
18
+ if (now() - entry.usedAt > IDLE_MS)
19
+ return undefined;
20
+ // Re-inserting keeps the map in least-recently-used order for eviction.
21
+ sessions.set(key, { ...entry, usedAt: now() });
22
+ return { id: entry.id, protocolVersion: entry.protocolVersion };
23
+ },
24
+ open(key, open) {
25
+ const inFlight = pending.get(key);
26
+ if (inFlight)
27
+ return inFlight;
28
+ const opening = open()
29
+ .then((session) => {
30
+ sessions.delete(key);
31
+ sessions.set(key, { ...session, usedAt: now() });
32
+ for (const oldest of sessions.keys()) {
33
+ if (sessions.size <= MAX_SESSIONS)
34
+ break;
35
+ sessions.delete(oldest);
36
+ }
37
+ return session;
38
+ })
39
+ .finally(() => pending.delete(key));
40
+ pending.set(key, opening);
41
+ return opening;
42
+ },
43
+ drop(key, id) {
44
+ if (sessions.get(key)?.id === id)
45
+ sessions.delete(key);
46
+ },
47
+ clear() {
48
+ sessions.clear();
49
+ pending.clear();
50
+ },
51
+ };
52
+ }
53
+ export function isMcpSessionId(value) {
54
+ return value !== null && SESSION_ID.test(value);
55
+ }
56
+ /** One session per server and credential; the credential is hashed, never kept. */
57
+ export async function mcpSessionKey(url, headers) {
58
+ const canonical = JSON.stringify(Object.entries(headers)
59
+ .map(([name, value]) => [name.toLowerCase(), value])
60
+ .sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0)));
61
+ const digest = await crypto.subtle.digest('SHA-256', new TextEncoder().encode(canonical));
62
+ const hex = [...new Uint8Array(digest)].map((byte) => byte.toString(16).padStart(2, '0'));
63
+ return `${url}\n${hex.join('')}`;
64
+ }
@@ -0,0 +1,9 @@
1
+ export { coerceToolResultParts, executeRegisteredTool, leanToolResultData, projectForModel, } from './execute.js';
2
+ export { askUserTool, registerHarnessTools } from './harness.js';
3
+ export { formatToolResult } from './model-text.js';
4
+ export type { ToolRegistry } from './registry.js';
5
+ export { createToolRegistry } from './registry.js';
6
+ export type { McpProtocolVersion, McpRpcResponse } from './remote.js';
7
+ export { buildHttpToolTarget, executeHttpTool, executeMcpTool, isUnsupportedMcpProtocolError, MCP_PROTOCOL_VERSIONS, parseMcpRpcResponse, resolveToolAuth, } from './remote.js';
8
+ export { cloneTurnToolSnapshot, prepareTurnToolSnapshot } from './resolve.js';
9
+ export type * from './types.js';
@@ -0,0 +1,6 @@
1
+ export { coerceToolResultParts, executeRegisteredTool, leanToolResultData, projectForModel, } from './execute.js';
2
+ export { askUserTool, registerHarnessTools } from './harness.js';
3
+ export { formatToolResult } from './model-text.js';
4
+ export { createToolRegistry } from './registry.js';
5
+ export { buildHttpToolTarget, executeHttpTool, executeMcpTool, isUnsupportedMcpProtocolError, MCP_PROTOCOL_VERSIONS, parseMcpRpcResponse, resolveToolAuth, } from './remote.js';
6
+ export { cloneTurnToolSnapshot, prepareTurnToolSnapshot } from './resolve.js';
@@ -0,0 +1,11 @@
1
+ import { resolveGuardrailPolicy } from '../../guardrails/policy.js';
2
+ import type { Provenance } from '../../guardrails/types.js';
3
+ import type { ModelToolResult, ToolFailure } from './types.js';
4
+ /**
5
+ * Every transport and replay formats through here, so the model's view of a call cannot drift.
6
+ * Never embeds `parts[].data`: media travels on `TurnHistoryMessage.parts`. A result without
7
+ * `modelText` (a host replaying a transcript) is guarded here under full detection.
8
+ */
9
+ export declare function formatToolResult(result: ModelToolResult): string;
10
+ /** The message is remote-authored on HTTP and MCP tools, so it is redacted before the kernel frames it. */
11
+ export declare function formatToolFailureForModel(failure: Pick<ToolFailure, 'code' | 'message' | 'details'>, provenance?: Provenance, policy?: ReturnType<typeof resolveGuardrailPolicy>): ModelToolResult;
@@ -0,0 +1,25 @@
1
+ import { resolveGuardrailPolicy } from '../../guardrails/policy.js';
2
+ import { sanitizeText } from '../../guardrails/sanitize.js';
3
+ import { composeToolText, guardToolFailureText } from '../../guardrails/tool-result.js';
4
+ /**
5
+ * Every transport and replay formats through here, so the model's view of a call cannot drift.
6
+ * Never embeds `parts[].data`: media travels on `TurnHistoryMessage.parts`. A result without
7
+ * `modelText` (a host replaying a transcript) is guarded here under full detection.
8
+ */
9
+ export function formatToolResult(result) {
10
+ if (result.modelText !== undefined) {
11
+ return result.modelText;
12
+ }
13
+ return sanitizeText(composeToolText(result.finding, result.data));
14
+ }
15
+ /** The message is remote-authored on HTTP and MCP tools, so it is redacted before the kernel frames it. */
16
+ export function formatToolFailureForModel(failure, provenance, policy = resolveGuardrailPolicy(undefined)) {
17
+ const safe = provenance
18
+ ? guardToolFailureText(failure.message, provenance, policy).text
19
+ : sanitizeText(failure.message);
20
+ return {
21
+ finding: `Tool error (${failure.code}): ${safe}`,
22
+ // The finding already says the code and message; only details are new.
23
+ ...(failure.details !== undefined ? { data: { details: failure.details } } : {}),
24
+ };
25
+ }
@@ -0,0 +1,6 @@
1
+ import type { InvokeToolResume, ToolGate, ToolPermission } from './types.js';
2
+ export declare function isResumeContinuation(resume?: InvokeToolResume): boolean;
3
+ export declare function isGateResumeGranted(resume?: InvokeToolResume): boolean;
4
+ export declare function isGateResumeDenied(resume?: InvokeToolResume): boolean;
5
+ export declare function permissionGranted(toolName: string, sessionPermissions?: string[]): boolean;
6
+ export declare function checkPermission(toolName: string, permission: ToolPermission, sessionPermissions?: string[], resume?: InvokeToolResume): ToolGate | null;
@@ -0,0 +1,38 @@
1
+ export function isResumeContinuation(resume) {
2
+ return typeof resume?.granted === 'boolean';
3
+ }
4
+ export function isGateResumeGranted(resume) {
5
+ return resume?.granted === true;
6
+ }
7
+ export function isGateResumeDenied(resume) {
8
+ return resume?.granted === false;
9
+ }
10
+ export function permissionGranted(toolName, sessionPermissions) {
11
+ if (!sessionPermissions) {
12
+ return false;
13
+ }
14
+ return sessionPermissions.includes('*') || sessionPermissions.includes(toolName);
15
+ }
16
+ export function checkPermission(toolName, permission, sessionPermissions, resume) {
17
+ if (permission === 'auto') {
18
+ return null;
19
+ }
20
+ if (permission === 'always_confirm') {
21
+ if (resume?.granted === true) {
22
+ return null;
23
+ }
24
+ return {
25
+ kind: 'permission',
26
+ tool: toolName,
27
+ permission,
28
+ };
29
+ }
30
+ if (permissionGranted(toolName, sessionPermissions)) {
31
+ return null;
32
+ }
33
+ return {
34
+ kind: 'permission',
35
+ tool: toolName,
36
+ permission,
37
+ };
38
+ }
@@ -0,0 +1,8 @@
1
+ import type { Profile, ToolId } from '../types.js';
2
+ import type { ToolRegistry } from './registry.js';
3
+ import type { RegisteredTool } from './types.js';
4
+ declare function projectTools(tools: ToolRegistry, profile: Profile): Array<RegisteredTool | {
5
+ name: ToolId;
6
+ missing: true;
7
+ }>;
8
+ export { projectTools };
@@ -0,0 +1,25 @@
1
+ import { profileToolAllow } from './resolve.js';
2
+ function projectTool(tools, name) {
3
+ const tool = tools.get(name);
4
+ if (!tool) {
5
+ return { name, missing: true };
6
+ }
7
+ return tool;
8
+ }
9
+ function builtInToolIds(profile) {
10
+ const seen = new Set();
11
+ if (profile.type === 'host' || profile.type === 'decision') {
12
+ return [];
13
+ }
14
+ for (const binding of Object.values(profile.models)) {
15
+ for (const id of binding.builtInTools ?? []) {
16
+ seen.add(id);
17
+ }
18
+ }
19
+ return [...seen];
20
+ }
21
+ function projectTools(tools, profile) {
22
+ const ids = [...profileToolAllow(profile), ...builtInToolIds(profile)];
23
+ return ids.map((name) => projectTool(tools, name));
24
+ }
25
+ export { projectTools };
@@ -0,0 +1,20 @@
1
+ import { type McpSessionCache } from './mcp-sessions.js';
2
+ import type { RegisteredTool, ToolDefinitionInput } from './types.js';
3
+ interface ToolRegistry {
4
+ /** Replaces a tool of the same name. */
5
+ register<TIn, TOut>(def: ToolDefinitionInput<TIn, TOut>): RegisteredTool<TIn, TOut>;
6
+ registerMany(defs: ToolDefinitionInput[]): RegisteredTool[];
7
+ get(name: string): RegisteredTool | undefined;
8
+ /** Throws when there is none. */
9
+ require(name: string): RegisteredTool;
10
+ has(name: string): boolean;
11
+ list(): RegisteredTool[];
12
+ /** Also forgets the MCP sessions. */
13
+ reset(): void;
14
+ /** Sessions for this scope's MCP servers that require one; never shared across scopes. */
15
+ readonly mcpSessions: McpSessionCache;
16
+ }
17
+ /** Registration is not synchronized: register a scope's tools before its turns or invokes run. */
18
+ declare function createToolRegistry(): ToolRegistry;
19
+ export type { ToolRegistry };
20
+ export { createToolRegistry };
@@ -0,0 +1,84 @@
1
+ import { TheoremError } from '../../guardrails/error.js';
2
+ import { activityLabelProblem } from './activity-label.js';
3
+ import { createMcpSessionCache } from './mcp-sessions.js';
4
+ import { assertFixedEndpointOrigin, jsonSchemaFromZod, validateToolInputSchema, validateToolOutputSchema, } from './schema.js';
5
+ function schemasFromZod(def) {
6
+ const inputSchema = jsonSchemaFromZod(def.input, 'input');
7
+ validateToolInputSchema(inputSchema);
8
+ const outputSchema = jsonSchemaFromZod(def.output, 'output');
9
+ validateToolOutputSchema(outputSchema);
10
+ const labels = {
11
+ activity: { input: inputSchema },
12
+ activityPast: { input: inputSchema, output: outputSchema },
13
+ };
14
+ for (const field of ['activity', 'activityPast']) {
15
+ const template = def.labels?.[field];
16
+ const problem = template ? activityLabelProblem(template, labels[field]) : undefined;
17
+ if (problem) {
18
+ throw new TheoremError('config', `Tool "${def.name}" ${field} label: ${problem}`);
19
+ }
20
+ }
21
+ return { inputSchema, outputSchema };
22
+ }
23
+ /** The person is told which service they sign in to; the tool's builder names it, never the model or the server. */
24
+ function assertAuthService(name, auth) {
25
+ if (auth && (typeof auth.service !== 'string' || !auth.service.trim())) {
26
+ throw new TheoremError('config', `Tool "${name}" signs in with slot "${auth.slot}" but names no service`);
27
+ }
28
+ }
29
+ function normalizeHttp(def) {
30
+ assertFixedEndpointOrigin(def.endpoint);
31
+ assertAuthService(def.name, def.auth);
32
+ return { ...def, type: 'http', ...schemasFromZod(def) };
33
+ }
34
+ function normalizeMcp(def) {
35
+ assertAuthService(def.name, def.auth);
36
+ return { ...def, type: 'mcp', ...schemasFromZod(def) };
37
+ }
38
+ function normalizeFunction(def) {
39
+ assertAuthService(def.name, def.auth);
40
+ return { ...def, type: 'function', ...schemasFromZod(def) };
41
+ }
42
+ function normalizeToolDefinition(def) {
43
+ if (def.type === 'builtin') {
44
+ return def;
45
+ }
46
+ if (def.type === 'http') {
47
+ return normalizeHttp(def);
48
+ }
49
+ if (def.type === 'mcp') {
50
+ return normalizeMcp(def);
51
+ }
52
+ return normalizeFunction(def);
53
+ }
54
+ /** Registration is not synchronized: register a scope's tools before its turns or invokes run. */
55
+ function createToolRegistry() {
56
+ const tools = new Map();
57
+ const mcpSessions = createMcpSessionCache();
58
+ const get = (name) => tools.get(name);
59
+ const register = (def) => {
60
+ const normalized = normalizeToolDefinition(def);
61
+ tools.set(normalized.name, normalized);
62
+ return normalized;
63
+ };
64
+ return {
65
+ register,
66
+ registerMany: (defs) => defs.map((def) => register(def)),
67
+ get,
68
+ require(name) {
69
+ const tool = get(name);
70
+ if (!tool) {
71
+ throw new TheoremError('config', `Tool '${name}' is not registered`); // lexicon-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
72
+ }
73
+ return tool;
74
+ },
75
+ has: (name) => tools.has(name),
76
+ list: () => [...tools.values()],
77
+ reset: () => {
78
+ tools.clear();
79
+ mcpSessions.clear();
80
+ },
81
+ mcpSessions,
82
+ };
83
+ }
84
+ export { createToolRegistry };