@paybond/kit 0.10.0 → 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 (335) 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/command-spec.d.ts +1 -0
  71. package/dist/cli/command-spec.js +286 -5
  72. package/dist/cli/commands/agent.d.ts +16 -0
  73. package/dist/cli/commands/agent.js +1135 -0
  74. package/dist/cli/commands/dev.d.ts +7 -0
  75. package/dist/cli/commands/dev.js +348 -0
  76. package/dist/cli/commands/discovery.js +3 -3
  77. package/dist/cli/commands/policy.d.ts +13 -0
  78. package/dist/cli/commands/policy.js +769 -0
  79. package/dist/cli/commands/setup.d.ts +3 -0
  80. package/dist/cli/commands/setup.js +124 -8
  81. package/dist/cli/commands/workflows.js +9 -4
  82. package/dist/cli/config.d.ts +2 -0
  83. package/dist/cli/config.js +4 -2
  84. package/dist/cli/context.js +2 -1
  85. package/dist/cli/credentials.js +2 -2
  86. package/dist/cli/doctor-agent-middleware.d.ts +5 -0
  87. package/dist/cli/doctor-agent-middleware.js +49 -0
  88. package/dist/cli/globals.d.ts +1 -0
  89. package/dist/cli/globals.js +11 -1
  90. package/dist/cli/help.d.ts +1 -1
  91. package/dist/cli/help.js +35 -3
  92. package/dist/cli/mcp-install.js +2 -2
  93. package/dist/cli/mcp-policy.d.ts +3 -0
  94. package/dist/cli/mcp-policy.js +19 -13
  95. package/dist/cli/mcp-verify-config.js +9 -11
  96. package/dist/cli/redact.js +29 -8
  97. package/dist/cli/router.js +105 -2
  98. package/dist/cli/smoke-deep-links.d.ts +15 -0
  99. package/dist/cli/smoke-deep-links.js +63 -0
  100. package/dist/cli/telemetry.d.ts +17 -0
  101. package/dist/cli/telemetry.js +94 -0
  102. package/dist/completion-catalog-digest.d.ts +2 -0
  103. package/dist/completion-catalog-digest.js +2 -0
  104. package/dist/completion-catalog-integrity.d.ts +2 -0
  105. package/dist/completion-catalog-integrity.js +17 -0
  106. package/dist/completion-catalog.d.ts +49 -0
  107. package/dist/completion-catalog.js +62 -0
  108. package/dist/completion-contract-digest.d.ts +37 -0
  109. package/dist/completion-contract-digest.js +73 -0
  110. package/dist/completion-forbidden-fields.d.ts +5 -0
  111. package/dist/completion-forbidden-fields.js +26 -0
  112. package/dist/completion-init.d.ts +8 -0
  113. package/dist/completion-init.js +334 -0
  114. package/dist/completion-resolve.d.ts +21 -0
  115. package/dist/completion-resolve.js +86 -0
  116. package/dist/completion-validate-evidence.d.ts +24 -0
  117. package/dist/completion-validate-evidence.js +145 -0
  118. package/dist/dev/offline-gateway.d.ts +24 -0
  119. package/dist/dev/offline-gateway.js +102 -0
  120. package/dist/dev/trace-buffer.d.ts +61 -0
  121. package/dist/dev/trace-buffer.js +330 -0
  122. package/dist/dev/trace-security-headers.d.ts +11 -0
  123. package/dist/dev/trace-security-headers.js +16 -0
  124. package/dist/dev/trace-server.d.ts +8 -0
  125. package/dist/dev/trace-server.js +38 -0
  126. package/dist/dev/trace-ui.d.ts +4 -0
  127. package/dist/dev/trace-ui.js +25 -0
  128. package/dist/dev/wiremock-up.d.ts +15 -0
  129. package/dist/dev/wiremock-up.js +118 -0
  130. package/dist/doctor-completion.d.ts +17 -0
  131. package/dist/doctor-completion.js +428 -0
  132. package/dist/gateway-url.d.ts +7 -0
  133. package/dist/gateway-url.js +69 -0
  134. package/dist/index.d.ts +119 -2
  135. package/dist/index.js +267 -6
  136. package/dist/init.js +374 -57
  137. package/dist/langgraph/awrap-tool-call.d.ts +25 -0
  138. package/dist/langgraph/awrap-tool-call.js +81 -0
  139. package/dist/langgraph/config.d.ts +13 -0
  140. package/dist/langgraph/config.js +11 -0
  141. package/dist/langgraph/index.d.ts +4 -0
  142. package/dist/langgraph/index.js +4 -0
  143. package/dist/langgraph/sandbox-demo.d.ts +40 -0
  144. package/dist/langgraph/sandbox-demo.js +96 -0
  145. package/dist/langgraph/tool-node.d.ts +10 -0
  146. package/dist/langgraph/tool-node.js +38 -0
  147. package/dist/login.js +7 -0
  148. package/dist/mcp/index.d.ts +1 -0
  149. package/dist/mcp/index.js +1 -0
  150. package/dist/mcp/tool-surface.d.ts +25 -0
  151. package/dist/mcp/tool-surface.js +17 -0
  152. package/dist/mcp-capability-token-cache.d.ts +24 -0
  153. package/dist/mcp-capability-token-cache.js +101 -0
  154. package/dist/mcp-evidence-policy.d.ts +48 -0
  155. package/dist/mcp-evidence-policy.js +117 -0
  156. package/dist/mcp-policy-reload.d.ts +79 -0
  157. package/dist/mcp-policy-reload.js +200 -0
  158. package/dist/mcp-sep2828-evidence.d.ts +36 -0
  159. package/dist/mcp-sep2828-evidence.js +65 -0
  160. package/dist/mcp-server.d.ts +6 -0
  161. package/dist/mcp-server.js +224 -44
  162. package/dist/openai-agents/index.d.ts +40 -0
  163. package/dist/openai-agents/index.js +151 -0
  164. package/dist/openai-agents/sandbox-demo.d.ts +34 -0
  165. package/dist/openai-agents/sandbox-demo.js +118 -0
  166. package/dist/payee-evidence.js +2 -29
  167. package/dist/policy/catalog.d.ts +31 -0
  168. package/dist/policy/catalog.js +48 -0
  169. package/dist/policy/compose-utils.d.ts +3 -0
  170. package/dist/policy/compose-utils.js +4 -0
  171. package/dist/policy/compose.d.ts +20 -0
  172. package/dist/policy/compose.js +240 -0
  173. package/dist/policy/digest.d.ts +7 -0
  174. package/dist/policy/digest.js +75 -0
  175. package/dist/policy/domain.d.ts +15 -0
  176. package/dist/policy/domain.js +28 -0
  177. package/dist/policy/guardrail-spec.d.ts +17 -0
  178. package/dist/policy/guardrail-spec.js +140 -0
  179. package/dist/policy/guardrails.d.ts +48 -0
  180. package/dist/policy/guardrails.js +72 -0
  181. package/dist/policy/index.d.ts +21 -0
  182. package/dist/policy/index.js +21 -0
  183. package/dist/policy/init.d.ts +102 -0
  184. package/dist/policy/init.js +351 -0
  185. package/dist/policy/intent-spec.d.ts +52 -0
  186. package/dist/policy/intent-spec.js +176 -0
  187. package/dist/policy/json-path.d.ts +4 -0
  188. package/dist/policy/json-path.js +23 -0
  189. package/dist/policy/layers-io.d.ts +7 -0
  190. package/dist/policy/layers-io.js +28 -0
  191. package/dist/policy/load-effective.d.ts +22 -0
  192. package/dist/policy/load-effective.js +77 -0
  193. package/dist/policy/load.d.ts +85 -0
  194. package/dist/policy/load.js +164 -0
  195. package/dist/policy/merge.d.ts +29 -0
  196. package/dist/policy/merge.js +297 -0
  197. package/dist/policy/parse-text.d.ts +2 -0
  198. package/dist/policy/parse-text.js +126 -0
  199. package/dist/policy/policy-api.d.ts +45 -0
  200. package/dist/policy/policy-api.js +61 -0
  201. package/dist/policy/presets.d.ts +19 -0
  202. package/dist/policy/presets.js +66 -0
  203. package/dist/policy/registry.d.ts +7 -0
  204. package/dist/policy/registry.js +33 -0
  205. package/dist/policy/reload.d.ts +86 -0
  206. package/dist/policy/reload.js +233 -0
  207. package/dist/policy/render-yaml.d.ts +3 -0
  208. package/dist/policy/render-yaml.js +69 -0
  209. package/dist/policy/sandbox-bootstrap.d.ts +19 -0
  210. package/dist/policy/sandbox-bootstrap.js +66 -0
  211. package/dist/policy/schema.d.ts +204 -0
  212. package/dist/policy/schema.js +255 -0
  213. package/dist/policy/snapshot.d.ts +33 -0
  214. package/dist/policy/snapshot.js +23 -0
  215. package/dist/policy/validate-remote.d.ts +43 -0
  216. package/dist/policy/validate-remote.js +104 -0
  217. package/dist/policy/validate.d.ts +36 -0
  218. package/dist/policy/validate.js +150 -0
  219. package/dist/policy/watcher.d.ts +29 -0
  220. package/dist/policy/watcher.js +112 -0
  221. package/dist/principal-intent.d.ts +52 -0
  222. package/dist/principal-intent.js +193 -37
  223. package/dist/project-init.d.ts +34 -0
  224. package/dist/project-init.js +898 -0
  225. package/dist/sep2828-signature.d.ts +10 -0
  226. package/dist/sep2828-signature.js +134 -0
  227. package/dist/solutions/api.d.ts +22 -0
  228. package/dist/solutions/api.js +40 -0
  229. package/dist/solutions/catalog.d.ts +34 -0
  230. package/dist/solutions/catalog.js +129 -0
  231. package/dist/solutions/index.d.ts +2 -0
  232. package/dist/solutions/index.js +2 -0
  233. package/dist/template-init.d.ts +54 -0
  234. package/dist/template-init.js +203 -0
  235. package/dist/vercel-ai/config.d.ts +15 -0
  236. package/dist/vercel-ai/config.js +13 -0
  237. package/dist/vercel-ai/index.d.ts +4 -0
  238. package/dist/vercel-ai/index.js +4 -0
  239. package/dist/vercel-ai/sandbox-demo.d.ts +44 -0
  240. package/dist/vercel-ai/sandbox-demo.js +153 -0
  241. package/dist/vercel-ai/tool-approval.d.ts +16 -0
  242. package/dist/vercel-ai/tool-approval.js +41 -0
  243. package/dist/vercel-ai/wrap-tools.d.ts +9 -0
  244. package/dist/vercel-ai/wrap-tools.js +40 -0
  245. package/dist/x402-receipt-evidence.d.ts +29 -0
  246. package/dist/x402-receipt-evidence.js +97 -0
  247. package/dist/x402-receipt-signature.d.ts +12 -0
  248. package/dist/x402-receipt-signature.js +211 -0
  249. package/package.json +75 -3
  250. package/solutions/aws.json +17 -0
  251. package/solutions/saas.json +17 -0
  252. package/solutions/shopping.json +17 -0
  253. package/solutions/travel.json +18 -0
  254. package/templates/manifest.json +169 -0
  255. package/templates/openai-shopping-agent/.env.example +3 -0
  256. package/templates/openai-shopping-agent/.github/workflows/smoke.yml +20 -0
  257. package/templates/openai-shopping-agent/LICENSE +201 -0
  258. package/templates/openai-shopping-agent/README.md +29 -0
  259. package/templates/openai-shopping-agent/package.json +22 -0
  260. package/templates/openai-shopping-agent/paybond.policy.yaml +22 -0
  261. package/templates/openai-shopping-agent/src/index.ts +22 -0
  262. package/templates/openai-shopping-agent/src/paybond.config.ts +51 -0
  263. package/templates/openai-shopping-agent/tsconfig.json +13 -0
  264. package/templates/paybond-aws-operator/.env.example +3 -0
  265. package/templates/paybond-aws-operator/.github/workflows/smoke.yml +20 -0
  266. package/templates/paybond-aws-operator/LICENSE +201 -0
  267. package/templates/paybond-aws-operator/README.md +29 -0
  268. package/templates/paybond-aws-operator/package.json +20 -0
  269. package/templates/paybond-aws-operator/paybond.policy.yaml +22 -0
  270. package/templates/paybond-aws-operator/src/index.ts +54 -0
  271. package/templates/paybond-aws-operator/src/paybond.config.ts +51 -0
  272. package/templates/paybond-aws-operator/tsconfig.json +13 -0
  273. package/templates/paybond-claude-agents-demo/.env.example +3 -0
  274. package/templates/paybond-claude-agents-demo/.github/workflows/smoke.yml +20 -0
  275. package/templates/paybond-claude-agents-demo/LICENSE +201 -0
  276. package/templates/paybond-claude-agents-demo/README.md +29 -0
  277. package/templates/paybond-claude-agents-demo/package.json +22 -0
  278. package/templates/paybond-claude-agents-demo/paybond.policy.yaml +22 -0
  279. package/templates/paybond-claude-agents-demo/src/index.ts +22 -0
  280. package/templates/paybond-claude-agents-demo/src/paybond.config.ts +51 -0
  281. package/templates/paybond-claude-agents-demo/tsconfig.json +13 -0
  282. package/templates/paybond-invoice-agent/.env.example +3 -0
  283. package/templates/paybond-invoice-agent/.github/workflows/smoke.yml +19 -0
  284. package/templates/paybond-invoice-agent/LICENSE +201 -0
  285. package/templates/paybond-invoice-agent/README.md +29 -0
  286. package/templates/paybond-invoice-agent/app.py +27 -0
  287. package/templates/paybond-invoice-agent/package.json +6 -0
  288. package/templates/paybond-invoice-agent/paybond.policy.yaml +22 -0
  289. package/templates/paybond-invoice-agent/paybond_config.py +45 -0
  290. package/templates/paybond-invoice-agent/requirements.txt +2 -0
  291. package/templates/paybond-mcp-coding-agent/.env.example +3 -0
  292. package/templates/paybond-mcp-coding-agent/.github/workflows/smoke.yml +20 -0
  293. package/templates/paybond-mcp-coding-agent/LICENSE +201 -0
  294. package/templates/paybond-mcp-coding-agent/README.md +39 -0
  295. package/templates/paybond-mcp-coding-agent/package.json +20 -0
  296. package/templates/paybond-mcp-coding-agent/paybond.policy.yaml +25 -0
  297. package/templates/paybond-mcp-coding-agent/src/index.ts +40 -0
  298. package/templates/paybond-mcp-coding-agent/src/paybond.config.ts +51 -0
  299. package/templates/paybond-mcp-coding-agent/tsconfig.json +13 -0
  300. package/templates/paybond-openai-agents-demo/.env.example +3 -0
  301. package/templates/paybond-openai-agents-demo/.github/workflows/smoke.yml +20 -0
  302. package/templates/paybond-openai-agents-demo/LICENSE +201 -0
  303. package/templates/paybond-openai-agents-demo/README.md +29 -0
  304. package/templates/paybond-openai-agents-demo/package.json +22 -0
  305. package/templates/paybond-openai-agents-demo/paybond.policy.yaml +22 -0
  306. package/templates/paybond-openai-agents-demo/src/index.ts +22 -0
  307. package/templates/paybond-openai-agents-demo/src/paybond.config.ts +51 -0
  308. package/templates/paybond-openai-agents-demo/tsconfig.json +13 -0
  309. package/templates/paybond-procurement-agent/.env.example +3 -0
  310. package/templates/paybond-procurement-agent/.github/workflows/smoke.yml +20 -0
  311. package/templates/paybond-procurement-agent/LICENSE +201 -0
  312. package/templates/paybond-procurement-agent/README.md +29 -0
  313. package/templates/paybond-procurement-agent/package.json +20 -0
  314. package/templates/paybond-procurement-agent/paybond.policy.yaml +25 -0
  315. package/templates/paybond-procurement-agent/src/index.ts +54 -0
  316. package/templates/paybond-procurement-agent/src/paybond.config.ts +51 -0
  317. package/templates/paybond-procurement-agent/tsconfig.json +13 -0
  318. package/templates/paybond-travel-agent/.env.example +3 -0
  319. package/templates/paybond-travel-agent/.github/workflows/smoke.yml +20 -0
  320. package/templates/paybond-travel-agent/LICENSE +201 -0
  321. package/templates/paybond-travel-agent/README.md +29 -0
  322. package/templates/paybond-travel-agent/package.json +23 -0
  323. package/templates/paybond-travel-agent/paybond.policy.yaml +22 -0
  324. package/templates/paybond-travel-agent/src/index.ts +22 -0
  325. package/templates/paybond-travel-agent/src/paybond.config.ts +51 -0
  326. package/templates/paybond-travel-agent/tsconfig.json +13 -0
  327. package/templates/paybond-vercel-shopping-agent/.env.example +3 -0
  328. package/templates/paybond-vercel-shopping-agent/.github/workflows/smoke.yml +20 -0
  329. package/templates/paybond-vercel-shopping-agent/LICENSE +201 -0
  330. package/templates/paybond-vercel-shopping-agent/README.md +29 -0
  331. package/templates/paybond-vercel-shopping-agent/package.json +22 -0
  332. package/templates/paybond-vercel-shopping-agent/paybond.policy.yaml +22 -0
  333. package/templates/paybond-vercel-shopping-agent/src/index.ts +22 -0
  334. package/templates/paybond-vercel-shopping-agent/src/paybond.config.ts +51 -0
  335. package/templates/paybond-vercel-shopping-agent/tsconfig.json +13 -0
@@ -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
+ }
@@ -0,0 +1,204 @@
1
+ import { z } from "zod";
2
+ /** Supported `paybond.policy.yaml` schema revisions. */
3
+ export declare const PAYBOND_POLICY_SCHEMA_VERSION: 1;
4
+ export declare const PAYBOND_POLICY_SCHEMA_VERSION_V2: 2;
5
+ declare const policyToolEntrySchema: z.ZodObject<{
6
+ side_effecting: z.ZodBoolean;
7
+ max_spend_cents: z.ZodOptional<z.ZodNumber>;
8
+ spend_from_args: z.ZodOptional<z.ZodString>;
9
+ evidence_preset: z.ZodOptional<z.ZodString>;
10
+ vendor_pack: z.ZodOptional<z.ZodString>;
11
+ operation: z.ZodOptional<z.ZodString>;
12
+ }, z.core.$strict>;
13
+ declare const policyToolOverrideEntrySchema: z.ZodObject<{
14
+ side_effecting: z.ZodOptional<z.ZodBoolean>;
15
+ max_spend_cents: z.ZodOptional<z.ZodNumber>;
16
+ spend_from_args: z.ZodOptional<z.ZodString>;
17
+ evidence_preset: z.ZodOptional<z.ZodString>;
18
+ vendor_pack: z.ZodOptional<z.ZodString>;
19
+ operation: z.ZodOptional<z.ZodString>;
20
+ }, z.core.$strict>;
21
+ declare const policyBindingSchema: z.ZodObject<{
22
+ template_id: z.ZodString;
23
+ version_seq: z.ZodOptional<z.ZodNumber>;
24
+ head_digest: z.ZodOptional<z.ZodString>;
25
+ }, z.core.$strict>;
26
+ declare const policyBindingOverrideSchema: z.ZodObject<{
27
+ template_id: z.ZodOptional<z.ZodString>;
28
+ version_seq: z.ZodOptional<z.ZodNumber>;
29
+ head_digest: z.ZodOptional<z.ZodString>;
30
+ }, z.core.$strict>;
31
+ declare const policyBudgetSchema: z.ZodObject<{
32
+ currency: z.ZodString;
33
+ max_spend_usd: z.ZodOptional<z.ZodNumber>;
34
+ }, z.core.$loose>;
35
+ declare const policyIntentSchema: z.ZodObject<{
36
+ policy_binding: z.ZodOptional<z.ZodObject<{
37
+ template_id: z.ZodString;
38
+ version_seq: z.ZodOptional<z.ZodNumber>;
39
+ head_digest: z.ZodOptional<z.ZodString>;
40
+ }, z.core.$strict>>;
41
+ budget: z.ZodOptional<z.ZodObject<{
42
+ currency: z.ZodString;
43
+ max_spend_usd: z.ZodOptional<z.ZodNumber>;
44
+ }, z.core.$loose>>;
45
+ allowed_tools: z.ZodOptional<z.ZodArray<z.ZodString>>;
46
+ }, z.core.$strict>;
47
+ declare const policyIntentOverrideSchema: z.ZodObject<{
48
+ policy_binding: z.ZodOptional<z.ZodObject<{
49
+ template_id: z.ZodOptional<z.ZodString>;
50
+ version_seq: z.ZodOptional<z.ZodNumber>;
51
+ head_digest: z.ZodOptional<z.ZodString>;
52
+ }, z.core.$strict>>;
53
+ budget: z.ZodOptional<z.ZodObject<{
54
+ currency: z.ZodString;
55
+ max_spend_usd: z.ZodOptional<z.ZodNumber>;
56
+ }, z.core.$loose>>;
57
+ allowed_tools: z.ZodOptional<z.ZodArray<z.ZodString>>;
58
+ }, z.core.$strict>;
59
+ declare const policyExtendsSchema: z.ZodObject<{
60
+ org_policy_id: z.ZodString;
61
+ org_id: z.ZodString;
62
+ base_digest: z.ZodOptional<z.ZodString>;
63
+ base_policy: z.ZodOptional<z.ZodString>;
64
+ }, z.core.$strict>;
65
+ declare const policyOverridesSchema: z.ZodObject<{
66
+ default_deny: z.ZodOptional<z.ZodBoolean>;
67
+ tools: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
68
+ side_effecting: z.ZodOptional<z.ZodBoolean>;
69
+ max_spend_cents: z.ZodOptional<z.ZodNumber>;
70
+ spend_from_args: z.ZodOptional<z.ZodString>;
71
+ evidence_preset: z.ZodOptional<z.ZodString>;
72
+ vendor_pack: z.ZodOptional<z.ZodString>;
73
+ operation: z.ZodOptional<z.ZodString>;
74
+ }, z.core.$strict>>>;
75
+ intent: z.ZodOptional<z.ZodObject<{
76
+ policy_binding: z.ZodOptional<z.ZodObject<{
77
+ template_id: z.ZodOptional<z.ZodString>;
78
+ version_seq: z.ZodOptional<z.ZodNumber>;
79
+ head_digest: z.ZodOptional<z.ZodString>;
80
+ }, z.core.$strict>>;
81
+ budget: z.ZodOptional<z.ZodObject<{
82
+ currency: z.ZodString;
83
+ max_spend_usd: z.ZodOptional<z.ZodNumber>;
84
+ }, z.core.$loose>>;
85
+ allowed_tools: z.ZodOptional<z.ZodArray<z.ZodString>>;
86
+ }, z.core.$strict>>;
87
+ }, z.core.$strict>;
88
+ export declare const paybondPolicyDocumentV1Schema: z.ZodObject<{
89
+ version: z.ZodLiteral<1>;
90
+ name: z.ZodString;
91
+ default_deny: z.ZodBoolean;
92
+ tools: z.ZodRecord<z.ZodString, z.ZodObject<{
93
+ side_effecting: z.ZodBoolean;
94
+ max_spend_cents: z.ZodOptional<z.ZodNumber>;
95
+ spend_from_args: z.ZodOptional<z.ZodString>;
96
+ evidence_preset: z.ZodOptional<z.ZodString>;
97
+ vendor_pack: z.ZodOptional<z.ZodString>;
98
+ operation: z.ZodOptional<z.ZodString>;
99
+ }, z.core.$strict>>;
100
+ intent: z.ZodOptional<z.ZodObject<{
101
+ policy_binding: z.ZodOptional<z.ZodObject<{
102
+ template_id: z.ZodString;
103
+ version_seq: z.ZodOptional<z.ZodNumber>;
104
+ head_digest: z.ZodOptional<z.ZodString>;
105
+ }, z.core.$strict>>;
106
+ budget: z.ZodOptional<z.ZodObject<{
107
+ currency: z.ZodString;
108
+ max_spend_usd: z.ZodOptional<z.ZodNumber>;
109
+ }, z.core.$loose>>;
110
+ allowed_tools: z.ZodOptional<z.ZodArray<z.ZodString>>;
111
+ }, z.core.$strict>>;
112
+ }, z.core.$strict>;
113
+ export declare const paybondPolicyDocumentV2Schema: z.ZodObject<{
114
+ version: z.ZodLiteral<2>;
115
+ name: z.ZodString;
116
+ default_deny: z.ZodBoolean;
117
+ extends: z.ZodOptional<z.ZodObject<{
118
+ org_policy_id: z.ZodString;
119
+ org_id: z.ZodString;
120
+ base_digest: z.ZodOptional<z.ZodString>;
121
+ base_policy: z.ZodOptional<z.ZodString>;
122
+ }, z.core.$strict>>;
123
+ overrides: z.ZodOptional<z.ZodObject<{
124
+ default_deny: z.ZodOptional<z.ZodBoolean>;
125
+ tools: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
126
+ side_effecting: z.ZodOptional<z.ZodBoolean>;
127
+ max_spend_cents: z.ZodOptional<z.ZodNumber>;
128
+ spend_from_args: z.ZodOptional<z.ZodString>;
129
+ evidence_preset: z.ZodOptional<z.ZodString>;
130
+ vendor_pack: z.ZodOptional<z.ZodString>;
131
+ operation: z.ZodOptional<z.ZodString>;
132
+ }, z.core.$strict>>>;
133
+ intent: z.ZodOptional<z.ZodObject<{
134
+ policy_binding: z.ZodOptional<z.ZodObject<{
135
+ template_id: z.ZodOptional<z.ZodString>;
136
+ version_seq: z.ZodOptional<z.ZodNumber>;
137
+ head_digest: z.ZodOptional<z.ZodString>;
138
+ }, z.core.$strict>>;
139
+ budget: z.ZodOptional<z.ZodObject<{
140
+ currency: z.ZodString;
141
+ max_spend_usd: z.ZodOptional<z.ZodNumber>;
142
+ }, z.core.$loose>>;
143
+ allowed_tools: z.ZodOptional<z.ZodArray<z.ZodString>>;
144
+ }, z.core.$strict>>;
145
+ }, z.core.$strict>>;
146
+ tools: z.ZodRecord<z.ZodString, z.ZodObject<{
147
+ side_effecting: z.ZodBoolean;
148
+ max_spend_cents: z.ZodOptional<z.ZodNumber>;
149
+ spend_from_args: z.ZodOptional<z.ZodString>;
150
+ evidence_preset: z.ZodOptional<z.ZodString>;
151
+ vendor_pack: z.ZodOptional<z.ZodString>;
152
+ operation: z.ZodOptional<z.ZodString>;
153
+ }, z.core.$strict>>;
154
+ intent: z.ZodOptional<z.ZodObject<{
155
+ policy_binding: z.ZodOptional<z.ZodObject<{
156
+ template_id: z.ZodString;
157
+ version_seq: z.ZodOptional<z.ZodNumber>;
158
+ head_digest: z.ZodOptional<z.ZodString>;
159
+ }, z.core.$strict>>;
160
+ budget: z.ZodOptional<z.ZodObject<{
161
+ currency: z.ZodString;
162
+ max_spend_usd: z.ZodOptional<z.ZodNumber>;
163
+ }, z.core.$loose>>;
164
+ allowed_tools: z.ZodOptional<z.ZodArray<z.ZodString>>;
165
+ }, z.core.$strict>>;
166
+ }, z.core.$strict>;
167
+ export type PaybondPolicyToolEntry = z.infer<typeof policyToolEntrySchema>;
168
+ export type PaybondPolicyToolOverrideEntry = z.infer<typeof policyToolOverrideEntrySchema>;
169
+ export type PaybondPolicyBinding = z.infer<typeof policyBindingSchema>;
170
+ export type PaybondPolicyBindingOverride = z.infer<typeof policyBindingOverrideSchema>;
171
+ export type PaybondPolicyBudget = z.infer<typeof policyBudgetSchema>;
172
+ export type PaybondPolicyIntentSection = z.infer<typeof policyIntentSchema>;
173
+ export type PaybondPolicyIntentOverrideSection = z.infer<typeof policyIntentOverrideSchema>;
174
+ export type PaybondPolicyExtends = z.infer<typeof policyExtendsSchema>;
175
+ export type PaybondPolicyOverrides = z.infer<typeof policyOverridesSchema>;
176
+ export type PaybondPolicyDocumentV1 = z.infer<typeof paybondPolicyDocumentV1Schema>;
177
+ export type PaybondPolicyDocumentV2 = z.infer<typeof paybondPolicyDocumentV2Schema>;
178
+ export type PaybondPolicyDocument = PaybondPolicyDocumentV1 | PaybondPolicyDocumentV2;
179
+ export type PaybondPolicyValidationIssue = {
180
+ path: string;
181
+ code: string;
182
+ message: string;
183
+ };
184
+ /** Raised when a policy document fails schema validation. */
185
+ export declare class PaybondPolicyValidationError extends Error {
186
+ readonly issues: PaybondPolicyValidationIssue[];
187
+ constructor(message: string, issues?: PaybondPolicyValidationIssue[]);
188
+ }
189
+ /**
190
+ * Parse and validate a raw policy document (already-decoded JSON or YAML object).
191
+ * Accepts v1 flat policies and v2 org-base or tenant-overlay documents.
192
+ */
193
+ export declare function parsePaybondPolicyDocument(raw: unknown): PaybondPolicyDocument;
194
+ /** Parse a v1-only policy document. */
195
+ export declare function parsePaybondPolicyDocumentV1(raw: unknown): PaybondPolicyDocumentV1;
196
+ /** Parse a v2 policy document (org base or tenant overlay). */
197
+ export declare function parsePaybondPolicyDocumentV2(raw: unknown): PaybondPolicyDocumentV2;
198
+ /** Type guard for an already-validated v1 policy document. */
199
+ export declare function isPaybondPolicyDocumentV1(value: unknown): value is PaybondPolicyDocumentV1;
200
+ /** Type guard for an already-validated v2 policy document. */
201
+ export declare function isPaybondPolicyDocumentV2(value: unknown): value is PaybondPolicyDocumentV2;
202
+ /** True when a v2 document is a tenant overlay (declares extends). */
203
+ export declare function isPaybondPolicyOverlay(document: PaybondPolicyDocumentV2): boolean;
204
+ export {};