@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,261 @@
1
+ "use strict";
2
+ /**
3
+ * UCP Mock Server
4
+ * Serves a valid UCP profile and mock endpoints for local development and testing.
5
+ * Usage: ucp-validate mock [--port 3001] [--config ./ucp-mock.json]
6
+ */
7
+ var __importDefault = (this && this.__importDefault) || function (mod) {
8
+ return (mod && mod.__esModule) ? mod : { "default": mod };
9
+ };
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.loadConfig = loadConfig;
12
+ exports.startMockServer = startMockServer;
13
+ const express_1 = __importDefault(require("express"));
14
+ const fs_1 = require("fs");
15
+ const path_1 = require("path");
16
+ const nanoid_1 = require("nanoid");
17
+ // Colors for terminal output
18
+ const colors = {
19
+ red: (s) => `\x1b[31m${s}\x1b[0m`,
20
+ green: (s) => `\x1b[32m${s}\x1b[0m`,
21
+ yellow: (s) => `\x1b[33m${s}\x1b[0m`,
22
+ blue: (s) => `\x1b[34m${s}\x1b[0m`,
23
+ gray: (s) => `\x1b[90m${s}\x1b[0m`,
24
+ bold: (s) => `\x1b[1m${s}\x1b[0m`,
25
+ cyan: (s) => `\x1b[36m${s}\x1b[0m`,
26
+ };
27
+ const DEFAULT_CONFIG = {
28
+ port: 3001,
29
+ merchant: {
30
+ name: 'UCP Demo Store',
31
+ domain: 'localhost',
32
+ description: 'A demo UCP merchant for development and testing',
33
+ email: 'demo@ucptools.dev',
34
+ },
35
+ capabilities: ['checkout', 'order'],
36
+ products: 10,
37
+ latencyMs: 0,
38
+ };
39
+ const SAMPLE_PRODUCTS = [
40
+ { id: 'prod_001', title: 'AI Commerce T-Shirt', description: 'Show your support for agentic commerce', price: 2500, currency: 'USD', image_url: 'https://placehold.co/400x400?text=T-Shirt', in_stock: true, sku: 'TSHIRT-001' },
41
+ { id: 'prod_002', title: 'UCP Developer Mug', description: 'Fuel your protocol work', price: 1500, currency: 'USD', image_url: 'https://placehold.co/400x400?text=Mug', in_stock: true, sku: 'MUG-001' },
42
+ { id: 'prod_003', title: 'Checkout Flow Hoodie', description: 'Warm and compliant', price: 5500, currency: 'USD', image_url: 'https://placehold.co/400x400?text=Hoodie', in_stock: true, sku: 'HOODIE-001' },
43
+ { id: 'prod_004', title: 'Agent Readiness Sticker Pack', description: '10 stickers for your laptop', price: 800, currency: 'USD', image_url: 'https://placehold.co/400x400?text=Stickers', in_stock: true, sku: 'STICKER-001' },
44
+ { id: 'prod_005', title: 'Protocol Spec Notebook', description: 'For drafting your next integration', price: 1200, currency: 'USD', image_url: 'https://placehold.co/400x400?text=Notebook', in_stock: true, sku: 'NOTEBOOK-001' },
45
+ { id: 'prod_006', title: 'Webhook Handler Hat', description: 'Stay signed and verified', price: 2000, currency: 'USD', image_url: 'https://placehold.co/400x400?text=Hat', in_stock: true, sku: 'HAT-001' },
46
+ { id: 'prod_007', title: 'Discovery Profile Poster', description: 'UCP architecture wall art', price: 3000, currency: 'USD', image_url: 'https://placehold.co/400x400?text=Poster', in_stock: false, sku: 'POSTER-001' },
47
+ { id: 'prod_008', title: 'JSON Schema Coaster Set', description: 'Validate your drinks', price: 900, currency: 'USD', image_url: 'https://placehold.co/400x400?text=Coasters', in_stock: true, sku: 'COASTER-001' },
48
+ { id: 'prod_009', title: 'Payment Handler Keychain', description: 'Stripe, Google Pay, Apple Pay', price: 600, currency: 'USD', image_url: 'https://placehold.co/400x400?text=Keychain', in_stock: true, sku: 'KEYCHAIN-001' },
49
+ { id: 'prod_010', title: 'UCP Compliance Certificate Frame', description: 'Display your A grade', price: 4500, currency: 'USD', image_url: 'https://placehold.co/400x400?text=Frame', in_stock: true, sku: 'FRAME-001' },
50
+ ];
51
+ function loadConfig(configPath) {
52
+ if (configPath) {
53
+ const fullPath = (0, path_1.resolve)(configPath);
54
+ if (!(0, fs_1.existsSync)(fullPath)) {
55
+ console.error(colors.red(`Config file not found: ${fullPath}`));
56
+ process.exit(1);
57
+ }
58
+ const raw = JSON.parse((0, fs_1.readFileSync)(fullPath, 'utf-8'));
59
+ return { ...DEFAULT_CONFIG, ...raw, merchant: { ...DEFAULT_CONFIG.merchant, ...raw.merchant } };
60
+ }
61
+ return DEFAULT_CONFIG;
62
+ }
63
+ function startMockServer(config) {
64
+ const app = (0, express_1.default)();
65
+ app.use(express_1.default.json());
66
+ const sessions = new Map();
67
+ const products = SAMPLE_PRODUCTS.slice(0, config.products);
68
+ const baseUrl = `http://localhost:${config.port}`;
69
+ // Latency middleware
70
+ if (config.latencyMs > 0) {
71
+ app.use((_req, _res, next) => {
72
+ setTimeout(next, config.latencyMs);
73
+ });
74
+ }
75
+ // Request logging
76
+ app.use((req, _res, next) => {
77
+ const timestamp = new Date().toISOString().slice(11, 19);
78
+ console.log(colors.gray(`[${timestamp}]`) + ` ${colors.cyan(req.method)} ${req.path}`);
79
+ next();
80
+ });
81
+ // CORS
82
+ app.use((_req, res, next) => {
83
+ res.header('Access-Control-Allow-Origin', '*');
84
+ res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization');
85
+ res.header('Access-Control-Allow-Methods', 'GET, POST, PUT, PATCH, DELETE, OPTIONS');
86
+ next();
87
+ });
88
+ // ── UCP Discovery Profile ────────────────────────────────────
89
+ app.get('/.well-known/ucp', (_req, res) => {
90
+ const profile = {
91
+ ucp: {
92
+ version: '2026-01-11',
93
+ services: {
94
+ 'dev.ucp.shopping': {
95
+ version: '2026-01-11',
96
+ spec: 'https://ucp.dev/specification/overview/',
97
+ rest: {
98
+ schema: 'https://ucp.dev/services/shopping/rest.openapi.json',
99
+ endpoint: baseUrl,
100
+ },
101
+ },
102
+ },
103
+ capabilities: buildCapabilities(config.capabilities),
104
+ },
105
+ };
106
+ if (config.capabilities.includes('order')) {
107
+ profile.signing_keys = [
108
+ {
109
+ kty: 'EC',
110
+ kid: 'mock-webhook-key-1',
111
+ use: 'sig',
112
+ alg: 'ES256',
113
+ crv: 'P-256',
114
+ x: 'mock_x_coordinate_base64url',
115
+ y: 'mock_y_coordinate_base64url',
116
+ },
117
+ ];
118
+ }
119
+ res.json(profile);
120
+ });
121
+ // ── Products ─────────────────────────────────────────────────
122
+ app.get('/products', (_req, res) => {
123
+ res.json({ products, total: products.length });
124
+ });
125
+ app.get('/products/:id', (req, res) => {
126
+ const product = products.find(p => p.id === req.params.id);
127
+ if (!product)
128
+ return res.status(404).json({ error: 'Product not found' });
129
+ res.json(product);
130
+ });
131
+ // ── Checkout Sessions ────────────────────────────────────────
132
+ app.post('/checkout-sessions', (req, res) => {
133
+ const { items } = req.body || {};
134
+ const sessionItems = (items || [{ product_id: 'prod_001', quantity: 1 }]).map((item) => {
135
+ const product = products.find(p => p.id === item.product_id);
136
+ return {
137
+ product_id: item.product_id,
138
+ quantity: item.quantity || 1,
139
+ price: product?.price || 0,
140
+ };
141
+ });
142
+ const session = {
143
+ id: `cs_${(0, nanoid_1.nanoid)(12)}`,
144
+ status: 'open',
145
+ items: sessionItems,
146
+ total: sessionItems.reduce((sum, i) => sum + i.price * i.quantity, 0),
147
+ currency: 'USD',
148
+ created_at: new Date().toISOString(),
149
+ updated_at: new Date().toISOString(),
150
+ };
151
+ sessions.set(session.id, session);
152
+ res.status(201).json(session);
153
+ });
154
+ app.get('/checkout-sessions/:id', (req, res) => {
155
+ const session = sessions.get(req.params.id);
156
+ if (!session)
157
+ return res.status(404).json({ error: 'Session not found' });
158
+ res.json(session);
159
+ });
160
+ app.post('/checkout-sessions/:id/complete', (req, res) => {
161
+ const session = sessions.get(req.params.id);
162
+ if (!session)
163
+ return res.status(404).json({ error: 'Session not found' });
164
+ if (session.status !== 'open')
165
+ return res.status(400).json({ error: 'Session is not open' });
166
+ session.status = 'complete';
167
+ session.updated_at = new Date().toISOString();
168
+ res.json({
169
+ ...session,
170
+ order_id: `ord_${(0, nanoid_1.nanoid)(12)}`,
171
+ payment_status: 'paid',
172
+ });
173
+ });
174
+ // ── Orders (if enabled) ──────────────────────────────────────
175
+ if (config.capabilities.includes('order')) {
176
+ app.get('/orders/:id', (req, res) => {
177
+ res.json({
178
+ id: req.params.id,
179
+ status: 'confirmed',
180
+ items: [{ product_id: 'prod_001', quantity: 1, price: 2500 }],
181
+ total: 2500,
182
+ currency: 'USD',
183
+ shipping: { status: 'pending', carrier: 'USPS', tracking: null },
184
+ created_at: new Date().toISOString(),
185
+ });
186
+ });
187
+ }
188
+ // ── Health ────────────────────────────────────────────────────
189
+ app.get('/health', (_req, res) => {
190
+ res.json({ status: 'ok', uptime: process.uptime() });
191
+ });
192
+ // ── Start ────────────────────────────────────────────────────
193
+ app.listen(config.port, () => {
194
+ console.log('');
195
+ console.log(colors.bold(' UCP Mock Server'));
196
+ console.log(colors.gray(' ─'.repeat(25)));
197
+ console.log(` ${colors.green('●')} Running on ${colors.cyan(baseUrl)}`);
198
+ console.log(` ${colors.gray('Merchant:')} ${config.merchant.name}`);
199
+ console.log(` ${colors.gray('Products:')} ${products.length}`);
200
+ console.log(` ${colors.gray('Capabilities:')} ${config.capabilities.join(', ')}`);
201
+ if (config.latencyMs > 0) {
202
+ console.log(` ${colors.gray('Latency:')} ${config.latencyMs}ms`);
203
+ }
204
+ console.log('');
205
+ console.log(colors.bold(' Endpoints:'));
206
+ console.log(` ${colors.cyan('GET')} /.well-known/ucp ${colors.gray('UCP discovery profile')}`);
207
+ console.log(` ${colors.cyan('GET')} /products ${colors.gray('Product catalog')}`);
208
+ console.log(` ${colors.cyan('GET')} /products/:id ${colors.gray('Single product')}`);
209
+ console.log(` ${colors.cyan('POST')} /checkout-sessions ${colors.gray('Create checkout')}`);
210
+ console.log(` ${colors.cyan('GET')} /checkout-sessions/:id ${colors.gray('Get session')}`);
211
+ console.log(` ${colors.cyan('POST')} /checkout-sessions/:id/complete ${colors.gray('Complete checkout')}`);
212
+ if (config.capabilities.includes('order')) {
213
+ console.log(` ${colors.cyan('GET')} /orders/:id ${colors.gray('Get order')}`);
214
+ }
215
+ console.log(` ${colors.cyan('GET')} /health ${colors.gray('Health check')}`);
216
+ console.log('');
217
+ console.log(colors.bold(' Validate with:'));
218
+ console.log(` ${colors.yellow('ucp-validate validate -r localhost:' + config.port)}`);
219
+ console.log('');
220
+ console.log(colors.gray(' Press Ctrl+C to stop'));
221
+ console.log('');
222
+ });
223
+ }
224
+ function buildCapabilities(caps) {
225
+ const capabilities = [];
226
+ if (caps.includes('checkout')) {
227
+ capabilities.push({
228
+ name: 'dev.ucp.shopping.checkout',
229
+ version: '2026-01-11',
230
+ spec: 'https://ucp.dev/specification/checkout/',
231
+ schema: 'https://ucp.dev/schemas/shopping/checkout.json',
232
+ });
233
+ }
234
+ if (caps.includes('order')) {
235
+ capabilities.push({
236
+ name: 'dev.ucp.shopping.order',
237
+ version: '2026-01-11',
238
+ spec: 'https://ucp.dev/specification/order/',
239
+ schema: 'https://ucp.dev/schemas/shopping/order.json',
240
+ });
241
+ }
242
+ if (caps.includes('fulfillment')) {
243
+ capabilities.push({
244
+ name: 'dev.ucp.shopping.fulfillment',
245
+ version: '2026-01-11',
246
+ spec: 'https://ucp.dev/specification/fulfillment/',
247
+ schema: 'https://ucp.dev/schemas/shopping/fulfillment.json',
248
+ extends: 'dev.ucp.shopping.order',
249
+ });
250
+ }
251
+ if (caps.includes('discount')) {
252
+ capabilities.push({
253
+ name: 'dev.ucp.shopping.discount',
254
+ version: '2026-01-11',
255
+ spec: 'https://ucp.dev/specification/discount/',
256
+ schema: 'https://ucp.dev/schemas/shopping/discount.json',
257
+ });
258
+ }
259
+ return capabilities;
260
+ }
261
+ //# sourceMappingURL=mock-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mock-server.js","sourceRoot":"","sources":["../../src/cli/mock-server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * GDPR/Privacy Compliance Generator
3
+ * Generates privacy policy addendums and consent language for agentic commerce
4
+ */
5
+ import type { ComplianceGeneratorInput, ComplianceGeneratorOutput, ComplianceRegion } from './types.js';
6
+ /**
7
+ * Generate complete compliance documentation
8
+ */
9
+ export declare function generateComplianceDocuments(input: ComplianceGeneratorInput): ComplianceGeneratorOutput;
10
+ /**
11
+ * Get available regions with descriptions
12
+ */
13
+ export declare function getAvailableRegions(): Array<{
14
+ id: ComplianceRegion;
15
+ name: string;
16
+ }>;
17
+ /**
18
+ * Get lawful basis options with descriptions
19
+ */
20
+ export declare function getLawfulBasisOptions(): Array<{
21
+ id: string;
22
+ title: string;
23
+ description: string;
24
+ gdprArticle: string;
25
+ }>;
26
+ /**
27
+ * Get AI platform options
28
+ */
29
+ export declare function getAiPlatformOptions(): Array<{
30
+ id: string;
31
+ name: string;
32
+ description: string;
33
+ }>;
34
+ //# sourceMappingURL=compliance-generator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compliance-generator.d.ts","sourceRoot":"","sources":["../../src/compliance/compliance-generator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EACV,wBAAwB,EACxB,yBAAyB,EAIzB,gBAAgB,EACjB,MAAM,YAAY,CAAC;AAgBpB;;GAEG;AACH,wBAAgB,2BAA2B,CACzC,KAAK,EAAE,wBAAwB,GAC9B,yBAAyB,CA4F3B;AA+RD;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,KAAK,CAAC;IAAE,EAAE,EAAE,gBAAgB,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAKnF;AAED;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,KAAK,CAAC;IAC7C,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC,CAKD;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,KAAK,CAAC;IAC5C,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC,CAOD"}
@@ -0,0 +1,320 @@
1
+ "use strict";
2
+ /**
3
+ * GDPR/Privacy Compliance Generator
4
+ * Generates privacy policy addendums and consent language for agentic commerce
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.generateComplianceDocuments = generateComplianceDocuments;
8
+ exports.getAvailableRegions = getAvailableRegions;
9
+ exports.getLawfulBasisOptions = getLawfulBasisOptions;
10
+ exports.getAiPlatformOptions = getAiPlatformOptions;
11
+ const types_js_1 = require("./types.js");
12
+ const templates_js_1 = require("./templates.js");
13
+ /**
14
+ * Generate complete compliance documentation
15
+ */
16
+ function generateComplianceDocuments(input) {
17
+ // Validate input
18
+ validateInput(input);
19
+ // Build list of data processors
20
+ const processors = buildProcessorList(input);
21
+ // Generate all sections
22
+ const aiCommerceSection = (0, templates_js_1.generateAiCommerceSection)(input.companyName, processors, input.lawfulBasis, input.regions);
23
+ const processorDisclosures = (0, templates_js_1.generateProcessorDisclosures)(processors, input.regions);
24
+ const consentLanguage = (0, templates_js_1.generateConsentLanguage)(input.companyName, input.lawfulBasis, input.includeMarketingConsent || false);
25
+ const marketingOptIn = input.includeMarketingConsent
26
+ ? (0, templates_js_1.generateMarketingOptIn)(input.companyName)
27
+ : undefined;
28
+ const dataSubjectRights = (0, templates_js_1.generateDataSubjectRights)(input.companyName, input.companyEmail || 'privacy@yourcompany.com', input.dpoEmail, input.regions);
29
+ const trackingNotice = (0, templates_js_1.generateTrackingNotice)(input.companyName, input.regions);
30
+ const disclaimer = (0, templates_js_1.generateDisclaimer)();
31
+ // Build the full privacy addendum document
32
+ const privacyAddendum = buildPrivacyAddendum(input, aiCommerceSection, processorDisclosures, dataSubjectRights, trackingNotice, disclaimer);
33
+ // Generate embed HTML
34
+ const embedHtml = generateEmbedHtml(input.companyName, aiCommerceSection, processorDisclosures, dataSubjectRights, trackingNotice, disclaimer);
35
+ // Generate plain text
36
+ const plainText = generatePlainText(input.companyName, aiCommerceSection, processorDisclosures, consentLanguage, marketingOptIn, dataSubjectRights, trackingNotice, disclaimer);
37
+ return {
38
+ privacyAddendum,
39
+ snippets: {
40
+ aiCommerceSection,
41
+ processorDisclosures,
42
+ consentLanguage,
43
+ marketingOptIn,
44
+ dataSubjectRights,
45
+ trackingNotice,
46
+ },
47
+ embedHtml,
48
+ plainText,
49
+ generatedAt: new Date().toISOString(),
50
+ lawfulBasis: input.lawfulBasis,
51
+ regions: input.regions,
52
+ };
53
+ }
54
+ /**
55
+ * Validate generator input
56
+ */
57
+ function validateInput(input) {
58
+ if (!input.companyName || input.companyName.trim() === '') {
59
+ throw new Error('Company name is required');
60
+ }
61
+ if (!input.regions || input.regions.length === 0) {
62
+ throw new Error('At least one region must be selected');
63
+ }
64
+ if (!input.platforms || input.platforms.length === 0) {
65
+ throw new Error('At least one AI platform must be selected');
66
+ }
67
+ if (!input.lawfulBasis) {
68
+ throw new Error('Lawful basis must be specified');
69
+ }
70
+ }
71
+ /**
72
+ * Build the list of data processors from input
73
+ */
74
+ function buildProcessorList(input) {
75
+ const processors = [];
76
+ // Add AI platform processors
77
+ for (const platform of input.platforms) {
78
+ if (platform !== 'other') {
79
+ processors.push(types_js_1.AI_PLATFORM_PROCESSORS[platform]);
80
+ }
81
+ }
82
+ // Add custom processors
83
+ if (input.additionalProcessors) {
84
+ processors.push(...input.additionalProcessors);
85
+ }
86
+ return processors;
87
+ }
88
+ /**
89
+ * Build the full privacy addendum document
90
+ */
91
+ function buildPrivacyAddendum(input, aiCommerceSection, processorDisclosures, dataSubjectRights, trackingNotice, disclaimer) {
92
+ const sections = [
93
+ {
94
+ id: 'ai-commerce',
95
+ title: 'AI-Powered Shopping and Agentic Commerce',
96
+ content: aiCommerceSection,
97
+ required: true,
98
+ applicableRegions: ['eu', 'uk', 'california', 'global'],
99
+ },
100
+ {
101
+ id: 'processors',
102
+ title: 'Third-Party Data Processors',
103
+ content: processorDisclosures,
104
+ required: true,
105
+ applicableRegions: ['eu', 'uk', 'california', 'global'],
106
+ },
107
+ {
108
+ id: 'rights',
109
+ title: 'Your Data Rights',
110
+ content: dataSubjectRights,
111
+ required: true,
112
+ applicableRegions: ['eu', 'uk', 'california', 'global'],
113
+ },
114
+ {
115
+ id: 'tracking',
116
+ title: 'Tracking and Cookies',
117
+ content: trackingNotice,
118
+ required: false,
119
+ applicableRegions: ['eu', 'uk', 'global'],
120
+ },
121
+ ];
122
+ // Add data retention section if requested
123
+ if (input.includeDataRetention) {
124
+ const retentionYears = input.retentionPeriodYears || 7;
125
+ sections.push({
126
+ id: 'retention',
127
+ title: 'Data Retention',
128
+ content: generateDataRetentionSection(input.companyName, retentionYears, input.regions),
129
+ required: false,
130
+ applicableRegions: ['eu', 'uk', 'california', 'global'],
131
+ });
132
+ }
133
+ return {
134
+ title: `Privacy Policy Addendum: AI Commerce - ${input.companyName}`,
135
+ sections,
136
+ disclaimer,
137
+ generatedAt: new Date().toISOString(),
138
+ regions: input.regions,
139
+ };
140
+ }
141
+ /**
142
+ * Generate data retention section
143
+ */
144
+ function generateDataRetentionSection(companyName, retentionYears, regions) {
145
+ let section = `## Data Retention for AI Commerce Transactions
146
+
147
+ ${companyName} retains personal data from AI agent transactions for the following periods:
148
+
149
+ | Data Category | Retention Period | Purpose |
150
+ |--------------|------------------|---------|
151
+ | Order Information | ${retentionYears} years | Legal/tax compliance, warranty claims |
152
+ | Transaction Records | ${retentionYears} years | Financial records, dispute resolution |
153
+ | Delivery Information | 2 years | Customer service, delivery issues |
154
+ | Communication Records | 3 years | Customer support, quality assurance |
155
+ | Payment Confirmations | ${retentionYears} years | Financial audit requirements |
156
+
157
+ ### Retention Principles
158
+
159
+ - Data is retained only as long as necessary for the stated purposes
160
+ - We regularly review and delete data that is no longer needed
161
+ - You may request earlier deletion, subject to legal retention requirements
162
+ `;
163
+ if (regions.includes('eu') || regions.includes('uk')) {
164
+ section += `
165
+ ### GDPR Storage Limitation
166
+
167
+ In accordance with Article 5(1)(e) of the GDPR, we do not keep personal data for longer than necessary. Retention periods are based on:
168
+ - Contractual obligations
169
+ - Legal requirements (tax, accounting)
170
+ - Legitimate business needs
171
+ - Applicable limitation periods for legal claims
172
+ `;
173
+ }
174
+ return section;
175
+ }
176
+ /**
177
+ * Generate embeddable HTML
178
+ */
179
+ function generateEmbedHtml(companyName, aiCommerceSection, processorDisclosures, dataSubjectRights, trackingNotice, disclaimer) {
180
+ // Convert markdown to simple HTML
181
+ const convertMarkdown = (md) => {
182
+ return md
183
+ // Headers
184
+ .replace(/^### (.+)$/gm, '<h4>$1</h4>')
185
+ .replace(/^## (.+)$/gm, '<h3>$1</h3>')
186
+ .replace(/^# (.+)$/gm, '<h2>$1</h2>')
187
+ // Bold
188
+ .replace(/\*\*(.+?)\*\*/g, '<strong>$1</strong>')
189
+ // Lists
190
+ .replace(/^- (.+)$/gm, '<li>$1</li>')
191
+ // Blockquotes
192
+ .replace(/^> (.+)$/gm, '<blockquote>$1</blockquote>')
193
+ // Paragraphs
194
+ .replace(/\n\n/g, '</p><p>')
195
+ // Tables (basic)
196
+ .replace(/\|(.+)\|/g, (match) => {
197
+ const cells = match.split('|').filter(c => c.trim());
198
+ return '<tr>' + cells.map(c => `<td>${c.trim()}</td>`).join('') + '</tr>';
199
+ })
200
+ // Links
201
+ .replace(/\[(.+?)\]\((.+?)\)/g, '<a href="$2" target="_blank" rel="noopener">$1</a>');
202
+ };
203
+ return `<!-- AI Commerce Privacy Policy Addendum - Generated by UCP.tools -->
204
+ <div class="ucp-privacy-addendum">
205
+ <style>
206
+ .ucp-privacy-addendum {
207
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
208
+ line-height: 1.6;
209
+ color: #333;
210
+ max-width: 800px;
211
+ }
212
+ .ucp-privacy-addendum h2 { font-size: 1.5em; margin-top: 2em; border-bottom: 2px solid #2E86AB; padding-bottom: 0.5em; }
213
+ .ucp-privacy-addendum h3 { font-size: 1.2em; margin-top: 1.5em; color: #2E86AB; }
214
+ .ucp-privacy-addendum h4 { font-size: 1em; margin-top: 1em; }
215
+ .ucp-privacy-addendum table { width: 100%; border-collapse: collapse; margin: 1em 0; }
216
+ .ucp-privacy-addendum th, .ucp-privacy-addendum td { border: 1px solid #ddd; padding: 8px; text-align: left; }
217
+ .ucp-privacy-addendum th { background: #f5f5f5; }
218
+ .ucp-privacy-addendum blockquote { border-left: 4px solid #2E86AB; margin: 1em 0; padding: 0.5em 1em; background: #f9f9f9; }
219
+ .ucp-privacy-addendum .disclaimer { margin-top: 2em; padding: 1em; background: #fff3cd; border: 1px solid #ffc107; border-radius: 4px; font-size: 0.9em; }
220
+ </style>
221
+
222
+ <h2>Privacy Policy Addendum: AI Commerce</h2>
223
+ <p><em>Effective Date: ${new Date().toLocaleDateString()}</em></p>
224
+ <p>This addendum describes how ${companyName} handles personal data when you make purchases through AI shopping agents.</p>
225
+
226
+ <div class="section">
227
+ ${convertMarkdown(aiCommerceSection)}
228
+ </div>
229
+
230
+ <div class="section">
231
+ ${convertMarkdown(processorDisclosures)}
232
+ </div>
233
+
234
+ <div class="section">
235
+ ${convertMarkdown(dataSubjectRights)}
236
+ </div>
237
+
238
+ <div class="section">
239
+ ${convertMarkdown(trackingNotice)}
240
+ </div>
241
+
242
+ <div class="disclaimer">
243
+ ${convertMarkdown(disclaimer)}
244
+ </div>
245
+ </div>
246
+ <!-- End AI Commerce Privacy Policy Addendum -->`;
247
+ }
248
+ /**
249
+ * Generate plain text version
250
+ */
251
+ function generatePlainText(companyName, aiCommerceSection, processorDisclosures, consentLanguage, marketingOptIn, dataSubjectRights, trackingNotice, disclaimer) {
252
+ const divider = '='.repeat(60);
253
+ let text = `${divider}
254
+ PRIVACY POLICY ADDENDUM: AI COMMERCE
255
+ ${companyName}
256
+ Generated: ${new Date().toISOString()}
257
+ ${divider}
258
+
259
+ ${aiCommerceSection}
260
+
261
+ ${divider}
262
+
263
+ ${processorDisclosures}
264
+
265
+ ${divider}
266
+
267
+ ${consentLanguage}
268
+ `;
269
+ if (marketingOptIn) {
270
+ text += `
271
+ ${divider}
272
+
273
+ ${marketingOptIn}
274
+ `;
275
+ }
276
+ text += `
277
+ ${divider}
278
+
279
+ ${dataSubjectRights}
280
+
281
+ ${divider}
282
+
283
+ ${trackingNotice}
284
+
285
+ ${divider}
286
+
287
+ ${disclaimer}
288
+ `;
289
+ return text;
290
+ }
291
+ /**
292
+ * Get available regions with descriptions
293
+ */
294
+ function getAvailableRegions() {
295
+ return Object.entries(types_js_1.REGION_NAMES).map(([id, name]) => ({
296
+ id: id,
297
+ name,
298
+ }));
299
+ }
300
+ /**
301
+ * Get lawful basis options with descriptions
302
+ */
303
+ function getLawfulBasisOptions() {
304
+ return Object.entries(types_js_1.LAWFUL_BASIS_DESCRIPTIONS).map(([id, info]) => ({
305
+ id,
306
+ ...info,
307
+ }));
308
+ }
309
+ /**
310
+ * Get AI platform options
311
+ */
312
+ function getAiPlatformOptions() {
313
+ return [
314
+ { id: 'openai', name: 'OpenAI (ChatGPT Shopping)', description: 'ChatGPT-powered shopping assistant' },
315
+ { id: 'google', name: 'Google (AI Mode / Gemini)', description: 'Google AI shopping agent' },
316
+ { id: 'microsoft', name: 'Microsoft (Copilot)', description: 'Microsoft Copilot checkout' },
317
+ { id: 'other', name: 'Other AI Platforms', description: 'Other AI shopping agents' },
318
+ ];
319
+ }
320
+ //# sourceMappingURL=compliance-generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compliance-generator.js","sourceRoot":"","sources":["../../src/compliance/compliance-generator.ts"],"names":[],"mappings":"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"}