@hypersoniclabs/helix-manifest 0.3.3 → 0.3.16

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.
@@ -0,0 +1,1055 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://helix.game/schemas/scene-v2.schema.json",
4
+ "title": "HELIX Scene v2",
5
+ "description": "Portable declarative scene contract shared by Home and World profiles. Binary resources remain external, immutable and integrity-pinned.",
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "required": [
9
+ "format",
10
+ "version",
11
+ "id",
12
+ "revision",
13
+ "integrity",
14
+ "title",
15
+ "units",
16
+ "coordinateSystem",
17
+ "profiles",
18
+ "scenes",
19
+ "resources",
20
+ "nodes",
21
+ "spawns",
22
+ "navigation",
23
+ "placement",
24
+ "streamGroups",
25
+ "capabilities",
26
+ "adapters"
27
+ ],
28
+ "properties": {
29
+ "format": { "const": "helix.scene" },
30
+ "version": { "const": 2 },
31
+ "id": { "$ref": "#/$defs/id" },
32
+ "revision": {
33
+ "type": "string",
34
+ "pattern": "^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$"
35
+ },
36
+ "integrity": { "$ref": "#/$defs/integrity" },
37
+ "title": { "type": "string", "minLength": 1, "maxLength": 150 },
38
+ "units": { "const": "meters" },
39
+ "coordinateSystem": {
40
+ "type": "object",
41
+ "additionalProperties": false,
42
+ "required": ["handedness", "up", "forward"],
43
+ "properties": {
44
+ "handedness": { "const": "right" },
45
+ "up": { "const": "+Y" },
46
+ "forward": { "const": "-Z" }
47
+ }
48
+ },
49
+ "profiles": {
50
+ "type": "object",
51
+ "minProperties": 1,
52
+ "maxProperties": 8,
53
+ "propertyNames": { "$ref": "#/$defs/id" },
54
+ "additionalProperties": { "$ref": "#/$defs/profile" }
55
+ },
56
+ "scenes": {
57
+ "type": "array",
58
+ "minItems": 1,
59
+ "maxItems": 16,
60
+ "items": { "$ref": "#/$defs/sceneRoot" }
61
+ },
62
+ "resources": {
63
+ "type": "array",
64
+ "maxItems": 2048,
65
+ "items": { "$ref": "#/$defs/resource" }
66
+ },
67
+ "nodes": {
68
+ "type": "array",
69
+ "minItems": 1,
70
+ "maxItems": 4096,
71
+ "items": { "$ref": "#/$defs/node" }
72
+ },
73
+ "itemDefinitions": {
74
+ "type": "array",
75
+ "maxItems": 512,
76
+ "default": [],
77
+ "items": { "$ref": "#/$defs/itemDefinition" }
78
+ },
79
+ "itemInstances": {
80
+ "type": "array",
81
+ "maxItems": 2048,
82
+ "default": [],
83
+ "items": { "$ref": "#/$defs/itemInstance" }
84
+ },
85
+ "terrain": {
86
+ "default": { "kind": "none" },
87
+ "$ref": "#/$defs/terrain"
88
+ },
89
+ "environment": {
90
+ "default": {
91
+ "background": true,
92
+ "intensityScale": 1,
93
+ "rotationYDeg": 0,
94
+ "exposureEV100": 0,
95
+ "fallbackColor": "#20242b",
96
+ "required": false
97
+ },
98
+ "$ref": "#/$defs/environment"
99
+ },
100
+ "lights": {
101
+ "type": "array",
102
+ "maxItems": 64,
103
+ "default": [],
104
+ "items": { "$ref": "#/$defs/light" }
105
+ },
106
+ "spawns": {
107
+ "type": "array",
108
+ "minItems": 1,
109
+ "maxItems": 64,
110
+ "items": { "$ref": "#/$defs/spawn" }
111
+ },
112
+ "collision": {
113
+ "type": "object",
114
+ "additionalProperties": false,
115
+ "default": { "sets": [] },
116
+ "required": ["sets"],
117
+ "properties": {
118
+ "sets": {
119
+ "type": "array",
120
+ "maxItems": 256,
121
+ "items": { "$ref": "#/$defs/collisionSet" }
122
+ }
123
+ }
124
+ },
125
+ "navigation": { "$ref": "#/$defs/navigation" },
126
+ "placement": { "$ref": "#/$defs/placement" },
127
+ "surfaces": {
128
+ "type": "array",
129
+ "maxItems": 1024,
130
+ "default": [],
131
+ "items": { "$ref": "#/$defs/surface" }
132
+ },
133
+ "materials": {
134
+ "type": "array",
135
+ "maxItems": 512,
136
+ "default": [],
137
+ "items": { "$ref": "#/$defs/material" }
138
+ },
139
+ "behaviors": {
140
+ "type": "array",
141
+ "maxItems": 256,
142
+ "default": [],
143
+ "items": { "$ref": "#/$defs/behavior" }
144
+ },
145
+ "streamGroups": {
146
+ "type": "array",
147
+ "minItems": 1,
148
+ "maxItems": 256,
149
+ "items": { "$ref": "#/$defs/streamGroup" }
150
+ },
151
+ "capabilities": { "$ref": "#/$defs/capabilities" },
152
+ "runtimeExtensions": {
153
+ "type": "array",
154
+ "maxItems": 64,
155
+ "default": [],
156
+ "items": { "$ref": "#/$defs/runtimeExtension" }
157
+ },
158
+ "adapters": {
159
+ "type": "object",
160
+ "additionalProperties": false,
161
+ "required": ["unreal"],
162
+ "properties": {
163
+ "unreal": {
164
+ "type": "object",
165
+ "additionalProperties": false,
166
+ "required": [
167
+ "units",
168
+ "handedness",
169
+ "up",
170
+ "forward",
171
+ "positionMapping",
172
+ "rotationMapping",
173
+ "unitScale"
174
+ ],
175
+ "properties": {
176
+ "units": { "const": "centimeters" },
177
+ "handedness": { "const": "left" },
178
+ "up": { "const": "+Z" },
179
+ "forward": { "const": "+X" },
180
+ "positionMapping": { "const": "helix-minus-z-x-y-times-100" },
181
+ "rotationMapping": { "const": "helix-rh-y-up-to-unreal-lh-z-up" },
182
+ "unitScale": { "const": 100 }
183
+ }
184
+ }
185
+ }
186
+ }
187
+ },
188
+ "$defs": {
189
+ "id": {
190
+ "type": "string",
191
+ "minLength": 1,
192
+ "maxLength": 96,
193
+ "pattern": "^[a-z][a-z0-9]*(?:[._-][a-z0-9]+)*$"
194
+ },
195
+ "assetId": {
196
+ "type": "string",
197
+ "minLength": 1,
198
+ "maxLength": 128,
199
+ "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]*$"
200
+ },
201
+ "integrity": {
202
+ "type": "object",
203
+ "additionalProperties": false,
204
+ "required": ["sha256"],
205
+ "properties": {
206
+ "sha256": { "type": "string", "pattern": "^[a-f0-9]{64}$" }
207
+ }
208
+ },
209
+ "vec3": {
210
+ "type": "array",
211
+ "minItems": 3,
212
+ "maxItems": 3,
213
+ "prefixItems": [
214
+ { "type": "number", "minimum": -1000000, "maximum": 1000000 },
215
+ { "type": "number", "minimum": -1000000, "maximum": 1000000 },
216
+ { "type": "number", "minimum": -1000000, "maximum": 1000000 }
217
+ ],
218
+ "items": false
219
+ },
220
+ "positiveVec3": {
221
+ "type": "array",
222
+ "minItems": 3,
223
+ "maxItems": 3,
224
+ "prefixItems": [
225
+ { "type": "number", "exclusiveMinimum": 0, "maximum": 100000 },
226
+ { "type": "number", "exclusiveMinimum": 0, "maximum": 100000 },
227
+ { "type": "number", "exclusiveMinimum": 0, "maximum": 100000 }
228
+ ],
229
+ "items": false
230
+ },
231
+ "nonZeroScaleVec3": {
232
+ "type": "array",
233
+ "minItems": 3,
234
+ "maxItems": 3,
235
+ "prefixItems": [
236
+ {
237
+ "oneOf": [
238
+ { "type": "number", "minimum": -100000, "maximum": -0.000001 },
239
+ { "type": "number", "minimum": 0.000001, "maximum": 100000 }
240
+ ]
241
+ },
242
+ {
243
+ "oneOf": [
244
+ { "type": "number", "minimum": -100000, "maximum": -0.000001 },
245
+ { "type": "number", "minimum": 0.000001, "maximum": 100000 }
246
+ ]
247
+ },
248
+ {
249
+ "oneOf": [
250
+ { "type": "number", "minimum": -100000, "maximum": -0.000001 },
251
+ { "type": "number", "minimum": 0.000001, "maximum": 100000 }
252
+ ]
253
+ }
254
+ ],
255
+ "items": false
256
+ },
257
+ "quaternion": {
258
+ "type": "array",
259
+ "minItems": 4,
260
+ "maxItems": 4,
261
+ "prefixItems": [
262
+ { "type": "number", "minimum": -1, "maximum": 1 },
263
+ { "type": "number", "minimum": -1, "maximum": 1 },
264
+ { "type": "number", "minimum": -1, "maximum": 1 },
265
+ { "type": "number", "minimum": -1, "maximum": 1 }
266
+ ],
267
+ "items": false
268
+ },
269
+ "transform": {
270
+ "type": "object",
271
+ "additionalProperties": false,
272
+ "required": ["position", "rotation", "scale"],
273
+ "properties": {
274
+ "position": { "$ref": "#/$defs/vec3" },
275
+ "rotation": { "$ref": "#/$defs/quaternion" },
276
+ "scale": { "$ref": "#/$defs/nonZeroScaleVec3" }
277
+ }
278
+ },
279
+ "bounds": {
280
+ "type": "object",
281
+ "additionalProperties": false,
282
+ "required": ["min", "max"],
283
+ "properties": {
284
+ "min": { "$ref": "#/$defs/vec3" },
285
+ "max": { "$ref": "#/$defs/vec3" }
286
+ }
287
+ },
288
+ "profile": {
289
+ "type": "object",
290
+ "additionalProperties": false,
291
+ "required": [
292
+ "scene",
293
+ "kind",
294
+ "persistence",
295
+ "maxPlayers",
296
+ "overrideAuthority",
297
+ "runtimePolicy"
298
+ ],
299
+ "properties": {
300
+ "scene": { "$ref": "#/$defs/id" },
301
+ "kind": { "enum": ["home", "world"] },
302
+ "persistence": { "enum": ["residence", "world", "session", "none"] },
303
+ "maxPlayers": { "type": "integer", "minimum": 1, "maximum": 100 },
304
+ "overrideAuthority": { "enum": ["owner-editors", "instance-authority", "none"] },
305
+ "runtimePolicy": {
306
+ "type": "object",
307
+ "additionalProperties": false,
308
+ "required": [
309
+ "memoryBudgetMiB",
310
+ "streamRadiusM",
311
+ "allowSurfaceOverrides",
312
+ "allowItemPlacement"
313
+ ],
314
+ "properties": {
315
+ "memoryBudgetMiB": { "type": "integer", "minimum": 32, "maximum": 2048 },
316
+ "streamRadiusM": { "type": "number", "minimum": 1, "maximum": 10000 },
317
+ "allowSurfaceOverrides": { "type": "boolean" },
318
+ "allowItemPlacement": { "type": "boolean" }
319
+ }
320
+ }
321
+ }
322
+ },
323
+ "sceneRoot": {
324
+ "type": "object",
325
+ "additionalProperties": false,
326
+ "required": ["id", "nodes", "streamGroups"],
327
+ "properties": {
328
+ "id": { "$ref": "#/$defs/id" },
329
+ "nodes": {
330
+ "type": "array",
331
+ "minItems": 1,
332
+ "maxItems": 4096,
333
+ "uniqueItems": true,
334
+ "items": { "$ref": "#/$defs/id" }
335
+ },
336
+ "streamGroups": {
337
+ "type": "array",
338
+ "minItems": 1,
339
+ "maxItems": 256,
340
+ "uniqueItems": true,
341
+ "items": { "$ref": "#/$defs/id" }
342
+ }
343
+ }
344
+ },
345
+ "resource": {
346
+ "type": "object",
347
+ "additionalProperties": false,
348
+ "required": ["id", "kind", "source", "integrity", "mimeType"],
349
+ "properties": {
350
+ "id": { "$ref": "#/$defs/id" },
351
+ "kind": {
352
+ "enum": [
353
+ "model",
354
+ "material",
355
+ "texture",
356
+ "environment",
357
+ "terrain",
358
+ "collider",
359
+ "navmesh",
360
+ "audio",
361
+ "component-data"
362
+ ]
363
+ },
364
+ "source": {
365
+ "oneOf": [
366
+ {
367
+ "type": "object",
368
+ "additionalProperties": false,
369
+ "required": ["kind", "assetId", "uri"],
370
+ "properties": {
371
+ "kind": { "const": "bundle" },
372
+ "assetId": { "$ref": "#/$defs/assetId" },
373
+ "uri": {
374
+ "type": "string",
375
+ "minLength": 1,
376
+ "maxLength": 512,
377
+ "pattern": "^[A-Za-z0-9][A-Za-z0-9._-]*(?:/[A-Za-z0-9][A-Za-z0-9._-]*)*$"
378
+ }
379
+ }
380
+ },
381
+ {
382
+ "type": "object",
383
+ "additionalProperties": false,
384
+ "required": ["kind", "assetId", "revision"],
385
+ "properties": {
386
+ "kind": { "const": "vault" },
387
+ "assetId": { "$ref": "#/$defs/assetId" },
388
+ "revision": { "type": "integer", "minimum": 1, "maximum": 2147483647 },
389
+ "marketplaceProductId": { "$ref": "#/$defs/assetId" }
390
+ }
391
+ }
392
+ ]
393
+ },
394
+ "integrity": { "$ref": "#/$defs/integrity" },
395
+ "bytes": { "type": "integer", "minimum": 1, "maximum": 2147483647 },
396
+ "mimeType": {
397
+ "type": "string",
398
+ "minLength": 3,
399
+ "maxLength": 128,
400
+ "pattern": "^[a-z0-9][a-z0-9.+-]*/[a-z0-9][a-z0-9.+-]*$"
401
+ },
402
+ "required": { "type": "boolean", "default": true }
403
+ }
404
+ },
405
+ "lodLevel": {
406
+ "type": "object",
407
+ "additionalProperties": false,
408
+ "required": ["level", "resource"],
409
+ "properties": {
410
+ "level": { "type": "integer", "minimum": 0, "maximum": 7 },
411
+ "resource": { "$ref": "#/$defs/id" },
412
+ "maxDistanceM": { "type": "number", "exclusiveMinimum": 0, "maximum": 100000 },
413
+ "screenCoverage": { "type": "number", "exclusiveMinimum": 0, "maximum": 1 }
414
+ }
415
+ },
416
+ "component": {
417
+ "oneOf": [
418
+ {
419
+ "type": "object",
420
+ "additionalProperties": false,
421
+ "required": ["type", "castShadow", "receiveShadow"],
422
+ "properties": {
423
+ "type": { "const": "render.mesh" },
424
+ "castShadow": { "type": "boolean" },
425
+ "receiveShadow": { "type": "boolean" }
426
+ }
427
+ },
428
+ {
429
+ "type": "object",
430
+ "additionalProperties": false,
431
+ "required": ["type", "surfaces"],
432
+ "properties": {
433
+ "type": { "const": "surface.bindings" },
434
+ "surfaces": {
435
+ "type": "array",
436
+ "maxItems": 1024,
437
+ "uniqueItems": true,
438
+ "items": { "$ref": "#/$defs/id" }
439
+ }
440
+ }
441
+ },
442
+ {
443
+ "type": "object",
444
+ "additionalProperties": false,
445
+ "required": ["type", "set"],
446
+ "properties": {
447
+ "type": { "const": "collision.proxy-set" },
448
+ "set": { "$ref": "#/$defs/id" }
449
+ }
450
+ },
451
+ {
452
+ "type": "object",
453
+ "additionalProperties": false,
454
+ "required": ["type", "items"],
455
+ "properties": {
456
+ "type": { "const": "universal-item.instances" },
457
+ "items": {
458
+ "type": "array",
459
+ "maxItems": 2048,
460
+ "uniqueItems": true,
461
+ "items": { "$ref": "#/$defs/id" }
462
+ }
463
+ }
464
+ },
465
+ {
466
+ "type": "object",
467
+ "additionalProperties": false,
468
+ "required": ["type", "lights"],
469
+ "properties": {
470
+ "type": { "const": "light.attachments" },
471
+ "lights": {
472
+ "type": "array",
473
+ "maxItems": 64,
474
+ "uniqueItems": true,
475
+ "items": { "$ref": "#/$defs/id" }
476
+ }
477
+ }
478
+ }
479
+ ]
480
+ },
481
+ "node": {
482
+ "type": "object",
483
+ "additionalProperties": false,
484
+ "required": ["id", "streamGroup"],
485
+ "properties": {
486
+ "id": { "$ref": "#/$defs/id" },
487
+ "parent": { "$ref": "#/$defs/id" },
488
+ "resource": { "$ref": "#/$defs/id" },
489
+ "transform": {
490
+ "default": {
491
+ "position": [0, 0, 0],
492
+ "rotation": [0, 0, 0, 1],
493
+ "scale": [1, 1, 1]
494
+ },
495
+ "$ref": "#/$defs/transform"
496
+ },
497
+ "streamGroup": { "$ref": "#/$defs/id" },
498
+ "lod": {
499
+ "type": "object",
500
+ "additionalProperties": false,
501
+ "required": ["selection", "levels"],
502
+ "properties": {
503
+ "selection": { "enum": ["only-available", "distance", "screen-coverage", "resolver-owned"] },
504
+ "levels": {
505
+ "type": "array",
506
+ "maxItems": 8,
507
+ "items": { "$ref": "#/$defs/lodLevel" }
508
+ }
509
+ }
510
+ },
511
+ "components": {
512
+ "type": "array",
513
+ "maxItems": 16,
514
+ "items": { "$ref": "#/$defs/component" }
515
+ }
516
+ }
517
+ },
518
+ "itemDefinition": {
519
+ "type": "object",
520
+ "additionalProperties": false,
521
+ "required": ["id", "assetId", "revision", "integrity"],
522
+ "properties": {
523
+ "id": { "$ref": "#/$defs/id" },
524
+ "assetId": { "$ref": "#/$defs/assetId" },
525
+ "revision": { "type": "integer", "minimum": 1, "maximum": 2147483647 },
526
+ "integrity": { "$ref": "#/$defs/integrity" },
527
+ "marketplaceProductId": { "$ref": "#/$defs/assetId" }
528
+ }
529
+ },
530
+ "itemInstance": {
531
+ "type": "object",
532
+ "additionalProperties": false,
533
+ "required": ["id", "definition", "parentNode"],
534
+ "properties": {
535
+ "id": { "$ref": "#/$defs/id" },
536
+ "definition": { "$ref": "#/$defs/id" },
537
+ "parentNode": { "$ref": "#/$defs/id" },
538
+ "transform": {
539
+ "default": {
540
+ "position": [0, 0, 0],
541
+ "rotation": [0, 0, 0, 1],
542
+ "scale": [1, 1, 1]
543
+ },
544
+ "$ref": "#/$defs/transform"
545
+ },
546
+ "state": {
547
+ "type": "object",
548
+ "additionalProperties": false,
549
+ "required": ["schema", "values"],
550
+ "properties": {
551
+ "schema": {
552
+ "type": "string",
553
+ "pattern": "^helix\\.[a-z0-9.-]+/[1-9][0-9]*$",
554
+ "maxLength": 96
555
+ },
556
+ "values": { "type": "object", "maxProperties": 64 }
557
+ }
558
+ }
559
+ }
560
+ },
561
+ "terrain": {
562
+ "oneOf": [
563
+ {
564
+ "type": "object",
565
+ "additionalProperties": false,
566
+ "required": ["kind"],
567
+ "properties": { "kind": { "const": "none" } }
568
+ },
569
+ {
570
+ "type": "object",
571
+ "additionalProperties": false,
572
+ "required": ["kind"],
573
+ "properties": {
574
+ "kind": { "enum": ["heightfield", "mesh-ground", "voxel"] },
575
+ "node": { "$ref": "#/$defs/id" },
576
+ "resource": { "$ref": "#/$defs/id" },
577
+ "walkableSurface": { "$ref": "#/$defs/id" },
578
+ "fallback": {
579
+ "type": "object",
580
+ "additionalProperties": false,
581
+ "required": ["shape", "center", "halfExtents"],
582
+ "properties": {
583
+ "shape": { "const": "box" },
584
+ "center": { "$ref": "#/$defs/vec3" },
585
+ "halfExtents": { "$ref": "#/$defs/positiveVec3" }
586
+ }
587
+ }
588
+ }
589
+ }
590
+ ]
591
+ },
592
+ "environment": {
593
+ "type": "object",
594
+ "additionalProperties": false,
595
+ "required": ["background", "intensityScale", "rotationYDeg", "exposureEV100", "fallbackColor", "required"],
596
+ "properties": {
597
+ "resource": { "$ref": "#/$defs/id" },
598
+ "background": { "type": "boolean" },
599
+ "intensityScale": { "type": "number", "minimum": 0, "maximum": 16 },
600
+ "rotationYDeg": { "type": "number", "minimum": -360, "maximum": 360 },
601
+ "exposureEV100": { "type": "number", "minimum": -16, "maximum": 24 },
602
+ "fallbackColor": { "$ref": "#/$defs/color" },
603
+ "required": { "type": "boolean" }
604
+ }
605
+ },
606
+ "shadow": {
607
+ "type": "object",
608
+ "additionalProperties": false,
609
+ "required": ["enabled", "mapSize"],
610
+ "properties": {
611
+ "enabled": { "type": "boolean" },
612
+ "mapSize": { "enum": [256, 512, 1024, 2048] },
613
+ "bias": { "type": "number", "minimum": -0.1, "maximum": 0.1 },
614
+ "normalBias": { "type": "number", "minimum": 0, "maximum": 1 }
615
+ }
616
+ },
617
+ "lightFallback": {
618
+ "type": "object",
619
+ "additionalProperties": false,
620
+ "required": ["unsupported"],
621
+ "properties": {
622
+ "unsupported": { "enum": ["unshadowed", "baked", "omit", "fail"] },
623
+ "bakedResource": { "$ref": "#/$defs/id" }
624
+ }
625
+ },
626
+ "light": {
627
+ "oneOf": [
628
+ {
629
+ "type": "object",
630
+ "additionalProperties": false,
631
+ "required": ["id", "node", "type", "color", "illuminanceLux", "shadow", "required", "fallback"],
632
+ "properties": {
633
+ "id": { "$ref": "#/$defs/id" },
634
+ "node": { "$ref": "#/$defs/id" },
635
+ "type": { "const": "directional" },
636
+ "color": { "$ref": "#/$defs/color" },
637
+ "illuminanceLux": { "type": "number", "exclusiveMinimum": 0, "maximum": 200000 },
638
+ "shadow": { "$ref": "#/$defs/shadow" },
639
+ "required": { "type": "boolean" },
640
+ "fallback": { "$ref": "#/$defs/lightFallback" }
641
+ }
642
+ },
643
+ {
644
+ "type": "object",
645
+ "additionalProperties": false,
646
+ "required": ["id", "node", "type", "color", "luminousIntensityCandela", "rangeM", "shadow", "required", "fallback"],
647
+ "properties": {
648
+ "id": { "$ref": "#/$defs/id" },
649
+ "node": { "$ref": "#/$defs/id" },
650
+ "type": { "const": "point" },
651
+ "color": { "$ref": "#/$defs/color" },
652
+ "luminousIntensityCandela": { "type": "number", "exclusiveMinimum": 0, "maximum": 10000000 },
653
+ "rangeM": { "type": "number", "exclusiveMinimum": 0, "maximum": 10000 },
654
+ "shadow": { "$ref": "#/$defs/shadow" },
655
+ "required": { "type": "boolean" },
656
+ "fallback": { "$ref": "#/$defs/lightFallback" }
657
+ }
658
+ },
659
+ {
660
+ "type": "object",
661
+ "additionalProperties": false,
662
+ "required": ["id", "node", "type", "color", "luminousIntensityCandela", "rangeM", "innerConeDeg", "outerConeDeg", "shadow", "required", "fallback"],
663
+ "properties": {
664
+ "id": { "$ref": "#/$defs/id" },
665
+ "node": { "$ref": "#/$defs/id" },
666
+ "type": { "const": "spot" },
667
+ "color": { "$ref": "#/$defs/color" },
668
+ "luminousIntensityCandela": { "type": "number", "exclusiveMinimum": 0, "maximum": 10000000 },
669
+ "rangeM": { "type": "number", "exclusiveMinimum": 0, "maximum": 10000 },
670
+ "innerConeDeg": { "type": "number", "minimum": 0, "exclusiveMaximum": 90 },
671
+ "outerConeDeg": { "type": "number", "exclusiveMinimum": 0, "maximum": 90 },
672
+ "shadow": { "$ref": "#/$defs/shadow" },
673
+ "required": { "type": "boolean" },
674
+ "fallback": { "$ref": "#/$defs/lightFallback" }
675
+ }
676
+ }
677
+ ]
678
+ },
679
+ "color": {
680
+ "type": "string",
681
+ "pattern": "^#[A-Fa-f0-9]{6}$"
682
+ },
683
+ "spawn": {
684
+ "type": "object",
685
+ "additionalProperties": false,
686
+ "required": ["id", "position", "rotation", "profileAccess", "clearanceRadiusM", "clearanceHeightM"],
687
+ "properties": {
688
+ "id": { "$ref": "#/$defs/id" },
689
+ "position": { "$ref": "#/$defs/vec3" },
690
+ "rotation": { "$ref": "#/$defs/quaternion" },
691
+ "profileAccess": {
692
+ "type": "array",
693
+ "minItems": 1,
694
+ "maxItems": 8,
695
+ "uniqueItems": true,
696
+ "items": { "$ref": "#/$defs/id" }
697
+ },
698
+ "clearanceRadiusM": { "type": "number", "minimum": 0.1, "maximum": 10 },
699
+ "clearanceHeightM": { "type": "number", "minimum": 0.5, "maximum": 20 }
700
+ }
701
+ },
702
+ "collider": {
703
+ "oneOf": [
704
+ {
705
+ "type": "object",
706
+ "additionalProperties": false,
707
+ "required": ["id", "shape", "center", "halfExtents"],
708
+ "properties": {
709
+ "id": { "$ref": "#/$defs/id" },
710
+ "shape": { "const": "box" },
711
+ "center": { "$ref": "#/$defs/vec3" },
712
+ "halfExtents": { "$ref": "#/$defs/positiveVec3" },
713
+ "surface": { "$ref": "#/$defs/id" }
714
+ }
715
+ },
716
+ {
717
+ "type": "object",
718
+ "additionalProperties": false,
719
+ "required": ["id", "shape", "center", "radiusM"],
720
+ "properties": {
721
+ "id": { "$ref": "#/$defs/id" },
722
+ "shape": { "const": "sphere" },
723
+ "center": { "$ref": "#/$defs/vec3" },
724
+ "radiusM": { "type": "number", "exclusiveMinimum": 0, "maximum": 100000 },
725
+ "surface": { "$ref": "#/$defs/id" }
726
+ }
727
+ },
728
+ {
729
+ "type": "object",
730
+ "additionalProperties": false,
731
+ "required": ["id", "shape", "center", "halfHeightM", "radiusM"],
732
+ "properties": {
733
+ "id": { "$ref": "#/$defs/id" },
734
+ "shape": { "const": "capsule" },
735
+ "center": { "$ref": "#/$defs/vec3" },
736
+ "halfHeightM": { "type": "number", "exclusiveMinimum": 0, "maximum": 100000 },
737
+ "radiusM": { "type": "number", "exclusiveMinimum": 0, "maximum": 100000 },
738
+ "surface": { "$ref": "#/$defs/id" }
739
+ }
740
+ },
741
+ {
742
+ "type": "object",
743
+ "additionalProperties": false,
744
+ "required": ["id", "shape", "resource", "transform"],
745
+ "properties": {
746
+ "id": { "$ref": "#/$defs/id" },
747
+ "shape": { "enum": ["convex", "triangle-mesh"] },
748
+ "resource": { "$ref": "#/$defs/id" },
749
+ "transform": { "$ref": "#/$defs/transform" },
750
+ "surface": { "$ref": "#/$defs/id" }
751
+ }
752
+ }
753
+ ]
754
+ },
755
+ "collisionSet": {
756
+ "type": "object",
757
+ "additionalProperties": false,
758
+ "required": ["id", "node", "static"],
759
+ "properties": {
760
+ "id": { "$ref": "#/$defs/id" },
761
+ "node": { "$ref": "#/$defs/id" },
762
+ "static": {
763
+ "type": "array",
764
+ "maxItems": 4096,
765
+ "items": { "$ref": "#/$defs/collider" }
766
+ }
767
+ }
768
+ },
769
+ "navigation": {
770
+ "type": "object",
771
+ "additionalProperties": false,
772
+ "required": ["walkableSurfaces", "agent", "navmesh", "fallback"],
773
+ "properties": {
774
+ "walkableSurfaces": {
775
+ "type": "array",
776
+ "maxItems": 1024,
777
+ "uniqueItems": true,
778
+ "items": { "$ref": "#/$defs/id" }
779
+ },
780
+ "agent": {
781
+ "type": "object",
782
+ "additionalProperties": false,
783
+ "required": ["radiusM", "heightM", "stepHeightM", "maxSlopeDeg"],
784
+ "properties": {
785
+ "radiusM": { "type": "number", "exclusiveMinimum": 0, "maximum": 10 },
786
+ "heightM": { "type": "number", "exclusiveMinimum": 0, "maximum": 20 },
787
+ "stepHeightM": { "type": "number", "minimum": 0, "maximum": 5 },
788
+ "maxSlopeDeg": { "type": "number", "minimum": 0, "maximum": 89 }
789
+ }
790
+ },
791
+ "navmesh": {
792
+ "oneOf": [{ "$ref": "#/$defs/id" }, { "type": "null" }]
793
+ },
794
+ "fallback": { "enum": ["physics-walkability", "none"] }
795
+ }
796
+ },
797
+ "placement": {
798
+ "type": "object",
799
+ "additionalProperties": false,
800
+ "required": ["bounds", "maxItemInstances", "snapGridM", "allowedProfiles"],
801
+ "properties": {
802
+ "bounds": { "$ref": "#/$defs/bounds" },
803
+ "maxItemInstances": { "type": "integer", "minimum": 0, "maximum": 2048 },
804
+ "snapGridM": { "type": "number", "minimum": 0, "maximum": 10 },
805
+ "allowedProfiles": {
806
+ "type": "array",
807
+ "maxItems": 8,
808
+ "uniqueItems": true,
809
+ "items": { "$ref": "#/$defs/id" }
810
+ }
811
+ }
812
+ },
813
+ "surface": {
814
+ "type": "object",
815
+ "additionalProperties": false,
816
+ "required": ["id", "slot", "node", "selector", "default", "overridePolicy"],
817
+ "properties": {
818
+ "id": { "$ref": "#/$defs/id" },
819
+ "slot": { "type": "string", "minLength": 1, "maxLength": 64, "pattern": "^[a-z][a-z0-9-]*$" },
820
+ "node": { "$ref": "#/$defs/id" },
821
+ "selector": {
822
+ "type": "object",
823
+ "additionalProperties": false,
824
+ "properties": {
825
+ "primitiveIds": {
826
+ "type": "array",
827
+ "maxItems": 256,
828
+ "uniqueItems": true,
829
+ "items": { "$ref": "#/$defs/id" }
830
+ },
831
+ "materialNames": {
832
+ "type": "array",
833
+ "maxItems": 256,
834
+ "uniqueItems": true,
835
+ "items": { "type": "string", "minLength": 1, "maxLength": 128 }
836
+ },
837
+ "meshNames": {
838
+ "type": "array",
839
+ "maxItems": 256,
840
+ "uniqueItems": true,
841
+ "items": { "type": "string", "minLength": 1, "maxLength": 128 }
842
+ }
843
+ }
844
+ },
845
+ "default": {
846
+ "oneOf": [
847
+ {
848
+ "type": "object",
849
+ "additionalProperties": false,
850
+ "required": ["kind"],
851
+ "properties": { "kind": { "const": "source" } }
852
+ },
853
+ {
854
+ "type": "object",
855
+ "additionalProperties": false,
856
+ "required": ["kind", "material"],
857
+ "properties": {
858
+ "kind": { "const": "material" },
859
+ "material": { "$ref": "#/$defs/id" }
860
+ }
861
+ }
862
+ ]
863
+ },
864
+ "overridePolicy": {
865
+ "type": "object",
866
+ "additionalProperties": false,
867
+ "required": ["allowed", "roles", "parameters"],
868
+ "properties": {
869
+ "allowed": { "type": "boolean" },
870
+ "roles": {
871
+ "type": "array",
872
+ "maxItems": 3,
873
+ "uniqueItems": true,
874
+ "items": { "enum": ["owner", "editor", "instance-authority"] }
875
+ },
876
+ "parameters": {
877
+ "type": "array",
878
+ "maxItems": 7,
879
+ "uniqueItems": true,
880
+ "items": { "enum": ["material", "tint", "repeatPerMeter", "offsetU", "offsetV", "roughnessScale", "metalnessScale"] }
881
+ },
882
+ "allowedMaterials": {
883
+ "type": "array",
884
+ "maxItems": 512,
885
+ "uniqueItems": true,
886
+ "items": { "$ref": "#/$defs/id" }
887
+ }
888
+ }
889
+ }
890
+ }
891
+ },
892
+ "material": {
893
+ "type": "object",
894
+ "additionalProperties": false,
895
+ "required": ["id", "resource", "defaults"],
896
+ "properties": {
897
+ "id": { "$ref": "#/$defs/id" },
898
+ "resource": { "$ref": "#/$defs/id" },
899
+ "defaults": {
900
+ "type": "object",
901
+ "additionalProperties": false,
902
+ "required": ["tint", "repeatPerMeter", "roughnessScale", "metalnessScale"],
903
+ "properties": {
904
+ "tint": { "$ref": "#/$defs/color" },
905
+ "repeatPerMeter": { "type": "number", "exclusiveMinimum": 0, "maximum": 100 },
906
+ "offsetU": { "type": "number", "minimum": 0, "maximum": 1 },
907
+ "offsetV": { "type": "number", "minimum": 0, "maximum": 1 },
908
+ "roughnessScale": { "type": "number", "minimum": 0, "maximum": 2 },
909
+ "metalnessScale": { "type": "number", "minimum": 0, "maximum": 2 }
910
+ }
911
+ }
912
+ }
913
+ },
914
+ "behaviorImplementation": {
915
+ "type": "object",
916
+ "additionalProperties": false,
917
+ "required": ["packageId", "revision", "integrity", "signature"],
918
+ "properties": {
919
+ "packageId": { "$ref": "#/$defs/assetId" },
920
+ "revision": { "type": "integer", "minimum": 1, "maximum": 2147483647 },
921
+ "integrity": { "$ref": "#/$defs/integrity" },
922
+ "signature": {
923
+ "type": "object",
924
+ "additionalProperties": false,
925
+ "required": ["algorithm", "keyId", "valueBase64"],
926
+ "properties": {
927
+ "algorithm": { "const": "ed25519" },
928
+ "keyId": { "$ref": "#/$defs/assetId" },
929
+ "valueBase64": {
930
+ "type": "string",
931
+ "pattern": "^[A-Za-z0-9+/]{86}==$"
932
+ }
933
+ }
934
+ }
935
+ }
936
+ },
937
+ "behavior": {
938
+ "type": "object",
939
+ "additionalProperties": false,
940
+ "required": ["id", "component", "implementation", "targets", "authority", "requiredCapabilities", "config"],
941
+ "properties": {
942
+ "id": { "$ref": "#/$defs/id" },
943
+ "component": { "type": "string", "minLength": 3, "maxLength": 96, "pattern": "^[a-z][a-z0-9.-]+/[1-9][0-9]*$" },
944
+ "implementation": { "$ref": "#/$defs/behaviorImplementation" },
945
+ "targets": {
946
+ "type": "array",
947
+ "maxItems": 128,
948
+ "uniqueItems": true,
949
+ "items": { "$ref": "#/$defs/id" }
950
+ },
951
+ "authority": { "enum": ["runtime-host", "instance-owner", "instance-authority"] },
952
+ "requiredCapabilities": {
953
+ "type": "array",
954
+ "maxItems": 32,
955
+ "uniqueItems": true,
956
+ "items": { "$ref": "#/$defs/capability" }
957
+ },
958
+ "config": { "type": "object", "maxProperties": 64 }
959
+ }
960
+ },
961
+ "streamCell": {
962
+ "type": "object",
963
+ "additionalProperties": false,
964
+ "required": ["id", "bounds", "nodes"],
965
+ "properties": {
966
+ "id": { "$ref": "#/$defs/id" },
967
+ "bounds": { "$ref": "#/$defs/bounds" },
968
+ "nodes": {
969
+ "type": "array",
970
+ "maxItems": 1024,
971
+ "uniqueItems": true,
972
+ "items": { "$ref": "#/$defs/id" }
973
+ }
974
+ }
975
+ },
976
+ "streamGroup": {
977
+ "type": "object",
978
+ "additionalProperties": false,
979
+ "required": ["id", "mode", "priority", "cells", "dependencies", "estimatedMemoryMiB"],
980
+ "properties": {
981
+ "id": { "$ref": "#/$defs/id" },
982
+ "mode": { "enum": ["eager", "distance", "portal"] },
983
+ "priority": { "type": "integer", "minimum": 0, "maximum": 1000 },
984
+ "cells": {
985
+ "type": "array",
986
+ "minItems": 1,
987
+ "maxItems": 1024,
988
+ "items": { "$ref": "#/$defs/streamCell" }
989
+ },
990
+ "dependencies": {
991
+ "type": "array",
992
+ "maxItems": 256,
993
+ "uniqueItems": true,
994
+ "items": { "$ref": "#/$defs/id" }
995
+ },
996
+ "estimatedMemoryMiB": { "type": "integer", "minimum": 1, "maximum": 16384 }
997
+ }
998
+ },
999
+ "capability": {
1000
+ "type": "string",
1001
+ "minLength": 3,
1002
+ "maxLength": 96,
1003
+ "pattern": "^[a-z][a-z0-9.-]+/[1-9][0-9]*$"
1004
+ },
1005
+ "capabilities": {
1006
+ "type": "object",
1007
+ "additionalProperties": false,
1008
+ "required": ["required", "optional"],
1009
+ "properties": {
1010
+ "required": {
1011
+ "type": "array",
1012
+ "maxItems": 64,
1013
+ "uniqueItems": true,
1014
+ "items": { "$ref": "#/$defs/capability" }
1015
+ },
1016
+ "optional": {
1017
+ "type": "array",
1018
+ "maxItems": 64,
1019
+ "uniqueItems": true,
1020
+ "items": { "$ref": "#/$defs/capability" }
1021
+ }
1022
+ }
1023
+ },
1024
+ "runtimeExtension": {
1025
+ "type": "object",
1026
+ "additionalProperties": false,
1027
+ "required": ["id", "extension", "runtime", "targetNodes", "required", "fallback", "parameters"],
1028
+ "properties": {
1029
+ "id": { "$ref": "#/$defs/id" },
1030
+ "extension": { "type": "string", "minLength": 3, "maxLength": 96, "pattern": "^[a-z][a-z0-9.-]+/[1-9][0-9]*$" },
1031
+ "runtime": { "enum": ["unreal", "web"] },
1032
+ "targetNodes": {
1033
+ "type": "array",
1034
+ "maxItems": 512,
1035
+ "uniqueItems": true,
1036
+ "items": { "$ref": "#/$defs/id" }
1037
+ },
1038
+ "required": { "type": "boolean" },
1039
+ "fallback": { "enum": ["portable", "omit", "fail"] },
1040
+ "parameters": {
1041
+ "type": "object",
1042
+ "maxProperties": 32,
1043
+ "propertyNames": { "pattern": "^[A-Za-z][A-Za-z0-9_]{0,31}$" },
1044
+ "additionalProperties": {
1045
+ "oneOf": [
1046
+ { "type": "string", "maxLength": 256 },
1047
+ { "type": "number" },
1048
+ { "type": "boolean" }
1049
+ ]
1050
+ }
1051
+ }
1052
+ }
1053
+ }
1054
+ }
1055
+ }