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,335 @@
1
+ import { canonicalJsonStringify, normalizeForCanonicalJson } from "./canonical-json.js";
2
+ import { sha256Hex } from "./crypto.js";
3
+
4
+ export const SETTLEMENT_VERIFICATION_STATUS = Object.freeze({
5
+ GREEN: "green",
6
+ AMBER: "amber",
7
+ RED: "red"
8
+ });
9
+
10
+ export const SETTLEMENT_VERIFIER_SOURCE = Object.freeze({
11
+ DETERMINISTIC_LATENCY_THRESHOLD_V1: "verifier://settld/deterministic/latency-threshold-v1",
12
+ DETERMINISTIC_SCHEMA_CHECK_V1: "verifier://settld/deterministic/schema-check-v1",
13
+ // Deprecated alias retained for backward compatibility with pre-release adopters.
14
+ DETERMINISTIC_JSONSCHEMA_V1: "verifier://settld/deterministic/jsonschema-v1"
15
+ });
16
+
17
+ const ALLOWED_STATUSES = new Set(Object.values(SETTLEMENT_VERIFICATION_STATUS));
18
+
19
+ const DEFAULT_VERIFIER_REF = Object.freeze({
20
+ verifierId: "settld.policy-engine",
21
+ verifierVersion: "v1",
22
+ verifierHash: null
23
+ });
24
+
25
+ const DETERMINISTIC_LATENCY_VERIFIER = Object.freeze({
26
+ source: SETTLEMENT_VERIFIER_SOURCE.DETERMINISTIC_LATENCY_THRESHOLD_V1,
27
+ verifierId: "settld.deterministic.latency-threshold",
28
+ verifierVersion: "v1",
29
+ modality: "deterministic"
30
+ });
31
+
32
+ const DETERMINISTIC_SCHEMA_CHECK_VERIFIER = Object.freeze({
33
+ source: SETTLEMENT_VERIFIER_SOURCE.DETERMINISTIC_SCHEMA_CHECK_V1,
34
+ legacySource: SETTLEMENT_VERIFIER_SOURCE.DETERMINISTIC_JSONSCHEMA_V1,
35
+ verifierId: "settld.deterministic.schema-check",
36
+ verifierVersion: "v1",
37
+ modality: "deterministic"
38
+ });
39
+
40
+ function normalizeNullableLowerString(value) {
41
+ if (value === null || value === undefined) return null;
42
+ const out = String(value).trim().toLowerCase();
43
+ return out === "" ? null : out;
44
+ }
45
+
46
+ function normalizeVerificationStatus(value, fallback = SETTLEMENT_VERIFICATION_STATUS.AMBER) {
47
+ const normalized = normalizeNullableLowerString(value);
48
+ if (normalized && ALLOWED_STATUSES.has(normalized)) return normalized;
49
+ return fallback;
50
+ }
51
+
52
+ function normalizeVerifierSource(value) {
53
+ const normalized = normalizeNullableLowerString(value);
54
+ if (!normalized) return null;
55
+ return normalized.replace(/\/+$/, "");
56
+ }
57
+
58
+ function normalizeVerifierSourceBase(value) {
59
+ const normalized = normalizeVerifierSource(value);
60
+ if (!normalized) return null;
61
+ const [withoutQuery] = normalized.split("?");
62
+ const [withoutFragment] = String(withoutQuery ?? "").split("#");
63
+ return String(withoutFragment ?? "").replace(/\/+$/, "") || null;
64
+ }
65
+
66
+ function toSafeNonNegativeInt(value) {
67
+ const n = Number(value);
68
+ if (!Number.isSafeInteger(n) || n < 0) return null;
69
+ return n;
70
+ }
71
+
72
+ function parseDeterministicSchemaCheckConfig(source) {
73
+ const defaults = {
74
+ latencyMaxMs: 1200,
75
+ requireSettlementReleaseRatePct: false
76
+ };
77
+ if (!source) return defaults;
78
+ try {
79
+ const parsed = new URL(source);
80
+ const latencyMaxRaw = parsed.searchParams.get("latencymaxms");
81
+ const latencyMaxMs = toSafeNonNegativeInt(latencyMaxRaw);
82
+ const requireReleaseRateRaw = String(parsed.searchParams.get("requiresettlementreleaseratepct") ?? "")
83
+ .trim()
84
+ .toLowerCase();
85
+ const requireSettlementReleaseRatePct =
86
+ requireReleaseRateRaw === "1" || requireReleaseRateRaw === "true" || requireReleaseRateRaw === "yes";
87
+ return {
88
+ latencyMaxMs: latencyMaxMs ?? defaults.latencyMaxMs,
89
+ requireSettlementReleaseRatePct
90
+ };
91
+ } catch {
92
+ return defaults;
93
+ }
94
+ }
95
+
96
+ function computeVerifierHash({ verifierId, verifierVersion, source }) {
97
+ const descriptor = normalizeForCanonicalJson(
98
+ {
99
+ schemaVersion: "SettlementVerifierDescriptor.v1",
100
+ verifierId: String(verifierId),
101
+ verifierVersion: String(verifierVersion),
102
+ source: String(source)
103
+ },
104
+ { path: "$" }
105
+ );
106
+ return sha256Hex(canonicalJsonStringify(descriptor));
107
+ }
108
+
109
+ function evaluateDeterministicLatencyThreshold({ run, verification }) {
110
+ const runStatus = normalizeNullableLowerString(run?.status);
111
+ if (runStatus === "failed") {
112
+ return {
113
+ verificationStatus: SETTLEMENT_VERIFICATION_STATUS.RED,
114
+ reasonCodes: ["verifier_plugin_run_failed"],
115
+ summary: { latencyMs: null, thresholdGreenMs: 1000, thresholdRedMs: 4000 }
116
+ };
117
+ }
118
+
119
+ const latencyMs =
120
+ toSafeNonNegativeInt(run?.metrics?.latencyMs) ??
121
+ toSafeNonNegativeInt(verification?.durationMs) ??
122
+ null;
123
+ const thresholdGreenMs = 1000;
124
+ const thresholdRedMs = 4000;
125
+
126
+ if (latencyMs === null) {
127
+ return {
128
+ verificationStatus: SETTLEMENT_VERIFICATION_STATUS.AMBER,
129
+ reasonCodes: ["verifier_plugin_latency_missing"],
130
+ summary: { latencyMs: null, thresholdGreenMs, thresholdRedMs }
131
+ };
132
+ }
133
+
134
+ if (latencyMs <= thresholdGreenMs) {
135
+ return {
136
+ verificationStatus: SETTLEMENT_VERIFICATION_STATUS.GREEN,
137
+ reasonCodes: [],
138
+ summary: { latencyMs, thresholdGreenMs, thresholdRedMs }
139
+ };
140
+ }
141
+ if (latencyMs >= thresholdRedMs) {
142
+ return {
143
+ verificationStatus: SETTLEMENT_VERIFICATION_STATUS.RED,
144
+ reasonCodes: ["verifier_plugin_latency_above_red_threshold"],
145
+ summary: { latencyMs, thresholdGreenMs, thresholdRedMs }
146
+ };
147
+ }
148
+ return {
149
+ verificationStatus: SETTLEMENT_VERIFICATION_STATUS.AMBER,
150
+ reasonCodes: ["verifier_plugin_latency_between_thresholds"],
151
+ summary: { latencyMs, thresholdGreenMs, thresholdRedMs }
152
+ };
153
+ }
154
+
155
+ function evaluateDeterministicSchemaCheck({ run, verification, source }) {
156
+ const cfg = parseDeterministicSchemaCheckConfig(source);
157
+ const runStatus = normalizeNullableLowerString(run?.status);
158
+ const latencyMs =
159
+ toSafeNonNegativeInt(run?.metrics?.latencyMs) ??
160
+ toSafeNonNegativeInt(verification?.durationMs) ??
161
+ null;
162
+ const releaseRatePct = toSafeNonNegativeInt(run?.metrics?.settlementReleaseRatePct);
163
+ const violations = [];
164
+
165
+ if (runStatus !== "completed") {
166
+ violations.push({
167
+ path: "$.status",
168
+ code: "not_completed",
169
+ message: "run.status must be completed"
170
+ });
171
+ }
172
+
173
+ if (latencyMs === null) {
174
+ violations.push({
175
+ path: "$.metrics.latencyMs",
176
+ code: "missing_latency",
177
+ message: "metrics.latencyMs is required and must be a non-negative integer"
178
+ });
179
+ } else if (latencyMs > cfg.latencyMaxMs) {
180
+ violations.push({
181
+ path: "$.metrics.latencyMs",
182
+ code: "latency_above_max",
183
+ message: `metrics.latencyMs must be <= ${cfg.latencyMaxMs}`
184
+ });
185
+ }
186
+
187
+ if (cfg.requireSettlementReleaseRatePct && releaseRatePct === null) {
188
+ violations.push({
189
+ path: "$.metrics.settlementReleaseRatePct",
190
+ code: "missing_release_rate",
191
+ message: "metrics.settlementReleaseRatePct is required"
192
+ });
193
+ } else if (releaseRatePct !== null && releaseRatePct > 100) {
194
+ violations.push({
195
+ path: "$.metrics.settlementReleaseRatePct",
196
+ code: "release_rate_out_of_range",
197
+ message: "metrics.settlementReleaseRatePct must be <= 100"
198
+ });
199
+ }
200
+
201
+ if (violations.length > 0) {
202
+ return {
203
+ verificationStatus: SETTLEMENT_VERIFICATION_STATUS.RED,
204
+ reasonCodes: ["verifier_plugin_schema_check_failed"],
205
+ summary: {
206
+ schemaVersion: "DeterministicVerifierSchemaCheck.v1",
207
+ source,
208
+ latencyMaxMs: cfg.latencyMaxMs,
209
+ requireSettlementReleaseRatePct: cfg.requireSettlementReleaseRatePct,
210
+ violations
211
+ }
212
+ };
213
+ }
214
+
215
+ return {
216
+ verificationStatus: SETTLEMENT_VERIFICATION_STATUS.GREEN,
217
+ reasonCodes: [],
218
+ summary: {
219
+ schemaVersion: "DeterministicVerifierSchemaCheck.v1",
220
+ source,
221
+ latencyMaxMs: cfg.latencyMaxMs,
222
+ requireSettlementReleaseRatePct: cfg.requireSettlementReleaseRatePct,
223
+ metrics: {
224
+ latencyMs,
225
+ settlementReleaseRatePct: releaseRatePct
226
+ }
227
+ }
228
+ };
229
+ }
230
+
231
+ export function resolveSettlementVerifierRef({ verificationMethod = null } = {}) {
232
+ const method =
233
+ verificationMethod && typeof verificationMethod === "object" && !Array.isArray(verificationMethod) ? verificationMethod : null;
234
+ const source = normalizeVerifierSource(method?.source);
235
+ const sourceBase = normalizeVerifierSourceBase(source);
236
+ const modality = normalizeNullableLowerString(method?.mode);
237
+
238
+ if (sourceBase === DETERMINISTIC_LATENCY_VERIFIER.source) {
239
+ return {
240
+ verifierId: DETERMINISTIC_LATENCY_VERIFIER.verifierId,
241
+ verifierVersion: DETERMINISTIC_LATENCY_VERIFIER.verifierVersion,
242
+ verifierHash: computeVerifierHash({
243
+ verifierId: DETERMINISTIC_LATENCY_VERIFIER.verifierId,
244
+ verifierVersion: DETERMINISTIC_LATENCY_VERIFIER.verifierVersion,
245
+ source: source ?? DETERMINISTIC_LATENCY_VERIFIER.source
246
+ }),
247
+ modality: DETERMINISTIC_LATENCY_VERIFIER.modality,
248
+ source,
249
+ matchedPlugin: DETERMINISTIC_LATENCY_VERIFIER.source
250
+ };
251
+ }
252
+
253
+ if (sourceBase === DETERMINISTIC_SCHEMA_CHECK_VERIFIER.source || sourceBase === DETERMINISTIC_SCHEMA_CHECK_VERIFIER.legacySource) {
254
+ return {
255
+ verifierId: DETERMINISTIC_SCHEMA_CHECK_VERIFIER.verifierId,
256
+ verifierVersion: DETERMINISTIC_SCHEMA_CHECK_VERIFIER.verifierVersion,
257
+ verifierHash: computeVerifierHash({
258
+ verifierId: DETERMINISTIC_SCHEMA_CHECK_VERIFIER.verifierId,
259
+ verifierVersion: DETERMINISTIC_SCHEMA_CHECK_VERIFIER.verifierVersion,
260
+ source: source ?? DETERMINISTIC_SCHEMA_CHECK_VERIFIER.source
261
+ }),
262
+ modality: DETERMINISTIC_SCHEMA_CHECK_VERIFIER.modality,
263
+ source,
264
+ matchedPlugin: DETERMINISTIC_SCHEMA_CHECK_VERIFIER.source
265
+ };
266
+ }
267
+
268
+ return {
269
+ verifierId: DEFAULT_VERIFIER_REF.verifierId,
270
+ verifierVersion: DEFAULT_VERIFIER_REF.verifierVersion,
271
+ verifierHash: DEFAULT_VERIFIER_REF.verifierHash,
272
+ modality: modality ?? null,
273
+ source,
274
+ matchedPlugin: null
275
+ };
276
+ }
277
+
278
+ export function evaluateSettlementVerifierExecution({
279
+ verificationMethod = null,
280
+ run = null,
281
+ verification = null,
282
+ baseVerificationStatus = null
283
+ } = {}) {
284
+ const verifierRef = resolveSettlementVerifierRef({ verificationMethod });
285
+ const defaultStatus = normalizeVerificationStatus(baseVerificationStatus);
286
+
287
+ let evaluation = {
288
+ pluginMatched: false,
289
+ source: verifierRef.source,
290
+ reasonCodes: [],
291
+ summary: null
292
+ };
293
+ let verificationStatus = defaultStatus;
294
+
295
+ if (verifierRef.matchedPlugin === DETERMINISTIC_LATENCY_VERIFIER.source) {
296
+ const pluginResult = evaluateDeterministicLatencyThreshold({ run, verification });
297
+ verificationStatus = normalizeVerificationStatus(pluginResult.verificationStatus, defaultStatus);
298
+ evaluation = {
299
+ pluginMatched: true,
300
+ source: verifierRef.source,
301
+ reasonCodes: Array.isArray(pluginResult.reasonCodes) ? pluginResult.reasonCodes.map((v) => String(v)) : [],
302
+ summary:
303
+ pluginResult.summary && typeof pluginResult.summary === "object" && !Array.isArray(pluginResult.summary)
304
+ ? pluginResult.summary
305
+ : null
306
+ };
307
+ } else if (verifierRef.matchedPlugin === DETERMINISTIC_SCHEMA_CHECK_VERIFIER.source) {
308
+ const pluginResult = evaluateDeterministicSchemaCheck({
309
+ run,
310
+ verification,
311
+ source: verifierRef.source ?? DETERMINISTIC_SCHEMA_CHECK_VERIFIER.source
312
+ });
313
+ verificationStatus = normalizeVerificationStatus(pluginResult.verificationStatus, defaultStatus);
314
+ evaluation = {
315
+ pluginMatched: true,
316
+ source: verifierRef.source,
317
+ reasonCodes: Array.isArray(pluginResult.reasonCodes) ? pluginResult.reasonCodes.map((v) => String(v)) : [],
318
+ summary:
319
+ pluginResult.summary && typeof pluginResult.summary === "object" && !Array.isArray(pluginResult.summary)
320
+ ? pluginResult.summary
321
+ : null
322
+ };
323
+ }
324
+
325
+ return {
326
+ verificationStatus,
327
+ verifierRef: {
328
+ verifierId: verifierRef.verifierId,
329
+ verifierVersion: verifierRef.verifierVersion,
330
+ verifierHash: verifierRef.verifierHash,
331
+ modality: verifierRef.modality
332
+ },
333
+ evaluation
334
+ };
335
+ }
@@ -0,0 +1,112 @@
1
+ import { canonicalJsonStringify, normalizeForCanonicalJson } from "./canonical-json.js";
2
+ import { sha256Hex } from "./crypto.js";
3
+
4
+ export const TOOL_CALL_AGREEMENT_SCHEMA_VERSION = "ToolCallAgreement.v1";
5
+
6
+ function assertPlainObject(value, name) {
7
+ if (!value || typeof value !== "object" || Array.isArray(value)) throw new TypeError(`${name} must be an object`);
8
+ if (Object.getPrototypeOf(value) !== Object.prototype && Object.getPrototypeOf(value) !== null) {
9
+ throw new TypeError(`${name} must be a plain object`);
10
+ }
11
+ }
12
+
13
+ function assertNonEmptyString(value, name) {
14
+ if (typeof value !== "string" || value.trim() === "") throw new TypeError(`${name} must be a non-empty string`);
15
+ return String(value).trim();
16
+ }
17
+
18
+ function assertIsoDate(value, name) {
19
+ assertNonEmptyString(value, name);
20
+ if (!Number.isFinite(Date.parse(value))) throw new TypeError(`${name} must be an ISO date string`);
21
+ return new Date(Date.parse(value)).toISOString();
22
+ }
23
+
24
+ function normalizeSha256Hex(value, name) {
25
+ assertNonEmptyString(value, name);
26
+ const out = String(value).trim().toLowerCase();
27
+ if (!/^[0-9a-f]{64}$/.test(out)) throw new TypeError(`${name} must be a 64-hex sha256`);
28
+ return out;
29
+ }
30
+
31
+ function normalizeNullableId(value, name) {
32
+ if (value === null || value === undefined) return null;
33
+ const out = String(value).trim();
34
+ return out ? out : null;
35
+ }
36
+
37
+ export function computeToolCallInputHashV1(input) {
38
+ const canonical = canonicalJsonStringify(input ?? {});
39
+ return sha256Hex(canonical);
40
+ }
41
+
42
+ export function computeToolCallAgreementHashV1(agreementCore) {
43
+ assertPlainObject(agreementCore, "agreementCore");
44
+ const copy = { ...agreementCore };
45
+ delete copy.agreementHash;
46
+ const normalized = normalizeForCanonicalJson(copy, { path: "$" });
47
+ return sha256Hex(canonicalJsonStringify(normalized));
48
+ }
49
+
50
+ export function buildToolCallAgreementV1({
51
+ toolId,
52
+ manifestHash,
53
+ callId,
54
+ input = {},
55
+ inputHash = null,
56
+ acceptanceCriteria = null,
57
+ settlementTerms = null,
58
+ payerAgentId = null,
59
+ payeeAgentId = null,
60
+ createdAt = new Date().toISOString()
61
+ } = {}) {
62
+ const at = assertIsoDate(createdAt, "createdAt");
63
+
64
+ const computedInputHash = inputHash === null || inputHash === undefined ? computeToolCallInputHashV1(input) : normalizeSha256Hex(inputHash, "inputHash");
65
+
66
+ const core = normalizeForCanonicalJson(
67
+ {
68
+ schemaVersion: TOOL_CALL_AGREEMENT_SCHEMA_VERSION,
69
+ toolId: assertNonEmptyString(String(toolId ?? ""), "toolId"),
70
+ manifestHash: normalizeSha256Hex(manifestHash, "manifestHash"),
71
+ callId: assertNonEmptyString(String(callId ?? ""), "callId"),
72
+ inputHash: computedInputHash,
73
+ acceptanceCriteria: acceptanceCriteria === undefined ? null : acceptanceCriteria,
74
+ settlementTerms: settlementTerms === undefined ? null : settlementTerms,
75
+ payerAgentId: normalizeNullableId(payerAgentId, "payerAgentId"),
76
+ payeeAgentId: normalizeNullableId(payeeAgentId, "payeeAgentId"),
77
+ createdAt: at
78
+ },
79
+ { path: "$" }
80
+ );
81
+ const agreementHash = computeToolCallAgreementHashV1(core);
82
+ return normalizeForCanonicalJson({ ...core, agreementHash }, { path: "$" });
83
+ }
84
+
85
+ export function validateToolCallAgreementV1(agreement) {
86
+ assertPlainObject(agreement, "agreement");
87
+ if (agreement.schemaVersion !== TOOL_CALL_AGREEMENT_SCHEMA_VERSION) {
88
+ throw new TypeError(`agreement.schemaVersion must be ${TOOL_CALL_AGREEMENT_SCHEMA_VERSION}`);
89
+ }
90
+ assertNonEmptyString(agreement.toolId, "agreement.toolId");
91
+ normalizeSha256Hex(agreement.manifestHash, "agreement.manifestHash");
92
+ assertNonEmptyString(agreement.callId, "agreement.callId");
93
+ normalizeSha256Hex(agreement.inputHash, "agreement.inputHash");
94
+
95
+ if (agreement.acceptanceCriteria !== null && agreement.acceptanceCriteria !== undefined) {
96
+ assertPlainObject(agreement.acceptanceCriteria, "agreement.acceptanceCriteria");
97
+ }
98
+ if (agreement.settlementTerms !== null && agreement.settlementTerms !== undefined) {
99
+ assertPlainObject(agreement.settlementTerms, "agreement.settlementTerms");
100
+ }
101
+
102
+ normalizeNullableId(agreement.payerAgentId ?? null, "agreement.payerAgentId");
103
+ normalizeNullableId(agreement.payeeAgentId ?? null, "agreement.payeeAgentId");
104
+
105
+ assertIsoDate(agreement.createdAt, "agreement.createdAt");
106
+
107
+ const agreementHash = normalizeSha256Hex(agreement.agreementHash, "agreement.agreementHash");
108
+ const computed = computeToolCallAgreementHashV1(agreement);
109
+ if (computed !== agreementHash) throw new TypeError("agreementHash mismatch");
110
+ return true;
111
+ }
112
+
@@ -0,0 +1,144 @@
1
+ import { canonicalJsonStringify, normalizeForCanonicalJson } from "./canonical-json.js";
2
+ import { sha256Hex, signHashHexEd25519 } from "./crypto.js";
3
+
4
+ export const TOOL_CALL_EVIDENCE_SCHEMA_VERSION = "ToolCallEvidence.v1";
5
+
6
+ function assertPlainObject(value, name) {
7
+ if (!value || typeof value !== "object" || Array.isArray(value)) throw new TypeError(`${name} must be an object`);
8
+ if (Object.getPrototypeOf(value) !== Object.prototype && Object.getPrototypeOf(value) !== null) {
9
+ throw new TypeError(`${name} must be a plain object`);
10
+ }
11
+ }
12
+
13
+ function assertNonEmptyString(value, name) {
14
+ if (typeof value !== "string" || value.trim() === "") throw new TypeError(`${name} must be a non-empty string`);
15
+ return String(value).trim();
16
+ }
17
+
18
+ function assertIsoDate(value, name) {
19
+ assertNonEmptyString(value, name);
20
+ if (!Number.isFinite(Date.parse(value))) throw new TypeError(`${name} must be an ISO date string`);
21
+ return new Date(Date.parse(value)).toISOString();
22
+ }
23
+
24
+ function normalizeSha256Hex(value, name) {
25
+ assertNonEmptyString(value, name);
26
+ const out = String(value).trim().toLowerCase();
27
+ if (!/^[0-9a-f]{64}$/.test(out)) throw new TypeError(`${name} must be a 64-hex sha256`);
28
+ return out;
29
+ }
30
+
31
+ function normalizeNullableString(value) {
32
+ if (value === null || value === undefined) return null;
33
+ const out = String(value).trim();
34
+ return out ? out : null;
35
+ }
36
+
37
+ export function computeToolCallOutputHashV1(output) {
38
+ const canonical = canonicalJsonStringify(output ?? {});
39
+ return sha256Hex(canonical);
40
+ }
41
+
42
+ export function computeToolCallEvidenceHashV1(evidenceCore) {
43
+ assertPlainObject(evidenceCore, "evidenceCore");
44
+ const copy = { ...evidenceCore };
45
+ delete copy.evidenceHash;
46
+ delete copy.signature;
47
+ const normalized = normalizeForCanonicalJson(copy, { path: "$" });
48
+ return sha256Hex(canonicalJsonStringify(normalized));
49
+ }
50
+
51
+ export function buildToolCallEvidenceV1({
52
+ agreementHash,
53
+ callId,
54
+ inputHash,
55
+ output = {},
56
+ outputHash = null,
57
+ outputRef = null,
58
+ metrics = null,
59
+ startedAt = new Date().toISOString(),
60
+ completedAt = null,
61
+ createdAt = null,
62
+ signerKeyId = null,
63
+ signerPrivateKeyPem = null
64
+ } = {}) {
65
+ const startedAtIso = assertIsoDate(startedAt, "startedAt");
66
+ const completedAtIso = assertIsoDate(completedAt ?? startedAtIso, "completedAt");
67
+ const createdAtIso = assertIsoDate(createdAt ?? completedAtIso, "createdAt");
68
+
69
+ const computedOutputHash =
70
+ outputHash === null || outputHash === undefined ? computeToolCallOutputHashV1(output) : normalizeSha256Hex(outputHash, "outputHash");
71
+
72
+ const core = normalizeForCanonicalJson(
73
+ {
74
+ schemaVersion: TOOL_CALL_EVIDENCE_SCHEMA_VERSION,
75
+ agreementHash: normalizeSha256Hex(agreementHash, "agreementHash"),
76
+ callId: assertNonEmptyString(String(callId ?? ""), "callId"),
77
+ inputHash: normalizeSha256Hex(inputHash, "inputHash"),
78
+ outputHash: computedOutputHash,
79
+ outputRef: outputRef === undefined ? null : normalizeNullableString(outputRef),
80
+ metrics: metrics === undefined ? null : metrics,
81
+ startedAt: startedAtIso,
82
+ completedAt: completedAtIso,
83
+ createdAt: createdAtIso
84
+ },
85
+ { path: "$" }
86
+ );
87
+
88
+ const evidenceHash = computeToolCallEvidenceHashV1(core);
89
+
90
+ let signature = null;
91
+ const normalizedSignerKeyId = signerKeyId === null || signerKeyId === undefined ? null : normalizeNullableString(signerKeyId);
92
+ const normalizedSignerPrivateKeyPem =
93
+ signerPrivateKeyPem === null || signerPrivateKeyPem === undefined ? null : normalizeNullableString(signerPrivateKeyPem);
94
+ if (normalizedSignerPrivateKeyPem) {
95
+ if (!normalizedSignerKeyId) throw new TypeError("signerKeyId is required when signerPrivateKeyPem is provided");
96
+ signature = {
97
+ algorithm: "ed25519",
98
+ signerKeyId: normalizedSignerKeyId,
99
+ evidenceHash,
100
+ signature: signHashHexEd25519(evidenceHash, normalizedSignerPrivateKeyPem)
101
+ };
102
+ }
103
+
104
+ return normalizeForCanonicalJson({ ...core, evidenceHash, ...(signature ? { signature } : {}) }, { path: "$" });
105
+ }
106
+
107
+ export function validateToolCallEvidenceV1(evidence) {
108
+ assertPlainObject(evidence, "evidence");
109
+ if (evidence.schemaVersion !== TOOL_CALL_EVIDENCE_SCHEMA_VERSION) {
110
+ throw new TypeError(`evidence.schemaVersion must be ${TOOL_CALL_EVIDENCE_SCHEMA_VERSION}`);
111
+ }
112
+ normalizeSha256Hex(evidence.agreementHash, "evidence.agreementHash");
113
+ assertNonEmptyString(evidence.callId, "evidence.callId");
114
+ normalizeSha256Hex(evidence.inputHash, "evidence.inputHash");
115
+ normalizeSha256Hex(evidence.outputHash, "evidence.outputHash");
116
+
117
+ if (Object.prototype.hasOwnProperty.call(evidence, "outputRef")) {
118
+ normalizeNullableString(evidence.outputRef ?? null);
119
+ }
120
+ if (Object.prototype.hasOwnProperty.call(evidence, "metrics") && evidence.metrics !== null && evidence.metrics !== undefined) {
121
+ assertPlainObject(evidence.metrics, "evidence.metrics");
122
+ }
123
+
124
+ assertIsoDate(evidence.startedAt, "evidence.startedAt");
125
+ assertIsoDate(evidence.completedAt, "evidence.completedAt");
126
+ assertIsoDate(evidence.createdAt, "evidence.createdAt");
127
+
128
+ const evidenceHash = normalizeSha256Hex(evidence.evidenceHash, "evidence.evidenceHash");
129
+ const computed = computeToolCallEvidenceHashV1(evidence);
130
+ if (computed !== evidenceHash) throw new TypeError("evidenceHash mismatch");
131
+
132
+ if (Object.prototype.hasOwnProperty.call(evidence, "signature") && evidence.signature !== null && evidence.signature !== undefined) {
133
+ const sig = evidence.signature;
134
+ if (!sig || typeof sig !== "object" || Array.isArray(sig)) throw new TypeError("evidence.signature must be an object");
135
+ if (sig.algorithm !== "ed25519") throw new TypeError("evidence.signature.algorithm must be ed25519");
136
+ assertNonEmptyString(sig.signerKeyId, "evidence.signature.signerKeyId");
137
+ const sigEvidenceHash = normalizeSha256Hex(sig.evidenceHash, "evidence.signature.evidenceHash");
138
+ if (sigEvidenceHash !== evidenceHash) throw new TypeError("evidence.signature.evidenceHash mismatch");
139
+ assertNonEmptyString(sig.signature, "evidence.signature.signature");
140
+ }
141
+
142
+ return true;
143
+ }
144
+
@@ -0,0 +1,98 @@
1
+ import { canonicalJsonStringify, normalizeForCanonicalJson } from "./canonical-json.js";
2
+ import { keyIdFromPublicKeyPem, sha256Hex, signHashHexEd25519, verifyHashHexEd25519 } from "./crypto.js";
3
+
4
+ export const TOOL_PROVIDER_SIGNATURE_PAYLOAD_SCHEMA_VERSION = "ToolProviderSignaturePayload.v1";
5
+ export const TOOL_PROVIDER_SIGNATURE_SCHEMA_VERSION = "ToolProviderSignature.v1";
6
+
7
+ function assertNonEmptyString(v, name) {
8
+ if (typeof v !== "string" || v.trim() === "") throw new TypeError(`${name} must be a non-empty string`);
9
+ }
10
+
11
+ function assertIsoDate(v, name) {
12
+ assertNonEmptyString(v, name);
13
+ const t = Date.parse(v);
14
+ if (!Number.isFinite(t)) throw new TypeError(`${name} must be an ISO date-time`);
15
+ }
16
+
17
+ function assertSha256Hex(v, name) {
18
+ assertNonEmptyString(v, name);
19
+ const s = v.trim().toLowerCase();
20
+ if (!/^[0-9a-f]{64}$/.test(s)) throw new TypeError(`${name} must be sha256 hex`);
21
+ return s;
22
+ }
23
+
24
+ function assertNonceHex(v, name) {
25
+ assertNonEmptyString(v, name);
26
+ const s = v.trim().toLowerCase();
27
+ if (!/^[0-9a-f]{16,128}$/.test(s)) throw new TypeError(`${name} must be hex (16..128 chars)`);
28
+ return s;
29
+ }
30
+
31
+ export function buildToolProviderSignaturePayloadV1({ responseHash, nonce, signedAt } = {}) {
32
+ const payload = normalizeForCanonicalJson(
33
+ {
34
+ schemaVersion: TOOL_PROVIDER_SIGNATURE_PAYLOAD_SCHEMA_VERSION,
35
+ responseHash: assertSha256Hex(responseHash, "responseHash"),
36
+ nonce: assertNonceHex(nonce, "nonce"),
37
+ signedAt: (() => {
38
+ assertIsoDate(signedAt, "signedAt");
39
+ return signedAt;
40
+ })()
41
+ },
42
+ { path: "$" }
43
+ );
44
+ return payload;
45
+ }
46
+
47
+ export function computeToolProviderSignaturePayloadHashV1({ responseHash, nonce, signedAt } = {}) {
48
+ const payload = buildToolProviderSignaturePayloadV1({ responseHash, nonce, signedAt });
49
+ return sha256Hex(canonicalJsonStringify(payload));
50
+ }
51
+
52
+ export function signToolProviderSignatureV1({ responseHash, nonce, signedAt, publicKeyPem, privateKeyPem } = {}) {
53
+ assertNonEmptyString(publicKeyPem, "publicKeyPem");
54
+ assertNonEmptyString(privateKeyPem, "privateKeyPem");
55
+ const keyId = keyIdFromPublicKeyPem(publicKeyPem);
56
+ const payloadHashHex = computeToolProviderSignaturePayloadHashV1({ responseHash, nonce, signedAt });
57
+ const signatureBase64 = signHashHexEd25519(payloadHashHex, privateKeyPem);
58
+ const sig = normalizeForCanonicalJson(
59
+ {
60
+ schemaVersion: TOOL_PROVIDER_SIGNATURE_SCHEMA_VERSION,
61
+ algorithm: "ed25519",
62
+ keyId,
63
+ signedAt,
64
+ nonce,
65
+ responseHash: String(responseHash).trim().toLowerCase(),
66
+ payloadHash: payloadHashHex,
67
+ signatureBase64
68
+ },
69
+ { path: "$" }
70
+ );
71
+ return sig;
72
+ }
73
+
74
+ export function verifyToolProviderSignatureV1({ signature, publicKeyPem } = {}) {
75
+ if (!signature || typeof signature !== "object" || Array.isArray(signature)) throw new TypeError("signature must be an object");
76
+ assertNonEmptyString(publicKeyPem, "publicKeyPem");
77
+
78
+ if (signature.schemaVersion !== TOOL_PROVIDER_SIGNATURE_SCHEMA_VERSION) {
79
+ throw new TypeError(`signature.schemaVersion must be ${TOOL_PROVIDER_SIGNATURE_SCHEMA_VERSION}`);
80
+ }
81
+ if (String(signature.algorithm ?? "").toLowerCase() !== "ed25519") {
82
+ throw new TypeError("signature.algorithm must be ed25519");
83
+ }
84
+ const expectedKeyId = keyIdFromPublicKeyPem(publicKeyPem);
85
+ if (String(signature.keyId ?? "").trim() !== expectedKeyId) return false;
86
+
87
+ const payloadHashHex = computeToolProviderSignaturePayloadHashV1({
88
+ responseHash: signature.responseHash,
89
+ nonce: signature.nonce,
90
+ signedAt: signature.signedAt
91
+ });
92
+ if (String(signature.payloadHash ?? "").trim().toLowerCase() !== payloadHashHex) return false;
93
+ const signatureBase64 = String(signature.signatureBase64 ?? "").trim();
94
+ if (!signatureBase64) return false;
95
+
96
+ return verifyHashHexEd25519({ hashHex: payloadHashHex, signatureBase64, publicKeyPem });
97
+ }
98
+