@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,319 @@
1
+ "use strict";
2
+ /**
3
+ * Network Validator
4
+ * Validates UCP profile with network checks (fetches remote schemas)
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.validateNetwork = validateNetwork;
8
+ exports.validateRemoteProfile = validateRemoteProfile;
9
+ exports.clearSchemaCache = clearSchemaCache;
10
+ const validation_js_1 = require("../types/validation.js");
11
+ // Simple in-memory cache for schema fetches
12
+ const schemaCache = new Map();
13
+ const DEFAULT_CACHE_TTL_MS = 15 * 60 * 1000; // 15 minutes
14
+ const DEFAULT_TIMEOUT_MS = 10000; // 10 seconds
15
+ /**
16
+ * Validate UCP profile with network checks
17
+ */
18
+ async function validateNetwork(profile, options = {}) {
19
+ const issues = [];
20
+ const timeoutMs = options.timeoutMs || DEFAULT_TIMEOUT_MS;
21
+ const cacheTtlMs = options.cacheTtlMs || DEFAULT_CACHE_TTL_MS;
22
+ if (options.skipSchemaFetch) {
23
+ return issues;
24
+ }
25
+ const capabilities = profile.ucp.capabilities || [];
26
+ // Validate each capability's schema
27
+ for (let i = 0; i < capabilities.length; i++) {
28
+ const cap = capabilities[i];
29
+ const path = `$.ucp.capabilities[${i}]`;
30
+ if (cap.schema) {
31
+ const schemaIssues = await validateCapabilitySchema(cap.schema, cap.name, cap.version, path, timeoutMs, cacheTtlMs);
32
+ issues.push(...schemaIssues);
33
+ }
34
+ }
35
+ return issues;
36
+ }
37
+ /**
38
+ * Validate remote profile fetch
39
+ */
40
+ async function validateRemoteProfile(domain, options = {}) {
41
+ const issues = [];
42
+ const timeoutMs = options.timeoutMs || DEFAULT_TIMEOUT_MS;
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
+ for (const profileUrl of urls) {
49
+ const result = await fetchProfileWithTimeout(profileUrl, timeoutMs);
50
+ if (!result.success) {
51
+ // Try next URL
52
+ continue;
53
+ }
54
+ // Verify it's an object with ucp field
55
+ if (!result.data || typeof result.data !== 'object') {
56
+ continue;
57
+ }
58
+ const profileData = result.data;
59
+ if (!profileData.ucp) {
60
+ continue;
61
+ }
62
+ return { profile: result.data, profileUrl, issues };
63
+ }
64
+ // All URLs failed
65
+ issues.push({
66
+ severity: 'error',
67
+ code: validation_js_1.ValidationErrorCodes.PROFILE_FETCH_FAILED,
68
+ path: '$.well-known/ucp',
69
+ message: 'No UCP profile found at /.well-known/ucp or /.well-known/ucp.json',
70
+ hint: 'Check that the profile is accessible and returns valid JSON',
71
+ });
72
+ return { profile: null, issues };
73
+ }
74
+ /**
75
+ * Validate a capability's schema (fetch and check self-describing)
76
+ */
77
+ async function validateCapabilitySchema(schemaUrl, expectedName, expectedVersion, basePath, timeoutMs, cacheTtlMs) {
78
+ const issues = [];
79
+ // Check cache first
80
+ const cached = getCachedSchema(schemaUrl, cacheTtlMs);
81
+ let schemaData;
82
+ if (cached) {
83
+ schemaData = cached;
84
+ }
85
+ else {
86
+ // Fetch schema
87
+ const result = await fetchWithTimeout(schemaUrl, timeoutMs);
88
+ if (!result.success) {
89
+ issues.push({
90
+ severity: 'warn',
91
+ code: validation_js_1.ValidationErrorCodes.SCHEMA_FETCH_FAILED,
92
+ path: `${basePath}.schema`,
93
+ message: `Failed to fetch schema from ${schemaUrl}`,
94
+ hint: result.error || 'Schema URL may be incorrect or temporarily unavailable',
95
+ });
96
+ return issues;
97
+ }
98
+ if (!result.data) {
99
+ issues.push({
100
+ severity: 'warn',
101
+ code: validation_js_1.ValidationErrorCodes.SCHEMA_FETCH_FAILED,
102
+ path: `${basePath}.schema`,
103
+ message: `Schema response is empty`,
104
+ });
105
+ return issues;
106
+ }
107
+ schemaData = result.data;
108
+ // Cache the schema
109
+ cacheSchema(schemaUrl, schemaData, result.etag, cacheTtlMs);
110
+ }
111
+ // Check if schema is self-describing
112
+ const selfDescribingIssues = validateSelfDescribingSchema(schemaData, expectedName, expectedVersion, basePath);
113
+ issues.push(...selfDescribingIssues);
114
+ return issues;
115
+ }
116
+ /**
117
+ * Validate schema is self-describing (contains name and version matching capability)
118
+ */
119
+ function validateSelfDescribingSchema(schema, expectedName, expectedVersion, basePath) {
120
+ const issues = [];
121
+ // Check for $id or name field
122
+ const schemaName = schema.$id || schema.name;
123
+ const schemaVersion = schema.version;
124
+ if (!schemaName && !schema.$id) {
125
+ issues.push({
126
+ severity: 'info',
127
+ code: validation_js_1.ValidationErrorCodes.SCHEMA_NOT_SELF_DESCRIBING,
128
+ path: `${basePath}.schema`,
129
+ message: 'Schema does not contain self-describing $id or name field',
130
+ hint: 'Consider adding $id field to schema for better discoverability',
131
+ });
132
+ }
133
+ // If schema has a name, check it contains the capability name
134
+ if (schemaName) {
135
+ // Extract capability name from schema $id if it's a URL
136
+ const nameFromId = extractNameFromSchemaId(schemaName);
137
+ if (nameFromId && !expectedName.includes(nameFromId) && !nameFromId.includes(expectedName.split('.').pop() || '')) {
138
+ issues.push({
139
+ severity: 'warn',
140
+ code: validation_js_1.ValidationErrorCodes.SCHEMA_NAME_MISMATCH,
141
+ path: `${basePath}.schema`,
142
+ message: `Schema name "${nameFromId}" may not match capability "${expectedName}"`,
143
+ });
144
+ }
145
+ }
146
+ // Check version if present
147
+ if (schemaVersion && schemaVersion !== expectedVersion) {
148
+ issues.push({
149
+ severity: 'info',
150
+ code: validation_js_1.ValidationErrorCodes.SCHEMA_VERSION_MISMATCH,
151
+ path: `${basePath}.schema`,
152
+ message: `Schema version "${schemaVersion}" differs from capability version "${expectedVersion}"`,
153
+ hint: 'Ensure schema and capability versions are aligned',
154
+ });
155
+ }
156
+ return issues;
157
+ }
158
+ /**
159
+ * Extract capability name from schema $id URL
160
+ */
161
+ function extractNameFromSchemaId(schemaId) {
162
+ try {
163
+ const url = new URL(schemaId);
164
+ // Extract last path segment without .json extension
165
+ const pathParts = url.pathname.split('/').filter(Boolean);
166
+ const lastPart = pathParts[pathParts.length - 1] || '';
167
+ return lastPart.replace('.json', '');
168
+ }
169
+ catch {
170
+ // Not a URL, return as-is
171
+ return schemaId;
172
+ }
173
+ }
174
+ /**
175
+ * Fetch profile URL with timeout, checking for HTML responses
176
+ */
177
+ async function fetchProfileWithTimeout(url, timeoutMs) {
178
+ const controller = new AbortController();
179
+ const timeoutId = setTimeout(() => controller.abort(), timeoutMs);
180
+ try {
181
+ const response = await fetch(url, {
182
+ signal: controller.signal,
183
+ headers: {
184
+ 'Accept': 'application/json',
185
+ 'User-Agent': 'UCP-Profile-Validator/1.0',
186
+ },
187
+ });
188
+ clearTimeout(timeoutId);
189
+ if (!response.ok) {
190
+ return {
191
+ success: false,
192
+ error: `HTTP ${response.status}: ${response.statusText}`,
193
+ statusCode: response.status,
194
+ };
195
+ }
196
+ const text = await response.text();
197
+ // Check if response looks like JSON (not HTML)
198
+ if (text.trim().startsWith('<')) {
199
+ return {
200
+ success: false,
201
+ error: 'Response is HTML, not JSON',
202
+ };
203
+ }
204
+ const data = JSON.parse(text);
205
+ const etag = response.headers.get('etag') || undefined;
206
+ return {
207
+ success: true,
208
+ data,
209
+ statusCode: response.status,
210
+ etag,
211
+ };
212
+ }
213
+ catch (error) {
214
+ clearTimeout(timeoutId);
215
+ if (error instanceof Error) {
216
+ if (error.name === 'AbortError') {
217
+ return {
218
+ success: false,
219
+ error: `Request timed out after ${timeoutMs}ms`,
220
+ };
221
+ }
222
+ return {
223
+ success: false,
224
+ error: error.message,
225
+ };
226
+ }
227
+ return {
228
+ success: false,
229
+ error: 'Unknown error occurred',
230
+ };
231
+ }
232
+ }
233
+ /**
234
+ * Fetch URL with timeout
235
+ */
236
+ async function fetchWithTimeout(url, timeoutMs) {
237
+ const controller = new AbortController();
238
+ const timeoutId = setTimeout(() => controller.abort(), timeoutMs);
239
+ try {
240
+ const response = await fetch(url, {
241
+ signal: controller.signal,
242
+ headers: {
243
+ 'Accept': 'application/json',
244
+ 'User-Agent': 'UCP-Profile-Validator/1.0',
245
+ },
246
+ });
247
+ clearTimeout(timeoutId);
248
+ if (!response.ok) {
249
+ return {
250
+ success: false,
251
+ error: `HTTP ${response.status}: ${response.statusText}`,
252
+ statusCode: response.status,
253
+ };
254
+ }
255
+ const data = await response.json();
256
+ const etag = response.headers.get('etag') || undefined;
257
+ return {
258
+ success: true,
259
+ data,
260
+ statusCode: response.status,
261
+ etag,
262
+ };
263
+ }
264
+ catch (error) {
265
+ clearTimeout(timeoutId);
266
+ if (error instanceof Error) {
267
+ if (error.name === 'AbortError') {
268
+ return {
269
+ success: false,
270
+ error: `Request timed out after ${timeoutMs}ms`,
271
+ };
272
+ }
273
+ return {
274
+ success: false,
275
+ error: error.message,
276
+ };
277
+ }
278
+ return {
279
+ success: false,
280
+ error: 'Unknown error occurred',
281
+ };
282
+ }
283
+ }
284
+ /**
285
+ * Get cached schema if valid
286
+ */
287
+ function getCachedSchema(url, cacheTtlMs) {
288
+ const cached = schemaCache.get(url);
289
+ if (!cached) {
290
+ return null;
291
+ }
292
+ const now = new Date().toISOString();
293
+ if (cached.expiresAt < now) {
294
+ schemaCache.delete(url);
295
+ return null;
296
+ }
297
+ return cached.body;
298
+ }
299
+ /**
300
+ * Cache a schema
301
+ */
302
+ function cacheSchema(url, body, etag, cacheTtlMs) {
303
+ const now = new Date();
304
+ const expiresAt = new Date(now.getTime() + cacheTtlMs);
305
+ schemaCache.set(url, {
306
+ url,
307
+ etag,
308
+ fetchedAt: now.toISOString(),
309
+ body,
310
+ expiresAt: expiresAt.toISOString(),
311
+ });
312
+ }
313
+ /**
314
+ * Clear the schema cache
315
+ */
316
+ function clearSchemaCache() {
317
+ schemaCache.clear();
318
+ }
319
+ //# sourceMappingURL=network-validator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"network-validator.js","sourceRoot":"","sources":["../../src/validator/network-validator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * UCP Rules Validator
3
+ * Validates UCP-specific business rules (no network calls)
4
+ */
5
+ import type { UcpProfile } from '../types/ucp-profile.js';
6
+ import type { ValidationIssue } from '../types/validation.js';
7
+ /**
8
+ * Validate UCP business rules
9
+ */
10
+ export declare function validateRules(profile: UcpProfile): ValidationIssue[];
11
+ //# sourceMappingURL=rules-validator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rules-validator.d.ts","sourceRoot":"","sources":["../../src/validator/rules-validator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAiB,MAAM,yBAAyB,CAAC;AACzE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAI9D;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,UAAU,GAAG,eAAe,EAAE,CAgBpE"}
@@ -0,0 +1,257 @@
1
+ "use strict";
2
+ /**
3
+ * UCP Rules Validator
4
+ * Validates UCP-specific business rules (no network calls)
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.validateRules = validateRules;
8
+ const validation_js_1 = require("../types/validation.js");
9
+ const ucp_profile_js_1 = require("../types/ucp-profile.js");
10
+ /**
11
+ * Validate UCP business rules
12
+ */
13
+ function validateRules(profile) {
14
+ const issues = [];
15
+ // Validate namespace/origin binding for capabilities
16
+ issues.push(...validateNamespaceOrigins(profile));
17
+ // Validate extension chains (no orphaned extends)
18
+ issues.push(...validateExtensions(profile));
19
+ // Validate endpoint rules
20
+ issues.push(...validateEndpoints(profile));
21
+ // Validate signing keys if Order capability is present
22
+ issues.push(...validateSigningKeysRequirement(profile));
23
+ return issues;
24
+ }
25
+ /**
26
+ * Validate namespace and URL origin binding
27
+ * - dev.ucp.* capabilities must have spec/schema from ucp.dev
28
+ * - com.vendor.* capabilities must have spec/schema from vendor's domain
29
+ */
30
+ function validateNamespaceOrigins(profile) {
31
+ const issues = [];
32
+ const capabilities = profile.ucp.capabilities || [];
33
+ for (let i = 0; i < capabilities.length; i++) {
34
+ const cap = capabilities[i];
35
+ const path = `$.ucp.capabilities[${i}]`;
36
+ // Check dev.ucp.* namespace
37
+ if (cap.name.startsWith(ucp_profile_js_1.CAPABILITY_NAMESPACES.UCP_OFFICIAL)) {
38
+ // Spec must be from ucp.dev
39
+ if (cap.spec && !isUcpDevOrigin(cap.spec)) {
40
+ issues.push({
41
+ severity: 'error',
42
+ code: validation_js_1.ValidationErrorCodes.NS_ORIGIN_MISMATCH,
43
+ path: `${path}.spec`,
44
+ message: `dev.ucp.* capability spec must be hosted on ucp.dev`,
45
+ hint: `Use https://ucp.dev/specification/... instead of "${cap.spec}"`,
46
+ });
47
+ }
48
+ // Schema must be from ucp.dev
49
+ if (cap.schema && !isUcpDevOrigin(cap.schema)) {
50
+ issues.push({
51
+ severity: 'error',
52
+ code: validation_js_1.ValidationErrorCodes.NS_ORIGIN_MISMATCH,
53
+ path: `${path}.schema`,
54
+ message: `dev.ucp.* capability schema must be hosted on ucp.dev`,
55
+ hint: `Use https://ucp.dev/schemas/... instead of "${cap.schema}"`,
56
+ });
57
+ }
58
+ }
59
+ // Check vendor namespace (com.vendor.*)
60
+ if (cap.name.startsWith(ucp_profile_js_1.CAPABILITY_NAMESPACES.VENDOR_PREFIX)) {
61
+ const vendorDomain = extractVendorDomain(cap.name);
62
+ if (vendorDomain) {
63
+ // Spec origin should match vendor domain
64
+ if (cap.spec && !isOriginFromDomain(cap.spec, vendorDomain)) {
65
+ issues.push({
66
+ severity: 'warn',
67
+ code: validation_js_1.ValidationErrorCodes.NS_ORIGIN_MISMATCH,
68
+ path: `${path}.spec`,
69
+ message: `Vendor capability spec should be hosted on vendor's domain (${vendorDomain})`,
70
+ hint: `Consider hosting spec at https://${vendorDomain}/...`,
71
+ });
72
+ }
73
+ // Schema origin should match vendor domain
74
+ if (cap.schema && !isOriginFromDomain(cap.schema, vendorDomain)) {
75
+ issues.push({
76
+ severity: 'warn',
77
+ code: validation_js_1.ValidationErrorCodes.NS_ORIGIN_MISMATCH,
78
+ path: `${path}.schema`,
79
+ message: `Vendor capability schema should be hosted on vendor's domain (${vendorDomain})`,
80
+ hint: `Consider hosting schema at https://${vendorDomain}/...`,
81
+ });
82
+ }
83
+ }
84
+ }
85
+ }
86
+ return issues;
87
+ }
88
+ /**
89
+ * Validate extension chains - ensure parent capabilities exist
90
+ */
91
+ function validateExtensions(profile) {
92
+ const issues = [];
93
+ const capabilities = profile.ucp.capabilities || [];
94
+ // Build set of capability names
95
+ const capabilityNames = new Set(capabilities.map(c => c.name));
96
+ for (let i = 0; i < capabilities.length; i++) {
97
+ const cap = capabilities[i];
98
+ if (cap.extends) {
99
+ // Check if parent capability exists in this profile
100
+ if (!capabilityNames.has(cap.extends)) {
101
+ issues.push({
102
+ severity: 'error',
103
+ code: validation_js_1.ValidationErrorCodes.ORPHANED_EXTENSION,
104
+ path: `$.ucp.capabilities[${i}].extends`,
105
+ message: `Extension "${cap.name}" references non-existent parent capability "${cap.extends}"`,
106
+ hint: `Add "${cap.extends}" to capabilities or remove the extends field`,
107
+ });
108
+ }
109
+ }
110
+ }
111
+ return issues;
112
+ }
113
+ /**
114
+ * Validate endpoint rules (https, no trailing slash)
115
+ */
116
+ function validateEndpoints(profile) {
117
+ const issues = [];
118
+ const services = profile.ucp.services || {};
119
+ for (const [serviceName, service] of Object.entries(services)) {
120
+ const basePath = `$.ucp.services["${serviceName}"]`;
121
+ // Validate REST endpoint
122
+ if (service.rest?.endpoint) {
123
+ issues.push(...validateEndpoint(service.rest.endpoint, `${basePath}.rest.endpoint`));
124
+ }
125
+ // Validate MCP endpoint
126
+ if (service.mcp?.endpoint) {
127
+ issues.push(...validateEndpoint(service.mcp.endpoint, `${basePath}.mcp.endpoint`));
128
+ }
129
+ // Validate A2A agent card URL
130
+ if (service.a2a?.agentCard) {
131
+ issues.push(...validateEndpoint(service.a2a.agentCard, `${basePath}.a2a.agentCard`));
132
+ }
133
+ }
134
+ return issues;
135
+ }
136
+ /**
137
+ * Validate a single endpoint URL
138
+ */
139
+ function validateEndpoint(endpoint, path) {
140
+ const issues = [];
141
+ // Must be HTTPS
142
+ if (!endpoint.startsWith('https://')) {
143
+ issues.push({
144
+ severity: 'error',
145
+ code: validation_js_1.ValidationErrorCodes.ENDPOINT_NOT_HTTPS,
146
+ path,
147
+ message: `Endpoint must use HTTPS`,
148
+ hint: `Change "${endpoint}" to use https://`,
149
+ });
150
+ }
151
+ // Should not have trailing slash
152
+ if (endpoint.endsWith('/')) {
153
+ issues.push({
154
+ severity: 'warn',
155
+ code: validation_js_1.ValidationErrorCodes.ENDPOINT_TRAILING_SLASH,
156
+ path,
157
+ message: `Endpoint should not have a trailing slash`,
158
+ hint: `Remove trailing slash from "${endpoint}"`,
159
+ });
160
+ }
161
+ // Check for private IP ranges (basic check)
162
+ if (isPrivateIpEndpoint(endpoint)) {
163
+ issues.push({
164
+ severity: 'warn',
165
+ code: validation_js_1.ValidationErrorCodes.PRIVATE_IP_ENDPOINT,
166
+ path,
167
+ message: `Endpoint appears to use a private IP address`,
168
+ hint: `Use a public domain name for production profiles`,
169
+ });
170
+ }
171
+ return issues;
172
+ }
173
+ /**
174
+ * Validate signing keys requirement for Order capability
175
+ */
176
+ function validateSigningKeysRequirement(profile) {
177
+ const issues = [];
178
+ const capabilities = profile.ucp.capabilities || [];
179
+ // Check if Order capability is present
180
+ const hasOrderCapability = capabilities.some(c => c.name === ucp_profile_js_1.KNOWN_CAPABILITIES.ORDER);
181
+ if (hasOrderCapability) {
182
+ // Signing keys should be present for webhook signing
183
+ if (!profile.signing_keys || profile.signing_keys.length === 0) {
184
+ issues.push({
185
+ severity: 'error',
186
+ code: validation_js_1.ValidationErrorCodes.MISSING_SIGNING_KEYS,
187
+ path: '$.signing_keys',
188
+ message: `Order capability requires signing_keys for webhook verification`,
189
+ hint: `Add signing_keys array with at least one JWK public key`,
190
+ });
191
+ }
192
+ }
193
+ return issues;
194
+ }
195
+ /**
196
+ * Check if URL is from ucp.dev origin
197
+ */
198
+ function isUcpDevOrigin(url) {
199
+ try {
200
+ const parsed = new URL(url);
201
+ return parsed.hostname === 'ucp.dev' || parsed.hostname.endsWith('.ucp.dev');
202
+ }
203
+ catch {
204
+ return false;
205
+ }
206
+ }
207
+ /**
208
+ * Extract vendor domain from capability name
209
+ * e.g., "com.example.feature" -> "example.com"
210
+ */
211
+ function extractVendorDomain(name) {
212
+ if (!name.startsWith('com.')) {
213
+ return null;
214
+ }
215
+ const parts = name.split('.');
216
+ if (parts.length < 3) {
217
+ return null;
218
+ }
219
+ // "com.example.feature" -> "example.com"
220
+ return `${parts[1]}.com`;
221
+ }
222
+ /**
223
+ * Check if URL origin matches expected domain
224
+ */
225
+ function isOriginFromDomain(url, domain) {
226
+ try {
227
+ const parsed = new URL(url);
228
+ return parsed.hostname === domain || parsed.hostname.endsWith(`.${domain}`);
229
+ }
230
+ catch {
231
+ return false;
232
+ }
233
+ }
234
+ /**
235
+ * Check if endpoint uses private IP address
236
+ */
237
+ function isPrivateIpEndpoint(endpoint) {
238
+ try {
239
+ const parsed = new URL(endpoint);
240
+ const hostname = parsed.hostname;
241
+ // Check for localhost
242
+ if (hostname === 'localhost' || hostname === '127.0.0.1') {
243
+ return true;
244
+ }
245
+ // Check for private IP ranges (simplified)
246
+ if (hostname.startsWith('10.') ||
247
+ hostname.startsWith('192.168.') ||
248
+ hostname.match(/^172\.(1[6-9]|2[0-9]|3[0-1])\./)) {
249
+ return true;
250
+ }
251
+ return false;
252
+ }
253
+ catch {
254
+ return false;
255
+ }
256
+ }
257
+ //# sourceMappingURL=rules-validator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rules-validator.js","sourceRoot":"","sources":["../../src/validator/rules-validator.ts"],"names":[],"mappings":";AAAA;;;GAGG;;AAUH,sCAgBC;AAtBD,0DAA8D;AAC9D,4DAAoF;AAEpF;;GAEG;AACH,SAAgB,aAAa,CAAC,OAAmB;IAC/C,MAAM,MAAM,GAAsB,EAAE,CAAC;IAErC,qDAAqD;IACrD,MAAM,CAAC,IAAI,CAAC,GAAG,wBAAwB,CAAC,OAAO,CAAC,CAAC,CAAC;IAElD,kDAAkD;IAClD,MAAM,CAAC,IAAI,CAAC,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC;IAE5C,0BAA0B;IAC1B,MAAM,CAAC,IAAI,CAAC,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAAC;IAE3C,uDAAuD;IACvD,MAAM,CAAC,IAAI,CAAC,GAAG,8BAA8B,CAAC,OAAO,CAAC,CAAC,CAAC;IAExD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;GAIG;AACH,SAAS,wBAAwB,CAAC,OAAmB;IACnD,MAAM,MAAM,GAAsB,EAAE,CAAC;IACrC,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,EAAE,CAAC;IAEpD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7C,MAAM,GAAG,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;QAC5B,MAAM,IAAI,GAAG,sBAAsB,CAAC,GAAG,CAAC;QAExC,4BAA4B;QAC5B,IAAI,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,sCAAqB,CAAC,YAAY,CAAC,EAAE,CAAC;YAC5D,4BAA4B;YAC5B,IAAI,GAAG,CAAC,IAAI,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC1C,MAAM,CAAC,IAAI,CAAC;oBACV,QAAQ,EAAE,OAAO;oBACjB,IAAI,EAAE,oCAAoB,CAAC,kBAAkB;oBAC7C,IAAI,EAAE,GAAG,IAAI,OAAO;oBACpB,OAAO,EAAE,qDAAqD;oBAC9D,IAAI,EAAE,qDAAqD,GAAG,CAAC,IAAI,GAAG;iBACvE,CAAC,CAAC;YACL,CAAC;YAED,8BAA8B;YAC9B,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC9C,MAAM,CAAC,IAAI,CAAC;oBACV,QAAQ,EAAE,OAAO;oBACjB,IAAI,EAAE,oCAAoB,CAAC,kBAAkB;oBAC7C,IAAI,EAAE,GAAG,IAAI,SAAS;oBACtB,OAAO,EAAE,uDAAuD;oBAChE,IAAI,EAAE,+CAA+C,GAAG,CAAC,MAAM,GAAG;iBACnE,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,wCAAwC;QACxC,IAAI,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,sCAAqB,CAAC,aAAa,CAAC,EAAE,CAAC;YAC7D,MAAM,YAAY,GAAG,mBAAmB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACnD,IAAI,YAAY,EAAE,CAAC;gBACjB,yCAAyC;gBACzC,IAAI,GAAG,CAAC,IAAI,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,IAAI,EAAE,YAAY,CAAC,EAAE,CAAC;oBAC5D,MAAM,CAAC,IAAI,CAAC;wBACV,QAAQ,EAAE,MAAM;wBAChB,IAAI,EAAE,oCAAoB,CAAC,kBAAkB;wBAC7C,IAAI,EAAE,GAAG,IAAI,OAAO;wBACpB,OAAO,EAAE,+DAA+D,YAAY,GAAG;wBACvF,IAAI,EAAE,oCAAoC,YAAY,MAAM;qBAC7D,CAAC,CAAC;gBACL,CAAC;gBAED,2CAA2C;gBAC3C,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,EAAE,CAAC;oBAChE,MAAM,CAAC,IAAI,CAAC;wBACV,QAAQ,EAAE,MAAM;wBAChB,IAAI,EAAE,oCAAoB,CAAC,kBAAkB;wBAC7C,IAAI,EAAE,GAAG,IAAI,SAAS;wBACtB,OAAO,EAAE,iEAAiE,YAAY,GAAG;wBACzF,IAAI,EAAE,sCAAsC,YAAY,MAAM;qBAC/D,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,SAAS,kBAAkB,CAAC,OAAmB;IAC7C,MAAM,MAAM,GAAsB,EAAE,CAAC;IACrC,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,EAAE,CAAC;IAEpD,gCAAgC;IAChC,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAE/D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7C,MAAM,GAAG,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;QAE5B,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;YAChB,oDAAoD;YACpD,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;gBACtC,MAAM,CAAC,IAAI,CAAC;oBACV,QAAQ,EAAE,OAAO;oBACjB,IAAI,EAAE,oCAAoB,CAAC,kBAAkB;oBAC7C,IAAI,EAAE,sBAAsB,CAAC,WAAW;oBACxC,OAAO,EAAE,cAAc,GAAG,CAAC,IAAI,gDAAgD,GAAG,CAAC,OAAO,GAAG;oBAC7F,IAAI,EAAE,QAAQ,GAAG,CAAC,OAAO,+CAA+C;iBACzE,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,SAAS,iBAAiB,CAAC,OAAmB;IAC5C,MAAM,MAAM,GAAsB,EAAE,CAAC;IACrC,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,EAAE,CAAC;IAE5C,KAAK,MAAM,CAAC,WAAW,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC9D,MAAM,QAAQ,GAAG,mBAAmB,WAAW,IAAI,CAAC;QAEpD,yBAAyB;QACzB,IAAI,OAAO,CAAC,IAAI,EAAE,QAAQ,EAAE,CAAC;YAC3B,MAAM,CAAC,IAAI,CAAC,GAAG,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,QAAQ,gBAAgB,CAAC,CAAC,CAAC;QACvF,CAAC;QAED,wBAAwB;QACxB,IAAI,OAAO,CAAC,GAAG,EAAE,QAAQ,EAAE,CAAC;YAC1B,MAAM,CAAC,IAAI,CAAC,GAAG,gBAAgB,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,QAAQ,eAAe,CAAC,CAAC,CAAC;QACrF,CAAC;QAED,8BAA8B;QAC9B,IAAI,OAAO,CAAC,GAAG,EAAE,SAAS,EAAE,CAAC;YAC3B,MAAM,CAAC,IAAI,CAAC,GAAG,gBAAgB,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,GAAG,QAAQ,gBAAgB,CAAC,CAAC,CAAC;QACvF,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,SAAS,gBAAgB,CAAC,QAAgB,EAAE,IAAY;IACtD,MAAM,MAAM,GAAsB,EAAE,CAAC;IAErC,gBAAgB;IAChB,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QACrC,MAAM,CAAC,IAAI,CAAC;YACV,QAAQ,EAAE,OAAO;YACjB,IAAI,EAAE,oCAAoB,CAAC,kBAAkB;YAC7C,IAAI;YACJ,OAAO,EAAE,yBAAyB;YAClC,IAAI,EAAE,WAAW,QAAQ,mBAAmB;SAC7C,CAAC,CAAC;IACL,CAAC;IAED,iCAAiC;IACjC,IAAI,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QAC3B,MAAM,CAAC,IAAI,CAAC;YACV,QAAQ,EAAE,MAAM;YAChB,IAAI,EAAE,oCAAoB,CAAC,uBAAuB;YAClD,IAAI;YACJ,OAAO,EAAE,2CAA2C;YACpD,IAAI,EAAE,+BAA+B,QAAQ,GAAG;SACjD,CAAC,CAAC;IACL,CAAC;IAED,4CAA4C;IAC5C,IAAI,mBAAmB,CAAC,QAAQ,CAAC,EAAE,CAAC;QAClC,MAAM,CAAC,IAAI,CAAC;YACV,QAAQ,EAAE,MAAM;YAChB,IAAI,EAAE,oCAAoB,CAAC,mBAAmB;YAC9C,IAAI;YACJ,OAAO,EAAE,8CAA8C;YACvD,IAAI,EAAE,kDAAkD;SACzD,CAAC,CAAC;IACL,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,SAAS,8BAA8B,CAAC,OAAmB;IACzD,MAAM,MAAM,GAAsB,EAAE,CAAC;IACrC,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,EAAE,CAAC;IAEpD,uCAAuC;IACvC,MAAM,kBAAkB,GAAG,YAAY,CAAC,IAAI,CAC1C,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,mCAAkB,CAAC,KAAK,CACzC,CAAC;IAEF,IAAI,kBAAkB,EAAE,CAAC;QACvB,qDAAqD;QACrD,IAAI,CAAC,OAAO,CAAC,YAAY,IAAI,OAAO,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC/D,MAAM,CAAC,IAAI,CAAC;gBACV,QAAQ,EAAE,OAAO;gBACjB,IAAI,EAAE,oCAAoB,CAAC,oBAAoB;gBAC/C,IAAI,EAAE,gBAAgB;gBACtB,OAAO,EAAE,iEAAiE;gBAC1E,IAAI,EAAE,yDAAyD;aAChE,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,SAAS,cAAc,CAAC,GAAW;IACjC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;QAC5B,OAAO,MAAM,CAAC,QAAQ,KAAK,SAAS,IAAI,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IAC/E,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,SAAS,mBAAmB,CAAC,IAAY;IACvC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QAC7B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC9B,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,yCAAyC;IACzC,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;AAC3B,CAAC;AAED;;GAEG;AACH,SAAS,kBAAkB,CAAC,GAAW,EAAE,MAAc;IACrD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;QAC5B,OAAO,MAAM,CAAC,QAAQ,KAAK,MAAM,IAAI,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,MAAM,EAAE,CAAC,CAAC;IAC9E,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,mBAAmB,CAAC,QAAgB;IAC3C,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC;QACjC,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;QAEjC,sBAAsB;QACtB,IAAI,QAAQ,KAAK,WAAW,IAAI,QAAQ,KAAK,WAAW,EAAE,CAAC;YACzD,OAAO,IAAI,CAAC;QACd,CAAC;QAED,2CAA2C;QAC3C,IAAI,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC;YAC1B,QAAQ,CAAC,UAAU,CAAC,UAAU,CAAC;YAC/B,QAAQ,CAAC,KAAK,CAAC,gCAAgC,CAAC,EAAE,CAAC;YACrD,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * SDK-based Validator
3
+ * Validates UCP profiles using the official @ucp-js/sdk Zod schemas
4
+ *
5
+ * This provides spec-compliant validation using the official UCP SDK,
6
+ * ensuring alignment with the latest UCP specification.
7
+ */
8
+ import { UcpDiscoveryProfileSchema, UcpClassSchema, UcpServiceSchema, CapabilityDiscoverySchema, SigningKeySchema, type UcpDiscoveryProfile, type UcpClass, type UcpService, type CapabilityDiscovery, type SigningKey } from '@ucp-js/sdk';
9
+ import type { ValidationIssue } from '../types/validation.js';
10
+ /**
11
+ * SDK validation result
12
+ */
13
+ export interface SdkValidationResult {
14
+ valid: boolean;
15
+ issues: ValidationIssue[];
16
+ sdkVersion: string;
17
+ parsedProfile?: UcpDiscoveryProfile;
18
+ }
19
+ /**
20
+ * Get the current SDK version
21
+ */
22
+ export declare function getSdkVersion(): string;
23
+ /**
24
+ * Validate a UCP profile using the official SDK schema
25
+ *
26
+ * This uses the UcpDiscoveryProfileSchema from @ucp-js/sdk to validate
27
+ * the entire profile structure against the official UCP specification.
28
+ */
29
+ export declare function validateWithSdk(profile: unknown): SdkValidationResult;
30
+ /**
31
+ * Safe parse - doesn't throw, returns result with errors
32
+ */
33
+ export declare function safeValidateWithSdk(profile: unknown): SdkValidationResult;
34
+ /**
35
+ * Validate only the UCP object (version, services, capabilities)
36
+ */
37
+ export declare function validateUcpObject(ucp: unknown): SdkValidationResult;
38
+ /**
39
+ * Validate a single service definition
40
+ */
41
+ export declare function validateServiceWithSdk(serviceName: string, service: unknown): SdkValidationResult;
42
+ /**
43
+ * Validate a single capability definition
44
+ */
45
+ export declare function validateCapabilityWithSdk(index: number, capability: unknown): SdkValidationResult;
46
+ /**
47
+ * Validate signing keys array
48
+ */
49
+ export declare function validateSigningKeysWithSdk(signingKeys: unknown): SdkValidationResult;
50
+ /**
51
+ * Check if a profile passes SDK validation (quick boolean check)
52
+ */
53
+ export declare function isSdkCompliant(profile: unknown): boolean;
54
+ /**
55
+ * Export SDK schemas for direct use
56
+ */
57
+ export { UcpDiscoveryProfileSchema, UcpClassSchema, UcpServiceSchema, CapabilityDiscoverySchema, SigningKeySchema, type UcpDiscoveryProfile, type UcpClass, type UcpService, type CapabilityDiscovery, type SigningKey, };
58
+ //# sourceMappingURL=sdk-validator.d.ts.map