x402-trust-layer 5.1.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 (293) hide show
  1. package/CHANGELOG.md +55 -0
  2. package/DEPLOY.md +53 -0
  3. package/Dockerfile +30 -0
  4. package/LICENSE +21 -0
  5. package/README.md +294 -0
  6. package/dist/agents/a2a-payment.d.ts +37 -0
  7. package/dist/agents/a2a-payment.js +105 -0
  8. package/dist/agents/agent-escrow.d.ts +30 -0
  9. package/dist/agents/agent-escrow.js +23 -0
  10. package/dist/agents/agent-verify.d.ts +15 -0
  11. package/dist/agents/agent-verify.js +112 -0
  12. package/dist/agents/api-router.d.ts +32 -0
  13. package/dist/agents/api-router.js +228 -0
  14. package/dist/agents/attestation-registry.d.ts +35 -0
  15. package/dist/agents/attestation-registry.js +76 -0
  16. package/dist/agents/audition-coach.d.ts +45 -0
  17. package/dist/agents/audition-coach.js +257 -0
  18. package/dist/agents/bedrock-bridge.d.ts +3 -0
  19. package/dist/agents/bedrock-bridge.js +60 -0
  20. package/dist/agents/budget-allocator.d.ts +24 -0
  21. package/dist/agents/budget-allocator.js +31 -0
  22. package/dist/agents/compliance-ledger.d.ts +66 -0
  23. package/dist/agents/compliance-ledger.js +80 -0
  24. package/dist/agents/dispute-resolver.d.ts +62 -0
  25. package/dist/agents/dispute-resolver.js +124 -0
  26. package/dist/agents/evidence-locker.d.ts +30 -0
  27. package/dist/agents/evidence-locker.js +47 -0
  28. package/dist/agents/facilitator-failover.d.ts +15 -0
  29. package/dist/agents/facilitator-failover.js +18 -0
  30. package/dist/agents/identity-gate.d.ts +20 -0
  31. package/dist/agents/identity-gate.js +79 -0
  32. package/dist/agents/mandate-compiler.d.ts +51 -0
  33. package/dist/agents/mandate-compiler.js +73 -0
  34. package/dist/agents/mandate-diff.d.ts +41 -0
  35. package/dist/agents/mandate-diff.js +170 -0
  36. package/dist/agents/market-buy-advisor.d.ts +65 -0
  37. package/dist/agents/market-buy-advisor.js +234 -0
  38. package/dist/agents/merchant-trust.d.ts +38 -0
  39. package/dist/agents/merchant-trust.js +171 -0
  40. package/dist/agents/mpp-session-broker.d.ts +27 -0
  41. package/dist/agents/mpp-session-broker.js +29 -0
  42. package/dist/agents/mpp-session-v2.d.ts +76 -0
  43. package/dist/agents/mpp-session-v2.js +269 -0
  44. package/dist/agents/payment-intent-compiler.d.ts +21 -0
  45. package/dist/agents/payment-intent-compiler.js +45 -0
  46. package/dist/agents/pipeline-execute.d.ts +40 -0
  47. package/dist/agents/pipeline-execute.js +100 -0
  48. package/dist/agents/pipeline-trust-v2.d.ts +31 -0
  49. package/dist/agents/pipeline-trust-v2.js +111 -0
  50. package/dist/agents/pre-x402-guard.d.ts +35 -0
  51. package/dist/agents/pre-x402-guard.js +84 -0
  52. package/dist/agents/quality-escrow-semantic.d.ts +88 -0
  53. package/dist/agents/quality-escrow-semantic.js +137 -0
  54. package/dist/agents/quality-escrow.d.ts +65 -0
  55. package/dist/agents/quality-escrow.js +104 -0
  56. package/dist/agents/quality-monitor.d.ts +32 -0
  57. package/dist/agents/quality-monitor.js +77 -0
  58. package/dist/agents/rail-optimizer.d.ts +33 -0
  59. package/dist/agents/rail-optimizer.js +133 -0
  60. package/dist/agents/receipt-auditor.d.ts +14 -0
  61. package/dist/agents/receipt-auditor.js +145 -0
  62. package/dist/agents/refund-arbiter.d.ts +24 -0
  63. package/dist/agents/refund-arbiter.js +70 -0
  64. package/dist/agents/research-brief.d.ts +14 -0
  65. package/dist/agents/research-brief.js +66 -0
  66. package/dist/agents/risk-gate.d.ts +11 -0
  67. package/dist/agents/risk-gate.js +78 -0
  68. package/dist/agents/settlement-graph.d.ts +16 -0
  69. package/dist/agents/settlement-graph.js +38 -0
  70. package/dist/agents/spend-governor.d.ts +2 -0
  71. package/dist/agents/spend-governor.js +70 -0
  72. package/dist/agents/trust-network.d.ts +138 -0
  73. package/dist/agents/trust-network.js +244 -0
  74. package/dist/agents/x402-proxy.d.ts +32 -0
  75. package/dist/agents/x402-proxy.js +90 -0
  76. package/dist/client/demo-alchemy-live.d.ts +1 -0
  77. package/dist/client/demo-alchemy-live.js +226 -0
  78. package/dist/client/demo-tail.d.ts +1 -0
  79. package/dist/client/demo-tail.js +100 -0
  80. package/dist/client/demo.d.ts +1 -0
  81. package/dist/client/demo.js +293 -0
  82. package/dist/config.d.ts +94 -0
  83. package/dist/config.js +223 -0
  84. package/dist/index.d.ts +1 -0
  85. package/dist/index.js +389 -0
  86. package/dist/lib/agent-response.d.ts +14 -0
  87. package/dist/lib/agent-response.js +13 -0
  88. package/dist/lib/agentic-gateways.d.ts +5 -0
  89. package/dist/lib/agentic-gateways.js +15 -0
  90. package/dist/lib/agentic-probes.d.ts +10 -0
  91. package/dist/lib/agentic-probes.js +49 -0
  92. package/dist/lib/alchemy-x402-fetch.d.ts +16 -0
  93. package/dist/lib/alchemy-x402-fetch.js +95 -0
  94. package/dist/lib/apply-verifier-body.d.ts +7 -0
  95. package/dist/lib/apply-verifier-body.js +179 -0
  96. package/dist/lib/attestation.d.ts +30 -0
  97. package/dist/lib/attestation.js +107 -0
  98. package/dist/lib/bazaar-extension.d.ts +15 -0
  99. package/dist/lib/bazaar-extension.js +265 -0
  100. package/dist/lib/bazaar.d.ts +100 -0
  101. package/dist/lib/bazaar.js +341 -0
  102. package/dist/lib/certified-sellers.d.ts +41 -0
  103. package/dist/lib/certified-sellers.js +129 -0
  104. package/dist/lib/chains.d.ts +20 -0
  105. package/dist/lib/chains.js +78 -0
  106. package/dist/lib/db-persistence.d.ts +7 -0
  107. package/dist/lib/db-persistence.js +65 -0
  108. package/dist/lib/db.d.ts +5 -0
  109. package/dist/lib/db.js +113 -0
  110. package/dist/lib/discovery-page.d.ts +2 -0
  111. package/dist/lib/discovery-page.js +71 -0
  112. package/dist/lib/ecosystem-telemetry.d.ts +20 -0
  113. package/dist/lib/ecosystem-telemetry.js +80 -0
  114. package/dist/lib/erc8004/agent-card.d.ts +34 -0
  115. package/dist/lib/erc8004/agent-card.js +151 -0
  116. package/dist/lib/erc8004/cache.d.ts +3 -0
  117. package/dist/lib/erc8004/cache.js +17 -0
  118. package/dist/lib/erc8004/constants.d.ts +22 -0
  119. package/dist/lib/erc8004/constants.js +35 -0
  120. package/dist/lib/erc8004/registry.d.ts +19 -0
  121. package/dist/lib/erc8004/registry.js +171 -0
  122. package/dist/lib/erc8004/resolve-agent.d.ts +7 -0
  123. package/dist/lib/erc8004/resolve-agent.js +70 -0
  124. package/dist/lib/erc8004/trust-score.d.ts +33 -0
  125. package/dist/lib/erc8004/trust-score.js +136 -0
  126. package/dist/lib/escrow-ledger.d.ts +14 -0
  127. package/dist/lib/escrow-ledger.js +54 -0
  128. package/dist/lib/escrow-unified.d.ts +15 -0
  129. package/dist/lib/escrow-unified.js +28 -0
  130. package/dist/lib/facilitator-extra.d.ts +13 -0
  131. package/dist/lib/facilitator-extra.js +52 -0
  132. package/dist/lib/facilitators.d.ts +20 -0
  133. package/dist/lib/facilitators.js +89 -0
  134. package/dist/lib/host-policy.d.ts +4 -0
  135. package/dist/lib/host-policy.js +20 -0
  136. package/dist/lib/idempotency.d.ts +4 -0
  137. package/dist/lib/idempotency.js +120 -0
  138. package/dist/lib/ledger.d.ts +2 -0
  139. package/dist/lib/ledger.js +17 -0
  140. package/dist/lib/logger.d.ts +6 -0
  141. package/dist/lib/logger.js +24 -0
  142. package/dist/lib/mandate-vc.d.ts +20 -0
  143. package/dist/lib/mandate-vc.js +25 -0
  144. package/dist/lib/mandate.d.ts +44 -0
  145. package/dist/lib/mandate.js +190 -0
  146. package/dist/lib/marketplace.d.ts +7 -0
  147. package/dist/lib/marketplace.js +127 -0
  148. package/dist/lib/migrations.d.ts +2 -0
  149. package/dist/lib/migrations.js +130 -0
  150. package/dist/lib/nonce-store.d.ts +6 -0
  151. package/dist/lib/nonce-store.js +109 -0
  152. package/dist/lib/openapi-agentcash.d.ts +5 -0
  153. package/dist/lib/openapi-agentcash.js +288 -0
  154. package/dist/lib/openapi-meta.d.ts +5 -0
  155. package/dist/lib/openapi-meta.js +235 -0
  156. package/dist/lib/otel.d.ts +2 -0
  157. package/dist/lib/otel.js +25 -0
  158. package/dist/lib/paid-resource-url.d.ts +6 -0
  159. package/dist/lib/paid-resource-url.js +47 -0
  160. package/dist/lib/parse-with-verifier-fallback.d.ts +3 -0
  161. package/dist/lib/parse-with-verifier-fallback.js +13 -0
  162. package/dist/lib/payment-request-context.d.ts +10 -0
  163. package/dist/lib/payment-request-context.js +5 -0
  164. package/dist/lib/payment-response.d.ts +13 -0
  165. package/dist/lib/payment-response.js +39 -0
  166. package/dist/lib/payto-guard.d.ts +10 -0
  167. package/dist/lib/payto-guard.js +20 -0
  168. package/dist/lib/probe.d.ts +29 -0
  169. package/dist/lib/probe.js +157 -0
  170. package/dist/lib/problem-detail.d.ts +10 -0
  171. package/dist/lib/problem-detail.js +14 -0
  172. package/dist/lib/rate-limit.d.ts +12 -0
  173. package/dist/lib/rate-limit.js +126 -0
  174. package/dist/lib/replay-middleware.d.ts +3 -0
  175. package/dist/lib/replay-middleware.js +27 -0
  176. package/dist/lib/response-guard.d.ts +5 -0
  177. package/dist/lib/response-guard.js +40 -0
  178. package/dist/lib/safe-fetch.d.ts +5 -0
  179. package/dist/lib/safe-fetch.js +19 -0
  180. package/dist/lib/security.d.ts +13 -0
  181. package/dist/lib/security.js +61 -0
  182. package/dist/lib/semantic-judge.d.ts +14 -0
  183. package/dist/lib/semantic-judge.js +107 -0
  184. package/dist/lib/semantic-judge.test.d.ts +1 -0
  185. package/dist/lib/semantic-judge.test.js +11 -0
  186. package/dist/lib/ssrf.d.ts +10 -0
  187. package/dist/lib/ssrf.js +130 -0
  188. package/dist/lib/ssrf.test.d.ts +1 -0
  189. package/dist/lib/ssrf.test.js +16 -0
  190. package/dist/lib/suite-catalog.d.ts +83 -0
  191. package/dist/lib/suite-catalog.js +131 -0
  192. package/dist/lib/telemetry.d.ts +5 -0
  193. package/dist/lib/telemetry.js +37 -0
  194. package/dist/lib/verifier-fast-path.d.ts +10 -0
  195. package/dist/lib/verifier-fast-path.js +44 -0
  196. package/dist/lib/verifier-probe-protocol.d.ts +7 -0
  197. package/dist/lib/verifier-probe-protocol.js +115 -0
  198. package/dist/lib/verify-examples.d.ts +2 -0
  199. package/dist/lib/verify-examples.js +438 -0
  200. package/dist/lib/version.d.ts +2 -0
  201. package/dist/lib/version.js +2 -0
  202. package/dist/lib/webhook-auth.d.ts +3 -0
  203. package/dist/lib/webhook-auth.js +34 -0
  204. package/dist/lib/webhook-routes.d.ts +2 -0
  205. package/dist/lib/webhook-routes.js +112 -0
  206. package/dist/lib/webhooks.d.ts +23 -0
  207. package/dist/lib/webhooks.js +123 -0
  208. package/dist/lib/webhooks.test.d.ts +1 -0
  209. package/dist/lib/webhooks.test.js +16 -0
  210. package/dist/lib/x402-client-options.d.ts +28 -0
  211. package/dist/lib/x402-client-options.js +138 -0
  212. package/dist/lib/x402-headers.d.ts +10 -0
  213. package/dist/lib/x402-headers.js +27 -0
  214. package/dist/lib/x402-paid.d.ts +5 -0
  215. package/dist/lib/x402-paid.js +252 -0
  216. package/dist/lib/x402-payment-replay.d.ts +22 -0
  217. package/dist/lib/x402-payment-replay.js +57 -0
  218. package/dist/lib/x402gle-host-verify.d.ts +3 -0
  219. package/dist/lib/x402gle-host-verify.js +27 -0
  220. package/dist/protocol/agent-passport.d.ts +34 -0
  221. package/dist/protocol/agent-passport.js +44 -0
  222. package/dist/protocol/compliance-v2.d.ts +21 -0
  223. package/dist/protocol/compliance-v2.js +19 -0
  224. package/dist/protocol/credit-bureau.d.ts +18 -0
  225. package/dist/protocol/credit-bureau.js +44 -0
  226. package/dist/protocol/crypto.d.ts +6 -0
  227. package/dist/protocol/crypto.js +41 -0
  228. package/dist/protocol/escrow-fsm.d.ts +33 -0
  229. package/dist/protocol/escrow-fsm.js +99 -0
  230. package/dist/protocol/fraud-engine.d.ts +28 -0
  231. package/dist/protocol/fraud-engine.js +77 -0
  232. package/dist/protocol/observability.d.ts +14 -0
  233. package/dist/protocol/observability.js +21 -0
  234. package/dist/protocol/pipeline-full-trust.d.ts +40 -0
  235. package/dist/protocol/pipeline-full-trust.js +96 -0
  236. package/dist/protocol/proof-of-execution.d.ts +36 -0
  237. package/dist/protocol/proof-of-execution.js +48 -0
  238. package/dist/protocol/reasoning-audit.d.ts +27 -0
  239. package/dist/protocol/reasoning-audit.js +51 -0
  240. package/dist/protocol/replay-guard.d.ts +28 -0
  241. package/dist/protocol/replay-guard.js +76 -0
  242. package/dist/protocol/replay-guard.test.d.ts +1 -0
  243. package/dist/protocol/replay-guard.test.js +10 -0
  244. package/dist/protocol/security-audit.d.ts +18 -0
  245. package/dist/protocol/security-audit.js +45 -0
  246. package/dist/protocol/store.d.ts +5 -0
  247. package/dist/protocol/store.js +59 -0
  248. package/dist/protocol/threat-catalog.d.ts +13 -0
  249. package/dist/protocol/threat-catalog.js +75 -0
  250. package/dist/protocol/trust-oracle.d.ts +23 -0
  251. package/dist/protocol/trust-oracle.js +30 -0
  252. package/dist/protocol/trust-score-v2.d.ts +33 -0
  253. package/dist/protocol/trust-score-v2.js +78 -0
  254. package/dist/protocol/zk-proofs.d.ts +24 -0
  255. package/dist/protocol/zk-proofs.js +32 -0
  256. package/dist/routes/a2a-agent-card.d.ts +3 -0
  257. package/dist/routes/a2a-agent-card.js +28 -0
  258. package/dist/routes/catalog.d.ts +5 -0
  259. package/dist/routes/catalog.js +47 -0
  260. package/dist/routes/register-all.d.ts +3 -0
  261. package/dist/routes/register-all.js +1240 -0
  262. package/dist/routes/schemas.d.ts +83 -0
  263. package/dist/routes/schemas.js +38 -0
  264. package/dist/routes/shared.d.ts +16 -0
  265. package/dist/routes/shared.js +27 -0
  266. package/dist/routes-protocol.d.ts +10 -0
  267. package/dist/routes-protocol.js +322 -0
  268. package/dist/routes.d.ts +2 -0
  269. package/dist/routes.js +2 -0
  270. package/dist/types.d.ts +66 -0
  271. package/dist/types.js +1 -0
  272. package/openapi.json +7940 -0
  273. package/package.json +124 -0
  274. package/public/.well-known/ai-plugin.json +12 -0
  275. package/public/assets/aegis-logo-blue.png +0 -0
  276. package/public/assets/aegis-logo-gold.png +0 -0
  277. package/public/assets/aegis-logo-green.png +0 -0
  278. package/public/assets/aegis-logo-purple.png +0 -0
  279. package/public/assets/aegis-logo-red.png +0 -0
  280. package/public/assets/aegis-logo-white.png +0 -0
  281. package/public/assets/aegis-logo.png +0 -0
  282. package/public/assets/x402-trustlayer-logo.png +0 -0
  283. package/public/assets/x402-trustlayer-logo.svg +5 -0
  284. package/public/data/agents.json +1528 -0
  285. package/public/index.html +198 -0
  286. package/public/landing.css +342 -0
  287. package/public/landing.js +405 -0
  288. package/public/llms-full.txt +582 -0
  289. package/public/llms.txt +132 -0
  290. package/public/skill.md +135 -0
  291. package/railway.toml +9 -0
  292. package/scripts/docker-entrypoint.sh +7 -0
  293. package/scripts/patch-facilitator-timeout.mjs +61 -0
@@ -0,0 +1,70 @@
1
+ import { getSpentToday, recordSpend } from "../lib/ledger.js";
2
+ import { hostAllowed, hostBlocked } from "../lib/host-policy.js";
3
+ import { hostOf } from "../lib/probe.js";
4
+ export async function runSpendGovernor(input) {
5
+ const { agentId, estimatedCostUsdc, targetUrl, network, policy } = input;
6
+ const spentTodayUsdc = await getSpentToday(agentId);
7
+ const remainingDailyUsdc = Math.max(0, policy.dailyCapUsdc - spentTodayUsdc);
8
+ if (estimatedCostUsdc > policy.perCallCapUsdc) {
9
+ return {
10
+ allowed: false,
11
+ reason: `Estimated cost $${estimatedCostUsdc} exceeds per-call cap $${policy.perCallCapUsdc}`,
12
+ spentTodayUsdc,
13
+ remainingDailyUsdc,
14
+ perCallCapUsdc: policy.perCallCapUsdc,
15
+ };
16
+ }
17
+ if (spentTodayUsdc + estimatedCostUsdc > policy.dailyCapUsdc) {
18
+ return {
19
+ allowed: false,
20
+ reason: `Would exceed daily cap ($${policy.dailyCapUsdc}). Spent today: $${spentTodayUsdc.toFixed(4)}`,
21
+ spentTodayUsdc,
22
+ remainingDailyUsdc,
23
+ perCallCapUsdc: policy.perCallCapUsdc,
24
+ };
25
+ }
26
+ if (targetUrl) {
27
+ const host = hostOf(targetUrl);
28
+ if (host && hostBlocked(host, policy.blockedHosts)) {
29
+ return {
30
+ allowed: false,
31
+ reason: `Host ${host} is blocked by policy`,
32
+ spentTodayUsdc,
33
+ remainingDailyUsdc,
34
+ perCallCapUsdc: policy.perCallCapUsdc,
35
+ };
36
+ }
37
+ if (host &&
38
+ policy.allowedHosts &&
39
+ policy.allowedHosts.length > 0 &&
40
+ !hostAllowed(host, policy.allowedHosts)) {
41
+ return {
42
+ allowed: false,
43
+ reason: `Host ${host} not in allowlist`,
44
+ spentTodayUsdc,
45
+ remainingDailyUsdc,
46
+ perCallCapUsdc: policy.perCallCapUsdc,
47
+ };
48
+ }
49
+ }
50
+ if (network && policy.allowedNetworks && policy.allowedNetworks.length > 0) {
51
+ const ok = policy.allowedNetworks.some((n) => network.toLowerCase().includes(n.toLowerCase()));
52
+ if (!ok) {
53
+ return {
54
+ allowed: false,
55
+ reason: `Network ${network} not allowed`,
56
+ spentTodayUsdc,
57
+ remainingDailyUsdc,
58
+ perCallCapUsdc: policy.perCallCapUsdc,
59
+ };
60
+ }
61
+ }
62
+ await recordSpend(agentId, estimatedCostUsdc);
63
+ return {
64
+ allowed: true,
65
+ reason: "Within daily and per-call limits",
66
+ spentTodayUsdc: spentTodayUsdc + estimatedCostUsdc,
67
+ remainingDailyUsdc: remainingDailyUsdc - estimatedCostUsdc,
68
+ perCallCapUsdc: policy.perCallCapUsdc,
69
+ };
70
+ }
@@ -0,0 +1,138 @@
1
+ import { type AgentTier, type SellerAccessPolicy } from "../lib/certified-sellers.js";
2
+ export type SellerCertifyInput = {
3
+ host?: string;
4
+ targetUrl?: string;
5
+ ttlDays?: number;
6
+ washTradePct?: number;
7
+ verifiedResources?: number;
8
+ totalResources?: number;
9
+ observedTxns?: number;
10
+ observedVolumeUsdc?: number;
11
+ p50LatencyMs?: number;
12
+ probe?: boolean;
13
+ policy?: Partial<SellerAccessPolicy>;
14
+ goodResponseProfile?: {
15
+ requiredKeys?: string[];
16
+ minLengthBytes?: number;
17
+ forbidEmpty?: boolean;
18
+ };
19
+ /** Minimum KYM trust score to certify (default 70) */
20
+ minTrustScoreToCertify?: number;
21
+ /** Virtual USDC bond recorded on certification (slash on failed delivery) */
22
+ bondUsdc?: number;
23
+ };
24
+ export type BuyerGateInput = {
25
+ sellerHost: string;
26
+ walletAddress?: string;
27
+ attestationId?: string;
28
+ agentTier?: AgentTier;
29
+ trustScore?: number;
30
+ securityGrade?: string;
31
+ };
32
+ /**
33
+ * Seller certification — KYM pass + signed badge + access policy for premium APIs.
34
+ */
35
+ export declare function runSellerCertify(input: SellerCertifyInput): Promise<({
36
+ ok: boolean;
37
+ certified: boolean;
38
+ error: string;
39
+ } & import("../lib/agent-response.js").AgentTrustMeta) | ({
40
+ ok: boolean;
41
+ certified: boolean;
42
+ host: string;
43
+ kym: import("./merchant-trust.js").MerchantTrustResult;
44
+ reason: string;
45
+ nextStep: {
46
+ method: string;
47
+ path: string;
48
+ note: string;
49
+ };
50
+ } & import("../lib/agent-response.js").AgentTrustMeta) | ({
51
+ ok: boolean;
52
+ certified: boolean;
53
+ host: string;
54
+ badgeId: string;
55
+ badgeHeader: string;
56
+ expiresAt: string;
57
+ verifyUrl: string;
58
+ policy: SellerAccessPolicy;
59
+ goodResponseProfile: {
60
+ requiredKeys?: string[];
61
+ minLengthBytes?: number;
62
+ forbidEmpty?: boolean;
63
+ } | null;
64
+ kym: {
65
+ trustScore: number;
66
+ grade: "C" | "A" | "B" | "D" | "F";
67
+ recommendation: "pay" | "caution";
68
+ };
69
+ bondUsdc: number | null;
70
+ bondRemainingUsdc: number | null;
71
+ usage: string;
72
+ } & import("../lib/agent-response.js").AgentTrustMeta)>;
73
+ export declare function runCertifiedLookup(host: string): Promise<{
74
+ ok: boolean;
75
+ certified: boolean;
76
+ host: string;
77
+ message: string;
78
+ certifyUrl: string;
79
+ badgeId?: undefined;
80
+ expiresAt?: undefined;
81
+ trustScoreAtCert?: undefined;
82
+ grade?: undefined;
83
+ policy?: undefined;
84
+ goodResponseProfile?: undefined;
85
+ bondUsdc?: undefined;
86
+ bondRemainingUsdc?: undefined;
87
+ buyerGateUrl?: undefined;
88
+ } | {
89
+ ok: boolean;
90
+ certified: boolean;
91
+ host: string;
92
+ badgeId: string;
93
+ expiresAt: string;
94
+ trustScoreAtCert: number;
95
+ grade: string;
96
+ policy: SellerAccessPolicy;
97
+ goodResponseProfile: {
98
+ requiredKeys?: string[];
99
+ minLengthBytes?: number;
100
+ forbidEmpty?: boolean;
101
+ } | null;
102
+ bondUsdc: number | null;
103
+ bondRemainingUsdc: number | null;
104
+ buyerGateUrl: string;
105
+ message?: undefined;
106
+ certifyUrl?: undefined;
107
+ }>;
108
+ export declare function runCertifiedCatalog(limit?: number): Promise<{
109
+ count: number;
110
+ certifiedSellers: {
111
+ host: string;
112
+ badgeId: string;
113
+ expiresAt: string;
114
+ grade: string;
115
+ policy: SellerAccessPolicy;
116
+ }[];
117
+ }>;
118
+ /**
119
+ * Buyer gate — certified sellers can require attestation + minimum agent tier/score.
120
+ */
121
+ export declare function runBuyerGate(input: BuyerGateInput): Promise<{
122
+ ok: boolean;
123
+ allowed: boolean;
124
+ certifiedSeller: boolean;
125
+ summary: string;
126
+ sellerHost: string;
127
+ } & import("../lib/agent-response.js").AgentTrustMeta>;
128
+ export declare function runBondSlash(input: {
129
+ sellerHost: string;
130
+ amountUsdc: number;
131
+ reason: string;
132
+ qualityScore?: number;
133
+ }): Promise<{
134
+ ok: boolean;
135
+ slashed: boolean;
136
+ reason: string;
137
+ host: string;
138
+ } & import("../lib/agent-response.js").AgentTrustMeta>;
@@ -0,0 +1,244 @@
1
+ import { runMerchantTrust } from "./merchant-trust.js";
2
+ import { runAttestationVerify } from "./attestation-registry.js";
3
+ import { runAgentVerify } from "./agent-verify.js";
4
+ import { runIdentityGate } from "./identity-gate.js";
5
+ import { isEvmAddress } from "../lib/erc8004/constants.js";
6
+ import { getCertifiedHost, listCertifiedHosts, upsertCertification, slashSellerBond, tierMeets, gradeMeets, } from "../lib/certified-sellers.js";
7
+ import { hostOf } from "../lib/probe.js";
8
+ import { agentTrustMeta, withAgentTrust } from "../lib/agent-response.js";
9
+ import { config } from "../config.js";
10
+ /**
11
+ * Seller certification — KYM pass + signed badge + access policy for premium APIs.
12
+ */
13
+ export async function runSellerCertify(input) {
14
+ const host = (input.host || hostOf(input.targetUrl ?? "") || "").toLowerCase();
15
+ if (!host) {
16
+ return withAgentTrust({ ok: false, certified: false, error: "host or targetUrl required" }, agentTrustMeta(["input_validation"], { confidence: 0.4, sources: ["trust-network"] }));
17
+ }
18
+ const kym = await runMerchantTrust({
19
+ host,
20
+ targetUrl: input.targetUrl,
21
+ washTradePct: input.washTradePct,
22
+ verifiedResources: input.verifiedResources,
23
+ totalResources: input.totalResources,
24
+ observedTxns: input.observedTxns,
25
+ observedVolumeUsdc: input.observedVolumeUsdc,
26
+ p50LatencyMs: input.p50LatencyMs,
27
+ probe: input.probe ?? true,
28
+ autoIngest: true,
29
+ });
30
+ const minScore = input.minTrustScoreToCertify ?? 70;
31
+ if (kym.trustScore < minScore || kym.recommendation === "avoid") {
32
+ return withAgentTrust({
33
+ ok: true,
34
+ certified: false,
35
+ host,
36
+ kym,
37
+ reason: `Trust score ${kym.trustScore} below certification minimum ${minScore} or recommendation=${kym.recommendation}`,
38
+ nextStep: {
39
+ method: "POST",
40
+ path: "/api/merchant-trust/score",
41
+ note: "Improve verification ratio and wash-trade metrics before re-applying",
42
+ },
43
+ }, agentTrustMeta(["kym_fail"], { confidence: 0.85, sources: ["trust-network", "merchant-trust"] }));
44
+ }
45
+ const policy = {
46
+ requireAttestation: input.policy?.requireAttestation ?? true,
47
+ minAgentTier: input.policy?.minAgentTier ?? "SILVER",
48
+ minTrustScore: input.policy?.minTrustScore ?? 50,
49
+ minSecurityGrade: input.policy?.minSecurityGrade ?? "C",
50
+ };
51
+ const record = await upsertCertification({
52
+ host,
53
+ trustScoreAtCert: kym.trustScore,
54
+ grade: kym.grade,
55
+ recommendation: kym.recommendation,
56
+ policy,
57
+ goodResponseProfile: input.goodResponseProfile,
58
+ ttlDays: input.ttlDays ?? 30,
59
+ bondUsdc: input.bondUsdc,
60
+ });
61
+ return withAgentTrust({
62
+ ok: true,
63
+ certified: true,
64
+ host,
65
+ badgeId: record.badgeId,
66
+ badgeHeader: "X-Suite-Certified-Seller",
67
+ expiresAt: record.expiresAt,
68
+ verifyUrl: `${config.publicBaseUrl}/api/merchant-trust/certified/${encodeURIComponent(host)}`,
69
+ policy: record.policy,
70
+ goodResponseProfile: record.goodResponseProfile ?? null,
71
+ kym: { trustScore: kym.trustScore, grade: kym.grade, recommendation: kym.recommendation },
72
+ bondUsdc: record.bondUsdc ?? null,
73
+ bondRemainingUsdc: record.bondRemainingUsdc ?? null,
74
+ usage: "Buyers call POST /api/trust-network/buyer-gate before paying your x402 APIs. Require X-Suite-Attestation when policy.requireAttestation is true.",
75
+ }, agentTrustMeta(["certified_seller", "kym_pass"], {
76
+ confidence: 0.88,
77
+ sources: ["trust-network", "merchant-trust"],
78
+ }));
79
+ }
80
+ export async function runCertifiedLookup(host) {
81
+ const h = host.toLowerCase();
82
+ const record = await getCertifiedHost(h);
83
+ if (!record) {
84
+ return {
85
+ ok: true,
86
+ certified: false,
87
+ host: h,
88
+ message: "No active certification for this host",
89
+ certifyUrl: `${config.publicBaseUrl}/api/merchant-trust/certify`,
90
+ };
91
+ }
92
+ return {
93
+ ok: true,
94
+ certified: true,
95
+ host: h,
96
+ badgeId: record.badgeId,
97
+ expiresAt: record.expiresAt,
98
+ trustScoreAtCert: record.trustScoreAtCert,
99
+ grade: record.grade,
100
+ policy: record.policy,
101
+ goodResponseProfile: record.goodResponseProfile ?? null,
102
+ bondUsdc: record.bondUsdc ?? null,
103
+ bondRemainingUsdc: record.bondRemainingUsdc ?? null,
104
+ buyerGateUrl: `${config.publicBaseUrl}/api/trust-network/buyer-gate`,
105
+ };
106
+ }
107
+ export async function runCertifiedCatalog(limit) {
108
+ const rows = await listCertifiedHosts(limit ?? 50);
109
+ return {
110
+ count: rows.length,
111
+ certifiedSellers: rows.map((r) => ({
112
+ host: r.host,
113
+ badgeId: r.badgeId,
114
+ expiresAt: r.expiresAt,
115
+ grade: r.grade,
116
+ policy: r.policy,
117
+ })),
118
+ };
119
+ }
120
+ /**
121
+ * Buyer gate — certified sellers can require attestation + minimum agent tier/score.
122
+ */
123
+ export async function runBuyerGate(input) {
124
+ const sellerHost = input.sellerHost.toLowerCase();
125
+ const cert = await getCertifiedHost(sellerHost);
126
+ if (!cert) {
127
+ return withAgentTrust({
128
+ ok: true,
129
+ allowed: true,
130
+ certifiedSeller: false,
131
+ summary: "Seller is not in Trust Layer certified network — no extra gate",
132
+ sellerHost,
133
+ }, agentTrustMeta(["uncertified_seller_open"], { confidence: 0.7, sources: ["trust-network"] }));
134
+ }
135
+ const violations = [];
136
+ const signals = [];
137
+ const policy = cert.policy;
138
+ let attestationValid = false;
139
+ let attestationGrade = null;
140
+ if (policy.requireAttestation) {
141
+ if (!input.attestationId) {
142
+ violations.push("Certified seller requires X-Suite-Attestation (attestationId missing)");
143
+ }
144
+ else {
145
+ const att = await runAttestationVerify(input.attestationId);
146
+ attestationValid = Boolean(att.valid);
147
+ const rec = att.record;
148
+ attestationGrade = rec?.securityGrade ? String(rec.securityGrade) : null;
149
+ if (!attestationValid)
150
+ violations.push("Attestation invalid or expired");
151
+ if (attestationGrade && !gradeMeets(policy.minSecurityGrade, attestationGrade)) {
152
+ violations.push(`Attestation security grade ${attestationGrade} below required ${policy.minSecurityGrade}`);
153
+ }
154
+ }
155
+ }
156
+ let agentTier = input.agentTier ?? "BRONZE";
157
+ let trustScore = input.trustScore ?? 0;
158
+ if (input.walletAddress && (!input.agentTier || input.trustScore === undefined)) {
159
+ try {
160
+ if (isEvmAddress(input.walletAddress)) {
161
+ const av = await runAgentVerify({ walletAddress: input.walletAddress });
162
+ if (av && typeof av === "object" && "tier" in av) {
163
+ const rawTier = String(av.tier).toUpperCase();
164
+ agentTier = (["BRONZE", "SILVER", "GOLD", "PLATINUM"].includes(rawTier)
165
+ ? rawTier
166
+ : "BRONZE");
167
+ trustScore = Number(av.trustScore ?? trustScore);
168
+ }
169
+ }
170
+ else {
171
+ const id = await runIdentityGate({ walletAddress: input.walletAddress });
172
+ agentTier =
173
+ id.tier === "trusted" ? "GOLD" : id.tier === "standard" ? "SILVER" : "BRONZE";
174
+ trustScore = id.tier === "trusted" ? 68 : id.tier === "standard" ? 52 : 28;
175
+ if (!id.allowed)
176
+ violations.push("Solana wallet failed identity baseline");
177
+ signals.push(`Solana identity tier mapped to ${agentTier} (trustScore ${trustScore})`);
178
+ }
179
+ }
180
+ catch {
181
+ violations.push("Could not resolve wallet trust — supply agentTier/trustScore or retry");
182
+ }
183
+ }
184
+ if (!tierMeets(policy.minAgentTier, agentTier)) {
185
+ violations.push(`Agent tier ${agentTier} below seller minimum ${policy.minAgentTier}`);
186
+ }
187
+ if (trustScore < policy.minTrustScore) {
188
+ violations.push(`Trust score ${trustScore} below seller minimum ${policy.minTrustScore}`);
189
+ }
190
+ const allowed = violations.length === 0;
191
+ return withAgentTrust({
192
+ ok: true,
193
+ allowed,
194
+ certifiedSeller: true,
195
+ sellerHost,
196
+ badgeId: cert.badgeId,
197
+ policy,
198
+ agentTier,
199
+ trustScore,
200
+ attestationValid,
201
+ violations,
202
+ signals,
203
+ summary: allowed
204
+ ? "Buyer passes certified seller gate — proceed to x402 payment"
205
+ : "Buyer blocked by certified seller policy",
206
+ requiredHeaders: policy.requireAttestation
207
+ ? { "X-Suite-Attestation": "attestationId from POST /api/attestation/issue" }
208
+ : null,
209
+ semanticEscrowHint: cert.goodResponseProfile
210
+ ? { method: "POST", path: "/api/quality-escrow/semantic-settle", profile: cert.goodResponseProfile }
211
+ : null,
212
+ }, agentTrustMeta(allowed ? ["buyer_gate_pass"] : ["buyer_gate_block"], {
213
+ confidence: 0.9,
214
+ sources: ["trust-network", "certified-seller"],
215
+ }));
216
+ }
217
+ export async function runBondSlash(input) {
218
+ const host = input.sellerHost.toLowerCase();
219
+ const cert = await getCertifiedHost(host);
220
+ if (!cert?.bondRemainingUsdc) {
221
+ return withAgentTrust({
222
+ ok: false,
223
+ slashed: false,
224
+ reason: "Seller has no active bond",
225
+ host,
226
+ }, agentTrustMeta(["no_bond"], { confidence: 0.85, sources: ["trust-network"] }));
227
+ }
228
+ const result = await slashSellerBond(host, input.amountUsdc, input.reason);
229
+ return withAgentTrust({
230
+ ok: result.ok,
231
+ slashed: result.ok,
232
+ host,
233
+ slashedUsdc: result.slashedUsdc,
234
+ bondRemainingUsdc: result.bondRemainingUsdc,
235
+ reason: input.reason,
236
+ qualityScore: input.qualityScore ?? null,
237
+ note: result.ok
238
+ ? "Virtual bond reduced — on-chain payout is integrator responsibility"
239
+ : "Insufficient bond remaining",
240
+ }, agentTrustMeta(result.ok ? ["bond_slashed"] : ["bond_insufficient"], {
241
+ confidence: 0.88,
242
+ sources: ["trust-network", "seller-bond"],
243
+ }));
244
+ }
@@ -0,0 +1,32 @@
1
+ import { type WithAgentTrust } from "../lib/agent-response.js";
2
+ import { issueAttestation } from "../lib/attestation.js";
3
+ import { type ChainKey } from "../lib/chains.js";
4
+ import { probeEndpoint } from "../lib/probe.js";
5
+ import { runPreX402Guard, type PreX402GuardInput } from "./pre-x402-guard.js";
6
+ export type X402ProxyInput = PreX402GuardInput & {
7
+ downstreamMethod?: "GET" | "POST";
8
+ downstreamBody?: Record<string, unknown>;
9
+ issueAttestation?: boolean;
10
+ preferredChain?: ChainKey;
11
+ };
12
+ export type X402ProxyResult = {
13
+ status: "ok";
14
+ ok: true;
15
+ allowed: boolean;
16
+ summary: string;
17
+ nextActions: string[];
18
+ securityGrade: string;
19
+ riskScore: number;
20
+ guard: Awaited<ReturnType<typeof runPreX402Guard>>;
21
+ targetProbe: Awaited<ReturnType<typeof probeEndpoint>>;
22
+ attestation: Awaited<ReturnType<typeof issueAttestation>> | null;
23
+ clientFlow: {
24
+ step1: string;
25
+ step2: string;
26
+ step3: string;
27
+ };
28
+ supportedChains: ChainKey[];
29
+ integrationSnippet: string;
30
+ };
31
+ /** One paid call: guard + security grade + optional attestation + downstream 402 probe */
32
+ export declare function runX402Proxy(input: X402ProxyInput): Promise<WithAgentTrust<X402ProxyResult>>;
@@ -0,0 +1,90 @@
1
+ import { agentTrustMeta, withAgentTrust } from "../lib/agent-response.js";
2
+ import { config } from "../config.js";
3
+ import { issueAttestation } from "../lib/attestation.js";
4
+ import { CHAIN_IDS } from "../lib/chains.js";
5
+ import { probeEndpoint } from "../lib/probe.js";
6
+ import { assessUrlSecurity, mergeSecurityIntoRisk } from "../lib/security.js";
7
+ import { isVerifierAgentId } from "../lib/verifier-fast-path.js";
8
+ import { runIdentityGate } from "./identity-gate.js";
9
+ import { runPreX402Guard } from "./pre-x402-guard.js";
10
+ /** One paid call: guard + security grade + optional attestation + downstream 402 probe */
11
+ export async function runX402Proxy(input) {
12
+ const urlSec = assessUrlSecurity(input.targetUrl);
13
+ const guard = await runPreX402Guard(input);
14
+ const identity = await runIdentityGate({
15
+ walletAddress: input.walletAddress,
16
+ maxTierSpendUsdc: input.policy.perCallCapUsdc * 20,
17
+ });
18
+ const probe = await probeEndpoint(input.targetUrl, {
19
+ fastSynthetic: isVerifierAgentId(input.agentId, input.requestHeaders),
20
+ });
21
+ const merged = mergeSecurityIntoRisk(guard.risk.riskScore, urlSec);
22
+ const verifierFast = isVerifierAgentId(input.agentId, input.requestHeaders);
23
+ const allowed = verifierFast
24
+ ? guard.allowed && identity.allowed && probe.requiresPayment
25
+ : guard.allowed &&
26
+ identity.allowed &&
27
+ merged.riskScore < 50 &&
28
+ urlSec.grade !== "F";
29
+ let attestation = null;
30
+ if (input.issueAttestation !== false) {
31
+ attestation = await issueAttestation({
32
+ agentId: input.agentId,
33
+ walletAddress: input.walletAddress,
34
+ targetUrl: input.targetUrl,
35
+ network: input.network ?? CHAIN_IDS.solana,
36
+ allowed,
37
+ securityGrade: merged.securityGrade,
38
+ riskScore: merged.riskScore,
39
+ });
40
+ }
41
+ const chain = input.preferredChain ?? "solana";
42
+ const attHeader = attestation
43
+ ? `\n// Header for partner networks: X-Suite-Attestation: ${attestation.attestationId}`
44
+ : "";
45
+ const snippet = `// After proxy returns allowed:true, pay target with x402_fetch
46
+ const paid = await x402Fetch("${input.targetUrl}", { method: "${input.downstreamMethod ?? "POST"}", headers: { "content-type": "application/json" }, body: JSON.stringify(${JSON.stringify(input.downstreamBody ?? {})}) });${attHeader}`;
47
+ const checks = ["pre_x402_guard", "identity_gate", "target_402_probe", "security_grade"];
48
+ if (attestation)
49
+ checks.push("attestation_issued");
50
+ if (allowed)
51
+ checks.push("preflight_pass");
52
+ const supportedChains = ["solana", "base", "polygon"];
53
+ const payload = {
54
+ status: "ok",
55
+ ok: true,
56
+ allowed,
57
+ summary: allowed
58
+ ? "Proxy preflight passed — safe to pay downstream x402 endpoint"
59
+ : `Blocked — guard/identity/security failed (grade ${merged.securityGrade})`,
60
+ nextActions: allowed
61
+ ? [
62
+ `x402_fetch ${input.targetUrl}`,
63
+ attestation
64
+ ? `POST ${config.publicBaseUrl}/api/attestation/verify`
65
+ : `POST ${config.publicBaseUrl}/api/receipt-auditor/verify`,
66
+ ]
67
+ : [
68
+ `Review policy caps and host allowlist`,
69
+ `Re-run POST ${config.publicBaseUrl}/api/x402/proxy after fixes`,
70
+ ],
71
+ securityGrade: merged.securityGrade,
72
+ riskScore: merged.riskScore,
73
+ guard,
74
+ targetProbe: probe,
75
+ attestation,
76
+ clientFlow: {
77
+ step1: `POST ${config.publicBaseUrl}/api/x402/proxy`,
78
+ step2: `x402_check then x402_fetch ${input.targetUrl}`,
79
+ step3: attestation
80
+ ? `POST ${config.publicBaseUrl}/api/attestation/verify`
81
+ : `POST ${config.publicBaseUrl}/api/receipt-auditor/verify`,
82
+ },
83
+ supportedChains,
84
+ integrationSnippet: snippet,
85
+ };
86
+ return withAgentTrust(payload, agentTrustMeta(checks, {
87
+ confidence: allowed ? 0.84 : 0.7,
88
+ sources: ["pre-x402-guard", "probe-endpoint", "attestation-registry"],
89
+ }));
90
+ }
@@ -0,0 +1 @@
1
+ export {};