settld 0.1.2 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (483) hide show
  1. package/README.md +93 -3
  2. package/SETTLD_VERSION +1 -1
  3. package/bin/settld-mcp +2 -0
  4. package/bin/settld.js +71 -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 +152 -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 +377 -0
  36. package/docs/QUICKSTART_MCP_HOSTS.md +210 -0
  37. package/docs/QUICKSTART_POLICY_PACKS.md +65 -0
  38. package/docs/QUICKSTART_PRODUCE.md +61 -0
  39. package/docs/QUICKSTART_PROFILES.md +198 -0
  40. package/docs/QUICKSTART_RELEASE_VERIFY.md +39 -0
  41. package/docs/QUICKSTART_SDK.md +125 -0
  42. package/docs/QUICKSTART_SDK_PYTHON.md +111 -0
  43. package/docs/QUICKSTART_VERIFY.md +54 -0
  44. package/docs/QUICKSTART_X402_GATEWAY.md +317 -0
  45. package/docs/README.md +33 -0
  46. package/docs/RELEASE_CHECKLIST.md +182 -0
  47. package/docs/RELEASING.md +82 -0
  48. package/docs/REPO_SETTINGS.md +37 -0
  49. package/docs/RUNBOOK.md +86 -0
  50. package/docs/SKILLS.md +42 -0
  51. package/docs/SKILL_BUNDLE_FORMAT.md +48 -0
  52. package/docs/SLO.md +131 -0
  53. package/docs/SUMMARY.md +17 -0
  54. package/docs/SUPPORT.md +31 -0
  55. package/docs/THREAT_MODEL.md +36 -0
  56. package/docs/TRUST.md +59 -0
  57. package/docs/WORKFLOW.md +35 -0
  58. package/docs/X402_BATCH_SETTLEMENT.md +126 -0
  59. package/docs/blog/2026-02-14-your-ai-agent-just-spent-500-where-is-the-receipt.md +73 -0
  60. package/docs/examples/x402-provider-payout-registry.example.json +14 -0
  61. package/docs/gitbook/README.md +64 -0
  62. package/docs/gitbook/SETUP.md +25 -0
  63. package/docs/gitbook/SUMMARY.md +15 -0
  64. package/docs/gitbook/api-reference.md +73 -0
  65. package/docs/gitbook/closepacks.md +55 -0
  66. package/docs/gitbook/conformance.md +59 -0
  67. package/docs/gitbook/core-primitives.md +85 -0
  68. package/docs/gitbook/dispute-lifecycle.md +33 -0
  69. package/docs/gitbook/faq.md +21 -0
  70. package/docs/gitbook/guides.md +49 -0
  71. package/docs/gitbook/operations-runbook.md +36 -0
  72. package/docs/gitbook/quickstart.md +103 -0
  73. package/docs/gitbook/replay-and-audit.md +30 -0
  74. package/docs/gitbook/sdk-reference.md +35 -0
  75. package/docs/gitbook/security-model.md +58 -0
  76. package/docs/integrations/README.md +15 -0
  77. package/docs/integrations/github-actions-verify.yml +31 -0
  78. package/docs/integrations/github-actions.md +34 -0
  79. package/docs/integrations/openclaw/CLAWHUB_PUBLISH_CHECKLIST.md +65 -0
  80. package/docs/integrations/openclaw/PUBLIC_QUICKSTART.md +95 -0
  81. package/docs/integrations/openclaw/settld-mcp-skill/SKILL.md +69 -0
  82. package/docs/integrations/openclaw/settld-mcp-skill/mcp-server.example.json +12 -0
  83. package/docs/kernel-compatible/capabilities.json +36 -0
  84. package/docs/marketing/agent-commerce-substrate.md +78 -0
  85. package/docs/marketing/hn-repost-2026-02-17.md +102 -0
  86. package/docs/marketing/show-hn-post.md +45 -0
  87. package/docs/ops/ARTIFACT_VERIFICATION_STATUS.md +43 -0
  88. package/docs/ops/BILLING_WEBHOOK_REPLAY.md +105 -0
  89. package/docs/ops/CI_FLAKE_BUDGET.md +31 -0
  90. package/docs/ops/DISPUTE_FINANCE_RECONCILIATION_PACKET.md +56 -0
  91. package/docs/ops/GO_LIVE_GATE_S13.md +27 -0
  92. package/docs/ops/HOSTED_BASELINE_R2.md +129 -0
  93. package/docs/ops/KERNEL_V0_SHIP_GATE.md +69 -0
  94. package/docs/ops/LIGHTHOUSE_PRODUCTION_CLOSE.md +51 -0
  95. package/docs/ops/MCP_COMPATIBILITY_MATRIX.md +30 -0
  96. package/docs/ops/MINIMUM_PRODUCTION_TOPOLOGY.md +89 -0
  97. package/docs/ops/P0_BACKEND_PROGRESS.md +150 -0
  98. package/docs/ops/PAYMENTS_ALPHA_R5.md +105 -0
  99. package/docs/ops/PILOT_ONBOARDING_RUNBOOK.md +112 -0
  100. package/docs/ops/PRODUCTION_DEPLOYMENT_CHECKLIST.md +140 -0
  101. package/docs/ops/R1_SLOS.md +66 -0
  102. package/docs/ops/RELEASE_SIGNING_INCIDENT.md +58 -0
  103. package/docs/ops/SELF_SERVE_LAUNCH_AUTOMATION.md +89 -0
  104. package/docs/ops/THROUGHPUT_DRILL_10X.md +48 -0
  105. package/docs/ops/TRUST_CONFIG_WIZARD.md +60 -0
  106. package/docs/ops/X402_PILOT_WEEKLY_METRICS.md +76 -0
  107. package/docs/ops/tool-call-disputes-holdback.md +52 -0
  108. package/docs/pilot-kit/PILOT_PACKAGE_SCORECARD_X402.md +46 -0
  109. package/docs/pilot-kit/README.md +29 -0
  110. package/docs/pilot-kit/architecture-one-pager.md +48 -0
  111. package/docs/pilot-kit/buyer-email.txt +19 -0
  112. package/docs/pilot-kit/buyer-one-pager.md +31 -0
  113. package/docs/pilot-kit/gtm-pilot-playbook.md +182 -0
  114. package/docs/pilot-kit/offline-verify.md +33 -0
  115. package/docs/pilot-kit/procurement-one-pager.md +50 -0
  116. package/docs/pilot-kit/rfp-clause.md +46 -0
  117. package/docs/pilot-kit/roi-calculator-template.csv +2 -0
  118. package/docs/pilot-kit/security-qa.md +153 -0
  119. package/docs/pilot-kit/security-summary.md +35 -0
  120. package/docs/plans/2026-02-13-mcp-spike-design.md +113 -0
  121. package/docs/plans/2026-02-20-trust-os-v1-jira-backlog.md +348 -0
  122. package/docs/plans/2026-02-21-agent-economic-actor-operating-model.md +169 -0
  123. package/docs/plans/2026-02-21-trust-os-v1-strategy.md +241 -0
  124. package/docs/research/2026-02-21-agent-spend-host-landscape.md +57 -0
  125. package/docs/spec/AcceptanceCriteria.v1.md +17 -0
  126. package/docs/spec/AcceptanceEvaluation.v1.md +10 -0
  127. package/docs/spec/AgentEvent.v1.md +47 -0
  128. package/docs/spec/AgentIdentity.v1.md +62 -0
  129. package/docs/spec/AgentPassport.v1.md +95 -0
  130. package/docs/spec/AgentReputation.v1.md +59 -0
  131. package/docs/spec/AgentReputation.v2.md +52 -0
  132. package/docs/spec/AgentRun.v1.md +47 -0
  133. package/docs/spec/AgentRunSettlement.v1.md +52 -0
  134. package/docs/spec/AgentWallet.v1.md +43 -0
  135. package/docs/spec/AgreementDelegation.v1.md +109 -0
  136. package/docs/spec/ArbitrationCase.v1.md +67 -0
  137. package/docs/spec/ArbitrationOutcomeMapping.v1.md +62 -0
  138. package/docs/spec/ArbitrationVerdict.v1.md +60 -0
  139. package/docs/spec/BundleHeadAttestation.v1.md +32 -0
  140. package/docs/spec/CANONICAL_JSON.md +31 -0
  141. package/docs/spec/CRYPTOGRAPHY.md +61 -0
  142. package/docs/spec/ClosePack.v1.md +49 -0
  143. package/docs/spec/ClosePackManifest.v1.md +24 -0
  144. package/docs/spec/DelegationGrant.v1.md +90 -0
  145. package/docs/spec/DisputeCaseLifecycle.v1.md +51 -0
  146. package/docs/spec/DisputeOpenEnvelope.v1.md +43 -0
  147. package/docs/spec/ERRORS.md +76 -0
  148. package/docs/spec/ESCROW_NETTING_INVARIANTS.md +71 -0
  149. package/docs/spec/EvidenceIndex.v1.md +20 -0
  150. package/docs/spec/ExecutionIntent.v1.md +90 -0
  151. package/docs/spec/FinancePackBundleManifest.v1.md +24 -0
  152. package/docs/spec/FundingHold.v1.md +60 -0
  153. package/docs/spec/GovernancePolicy.v1.md +34 -0
  154. package/docs/spec/GovernancePolicy.v2.md +30 -0
  155. package/docs/spec/INVARIANTS.md +389 -0
  156. package/docs/spec/InteractionDirectionMatrix.v1.md +30 -0
  157. package/docs/spec/InvoiceBundleManifest.v1.md +24 -0
  158. package/docs/spec/InvoiceClaim.v1.md +11 -0
  159. package/docs/spec/MONEY_RAIL_STATE_MACHINE.md +58 -0
  160. package/docs/spec/MarketplaceAcceptance.v2.md +46 -0
  161. package/docs/spec/MarketplaceOffer.v2.md +54 -0
  162. package/docs/spec/MeteringReport.v1.md +18 -0
  163. package/docs/spec/OperatorAction.v1.md +90 -0
  164. package/docs/spec/PRODUCER_ERRORS.md +42 -0
  165. package/docs/spec/PolicyDecision.v1.md +83 -0
  166. package/docs/spec/PricingMatrix.v1.md +20 -0
  167. package/docs/spec/PricingMatrixSignatures.v1.md +30 -0
  168. package/docs/spec/PricingMatrixSignatures.v2.md +29 -0
  169. package/docs/spec/ProduceCliOutput.v1.md +46 -0
  170. package/docs/spec/ProofBundleManifest.v1.md +24 -0
  171. package/docs/spec/README.md +109 -0
  172. package/docs/spec/REFERENCE_IMPLEMENTATIONS.md +29 -0
  173. package/docs/spec/REFERENCE_VERIFIER_BEHAVIOR.md +68 -0
  174. package/docs/spec/REMOTE_SIGNER.md +66 -0
  175. package/docs/spec/ReleaseIndex.v1.md +32 -0
  176. package/docs/spec/ReleaseIndexSignatures.v1.md +17 -0
  177. package/docs/spec/ReleaseTrust.v1.md +13 -0
  178. package/docs/spec/ReleaseTrust.v2.md +26 -0
  179. package/docs/spec/RemoteSignerRequest.v1.md +21 -0
  180. package/docs/spec/RemoteSignerResponse.v1.md +16 -0
  181. package/docs/spec/ReputationEvent.v1.md +63 -0
  182. package/docs/spec/RevocationList.v1.md +28 -0
  183. package/docs/spec/SIGNER_PROVIDER_PLUGIN.md +32 -0
  184. package/docs/spec/STRICTNESS.md +68 -0
  185. package/docs/spec/SUPPLY_CHAIN.md +33 -0
  186. package/docs/spec/SettlementAdjustment.v1.md +45 -0
  187. package/docs/spec/SettlementDecisionRecord.v1.md +48 -0
  188. package/docs/spec/SettlementDecisionRecord.v2.md +53 -0
  189. package/docs/spec/SettlementDecisionReport.v1.md +44 -0
  190. package/docs/spec/SettlementKernel.v1.md +59 -0
  191. package/docs/spec/SettlementReceipt.v1.md +63 -0
  192. package/docs/spec/SlaDefinition.v1.md +24 -0
  193. package/docs/spec/SlaEvaluation.v1.md +12 -0
  194. package/docs/spec/THREAT_MODEL.md +113 -0
  195. package/docs/spec/TOOL_PROVENANCE.md +30 -0
  196. package/docs/spec/TRUST_ANCHORS.md +84 -0
  197. package/docs/spec/TenantSettings.v1.md +90 -0
  198. package/docs/spec/TenantSettings.v2.md +99 -0
  199. package/docs/spec/TimestampProof.v1.md +25 -0
  200. package/docs/spec/ToolCallAgreement.v1.md +34 -0
  201. package/docs/spec/ToolCallEvidence.v1.md +47 -0
  202. package/docs/spec/ToolManifest.v1.md +47 -0
  203. package/docs/spec/VERIFIER_ENVIRONMENT.md +38 -0
  204. package/docs/spec/VERSIONING.md +107 -0
  205. package/docs/spec/VerificationReport.v1.md +50 -0
  206. package/docs/spec/VerifyAboutOutput.v1.md +10 -0
  207. package/docs/spec/VerifyCliOutput.v1.md +28 -0
  208. package/docs/spec/WARNINGS.md +83 -0
  209. package/docs/spec/error-codes.v1.txt +285 -0
  210. package/docs/spec/examples/agreement_delegation_v1.example.json +21 -0
  211. package/docs/spec/examples/arbitration_case_v1.example.json +26 -0
  212. package/docs/spec/examples/arbitration_verdict_v1.example.json +32 -0
  213. package/docs/spec/examples/dispute_open_envelope_v1.example.json +18 -0
  214. package/docs/spec/examples/produce_cli_output_v1.example.json +32 -0
  215. package/docs/spec/examples/release_index_signature_v1.example.json +9 -0
  216. package/docs/spec/examples/release_index_signatures_v1.example.json +14 -0
  217. package/docs/spec/examples/release_index_v1.example.json +15 -0
  218. package/docs/spec/examples/release_trust_v1.example.json +7 -0
  219. package/docs/spec/examples/release_trust_v2.example.json +22 -0
  220. package/docs/spec/examples/remote_signer_request_v1.example.json +18 -0
  221. package/docs/spec/examples/remote_signer_response_v1.example.json +8 -0
  222. package/docs/spec/examples/reputation_event_v1.example.json +29 -0
  223. package/docs/spec/examples/verification_report_v1.example.json +24 -0
  224. package/docs/spec/examples/verify_about_output_v1.example.json +29 -0
  225. package/docs/spec/examples/verify_cli_output_v1.example.json +13 -0
  226. package/docs/spec/legacy/MarketplaceAcceptance.v1.md +48 -0
  227. package/docs/spec/legacy/MarketplaceOffer.v1.md +56 -0
  228. package/docs/spec/legacy/schemas/MarketplaceAcceptance.v1.schema.json +53 -0
  229. package/docs/spec/legacy/schemas/MarketplaceOffer.v1.schema.json +61 -0
  230. package/docs/spec/producer-error-codes.v1.txt +14 -0
  231. package/docs/spec/schemas/AcceptanceCriteria.v1.schema.json +24 -0
  232. package/docs/spec/schemas/AcceptanceEvaluation.v1.schema.json +26 -0
  233. package/docs/spec/schemas/AgentEvent.v1.schema.json +49 -0
  234. package/docs/spec/schemas/AgentIdentity.v1.schema.json +129 -0
  235. package/docs/spec/schemas/AgentPassport.v1.schema.json +112 -0
  236. package/docs/spec/schemas/AgentReputation.v1.schema.json +151 -0
  237. package/docs/spec/schemas/AgentReputation.v2.schema.json +120 -0
  238. package/docs/spec/schemas/AgentRun.v1.schema.json +71 -0
  239. package/docs/spec/schemas/AgentRunSettlement.v1.schema.json +75 -0
  240. package/docs/spec/schemas/AgentWallet.v1.schema.json +54 -0
  241. package/docs/spec/schemas/AgreementDelegation.v1.schema.json +50 -0
  242. package/docs/spec/schemas/ArbitrationCase.v1.schema.json +133 -0
  243. package/docs/spec/schemas/ArbitrationVerdict.v1.schema.json +149 -0
  244. package/docs/spec/schemas/BundleHeadAttestation.v1.schema.json +21 -0
  245. package/docs/spec/schemas/ClosePackManifest.v1.schema.json +38 -0
  246. package/docs/spec/schemas/DelegationGrant.v1.schema.json +102 -0
  247. package/docs/spec/schemas/DisputeOpenEnvelope.v1.schema.json +78 -0
  248. package/docs/spec/schemas/EvidenceIndex.v1.schema.json +41 -0
  249. package/docs/spec/schemas/ExecutionIntent.v1.schema.json +85 -0
  250. package/docs/spec/schemas/FinancePackBundleManifest.v1.schema.json +38 -0
  251. package/docs/spec/schemas/FundingHold.v1.schema.json +46 -0
  252. package/docs/spec/schemas/GovernancePolicy.v1.schema.json +45 -0
  253. package/docs/spec/schemas/GovernancePolicy.v2.schema.json +70 -0
  254. package/docs/spec/schemas/InteractionDirectionMatrix.v1.schema.json +43 -0
  255. package/docs/spec/schemas/InvoiceBundleManifest.v1.schema.json +38 -0
  256. package/docs/spec/schemas/InvoiceClaim.v1.schema.json +39 -0
  257. package/docs/spec/schemas/MarketplaceAcceptance.v2.schema.json +53 -0
  258. package/docs/spec/schemas/MarketplaceOffer.v2.schema.json +61 -0
  259. package/docs/spec/schemas/MeteringReport.v1.schema.json +45 -0
  260. package/docs/spec/schemas/OperatorAction.v1.schema.json +113 -0
  261. package/docs/spec/schemas/PolicyDecision.v1.schema.json +74 -0
  262. package/docs/spec/schemas/PricingMatrix.v1.schema.json +24 -0
  263. package/docs/spec/schemas/PricingMatrixSignatures.v1.schema.json +24 -0
  264. package/docs/spec/schemas/PricingMatrixSignatures.v2.schema.json +24 -0
  265. package/docs/spec/schemas/ProduceCliOutput.v1.schema.json +107 -0
  266. package/docs/spec/schemas/ProofBundleManifest.v1.schema.json +37 -0
  267. package/docs/spec/schemas/PublicKeys.v1.schema.json +33 -0
  268. package/docs/spec/schemas/ReleaseIndex.v1.schema.json +45 -0
  269. package/docs/spec/schemas/ReleaseIndexSignature.v1.schema.json +16 -0
  270. package/docs/spec/schemas/ReleaseIndexSignatures.v1.schema.json +16 -0
  271. package/docs/spec/schemas/ReleaseTrust.v1.schema.json +15 -0
  272. package/docs/spec/schemas/ReleaseTrust.v2.schema.json +37 -0
  273. package/docs/spec/schemas/RemoteSignerPublicKeyResponse.v1.schema.json +14 -0
  274. package/docs/spec/schemas/RemoteSignerRequest.v1.schema.json +24 -0
  275. package/docs/spec/schemas/RemoteSignerResponse.v1.schema.json +10 -0
  276. package/docs/spec/schemas/RemoteSignerSignRequest.v1.schema.json +27 -0
  277. package/docs/spec/schemas/RemoteSignerSignResponse.v1.schema.json +16 -0
  278. package/docs/spec/schemas/ReputationEvent.v1.schema.json +164 -0
  279. package/docs/spec/schemas/RevocationList.v1.schema.json +51 -0
  280. package/docs/spec/schemas/SettlementAdjustment.v1.schema.json +44 -0
  281. package/docs/spec/schemas/SettlementDecisionRecord.v1.schema.json +66 -0
  282. package/docs/spec/schemas/SettlementDecisionRecord.v2.schema.json +149 -0
  283. package/docs/spec/schemas/SettlementDecisionReport.v1.schema.json +61 -0
  284. package/docs/spec/schemas/SettlementReceipt.v1.schema.json +135 -0
  285. package/docs/spec/schemas/SlaDefinition.v1.schema.json +33 -0
  286. package/docs/spec/schemas/SlaEvaluation.v1.schema.json +26 -0
  287. package/docs/spec/schemas/TenantSettings.v1.schema.json +90 -0
  288. package/docs/spec/schemas/TenantSettings.v2.schema.json +161 -0
  289. package/docs/spec/schemas/TimestampProof.v1.schema.json +17 -0
  290. package/docs/spec/schemas/ToolCallAgreement.v1.schema.json +34 -0
  291. package/docs/spec/schemas/ToolCallEvidence.v1.schema.json +45 -0
  292. package/docs/spec/schemas/ToolManifest.v1.schema.json +54 -0
  293. package/docs/spec/schemas/VerificationReport.v1.schema.json +83 -0
  294. package/docs/spec/schemas/VerifyAboutOutput.v1.schema.json +54 -0
  295. package/docs/spec/schemas/VerifyCliOutput.v1.schema.json +75 -0
  296. package/docs/spec/schemas/VerifyReleaseOutput.v1.schema.json +47 -0
  297. package/docs/spec/x402-error-codes.v1.txt +35 -0
  298. package/docs/templates/buyer-email.txt +18 -0
  299. package/docs/templates/buyer-one-pager.md +24 -0
  300. package/package.json +53 -6
  301. package/scripts/acceptance/full-stack.mjs +734 -0
  302. package/scripts/acceptance/full-stack.sh +99 -0
  303. package/scripts/audit/build-audit-packet.mjs +242 -0
  304. package/scripts/backup-pg.sh +45 -0
  305. package/scripts/backup-restore/README.md +18 -0
  306. package/scripts/backup-restore/capture-state.mjs +130 -0
  307. package/scripts/backup-restore/client.mjs +97 -0
  308. package/scripts/backup-restore/seed-workload.mjs +235 -0
  309. package/scripts/backup-restore/verify-state.mjs +139 -0
  310. package/scripts/backup-restore-test.sh +217 -0
  311. package/scripts/chaos.js +221 -0
  312. package/scripts/ci/build-launch-cutover-packet.mjs +304 -0
  313. package/scripts/ci/build-self-serve-benchmark-report.mjs +122 -0
  314. package/scripts/ci/changelog-guard.mjs +145 -0
  315. package/scripts/ci/check-kernel-v0-launch-gate.mjs +233 -0
  316. package/scripts/ci/check-secret-hygiene.mjs +78 -0
  317. package/scripts/ci/check-version-consistency.mjs +42 -0
  318. package/scripts/ci/cli-pack-smoke.mjs +160 -0
  319. package/scripts/ci/flake-budget-guard.mjs +68 -0
  320. package/scripts/ci/generate-error-codes.mjs +54 -0
  321. package/scripts/ci/lib/lighthouse-tracker.mjs +90 -0
  322. package/scripts/ci/lib/self-serve-launch-gate.mjs +89 -0
  323. package/scripts/ci/npm-pack-smoke.mjs +454 -0
  324. package/scripts/ci/run-10x-throughput-drill.mjs +318 -0
  325. package/scripts/ci/run-10x-throughput-incident-rehearsal.mjs +368 -0
  326. package/scripts/ci/run-arbitration-workspace-browser-e2e.sh +22 -0
  327. package/scripts/ci/run-circle-sandbox-smoke.mjs +237 -0
  328. package/scripts/ci/run-go-live-gate.mjs +150 -0
  329. package/scripts/ci/run-kernel-v0-ship-gate.mjs +97 -0
  330. package/scripts/ci/run-mcp-host-cert-matrix.mjs +201 -0
  331. package/scripts/ci/run-mcp-host-smoke.mjs +473 -0
  332. package/scripts/ci/run-offline-verification-parity-gate.mjs +762 -0
  333. package/scripts/ci/run-onboarding-host-success-gate.mjs +516 -0
  334. package/scripts/ci/run-onboarding-policy-slo-gate.mjs +537 -0
  335. package/scripts/ci/run-production-cutover-gate.mjs +540 -0
  336. package/scripts/ci/run-public-openclaw-npx-smoke.mjs +148 -0
  337. package/scripts/ci/run-release-promotion-guard.mjs +756 -0
  338. package/scripts/ci/run-self-serve-launch-gate.mjs +56 -0
  339. package/scripts/ci/runtime-import-smoke.mjs +58 -0
  340. package/scripts/ci/update-lighthouse-tracker.mjs +112 -0
  341. package/scripts/closepack/lib.mjs +286 -0
  342. package/scripts/collect-debug.sh +263 -0
  343. package/scripts/demo/compositional-settlement-3hop.mjs +237 -0
  344. package/scripts/demo/delivery-robot/export-ui-fixture.mjs +188 -0
  345. package/scripts/demo/delivery-robot/generate.mjs +377 -0
  346. package/scripts/demo/kernel-agent-goes-shopping.mjs +202 -0
  347. package/scripts/demo/magic-link-first-green.mjs +118 -0
  348. package/scripts/demo/magic-link-kind-smoke.mjs +577 -0
  349. package/scripts/demo/mcp-paid-exa.mjs +1110 -0
  350. package/scripts/dev/billing-doctor.sh +145 -0
  351. package/scripts/dev/billing-smoke-prod.sh +219 -0
  352. package/scripts/dev/billing-webhook-replay.sh +161 -0
  353. package/scripts/dev/env.dev.example +29 -0
  354. package/scripts/dev/env.sh +37 -0
  355. package/scripts/dev/new-sdk-key.sh +81 -0
  356. package/scripts/dev/sdk-first-run.sh +21 -0
  357. package/scripts/dev/smoke-x402-gateway.sh +115 -0
  358. package/scripts/dev/start-api.sh +24 -0
  359. package/scripts/doctor/mcp-host.mjs +120 -0
  360. package/scripts/examples/produce-and-verify-jobproof.mjs +191 -0
  361. package/scripts/examples/sdk-first-paid-rfq.py +105 -0
  362. package/scripts/examples/sdk-first-verified-run.mjs +85 -0
  363. package/scripts/examples/sdk-first-verified-run.py +99 -0
  364. package/scripts/examples/sdk-tenant-analytics.mjs +103 -0
  365. package/scripts/examples/sdk-tenant-analytics.py +118 -0
  366. package/scripts/finance-pack/bundle.mjs +284 -0
  367. package/scripts/fixtures/generate-bundle-fixtures.mjs +877 -0
  368. package/scripts/governance/export.mjs +169 -0
  369. package/scripts/load/delivery-stress.k6.js +183 -0
  370. package/scripts/load/ingest-burst.k6.js +236 -0
  371. package/scripts/load/run-delivery-load.js +66 -0
  372. package/scripts/load/webhook-receiver.js +131 -0
  373. package/scripts/magic-link/migrate-run-records-to-db.mjs +35 -0
  374. package/scripts/mcp/probe.mjs +238 -0
  375. package/scripts/mcp/settld-mcp-http-gateway.mjs +178 -0
  376. package/scripts/mcp/settld-mcp-server.mjs +1511 -0
  377. package/scripts/openapi/write.mjs +13 -0
  378. package/scripts/ops/bootstrap-tenant-conformance.mjs +185 -0
  379. package/scripts/ops/build-x402-pilot-reliability-report.mjs +489 -0
  380. package/scripts/ops/check-x402-receipt-sample.mjs +181 -0
  381. package/scripts/ops/design-partner-run-packet.mjs +466 -0
  382. package/scripts/ops/dispute-finance-reconciliation-packet.mjs +313 -0
  383. package/scripts/ops/hosted-baseline-evidence.mjs +890 -0
  384. package/scripts/ops/money-rails-chargeback-evidence.mjs +509 -0
  385. package/scripts/ops/money-rails-reconcile-evidence.mjs +180 -0
  386. package/scripts/ops/p0-seed-money-rail-operation.mjs +432 -0
  387. package/scripts/ops/run-x402-hitl-smoke.mjs +607 -0
  388. package/scripts/pilot/finance-pack.mjs +495 -0
  389. package/scripts/pilot/fixtures/robot-keypair.json +4 -0
  390. package/scripts/pilot/fixtures/server-signer.json +4 -0
  391. package/scripts/policy/cli.mjs +600 -0
  392. package/scripts/profile/cli.mjs +1324 -0
  393. package/scripts/proof-bundle/job.mjs +109 -0
  394. package/scripts/proof-bundle/lib.mjs +92 -0
  395. package/scripts/proof-bundle/month.mjs +103 -0
  396. package/scripts/provider/conformance-run.mjs +159 -0
  397. package/scripts/provider/keys-generate.mjs +135 -0
  398. package/scripts/provider/publish.mjs +420 -0
  399. package/scripts/quickstart/x402.mjs +334 -0
  400. package/scripts/register-entity-secret.mjs +102 -0
  401. package/scripts/release/build-artifacts.mjs +181 -0
  402. package/scripts/release/generate-release-index.mjs +112 -0
  403. package/scripts/release/release-index-lib.mjs +232 -0
  404. package/scripts/release/sign-release-index.mjs +85 -0
  405. package/scripts/release/validate-release-assets.mjs +170 -0
  406. package/scripts/release/verify-release.mjs +261 -0
  407. package/scripts/restore-pg.sh +34 -0
  408. package/scripts/scaffold/create-settld-paid-tool.mjs +19 -0
  409. package/scripts/sdk/smoke-python.py +30 -0
  410. package/scripts/sdk/smoke.mjs +16 -0
  411. package/scripts/settlement/x402-batch-worker.mjs +1091 -0
  412. package/scripts/setup/circle-bootstrap.mjs +310 -0
  413. package/scripts/setup/host-config.mjs +617 -0
  414. package/scripts/setup/onboard.mjs +1337 -0
  415. package/scripts/setup/openclaw-onboard.mjs +423 -0
  416. package/scripts/setup/wizard.mjs +986 -0
  417. package/scripts/slo/check.mjs +239 -0
  418. package/scripts/smoke/k8s-smoke.mjs +214 -0
  419. package/scripts/spec/generate-protocol-vectors.mjs +1019 -0
  420. package/scripts/test/check-no-generated-artifacts.sh +12 -0
  421. package/scripts/test/run.sh +59 -0
  422. package/scripts/trust/validate-trust-file.mjs +57 -0
  423. package/scripts/trust-config/rotate-settld-pay.mjs +277 -0
  424. package/scripts/trust-config/wizard.mjs +161 -0
  425. package/scripts/vendor-contract-test-lib.mjs +182 -0
  426. package/scripts/vendor-contract-test.mjs +55 -0
  427. package/scripts/vercel/build-mkdocs.sh +9 -0
  428. package/scripts/vercel/ignore-mkdocs.sh +25 -0
  429. package/scripts/vercel/install-mkdocs.sh +6 -0
  430. package/scripts/verify-pg.js +217 -0
  431. package/scripts/x402/receipt-verify.mjs +289 -0
  432. package/services/finance-sink/src/dedupe-store.js +29 -6
  433. package/services/receiver/src/dedupe-store.js +29 -5
  434. package/services/x402-gateway/Dockerfile +13 -0
  435. package/services/x402-gateway/README.md +58 -0
  436. package/services/x402-gateway/examples/upstream-mock.js +337 -0
  437. package/services/x402-gateway/src/server.js +1058 -0
  438. package/src/api/app.js +34658 -16940
  439. package/src/api/maintenance.js +70 -0
  440. package/src/api/middleware/trust-kernel.js +114 -0
  441. package/src/api/openapi.js +1778 -70
  442. package/src/api/persistence.js +456 -0
  443. package/src/api/server.js +81 -5
  444. package/src/api/store.js +1581 -62
  445. package/src/api/workers/deliveries.js +99 -4
  446. package/src/api/workers/insolvency-sweep.js +159 -0
  447. package/src/core/agent-card.js +69 -0
  448. package/src/core/agent-wallets.js +231 -0
  449. package/src/core/agreement-delegation.js +549 -0
  450. package/src/core/billing-plans.js +40 -6
  451. package/src/core/circle-reserve-adapter.js +845 -0
  452. package/src/core/event-policy.js +21 -2
  453. package/src/core/maintenance-locks.js +1 -0
  454. package/src/core/operator-action.js +303 -0
  455. package/src/core/paid-tool-manifest.js +318 -0
  456. package/src/core/policy-decision.js +322 -0
  457. package/src/core/policy-packs.js +207 -0
  458. package/src/core/profile-fingerprint.js +27 -0
  459. package/src/core/profile-simulation-reasons.js +84 -0
  460. package/src/core/profile-templates.js +242 -0
  461. package/src/core/provider-publish-conformance.js +525 -0
  462. package/src/core/provider-publish-proof.js +396 -0
  463. package/src/core/provider-quote-signature.js +170 -0
  464. package/src/core/settld-keys.js +112 -0
  465. package/src/core/settld-pay-token.js +344 -0
  466. package/src/core/settlement-kernel.js +239 -2
  467. package/src/core/settlement-verifier.js +335 -0
  468. package/src/core/tool-call-agreement.js +112 -0
  469. package/src/core/tool-call-evidence.js +144 -0
  470. package/src/core/tool-provider-signature.js +98 -0
  471. package/src/core/wallet-assignment-resolver.js +129 -0
  472. package/src/core/wallet-provider-bootstrap.js +365 -0
  473. package/src/core/x402-escalation-override.js +258 -0
  474. package/src/core/x402-gate.js +118 -0
  475. package/src/core/x402-provider-refund-decision.js +220 -0
  476. package/src/core/x402-receipt-verifier.js +708 -0
  477. package/src/core/x402-reversal-command.js +251 -0
  478. package/src/core/x402-wallet-issuer-decision.js +252 -0
  479. package/src/core/zk-verifier.js +300 -0
  480. package/src/db/migrations/029_reputation_event_index.sql +54 -0
  481. package/src/db/migrations/030_artifacts_source_event_unique_job_only.sql +15 -0
  482. package/src/db/pg.js +18 -7
  483. package/src/db/store-pg.js +1508 -111
@@ -0,0 +1,334 @@
1
+ import { spawn } from "node:child_process";
2
+ import process from "node:process";
3
+ import { setTimeout as delay } from "node:timers/promises";
4
+
5
+ function readIntEnv(name, fallback) {
6
+ const raw = process.env[name];
7
+ if (raw === undefined || raw === null || String(raw).trim() === "") return fallback;
8
+ const n = Number(raw);
9
+ if (!Number.isSafeInteger(n) || n <= 0) throw new Error(`${name} must be a positive integer`);
10
+ return n;
11
+ }
12
+
13
+ function readNonNegativeIntEnv(name, fallback) {
14
+ const raw = process.env[name];
15
+ if (raw === undefined || raw === null || String(raw).trim() === "") return fallback;
16
+ const n = Number(raw);
17
+ if (!Number.isSafeInteger(n) || n < 0) throw new Error(`${name} must be a non-negative integer`);
18
+ return n;
19
+ }
20
+
21
+ function readBoolEnv(name, fallback) {
22
+ const raw = process.env[name];
23
+ if (raw === undefined || raw === null || String(raw).trim() === "") return fallback;
24
+ const v = String(raw).trim().toLowerCase();
25
+ if (v === "1" || v === "true" || v === "yes") return true;
26
+ if (v === "0" || v === "false" || v === "no") return false;
27
+ throw new Error(`${name} must be a boolean (1/0/true/false)`);
28
+ }
29
+
30
+ function sanitize(text) {
31
+ return String(text ?? "").replaceAll(/[\r\n]+/g, " ").trim();
32
+ }
33
+
34
+ function log(prefix, msg) {
35
+ process.stderr.write(`[${prefix}] ${msg}\n`);
36
+ }
37
+
38
+ function spawnProc({ name, cmd, args, env }) {
39
+ log(name, `spawn: ${cmd} ${args.join(" ")}`);
40
+ const child = spawn(cmd, args, {
41
+ env: { ...process.env, ...(env ?? {}) },
42
+ stdio: ["ignore", "pipe", "pipe"]
43
+ });
44
+ child.stdout?.on("data", (buf) => {
45
+ const s = sanitize(buf.toString("utf8"));
46
+ if (s) log(name, s);
47
+ });
48
+ child.stderr?.on("data", (buf) => {
49
+ const s = sanitize(buf.toString("utf8"));
50
+ if (s) log(name, s);
51
+ });
52
+ child.on("exit", (code, signal) => {
53
+ log(name, `exit: code=${code} signal=${signal ?? ""}`);
54
+ });
55
+ return child;
56
+ }
57
+
58
+ async function waitForJson(url, { name, timeoutMs = 30_000, proc = null } = {}) {
59
+ const start = Date.now();
60
+ while (true) {
61
+ if (proc && proc.exitCode !== null) {
62
+ throw new Error(`${name ?? url} exited before becoming ready (exitCode=${proc.exitCode})`);
63
+ }
64
+ try {
65
+ const res = await fetch(url, { method: "GET" });
66
+ if (res.ok) {
67
+ const text = await res.text();
68
+ try {
69
+ return text ? JSON.parse(text) : null;
70
+ } catch {
71
+ return null;
72
+ }
73
+ }
74
+ } catch {}
75
+
76
+ if (Date.now() - start > timeoutMs) {
77
+ throw new Error(`${name ?? url} did not become ready within ${timeoutMs}ms: ${url}`);
78
+ }
79
+ await delay(250);
80
+ }
81
+ }
82
+
83
+ async function mintApiKey({ apiUrl, opsToken, tenantId }) {
84
+ const res = await fetch(new URL("/ops/api-keys", apiUrl), {
85
+ method: "POST",
86
+ headers: {
87
+ "x-proxy-ops-token": opsToken,
88
+ authorization: `Bearer ${opsToken}`,
89
+ "x-proxy-tenant-id": tenantId,
90
+ "content-type": "application/json"
91
+ },
92
+ body: JSON.stringify({
93
+ scopes: ["ops_read", "ops_write", "finance_read", "finance_write", "audit_read"],
94
+ description: "x402 quickstart script"
95
+ })
96
+ });
97
+ const text = await res.text();
98
+ let json;
99
+ try {
100
+ json = text ? JSON.parse(text) : null;
101
+ } catch {
102
+ json = null;
103
+ }
104
+ if (!res.ok) {
105
+ throw new Error(`mint api key failed: HTTP ${res.status} ${text}`);
106
+ }
107
+ const keyId = json?.keyId;
108
+ const secret = json?.secret;
109
+ if (typeof keyId !== "string" || typeof secret !== "string" || !keyId || !secret) {
110
+ throw new Error(`mint api key returned unexpected body: ${text}`);
111
+ }
112
+ return `${keyId}.${secret}`;
113
+ }
114
+
115
+ function headerValue(headersText, headerName) {
116
+ const want = String(headerName).trim().toLowerCase() + ":";
117
+ const lines = String(headersText)
118
+ .split("\n")
119
+ .map((l) => l.replaceAll("\r", ""));
120
+ for (const line of lines) {
121
+ const idx = line.indexOf(":");
122
+ if (idx <= 0) continue;
123
+ const key = line.slice(0, idx + 1).trim().toLowerCase();
124
+ if (key === want) return line.slice(idx + 1).trim();
125
+ }
126
+ return null;
127
+ }
128
+
129
+ async function fetchHeaders(url, { headers } = {}) {
130
+ const res = await fetch(url, { method: "GET", headers: headers ?? {} });
131
+ const status = res.status;
132
+ const text = await res.text();
133
+ const headersObj = Object.fromEntries(res.headers.entries());
134
+ return { status, text, headers: headersObj };
135
+ }
136
+
137
+ async function runSmokeTest({ gatewayUrl, holdbackBps, disputeWindowMs }) {
138
+ const first = await fetch(gatewayUrl);
139
+ const firstText = await first.text();
140
+ const firstHeaders = Object.fromEntries(first.headers.entries());
141
+ if (first.status !== 402) {
142
+ throw new Error(`expected first request to return 402; got ${first.status}`);
143
+ }
144
+ const paymentRequired = firstHeaders["x-payment-required"];
145
+ if (!paymentRequired) throw new Error("missing x-payment-required header on 402 response");
146
+
147
+ const gateId = firstHeaders["x-settld-gate-id"];
148
+ if (!gateId) throw new Error("missing x-settld-gate-id header on 402 response");
149
+
150
+ // Parse amountCents=... out of x-payment-required.
151
+ const m = String(paymentRequired).match(/(?:^|;)\s*amountCents=([0-9]+)\b/);
152
+ if (!m) throw new Error(`could not parse amountCents from x-payment-required: ${paymentRequired}`);
153
+ const amountCents = Number(m[1]);
154
+ if (!Number.isSafeInteger(amountCents) || amountCents <= 0) throw new Error(`invalid amountCents: ${m[1]}`);
155
+
156
+ const second = await fetch(gatewayUrl, {
157
+ method: "GET",
158
+ headers: {
159
+ "x-settld-gate-id": gateId,
160
+ "x-payment": "paid"
161
+ }
162
+ });
163
+ await second.arrayBuffer();
164
+ const secondHeaders = Object.fromEntries(second.headers.entries());
165
+ if (second.status !== 200) {
166
+ throw new Error(`expected second request to return 200; got ${second.status}`);
167
+ }
168
+
169
+ const settlementStatus = secondHeaders["x-settld-settlement-status"];
170
+ const releasedAmountCents = Number(secondHeaders["x-settld-released-amount-cents"] ?? "NaN");
171
+ const refundedAmountCents = Number(secondHeaders["x-settld-refunded-amount-cents"] ?? "NaN");
172
+ const holdbackStatus = secondHeaders["x-settld-holdback-status"];
173
+ const holdbackAmountCents = Number(secondHeaders["x-settld-holdback-amount-cents"] ?? "NaN");
174
+
175
+ const expectedHoldbackCents = Math.floor((amountCents * holdbackBps) / 10_000);
176
+ const expectedReleasedCents = amountCents - expectedHoldbackCents;
177
+ const expectedRefundedCents = expectedHoldbackCents;
178
+ const expectedHoldbackStatus = disputeWindowMs > 0 ? "held" : "released";
179
+
180
+ if (settlementStatus !== "released") throw new Error(`expected settlement status released; got ${settlementStatus}`);
181
+ if (!Number.isSafeInteger(releasedAmountCents) || releasedAmountCents !== expectedReleasedCents) {
182
+ throw new Error(`released cents mismatch: got=${releasedAmountCents} expected=${expectedReleasedCents}`);
183
+ }
184
+ if (!Number.isSafeInteger(refundedAmountCents) || refundedAmountCents !== expectedRefundedCents) {
185
+ throw new Error(`refunded cents mismatch: got=${refundedAmountCents} expected=${expectedRefundedCents}`);
186
+ }
187
+ if (expectedHoldbackCents > 0) {
188
+ if (holdbackStatus !== expectedHoldbackStatus) {
189
+ throw new Error(`holdback status mismatch: got=${holdbackStatus} expected=${expectedHoldbackStatus}`);
190
+ }
191
+ if (!Number.isSafeInteger(holdbackAmountCents) || holdbackAmountCents !== expectedHoldbackCents) {
192
+ throw new Error(`holdback cents mismatch: got=${holdbackAmountCents} expected=${expectedHoldbackCents}`);
193
+ }
194
+ }
195
+
196
+ return { gateId, amountCents };
197
+ }
198
+
199
+ async function main() {
200
+ const apiPort = readIntEnv("SETTLD_QUICKSTART_API_PORT", 3000);
201
+ const upstreamPort = readIntEnv("SETTLD_QUICKSTART_UPSTREAM_PORT", 9402);
202
+ const gatewayPort = readIntEnv("SETTLD_QUICKSTART_GATEWAY_PORT", 8402);
203
+
204
+ const opsToken = String(process.env.SETTLD_QUICKSTART_OPS_TOKEN ?? "tok_ops").trim() || "tok_ops";
205
+ const tenantId = String(process.env.SETTLD_TENANT_ID ?? "tenant_default").trim() || "tenant_default";
206
+
207
+ const holdbackBps = readNonNegativeIntEnv("HOLDBACK_BPS", 0);
208
+ if (holdbackBps > 10_000) throw new Error("HOLDBACK_BPS must be within 0..10000");
209
+ const disputeWindowMs = readNonNegativeIntEnv("DISPUTE_WINDOW_MS", 3_600_000);
210
+ const autoFund = readBoolEnv("X402_AUTOFUND", true);
211
+
212
+ const keepAlive = readBoolEnv("SETTLD_QUICKSTART_KEEP_ALIVE", true);
213
+
214
+ const apiUrl = new URL(`http://127.0.0.1:${apiPort}`);
215
+ const upstreamUrl = new URL(`http://127.0.0.1:${upstreamPort}`);
216
+ const gatewayUrl = new URL(`http://127.0.0.1:${gatewayPort}/resource`);
217
+
218
+ const procs = [];
219
+ const stopAll = () => {
220
+ for (const p of procs) {
221
+ try {
222
+ p.kill("SIGTERM");
223
+ } catch {}
224
+ }
225
+ };
226
+ process.on("SIGINT", () => {
227
+ log("quickstart", "SIGINT: shutting down...");
228
+ stopAll();
229
+ process.exit(130);
230
+ });
231
+ process.on("SIGTERM", () => {
232
+ log("quickstart", "SIGTERM: shutting down...");
233
+ stopAll();
234
+ process.exit(143);
235
+ });
236
+
237
+ // 1) API
238
+ const api = spawnProc({
239
+ name: "api",
240
+ cmd: "node",
241
+ args: ["src/api/server.js"],
242
+ env: {
243
+ PROXY_OPS_TOKEN: opsToken,
244
+ BIND_HOST: "127.0.0.1",
245
+ PORT: String(apiPort)
246
+ }
247
+ });
248
+ procs.push(api);
249
+ await waitForJson(new URL("/healthz", apiUrl).toString(), { name: "api /healthz", proc: api });
250
+
251
+ // 2) Mint API key
252
+ const apiKey = await mintApiKey({ apiUrl, opsToken, tenantId });
253
+ log("quickstart", "SETTLD_API_KEY minted");
254
+
255
+ // 3) Upstream mock
256
+ const upstream = spawnProc({
257
+ name: "upstream",
258
+ cmd: "node",
259
+ args: ["services/x402-gateway/examples/upstream-mock.js"],
260
+ env: {
261
+ BIND_HOST: "127.0.0.1",
262
+ PORT: String(upstreamPort),
263
+ SETTLD_PAY_KEYSET_URL: new URL("/.well-known/settld-keys.json", apiUrl).toString()
264
+ }
265
+ });
266
+ procs.push(upstream);
267
+ await waitForJson(new URL("/healthz", upstreamUrl).toString(), { name: "upstream /healthz", proc: upstream });
268
+
269
+ // Provider signature key (for correctness-verification demo).
270
+ const providerKeyRes = await fetch(new URL("/settld/provider-key", upstreamUrl));
271
+ const providerKey = providerKeyRes.ok ? await providerKeyRes.json() : null;
272
+ const providerPublicKeyPem = typeof providerKey?.publicKeyPem === "string" ? providerKey.publicKeyPem : null;
273
+ if (!providerPublicKeyPem) {
274
+ throw new Error("upstream did not expose a provider public key at /settld/provider-key");
275
+ }
276
+
277
+ // 4) Gateway
278
+ const gateway = spawnProc({
279
+ name: "gateway",
280
+ cmd: "node",
281
+ args: ["services/x402-gateway/src/server.js"],
282
+ env: {
283
+ BIND_HOST: "127.0.0.1",
284
+ SETTLD_API_URL: apiUrl.toString(),
285
+ SETTLD_API_KEY: apiKey,
286
+ UPSTREAM_URL: upstreamUrl.toString(),
287
+ HOLDBACK_BPS: String(holdbackBps),
288
+ DISPUTE_WINDOW_MS: String(disputeWindowMs),
289
+ X402_AUTOFUND: autoFund ? "1" : "0",
290
+ X402_PROVIDER_PUBLIC_KEY_PEM: providerPublicKeyPem,
291
+ PORT: String(gatewayPort)
292
+ }
293
+ });
294
+ procs.push(gateway);
295
+ await waitForJson(new URL("/healthz", `http://127.0.0.1:${gatewayPort}`).toString(), { name: "gateway /healthz", proc: gateway });
296
+
297
+ // 5) Smoke test
298
+ const { gateId } = await runSmokeTest({ gatewayUrl: gatewayUrl.toString(), holdbackBps, disputeWindowMs });
299
+ log("quickstart", `gateId=${gateId}`);
300
+
301
+ // Fetch gate state (proof of receipt trail)
302
+ const gateStateRes = await fetch(new URL(`/x402/gate/${encodeURIComponent(gateId)}`, apiUrl), {
303
+ method: "GET",
304
+ headers: {
305
+ authorization: `Bearer ${apiKey}`,
306
+ "x-proxy-tenant-id": tenantId,
307
+ "x-settld-protocol": "1.0"
308
+ }
309
+ });
310
+ const gateStateText = await gateStateRes.text();
311
+ if (!gateStateRes.ok) {
312
+ throw new Error(`gate state fetch failed: HTTP ${gateStateRes.status} ${gateStateText}`);
313
+ }
314
+ log("quickstart", "gate state fetched (receipt trail exists)");
315
+
316
+ process.stdout.write("OK\n");
317
+ process.stdout.write(`gateId=${gateId}\n`);
318
+ process.stdout.write(`gateStateUrl=${new URL(`/x402/gate/${encodeURIComponent(gateId)}`, apiUrl).toString()}\n`);
319
+
320
+ if (!keepAlive) {
321
+ stopAll();
322
+ return;
323
+ }
324
+
325
+ log("quickstart", "Services are running. Press Ctrl+C to stop.");
326
+ // Keep the process alive.
327
+ // eslint-disable-next-line no-constant-condition
328
+ while (true) await delay(1000);
329
+ }
330
+
331
+ main().catch((err) => {
332
+ log("quickstart", `failed: ${err?.message ?? String(err ?? "")}`);
333
+ process.exitCode = 1;
334
+ });
@@ -0,0 +1,102 @@
1
+ #!/usr/bin/env node
2
+
3
+ import path from "node:path";
4
+ import process from "node:process";
5
+
6
+ import { registerEntitySecretCiphertext } from "@circle-fin/developer-controlled-wallets";
7
+
8
+ function usage() {
9
+ const text = [
10
+ "usage:",
11
+ " node scripts/register-entity-secret.mjs [--api-key <key>] [--entity-secret-hex <hex64>] [--recovery-dir <path>]",
12
+ "",
13
+ "env fallbacks:",
14
+ " CIRCLE_API_KEY",
15
+ " CIRCLE_ENTITY_SECRET_HEX (or ENTITY_SECRET)",
16
+ " CIRCLE_RECOVERY_DIR (default: ./artifacts/circle-recovery)"
17
+ ].join("\n");
18
+ process.stderr.write(`${text}\n`);
19
+ }
20
+
21
+ function readArgValue(argv, index, arg) {
22
+ const raw = String(arg ?? "");
23
+ const eq = raw.indexOf("=");
24
+ if (eq >= 0) return { value: raw.slice(eq + 1), nextIndex: index };
25
+ return { value: String(argv[index + 1] ?? ""), nextIndex: index + 1 };
26
+ }
27
+
28
+ function parseArgs(argv) {
29
+ const out = {
30
+ apiKey: null,
31
+ entitySecretHex: null,
32
+ recoveryDir: null,
33
+ help: false
34
+ };
35
+ for (let i = 0; i < argv.length; i += 1) {
36
+ const arg = String(argv[i] ?? "");
37
+ if (arg === "--help" || arg === "-h") {
38
+ out.help = true;
39
+ continue;
40
+ }
41
+ if (arg === "--api-key" || arg.startsWith("--api-key=")) {
42
+ const parsed = readArgValue(argv, i, arg);
43
+ out.apiKey = parsed.value;
44
+ i = parsed.nextIndex;
45
+ continue;
46
+ }
47
+ if (arg === "--entity-secret-hex" || arg.startsWith("--entity-secret-hex=")) {
48
+ const parsed = readArgValue(argv, i, arg);
49
+ out.entitySecretHex = parsed.value;
50
+ i = parsed.nextIndex;
51
+ continue;
52
+ }
53
+ if (arg === "--recovery-dir" || arg.startsWith("--recovery-dir=")) {
54
+ const parsed = readArgValue(argv, i, arg);
55
+ out.recoveryDir = parsed.value;
56
+ i = parsed.nextIndex;
57
+ continue;
58
+ }
59
+ throw new Error(`unknown argument: ${arg}`);
60
+ }
61
+ return out;
62
+ }
63
+
64
+ function normalizeHex64(value) {
65
+ const raw = String(value ?? "").trim().toLowerCase();
66
+ if (!raw) return null;
67
+ if (!/^[0-9a-f]{64}$/.test(raw)) {
68
+ throw new Error("entity secret must be a 64-char hex string");
69
+ }
70
+ return raw;
71
+ }
72
+
73
+ async function main(argv = process.argv.slice(2)) {
74
+ const args = parseArgs(argv);
75
+ if (args.help) {
76
+ usage();
77
+ return;
78
+ }
79
+
80
+ const apiKey = String(args.apiKey ?? process.env.CIRCLE_API_KEY ?? "").trim();
81
+ const entitySecret = normalizeHex64(args.entitySecretHex ?? process.env.CIRCLE_ENTITY_SECRET_HEX ?? process.env.ENTITY_SECRET ?? "");
82
+ const recoveryFileDownloadPath = path.resolve(
83
+ process.cwd(),
84
+ String(args.recoveryDir ?? process.env.CIRCLE_RECOVERY_DIR ?? "./artifacts/circle-recovery")
85
+ );
86
+
87
+ if (!apiKey) throw new Error("CIRCLE_API_KEY missing (or pass --api-key)");
88
+ if (!entitySecret) throw new Error("CIRCLE_ENTITY_SECRET_HEX missing (or pass --entity-secret-hex)");
89
+
90
+ const res = await registerEntitySecretCiphertext({
91
+ apiKey,
92
+ entitySecret,
93
+ recoveryFileDownloadPath
94
+ });
95
+
96
+ process.stdout.write(`${JSON.stringify(res?.data ?? res, null, 2)}\n`);
97
+ }
98
+
99
+ main(process.argv.slice(2)).catch((err) => {
100
+ process.stderr.write(`${err?.message ?? String(err)}\n`);
101
+ process.exit(1);
102
+ });
@@ -0,0 +1,181 @@
1
+ import { spawnSync } from "node:child_process";
2
+ import crypto from "node:crypto";
3
+ import fs from "node:fs/promises";
4
+ import path from "node:path";
5
+
6
+ function readVersionForIndex() {
7
+ const v = process.env.SETTLD_VERSION ?? null;
8
+ return typeof v === "string" && v.trim() ? v.trim() : "0.0.0-local";
9
+ }
10
+
11
+ function sh(cmd, args, { cwd, env } = {}) {
12
+ const res = spawnSync(cmd, args, { cwd, env, encoding: "utf8" });
13
+ if (res.status !== 0) {
14
+ const err = (res.stderr || res.stdout || "").trim();
15
+ throw new Error(`${cmd} ${args.join(" ")} failed (exit ${res.status})${err ? `: ${err}` : ""}`);
16
+ }
17
+ return res.stdout;
18
+ }
19
+
20
+ async function sha256FileHex(fp) {
21
+ const h = crypto.createHash("sha256");
22
+ const f = await fs.open(fp, "r");
23
+ try {
24
+ const buf = Buffer.alloc(1024 * 1024);
25
+ while (true) {
26
+ // eslint-disable-next-line no-await-in-loop
27
+ const { bytesRead } = await f.read(buf, 0, buf.length, null);
28
+ if (bytesRead === 0) break;
29
+ h.update(buf.subarray(0, bytesRead));
30
+ }
31
+ } finally {
32
+ await f.close();
33
+ }
34
+ return h.digest("hex");
35
+ }
36
+
37
+ async function writeSha256File({ outPath, files }) {
38
+ const lines = [];
39
+ for (const fp of files) {
40
+ // eslint-disable-next-line no-await-in-loop
41
+ const sum = await sha256FileHex(fp);
42
+ lines.push(`${sum} ${path.basename(fp)}`);
43
+ }
44
+ lines.sort((a, b) => (a < b ? -1 : a > b ? 1 : 0));
45
+ await fs.writeFile(outPath, lines.join("\n") + "\n", "utf8");
46
+ }
47
+
48
+ function parseArgs(argv) {
49
+ let outDir = path.resolve(process.cwd(), "dist", "release-artifacts");
50
+ let signReleaseIndex = false;
51
+ for (let i = 0; i < argv.length; i += 1) {
52
+ const a = argv[i];
53
+ if (a === "--out") {
54
+ outDir = path.resolve(process.cwd(), String(argv[i + 1] ?? ""));
55
+ i += 1;
56
+ continue;
57
+ }
58
+ if (a === "--sign-release-index") {
59
+ signReleaseIndex = true;
60
+ continue;
61
+ }
62
+ if (a === "--help" || a === "-h") {
63
+ // eslint-disable-next-line no-console
64
+ console.error("usage: node scripts/release/build-artifacts.mjs [--out <dir>] [--sign-release-index]");
65
+ process.exit(2);
66
+ }
67
+ // eslint-disable-next-line no-console
68
+ console.error(`unknown arg: ${a}`);
69
+ process.exit(2);
70
+ }
71
+ return { outDir, signReleaseIndex };
72
+ }
73
+
74
+ async function main() {
75
+ const { outDir, signReleaseIndex } = parseArgs(process.argv.slice(2));
76
+ await fs.mkdir(outDir, { recursive: true });
77
+
78
+ sh("npm", ["test"]);
79
+ sh(process.execPath, ["scripts/ci/npm-pack-smoke.mjs"]);
80
+ sh(process.execPath, ["scripts/ci/cli-pack-smoke.mjs"]);
81
+
82
+ const npmPackages = [
83
+ ".",
84
+ "packages/api-sdk",
85
+ "packages/executor-sdk",
86
+ "packages/artifact-verify",
87
+ "packages/provider-kit",
88
+ "packages/create-settld-paid-tool"
89
+ ];
90
+ const npmTgzs = [];
91
+ for (const p of npmPackages) {
92
+ // eslint-disable-next-line no-await-in-loop
93
+ const name = sh("npm", ["pack", "--silent", "--pack-destination", outDir], { cwd: path.resolve(process.cwd(), p) }).trim().split("\n").at(-1);
94
+ if (!name) throw new Error(`npm pack did not output tarball for ${p}`);
95
+ npmTgzs.push(path.join(outDir, name));
96
+ }
97
+ const npmChecksumsPath = path.join(outDir, "npm-SHA256SUMS");
98
+ await writeSha256File({ outPath: npmChecksumsPath, files: npmTgzs });
99
+
100
+ // Python SDK artifacts (sdist + wheel).
101
+ const sourceDateEpoch = String(Math.floor(Date.parse("2026-02-02T00:00:00Z") / 1000));
102
+ sh("python3", ["-m", "build", "packages/api-sdk-python", "--sdist", "--wheel", "--outdir", outDir], {
103
+ env: {
104
+ ...process.env,
105
+ SOURCE_DATE_EPOCH: sourceDateEpoch,
106
+ PYTHONDONTWRITEBYTECODE: "1"
107
+ }
108
+ });
109
+ const outNames = await fs.readdir(outDir);
110
+ const pythonArtifacts = outNames
111
+ .filter((name) => /^settld_api_sdk_python-.*\.(whl|tar\.gz)$/.test(name))
112
+ .sort()
113
+ .map((name) => path.join(outDir, name));
114
+ const hasWheel = pythonArtifacts.some((fp) => fp.endsWith(".whl"));
115
+ const hasSdist = pythonArtifacts.some((fp) => fp.endsWith(".tar.gz"));
116
+ if (!hasWheel || !hasSdist) {
117
+ throw new Error("python build did not produce both wheel and sdist for packages/api-sdk-python");
118
+ }
119
+ const pythonChecksumsPath = path.join(outDir, "python-SHA256SUMS");
120
+ await writeSha256File({ outPath: pythonChecksumsPath, files: pythonArtifacts });
121
+
122
+ // Conformance pack (deterministic tar.gz)
123
+ const conformanceDir = path.join(outDir, "conformance-v1");
124
+ const conformanceTar = path.join(outDir, "conformance-v1.tar");
125
+ const conformanceTgz = path.join(outDir, "conformance-v1.tar.gz");
126
+ await fs.rm(conformanceDir, { recursive: true, force: true });
127
+ await fs.rm(conformanceTar, { force: true });
128
+ await fs.rm(conformanceTgz, { force: true });
129
+ await fs.cp(path.join(process.cwd(), "conformance", "v1"), conformanceDir, { recursive: true });
130
+ sh("tar", ["--sort=name", "--mtime=2026-02-02 00:00:00Z", "--owner=0", "--group=0", "--numeric-owner", "-cf", conformanceTar, "-C", outDir, "conformance-v1"]);
131
+ const gz = spawnSync("gzip", ["-n", "-9", "-c", conformanceTar]);
132
+ if (gz.status !== 0) throw new Error("gzip failed");
133
+ await fs.writeFile(conformanceTgz, gz.stdout);
134
+ await fs.rm(conformanceTar, { force: true });
135
+ await fs.rm(conformanceDir, { recursive: true, force: true });
136
+ const conformanceChecksumsPath = path.join(outDir, "conformance-v1-SHA256SUMS");
137
+ await writeSha256File({ outPath: conformanceChecksumsPath, files: [conformanceTgz] });
138
+
139
+ // Audit packet zip (deterministic)
140
+ sh(process.execPath, ["scripts/audit/build-audit-packet.mjs", "--out", outDir, "--packet-version", "v1"]);
141
+ const auditZip = path.join(outDir, "settld-audit-packet-v1.zip");
142
+ await fs.access(auditZip);
143
+ const auditChecksumsPath = path.join(outDir, "settld-audit-packet-v1.zip.sha256");
144
+ await writeSha256File({ outPath: auditChecksumsPath, files: [auditZip] });
145
+
146
+ const allArtifactsForGlobalChecksums = [
147
+ ...npmTgzs,
148
+ npmChecksumsPath,
149
+ ...pythonArtifacts,
150
+ pythonChecksumsPath,
151
+ conformanceTgz,
152
+ conformanceChecksumsPath,
153
+ auditZip,
154
+ auditChecksumsPath
155
+ ].sort();
156
+ await writeSha256File({
157
+ outPath: path.join(outDir, "SHA256SUMS"),
158
+ files: allArtifactsForGlobalChecksums
159
+ });
160
+
161
+ // ReleaseIndex.v1 is a signed release manifest (artifact authenticity surface).
162
+ const version = readVersionForIndex();
163
+ const tag = `v${version}`;
164
+ sh(process.execPath, ["scripts/release/generate-release-index.mjs", "--dir", outDir, "--tag", tag, "--version", version]);
165
+ if (signReleaseIndex) {
166
+ if (!String(process.env.SETTLD_RELEASE_SIGNING_PRIVATE_KEY_PEM ?? "").trim()) {
167
+ throw new Error("missing SETTLD_RELEASE_SIGNING_PRIVATE_KEY_PEM; required for --sign-release-index");
168
+ }
169
+ sh(process.execPath, [
170
+ "scripts/release/sign-release-index.mjs",
171
+ "--index",
172
+ path.join(outDir, "release_index_v1.json"),
173
+ "--out",
174
+ path.join(outDir, "release_index_v1.sig"),
175
+ "--private-key-env",
176
+ "SETTLD_RELEASE_SIGNING_PRIVATE_KEY_PEM"
177
+ ]);
178
+ }
179
+ }
180
+
181
+ await main();