@ucptools/validator 1.0.0 → 1.0.1

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 (236) hide show
  1. package/.claude/settings.local.json +60 -0
  2. package/.vercel/README.txt +11 -0
  3. package/.vercel/project.json +1 -0
  4. package/dist/cli/index.d.ts +6 -0
  5. package/dist/cli/index.d.ts.map +1 -0
  6. package/dist/cli/index.js +279 -0
  7. package/dist/cli/index.js.map +1 -0
  8. package/dist/compliance/compliance-generator.d.ts +34 -0
  9. package/dist/compliance/compliance-generator.d.ts.map +1 -0
  10. package/dist/compliance/compliance-generator.js +320 -0
  11. package/dist/compliance/compliance-generator.js.map +1 -0
  12. package/dist/compliance/index.d.ts +8 -0
  13. package/dist/compliance/index.d.ts.map +1 -0
  14. package/dist/compliance/index.js +17 -0
  15. package/dist/compliance/index.js.map +1 -0
  16. package/dist/compliance/templates.d.ts +34 -0
  17. package/dist/compliance/templates.d.ts.map +1 -0
  18. package/{src/compliance/templates.ts → dist/compliance/templates.js} +117 -155
  19. package/dist/compliance/templates.js.map +1 -0
  20. package/dist/compliance/types.d.ts +64 -0
  21. package/dist/compliance/types.d.ts.map +1 -0
  22. package/dist/compliance/types.js +64 -0
  23. package/dist/compliance/types.js.map +1 -0
  24. package/dist/db/index.d.ts +11 -0
  25. package/dist/db/index.d.ts.map +1 -0
  26. package/dist/db/index.js +63 -0
  27. package/dist/db/index.js.map +1 -0
  28. package/dist/db/schema.d.ts +444 -0
  29. package/dist/db/schema.d.ts.map +1 -0
  30. package/dist/db/schema.js +65 -0
  31. package/dist/db/schema.js.map +1 -0
  32. package/dist/feed-analyzer/feed-analyzer.d.ts +26 -0
  33. package/dist/feed-analyzer/feed-analyzer.d.ts.map +1 -0
  34. package/{src/feed-analyzer/feed-analyzer.ts → dist/feed-analyzer/feed-analyzer.js} +642 -726
  35. package/dist/feed-analyzer/feed-analyzer.js.map +1 -0
  36. package/dist/feed-analyzer/index.d.ts +8 -0
  37. package/dist/feed-analyzer/index.d.ts.map +1 -0
  38. package/dist/feed-analyzer/index.js +19 -0
  39. package/dist/feed-analyzer/index.js.map +1 -0
  40. package/dist/feed-analyzer/types.d.ts +204 -0
  41. package/dist/feed-analyzer/types.d.ts.map +1 -0
  42. package/dist/feed-analyzer/types.js +162 -0
  43. package/dist/feed-analyzer/types.js.map +1 -0
  44. package/{src/generator/index.ts → dist/generator/index.d.ts} +1 -1
  45. package/dist/generator/index.d.ts.map +1 -0
  46. package/dist/generator/index.js +13 -0
  47. package/dist/generator/index.js.map +1 -0
  48. package/dist/generator/key-generator.d.ts +24 -0
  49. package/dist/generator/key-generator.d.ts.map +1 -0
  50. package/dist/generator/key-generator.js +144 -0
  51. package/dist/generator/key-generator.js.map +1 -0
  52. package/dist/generator/profile-builder.d.ts +15 -0
  53. package/dist/generator/profile-builder.d.ts.map +1 -0
  54. package/dist/generator/profile-builder.js +338 -0
  55. package/dist/generator/profile-builder.js.map +1 -0
  56. package/dist/hosting/artifacts-generator.d.ts +10 -0
  57. package/dist/hosting/artifacts-generator.d.ts.map +1 -0
  58. package/{src/hosting/artifacts-generator.ts → dist/hosting/artifacts-generator.js} +191 -241
  59. package/dist/hosting/artifacts-generator.js.map +1 -0
  60. package/{src/hosting/index.ts → dist/hosting/index.d.ts} +1 -1
  61. package/dist/hosting/index.d.ts.map +1 -0
  62. package/dist/hosting/index.js +10 -0
  63. package/dist/hosting/index.js.map +1 -0
  64. package/dist/index.d.ts +18 -0
  65. package/dist/index.d.ts.map +1 -0
  66. package/dist/index.js +78 -0
  67. package/dist/index.js.map +1 -0
  68. package/{src/security/index.ts → dist/security/index.d.ts} +8 -15
  69. package/dist/security/index.d.ts.map +1 -0
  70. package/dist/security/index.js +12 -0
  71. package/dist/security/index.js.map +1 -0
  72. package/dist/security/security-scanner.d.ts +10 -0
  73. package/dist/security/security-scanner.d.ts.map +1 -0
  74. package/dist/security/security-scanner.js +541 -0
  75. package/dist/security/security-scanner.js.map +1 -0
  76. package/dist/security/types.d.ts +48 -0
  77. package/dist/security/types.d.ts.map +1 -0
  78. package/dist/security/types.js +21 -0
  79. package/dist/security/types.js.map +1 -0
  80. package/dist/services/directory.d.ts +104 -0
  81. package/dist/services/directory.d.ts.map +1 -0
  82. package/dist/services/directory.js +333 -0
  83. package/dist/services/directory.js.map +1 -0
  84. package/dist/simulator/agent-simulator.d.ts +69 -0
  85. package/dist/simulator/agent-simulator.d.ts.map +1 -0
  86. package/{src/simulator/agent-simulator.ts → dist/simulator/agent-simulator.js} +650 -941
  87. package/dist/simulator/agent-simulator.js.map +1 -0
  88. package/{src/simulator/index.ts → dist/simulator/index.d.ts} +7 -7
  89. package/dist/simulator/index.d.ts.map +1 -0
  90. package/dist/simulator/index.js +23 -0
  91. package/dist/simulator/index.js.map +1 -0
  92. package/{src/simulator/types.ts → dist/simulator/types.d.ts} +145 -170
  93. package/dist/simulator/types.d.ts.map +1 -0
  94. package/dist/simulator/types.js +18 -0
  95. package/dist/simulator/types.js.map +1 -0
  96. package/dist/types/generator.d.ts +106 -0
  97. package/dist/types/generator.d.ts.map +1 -0
  98. package/dist/types/generator.js +6 -0
  99. package/dist/types/generator.js.map +1 -0
  100. package/{src/types/index.ts → dist/types/index.d.ts} +1 -1
  101. package/dist/types/index.d.ts.map +1 -0
  102. package/dist/types/index.js +23 -0
  103. package/dist/types/index.js.map +1 -0
  104. package/dist/types/ucp-profile.d.ts +103 -0
  105. package/dist/types/ucp-profile.d.ts.map +1 -0
  106. package/dist/types/ucp-profile.js +45 -0
  107. package/dist/types/ucp-profile.js.map +1 -0
  108. package/dist/types/validation.d.ts +68 -0
  109. package/dist/types/validation.d.ts.map +1 -0
  110. package/dist/types/validation.js +32 -0
  111. package/dist/types/validation.js.map +1 -0
  112. package/dist/validator/index.d.ts +26 -0
  113. package/dist/validator/index.d.ts.map +1 -0
  114. package/dist/validator/index.js +161 -0
  115. package/dist/validator/index.js.map +1 -0
  116. package/dist/validator/network-validator.d.ts +28 -0
  117. package/dist/validator/network-validator.d.ts.map +1 -0
  118. package/dist/validator/network-validator.js +319 -0
  119. package/dist/validator/network-validator.js.map +1 -0
  120. package/dist/validator/rules-validator.d.ts +11 -0
  121. package/dist/validator/rules-validator.d.ts.map +1 -0
  122. package/dist/validator/rules-validator.js +257 -0
  123. package/dist/validator/rules-validator.js.map +1 -0
  124. package/dist/validator/sdk-validator.d.ts +58 -0
  125. package/dist/validator/sdk-validator.d.ts.map +1 -0
  126. package/{src/validator/sdk-validator.ts → dist/validator/sdk-validator.js} +273 -330
  127. package/dist/validator/sdk-validator.js.map +1 -0
  128. package/dist/validator/structural-validator.d.ts +11 -0
  129. package/dist/validator/structural-validator.d.ts.map +1 -0
  130. package/dist/validator/structural-validator.js +415 -0
  131. package/dist/validator/structural-validator.js.map +1 -0
  132. package/package.json +1 -1
  133. package/publish-output.txt +0 -0
  134. package/CLAUDE.md +0 -109
  135. package/api/analyze-feed.js +0 -140
  136. package/api/badge.js +0 -185
  137. package/api/benchmark.js +0 -177
  138. package/api/directory-stats.ts +0 -29
  139. package/api/directory.ts +0 -73
  140. package/api/generate-compliance.js +0 -143
  141. package/api/generate-schema.js +0 -457
  142. package/api/generate.js +0 -132
  143. package/api/security-scan.js +0 -133
  144. package/api/simulate.js +0 -187
  145. package/api/tsconfig.json +0 -10
  146. package/api/validate.js +0 -1351
  147. package/apify-actor/.actor/actor.json +0 -68
  148. package/apify-actor/.actor/input_schema.json +0 -32
  149. package/apify-actor/APIFY-STORE-LISTING.md +0 -412
  150. package/apify-actor/Dockerfile +0 -8
  151. package/apify-actor/README.md +0 -166
  152. package/apify-actor/main.ts +0 -111
  153. package/apify-actor/package.json +0 -17
  154. package/apify-actor/src/main.js +0 -199
  155. package/docs/BRAND-IDENTITY.md +0 -238
  156. package/docs/BRAND-STYLE-GUIDE.md +0 -356
  157. package/drizzle/0000_black_king_cobra.sql +0 -39
  158. package/drizzle/meta/0000_snapshot.json +0 -309
  159. package/drizzle/meta/_journal.json +0 -13
  160. package/drizzle.config.ts +0 -10
  161. package/public/.well-known/ucp +0 -25
  162. package/public/android-chrome-192x192.png +0 -0
  163. package/public/android-chrome-512x512.png +0 -0
  164. package/public/apple-touch-icon.png +0 -0
  165. package/public/brand.css +0 -321
  166. package/public/directory.html +0 -701
  167. package/public/favicon-16x16.png +0 -0
  168. package/public/favicon-32x32.png +0 -0
  169. package/public/favicon.ico +0 -0
  170. package/public/guides/bigcommerce.html +0 -743
  171. package/public/guides/fastucp.html +0 -838
  172. package/public/guides/magento.html +0 -779
  173. package/public/guides/shopify.html +0 -726
  174. package/public/guides/squarespace.html +0 -749
  175. package/public/guides/wix.html +0 -747
  176. package/public/guides/woocommerce.html +0 -733
  177. package/public/index.html +0 -3835
  178. package/public/learn.html +0 -396
  179. package/public/logo.jpeg +0 -0
  180. package/public/og-image-icon.png +0 -0
  181. package/public/og-image.png +0 -0
  182. package/public/robots.txt +0 -6
  183. package/public/site.webmanifest +0 -31
  184. package/public/sitemap.xml +0 -69
  185. package/public/social/linkedin-banner-1128x191.png +0 -0
  186. package/public/social/temp.PNG +0 -0
  187. package/public/social/x-header-1500x500.png +0 -0
  188. package/public/verify.html +0 -410
  189. package/scripts/generate-favicons.js +0 -44
  190. package/scripts/generate-ico.js +0 -23
  191. package/scripts/generate-og-image.js +0 -45
  192. package/scripts/reset-db.ts +0 -77
  193. package/scripts/seed-db.ts +0 -71
  194. package/scripts/setup-benchmark-db.js +0 -70
  195. package/src/api/server.ts +0 -266
  196. package/src/cli/index.ts +0 -302
  197. package/src/compliance/compliance-generator.ts +0 -452
  198. package/src/compliance/index.ts +0 -28
  199. package/src/compliance/types.ts +0 -170
  200. package/src/db/index.ts +0 -28
  201. package/src/db/schema.ts +0 -84
  202. package/src/feed-analyzer/index.ts +0 -34
  203. package/src/feed-analyzer/types.ts +0 -354
  204. package/src/generator/key-generator.ts +0 -124
  205. package/src/generator/profile-builder.ts +0 -402
  206. package/src/index.ts +0 -105
  207. package/src/security/security-scanner.ts +0 -604
  208. package/src/security/types.ts +0 -55
  209. package/src/services/directory.ts +0 -434
  210. package/src/types/generator.ts +0 -140
  211. package/src/types/ucp-profile.ts +0 -140
  212. package/src/types/validation.ts +0 -89
  213. package/src/validator/index.ts +0 -194
  214. package/src/validator/network-validator.ts +0 -417
  215. package/src/validator/rules-validator.ts +0 -297
  216. package/src/validator/structural-validator.ts +0 -476
  217. package/tests/fixtures/non-compliant-profile.json +0 -25
  218. package/tests/fixtures/official-sample-profile.json +0 -75
  219. package/tests/integration/benchmark.test.ts +0 -207
  220. package/tests/integration/database.test.ts +0 -163
  221. package/tests/integration/directory-api.test.ts +0 -268
  222. package/tests/integration/simulate-api.test.ts +0 -230
  223. package/tests/integration/validate-api.test.ts +0 -269
  224. package/tests/setup.ts +0 -15
  225. package/tests/unit/agent-simulator.test.ts +0 -575
  226. package/tests/unit/compliance-generator.test.ts +0 -374
  227. package/tests/unit/directory-service.test.ts +0 -272
  228. package/tests/unit/feed-analyzer.test.ts +0 -517
  229. package/tests/unit/lint-suggestions.test.ts +0 -423
  230. package/tests/unit/official-samples.test.ts +0 -211
  231. package/tests/unit/pdf-report.test.ts +0 -390
  232. package/tests/unit/sdk-validator.test.ts +0 -531
  233. package/tests/unit/security-scanner.test.ts +0 -410
  234. package/tests/unit/validation.test.ts +0 -390
  235. package/vercel.json +0 -34
  236. package/vitest.config.ts +0 -22
@@ -0,0 +1,104 @@
1
+ /**
2
+ * Directory Service
3
+ * Business logic for the UCP Merchant Directory
4
+ */
5
+ import { type Merchant } from '../db/index.js';
6
+ export interface ListMerchantsParams {
7
+ page?: number;
8
+ limit?: number;
9
+ category?: string;
10
+ country?: string;
11
+ search?: string;
12
+ sort?: 'score' | 'domain' | 'displayName' | 'createdAt';
13
+ order?: 'asc' | 'desc';
14
+ }
15
+ export interface ListMerchantsResult {
16
+ merchants: Merchant[];
17
+ pagination: {
18
+ page: number;
19
+ limit: number;
20
+ total: number;
21
+ totalPages: number;
22
+ };
23
+ filters: {
24
+ categories: {
25
+ name: string;
26
+ count: number;
27
+ }[];
28
+ countries: {
29
+ code: string;
30
+ count: number;
31
+ }[];
32
+ };
33
+ }
34
+ export interface SubmitMerchantParams {
35
+ domain: string;
36
+ displayName?: string;
37
+ description?: string;
38
+ logoUrl?: string;
39
+ websiteUrl?: string;
40
+ category?: string;
41
+ countryCode?: string;
42
+ }
43
+ export interface DirectoryStats {
44
+ totalMerchants: number;
45
+ verifiedMerchants: number;
46
+ avgScore: number;
47
+ totalCategories: number;
48
+ totalCountries: number;
49
+ gradeDistribution: {
50
+ grade: string;
51
+ count: number;
52
+ }[];
53
+ topCategories: {
54
+ name: string;
55
+ count: number;
56
+ }[];
57
+ recentAdditions: {
58
+ domain: string;
59
+ displayName: string;
60
+ grade: string | null;
61
+ addedAt: Date;
62
+ }[];
63
+ }
64
+ export interface ValidationResult {
65
+ valid: boolean;
66
+ error?: string;
67
+ score?: number;
68
+ grade?: string;
69
+ transports?: string;
70
+ ucpVersion?: string;
71
+ }
72
+ /**
73
+ * Validate a domain's UCP profile
74
+ */
75
+ export declare function validateDomain(domain: string): Promise<ValidationResult>;
76
+ /**
77
+ * List merchants with pagination and filters
78
+ */
79
+ export declare function listMerchants(params: ListMerchantsParams): Promise<ListMerchantsResult>;
80
+ /**
81
+ * Get a single merchant by domain
82
+ */
83
+ export declare function getMerchantByDomain(domain: string): Promise<Merchant | null>;
84
+ /**
85
+ * Submit a new merchant to the directory
86
+ */
87
+ export declare function submitMerchant(params: SubmitMerchantParams): Promise<{
88
+ success: boolean;
89
+ merchant?: Merchant;
90
+ error?: string;
91
+ details?: string;
92
+ }>;
93
+ /**
94
+ * Get directory statistics
95
+ */
96
+ export declare function getDirectoryStats(): Promise<DirectoryStats>;
97
+ /**
98
+ * Re-validate a merchant's UCP profile and update their record
99
+ */
100
+ export declare function revalidateMerchant(domain: string): Promise<{
101
+ success: boolean;
102
+ error?: string;
103
+ }>;
104
+ //# sourceMappingURL=directory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"directory.d.ts","sourceRoot":"","sources":["../../src/services/directory.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,333 @@
1
+ "use strict";
2
+ /**
3
+ * Directory Service
4
+ * Business logic for the UCP Merchant Directory
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.validateDomain = validateDomain;
8
+ exports.listMerchants = listMerchants;
9
+ exports.getMerchantByDomain = getMerchantByDomain;
10
+ exports.submitMerchant = submitMerchant;
11
+ exports.getDirectoryStats = getDirectoryStats;
12
+ exports.revalidateMerchant = revalidateMerchant;
13
+ const drizzle_orm_1 = require("drizzle-orm");
14
+ const index_js_1 = require("../db/index.js");
15
+ /**
16
+ * Fetch UCP profile from a URL, return null if not valid JSON
17
+ */
18
+ async function tryFetchProfile(url) {
19
+ try {
20
+ const res = await fetch(url, {
21
+ headers: {
22
+ Accept: 'application/json',
23
+ 'User-Agent': 'UCP-Directory/1.0 (https://ucptools.dev)',
24
+ },
25
+ signal: AbortSignal.timeout(10000),
26
+ });
27
+ if (!res.ok)
28
+ return null;
29
+ const text = await res.text();
30
+ // Check if response looks like JSON (not HTML)
31
+ if (text.trim().startsWith('<'))
32
+ return null;
33
+ return JSON.parse(text);
34
+ }
35
+ catch {
36
+ return null;
37
+ }
38
+ }
39
+ /**
40
+ * Validate a domain's UCP profile
41
+ */
42
+ async function validateDomain(domain) {
43
+ // Try both /.well-known/ucp and /.well-known/ucp.json
44
+ const urls = [
45
+ `https://${domain}/.well-known/ucp`,
46
+ `https://${domain}/.well-known/ucp.json`,
47
+ ];
48
+ let profile = null;
49
+ for (const url of urls) {
50
+ profile = await tryFetchProfile(url);
51
+ if (profile)
52
+ break;
53
+ }
54
+ try {
55
+ if (!profile) {
56
+ return { valid: false, error: 'No UCP profile found at /.well-known/ucp or /.well-known/ucp.json' };
57
+ }
58
+ // Basic validation
59
+ if (!profile?.ucp?.version || !profile?.ucp?.services) {
60
+ return { valid: false, error: 'Invalid UCP profile structure' };
61
+ }
62
+ // Extract transports
63
+ const transports = new Set();
64
+ for (const svc of Object.values(profile.ucp.services || {})) {
65
+ if (svc.rest)
66
+ transports.add('REST');
67
+ if (svc.mcp)
68
+ transports.add('MCP');
69
+ if (svc.a2a)
70
+ transports.add('A2A');
71
+ if (svc.embedded)
72
+ transports.add('Embedded');
73
+ }
74
+ // Simple scoring
75
+ let score = 50;
76
+ const capabilities = profile.ucp.capabilities || [];
77
+ if (capabilities.some((c) => c.name === 'dev.ucp.shopping.checkout'))
78
+ score += 20;
79
+ if (capabilities.some((c) => c.name === 'dev.ucp.shopping.cart'))
80
+ score += 10;
81
+ if (capabilities.some((c) => c.name === 'dev.ucp.shopping.order'))
82
+ score += 10;
83
+ if (profile.signing_keys && profile.signing_keys.length > 0)
84
+ score += 10;
85
+ const grade = score >= 90 ? 'A' : score >= 80 ? 'B' : score >= 70 ? 'C' : score >= 60 ? 'D' : 'F';
86
+ return {
87
+ valid: true,
88
+ score,
89
+ grade,
90
+ transports: Array.from(transports).join(','),
91
+ ucpVersion: profile.ucp.version,
92
+ };
93
+ }
94
+ catch (e) {
95
+ const message = e instanceof Error ? e.message : 'Failed to fetch profile';
96
+ return { valid: false, error: message };
97
+ }
98
+ }
99
+ /**
100
+ * List merchants with pagination and filters
101
+ */
102
+ async function listMerchants(params) {
103
+ const db = (0, index_js_1.getDb)();
104
+ const page = Math.max(1, params.page || 1);
105
+ const limit = Math.min(100, Math.max(1, params.limit || 20));
106
+ const offset = (page - 1) * limit;
107
+ // Build where conditions
108
+ const conditions = [(0, drizzle_orm_1.eq)(index_js_1.merchants.isPublic, true)];
109
+ if (params.category) {
110
+ conditions.push((0, drizzle_orm_1.eq)(index_js_1.merchants.category, params.category));
111
+ }
112
+ if (params.country) {
113
+ conditions.push((0, drizzle_orm_1.eq)(index_js_1.merchants.countryCode, params.country.toUpperCase()));
114
+ }
115
+ if (params.search) {
116
+ conditions.push((0, drizzle_orm_1.sql) `(${index_js_1.merchants.domain} ILIKE ${`%${params.search}%`} OR ${index_js_1.merchants.displayName} ILIKE ${`%${params.search}%`})`);
117
+ }
118
+ const whereClause = (0, drizzle_orm_1.and)(...conditions);
119
+ // Determine sort column and order
120
+ const sortColumn = params.sort === 'domain'
121
+ ? index_js_1.merchants.domain
122
+ : params.sort === 'displayName'
123
+ ? index_js_1.merchants.displayName
124
+ : params.sort === 'createdAt'
125
+ ? index_js_1.merchants.createdAt
126
+ : index_js_1.merchants.ucpScore;
127
+ const orderFn = params.order === 'asc' ? drizzle_orm_1.asc : drizzle_orm_1.desc;
128
+ // Get total count
129
+ const countResult = await db
130
+ .select({ total: (0, drizzle_orm_1.count)() })
131
+ .from(index_js_1.merchants)
132
+ .where(whereClause);
133
+ const total = countResult[0]?.total || 0;
134
+ // Get merchants
135
+ const merchantList = await db
136
+ .select()
137
+ .from(index_js_1.merchants)
138
+ .where(whereClause)
139
+ .orderBy(orderFn(sortColumn))
140
+ .limit(limit)
141
+ .offset(offset);
142
+ // Get category counts
143
+ const categoryResult = await db
144
+ .select({
145
+ category: index_js_1.merchants.category,
146
+ count: (0, drizzle_orm_1.count)(),
147
+ })
148
+ .from(index_js_1.merchants)
149
+ .where((0, drizzle_orm_1.and)((0, drizzle_orm_1.eq)(index_js_1.merchants.isPublic, true), (0, drizzle_orm_1.sql) `${index_js_1.merchants.category} IS NOT NULL`))
150
+ .groupBy(index_js_1.merchants.category)
151
+ .orderBy((0, drizzle_orm_1.desc)((0, drizzle_orm_1.count)()));
152
+ // Get country counts
153
+ const countryResult = await db
154
+ .select({
155
+ countryCode: index_js_1.merchants.countryCode,
156
+ count: (0, drizzle_orm_1.count)(),
157
+ })
158
+ .from(index_js_1.merchants)
159
+ .where((0, drizzle_orm_1.and)((0, drizzle_orm_1.eq)(index_js_1.merchants.isPublic, true), (0, drizzle_orm_1.sql) `${index_js_1.merchants.countryCode} IS NOT NULL`))
160
+ .groupBy(index_js_1.merchants.countryCode)
161
+ .orderBy((0, drizzle_orm_1.desc)((0, drizzle_orm_1.count)()));
162
+ return {
163
+ merchants: merchantList,
164
+ pagination: {
165
+ page,
166
+ limit,
167
+ total,
168
+ totalPages: Math.ceil(total / limit),
169
+ },
170
+ filters: {
171
+ categories: categoryResult.map((r) => ({ name: r.category, count: r.count })),
172
+ countries: countryResult.map((r) => ({ code: r.countryCode, count: r.count })),
173
+ },
174
+ };
175
+ }
176
+ /**
177
+ * Get a single merchant by domain
178
+ */
179
+ async function getMerchantByDomain(domain) {
180
+ const db = (0, index_js_1.getDb)();
181
+ const result = await db.select().from(index_js_1.merchants).where((0, drizzle_orm_1.eq)(index_js_1.merchants.domain, domain.toLowerCase())).limit(1);
182
+ return result[0] || null;
183
+ }
184
+ /**
185
+ * Submit a new merchant to the directory
186
+ */
187
+ async function submitMerchant(params) {
188
+ const db = (0, index_js_1.getDb)();
189
+ // Clean domain
190
+ const cleanDomain = params.domain
191
+ .replace(/^https?:\/\//, '')
192
+ .replace(/\/$/, '')
193
+ .split('/')[0]
194
+ .toLowerCase();
195
+ // Check if domain already exists
196
+ const existing = await getMerchantByDomain(cleanDomain);
197
+ if (existing) {
198
+ return {
199
+ success: false,
200
+ error: 'Domain already registered',
201
+ details: `Merchant ID: ${existing.id}`,
202
+ };
203
+ }
204
+ // Validate the domain has a valid UCP profile
205
+ const validation = await validateDomain(cleanDomain);
206
+ if (!validation.valid) {
207
+ return {
208
+ success: false,
209
+ error: 'Invalid UCP profile',
210
+ details: validation.error,
211
+ };
212
+ }
213
+ // Insert merchant
214
+ const newMerchant = {
215
+ domain: cleanDomain,
216
+ displayName: params.displayName || cleanDomain,
217
+ description: params.description || null,
218
+ logoUrl: params.logoUrl || null,
219
+ websiteUrl: params.websiteUrl || `https://${cleanDomain}`,
220
+ category: params.category || null,
221
+ countryCode: params.countryCode?.toUpperCase() || null,
222
+ ucpScore: validation.score || null,
223
+ ucpGrade: validation.grade || null,
224
+ transports: validation.transports || null,
225
+ isPublic: true,
226
+ isVerified: false,
227
+ lastValidatedAt: new Date(),
228
+ };
229
+ const result = await db.insert(index_js_1.merchants).values(newMerchant).returning();
230
+ return {
231
+ success: true,
232
+ merchant: result[0],
233
+ };
234
+ }
235
+ /**
236
+ * Get directory statistics
237
+ */
238
+ async function getDirectoryStats() {
239
+ const db = (0, index_js_1.getDb)();
240
+ // Overall stats
241
+ const statsResult = await db
242
+ .select({
243
+ totalMerchants: (0, drizzle_orm_1.count)(),
244
+ verifiedMerchants: (0, drizzle_orm_1.sql) `COUNT(*) FILTER (WHERE ${index_js_1.merchants.isVerified} = true)`,
245
+ avgScore: (0, drizzle_orm_1.sql) `COALESCE(AVG(${index_js_1.merchants.ucpScore}), 0)`,
246
+ })
247
+ .from(index_js_1.merchants)
248
+ .where((0, drizzle_orm_1.eq)(index_js_1.merchants.isPublic, true));
249
+ // Count distinct categories and countries
250
+ const categoryCountResult = await db
251
+ .select({ count: (0, drizzle_orm_1.sql) `COUNT(DISTINCT ${index_js_1.merchants.category})` })
252
+ .from(index_js_1.merchants)
253
+ .where((0, drizzle_orm_1.and)((0, drizzle_orm_1.eq)(index_js_1.merchants.isPublic, true), (0, drizzle_orm_1.sql) `${index_js_1.merchants.category} IS NOT NULL`));
254
+ const countryCountResult = await db
255
+ .select({ count: (0, drizzle_orm_1.sql) `COUNT(DISTINCT ${index_js_1.merchants.countryCode})` })
256
+ .from(index_js_1.merchants)
257
+ .where((0, drizzle_orm_1.and)((0, drizzle_orm_1.eq)(index_js_1.merchants.isPublic, true), (0, drizzle_orm_1.sql) `${index_js_1.merchants.countryCode} IS NOT NULL`));
258
+ // Grade distribution
259
+ const gradeResult = await db
260
+ .select({
261
+ grade: index_js_1.merchants.ucpGrade,
262
+ count: (0, drizzle_orm_1.count)(),
263
+ })
264
+ .from(index_js_1.merchants)
265
+ .where((0, drizzle_orm_1.and)((0, drizzle_orm_1.eq)(index_js_1.merchants.isPublic, true), (0, drizzle_orm_1.sql) `${index_js_1.merchants.ucpGrade} IS NOT NULL`))
266
+ .groupBy(index_js_1.merchants.ucpGrade)
267
+ .orderBy(index_js_1.merchants.ucpGrade);
268
+ // Top categories
269
+ const topCategoriesResult = await db
270
+ .select({
271
+ name: index_js_1.merchants.category,
272
+ count: (0, drizzle_orm_1.count)(),
273
+ })
274
+ .from(index_js_1.merchants)
275
+ .where((0, drizzle_orm_1.and)((0, drizzle_orm_1.eq)(index_js_1.merchants.isPublic, true), (0, drizzle_orm_1.sql) `${index_js_1.merchants.category} IS NOT NULL`))
276
+ .groupBy(index_js_1.merchants.category)
277
+ .orderBy((0, drizzle_orm_1.desc)((0, drizzle_orm_1.count)()))
278
+ .limit(10);
279
+ // Recent additions
280
+ const recentResult = await db
281
+ .select({
282
+ domain: index_js_1.merchants.domain,
283
+ displayName: index_js_1.merchants.displayName,
284
+ grade: index_js_1.merchants.ucpGrade,
285
+ addedAt: index_js_1.merchants.createdAt,
286
+ })
287
+ .from(index_js_1.merchants)
288
+ .where((0, drizzle_orm_1.eq)(index_js_1.merchants.isPublic, true))
289
+ .orderBy((0, drizzle_orm_1.desc)(index_js_1.merchants.createdAt))
290
+ .limit(5);
291
+ const stats = statsResult[0];
292
+ return {
293
+ totalMerchants: stats?.totalMerchants || 0,
294
+ verifiedMerchants: stats?.verifiedMerchants || 0,
295
+ avgScore: Math.round(stats?.avgScore || 0),
296
+ totalCategories: categoryCountResult[0]?.count || 0,
297
+ totalCountries: countryCountResult[0]?.count || 0,
298
+ gradeDistribution: gradeResult.map((r) => ({ grade: r.grade, count: r.count })),
299
+ topCategories: topCategoriesResult.map((r) => ({ name: r.name, count: r.count })),
300
+ recentAdditions: recentResult.map((r) => ({
301
+ domain: r.domain,
302
+ displayName: r.displayName,
303
+ grade: r.grade,
304
+ addedAt: r.addedAt,
305
+ })),
306
+ };
307
+ }
308
+ /**
309
+ * Re-validate a merchant's UCP profile and update their record
310
+ */
311
+ async function revalidateMerchant(domain) {
312
+ const db = (0, index_js_1.getDb)();
313
+ const merchant = await getMerchantByDomain(domain);
314
+ if (!merchant) {
315
+ return { success: false, error: 'Merchant not found' };
316
+ }
317
+ const validation = await validateDomain(domain);
318
+ if (!validation.valid) {
319
+ return { success: false, error: validation.error };
320
+ }
321
+ await db
322
+ .update(index_js_1.merchants)
323
+ .set({
324
+ ucpScore: validation.score || null,
325
+ ucpGrade: validation.grade || null,
326
+ transports: validation.transports || null,
327
+ lastValidatedAt: new Date(),
328
+ updatedAt: new Date(),
329
+ })
330
+ .where((0, drizzle_orm_1.eq)(index_js_1.merchants.domain, domain.toLowerCase()));
331
+ return { success: true };
332
+ }
333
+ //# sourceMappingURL=directory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"directory.js","sourceRoot":"","sources":["../../src/services/directory.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,69 @@
1
+ /**
2
+ * AI Agent Simulator
3
+ * Simulates how an AI agent discovers and interacts with UCP-enabled merchants
4
+ *
5
+ * The goal is to test real-world functionality, not just spec compliance.
6
+ * This proves that a UCP implementation actually works for AI agent commerce.
7
+ */
8
+ import type { UcpProfile } from '../types/ucp-profile.js';
9
+ import type { AgentSimulationResult, SimulationOptions, DiscoveryFlowResult, CapabilityInspectionResult, ServiceInspectionResult, RestApiSimulationResult, CheckoutSimulationResult, PaymentReadinessResult } from './types.js';
10
+ /**
11
+ * Fetch with timeout
12
+ */
13
+ declare function fetchWithTimeout(url: string, timeoutMs?: number): Promise<{
14
+ ok: boolean;
15
+ status?: number;
16
+ data?: unknown;
17
+ error?: string;
18
+ }>;
19
+ /**
20
+ * HEAD request to check endpoint responsiveness
21
+ */
22
+ declare function checkEndpointResponsive(url: string, timeoutMs?: number): Promise<{
23
+ ok: boolean;
24
+ status?: number;
25
+ error?: string;
26
+ }>;
27
+ /**
28
+ * Simulate discovery flow - how an AI agent discovers a UCP merchant
29
+ */
30
+ export declare function simulateDiscoveryFlow(domain: string, timeoutMs?: number): Promise<DiscoveryFlowResult>;
31
+ /**
32
+ * Inspect capabilities in detail
33
+ */
34
+ export declare function inspectCapabilities(profile: UcpProfile, timeoutMs?: number): Promise<CapabilityInspectionResult[]>;
35
+ /**
36
+ * Inspect services and their transports
37
+ */
38
+ export declare function inspectServices(profile: UcpProfile, timeoutMs?: number): Promise<ServiceInspectionResult[]>;
39
+ /**
40
+ * Simulate REST API interaction
41
+ */
42
+ export declare function simulateRestApi(profile: UcpProfile, timeoutMs?: number): Promise<RestApiSimulationResult>;
43
+ /**
44
+ * Simulate checkout flow capability
45
+ */
46
+ export declare function simulateCheckoutFlow(profile: UcpProfile, timeoutMs?: number): Promise<CheckoutSimulationResult>;
47
+ /**
48
+ * Check payment readiness
49
+ */
50
+ export declare function simulatePaymentReadiness(profile: UcpProfile, timeoutMs?: number): Promise<PaymentReadinessResult>;
51
+ /**
52
+ * Generate recommendations based on simulation results
53
+ */
54
+ declare function generateRecommendations(discovery: DiscoveryFlowResult, capabilities: CapabilityInspectionResult[], services: ServiceInspectionResult[], restApi?: RestApiSimulationResult, checkout?: CheckoutSimulationResult, payment?: PaymentReadinessResult): string[];
55
+ /**
56
+ * Calculate overall AI readiness score
57
+ */
58
+ declare function calculateScore(discovery: DiscoveryFlowResult, capabilities: CapabilityInspectionResult[], services: ServiceInspectionResult[], restApi?: RestApiSimulationResult, checkout?: CheckoutSimulationResult, payment?: PaymentReadinessResult): number;
59
+ /**
60
+ * Get grade from score (aligned with all other scoring models)
61
+ */
62
+ declare function getGrade(score: number): 'A' | 'B' | 'C' | 'D' | 'F';
63
+ /**
64
+ * Main simulation entry point
65
+ * Simulates a complete AI agent interaction with a UCP-enabled merchant
66
+ */
67
+ export declare function simulateAgentInteraction(domain: string, options?: SimulationOptions): Promise<AgentSimulationResult>;
68
+ export { fetchWithTimeout, checkEndpointResponsive, generateRecommendations, calculateScore, getGrade, };
69
+ //# sourceMappingURL=agent-simulator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-simulator.d.ts","sourceRoot":"","sources":["../../src/simulator/agent-simulator.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,UAAU,EAA6B,MAAM,yBAAyB,CAAC;AACrF,OAAO,KAAK,EACR,qBAAqB,EACrB,iBAAiB,EAGjB,mBAAmB,EACnB,0BAA0B,EAC1B,uBAAuB,EACvB,uBAAuB,EACvB,wBAAwB,EACxB,sBAAsB,EAGzB,MAAM,YAAY,CAAC;AA4CpB;;GAEG;AACH,iBAAe,gBAAgB,CAC3B,GAAG,EAAE,MAAM,EACX,SAAS,GAAE,MAAiC,GAC7C,OAAO,CAAC;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CA+B3E;AAED;;GAEG;AACH,iBAAe,uBAAuB,CAClC,GAAG,EAAE,MAAM,EACX,SAAS,GAAE,MAAiC,GAC7C,OAAO,CAAC;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAqB3D;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CACvC,MAAM,EAAE,MAAM,EACd,SAAS,GAAE,MAAiC,GAC7C,OAAO,CAAC,mBAAmB,CAAC,CA0I9B;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CACrC,OAAO,EAAE,UAAU,EACnB,SAAS,GAAE,MAAiC,GAC7C,OAAO,CAAC,0BAA0B,EAAE,CAAC,CAkCvC;AAED;;GAEG;AACH,wBAAsB,eAAe,CACjC,OAAO,EAAE,UAAU,EACnB,SAAS,GAAE,MAAiC,GAC7C,OAAO,CAAC,uBAAuB,EAAE,CAAC,CAoDpC;AAED;;GAEG;AACH,wBAAsB,eAAe,CACjC,OAAO,EAAE,UAAU,EACnB,SAAS,GAAE,MAAiC,GAC7C,OAAO,CAAC,uBAAuB,CAAC,CA+FlC;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CACtC,OAAO,EAAE,UAAU,EACnB,SAAS,GAAE,MAAiC,GAC7C,OAAO,CAAC,wBAAwB,CAAC,CAuHnC;AAED;;GAEG;AACH,wBAAsB,wBAAwB,CAC1C,OAAO,EAAE,UAAU,EACnB,SAAS,GAAE,MAAiC,GAC7C,OAAO,CAAC,sBAAsB,CAAC,CA+EjC;AAED;;GAEG;AACH,iBAAS,uBAAuB,CAC5B,SAAS,EAAE,mBAAmB,EAC9B,YAAY,EAAE,0BAA0B,EAAE,EAC1C,QAAQ,EAAE,uBAAuB,EAAE,EACnC,OAAO,CAAC,EAAE,uBAAuB,EACjC,QAAQ,CAAC,EAAE,wBAAwB,EACnC,OAAO,CAAC,EAAE,sBAAsB,GACjC,MAAM,EAAE,CAsDV;AAED;;GAEG;AACH,iBAAS,cAAc,CACnB,SAAS,EAAE,mBAAmB,EAC9B,YAAY,EAAE,0BAA0B,EAAE,EAC1C,QAAQ,EAAE,uBAAuB,EAAE,EACnC,OAAO,CAAC,EAAE,uBAAuB,EACjC,QAAQ,CAAC,EAAE,wBAAwB,EACnC,OAAO,CAAC,EAAE,sBAAsB,GACjC,MAAM,CAqCR;AAED;;GAEG;AACH,iBAAS,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAM5D;AAED;;;GAGG;AACH,wBAAsB,wBAAwB,CAC1C,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,iBAAsB,GAChC,OAAO,CAAC,qBAAqB,CAAC,CAmGhC;AAGD,OAAO,EACH,gBAAgB,EAChB,uBAAuB,EACvB,uBAAuB,EACvB,cAAc,EACd,QAAQ,GACX,CAAC"}