@kya-os/contracts 1.5.3-canary.2 → 1.5.3-canary.21

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 (90) hide show
  1. package/.turbo/turbo-build.log +17 -0
  2. package/.turbo/turbo-test$colon$coverage.log +85 -0
  3. package/.turbo/turbo-test.log +32 -0
  4. package/coverage/coverage-final.json +38 -0
  5. package/dist/agentshield-api/admin-schemas.d.ts +2 -2
  6. package/dist/agentshield-api/index.d.ts +1 -1
  7. package/dist/agentshield-api/schemas.d.ts +150 -48
  8. package/dist/agentshield-api/schemas.js +32 -4
  9. package/dist/agentshield-api/types.d.ts +31 -4
  10. package/dist/audit/index.d.ts +193 -0
  11. package/dist/audit/index.js +100 -0
  12. package/dist/config/identity.d.ts +205 -2
  13. package/dist/config/identity.js +28 -0
  14. package/dist/config/index.d.ts +2 -1
  15. package/dist/config/tool-context.d.ts +34 -0
  16. package/dist/config/tool-context.js +13 -0
  17. package/dist/consent/schemas.d.ts +119 -93
  18. package/dist/consent/schemas.js +111 -64
  19. package/dist/dashboard-config/schemas.d.ts +2248 -992
  20. package/dist/handshake.d.ts +14 -14
  21. package/dist/index.d.ts +1 -0
  22. package/dist/index.js +2 -0
  23. package/dist/tool-protection/index.d.ts +490 -14
  24. package/dist/tool-protection/index.js +89 -2
  25. package/dist/verifier/index.d.ts +1 -0
  26. package/dist/verifier/index.js +18 -0
  27. package/dist/well-known/index.d.ts +2 -2
  28. package/package.json +43 -122
  29. package/schemas/cli/register-output/v1.0.0.json +69 -0
  30. package/schemas/identity/v1.0.0.json +46 -0
  31. package/schemas/proof/v1.0.0.json +80 -0
  32. package/schemas/registry/receipt-v1.0.0.json +60 -0
  33. package/schemas/verifier/verify-page/v1.0.0.json +94 -0
  34. package/schemas/well-known/agent/v1.0.0.json +67 -0
  35. package/schemas/well-known/did/v1.0.0.json +174 -0
  36. package/scripts/emit-schemas.js +11 -0
  37. package/src/agentshield-api/admin-schemas.ts +31 -0
  38. package/src/agentshield-api/admin-types.ts +47 -0
  39. package/src/agentshield-api/endpoints.ts +60 -0
  40. package/src/agentshield-api/index.ts +70 -0
  41. package/src/agentshield-api/schemas.ts +304 -0
  42. package/src/agentshield-api/types.ts +317 -0
  43. package/src/audit/index.ts +128 -0
  44. package/src/cli.ts +156 -0
  45. package/src/config/base.ts +107 -0
  46. package/src/config/builder.ts +97 -0
  47. package/src/config/delegation.ts +232 -0
  48. package/src/config/identity.ts +252 -0
  49. package/src/config/index.ts +78 -0
  50. package/src/config/proofing.ts +138 -0
  51. package/src/config/tool-context.ts +41 -0
  52. package/src/config/tool-protection.ts +174 -0
  53. package/src/consent/index.ts +32 -0
  54. package/src/consent/schemas.ts +334 -0
  55. package/src/consent/types.ts +199 -0
  56. package/src/dashboard-config/default-config.json +86 -0
  57. package/src/dashboard-config/default-config.ts +266 -0
  58. package/src/dashboard-config/index.ts +48 -0
  59. package/src/dashboard-config/schemas.ts +286 -0
  60. package/src/dashboard-config/types.ts +404 -0
  61. package/src/delegation/constraints.ts +267 -0
  62. package/src/delegation/index.ts +8 -0
  63. package/src/delegation/schemas.ts +595 -0
  64. package/src/did/index.ts +9 -0
  65. package/src/did/resolve-contract.ts +255 -0
  66. package/src/did/schemas.ts +190 -0
  67. package/src/did/types.ts +224 -0
  68. package/src/env/constants.ts +70 -0
  69. package/src/env/index.ts +5 -0
  70. package/src/handshake.ts +125 -0
  71. package/src/index.ts +45 -0
  72. package/src/proof/index.ts +31 -0
  73. package/src/proof/proof-record.ts +163 -0
  74. package/src/proof/signing-spec.ts +146 -0
  75. package/src/proof.ts +99 -0
  76. package/src/registry.ts +146 -0
  77. package/src/runtime/errors.ts +153 -0
  78. package/src/runtime/headers.ts +136 -0
  79. package/src/runtime/index.ts +6 -0
  80. package/src/test.ts +143 -0
  81. package/src/tlkrc/index.ts +5 -0
  82. package/src/tlkrc/rotation.ts +153 -0
  83. package/src/tool-protection/index.ts +406 -0
  84. package/src/utils/validation.ts +93 -0
  85. package/src/vc/index.ts +8 -0
  86. package/src/vc/schemas.ts +277 -0
  87. package/src/vc/statuslist.ts +279 -0
  88. package/src/verifier/index.ts +2 -0
  89. package/src/verifier.ts +92 -0
  90. package/src/well-known/index.ts +237 -0
@@ -0,0 +1,266 @@
1
+ /**
2
+ * Default Configuration for MCP-I Servers
3
+ *
4
+ * Provides safe, production-ready defaults for new user configurations.
5
+ * Used by AgentShield Dashboard, Scaffolder, and Runtime fallbacks.
6
+ *
7
+ * @package @kya-os/contracts/dashboard-config
8
+ */
9
+
10
+ import type { MCPIServerConfig } from "./types.js";
11
+ import { mcpIServerConfigSchema } from "./schemas.js";
12
+ import { z } from "zod";
13
+
14
+ /**
15
+ * Default configuration JSON content
16
+ * Embedded here to avoid TypeScript JSON import issues in build
17
+ */
18
+ const defaultConfigJson = {
19
+ identity: {
20
+ // agentDid removed - deprecated, use serverDid instead
21
+ serverDid: "", // New field - will be populated when identity is generated
22
+ environment: "development" as const,
23
+ storageLocation: "env-vars" as const,
24
+ },
25
+ proofing: {
26
+ enabled: true,
27
+ destinations: [
28
+ {
29
+ type: "agentshield" as const,
30
+ apiUrl: "https://kya.vouched.id",
31
+ },
32
+ ],
33
+ batchQueue: {
34
+ maxBatchSize: 10,
35
+ flushIntervalMs: 5000,
36
+ maxRetries: 3,
37
+ },
38
+ },
39
+ delegation: {
40
+ enabled: true,
41
+ enforceStrictly: false,
42
+ verifier: {
43
+ type: "agentshield" as const,
44
+ apiUrl: "https://kya.vouched.id/api/v1/bouncer/delegations/verify",
45
+ cacheTtl: 300000,
46
+ },
47
+ authorization: {
48
+ authorizationUrl:
49
+ "https://kya.vouched.id/api/v1/bouncer/delegations/authorize",
50
+ minReputationScore: 80,
51
+ resumeTokenTtl: 3600000,
52
+ requireAuthForUnknown: false,
53
+ },
54
+ },
55
+ toolProtection: {
56
+ source: "agentshield" as const,
57
+ agentShield: {
58
+ apiUrl: "https://kya.vouched.id",
59
+ cacheTtl: 300000,
60
+ },
61
+ fallback: {},
62
+ },
63
+ audit: {
64
+ enabled: true,
65
+ includeProofHashes: false,
66
+ includePayloads: false,
67
+ },
68
+ session: {
69
+ timestampSkewSeconds: 120,
70
+ ttlMinutes: 30,
71
+ },
72
+ platform: {
73
+ type: "node" as const,
74
+ node: {
75
+ server: {
76
+ port: 3000,
77
+ host: "0.0.0.0",
78
+ cors: true,
79
+ timeout: 30000,
80
+ },
81
+ storage: {
82
+ type: "memory" as const,
83
+ },
84
+ },
85
+ cloudflare: {
86
+ workers: {
87
+ cpuMs: 50,
88
+ memoryMb: 128,
89
+ },
90
+ kvNamespaces: [],
91
+ environmentVariables: [],
92
+ },
93
+ vercel: {
94
+ environmentVariables: [],
95
+ edgeRuntime: {},
96
+ },
97
+ },
98
+ metadata: {
99
+ version: "1.0.0",
100
+ lastUpdated: "",
101
+ source: "dashboard" as const,
102
+ deploymentStatus: "inactive" as const,
103
+ },
104
+ };
105
+
106
+ /**
107
+ * Relaxed schema for default config validation
108
+ * Allows empty strings for fields that will be populated later
109
+ *
110
+ * Note: Empty `agentDid` is valid for new/incomplete configurations.
111
+ * This allows users to create configs before registering their agent DID.
112
+ * The base schema (mcpIServerConfigSchema) requires non-empty agentDid for
113
+ * complete configurations, but defaults allow empty to support progressive
114
+ * configuration.
115
+ */
116
+ const defaultConfigSchema = mcpIServerConfigSchema.extend({
117
+ identity: mcpIServerConfigSchema.shape.identity.extend({
118
+ agentDid: z.string().optional(), // Allow empty string or undefined for defaults (deprecated)
119
+ serverDid: z.string(), // Allow empty string for defaults (will be populated later)
120
+ }),
121
+ metadata: mcpIServerConfigSchema.shape.metadata.extend({
122
+ lastUpdated: z.string(), // Allow empty string (will be set dynamically)
123
+ }),
124
+ });
125
+
126
+ /**
127
+ * Default configuration object
128
+ *
129
+ * This is the base default configuration used when creating new user configs.
130
+ * Platform-specific defaults are available via getDefaultConfigForPlatform().
131
+ */
132
+ export const defaultConfig: MCPIServerConfig = defaultConfigSchema.parse(
133
+ defaultConfigJson
134
+ ) as MCPIServerConfig;
135
+
136
+ /**
137
+ * Platform-specific default configurations
138
+ */
139
+ const platformDefaults = {
140
+ node: {
141
+ platform: {
142
+ type: "node" as const,
143
+ node: {
144
+ server: {
145
+ port: 3000,
146
+ host: "0.0.0.0",
147
+ cors: true,
148
+ timeout: 30000,
149
+ },
150
+ storage: {
151
+ type: "memory" as const,
152
+ },
153
+ },
154
+ },
155
+ },
156
+ cloudflare: {
157
+ platform: {
158
+ type: "cloudflare" as const,
159
+ cloudflare: {
160
+ workers: {
161
+ cpuMs: 50,
162
+ memoryMb: 128,
163
+ },
164
+ kvNamespaces: [],
165
+ environmentVariables: [],
166
+ },
167
+ },
168
+ },
169
+ vercel: {
170
+ platform: {
171
+ type: "vercel" as const,
172
+ vercel: {
173
+ environmentVariables: [],
174
+ edgeRuntime: {},
175
+ },
176
+ },
177
+ },
178
+ };
179
+
180
+ /**
181
+ * Get default configuration for a specific platform
182
+ *
183
+ * Returns the base default config merged with platform-specific defaults.
184
+ *
185
+ * @param platform - Platform type ('node', 'cloudflare', or 'vercel')
186
+ * @returns Platform-specific default configuration
187
+ *
188
+ * @example
189
+ * ```typescript
190
+ * const nodeConfig = getDefaultConfigForPlatform('node');
191
+ * const cloudflareConfig = getDefaultConfigForPlatform('cloudflare');
192
+ * ```
193
+ */
194
+ export function getDefaultConfigForPlatform(
195
+ platform: "node" | "cloudflare" | "vercel"
196
+ ): MCPIServerConfig {
197
+ const platformDefault = platformDefaults[platform];
198
+
199
+ return {
200
+ ...defaultConfig,
201
+ platform: platformDefault.platform,
202
+ } as MCPIServerConfig;
203
+ }
204
+
205
+ /**
206
+ * Deep merge utility for objects
207
+ */
208
+ function deepMerge<T extends Record<string, unknown>>(
209
+ target: T,
210
+ source: Partial<T>
211
+ ): T {
212
+ const result = { ...target } as T;
213
+
214
+ for (const key in source) {
215
+ const sourceValue = source[key];
216
+ if (
217
+ sourceValue &&
218
+ typeof sourceValue === "object" &&
219
+ !Array.isArray(sourceValue) &&
220
+ sourceValue !== null
221
+ ) {
222
+ const targetValue = target[key];
223
+ if (
224
+ targetValue &&
225
+ typeof targetValue === "object" &&
226
+ !Array.isArray(targetValue) &&
227
+ targetValue !== null
228
+ ) {
229
+ result[key] = deepMerge(
230
+ targetValue as Record<string, unknown>,
231
+ sourceValue as Record<string, unknown>
232
+ ) as T[Extract<keyof T, string>];
233
+ }
234
+ } else if (sourceValue !== undefined) {
235
+ result[key] = sourceValue as T[Extract<keyof T, string>];
236
+ }
237
+ }
238
+
239
+ return result;
240
+ }
241
+
242
+ /**
243
+ * Merge partial configuration with defaults
244
+ *
245
+ * Deep merges a partial configuration object with the base defaults,
246
+ * ensuring all required fields are present.
247
+ *
248
+ * @param partial - Partial configuration to merge with defaults
249
+ * @returns Complete configuration with defaults applied
250
+ *
251
+ * @example
252
+ * ```typescript
253
+ * const config = mergeWithDefaults({
254
+ * proofing: { enabled: false },
255
+ * identity: { environment: 'production' }
256
+ * });
257
+ * ```
258
+ */
259
+ export function mergeWithDefaults(
260
+ partial: Partial<MCPIServerConfig>
261
+ ): MCPIServerConfig {
262
+ return deepMerge(
263
+ defaultConfig as unknown as Record<string, unknown>,
264
+ partial as unknown as Record<string, unknown>
265
+ ) as unknown as MCPIServerConfig;
266
+ }
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Dashboard Configuration Module
3
+ *
4
+ * Central export point for dashboard configuration types and schemas.
5
+ *
6
+ * @package @kya-os/contracts/dashboard-config
7
+ */
8
+
9
+ // Type exports
10
+ export type {
11
+ MCPIServerConfig,
12
+ GetServerConfigRequest,
13
+ GetServerConfigResponse,
14
+ UpdateServerConfigRequest,
15
+ UpdateServerConfigResponse,
16
+ ValidateServerConfigRequest,
17
+ ValidateServerConfigResponse,
18
+ } from './types.js';
19
+
20
+ // Schema exports
21
+ export {
22
+ identityConfigSchema,
23
+ proofingConfigSchema,
24
+ delegationConfigSchema,
25
+ toolProtectionConfigSchema,
26
+ auditConfigSchema,
27
+ sessionConfigSchema,
28
+ platformConfigSchema,
29
+ cloudflarePlatformConfigSchema,
30
+ nodePlatformConfigSchema,
31
+ vercelPlatformConfigSchema,
32
+ configMetadataSchema,
33
+ mcpIServerConfigSchema,
34
+ getServerConfigRequestSchema,
35
+ getServerConfigResponseSchema,
36
+ updateServerConfigRequestSchema,
37
+ updateServerConfigResponseSchema,
38
+ validateServerConfigRequestSchema,
39
+ validateServerConfigResponseSchema,
40
+ } from './schemas.js';
41
+
42
+ // Default configuration exports
43
+ export {
44
+ defaultConfig,
45
+ getDefaultConfigForPlatform,
46
+ mergeWithDefaults,
47
+ } from './default-config.js';
48
+
@@ -0,0 +1,286 @@
1
+ /**
2
+ * Dashboard Configuration Zod Schemas
3
+ *
4
+ * Runtime validation schemas for dashboard configuration types.
5
+ * Used for validating API requests and responses.
6
+ *
7
+ * @package @kya-os/contracts/dashboard-config
8
+ */
9
+
10
+ import { z } from 'zod';
11
+ import { ToolProtectionSchema, ToolProtectionMapSchema } from '../tool-protection/index.js';
12
+
13
+ /**
14
+ * Identity configuration schema
15
+ */
16
+ export const identityConfigSchema = z.object({
17
+ /**
18
+ * @deprecated Use serverDid instead. Will be removed in v2.0
19
+ */
20
+ agentDid: z.string().min(1).optional(),
21
+ serverDid: z.string().min(1),
22
+ environment: z.enum(['development', 'production']),
23
+ storageLocation: z.enum(['cloudflare-kv', 'file-system', 'env-vars']),
24
+ });
25
+
26
+ /**
27
+ * Proofing configuration schema
28
+ */
29
+ export const proofingConfigSchema = z.object({
30
+ enabled: z.boolean(),
31
+ destinations: z.array(
32
+ z.object({
33
+ type: z.enum(['agentshield', 'kta', 'custom']),
34
+ apiUrl: z.string().url(),
35
+ apiKey: z.string().optional(),
36
+ })
37
+ ),
38
+ batchQueue: z.object({
39
+ maxBatchSize: z.number().int().positive().default(10),
40
+ flushIntervalMs: z.number().int().positive().default(5000),
41
+ maxRetries: z.number().int().nonnegative().default(3),
42
+ }),
43
+ });
44
+
45
+ /**
46
+ * Delegation verifier type schema
47
+ */
48
+ const delegationVerifierTypeSchema = z.enum([
49
+ 'agentshield',
50
+ 'kta',
51
+ 'memory',
52
+ 'cloudflare-kv',
53
+ 'redis',
54
+ 'dynamodb',
55
+ 'custom',
56
+ ]);
57
+
58
+ /**
59
+ * Delegation configuration schema
60
+ */
61
+ export const delegationConfigSchema = z.object({
62
+ enabled: z.boolean(),
63
+ enforceStrictly: z.boolean(),
64
+ verifier: z.object({
65
+ type: delegationVerifierTypeSchema,
66
+ apiUrl: z.string().url().optional(),
67
+ cacheTtl: z.number().int().positive().optional(),
68
+ }),
69
+ authorization: z.object({
70
+ authorizationUrl: z.string().url().optional(),
71
+ minReputationScore: z.number().int().min(0).max(100).optional(),
72
+ resumeTokenTtl: z.number().int().positive().optional(),
73
+ requireAuthForUnknown: z.boolean().optional(),
74
+ }),
75
+ });
76
+
77
+ /**
78
+ * Tool protection configuration schema
79
+ */
80
+ export const toolProtectionConfigSchema = z.object({
81
+ source: z.enum(['agentshield', 'inline', 'file']),
82
+ agentShield: z.object({
83
+ apiUrl: z.string().url(),
84
+ cacheTtl: z.number().int().positive(),
85
+ }).optional(),
86
+ fallback: ToolProtectionMapSchema.optional(),
87
+ });
88
+
89
+ /**
90
+ * Audit configuration schema
91
+ */
92
+ export const auditConfigSchema = z.object({
93
+ enabled: z.boolean(),
94
+ includeProofHashes: z.boolean(),
95
+ includePayloads: z.boolean(),
96
+ });
97
+
98
+ /**
99
+ * Session configuration schema
100
+ */
101
+ export const sessionConfigSchema = z.object({
102
+ timestampSkewSeconds: z.number().int().positive().default(120),
103
+ ttlMinutes: z.number().int().positive().default(30),
104
+ absoluteLifetime: z.number().int().positive().optional(),
105
+ });
106
+
107
+ /**
108
+ * Cloudflare platform configuration schema
109
+ */
110
+ export const cloudflarePlatformConfigSchema = z.object({
111
+ workers: z.object({
112
+ cpuMs: z.number().int().positive().default(50),
113
+ memoryMb: z.number().int().positive().default(128),
114
+ }),
115
+ kvNamespaces: z.array(
116
+ z.object({
117
+ name: z.string().min(1),
118
+ purpose: z.enum(['sessions', 'delegations', 'cache', 'general']),
119
+ })
120
+ ),
121
+ environmentVariables: z.array(
122
+ z.object({
123
+ name: z.string().min(1),
124
+ value: z.string(),
125
+ source: z.enum(['wrangler.toml', 'secrets', '.dev.vars']),
126
+ })
127
+ ),
128
+ });
129
+
130
+ /**
131
+ * Node.js platform configuration schema
132
+ */
133
+ export const nodePlatformConfigSchema = z.object({
134
+ server: z.object({
135
+ port: z.number().int().positive().default(3000),
136
+ host: z.string().default('0.0.0.0'),
137
+ cors: z.boolean().default(true),
138
+ timeout: z.number().int().positive().default(30000),
139
+ }),
140
+ storage: z.object({
141
+ type: z.enum(['memory', 'redis', 'postgres', 'mongodb']),
142
+ connection: z.object({
143
+ host: z.string().optional(),
144
+ port: z.number().int().positive().optional(),
145
+ database: z.string().optional(),
146
+ }).optional(),
147
+ }),
148
+ });
149
+
150
+ /**
151
+ * Vercel platform configuration schema
152
+ */
153
+ export const vercelPlatformConfigSchema = z.object({
154
+ environmentVariables: z.array(
155
+ z.object({
156
+ name: z.string().min(1),
157
+ value: z.string(),
158
+ source: z.enum(['vercel-dashboard', '.env.local']),
159
+ })
160
+ ),
161
+ edgeRuntime: z.object({
162
+ maxDuration: z.number().int().positive().optional(),
163
+ regions: z.array(z.string()).optional(),
164
+ }).optional(),
165
+ });
166
+
167
+ /**
168
+ * Platform configuration schema
169
+ */
170
+ export const platformConfigSchema = z.object({
171
+ type: z.enum(['cloudflare', 'node', 'vercel']),
172
+ cloudflare: cloudflarePlatformConfigSchema.optional(),
173
+ node: nodePlatformConfigSchema.optional(),
174
+ vercel: vercelPlatformConfigSchema.optional(),
175
+ });
176
+
177
+ /**
178
+ * Metadata schema
179
+ */
180
+ export const configMetadataSchema = z.object({
181
+ version: z.string(),
182
+ lastUpdated: z.string(),
183
+ source: z.enum(['dashboard', 'code', 'mixed']),
184
+ serverUrl: z.string().url().optional(),
185
+ deploymentStatus: z.enum(['active', 'inactive', 'error']).optional(),
186
+ });
187
+
188
+ /**
189
+ * Complete MCP-I Server Configuration schema
190
+ */
191
+ export const mcpIServerConfigSchema = z.object({
192
+ identity: identityConfigSchema,
193
+ proofing: proofingConfigSchema,
194
+ delegation: delegationConfigSchema,
195
+ toolProtection: toolProtectionConfigSchema,
196
+ audit: auditConfigSchema,
197
+ session: sessionConfigSchema,
198
+ platform: platformConfigSchema,
199
+ metadata: configMetadataSchema,
200
+ });
201
+
202
+ /**
203
+ * Get server config request schema
204
+ */
205
+ export const getServerConfigRequestSchema = z.object({
206
+ projectId: z.string().min(1),
207
+ });
208
+
209
+ /**
210
+ * Get server config response schema
211
+ */
212
+ export const getServerConfigResponseSchema = z.object({
213
+ success: z.boolean(),
214
+ data: z.object({
215
+ config: mcpIServerConfigSchema,
216
+ }),
217
+ metadata: z.object({
218
+ requestId: z.string().optional(),
219
+ timestamp: z.string().optional(),
220
+ }).optional(),
221
+ });
222
+
223
+ /**
224
+ * Update server config request schema
225
+ */
226
+ export const updateServerConfigRequestSchema = z.object({
227
+ projectId: z.string().min(1),
228
+ config: mcpIServerConfigSchema.partial(),
229
+ });
230
+
231
+ /**
232
+ * Update server config response schema
233
+ */
234
+ export const updateServerConfigResponseSchema = z.object({
235
+ success: z.boolean(),
236
+ data: z.object({
237
+ config: mcpIServerConfigSchema,
238
+ changes: z.array(
239
+ z.object({
240
+ path: z.string(),
241
+ oldValue: z.unknown(),
242
+ newValue: z.unknown(),
243
+ })
244
+ ),
245
+ }),
246
+ metadata: z.object({
247
+ requestId: z.string().optional(),
248
+ timestamp: z.string().optional(),
249
+ }).optional(),
250
+ });
251
+
252
+ /**
253
+ * Validate server config request schema
254
+ */
255
+ export const validateServerConfigRequestSchema = z.object({
256
+ projectId: z.string().min(1),
257
+ config: mcpIServerConfigSchema.partial(),
258
+ });
259
+
260
+ /**
261
+ * Validate server config response schema
262
+ */
263
+ export const validateServerConfigResponseSchema = z.object({
264
+ success: z.boolean(),
265
+ data: z.object({
266
+ valid: z.boolean(),
267
+ errors: z.array(
268
+ z.object({
269
+ path: z.string(),
270
+ message: z.string(),
271
+ code: z.string(),
272
+ })
273
+ ).optional(),
274
+ warnings: z.array(
275
+ z.object({
276
+ path: z.string(),
277
+ message: z.string(),
278
+ })
279
+ ).optional(),
280
+ }),
281
+ metadata: z.object({
282
+ requestId: z.string().optional(),
283
+ timestamp: z.string().optional(),
284
+ }).optional(),
285
+ });
286
+