@ue-shed/protocol 0.1.0 → 0.2.0

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 (39) hide show
  1. package/README.md +2 -1
  2. package/contracts/cameras/map-tile/v1/README.md +44 -0
  3. package/contracts/cameras/map-tile/v1/capture-request.schema.json +68 -0
  4. package/contracts/cameras/map-tile/v1/capture-response.schema.json +115 -0
  5. package/contracts/cameras/map-tile/v1/fixtures/capture-request-valid.json +32 -0
  6. package/contracts/cameras/map-tile/v1/fixtures/capture-response-valid.json +24 -0
  7. package/contracts/cameras/map-tile/v1/fixtures/manifest-invalid-complete.json +41 -0
  8. package/contracts/cameras/map-tile/v1/fixtures/manifest-invalid-grid.json +44 -0
  9. package/contracts/cameras/map-tile/v1/fixtures/manifest-valid.json +60 -0
  10. package/contracts/cameras/map-tile/v1/fixtures/plan-valid.json +27 -0
  11. package/contracts/cameras/map-tile/v1/manifest.schema.json +162 -0
  12. package/contracts/cameras/map-tile/v1/plan.schema.json +176 -0
  13. package/contracts/cameras/provisioning/v1/README.md +5 -3
  14. package/contracts/cameras/provisioning/v1/fixtures/provision-request-valid.json +11 -2
  15. package/contracts/cameras/provisioning/v1/provision-request.schema.json +131 -50
  16. package/contracts/cameras/v1/README.md +6 -3
  17. package/contracts/editor-world/v1/README.md +10 -0
  18. package/contracts/editor-world/v1/request.schema.json +16 -0
  19. package/contracts/editor-world/v1/response.schema.json +93 -0
  20. package/dist/authoring.d.ts +6 -1
  21. package/dist/authoring.d.ts.map +1 -1
  22. package/dist/companion.d.ts +14 -0
  23. package/dist/companion.d.ts.map +1 -1
  24. package/dist/companion.js +7 -0
  25. package/dist/companion.js.map +1 -1
  26. package/dist/editor-play-session.d.ts +4 -1
  27. package/dist/editor-play-session.d.ts.map +1 -1
  28. package/dist/editor-play-session.js.map +1 -1
  29. package/dist/editor-world-control.d.ts +179 -0
  30. package/dist/editor-world-control.d.ts.map +1 -0
  31. package/dist/editor-world-control.js +47 -0
  32. package/dist/editor-world-control.js.map +1 -0
  33. package/dist/index.d.ts +6 -5
  34. package/dist/index.d.ts.map +1 -1
  35. package/dist/index.js +2 -1
  36. package/dist/index.js.map +1 -1
  37. package/dist/uasset-io.d.ts +6 -1
  38. package/dist/uasset-io.d.ts.map +1 -1
  39. package/package.json +1 -1
package/README.md CHANGED
@@ -18,7 +18,8 @@ import {
18
18
  ```
19
19
 
20
20
  The root entry point includes the core capability and connection schemas plus the authoring, camera,
21
- companion, and editor play-session contracts. Internal source modules are not public subpaths.
21
+ companion, editor play-session, and editor world-control contracts. Internal source modules are not
22
+ public subpaths.
22
23
 
23
24
  The `contracts/` directory in the package contains the language-neutral JSON Schema authorities and
24
25
  conformance fixtures. These files are shipped for protocol implementors, but JavaScript consumers
@@ -0,0 +1,44 @@
1
+ # Map tile capture contract v1
2
+
3
+ These checked-in JSON Schemas are the language-neutral authority for generic top-down map capture.
4
+ They are a sibling to, and do not change, `ue-shed-review-capture` v1.
5
+
6
+ `plan.schema.json` describes an external Map Capture Plan. `capture-request.schema.json` and
7
+ `capture-response.schema.json` describe a bounded editor operation named
8
+ `ue-shed-map-tile-capture`. `manifest.schema.json` describes neutral host-published
9
+ `ue-shed-map-tile-pyramid` evidence. All are major 1, minor 0.
10
+
11
+ Rows progress from world max-X toward min-X. Columns progress from world min-Y toward max-Y. The
12
+ orientation is explicit and versioned. A level halves units-per-pixel and doubles rows and columns;
13
+ capture Z does not define detail. The editor renders `gutterPixels` beyond each edge at the same
14
+ units-per-pixel and crops back to `tilePixelSize` before PNG encoding. Consumers use clamp-to-edge
15
+ sampling inside each published tile.
16
+
17
+ `captureBackend` is an optional execution hint, not part of the portable plan. Its default
18
+ `scene_capture_tiles` behavior remains the v1 tile operation. The experimental
19
+ `viewport_high_resolution` value requires one complete zoom level of at most 64 tiles; Unreal
20
+ renders that level through the active Level Editor viewport's High Resolution Screenshot path and
21
+ then cuts the resulting image into the requested tiles.
22
+
23
+ The editor accepts no output path. It stages only below `Saved/UEShed/MapTileStaging`, reports every
24
+ tile outcome and map package dirty state, and restores transient state before returning. The host
25
+ must validate staging containment, hash artifacts, and atomically publish only a manifest whose
26
+ state is `complete` and whose tile inventory is exhaustive. Partial and cancelled attempts remain
27
+ diagnostic evidence and are never discoverable as completed runs.
28
+
29
+ The `full_fidelity` render profile explicitly restores the active project's renderer features on
30
+ the tiled SceneCapture. `seam_stable` keeps project lighting and post processing while disabling
31
+ tile-local exposure, temporal accumulation, and screen-space lighting traces; it renders at 2x and
32
+ spatially downsamples to the declared tile size. `scene_capture_defaults` is the comparison
33
+ baseline: it leaves Unreal's SceneCapture renderer defaults unchanged while keeping the same tile
34
+ framing, gutter, warm-up, and publication path. These distinctions apply to `scene_capture_tiles`;
35
+ the experimental viewport backend does not use the transient SceneCapture renderer. `observation`
36
+ remains the reduced-effects profile.
37
+
38
+ The v1 editor capability requires the expected map to already be open. A headless launcher may open
39
+ that map explicitly before connecting. Interactive hosts must refuse a map switch when dirty
40
+ packages could be discarded. Map-session switching/restoration is deliberately outside this Remote
41
+ Control payload rather than giving it hidden editor authority.
42
+
43
+ Change this contract in authority order: JSON Schema and fixtures, conformant Effect codecs,
44
+ UEShedCameras C++ producer with trusted UE 5.7 evidence, then consumers.
@@ -0,0 +1,68 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://ue-shed.dev/contracts/cameras/map-tile/v1/capture-request.schema.json",
4
+ "title": "UE Shed bounded map tile capture request v1.0",
5
+ "type": "object",
6
+ "additionalProperties": false,
7
+ "required": [
8
+ "capture",
9
+ "contract",
10
+ "correlationId",
11
+ "expectedMapPath",
12
+ "gutterPixels",
13
+ "operationId",
14
+ "planId",
15
+ "runId",
16
+ "tilePixelSize",
17
+ "tiles"
18
+ ],
19
+ "properties": {
20
+ "capture": { "$ref": "plan.schema.json#/$defs/capturePolicy" },
21
+ "captureBackend": {
22
+ "enum": ["scene_capture_tiles", "viewport_high_resolution"]
23
+ },
24
+ "contract": {
25
+ "type": "object",
26
+ "additionalProperties": false,
27
+ "required": ["name", "version"],
28
+ "properties": {
29
+ "name": { "const": "ue-shed-map-tile-capture" },
30
+ "version": { "$ref": "plan.schema.json#/$defs/version" }
31
+ }
32
+ },
33
+ "correlationId": { "$ref": "plan.schema.json#/$defs/id" },
34
+ "expectedMapPath": { "type": "string", "pattern": "^/[A-Za-z0-9_./-]+$" },
35
+ "gutterPixels": { "type": "integer", "minimum": 0, "maximum": 32 },
36
+ "operationId": { "$ref": "plan.schema.json#/$defs/id" },
37
+ "planId": { "$ref": "plan.schema.json#/$defs/id" },
38
+ "runId": { "$ref": "plan.schema.json#/$defs/id" },
39
+ "tilePixelSize": { "type": "integer", "minimum": 64, "maximum": 4096 },
40
+ "tiles": {
41
+ "type": "array",
42
+ "minItems": 1,
43
+ "maxItems": 64,
44
+ "items": {
45
+ "type": "object",
46
+ "additionalProperties": false,
47
+ "required": ["key", "unitsPerPixel", "worldBounds"],
48
+ "properties": {
49
+ "key": { "$ref": "#/$defs/tileKey" },
50
+ "unitsPerPixel": { "type": "number", "exclusiveMinimum": 0 },
51
+ "worldBounds": { "$ref": "plan.schema.json#/$defs/bounds" }
52
+ }
53
+ }
54
+ }
55
+ },
56
+ "$defs": {
57
+ "tileKey": {
58
+ "type": "object",
59
+ "additionalProperties": false,
60
+ "required": ["zoom", "row", "column"],
61
+ "properties": {
62
+ "zoom": { "type": "integer", "minimum": 0 },
63
+ "row": { "type": "integer", "minimum": 0 },
64
+ "column": { "type": "integer", "minimum": 0 }
65
+ }
66
+ }
67
+ }
68
+ }
@@ -0,0 +1,115 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://ue-shed.dev/contracts/cameras/map-tile/v1/capture-response.schema.json",
4
+ "title": "UE Shed bounded map tile capture response v1.0",
5
+ "type": "object",
6
+ "additionalProperties": false,
7
+ "required": [
8
+ "contract",
9
+ "correlationId",
10
+ "dirtyState",
11
+ "durationMs",
12
+ "operationId",
13
+ "results",
14
+ "status",
15
+ "tileCounts"
16
+ ],
17
+ "properties": {
18
+ "actualMapPath": { "type": "string", "pattern": "^/[A-Za-z0-9_./-]+$" },
19
+ "contract": {
20
+ "type": "object",
21
+ "additionalProperties": false,
22
+ "required": ["name", "version"],
23
+ "properties": {
24
+ "name": { "const": "ue-shed-map-tile-capture" },
25
+ "version": { "$ref": "plan.schema.json#/$defs/version" }
26
+ }
27
+ },
28
+ "correlationId": { "$ref": "plan.schema.json#/$defs/id" },
29
+ "dirtyState": {
30
+ "type": "object",
31
+ "additionalProperties": false,
32
+ "required": ["before", "after"],
33
+ "properties": { "before": { "type": "boolean" }, "after": { "type": "boolean" } }
34
+ },
35
+ "durationMs": { "type": "number", "minimum": 0 },
36
+ "failure": { "$ref": "#/$defs/failure" },
37
+ "operationId": { "$ref": "plan.schema.json#/$defs/id" },
38
+ "results": {
39
+ "type": "array",
40
+ "maxItems": 64,
41
+ "items": {
42
+ "oneOf": [
43
+ {
44
+ "type": "object",
45
+ "additionalProperties": false,
46
+ "required": [
47
+ "bytes",
48
+ "captureDurationMs",
49
+ "height",
50
+ "key",
51
+ "stagedPath",
52
+ "status",
53
+ "width"
54
+ ],
55
+ "properties": {
56
+ "bytes": { "type": "integer", "minimum": 1 },
57
+ "captureDurationMs": { "type": "number", "minimum": 0 },
58
+ "height": { "type": "integer", "minimum": 1 },
59
+ "key": { "$ref": "capture-request.schema.json#/$defs/tileKey" },
60
+ "stagedPath": { "type": "string", "minLength": 1 },
61
+ "status": { "const": "captured" },
62
+ "width": { "type": "integer", "minimum": 1 }
63
+ }
64
+ },
65
+ {
66
+ "type": "object",
67
+ "additionalProperties": false,
68
+ "required": ["failure", "key", "status"],
69
+ "properties": {
70
+ "failure": { "$ref": "#/$defs/failure" },
71
+ "key": { "$ref": "capture-request.schema.json#/$defs/tileKey" },
72
+ "status": { "const": "failed" }
73
+ }
74
+ }
75
+ ]
76
+ }
77
+ },
78
+ "status": { "enum": ["completed", "partial", "cancelled", "failed"] },
79
+ "tileCounts": {
80
+ "type": "object",
81
+ "additionalProperties": false,
82
+ "required": ["failed", "requested", "succeeded"],
83
+ "properties": {
84
+ "failed": { "type": "integer", "minimum": 0 },
85
+ "requested": { "type": "integer", "minimum": 0 },
86
+ "succeeded": { "type": "integer", "minimum": 0 }
87
+ }
88
+ }
89
+ },
90
+ "$defs": {
91
+ "failure": {
92
+ "type": "object",
93
+ "additionalProperties": false,
94
+ "required": ["code", "message", "recovery", "retrySafe"],
95
+ "properties": {
96
+ "code": {
97
+ "enum": [
98
+ "cancelled",
99
+ "capture_failed",
100
+ "data_layer_policy_unsupported",
101
+ "dirty_state_changed",
102
+ "encoding_failed",
103
+ "invalid_request",
104
+ "map_mismatch",
105
+ "streaming_not_ready",
106
+ "write_failed"
107
+ ]
108
+ },
109
+ "message": { "type": "string", "minLength": 1, "maxLength": 1024 },
110
+ "recovery": { "type": "string", "minLength": 1, "maxLength": 1024 },
111
+ "retrySafe": { "type": "boolean" }
112
+ }
113
+ }
114
+ }
115
+ }
@@ -0,0 +1,32 @@
1
+ {
2
+ "capture": {
3
+ "dataLayers": { "mode": "unchanged" },
4
+ "orientation": { "pitch": -90, "roll": 0, "yaw": 0 },
5
+ "render": {
6
+ "effects": { "fog": false, "volumetricFog": false },
7
+ "lodDistanceScaleByZoom": [4, 2, 1],
8
+ "lodPolicy": "per_level_distance_scale",
9
+ "profile": "full_fidelity"
10
+ },
11
+ "z": 5000
12
+ },
13
+ "captureBackend": "scene_capture_tiles",
14
+ "contract": {
15
+ "name": "ue-shed-map-tile-capture",
16
+ "version": { "major": 1, "minor": 0 }
17
+ },
18
+ "correlationId": "fixture-correlation",
19
+ "expectedMapPath": "/Game/Fixture/Cameras/L_CameraLoad",
20
+ "gutterPixels": 2,
21
+ "operationId": "fixture-operation",
22
+ "planId": "fixture-overview",
23
+ "runId": "fixture-run",
24
+ "tilePixelSize": 256,
25
+ "tiles": [
26
+ {
27
+ "key": { "zoom": 0, "row": 0, "column": 0 },
28
+ "unitsPerPixel": 4,
29
+ "worldBounds": { "minX": 1024, "minY": -1024, "maxX": 2048, "maxY": 0 }
30
+ }
31
+ ]
32
+ }
@@ -0,0 +1,24 @@
1
+ {
2
+ "actualMapPath": "/Game/Fixture/Cameras/L_CameraLoad",
3
+ "contract": {
4
+ "name": "ue-shed-map-tile-capture",
5
+ "version": { "major": 1, "minor": 0 }
6
+ },
7
+ "correlationId": "fixture-correlation",
8
+ "dirtyState": { "before": false, "after": false },
9
+ "durationMs": 27.5,
10
+ "operationId": "fixture-operation",
11
+ "results": [
12
+ {
13
+ "bytes": 1234,
14
+ "captureDurationMs": 20.25,
15
+ "height": 256,
16
+ "key": { "zoom": 0, "row": 0, "column": 0 },
17
+ "stagedPath": "C:/Project/Saved/UEShed/MapTileStaging/fixture-run/Z00/R000_C000.png",
18
+ "status": "captured",
19
+ "width": 256
20
+ }
21
+ ],
22
+ "status": "completed",
23
+ "tileCounts": { "failed": 0, "requested": 1, "succeeded": 1 }
24
+ }
@@ -0,0 +1,41 @@
1
+ {
2
+ "addressing": {
3
+ "children": "z+1: (2r,2c),(2r,2c+1),(2r+1,2c),(2r+1,2c+1)",
4
+ "parent": "z-1: (floor(r/2),floor(c/2))",
5
+ "path": "Z{zoom:02}/R{row:03}_C{column:03}.png"
6
+ },
7
+ "capturePolicy": {
8
+ "dataLayers": { "mode": "unchanged" },
9
+ "orientation": { "pitch": -90, "roll": 0, "yaw": 0 },
10
+ "render": {
11
+ "effects": { "fog": false, "volumetricFog": false },
12
+ "lodDistanceScaleByZoom": [4, 2, 1],
13
+ "lodPolicy": "per_level_distance_scale",
14
+ "profile": "full_fidelity"
15
+ },
16
+ "z": 5000
17
+ },
18
+ "completedAt": "2026-08-12T08:00:01.000Z",
19
+ "contract": { "name": "ue-shed-map-tile-pyramid", "version": { "major": 1, "minor": 0 } },
20
+ "failures": [],
21
+ "grid": {
22
+ "orientation": { "name": "rows_max_x_to_min_x_columns_min_y_to_max_y", "version": 1 },
23
+ "origin": { "x": 256, "y": 0 },
24
+ "requestedBounds": { "minX": 0, "minY": 0, "maxX": 256, "maxY": 256 },
25
+ "snappedBounds": { "minX": 0, "minY": 0, "maxX": 256, "maxY": 256 }
26
+ },
27
+ "gutter": {
28
+ "pixels": 2,
29
+ "rule": "render_overdraw_then_crop",
30
+ "textureAddress": "clamp_to_edge"
31
+ },
32
+ "levels": [{ "columns": 1, "rows": 1, "tileWorldSize": 256, "unitsPerPixel": 1, "zoom": 0 }],
33
+ "planId": "fixture-overview",
34
+ "project": { "id": "ue-shed-fixture", "mapPath": "/Game/Fixture/Cameras/L_CameraLoad" },
35
+ "provenance": { "producer": "fixture-editor", "tool": "ue-shed", "toolVersion": "0.1.0" },
36
+ "runId": "fixture-run",
37
+ "startedAt": "2026-08-12T08:00:00.000Z",
38
+ "state": "complete",
39
+ "tilePixelSize": 256,
40
+ "tiles": []
41
+ }
@@ -0,0 +1,44 @@
1
+ {
2
+ "addressing": {
3
+ "children": "z+1: (2r,2c),(2r,2c+1),(2r+1,2c),(2r+1,2c+1)",
4
+ "parent": "z-1: (floor(r/2),floor(c/2))",
5
+ "path": "Z{zoom:02}/R{row:03}_C{column:03}.png"
6
+ },
7
+ "capturePolicy": {
8
+ "dataLayers": { "mode": "unchanged" },
9
+ "orientation": { "pitch": -90, "roll": 0, "yaw": 0 },
10
+ "render": {
11
+ "effects": { "fog": false, "volumetricFog": false },
12
+ "lodDistanceScaleByZoom": [4, 2, 1],
13
+ "lodPolicy": "per_level_distance_scale",
14
+ "profile": "full_fidelity"
15
+ },
16
+ "z": 5000
17
+ },
18
+ "completedAt": "2026-08-12T08:00:01.000Z",
19
+ "contract": { "name": "ue-shed-map-tile-pyramid", "version": { "major": 1, "minor": 0 } },
20
+ "failures": [],
21
+ "grid": {
22
+ "orientation": { "name": "rows_max_x_to_min_x_columns_min_y_to_max_y", "version": 1 },
23
+ "origin": { "x": 256, "y": 0 },
24
+ "requestedBounds": { "minX": 0, "minY": 0, "maxX": 256, "maxY": 256 },
25
+ "snappedBounds": { "minX": 0, "minY": 0, "maxX": 256, "maxY": 256 }
26
+ },
27
+ "gutter": {
28
+ "pixels": 2,
29
+ "rule": "render_overdraw_then_crop",
30
+ "textureAddress": "clamp_to_edge"
31
+ },
32
+ "levels": [
33
+ { "columns": 1, "rows": 1, "tileWorldSize": 256, "unitsPerPixel": 1, "zoom": 0 },
34
+ { "columns": 3, "rows": 2, "tileWorldSize": 128, "unitsPerPixel": 0.5, "zoom": 1 }
35
+ ],
36
+ "planId": "fixture-overview",
37
+ "project": { "id": "ue-shed-fixture", "mapPath": "/Game/Fixture/Cameras/L_CameraLoad" },
38
+ "provenance": { "producer": "fixture-editor", "tool": "ue-shed", "toolVersion": "0.1.0" },
39
+ "runId": "fixture-run",
40
+ "startedAt": "2026-08-12T08:00:00.000Z",
41
+ "state": "complete",
42
+ "tilePixelSize": 256,
43
+ "tiles": []
44
+ }
@@ -0,0 +1,60 @@
1
+ {
2
+ "addressing": {
3
+ "children": "z+1: (2r,2c),(2r,2c+1),(2r+1,2c),(2r+1,2c+1)",
4
+ "parent": "z-1: (floor(r/2),floor(c/2))",
5
+ "path": "Z{zoom:02}/R{row:03}_C{column:03}.png"
6
+ },
7
+ "capturePolicy": {
8
+ "dataLayers": { "mode": "unchanged" },
9
+ "orientation": { "pitch": -90, "roll": 0, "yaw": 0 },
10
+ "render": {
11
+ "effects": { "fog": false, "volumetricFog": false },
12
+ "lodDistanceScaleByZoom": [4, 2, 1],
13
+ "lodPolicy": "per_level_distance_scale",
14
+ "profile": "full_fidelity"
15
+ },
16
+ "z": 5000
17
+ },
18
+ "completedAt": "2026-08-12T08:00:01.000Z",
19
+ "contract": {
20
+ "name": "ue-shed-map-tile-pyramid",
21
+ "version": { "major": 1, "minor": 0 }
22
+ },
23
+ "failures": [],
24
+ "grid": {
25
+ "orientation": {
26
+ "name": "rows_max_x_to_min_x_columns_min_y_to_max_y",
27
+ "version": 1
28
+ },
29
+ "origin": { "x": 256, "y": 0 },
30
+ "requestedBounds": { "minX": 0, "minY": 0, "maxX": 256, "maxY": 256 },
31
+ "snappedBounds": { "minX": 0, "minY": 0, "maxX": 256, "maxY": 256 }
32
+ },
33
+ "gutter": {
34
+ "pixels": 2,
35
+ "rule": "render_overdraw_then_crop",
36
+ "textureAddress": "clamp_to_edge"
37
+ },
38
+ "levels": [{ "columns": 1, "rows": 1, "tileWorldSize": 256, "unitsPerPixel": 1, "zoom": 0 }],
39
+ "planId": "fixture-overview",
40
+ "project": {
41
+ "id": "ue-shed-fixture",
42
+ "mapPath": "/Game/Fixture/Cameras/L_CameraLoad"
43
+ },
44
+ "provenance": { "producer": "fixture-editor", "tool": "ue-shed", "toolVersion": "0.1.0" },
45
+ "runId": "fixture-run",
46
+ "startedAt": "2026-08-12T08:00:00.000Z",
47
+ "state": "complete",
48
+ "tilePixelSize": 256,
49
+ "tiles": [
50
+ {
51
+ "bytes": 1234,
52
+ "hash": "sha256:0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef",
53
+ "height": 256,
54
+ "key": { "zoom": 0, "row": 0, "column": 0 },
55
+ "relativePath": "Z00/R000_C000.png",
56
+ "width": 256,
57
+ "worldBounds": { "minX": 0, "minY": 0, "maxX": 256, "maxY": 256 }
58
+ }
59
+ ]
60
+ }
@@ -0,0 +1,27 @@
1
+ {
2
+ "capture": {
3
+ "dataLayers": { "mode": "unchanged" },
4
+ "orientation": { "pitch": -90, "roll": 0, "yaw": 0 },
5
+ "render": {
6
+ "effects": { "fog": false, "volumetricFog": false },
7
+ "lodDistanceScaleByZoom": [4, 2, 1],
8
+ "lodPolicy": "per_level_distance_scale",
9
+ "profile": "full_fidelity"
10
+ },
11
+ "z": 5000
12
+ },
13
+ "contract": {
14
+ "name": "ue-shed-map-capture-plan",
15
+ "version": { "major": 1, "minor": 0 }
16
+ },
17
+ "gutterPixels": 2,
18
+ "id": "fixture-overview",
19
+ "levels": { "coarsestUnitsPerPixel": 4, "count": 3 },
20
+ "output": { "imageFormat": "png", "publication": "local_immutable" },
21
+ "project": {
22
+ "id": "ue-shed-fixture",
23
+ "mapPath": "/Game/Fixture/Cameras/L_CameraLoad"
24
+ },
25
+ "requestedBounds": { "minX": -1500, "minY": -600, "maxX": 1100, "maxY": 1500 },
26
+ "tilePixelSize": 256
27
+ }
@@ -0,0 +1,162 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://ue-shed.dev/contracts/cameras/map-tile/v1/manifest.schema.json",
4
+ "title": "UE Shed neutral map tile pyramid manifest v1.0",
5
+ "description": "Cross-field grid and exhaustive-completion invariants are additionally enforced by conformant producers and decoders.",
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "required": [
9
+ "addressing",
10
+ "capturePolicy",
11
+ "completedAt",
12
+ "contract",
13
+ "failures",
14
+ "grid",
15
+ "gutter",
16
+ "levels",
17
+ "planId",
18
+ "project",
19
+ "provenance",
20
+ "runId",
21
+ "startedAt",
22
+ "state",
23
+ "tilePixelSize",
24
+ "tiles"
25
+ ],
26
+ "properties": {
27
+ "addressing": {
28
+ "type": "object",
29
+ "additionalProperties": false,
30
+ "required": ["children", "parent", "path"],
31
+ "properties": {
32
+ "children": { "const": "z+1: (2r,2c),(2r,2c+1),(2r+1,2c),(2r+1,2c+1)" },
33
+ "parent": { "const": "z-1: (floor(r/2),floor(c/2))" },
34
+ "path": { "const": "Z{zoom:02}/R{row:03}_C{column:03}.png" }
35
+ }
36
+ },
37
+ "capturePolicy": { "$ref": "plan.schema.json#/$defs/capturePolicy" },
38
+ "completedAt": { "$ref": "#/$defs/timestamp" },
39
+ "contract": {
40
+ "type": "object",
41
+ "additionalProperties": false,
42
+ "required": ["name", "version"],
43
+ "properties": {
44
+ "name": { "const": "ue-shed-map-tile-pyramid" },
45
+ "version": { "$ref": "plan.schema.json#/$defs/version" }
46
+ }
47
+ },
48
+ "failures": {
49
+ "type": "array",
50
+ "items": {
51
+ "type": "object",
52
+ "additionalProperties": false,
53
+ "required": ["failure", "key"],
54
+ "properties": {
55
+ "failure": { "$ref": "capture-response.schema.json#/$defs/failure" },
56
+ "key": { "$ref": "capture-request.schema.json#/$defs/tileKey" }
57
+ }
58
+ }
59
+ },
60
+ "grid": {
61
+ "type": "object",
62
+ "additionalProperties": false,
63
+ "required": ["orientation", "origin", "requestedBounds", "snappedBounds"],
64
+ "properties": {
65
+ "orientation": {
66
+ "type": "object",
67
+ "additionalProperties": false,
68
+ "required": ["name", "version"],
69
+ "properties": {
70
+ "name": { "const": "rows_max_x_to_min_x_columns_min_y_to_max_y" },
71
+ "version": { "const": 1 }
72
+ }
73
+ },
74
+ "origin": {
75
+ "type": "object",
76
+ "additionalProperties": false,
77
+ "required": ["x", "y"],
78
+ "properties": { "x": { "type": "number" }, "y": { "type": "number" } }
79
+ },
80
+ "requestedBounds": { "$ref": "plan.schema.json#/$defs/bounds" },
81
+ "snappedBounds": { "$ref": "plan.schema.json#/$defs/bounds" }
82
+ }
83
+ },
84
+ "gutter": {
85
+ "type": "object",
86
+ "additionalProperties": false,
87
+ "required": ["pixels", "rule", "textureAddress"],
88
+ "properties": {
89
+ "pixels": { "type": "integer", "minimum": 0, "maximum": 32 },
90
+ "rule": { "const": "render_overdraw_then_crop" },
91
+ "textureAddress": { "const": "clamp_to_edge" }
92
+ }
93
+ },
94
+ "levels": {
95
+ "type": "array",
96
+ "minItems": 1,
97
+ "maxItems": 24,
98
+ "items": {
99
+ "type": "object",
100
+ "additionalProperties": false,
101
+ "required": ["columns", "rows", "tileWorldSize", "unitsPerPixel", "zoom"],
102
+ "properties": {
103
+ "columns": { "type": "integer", "minimum": 1 },
104
+ "rows": { "type": "integer", "minimum": 1 },
105
+ "tileWorldSize": { "type": "number", "exclusiveMinimum": 0 },
106
+ "unitsPerPixel": { "type": "number", "exclusiveMinimum": 0 },
107
+ "zoom": { "type": "integer", "minimum": 0 }
108
+ }
109
+ }
110
+ },
111
+ "planId": { "$ref": "plan.schema.json#/$defs/id" },
112
+ "project": { "$ref": "plan.schema.json#/$defs/project" },
113
+ "provenance": {
114
+ "type": "object",
115
+ "additionalProperties": false,
116
+ "required": ["producer", "tool", "toolVersion"],
117
+ "properties": {
118
+ "producer": { "type": "string", "minLength": 1, "maxLength": 1024 },
119
+ "tool": { "const": "ue-shed" },
120
+ "toolVersion": { "type": "string", "minLength": 1, "maxLength": 1024 }
121
+ }
122
+ },
123
+ "runId": { "$ref": "plan.schema.json#/$defs/id" },
124
+ "startedAt": { "$ref": "#/$defs/timestamp" },
125
+ "state": { "enum": ["complete", "partial", "cancelled"] },
126
+ "tilePixelSize": { "type": "integer", "minimum": 64, "maximum": 4096 },
127
+ "tiles": {
128
+ "type": "array",
129
+ "items": {
130
+ "type": "object",
131
+ "additionalProperties": false,
132
+ "required": [
133
+ "bytes",
134
+ "hash",
135
+ "height",
136
+ "key",
137
+ "relativePath",
138
+ "width",
139
+ "worldBounds"
140
+ ],
141
+ "properties": {
142
+ "bytes": { "type": "integer", "minimum": 1 },
143
+ "hash": { "type": "string", "pattern": "^sha256:[a-f0-9]{64}$" },
144
+ "height": { "type": "integer", "minimum": 1 },
145
+ "key": { "$ref": "capture-request.schema.json#/$defs/tileKey" },
146
+ "relativePath": {
147
+ "type": "string",
148
+ "pattern": "^Z[0-9]{2,}/R[0-9]{3,}_C[0-9]{3,}\\.png$"
149
+ },
150
+ "width": { "type": "integer", "minimum": 1 },
151
+ "worldBounds": { "$ref": "plan.schema.json#/$defs/bounds" }
152
+ }
153
+ }
154
+ }
155
+ },
156
+ "$defs": {
157
+ "timestamp": {
158
+ "type": "string",
159
+ "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}(?:\\.[0-9]{3})?Z$"
160
+ }
161
+ }
162
+ }