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
@@ -9,6 +9,7 @@ import { reduceMonthClose } from "../core/month-close.js";
9
9
  import { AGENT_RUN_EVENT_SCHEMA_VERSION, reduceAgentRun } from "../core/agent-runs.js";
10
10
  import { normalizeInteractionDirection } from "../core/interaction-directions.js";
11
11
  import { DEFAULT_TENANT_ID, normalizeTenantId, makeScopedKey } from "../core/tenancy.js";
12
+ import { canonicalJsonStringify } from "../core/canonical-json.js";
12
13
 
13
14
  export const TX_LOG_VERSION = 1;
14
15
 
@@ -411,6 +412,277 @@ export function applyTxRecord(store, record) {
411
412
  continue;
412
413
  }
413
414
 
415
+ if (kind === "AGREEMENT_DELEGATION_UPSERT") {
416
+ const tenantId = normalizeTenantId(op.tenantId ?? DEFAULT_TENANT_ID);
417
+ const delegation = op.delegation ?? null;
418
+ if (!delegation || typeof delegation !== "object" || Array.isArray(delegation)) {
419
+ throw new TypeError("AGREEMENT_DELEGATION_UPSERT requires delegation");
420
+ }
421
+ const delegationId = delegation.delegationId ?? op.delegationId ?? null;
422
+ if (!delegationId) throw new TypeError("AGREEMENT_DELEGATION_UPSERT requires delegation.delegationId");
423
+ if (!(store.agreementDelegations instanceof Map)) store.agreementDelegations = new Map();
424
+ const key = makeScopedKey({ tenantId, id: String(delegationId) });
425
+ store.agreementDelegations.set(key, { ...delegation, tenantId, delegationId: String(delegationId) });
426
+ continue;
427
+ }
428
+
429
+ if (kind === "X402_GATE_UPSERT") {
430
+ const tenantId = normalizeTenantId(op.tenantId ?? DEFAULT_TENANT_ID);
431
+ const gate = op.gate ?? null;
432
+ if (!gate || typeof gate !== "object" || Array.isArray(gate)) {
433
+ throw new TypeError("X402_GATE_UPSERT requires gate");
434
+ }
435
+ const gateId = gate.gateId ?? gate.id ?? op.gateId ?? null;
436
+ if (!gateId) throw new TypeError("X402_GATE_UPSERT requires gate.gateId");
437
+ if (!(store.x402Gates instanceof Map)) store.x402Gates = new Map();
438
+ const key = makeScopedKey({ tenantId, id: String(gateId) });
439
+ store.x402Gates.set(key, { ...gate, tenantId, gateId: String(gateId) });
440
+ continue;
441
+ }
442
+
443
+ if (kind === "X402_AGENT_LIFECYCLE_UPSERT") {
444
+ const tenantId = normalizeTenantId(op.tenantId ?? DEFAULT_TENANT_ID);
445
+ const agentLifecycle = op.agentLifecycle ?? null;
446
+ if (!agentLifecycle || typeof agentLifecycle !== "object" || Array.isArray(agentLifecycle)) {
447
+ throw new TypeError("X402_AGENT_LIFECYCLE_UPSERT requires agentLifecycle");
448
+ }
449
+ const agentId = agentLifecycle.agentId ?? op.agentId ?? null;
450
+ if (!agentId) throw new TypeError("X402_AGENT_LIFECYCLE_UPSERT requires agentLifecycle.agentId");
451
+ const status = typeof agentLifecycle.status === "string" ? agentLifecycle.status.trim().toLowerCase() : "";
452
+ if (status !== "active" && status !== "frozen" && status !== "archived") {
453
+ throw new TypeError("X402_AGENT_LIFECYCLE_UPSERT requires status active|frozen|archived");
454
+ }
455
+ if (!(store.x402AgentLifecycles instanceof Map)) store.x402AgentLifecycles = new Map();
456
+ const key = makeScopedKey({ tenantId, id: String(agentId) });
457
+ store.x402AgentLifecycles.set(key, { ...agentLifecycle, tenantId, agentId: String(agentId), status });
458
+ continue;
459
+ }
460
+
461
+ if (kind === "X402_RECEIPT_PUT") {
462
+ const tenantId = normalizeTenantId(op.tenantId ?? DEFAULT_TENANT_ID);
463
+ const receipt = op.receipt ?? null;
464
+ if (!receipt || typeof receipt !== "object" || Array.isArray(receipt)) {
465
+ throw new TypeError("X402_RECEIPT_PUT requires receipt");
466
+ }
467
+ const receiptId = receipt.receiptId ?? op.receiptId ?? null;
468
+ if (!receiptId) throw new TypeError("X402_RECEIPT_PUT requires receipt.receiptId");
469
+ if (!(store.x402Receipts instanceof Map)) store.x402Receipts = new Map();
470
+ const key = makeScopedKey({ tenantId, id: String(receiptId) });
471
+ const normalized = {
472
+ ...receipt,
473
+ tenantId,
474
+ receiptId: String(receiptId),
475
+ reversal: null,
476
+ reversalEvents: []
477
+ };
478
+ const existing = store.x402Receipts.get(key) ?? null;
479
+ if (existing) {
480
+ const existingCanonical = canonicalJsonStringify(existing);
481
+ const incomingCanonical = canonicalJsonStringify(normalized);
482
+ if (existingCanonical !== incomingCanonical) {
483
+ const err = new Error("x402 receipt is immutable and cannot be changed");
484
+ err.code = "X402_RECEIPT_IMMUTABLE";
485
+ err.receiptId = String(receiptId);
486
+ throw err;
487
+ }
488
+ continue;
489
+ }
490
+ store.x402Receipts.set(key, normalized);
491
+ continue;
492
+ }
493
+
494
+ if (kind === "X402_WALLET_POLICY_UPSERT") {
495
+ const tenantId = normalizeTenantId(op.tenantId ?? DEFAULT_TENANT_ID);
496
+ const policy = op.policy ?? null;
497
+ if (!policy || typeof policy !== "object" || Array.isArray(policy)) {
498
+ throw new TypeError("X402_WALLET_POLICY_UPSERT requires policy");
499
+ }
500
+ const sponsorWalletRef = typeof policy.sponsorWalletRef === "string" ? policy.sponsorWalletRef.trim() : "";
501
+ const policyRef = typeof policy.policyRef === "string" ? policy.policyRef.trim() : "";
502
+ const policyVersion = Number(policy.policyVersion);
503
+ if (!sponsorWalletRef) throw new TypeError("X402_WALLET_POLICY_UPSERT requires policy.sponsorWalletRef");
504
+ if (!policyRef) throw new TypeError("X402_WALLET_POLICY_UPSERT requires policy.policyRef");
505
+ if (!Number.isSafeInteger(policyVersion) || policyVersion <= 0) {
506
+ throw new TypeError("X402_WALLET_POLICY_UPSERT requires policy.policyVersion >= 1");
507
+ }
508
+ if (!(store.x402WalletPolicies instanceof Map)) store.x402WalletPolicies = new Map();
509
+ const key = makeScopedKey({ tenantId, id: `${sponsorWalletRef}::${policyRef}::${policyVersion}` });
510
+ store.x402WalletPolicies.set(key, {
511
+ ...policy,
512
+ tenantId,
513
+ sponsorWalletRef,
514
+ policyRef,
515
+ policyVersion
516
+ });
517
+ continue;
518
+ }
519
+
520
+ if (kind === "X402_ZK_VERIFICATION_KEY_PUT") {
521
+ const tenantId = normalizeTenantId(op.tenantId ?? DEFAULT_TENANT_ID);
522
+ const verificationKey = op.verificationKey ?? null;
523
+ if (!verificationKey || typeof verificationKey !== "object" || Array.isArray(verificationKey)) {
524
+ throw new TypeError("X402_ZK_VERIFICATION_KEY_PUT requires verificationKey");
525
+ }
526
+ const verificationKeyId = verificationKey.verificationKeyId ?? op.verificationKeyId ?? null;
527
+ if (!verificationKeyId) throw new TypeError("X402_ZK_VERIFICATION_KEY_PUT requires verificationKey.verificationKeyId");
528
+ if (!(store.x402ZkVerificationKeys instanceof Map)) store.x402ZkVerificationKeys = new Map();
529
+ const key = makeScopedKey({ tenantId, id: String(verificationKeyId) });
530
+ const normalized = {
531
+ ...verificationKey,
532
+ tenantId,
533
+ verificationKeyId: String(verificationKeyId)
534
+ };
535
+ const existing = store.x402ZkVerificationKeys.get(key) ?? null;
536
+ if (existing) {
537
+ const existingCanonical = canonicalJsonStringify(existing);
538
+ const incomingCanonical = canonicalJsonStringify(normalized);
539
+ if (existingCanonical !== incomingCanonical) {
540
+ const err = new Error("x402 zk verification key is immutable and cannot be changed");
541
+ err.code = "X402_ZK_VERIFICATION_KEY_IMMUTABLE";
542
+ err.verificationKeyId = String(verificationKeyId);
543
+ throw err;
544
+ }
545
+ continue;
546
+ }
547
+ store.x402ZkVerificationKeys.set(key, normalized);
548
+ continue;
549
+ }
550
+
551
+ if (kind === "X402_REVERSAL_EVENT_APPEND") {
552
+ const tenantId = normalizeTenantId(op.tenantId ?? DEFAULT_TENANT_ID);
553
+ const event = op.event ?? null;
554
+ if (!event || typeof event !== "object" || Array.isArray(event)) {
555
+ throw new TypeError("X402_REVERSAL_EVENT_APPEND requires event");
556
+ }
557
+ const eventId = op.eventId ?? event.eventId ?? event.id ?? null;
558
+ const gateId = op.gateId ?? event.gateId ?? null;
559
+ if (!eventId) throw new TypeError("X402_REVERSAL_EVENT_APPEND requires event.eventId");
560
+ if (!gateId) throw new TypeError("X402_REVERSAL_EVENT_APPEND requires event.gateId");
561
+ if (!(store.x402ReversalEvents instanceof Map)) store.x402ReversalEvents = new Map();
562
+ const key = makeScopedKey({ tenantId, id: String(eventId) });
563
+ store.x402ReversalEvents.set(key, {
564
+ ...event,
565
+ tenantId,
566
+ eventId: String(eventId),
567
+ gateId: String(gateId)
568
+ });
569
+ continue;
570
+ }
571
+
572
+ if (kind === "X402_REVERSAL_NONCE_PUT") {
573
+ const tenantId = normalizeTenantId(op.tenantId ?? DEFAULT_TENANT_ID);
574
+ const usage = op.usage ?? null;
575
+ if (!usage || typeof usage !== "object" || Array.isArray(usage)) {
576
+ throw new TypeError("X402_REVERSAL_NONCE_PUT requires usage");
577
+ }
578
+ const sponsorRef = op.sponsorRef ?? usage.sponsorRef ?? null;
579
+ const nonce = op.nonce ?? usage.nonce ?? null;
580
+ if (!sponsorRef) throw new TypeError("X402_REVERSAL_NONCE_PUT requires sponsorRef");
581
+ if (!nonce) throw new TypeError("X402_REVERSAL_NONCE_PUT requires nonce");
582
+ if (!(store.x402ReversalNonceUsage instanceof Map)) store.x402ReversalNonceUsage = new Map();
583
+ const key = `${tenantId}\n${String(sponsorRef)}\n${String(nonce)}`;
584
+ store.x402ReversalNonceUsage.set(key, {
585
+ ...usage,
586
+ tenantId,
587
+ sponsorRef: String(sponsorRef),
588
+ nonce: String(nonce)
589
+ });
590
+ continue;
591
+ }
592
+
593
+ if (kind === "X402_REVERSAL_COMMAND_PUT") {
594
+ const tenantId = normalizeTenantId(op.tenantId ?? DEFAULT_TENANT_ID);
595
+ const usage = op.usage ?? null;
596
+ if (!usage || typeof usage !== "object" || Array.isArray(usage)) {
597
+ throw new TypeError("X402_REVERSAL_COMMAND_PUT requires usage");
598
+ }
599
+ const commandId = op.commandId ?? usage.commandId ?? null;
600
+ if (!commandId) throw new TypeError("X402_REVERSAL_COMMAND_PUT requires commandId");
601
+ if (!(store.x402ReversalCommandUsage instanceof Map)) store.x402ReversalCommandUsage = new Map();
602
+ const key = makeScopedKey({ tenantId, id: String(commandId) });
603
+ store.x402ReversalCommandUsage.set(key, {
604
+ ...usage,
605
+ tenantId,
606
+ commandId: String(commandId)
607
+ });
608
+ continue;
609
+ }
610
+
611
+ if (kind === "X402_ESCALATION_UPSERT") {
612
+ const tenantId = normalizeTenantId(op.tenantId ?? DEFAULT_TENANT_ID);
613
+ const escalation = op.escalation ?? null;
614
+ if (!escalation || typeof escalation !== "object" || Array.isArray(escalation)) {
615
+ throw new TypeError("X402_ESCALATION_UPSERT requires escalation");
616
+ }
617
+ const escalationId = escalation.escalationId ?? op.escalationId ?? null;
618
+ if (!escalationId) throw new TypeError("X402_ESCALATION_UPSERT requires escalation.escalationId");
619
+ if (!(store.x402Escalations instanceof Map)) store.x402Escalations = new Map();
620
+ const key = makeScopedKey({ tenantId, id: String(escalationId) });
621
+ store.x402Escalations.set(key, {
622
+ ...escalation,
623
+ tenantId,
624
+ escalationId: String(escalationId)
625
+ });
626
+ continue;
627
+ }
628
+
629
+ if (kind === "X402_ESCALATION_EVENT_APPEND") {
630
+ const tenantId = normalizeTenantId(op.tenantId ?? DEFAULT_TENANT_ID);
631
+ const event = op.event ?? null;
632
+ if (!event || typeof event !== "object" || Array.isArray(event)) {
633
+ throw new TypeError("X402_ESCALATION_EVENT_APPEND requires event");
634
+ }
635
+ const eventId = op.eventId ?? event.eventId ?? event.id ?? null;
636
+ const escalationId = op.escalationId ?? event.escalationId ?? null;
637
+ if (!eventId) throw new TypeError("X402_ESCALATION_EVENT_APPEND requires event.eventId");
638
+ if (!escalationId) throw new TypeError("X402_ESCALATION_EVENT_APPEND requires event.escalationId");
639
+ if (!(store.x402EscalationEvents instanceof Map)) store.x402EscalationEvents = new Map();
640
+ const key = makeScopedKey({ tenantId, id: String(eventId) });
641
+ store.x402EscalationEvents.set(key, {
642
+ ...event,
643
+ tenantId,
644
+ eventId: String(eventId),
645
+ escalationId: String(escalationId)
646
+ });
647
+ continue;
648
+ }
649
+
650
+ if (kind === "X402_ESCALATION_OVERRIDE_USAGE_PUT") {
651
+ const tenantId = normalizeTenantId(op.tenantId ?? DEFAULT_TENANT_ID);
652
+ const usage = op.usage ?? null;
653
+ if (!usage || typeof usage !== "object" || Array.isArray(usage)) {
654
+ throw new TypeError("X402_ESCALATION_OVERRIDE_USAGE_PUT requires usage");
655
+ }
656
+ const overrideId = op.overrideId ?? usage.overrideId ?? null;
657
+ if (!overrideId) throw new TypeError("X402_ESCALATION_OVERRIDE_USAGE_PUT requires overrideId");
658
+ if (!(store.x402EscalationOverrideUsage instanceof Map)) store.x402EscalationOverrideUsage = new Map();
659
+ const key = makeScopedKey({ tenantId, id: String(overrideId) });
660
+ store.x402EscalationOverrideUsage.set(key, {
661
+ ...usage,
662
+ tenantId,
663
+ overrideId: String(overrideId)
664
+ });
665
+ continue;
666
+ }
667
+
668
+ if (kind === "X402_WEBHOOK_ENDPOINT_UPSERT") {
669
+ const tenantId = normalizeTenantId(op.tenantId ?? DEFAULT_TENANT_ID);
670
+ const endpoint = op.endpoint ?? null;
671
+ if (!endpoint || typeof endpoint !== "object" || Array.isArray(endpoint)) {
672
+ throw new TypeError("X402_WEBHOOK_ENDPOINT_UPSERT requires endpoint");
673
+ }
674
+ const endpointId = endpoint.endpointId ?? op.endpointId ?? null;
675
+ if (!endpointId) throw new TypeError("X402_WEBHOOK_ENDPOINT_UPSERT requires endpoint.endpointId");
676
+ if (!(store.x402WebhookEndpoints instanceof Map)) store.x402WebhookEndpoints = new Map();
677
+ const key = makeScopedKey({ tenantId, id: String(endpointId) });
678
+ store.x402WebhookEndpoints.set(key, {
679
+ ...endpoint,
680
+ tenantId,
681
+ endpointId: String(endpointId)
682
+ });
683
+ continue;
684
+ }
685
+
414
686
  if (kind === "TOOL_CALL_HOLD_UPSERT") {
415
687
  const tenantId = normalizeTenantId(op.tenantId ?? DEFAULT_TENANT_ID);
416
688
  const hold = op.hold ?? null;
package/src/api/server.js CHANGED
@@ -8,6 +8,49 @@ import { configForLog, loadConfig } from "../core/config.js";
8
8
  const cfg = loadConfig({ mode: "api" });
9
9
  logger.info("config.effective", { config: configForLog(cfg) });
10
10
 
11
+ const corsAllowOriginsEnv =
12
+ typeof process !== "undefined" && typeof process.env.PROXY_CORS_ALLOW_ORIGINS === "string"
13
+ ? process.env.PROXY_CORS_ALLOW_ORIGINS
14
+ : "";
15
+ const corsAllowOrigins = new Set(
16
+ corsAllowOriginsEnv
17
+ .split(",")
18
+ .map((row) => row.trim())
19
+ .filter((row) => row !== "")
20
+ );
21
+ const DEV_CORS_ORIGIN_RE = /^https?:\/\/(localhost|127\.0\.0\.1)(:\d+)?$/i;
22
+
23
+ function resolveCorsOrigin(originHeader) {
24
+ if (typeof originHeader !== "string" || originHeader.trim() === "") return null;
25
+ const origin = originHeader.trim();
26
+ if (corsAllowOrigins.has("*")) return "*";
27
+ if (corsAllowOrigins.has(origin)) return origin;
28
+ if (DEV_CORS_ORIGIN_RE.test(origin)) return origin;
29
+ return null;
30
+ }
31
+
32
+ function applyCorsHeaders(req, res) {
33
+ const allowOrigin = resolveCorsOrigin(req.headers?.origin);
34
+ if (!allowOrigin) return false;
35
+ res.setHeader("access-control-allow-origin", allowOrigin);
36
+ res.setHeader("vary", "origin");
37
+ res.setHeader("access-control-allow-methods", "GET,POST,PUT,PATCH,DELETE,OPTIONS");
38
+ res.setHeader(
39
+ "access-control-allow-headers",
40
+ [
41
+ "authorization",
42
+ "content-type",
43
+ "idempotency-key",
44
+ "x-proxy-tenant-id",
45
+ "x-proxy-ops-token",
46
+ "x-request-id",
47
+ "x-settld-protocol"
48
+ ].join(", ")
49
+ );
50
+ res.setHeader("access-control-max-age", "600");
51
+ return true;
52
+ }
53
+
11
54
  let store;
12
55
  if (cfg.store.mode === "pg") {
13
56
  store = await createPgStore({
@@ -22,12 +65,30 @@ const api = createApi({ store });
22
65
  const { handle } = api;
23
66
 
24
67
  const port = cfg.api.port;
25
- const server = http.createServer(handle);
26
- server.listen(port, () => {
27
- const storeDesc =
28
- cfg.store.mode === "pg" ? "(postgres)" : cfg.store.persistenceDir ? `(dataDir=${cfg.store.persistenceDir})` : "(in-memory)";
29
- logger.info("api listening", { port, storeMode: cfg.store.mode, storeDesc });
68
+ const server = http.createServer((req, res) => {
69
+ applyCorsHeaders(req, res);
70
+ if (req.method === "OPTIONS") {
71
+ res.statusCode = 204;
72
+ res.end();
73
+ return;
74
+ }
75
+ return handle(req, res);
30
76
  });
77
+ const bindHostRaw = typeof process !== "undefined" ? (process.env.PROXY_BIND_HOST ?? process.env.BIND_HOST ?? "") : "";
78
+ const bindHost = typeof bindHostRaw === "string" && bindHostRaw.trim() !== "" ? bindHostRaw.trim() : null;
79
+ if (bindHost) {
80
+ server.listen(port, bindHost, () => {
81
+ const storeDesc =
82
+ cfg.store.mode === "pg" ? "(postgres)" : cfg.store.persistenceDir ? `(dataDir=${cfg.store.persistenceDir})` : "(in-memory)";
83
+ logger.info("api listening", { port, host: bindHost, storeMode: cfg.store.mode, storeDesc });
84
+ });
85
+ } else {
86
+ server.listen(port, () => {
87
+ const storeDesc =
88
+ cfg.store.mode === "pg" ? "(postgres)" : cfg.store.persistenceDir ? `(dataDir=${cfg.store.persistenceDir})` : "(in-memory)";
89
+ logger.info("api listening", { port, storeMode: cfg.store.mode, storeDesc });
90
+ });
91
+ }
31
92
 
32
93
  const autotickIntervalMs = cfg.api.autotick.intervalMs;
33
94
  const autotickMaxMessages = cfg.api.autotick.maxMessages;
@@ -48,12 +109,27 @@ async function runAutotickOnce() {
48
109
  if (cfg.store.mode === "pg" && typeof store.processOutbox === "function") {
49
110
  await store.processOutbox({ maxMessages: autotickMaxMessages });
50
111
  }
112
+ if (typeof api.tickDispatch === "function") {
113
+ await api.tickDispatch({ maxMessages: autotickMaxMessages });
114
+ }
115
+ if (typeof api.tickProof === "function") {
116
+ await api.tickProof({ maxMessages: autotickMaxMessages });
117
+ }
51
118
  if (typeof api.tickArtifacts === "function") {
52
119
  await api.tickArtifacts({ maxMessages: autotickMaxMessages });
53
120
  }
54
121
  if (typeof api.tickDeliveries === "function") {
55
122
  await api.tickDeliveries({ maxMessages: autotickMaxMessages });
56
123
  }
124
+ if (typeof api.tickX402Holdbacks === "function") {
125
+ await api.tickX402Holdbacks({ maxMessages: autotickMaxMessages });
126
+ }
127
+ if (typeof api.tickX402InsolvencySweep === "function") {
128
+ await api.tickX402InsolvencySweep({ maxMessages: autotickMaxMessages });
129
+ }
130
+ if (typeof api.tickX402WinddownReversals === "function") {
131
+ await api.tickX402WinddownReversals({ maxMessages: autotickMaxMessages });
132
+ }
57
133
  if (typeof api.tickBillingStripeSync === "function") {
58
134
  await api.tickBillingStripeSync({ maxRows: autotickMaxMessages });
59
135
  }