@ue-shed/protocol 0.5.0 → 0.6.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 (87) hide show
  1. package/contracts/cameras/map-tile/v1/README.md +20 -6
  2. package/contracts/cameras/map-tile/v1/capture-operation.schema.json +69 -0
  3. package/contracts/cameras/map-tile/v1/capture-request.schema.json +2 -1
  4. package/contracts/cameras/map-tile/v1/fixtures/capture-operation-finished-valid.json +41 -0
  5. package/contracts/cameras/map-tile/v1/fixtures/capture-operation-progress-valid.json +13 -0
  6. package/contracts/cameras/map-tile/v1/fixtures/capture-operation-running-valid.json +5 -0
  7. package/contracts/cameras/map-tile/v1/fixtures/capture-request-lit-valid.json +59 -0
  8. package/contracts/cameras/map-tile/v1/fixtures/readiness-blocked.json +11 -0
  9. package/contracts/cameras/map-tile/v1/fixtures/readiness-ready.json +7 -0
  10. package/contracts/cameras/map-tile/v1/fixtures/selection-ready.json +21 -0
  11. package/contracts/cameras/map-tile/v1/fixtures/selection-unavailable.json +6 -0
  12. package/contracts/cameras/map-tile/v1/inspection.md +16 -0
  13. package/contracts/cameras/map-tile/v1/plan.schema.json +1 -0
  14. package/contracts/cameras/map-tile/v1/readiness.schema.json +39 -0
  15. package/contracts/cameras/map-tile/v1/selection.schema.json +105 -0
  16. package/contracts/cameras/review/v1/README.md +9 -1
  17. package/contracts/cameras/review/v1/capture-request.schema.json +54 -5
  18. package/contracts/cameras/review/v1/capture-response.schema.json +80 -5
  19. package/contracts/cameras/review/v1/fixtures/capture-guid.json +53 -0
  20. package/contracts/cameras/review/v1/fixtures/capture-request-guid-valid.json +28 -0
  21. package/contracts/cameras/review/v1/fixtures/invalid-capture-request-alternate-actor-guid.json +23 -0
  22. package/contracts/cameras/review/v1/fixtures/invalid-capture-request-clear-before-minor-4.json +26 -0
  23. package/contracts/cameras/review/v1/fixtures/invalid-capture-request-empty-diagnostic-label.json +24 -0
  24. package/contracts/cameras/review/v1/fixtures/invalid-capture-request-future-minor.json +26 -0
  25. package/contracts/cameras/review/v1/fixtures/invalid-capture-request-guid-before-minor-5.json +26 -0
  26. package/contracts/cameras/review/v1/fixtures/invalid-capture-request-malformed-last-known-path.json +24 -0
  27. package/contracts/cameras/review/v1/fixtures/invalid-capture-request-nil-actor-guid.json +23 -0
  28. package/contracts/cameras/review/v1/fixtures/invalid-capture-request-nil-operation-id.json +23 -0
  29. package/contracts/cameras/review/v1/fixtures/selection-selected.json +2 -1
  30. package/contracts/cameras/review/v1/selection-response.schema.json +5 -0
  31. package/contracts/core/v1/producer-identity.schema.json +44 -0
  32. package/contracts/niagara/preview/v1/common.schema.json +224 -30
  33. package/contracts/niagara/preview/v1/fixtures/background-manifest.json +136 -0
  34. package/contracts/niagara/preview/v1/fixtures/background-receipt.json +112 -0
  35. package/contracts/niagara/preview/v1/fixtures/background-request.json +39 -0
  36. package/contracts/niagara/preview/v1/fixtures/progress.json +8 -0
  37. package/contracts/niagara/preview/v1/fixtures/scene-manifest.json +108 -0
  38. package/contracts/niagara/preview/v1/fixtures/scene-receipt.json +84 -0
  39. package/contracts/niagara/preview/v1/fixtures/scene-request.json +25 -0
  40. package/contracts/niagara/preview/v1/manifest.schema.json +110 -25
  41. package/contracts/niagara/preview/v1/progress.schema.json +37 -0
  42. package/contracts/niagara/preview/v1/receipt.schema.json +75 -16
  43. package/contracts/niagara/preview/v1/request.schema.json +20 -5
  44. package/contracts/niagara/preview/v1/session.md +25 -0
  45. package/contracts/observatory/v1/actor-metadata.schema.json +33 -0
  46. package/contracts/uasset-io/v1/README.md +26 -1
  47. package/contracts/uasset-io/v1/event.schema.json +511 -1
  48. package/contracts/uasset-io/v1/fixtures/invalid/project-index-count-empty-filters.json +23 -0
  49. package/contracts/uasset-io/v1/fixtures/invalid/project-index-dictionary-page-negative-index.json +35 -0
  50. package/contracts/uasset-io/v1/fixtures/valid/blueprint-request.json +6 -0
  51. package/contracts/uasset-io/v1/fixtures/valid/blueprint-result-event.json +58 -0
  52. package/contracts/uasset-io/v1/fixtures/valid/project-index-count-request.json +32 -0
  53. package/contracts/uasset-io/v1/fixtures/valid/project-index-count-result-event.json +20 -0
  54. package/contracts/uasset-io/v1/fixtures/valid/project-index-dictionary-page-result-event.json +35 -0
  55. package/contracts/uasset-io/v1/fixtures/valid/project-index-dictionary-query-request.json +26 -0
  56. package/contracts/uasset-io/v1/request.schema.json +174 -0
  57. package/dist/authoring-review.d.ts +36 -36
  58. package/dist/authoring.d.ts +45 -45
  59. package/dist/authoring.d.ts.map +1 -1
  60. package/dist/blueprint-graph.d.ts +628 -0
  61. package/dist/blueprint-graph.d.ts.map +1 -0
  62. package/dist/blueprint-graph.js +111 -0
  63. package/dist/blueprint-graph.js.map +1 -0
  64. package/dist/companion.d.ts +34 -3
  65. package/dist/companion.d.ts.map +1 -1
  66. package/dist/companion.js +11 -0
  67. package/dist/companion.js.map +1 -1
  68. package/dist/editor-asset-navigation.d.ts +12 -12
  69. package/dist/editor-play-session.d.ts +6 -6
  70. package/dist/editor-world-control.d.ts +8 -8
  71. package/dist/index.d.ts +1 -0
  72. package/dist/index.d.ts.map +1 -1
  73. package/dist/index.js +1 -0
  74. package/dist/index.js.map +1 -1
  75. package/dist/saved-world.d.ts +20 -14
  76. package/dist/saved-world.d.ts.map +1 -1
  77. package/dist/saved-world.js +1 -0
  78. package/dist/saved-world.js.map +1 -1
  79. package/dist/uasset-inspection.d.ts +6 -5
  80. package/dist/uasset-inspection.d.ts.map +1 -1
  81. package/dist/uasset-inspection.js +1 -1
  82. package/dist/uasset-inspection.js.map +1 -1
  83. package/dist/uasset-io.d.ts +648 -129
  84. package/dist/uasset-io.d.ts.map +1 -1
  85. package/dist/uasset-io.js +51 -1
  86. package/dist/uasset-io.js.map +1 -1
  87. package/package.json +1 -1
@@ -14,14 +14,28 @@ capture Z does not define detail. The editor renders `gutterPixels` beyond each
14
14
  units-per-pixel and crops back to `tilePixelSize` before PNG encoding. Consumers use clamp-to-edge
15
15
  sampling inside each published tile.
16
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.
17
+ `captureBackend` is an optional execution hint, not part of the portable plan. The default is
18
+ `lit_camera_tiles`, requiring `cameras.lit-map-tile-capture.v1` and an unlocked rendering editor
19
+ viewport. It accepts `full_fidelity` with natural LOD. `overviewBounds` supplies the complete run's
20
+ framing for shared exposure calibration; when omitted the first batch's extent is used. Optional
21
+ `capture.render.exposureEV100` pins the camera exposure range instead of calibrating automatically.
22
+
23
+ Call `BeginMapTileCapture(RequestJson)` to start a batch, then
24
+ `PollMapTileCapture(RunId, OperationId)` until `capture-operation.schema.json` reports `finished`.
25
+ The terminal `response` uses the existing capture-response schema. Polling renews a 120-second
26
+ inactivity lease. A run retains viewport, exposure, and scene-freeze ownership between batches;
27
+ call `EndMapTileCapture(RunId)` in a finalizer on success, failure, and cancellation. End returns
28
+ `{ "released": boolean }`; an unrelated run ID cannot release the owner. Only one batch runs at a
29
+ time, and a run's map and capture policy cannot change between batches.
30
+
31
+ Explicit `scene_capture_tiles` and `viewport_high_resolution` use the synchronous `CaptureMapTiles`
32
+ operation. The latter requires one complete zoom level of at most 64 tiles. The former retains
33
+ SceneCapture profiles and per-level LOD distance scales. Both reject manual exposure rather than
34
+ silently ignoring it. Synchronous `CaptureMapTiles` rejects the default Lit backend and directs
35
+ clients to the asynchronous lifecycle.
22
36
 
23
37
  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
38
+ tile outcome and map package dirty state, and restores transient state when run ownership ends. The host
25
39
  must validate staging containment, hash artifacts, and atomically publish only a manifest whose
26
40
  state is `complete` and whose tile inventory is exhaustive. Partial and cancelled attempts remain
27
41
  diagnostic evidence and are never discoverable as completed runs.
@@ -0,0 +1,69 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://ue-shed.dev/contracts/cameras/map-tile/v1/capture-operation.schema.json",
4
+ "title": "UE Shed asynchronous map tile operation v1",
5
+ "oneOf": [
6
+ {
7
+ "type": "object",
8
+ "additionalProperties": false,
9
+ "required": ["state", "operationId", "completedTiles"],
10
+ "properties": {
11
+ "state": {
12
+ "const": "running"
13
+ },
14
+ "operationId": {
15
+ "$ref": "plan.schema.json#/$defs/id"
16
+ },
17
+ "completedTiles": {
18
+ "type": "integer",
19
+ "minimum": 0,
20
+ "maximum": 64
21
+ },
22
+ "phase": {
23
+ "enum": ["exposure_warmup", "tile_warmup", "capturing"]
24
+ },
25
+ "elapsedMs": {
26
+ "type": "number",
27
+ "minimum": 0
28
+ },
29
+ "totalTiles": {
30
+ "type": "integer",
31
+ "minimum": 0,
32
+ "maximum": 64
33
+ },
34
+ "currentTile": {
35
+ "type": "object",
36
+ "additionalProperties": false,
37
+ "required": ["zoom", "row", "column"],
38
+ "properties": {
39
+ "zoom": {
40
+ "type": "integer",
41
+ "minimum": 0
42
+ },
43
+ "row": {
44
+ "type": "integer",
45
+ "minimum": 0
46
+ },
47
+ "column": {
48
+ "type": "integer",
49
+ "minimum": 0
50
+ }
51
+ }
52
+ }
53
+ }
54
+ },
55
+ {
56
+ "type": "object",
57
+ "additionalProperties": false,
58
+ "required": ["state", "response"],
59
+ "properties": {
60
+ "state": {
61
+ "const": "finished"
62
+ },
63
+ "response": {
64
+ "$ref": "capture-response.schema.json"
65
+ }
66
+ }
67
+ }
68
+ ]
69
+ }
@@ -19,8 +19,9 @@
19
19
  "properties": {
20
20
  "capture": { "$ref": "plan.schema.json#/$defs/capturePolicy" },
21
21
  "captureBackend": {
22
- "enum": ["scene_capture_tiles", "viewport_high_resolution"]
22
+ "enum": ["lit_camera_tiles", "scene_capture_tiles", "viewport_high_resolution"]
23
23
  },
24
+ "overviewBounds": { "$ref": "plan.schema.json#/$defs/bounds" },
24
25
  "contract": {
25
26
  "type": "object",
26
27
  "additionalProperties": false,
@@ -0,0 +1,41 @@
1
+ {
2
+ "state": "finished",
3
+ "response": {
4
+ "actualMapPath": "/Game/Fixture/Cameras/L_CameraLoad",
5
+ "contract": {
6
+ "name": "ue-shed-map-tile-capture",
7
+ "version": {
8
+ "major": 1,
9
+ "minor": 0
10
+ }
11
+ },
12
+ "correlationId": "fixture-correlation",
13
+ "dirtyState": {
14
+ "before": false,
15
+ "after": false
16
+ },
17
+ "durationMs": 27.5,
18
+ "operationId": "fixture-operation",
19
+ "results": [
20
+ {
21
+ "bytes": 1234,
22
+ "captureDurationMs": 20.25,
23
+ "height": 256,
24
+ "key": {
25
+ "zoom": 0,
26
+ "row": 0,
27
+ "column": 0
28
+ },
29
+ "stagedPath": "C:/Project/Saved/UEShed/MapTileStaging/fixture-run/Z00/R000_C000.png",
30
+ "status": "captured",
31
+ "width": 256
32
+ }
33
+ ],
34
+ "status": "completed",
35
+ "tileCounts": {
36
+ "failed": 0,
37
+ "requested": 1,
38
+ "succeeded": 1
39
+ }
40
+ }
41
+ }
@@ -0,0 +1,13 @@
1
+ {
2
+ "state": "running",
3
+ "operationId": "fixture-operation",
4
+ "completedTiles": 0,
5
+ "phase": "tile_warmup",
6
+ "elapsedMs": 1234,
7
+ "totalTiles": 4,
8
+ "currentTile": {
9
+ "zoom": 0,
10
+ "row": 0,
11
+ "column": 0
12
+ }
13
+ }
@@ -0,0 +1,5 @@
1
+ {
2
+ "state": "running",
3
+ "operationId": "fixture-operation",
4
+ "completedTiles": 0
5
+ }
@@ -0,0 +1,59 @@
1
+ {
2
+ "capture": {
3
+ "dataLayers": {
4
+ "mode": "unchanged"
5
+ },
6
+ "orientation": {
7
+ "pitch": -90,
8
+ "roll": 0,
9
+ "yaw": 0
10
+ },
11
+ "render": {
12
+ "effects": {
13
+ "fog": false,
14
+ "volumetricFog": false
15
+ },
16
+ "lodPolicy": "natural",
17
+ "profile": "full_fidelity",
18
+ "exposureEV100": -5
19
+ },
20
+ "z": 5000
21
+ },
22
+ "captureBackend": "lit_camera_tiles",
23
+ "contract": {
24
+ "name": "ue-shed-map-tile-capture",
25
+ "version": {
26
+ "major": 1,
27
+ "minor": 0
28
+ }
29
+ },
30
+ "correlationId": "fixture-correlation",
31
+ "expectedMapPath": "/Game/Fixture/Cameras/L_CameraLoad",
32
+ "gutterPixels": 2,
33
+ "operationId": "fixture-operation",
34
+ "planId": "fixture-overview",
35
+ "runId": "fixture-run",
36
+ "tilePixelSize": 256,
37
+ "tiles": [
38
+ {
39
+ "key": {
40
+ "zoom": 0,
41
+ "row": 0,
42
+ "column": 0
43
+ },
44
+ "unitsPerPixel": 4,
45
+ "worldBounds": {
46
+ "minX": 1024,
47
+ "minY": -1024,
48
+ "maxX": 2048,
49
+ "maxY": 0
50
+ }
51
+ }
52
+ ],
53
+ "overviewBounds": {
54
+ "minX": 1024,
55
+ "minY": -1024,
56
+ "maxX": 2048,
57
+ "maxY": 0
58
+ }
59
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "backend": "lit_camera_tiles",
4
+ "ready": false,
5
+ "blockers": [
6
+ {
7
+ "code": "viewport_locked",
8
+ "message": "Unlock the viewport."
9
+ }
10
+ ]
11
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "backend": "lit_camera_tiles",
4
+ "ready": true,
5
+ "actualMapPath": "/Game/Fixture/Map",
6
+ "blockers": []
7
+ }
@@ -0,0 +1,21 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "status": "ready",
4
+ "mapPath": "/Game/Fixture/Map",
5
+ "bounds": {
6
+ "minX": -100,
7
+ "maxX": 100,
8
+ "minY": 50,
9
+ "maxY": 250,
10
+ "minZ": 0,
11
+ "maxZ": 400
12
+ },
13
+ "actors": [
14
+ {
15
+ "path": "/Game/Fixture/Map.A",
16
+ "label": "A",
17
+ "actorGuid": "00000001000000020000000300000004"
18
+ }
19
+ ],
20
+ "skippedActorPaths": []
21
+ }
@@ -0,0 +1,6 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "status": "unavailable",
4
+ "code": "selection_limit",
5
+ "message": "Select between 1 and 1024 actors."
6
+ }
@@ -0,0 +1,16 @@
1
+ # Capture inspection v1
2
+
3
+ `InspectMapCaptureSelection` requires `cameras.capture-selection.v1`. It reads selection in the
4
+ current editor world, rejects PIE and selections outside 1–1024 actors, and combines finite component
5
+ bounds. `skippedActorPaths` identifies actors without usable bounds or in another world. Ready bounds
6
+ must satisfy min <= max on every axis; planar/point selections are valid. Host plan fitting supplies
7
+ positive XY extent. The operation neither modifies selection nor loads additional regions.
8
+
9
+ `InspectMapCaptureReadiness(ExpectedMapPath)` requires `cameras.capture-readiness.v1` and applies to
10
+ Lit capture. `ready` is true exactly when `blockers` is empty. It checks map identity, rendering,
11
+ streaming, viewport locking/overrides, screenshot use, PIE and capture ownership. It does not reserve
12
+ resources, load regions, or guarantee visual completeness. Capture execution repeats shared checks.
13
+
14
+ The running operation's optional phase/elapsed/count/current-tile fields are telemetry for the current
15
+ batch. `currentTile` is absent during whole-map exposure warmup. Existing responses without these
16
+ fields remain valid. Terminal responses and publication rules are unchanged.
@@ -130,6 +130,7 @@
130
130
  "additionalProperties": false,
131
131
  "required": ["effects", "lodPolicy", "profile"],
132
132
  "properties": {
133
+ "exposureEV100": { "type": "number", "minimum": -20, "maximum": 30 },
133
134
  "effects": {
134
135
  "type": "object",
135
136
  "additionalProperties": false,
@@ -0,0 +1,39 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "type": "object",
4
+ "additionalProperties": false,
5
+ "required": ["schemaVersion", "backend", "ready", "blockers"],
6
+ "properties": {
7
+ "schemaVersion": {
8
+ "const": 1
9
+ },
10
+ "backend": {
11
+ "const": "lit_camera_tiles"
12
+ },
13
+ "ready": {
14
+ "type": "boolean"
15
+ },
16
+ "actualMapPath": {
17
+ "type": "string",
18
+ "minLength": 1
19
+ },
20
+ "blockers": {
21
+ "type": "array",
22
+ "items": {
23
+ "type": "object",
24
+ "additionalProperties": false,
25
+ "required": ["code", "message"],
26
+ "properties": {
27
+ "code": {
28
+ "type": "string",
29
+ "minLength": 1
30
+ },
31
+ "message": {
32
+ "type": "string",
33
+ "minLength": 1
34
+ }
35
+ }
36
+ }
37
+ }
38
+ }
39
+ }
@@ -0,0 +1,105 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "oneOf": [
4
+ {
5
+ "type": "object",
6
+ "additionalProperties": false,
7
+ "required": [
8
+ "schemaVersion",
9
+ "status",
10
+ "mapPath",
11
+ "bounds",
12
+ "actors",
13
+ "skippedActorPaths"
14
+ ],
15
+ "properties": {
16
+ "schemaVersion": {
17
+ "const": 1
18
+ },
19
+ "status": {
20
+ "const": "ready"
21
+ },
22
+ "mapPath": {
23
+ "type": "string",
24
+ "minLength": 1
25
+ },
26
+ "bounds": {
27
+ "type": "object",
28
+ "additionalProperties": false,
29
+ "required": ["minX", "maxX", "minY", "maxY", "minZ", "maxZ"],
30
+ "properties": {
31
+ "minX": {
32
+ "type": "number"
33
+ },
34
+ "maxX": {
35
+ "type": "number"
36
+ },
37
+ "minY": {
38
+ "type": "number"
39
+ },
40
+ "maxY": {
41
+ "type": "number"
42
+ },
43
+ "minZ": {
44
+ "type": "number"
45
+ },
46
+ "maxZ": {
47
+ "type": "number"
48
+ }
49
+ }
50
+ },
51
+ "actors": {
52
+ "type": "array",
53
+ "items": {
54
+ "type": "object",
55
+ "additionalProperties": false,
56
+ "required": ["path", "label"],
57
+ "properties": {
58
+ "path": {
59
+ "type": "string",
60
+ "minLength": 1
61
+ },
62
+ "label": {
63
+ "type": "string"
64
+ },
65
+ "actorGuid": {
66
+ "type": "string",
67
+ "pattern": "^[0-9A-Fa-f]{32}$"
68
+ }
69
+ }
70
+ },
71
+ "minItems": 1,
72
+ "maxItems": 1024
73
+ },
74
+ "skippedActorPaths": {
75
+ "type": "array",
76
+ "items": {
77
+ "type": "string"
78
+ },
79
+ "maxItems": 1024
80
+ }
81
+ }
82
+ },
83
+ {
84
+ "type": "object",
85
+ "additionalProperties": false,
86
+ "required": ["schemaVersion", "status", "code", "message"],
87
+ "properties": {
88
+ "schemaVersion": {
89
+ "const": 1
90
+ },
91
+ "status": {
92
+ "const": "unavailable"
93
+ },
94
+ "code": {
95
+ "type": "string",
96
+ "minLength": 1
97
+ },
98
+ "message": {
99
+ "type": "string",
100
+ "minLength": 1
101
+ }
102
+ }
103
+ }
104
+ ]
105
+ }
@@ -17,7 +17,15 @@ visibility measurement: the plugin reports what it observed and does not assign
17
17
  original engine-produced classification. Minor version 4 adds one optional Clear companion to the
18
18
  same capture operation. Its request carries only an effective producer instruction (`isolate_target`
19
19
  or bounded `hide_explicit` actor paths); consumer policy, thresholds, and presentation remain
20
- outside the wire contract.
20
+ outside the wire contract. Minor version 5 adds the durable `actor_guid` subject locator. The GUID
21
+ is Unreal's authored actor GUID (`FGuid::UniqueObjectGuid`); a last-known actor path is diagnostic
22
+ evidence only and is never used as an identity fallback.
23
+
24
+ Producers accept every complete, schema-valid 1.x request through the highest minor they advertise.
25
+ They echo the accepted request minor in both success and failure responses. Missing, fractional,
26
+ negative, or future minors; unknown major versions; minor-feature contradictions; and excess fields
27
+ are rejected deterministically. Once a request supplies an operation ID and view ID, a structured
28
+ failure retains those identities even when contract negotiation fails.
21
29
 
22
30
  The editor resolves an actor-relative pose atomically from the actor's current transform. Its
23
31
  response records the resolved target, exact effective world pose, projection, bounded visibility
@@ -18,23 +18,53 @@
18
18
  "required": ["major", "minor"],
19
19
  "properties": {
20
20
  "major": { "const": 1 },
21
- "minor": { "type": "integer", "minimum": 0, "maximum": 4 }
21
+ "minor": { "type": "integer", "minimum": 0, "maximum": 5 }
22
22
  }
23
23
  }
24
24
  }
25
25
  },
26
- "operationId": { "type": "string", "format": "uuid" },
26
+ "operationId": {
27
+ "type": "string",
28
+ "format": "uuid",
29
+ "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$",
30
+ "not": { "const": "00000000-0000-0000-0000-000000000000" }
31
+ },
27
32
  "viewId": { "$ref": "#/$defs/safeId" },
28
33
  "expectedMapPath": { "type": "string", "minLength": 1 },
29
34
  "subject": {
30
35
  "oneOf": [
36
+ {
37
+ "type": "object",
38
+ "additionalProperties": false,
39
+ "required": ["kind", "actorGuid"],
40
+ "properties": {
41
+ "kind": { "const": "actor_guid" },
42
+ "actorGuid": {
43
+ "type": "string",
44
+ "pattern": "^[0-9a-fA-F]{8}(?:-[0-9a-fA-F]{8}){3}$",
45
+ "not": { "const": "00000000-00000000-00000000-00000000" }
46
+ },
47
+ "lastKnownActorPath": {
48
+ "type": "string",
49
+ "minLength": 7,
50
+ "maxLength": 4096,
51
+ "pattern": "^/Game/"
52
+ },
53
+ "diagnosticLabel": { "type": "string", "minLength": 1 }
54
+ }
55
+ },
31
56
  {
32
57
  "type": "object",
33
58
  "additionalProperties": false,
34
59
  "required": ["kind", "actorPath"],
35
60
  "properties": {
36
61
  "kind": { "const": "actor_path" },
37
- "actorPath": { "type": "string", "minLength": 1 },
62
+ "actorPath": {
63
+ "type": "string",
64
+ "minLength": 7,
65
+ "maxLength": 4096,
66
+ "pattern": "^/Game/"
67
+ },
38
68
  "diagnosticLabel": { "type": "string", "minLength": 1 }
39
69
  }
40
70
  },
@@ -80,7 +110,7 @@
80
110
  "properties": {
81
111
  "contract": {
82
112
  "properties": {
83
- "version": { "properties": { "minor": { "enum": [2, 3, 4] } } }
113
+ "version": { "properties": { "minor": { "enum": [2, 3, 4, 5] } } }
84
114
  }
85
115
  }
86
116
  }
@@ -93,13 +123,32 @@
93
123
  "properties": {
94
124
  "contract": {
95
125
  "properties": {
96
- "version": { "properties": { "minor": { "const": 4 } } }
126
+ "version": { "properties": { "minor": { "enum": [4, 5] } } }
97
127
  }
98
128
  }
99
129
  }
100
130
  },
101
131
  "then": { "required": ["clearCompanion"] },
102
132
  "else": { "not": { "required": ["clearCompanion"] } }
133
+ },
134
+ {
135
+ "if": {
136
+ "properties": {
137
+ "subject": {
138
+ "required": ["kind"],
139
+ "properties": { "kind": { "const": "actor_guid" } }
140
+ }
141
+ }
142
+ },
143
+ "then": {
144
+ "properties": {
145
+ "contract": {
146
+ "properties": {
147
+ "version": { "properties": { "minor": { "const": 5 } } }
148
+ }
149
+ }
150
+ }
151
+ }
103
152
  }
104
153
  ],
105
154
  "$defs": {