@ucptools/validator 1.0.0 → 1.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 (330) hide show
  1. package/dist/auth/config.d.ts +20 -0
  2. package/dist/auth/config.d.ts.map +1 -0
  3. package/dist/auth/config.js +114 -0
  4. package/dist/auth/config.js.map +1 -0
  5. package/dist/auth/index.d.ts +5 -0
  6. package/dist/auth/index.d.ts.map +1 -0
  7. package/dist/auth/index.js +17 -0
  8. package/dist/auth/index.js.map +1 -0
  9. package/dist/auth/middleware.d.ts +45 -0
  10. package/dist/auth/middleware.d.ts.map +1 -0
  11. package/dist/auth/middleware.js +170 -0
  12. package/dist/auth/middleware.js.map +1 -0
  13. package/dist/auth/service.d.ts +80 -0
  14. package/dist/auth/service.d.ts.map +1 -0
  15. package/dist/auth/service.js +298 -0
  16. package/dist/auth/service.js.map +1 -0
  17. package/dist/cli/index.d.ts +6 -0
  18. package/dist/cli/index.d.ts.map +1 -0
  19. package/dist/cli/index.js +375 -0
  20. package/dist/cli/index.js.map +1 -0
  21. package/dist/cli/mock-server.d.ts +20 -0
  22. package/dist/cli/mock-server.d.ts.map +1 -0
  23. package/dist/cli/mock-server.js +261 -0
  24. package/dist/cli/mock-server.js.map +1 -0
  25. package/dist/compliance/compliance-generator.d.ts +34 -0
  26. package/dist/compliance/compliance-generator.d.ts.map +1 -0
  27. package/dist/compliance/compliance-generator.js +320 -0
  28. package/dist/compliance/compliance-generator.js.map +1 -0
  29. package/dist/compliance/index.d.ts +8 -0
  30. package/dist/compliance/index.d.ts.map +1 -0
  31. package/dist/compliance/index.js +17 -0
  32. package/dist/compliance/index.js.map +1 -0
  33. package/dist/compliance/templates.d.ts +34 -0
  34. package/dist/compliance/templates.d.ts.map +1 -0
  35. package/{src/compliance/templates.ts → dist/compliance/templates.js} +117 -155
  36. package/dist/compliance/templates.js.map +1 -0
  37. package/dist/compliance/types.d.ts +64 -0
  38. package/dist/compliance/types.d.ts.map +1 -0
  39. package/dist/compliance/types.js +64 -0
  40. package/dist/compliance/types.js.map +1 -0
  41. package/dist/db/index.d.ts +17 -0
  42. package/dist/db/index.d.ts.map +1 -0
  43. package/dist/db/index.js +80 -0
  44. package/dist/db/index.js.map +1 -0
  45. package/dist/db/schema.d.ts +3886 -0
  46. package/dist/db/schema.d.ts.map +1 -0
  47. package/dist/db/schema.js +425 -0
  48. package/dist/db/schema.js.map +1 -0
  49. package/dist/db/utils.d.ts +252 -0
  50. package/dist/db/utils.d.ts.map +1 -0
  51. package/dist/db/utils.js +295 -0
  52. package/dist/db/utils.js.map +1 -0
  53. package/dist/feed-analyzer/feed-analyzer.d.ts +26 -0
  54. package/dist/feed-analyzer/feed-analyzer.d.ts.map +1 -0
  55. package/{src/feed-analyzer/feed-analyzer.ts → dist/feed-analyzer/feed-analyzer.js} +856 -726
  56. package/dist/feed-analyzer/feed-analyzer.js.map +1 -0
  57. package/dist/feed-analyzer/index.d.ts +8 -0
  58. package/dist/feed-analyzer/index.d.ts.map +1 -0
  59. package/dist/feed-analyzer/index.js +19 -0
  60. package/dist/feed-analyzer/index.js.map +1 -0
  61. package/dist/feed-analyzer/types.d.ts +285 -0
  62. package/dist/feed-analyzer/types.d.ts.map +1 -0
  63. package/dist/feed-analyzer/types.js +175 -0
  64. package/dist/feed-analyzer/types.js.map +1 -0
  65. package/{src/generator/index.ts → dist/generator/index.d.ts} +1 -1
  66. package/dist/generator/index.d.ts.map +1 -0
  67. package/dist/generator/index.js +13 -0
  68. package/dist/generator/index.js.map +1 -0
  69. package/dist/generator/key-generator.d.ts +24 -0
  70. package/dist/generator/key-generator.d.ts.map +1 -0
  71. package/dist/generator/key-generator.js +144 -0
  72. package/dist/generator/key-generator.js.map +1 -0
  73. package/dist/generator/profile-builder.d.ts +15 -0
  74. package/dist/generator/profile-builder.d.ts.map +1 -0
  75. package/dist/generator/profile-builder.js +338 -0
  76. package/dist/generator/profile-builder.js.map +1 -0
  77. package/dist/hosting/artifacts-generator.d.ts +10 -0
  78. package/dist/hosting/artifacts-generator.d.ts.map +1 -0
  79. package/{src/hosting/artifacts-generator.ts → dist/hosting/artifacts-generator.js} +191 -241
  80. package/dist/hosting/artifacts-generator.js.map +1 -0
  81. package/{src/hosting/index.ts → dist/hosting/index.d.ts} +1 -1
  82. package/dist/hosting/index.d.ts.map +1 -0
  83. package/dist/hosting/index.js +10 -0
  84. package/dist/hosting/index.js.map +1 -0
  85. package/dist/index.d.ts +18 -0
  86. package/dist/index.d.ts.map +1 -0
  87. package/dist/index.js +78 -0
  88. package/dist/index.js.map +1 -0
  89. package/dist/lib/analytics.d.ts +337 -0
  90. package/dist/lib/analytics.d.ts.map +1 -0
  91. package/dist/lib/analytics.js +188 -0
  92. package/dist/lib/analytics.js.map +1 -0
  93. package/{src/security/index.ts → dist/security/index.d.ts} +8 -15
  94. package/dist/security/index.d.ts.map +1 -0
  95. package/dist/security/index.js +12 -0
  96. package/dist/security/index.js.map +1 -0
  97. package/dist/security/security-scanner.d.ts +10 -0
  98. package/dist/security/security-scanner.d.ts.map +1 -0
  99. package/dist/security/security-scanner.js +669 -0
  100. package/dist/security/security-scanner.js.map +1 -0
  101. package/dist/security/types.d.ts +80 -0
  102. package/dist/security/types.d.ts.map +1 -0
  103. package/dist/security/types.js +21 -0
  104. package/dist/security/types.js.map +1 -0
  105. package/dist/services/analytics.d.ts +114 -0
  106. package/dist/services/analytics.d.ts.map +1 -0
  107. package/dist/services/analytics.js +862 -0
  108. package/dist/services/analytics.js.map +1 -0
  109. package/dist/services/badge.d.ts +31 -0
  110. package/dist/services/badge.d.ts.map +1 -0
  111. package/dist/services/badge.js +152 -0
  112. package/dist/services/badge.js.map +1 -0
  113. package/dist/services/cron.d.ts +125 -0
  114. package/dist/services/cron.d.ts.map +1 -0
  115. package/dist/services/cron.js +613 -0
  116. package/dist/services/cron.js.map +1 -0
  117. package/dist/services/directory.d.ts +106 -0
  118. package/dist/services/directory.d.ts.map +1 -0
  119. package/dist/services/directory.js +351 -0
  120. package/dist/services/directory.js.map +1 -0
  121. package/dist/services/email.d.ts +112 -0
  122. package/dist/services/email.d.ts.map +1 -0
  123. package/dist/services/email.js +772 -0
  124. package/dist/services/email.js.map +1 -0
  125. package/dist/services/hosted-profiles.d.ts +77 -0
  126. package/dist/services/hosted-profiles.d.ts.map +1 -0
  127. package/dist/services/hosted-profiles.js +433 -0
  128. package/dist/services/hosted-profiles.js.map +1 -0
  129. package/dist/services/latency.d.ts +67 -0
  130. package/dist/services/latency.d.ts.map +1 -0
  131. package/dist/services/latency.js +274 -0
  132. package/dist/services/latency.js.map +1 -0
  133. package/dist/services/manifest-compliance.d.ts +64 -0
  134. package/dist/services/manifest-compliance.d.ts.map +1 -0
  135. package/dist/services/manifest-compliance.js +271 -0
  136. package/dist/services/manifest-compliance.js.map +1 -0
  137. package/dist/services/monitoring-diff.d.ts +31 -0
  138. package/dist/services/monitoring-diff.d.ts.map +1 -0
  139. package/dist/services/monitoring-diff.js +189 -0
  140. package/dist/services/monitoring-diff.js.map +1 -0
  141. package/dist/services/notifications.d.ts +46 -0
  142. package/dist/services/notifications.d.ts.map +1 -0
  143. package/dist/services/notifications.js +88 -0
  144. package/dist/services/notifications.js.map +1 -0
  145. package/dist/services/stripe.d.ts +93 -0
  146. package/dist/services/stripe.d.ts.map +1 -0
  147. package/dist/services/stripe.js +490 -0
  148. package/dist/services/stripe.js.map +1 -0
  149. package/dist/services/validation-history.d.ts +99 -0
  150. package/dist/services/validation-history.d.ts.map +1 -0
  151. package/dist/services/validation-history.js +344 -0
  152. package/dist/services/validation-history.js.map +1 -0
  153. package/dist/services/validation-logging.d.ts +103 -0
  154. package/dist/services/validation-logging.d.ts.map +1 -0
  155. package/dist/services/validation-logging.js +210 -0
  156. package/dist/services/validation-logging.js.map +1 -0
  157. package/dist/services/validation.d.ts +119 -0
  158. package/dist/services/validation.d.ts.map +1 -0
  159. package/dist/services/validation.js +1185 -0
  160. package/dist/services/validation.js.map +1 -0
  161. package/dist/simulator/agent-simulator.d.ts +69 -0
  162. package/dist/simulator/agent-simulator.d.ts.map +1 -0
  163. package/dist/simulator/agent-simulator.js +870 -0
  164. package/dist/simulator/agent-simulator.js.map +1 -0
  165. package/{src/simulator/index.ts → dist/simulator/index.d.ts} +7 -7
  166. package/dist/simulator/index.d.ts.map +1 -0
  167. package/dist/simulator/index.js +23 -0
  168. package/dist/simulator/index.js.map +1 -0
  169. package/{src/simulator/types.ts → dist/simulator/types.d.ts} +171 -170
  170. package/dist/simulator/types.d.ts.map +1 -0
  171. package/dist/simulator/types.js +18 -0
  172. package/dist/simulator/types.js.map +1 -0
  173. package/dist/types/acp-validation.d.ts +87 -0
  174. package/dist/types/acp-validation.d.ts.map +1 -0
  175. package/dist/types/acp-validation.js +40 -0
  176. package/dist/types/acp-validation.js.map +1 -0
  177. package/dist/types/analytics.d.ts +182 -0
  178. package/dist/types/analytics.d.ts.map +1 -0
  179. package/dist/types/analytics.js +7 -0
  180. package/dist/types/analytics.js.map +1 -0
  181. package/dist/types/generator.d.ts +106 -0
  182. package/dist/types/generator.d.ts.map +1 -0
  183. package/dist/types/generator.js +6 -0
  184. package/dist/types/generator.js.map +1 -0
  185. package/{src/types/index.ts → dist/types/index.d.ts} +1 -1
  186. package/dist/types/index.d.ts.map +1 -0
  187. package/dist/types/index.js +23 -0
  188. package/dist/types/index.js.map +1 -0
  189. package/dist/types/ucp-profile.d.ts +111 -0
  190. package/dist/types/ucp-profile.d.ts.map +1 -0
  191. package/dist/types/ucp-profile.js +45 -0
  192. package/dist/types/ucp-profile.js.map +1 -0
  193. package/dist/types/validation.d.ts +76 -0
  194. package/dist/types/validation.d.ts.map +1 -0
  195. package/dist/types/validation.js +42 -0
  196. package/dist/types/validation.js.map +1 -0
  197. package/dist/validator/acp/index.d.ts +31 -0
  198. package/dist/validator/acp/index.d.ts.map +1 -0
  199. package/dist/validator/acp/index.js +574 -0
  200. package/dist/validator/acp/index.js.map +1 -0
  201. package/dist/validator/index.d.ts +26 -0
  202. package/dist/validator/index.d.ts.map +1 -0
  203. package/dist/validator/index.js +161 -0
  204. package/dist/validator/index.js.map +1 -0
  205. package/dist/validator/network-validator.d.ts +28 -0
  206. package/dist/validator/network-validator.d.ts.map +1 -0
  207. package/dist/validator/network-validator.js +319 -0
  208. package/dist/validator/network-validator.js.map +1 -0
  209. package/dist/validator/rules-validator.d.ts +19 -0
  210. package/dist/validator/rules-validator.d.ts.map +1 -0
  211. package/dist/validator/rules-validator.js +306 -0
  212. package/dist/validator/rules-validator.js.map +1 -0
  213. package/dist/validator/sdk-validator.d.ts +58 -0
  214. package/dist/validator/sdk-validator.d.ts.map +1 -0
  215. package/{src/validator/sdk-validator.ts → dist/validator/sdk-validator.js} +273 -330
  216. package/dist/validator/sdk-validator.js.map +1 -0
  217. package/dist/validator/structural-validator.d.ts +11 -0
  218. package/dist/validator/structural-validator.d.ts.map +1 -0
  219. package/dist/validator/structural-validator.js +549 -0
  220. package/dist/validator/structural-validator.js.map +1 -0
  221. package/dist/validator/utils.d.ts +51 -0
  222. package/dist/validator/utils.d.ts.map +1 -0
  223. package/dist/validator/utils.js +132 -0
  224. package/dist/validator/utils.js.map +1 -0
  225. package/package.json +44 -12
  226. package/CLAUDE.md +0 -109
  227. package/api/analyze-feed.js +0 -140
  228. package/api/badge.js +0 -185
  229. package/api/benchmark.js +0 -177
  230. package/api/directory-stats.ts +0 -29
  231. package/api/directory.ts +0 -73
  232. package/api/generate-compliance.js +0 -143
  233. package/api/generate-schema.js +0 -457
  234. package/api/generate.js +0 -132
  235. package/api/security-scan.js +0 -133
  236. package/api/simulate.js +0 -187
  237. package/api/tsconfig.json +0 -10
  238. package/api/validate.js +0 -1351
  239. package/apify-actor/.actor/actor.json +0 -68
  240. package/apify-actor/.actor/input_schema.json +0 -32
  241. package/apify-actor/APIFY-STORE-LISTING.md +0 -412
  242. package/apify-actor/Dockerfile +0 -8
  243. package/apify-actor/README.md +0 -166
  244. package/apify-actor/main.ts +0 -111
  245. package/apify-actor/package.json +0 -17
  246. package/apify-actor/src/main.js +0 -199
  247. package/docs/BRAND-IDENTITY.md +0 -238
  248. package/docs/BRAND-STYLE-GUIDE.md +0 -356
  249. package/drizzle/0000_black_king_cobra.sql +0 -39
  250. package/drizzle/meta/0000_snapshot.json +0 -309
  251. package/drizzle/meta/_journal.json +0 -13
  252. package/drizzle.config.ts +0 -10
  253. package/public/.well-known/ucp +0 -25
  254. package/public/android-chrome-192x192.png +0 -0
  255. package/public/android-chrome-512x512.png +0 -0
  256. package/public/apple-touch-icon.png +0 -0
  257. package/public/brand.css +0 -321
  258. package/public/directory.html +0 -701
  259. package/public/favicon-16x16.png +0 -0
  260. package/public/favicon-32x32.png +0 -0
  261. package/public/favicon.ico +0 -0
  262. package/public/guides/bigcommerce.html +0 -743
  263. package/public/guides/fastucp.html +0 -838
  264. package/public/guides/magento.html +0 -779
  265. package/public/guides/shopify.html +0 -726
  266. package/public/guides/squarespace.html +0 -749
  267. package/public/guides/wix.html +0 -747
  268. package/public/guides/woocommerce.html +0 -733
  269. package/public/index.html +0 -3835
  270. package/public/learn.html +0 -396
  271. package/public/logo.jpeg +0 -0
  272. package/public/og-image-icon.png +0 -0
  273. package/public/og-image.png +0 -0
  274. package/public/robots.txt +0 -6
  275. package/public/site.webmanifest +0 -31
  276. package/public/sitemap.xml +0 -69
  277. package/public/social/linkedin-banner-1128x191.png +0 -0
  278. package/public/social/temp.PNG +0 -0
  279. package/public/social/x-header-1500x500.png +0 -0
  280. package/public/verify.html +0 -410
  281. package/scripts/generate-favicons.js +0 -44
  282. package/scripts/generate-ico.js +0 -23
  283. package/scripts/generate-og-image.js +0 -45
  284. package/scripts/reset-db.ts +0 -77
  285. package/scripts/seed-db.ts +0 -71
  286. package/scripts/setup-benchmark-db.js +0 -70
  287. package/src/api/server.ts +0 -266
  288. package/src/cli/index.ts +0 -302
  289. package/src/compliance/compliance-generator.ts +0 -452
  290. package/src/compliance/index.ts +0 -28
  291. package/src/compliance/types.ts +0 -170
  292. package/src/db/index.ts +0 -28
  293. package/src/db/schema.ts +0 -84
  294. package/src/feed-analyzer/index.ts +0 -34
  295. package/src/feed-analyzer/types.ts +0 -354
  296. package/src/generator/key-generator.ts +0 -124
  297. package/src/generator/profile-builder.ts +0 -402
  298. package/src/index.ts +0 -105
  299. package/src/security/security-scanner.ts +0 -604
  300. package/src/security/types.ts +0 -55
  301. package/src/services/directory.ts +0 -434
  302. package/src/simulator/agent-simulator.ts +0 -941
  303. package/src/types/generator.ts +0 -140
  304. package/src/types/ucp-profile.ts +0 -140
  305. package/src/types/validation.ts +0 -89
  306. package/src/validator/index.ts +0 -194
  307. package/src/validator/network-validator.ts +0 -417
  308. package/src/validator/rules-validator.ts +0 -297
  309. package/src/validator/structural-validator.ts +0 -476
  310. package/tests/fixtures/non-compliant-profile.json +0 -25
  311. package/tests/fixtures/official-sample-profile.json +0 -75
  312. package/tests/integration/benchmark.test.ts +0 -207
  313. package/tests/integration/database.test.ts +0 -163
  314. package/tests/integration/directory-api.test.ts +0 -268
  315. package/tests/integration/simulate-api.test.ts +0 -230
  316. package/tests/integration/validate-api.test.ts +0 -269
  317. package/tests/setup.ts +0 -15
  318. package/tests/unit/agent-simulator.test.ts +0 -575
  319. package/tests/unit/compliance-generator.test.ts +0 -374
  320. package/tests/unit/directory-service.test.ts +0 -272
  321. package/tests/unit/feed-analyzer.test.ts +0 -517
  322. package/tests/unit/lint-suggestions.test.ts +0 -423
  323. package/tests/unit/official-samples.test.ts +0 -211
  324. package/tests/unit/pdf-report.test.ts +0 -390
  325. package/tests/unit/sdk-validator.test.ts +0 -531
  326. package/tests/unit/security-scanner.test.ts +0 -410
  327. package/tests/unit/validation.test.ts +0 -390
  328. package/tsconfig.json +0 -20
  329. package/vercel.json +0 -34
  330. package/vitest.config.ts +0 -22
@@ -0,0 +1,31 @@
1
+ /**
2
+ * ACP Readiness Checker
3
+ *
4
+ * Checks how ready a merchant's site is for the Agentic Commerce Protocol (ACP).
5
+ * Unlike UCP validation (which checks a specific /.well-known/ucp file), ACP readiness
6
+ * is assessed by analyzing the merchant's site for:
7
+ *
8
+ * 1. Platform (Shopify/Etsy = auto-eligible for ChatGPT Instant Checkout)
9
+ * 2. Payment infrastructure (Stripe detection = easier ACP integration via SPT)
10
+ * 3. Policy pages (required in ACP checkout session `links` array: terms, privacy, return)
11
+ * 4. Security (HTTPS with TLS 1.2+ required by ACP spec for all endpoints)
12
+ *
13
+ * Note: ACP is a server-to-server REST API (5 checkout endpoints + delegate_payment).
14
+ * We cannot validate the actual API without merchant credentials, so this checker
15
+ * assesses surface-level readiness signals from the merchant's public site.
16
+ *
17
+ * Note: ACP product data comes from merchant-submitted feeds (CSV/JSON),
18
+ * not crawled homepage markup. Product data scoring is handled by the Feed Analyzer.
19
+ *
20
+ * Based on ACP spec v2026-01-30:
21
+ * https://github.com/agentic-commerce-protocol/agentic-commerce-protocol
22
+ */
23
+ import type { AcpReadinessReport } from '../../types/acp-validation.js';
24
+ export interface AcpCheckOptions {
25
+ timeoutMs?: number;
26
+ }
27
+ /**
28
+ * Check a domain's ACP readiness
29
+ */
30
+ export declare function checkAcpReadiness(domain: string, options?: AcpCheckOptions): Promise<AcpReadinessReport>;
31
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/validator/acp/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,KAAK,EACV,kBAAkB,EAKnB,MAAM,+BAA+B,CAAC;AAEvC,MAAM,WAAW,eAAe;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,eAAoB,GAC5B,OAAO,CAAC,kBAAkB,CAAC,CAyK7B"}
@@ -0,0 +1,574 @@
1
+ "use strict";
2
+ /**
3
+ * ACP Readiness Checker
4
+ *
5
+ * Checks how ready a merchant's site is for the Agentic Commerce Protocol (ACP).
6
+ * Unlike UCP validation (which checks a specific /.well-known/ucp file), ACP readiness
7
+ * is assessed by analyzing the merchant's site for:
8
+ *
9
+ * 1. Platform (Shopify/Etsy = auto-eligible for ChatGPT Instant Checkout)
10
+ * 2. Payment infrastructure (Stripe detection = easier ACP integration via SPT)
11
+ * 3. Policy pages (required in ACP checkout session `links` array: terms, privacy, return)
12
+ * 4. Security (HTTPS with TLS 1.2+ required by ACP spec for all endpoints)
13
+ *
14
+ * Note: ACP is a server-to-server REST API (5 checkout endpoints + delegate_payment).
15
+ * We cannot validate the actual API without merchant credentials, so this checker
16
+ * assesses surface-level readiness signals from the merchant's public site.
17
+ *
18
+ * Note: ACP product data comes from merchant-submitted feeds (CSV/JSON),
19
+ * not crawled homepage markup. Product data scoring is handled by the Feed Analyzer.
20
+ *
21
+ * Based on ACP spec v2026-01-30:
22
+ * https://github.com/agentic-commerce-protocol/agentic-commerce-protocol
23
+ */
24
+ Object.defineProperty(exports, "__esModule", { value: true });
25
+ exports.checkAcpReadiness = checkAcpReadiness;
26
+ /**
27
+ * Check a domain's ACP readiness
28
+ */
29
+ async function checkAcpReadiness(domain, options = {}) {
30
+ const timeoutMs = options.timeoutMs || 15000;
31
+ const findings = [];
32
+ let platformDetected = null;
33
+ let stripeDetected = false;
34
+ // Fetch the homepage
35
+ let html = '';
36
+ let statusCode = 0;
37
+ let isHttps = false;
38
+ let fetchError = null;
39
+ try {
40
+ const controller = new AbortController();
41
+ const timer = setTimeout(() => controller.abort(), timeoutMs);
42
+ const url = `https://${domain}`;
43
+ const response = await fetch(url, {
44
+ signal: controller.signal,
45
+ headers: {
46
+ 'User-Agent': 'UCPtools-ACP-Checker/1.0 (https://ucptools.dev)',
47
+ 'Accept': 'text/html,application/xhtml+xml',
48
+ },
49
+ redirect: 'follow',
50
+ });
51
+ clearTimeout(timer);
52
+ statusCode = response.status;
53
+ isHttps = response.url.startsWith('https://');
54
+ html = await response.text();
55
+ }
56
+ catch (error) {
57
+ if (error.name === 'AbortError') {
58
+ fetchError = 'timeout';
59
+ findings.push({
60
+ severity: 'error',
61
+ code: 'ACP_SITE_TIMEOUT',
62
+ category: 'security',
63
+ message: `Site did not respond within ${timeoutMs / 1000}s`,
64
+ hint: 'Ensure your server responds quickly — ACP checkout sessions require low-latency responses',
65
+ });
66
+ }
67
+ else {
68
+ fetchError = error.message || 'unreachable';
69
+ findings.push({
70
+ severity: 'error',
71
+ code: 'ACP_SITE_UNREACHABLE',
72
+ category: 'security',
73
+ message: `Could not reach ${domain} over HTTPS`,
74
+ hint: 'ACP requires HTTPS with TLS 1.2+. Ensure your site is accessible via https://',
75
+ });
76
+ }
77
+ }
78
+ if (!fetchError) {
79
+ // === HTTPS Check ===
80
+ if (isHttps) {
81
+ findings.push({
82
+ severity: 'info',
83
+ code: 'ACP_HTTPS_OK',
84
+ category: 'security',
85
+ message: 'Site is served over HTTPS',
86
+ });
87
+ }
88
+ else {
89
+ findings.push({
90
+ severity: 'error',
91
+ code: 'ACP_HTTPS_MISSING',
92
+ category: 'security',
93
+ message: 'Site is not served over HTTPS',
94
+ hint: 'ACP spec requires all endpoints use HTTPS with TLS 1.2+',
95
+ });
96
+ }
97
+ // === Platform Detection ===
98
+ platformDetected = detectPlatform(html);
99
+ if (platformDetected === 'shopify') {
100
+ findings.push({
101
+ severity: 'info',
102
+ code: 'ACP_PLATFORM_SHOPIFY',
103
+ category: 'platform',
104
+ message: 'Shopify platform detected — auto-eligible for ChatGPT Instant Checkout',
105
+ hint: 'Shopify merchants can enable Instant Checkout through the Shopify admin — no custom ACP integration needed',
106
+ });
107
+ }
108
+ else if (platformDetected === 'etsy') {
109
+ findings.push({
110
+ severity: 'info',
111
+ code: 'ACP_PLATFORM_ETSY',
112
+ category: 'platform',
113
+ message: 'Etsy platform detected — already integrated with ChatGPT Instant Checkout',
114
+ });
115
+ }
116
+ else if (platformDetected) {
117
+ findings.push({
118
+ severity: 'info',
119
+ code: 'ACP_PLATFORM_OTHER',
120
+ category: 'platform',
121
+ message: `${platformDetected} platform detected — custom ACP integration required`,
122
+ hint: 'You\'ll need to implement the Agentic Checkout API endpoints and submit a merchant application at chatgpt.com/merchants',
123
+ });
124
+ }
125
+ else {
126
+ findings.push({
127
+ severity: 'info',
128
+ code: 'ACP_PLATFORM_UNKNOWN',
129
+ category: 'platform',
130
+ message: 'Platform not detected — custom ACP integration required',
131
+ hint: 'Implement the Agentic Checkout API (5 REST endpoints) and apply at chatgpt.com/merchants',
132
+ });
133
+ }
134
+ // === Stripe Detection ===
135
+ stripeDetected = detectStripe(html);
136
+ if (stripeDetected) {
137
+ findings.push({
138
+ severity: 'info',
139
+ code: 'ACP_STRIPE_DETECTED',
140
+ category: 'payment',
141
+ message: 'Stripe payment infrastructure detected',
142
+ hint: 'Stripe is the first PSP with ACP Delegated Payment support — you can enable agentic payments with minimal code changes',
143
+ });
144
+ }
145
+ else {
146
+ findings.push({
147
+ severity: 'warn',
148
+ code: 'ACP_STRIPE_NOT_DETECTED',
149
+ category: 'payment',
150
+ message: 'Stripe not detected on this page',
151
+ hint: 'ACP works with any PSP that implements the Delegated Payment spec — Stripe and PayPal are current partners, but Stripe\'s SPT is the easiest path',
152
+ });
153
+ }
154
+ // === Policy Pages ===
155
+ const policies = analyzePolicies(html, domain);
156
+ findings.push(...policies);
157
+ // === Checkout Readiness ===
158
+ const checkout = analyzeCheckoutReadiness(html);
159
+ findings.push(...checkout);
160
+ // === No Commerce Signals Detection ===
161
+ const hasAnyCommerceSignal = platformDetected || stripeDetected ||
162
+ findings.some(f => f.code === 'ACP_CHECKOUT_FORM_FOUND') ||
163
+ findings.some(f => ['ACP_TERMS_FOUND', 'ACP_PRIVACY_FOUND', 'ACP_RETURN_FOUND'].includes(f.code));
164
+ if (!hasAnyCommerceSignal) {
165
+ findings.push({
166
+ severity: 'info',
167
+ code: 'ACP_NO_COMMERCE_SIGNALS',
168
+ category: 'platform',
169
+ message: 'No e-commerce signals detected on this site',
170
+ hint: 'ACP readiness checks are designed for e-commerce sites with checkout functionality',
171
+ });
172
+ }
173
+ }
174
+ // Calculate scores
175
+ const scoreBreakdown = calculateScores(findings, platformDetected, stripeDetected);
176
+ const grade = calculateGrade(scoreBreakdown.total);
177
+ const label = getLabel(grade);
178
+ const recommendations = generateRecommendations(findings, platformDetected, stripeDetected);
179
+ return {
180
+ ok: scoreBreakdown.total >= 40,
181
+ domain,
182
+ score: scoreBreakdown.total,
183
+ grade,
184
+ label,
185
+ score_breakdown: scoreBreakdown,
186
+ findings,
187
+ platform_detected: platformDetected,
188
+ stripe_detected: stripeDetected,
189
+ checked_at: new Date().toISOString(),
190
+ recommendations,
191
+ };
192
+ }
193
+ // --- Detection Helpers ---
194
+ function detectPlatform(html) {
195
+ const lower = html.toLowerCase();
196
+ // Require 2+ corroborating structural signals per platform.
197
+ // Single mentions in content text (guides, comparisons) must NOT trigger detection.
198
+ // Shopify: CDN, template markers, JS globals
199
+ const shopifySignals = [
200
+ lower.includes('cdn.shopify.com'),
201
+ lower.includes('myshopify.com'),
202
+ /Shopify\.theme/i.test(html),
203
+ lower.includes('shopify-section'),
204
+ /Shopify\.shop\s*=/i.test(html),
205
+ ];
206
+ if (shopifySignals.filter(Boolean).length >= 2)
207
+ return 'shopify';
208
+ // Etsy: CDN + listing/shop URLs
209
+ const etsySignals = [
210
+ lower.includes('etsystatic.com'),
211
+ lower.includes('etsy.me'),
212
+ /etsy\.com\/listing/i.test(html),
213
+ /etsy\.com\/shop/i.test(html),
214
+ ];
215
+ if (etsySignals.filter(Boolean).length >= 2)
216
+ return 'etsy';
217
+ // WooCommerce: plugin paths, WC CSS classes, REST API
218
+ const wooSignals = [
219
+ lower.includes('wp-content/plugins/woocommerce'),
220
+ lower.includes('wc-block-'),
221
+ /class="[^"]*woocommerce[^"]*"/i.test(html),
222
+ lower.includes('wc_ajax'),
223
+ lower.includes('wp-json/wc/'),
224
+ ];
225
+ if (wooSignals.filter(Boolean).length >= 2)
226
+ return 'WooCommerce';
227
+ // BigCommerce: CDN + structural markers
228
+ const bigcommerceSignals = [
229
+ lower.includes('cdn11.bigcommerce.com'),
230
+ lower.includes('bigcommerce.com/s-'),
231
+ /data-content-region/i.test(html),
232
+ ];
233
+ if (bigcommerceSignals.filter(Boolean).length >= 2)
234
+ return 'BigCommerce';
235
+ // Magento: framework-specific markers
236
+ const magentoSignals = [
237
+ lower.includes('mage-init'),
238
+ lower.includes('requirejs/require'),
239
+ lower.includes('/static/version'),
240
+ lower.includes('catalog/product/view'),
241
+ ];
242
+ if (magentoSignals.filter(Boolean).length >= 2)
243
+ return 'Magento';
244
+ // Squarespace: CDN domains + structural CSS
245
+ const squarespaceSignals = [
246
+ lower.includes('static1.squarespace.com'),
247
+ lower.includes('squarespace-cdn.com'),
248
+ /class="[^"]*sqs-block[^"]*"/i.test(html),
249
+ ];
250
+ if (squarespaceSignals.filter(Boolean).length >= 2)
251
+ return 'Squarespace';
252
+ // Wix: CDN domains + SDK
253
+ const wixSignals = [
254
+ lower.includes('parastorage.com'),
255
+ lower.includes('wixsite.com'),
256
+ lower.includes('static.wixstatic.com'),
257
+ lower.includes('wix-code-sdk'),
258
+ ];
259
+ if (wixSignals.filter(Boolean).length >= 2)
260
+ return 'Wix';
261
+ return null;
262
+ }
263
+ function detectStripe(html) {
264
+ // Only match actual Stripe.js integration signals, not generic CSS classes
265
+ if (html.includes('js.stripe.com'))
266
+ return true;
267
+ if (html.includes('Stripe(') && html.includes('data-stripe'))
268
+ return true;
269
+ if (html.includes('stripe-payment-element') || html.includes('stripe-card-element'))
270
+ return true;
271
+ return false;
272
+ }
273
+ function analyzePolicies(html, _domain) {
274
+ const findings = [];
275
+ const lower = html.toLowerCase();
276
+ // ACP spec requires links array with terms_of_use, privacy_policy, return_policy
277
+ // Anchor href patterns to terminal path segments to avoid false positives
278
+ const termsPatterns = [
279
+ /terms[- ]of[- ](use|service)/i,
280
+ /terms[- ]and[- ]conditions/i,
281
+ /href=["'][^"']*\/(terms-of-(use|service)|terms-and-conditions|tos)\/?["']/i,
282
+ /href=["'][^"']*\/terms\/?["']/i,
283
+ ];
284
+ const hasTOS = termsPatterns.some(p => p.test(html));
285
+ if (hasTOS) {
286
+ findings.push({
287
+ severity: 'info',
288
+ code: 'ACP_TERMS_FOUND',
289
+ category: 'policies',
290
+ message: 'Terms of Use/Service page detected',
291
+ });
292
+ }
293
+ else {
294
+ findings.push({
295
+ severity: 'warn',
296
+ code: 'ACP_TERMS_MISSING',
297
+ category: 'policies',
298
+ message: 'No Terms of Use/Service link found',
299
+ hint: 'ACP checkout sessions require a "terms_of_use" link in the response — ensure you have a terms page',
300
+ });
301
+ }
302
+ const privacyPatterns = [
303
+ /privacy[- ]policy/i,
304
+ /href=["'][^"']*\/(privacy-policy|privacy)\/?["']/i,
305
+ ];
306
+ const hasPrivacy = privacyPatterns.some(p => p.test(html));
307
+ if (hasPrivacy) {
308
+ findings.push({
309
+ severity: 'info',
310
+ code: 'ACP_PRIVACY_FOUND',
311
+ category: 'policies',
312
+ message: 'Privacy Policy page detected',
313
+ });
314
+ }
315
+ else {
316
+ findings.push({
317
+ severity: 'warn',
318
+ code: 'ACP_PRIVACY_MISSING',
319
+ category: 'policies',
320
+ message: 'No Privacy Policy link found',
321
+ hint: 'ACP checkout sessions include a "privacy_policy" link — ensure you have a privacy policy page',
322
+ });
323
+ }
324
+ const returnPatterns = [
325
+ /return[- ]policy/i,
326
+ /refund[- ]policy/i,
327
+ /returns[- ](&|and)[- ]exchanges/i,
328
+ /href=["'][^"']*\/(return-policy|refund-policy|returns|refunds)\/?["']/i,
329
+ ];
330
+ const hasReturn = returnPatterns.some(p => p.test(html));
331
+ if (hasReturn) {
332
+ findings.push({
333
+ severity: 'info',
334
+ code: 'ACP_RETURN_FOUND',
335
+ category: 'policies',
336
+ message: 'Return/Refund Policy page detected',
337
+ });
338
+ }
339
+ else {
340
+ findings.push({
341
+ severity: 'warn',
342
+ code: 'ACP_RETURN_MISSING',
343
+ category: 'policies',
344
+ message: 'No Return/Refund Policy link found',
345
+ hint: 'ACP checkout sessions include a "return_policy" link — ensure you have a return policy page',
346
+ });
347
+ }
348
+ return findings;
349
+ }
350
+ function analyzeCheckoutReadiness(html) {
351
+ const findings = [];
352
+ const lower = html.toLowerCase();
353
+ // Require structural HTML signals (attributes, form actions, platform-specific classes)
354
+ // NOT content text that merely mentions checkout/cart
355
+ const hasCheckout = /class="[^"]*add[_-]to[_-]cart[^"]*"/i.test(html) ||
356
+ /id="[^"]*add[_-]to[_-]cart[^"]*"/i.test(html) ||
357
+ /name="add_to_cart"/i.test(html) ||
358
+ lower.includes('action="/cart') ||
359
+ lower.includes('action="/checkout') ||
360
+ /data-action="[^"]*add[_-]to[_-]cart[^"]*"/i.test(html) ||
361
+ lower.includes('wc-block-cart') ||
362
+ lower.includes('shopify-buy-button');
363
+ if (hasCheckout) {
364
+ findings.push({
365
+ severity: 'info',
366
+ code: 'ACP_CHECKOUT_FORM_FOUND',
367
+ category: 'checkout',
368
+ message: 'E-commerce checkout functionality detected',
369
+ hint: 'Your site has checkout capabilities — the ACP Agentic Checkout Spec defines 5 REST endpoints you need to implement',
370
+ });
371
+ }
372
+ else {
373
+ findings.push({
374
+ severity: 'warn',
375
+ code: 'ACP_CHECKOUT_FORM_MISSING',
376
+ category: 'checkout',
377
+ message: 'No checkout functionality detected on homepage',
378
+ hint: 'ACP requires checkout endpoints (POST /checkout_sessions, etc.) — ensure your site has e-commerce functionality',
379
+ });
380
+ }
381
+ return findings;
382
+ }
383
+ // --- Scoring ---
384
+ function calculateScores(findings, platform, stripe) {
385
+ // Security: always calculated first (needed for early return)
386
+ let securityScore = 0;
387
+ let securityStatus = 'Issues';
388
+ let securityDetails = 'Security issues detected';
389
+ const hasHttps = findings.some(f => f.code === 'ACP_HTTPS_OK');
390
+ const isUnreachable = findings.some(f => f.code === 'ACP_SITE_UNREACHABLE' || f.code === 'ACP_SITE_TIMEOUT');
391
+ if (hasHttps) {
392
+ securityScore = 20;
393
+ securityStatus = 'OK';
394
+ securityDetails = 'HTTPS enabled with TLS';
395
+ }
396
+ else if (isUnreachable) {
397
+ securityStatus = 'Unreachable';
398
+ securityDetails = 'Site could not be reached';
399
+ }
400
+ // Check for policies (needed for no-commerce-signals check)
401
+ const hasTOS = findings.some(f => f.code === 'ACP_TERMS_FOUND');
402
+ const hasPrivacy = findings.some(f => f.code === 'ACP_PRIVACY_FOUND');
403
+ const hasReturn = findings.some(f => f.code === 'ACP_RETURN_FOUND');
404
+ const foundPolicies = [hasTOS, hasPrivacy, hasReturn].filter(Boolean).length;
405
+ // If no commerce signals at all, cap score to security only
406
+ const hasCheckoutSignal = findings.some(f => f.code === 'ACP_CHECKOUT_FORM_FOUND');
407
+ if (!platform && !stripe && !hasCheckoutSignal && foundPolicies === 0) {
408
+ return {
409
+ platform: { score: 0, maxScore: 25, status: 'Not detected', details: 'No e-commerce platform detected' },
410
+ payment: { score: 0, maxScore: 30, status: 'Not detected', details: 'No payment infrastructure detected' },
411
+ policies: { score: 0, maxScore: 25, status: 'Missing', details: 'No policy pages found' },
412
+ security: { score: securityScore, maxScore: 20, status: securityStatus, details: securityDetails },
413
+ total: securityScore,
414
+ maxTotal: 100,
415
+ };
416
+ }
417
+ // Platform: 0-25 points
418
+ let platformScore = 0;
419
+ let platformStatus = 'Not detected';
420
+ let platformDetails = 'Unknown platform — custom ACP integration required';
421
+ if (platform === 'shopify') {
422
+ platformScore = 25;
423
+ platformStatus = 'Auto-eligible';
424
+ platformDetails = 'Shopify — auto-eligible for ChatGPT Instant Checkout';
425
+ }
426
+ else if (platform === 'etsy') {
427
+ platformScore = 25;
428
+ platformStatus = 'Integrated';
429
+ platformDetails = 'Etsy — already integrated with ChatGPT';
430
+ }
431
+ else if (platform) {
432
+ platformScore = 12;
433
+ platformStatus = 'Detected';
434
+ platformDetails = `${platform} — custom ACP integration needed`;
435
+ }
436
+ // Payment: 0-30 points
437
+ let paymentScore = 0;
438
+ let paymentStatus = 'Not detected';
439
+ let paymentDetails = 'No Stripe integration detected';
440
+ if (stripe) {
441
+ paymentScore = 30;
442
+ paymentStatus = 'Ready';
443
+ paymentDetails = 'Stripe detected — Shared Payment Token ready';
444
+ }
445
+ else if (platform === 'shopify' || platform === 'etsy') {
446
+ // Shopify/Etsy handle payment through their platform
447
+ paymentScore = 24;
448
+ paymentStatus = 'Platform-managed';
449
+ paymentDetails = 'Payment handled by platform';
450
+ }
451
+ // Policies: 0-25 points (hasTOS, hasPrivacy, hasReturn, foundPolicies already computed above)
452
+ let policyScore = 0;
453
+ let policyStatus = 'Missing';
454
+ let policyDetails = 'No policy pages found';
455
+ policyScore = foundPolicies * 8;
456
+ if (foundPolicies === 3) {
457
+ policyScore = 25; // Bonus point for having all three
458
+ policyStatus = 'Complete';
459
+ policyDetails = 'Terms, privacy, and return policies found';
460
+ }
461
+ else if (foundPolicies > 0) {
462
+ policyStatus = 'Partial';
463
+ const missing = [];
464
+ if (!hasTOS)
465
+ missing.push('terms');
466
+ if (!hasPrivacy)
467
+ missing.push('privacy');
468
+ if (!hasReturn)
469
+ missing.push('return');
470
+ policyDetails = `Missing: ${missing.join(', ')} policy`;
471
+ }
472
+ // Security: already computed above (securityScore, securityStatus, securityDetails)
473
+ const total = platformScore + paymentScore + policyScore + securityScore;
474
+ return {
475
+ platform: { score: platformScore, maxScore: 25, status: platformStatus, details: platformDetails },
476
+ payment: { score: paymentScore, maxScore: 30, status: paymentStatus, details: paymentDetails },
477
+ policies: { score: policyScore, maxScore: 25, status: policyStatus, details: policyDetails },
478
+ security: { score: securityScore, maxScore: 20, status: securityStatus, details: securityDetails },
479
+ total,
480
+ maxTotal: 100,
481
+ };
482
+ }
483
+ function calculateGrade(score) {
484
+ if (score >= 80)
485
+ return 'A';
486
+ if (score >= 60)
487
+ return 'B';
488
+ if (score >= 40)
489
+ return 'C';
490
+ if (score >= 20)
491
+ return 'D';
492
+ return 'F';
493
+ }
494
+ function getLabel(grade) {
495
+ switch (grade) {
496
+ case 'A': return 'ACP Ready';
497
+ case 'B': return 'Mostly Ready';
498
+ case 'C': return 'Partially Ready';
499
+ case 'D': return 'Significant Gaps';
500
+ case 'F': return 'Not Ready';
501
+ }
502
+ }
503
+ function generateRecommendations(findings, platform, stripe) {
504
+ // Short-circuit for non-commerce sites
505
+ const hasAnyCommerceSignal = findings.some(f => ['ACP_PLATFORM_SHOPIFY', 'ACP_PLATFORM_ETSY', 'ACP_PLATFORM_OTHER',
506
+ 'ACP_STRIPE_DETECTED', 'ACP_CHECKOUT_FORM_FOUND'].includes(f.code));
507
+ if (!hasAnyCommerceSignal) {
508
+ return [{
509
+ priority: 'low',
510
+ title: 'Not an e-commerce site',
511
+ description: 'No e-commerce platform, payment processor, or checkout functionality was detected.',
512
+ action: 'ACP readiness is designed for online stores. If this is a store, ensure your homepage includes platform-specific markup.',
513
+ }];
514
+ }
515
+ const recs = [];
516
+ // Platform-specific recommendations
517
+ if (platform === 'shopify') {
518
+ recs.push({
519
+ priority: 'high',
520
+ title: 'Enable ChatGPT Instant Checkout in Shopify',
521
+ description: 'As a Shopify merchant, you\'re auto-eligible for ChatGPT Instant Checkout. Enable it through your Shopify admin panel.',
522
+ action: 'Go to Shopify Admin → Sales Channels to enable ChatGPT integration',
523
+ link: 'https://chatgpt.com/merchants/',
524
+ });
525
+ }
526
+ else if (platform !== 'etsy') {
527
+ recs.push({
528
+ priority: 'critical',
529
+ title: 'Apply for ChatGPT Instant Checkout',
530
+ description: 'Non-platform merchants need to submit a merchant application to OpenAI and implement the Agentic Checkout API.',
531
+ action: 'Apply at chatgpt.com/merchants and implement the 5 ACP checkout endpoints',
532
+ link: 'https://chatgpt.com/merchants/',
533
+ });
534
+ }
535
+ // Payment recommendations
536
+ if (!stripe && platform !== 'shopify' && platform !== 'etsy') {
537
+ recs.push({
538
+ priority: 'high',
539
+ title: 'Set up Stripe for delegated payments',
540
+ description: 'Stripe\'s Shared Payment Token is the first implementation of the ACP Delegated Payment spec. Merchants already on Stripe can enable agentic payments with minimal code.',
541
+ action: 'Set up Stripe Connect and enable operator payment delegation',
542
+ link: 'https://docs.stripe.com/agentic-commerce',
543
+ });
544
+ }
545
+ // Product feed recommendation (ACP uses merchant-submitted feeds, not crawled data)
546
+ recs.push({
547
+ priority: 'medium',
548
+ title: 'Prepare your product feed',
549
+ description: 'ChatGPT uses merchant-submitted product feeds (CSV/JSON) — not crawled website data. Submit your feed through chatgpt.com/merchants.',
550
+ action: 'Prepare a product feed with titles, prices, images, and availability, then submit via the merchant portal',
551
+ link: 'https://developers.openai.com/commerce/guides/get-started/',
552
+ });
553
+ // Policy recommendations
554
+ const missingPolicies = findings.filter(f => f.category === 'policies' && f.severity === 'warn');
555
+ if (missingPolicies.length > 0) {
556
+ recs.push({
557
+ priority: 'medium',
558
+ title: 'Add missing policy pages',
559
+ description: 'ACP checkout responses must include links to terms of use, privacy policy, and return policy.',
560
+ action: `Create and link the missing policy page(s): ${missingPolicies.map(f => f.code.replace('ACP_', '').replace('_MISSING', '')).join(', ').toLowerCase()}`,
561
+ });
562
+ }
563
+ // HTTPS recommendation
564
+ if (findings.some(f => f.code === 'ACP_HTTPS_MISSING')) {
565
+ recs.push({
566
+ priority: 'critical',
567
+ title: 'Enable HTTPS',
568
+ description: 'ACP requires all endpoints to use HTTPS with TLS 1.2 or higher. Your site is not accessible via HTTPS.',
569
+ action: 'Install an SSL certificate and redirect all HTTP traffic to HTTPS',
570
+ });
571
+ }
572
+ return recs;
573
+ }
574
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/validator/acp/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * UCP Profile Validator
3
+ * Main entry point combining structural, rules, and network validation
4
+ */
5
+ import type { ValidationReport, ValidationOptions } from '../types/validation.js';
6
+ export { validateStructure } from './structural-validator.js';
7
+ export { validateRules } from './rules-validator.js';
8
+ export { validateNetwork, validateRemoteProfile, clearSchemaCache } from './network-validator.js';
9
+ export { safeValidateWithSdk, validateWithSdk, getSdkVersion, isSdkCompliant, validateServiceWithSdk, validateCapabilityWithSdk, validateSigningKeysWithSdk, } from './sdk-validator.js';
10
+ /**
11
+ * Validate a UCP profile (local JSON)
12
+ */
13
+ export declare function validateProfile(profile: unknown, options?: ValidationOptions): Promise<ValidationReport>;
14
+ /**
15
+ * Validate a remote UCP profile (fetches from domain)
16
+ */
17
+ export declare function validateRemote(domain: string, options?: ValidationOptions): Promise<ValidationReport>;
18
+ /**
19
+ * Quick validation (structural + rules only, no network)
20
+ */
21
+ export declare function validateQuick(profile: unknown): ValidationReport;
22
+ /**
23
+ * Parse and validate JSON string
24
+ */
25
+ export declare function validateJsonString(json: string, options?: ValidationOptions): Promise<ValidationReport>;
26
+ //# sourceMappingURL=index.d.ts.map