From 7a84f68311be3f85895b2b51bc2ee16fa7754ea2 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Thu, 9 Jul 2026 21:30:28 +0100 Subject: [PATCH] Add EveUnity live provider bridge --- docs/eve-migration-roadmap.md | 19 +- .../EveUnitySceneLiveProviderBridge.cs | 290 ++++++++++++++++++ .../EveUnitySceneLiveProviderBridge.cs.meta | 2 + .../EveUnitySceneSurfaceLowererTests.cs | 148 +++++++++ .../eve-runtime-capability.json | 6 +- .../eveunity-scene-split-handoff.json | 9 +- ...un-aetheria-conformance-consumer-smoke.ps1 | 3 + .../run-eveunity-scene-lifecycle-smoke.ps1 | 2 +- ...un-eveunity-scene-provider-shell-smoke.ps1 | 15 +- ...ntime-owner-conformance-consumer-smoke.ps1 | 1 + ...plit-target-conformance-consumer-smoke.ps1 | 3 + tools/parity/parity-manifest.json | 10 +- 12 files changed, 495 insertions(+), 13 deletions(-) create mode 100644 runtimes/incubating/eve-unity-scene/Runtime/EveUnitySceneLiveProviderBridge.cs create mode 100644 runtimes/incubating/eve-unity-scene/Runtime/EveUnitySceneLiveProviderBridge.cs.meta diff --git a/docs/eve-migration-roadmap.md b/docs/eve-migration-roadmap.md index 9b608eb..d40910b 100644 --- a/docs/eve-migration-roadmap.md +++ b/docs/eve-migration-roadmap.md @@ -661,11 +661,20 @@ Recently cut: the Eve interfaces can be mounted without Aetheria-specific client code, provider-authored entities are instantiated under a Unity scene root, camera and movement input are runtime-owned, and movement exits through the - provider-advertised `gamecult.eve.command.v1` boundary. The next blocker is - owner-repo live proof: implement the CultMesh/CultNet adapter, implement - concrete CultMesh/CultCache readers for provider surface and asset manifest - documents, and prove provider receipts plus daemon snapshots drive rendered - Unity frames rather than renderer-local simulation. + provider-advertised `gamecult.eve.command.v1` boundary. + `EveUnitySceneLiveProviderBridge` now names the runtime-owned live transport + port: a CultMesh/CultNet transport supplies provider surface documents, asset + manifest documents, command submission, receipts, and refresh requests through + `IEveUnitySceneLiveProviderTransport`, while the bridge exposes the existing + scene runtime source/sink/receipt interfaces without importing provider + internals. The Unity scene EditMode proof now includes + `LiveProviderBridgeFeedsPlayableWorldRuntimeThroughTransportPorts`, proving + the generic playable-world runtime can consume that transport-shaped boundary. + The next blocker is owner-repo live proof: implement the concrete + CultMesh/CultNet transport, implement concrete CultMesh/CultCache readers for + provider surface and asset manifest documents, and prove provider receipts plus + daemon snapshots drive rendered Unity frames rather than renderer-local + simulation. - EveElectron capture lifecycle now carries the same kind of structured pending capture contract. `captureContract` names the Electron shell runtime, capture kind, PNG artifact pattern, conformance attachment point, required Aetheria diff --git a/runtimes/incubating/eve-unity-scene/Runtime/EveUnitySceneLiveProviderBridge.cs b/runtimes/incubating/eve-unity-scene/Runtime/EveUnitySceneLiveProviderBridge.cs new file mode 100644 index 0000000..134109d --- /dev/null +++ b/runtimes/incubating/eve-unity-scene/Runtime/EveUnitySceneLiveProviderBridge.cs @@ -0,0 +1,290 @@ +using System; +using GameCult.Eve.Surface; +using UnityEngine; + +#nullable enable + +namespace GameCult.Eve.UnityScene +{ + public interface IEveUnitySceneLiveProviderTransport + { + string TransportKind { get; } + + string SurfacePointer { get; } + + string AssetManifestPointer { get; } + + EveUnitySceneProviderSurfaceDocument CurrentSurfaceDocument { get; } + + EveUnityPlayableWorldAssetManifestDocument CurrentAssetManifestDocument { get; } + + event Action SurfaceDocumentAvailable; + + event Action AssetManifestDocumentAvailable; + + event Action CommandReceiptAvailable; + + void Connect(); + + void Disconnect(); + + void Refresh(); + + void SubmitCommand(EveSurfaceCommandRequest request); + } + + public abstract class EveUnitySceneLiveProviderTransportBehaviour : + MonoBehaviour, + IEveUnitySceneLiveProviderTransport + { + public abstract string TransportKind { get; } + + public abstract string SurfacePointer { get; } + + public abstract string AssetManifestPointer { get; } + + public abstract EveUnitySceneProviderSurfaceDocument CurrentSurfaceDocument { get; } + + public abstract EveUnityPlayableWorldAssetManifestDocument CurrentAssetManifestDocument { get; } + + public abstract event Action SurfaceDocumentAvailable; + + public abstract event Action AssetManifestDocumentAvailable; + + public abstract event Action CommandReceiptAvailable; + + public abstract void Connect(); + + public abstract void Disconnect(); + + public abstract void Refresh(); + + public abstract void SubmitCommand(EveSurfaceCommandRequest request); + } + + public sealed class EveUnitySceneLiveProviderBridgeComponent : + MonoBehaviour, + IEveUnitySceneProviderSurfaceDocumentSource, + IEveUnityPlayableWorldAssetManifestDocumentSource, + IEveUnitySceneCommandSink, + IEveUnitySceneCommandReceiptSource, + IEveUnityProviderRefreshSource + { + [SerializeField] private MonoBehaviour? transportBehaviour; + + private EveUnitySceneLiveProviderBridge? _bridge; + private IEveUnitySceneLiveProviderTransport? _configuredTransport; + + public string TransportKind => Bridge.TransportKind; + + public string SurfacePointer => Bridge.SurfacePointer; + + public string AssetManifestPointer => Bridge.AssetManifestPointer; + + public string SinkKind => Bridge.SinkKind; + + public string ManifestRef => Bridge.ManifestRef; + + public EveUnitySceneProviderSurfaceDocument CurrentSurfaceDocument => Bridge.CurrentSurfaceDocument; + + public EveUnityPlayableWorldAssetManifestDocument CurrentAssetManifestDocument => Bridge.CurrentAssetManifestDocument; + + EveUnitySceneProviderSurfaceDocument IEveUnitySceneProviderSurfaceDocumentSource.CurrentDocument => + Bridge.CurrentSurfaceDocument; + + EveUnityPlayableWorldAssetManifestDocument IEveUnityPlayableWorldAssetManifestDocumentSource.CurrentDocument => + Bridge.CurrentAssetManifestDocument; + + public event Action? DocumentAvailable + { + add { Bridge.DocumentAvailable += value; } + remove { Bridge.DocumentAvailable -= value; } + } + + public event Action? AssetManifestDocumentAvailable + { + add { Bridge.AssetManifestDocumentAvailable += value; } + remove { Bridge.AssetManifestDocumentAvailable -= value; } + } + + event Action IEveUnityPlayableWorldAssetManifestDocumentSource.DocumentAvailable + { + add { Bridge.AssetManifestDocumentAvailable += value; } + remove { Bridge.AssetManifestDocumentAvailable -= value; } + } + + public event Action? ReceiptAvailable + { + add { Bridge.ReceiptAvailable += value; } + remove { Bridge.ReceiptAvailable -= value; } + } + + public void Configure(IEveUnitySceneLiveProviderTransport transport) + { + if (transport == null) throw new ArgumentNullException(nameof(transport)); + _bridge?.Dispose(); + _configuredTransport = transport; + _bridge = new EveUnitySceneLiveProviderBridge(transport); + } + + public void Connect() + { + Bridge.Connect(); + } + + public void Disconnect() + { + _bridge?.Disconnect(); + } + + public void Refresh() + { + Bridge.Connect(); + Bridge.Refresh(); + } + + public void Submit(EveSurfaceCommandRequest request) + { + Bridge.Submit(request); + } + + private void OnDisable() + { + Disconnect(); + } + + private void OnDestroy() + { + _bridge?.Dispose(); + _bridge = null; + } + + private EveUnitySceneLiveProviderBridge Bridge + { + get + { + if (_bridge != null) + return _bridge; + + var transport = _configuredTransport ?? transportBehaviour as IEveUnitySceneLiveProviderTransport; + if (transport == null) + throw new InvalidOperationException( + "Eve Unity scene live provider bridge requires a transport implementing IEveUnitySceneLiveProviderTransport."); + + _bridge = new EveUnitySceneLiveProviderBridge(transport); + return _bridge; + } + } + } + + public sealed class EveUnitySceneLiveProviderBridge : + IEveUnitySceneProviderSurfaceDocumentSource, + IEveUnityPlayableWorldAssetManifestDocumentSource, + IEveUnitySceneCommandSink, + IEveUnitySceneCommandReceiptSource, + IEveUnityProviderRefreshSource, + IDisposable + { + private readonly IEveUnitySceneLiveProviderTransport _transport; + private bool _connected; + + public EveUnitySceneLiveProviderBridge(IEveUnitySceneLiveProviderTransport transport) + { + _transport = transport ?? throw new ArgumentNullException(nameof(transport)); + CurrentSurfaceDocument = _transport.CurrentSurfaceDocument; + CurrentAssetManifestDocument = _transport.CurrentAssetManifestDocument; + } + + public string TransportKind => _transport.TransportKind; + + public string SurfacePointer => _transport.SurfacePointer; + + public string AssetManifestPointer => _transport.AssetManifestPointer; + + public string SinkKind => _transport.TransportKind; + + public string ManifestRef => CurrentAssetManifestDocument.ManifestRef; + + public EveUnitySceneProviderSurfaceDocument CurrentSurfaceDocument { get; private set; } + + public EveUnityPlayableWorldAssetManifestDocument CurrentAssetManifestDocument { get; private set; } + + EveUnitySceneProviderSurfaceDocument IEveUnitySceneProviderSurfaceDocumentSource.CurrentDocument => + CurrentSurfaceDocument; + + EveUnityPlayableWorldAssetManifestDocument IEveUnityPlayableWorldAssetManifestDocumentSource.CurrentDocument => + CurrentAssetManifestDocument; + + public event Action? DocumentAvailable; + + public event Action? AssetManifestDocumentAvailable; + + event Action IEveUnityPlayableWorldAssetManifestDocumentSource.DocumentAvailable + { + add { AssetManifestDocumentAvailable += value; } + remove { AssetManifestDocumentAvailable -= value; } + } + + public event Action? ReceiptAvailable; + + public void Connect() + { + if (_connected) + return; + + _transport.SurfaceDocumentAvailable += OnSurfaceDocumentAvailable; + _transport.AssetManifestDocumentAvailable += OnAssetManifestDocumentAvailable; + _transport.CommandReceiptAvailable += OnCommandReceiptAvailable; + _transport.Connect(); + _connected = true; + } + + public void Disconnect() + { + if (!_connected) + return; + + _transport.SurfaceDocumentAvailable -= OnSurfaceDocumentAvailable; + _transport.AssetManifestDocumentAvailable -= OnAssetManifestDocumentAvailable; + _transport.CommandReceiptAvailable -= OnCommandReceiptAvailable; + _transport.Disconnect(); + _connected = false; + } + + public void Refresh() + { + _transport.Refresh(); + } + + public void Submit(EveSurfaceCommandRequest request) + { + if (request == null) throw new ArgumentNullException(nameof(request)); + _transport.SubmitCommand(request); + } + + public void Dispose() + { + Disconnect(); + } + + private void OnSurfaceDocumentAvailable(EveUnitySceneProviderSurfaceDocument document) + { + CurrentSurfaceDocument = document ?? throw new ArgumentNullException(nameof(document)); + DocumentAvailable?.Invoke(CurrentSurfaceDocument); + } + + private void OnAssetManifestDocumentAvailable(EveUnityPlayableWorldAssetManifestDocument document) + { + CurrentAssetManifestDocument = document ?? throw new ArgumentNullException(nameof(document)); + AssetManifestDocumentAvailable?.Invoke(CurrentAssetManifestDocument); + } + + private void OnCommandReceiptAvailable(EveUnitySceneCommandReceipt receipt) + { + if (receipt == null) throw new ArgumentNullException(nameof(receipt)); + if (receipt.ShouldRefreshProviderSurface) + _transport.Refresh(); + ReceiptAvailable?.Invoke(receipt); + } + } +} diff --git a/runtimes/incubating/eve-unity-scene/Runtime/EveUnitySceneLiveProviderBridge.cs.meta b/runtimes/incubating/eve-unity-scene/Runtime/EveUnitySceneLiveProviderBridge.cs.meta new file mode 100644 index 0000000..d7a6df6 --- /dev/null +++ b/runtimes/incubating/eve-unity-scene/Runtime/EveUnitySceneLiveProviderBridge.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 7e11af135f8f48c48a2e0d88f8f9d04c diff --git a/runtimes/incubating/eve-unity-scene/Tests/Editor/EveUnitySceneSurfaceLowererTests.cs b/runtimes/incubating/eve-unity-scene/Tests/Editor/EveUnitySceneSurfaceLowererTests.cs index 28fe06e..68c6ab3 100644 --- a/runtimes/incubating/eve-unity-scene/Tests/Editor/EveUnitySceneSurfaceLowererTests.cs +++ b/runtimes/incubating/eve-unity-scene/Tests/Editor/EveUnitySceneSurfaceLowererTests.cs @@ -349,6 +349,82 @@ namespace GameCult.Eve.UnityScene.Tests Assert.That(runtime.LastReceipt.ShouldRefreshProviderSurface, Is.True); } + [Test] + public void LiveProviderBridgeFeedsPlayableWorldRuntimeThroughTransportPorts() + { + var transport = new FakeLiveProviderTransport( + new EveUnitySceneProviderSurfaceDocument( + PlayableArpgDocument(), + Advertisement("aetheria.daemon.game"), + "cultmesh://aetheria/eve/surfaces/aetheria.daemon.game", + 1), + new EveUnityPlayableWorldAssetManifestDocument( + "cultmesh://aetheria/assets/manifest", + new[] + { + new EveUnityPlayableWorldAssetManifestDocumentEntry( + "cultmesh://aetheria/assets/map/entity/player", + "player", + "Resources/Aetheria/Entities/Vanguard.prefab", + "aetheria.vanguard") + }, + "aetheria")); + using var bridge = new EveUnitySceneLiveProviderBridge(transport); + var sceneSink = new FakePlayableWorldSceneSink(); + + bridge.Connect(); + using var runtime = new EveUnityPlayableWorldRuntime( + bridge, + bridge, + sceneSink, + bridge, + bridge); + + var initialPresentation = runtime.Connect(); + + Assert.That(transport.ConnectCount, Is.EqualTo(1)); + Assert.That(bridge.TransportKind, Is.EqualTo("cultmesh-cultnet-provider-transport")); + Assert.That(bridge.SurfacePointer, Is.EqualTo("cultmesh://aetheria/eve/surfaces/aetheria.daemon.game")); + Assert.That(bridge.AssetManifestPointer, Is.EqualTo("cultmesh://aetheria/assets/manifest")); + Assert.That(initialPresentation.ActiveEntities, Is.EqualTo(3)); + Assert.That(runtime.ActiveWorld, Is.Not.Null); + Assert.That(runtime.AssetManifests.GetForWorld(runtime.ActiveWorld!), Is.Not.Null); + + var moveIntent = runtime.SubmitMoveVectorIntent( + "player-vanguard", + 0.5f, + 1f, + 0.75f, + DateTimeOffset.Parse("2026-07-09T00:00:00Z")); + + Assert.That(transport.Submitted.Count, Is.EqualTo(1)); + Assert.That(transport.Submitted[0], Is.SameAs(moveIntent)); + Assert.That(moveIntent.CommandBoundary, Is.EqualTo("aetheria.daemon.commands")); + + transport.PublishSurface(new EveUnitySceneProviderSurfaceDocument( + PlayableArpgDocument(includeRaider: false, playerPosition: "6,0,2"), + Advertisement("aetheria.daemon.game"), + "cultmesh://aetheria/eve/surfaces/aetheria.daemon.game", + 2)); + + Assert.That(runtime.ActiveVersion, Is.EqualTo(2)); + Assert.That(runtime.LastPresentation, Is.Not.Null); + Assert.That(runtime.LastPresentation!.ActiveEntities, Is.EqualTo(2)); + Assert.That(sceneSink.RemovedEntityIds, Does.Contain("raider-scout")); + + transport.PublishReceipt(new EveUnitySceneCommandReceipt( + "aetheria.daemon.move_intent.accepted", + "aetheria.daemon.commands", + "aetheria.daemon.move_intent", + "accepted", + "Aetheria", + "provider-owned-daemon")); + + Assert.That(runtime.LastReceipt, Is.Not.Null); + Assert.That(runtime.LastReceipt!.IsProviderOwned, Is.True); + Assert.That(transport.RefreshCount, Is.EqualTo(1)); + } + [Test] public void PlayableWorldClientHostMountsInterfaceProviderWithoutProviderTypes() { @@ -1457,6 +1533,78 @@ namespace GameCult.Eve.UnityScene.Tests } } + private sealed class FakeLiveProviderTransport : IEveUnitySceneLiveProviderTransport + { + public FakeLiveProviderTransport( + EveUnitySceneProviderSurfaceDocument surfaceDocument, + EveUnityPlayableWorldAssetManifestDocument assetManifestDocument) + { + CurrentSurfaceDocument = surfaceDocument; + CurrentAssetManifestDocument = assetManifestDocument; + } + + public string TransportKind => "cultmesh-cultnet-provider-transport"; + + public string SurfacePointer => CurrentSurfaceDocument.SourcePointer; + + public string AssetManifestPointer => CurrentAssetManifestDocument.ManifestRef; + + public EveUnitySceneProviderSurfaceDocument CurrentSurfaceDocument { get; private set; } + + public EveUnityPlayableWorldAssetManifestDocument CurrentAssetManifestDocument { get; private set; } + + public List Submitted { get; } = new List(); + + public int ConnectCount { get; private set; } + + public int DisconnectCount { get; private set; } + + public int RefreshCount { get; private set; } + + public event Action? SurfaceDocumentAvailable; + + public event Action? AssetManifestDocumentAvailable; + + public event Action? CommandReceiptAvailable; + + public void Connect() + { + ConnectCount++; + } + + public void Disconnect() + { + DisconnectCount++; + } + + public void Refresh() + { + RefreshCount++; + } + + public void SubmitCommand(EveSurfaceCommandRequest request) + { + Submitted.Add(request); + } + + public void PublishSurface(EveUnitySceneProviderSurfaceDocument document) + { + CurrentSurfaceDocument = document; + SurfaceDocumentAvailable?.Invoke(document); + } + + public void PublishAssetManifest(EveUnityPlayableWorldAssetManifestDocument document) + { + CurrentAssetManifestDocument = document; + AssetManifestDocumentAvailable?.Invoke(document); + } + + public void PublishReceipt(EveUnitySceneCommandReceipt receipt) + { + CommandReceiptAvailable?.Invoke(receipt); + } + } + private sealed class FakePlayableWorldProviderComponent : MonoBehaviour, IEveUnitySceneProviderSurfaceDocumentSource, diff --git a/runtimes/incubating/eve-unity-scene/eve-runtime-capability.json b/runtimes/incubating/eve-unity-scene/eve-runtime-capability.json index a976af9..1e6b22a 100644 --- a/runtimes/incubating/eve-unity-scene/eve-runtime-capability.json +++ b/runtimes/incubating/eve-unity-scene/eve-runtime-capability.json @@ -19,6 +19,7 @@ "providerSurfaceSession", "providerSurfaceSource", "providerSurfaceDocumentSource", + "liveProviderTransportBridge", "livePlayableWorldClient", "providerCommandReceipts", "providerAssetManifestDocumentSource", @@ -76,6 +77,7 @@ "runtimes/incubating/eve-unity-scene/Runtime/EveUnitySceneSurfaceLowerer.cs", "runtimes/incubating/eve-unity-scene/Runtime/EveUnitySceneClientSession.cs", "runtimes/incubating/eve-unity-scene/Runtime/EveUnitySceneProviderConnection.cs", + "runtimes/incubating/eve-unity-scene/Runtime/EveUnitySceneLiveProviderBridge.cs", "runtimes/incubating/eve-unity-scene/Runtime/EveUnityPlayableWorldLiveClient.cs", "runtimes/incubating/eve-unity-scene/Runtime/EveUnityPlayableWorldRuntime.cs", "runtimes/incubating/eve-unity-scene/Runtime/EveUnityPlayableWorldClientHost.cs", @@ -134,6 +136,7 @@ "runtimes/incubating/eve-unity-scene/Runtime/EveUnitySceneSurfaceLowerer.cs", "runtimes/incubating/eve-unity-scene/Runtime/EveUnitySceneClientSession.cs", "runtimes/incubating/eve-unity-scene/Runtime/EveUnitySceneProviderConnection.cs", + "runtimes/incubating/eve-unity-scene/Runtime/EveUnitySceneLiveProviderBridge.cs", "runtimes/incubating/eve-unity-scene/Runtime/EveUnityPlayableWorldLiveClient.cs", "runtimes/incubating/eve-unity-scene/Runtime/EveUnityPlayableWorldRuntime.cs", "runtimes/incubating/eve-unity-scene/Runtime/EveUnityPlayableWorldClientHost.cs", @@ -181,6 +184,7 @@ "runtimes/incubating/eve-unity-scene/Runtime/EveUnitySceneSurfaceLowerer.cs", "runtimes/incubating/eve-unity-scene/Runtime/EveUnitySceneClientSession.cs", "runtimes/incubating/eve-unity-scene/Runtime/EveUnitySceneProviderConnection.cs", + "runtimes/incubating/eve-unity-scene/Runtime/EveUnitySceneLiveProviderBridge.cs", "runtimes/incubating/eve-unity-scene/Runtime/EveUnityPlayableWorldLiveClient.cs", "runtimes/incubating/eve-unity-scene/Runtime/EveUnityPlayableWorldRuntime.cs", "runtimes/incubating/eve-unity-scene/Runtime/EveUnityPlayableWorldClientHost.cs", @@ -204,7 +208,7 @@ ], "pendingProofs": [ "Unity scene EditMode runner is owned by EveUnity rather than Eve incubation.", - "Live CultMesh/CultNet provider subscription adapter implements IEveUnitySceneProviderSurfaceDocumentSource/IEveUnitySceneProviderSurfaceSource and feeds EveUnitySceneClientSession snapshots from provider-owned documents instead of Eve-local fixture documents." + "Live CultMesh/CultNet provider subscription adapter implements IEveUnitySceneLiveProviderTransport and feeds EveUnitySceneLiveProviderBridge from provider-owned documents, manifests, commands, and receipts instead of Eve-local fixture documents." ] }, "capture": { diff --git a/runtimes/incubating/eve-unity-scene/eveunity-scene-split-handoff.json b/runtimes/incubating/eve-unity-scene/eveunity-scene-split-handoff.json index c756132..196ad56 100644 --- a/runtimes/incubating/eve-unity-scene/eveunity-scene-split-handoff.json +++ b/runtimes/incubating/eve-unity-scene/eveunity-scene-split-handoff.json @@ -18,6 +18,7 @@ "runtimes/incubating/eve-unity-scene/Runtime/EveUnitySceneSurfaceLowerer.cs", "runtimes/incubating/eve-unity-scene/Runtime/EveUnitySceneClientSession.cs", "runtimes/incubating/eve-unity-scene/Runtime/EveUnitySceneProviderConnection.cs", + "runtimes/incubating/eve-unity-scene/Runtime/EveUnitySceneLiveProviderBridge.cs", "runtimes/incubating/eve-unity-scene/Runtime/EveUnityPlayableWorldLiveClient.cs", "runtimes/incubating/eve-unity-scene/Runtime/EveUnityPlayableWorldRuntime.cs", "runtimes/incubating/eve-unity-scene/Runtime/EveUnityPlayableWorldClientHost.cs", @@ -45,6 +46,7 @@ "runtimes/incubating/eve-unity-scene/Runtime/EveUnitySceneSurfaceLowerer.cs", "runtimes/incubating/eve-unity-scene/Runtime/EveUnitySceneClientSession.cs", "runtimes/incubating/eve-unity-scene/Runtime/EveUnitySceneProviderConnection.cs", + "runtimes/incubating/eve-unity-scene/Runtime/EveUnitySceneLiveProviderBridge.cs", "runtimes/incubating/eve-unity-scene/Runtime/EveUnityPlayableWorldLiveClient.cs", "runtimes/incubating/eve-unity-scene/Runtime/EveUnityPlayableWorldRuntime.cs", "runtimes/incubating/eve-unity-scene/Runtime/EveUnityPlayableWorldClientHost.cs", @@ -72,6 +74,7 @@ "runtimes/incubating/eve-unity-scene/Runtime/EveUnitySceneSurfaceLowerer.cs", "runtimes/incubating/eve-unity-scene/Runtime/EveUnitySceneClientSession.cs", "runtimes/incubating/eve-unity-scene/Runtime/EveUnitySceneProviderConnection.cs", + "runtimes/incubating/eve-unity-scene/Runtime/EveUnitySceneLiveProviderBridge.cs", "runtimes/incubating/eve-unity-scene/Runtime/EveUnityPlayableWorldLiveClient.cs", "runtimes/incubating/eve-unity-scene/Runtime/EveUnityPlayableWorldRuntime.cs", "runtimes/incubating/eve-unity-scene/Runtime/EveUnityPlayableWorldClientHost.cs", @@ -88,7 +91,7 @@ "runtimes/incubating/eve-unity-scene/eve-runtime-capability.json" ], "destinationOwner": "EveUnity", - "replacementProof": "EveUnity claims the provider-advertised unity-scene lowering target with provider-agnostic playable-world projection, scene graph projection, typed provider surface document loading, provider snapshot session, a playable-world runtime host, generic client bootstrap, movement input driver, camera rig, live playable-world client composition, provider command receipt observation, playable-world scene presentation, Unity GameObject scene sink, typed provider asset manifest document loading, provider asset manifest resolution, provider asset manifest source/cache, and command boundary evidence; live transport and capture remain separate lifecycle proofs." + "replacementProof": "EveUnity claims the provider-advertised unity-scene lowering target with provider-agnostic playable-world projection, scene graph projection, typed provider surface document loading, provider snapshot session, live provider transport bridge, a playable-world runtime host, generic client bootstrap, movement input driver, camera rig, live playable-world client composition, provider command receipt observation, playable-world scene presentation, Unity GameObject scene sink, typed provider asset manifest document loading, provider asset manifest resolution, provider asset manifest source/cache, and command boundary evidence; concrete CultMesh/CultNet transport and capture remain separate lifecycle proofs." }, { "id": "unity-scene-sai-plugin-projection", @@ -133,6 +136,7 @@ "runtimes/incubating/eve-unity-scene/Runtime/EveUnitySceneSurfaceLowerer.cs", "runtimes/incubating/eve-unity-scene/Runtime/EveUnitySceneClientSession.cs", "runtimes/incubating/eve-unity-scene/Runtime/EveUnitySceneProviderConnection.cs", + "runtimes/incubating/eve-unity-scene/Runtime/EveUnitySceneLiveProviderBridge.cs", "runtimes/incubating/eve-unity-scene/Runtime/EveUnityPlayableWorldClientHost.cs", "runtimes/incubating/eve-unity-scene/Runtime/EveUnityPlayableWorldClientBootstrap.cs", "runtimes/incubating/eve-unity-scene/Runtime/EveUnityPlayableWorldInputDriver.cs", @@ -140,7 +144,7 @@ "runtimes/incubating/eve-unity-scene/eve-runtime-capability.json" ], "destinationOwner": "EveUnity", - "replacementProof": "Unity scene input emits gamecult.eve.command.v1 intents through typed provider surface documents, a provider-snapshot client session, IEveUnitySceneProviderSurfaceSource, IEveUnitySceneCommandSink, IEveUnitySceneCommandReceiptSource, and advertised command boundaries, then observes provider receipts and refreshes from provider documents/snapshots instead of mutating local world truth." + "replacementProof": "Unity scene input emits gamecult.eve.command.v1 intents through typed provider surface documents, a provider-snapshot client session, IEveUnitySceneLiveProviderTransport, IEveUnitySceneCommandSink, IEveUnitySceneCommandReceiptSource, and advertised command boundaries, then observes provider receipts and refreshes from provider documents/snapshots instead of mutating local world truth." }, { "id": "aetheria-playable-world-consumer-proof", @@ -192,6 +196,7 @@ "EveUnity owns a provider-agnostic scene graph lowerer that consumes advertised worldInteraction boundaries without importing Aetheria internals.", "EveUnity owns a provider-snapshot Unity scene client session that lowers Aetheria's surface and emits command intents without importing Aetheria project code.", "EveUnity owns typed provider surface document, provider surface source, and command sink ports that a live CultMesh/CultNet adapter can implement without changing scene lowering.", + "EveUnity owns a live provider transport bridge that adapts CultMesh/CultNet provider documents, asset manifests, command submission, receipts, and refresh requests into the runtime ports without importing provider internals.", "EveUnity owns a live playable-world client coordinator that applies provider snapshots through the presenter, observes provider command receipts, and emits command intents through the advertised provider command sink without local simulation.", "EveUnity owns a generic Unity client bootstrap that wires provider surface documents, command sink, asset manifest, input driver, camera rig, and scene root without importing provider internals.", "EveUnity owns generic playable-world movement input and camera rig components that emit provider-owned command intents and follow provider-advertised player entities without importing provider internals.", diff --git a/scripts/run-aetheria-conformance-consumer-smoke.ps1 b/scripts/run-aetheria-conformance-consumer-smoke.ps1 index 379977b..4bdc8b7 100644 --- a/scripts/run-aetheria-conformance-consumer-smoke.ps1 +++ b/scripts/run-aetheria-conformance-consumer-smoke.ps1 @@ -93,8 +93,11 @@ try { --expect-split-target-blocker "EveTui:TUI package release is cut from EveTui rather than Eve incubation" ` --expect-split-target-blocker "EveTui:TUI capture path is owned by EveTui rather than Eve incubation" ` --expect-split-handoff-move EveUnity:unity-scene:unity-scene-runtime-body:current:exists:EveUnitySceneSurfaceLowerer.cs ` + --expect-split-handoff-move EveUnity:unity-scene:unity-scene-runtime-body:current:exists:EveUnitySceneLiveProviderBridge.cs ` --expect-split-handoff-move EveUnity:unity-scene:unity-scene-world-surface-lowering:current:exists:EveUnitySceneSurfaceLowerer.cs ` + --expect-split-handoff-move EveUnity:unity-scene:unity-scene-world-surface-lowering:current:exists:EveUnitySceneLiveProviderBridge.cs ` --expect-split-handoff-move EveUnity:unity-scene:unity-scene-command-transport:current:exists:EveUnitySceneSurfaceLowerer.cs ` + --expect-split-handoff-move EveUnity:unity-scene:unity-scene-command-transport:current:exists:EveUnitySceneLiveProviderBridge.cs ` --expect-split-handoff-move EveUnity:unity-scene:aetheria-playable-world-consumer-proof:observed-provider:exists:Assets/Scripts/Tests/DaemonRuntimeDocumentTests.cs ` --expect-split-handoff-move EveUnity:unity-scene:aetheria-playable-world-consumer-proof:observed-provider:exists:Packages/org.gamecult.aetheria.eve-runtime/Runtime/AetheriaEveUnitySceneProviderBridge.cs ` --expect-split-handoff-move EveUnity:unity-scene:aetheria-playable-world-consumer-proof:observed-provider:exists:AetheriaRuntimeDaemonGameSurfaceBuilder.cs ` diff --git a/scripts/run-eveunity-scene-lifecycle-smoke.ps1 b/scripts/run-eveunity-scene-lifecycle-smoke.ps1 index e9e58cd..84ae613 100644 --- a/scripts/run-eveunity-scene-lifecycle-smoke.ps1 +++ b/scripts/run-eveunity-scene-lifecycle-smoke.ps1 @@ -40,7 +40,7 @@ if ($manifest.incubation.splitHandoff.manifestPath -ne "runtimes/incubating/eve- throw "EveUnity scene manifest missing split handoff path" } -foreach ($feature in @("providerAdvertisements", "commandTransport", "providerSurfaceSession", "providerSurfaceSource", "providerSurfaceDocumentSource", "livePlayableWorldClient", "providerCommandReceipts", "providerAssetManifestDocumentSource", "playableWorldClientHost", "playableWorldClientBootstrap", "playableWorldInputDriver", "playableWorldCameraRig", "sceneGraphProjection", "playableWorldProjection", "playableWorldRuntimeHost", "playableWorldScenePresentation", "unityGameObjectSceneSink", "providerAssetManifestResolution", "providerAssetManifestSource", "embeddedDocuments")) { +foreach ($feature in @("providerAdvertisements", "commandTransport", "providerSurfaceSession", "providerSurfaceSource", "providerSurfaceDocumentSource", "liveProviderTransportBridge", "livePlayableWorldClient", "providerCommandReceipts", "providerAssetManifestDocumentSource", "playableWorldClientHost", "playableWorldClientBootstrap", "playableWorldInputDriver", "playableWorldCameraRig", "sceneGraphProjection", "playableWorldProjection", "playableWorldRuntimeHost", "playableWorldScenePresentation", "unityGameObjectSceneSink", "providerAssetManifestResolution", "providerAssetManifestSource", "embeddedDocuments")) { if (-not (@($manifest.supportedFeatures) -contains $feature)) { throw "EveUnity scene manifest missing provider-shell feature: $feature" } diff --git a/scripts/run-eveunity-scene-provider-shell-smoke.ps1 b/scripts/run-eveunity-scene-provider-shell-smoke.ps1 index 5fa97ae..49309fd 100644 --- a/scripts/run-eveunity-scene-provider-shell-smoke.ps1 +++ b/scripts/run-eveunity-scene-provider-shell-smoke.ps1 @@ -54,7 +54,7 @@ foreach ($evidencePath in @($worldSurfaceLoweringClaim.evidencePaths)) { } } -foreach ($feature in @("providerAdvertisements", "commandTransport", "providerSurfaceSession", "providerSurfaceSource", "providerSurfaceDocumentSource", "livePlayableWorldClient", "providerCommandReceipts", "providerAssetManifestDocumentSource", "playableWorldClientHost", "playableWorldClientBootstrap", "playableWorldInputDriver", "playableWorldCameraRig", "sceneGraphProjection", "playableWorldProjection", "playableWorldRuntimeHost", "playableWorldScenePresentation", "unityGameObjectSceneSink", "providerAssetManifestResolution", "providerAssetManifestSource")) { +foreach ($feature in @("providerAdvertisements", "commandTransport", "providerSurfaceSession", "providerSurfaceSource", "providerSurfaceDocumentSource", "liveProviderTransportBridge", "livePlayableWorldClient", "providerCommandReceipts", "providerAssetManifestDocumentSource", "playableWorldClientHost", "playableWorldClientBootstrap", "playableWorldInputDriver", "playableWorldCameraRig", "sceneGraphProjection", "playableWorldProjection", "playableWorldRuntimeHost", "playableWorldScenePresentation", "unityGameObjectSceneSink", "providerAssetManifestResolution", "providerAssetManifestSource")) { if (-not (@($manifest.supportedFeatures) -contains $feature)) { throw "EveUnity scene provider shell missing supported feature: $feature" } @@ -66,6 +66,7 @@ $expectedFiles = @( "runtimes\incubating\eve-unity-scene\Runtime\EveUnitySceneSurfaceLowerer.cs", "runtimes\incubating\eve-unity-scene\Runtime\EveUnitySceneClientSession.cs", "runtimes\incubating\eve-unity-scene\Runtime\EveUnitySceneProviderConnection.cs", + "runtimes\incubating\eve-unity-scene\Runtime\EveUnitySceneLiveProviderBridge.cs", "runtimes\incubating\eve-unity-scene\Runtime\EveUnityPlayableWorldLiveClient.cs", "runtimes\incubating\eve-unity-scene\Runtime\EveUnityPlayableWorldRuntime.cs", "runtimes\incubating\eve-unity-scene\Runtime\EveUnityPlayableWorldClientHost.cs", @@ -111,6 +112,16 @@ foreach ($symbol in @("IEveUnitySceneProviderSurfaceSource", "IEveUnitySceneComm } } +$liveProviderBridgeSource = Get-Content -LiteralPath (Join-Path $projectRoot "runtimes\incubating\eve-unity-scene\Runtime\EveUnitySceneLiveProviderBridge.cs") -Raw +foreach ($symbol in @("IEveUnitySceneLiveProviderTransport", "EveUnitySceneLiveProviderTransportBehaviour", "EveUnitySceneLiveProviderBridgeComponent", "EveUnitySceneLiveProviderBridge", "IEveUnitySceneProviderSurfaceDocumentSource", "IEveUnityPlayableWorldAssetManifestDocumentSource", "IEveUnitySceneCommandSink", "IEveUnitySceneCommandReceiptSource", "IEveUnityProviderRefreshSource", "SubmitCommand", "CommandReceiptAvailable", "ShouldRefreshProviderSurface", "transportBehaviour")) { + if (-not $liveProviderBridgeSource.Contains($symbol)) { + throw "EveUnity scene live provider bridge missing symbol: $symbol" + } +} +if ($liveProviderBridgeSource.Contains("Aetheria")) { + throw "EveUnity scene live provider bridge must remain provider-agnostic and cannot reference Aetheria" +} + $liveClientSource = Get-Content -LiteralPath (Join-Path $projectRoot "runtimes\incubating\eve-unity-scene\Runtime\EveUnityPlayableWorldLiveClient.cs") -Raw foreach ($symbol in @("EveUnityPlayableWorldLiveClient", "IEveUnitySceneCommandReceiptSource", "EveUnitySceneCommandReceipt", "EveUnitySceneProviderConnection", "EveUnityPlayableWorldPresenter", "ActiveWorld", "LastPresentation", "LastReceipt", "ReceiptAvailable", "Connect", "Refresh", "SubmitMoveIntent", "SubmitMoveVectorIntent", "SubmitFocusIntent", "SubmitTargetIntent", "SubmitActionIntent", "ProjectionUpdated", "ShouldRefreshProviderSurface", "IsProviderOwned", "Disconnect")) { if (-not $liveClientSource.Contains($symbol)) { @@ -215,7 +226,7 @@ foreach ($symbol in @("TeXMathUnitySceneProjectionAdapter", "tex.math", "embed.t } $testSource = Get-Content -LiteralPath (Join-Path $projectRoot "runtimes\incubating\eve-unity-scene\Tests\Editor\EveUnitySceneSurfaceLowererTests.cs") -Raw -foreach ($symbol in @("LowerCarriesProviderAdvertisedWorldBoundary", "LowerBuildsProviderAgnosticSceneGraphFromSurfaceTree", "LowerExtractsPlayableArpgWorldFromGenericScene3dSurface", "GenericClientSessionConsumesAetheriaPlayableWorldSnapshotWithoutAetheriaTypes", "GenericProviderConnectionAppliesLiveSnapshotsAndSubmitsCommandsThroughSink", "ProviderSurfaceDocumentSourceFeedsPlayableClientWithoutAetheriaTypes", "PlayableWorldRuntimeComposesProviderDocumentsAssetsReceiptsAndSceneSink", "PlayableWorldClientHostMountsInterfaceProviderWithoutProviderTypes", "PlayableWorldClientBootstrapWiresGenericUnityClientFromProviderInterfaces", "PlayableWorldClientHostSubmitsProviderOwnedMoveVector", "PlayableWorldInputDriverBuildsCameraRelativeMoveVectorWithoutProviderTypes", "PlayableWorldCameraRigFollowsAdvertisedPlayerEntityWithoutProviderTypes", "PlayableWorldPresenterInstantiatesUpdatesAndDespawnsProviderEntities", "LivePlayableWorldClientPresentsProviderSnapshotsAndKeepsCommandsProviderOwned", "LivePlayableWorldClientRefreshesFromProviderSnapshotAfterReceiptWithoutOwningMovement", "AssetManifestMapsProviderAssetRefsToUnityLoadKeysWithoutAetheriaTypes", "AssetManifestCacheTracksPlayableWorldManifestPointerAndLiveUpdates", "AssetManifestDocumentSourceFeedsCacheWithoutChangingSceneLowering", "FakeProviderSurfaceSource", "FakeProviderSurfaceDocumentSource", "FakeCommandReceiptSource", "FakeAssetManifestSource", "FakeAssetManifestDocumentSource", "FakeCommandSink", "FakePlayableWorldSceneSink", "FakePlayableWorldProviderComponent", "SaiVisualNovelLowersThroughRuntimeProjectionAdapterWithoutOwningStoryState", "CommandIntentCarriesAdvertisedBoundaryWithoutOwningReceipts", "pending", "reconciled", "world-projection-node", "playable-world-root", "playable-world-entity", "world-field-3d", "arpg-third-person", "cultmesh://aetheria/assets/manifest", "cultmesh://aetheria/eve/surfaces/aetheria.daemon.game", "aetheria.daemon.move_intent", "sai-vn-scene-stage", "norn-graph-scene-projection", "tex-math-scene-projection", "sai.vn", "norn.graph", "tex.math", "sidecar-advertised-plugin-abi", "aetheria.daemon.commands", "aetheria.eve_command_acceptance_status.v1")) { +foreach ($symbol in @("LowerCarriesProviderAdvertisedWorldBoundary", "LowerBuildsProviderAgnosticSceneGraphFromSurfaceTree", "LowerExtractsPlayableArpgWorldFromGenericScene3dSurface", "GenericClientSessionConsumesAetheriaPlayableWorldSnapshotWithoutAetheriaTypes", "GenericProviderConnectionAppliesLiveSnapshotsAndSubmitsCommandsThroughSink", "ProviderSurfaceDocumentSourceFeedsPlayableClientWithoutAetheriaTypes", "PlayableWorldRuntimeComposesProviderDocumentsAssetsReceiptsAndSceneSink", "LiveProviderBridgeFeedsPlayableWorldRuntimeThroughTransportPorts", "PlayableWorldClientHostMountsInterfaceProviderWithoutProviderTypes", "PlayableWorldClientBootstrapWiresGenericUnityClientFromProviderInterfaces", "PlayableWorldClientHostSubmitsProviderOwnedMoveVector", "PlayableWorldInputDriverBuildsCameraRelativeMoveVectorWithoutProviderTypes", "PlayableWorldCameraRigFollowsAdvertisedPlayerEntityWithoutProviderTypes", "PlayableWorldPresenterInstantiatesUpdatesAndDespawnsProviderEntities", "LivePlayableWorldClientPresentsProviderSnapshotsAndKeepsCommandsProviderOwned", "LivePlayableWorldClientRefreshesFromProviderSnapshotAfterReceiptWithoutOwningMovement", "AssetManifestMapsProviderAssetRefsToUnityLoadKeysWithoutAetheriaTypes", "AssetManifestCacheTracksPlayableWorldManifestPointerAndLiveUpdates", "AssetManifestDocumentSourceFeedsCacheWithoutChangingSceneLowering", "FakeProviderSurfaceSource", "FakeProviderSurfaceDocumentSource", "FakeCommandReceiptSource", "FakeAssetManifestSource", "FakeAssetManifestDocumentSource", "FakeLiveProviderTransport", "FakeCommandSink", "FakePlayableWorldSceneSink", "FakePlayableWorldProviderComponent", "SaiVisualNovelLowersThroughRuntimeProjectionAdapterWithoutOwningStoryState", "CommandIntentCarriesAdvertisedBoundaryWithoutOwningReceipts", "pending", "reconciled", "world-projection-node", "playable-world-root", "playable-world-entity", "world-field-3d", "arpg-third-person", "cultmesh://aetheria/assets/manifest", "cultmesh://aetheria/eve/surfaces/aetheria.daemon.game", "aetheria.daemon.move_intent", "sai-vn-scene-stage", "norn-graph-scene-projection", "tex-math-scene-projection", "sai.vn", "norn.graph", "tex.math", "sidecar-advertised-plugin-abi", "aetheria.daemon.commands", "aetheria.eve_command_acceptance_status.v1")) { if (-not $testSource.Contains($symbol)) { throw "EveUnity scene provider shell tests missing symbol: $symbol" } diff --git a/scripts/run-runtime-owner-conformance-consumer-smoke.ps1 b/scripts/run-runtime-owner-conformance-consumer-smoke.ps1 index ad59c4c..abab980 100644 --- a/scripts/run-runtime-owner-conformance-consumer-smoke.ps1 +++ b/scripts/run-runtime-owner-conformance-consumer-smoke.ps1 @@ -68,6 +68,7 @@ node $consumerScript $consumerExport ` --expect-runtime-feature unity-scene:providerSurfaceSession ` --expect-runtime-feature unity-scene:providerSurfaceSource ` --expect-runtime-feature unity-scene:providerSurfaceDocumentSource ` + --expect-runtime-feature unity-scene:liveProviderTransportBridge ` --expect-runtime-feature unity-scene:livePlayableWorldClient ` --expect-runtime-feature unity-scene:providerCommandReceipts ` --expect-runtime-feature unity-scene:providerAssetManifestDocumentSource ` diff --git a/scripts/run-split-target-conformance-consumer-smoke.ps1 b/scripts/run-split-target-conformance-consumer-smoke.ps1 index a432abb..5b7a28f 100644 --- a/scripts/run-split-target-conformance-consumer-smoke.ps1 +++ b/scripts/run-split-target-conformance-consumer-smoke.ps1 @@ -52,14 +52,17 @@ try { --expect-split-target-blocker-record EveUnity:runtime-status:unity-scene ` --expect-split-target-blocker-record "EveUnity:pending-proof:Unity scene runtime body graduates to EveUnity outside Aetheria product code." ` --expect-split-handoff-move EveUnity:unity-scene:unity-scene-runtime-body:current:exists:EveUnitySceneSurfaceLowerer.cs ` + --expect-split-handoff-move EveUnity:unity-scene:unity-scene-runtime-body:current:exists:EveUnitySceneLiveProviderBridge.cs ` --expect-split-handoff-move EveUnity:unity-scene:unity-scene-runtime-body:current:exists:EveUnityPlayableWorldClientBootstrap.cs ` --expect-split-handoff-move EveUnity:unity-scene:unity-scene-upm-package:current:exists:eveunity-release-artifact.mjs ` --expect-split-handoff-move EveUnity:unity-scene:unity-scene-world-surface-lowering:current:exists:EveUnitySceneSurfaceLowerer.cs ` + --expect-split-handoff-move EveUnity:unity-scene:unity-scene-world-surface-lowering:current:exists:EveUnitySceneLiveProviderBridge.cs ` --expect-split-handoff-move EveUnity:unity-scene:unity-scene-world-surface-lowering:current:exists:EveUnityPlayableWorldClientBootstrap.cs ` --expect-split-handoff-move EveUnity:unity-scene:unity-scene-sai-plugin-projection:current:exists:SaiVisualNovelUnitySceneProjectionAdapter.cs ` --expect-split-handoff-move EveUnity:unity-scene:unity-scene-norn-plugin-projection:current:exists:NornGraphUnitySceneProjectionAdapter.cs ` --expect-split-handoff-move EveUnity:unity-scene:unity-scene-tex-plugin-projection:current:exists:TeXMathUnitySceneProjectionAdapter.cs ` --expect-split-handoff-move EveUnity:unity-scene:unity-scene-command-transport:current:exists:EveUnitySceneSurfaceLowerer.cs ` + --expect-split-handoff-move EveUnity:unity-scene:unity-scene-command-transport:current:exists:EveUnitySceneLiveProviderBridge.cs ` --expect-split-handoff-move EveUnity:unity-scene:aetheria-playable-world-consumer-proof:observed-provider:exists:Assets/Scripts/Tests/DaemonRuntimeDocumentTests.cs ` --expect-split-handoff-move EveUnity:unity-scene:aetheria-playable-world-consumer-proof:observed-provider:exists:Packages/org.gamecult.aetheria.eve-runtime/Runtime/AetheriaEveUnitySceneProviderBridge.cs ` --expect-split-handoff-move EveUnity:unity-scene:aetheria-playable-world-consumer-proof:observed-provider:exists:AetheriaRuntimeDaemonGameSurfaceBuilder.cs ` diff --git a/tools/parity/parity-manifest.json b/tools/parity/parity-manifest.json index 771a280..f720e7c 100644 --- a/tools/parity/parity-manifest.json +++ b/tools/parity/parity-manifest.json @@ -1051,7 +1051,7 @@ "splitHandoffPath": "runtimes/incubating/eve-unity-scene/eveunity-scene-split-handoff.json", "requiredFixtures": ["aetheria-world", "eve-world-smoke"], "pluginFixtures": ["sai-vn"], - "supportedFeatures": ["providerAdvertisements", "commandTransport", "providerSurfaceSession", "providerSurfaceSource", "providerSurfaceDocumentSource", "livePlayableWorldClient", "providerCommandReceipts", "providerAssetManifestDocumentSource", "playableWorldClientHost", "playableWorldClientBootstrap", "playableWorldInputDriver", "playableWorldCameraRig", "providerAssetManifestSource", "sceneGraphProjection", "playableWorldProjection", "playableWorldRuntimeHost", "playableWorldScenePresentation", "unityGameObjectSceneSink", "providerAssetManifestResolution", "embeddedDocuments"], + "supportedFeatures": ["providerAdvertisements", "commandTransport", "providerSurfaceSession", "providerSurfaceSource", "providerSurfaceDocumentSource", "liveProviderTransportBridge", "livePlayableWorldClient", "providerCommandReceipts", "providerAssetManifestDocumentSource", "playableWorldClientHost", "playableWorldClientBootstrap", "playableWorldInputDriver", "playableWorldCameraRig", "providerAssetManifestSource", "sceneGraphProjection", "playableWorldProjection", "playableWorldRuntimeHost", "playableWorldScenePresentation", "unityGameObjectSceneSink", "providerAssetManifestResolution", "embeddedDocuments"], "supportedPlugins": [ { "pluginId": "sai.vn", @@ -1081,6 +1081,7 @@ "runtimes/incubating/eve-unity-scene/Runtime/EveUnitySceneSurfaceLowerer.cs", "runtimes/incubating/eve-unity-scene/Runtime/EveUnitySceneClientSession.cs", "runtimes/incubating/eve-unity-scene/Runtime/EveUnitySceneProviderConnection.cs", + "runtimes/incubating/eve-unity-scene/Runtime/EveUnitySceneLiveProviderBridge.cs", "runtimes/incubating/eve-unity-scene/Runtime/EveUnityPlayableWorldLiveClient.cs", "runtimes/incubating/eve-unity-scene/Runtime/EveUnityPlayableWorldRuntime.cs", "runtimes/incubating/eve-unity-scene/Runtime/EveUnityPlayableWorldClientHost.cs", @@ -1105,6 +1106,7 @@ "runtimes/incubating/eve-unity-scene/Runtime/EveUnitySceneSurfaceLowerer.cs", "runtimes/incubating/eve-unity-scene/Runtime/EveUnitySceneClientSession.cs", "runtimes/incubating/eve-unity-scene/Runtime/EveUnitySceneProviderConnection.cs", + "runtimes/incubating/eve-unity-scene/Runtime/EveUnitySceneLiveProviderBridge.cs", "runtimes/incubating/eve-unity-scene/Runtime/EveUnityPlayableWorldLiveClient.cs", "runtimes/incubating/eve-unity-scene/Runtime/EveUnityPlayableWorldRuntime.cs", "runtimes/incubating/eve-unity-scene/Runtime/EveUnityPlayableWorldClientHost.cs", @@ -1149,6 +1151,10 @@ "path": "runtimes/incubating/eve-unity-scene/Runtime/EveUnitySceneProviderConnection.cs", "contains": ["IEveUnitySceneProviderSurfaceSource", "IEveUnitySceneCommandSink", "IEveUnitySceneProviderSurfaceDocumentSource", "EveUnitySceneProviderSurfaceDocument", "EveUnitySceneProviderSurfaceDocumentSource", "ToSnapshot", "DocumentAvailable", "EveUnitySceneProviderConnection", "SnapshotAvailable", "CurrentSnapshot", "Connect", "Refresh", "SubmitMoveIntent", "SubmitFocusIntent", "SubmitTargetIntent", "SubmitActionIntent", "Disconnect"] }, + { + "path": "runtimes/incubating/eve-unity-scene/Runtime/EveUnitySceneLiveProviderBridge.cs", + "contains": ["IEveUnitySceneLiveProviderTransport", "EveUnitySceneLiveProviderTransportBehaviour", "EveUnitySceneLiveProviderBridgeComponent", "EveUnitySceneLiveProviderBridge", "IEveUnitySceneProviderSurfaceDocumentSource", "IEveUnityPlayableWorldAssetManifestDocumentSource", "IEveUnitySceneCommandSink", "IEveUnitySceneCommandReceiptSource", "IEveUnityProviderRefreshSource", "SubmitCommand", "CommandReceiptAvailable", "ShouldRefreshProviderSurface", "transportBehaviour"] + }, { "path": "runtimes/incubating/eve-unity-scene/Runtime/EveUnityPlayableWorldLiveClient.cs", "contains": ["EveUnityPlayableWorldLiveClient", "IEveUnitySceneCommandReceiptSource", "EveUnitySceneCommandReceipt", "EveUnitySceneProviderConnection", "EveUnityPlayableWorldPresenter", "ActiveWorld", "LastPresentation", "LastReceipt", "ReceiptAvailable", "Connect", "Refresh", "SubmitMoveIntent", "SubmitFocusIntent", "SubmitTargetIntent", "SubmitActionIntent", "ProjectionUpdated", "ShouldRefreshProviderSurface", "IsProviderOwned", "Disconnect"] @@ -1199,7 +1205,7 @@ }, { "path": "runtimes/incubating/eve-unity-scene/Tests/Editor/EveUnitySceneSurfaceLowererTests.cs", - "contains": ["LowerCarriesProviderAdvertisedWorldBoundary", "LowerBuildsProviderAgnosticSceneGraphFromSurfaceTree", "LowerExtractsPlayableArpgWorldFromGenericScene3dSurface", "GenericClientSessionConsumesAetheriaPlayableWorldSnapshotWithoutAetheriaTypes", "GenericProviderConnectionAppliesLiveSnapshotsAndSubmitsCommandsThroughSink", "ProviderSurfaceDocumentSourceFeedsPlayableClientWithoutAetheriaTypes", "PlayableWorldRuntimeComposesProviderDocumentsAssetsReceiptsAndSceneSink", "PlayableWorldClientHostMountsInterfaceProviderWithoutProviderTypes", "PlayableWorldClientBootstrapWiresGenericUnityClientFromProviderInterfaces", "PlayableWorldClientHostSubmitsProviderOwnedMoveVector", "PlayableWorldInputDriverBuildsCameraRelativeMoveVectorWithoutProviderTypes", "PlayableWorldCameraRigFollowsAdvertisedPlayerEntityWithoutProviderTypes", "PlayableWorldPresenterInstantiatesUpdatesAndDespawnsProviderEntities", "LivePlayableWorldClientPresentsProviderSnapshotsAndKeepsCommandsProviderOwned", "LivePlayableWorldClientRefreshesFromProviderSnapshotAfterReceiptWithoutOwningMovement", "AssetManifestMapsProviderAssetRefsToUnityLoadKeysWithoutAetheriaTypes", "AssetManifestCacheTracksPlayableWorldManifestPointerAndLiveUpdates", "AssetManifestDocumentSourceFeedsCacheWithoutChangingSceneLowering", "FakeProviderSurfaceSource", "FakeProviderSurfaceDocumentSource", "FakeCommandReceiptSource", "FakeAssetManifestSource", "FakeAssetManifestDocumentSource", "FakeCommandSink", "FakePlayableWorldSceneSink", "FakePlayableWorldProviderComponent", "SaiVisualNovelLowersThroughRuntimeProjectionAdapterWithoutOwningStoryState", "CommandIntentCarriesAdvertisedBoundaryWithoutOwningReceipts", "pending", "reconciled", "world-projection-node", "playable-world-root", "playable-world-entity", "world-field-3d", "arpg-third-person", "cultmesh://aetheria/assets/manifest", "cultmesh://aetheria/eve/surfaces/aetheria.daemon.game", "aetheria.daemon.move_intent", "sai-vn-scene-stage", "norn-graph-scene-projection", "tex-math-scene-projection", "norn.map", "cultmesh://aetheria/norn/map", "sai.vn", "norn.graph", "tex.math", "sidecar-advertised-plugin-abi", "aetheria.daemon.commands", "aetheria.eve_command_acceptance_status.v1"] + "contains": ["LowerCarriesProviderAdvertisedWorldBoundary", "LowerBuildsProviderAgnosticSceneGraphFromSurfaceTree", "LowerExtractsPlayableArpgWorldFromGenericScene3dSurface", "GenericClientSessionConsumesAetheriaPlayableWorldSnapshotWithoutAetheriaTypes", "GenericProviderConnectionAppliesLiveSnapshotsAndSubmitsCommandsThroughSink", "ProviderSurfaceDocumentSourceFeedsPlayableClientWithoutAetheriaTypes", "PlayableWorldRuntimeComposesProviderDocumentsAssetsReceiptsAndSceneSink", "LiveProviderBridgeFeedsPlayableWorldRuntimeThroughTransportPorts", "PlayableWorldClientHostMountsInterfaceProviderWithoutProviderTypes", "PlayableWorldClientBootstrapWiresGenericUnityClientFromProviderInterfaces", "PlayableWorldClientHostSubmitsProviderOwnedMoveVector", "PlayableWorldInputDriverBuildsCameraRelativeMoveVectorWithoutProviderTypes", "PlayableWorldCameraRigFollowsAdvertisedPlayerEntityWithoutProviderTypes", "PlayableWorldPresenterInstantiatesUpdatesAndDespawnsProviderEntities", "LivePlayableWorldClientPresentsProviderSnapshotsAndKeepsCommandsProviderOwned", "LivePlayableWorldClientRefreshesFromProviderSnapshotAfterReceiptWithoutOwningMovement", "AssetManifestMapsProviderAssetRefsToUnityLoadKeysWithoutAetheriaTypes", "AssetManifestCacheTracksPlayableWorldManifestPointerAndLiveUpdates", "AssetManifestDocumentSourceFeedsCacheWithoutChangingSceneLowering", "FakeProviderSurfaceSource", "FakeProviderSurfaceDocumentSource", "FakeCommandReceiptSource", "FakeAssetManifestSource", "FakeAssetManifestDocumentSource", "FakeLiveProviderTransport", "FakeCommandSink", "FakePlayableWorldSceneSink", "FakePlayableWorldProviderComponent", "SaiVisualNovelLowersThroughRuntimeProjectionAdapterWithoutOwningStoryState", "CommandIntentCarriesAdvertisedBoundaryWithoutOwningReceipts", "pending", "reconciled", "world-projection-node", "playable-world-root", "playable-world-entity", "world-field-3d", "arpg-third-person", "cultmesh://aetheria/assets/manifest", "cultmesh://aetheria/eve/surfaces/aetheria.daemon.game", "aetheria.daemon.move_intent", "sai-vn-scene-stage", "norn-graph-scene-projection", "tex-math-scene-projection", "norn.map", "cultmesh://aetheria/norn/map", "sai.vn", "norn.graph", "tex.math", "sidecar-advertised-plugin-abi", "aetheria.daemon.commands", "aetheria.eve_command_acceptance_status.v1"] }, { "path": "tools/eveunity/eveunity-capture-contract.test.mjs",