@paybond/kit 0.10.0 → 0.11.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 (346) hide show
  1. package/README.md +59 -15
  2. package/completion-presets/catalog.json +1187 -0
  3. package/completion-presets/catalog.sha256 +1 -0
  4. package/dev/trace-ui/dashboard.html +617 -0
  5. package/dist/agent/adapter.d.ts +51 -0
  6. package/dist/agent/adapter.js +66 -0
  7. package/dist/agent/attach-bundle.d.ts +37 -0
  8. package/dist/agent/attach-bundle.js +118 -0
  9. package/dist/agent/authorization-cache.d.ts +22 -0
  10. package/dist/agent/authorization-cache.js +36 -0
  11. package/dist/agent/deferred-tools.d.ts +11 -0
  12. package/dist/agent/deferred-tools.js +62 -0
  13. package/dist/agent/discover.d.ts +41 -0
  14. package/dist/agent/discover.js +147 -0
  15. package/dist/agent/evidence.d.ts +9 -0
  16. package/dist/agent/evidence.js +28 -0
  17. package/dist/agent/facade.d.ts +48 -0
  18. package/dist/agent/facade.js +112 -0
  19. package/dist/agent/gateway-trace-reporter.d.ts +28 -0
  20. package/dist/agent/gateway-trace-reporter.js +49 -0
  21. package/dist/agent/generic-runner.d.ts +14 -0
  22. package/dist/agent/generic-runner.js +49 -0
  23. package/dist/agent/generic-sandbox-demo.d.ts +36 -0
  24. package/dist/agent/generic-sandbox-demo.js +82 -0
  25. package/dist/agent/guarded-agent.d.ts +49 -0
  26. package/dist/agent/guarded-agent.js +100 -0
  27. package/dist/agent/index.d.ts +13 -0
  28. package/dist/agent/index.js +13 -0
  29. package/dist/agent/instrument.d.ts +156 -0
  30. package/dist/agent/instrument.js +442 -0
  31. package/dist/agent/interceptor.d.ts +24 -0
  32. package/dist/agent/interceptor.js +440 -0
  33. package/dist/agent/lazy-context-tools.d.ts +15 -0
  34. package/dist/agent/lazy-context-tools.js +81 -0
  35. package/dist/agent/registry-file.d.ts +39 -0
  36. package/dist/agent/registry-file.js +219 -0
  37. package/dist/agent/registry.d.ts +37 -0
  38. package/dist/agent/registry.js +128 -0
  39. package/dist/agent/run.d.ts +124 -0
  40. package/dist/agent/run.js +301 -0
  41. package/dist/agent/types.d.ts +318 -0
  42. package/dist/agent/types.js +42 -0
  43. package/dist/agent-recognition.d.ts +72 -0
  44. package/dist/agent-recognition.js +165 -0
  45. package/dist/bincode-wire.d.ts +18 -0
  46. package/dist/bincode-wire.js +93 -0
  47. package/dist/claude-agents/config.d.ts +21 -0
  48. package/dist/claude-agents/config.js +145 -0
  49. package/dist/claude-agents/index.d.ts +2 -0
  50. package/dist/claude-agents/index.js +2 -0
  51. package/dist/claude-agents/sandbox-demo.d.ts +30 -0
  52. package/dist/claude-agents/sandbox-demo.js +91 -0
  53. package/dist/cli/agent/demo-loaders.d.ts +4 -0
  54. package/dist/cli/agent/demo-loaders.js +66 -0
  55. package/dist/cli/agent/env-quote.d.ts +1 -0
  56. package/dist/cli/agent/env-quote.js +6 -0
  57. package/dist/cli/agent/env-write.d.ts +8 -0
  58. package/dist/cli/agent/env-write.js +47 -0
  59. package/dist/cli/agent/paybond.d.ts +16 -0
  60. package/dist/cli/agent/paybond.js +55 -0
  61. package/dist/cli/agent/policy-file.d.ts +29 -0
  62. package/dist/cli/agent/policy-file.js +61 -0
  63. package/dist/cli/agent/production-evidence.d.ts +24 -0
  64. package/dist/cli/agent/production-evidence.js +98 -0
  65. package/dist/cli/agent/run-store.d.ts +30 -0
  66. package/dist/cli/agent/run-store.js +42 -0
  67. package/dist/cli/agent/run-trace-store.d.ts +39 -0
  68. package/dist/cli/agent/run-trace-store.js +143 -0
  69. package/dist/cli/agent-run-trace-table.d.ts +9 -0
  70. package/dist/cli/agent-run-trace-table.js +24 -0
  71. package/dist/cli/agent-sandbox-smoke-checklist.d.ts +9 -0
  72. package/dist/cli/agent-sandbox-smoke-checklist.js +50 -0
  73. package/dist/cli/command-spec.d.ts +1 -0
  74. package/dist/cli/command-spec.js +286 -5
  75. package/dist/cli/commands/agent.d.ts +16 -0
  76. package/dist/cli/commands/agent.js +1136 -0
  77. package/dist/cli/commands/dev.d.ts +7 -0
  78. package/dist/cli/commands/dev.js +348 -0
  79. package/dist/cli/commands/discovery.js +3 -3
  80. package/dist/cli/commands/policy.d.ts +13 -0
  81. package/dist/cli/commands/policy.js +769 -0
  82. package/dist/cli/commands/setup.d.ts +3 -0
  83. package/dist/cli/commands/setup.js +124 -8
  84. package/dist/cli/commands/workflows.js +9 -4
  85. package/dist/cli/config.d.ts +2 -0
  86. package/dist/cli/config.js +4 -2
  87. package/dist/cli/context.js +2 -1
  88. package/dist/cli/credentials.js +2 -2
  89. package/dist/cli/doctor-agent-middleware.d.ts +5 -0
  90. package/dist/cli/doctor-agent-middleware.js +49 -0
  91. package/dist/cli/globals.d.ts +1 -0
  92. package/dist/cli/globals.js +11 -1
  93. package/dist/cli/help.d.ts +1 -1
  94. package/dist/cli/help.js +35 -3
  95. package/dist/cli/mcp-install.js +2 -2
  96. package/dist/cli/mcp-policy.d.ts +3 -0
  97. package/dist/cli/mcp-policy.js +19 -13
  98. package/dist/cli/mcp-verify-config.js +9 -11
  99. package/dist/cli/redact.js +29 -8
  100. package/dist/cli/router.js +105 -2
  101. package/dist/cli/smoke-deep-links.d.ts +15 -0
  102. package/dist/cli/smoke-deep-links.js +63 -0
  103. package/dist/cli/telemetry.d.ts +17 -0
  104. package/dist/cli/telemetry.js +94 -0
  105. package/dist/completion-catalog-digest.d.ts +2 -0
  106. package/dist/completion-catalog-digest.js +2 -0
  107. package/dist/completion-catalog-integrity.d.ts +2 -0
  108. package/dist/completion-catalog-integrity.js +17 -0
  109. package/dist/completion-catalog.d.ts +49 -0
  110. package/dist/completion-catalog.js +62 -0
  111. package/dist/completion-contract-digest.d.ts +37 -0
  112. package/dist/completion-contract-digest.js +73 -0
  113. package/dist/completion-forbidden-fields.d.ts +5 -0
  114. package/dist/completion-forbidden-fields.js +26 -0
  115. package/dist/completion-init.d.ts +8 -0
  116. package/dist/completion-init.js +334 -0
  117. package/dist/completion-resolve.d.ts +21 -0
  118. package/dist/completion-resolve.js +86 -0
  119. package/dist/completion-validate-evidence.d.ts +24 -0
  120. package/dist/completion-validate-evidence.js +145 -0
  121. package/dist/dev/offline-gateway.d.ts +24 -0
  122. package/dist/dev/offline-gateway.js +102 -0
  123. package/dist/dev/trace-buffer.d.ts +61 -0
  124. package/dist/dev/trace-buffer.js +330 -0
  125. package/dist/dev/trace-security-headers.d.ts +11 -0
  126. package/dist/dev/trace-security-headers.js +16 -0
  127. package/dist/dev/trace-server.d.ts +8 -0
  128. package/dist/dev/trace-server.js +38 -0
  129. package/dist/dev/trace-ui.d.ts +4 -0
  130. package/dist/dev/trace-ui.js +25 -0
  131. package/dist/dev/wiremock-up.d.ts +15 -0
  132. package/dist/dev/wiremock-up.js +118 -0
  133. package/dist/doctor-completion.d.ts +17 -0
  134. package/dist/doctor-completion.js +428 -0
  135. package/dist/gateway-url.d.ts +7 -0
  136. package/dist/gateway-url.js +69 -0
  137. package/dist/index.d.ts +119 -2
  138. package/dist/index.js +267 -6
  139. package/dist/init.js +374 -57
  140. package/dist/langgraph/awrap-tool-call.d.ts +25 -0
  141. package/dist/langgraph/awrap-tool-call.js +81 -0
  142. package/dist/langgraph/config.d.ts +13 -0
  143. package/dist/langgraph/config.js +11 -0
  144. package/dist/langgraph/index.d.ts +4 -0
  145. package/dist/langgraph/index.js +4 -0
  146. package/dist/langgraph/sandbox-demo.d.ts +40 -0
  147. package/dist/langgraph/sandbox-demo.js +96 -0
  148. package/dist/langgraph/tool-node.d.ts +10 -0
  149. package/dist/langgraph/tool-node.js +38 -0
  150. package/dist/login.js +7 -0
  151. package/dist/mcp/index.d.ts +1 -0
  152. package/dist/mcp/index.js +1 -0
  153. package/dist/mcp/tool-surface.d.ts +25 -0
  154. package/dist/mcp/tool-surface.js +17 -0
  155. package/dist/mcp-capability-token-cache.d.ts +24 -0
  156. package/dist/mcp-capability-token-cache.js +101 -0
  157. package/dist/mcp-evidence-policy.d.ts +48 -0
  158. package/dist/mcp-evidence-policy.js +117 -0
  159. package/dist/mcp-policy-reload.d.ts +79 -0
  160. package/dist/mcp-policy-reload.js +200 -0
  161. package/dist/mcp-sep2828-evidence.d.ts +36 -0
  162. package/dist/mcp-sep2828-evidence.js +65 -0
  163. package/dist/mcp-server.d.ts +6 -0
  164. package/dist/mcp-server.js +224 -44
  165. package/dist/openai-agents/index.d.ts +40 -0
  166. package/dist/openai-agents/index.js +151 -0
  167. package/dist/openai-agents/sandbox-demo.d.ts +34 -0
  168. package/dist/openai-agents/sandbox-demo.js +118 -0
  169. package/dist/payee-evidence.js +2 -29
  170. package/dist/policy/catalog.d.ts +31 -0
  171. package/dist/policy/catalog.js +48 -0
  172. package/dist/policy/compose-utils.d.ts +3 -0
  173. package/dist/policy/compose-utils.js +4 -0
  174. package/dist/policy/compose.d.ts +20 -0
  175. package/dist/policy/compose.js +240 -0
  176. package/dist/policy/digest.d.ts +7 -0
  177. package/dist/policy/digest.js +75 -0
  178. package/dist/policy/domain.d.ts +15 -0
  179. package/dist/policy/domain.js +28 -0
  180. package/dist/policy/guardrail-spec.d.ts +17 -0
  181. package/dist/policy/guardrail-spec.js +140 -0
  182. package/dist/policy/guardrails.d.ts +48 -0
  183. package/dist/policy/guardrails.js +72 -0
  184. package/dist/policy/index.d.ts +21 -0
  185. package/dist/policy/index.js +21 -0
  186. package/dist/policy/init.d.ts +102 -0
  187. package/dist/policy/init.js +351 -0
  188. package/dist/policy/intent-spec.d.ts +52 -0
  189. package/dist/policy/intent-spec.js +176 -0
  190. package/dist/policy/json-path.d.ts +4 -0
  191. package/dist/policy/json-path.js +23 -0
  192. package/dist/policy/layers-io.d.ts +7 -0
  193. package/dist/policy/layers-io.js +28 -0
  194. package/dist/policy/load-effective.d.ts +22 -0
  195. package/dist/policy/load-effective.js +77 -0
  196. package/dist/policy/load.d.ts +85 -0
  197. package/dist/policy/load.js +164 -0
  198. package/dist/policy/merge.d.ts +29 -0
  199. package/dist/policy/merge.js +297 -0
  200. package/dist/policy/parse-text.d.ts +2 -0
  201. package/dist/policy/parse-text.js +126 -0
  202. package/dist/policy/policy-api.d.ts +45 -0
  203. package/dist/policy/policy-api.js +61 -0
  204. package/dist/policy/presets.d.ts +19 -0
  205. package/dist/policy/presets.js +66 -0
  206. package/dist/policy/registry.d.ts +7 -0
  207. package/dist/policy/registry.js +33 -0
  208. package/dist/policy/reload.d.ts +86 -0
  209. package/dist/policy/reload.js +233 -0
  210. package/dist/policy/render-yaml.d.ts +3 -0
  211. package/dist/policy/render-yaml.js +69 -0
  212. package/dist/policy/sandbox-bootstrap.d.ts +19 -0
  213. package/dist/policy/sandbox-bootstrap.js +66 -0
  214. package/dist/policy/schema.d.ts +204 -0
  215. package/dist/policy/schema.js +255 -0
  216. package/dist/policy/snapshot.d.ts +33 -0
  217. package/dist/policy/snapshot.js +23 -0
  218. package/dist/policy/validate-remote.d.ts +43 -0
  219. package/dist/policy/validate-remote.js +104 -0
  220. package/dist/policy/validate.d.ts +36 -0
  221. package/dist/policy/validate.js +150 -0
  222. package/dist/policy/watcher.d.ts +29 -0
  223. package/dist/policy/watcher.js +112 -0
  224. package/dist/principal-intent.d.ts +52 -0
  225. package/dist/principal-intent.js +193 -37
  226. package/dist/project-init.d.ts +34 -0
  227. package/dist/project-init.js +898 -0
  228. package/dist/sep2828-signature.d.ts +10 -0
  229. package/dist/sep2828-signature.js +134 -0
  230. package/dist/solutions/api.d.ts +22 -0
  231. package/dist/solutions/api.js +40 -0
  232. package/dist/solutions/catalog.d.ts +34 -0
  233. package/dist/solutions/catalog.js +129 -0
  234. package/dist/solutions/index.d.ts +2 -0
  235. package/dist/solutions/index.js +2 -0
  236. package/dist/template-init.d.ts +54 -0
  237. package/dist/template-init.js +203 -0
  238. package/dist/vercel-ai/config.d.ts +15 -0
  239. package/dist/vercel-ai/config.js +13 -0
  240. package/dist/vercel-ai/index.d.ts +4 -0
  241. package/dist/vercel-ai/index.js +4 -0
  242. package/dist/vercel-ai/sandbox-demo.d.ts +44 -0
  243. package/dist/vercel-ai/sandbox-demo.js +153 -0
  244. package/dist/vercel-ai/tool-approval.d.ts +16 -0
  245. package/dist/vercel-ai/tool-approval.js +41 -0
  246. package/dist/vercel-ai/wrap-tools.d.ts +9 -0
  247. package/dist/vercel-ai/wrap-tools.js +40 -0
  248. package/dist/x402-receipt-evidence.d.ts +29 -0
  249. package/dist/x402-receipt-evidence.js +97 -0
  250. package/dist/x402-receipt-signature.d.ts +12 -0
  251. package/dist/x402-receipt-signature.js +211 -0
  252. package/package.json +75 -3
  253. package/solutions/aws.json +17 -0
  254. package/solutions/saas.json +17 -0
  255. package/solutions/shopping.json +17 -0
  256. package/solutions/travel.json +18 -0
  257. package/templates/manifest.json +169 -0
  258. package/templates/openai-shopping-agent/.env.example +3 -0
  259. package/templates/openai-shopping-agent/.github/workflows/smoke.yml +20 -0
  260. package/templates/openai-shopping-agent/LICENSE +201 -0
  261. package/templates/openai-shopping-agent/README.md +29 -0
  262. package/templates/openai-shopping-agent/package-lock.json +1525 -0
  263. package/templates/openai-shopping-agent/package.json +22 -0
  264. package/templates/openai-shopping-agent/paybond.policy.yaml +22 -0
  265. package/templates/openai-shopping-agent/src/index.ts +22 -0
  266. package/templates/openai-shopping-agent/src/paybond.config.ts +51 -0
  267. package/templates/openai-shopping-agent/tsconfig.json +13 -0
  268. package/templates/paybond-aws-operator/.env.example +3 -0
  269. package/templates/paybond-aws-operator/.github/workflows/smoke.yml +20 -0
  270. package/templates/paybond-aws-operator/LICENSE +201 -0
  271. package/templates/paybond-aws-operator/README.md +29 -0
  272. package/templates/paybond-aws-operator/package-lock.json +151 -0
  273. package/templates/paybond-aws-operator/package.json +20 -0
  274. package/templates/paybond-aws-operator/paybond.policy.yaml +22 -0
  275. package/templates/paybond-aws-operator/src/index.ts +54 -0
  276. package/templates/paybond-aws-operator/src/paybond.config.ts +51 -0
  277. package/templates/paybond-aws-operator/tsconfig.json +13 -0
  278. package/templates/paybond-claude-agents-demo/.env.example +3 -0
  279. package/templates/paybond-claude-agents-demo/.github/workflows/smoke.yml +20 -0
  280. package/templates/paybond-claude-agents-demo/LICENSE +201 -0
  281. package/templates/paybond-claude-agents-demo/README.md +29 -0
  282. package/templates/paybond-claude-agents-demo/package-lock.json +1489 -0
  283. package/templates/paybond-claude-agents-demo/package.json +22 -0
  284. package/templates/paybond-claude-agents-demo/paybond.policy.yaml +22 -0
  285. package/templates/paybond-claude-agents-demo/src/index.ts +22 -0
  286. package/templates/paybond-claude-agents-demo/src/paybond.config.ts +51 -0
  287. package/templates/paybond-claude-agents-demo/tsconfig.json +13 -0
  288. package/templates/paybond-invoice-agent/.env.example +3 -0
  289. package/templates/paybond-invoice-agent/.github/workflows/smoke.yml +19 -0
  290. package/templates/paybond-invoice-agent/LICENSE +201 -0
  291. package/templates/paybond-invoice-agent/README.md +29 -0
  292. package/templates/paybond-invoice-agent/app.py +27 -0
  293. package/templates/paybond-invoice-agent/package.json +6 -0
  294. package/templates/paybond-invoice-agent/paybond.policy.yaml +22 -0
  295. package/templates/paybond-invoice-agent/paybond_config.py +45 -0
  296. package/templates/paybond-invoice-agent/requirements.txt +2 -0
  297. package/templates/paybond-mcp-coding-agent/.env.example +3 -0
  298. package/templates/paybond-mcp-coding-agent/.github/workflows/smoke.yml +20 -0
  299. package/templates/paybond-mcp-coding-agent/LICENSE +201 -0
  300. package/templates/paybond-mcp-coding-agent/README.md +39 -0
  301. package/templates/paybond-mcp-coding-agent/package-lock.json +151 -0
  302. package/templates/paybond-mcp-coding-agent/package.json +20 -0
  303. package/templates/paybond-mcp-coding-agent/paybond.policy.yaml +25 -0
  304. package/templates/paybond-mcp-coding-agent/src/index.ts +40 -0
  305. package/templates/paybond-mcp-coding-agent/src/paybond.config.ts +51 -0
  306. package/templates/paybond-mcp-coding-agent/tsconfig.json +13 -0
  307. package/templates/paybond-openai-agents-demo/.env.example +3 -0
  308. package/templates/paybond-openai-agents-demo/.github/workflows/smoke.yml +20 -0
  309. package/templates/paybond-openai-agents-demo/LICENSE +201 -0
  310. package/templates/paybond-openai-agents-demo/README.md +29 -0
  311. package/templates/paybond-openai-agents-demo/package-lock.json +1525 -0
  312. package/templates/paybond-openai-agents-demo/package.json +22 -0
  313. package/templates/paybond-openai-agents-demo/paybond.policy.yaml +22 -0
  314. package/templates/paybond-openai-agents-demo/src/index.ts +22 -0
  315. package/templates/paybond-openai-agents-demo/src/paybond.config.ts +51 -0
  316. package/templates/paybond-openai-agents-demo/tsconfig.json +13 -0
  317. package/templates/paybond-procurement-agent/.env.example +3 -0
  318. package/templates/paybond-procurement-agent/.github/workflows/smoke.yml +20 -0
  319. package/templates/paybond-procurement-agent/LICENSE +201 -0
  320. package/templates/paybond-procurement-agent/README.md +29 -0
  321. package/templates/paybond-procurement-agent/package-lock.json +151 -0
  322. package/templates/paybond-procurement-agent/package.json +20 -0
  323. package/templates/paybond-procurement-agent/paybond.policy.yaml +25 -0
  324. package/templates/paybond-procurement-agent/src/index.ts +54 -0
  325. package/templates/paybond-procurement-agent/src/paybond.config.ts +51 -0
  326. package/templates/paybond-procurement-agent/tsconfig.json +13 -0
  327. package/templates/paybond-travel-agent/.env.example +3 -0
  328. package/templates/paybond-travel-agent/.github/workflows/smoke.yml +20 -0
  329. package/templates/paybond-travel-agent/LICENSE +201 -0
  330. package/templates/paybond-travel-agent/README.md +29 -0
  331. package/templates/paybond-travel-agent/package-lock.json +444 -0
  332. package/templates/paybond-travel-agent/package.json +23 -0
  333. package/templates/paybond-travel-agent/paybond.policy.yaml +22 -0
  334. package/templates/paybond-travel-agent/src/index.ts +22 -0
  335. package/templates/paybond-travel-agent/src/paybond.config.ts +51 -0
  336. package/templates/paybond-travel-agent/tsconfig.json +13 -0
  337. package/templates/paybond-vercel-shopping-agent/.env.example +3 -0
  338. package/templates/paybond-vercel-shopping-agent/.github/workflows/smoke.yml +20 -0
  339. package/templates/paybond-vercel-shopping-agent/LICENSE +201 -0
  340. package/templates/paybond-vercel-shopping-agent/README.md +29 -0
  341. package/templates/paybond-vercel-shopping-agent/package-lock.json +265 -0
  342. package/templates/paybond-vercel-shopping-agent/package.json +22 -0
  343. package/templates/paybond-vercel-shopping-agent/paybond.policy.yaml +22 -0
  344. package/templates/paybond-vercel-shopping-agent/src/index.ts +22 -0
  345. package/templates/paybond-vercel-shopping-agent/src/paybond.config.ts +51 -0
  346. package/templates/paybond-vercel-shopping-agent/tsconfig.json +13 -0
@@ -0,0 +1,200 @@
1
+ import { resolve } from "node:path";
2
+ import { PaybondUnregisteredSideEffectingToolError } from "./agent/types.js";
3
+ import { loadPolicySnapshotFromFile, reloadPolicyOnHandle, } from "./policy/reload.js";
4
+ import { parsePolicyEffectiveResolveResponse, } from "./policy/load-effective.js";
5
+ import { parsePolicyRemoteValidateResponse, policyValidateQueryString, } from "./policy/validate-remote.js";
6
+ import { PaybondPolicyReloadController } from "./policy/watcher.js";
7
+ export const MCP_POLICY_FILE_ENV = "PAYBOND_POLICY_FILE";
8
+ export const MCP_POLICY_RELOAD_ENV = "PAYBOND_POLICY_RELOAD";
9
+ export const MCP_POLICY_RELOAD_ALLOW_LOOSEN_ENV = "PAYBOND_POLICY_RELOAD_ALLOW_LOOSEN";
10
+ export class McpPolicyReloadError extends Error {
11
+ constructor(message) {
12
+ super(message);
13
+ this.name = "McpPolicyReloadError";
14
+ }
15
+ }
16
+ export function createMcpPolicyGatewayAdapter(client) {
17
+ return {
18
+ async validatePolicy(document, options) {
19
+ const qs = policyValidateQueryString(options ?? {});
20
+ const body = await client.postJSON(`/v1/policy/validate${qs}`, document);
21
+ return parsePolicyRemoteValidateResponse(body);
22
+ },
23
+ async resolvePolicyEffective(orgPolicyId, overlay, options) {
24
+ let path = `/v1/org-policies/${encodeURIComponent(orgPolicyId)}/effective`;
25
+ const currentDigest = options?.currentDigest?.trim();
26
+ if (currentDigest) {
27
+ path += `?digest=${encodeURIComponent(currentDigest)}`;
28
+ }
29
+ const body = await client.postJSON(path, overlay);
30
+ return parsePolicyEffectiveResolveResponse(body);
31
+ },
32
+ };
33
+ }
34
+ export function parseMcpPolicyReloadMode(raw) {
35
+ const value = (raw ?? "").trim().toLowerCase();
36
+ if (!value || value === "off") {
37
+ return "off";
38
+ }
39
+ if (value === "watch" || value === "poll") {
40
+ return value;
41
+ }
42
+ throw new Error("invalid PAYBOND_POLICY_RELOAD (expected watch|poll|off)");
43
+ }
44
+ export function parseMcpPolicyReloadConfig(env) {
45
+ const policyFile = (env[MCP_POLICY_FILE_ENV] ?? "").trim();
46
+ if (!policyFile) {
47
+ return null;
48
+ }
49
+ return {
50
+ policyFile: resolve(policyFile),
51
+ reloadMode: parseMcpPolicyReloadMode(env[MCP_POLICY_RELOAD_ENV]),
52
+ allowLoosen: env[MCP_POLICY_RELOAD_ALLOW_LOOSEN_ENV] === "1",
53
+ };
54
+ }
55
+ /** MCP reload controller shim — delegates to {@link McpPolicyReloadGate}. */
56
+ class McpPolicyReloadRunner {
57
+ gate;
58
+ constructor(gate) {
59
+ this.gate = gate;
60
+ }
61
+ reloadPolicy(options) {
62
+ return this.gate.reloadPolicy(options);
63
+ }
64
+ }
65
+ /**
66
+ * Long-lived MCP policy gate: versioned snapshot, safe reload, and spend-gate registry checks.
67
+ */
68
+ export class McpPolicyReloadGate {
69
+ config;
70
+ _snapshot;
71
+ _inFlightCount = 0;
72
+ _lastAllowedTools = [];
73
+ _controller;
74
+ _reloadDefaults = {};
75
+ policyFilePath;
76
+ lastReloadAt;
77
+ lastReloadError;
78
+ constructor(config, snapshot) {
79
+ this.config = config;
80
+ this.policyFilePath = config.policyFile;
81
+ this._snapshot = snapshot;
82
+ }
83
+ static async open(config, options) {
84
+ const snapshot = await loadPolicySnapshotFromFile(config.policyFile);
85
+ const gate = new McpPolicyReloadGate(config, snapshot);
86
+ const runner = new McpPolicyReloadRunner(gate);
87
+ gate._reloadDefaults = {
88
+ file: config.policyFile,
89
+ allowLoosen: config.allowLoosen,
90
+ gateway: options?.gateway,
91
+ };
92
+ if (config.reloadMode === "watch") {
93
+ gate._controller = PaybondPolicyReloadController.start(runner, { watch: { debounceMs: config.watchDebounceMs } }, config.policyFile);
94
+ }
95
+ else if (config.reloadMode === "poll") {
96
+ gate._reloadDefaults.remote = true;
97
+ gate._reloadDefaults.resolveInheritance = true;
98
+ gate._controller = PaybondPolicyReloadController.start(runner, {
99
+ poll: {
100
+ intervalMs: config.pollIntervalMs,
101
+ remote: true,
102
+ resolveInheritance: true,
103
+ gateway: options?.gateway,
104
+ },
105
+ }, config.policyFile);
106
+ }
107
+ return gate;
108
+ }
109
+ get currentSnapshot() {
110
+ return this._snapshot;
111
+ }
112
+ get policyDigest() {
113
+ return this._snapshot?.digest;
114
+ }
115
+ get inFlightCount() {
116
+ return this._inFlightCount;
117
+ }
118
+ get registry() {
119
+ const snapshot = this._snapshot;
120
+ if (!snapshot) {
121
+ throw new McpPolicyReloadError("policy snapshot is not loaded");
122
+ }
123
+ return snapshot.registry;
124
+ }
125
+ applyPolicySnapshot(snapshot) {
126
+ this._snapshot = snapshot;
127
+ }
128
+ async reloadPolicy(options = {}) {
129
+ try {
130
+ const result = await reloadPolicyOnHandle(this, {
131
+ ...this._reloadDefaults,
132
+ ...options,
133
+ allowedTools: this._lastAllowedTools,
134
+ });
135
+ if (result.applied) {
136
+ this.lastReloadAt = new Date().toISOString();
137
+ this.lastReloadError = undefined;
138
+ }
139
+ return result;
140
+ }
141
+ catch (err) {
142
+ this.lastReloadError = err instanceof Error ? err.message : String(err);
143
+ throw err;
144
+ }
145
+ }
146
+ beginToolCall() {
147
+ this._inFlightCount += 1;
148
+ }
149
+ endToolCall() {
150
+ this._inFlightCount = Math.max(0, this._inFlightCount - 1);
151
+ }
152
+ /**
153
+ * Enforce paybond.policy.yaml registry rules before Harbor spend authorization.
154
+ * Pins policy_digest for the current MCP tool invocation.
155
+ */
156
+ assertSpendGate(input) {
157
+ const operation = input.operation.trim();
158
+ const toolName = (input.toolName ?? operation).trim();
159
+ if (!operation) {
160
+ throw new McpPolicyReloadError("operation must be non-empty");
161
+ }
162
+ this._lastAllowedTools = input.allowedTools;
163
+ const policyDigest = this._snapshot?.digest;
164
+ const resolution = this.registry.resolveTool(toolName, {
165
+ allowedTools: input.allowedTools,
166
+ });
167
+ if (resolution.kind === "passthrough") {
168
+ return { operation, requestedSpendCents: 0, policyDigest };
169
+ }
170
+ if (resolution.kind === "denied") {
171
+ throw new PaybondUnregisteredSideEffectingToolError(resolution.toolName, resolution.operation);
172
+ }
173
+ if (!input.allowedTools.includes(operation)) {
174
+ throw new McpPolicyReloadError(`operation "${operation}" is not in intent allowed_tools (${input.allowedTools.join(", ")})`);
175
+ }
176
+ const requestedSpendCents = input.requestedSpendCents ??
177
+ this.registry.resolveSpendCents(toolName, input.arguments) ??
178
+ 0;
179
+ return {
180
+ operation: resolution.operation,
181
+ requestedSpendCents,
182
+ policyDigest,
183
+ };
184
+ }
185
+ status() {
186
+ return {
187
+ enabled: true,
188
+ policy_file: this.policyFilePath,
189
+ policy_digest: this.policyDigest,
190
+ policy_loaded_at: this._snapshot?.loadedAt,
191
+ reload_mode: this.config.reloadMode,
192
+ last_reload_at: this.lastReloadAt ?? this._controller?.state.lastReloadAt,
193
+ last_reload_error: this.lastReloadError ?? this._controller?.state.lastReloadError,
194
+ };
195
+ }
196
+ stop() {
197
+ this._controller?.stop();
198
+ this._controller = undefined;
199
+ }
200
+ }
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Maps SEP-2828-style MCP decision/outcome execution records into artifact_attested evidence.
3
+ *
4
+ * Wire shapes follow the draft SEP-2828 pairing model: decision record (pre-side-effect) and
5
+ * outcome record (post-execution) linked via backLink and outcomeDerived.decisionDigest.
6
+ */
7
+ export type Sep2828BackLink = {
8
+ attestationDigest: string;
9
+ attestationNonce?: string;
10
+ };
11
+ export type Sep2828DecisionRecord = {
12
+ backLink?: Sep2828BackLink;
13
+ decisionDerived?: {
14
+ decision?: "allow" | "block" | "escalate";
15
+ };
16
+ };
17
+ export type Sep2828OutcomeRecord = {
18
+ backLink?: Sep2828BackLink;
19
+ outcomeDerived?: {
20
+ status?: "executed" | "refused" | "errored";
21
+ decisionDigest?: string;
22
+ resultCommitment?: string;
23
+ completedAt?: string;
24
+ };
25
+ };
26
+ export type ArtifactAttestedEvidence = {
27
+ artifact_blake3_hex: string[];
28
+ operation: string;
29
+ vendor_ref_id: string;
30
+ };
31
+ /** Strips sha256:/blake3: prefixes so digests fit artifact_blake3_hex entries. */
32
+ export declare function stripDigestPrefix(digest: string): string;
33
+ /**
34
+ * Converts paired SEP-2828 decision and outcome records into artifact_attested evidence fields.
35
+ */
36
+ export declare function mapSep2828ReceiptsToArtifactAttestedEvidence(decisionInput: Record<string, unknown>, outcomeInput: Record<string, unknown>): ArtifactAttestedEvidence;
@@ -0,0 +1,65 @@
1
+ /**
2
+ * Maps SEP-2828-style MCP decision/outcome execution records into artifact_attested evidence.
3
+ *
4
+ * Wire shapes follow the draft SEP-2828 pairing model: decision record (pre-side-effect) and
5
+ * outcome record (post-execution) linked via backLink and outcomeDerived.decisionDigest.
6
+ */
7
+ import { verifySep2828ReceiptPair } from "./sep2828-signature.js";
8
+ function readObject(value) {
9
+ if (value !== null && typeof value === "object" && !Array.isArray(value)) {
10
+ return value;
11
+ }
12
+ return undefined;
13
+ }
14
+ function readBackLink(record) {
15
+ const backLink = readObject(record.backLink);
16
+ if (!backLink) {
17
+ return undefined;
18
+ }
19
+ const digest = backLink.attestationDigest;
20
+ if (typeof digest !== "string" || digest.length === 0) {
21
+ return undefined;
22
+ }
23
+ const nonce = backLink.attestationNonce;
24
+ return {
25
+ attestationDigest: digest,
26
+ attestationNonce: typeof nonce === "string" ? nonce : undefined,
27
+ };
28
+ }
29
+ /** Strips sha256:/blake3: prefixes so digests fit artifact_blake3_hex entries. */
30
+ export function stripDigestPrefix(digest) {
31
+ return digest.replace(/^(sha256|blake3):/i, "");
32
+ }
33
+ function pushDigest(hashes, digest) {
34
+ if (typeof digest !== "string" || digest.length === 0) {
35
+ return;
36
+ }
37
+ const normalized = stripDigestPrefix(digest);
38
+ if (!hashes.includes(normalized)) {
39
+ hashes.push(normalized);
40
+ }
41
+ }
42
+ /**
43
+ * Converts paired SEP-2828 decision and outcome records into artifact_attested evidence fields.
44
+ */
45
+ export function mapSep2828ReceiptsToArtifactAttestedEvidence(decisionInput, outcomeInput) {
46
+ verifySep2828ReceiptPair(decisionInput, outcomeInput);
47
+ const outcomeDerived = readObject(outcomeInput.outcomeDerived);
48
+ const status = typeof outcomeDerived?.status === "string" ? outcomeDerived.status : "";
49
+ const operation = status === "executed" ? "attested" : "pending";
50
+ const backLink = readBackLink(outcomeInput) ?? readBackLink(decisionInput);
51
+ const hashes = [];
52
+ if (outcomeDerived) {
53
+ pushDigest(hashes, outcomeDerived.decisionDigest);
54
+ pushDigest(hashes, outcomeDerived.resultCommitment);
55
+ }
56
+ if (hashes.length === 0 && backLink) {
57
+ pushDigest(hashes, backLink.attestationDigest);
58
+ }
59
+ const vendorRef = backLink?.attestationDigest ?? "mcp-unknown";
60
+ return {
61
+ artifact_blake3_hex: hashes,
62
+ operation,
63
+ vendor_ref_id: vendorRef,
64
+ };
65
+ }
@@ -1,5 +1,8 @@
1
1
  #!/usr/bin/env node
2
2
  import { type McpToolPolicyConfig } from "./cli/mcp-policy.js";
3
+ import { type McpEvidencePolicy } from "./mcp-evidence-policy.js";
4
+ import { type McpCapabilityTokenCacheConfig } from "./mcp-capability-token-cache.js";
5
+ import { type McpPolicyReloadConfig } from "./mcp-policy-reload.js";
3
6
  type JSONRPCID = string | number | null;
4
7
  type JSONRPCRequest = {
5
8
  jsonrpc?: unknown;
@@ -30,6 +33,9 @@ export type PaybondMCPSettings = {
30
33
  principalPath?: string;
31
34
  maxRetries?: number;
32
35
  toolPolicy?: McpToolPolicyConfig;
36
+ evidencePolicy?: McpEvidencePolicy;
37
+ policyReload?: McpPolicyReloadConfig | null;
38
+ capabilityTokenCache?: McpCapabilityTokenCacheConfig;
33
39
  };
34
40
  export declare function formatMcpStdioFrame(response: JSONRPCResponse): string;
35
41
  export declare class PaybondMCPServer {