settld 0.1.1 → 0.1.5

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 (441) hide show
  1. package/README.md +61 -3
  2. package/SETTLD_VERSION +1 -1
  3. package/bin/settld-mcp +2 -0
  4. package/bin/settld.js +13 -0
  5. package/conformance/kernel-v0/README.md +7 -0
  6. package/conformance/kernel-v0/run.mjs +292 -4
  7. package/docs/ACCESS.md +57 -0
  8. package/docs/ADOPTION_CHECKLIST.md +44 -0
  9. package/docs/ALERTS.md +198 -0
  10. package/docs/ARCHITECTURE.md +69 -0
  11. package/docs/ARCHITECTURE_FOUNDER_GUIDE.md +284 -0
  12. package/docs/ARTIFACTS.md +60 -0
  13. package/docs/CERTIFICATION_CHECKLIST.md +33 -0
  14. package/docs/CIRCLE_SANDBOX_E2E.md +140 -0
  15. package/docs/CONFIG.md +297 -0
  16. package/docs/CONTRACTS_APIS.md +23 -0
  17. package/docs/DEPRECATION.md +31 -0
  18. package/docs/DOMAIN_MODEL.md +92 -0
  19. package/docs/EVENT_ENVELOPE.md +53 -0
  20. package/docs/FINANCE_PACK_FORMAT.md +53 -0
  21. package/docs/INCIDENT_TAXONOMY.md +30 -0
  22. package/docs/JOB_STATE_MACHINE.md +66 -0
  23. package/docs/KERNEL_COMPATIBLE.md +60 -0
  24. package/docs/KERNEL_V0.md +40 -0
  25. package/docs/KEY_ROTATION.md +80 -0
  26. package/docs/LEDGER.md +82 -0
  27. package/docs/LIVENESS.md +76 -0
  28. package/docs/MVP_BUILD_ORDER.md +36 -0
  29. package/docs/ONCALL_PLAYBOOK.md +39 -0
  30. package/docs/OPERATIONS_SIGNING.md +20 -0
  31. package/docs/OVERVIEW.md +190 -0
  32. package/docs/PERF_BASELINE.md +85 -0
  33. package/docs/PRD.md +77 -0
  34. package/docs/QUICKSTART_KERNEL_V0.md +96 -0
  35. package/docs/QUICKSTART_MCP.md +337 -0
  36. package/docs/QUICKSTART_MCP_HOSTS.md +143 -0
  37. package/docs/QUICKSTART_PRODUCE.md +61 -0
  38. package/docs/QUICKSTART_RELEASE_VERIFY.md +39 -0
  39. package/docs/QUICKSTART_SDK.md +125 -0
  40. package/docs/QUICKSTART_SDK_PYTHON.md +111 -0
  41. package/docs/QUICKSTART_VERIFY.md +54 -0
  42. package/docs/QUICKSTART_X402_GATEWAY.md +317 -0
  43. package/docs/README.md +15 -0
  44. package/docs/RELEASE_CHECKLIST.md +156 -0
  45. package/docs/RELEASING.md +81 -0
  46. package/docs/REPO_SETTINGS.md +37 -0
  47. package/docs/RUNBOOK.md +86 -0
  48. package/docs/SKILLS.md +42 -0
  49. package/docs/SKILL_BUNDLE_FORMAT.md +48 -0
  50. package/docs/SLO.md +70 -0
  51. package/docs/SUMMARY.md +16 -0
  52. package/docs/SUPPORT.md +31 -0
  53. package/docs/THREAT_MODEL.md +36 -0
  54. package/docs/TRUST.md +59 -0
  55. package/docs/WORKFLOW.md +35 -0
  56. package/docs/X402_BATCH_SETTLEMENT.md +126 -0
  57. package/docs/blog/2026-02-14-your-ai-agent-just-spent-500-where-is-the-receipt.md +73 -0
  58. package/docs/examples/x402-provider-payout-registry.example.json +14 -0
  59. package/docs/gitbook/README.md +52 -0
  60. package/docs/gitbook/SETUP.md +25 -0
  61. package/docs/gitbook/SUMMARY.md +15 -0
  62. package/docs/gitbook/api-reference.md +73 -0
  63. package/docs/gitbook/closepacks.md +55 -0
  64. package/docs/gitbook/conformance.md +59 -0
  65. package/docs/gitbook/core-primitives.md +85 -0
  66. package/docs/gitbook/dispute-lifecycle.md +33 -0
  67. package/docs/gitbook/faq.md +21 -0
  68. package/docs/gitbook/guides.md +49 -0
  69. package/docs/gitbook/operations-runbook.md +36 -0
  70. package/docs/gitbook/quickstart.md +104 -0
  71. package/docs/gitbook/replay-and-audit.md +30 -0
  72. package/docs/gitbook/sdk-reference.md +35 -0
  73. package/docs/gitbook/security-model.md +58 -0
  74. package/docs/integrations/README.md +14 -0
  75. package/docs/integrations/github-actions-verify.yml +31 -0
  76. package/docs/integrations/github-actions.md +34 -0
  77. package/docs/integrations/openclaw/CLAWHUB_PUBLISH_CHECKLIST.md +65 -0
  78. package/docs/integrations/openclaw/settld-mcp-skill/SKILL.md +69 -0
  79. package/docs/integrations/openclaw/settld-mcp-skill/mcp-server.example.json +12 -0
  80. package/docs/kernel-compatible/capabilities.json +36 -0
  81. package/docs/marketing/agent-commerce-substrate.md +78 -0
  82. package/docs/marketing/hn-repost-2026-02-17.md +102 -0
  83. package/docs/marketing/show-hn-post.md +45 -0
  84. package/docs/ops/ARTIFACT_VERIFICATION_STATUS.md +43 -0
  85. package/docs/ops/BILLING_WEBHOOK_REPLAY.md +105 -0
  86. package/docs/ops/CI_FLAKE_BUDGET.md +31 -0
  87. package/docs/ops/GO_LIVE_GATE_S13.md +27 -0
  88. package/docs/ops/HOSTED_BASELINE_R2.md +129 -0
  89. package/docs/ops/KERNEL_V0_SHIP_GATE.md +67 -0
  90. package/docs/ops/LIGHTHOUSE_PRODUCTION_CLOSE.md +51 -0
  91. package/docs/ops/MCP_COMPATIBILITY_MATRIX.md +28 -0
  92. package/docs/ops/MINIMUM_PRODUCTION_TOPOLOGY.md +89 -0
  93. package/docs/ops/P0_BACKEND_PROGRESS.md +150 -0
  94. package/docs/ops/PAYMENTS_ALPHA_R5.md +105 -0
  95. package/docs/ops/PILOT_ONBOARDING_RUNBOOK.md +112 -0
  96. package/docs/ops/PRODUCTION_DEPLOYMENT_CHECKLIST.md +103 -0
  97. package/docs/ops/R1_SLOS.md +66 -0
  98. package/docs/ops/RELEASE_SIGNING_INCIDENT.md +58 -0
  99. package/docs/ops/SELF_SERVE_LAUNCH_AUTOMATION.md +89 -0
  100. package/docs/ops/THROUGHPUT_DRILL_10X.md +48 -0
  101. package/docs/ops/TRUST_CONFIG_WIZARD.md +47 -0
  102. package/docs/ops/X402_PILOT_WEEKLY_METRICS.md +76 -0
  103. package/docs/ops/tool-call-disputes-holdback.md +52 -0
  104. package/docs/pilot-kit/PILOT_PACKAGE_SCORECARD_X402.md +46 -0
  105. package/docs/pilot-kit/README.md +29 -0
  106. package/docs/pilot-kit/architecture-one-pager.md +48 -0
  107. package/docs/pilot-kit/buyer-email.txt +19 -0
  108. package/docs/pilot-kit/buyer-one-pager.md +31 -0
  109. package/docs/pilot-kit/gtm-pilot-playbook.md +182 -0
  110. package/docs/pilot-kit/offline-verify.md +33 -0
  111. package/docs/pilot-kit/procurement-one-pager.md +50 -0
  112. package/docs/pilot-kit/rfp-clause.md +46 -0
  113. package/docs/pilot-kit/roi-calculator-template.csv +2 -0
  114. package/docs/pilot-kit/security-qa.md +153 -0
  115. package/docs/pilot-kit/security-summary.md +35 -0
  116. package/docs/plans/2026-02-13-mcp-spike-design.md +113 -0
  117. package/docs/spec/AcceptanceCriteria.v1.md +17 -0
  118. package/docs/spec/AcceptanceEvaluation.v1.md +10 -0
  119. package/docs/spec/AgentEvent.v1.md +47 -0
  120. package/docs/spec/AgentIdentity.v1.md +62 -0
  121. package/docs/spec/AgentPassport.v1.md +95 -0
  122. package/docs/spec/AgentReputation.v1.md +59 -0
  123. package/docs/spec/AgentReputation.v2.md +52 -0
  124. package/docs/spec/AgentRun.v1.md +47 -0
  125. package/docs/spec/AgentRunSettlement.v1.md +52 -0
  126. package/docs/spec/AgentWallet.v1.md +43 -0
  127. package/docs/spec/AgreementDelegation.v1.md +109 -0
  128. package/docs/spec/ArbitrationCase.v1.md +67 -0
  129. package/docs/spec/ArbitrationVerdict.v1.md +60 -0
  130. package/docs/spec/BundleHeadAttestation.v1.md +32 -0
  131. package/docs/spec/CANONICAL_JSON.md +31 -0
  132. package/docs/spec/CRYPTOGRAPHY.md +61 -0
  133. package/docs/spec/ClosePack.v1.md +49 -0
  134. package/docs/spec/ClosePackManifest.v1.md +24 -0
  135. package/docs/spec/DelegationGrant.v1.md +90 -0
  136. package/docs/spec/DisputeOpenEnvelope.v1.md +43 -0
  137. package/docs/spec/ERRORS.md +76 -0
  138. package/docs/spec/ESCROW_NETTING_INVARIANTS.md +71 -0
  139. package/docs/spec/EvidenceIndex.v1.md +20 -0
  140. package/docs/spec/ExecutionIntent.v1.md +90 -0
  141. package/docs/spec/FinancePackBundleManifest.v1.md +24 -0
  142. package/docs/spec/FundingHold.v1.md +60 -0
  143. package/docs/spec/GovernancePolicy.v1.md +34 -0
  144. package/docs/spec/GovernancePolicy.v2.md +30 -0
  145. package/docs/spec/INVARIANTS.md +389 -0
  146. package/docs/spec/InteractionDirectionMatrix.v1.md +30 -0
  147. package/docs/spec/InvoiceBundleManifest.v1.md +24 -0
  148. package/docs/spec/InvoiceClaim.v1.md +11 -0
  149. package/docs/spec/MONEY_RAIL_STATE_MACHINE.md +58 -0
  150. package/docs/spec/MarketplaceAcceptance.v2.md +46 -0
  151. package/docs/spec/MarketplaceOffer.v2.md +54 -0
  152. package/docs/spec/MeteringReport.v1.md +18 -0
  153. package/docs/spec/PRODUCER_ERRORS.md +42 -0
  154. package/docs/spec/PricingMatrix.v1.md +20 -0
  155. package/docs/spec/PricingMatrixSignatures.v1.md +30 -0
  156. package/docs/spec/PricingMatrixSignatures.v2.md +29 -0
  157. package/docs/spec/ProduceCliOutput.v1.md +46 -0
  158. package/docs/spec/ProofBundleManifest.v1.md +24 -0
  159. package/docs/spec/README.md +104 -0
  160. package/docs/spec/REFERENCE_IMPLEMENTATIONS.md +29 -0
  161. package/docs/spec/REFERENCE_VERIFIER_BEHAVIOR.md +68 -0
  162. package/docs/spec/REMOTE_SIGNER.md +66 -0
  163. package/docs/spec/ReleaseIndex.v1.md +32 -0
  164. package/docs/spec/ReleaseIndexSignatures.v1.md +17 -0
  165. package/docs/spec/ReleaseTrust.v1.md +13 -0
  166. package/docs/spec/ReleaseTrust.v2.md +26 -0
  167. package/docs/spec/RemoteSignerRequest.v1.md +21 -0
  168. package/docs/spec/RemoteSignerResponse.v1.md +16 -0
  169. package/docs/spec/ReputationEvent.v1.md +63 -0
  170. package/docs/spec/RevocationList.v1.md +28 -0
  171. package/docs/spec/SIGNER_PROVIDER_PLUGIN.md +32 -0
  172. package/docs/spec/STRICTNESS.md +68 -0
  173. package/docs/spec/SUPPLY_CHAIN.md +33 -0
  174. package/docs/spec/SettlementAdjustment.v1.md +45 -0
  175. package/docs/spec/SettlementDecisionRecord.v1.md +48 -0
  176. package/docs/spec/SettlementDecisionRecord.v2.md +51 -0
  177. package/docs/spec/SettlementDecisionReport.v1.md +44 -0
  178. package/docs/spec/SettlementKernel.v1.md +59 -0
  179. package/docs/spec/SettlementReceipt.v1.md +63 -0
  180. package/docs/spec/SlaDefinition.v1.md +24 -0
  181. package/docs/spec/SlaEvaluation.v1.md +12 -0
  182. package/docs/spec/THREAT_MODEL.md +113 -0
  183. package/docs/spec/TOOL_PROVENANCE.md +30 -0
  184. package/docs/spec/TRUST_ANCHORS.md +84 -0
  185. package/docs/spec/TenantSettings.v1.md +90 -0
  186. package/docs/spec/TenantSettings.v2.md +99 -0
  187. package/docs/spec/TimestampProof.v1.md +25 -0
  188. package/docs/spec/ToolCallAgreement.v1.md +34 -0
  189. package/docs/spec/ToolCallEvidence.v1.md +47 -0
  190. package/docs/spec/ToolManifest.v1.md +47 -0
  191. package/docs/spec/VERIFIER_ENVIRONMENT.md +38 -0
  192. package/docs/spec/VERSIONING.md +107 -0
  193. package/docs/spec/VerificationReport.v1.md +50 -0
  194. package/docs/spec/VerifyAboutOutput.v1.md +10 -0
  195. package/docs/spec/VerifyCliOutput.v1.md +28 -0
  196. package/docs/spec/WARNINGS.md +83 -0
  197. package/docs/spec/error-codes.v1.txt +285 -0
  198. package/docs/spec/examples/agreement_delegation_v1.example.json +21 -0
  199. package/docs/spec/examples/arbitration_case_v1.example.json +26 -0
  200. package/docs/spec/examples/arbitration_verdict_v1.example.json +32 -0
  201. package/docs/spec/examples/dispute_open_envelope_v1.example.json +18 -0
  202. package/docs/spec/examples/produce_cli_output_v1.example.json +32 -0
  203. package/docs/spec/examples/release_index_signature_v1.example.json +9 -0
  204. package/docs/spec/examples/release_index_signatures_v1.example.json +14 -0
  205. package/docs/spec/examples/release_index_v1.example.json +15 -0
  206. package/docs/spec/examples/release_trust_v1.example.json +7 -0
  207. package/docs/spec/examples/release_trust_v2.example.json +22 -0
  208. package/docs/spec/examples/remote_signer_request_v1.example.json +18 -0
  209. package/docs/spec/examples/remote_signer_response_v1.example.json +8 -0
  210. package/docs/spec/examples/reputation_event_v1.example.json +29 -0
  211. package/docs/spec/examples/verification_report_v1.example.json +24 -0
  212. package/docs/spec/examples/verify_about_output_v1.example.json +29 -0
  213. package/docs/spec/examples/verify_cli_output_v1.example.json +13 -0
  214. package/docs/spec/legacy/MarketplaceAcceptance.v1.md +48 -0
  215. package/docs/spec/legacy/MarketplaceOffer.v1.md +56 -0
  216. package/docs/spec/legacy/schemas/MarketplaceAcceptance.v1.schema.json +53 -0
  217. package/docs/spec/legacy/schemas/MarketplaceOffer.v1.schema.json +61 -0
  218. package/docs/spec/producer-error-codes.v1.txt +14 -0
  219. package/docs/spec/schemas/AcceptanceCriteria.v1.schema.json +24 -0
  220. package/docs/spec/schemas/AcceptanceEvaluation.v1.schema.json +26 -0
  221. package/docs/spec/schemas/AgentEvent.v1.schema.json +49 -0
  222. package/docs/spec/schemas/AgentIdentity.v1.schema.json +129 -0
  223. package/docs/spec/schemas/AgentPassport.v1.schema.json +112 -0
  224. package/docs/spec/schemas/AgentReputation.v1.schema.json +151 -0
  225. package/docs/spec/schemas/AgentReputation.v2.schema.json +120 -0
  226. package/docs/spec/schemas/AgentRun.v1.schema.json +71 -0
  227. package/docs/spec/schemas/AgentRunSettlement.v1.schema.json +75 -0
  228. package/docs/spec/schemas/AgentWallet.v1.schema.json +54 -0
  229. package/docs/spec/schemas/AgreementDelegation.v1.schema.json +50 -0
  230. package/docs/spec/schemas/ArbitrationCase.v1.schema.json +133 -0
  231. package/docs/spec/schemas/ArbitrationVerdict.v1.schema.json +149 -0
  232. package/docs/spec/schemas/BundleHeadAttestation.v1.schema.json +21 -0
  233. package/docs/spec/schemas/ClosePackManifest.v1.schema.json +38 -0
  234. package/docs/spec/schemas/DelegationGrant.v1.schema.json +102 -0
  235. package/docs/spec/schemas/DisputeOpenEnvelope.v1.schema.json +78 -0
  236. package/docs/spec/schemas/EvidenceIndex.v1.schema.json +41 -0
  237. package/docs/spec/schemas/ExecutionIntent.v1.schema.json +85 -0
  238. package/docs/spec/schemas/FinancePackBundleManifest.v1.schema.json +38 -0
  239. package/docs/spec/schemas/FundingHold.v1.schema.json +46 -0
  240. package/docs/spec/schemas/GovernancePolicy.v1.schema.json +45 -0
  241. package/docs/spec/schemas/GovernancePolicy.v2.schema.json +70 -0
  242. package/docs/spec/schemas/InteractionDirectionMatrix.v1.schema.json +43 -0
  243. package/docs/spec/schemas/InvoiceBundleManifest.v1.schema.json +38 -0
  244. package/docs/spec/schemas/InvoiceClaim.v1.schema.json +39 -0
  245. package/docs/spec/schemas/MarketplaceAcceptance.v2.schema.json +53 -0
  246. package/docs/spec/schemas/MarketplaceOffer.v2.schema.json +61 -0
  247. package/docs/spec/schemas/MeteringReport.v1.schema.json +45 -0
  248. package/docs/spec/schemas/PricingMatrix.v1.schema.json +24 -0
  249. package/docs/spec/schemas/PricingMatrixSignatures.v1.schema.json +24 -0
  250. package/docs/spec/schemas/PricingMatrixSignatures.v2.schema.json +24 -0
  251. package/docs/spec/schemas/ProduceCliOutput.v1.schema.json +107 -0
  252. package/docs/spec/schemas/ProofBundleManifest.v1.schema.json +37 -0
  253. package/docs/spec/schemas/PublicKeys.v1.schema.json +33 -0
  254. package/docs/spec/schemas/ReleaseIndex.v1.schema.json +45 -0
  255. package/docs/spec/schemas/ReleaseIndexSignature.v1.schema.json +16 -0
  256. package/docs/spec/schemas/ReleaseIndexSignatures.v1.schema.json +16 -0
  257. package/docs/spec/schemas/ReleaseTrust.v1.schema.json +15 -0
  258. package/docs/spec/schemas/ReleaseTrust.v2.schema.json +37 -0
  259. package/docs/spec/schemas/RemoteSignerPublicKeyResponse.v1.schema.json +14 -0
  260. package/docs/spec/schemas/RemoteSignerRequest.v1.schema.json +24 -0
  261. package/docs/spec/schemas/RemoteSignerResponse.v1.schema.json +10 -0
  262. package/docs/spec/schemas/RemoteSignerSignRequest.v1.schema.json +27 -0
  263. package/docs/spec/schemas/RemoteSignerSignResponse.v1.schema.json +16 -0
  264. package/docs/spec/schemas/ReputationEvent.v1.schema.json +164 -0
  265. package/docs/spec/schemas/RevocationList.v1.schema.json +51 -0
  266. package/docs/spec/schemas/SettlementAdjustment.v1.schema.json +44 -0
  267. package/docs/spec/schemas/SettlementDecisionRecord.v1.schema.json +66 -0
  268. package/docs/spec/schemas/SettlementDecisionRecord.v2.schema.json +148 -0
  269. package/docs/spec/schemas/SettlementDecisionReport.v1.schema.json +61 -0
  270. package/docs/spec/schemas/SettlementReceipt.v1.schema.json +135 -0
  271. package/docs/spec/schemas/SlaDefinition.v1.schema.json +33 -0
  272. package/docs/spec/schemas/SlaEvaluation.v1.schema.json +26 -0
  273. package/docs/spec/schemas/TenantSettings.v1.schema.json +90 -0
  274. package/docs/spec/schemas/TenantSettings.v2.schema.json +161 -0
  275. package/docs/spec/schemas/TimestampProof.v1.schema.json +17 -0
  276. package/docs/spec/schemas/ToolCallAgreement.v1.schema.json +34 -0
  277. package/docs/spec/schemas/ToolCallEvidence.v1.schema.json +45 -0
  278. package/docs/spec/schemas/ToolManifest.v1.schema.json +54 -0
  279. package/docs/spec/schemas/VerificationReport.v1.schema.json +83 -0
  280. package/docs/spec/schemas/VerifyAboutOutput.v1.schema.json +54 -0
  281. package/docs/spec/schemas/VerifyCliOutput.v1.schema.json +75 -0
  282. package/docs/spec/schemas/VerifyReleaseOutput.v1.schema.json +47 -0
  283. package/docs/spec/x402-error-codes.v1.txt +21 -0
  284. package/docs/templates/buyer-email.txt +18 -0
  285. package/docs/templates/buyer-one-pager.md +24 -0
  286. package/package.json +40 -6
  287. package/scripts/acceptance/full-stack.mjs +734 -0
  288. package/scripts/acceptance/full-stack.sh +99 -0
  289. package/scripts/audit/build-audit-packet.mjs +242 -0
  290. package/scripts/backup-pg.sh +45 -0
  291. package/scripts/backup-restore/README.md +18 -0
  292. package/scripts/backup-restore/capture-state.mjs +130 -0
  293. package/scripts/backup-restore/client.mjs +97 -0
  294. package/scripts/backup-restore/seed-workload.mjs +235 -0
  295. package/scripts/backup-restore/verify-state.mjs +139 -0
  296. package/scripts/backup-restore-test.sh +217 -0
  297. package/scripts/chaos.js +221 -0
  298. package/scripts/ci/build-launch-cutover-packet.mjs +148 -0
  299. package/scripts/ci/build-self-serve-benchmark-report.mjs +122 -0
  300. package/scripts/ci/changelog-guard.mjs +145 -0
  301. package/scripts/ci/check-kernel-v0-launch-gate.mjs +233 -0
  302. package/scripts/ci/check-secret-hygiene.mjs +78 -0
  303. package/scripts/ci/check-version-consistency.mjs +42 -0
  304. package/scripts/ci/cli-pack-smoke.mjs +160 -0
  305. package/scripts/ci/flake-budget-guard.mjs +68 -0
  306. package/scripts/ci/generate-error-codes.mjs +54 -0
  307. package/scripts/ci/lib/lighthouse-tracker.mjs +90 -0
  308. package/scripts/ci/lib/self-serve-launch-gate.mjs +89 -0
  309. package/scripts/ci/npm-pack-smoke.mjs +454 -0
  310. package/scripts/ci/run-10x-throughput-drill.mjs +246 -0
  311. package/scripts/ci/run-10x-throughput-incident-rehearsal.mjs +325 -0
  312. package/scripts/ci/run-arbitration-workspace-browser-e2e.sh +22 -0
  313. package/scripts/ci/run-circle-sandbox-smoke.mjs +237 -0
  314. package/scripts/ci/run-go-live-gate.mjs +150 -0
  315. package/scripts/ci/run-kernel-v0-ship-gate.mjs +97 -0
  316. package/scripts/ci/run-mcp-host-smoke.mjs +275 -0
  317. package/scripts/ci/run-self-serve-launch-gate.mjs +56 -0
  318. package/scripts/ci/runtime-import-smoke.mjs +58 -0
  319. package/scripts/ci/update-lighthouse-tracker.mjs +112 -0
  320. package/scripts/closepack/lib.mjs +286 -0
  321. package/scripts/collect-debug.sh +263 -0
  322. package/scripts/demo/compositional-settlement-3hop.mjs +237 -0
  323. package/scripts/demo/delivery-robot/export-ui-fixture.mjs +188 -0
  324. package/scripts/demo/delivery-robot/generate.mjs +377 -0
  325. package/scripts/demo/kernel-agent-goes-shopping.mjs +202 -0
  326. package/scripts/demo/magic-link-first-green.mjs +118 -0
  327. package/scripts/demo/magic-link-kind-smoke.mjs +577 -0
  328. package/scripts/demo/mcp-paid-exa.mjs +1110 -0
  329. package/scripts/dev/billing-doctor.sh +145 -0
  330. package/scripts/dev/billing-smoke-prod.sh +219 -0
  331. package/scripts/dev/billing-webhook-replay.sh +161 -0
  332. package/scripts/dev/env.dev.example +29 -0
  333. package/scripts/dev/env.sh +37 -0
  334. package/scripts/dev/new-sdk-key.sh +81 -0
  335. package/scripts/dev/sdk-first-run.sh +21 -0
  336. package/scripts/dev/smoke-x402-gateway.sh +115 -0
  337. package/scripts/dev/start-api.sh +24 -0
  338. package/scripts/examples/produce-and-verify-jobproof.mjs +191 -0
  339. package/scripts/examples/sdk-first-paid-rfq.py +105 -0
  340. package/scripts/examples/sdk-first-verified-run.mjs +85 -0
  341. package/scripts/examples/sdk-first-verified-run.py +99 -0
  342. package/scripts/examples/sdk-tenant-analytics.mjs +103 -0
  343. package/scripts/examples/sdk-tenant-analytics.py +118 -0
  344. package/scripts/finance-pack/bundle.mjs +284 -0
  345. package/scripts/fixtures/generate-bundle-fixtures.mjs +877 -0
  346. package/scripts/governance/export.mjs +169 -0
  347. package/scripts/load/delivery-stress.k6.js +183 -0
  348. package/scripts/load/ingest-burst.k6.js +236 -0
  349. package/scripts/load/run-delivery-load.js +66 -0
  350. package/scripts/load/webhook-receiver.js +131 -0
  351. package/scripts/magic-link/migrate-run-records-to-db.mjs +35 -0
  352. package/scripts/mcp/probe.mjs +238 -0
  353. package/scripts/mcp/settld-mcp-http-gateway.mjs +178 -0
  354. package/scripts/mcp/settld-mcp-server.mjs +1201 -0
  355. package/scripts/openapi/write.mjs +13 -0
  356. package/scripts/ops/bootstrap-tenant-conformance.mjs +185 -0
  357. package/scripts/ops/build-x402-pilot-reliability-report.mjs +489 -0
  358. package/scripts/ops/check-x402-receipt-sample.mjs +181 -0
  359. package/scripts/ops/design-partner-run-packet.mjs +466 -0
  360. package/scripts/ops/hosted-baseline-evidence.mjs +681 -0
  361. package/scripts/ops/money-rails-chargeback-evidence.mjs +509 -0
  362. package/scripts/ops/money-rails-reconcile-evidence.mjs +180 -0
  363. package/scripts/ops/p0-seed-money-rail-operation.mjs +432 -0
  364. package/scripts/pilot/finance-pack.mjs +495 -0
  365. package/scripts/pilot/fixtures/robot-keypair.json +4 -0
  366. package/scripts/pilot/fixtures/server-signer.json +4 -0
  367. package/scripts/proof-bundle/job.mjs +109 -0
  368. package/scripts/proof-bundle/lib.mjs +92 -0
  369. package/scripts/proof-bundle/month.mjs +103 -0
  370. package/scripts/provider/conformance-run.mjs +159 -0
  371. package/scripts/provider/keys-generate.mjs +135 -0
  372. package/scripts/provider/publish.mjs +420 -0
  373. package/scripts/quickstart/x402.mjs +334 -0
  374. package/scripts/release/build-artifacts.mjs +181 -0
  375. package/scripts/release/generate-release-index.mjs +112 -0
  376. package/scripts/release/release-index-lib.mjs +232 -0
  377. package/scripts/release/sign-release-index.mjs +85 -0
  378. package/scripts/release/validate-release-assets.mjs +170 -0
  379. package/scripts/release/verify-release.mjs +261 -0
  380. package/scripts/restore-pg.sh +34 -0
  381. package/scripts/scaffold/create-settld-paid-tool.mjs +19 -0
  382. package/scripts/sdk/smoke-python.py +30 -0
  383. package/scripts/sdk/smoke.mjs +16 -0
  384. package/scripts/settlement/x402-batch-worker.mjs +1091 -0
  385. package/scripts/slo/check.mjs +178 -0
  386. package/scripts/smoke/k8s-smoke.mjs +214 -0
  387. package/scripts/spec/generate-protocol-vectors.mjs +931 -0
  388. package/scripts/test/check-no-generated-artifacts.sh +12 -0
  389. package/scripts/test/run.sh +45 -0
  390. package/scripts/trust/validate-trust-file.mjs +57 -0
  391. package/scripts/trust-config/rotate-settld-pay.mjs +277 -0
  392. package/scripts/trust-config/wizard.mjs +161 -0
  393. package/scripts/vendor-contract-test-lib.mjs +182 -0
  394. package/scripts/vendor-contract-test.mjs +55 -0
  395. package/scripts/vercel/build-mkdocs.sh +9 -0
  396. package/scripts/vercel/ignore-mkdocs.sh +25 -0
  397. package/scripts/vercel/install-mkdocs.sh +6 -0
  398. package/scripts/verify-pg.js +217 -0
  399. package/scripts/x402/receipt-verify.mjs +289 -0
  400. package/services/finance-sink/src/dedupe-store.js +29 -6
  401. package/services/receiver/src/dedupe-store.js +29 -5
  402. package/services/x402-gateway/Dockerfile +13 -0
  403. package/services/x402-gateway/README.md +58 -0
  404. package/services/x402-gateway/examples/upstream-mock.js +337 -0
  405. package/services/x402-gateway/src/server.js +947 -0
  406. package/src/api/app.js +32517 -16877
  407. package/src/api/maintenance.js +70 -0
  408. package/src/api/openapi.js +1130 -17
  409. package/src/api/persistence.js +272 -0
  410. package/src/api/server.js +81 -5
  411. package/src/api/store.js +1248 -6
  412. package/src/api/workers/deliveries.js +99 -4
  413. package/src/api/workers/insolvency-sweep.js +159 -0
  414. package/src/core/agent-card.js +69 -0
  415. package/src/core/agent-wallets.js +97 -0
  416. package/src/core/agreement-delegation.js +549 -0
  417. package/src/core/billing-plans.js +40 -6
  418. package/src/core/circle-reserve-adapter.js +845 -0
  419. package/src/core/maintenance-locks.js +1 -0
  420. package/src/core/paid-tool-manifest.js +318 -0
  421. package/src/core/provider-publish-conformance.js +525 -0
  422. package/src/core/provider-publish-proof.js +396 -0
  423. package/src/core/provider-quote-signature.js +170 -0
  424. package/src/core/settld-keys.js +112 -0
  425. package/src/core/settld-pay-token.js +344 -0
  426. package/src/core/settlement-kernel.js +213 -2
  427. package/src/core/settlement-verifier.js +335 -0
  428. package/src/core/tool-call-agreement.js +112 -0
  429. package/src/core/tool-call-evidence.js +144 -0
  430. package/src/core/tool-provider-signature.js +98 -0
  431. package/src/core/x402-escalation-override.js +258 -0
  432. package/src/core/x402-gate.js +118 -0
  433. package/src/core/x402-provider-refund-decision.js +220 -0
  434. package/src/core/x402-receipt-verifier.js +708 -0
  435. package/src/core/x402-reversal-command.js +251 -0
  436. package/src/core/x402-wallet-issuer-decision.js +252 -0
  437. package/src/core/zk-verifier.js +300 -0
  438. package/src/db/migrations/029_reputation_event_index.sql +54 -0
  439. package/src/db/migrations/030_artifacts_source_event_unique_job_only.sql +15 -0
  440. package/src/db/pg.js +18 -7
  441. package/src/db/store-pg.js +838 -72
@@ -0,0 +1,289 @@
1
+ import fs from "node:fs/promises";
2
+
3
+ import {
4
+ formatX402ReceiptVerificationReportText,
5
+ verifyX402ReceiptRecord
6
+ } from "../../src/core/x402-receipt-verifier.js";
7
+ import { verifyX402ExecutionProofV1 } from "../../src/core/zk-verifier.js";
8
+
9
+ function usage() {
10
+ // eslint-disable-next-line no-console
11
+ console.error("usage:");
12
+ console.error(" settld x402 receipt verify <receipt.json|-> [--strict] [--format json|text] [--json-out <path>]");
13
+ console.error(" settld x402 receipt verify --in <receipt.json|-> [--strict] [--format json|text] [--json-out <path>]");
14
+ }
15
+
16
+ function parseArgs(argv) {
17
+ const args = Array.isArray(argv) ? argv.slice() : [];
18
+ let inPath = null;
19
+ let strict = false;
20
+ let format = "text";
21
+ let jsonOut = null;
22
+ for (let i = 0; i < args.length; i += 1) {
23
+ const arg = String(args[i] ?? "");
24
+ if (!arg) continue;
25
+ if (arg === "-h" || arg === "--help") return { help: true };
26
+ if (arg === "--strict") {
27
+ strict = true;
28
+ continue;
29
+ }
30
+ if (arg === "--in") {
31
+ const value = String(args[i + 1] ?? "").trim();
32
+ if (!value) throw new Error("--in requires a value");
33
+ inPath = value;
34
+ i += 1;
35
+ continue;
36
+ }
37
+ if (arg === "--json-out") {
38
+ const value = String(args[i + 1] ?? "").trim();
39
+ if (!value) throw new Error("--json-out requires a value");
40
+ jsonOut = value;
41
+ i += 1;
42
+ continue;
43
+ }
44
+ if (arg === "--format") {
45
+ const value = String(args[i + 1] ?? "").trim().toLowerCase();
46
+ if (value !== "json" && value !== "text") throw new Error("--format must be json|text");
47
+ format = value;
48
+ i += 1;
49
+ continue;
50
+ }
51
+ if (!arg.startsWith("-") && inPath === null) {
52
+ inPath = arg;
53
+ continue;
54
+ }
55
+ throw new Error(`unknown argument: ${arg}`);
56
+ }
57
+ if (!inPath) throw new Error("receipt input path is required");
58
+ return { help: false, inPath, strict, format, jsonOut };
59
+ }
60
+
61
+ async function readReceiptInput(pathLike) {
62
+ if (pathLike === "-") {
63
+ const chunks = [];
64
+ for await (const chunk of process.stdin) chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(String(chunk), "utf8"));
65
+ return Buffer.concat(chunks).toString("utf8");
66
+ }
67
+ return await fs.readFile(pathLike, "utf8");
68
+ }
69
+
70
+ function isPlainObject(value) {
71
+ return Boolean(value) && typeof value === "object" && !Array.isArray(value);
72
+ }
73
+
74
+ function appendReportIssue(target, { code, message, detail = null }) {
75
+ if (!Array.isArray(target)) return;
76
+ target.push({
77
+ code: String(code),
78
+ message: String(message),
79
+ ...(detail === null || detail === undefined ? {} : { detail })
80
+ });
81
+ }
82
+
83
+ function appendReportCheck(target, { id, ok, detail = null }) {
84
+ if (!Array.isArray(target)) return;
85
+ target.push({
86
+ id: String(id),
87
+ ok: ok === true,
88
+ ...(detail === null || detail === undefined ? {} : { detail })
89
+ });
90
+ }
91
+
92
+ function rebuildReportSummary(report) {
93
+ const checks = Array.isArray(report?.checks) ? report.checks : [];
94
+ const warnings = Array.isArray(report?.warnings) ? report.warnings : [];
95
+ const errors = Array.isArray(report?.errors) ? report.errors : [];
96
+ const failedChecks = checks.filter((check) => check?.ok !== true).length;
97
+ report.summary = {
98
+ totalChecks: checks.length,
99
+ failedChecks,
100
+ warningCount: warnings.length,
101
+ errorCount: errors.length
102
+ };
103
+ report.ok = errors.length === 0;
104
+ }
105
+
106
+ function resolveReceiptZkProofEvidence(receipt) {
107
+ const fromTopLevel = isPlainObject(receipt?.zkProof) ? receipt.zkProof : null;
108
+ const fromBindings = isPlainObject(receipt?.bindings?.zkProof) ? receipt.bindings.zkProof : null;
109
+ if (fromTopLevel) return fromTopLevel;
110
+ if (fromBindings) return fromBindings;
111
+ return null;
112
+ }
113
+
114
+ async function applyOfflineZkProofVerification({ receipt, report }) {
115
+ const evidence = resolveReceiptZkProofEvidence(receipt);
116
+ if (!evidence) return;
117
+
118
+ const required = evidence.required === true;
119
+ const protocol = typeof evidence.protocol === "string" && evidence.protocol.trim() !== "" ? evidence.protocol.trim().toLowerCase() : null;
120
+ const verificationKey =
121
+ evidence.verificationKey && typeof evidence.verificationKey === "object" && !Array.isArray(evidence.verificationKey)
122
+ ? evidence.verificationKey
123
+ : null;
124
+ const verificationKeyRef =
125
+ typeof evidence.verificationKeyRef === "string" && evidence.verificationKeyRef.trim() !== "" ? evidence.verificationKeyRef.trim() : null;
126
+ const publicSignals = Array.isArray(evidence.publicSignals) ? evidence.publicSignals : null;
127
+ const proofData = evidence.proofData && typeof evidence.proofData === "object" && !Array.isArray(evidence.proofData) ? evidence.proofData : null;
128
+ const statementHashSha256 =
129
+ typeof evidence.statementHashSha256 === "string" && evidence.statementHashSha256.trim() !== ""
130
+ ? evidence.statementHashSha256.trim().toLowerCase()
131
+ : null;
132
+ const inputDigestSha256 =
133
+ typeof evidence.inputDigestSha256 === "string" && evidence.inputDigestSha256.trim() !== ""
134
+ ? evidence.inputDigestSha256.trim().toLowerCase()
135
+ : null;
136
+ const outputDigestSha256 =
137
+ typeof evidence.outputDigestSha256 === "string" && evidence.outputDigestSha256.trim() !== ""
138
+ ? evidence.outputDigestSha256.trim().toLowerCase()
139
+ : null;
140
+
141
+ const hasProofMaterial = Boolean(protocol && publicSignals && proofData);
142
+ if (!hasProofMaterial) {
143
+ if (required) {
144
+ appendReportIssue(report.errors, {
145
+ code: "zk_proof_offline_material_missing",
146
+ message: "required zk proof material is missing from receipt export"
147
+ });
148
+ appendReportCheck(report.checks, {
149
+ id: "zk_proof_offline_crypto",
150
+ ok: false,
151
+ detail: { required: true, present: false }
152
+ });
153
+ rebuildReportSummary(report);
154
+ return;
155
+ }
156
+ appendReportIssue(report.warnings, {
157
+ code: "zk_proof_offline_not_present",
158
+ message: "no zk proof material was present in receipt export"
159
+ });
160
+ appendReportCheck(report.checks, {
161
+ id: "zk_proof_offline_crypto",
162
+ ok: true,
163
+ detail: { required: false, present: false, skipped: true }
164
+ });
165
+ rebuildReportSummary(report);
166
+ return;
167
+ }
168
+
169
+ const verification = await verifyX402ExecutionProofV1({
170
+ proof: {
171
+ protocol,
172
+ publicSignals,
173
+ proofData,
174
+ ...(verificationKey ? { verificationKey } : {}),
175
+ ...(verificationKeyRef ? { verificationKeyRef } : {}),
176
+ ...(statementHashSha256 ? { statementHashSha256 } : {}),
177
+ ...(inputDigestSha256 ? { inputDigestSha256 } : {}),
178
+ ...(outputDigestSha256 ? { outputDigestSha256 } : {})
179
+ },
180
+ verificationKey,
181
+ expectedVerificationKeyRef: verificationKeyRef,
182
+ requiredProtocol: protocol,
183
+ expectedBindings: {
184
+ statementHashSha256,
185
+ inputDigestSha256,
186
+ outputDigestSha256
187
+ },
188
+ requireBindings: required
189
+ });
190
+
191
+ const verified = verification?.verified === true;
192
+ const detail = {
193
+ required,
194
+ protocol,
195
+ verificationKeyRef: verificationKeyRef ?? null,
196
+ status: verification?.status ?? null,
197
+ code: verification?.code ?? null
198
+ };
199
+ if (verified) {
200
+ appendReportCheck(report.checks, { id: "zk_proof_offline_crypto", ok: true, detail });
201
+ rebuildReportSummary(report);
202
+ return;
203
+ }
204
+
205
+ if (required) {
206
+ appendReportIssue(report.errors, {
207
+ code: "zk_proof_offline_invalid",
208
+ message: "required zk proof failed offline cryptographic verification",
209
+ detail
210
+ });
211
+ appendReportCheck(report.checks, { id: "zk_proof_offline_crypto", ok: false, detail });
212
+ } else {
213
+ appendReportIssue(report.warnings, {
214
+ code: "zk_proof_offline_unverified_optional",
215
+ message: "optional zk proof did not verify offline; settlement remained valid because proof was not required",
216
+ detail
217
+ });
218
+ appendReportCheck(report.checks, { id: "zk_proof_offline_crypto", ok: true, detail: { ...detail, optional: true } });
219
+ }
220
+ rebuildReportSummary(report);
221
+ }
222
+
223
+ async function main() {
224
+ let parsed;
225
+ try {
226
+ parsed = parseArgs(process.argv.slice(2));
227
+ } catch (err) {
228
+ usage();
229
+ // eslint-disable-next-line no-console
230
+ console.error(String(err?.message ?? err));
231
+ process.exit(1);
232
+ return;
233
+ }
234
+ if (parsed.help) {
235
+ usage();
236
+ process.exit(0);
237
+ return;
238
+ }
239
+
240
+ let raw;
241
+ try {
242
+ raw = await readReceiptInput(parsed.inPath);
243
+ } catch (err) {
244
+ // eslint-disable-next-line no-console
245
+ console.error(`failed to read receipt input: ${err?.message ?? String(err ?? "")}`);
246
+ process.exit(1);
247
+ return;
248
+ }
249
+
250
+ let receipt;
251
+ try {
252
+ receipt = JSON.parse(raw);
253
+ } catch (err) {
254
+ // eslint-disable-next-line no-console
255
+ console.error(`invalid receipt JSON: ${err?.message ?? String(err ?? "")}`);
256
+ process.exit(1);
257
+ return;
258
+ }
259
+
260
+ let report;
261
+ try {
262
+ report = verifyX402ReceiptRecord({ receipt, strict: parsed.strict });
263
+ await applyOfflineZkProofVerification({ receipt, report });
264
+ } catch (err) {
265
+ // eslint-disable-next-line no-console
266
+ console.error(`receipt verification failed: ${err?.message ?? String(err ?? "")}`);
267
+ process.exit(1);
268
+ return;
269
+ }
270
+
271
+ if (parsed.jsonOut) {
272
+ await fs.writeFile(parsed.jsonOut, `${JSON.stringify(report, null, 2)}\n`, "utf8");
273
+ }
274
+ if (parsed.format === "json") {
275
+ process.stdout.write(`${JSON.stringify(report, null, 2)}\n`);
276
+ } else {
277
+ const baseText = formatX402ReceiptVerificationReportText(report);
278
+ const zkCheck = Array.isArray(report?.checks) ? report.checks.find((check) => check?.id === "zk_proof_offline_crypto") : null;
279
+ if (!zkCheck) {
280
+ process.stdout.write(baseText);
281
+ } else {
282
+ const zkState = zkCheck.ok === true ? "verified" : "failed";
283
+ process.stdout.write(`${baseText}zkProof: ${zkState}\n`);
284
+ }
285
+ }
286
+ process.exit(report.ok === true ? 0 : 1);
287
+ }
288
+
289
+ await main();
@@ -17,21 +17,33 @@ function nowIso() {
17
17
  return new Date().toISOString();
18
18
  }
19
19
 
20
+ function isNonWritableFsError(err) {
21
+ const code = String(err?.code ?? "");
22
+ return code === "EACCES" || code === "EPERM" || code === "EROFS";
23
+ }
24
+
20
25
  export class DedupeStore {
21
26
  constructor({ filePath }) {
22
27
  assertNonEmptyString(filePath, "filePath");
23
28
  this.filePath = filePath;
24
29
  this.records = new Map(); // dedupeKey -> record
25
30
  this._appendQueue = Promise.resolve();
31
+ this.persistenceDisabled = false;
26
32
  }
27
33
 
28
34
  async init() {
29
- await fs.mkdir(path.dirname(this.filePath), { recursive: true });
30
35
  let raw = "";
31
36
  try {
32
- raw = await fs.readFile(this.filePath, "utf8");
37
+ await fs.mkdir(path.dirname(this.filePath), { recursive: true });
38
+ try {
39
+ raw = await fs.readFile(this.filePath, "utf8");
40
+ } catch (err) {
41
+ if (err?.code !== "ENOENT") throw err;
42
+ raw = "";
43
+ }
33
44
  } catch (err) {
34
- if (err?.code !== "ENOENT") throw err;
45
+ if (!isNonWritableFsError(err)) throw err;
46
+ this.persistenceDisabled = true;
35
47
  raw = "";
36
48
  }
37
49
 
@@ -104,9 +116,21 @@ export class DedupeStore {
104
116
 
105
117
  async appendEvent(evt) {
106
118
  if (!evt || typeof evt !== "object") throw new TypeError("evt must be an object");
119
+ if (this.persistenceDisabled) return false;
107
120
  const line = `${JSON.stringify(evt)}\n`;
108
- this._appendQueue = this._appendQueue.then(() => fs.appendFile(this.filePath, line, "utf8"));
109
- return await this._appendQueue;
121
+ const append = async () => {
122
+ await fs.appendFile(this.filePath, line, "utf8");
123
+ };
124
+ const op = this._appendQueue.then(append, append);
125
+ this._appendQueue = op.catch(() => {});
126
+ try {
127
+ await op;
128
+ return true;
129
+ } catch (err) {
130
+ if (!isNonWritableFsError(err)) throw err;
131
+ this.persistenceDisabled = true;
132
+ return false;
133
+ }
110
134
  }
111
135
 
112
136
  async ensureReceived({ dedupeKey, artifactHash }) {
@@ -229,4 +253,3 @@ export class DedupeStore {
229
253
  return out;
230
254
  }
231
255
  }
232
-
@@ -17,21 +17,33 @@ function nowIso() {
17
17
  return new Date().toISOString();
18
18
  }
19
19
 
20
+ function isNonWritableFsError(err) {
21
+ const code = String(err?.code ?? "");
22
+ return code === "EACCES" || code === "EPERM" || code === "EROFS";
23
+ }
24
+
20
25
  export class DedupeStore {
21
26
  constructor({ filePath }) {
22
27
  assertNonEmptyString(filePath, "filePath");
23
28
  this.filePath = filePath;
24
29
  this.records = new Map(); // dedupeKey -> record
25
30
  this._appendQueue = Promise.resolve();
31
+ this.persistenceDisabled = false;
26
32
  }
27
33
 
28
34
  async init() {
29
- await fs.mkdir(path.dirname(this.filePath), { recursive: true });
30
35
  let raw = "";
31
36
  try {
32
- raw = await fs.readFile(this.filePath, "utf8");
37
+ await fs.mkdir(path.dirname(this.filePath), { recursive: true });
38
+ try {
39
+ raw = await fs.readFile(this.filePath, "utf8");
40
+ } catch (err) {
41
+ if (err?.code !== "ENOENT") throw err;
42
+ raw = "";
43
+ }
33
44
  } catch (err) {
34
- if (err?.code !== "ENOENT") throw err;
45
+ if (!isNonWritableFsError(err)) throw err;
46
+ this.persistenceDisabled = true;
35
47
  raw = "";
36
48
  }
37
49
 
@@ -104,9 +116,21 @@ export class DedupeStore {
104
116
 
105
117
  async appendEvent(evt) {
106
118
  if (!evt || typeof evt !== "object") throw new TypeError("evt must be an object");
119
+ if (this.persistenceDisabled) return false;
107
120
  const line = `${JSON.stringify(evt)}\n`;
108
- this._appendQueue = this._appendQueue.then(() => fs.appendFile(this.filePath, line, "utf8"));
109
- return await this._appendQueue;
121
+ const append = async () => {
122
+ await fs.appendFile(this.filePath, line, "utf8");
123
+ };
124
+ const op = this._appendQueue.then(append, append);
125
+ this._appendQueue = op.catch(() => {});
126
+ try {
127
+ await op;
128
+ return true;
129
+ } catch (err) {
130
+ if (!isNonWritableFsError(err)) throw err;
131
+ this.persistenceDisabled = true;
132
+ return false;
133
+ }
110
134
  }
111
135
 
112
136
  async ensureReceived({ dedupeKey, artifactHash }) {
@@ -0,0 +1,13 @@
1
+ FROM node:20-alpine
2
+
3
+ WORKDIR /app
4
+
5
+ # The gateway is intentionally dependency-free. It imports small helper logic from src/core/.
6
+ COPY src/core ./src/core
7
+ COPY services/x402-gateway ./services/x402-gateway
8
+
9
+ ENV NODE_ENV=production
10
+ EXPOSE 8402
11
+
12
+ CMD ["node", "services/x402-gateway/src/server.js"]
13
+
@@ -0,0 +1,58 @@
1
+ # Settld x402 Gateway (S24)
2
+
3
+ Thin proxy that sits between your client and an upstream x402-style API, and converts `HTTP 402` into a Settld `hold -> verify -> release/refund` settlement.
4
+
5
+ ## Config
6
+
7
+ Required:
8
+
9
+ - `SETTLD_API_URL`
10
+ - `SETTLD_API_KEY` (format: `keyId.secret`)
11
+ - `UPSTREAM_URL`
12
+
13
+ Optional:
14
+
15
+ - `HOLDBACK_BPS` (default `0`)
16
+ - `DISPUTE_WINDOW_MS` (default `3600000`)
17
+ - `X402_AUTOFUND` (default `false`) (local demo only; do not use in production)
18
+ - `X402_PROVIDER_PUBLIC_KEY_PEM` (optional; if set, the gateway requires a provider signature on responses and will not release funds without it)
19
+ - `PORT` (default `8402`)
20
+
21
+ Notes:
22
+
23
+ - The gateway forwards `x-proxy-tenant-id` to Settld if present on the incoming request; otherwise it uses `tenant_default`.
24
+ - For Settld writes it sends `x-settld-protocol=1.0`.
25
+
26
+ ## Run (Docker)
27
+
28
+ From repo root:
29
+
30
+ ```bash
31
+ # Preferred: pull the published image from GHCR.
32
+ docker pull ghcr.io/aidenlippert/settld/x402-gateway:latest
33
+
34
+ # Or build from source:
35
+ # docker build -f services/x402-gateway/Dockerfile -t settld/x402-gateway:dev .
36
+
37
+ docker run --rm -p 8402:8402 \
38
+ -e X402_AUTOFUND=0 \
39
+ -e SETTLD_API_URL="http://host.docker.internal:3000" \
40
+ -e SETTLD_API_KEY="YOUR_KEY_ID.YOUR_SECRET" \
41
+ -e UPSTREAM_URL="https://example.com" \
42
+ ghcr.io/aidenlippert/settld/x402-gateway:latest
43
+ ```
44
+
45
+ Linux (Docker Engine 20.10+): add `--add-host=host.docker.internal:host-gateway` to the `docker run` command.
46
+
47
+ ## Usage
48
+
49
+ 1. Send your normal request through the gateway: `http://127.0.0.1:8402/...`
50
+ 2. If upstream returns `402` with `x-payment-required` (or `PAYMENT-REQUIRED`), the gateway responds `402` and includes `x-settld-gate-id`.
51
+ 3. Retry the upstream request through the gateway, but include `x-settld-gate-id: <value>`.
52
+ 4. When the upstream returns `200`, the gateway calls Settld `/x402/gate/verify` and returns `x-settld-*` result headers:
53
+
54
+ - `x-settld-gate-id`
55
+ - `x-settld-response-sha256`
56
+ - `x-settld-verification-status` + `x-settld-verification-codes`
57
+ - `x-settld-settlement-status` + `x-settld-released-amount-cents` + `x-settld-refunded-amount-cents`
58
+ - optional: `x-settld-holdback-status` + `x-settld-holdback-amount-cents`