run402-mcp 4.89.0 → 4.90.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 (47) hide show
  1. package/README.md +33 -90
  2. package/dist/tools/app-up.d.ts.map +1 -1
  3. package/dist/tools/app-up.js +6 -1
  4. package/dist/tools/app-up.js.map +1 -1
  5. package/dist/tools/status.d.ts.map +1 -1
  6. package/dist/tools/status.js +6 -10
  7. package/dist/tools/status.js.map +1 -1
  8. package/package.json +5 -3
  9. package/schemas/release-spec.v1.json +540 -138
  10. package/sdk/README.md +11 -5
  11. package/sdk/dist/errors.d.ts +2 -0
  12. package/sdk/dist/errors.d.ts.map +1 -1
  13. package/sdk/dist/errors.js +2 -1
  14. package/sdk/dist/errors.js.map +1 -1
  15. package/sdk/dist/namespaces/deploy.js +2 -1
  16. package/sdk/dist/namespaces/deploy.js.map +1 -1
  17. package/sdk/dist/namespaces/deploy.types.d.ts +12 -0
  18. package/sdk/dist/namespaces/deploy.types.d.ts.map +1 -1
  19. package/sdk/dist/namespaces/deploy.types.js.map +1 -1
  20. package/sdk/dist/namespaces/projects.d.ts.map +1 -1
  21. package/sdk/dist/namespaces/projects.js +1 -0
  22. package/sdk/dist/namespaces/projects.js.map +1 -1
  23. package/sdk/dist/namespaces/projects.types.d.ts +2 -1
  24. package/sdk/dist/namespaces/projects.types.d.ts.map +1 -1
  25. package/sdk/dist/node/actions-node.d.ts.map +1 -1
  26. package/sdk/dist/node/actions-node.js +8 -2
  27. package/sdk/dist/node/actions-node.js.map +1 -1
  28. package/sdk/dist/node/gitvault-degraded-read.js +1 -1
  29. package/sdk/dist/node/gitvault-degraded-read.js.map +1 -1
  30. package/sdk/dist/node/gitvault-snapshot.d.ts.map +1 -1
  31. package/sdk/dist/node/gitvault-snapshot.js +9 -3
  32. package/sdk/dist/node/gitvault-snapshot.js.map +1 -1
  33. package/sdk/dist/node/index.d.ts +2 -0
  34. package/sdk/dist/node/index.d.ts.map +1 -1
  35. package/sdk/dist/node/index.js +2 -0
  36. package/sdk/dist/node/index.js.map +1 -1
  37. package/sdk/dist/node/paid-fetch.d.ts.map +1 -1
  38. package/sdk/dist/node/paid-fetch.js +24 -2
  39. package/sdk/dist/node/paid-fetch.js.map +1 -1
  40. package/sdk/dist/node/remote-status.d.ts +17 -0
  41. package/sdk/dist/node/remote-status.d.ts.map +1 -0
  42. package/sdk/dist/node/remote-status.js +23 -0
  43. package/sdk/dist/node/remote-status.js.map +1 -0
  44. package/sdk/dist/node/workflow-output.d.ts +10 -0
  45. package/sdk/dist/node/workflow-output.d.ts.map +1 -0
  46. package/sdk/dist/node/workflow-output.js +159 -0
  47. package/sdk/dist/node/workflow-output.js.map +1 -0
@@ -2,7 +2,7 @@
2
2
  "$schema": "https://json-schema.org/draft/2020-12/schema",
3
3
  "$id": "https://run402.com/schemas/release-spec.v1.json",
4
4
  "title": "Run402 ReleaseSpec v1",
5
- "description": "Authoring schema for Run402 unified deploy manifests accepted by run402 deploy apply, MCP deploy, and @run402/sdk/node manifest helpers. The SDK-native ReleaseSpec uses project; CLI/MCP manifests may use project_id.",
5
+ "description": "Authoring schema for Run402 deploy manifests. Use run402 up for complete application workflows. Project selection may be supplied by an explicit CLI target, app-local link or approved --name creation; the SDK requires a resolved project before gateway planning. SDK-native ReleaseSpec uses project; CLI/MCP manifests may use project_id.",
6
6
  "type": "object",
7
7
  "additionalProperties": false,
8
8
  "properties": {
@@ -51,18 +51,28 @@
51
51
  },
52
52
  "routes": {
53
53
  "oneOf": [
54
- { "type": "null" },
55
- { "$ref": "#/$defs/routes" }
54
+ {
55
+ "type": "null"
56
+ },
57
+ {
58
+ "$ref": "#/$defs/routes"
59
+ }
56
60
  ]
57
61
  },
58
62
  "checks": {
59
63
  "type": "array",
60
- "items": { "$ref": "#/$defs/smokeCheck" }
64
+ "items": {
65
+ "$ref": "#/$defs/smokeCheck"
66
+ }
61
67
  },
62
68
  "i18n": {
63
69
  "oneOf": [
64
- { "type": "null" },
65
- { "$ref": "#/$defs/i18n" }
70
+ {
71
+ "type": "null"
72
+ },
73
+ {
74
+ "$ref": "#/$defs/i18n"
75
+ }
66
76
  ]
67
77
  },
68
78
  "verify": {
@@ -70,29 +80,34 @@
70
80
  "description": "Authoring-only post-apply HTTP verification, run by `run402 up` after a successful apply and rerunnable with `run402 up verify`. Stripped before deploy planning (never part of the wire ReleaseSpec)."
71
81
  }
72
82
  },
73
- "anyOf": [
74
- { "required": ["project"] },
75
- { "required": ["project_id"] }
76
- ],
77
83
  "$defs": {
78
84
  "base": {
79
85
  "oneOf": [
80
86
  {
81
87
  "type": "object",
82
88
  "additionalProperties": false,
83
- "required": ["release"],
89
+ "required": [
90
+ "release"
91
+ ],
84
92
  "properties": {
85
93
  "release": {
86
- "enum": ["current", "empty"]
94
+ "enum": [
95
+ "current",
96
+ "empty"
97
+ ]
87
98
  }
88
99
  }
89
100
  },
90
101
  {
91
102
  "type": "object",
92
103
  "additionalProperties": false,
93
- "required": ["release_id"],
104
+ "required": [
105
+ "release_id"
106
+ ],
94
107
  "properties": {
95
- "release_id": { "type": "string" }
108
+ "release_id": {
109
+ "type": "string"
110
+ }
96
111
  }
97
112
  }
98
113
  ]
@@ -103,7 +118,9 @@
103
118
  "properties": {
104
119
  "migrations": {
105
120
  "type": "array",
106
- "items": { "$ref": "#/$defs/migration" }
121
+ "items": {
122
+ "$ref": "#/$defs/migration"
123
+ }
107
124
  },
108
125
  "expose": {
109
126
  "type": "object",
@@ -127,16 +144,49 @@
127
144
  "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_-]{0,63}$",
128
145
  "description": "Content-tracked migration name for generated/idempotent SQL. The SDK compiles this to <name>_<sha256(sql)[0:16]>; changed content applies once under a new id and identical re-deploys noop. SQL declared with name MUST be idempotent because it re-runs whenever content changes against a database where prior versions may already exist."
129
146
  },
130
- "checksum": { "type": "string" },
131
- "sql": { "type": "string" },
132
- "sql_ref": { "$ref": "#/$defs/contentRef" },
133
- "sql_path": { "type": "string" },
134
- "sql_file": { "type": "string" },
135
- "transaction": { "enum": ["required", "none"] }
147
+ "checksum": {
148
+ "type": "string"
149
+ },
150
+ "sql": {
151
+ "type": "string"
152
+ },
153
+ "sql_ref": {
154
+ "$ref": "#/$defs/contentRef"
155
+ },
156
+ "sql_path": {
157
+ "type": "string"
158
+ },
159
+ "sql_file": {
160
+ "type": "string"
161
+ },
162
+ "transaction": {
163
+ "enum": [
164
+ "required",
165
+ "none"
166
+ ]
167
+ }
136
168
  },
137
169
  "oneOf": [
138
- { "required": ["id"], "not": { "required": ["name"] } },
139
- { "required": ["name"], "not": { "required": ["id"] } }
170
+ {
171
+ "required": [
172
+ "id"
173
+ ],
174
+ "not": {
175
+ "required": [
176
+ "name"
177
+ ]
178
+ }
179
+ },
180
+ {
181
+ "required": [
182
+ "name"
183
+ ],
184
+ "not": {
185
+ "required": [
186
+ "id"
187
+ ]
188
+ }
189
+ }
140
190
  ]
141
191
  },
142
192
  "secrets": {
@@ -145,11 +195,15 @@
145
195
  "properties": {
146
196
  "require": {
147
197
  "type": "array",
148
- "items": { "type": "string" }
198
+ "items": {
199
+ "type": "string"
200
+ }
149
201
  },
150
202
  "delete": {
151
203
  "type": "array",
152
- "items": { "type": "string" }
204
+ "items": {
205
+ "type": "string"
206
+ }
153
207
  }
154
208
  }
155
209
  },
@@ -159,7 +213,9 @@
159
213
  "properties": {
160
214
  "replace": {
161
215
  "type": "object",
162
- "additionalProperties": { "$ref": "#/$defs/functionSpec" }
216
+ "additionalProperties": {
217
+ "$ref": "#/$defs/functionSpec"
218
+ }
163
219
  },
164
220
  "patch": {
165
221
  "type": "object",
@@ -167,11 +223,15 @@
167
223
  "properties": {
168
224
  "set": {
169
225
  "type": "object",
170
- "additionalProperties": { "$ref": "#/$defs/functionSpec" }
226
+ "additionalProperties": {
227
+ "$ref": "#/$defs/functionSpec"
228
+ }
171
229
  },
172
230
  "delete": {
173
231
  "type": "array",
174
- "items": { "type": "string" }
232
+ "items": {
233
+ "type": "string"
234
+ }
175
235
  }
176
236
  }
177
237
  }
@@ -182,10 +242,20 @@
182
242
  "additionalProperties": false,
183
243
  "description": "FunctionSpec. schedule is a sibling of runtime/source/files/config, not config.schedule.",
184
244
  "properties": {
185
- "runtime": { "enum": ["node22"] },
186
- "source": { "$ref": "#/$defs/fileEntry" },
187
- "files": { "$ref": "#/$defs/fileSet" },
188
- "entrypoint": { "type": "string" },
245
+ "runtime": {
246
+ "enum": [
247
+ "node22"
248
+ ]
249
+ },
250
+ "source": {
251
+ "$ref": "#/$defs/fileEntry"
252
+ },
253
+ "files": {
254
+ "$ref": "#/$defs/fileSet"
255
+ },
256
+ "entrypoint": {
257
+ "type": "string"
258
+ },
189
259
  "config": {
190
260
  "type": "object",
191
261
  "additionalProperties": false,
@@ -202,64 +272,127 @@
202
272
  },
203
273
  "schedule": {
204
274
  "oneOf": [
205
- { "type": "string", "description": "5-field cron expression." },
206
- { "type": "null", "description": "Remove an existing schedule in patch mode." }
275
+ {
276
+ "type": "string",
277
+ "description": "5-field cron expression."
278
+ },
279
+ {
280
+ "type": "null",
281
+ "description": "Remove an existing schedule in patch mode."
282
+ }
207
283
  ]
208
284
  },
209
285
  "deps": {
210
286
  "type": "array",
211
- "items": { "type": "string", "minLength": 1 }
287
+ "items": {
288
+ "type": "string",
289
+ "minLength": 1
290
+ }
212
291
  },
213
292
  "triggers": {
214
293
  "type": "array",
215
- "items": { "$ref": "#/$defs/functionTrigger" }
294
+ "items": {
295
+ "$ref": "#/$defs/functionTrigger"
296
+ }
297
+ },
298
+ "requireAuth": {
299
+ "type": "boolean"
300
+ },
301
+ "require_auth": {
302
+ "type": "boolean"
216
303
  },
217
- "requireAuth": { "type": "boolean" },
218
- "require_auth": { "type": "boolean" },
219
304
  "requireRole": {
220
305
  "oneOf": [
221
- { "type": "null" },
222
- { "$ref": "#/$defs/functionRequireRole" }
306
+ {
307
+ "type": "null"
308
+ },
309
+ {
310
+ "$ref": "#/$defs/functionRequireRole"
311
+ }
223
312
  ]
224
313
  },
225
314
  "require_role": {
226
315
  "oneOf": [
227
- { "type": "null" },
228
- { "$ref": "#/$defs/functionRequireRole" }
316
+ {
317
+ "type": "null"
318
+ },
319
+ {
320
+ "$ref": "#/$defs/functionRequireRole"
321
+ }
229
322
  ]
230
323
  },
231
324
  "class": { "enum": ["ssr", "standard"] },
232
325
  "capabilities": {
233
326
  "type": "array",
234
- "items": { "type": "string", "minLength": 1 }
327
+ "items": {
328
+ "type": "string",
329
+ "minLength": 1
330
+ }
235
331
  }
236
332
  }
237
333
  },
238
334
  "functionTrigger": {
239
335
  "type": "object",
240
336
  "additionalProperties": true,
241
- "required": ["id", "type"],
337
+ "required": [
338
+ "id",
339
+ "type"
340
+ ],
242
341
  "properties": {
243
- "id": { "type": "string", "minLength": 1 },
244
- "type": { "type": "string", "minLength": 1 }
342
+ "id": {
343
+ "type": "string",
344
+ "minLength": 1
345
+ },
346
+ "type": {
347
+ "type": "string",
348
+ "minLength": 1
349
+ }
245
350
  }
246
351
  },
247
352
  "functionRequireRole": {
248
353
  "type": "object",
249
354
  "additionalProperties": false,
250
- "required": ["table", "id_column", "role_column", "allowed"],
355
+ "required": [
356
+ "table",
357
+ "id_column",
358
+ "role_column",
359
+ "allowed"
360
+ ],
251
361
  "properties": {
252
- "table": { "type": "string", "minLength": 1 },
253
- "id_column": { "type": "string", "minLength": 1 },
254
- "role_column": { "type": "string", "minLength": 1 },
362
+ "table": {
363
+ "type": "string",
364
+ "minLength": 1
365
+ },
366
+ "id_column": {
367
+ "type": "string",
368
+ "minLength": 1
369
+ },
370
+ "role_column": {
371
+ "type": "string",
372
+ "minLength": 1
373
+ },
255
374
  "allowed": {
256
375
  "type": "array",
257
- "items": { "type": "string", "minLength": 1 },
376
+ "items": {
377
+ "type": "string",
378
+ "minLength": 1
379
+ },
258
380
  "minItems": 1
259
381
  },
260
- "cache_ttl": { "type": "integer", "minimum": 0 },
261
- "on_deny": { "enum": ["envelope", "redirect"] },
262
- "sign_in_path": { "type": "string", "minLength": 1 }
382
+ "cache_ttl": {
383
+ "type": "integer",
384
+ "minimum": 0
385
+ },
386
+ "on_deny": {
387
+ "enum": [
388
+ "envelope",
389
+ "redirect"
390
+ ]
391
+ },
392
+ "sign_in_path": {
393
+ "type": "string",
394
+ "minLength": 1
395
+ }
263
396
  }
264
397
  },
265
398
  "site": {
@@ -267,21 +400,34 @@
267
400
  {
268
401
  "type": "object",
269
402
  "additionalProperties": false,
270
- "required": ["replace"],
403
+ "required": [
404
+ "replace"
405
+ ],
271
406
  "properties": {
272
407
  "replace": {
273
408
  "oneOf": [
274
- { "$ref": "#/$defs/fileSet" },
275
- { "$ref": "#/$defs/localDirRef" }
409
+ {
410
+ "$ref": "#/$defs/fileSet"
411
+ },
412
+ {
413
+ "$ref": "#/$defs/localDirRef"
414
+ }
276
415
  ]
277
416
  },
278
- "public_paths": { "$ref": "#/$defs/sitePublicPaths" }
417
+ "public_paths": {
418
+ "$ref": "#/$defs/sitePublicPaths"
419
+ },
420
+ "embedding": {
421
+ "$ref": "#/$defs/siteEmbedding"
422
+ }
279
423
  }
280
424
  },
281
425
  {
282
426
  "type": "object",
283
427
  "additionalProperties": false,
284
- "required": ["patch"],
428
+ "required": [
429
+ "patch"
430
+ ],
285
431
  "properties": {
286
432
  "patch": {
287
433
  "type": "object",
@@ -289,26 +435,53 @@
289
435
  "properties": {
290
436
  "put": {
291
437
  "oneOf": [
292
- { "$ref": "#/$defs/fileSet" },
293
- { "$ref": "#/$defs/localDirRef" }
438
+ {
439
+ "$ref": "#/$defs/fileSet"
440
+ },
441
+ {
442
+ "$ref": "#/$defs/localDirRef"
443
+ }
294
444
  ]
295
445
  },
296
446
  "delete": {
297
447
  "type": "array",
298
- "items": { "type": "string" }
448
+ "items": {
449
+ "type": "string"
450
+ }
299
451
  }
300
452
  }
301
453
  },
302
- "public_paths": { "$ref": "#/$defs/sitePublicPaths" }
454
+ "public_paths": {
455
+ "$ref": "#/$defs/sitePublicPaths"
456
+ },
457
+ "embedding": {
458
+ "$ref": "#/$defs/siteEmbedding"
459
+ }
303
460
  }
304
461
  },
305
462
  {
306
463
  "type": "object",
307
464
  "additionalProperties": false,
308
- "required": ["public_paths"],
309
465
  "properties": {
310
- "public_paths": { "$ref": "#/$defs/sitePublicPaths" }
311
- }
466
+ "public_paths": {
467
+ "$ref": "#/$defs/sitePublicPaths"
468
+ },
469
+ "embedding": {
470
+ "$ref": "#/$defs/siteEmbedding"
471
+ }
472
+ },
473
+ "anyOf": [
474
+ {
475
+ "required": [
476
+ "public_paths"
477
+ ]
478
+ },
479
+ {
480
+ "required": [
481
+ "embedding"
482
+ ]
483
+ }
484
+ ]
312
485
  }
313
486
  ]
314
487
  },
@@ -317,20 +490,31 @@
317
490
  {
318
491
  "type": "object",
319
492
  "additionalProperties": false,
320
- "required": ["mode"],
493
+ "required": [
494
+ "mode"
495
+ ],
321
496
  "properties": {
322
- "mode": { "const": "implicit" }
497
+ "mode": {
498
+ "const": "implicit"
499
+ }
323
500
  }
324
501
  },
325
502
  {
326
503
  "type": "object",
327
504
  "additionalProperties": false,
328
- "required": ["mode", "replace"],
505
+ "required": [
506
+ "mode",
507
+ "replace"
508
+ ],
329
509
  "properties": {
330
- "mode": { "const": "explicit" },
510
+ "mode": {
511
+ "const": "explicit"
512
+ },
331
513
  "replace": {
332
514
  "type": "object",
333
- "additionalProperties": { "$ref": "#/$defs/publicStaticPath" }
515
+ "additionalProperties": {
516
+ "$ref": "#/$defs/publicStaticPath"
517
+ }
334
518
  }
335
519
  }
336
520
  }
@@ -339,7 +523,9 @@
339
523
  "publicStaticPath": {
340
524
  "type": "object",
341
525
  "additionalProperties": false,
342
- "required": ["asset"],
526
+ "required": [
527
+ "asset"
528
+ ],
343
529
  "properties": {
344
530
  "asset": {
345
531
  "type": "string",
@@ -361,49 +547,78 @@
361
547
  "properties": {
362
548
  "set": {
363
549
  "type": "array",
364
- "items": { "type": "string" }
550
+ "items": {
551
+ "type": "string"
552
+ }
365
553
  },
366
554
  "add": {
367
555
  "type": "array",
368
- "items": { "type": "string" }
556
+ "items": {
557
+ "type": "string"
558
+ }
369
559
  },
370
560
  "remove": {
371
561
  "type": "array",
372
- "items": { "type": "string" }
562
+ "items": {
563
+ "type": "string"
564
+ }
373
565
  }
374
566
  }
375
567
  },
376
568
  "routes": {
377
569
  "type": "object",
378
570
  "additionalProperties": false,
379
- "required": ["replace"],
571
+ "required": [
572
+ "replace"
573
+ ],
380
574
  "properties": {
381
575
  "replace": {
382
576
  "type": "array",
383
- "items": { "$ref": "#/$defs/route" }
577
+ "items": {
578
+ "$ref": "#/$defs/route"
579
+ }
384
580
  }
385
581
  }
386
582
  },
387
583
  "route": {
388
584
  "type": "object",
389
585
  "additionalProperties": false,
390
- "required": ["pattern", "target"],
586
+ "required": [
587
+ "pattern",
588
+ "target"
589
+ ],
391
590
  "properties": {
392
- "pattern": { "type": "string" },
591
+ "pattern": {
592
+ "type": "string"
593
+ },
393
594
  "methods": {
394
595
  "type": "array",
395
596
  "minItems": 1,
396
597
  "items": {
397
- "enum": ["GET", "HEAD", "POST", "PUT", "PATCH", "DELETE", "OPTIONS"]
598
+ "enum": [
599
+ "GET",
600
+ "HEAD",
601
+ "POST",
602
+ "PUT",
603
+ "PATCH",
604
+ "DELETE",
605
+ "OPTIONS"
606
+ ]
398
607
  }
399
608
  },
400
609
  "target": {
401
610
  "oneOf": [
402
- { "$ref": "#/$defs/functionRouteTarget" },
403
- { "$ref": "#/$defs/staticRouteTarget" }
611
+ {
612
+ "$ref": "#/$defs/functionRouteTarget"
613
+ },
614
+ {
615
+ "$ref": "#/$defs/staticRouteTarget"
616
+ }
404
617
  ]
405
618
  },
406
- "pricing": { "$ref": "#/$defs/routePricing" },
619
+ "pricing": {
620
+ "$ref": "#/$defs/routePricing"
621
+ },
407
622
  "acknowledge_readonly": {
408
623
  "const": true,
409
624
  "description": "Durable acknowledgement for intentional read-only final-wildcard function routes. Valid only when target.type is function, pattern ends in /*, and methods are limited to GET/HEAD."
@@ -416,15 +631,25 @@
416
631
  "target": {
417
632
  "type": "object",
418
633
  "properties": {
419
- "type": { "const": "static" }
634
+ "type": {
635
+ "const": "static"
636
+ }
420
637
  },
421
- "required": ["type"]
638
+ "required": [
639
+ "type"
640
+ ]
422
641
  }
423
642
  },
424
- "required": ["target"]
643
+ "required": [
644
+ "target"
645
+ ]
425
646
  },
426
647
  "then": {
427
- "not": { "required": ["pricing"] }
648
+ "not": {
649
+ "required": [
650
+ "pricing"
651
+ ]
652
+ }
428
653
  }
429
654
  }
430
655
  ]
@@ -432,22 +657,35 @@
432
657
  "routePricing": {
433
658
  "type": "object",
434
659
  "additionalProperties": false,
435
- "required": ["mode", "amount_usd_micros", "pay_to"],
660
+ "required": [
661
+ "mode",
662
+ "amount_usd_micros",
663
+ "pay_to"
664
+ ],
436
665
  "properties": {
437
- "mode": { "const": "always" },
666
+ "mode": {
667
+ "const": "always"
668
+ },
438
669
  "amount_usd_micros": {
439
670
  "type": "integer",
440
671
  "minimum": 1,
441
672
  "maximum": 9007199254740991
442
673
  },
443
- "pay_to": { "const": "org_default_payout" },
674
+ "pay_to": {
675
+ "const": "org_default_payout"
676
+ },
444
677
  "networks": {
445
678
  "type": "array",
446
679
  "minItems": 1,
447
680
  "uniqueItems": true,
448
- "default": ["mainnet"],
681
+ "default": [
682
+ "mainnet"
683
+ ],
449
684
  "items": {
450
- "enum": ["mainnet", "testnet"]
685
+ "enum": [
686
+ "mainnet",
687
+ "testnet"
688
+ ]
451
689
  },
452
690
  "description": "Omit to accept production mainnet only. Include testnet explicitly for testnet payments."
453
691
  }
@@ -456,18 +694,30 @@
456
694
  "functionRouteTarget": {
457
695
  "type": "object",
458
696
  "additionalProperties": false,
459
- "required": ["type", "name"],
697
+ "required": [
698
+ "type",
699
+ "name"
700
+ ],
460
701
  "properties": {
461
- "type": { "const": "function" },
462
- "name": { "type": "string" }
702
+ "type": {
703
+ "const": "function"
704
+ },
705
+ "name": {
706
+ "type": "string"
707
+ }
463
708
  }
464
709
  },
465
710
  "staticRouteTarget": {
466
711
  "type": "object",
467
712
  "additionalProperties": false,
468
- "required": ["type", "file"],
713
+ "required": [
714
+ "type",
715
+ "file"
716
+ ],
469
717
  "properties": {
470
- "type": { "const": "static" },
718
+ "type": {
719
+ "const": "static"
720
+ },
471
721
  "file": {
472
722
  "type": "string",
473
723
  "description": "Relative materialized release static asset path, not a public path."
@@ -481,7 +731,10 @@
481
731
  "i18n": {
482
732
  "type": "object",
483
733
  "additionalProperties": false,
484
- "required": ["defaultLocale", "locales"],
734
+ "required": [
735
+ "defaultLocale",
736
+ "locales"
737
+ ],
485
738
  "description": "Routed-locale-context release slice (v2.5+). Omit at the top level to carry forward from the base release; pass top-level i18n: null to clear; pass an object to replace. defaultLocale MUST be byte-identical to one entry in locales[].",
486
739
  "properties": {
487
740
  "defaultLocale": {
@@ -510,21 +763,31 @@
510
763
  },
511
764
  "unknownLocalePolicy": {
512
765
  "type": "string",
513
- "enum": ["reject", "pass-through"],
766
+ "enum": [
767
+ "reject",
768
+ "pass-through"
769
+ ],
514
770
  "description": "What to do when a detect-source signal does not match locales[]. 'reject' (default, backwards-compatible) falls through to the next detect source then to defaultLocale. 'pass-through' returns the lowercased, trimmed signal value verbatim — letting the consumer's app DB decide whether translations exist for the tag. Capability i18n-unknown-locale-policy (issue #413)."
515
771
  }
516
772
  }
517
773
  },
518
774
  "fileSet": {
519
775
  "type": "object",
520
- "additionalProperties": { "$ref": "#/$defs/fileEntry" }
776
+ "additionalProperties": {
777
+ "$ref": "#/$defs/fileEntry"
778
+ }
521
779
  },
522
780
  "localDirRef": {
523
781
  "type": "object",
524
782
  "additionalProperties": false,
525
- "required": ["__source", "path"],
783
+ "required": [
784
+ "__source",
785
+ "path"
786
+ ],
526
787
  "properties": {
527
- "__source": { "const": "local-dir" },
788
+ "__source": {
789
+ "const": "local-dir"
790
+ },
528
791
  "path": {
529
792
  "type": "string",
530
793
  "description": "Local directory path resolved by the SDK/CLI from the manifest directory and stripped before the apply request."
@@ -534,30 +797,53 @@
534
797
  },
535
798
  "fileEntry": {
536
799
  "oneOf": [
537
- { "type": "string" },
538
- { "$ref": "#/$defs/contentRef" },
800
+ {
801
+ "type": "string"
802
+ },
803
+ {
804
+ "$ref": "#/$defs/contentRef"
805
+ },
539
806
  {
540
807
  "type": "object",
541
808
  "additionalProperties": false,
542
- "required": ["path"],
809
+ "required": [
810
+ "path"
811
+ ],
543
812
  "properties": {
544
- "path": { "type": "string" },
545
- "contentType": { "type": "string" }
813
+ "path": {
814
+ "type": "string"
815
+ },
816
+ "content_type": {
817
+ "type": "string"
818
+ }
546
819
  }
547
820
  },
548
821
  {
549
822
  "type": "object",
550
823
  "additionalProperties": false,
551
- "required": ["data"],
824
+ "required": [
825
+ "data"
826
+ ],
552
827
  "properties": {
553
828
  "data": {
554
829
  "oneOf": [
555
- { "type": "string" },
556
- { "$ref": "#/$defs/contentRef" }
830
+ {
831
+ "type": "string"
832
+ },
833
+ {
834
+ "$ref": "#/$defs/contentRef"
835
+ }
836
+ ]
837
+ },
838
+ "encoding": {
839
+ "enum": [
840
+ "utf-8",
841
+ "base64"
557
842
  ]
558
843
  },
559
- "encoding": { "enum": ["utf-8", "base64"] },
560
- "contentType": { "type": "string" }
844
+ "content_type": {
845
+ "type": "string"
846
+ }
561
847
  }
562
848
  }
563
849
  ]
@@ -565,15 +851,28 @@
565
851
  "contentRef": {
566
852
  "type": "object",
567
853
  "additionalProperties": false,
568
- "required": ["sha256", "size"],
854
+ "required": [
855
+ "sha256",
856
+ "size"
857
+ ],
569
858
  "properties": {
570
- "sha256": { "type": "string" },
859
+ "sha256": {
860
+ "type": "string"
861
+ },
571
862
  "size": {
572
863
  "type": "integer",
573
864
  "minimum": 0
574
865
  },
575
- "contentType": { "type": "string" },
576
- "integrity": { "type": "string" }
866
+ "content_type": {
867
+ "type": "string"
868
+ },
869
+ "contentType": {
870
+ "type": "string",
871
+ "description": "Legacy SDK ContentRef spelling accepted by the normalizer; prefer content_type in manifests."
872
+ },
873
+ "integrity": {
874
+ "type": "string"
875
+ }
577
876
  }
578
877
  },
579
878
  "assets": {
@@ -583,20 +882,28 @@
583
882
  "properties": {
584
883
  "put": {
585
884
  "type": "array",
586
- "items": { "$ref": "#/$defs/assetPutEntry" }
885
+ "items": {
886
+ "$ref": "#/$defs/assetPutEntry"
887
+ }
587
888
  },
588
889
  "delete": {
589
890
  "type": "array",
590
- "items": { "type": "string" },
891
+ "items": {
892
+ "type": "string"
893
+ },
591
894
  "description": "Asset keys to remove at activation."
592
895
  },
593
- "sync": { "$ref": "#/$defs/assetSync" }
896
+ "sync": {
897
+ "$ref": "#/$defs/assetSync"
898
+ }
594
899
  }
595
900
  },
596
901
  "assetPutEntry": {
597
902
  "type": "object",
598
903
  "additionalProperties": false,
599
- "required": ["key"],
904
+ "required": [
905
+ "key"
906
+ ],
600
907
  "properties": {
601
908
  "key": {
602
909
  "type": "string",
@@ -615,29 +922,54 @@
615
922
  "minimum": 0,
616
923
  "description": "Required when using the wire form (sha256 set)."
617
924
  },
618
- "content_type": { "type": "string" },
619
- "visibility": { "enum": ["public", "private"] },
620
- "immutable": { "type": "boolean" }
925
+ "content_type": {
926
+ "type": "string"
927
+ },
928
+ "visibility": {
929
+ "enum": [
930
+ "public",
931
+ "private"
932
+ ]
933
+ },
934
+ "immutable": {
935
+ "type": "boolean"
936
+ }
621
937
  }
622
938
  },
623
939
  "assetSync": {
624
940
  "type": "object",
625
941
  "additionalProperties": false,
626
- "required": ["prefix", "prune"],
942
+ "required": [
943
+ "prefix",
944
+ "prune"
945
+ ],
627
946
  "properties": {
628
947
  "prefix": {
629
948
  "type": "string",
630
949
  "description": "Prefix under which destructive sync operates."
631
950
  },
632
- "prune": { "const": true },
951
+ "prune": {
952
+ "const": true
953
+ },
633
954
  "confirm": {
634
955
  "type": "object",
635
956
  "additionalProperties": false,
636
- "required": ["base_revision", "delete_set_digest", "expected_delete_count"],
957
+ "required": [
958
+ "base_revision",
959
+ "delete_set_digest",
960
+ "expected_delete_count"
961
+ ],
637
962
  "properties": {
638
- "base_revision": { "type": "string" },
639
- "delete_set_digest": { "type": "string" },
640
- "expected_delete_count": { "type": "integer", "minimum": 0 }
963
+ "base_revision": {
964
+ "type": "string"
965
+ },
966
+ "delete_set_digest": {
967
+ "type": "string"
968
+ },
969
+ "expected_delete_count": {
970
+ "type": "integer",
971
+ "minimum": 0
972
+ }
641
973
  },
642
974
  "description": "Confirmation token echoed back from a prior plan; required to commit a destructive sync."
643
975
  }
@@ -649,28 +981,44 @@
649
981
  "properties": {
650
982
  "http": {
651
983
  "type": "array",
652
- "items": { "$ref": "#/$defs/verifyHttpCheck" }
984
+ "items": {
985
+ "$ref": "#/$defs/verifyHttpCheck"
986
+ }
653
987
  }
654
988
  }
655
989
  },
656
990
  "verifyHttpCheck": {
657
991
  "type": "object",
658
992
  "additionalProperties": false,
659
- "required": ["id"],
993
+ "required": [
994
+ "id"
995
+ ],
660
996
  "properties": {
661
- "id": { "type": "string", "minLength": 1 },
997
+ "id": {
998
+ "type": "string",
999
+ "minLength": 1
1000
+ },
662
1001
  "path": {
663
1002
  "type": "string",
664
1003
  "minLength": 1,
665
1004
  "description": "Request path resolved against the project public origin."
666
1005
  },
667
- "url": { "type": "string", "minLength": 1 },
1006
+ "url": {
1007
+ "type": "string",
1008
+ "minLength": 1
1009
+ },
668
1010
  "expect": {
669
1011
  "type": "object",
670
1012
  "additionalProperties": false,
671
- "required": ["status"],
1013
+ "required": [
1014
+ "status"
1015
+ ],
672
1016
  "properties": {
673
- "status": { "type": "integer", "minimum": 100, "maximum": 599 }
1017
+ "status": {
1018
+ "type": "integer",
1019
+ "minimum": 100,
1020
+ "maximum": 599
1021
+ }
674
1022
  }
675
1023
  },
676
1024
  "expected_status": {
@@ -679,11 +1027,65 @@
679
1027
  "maximum": 599,
680
1028
  "description": "Snake-case alias for expect.status."
681
1029
  },
682
- "retries": { "type": "integer", "minimum": 1 }
1030
+ "retries": {
1031
+ "type": "integer",
1032
+ "minimum": 1
1033
+ }
683
1034
  },
684
1035
  "allOf": [
685
- { "anyOf": [ { "required": ["path"] }, { "required": ["url"] } ] },
686
- { "anyOf": [ { "required": ["expect"] }, { "required": ["expected_status"] } ] }
1036
+ {
1037
+ "anyOf": [
1038
+ {
1039
+ "required": [
1040
+ "path"
1041
+ ]
1042
+ },
1043
+ {
1044
+ "required": [
1045
+ "url"
1046
+ ]
1047
+ }
1048
+ ]
1049
+ },
1050
+ {
1051
+ "anyOf": [
1052
+ {
1053
+ "required": [
1054
+ "expect"
1055
+ ]
1056
+ },
1057
+ {
1058
+ "required": [
1059
+ "expected_status"
1060
+ ]
1061
+ }
1062
+ ]
1063
+ }
1064
+ ]
1065
+ },
1066
+ "siteEmbedding": {
1067
+ "description": "Framing opt-in using platform catalog keys, never origins. Remote validation checks the current catalog. Null resets to deny; omission carries prior state.",
1068
+ "oneOf": [
1069
+ {
1070
+ "type": "null"
1071
+ },
1072
+ {
1073
+ "type": "object",
1074
+ "additionalProperties": false,
1075
+ "required": [
1076
+ "frame_ancestors"
1077
+ ],
1078
+ "properties": {
1079
+ "frame_ancestors": {
1080
+ "type": "array",
1081
+ "uniqueItems": true,
1082
+ "items": {
1083
+ "type": "string",
1084
+ "pattern": "^[a-z][a-z0-9_-]*$"
1085
+ }
1086
+ }
1087
+ }
1088
+ }
687
1089
  ]
688
1090
  }
689
1091
  }