@paybond/kit 0.9.8 → 0.11.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 (368) hide show
  1. package/completion-presets/catalog.json +1187 -0
  2. package/completion-presets/catalog.sha256 +1 -0
  3. package/dev/trace-ui/dashboard.html +617 -0
  4. package/dist/agent/adapter.d.ts +51 -0
  5. package/dist/agent/adapter.js +66 -0
  6. package/dist/agent/attach-bundle.d.ts +37 -0
  7. package/dist/agent/attach-bundle.js +118 -0
  8. package/dist/agent/authorization-cache.d.ts +22 -0
  9. package/dist/agent/authorization-cache.js +36 -0
  10. package/dist/agent/deferred-tools.d.ts +11 -0
  11. package/dist/agent/deferred-tools.js +62 -0
  12. package/dist/agent/discover.d.ts +41 -0
  13. package/dist/agent/discover.js +147 -0
  14. package/dist/agent/evidence.d.ts +9 -0
  15. package/dist/agent/evidence.js +28 -0
  16. package/dist/agent/facade.d.ts +48 -0
  17. package/dist/agent/facade.js +112 -0
  18. package/dist/agent/gateway-trace-reporter.d.ts +28 -0
  19. package/dist/agent/gateway-trace-reporter.js +49 -0
  20. package/dist/agent/generic-runner.d.ts +14 -0
  21. package/dist/agent/generic-runner.js +49 -0
  22. package/dist/agent/generic-sandbox-demo.d.ts +36 -0
  23. package/dist/agent/generic-sandbox-demo.js +82 -0
  24. package/dist/agent/guarded-agent.d.ts +49 -0
  25. package/dist/agent/guarded-agent.js +100 -0
  26. package/dist/agent/index.d.ts +13 -0
  27. package/dist/agent/index.js +13 -0
  28. package/dist/agent/instrument.d.ts +156 -0
  29. package/dist/agent/instrument.js +442 -0
  30. package/dist/agent/interceptor.d.ts +24 -0
  31. package/dist/agent/interceptor.js +440 -0
  32. package/dist/agent/lazy-context-tools.d.ts +15 -0
  33. package/dist/agent/lazy-context-tools.js +81 -0
  34. package/dist/agent/registry-file.d.ts +39 -0
  35. package/dist/agent/registry-file.js +219 -0
  36. package/dist/agent/registry.d.ts +37 -0
  37. package/dist/agent/registry.js +128 -0
  38. package/dist/agent/run.d.ts +124 -0
  39. package/dist/agent/run.js +301 -0
  40. package/dist/agent/types.d.ts +318 -0
  41. package/dist/agent/types.js +42 -0
  42. package/dist/agent-recognition.d.ts +72 -0
  43. package/dist/agent-recognition.js +165 -0
  44. package/dist/bincode-wire.d.ts +18 -0
  45. package/dist/bincode-wire.js +93 -0
  46. package/dist/claude-agents/config.d.ts +21 -0
  47. package/dist/claude-agents/config.js +145 -0
  48. package/dist/claude-agents/index.d.ts +2 -0
  49. package/dist/claude-agents/index.js +2 -0
  50. package/dist/claude-agents/sandbox-demo.d.ts +30 -0
  51. package/dist/claude-agents/sandbox-demo.js +91 -0
  52. package/dist/cli/agent/env-quote.d.ts +1 -0
  53. package/dist/cli/agent/env-quote.js +6 -0
  54. package/dist/cli/agent/env-write.d.ts +8 -0
  55. package/dist/cli/agent/env-write.js +47 -0
  56. package/dist/cli/agent/paybond.d.ts +16 -0
  57. package/dist/cli/agent/paybond.js +55 -0
  58. package/dist/cli/agent/policy-file.d.ts +29 -0
  59. package/dist/cli/agent/policy-file.js +61 -0
  60. package/dist/cli/agent/production-evidence.d.ts +24 -0
  61. package/dist/cli/agent/production-evidence.js +98 -0
  62. package/dist/cli/agent/run-store.d.ts +30 -0
  63. package/dist/cli/agent/run-store.js +42 -0
  64. package/dist/cli/agent/run-trace-store.d.ts +39 -0
  65. package/dist/cli/agent/run-trace-store.js +143 -0
  66. package/dist/cli/agent-run-trace-table.d.ts +9 -0
  67. package/dist/cli/agent-run-trace-table.js +24 -0
  68. package/dist/cli/agent-sandbox-smoke-checklist.d.ts +9 -0
  69. package/dist/cli/agent-sandbox-smoke-checklist.js +50 -0
  70. package/dist/cli/audit-export.d.ts +7 -0
  71. package/dist/cli/audit-export.js +120 -0
  72. package/dist/cli/automation.d.ts +25 -0
  73. package/dist/cli/automation.js +297 -0
  74. package/dist/cli/body.d.ts +7 -0
  75. package/dist/cli/body.js +22 -0
  76. package/dist/cli/color.d.ts +15 -0
  77. package/dist/cli/color.js +39 -0
  78. package/dist/cli/command-spec.d.ts +13 -0
  79. package/dist/cli/command-spec.js +611 -0
  80. package/dist/cli/commands/agent.d.ts +16 -0
  81. package/dist/cli/commands/agent.js +1135 -0
  82. package/dist/cli/commands/dev.d.ts +7 -0
  83. package/dist/cli/commands/dev.js +348 -0
  84. package/dist/cli/commands/discovery.d.ts +8 -0
  85. package/dist/cli/commands/discovery.js +194 -0
  86. package/dist/cli/commands/policy.d.ts +13 -0
  87. package/dist/cli/commands/policy.js +769 -0
  88. package/dist/cli/commands/setup.d.ts +18 -0
  89. package/dist/cli/commands/setup.js +513 -0
  90. package/dist/cli/commands/workflows.d.ts +7 -0
  91. package/dist/cli/commands/workflows.js +214 -0
  92. package/dist/cli/config.d.ts +16 -0
  93. package/dist/cli/config.js +98 -0
  94. package/dist/cli/context.d.ts +22 -0
  95. package/dist/cli/context.js +110 -0
  96. package/dist/cli/credentials.d.ts +21 -0
  97. package/dist/cli/credentials.js +141 -0
  98. package/dist/cli/doctor-agent-middleware.d.ts +5 -0
  99. package/dist/cli/doctor-agent-middleware.js +49 -0
  100. package/dist/cli/doctor-agent.d.ts +15 -0
  101. package/dist/cli/doctor-agent.js +311 -0
  102. package/dist/cli/envelope.d.ts +14 -0
  103. package/dist/cli/envelope.js +46 -0
  104. package/dist/cli/globals.d.ts +23 -0
  105. package/dist/cli/globals.js +248 -0
  106. package/dist/cli/help.d.ts +3 -0
  107. package/dist/cli/help.js +83 -0
  108. package/dist/cli/mcp-install.d.ts +41 -0
  109. package/dist/cli/mcp-install.js +95 -0
  110. package/dist/cli/mcp-policy.d.ts +26 -0
  111. package/dist/cli/mcp-policy.js +110 -0
  112. package/dist/cli/mcp-verify-config.d.ts +37 -0
  113. package/dist/cli/mcp-verify-config.js +172 -0
  114. package/dist/cli/redact.d.ts +4 -0
  115. package/dist/cli/redact.js +88 -0
  116. package/dist/cli/request-id.d.ts +2 -0
  117. package/dist/cli/request-id.js +5 -0
  118. package/dist/cli/router.d.ts +2 -0
  119. package/dist/cli/router.js +378 -0
  120. package/dist/cli/smoke-deep-links.d.ts +15 -0
  121. package/dist/cli/smoke-deep-links.js +63 -0
  122. package/dist/cli/suggest.d.ts +4 -0
  123. package/dist/cli/suggest.js +58 -0
  124. package/dist/cli/support-diagnostics.d.ts +19 -0
  125. package/dist/cli/support-diagnostics.js +47 -0
  126. package/dist/cli/telemetry.d.ts +17 -0
  127. package/dist/cli/telemetry.js +94 -0
  128. package/dist/cli/types.d.ts +72 -0
  129. package/dist/cli/types.js +60 -0
  130. package/dist/cli/ux.d.ts +8 -0
  131. package/dist/cli/ux.js +164 -0
  132. package/dist/cli.d.ts +2 -0
  133. package/dist/cli.js +38 -0
  134. package/dist/completion-catalog-digest.d.ts +2 -0
  135. package/dist/completion-catalog-digest.js +2 -0
  136. package/dist/completion-catalog-integrity.d.ts +2 -0
  137. package/dist/completion-catalog-integrity.js +17 -0
  138. package/dist/completion-catalog.d.ts +49 -0
  139. package/dist/completion-catalog.js +62 -0
  140. package/dist/completion-contract-digest.d.ts +37 -0
  141. package/dist/completion-contract-digest.js +73 -0
  142. package/dist/completion-forbidden-fields.d.ts +5 -0
  143. package/dist/completion-forbidden-fields.js +26 -0
  144. package/dist/completion-init.d.ts +8 -0
  145. package/dist/completion-init.js +334 -0
  146. package/dist/completion-resolve.d.ts +21 -0
  147. package/dist/completion-resolve.js +86 -0
  148. package/dist/completion-validate-evidence.d.ts +24 -0
  149. package/dist/completion-validate-evidence.js +145 -0
  150. package/dist/dev/offline-gateway.d.ts +24 -0
  151. package/dist/dev/offline-gateway.js +102 -0
  152. package/dist/dev/trace-buffer.d.ts +61 -0
  153. package/dist/dev/trace-buffer.js +330 -0
  154. package/dist/dev/trace-security-headers.d.ts +11 -0
  155. package/dist/dev/trace-security-headers.js +16 -0
  156. package/dist/dev/trace-server.d.ts +8 -0
  157. package/dist/dev/trace-server.js +38 -0
  158. package/dist/dev/trace-ui.d.ts +4 -0
  159. package/dist/dev/trace-ui.js +25 -0
  160. package/dist/dev/wiremock-up.d.ts +15 -0
  161. package/dist/dev/wiremock-up.js +118 -0
  162. package/dist/doctor-completion.d.ts +17 -0
  163. package/dist/doctor-completion.js +428 -0
  164. package/dist/gateway-url.d.ts +7 -0
  165. package/dist/gateway-url.js +69 -0
  166. package/dist/index.d.ts +119 -2
  167. package/dist/index.js +267 -6
  168. package/dist/init.js +380 -68
  169. package/dist/langgraph/awrap-tool-call.d.ts +25 -0
  170. package/dist/langgraph/awrap-tool-call.js +81 -0
  171. package/dist/langgraph/config.d.ts +13 -0
  172. package/dist/langgraph/config.js +11 -0
  173. package/dist/langgraph/index.d.ts +4 -0
  174. package/dist/langgraph/index.js +4 -0
  175. package/dist/langgraph/sandbox-demo.d.ts +40 -0
  176. package/dist/langgraph/sandbox-demo.js +96 -0
  177. package/dist/langgraph/tool-node.d.ts +10 -0
  178. package/dist/langgraph/tool-node.js +38 -0
  179. package/dist/login.d.ts +14 -1
  180. package/dist/login.js +130 -63
  181. package/dist/mcp/index.d.ts +1 -0
  182. package/dist/mcp/index.js +1 -0
  183. package/dist/mcp/tool-surface.d.ts +25 -0
  184. package/dist/mcp/tool-surface.js +17 -0
  185. package/dist/mcp-capability-token-cache.d.ts +24 -0
  186. package/dist/mcp-capability-token-cache.js +101 -0
  187. package/dist/mcp-evidence-policy.d.ts +48 -0
  188. package/dist/mcp-evidence-policy.js +117 -0
  189. package/dist/mcp-policy-reload.d.ts +79 -0
  190. package/dist/mcp-policy-reload.js +200 -0
  191. package/dist/mcp-sep2828-evidence.d.ts +36 -0
  192. package/dist/mcp-sep2828-evidence.js +65 -0
  193. package/dist/mcp-server.d.ts +10 -0
  194. package/dist/mcp-server.js +423 -115
  195. package/dist/openai-agents/index.d.ts +40 -0
  196. package/dist/openai-agents/index.js +151 -0
  197. package/dist/openai-agents/sandbox-demo.d.ts +34 -0
  198. package/dist/openai-agents/sandbox-demo.js +118 -0
  199. package/dist/payee-evidence.js +2 -29
  200. package/dist/policy/catalog.d.ts +31 -0
  201. package/dist/policy/catalog.js +48 -0
  202. package/dist/policy/compose-utils.d.ts +3 -0
  203. package/dist/policy/compose-utils.js +4 -0
  204. package/dist/policy/compose.d.ts +20 -0
  205. package/dist/policy/compose.js +240 -0
  206. package/dist/policy/digest.d.ts +7 -0
  207. package/dist/policy/digest.js +75 -0
  208. package/dist/policy/domain.d.ts +15 -0
  209. package/dist/policy/domain.js +28 -0
  210. package/dist/policy/guardrail-spec.d.ts +17 -0
  211. package/dist/policy/guardrail-spec.js +140 -0
  212. package/dist/policy/guardrails.d.ts +48 -0
  213. package/dist/policy/guardrails.js +72 -0
  214. package/dist/policy/index.d.ts +21 -0
  215. package/dist/policy/index.js +21 -0
  216. package/dist/policy/init.d.ts +102 -0
  217. package/dist/policy/init.js +351 -0
  218. package/dist/policy/intent-spec.d.ts +52 -0
  219. package/dist/policy/intent-spec.js +176 -0
  220. package/dist/policy/json-path.d.ts +4 -0
  221. package/dist/policy/json-path.js +23 -0
  222. package/dist/policy/layers-io.d.ts +7 -0
  223. package/dist/policy/layers-io.js +28 -0
  224. package/dist/policy/load-effective.d.ts +22 -0
  225. package/dist/policy/load-effective.js +77 -0
  226. package/dist/policy/load.d.ts +85 -0
  227. package/dist/policy/load.js +164 -0
  228. package/dist/policy/merge.d.ts +29 -0
  229. package/dist/policy/merge.js +297 -0
  230. package/dist/policy/parse-text.d.ts +2 -0
  231. package/dist/policy/parse-text.js +126 -0
  232. package/dist/policy/policy-api.d.ts +45 -0
  233. package/dist/policy/policy-api.js +61 -0
  234. package/dist/policy/presets.d.ts +19 -0
  235. package/dist/policy/presets.js +66 -0
  236. package/dist/policy/registry.d.ts +7 -0
  237. package/dist/policy/registry.js +33 -0
  238. package/dist/policy/reload.d.ts +86 -0
  239. package/dist/policy/reload.js +233 -0
  240. package/dist/policy/render-yaml.d.ts +3 -0
  241. package/dist/policy/render-yaml.js +69 -0
  242. package/dist/policy/sandbox-bootstrap.d.ts +19 -0
  243. package/dist/policy/sandbox-bootstrap.js +66 -0
  244. package/dist/policy/schema.d.ts +204 -0
  245. package/dist/policy/schema.js +255 -0
  246. package/dist/policy/snapshot.d.ts +33 -0
  247. package/dist/policy/snapshot.js +23 -0
  248. package/dist/policy/validate-remote.d.ts +43 -0
  249. package/dist/policy/validate-remote.js +104 -0
  250. package/dist/policy/validate.d.ts +36 -0
  251. package/dist/policy/validate.js +150 -0
  252. package/dist/policy/watcher.d.ts +29 -0
  253. package/dist/policy/watcher.js +112 -0
  254. package/dist/principal-intent.d.ts +52 -0
  255. package/dist/principal-intent.js +193 -37
  256. package/dist/project-init.d.ts +34 -0
  257. package/dist/project-init.js +898 -0
  258. package/dist/sep2828-signature.d.ts +10 -0
  259. package/dist/sep2828-signature.js +134 -0
  260. package/dist/solutions/api.d.ts +22 -0
  261. package/dist/solutions/api.js +40 -0
  262. package/dist/solutions/catalog.d.ts +34 -0
  263. package/dist/solutions/catalog.js +129 -0
  264. package/dist/solutions/index.d.ts +2 -0
  265. package/dist/solutions/index.js +2 -0
  266. package/dist/template-init.d.ts +54 -0
  267. package/dist/template-init.js +203 -0
  268. package/dist/vercel-ai/config.d.ts +15 -0
  269. package/dist/vercel-ai/config.js +13 -0
  270. package/dist/vercel-ai/index.d.ts +4 -0
  271. package/dist/vercel-ai/index.js +4 -0
  272. package/dist/vercel-ai/sandbox-demo.d.ts +44 -0
  273. package/dist/vercel-ai/sandbox-demo.js +153 -0
  274. package/dist/vercel-ai/tool-approval.d.ts +16 -0
  275. package/dist/vercel-ai/tool-approval.js +41 -0
  276. package/dist/vercel-ai/wrap-tools.d.ts +9 -0
  277. package/dist/vercel-ai/wrap-tools.js +40 -0
  278. package/dist/x402-receipt-evidence.d.ts +29 -0
  279. package/dist/x402-receipt-evidence.js +97 -0
  280. package/dist/x402-receipt-signature.d.ts +12 -0
  281. package/dist/x402-receipt-signature.js +211 -0
  282. package/package.json +79 -4
  283. package/solutions/aws.json +17 -0
  284. package/solutions/saas.json +17 -0
  285. package/solutions/shopping.json +17 -0
  286. package/solutions/travel.json +18 -0
  287. package/templates/manifest.json +169 -0
  288. package/templates/openai-shopping-agent/.env.example +3 -0
  289. package/templates/openai-shopping-agent/.github/workflows/smoke.yml +20 -0
  290. package/templates/openai-shopping-agent/LICENSE +201 -0
  291. package/templates/openai-shopping-agent/README.md +29 -0
  292. package/templates/openai-shopping-agent/package.json +22 -0
  293. package/templates/openai-shopping-agent/paybond.policy.yaml +22 -0
  294. package/templates/openai-shopping-agent/src/index.ts +22 -0
  295. package/templates/openai-shopping-agent/src/paybond.config.ts +51 -0
  296. package/templates/openai-shopping-agent/tsconfig.json +13 -0
  297. package/templates/paybond-aws-operator/.env.example +3 -0
  298. package/templates/paybond-aws-operator/.github/workflows/smoke.yml +20 -0
  299. package/templates/paybond-aws-operator/LICENSE +201 -0
  300. package/templates/paybond-aws-operator/README.md +29 -0
  301. package/templates/paybond-aws-operator/package.json +20 -0
  302. package/templates/paybond-aws-operator/paybond.policy.yaml +22 -0
  303. package/templates/paybond-aws-operator/src/index.ts +54 -0
  304. package/templates/paybond-aws-operator/src/paybond.config.ts +51 -0
  305. package/templates/paybond-aws-operator/tsconfig.json +13 -0
  306. package/templates/paybond-claude-agents-demo/.env.example +3 -0
  307. package/templates/paybond-claude-agents-demo/.github/workflows/smoke.yml +20 -0
  308. package/templates/paybond-claude-agents-demo/LICENSE +201 -0
  309. package/templates/paybond-claude-agents-demo/README.md +29 -0
  310. package/templates/paybond-claude-agents-demo/package.json +22 -0
  311. package/templates/paybond-claude-agents-demo/paybond.policy.yaml +22 -0
  312. package/templates/paybond-claude-agents-demo/src/index.ts +22 -0
  313. package/templates/paybond-claude-agents-demo/src/paybond.config.ts +51 -0
  314. package/templates/paybond-claude-agents-demo/tsconfig.json +13 -0
  315. package/templates/paybond-invoice-agent/.env.example +3 -0
  316. package/templates/paybond-invoice-agent/.github/workflows/smoke.yml +19 -0
  317. package/templates/paybond-invoice-agent/LICENSE +201 -0
  318. package/templates/paybond-invoice-agent/README.md +29 -0
  319. package/templates/paybond-invoice-agent/app.py +27 -0
  320. package/templates/paybond-invoice-agent/package.json +6 -0
  321. package/templates/paybond-invoice-agent/paybond.policy.yaml +22 -0
  322. package/templates/paybond-invoice-agent/paybond_config.py +45 -0
  323. package/templates/paybond-invoice-agent/requirements.txt +2 -0
  324. package/templates/paybond-mcp-coding-agent/.env.example +3 -0
  325. package/templates/paybond-mcp-coding-agent/.github/workflows/smoke.yml +20 -0
  326. package/templates/paybond-mcp-coding-agent/LICENSE +201 -0
  327. package/templates/paybond-mcp-coding-agent/README.md +39 -0
  328. package/templates/paybond-mcp-coding-agent/package.json +20 -0
  329. package/templates/paybond-mcp-coding-agent/paybond.policy.yaml +25 -0
  330. package/templates/paybond-mcp-coding-agent/src/index.ts +40 -0
  331. package/templates/paybond-mcp-coding-agent/src/paybond.config.ts +51 -0
  332. package/templates/paybond-mcp-coding-agent/tsconfig.json +13 -0
  333. package/templates/paybond-openai-agents-demo/.env.example +3 -0
  334. package/templates/paybond-openai-agents-demo/.github/workflows/smoke.yml +20 -0
  335. package/templates/paybond-openai-agents-demo/LICENSE +201 -0
  336. package/templates/paybond-openai-agents-demo/README.md +29 -0
  337. package/templates/paybond-openai-agents-demo/package.json +22 -0
  338. package/templates/paybond-openai-agents-demo/paybond.policy.yaml +22 -0
  339. package/templates/paybond-openai-agents-demo/src/index.ts +22 -0
  340. package/templates/paybond-openai-agents-demo/src/paybond.config.ts +51 -0
  341. package/templates/paybond-openai-agents-demo/tsconfig.json +13 -0
  342. package/templates/paybond-procurement-agent/.env.example +3 -0
  343. package/templates/paybond-procurement-agent/.github/workflows/smoke.yml +20 -0
  344. package/templates/paybond-procurement-agent/LICENSE +201 -0
  345. package/templates/paybond-procurement-agent/README.md +29 -0
  346. package/templates/paybond-procurement-agent/package.json +20 -0
  347. package/templates/paybond-procurement-agent/paybond.policy.yaml +25 -0
  348. package/templates/paybond-procurement-agent/src/index.ts +54 -0
  349. package/templates/paybond-procurement-agent/src/paybond.config.ts +51 -0
  350. package/templates/paybond-procurement-agent/tsconfig.json +13 -0
  351. package/templates/paybond-travel-agent/.env.example +3 -0
  352. package/templates/paybond-travel-agent/.github/workflows/smoke.yml +20 -0
  353. package/templates/paybond-travel-agent/LICENSE +201 -0
  354. package/templates/paybond-travel-agent/README.md +29 -0
  355. package/templates/paybond-travel-agent/package.json +23 -0
  356. package/templates/paybond-travel-agent/paybond.policy.yaml +22 -0
  357. package/templates/paybond-travel-agent/src/index.ts +22 -0
  358. package/templates/paybond-travel-agent/src/paybond.config.ts +51 -0
  359. package/templates/paybond-travel-agent/tsconfig.json +13 -0
  360. package/templates/paybond-vercel-shopping-agent/.env.example +3 -0
  361. package/templates/paybond-vercel-shopping-agent/.github/workflows/smoke.yml +20 -0
  362. package/templates/paybond-vercel-shopping-agent/LICENSE +201 -0
  363. package/templates/paybond-vercel-shopping-agent/README.md +29 -0
  364. package/templates/paybond-vercel-shopping-agent/package.json +22 -0
  365. package/templates/paybond-vercel-shopping-agent/paybond.policy.yaml +22 -0
  366. package/templates/paybond-vercel-shopping-agent/src/index.ts +22 -0
  367. package/templates/paybond-vercel-shopping-agent/src/paybond.config.ts +51 -0
  368. package/templates/paybond-vercel-shopping-agent/tsconfig.json +13 -0
@@ -0,0 +1,86 @@
1
+ import type { PaybondAgentRun } from "../agent/run.js";
2
+ import { type PaybondPolicyDocumentV1 } from "./schema.js";
3
+ import { type PaybondPolicySnapshot } from "./snapshot.js";
4
+ import { type PolicyRemoteValidateClient } from "./validate-remote.js";
5
+ import type { PolicyEffectiveResolveClient } from "./load-effective.js";
6
+ /** Options for {@link PaybondAgentRun.reloadPolicy}. */
7
+ export type PaybondPolicyReloadOptions = {
8
+ /** Policy file path; defaults to the path used at bind when omitted. */
9
+ file?: string;
10
+ /** Run Gateway `POST /v1/policy/validate` before applying (recommended in production). */
11
+ remote?: boolean;
12
+ /** Resolve org inheritance via Gateway effective endpoint before validate. */
13
+ resolveInheritance?: boolean;
14
+ /** Allow policy loosening (higher caps, new side-effecting tools). Default deny. */
15
+ allowLoosen?: boolean;
16
+ /** Gateway client for remote validate / effective resolution. */
17
+ gateway?: PolicyRemoteValidateClient & PolicyEffectiveResolveClient;
18
+ };
19
+ export type PaybondPolicyReloadResult = {
20
+ applied: boolean;
21
+ previousDigest?: string;
22
+ newDigest?: string;
23
+ unchanged?: boolean;
24
+ };
25
+ export type PaybondPolicyReloadFailedEvent = {
26
+ error: PaybondPolicyReloadError;
27
+ };
28
+ export type PaybondPolicyReloadedEvent = {
29
+ previousDigest: string;
30
+ newDigest: string;
31
+ };
32
+ /** Structured reload failure (parse, validate, loosening, intent drift). */
33
+ export declare class PaybondPolicyReloadError extends Error {
34
+ readonly code: string;
35
+ constructor(code: string, message: string);
36
+ }
37
+ /** Thrown internally when poll/file reload finds an unchanged digest. */
38
+ export declare class PaybondPolicyReloadUnchangedError extends Error {
39
+ constructor();
40
+ }
41
+ export type PaybondPolicyReloadBindConfig = {
42
+ /** Watch the bound policy file and reload on change. */
43
+ watch?: boolean | {
44
+ debounceMs?: number;
45
+ file?: string;
46
+ };
47
+ /** Poll Gateway for effective inherited policy changes. */
48
+ poll?: {
49
+ intervalMs?: number;
50
+ file?: string;
51
+ remote?: boolean;
52
+ resolveInheritance?: boolean;
53
+ gateway?: PolicyRemoteValidateClient & PolicyEffectiveResolveClient;
54
+ };
55
+ };
56
+ /** Load a versioned snapshot from a policy file path. */
57
+ export declare function loadPolicySnapshotFromFile(filePath: string): Promise<PaybondPolicySnapshot>;
58
+ /** Poll Gateway effective resolution; returns unchanged when digest matches. */
59
+ export declare function loadPolicySnapshotFromEffectivePoll(options: {
60
+ overlayPath: string;
61
+ gateway: PolicyEffectiveResolveClient;
62
+ currentDigest?: string;
63
+ }): Promise<{
64
+ snapshot?: PaybondPolicySnapshot;
65
+ unchanged: boolean;
66
+ }>;
67
+ /** Detect policy loosening between two effective documents. */
68
+ export declare function detectPolicyLoosening(previous: PaybondPolicyDocumentV1, next: PaybondPolicyDocumentV1): string[];
69
+ /** True when reloaded policy requires operations outside the bound intent. */
70
+ export declare function requiresIntentRebind(document: PaybondPolicyDocumentV1, allowedTools: readonly string[]): boolean;
71
+ /** Mutable policy reload surface shared by agent runs and MCP servers. */
72
+ export type PolicyReloadHandle = {
73
+ readonly policyFilePath?: string;
74
+ readonly policyDigest?: string;
75
+ readonly currentSnapshot?: PaybondPolicySnapshot;
76
+ readonly inFlightCount: number;
77
+ applyPolicySnapshot(snapshot: PaybondPolicySnapshot): void;
78
+ };
79
+ /** Reload policy for any {@link PolicyReloadHandle} (agent run or MCP gate). */
80
+ export declare function reloadPolicyOnHandle(handle: PolicyReloadHandle, options?: PaybondPolicyReloadOptions & {
81
+ allowedTools?: readonly string[];
82
+ }): Promise<PaybondPolicyReloadResult>;
83
+ /** Apply a validated snapshot to a run (atomic registry swap). */
84
+ export declare function applyPolicySnapshotToRun(run: PaybondAgentRun, snapshot: PaybondPolicySnapshot): PaybondPolicyReloadResult;
85
+ /** Core reload pipeline: load, validate, guard, swap. */
86
+ export declare function reloadPolicyOnRun(run: PaybondAgentRun, options?: PaybondPolicyReloadOptions): Promise<PaybondPolicyReloadResult>;
@@ -0,0 +1,233 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import { PaybondPolicy } from "./load.js";
3
+ import { parsePolicyDocumentText } from "./parse-text.js";
4
+ import { isPaybondPolicyDocumentV2, isPaybondPolicyOverlay, parsePaybondPolicyDocument, parsePaybondPolicyDocumentV1, } from "./schema.js";
5
+ import { createPolicySnapshot, createPolicySnapshotFromEffective, } from "./snapshot.js";
6
+ import { PolicyValidator } from "./validate.js";
7
+ import { validatePolicyRemote, } from "./validate-remote.js";
8
+ /** Structured reload failure (parse, validate, loosening, intent drift). */
9
+ export class PaybondPolicyReloadError extends Error {
10
+ code;
11
+ constructor(code, message) {
12
+ super(message);
13
+ this.name = "PaybondPolicyReloadError";
14
+ this.code = code;
15
+ }
16
+ }
17
+ /** Thrown internally when poll/file reload finds an unchanged digest. */
18
+ export class PaybondPolicyReloadUnchangedError extends Error {
19
+ constructor() {
20
+ super("policy digest unchanged");
21
+ this.name = "PaybondPolicyReloadUnchangedError";
22
+ }
23
+ }
24
+ /** Load a versioned snapshot from a policy file path. */
25
+ export async function loadPolicySnapshotFromFile(filePath) {
26
+ const policy = await PaybondPolicy.load(filePath);
27
+ const registry = policy.toToolRegistry();
28
+ return createPolicySnapshot({
29
+ document: policy.document,
30
+ registry,
31
+ source: "file",
32
+ });
33
+ }
34
+ /** Poll Gateway effective resolution; returns unchanged when digest matches. */
35
+ export async function loadPolicySnapshotFromEffectivePoll(options) {
36
+ const text = await readFile(options.overlayPath, "utf8");
37
+ const overlayDoc = parsePaybondPolicyDocument(parsePolicyDocumentText(text));
38
+ if (!isPaybondPolicyDocumentV2(overlayDoc) || !isPaybondPolicyOverlay(overlayDoc)) {
39
+ throw new PaybondPolicyReloadError("invalid_overlay", "poll reload requires a v2 tenant overlay policy with extends.org_policy_id");
40
+ }
41
+ const orgPolicyId = overlayDoc.extends?.org_policy_id?.trim();
42
+ if (!orgPolicyId) {
43
+ throw new PaybondPolicyReloadError("invalid_overlay", "poll reload requires extends.org_policy_id on the overlay policy");
44
+ }
45
+ const resolved = await options.gateway.resolvePolicyEffective(orgPolicyId, overlayDoc, { currentDigest: options.currentDigest });
46
+ if (resolved.unchanged) {
47
+ return { unchanged: true };
48
+ }
49
+ const effective = parsePaybondPolicyDocumentV1(resolved.effective_policy);
50
+ const policy = PaybondPolicy.fromDocument(effective);
51
+ const registry = policy.toToolRegistry();
52
+ const snapshot = createPolicySnapshotFromEffective({
53
+ document: effective,
54
+ registry,
55
+ effectivePolicyDigest: resolved.effective_policy_digest,
56
+ });
57
+ return { snapshot, unchanged: false };
58
+ }
59
+ function readMaxSpendCents(entry) {
60
+ return typeof entry.max_spend_cents === "number" ? entry.max_spend_cents : undefined;
61
+ }
62
+ /** Detect policy loosening between two effective documents. */
63
+ export function detectPolicyLoosening(previous, next) {
64
+ const reasons = [];
65
+ if (previous.default_deny && !next.default_deny) {
66
+ reasons.push("default_deny relaxed from true to false");
67
+ }
68
+ for (const [toolName, nextEntry] of Object.entries(next.tools)) {
69
+ const prevEntry = previous.tools[toolName];
70
+ if (!prevEntry) {
71
+ if (nextEntry.side_effecting) {
72
+ reasons.push(`new side-effecting tool "${toolName}"`);
73
+ }
74
+ continue;
75
+ }
76
+ const prevCap = readMaxSpendCents(prevEntry);
77
+ const nextCap = readMaxSpendCents(nextEntry);
78
+ if (prevCap !== undefined) {
79
+ if (nextCap === undefined) {
80
+ reasons.push(`tool "${toolName}" max_spend_cents cap removed`);
81
+ }
82
+ else if (nextCap > prevCap) {
83
+ reasons.push(`tool "${toolName}" max_spend_cents increased from ${prevCap} to ${nextCap}`);
84
+ }
85
+ }
86
+ if (!prevEntry.side_effecting && nextEntry.side_effecting) {
87
+ reasons.push(`tool "${toolName}" became side-effecting`);
88
+ }
89
+ }
90
+ return reasons;
91
+ }
92
+ /** True when reloaded policy requires operations outside the bound intent. */
93
+ export function requiresIntentRebind(document, allowedTools) {
94
+ const intentTools = document.intent?.allowed_tools ?? [];
95
+ for (const operation of intentTools) {
96
+ if (!allowedTools.includes(operation)) {
97
+ return true;
98
+ }
99
+ }
100
+ for (const [toolName, entry] of Object.entries(document.tools)) {
101
+ if (!entry.side_effecting) {
102
+ continue;
103
+ }
104
+ const operation = entry.operation?.trim() || toolName;
105
+ if (!allowedTools.includes(operation)) {
106
+ return true;
107
+ }
108
+ }
109
+ return false;
110
+ }
111
+ async function waitForInFlightInterceptors(interceptor, timeoutMs = 30_000) {
112
+ await waitForInFlightCount(() => interceptor.inFlightCount, timeoutMs);
113
+ }
114
+ async function waitForInFlightCount(readCount, timeoutMs = 30_000) {
115
+ const deadline = Date.now() + timeoutMs;
116
+ while (readCount() > 0) {
117
+ if (Date.now() > deadline) {
118
+ throw new PaybondPolicyReloadError("in_flight_timeout", "timed out waiting for in-flight tool calls before policy reload");
119
+ }
120
+ await new Promise((resolve) => setTimeout(resolve, 10));
121
+ }
122
+ }
123
+ async function resolveReloadSnapshotForHandle(handle, options) {
124
+ const filePath = options.file?.trim() || handle.policyFilePath;
125
+ if (!filePath) {
126
+ throw new PaybondPolicyReloadError("missing_policy_file", "reload requires a policy file path (pass file or bind with reload.watch/poll)");
127
+ }
128
+ if (options.resolveInheritance && options.gateway) {
129
+ const polled = await loadPolicySnapshotFromEffectivePoll({
130
+ overlayPath: filePath,
131
+ gateway: options.gateway,
132
+ currentDigest: handle.policyDigest,
133
+ });
134
+ if (polled.unchanged) {
135
+ throw new PaybondPolicyReloadUnchangedError();
136
+ }
137
+ if (!polled.snapshot) {
138
+ throw new PaybondPolicyReloadError("effective_empty", "effective policy resolution returned no snapshot");
139
+ }
140
+ return polled.snapshot;
141
+ }
142
+ const snapshot = await loadPolicySnapshotFromFile(filePath);
143
+ if (handle.policyDigest && handle.policyDigest === snapshot.digest) {
144
+ throw new PaybondPolicyReloadUnchangedError();
145
+ }
146
+ return snapshot;
147
+ }
148
+ async function validateAndApplyPolicySnapshot(handle, snapshot, options, allowedTools) {
149
+ const previousDocument = handle.currentSnapshot?.document;
150
+ const nextDocument = snapshot.document;
151
+ const localReport = await PolicyValidator.validateDocument(nextDocument, {
152
+ strict: PolicyValidator.isStrictFromEnv(),
153
+ });
154
+ if (!localReport.valid) {
155
+ const first = localReport.errors[0];
156
+ throw new PaybondPolicyReloadError("local_validate_failed", first ? `${first.path}: ${first.message}` : "local policy validation failed");
157
+ }
158
+ if (options.remote && options.gateway) {
159
+ const remoteReport = await validatePolicyRemote(nextDocument, options.gateway, {
160
+ resolveInheritance: options.resolveInheritance,
161
+ strict: PolicyValidator.isStrictFromEnv(),
162
+ });
163
+ if (!remoteReport.valid) {
164
+ const first = remoteReport.errors[0];
165
+ throw new PaybondPolicyReloadError("remote_validate_failed", first ? `${first.path}: ${first.message}` : "remote policy validation failed");
166
+ }
167
+ }
168
+ if (allowedTools.length > 0 && requiresIntentRebind(nextDocument, allowedTools)) {
169
+ throw new PaybondPolicyReloadError("intent_rebind_required", "reloaded policy requires allowed_tools outside the bound intent; re-bind with a new intent");
170
+ }
171
+ if (previousDocument && !options.allowLoosen) {
172
+ const loosening = detectPolicyLoosening(previousDocument, nextDocument);
173
+ if (loosening.length > 0) {
174
+ throw new PaybondPolicyReloadError("loosening_denied", `policy loosening denied: ${loosening.join("; ")}`);
175
+ }
176
+ }
177
+ if (allowedTools.length > 0) {
178
+ snapshot.registry.validateForBind(allowedTools);
179
+ }
180
+ const previousDigest = handle.policyDigest;
181
+ if (previousDigest && previousDigest === snapshot.digest) {
182
+ return { applied: false, previousDigest, newDigest: snapshot.digest, unchanged: true };
183
+ }
184
+ handle.applyPolicySnapshot(snapshot);
185
+ return {
186
+ applied: true,
187
+ previousDigest: previousDigest ?? snapshot.digest,
188
+ newDigest: snapshot.digest,
189
+ };
190
+ }
191
+ /** Reload policy for any {@link PolicyReloadHandle} (agent run or MCP gate). */
192
+ export async function reloadPolicyOnHandle(handle, options = {}) {
193
+ await waitForInFlightCount(() => handle.inFlightCount);
194
+ let snapshot;
195
+ try {
196
+ snapshot = await resolveReloadSnapshotForHandle(handle, options);
197
+ }
198
+ catch (err) {
199
+ if (err instanceof PaybondPolicyReloadUnchangedError) {
200
+ return {
201
+ applied: false,
202
+ previousDigest: handle.policyDigest,
203
+ newDigest: handle.policyDigest,
204
+ unchanged: true,
205
+ };
206
+ }
207
+ throw err;
208
+ }
209
+ const allowedTools = options.allowedTools ??
210
+ handle.currentSnapshot?.document.intent?.allowed_tools ??
211
+ [];
212
+ return validateAndApplyPolicySnapshot(handle, snapshot, options, allowedTools);
213
+ }
214
+ /** Apply a validated snapshot to a run (atomic registry swap). */
215
+ export function applyPolicySnapshotToRun(run, snapshot) {
216
+ const previousDigest = run.policyDigest;
217
+ if (previousDigest && previousDigest === snapshot.digest) {
218
+ return { applied: false, previousDigest, newDigest: snapshot.digest, unchanged: true };
219
+ }
220
+ run.applyPolicySnapshot(snapshot);
221
+ return {
222
+ applied: true,
223
+ previousDigest: previousDigest ?? snapshot.digest,
224
+ newDigest: snapshot.digest,
225
+ };
226
+ }
227
+ /** Core reload pipeline: load, validate, guard, swap. */
228
+ export async function reloadPolicyOnRun(run, options = {}) {
229
+ return reloadPolicyOnHandle(run, {
230
+ ...options,
231
+ allowedTools: run.allowedTools,
232
+ });
233
+ }
@@ -0,0 +1,3 @@
1
+ import type { PaybondPolicyDocumentV1 } from "./schema.js";
2
+ /** Serialize a validated v1 policy document to paybond.policy.yaml text. */
3
+ export declare function renderPolicyDocumentYaml(document: PaybondPolicyDocumentV1): string;
@@ -0,0 +1,69 @@
1
+ function yamlScalar(value) {
2
+ if (/^[a-z0-9_.-]+$/i.test(value)) {
3
+ return value;
4
+ }
5
+ return JSON.stringify(value);
6
+ }
7
+ function renderToolEntry(entry, indent) {
8
+ const lines = [`${indent}side_effecting: ${entry.side_effecting}`];
9
+ if (entry.max_spend_cents !== undefined) {
10
+ lines.push(`${indent}max_spend_cents: ${entry.max_spend_cents}`);
11
+ }
12
+ if (entry.spend_from_args !== undefined) {
13
+ lines.push(`${indent}spend_from_args: ${yamlScalar(entry.spend_from_args)}`);
14
+ }
15
+ if (entry.evidence_preset !== undefined) {
16
+ lines.push(`${indent}evidence_preset: ${entry.evidence_preset}`);
17
+ }
18
+ if (entry.vendor_pack !== undefined) {
19
+ lines.push(`${indent}vendor_pack: ${entry.vendor_pack}`);
20
+ }
21
+ if (entry.operation !== undefined) {
22
+ lines.push(`${indent}operation: ${yamlScalar(entry.operation)}`);
23
+ }
24
+ return lines;
25
+ }
26
+ /** Serialize a validated v1 policy document to paybond.policy.yaml text. */
27
+ export function renderPolicyDocumentYaml(document) {
28
+ const lines = [
29
+ `version: ${document.version}`,
30
+ `name: ${document.name}`,
31
+ `default_deny: ${document.default_deny}`,
32
+ "",
33
+ "tools:",
34
+ ];
35
+ for (const [toolName, entry] of Object.entries(document.tools)) {
36
+ lines.push(` ${toolName}:`);
37
+ lines.push(...renderToolEntry(entry, " "));
38
+ lines.push("");
39
+ }
40
+ if (document.intent) {
41
+ lines.push("intent:");
42
+ if (document.intent.allowed_tools?.length) {
43
+ lines.push(" allowed_tools:");
44
+ for (const tool of document.intent.allowed_tools) {
45
+ lines.push(` - ${tool}`);
46
+ }
47
+ }
48
+ if (document.intent.budget) {
49
+ lines.push(" budget:");
50
+ if (document.intent.budget.currency) {
51
+ lines.push(` currency: ${document.intent.budget.currency}`);
52
+ }
53
+ if (document.intent.budget.max_spend_usd !== undefined) {
54
+ lines.push(` max_spend_usd: ${document.intent.budget.max_spend_usd}`);
55
+ }
56
+ }
57
+ if (document.intent.policy_binding) {
58
+ lines.push(" policy_binding:");
59
+ lines.push(` template_id: ${document.intent.policy_binding.template_id}`);
60
+ if (document.intent.policy_binding.version_seq !== undefined) {
61
+ lines.push(` version_seq: ${document.intent.policy_binding.version_seq}`);
62
+ }
63
+ if (document.intent.policy_binding.head_digest !== undefined) {
64
+ lines.push(` head_digest: ${document.intent.policy_binding.head_digest}`);
65
+ }
66
+ }
67
+ }
68
+ return `${lines.join("\n").replace(/\n+$/u, "")}\n`;
69
+ }
@@ -0,0 +1,19 @@
1
+ import type { PaybondRunBindingSandboxBootstrapInput } from "../agent/types.js";
2
+ import type { PaybondPolicyDocumentV1 } from "./schema.js";
3
+ /** Raised when policy cannot derive sandbox bootstrap parameters. */
4
+ export declare class PaybondPolicySandboxBootstrapError extends Error {
5
+ constructor(message: string);
6
+ }
7
+ export type PaybondPolicySandboxBootstrapOptions = {
8
+ /** Registry tool name to bootstrap against. */
9
+ toolName?: string;
10
+ /** Harbor operation string; matched against tool names and optional `operation` overrides. */
11
+ operation?: string;
12
+ requestedSpendCents?: number;
13
+ currency?: string;
14
+ evidenceSchema?: Record<string, unknown>;
15
+ metadata?: Record<string, unknown>;
16
+ idempotencyKey?: string;
17
+ };
18
+ /** Build {@link PaybondAgentRun.bind} sandbox bootstrap input from a validated policy document. */
19
+ export declare function policySandboxBootstrap(document: PaybondPolicyDocumentV1, options?: PaybondPolicySandboxBootstrapOptions): PaybondRunBindingSandboxBootstrapInput;
@@ -0,0 +1,66 @@
1
+ import { getCompletionPreset } from "../completion-catalog.js";
2
+ /** Raised when policy cannot derive sandbox bootstrap parameters. */
3
+ export class PaybondPolicySandboxBootstrapError extends Error {
4
+ constructor(message) {
5
+ super(message);
6
+ this.name = "PaybondPolicySandboxBootstrapError";
7
+ }
8
+ }
9
+ function listSideEffectingTools(document) {
10
+ return Object.entries(document.tools).filter(([, entry]) => entry.side_effecting);
11
+ }
12
+ function resolveHarborOperation(toolName, entry) {
13
+ return entry.operation?.trim() || toolName;
14
+ }
15
+ function resolveSideEffectingTool(document, options) {
16
+ const sideEffecting = listSideEffectingTools(document);
17
+ if (sideEffecting.length === 0) {
18
+ throw new PaybondPolicySandboxBootstrapError("policy has no side-effecting tools for sandbox bootstrap");
19
+ }
20
+ if (options.toolName?.trim()) {
21
+ const toolName = options.toolName.trim();
22
+ const entry = document.tools[toolName];
23
+ if (!entry?.side_effecting) {
24
+ throw new PaybondPolicySandboxBootstrapError(`tool "${toolName}" is not a registered side-effecting tool in policy`);
25
+ }
26
+ return { toolName, entry };
27
+ }
28
+ if (options.operation?.trim()) {
29
+ const operation = options.operation.trim();
30
+ for (const [toolName, entry] of sideEffecting) {
31
+ const harborOperation = resolveHarborOperation(toolName, entry);
32
+ if (harborOperation === operation || toolName === operation) {
33
+ return { toolName, entry };
34
+ }
35
+ }
36
+ throw new PaybondPolicySandboxBootstrapError(`operation "${operation}" does not match any side-effecting tool in policy`);
37
+ }
38
+ const [toolName, entry] = sideEffecting[0];
39
+ return { toolName, entry };
40
+ }
41
+ /** Build {@link PaybondAgentRun.bind} sandbox bootstrap input from a validated policy document. */
42
+ export function policySandboxBootstrap(document, options = {}) {
43
+ const { toolName, entry } = resolveSideEffectingTool(document, options);
44
+ const operation = resolveHarborOperation(toolName, entry);
45
+ const evidencePreset = entry.evidence_preset;
46
+ const preset = getCompletionPreset(evidencePreset);
47
+ let requestedSpendCents = options.requestedSpendCents;
48
+ if (requestedSpendCents === undefined) {
49
+ requestedSpendCents = entry.max_spend_cents ?? preset.recommended_amount_cents ?? 0;
50
+ }
51
+ if (!Number.isFinite(requestedSpendCents) || requestedSpendCents < 0) {
52
+ throw new PaybondPolicySandboxBootstrapError("requestedSpendCents must be a non-negative number");
53
+ }
54
+ return {
55
+ kind: "sandbox",
56
+ operation,
57
+ requestedSpendCents,
58
+ currency: options.currency ?? document.intent?.budget?.currency,
59
+ evidenceSchema: options.evidenceSchema ?? preset.evidence_schema,
60
+ completionPreset: evidencePreset,
61
+ metadata: options.metadata,
62
+ idempotencyKey: options.idempotencyKey,
63
+ templateId: preset.harbor_template_id,
64
+ parameters: preset.parameters,
65
+ };
66
+ }