@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,334 @@
1
+ /**
2
+ * Consent Schemas
3
+ *
4
+ * Zod schemas for runtime validation of consent-related data structures.
5
+ * All types are derived from these schemas using z.infer.
6
+ *
7
+ * Related Spec: MCP-I Phase 0 Implementation Plan
8
+ */
9
+
10
+ import { z } from "zod";
11
+
12
+ /**
13
+ * Consent Branding Schema
14
+ */
15
+ export const consentBrandingSchema = z.object({
16
+ primaryColor: z
17
+ .string()
18
+ .regex(/^#[0-9A-Fa-f]{6}$/, "Must be a valid hex color (e.g., #0066CC)")
19
+ .optional(),
20
+ logoUrl: z.string().url("Must be a valid URL").optional(),
21
+ companyName: z
22
+ .string()
23
+ .max(100, "Company name must be 100 characters or less")
24
+ .optional(),
25
+ theme: z.enum(["light", "dark", "auto"]).optional(),
26
+ });
27
+
28
+ export type ConsentBranding = z.infer<typeof consentBrandingSchema>;
29
+
30
+ /**
31
+ * Consent Terms Schema
32
+ */
33
+ export const consentTermsSchema = z.object({
34
+ text: z
35
+ .string()
36
+ .max(10000, "Terms text must be 10000 characters or less")
37
+ .optional(),
38
+ url: z.string().url("Must be a valid URL").optional(),
39
+ version: z
40
+ .string()
41
+ .max(50, "Version must be 50 characters or less")
42
+ .optional(),
43
+ required: z.boolean().default(true),
44
+ });
45
+
46
+ export type ConsentTerms = z.infer<typeof consentTermsSchema>;
47
+
48
+ /**
49
+ * Consent Custom Field Option Schema
50
+ */
51
+ export const consentCustomFieldOptionSchema = z.object({
52
+ value: z.string().max(100, "Option value must be 100 characters or less"),
53
+ label: z.string().max(100, "Option label must be 100 characters or less"),
54
+ });
55
+
56
+ /**
57
+ * Consent Custom Field Schema
58
+ */
59
+ export const consentCustomFieldSchema = z
60
+ .object({
61
+ name: z
62
+ .string()
63
+ .min(1, "Field name is required")
64
+ .max(50, "Field name must be 50 characters or less")
65
+ .regex(
66
+ /^[a-zA-Z0-9_]+$/,
67
+ "Field name must contain only letters, numbers, and underscores"
68
+ ),
69
+ label: z
70
+ .string()
71
+ .min(1, "Field label is required")
72
+ .max(100, "Field label must be 100 characters or less"),
73
+ type: z.enum(["text", "textarea", "checkbox", "select"]),
74
+ required: z.boolean(),
75
+ placeholder: z
76
+ .string()
77
+ .max(200, "Placeholder must be 200 characters or less")
78
+ .optional(),
79
+ options: z
80
+ .array(consentCustomFieldOptionSchema)
81
+ .min(1, "Select fields must have at least one option")
82
+ .optional(),
83
+ pattern: z
84
+ .string()
85
+ .max(500, "Pattern must be 500 characters or less")
86
+ .optional(),
87
+ })
88
+ .refine(
89
+ (data) => {
90
+ // Select fields must have options
91
+ if (
92
+ data.type === "select" &&
93
+ (!data.options || data.options.length === 0)
94
+ ) {
95
+ return false;
96
+ }
97
+ // Non-select fields should not have options
98
+ if (data.type !== "select" && data.options) {
99
+ return false;
100
+ }
101
+ return true;
102
+ },
103
+ {
104
+ message:
105
+ "Select fields must have options, and non-select fields must not have options",
106
+ }
107
+ );
108
+
109
+ export type ConsentCustomField = z.infer<typeof consentCustomFieldSchema>;
110
+
111
+ /**
112
+ * OAuth Identity Schema
113
+ *
114
+ * Represents a user's OAuth provider account information.
115
+ * Used in Phase 4 to link OAuth accounts to persistent User DIDs.
116
+ */
117
+ export const oauthIdentitySchema = z.object({
118
+ /**
119
+ * OAuth provider name (e.g., "google", "github", "microsoft")
120
+ */
121
+ provider: z
122
+ .string()
123
+ .min(1, "Provider is required")
124
+ .max(50, "Provider name must be 50 characters or less"),
125
+
126
+ /**
127
+ * OAuth subject identifier (unique user ID from provider)
128
+ * @example "123456789" (Google), "github-user-id" (GitHub)
129
+ */
130
+ subject: z
131
+ .string()
132
+ .min(1, "Subject is required")
133
+ .max(255, "Subject must be 255 characters or less"),
134
+
135
+ /**
136
+ * User's email address from OAuth provider (optional)
137
+ */
138
+ email: z
139
+ .string()
140
+ .email("Must be a valid email address")
141
+ .max(255, "Email must be 255 characters or less")
142
+ .optional(),
143
+
144
+ /**
145
+ * User's display name from OAuth provider (optional)
146
+ */
147
+ name: z.string().max(255, "Name must be 255 characters or less").optional(),
148
+ });
149
+
150
+ export type OAuthIdentity = z.infer<typeof oauthIdentitySchema>;
151
+
152
+ /**
153
+ * Consent Page Config Schema
154
+ */
155
+ export const consentPageConfigSchema = z.object({
156
+ tool: z.string().min(1, "Tool name is required"),
157
+ toolDescription: z
158
+ .string()
159
+ .max(500, "Tool description must be 500 characters or less"),
160
+ scopes: z.array(z.string()).min(0, "Scopes array cannot be negative"),
161
+ agentDid: z.string().min(1, "Agent DID is required"),
162
+ sessionId: z.string().min(1, "Session ID is required"),
163
+ projectId: z.string().min(1, "Project ID is required"),
164
+ provider: z.string().optional(), // Phase 2: OAuth provider name (e.g., "github", "google")
165
+ branding: consentBrandingSchema.optional(),
166
+ terms: consentTermsSchema.optional(),
167
+ customFields: z
168
+ .array(consentCustomFieldSchema)
169
+ .max(10, "Maximum 10 custom fields allowed")
170
+ .optional(),
171
+ serverUrl: z.string().url("Server URL must be a valid URL"),
172
+ autoClose: z.boolean().optional(),
173
+ /**
174
+ * Whether OAuth authorization is required immediately
175
+ * If true, the consent page will act as a landing page before redirecting
176
+ */
177
+ oauthRequired: z.boolean().optional(),
178
+ /**
179
+ * The OAuth authorization URL to redirect to
180
+ * Required if oauthRequired is true
181
+ */
182
+ oauthUrl: z.string().url().optional(),
183
+ });
184
+
185
+ export type ConsentPageConfig = z.infer<typeof consentPageConfigSchema>;
186
+
187
+ /**
188
+ * Consent Approval Request Schema
189
+ *
190
+ * Note: Uses snake_case for API compatibility (agent_did, session_id, project_id)
191
+ *
192
+ * Phase 4 additions:
193
+ * - oauth_identity: Optional OAuth provider information for identity linking
194
+ * - user_did: Optional User DID for persistent identity (if already known)
195
+ */
196
+ export const consentApprovalRequestSchema = z.object({
197
+ tool: z.string().min(1, "Tool name is required"),
198
+ scopes: z.array(z.string()).min(0, "Scopes array cannot be negative"),
199
+ agent_did: z.string().min(1, "Agent DID is required"),
200
+ session_id: z.string().min(1, "Session ID is required"),
201
+ project_id: z.string().min(1, "Project ID is required"),
202
+ termsAccepted: z.boolean(),
203
+ termsVersion: z
204
+ .string()
205
+ .max(50, "Terms version must be 50 characters or less")
206
+ .optional(),
207
+ customFields: z.record(z.union([z.string(), z.boolean()])).optional(),
208
+
209
+ // Phase 4: OAuth identity linking
210
+ /**
211
+ * OAuth provider identity information (optional)
212
+ * Used to link OAuth accounts to persistent User DIDs
213
+ *
214
+ * CRITICAL: Uses .nullish() to accept null, undefined, or OAuthIdentity
215
+ * This matches JSON parsing behavior where missing fields become null
216
+ */
217
+ oauth_identity: oauthIdentitySchema.nullish(),
218
+
219
+ /**
220
+ * User DID (optional)
221
+ * If provided, represents the persistent User DID for this user
222
+ * Format: did:key:... or did:web:...
223
+ */
224
+ user_did: z
225
+ .string()
226
+ .regex(/^did:/, "Must be a valid DID format (starting with did:)")
227
+ .max(500, "DID must be 500 characters or less")
228
+ .optional(),
229
+ });
230
+
231
+ export type ConsentApprovalRequest = z.infer<
232
+ typeof consentApprovalRequestSchema
233
+ >;
234
+
235
+ /**
236
+ * Consent Approval Response Schema
237
+ */
238
+ export const consentApprovalResponseSchema = z
239
+ .object({
240
+ success: z.boolean(),
241
+ delegation_id: z.string().min(1).optional(),
242
+ delegation_token: z.string().min(1).optional(),
243
+ error: z.string().optional(),
244
+ error_code: z.string().optional(),
245
+ })
246
+ .refine(
247
+ (data) => {
248
+ // If success is true, must have delegation_id and delegation_token
249
+ if (data.success) {
250
+ return !!data.delegation_id && !!data.delegation_token;
251
+ }
252
+ // If success is false, must have error or error_code
253
+ return !!data.error || !!data.error_code;
254
+ },
255
+ {
256
+ message:
257
+ "Successful responses must include delegation_id and delegation_token. Failed responses must include error or error_code",
258
+ }
259
+ );
260
+
261
+ export type ConsentApprovalResponse = z.infer<
262
+ typeof consentApprovalResponseSchema
263
+ >;
264
+
265
+ /**
266
+ * Consent Config Schema
267
+ */
268
+ export const consentConfigSchema = z.object({
269
+ branding: consentBrandingSchema.optional(),
270
+ terms: consentTermsSchema.optional(),
271
+ customFields: z
272
+ .array(consentCustomFieldSchema)
273
+ .max(10, "Maximum 10 custom fields allowed")
274
+ .optional(),
275
+ ui: z
276
+ .object({
277
+ theme: z.enum(["light", "dark", "auto"]).optional(),
278
+ popupEnabled: z.boolean().optional(),
279
+ autoClose: z.boolean().optional(),
280
+ autoCloseDelay: z
281
+ .number()
282
+ .int()
283
+ .positive()
284
+ .max(60000, "Auto-close delay must be 60000ms or less")
285
+ .optional(),
286
+ })
287
+ .optional(),
288
+ });
289
+
290
+ export type ConsentConfig = z.infer<typeof consentConfigSchema>;
291
+
292
+ /**
293
+ * Validation Helpers
294
+ */
295
+
296
+ /**
297
+ * Validate a consent page config
298
+ *
299
+ * @param config - The config to validate
300
+ * @returns Validation result
301
+ */
302
+ export function validateConsentPageConfig(config: unknown) {
303
+ return consentPageConfigSchema.safeParse(config);
304
+ }
305
+
306
+ /**
307
+ * Validate a consent approval request
308
+ *
309
+ * @param request - The request to validate
310
+ * @returns Validation result
311
+ */
312
+ export function validateConsentApprovalRequest(request: unknown) {
313
+ return consentApprovalRequestSchema.safeParse(request);
314
+ }
315
+
316
+ /**
317
+ * Validate a consent approval response
318
+ *
319
+ * @param response - The response to validate
320
+ * @returns Validation result
321
+ */
322
+ export function validateConsentApprovalResponse(response: unknown) {
323
+ return consentApprovalResponseSchema.safeParse(response);
324
+ }
325
+
326
+ /**
327
+ * Validate a consent config
328
+ *
329
+ * @param config - The config to validate
330
+ * @returns Validation result
331
+ */
332
+ export function validateConsentConfig(config: unknown) {
333
+ return consentConfigSchema.safeParse(config);
334
+ }
@@ -0,0 +1,199 @@
1
+ /**
2
+ * Consent Types
3
+ *
4
+ * TypeScript type definitions for consent page configuration and approval handling.
5
+ * These types are used for server-hosted consent pages in HTTP/SSE transports.
6
+ *
7
+ * Related Spec: MCP-I Phase 0 Implementation Plan
8
+ */
9
+
10
+ /**
11
+ * Consent Branding Configuration
12
+ *
13
+ * Customization options for consent page appearance
14
+ */
15
+ export interface ConsentBranding {
16
+ /** Primary brand color (hex format, e.g., '#0066CC') */
17
+ primaryColor?: string;
18
+
19
+ /** Logo URL for display on consent page */
20
+ logoUrl?: string;
21
+
22
+ /** Company/application name */
23
+ companyName?: string;
24
+
25
+ /** Theme preference ('light', 'dark', or 'auto' for system preference) */
26
+ theme?: 'light' | 'dark' | 'auto';
27
+ }
28
+
29
+ /**
30
+ * Consent Terms Configuration
31
+ *
32
+ * Terms of service or privacy policy information
33
+ */
34
+ export interface ConsentTerms {
35
+ /** Full terms text (displayed on page) */
36
+ text?: string;
37
+
38
+ /** URL to terms document */
39
+ url?: string;
40
+
41
+ /** Version identifier for terms */
42
+ version?: string;
43
+
44
+ /** Whether terms acceptance is required */
45
+ required?: boolean;
46
+ }
47
+
48
+ /**
49
+ * Consent Custom Field
50
+ *
51
+ * Additional fields to collect during consent (e.g., email, preferences)
52
+ */
53
+ export interface ConsentCustomField {
54
+ /** Field name (used as form field name, must be valid identifier) */
55
+ name: string;
56
+
57
+ /** Display label for the field */
58
+ label: string;
59
+
60
+ /** Field type */
61
+ type: 'text' | 'textarea' | 'checkbox' | 'select';
62
+
63
+ /** Whether field is required */
64
+ required: boolean;
65
+
66
+ /** Placeholder text */
67
+ placeholder?: string;
68
+
69
+ /** Options for select fields */
70
+ options?: Array<{ value: string; label: string }>;
71
+
72
+ /** Validation pattern (regex) */
73
+ pattern?: string;
74
+ }
75
+
76
+ /**
77
+ * Consent Page Configuration
78
+ *
79
+ * Complete configuration for rendering a consent page
80
+ */
81
+ export interface ConsentPageConfig {
82
+ /** Tool name requiring authorization */
83
+ tool: string;
84
+
85
+ /** Description of what the tool does */
86
+ toolDescription: string;
87
+
88
+ /** Scopes being requested */
89
+ scopes: string[];
90
+
91
+ /** Agent DID requesting authorization */
92
+ agentDid: string;
93
+
94
+ /** Session ID for tracking */
95
+ sessionId: string;
96
+
97
+ /** Project ID from AgentShield */
98
+ projectId: string;
99
+
100
+ /** Branding configuration */
101
+ branding?: ConsentBranding;
102
+
103
+ /** Terms configuration */
104
+ terms?: ConsentTerms;
105
+
106
+ /** Custom fields to collect */
107
+ customFields?: ConsentCustomField[];
108
+
109
+ /** Server URL for form submission */
110
+ serverUrl: string;
111
+
112
+ /** Whether to auto-close window after success */
113
+ autoClose?: boolean;
114
+ }
115
+
116
+ /**
117
+ * Consent Approval Request
118
+ *
119
+ * Request payload when user approves consent
120
+ */
121
+ export interface ConsentApprovalRequest {
122
+ /** Tool name */
123
+ tool: string;
124
+
125
+ /** Approved scopes */
126
+ scopes: string[];
127
+
128
+ /** Agent DID (snake_case for API compatibility) */
129
+ agent_did: string;
130
+
131
+ /** Session ID (snake_case for API compatibility) */
132
+ session_id: string;
133
+
134
+ /** Project ID (snake_case for API compatibility) */
135
+ project_id: string;
136
+
137
+ /** Whether terms were accepted */
138
+ termsAccepted: boolean;
139
+
140
+ /** Terms version (if applicable) */
141
+ termsVersion?: string;
142
+
143
+ /** Custom field values */
144
+ customFields?: Record<string, string | boolean>;
145
+ }
146
+
147
+ /**
148
+ * Consent Approval Response
149
+ *
150
+ * Response after processing consent approval
151
+ */
152
+ export interface ConsentApprovalResponse {
153
+ /** Whether approval was successful */
154
+ success: boolean;
155
+
156
+ /** Delegation ID (if successful) */
157
+ delegation_id?: string;
158
+
159
+ /** Delegation token (if successful) */
160
+ delegation_token?: string;
161
+
162
+ /** Error message (if failed) */
163
+ error?: string;
164
+
165
+ /** Error code (if failed) */
166
+ error_code?: string;
167
+ }
168
+
169
+ /**
170
+ * Consent Configuration
171
+ *
172
+ * Complete consent configuration fetched from AgentShield or defaults
173
+ */
174
+ export interface ConsentConfig {
175
+ /** Branding configuration */
176
+ branding?: ConsentBranding;
177
+
178
+ /** Terms configuration */
179
+ terms?: ConsentTerms;
180
+
181
+ /** Custom fields configuration */
182
+ customFields?: ConsentCustomField[];
183
+
184
+ /** UI preferences */
185
+ ui?: {
186
+ /** Theme preference */
187
+ theme?: 'light' | 'dark' | 'auto';
188
+
189
+ /** Whether popup mode is enabled */
190
+ popupEnabled?: boolean;
191
+
192
+ /** Whether to auto-close after success */
193
+ autoClose?: boolean;
194
+
195
+ /** Delay before auto-close (milliseconds) */
196
+ autoCloseDelay?: number;
197
+ };
198
+ }
199
+
@@ -0,0 +1,86 @@
1
+ {
2
+ "identity": {
3
+ "agentDid": "",
4
+ "environment": "development",
5
+ "storageLocation": "env-vars"
6
+ },
7
+ "proofing": {
8
+ "enabled": true,
9
+ "destinations": [
10
+ {
11
+ "type": "agentshield",
12
+ "apiUrl": "https://kya.vouched.id"
13
+ }
14
+ ],
15
+ "batchQueue": {
16
+ "maxBatchSize": 10,
17
+ "flushIntervalMs": 5000,
18
+ "maxRetries": 3
19
+ }
20
+ },
21
+ "delegation": {
22
+ "enabled": true,
23
+ "enforceStrictly": false,
24
+ "verifier": {
25
+ "type": "agentshield",
26
+ "apiUrl": "https://kya.vouched.id/api/v1/bouncer/delegations/verify",
27
+ "cacheTtl": 300000
28
+ },
29
+ "authorization": {
30
+ "authorizationUrl": "https://kya.vouched.id/api/v1/bouncer/delegations/authorize",
31
+ "minReputationScore": 80,
32
+ "resumeTokenTtl": 3600000,
33
+ "requireAuthForUnknown": false
34
+ }
35
+ },
36
+ "toolProtection": {
37
+ "source": "agentshield",
38
+ "agentShield": {
39
+ "apiUrl": "https://kya.vouched.id",
40
+ "cacheTtl": 300000
41
+ },
42
+ "fallback": {}
43
+ },
44
+ "audit": {
45
+ "enabled": true,
46
+ "includeProofHashes": false,
47
+ "includePayloads": false
48
+ },
49
+ "session": {
50
+ "timestampSkewSeconds": 120,
51
+ "ttlMinutes": 30
52
+ },
53
+ "platform": {
54
+ "type": "node",
55
+ "node": {
56
+ "server": {
57
+ "port": 3000,
58
+ "host": "0.0.0.0",
59
+ "cors": true,
60
+ "timeout": 30000
61
+ },
62
+ "storage": {
63
+ "type": "memory"
64
+ }
65
+ },
66
+ "cloudflare": {
67
+ "workers": {
68
+ "cpuMs": 50,
69
+ "memoryMb": 128
70
+ },
71
+ "kvNamespaces": [],
72
+ "environmentVariables": []
73
+ },
74
+ "vercel": {
75
+ "environmentVariables": [],
76
+ "edgeRuntime": {}
77
+ }
78
+ },
79
+ "metadata": {
80
+ "version": "1.0.0",
81
+ "lastUpdated": "",
82
+ "source": "dashboard",
83
+ "deploymentStatus": "inactive"
84
+ }
85
+ }
86
+