@theoremjs/agents 0.0.0-stage → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (588) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +545 -2
  3. package/esm/_dnt.polyfills.d.ts +66 -0
  4. package/esm/_dnt.polyfills.js +51 -0
  5. package/esm/mod.d.ts +79 -0
  6. package/esm/mod.js +49 -0
  7. package/esm/package.json +3 -0
  8. package/esm/src/cli/bin.d.ts +7 -0
  9. package/esm/src/cli/bin.js +9 -0
  10. package/esm/src/cli/commands/bench.d.ts +6 -0
  11. package/esm/src/cli/commands/bench.js +480 -0
  12. package/esm/src/cli/commands/detect-compile.d.ts +17 -0
  13. package/esm/src/cli/commands/detect-compile.js +22 -0
  14. package/esm/src/cli/commands/eval.d.ts +37 -0
  15. package/esm/src/cli/commands/eval.js +190 -0
  16. package/esm/src/cli/commands/fuzz-canary.d.ts +15 -0
  17. package/esm/src/cli/commands/fuzz-canary.js +241 -0
  18. package/esm/src/cli/commands/fuzz-guardrails.d.ts +2 -0
  19. package/esm/src/cli/commands/fuzz-guardrails.js +5 -0
  20. package/esm/src/cli/commands/profile.d.ts +2 -0
  21. package/esm/src/cli/commands/profile.js +80 -0
  22. package/esm/src/cli/commands/run.d.ts +13 -0
  23. package/esm/src/cli/commands/run.js +45 -0
  24. package/esm/src/cli/commands/test.d.ts +26 -0
  25. package/esm/src/cli/commands/test.js +143 -0
  26. package/esm/src/cli/event-log.d.ts +15 -0
  27. package/esm/src/cli/event-log.js +136 -0
  28. package/esm/src/cli/index.d.ts +10 -0
  29. package/esm/src/cli/index.js +267 -0
  30. package/esm/src/cli/matrix/fixtures.d.ts +10 -0
  31. package/esm/src/cli/matrix/fixtures.js +67 -0
  32. package/esm/src/cli/matrix/synthesizer.d.ts +18 -0
  33. package/esm/src/cli/matrix/synthesizer.js +103 -0
  34. package/esm/src/evals/attachments.d.ts +5 -0
  35. package/esm/src/evals/attachments.js +55 -0
  36. package/esm/src/evals/breakdown.d.ts +30 -0
  37. package/esm/src/evals/breakdown.js +69 -0
  38. package/esm/src/evals/graders/answer.d.ts +16 -0
  39. package/esm/src/evals/graders/answer.js +134 -0
  40. package/esm/src/evals/graders/code.d.ts +40 -0
  41. package/esm/src/evals/graders/code.js +184 -0
  42. package/esm/src/evals/graders/judge.d.ts +24 -0
  43. package/esm/src/evals/graders/judge.js +367 -0
  44. package/esm/src/evals/graders/latency.d.ts +6 -0
  45. package/esm/src/evals/graders/latency.js +82 -0
  46. package/esm/src/evals/graders/live.d.ts +14 -0
  47. package/esm/src/evals/graders/live.js +42 -0
  48. package/esm/src/evals/graders/media.d.ts +18 -0
  49. package/esm/src/evals/graders/media.js +91 -0
  50. package/esm/src/evals/graders/shared.d.ts +11 -0
  51. package/esm/src/evals/graders/shared.js +62 -0
  52. package/esm/src/evals/graders/transcript.d.ts +19 -0
  53. package/esm/src/evals/graders/transcript.js +202 -0
  54. package/esm/src/evals/mod.d.ts +34 -0
  55. package/esm/src/evals/mod.js +22 -0
  56. package/esm/src/evals/record.d.ts +41 -0
  57. package/esm/src/evals/record.js +107 -0
  58. package/esm/src/evals/rubrics/catalog.d.ts +148 -0
  59. package/esm/src/evals/rubrics/catalog.js +846 -0
  60. package/esm/src/evals/rubrics/mod.d.ts +24 -0
  61. package/esm/src/evals/rubrics/mod.js +55 -0
  62. package/esm/src/evals/rubrics/mustache.d.ts +23 -0
  63. package/esm/src/evals/rubrics/mustache.js +154 -0
  64. package/esm/src/evals/rubrics/types.d.ts +54 -0
  65. package/esm/src/evals/rubrics/types.js +74 -0
  66. package/esm/src/evals/run.d.ts +75 -0
  67. package/esm/src/evals/run.js +418 -0
  68. package/esm/src/evals/suite.d.ts +28 -0
  69. package/esm/src/evals/suite.js +97 -0
  70. package/esm/src/evals/summary.d.ts +35 -0
  71. package/esm/src/evals/summary.js +31 -0
  72. package/esm/src/evals/trial.d.ts +14 -0
  73. package/esm/src/evals/trial.js +135 -0
  74. package/esm/src/evals/types.d.ts +169 -0
  75. package/esm/src/evals/types.js +113 -0
  76. package/esm/src/evals/verdict.d.ts +23 -0
  77. package/esm/src/evals/verdict.js +48 -0
  78. package/esm/src/guardrails/boundaries.d.ts +41 -0
  79. package/esm/src/guardrails/boundaries.js +103 -0
  80. package/esm/src/guardrails/canary-gate.d.ts +22 -0
  81. package/esm/src/guardrails/canary-gate.js +40 -0
  82. package/esm/src/guardrails/canary.d.ts +146 -0
  83. package/esm/src/guardrails/canary.js +974 -0
  84. package/esm/src/guardrails/compile-egress.d.ts +12 -0
  85. package/esm/src/guardrails/compile-egress.js +12 -0
  86. package/esm/src/guardrails/corpus/canary-egress-attacks.d.ts +24 -0
  87. package/esm/src/guardrails/corpus/canary-egress-attacks.js +305 -0
  88. package/esm/src/guardrails/corpus/fuzz-inbound.d.ts +5 -0
  89. package/esm/src/guardrails/corpus/fuzz-inbound.js +199 -0
  90. package/esm/src/guardrails/corpus/inbound-payloads.d.ts +5 -0
  91. package/esm/src/guardrails/corpus/inbound-payloads.js +120 -0
  92. package/esm/src/guardrails/corpus/live-attacks.d.ts +15 -0
  93. package/esm/src/guardrails/corpus/live-attacks.js +229 -0
  94. package/esm/src/guardrails/corpus/mod.d.ts +7 -0
  95. package/esm/src/guardrails/corpus/mod.js +4 -0
  96. package/esm/src/guardrails/corpus/secrets.d.ts +12 -0
  97. package/esm/src/guardrails/corpus/secrets.js +16 -0
  98. package/esm/src/guardrails/corpus/strings.d.ts +23 -0
  99. package/esm/src/guardrails/corpus/strings.js +29 -0
  100. package/esm/src/guardrails/corpus/types.d.ts +36 -0
  101. package/esm/src/guardrails/corpus/types.js +1 -0
  102. package/esm/src/guardrails/credential-rules.d.ts +36 -0
  103. package/esm/src/guardrails/credential-rules.js +3001 -0
  104. package/esm/src/guardrails/credential-scan.d.ts +45 -0
  105. package/esm/src/guardrails/credential-scan.js +172 -0
  106. package/esm/src/guardrails/destinations.d.ts +45 -0
  107. package/esm/src/guardrails/destinations.js +234 -0
  108. package/esm/src/guardrails/detect-at.d.ts +107 -0
  109. package/esm/src/guardrails/detect-at.js +434 -0
  110. package/esm/src/guardrails/detect-reply.d.ts +61 -0
  111. package/esm/src/guardrails/detect-reply.js +95 -0
  112. package/esm/src/guardrails/detect-stream.d.ts +33 -0
  113. package/esm/src/guardrails/detect-stream.js +77 -0
  114. package/esm/src/guardrails/detectors.d.ts +216 -0
  115. package/esm/src/guardrails/detectors.js +503 -0
  116. package/esm/src/guardrails/egress-automata.d.ts +12 -0
  117. package/esm/src/guardrails/egress-automata.js +25582 -0
  118. package/esm/src/guardrails/egress-compiler.d.ts +55 -0
  119. package/esm/src/guardrails/egress-compiler.js +431 -0
  120. package/esm/src/guardrails/egress-patterns.d.ts +26 -0
  121. package/esm/src/guardrails/egress-patterns.js +36 -0
  122. package/esm/src/guardrails/egress-stream.d.ts +123 -0
  123. package/esm/src/guardrails/egress-stream.js +774 -0
  124. package/esm/src/guardrails/egress-urls.d.ts +86 -0
  125. package/esm/src/guardrails/egress-urls.js +909 -0
  126. package/esm/src/guardrails/egress.d.ts +46 -0
  127. package/esm/src/guardrails/egress.js +124 -0
  128. package/esm/src/guardrails/error.d.ts +31 -0
  129. package/esm/src/guardrails/error.js +96 -0
  130. package/esm/src/guardrails/event-schemas.d.ts +100 -0
  131. package/esm/src/guardrails/event-schemas.js +48 -0
  132. package/esm/src/guardrails/events.d.ts +13 -0
  133. package/esm/src/guardrails/events.js +45 -0
  134. package/esm/src/guardrails/hints.d.ts +14 -0
  135. package/esm/src/guardrails/hints.js +57 -0
  136. package/esm/src/guardrails/hits.d.ts +14 -0
  137. package/esm/src/guardrails/hits.js +30 -0
  138. package/esm/src/guardrails/host-patterns.d.ts +85 -0
  139. package/esm/src/guardrails/host-patterns.js +173 -0
  140. package/esm/src/guardrails/injection-patterns.d.ts +20 -0
  141. package/esm/src/guardrails/injection-patterns.js +126 -0
  142. package/esm/src/guardrails/injection-reversed.d.ts +9 -0
  143. package/esm/src/guardrails/injection-reversed.js +49 -0
  144. package/esm/src/guardrails/injection.d.ts +30 -0
  145. package/esm/src/guardrails/injection.js +460 -0
  146. package/esm/src/guardrails/labels.d.ts +40 -0
  147. package/esm/src/guardrails/labels.js +874 -0
  148. package/esm/src/guardrails/live-outbound-gate.d.ts +55 -0
  149. package/esm/src/guardrails/live-outbound-gate.js +298 -0
  150. package/esm/src/guardrails/mod.d.ts +54 -0
  151. package/esm/src/guardrails/mod.js +34 -0
  152. package/esm/src/guardrails/network.d.ts +46 -0
  153. package/esm/src/guardrails/network.js +330 -0
  154. package/esm/src/guardrails/normalize.d.ts +20 -0
  155. package/esm/src/guardrails/normalize.js +165 -0
  156. package/esm/src/guardrails/policy.d.ts +4 -0
  157. package/esm/src/guardrails/policy.js +21 -0
  158. package/esm/src/guardrails/progressive-yield.d.ts +110 -0
  159. package/esm/src/guardrails/progressive-yield.js +281 -0
  160. package/esm/src/guardrails/prompt-echo.d.ts +40 -0
  161. package/esm/src/guardrails/prompt-echo.js +306 -0
  162. package/esm/src/guardrails/quota.d.ts +21 -0
  163. package/esm/src/guardrails/quota.js +80 -0
  164. package/esm/src/guardrails/rules.d.ts +47 -0
  165. package/esm/src/guardrails/rules.js +47 -0
  166. package/esm/src/guardrails/sanitize.d.ts +40 -0
  167. package/esm/src/guardrails/sanitize.js +160 -0
  168. package/esm/src/guardrails/sensitive-groups.d.ts +21 -0
  169. package/esm/src/guardrails/sensitive-groups.js +12 -0
  170. package/esm/src/guardrails/sensitive.d.ts +22 -0
  171. package/esm/src/guardrails/sensitive.js +234 -0
  172. package/esm/src/guardrails/serialize.d.ts +15 -0
  173. package/esm/src/guardrails/serialize.js +37 -0
  174. package/esm/src/guardrails/testing.d.ts +11 -0
  175. package/esm/src/guardrails/testing.js +10 -0
  176. package/esm/src/guardrails/theorem-error.d.ts +21 -0
  177. package/esm/src/guardrails/theorem-error.js +54 -0
  178. package/esm/src/guardrails/thought-guard.d.ts +76 -0
  179. package/esm/src/guardrails/thought-guard.js +664 -0
  180. package/esm/src/guardrails/tool-directives.d.ts +38 -0
  181. package/esm/src/guardrails/tool-directives.js +195 -0
  182. package/esm/src/guardrails/tool-leak.d.ts +26 -0
  183. package/esm/src/guardrails/tool-leak.js +45 -0
  184. package/esm/src/guardrails/tool-result.d.ts +92 -0
  185. package/esm/src/guardrails/tool-result.js +272 -0
  186. package/esm/src/guardrails/types.d.ts +250 -0
  187. package/esm/src/guardrails/types.js +58 -0
  188. package/esm/src/host/client-turn.d.ts +36 -0
  189. package/esm/src/host/client-turn.js +80 -0
  190. package/esm/src/host/mint-trace.d.ts +29 -0
  191. package/esm/src/host/mint-trace.js +60 -0
  192. package/esm/src/host/mod.d.ts +13 -0
  193. package/esm/src/host/mod.js +11 -0
  194. package/esm/src/host/readStreamingJsonStringField.d.ts +2 -0
  195. package/esm/src/host/readStreamingJsonStringField.js +27 -0
  196. package/esm/src/host/reply.d.ts +13 -0
  197. package/esm/src/host/reply.js +41 -0
  198. package/esm/src/interface/blocks.d.ts +11 -0
  199. package/esm/src/interface/blocks.js +283 -0
  200. package/esm/src/interface/composer-actions.d.ts +24 -0
  201. package/esm/src/interface/composer-actions.js +33 -0
  202. package/esm/src/interface/draft.d.ts +20 -0
  203. package/esm/src/interface/draft.js +39 -0
  204. package/esm/src/interface/from-profile.d.ts +24 -0
  205. package/esm/src/interface/from-profile.js +179 -0
  206. package/esm/src/interface/history.d.ts +46 -0
  207. package/esm/src/interface/history.js +278 -0
  208. package/esm/src/interface/inputs.d.ts +11 -0
  209. package/esm/src/interface/inputs.js +67 -0
  210. package/esm/src/interface/mod.d.ts +33 -0
  211. package/esm/src/interface/mod.js +22 -0
  212. package/esm/src/interface/models.d.ts +26 -0
  213. package/esm/src/interface/models.js +50 -0
  214. package/esm/src/interface/pending.d.ts +57 -0
  215. package/esm/src/interface/pending.js +152 -0
  216. package/esm/src/interface/profile-interface.d.ts +4 -0
  217. package/esm/src/interface/profile-interface.js +237 -0
  218. package/esm/src/interface/session.d.ts +71 -0
  219. package/esm/src/interface/session.js +128 -0
  220. package/esm/src/interface/stop.d.ts +13 -0
  221. package/esm/src/interface/stop.js +28 -0
  222. package/esm/src/interface/tool-calls.d.ts +32 -0
  223. package/esm/src/interface/tool-calls.js +127 -0
  224. package/esm/src/interface/tool-invoke.d.ts +6 -0
  225. package/esm/src/interface/tool-invoke.js +22 -0
  226. package/esm/src/interface/tool-media.d.ts +11 -0
  227. package/esm/src/interface/tool-media.js +113 -0
  228. package/esm/src/interface/types.d.ts +278 -0
  229. package/esm/src/interface/types.js +5 -0
  230. package/esm/src/kernel/api-catalog.d.ts +85 -0
  231. package/esm/src/kernel/api-catalog.js +229 -0
  232. package/esm/src/kernel/auth/credential-source.d.ts +23 -0
  233. package/esm/src/kernel/auth/credential-source.js +11 -0
  234. package/esm/src/kernel/auth/crypto.d.ts +56 -0
  235. package/esm/src/kernel/auth/crypto.js +163 -0
  236. package/esm/src/kernel/auth/mod.d.ts +5 -0
  237. package/esm/src/kernel/auth/mod.js +5 -0
  238. package/esm/src/kernel/auth/oauth.d.ts +18 -0
  239. package/esm/src/kernel/auth/oauth.js +439 -0
  240. package/esm/src/kernel/auth/scope-refusal.d.ts +9 -0
  241. package/esm/src/kernel/auth/scope-refusal.js +8 -0
  242. package/esm/src/kernel/auth/typed-secret.d.ts +13 -0
  243. package/esm/src/kernel/auth/typed-secret.js +23 -0
  244. package/esm/src/kernel/auth/types.d.ts +152 -0
  245. package/esm/src/kernel/auth/types.js +1 -0
  246. package/esm/src/kernel/checkpoint.d.ts +43 -0
  247. package/esm/src/kernel/checkpoint.js +58 -0
  248. package/esm/src/kernel/default-scope.d.ts +72 -0
  249. package/esm/src/kernel/default-scope.js +121 -0
  250. package/esm/src/kernel/engine/call-trace.d.ts +19 -0
  251. package/esm/src/kernel/engine/call-trace.js +29 -0
  252. package/esm/src/kernel/engine/compaction.d.ts +71 -0
  253. package/esm/src/kernel/engine/compaction.js +203 -0
  254. package/esm/src/kernel/engine/decision.d.ts +43 -0
  255. package/esm/src/kernel/engine/decision.js +439 -0
  256. package/esm/src/kernel/engine/embedding.d.ts +8 -0
  257. package/esm/src/kernel/engine/embedding.js +118 -0
  258. package/esm/src/kernel/engine/hash.d.ts +6 -0
  259. package/esm/src/kernel/engine/hash.js +22 -0
  260. package/esm/src/kernel/engine/live-inbound.d.ts +19 -0
  261. package/esm/src/kernel/engine/live-inbound.js +44 -0
  262. package/esm/src/kernel/engine/live-ingress.d.ts +15 -0
  263. package/esm/src/kernel/engine/live-ingress.js +42 -0
  264. package/esm/src/kernel/engine/record.d.ts +3 -0
  265. package/esm/src/kernel/engine/record.js +11 -0
  266. package/esm/src/kernel/engine/repair.d.ts +7 -0
  267. package/esm/src/kernel/engine/repair.js +36 -0
  268. package/esm/src/kernel/engine/runner/gates.d.ts +5 -0
  269. package/esm/src/kernel/engine/runner/gates.js +508 -0
  270. package/esm/src/kernel/engine/runner/mod.d.ts +29 -0
  271. package/esm/src/kernel/engine/runner/mod.js +625 -0
  272. package/esm/src/kernel/engine/runner/nested.d.ts +32 -0
  273. package/esm/src/kernel/engine/runner/nested.js +134 -0
  274. package/esm/src/kernel/engine/runner/schema-validation.d.ts +35 -0
  275. package/esm/src/kernel/engine/runner/schema-validation.js +179 -0
  276. package/esm/src/kernel/engine/runner/stages.d.ts +28 -0
  277. package/esm/src/kernel/engine/runner/stages.js +41 -0
  278. package/esm/src/kernel/engine/runner/state.d.ts +97 -0
  279. package/esm/src/kernel/engine/runner/state.js +50 -0
  280. package/esm/src/kernel/engine/runner/step-order.d.ts +27 -0
  281. package/esm/src/kernel/engine/runner/step-order.js +165 -0
  282. package/esm/src/kernel/engine/runner/steps.d.ts +14 -0
  283. package/esm/src/kernel/engine/runner/steps.js +519 -0
  284. package/esm/src/kernel/engine/runner/stream.d.ts +71 -0
  285. package/esm/src/kernel/engine/runner/stream.js +376 -0
  286. package/esm/src/kernel/engine/runner/usage.d.ts +45 -0
  287. package/esm/src/kernel/engine/runner/usage.js +148 -0
  288. package/esm/src/kernel/engine/session/mod.d.ts +33 -0
  289. package/esm/src/kernel/engine/session/mod.js +1182 -0
  290. package/esm/src/kernel/engine/session/session-trace.d.ts +115 -0
  291. package/esm/src/kernel/engine/session/session-trace.js +500 -0
  292. package/esm/src/kernel/engine/token-estimate.d.ts +23 -0
  293. package/esm/src/kernel/engine/token-estimate.js +38 -0
  294. package/esm/src/kernel/engine/tool-trace.d.ts +58 -0
  295. package/esm/src/kernel/engine/tool-trace.js +132 -0
  296. package/esm/src/kernel/engine/tree.d.ts +2 -0
  297. package/esm/src/kernel/engine/tree.js +17 -0
  298. package/esm/src/kernel/engine/turn-trace.d.ts +119 -0
  299. package/esm/src/kernel/engine/turn-trace.js +855 -0
  300. package/esm/src/kernel/engine/usage.d.ts +36 -0
  301. package/esm/src/kernel/engine/usage.js +151 -0
  302. package/esm/src/kernel/interaction-parts.d.ts +13 -0
  303. package/esm/src/kernel/interaction-parts.js +40 -0
  304. package/esm/src/kernel/json.d.ts +10 -0
  305. package/esm/src/kernel/json.js +3 -0
  306. package/esm/src/kernel/mod.d.ts +74 -0
  307. package/esm/src/kernel/mod.js +45 -0
  308. package/esm/src/kernel/profile-graph.d.ts +145 -0
  309. package/esm/src/kernel/profile-graph.js +158 -0
  310. package/esm/src/kernel/profile-presence.d.ts +18 -0
  311. package/esm/src/kernel/profile-presence.js +158 -0
  312. package/esm/src/kernel/profile-scope.d.ts +40 -0
  313. package/esm/src/kernel/profile-scope.js +274 -0
  314. package/esm/src/kernel/protocols/binding.d.ts +65 -0
  315. package/esm/src/kernel/protocols/binding.js +125 -0
  316. package/esm/src/kernel/protocols/limits.d.ts +15 -0
  317. package/esm/src/kernel/protocols/limits.js +28 -0
  318. package/esm/src/kernel/protocols/mod.d.ts +5 -0
  319. package/esm/src/kernel/protocols/mod.js +5 -0
  320. package/esm/src/kernel/protocols/prices.d.ts +36 -0
  321. package/esm/src/kernel/protocols/prices.js +37 -0
  322. package/esm/src/kernel/protocols/protocol.d.ts +253 -0
  323. package/esm/src/kernel/protocols/protocol.js +253 -0
  324. package/esm/src/kernel/protocols/provider.d.ts +108 -0
  325. package/esm/src/kernel/protocols/provider.js +143 -0
  326. package/esm/src/kernel/protocols/runtime.d.ts +55 -0
  327. package/esm/src/kernel/protocols/runtime.js +534 -0
  328. package/esm/src/kernel/provider-budget.d.ts +32 -0
  329. package/esm/src/kernel/provider-budget.js +262 -0
  330. package/esm/src/kernel/provider-dispatch.d.ts +13 -0
  331. package/esm/src/kernel/provider-dispatch.js +36 -0
  332. package/esm/src/kernel/provider-live.d.ts +7 -0
  333. package/esm/src/kernel/provider-live.js +189 -0
  334. package/esm/src/kernel/provider-runtime.d.ts +57 -0
  335. package/esm/src/kernel/provider-runtime.js +524 -0
  336. package/esm/src/kernel/registry/attachments.d.ts +46 -0
  337. package/esm/src/kernel/registry/attachments.js +220 -0
  338. package/esm/src/kernel/registry/catalog.d.ts +25 -0
  339. package/esm/src/kernel/registry/catalog.js +85 -0
  340. package/esm/src/kernel/registry/embedding-rules.d.ts +28 -0
  341. package/esm/src/kernel/registry/embedding-rules.js +66 -0
  342. package/esm/src/kernel/registry/ingress.d.ts +12 -0
  343. package/esm/src/kernel/registry/ingress.js +179 -0
  344. package/esm/src/kernel/registry/kernel-registry.d.ts +15 -0
  345. package/esm/src/kernel/registry/kernel-registry.js +15 -0
  346. package/esm/src/kernel/registry/profile-outputs.d.ts +3 -0
  347. package/esm/src/kernel/registry/profile-outputs.js +10 -0
  348. package/esm/src/kernel/registry/profiles.d.ts +116 -0
  349. package/esm/src/kernel/registry/profiles.js +773 -0
  350. package/esm/src/kernel/registry/provider-request.d.ts +6 -0
  351. package/esm/src/kernel/registry/provider-request.js +34 -0
  352. package/esm/src/kernel/registry/resolve.d.ts +17 -0
  353. package/esm/src/kernel/registry/resolve.js +238 -0
  354. package/esm/src/kernel/registry/schemas.d.ts +12 -0
  355. package/esm/src/kernel/registry/schemas.js +27 -0
  356. package/esm/src/kernel/registry/slot-fill.d.ts +7 -0
  357. package/esm/src/kernel/registry/slot-fill.js +22 -0
  358. package/esm/src/kernel/registry/sole-model.d.ts +2 -0
  359. package/esm/src/kernel/registry/sole-model.js +4 -0
  360. package/esm/src/kernel/registry/system-prompt.d.ts +8 -0
  361. package/esm/src/kernel/registry/system-prompt.js +32 -0
  362. package/esm/src/kernel/registry/system-role.d.ts +3 -0
  363. package/esm/src/kernel/registry/system-role.js +9 -0
  364. package/esm/src/kernel/registry/vault.d.ts +14 -0
  365. package/esm/src/kernel/registry/vault.js +1 -0
  366. package/esm/src/kernel/schema.d.ts +226 -0
  367. package/esm/src/kernel/schema.js +895 -0
  368. package/esm/src/kernel/scope.d.ts +29 -0
  369. package/esm/src/kernel/scope.js +45 -0
  370. package/esm/src/kernel/stages.d.ts +176 -0
  371. package/esm/src/kernel/stages.js +431 -0
  372. package/esm/src/kernel/stop.d.ts +116 -0
  373. package/esm/src/kernel/stop.js +137 -0
  374. package/esm/src/kernel/system-parts.d.ts +26 -0
  375. package/esm/src/kernel/system-parts.js +98 -0
  376. package/esm/src/kernel/tools/activity-label.d.ts +22 -0
  377. package/esm/src/kernel/tools/activity-label.js +435 -0
  378. package/esm/src/kernel/tools/agent.d.ts +66 -0
  379. package/esm/src/kernel/tools/agent.js +212 -0
  380. package/esm/src/kernel/tools/coordinate.d.ts +4 -0
  381. package/esm/src/kernel/tools/coordinate.js +165 -0
  382. package/esm/src/kernel/tools/events.d.ts +66 -0
  383. package/esm/src/kernel/tools/events.js +184 -0
  384. package/esm/src/kernel/tools/execute.d.ts +100 -0
  385. package/esm/src/kernel/tools/execute.js +1173 -0
  386. package/esm/src/kernel/tools/gate-answer.d.ts +60 -0
  387. package/esm/src/kernel/tools/gate-answer.js +65 -0
  388. package/esm/src/kernel/tools/handler-events.d.ts +45 -0
  389. package/esm/src/kernel/tools/handler-events.js +106 -0
  390. package/esm/src/kernel/tools/harness.d.ts +17 -0
  391. package/esm/src/kernel/tools/harness.js +43 -0
  392. package/esm/src/kernel/tools/http-limit.d.ts +27 -0
  393. package/esm/src/kernel/tools/http-limit.js +85 -0
  394. package/esm/src/kernel/tools/invoke.d.ts +32 -0
  395. package/esm/src/kernel/tools/invoke.js +282 -0
  396. package/esm/src/kernel/tools/mcp-sessions.d.ts +23 -0
  397. package/esm/src/kernel/tools/mcp-sessions.js +69 -0
  398. package/esm/src/kernel/tools/mod.d.ts +10 -0
  399. package/esm/src/kernel/tools/mod.js +7 -0
  400. package/esm/src/kernel/tools/model-text.d.ts +16 -0
  401. package/esm/src/kernel/tools/model-text.js +31 -0
  402. package/esm/src/kernel/tools/operation.d.ts +76 -0
  403. package/esm/src/kernel/tools/operation.js +100 -0
  404. package/esm/src/kernel/tools/page-answer.d.ts +8 -0
  405. package/esm/src/kernel/tools/page-answer.js +19 -0
  406. package/esm/src/kernel/tools/permission.d.ts +15 -0
  407. package/esm/src/kernel/tools/permission.js +38 -0
  408. package/esm/src/kernel/tools/project.d.ts +11 -0
  409. package/esm/src/kernel/tools/project.js +55 -0
  410. package/esm/src/kernel/tools/registry.d.ts +27 -0
  411. package/esm/src/kernel/tools/registry.js +143 -0
  412. package/esm/src/kernel/tools/remote.d.ts +144 -0
  413. package/esm/src/kernel/tools/remote.js +1125 -0
  414. package/esm/src/kernel/tools/resolve.d.ts +31 -0
  415. package/esm/src/kernel/tools/resolve.js +267 -0
  416. package/esm/src/kernel/tools/run.d.ts +28 -0
  417. package/esm/src/kernel/tools/run.js +86 -0
  418. package/esm/src/kernel/tools/schema.d.ts +10 -0
  419. package/esm/src/kernel/tools/schema.js +95 -0
  420. package/esm/src/kernel/tools/signed-in-fetch.d.ts +19 -0
  421. package/esm/src/kernel/tools/signed-in-fetch.js +45 -0
  422. package/esm/src/kernel/tools/stage-run.d.ts +116 -0
  423. package/esm/src/kernel/tools/stage-run.js +198 -0
  424. package/esm/src/kernel/tools/types.d.ts +497 -0
  425. package/esm/src/kernel/tools/types.js +1 -0
  426. package/esm/src/kernel/tools/unchecked-output.d.ts +14 -0
  427. package/esm/src/kernel/tools/unchecked-output.js +18 -0
  428. package/esm/src/kernel/turn-events.d.ts +776 -0
  429. package/esm/src/kernel/turn-events.js +543 -0
  430. package/esm/src/kernel/types.d.ts +1025 -0
  431. package/esm/src/kernel/types.js +1 -0
  432. package/esm/src/kernel/util/base64.d.ts +4 -0
  433. package/esm/src/kernel/util/base64.js +15 -0
  434. package/esm/src/kernel/util/exact-type.d.ts +31 -0
  435. package/esm/src/kernel/util/exact-type.js +1 -0
  436. package/esm/src/kernel/util/find-last.d.ts +3 -0
  437. package/esm/src/kernel/util/find-last.js +9 -0
  438. package/esm/src/kernel/util/mime.d.ts +2 -0
  439. package/esm/src/kernel/util/mime.js +4 -0
  440. package/esm/src/kernel/util/partial-json.d.ts +23 -0
  441. package/esm/src/kernel/util/partial-json.js +128 -0
  442. package/esm/src/kernel/util/record.d.ts +2 -0
  443. package/esm/src/kernel/util/record.js +4 -0
  444. package/esm/src/observability/destinations.d.ts +14 -0
  445. package/esm/src/observability/destinations.js +43 -0
  446. package/esm/src/observability/jsonl.d.ts +18 -0
  447. package/esm/src/observability/jsonl.js +110 -0
  448. package/esm/src/observability/mod.d.ts +22 -0
  449. package/esm/src/observability/mod.js +16 -0
  450. package/esm/src/observability/openinference.d.ts +11 -0
  451. package/esm/src/observability/openinference.js +205 -0
  452. package/esm/src/observability/otlp.d.ts +71 -0
  453. package/esm/src/observability/otlp.js +98 -0
  454. package/esm/src/observability/phoenix.d.ts +30 -0
  455. package/esm/src/observability/phoenix.js +71 -0
  456. package/esm/src/observability/policy.d.ts +17 -0
  457. package/esm/src/observability/policy.js +73 -0
  458. package/esm/src/observability/resolve-policy.d.ts +8 -0
  459. package/esm/src/observability/resolve-policy.js +64 -0
  460. package/esm/src/observability/spans.d.ts +22 -0
  461. package/esm/src/observability/spans.js +72 -0
  462. package/esm/src/observability/trace-catalog.d.ts +128 -0
  463. package/esm/src/observability/trace-catalog.js +906 -0
  464. package/esm/src/observability/trace-record.d.ts +23 -0
  465. package/esm/src/observability/trace-record.js +228 -0
  466. package/esm/src/observability/trace-schema.d.ts +57 -0
  467. package/esm/src/observability/trace-schema.js +59 -0
  468. package/esm/src/observability/trace-sink.d.ts +14 -0
  469. package/esm/src/observability/trace-sink.js +3 -0
  470. package/esm/src/observability/trace-span.d.ts +98 -0
  471. package/esm/src/observability/trace-span.js +201 -0
  472. package/esm/src/observability/trace.d.ts +13 -0
  473. package/esm/src/observability/trace.js +37 -0
  474. package/esm/src/observability/types.d.ts +109 -0
  475. package/esm/src/observability/types.js +3 -0
  476. package/esm/src/presets/google/speech-voices.d.ts +9 -0
  477. package/esm/src/presets/google/speech-voices.js +38 -0
  478. package/esm/src/presets/google-limits.d.ts +13 -0
  479. package/esm/src/presets/google-limits.js +18 -0
  480. package/esm/src/presets/google.d.ts +119 -0
  481. package/esm/src/presets/google.js +197 -0
  482. package/esm/src/presets/local.d.ts +26 -0
  483. package/esm/src/presets/local.js +30 -0
  484. package/esm/src/presets/mod.d.ts +11 -0
  485. package/esm/src/presets/mod.js +9 -0
  486. package/esm/src/presets/openrouter.d.ts +26 -0
  487. package/esm/src/presets/openrouter.js +31 -0
  488. package/esm/src/providers/embedding-limits.d.ts +7 -0
  489. package/esm/src/providers/embedding-limits.js +12 -0
  490. package/esm/src/providers/gemini/embedding-protocol.d.ts +8 -0
  491. package/esm/src/providers/gemini/embedding-protocol.js +125 -0
  492. package/esm/src/providers/gemini/interactions-protocol.d.ts +8 -0
  493. package/esm/src/providers/gemini/interactions-protocol.js +105 -0
  494. package/esm/src/providers/gemini/live-protocol.d.ts +3 -0
  495. package/esm/src/providers/gemini/live-protocol.js +191 -0
  496. package/esm/src/providers/gemini/prices.d.ts +3 -0
  497. package/esm/src/providers/gemini/prices.js +63 -0
  498. package/esm/src/providers/gemini/provider.d.ts +7 -0
  499. package/esm/src/providers/gemini/provider.js +39 -0
  500. package/esm/src/providers/google/api-error.d.ts +8 -0
  501. package/esm/src/providers/google/api-error.js +123 -0
  502. package/esm/src/providers/google/builtins.d.ts +14 -0
  503. package/esm/src/providers/google/builtins.js +57 -0
  504. package/esm/src/providers/google/grounding.d.ts +5 -0
  505. package/esm/src/providers/google/grounding.js +226 -0
  506. package/esm/src/providers/google/interactions/framing.d.ts +27 -0
  507. package/esm/src/providers/google/interactions/framing.js +304 -0
  508. package/esm/src/providers/google/interactions/steps.d.ts +12 -0
  509. package/esm/src/providers/google/interactions/steps.js +200 -0
  510. package/esm/src/providers/google/interactions/stream.d.ts +23 -0
  511. package/esm/src/providers/google/interactions/stream.js +230 -0
  512. package/esm/src/providers/google/live/framing.d.ts +61 -0
  513. package/esm/src/providers/google/live/framing.js +597 -0
  514. package/esm/src/providers/google/live/stream.d.ts +13 -0
  515. package/esm/src/providers/google/live/stream.js +57 -0
  516. package/esm/src/providers/google/thinking.d.ts +3 -0
  517. package/esm/src/providers/google/thinking.js +8 -0
  518. package/esm/src/providers/google/urls.d.ts +4 -0
  519. package/esm/src/providers/google/urls.js +4 -0
  520. package/esm/src/providers/google/usage.d.ts +7 -0
  521. package/esm/src/providers/google/usage.js +49 -0
  522. package/esm/src/providers/live.d.ts +6 -0
  523. package/esm/src/providers/live.js +6 -0
  524. package/esm/src/providers/local/embedding-protocol.d.ts +7 -0
  525. package/esm/src/providers/local/embedding-protocol.js +60 -0
  526. package/esm/src/providers/local/provider.d.ts +7 -0
  527. package/esm/src/providers/local/provider.js +28 -0
  528. package/esm/src/providers/mod.d.ts +32 -0
  529. package/esm/src/providers/mod.js +23 -0
  530. package/esm/src/providers/open-ai/protocol.d.ts +3 -0
  531. package/esm/src/providers/open-ai/protocol.js +189 -0
  532. package/esm/src/providers/openrouter/embedding-protocol.d.ts +6 -0
  533. package/esm/src/providers/openrouter/embedding-protocol.js +86 -0
  534. package/esm/src/providers/openrouter/image.d.ts +15 -0
  535. package/esm/src/providers/openrouter/image.js +34 -0
  536. package/esm/src/providers/openrouter/images-protocol.d.ts +3 -0
  537. package/esm/src/providers/openrouter/images-protocol.js +82 -0
  538. package/esm/src/providers/openrouter/openai/compat.d.ts +19 -0
  539. package/esm/src/providers/openrouter/openai/compat.js +162 -0
  540. package/esm/src/providers/openrouter/openai/image-payload.d.ts +9 -0
  541. package/esm/src/providers/openrouter/openai/image-payload.js +115 -0
  542. package/esm/src/providers/openrouter/openai/reasoning-state.d.ts +2 -0
  543. package/esm/src/providers/openrouter/openai/reasoning-state.js +31 -0
  544. package/esm/src/providers/openrouter/openai/usage.d.ts +8 -0
  545. package/esm/src/providers/openrouter/openai/usage.js +56 -0
  546. package/esm/src/providers/openrouter/protocol.d.ts +8 -0
  547. package/esm/src/providers/openrouter/protocol.js +171 -0
  548. package/esm/src/providers/openrouter/provider.d.ts +10 -0
  549. package/esm/src/providers/openrouter/provider.js +50 -0
  550. package/esm/src/providers/shared/carried-tool-files.d.ts +7 -0
  551. package/esm/src/providers/shared/carried-tool-files.js +43 -0
  552. package/esm/src/providers/shared/pcm.d.ts +14 -0
  553. package/esm/src/providers/shared/pcm.js +78 -0
  554. package/esm/src/providers/shared/protocol-events.d.ts +8 -0
  555. package/esm/src/providers/shared/protocol-events.js +20 -0
  556. package/esm/src/providers/shared/response-identity.d.ts +11 -0
  557. package/esm/src/providers/shared/response-identity.js +12 -0
  558. package/esm/src/providers/shared/retry.d.ts +17 -0
  559. package/esm/src/providers/shared/retry.js +90 -0
  560. package/esm/src/providers/shared/sse.d.ts +6 -0
  561. package/esm/src/providers/shared/sse.js +93 -0
  562. package/esm/src/providers/shared/structured-output.d.ts +4 -0
  563. package/esm/src/providers/shared/structured-output.js +11 -0
  564. package/esm/src/providers/shared/tool-args.d.ts +24 -0
  565. package/esm/src/providers/shared/tool-args.js +88 -0
  566. package/esm/src/providers/shared/tool-draft.d.ts +16 -0
  567. package/esm/src/providers/shared/tool-draft.js +14 -0
  568. package/esm/src/providers/shared/upstream-tap.d.ts +8 -0
  569. package/esm/src/providers/shared/upstream-tap.js +85 -0
  570. package/esm/src/providers/shared/upstream-tape.d.ts +6 -0
  571. package/esm/src/providers/shared/upstream-tape.js +88 -0
  572. package/esm/src/providers/system-one/protocol.d.ts +8 -0
  573. package/esm/src/providers/system-one/protocol.js +93 -0
  574. package/esm/src/providers/types.d.ts +51 -0
  575. package/esm/src/providers/types.js +2 -0
  576. package/esm/src/providers/typesafe/provider.d.ts +7 -0
  577. package/esm/src/providers/typesafe/provider.js +24 -0
  578. package/esm/src/surface/formats.d.ts +46 -0
  579. package/esm/src/surface/formats.js +178 -0
  580. package/esm/src/surface/mod.d.ts +16 -0
  581. package/esm/src/surface/mod.js +12 -0
  582. package/esm/src/surface/runtime.d.ts +44 -0
  583. package/esm/src/surface/runtime.js +441 -0
  584. package/esm/src/surface/tools.d.ts +9 -0
  585. package/esm/src/surface/tools.js +62 -0
  586. package/esm/src/surface/types.d.ts +110 -0
  587. package/esm/src/surface/types.js +4 -0
  588. package/package.json +100 -4
@@ -0,0 +1,44 @@
1
+ import type { Surface } from './types.js';
2
+ /** One answered `act`, kept so a retried call replays instead of applying twice. */
3
+ export interface SurfaceLedgerEntry {
4
+ callId: string;
5
+ at: string;
6
+ action: string;
7
+ intent?: string;
8
+ /** Whether it changed the surface, so a cancel or a lost answer after the fact can be told. */
9
+ applied: boolean;
10
+ result: unknown;
11
+ time: number;
12
+ }
13
+ /** Options for a surface runtime: the clock, how to open a declared surface, where notes go and where the ledger is kept. */
14
+ export interface SurfaceRuntimeOptions {
15
+ now?: () => number;
16
+ /** Opens a declared surface that isn't mounted (goes to its page). */
17
+ open?: (surfaceId: string) => void;
18
+ mountWaitMs?: number;
19
+ /** A silent line for the agent: the person changed something, or a call's fate after the fact. */
20
+ onNote?: (line: string) => void;
21
+ /** Keeps the ledger across reloads; in memory when left out. */
22
+ ledger?: {
23
+ load(): readonly SurfaceLedgerEntry[];
24
+ save(entries: readonly SurfaceLedgerEntry[]): void;
25
+ };
26
+ }
27
+ /** What the host holds to mount surfaces and answer the agent's `look` and `act` calls. */
28
+ export interface SurfaceRuntime {
29
+ /** Mounts a surface until the returned function is called. */
30
+ mount(surface: Surface): () => void;
31
+ /** A surface the agent may open though it isn't mounted: `open` takes it there. */
32
+ declare(id: string, title: string): void;
33
+ isSurfaceTool(name: string): boolean;
34
+ /** Answers a `look` or `act` call. Every answer is projected and scrubbed. */
35
+ answer(tool: string, args: unknown, callId: string): Promise<unknown>;
36
+ /** A call that changed the surface was cancelled, or its answer never got back: tells the agent once. */
37
+ settled(callId: string, how: 'cancelled' | 'undelivered'): void;
38
+ /** Where every mounted surface stands and what the agent last did; `null` when there is nothing. */
39
+ stateLine(): string | null;
40
+ }
41
+ /** The tools the runtime answers: `look` and `act`. */
42
+ export declare const SURFACE_TOOL_NAMES: readonly ["look", "act"];
43
+ /** Creates a runtime that mounts surfaces and answers the agent's `look` and `act` calls. */
44
+ export declare function createSurfaceRuntime(options?: SurfaceRuntimeOptions): SurfaceRuntime;
@@ -0,0 +1,441 @@
1
+ import { z } from 'zod';
2
+ import { jsonSchemaFromZod } from '../kernel/tools/schema.js';
3
+ import { knownSecrets, maskHeaders, maskUrl, scrubDeep, secretCard } from './formats.js';
4
+ const LEDGER_SIZE = 100;
5
+ const INTENT_WINDOW_MS = 60_000;
6
+ const MOUNT_WAIT_MS = 5000;
7
+ const NODE_LIST_CAP = 80;
8
+ const RECENT_IN_STATE = 5;
9
+ /** The tools the runtime answers: `look` and `act`. */
10
+ export const SURFACE_TOOL_NAMES = ['look', 'act'];
11
+ const lookArgs = z.object({ at: z.string().optional() });
12
+ const actArgs = z.object({
13
+ at: z.string().min(1),
14
+ action: z.string().min(1),
15
+ input: z.record(z.string(), z.unknown()).optional(),
16
+ basedOn: z.number().int().optional(),
17
+ intent: z.string().optional(),
18
+ });
19
+ const setInput = z.object({
20
+ changes: z
21
+ .record(z.string(), z.unknown())
22
+ .describe('Field name (or a dotted path in one, "include.usage") to its new value'),
23
+ });
24
+ const pointInput = z.object({
25
+ field: z.string().optional().describe('A field to focus; leave out to show the whole node'),
26
+ });
27
+ const BUILT_IN = {
28
+ set: {
29
+ description: 'Change fields. Each one refused comes back with why; the rest apply.',
30
+ effect: 'write',
31
+ input: setInput,
32
+ },
33
+ point: {
34
+ description: 'Show this node, or one of its fields, to the person: it is selected and focused. Use it to have them enter a secret.',
35
+ effect: 'read',
36
+ input: pointInput,
37
+ },
38
+ };
39
+ function issueCount(count) {
40
+ return `${String(count)} ${count === 1 ? 'issue' : 'issues'}`;
41
+ }
42
+ function rejectionsFrom(error) {
43
+ return error.issues.map((issue) => ({
44
+ field: issue.path.join('.') || 'input',
45
+ why: issue.message,
46
+ }));
47
+ }
48
+ function errorText(err) {
49
+ return err instanceof Error ? err.message : String(err);
50
+ }
51
+ /** Creates a runtime that mounts surfaces and answers the agent's `look` and `act` calls. */
52
+ export function createSurfaceRuntime(options = {}) {
53
+ const now = options.now ?? Date.now;
54
+ const mounted = new Map();
55
+ const declared = new Map();
56
+ const mountWaiters = new Set();
57
+ let ledger = [...(options.ledger?.load() ?? [])];
58
+ const note = (line) => options.onNote?.(line);
59
+ const remember = (entry) => {
60
+ ledger = [...ledger.filter((old) => old.callId !== entry.callId), entry].slice(-LEDGER_SIZE);
61
+ options.ledger?.save(ledger);
62
+ };
63
+ const address = (surface, nodeId) => nodeId ? `${surface.id}/${nodeId}` : surface.id;
64
+ const nodeIssues = (surface, nodeId) => (surface.issues?.() ?? []).filter((issue) => issue.node === nodeId);
65
+ /** Every secret value showing on the page, by name: what the surface says, and every secret field. */
66
+ const secretsOf = (surface) => {
67
+ const found = { ...surface.secrets?.() };
68
+ for (const node of surface.nodes()) {
69
+ for (const [name, field] of Object.entries(node.fields?.() ?? {})) {
70
+ if (field.format === 'secret' && typeof field.value === 'string') {
71
+ found[`${address(surface, node.id)}.${name}`] = field.value;
72
+ }
73
+ }
74
+ }
75
+ return found;
76
+ };
77
+ const known = () => knownSecrets(Object.assign({}, ...[...mounted.values()].map((surface) => secretsOf(surface))));
78
+ const project = (surface, node, name, field) => {
79
+ if (field.format === 'secret') {
80
+ const value = typeof field.value === 'string' ? field.value.trim() : '';
81
+ const self = `${address(surface, node.id)}.${name}`;
82
+ const sameAs = value
83
+ ? Object.entries(secretsOf(surface))
84
+ .filter(([other, otherValue]) => other !== self && otherValue.trim() === value)
85
+ .map(([other]) => other)
86
+ : [];
87
+ return secretCard(field.value, { sameAs, usedBy: field.usedBy });
88
+ }
89
+ if (field.format === 'url' && typeof field.value === 'string')
90
+ return maskUrl(field.value);
91
+ if (field.format === 'headers')
92
+ return maskHeaders(field.value);
93
+ return field.value;
94
+ };
95
+ const actionsOf = (node) => {
96
+ const own = Object.entries(node.actions ?? {});
97
+ const builtIn = [];
98
+ if (node.set && node.fields)
99
+ builtIn.push(['set', BUILT_IN.set]);
100
+ if (node.point)
101
+ builtIn.push(['point', BUILT_IN.point]);
102
+ return [...builtIn, ...own];
103
+ };
104
+ const children = (surface, nodeId) => surface
105
+ .nodes()
106
+ .filter((child) => child.id && (child.parent ?? '') === nodeId)
107
+ .map((child) => {
108
+ const count = nodeIssues(surface, child.id).length;
109
+ return {
110
+ at: address(surface, child.id),
111
+ title: child.title,
112
+ ...(count ? { issues: count } : {}),
113
+ };
114
+ });
115
+ const nodeView = ({ surface, node, at }) => {
116
+ const fields = node.fields?.() ?? {};
117
+ const about = Object.fromEntries(Object.entries(fields).flatMap(([name, field]) => {
118
+ const info = {
119
+ ...(field.type ? { type: field.type } : {}),
120
+ ...(field.doc ? { doc: field.doc } : {}),
121
+ ...(field.options?.length ? { options: field.options } : {}),
122
+ ...(field.format && field.format !== 'text' ? { format: field.format } : {}),
123
+ ...(field.readOnly ? { readOnly: field.readOnly } : {}),
124
+ };
125
+ return Object.keys(info).length ? [[name, info]] : [];
126
+ }));
127
+ const issues = nodeIssues(surface, node.id).map(({ field, message }) => ({
128
+ ...(field ? { field } : {}),
129
+ message,
130
+ }));
131
+ const kids = children(surface, node.id);
132
+ return {
133
+ at,
134
+ title: node.title,
135
+ revision: surface.revision(),
136
+ ...(node.summary ? { summary: node.summary } : {}),
137
+ ...(Object.keys(fields).length
138
+ ? {
139
+ fields: Object.fromEntries(Object.entries(fields).map(([name, field]) => [
140
+ name,
141
+ project(surface, node, name, field),
142
+ ])),
143
+ }
144
+ : {}),
145
+ ...(Object.keys(about).length ? { about } : {}),
146
+ ...(issues.length ? { issues } : {}),
147
+ actions: actionsOf(node).map(([name, action]) => ({
148
+ name,
149
+ effect: action.effect,
150
+ description: action.description,
151
+ ...(action.input ? { input: jsonSchemaFromZod(action.input, 'input') } : {}),
152
+ })),
153
+ ...(kids.length ? { children: kids } : {}),
154
+ };
155
+ };
156
+ const overview = () => ({
157
+ surfaces: [...mounted.values()].map((surface) => {
158
+ const issues = surface.issues?.() ?? [];
159
+ return {
160
+ at: surface.id,
161
+ title: surface.title,
162
+ revision: surface.revision(),
163
+ summary: surface.summary(),
164
+ ...(issues.length ? { issues: issues.length } : {}),
165
+ nodes: surface
166
+ .nodes()
167
+ .filter((node) => node.id)
168
+ .slice(0, NODE_LIST_CAP)
169
+ .map((node) => {
170
+ const count = issues.filter((issue) => issue.node === node.id).length;
171
+ return {
172
+ at: address(surface, node.id),
173
+ title: node.title,
174
+ ...(node.parent ? { parent: address(surface, node.parent) } : {}),
175
+ ...(count ? { issues: count } : {}),
176
+ };
177
+ }),
178
+ };
179
+ }),
180
+ ...([...declared.keys()].some((id) => !mounted.has(id))
181
+ ? {
182
+ closed: [...declared]
183
+ .filter(([id]) => !mounted.has(id))
184
+ .map(([id, title]) => ({ at: id, title, note: 'Look or act on it to open it.' })),
185
+ }
186
+ : {}),
187
+ });
188
+ const waitForMount = (id, ms) => new Promise((resolve) => {
189
+ if (mounted.has(id)) {
190
+ resolve(true);
191
+ return;
192
+ }
193
+ const check = () => {
194
+ if (!mounted.has(id))
195
+ return;
196
+ clearTimeout(timer);
197
+ mountWaiters.delete(check);
198
+ resolve(true);
199
+ };
200
+ const timer = setTimeout(() => {
201
+ mountWaiters.delete(check);
202
+ resolve(false);
203
+ }, ms);
204
+ mountWaiters.add(check);
205
+ });
206
+ /** The node `at` names, opening its surface first when it is declared but not mounted. */
207
+ const resolve = async (at) => {
208
+ const slash = at.indexOf('/');
209
+ const surfaceId = slash < 0 ? at : at.slice(0, slash);
210
+ const nodeId = slash < 0 ? '' : at.slice(slash + 1);
211
+ if (!mounted.has(surfaceId)) {
212
+ if (!declared.has(surfaceId) || !options.open) {
213
+ return { refused: `Nothing called ${surfaceId} is open. Look to see what is.` };
214
+ }
215
+ options.open(surfaceId);
216
+ if (!(await waitForMount(surfaceId, options.mountWaitMs ?? MOUNT_WAIT_MS))) {
217
+ return { refused: `${surfaceId} did not open. Look to see where the person is.` };
218
+ }
219
+ }
220
+ const surface = mounted.get(surfaceId);
221
+ const node = surface?.nodes().find((candidate) => candidate.id === nodeId);
222
+ if (!surface || !node) {
223
+ return { refused: `No ${at} here. Look at ${surfaceId} for what is.` };
224
+ }
225
+ return { surface, node, at: address(surface, node.id) };
226
+ };
227
+ const changedSince = (surface, revision) => [
228
+ ...new Set((surface.changesSince?.(revision) ?? []).flatMap((change) => change.nodes.map((id) => address(surface, id)))),
229
+ ];
230
+ const look = async (args) => {
231
+ const parsed = lookArgs.safeParse(args ?? {});
232
+ if (!parsed.success)
233
+ return { status: 'refused', why: 'at must be text' };
234
+ if (!parsed.data.at)
235
+ return overview();
236
+ const target = await resolve(parsed.data.at);
237
+ if ('refused' in target)
238
+ return { status: 'refused', why: target.refused };
239
+ return nodeView(target);
240
+ };
241
+ const runBuiltIn = (target, name, input, ctx) => {
242
+ const { node } = target;
243
+ if (name === 'point') {
244
+ const field = typeof input.field === 'string' ? input.field : undefined;
245
+ node.point?.(field);
246
+ return { result: { shown: field ? `${target.at}.${field}` : target.at } };
247
+ }
248
+ const fields = node.fields?.() ?? {};
249
+ const rejected = [];
250
+ const allowed = {};
251
+ for (const [path, value] of Object.entries(input.changes)) {
252
+ const field = fields[path.split('.', 1)[0] ?? path];
253
+ if (!field)
254
+ rejected.push({ field: path, why: 'no such field; look at the node for its fields' });
255
+ else if (field.format === 'secret') {
256
+ rejected.push({
257
+ field: path,
258
+ why: 'only the person enters this: act point on it, then ask them to type it in',
259
+ });
260
+ }
261
+ else if (field.readOnly)
262
+ rejected.push({ field: path, why: field.readOnly });
263
+ else
264
+ allowed[path] = value;
265
+ }
266
+ if (Object.keys(allowed).length && node.set) {
267
+ rejected.push(...node.set(allowed, ctx).rejected);
268
+ }
269
+ return { rejected, node: node.id };
270
+ };
271
+ /** What an `act` call resolved to, or the answer that ends it before anything runs. */
272
+ const prepareAct = async (args) => {
273
+ const parsed = actArgs.safeParse(args ?? {});
274
+ if (!parsed.success) {
275
+ return {
276
+ done: { status: 'refused', why: 'Bad call.', rejected: rejectionsFrom(parsed.error) },
277
+ };
278
+ }
279
+ const { at, action: name, basedOn, intent } = parsed.data;
280
+ const target = await resolve(at);
281
+ if ('refused' in target)
282
+ return { done: { status: 'refused', why: target.refused } };
283
+ const { surface, node } = target;
284
+ const action = actionsOf(node).find(([candidate]) => candidate === name)?.[1];
285
+ if (!action) {
286
+ return {
287
+ done: {
288
+ status: 'refused',
289
+ why: `${target.at} has no ${name}. It has: ${actionsOf(node)
290
+ .map(([candidate]) => candidate)
291
+ .join(', ')}.`,
292
+ },
293
+ };
294
+ }
295
+ const checked = action.input
296
+ ? action.input.safeParse(parsed.data.input ?? {})
297
+ : { success: true, data: parsed.data.input ?? {} };
298
+ if (!checked.success) {
299
+ return {
300
+ done: { status: 'refused', why: 'Bad input.', rejected: rejectionsFrom(checked.error) },
301
+ };
302
+ }
303
+ const write = action.effect === 'write';
304
+ if (write && basedOn === undefined) {
305
+ return {
306
+ done: {
307
+ status: 'refused',
308
+ why: 'Pass basedOn: the revision from your last look.',
309
+ revision: surface.revision(),
310
+ },
311
+ };
312
+ }
313
+ if (write && action.intent && intent) {
314
+ const repeat = ledger.find((entry) => entry.intent === intent &&
315
+ entry.at === target.at &&
316
+ now() - entry.time < INTENT_WINDOW_MS);
317
+ if (repeat)
318
+ return { done: repeat.result };
319
+ }
320
+ return { ready: { target, name, basedOn, intent, data: checked.data, write } };
321
+ };
322
+ const act = async (args, callId) => {
323
+ const seen = ledger.find((entry) => entry.callId === callId);
324
+ if (seen)
325
+ return seen.result;
326
+ const prepared = await prepareAct(args);
327
+ if (!prepared.ready)
328
+ return prepared.done;
329
+ const { target, name, basedOn, intent, data, write } = prepared.ready;
330
+ const { surface, node } = target;
331
+ let result;
332
+ let applied = false;
333
+ if (write && basedOn !== surface.revision()) {
334
+ result = {
335
+ status: 'stale',
336
+ why: 'The page changed since your look; nothing applied. Look again.',
337
+ revision: surface.revision(),
338
+ changed: changedSince(surface, basedOn ?? 0),
339
+ };
340
+ }
341
+ else {
342
+ const before = surface.revision();
343
+ const ctx = { callId, by: 'agent' };
344
+ try {
345
+ const own = node.actions?.[name];
346
+ const outcome = name in BUILT_IN && !own
347
+ ? runBuiltIn(target, name, data, ctx)
348
+ : await own.run(data, ctx);
349
+ const after = surface.revision();
350
+ applied = after !== before;
351
+ const landed = outcome.node === undefined ? undefined : await resolve(address(surface, outcome.node));
352
+ const issues = surface.issues?.() ?? [];
353
+ result = {
354
+ status: write ? (applied ? 'applied' : 'unchanged') : 'done',
355
+ revision: after,
356
+ ...(applied ? { changed: changedSince(surface, before) } : {}),
357
+ ...(outcome.rejected?.length ? { rejected: outcome.rejected } : {}),
358
+ ...(outcome.result === undefined ? {} : { result: outcome.result }),
359
+ ...(landed && !('refused' in landed) ? { node: nodeView(landed) } : {}),
360
+ ...(write ? { issues: issues.length } : {}),
361
+ };
362
+ }
363
+ catch (err) {
364
+ result = { status: 'failed', why: errorText(err), revision: surface.revision() };
365
+ }
366
+ }
367
+ const scrubbed = scrubDeep(result, known());
368
+ remember({
369
+ callId,
370
+ at: target.at,
371
+ action: name,
372
+ ...(intent ? { intent } : {}),
373
+ applied,
374
+ result: scrubbed,
375
+ time: now(),
376
+ });
377
+ return scrubbed;
378
+ };
379
+ return {
380
+ mount(surface) {
381
+ mounted.set(surface.id, surface);
382
+ for (const waiter of [...mountWaiters])
383
+ waiter();
384
+ let seen = surface.revision();
385
+ const titles = () => new Map(surface.nodes().map((node) => [node.id, node.title]));
386
+ const stop = surface.subscribe?.(() => {
387
+ const changes = surface.changesSince?.(seen) ?? [];
388
+ seen = surface.revision();
389
+ const nodes = [
390
+ ...new Set(changes.filter((change) => change.by === 'person').flatMap((c) => c.nodes)),
391
+ ];
392
+ if (nodes.length === 0)
393
+ return;
394
+ const named = titles();
395
+ const what = nodes.map((id) => named.get(id) ?? (id || surface.title)).join(', ');
396
+ const count = surface.issues?.().length ?? 0;
397
+ note(`${surface.id} r${String(seen)}: the person changed ${what}; ${issueCount(count)}`);
398
+ });
399
+ return () => {
400
+ stop?.();
401
+ if (mounted.get(surface.id) === surface)
402
+ mounted.delete(surface.id);
403
+ };
404
+ },
405
+ declare(id, title) {
406
+ declared.set(id, title);
407
+ },
408
+ isSurfaceTool(name) {
409
+ return SURFACE_TOOL_NAMES.includes(name);
410
+ },
411
+ async answer(tool, args, callId) {
412
+ try {
413
+ if (tool === 'look')
414
+ return scrubDeep(await look(args), known());
415
+ if (tool === 'act')
416
+ return await act(args, callId);
417
+ return { status: 'refused', why: `${tool} is not a surface tool.` };
418
+ }
419
+ catch (err) {
420
+ return scrubDeep({ status: 'failed', why: errorText(err) }, known());
421
+ }
422
+ },
423
+ settled(callId, how) {
424
+ const entry = ledger.find((candidate) => candidate.callId === callId);
425
+ if (!entry?.applied)
426
+ return;
427
+ note(`${entry.at} ${entry.action} applied, but ${how === 'cancelled' ? 'the call was cancelled after' : 'its answer never reached you'}`);
428
+ },
429
+ stateLine() {
430
+ const surfaces = [...mounted.values()].map((surface) => `${surface.id} r${String(surface.revision())}: ${surface.summary()}`);
431
+ const recent = ledger
432
+ .slice(-RECENT_IN_STATE)
433
+ .map((entry) => `${entry.at} ${entry.action}`)
434
+ .join(', ');
435
+ if (!surfaces.length && !recent)
436
+ return null;
437
+ const line = [surfaces.join('; '), recent ? `last calls: ${recent}` : ''].filter(Boolean);
438
+ return scrubDeep(`(state) ${line.join('; ')}`, known());
439
+ },
440
+ };
441
+ }
@@ -0,0 +1,9 @@
1
+ import type { ToolDefinitionInput } from '../kernel/tools/types.js';
2
+ /** Options for `surfaceTools`: the category the tools are registered under, `surface` by default. */
3
+ export interface SurfaceToolsOptions {
4
+ category?: string;
5
+ }
6
+ /** `look` and `act`: the two tools an agent uses to see and work in every surface a client mounts. */
7
+ export declare function surfaceTools(options?: SurfaceToolsOptions): ToolDefinitionInput[];
8
+ /** How to use `look` and `act`, for an agent's instructions. */
9
+ export declare const SURFACE_PROMPT = "You see and work in the person's screen through surfaces, with two tools.\n- look: no `at` lists every surface. Look at a node before you act on it.\n- act: do one of the actions look lists. Pass basedOn (the revision from your last look) for writes.\n- Say a change is done only when act comes back applied. If it lists rejected fields, say which and why.\n- stale means the person changed something: look again, then go on. After refused or failed, look before retrying; never retry blind.\n- Secrets (keys, tokens, passwords) show only as cards: set or not, what they look like, their problems. You never see or type the value. To have the person enter one, act point on it and ask them to paste it. To find out whether it works, use the node's test action.\n- When something isn't working, look for issues, test what can be tested, and tell the person what you found in plain words.\n- A line starting \"(state)\" is a silent note about what changed on the page. It is background; never read it out. If it says something you did applied late or was cancelled, tell the person once, in a few words.";
@@ -0,0 +1,62 @@
1
+ import { z } from 'zod';
2
+ const answer = z.record(z.string(), z.unknown());
3
+ const lookInput = z.object({
4
+ at: z
5
+ .string()
6
+ .optional()
7
+ .describe('A surface ("studio") or a node in one ("studio/identity"); leave out to see every surface'),
8
+ });
9
+ const actInput = z.object({
10
+ at: z.string().describe('The node to act on, as look names it'),
11
+ action: z.string().describe('One of the actions look lists for that node'),
12
+ input: z
13
+ .record(z.string(), z.unknown())
14
+ .optional()
15
+ .describe("The action's input, per its schema"),
16
+ basedOn: z
17
+ .number()
18
+ .int()
19
+ .optional()
20
+ .describe('For a write: the revision from your last look. If the page changed since, nothing applies.'),
21
+ intent: z
22
+ .string()
23
+ .optional()
24
+ .describe('A short key for what the person asked ("image-agent"), so a repeat of a starting-over action applies once'),
25
+ });
26
+ /** `look` and `act`: the two tools an agent uses to see and work in every surface a client mounts. */
27
+ export function surfaceTools(options = {}) {
28
+ const base = {
29
+ type: 'function',
30
+ category: options.category ?? 'surface',
31
+ paths: ['*'],
32
+ loadTier: 'T0',
33
+ permission: 'auto',
34
+ output: answer,
35
+ answeredBy: 'page',
36
+ };
37
+ return [
38
+ {
39
+ ...base,
40
+ name: 'look',
41
+ description: "See what is on the person's screen. With no `at`: every surface, its revision, summary, nodes, and issue counts. With `at`: that node's fields (secrets only as cards: set, what it looks like, problems), what each means, its issues, its actions with their input schemas, and its children.",
42
+ access: 'read-only',
43
+ input: lookInput,
44
+ },
45
+ {
46
+ ...base,
47
+ name: 'act',
48
+ description: "Do one of a node's actions: `set` fields, `point` the person at something, or the node's own (test, send, launch…). Comes back applied, unchanged, done, stale (the page changed: look again), refused, or failed, with what was rejected and why.",
49
+ access: 'read-write',
50
+ input: actInput,
51
+ },
52
+ ];
53
+ }
54
+ /** How to use `look` and `act`, for an agent's instructions. */
55
+ export const SURFACE_PROMPT = `You see and work in the person's screen through surfaces, with two tools.
56
+ - look: no \`at\` lists every surface. Look at a node before you act on it.
57
+ - act: do one of the actions look lists. Pass basedOn (the revision from your last look) for writes.
58
+ - Say a change is done only when act comes back applied. If it lists rejected fields, say which and why.
59
+ - stale means the person changed something: look again, then go on. After refused or failed, look before retrying; never retry blind.
60
+ - Secrets (keys, tokens, passwords) show only as cards: set or not, what they look like, their problems. You never see or type the value. To have the person enter one, act point on it and ask them to paste it. To find out whether it works, use the node's test action.
61
+ - When something isn't working, look for issues, test what can be tested, and tell the person what you found in plain words.
62
+ - A line starting "(state)" is a silent note about what changed on the page. It is background; never read it out. If it says something you did applied late or was cancelled, tell the person once, in a few words.`;
@@ -0,0 +1,110 @@
1
+ import type { z } from 'zod';
2
+ /**
3
+ * How a field's value leaves the page. The runtime projects every value through
4
+ * its format before an agent sees it, so a page cannot forget to.
5
+ * - `secret`: only a card (set, what it looks like, what is wrong with it), never the value.
6
+ * - `url`: credential query parameters and `user:pass@` masked.
7
+ * - `headers`: a JSON object of headers, credential-named values masked.
8
+ * - `text` (the default): as is, then scrubbed with every other answer.
9
+ */
10
+ export type SurfaceFieldFormat = 'secret' | 'url' | 'headers' | 'text';
11
+ /** One value on a surface: what it holds and how the agent should read it. */
12
+ export interface SurfaceField {
13
+ value: unknown;
14
+ /** The kind of value, as the agent should read it ("boolean", "one of …"). */
15
+ type?: string;
16
+ /** What the setting means. */
17
+ doc?: string;
18
+ options?: readonly unknown[];
19
+ format?: SurfaceFieldFormat;
20
+ /** Why the agent may not `set` it; the person still can. */
21
+ readOnly?: string;
22
+ /** For a secret: what uses it, so its card can say. */
23
+ usedBy?: readonly string[];
24
+ }
25
+ /** Something wrong on a node, or on one of its fields. */
26
+ export interface SurfaceIssue {
27
+ node: string;
28
+ field?: string;
29
+ message: string;
30
+ }
31
+ /** A change that was not made, and why. */
32
+ export interface SurfaceRejection {
33
+ field: string;
34
+ why: string;
35
+ }
36
+ /**
37
+ * - `read`: changes nothing.
38
+ * - `run`: does something outside the surface (tests a key, sends a message, exports).
39
+ * - `write`: changes the surface; it needs the revision the agent last saw.
40
+ */
41
+ export type SurfaceEffect = 'read' | 'run' | 'write';
42
+ /** Who a change is by, for the surface to record: notes are told only about the person's. */
43
+ export type SurfaceAuthor = 'person' | 'agent';
44
+ /** What an action run is told: its call id and who started it. */
45
+ export interface SurfaceActionContext {
46
+ callId: string;
47
+ by: SurfaceAuthor;
48
+ }
49
+ /** What an action run returns: any rejections and its result. */
50
+ export interface SurfaceActionOutcome {
51
+ rejected?: SurfaceRejection[];
52
+ /** What the action found or made; scrubbed like everything else. */
53
+ result?: unknown;
54
+ /** The node the change landed on (local id), shown back to the agent. */
55
+ node?: string;
56
+ }
57
+ /** Something the agent can do on a node: its description, effect, input schema, and `run`. */
58
+ export interface SurfaceAction<Input = Record<string, unknown>> {
59
+ description: string;
60
+ effect: SurfaceEffect;
61
+ /** Checked before `run`; each issue comes back as a rejection. */
62
+ input?: z.ZodType<Input>;
63
+ /** A write that starts something over: the same `intent` again within a minute replays. */
64
+ intent?: boolean;
65
+ run(input: Input, ctx: SurfaceActionContext): SurfaceActionOutcome | Promise<SurfaceActionOutcome>;
66
+ }
67
+ /** One part of a surface, with its fields and actions. */
68
+ export interface SurfaceNode {
69
+ /** Unique in its surface. The root's is `''`, addressed by the surface id alone. */
70
+ id: string;
71
+ title: string;
72
+ /** The parent's id; the root has none. */
73
+ parent?: string;
74
+ summary?: string;
75
+ fields?(): Record<string, SurfaceField>;
76
+ /**
77
+ * Applies field changes the runtime has checked: each names a field (or a dotted path in one),
78
+ * and none is a secret or read-only.
79
+ */
80
+ set?(changes: Record<string, unknown>, ctx: SurfaceActionContext): {
81
+ rejected: SurfaceRejection[];
82
+ };
83
+ /** Shows the node, or one of its fields, to the person: selects it, scrolls to it, focuses it. */
84
+ point?(field?: string): void;
85
+ actions?: Record<string, SurfaceAction<never>>;
86
+ }
87
+ /** A recorded change to a surface: its revision, author, and the nodes it touched. */
88
+ export interface SurfaceChange {
89
+ revision: number;
90
+ by: SurfaceAuthor;
91
+ /** Local ids of the nodes it touched. */
92
+ nodes: readonly string[];
93
+ }
94
+ /** What a page mounts so an agent can see it and work in it. */
95
+ export interface Surface {
96
+ id: string;
97
+ title: string;
98
+ revision(): number;
99
+ /** One line: what is here and where it stands. */
100
+ summary(): string;
101
+ /** Read fresh on every call. The first is the root. */
102
+ nodes(): readonly SurfaceNode[];
103
+ issues?(): readonly SurfaceIssue[];
104
+ changesSince?(revision: number): readonly SurfaceChange[];
105
+ subscribe?(listener: () => void): () => void;
106
+ /** Secret values by name, so any answer that carries one is scrubbed. Read per answer, never kept. */
107
+ secrets?(): Record<string, string>;
108
+ }
109
+ /** Defines an action with its input type inferred, then erased for `SurfaceNode.actions`. */
110
+ export declare function defineAction<Input>(action: SurfaceAction<Input>): SurfaceAction<never>;
@@ -0,0 +1,4 @@
1
+ /** Defines an action with its input type inferred, then erased for `SurfaceNode.actions`. */
2
+ export function defineAction(action) {
3
+ return action;
4
+ }