diff --git a/Aetheria.State.Unity/AetheriaRuntimeCatalogClient.cs b/Aetheria.State.Unity/AetheriaRuntimeCatalogClient.cs index a214fc89b..e003b0971 100644 --- a/Aetheria.State.Unity/AetheriaRuntimeCatalogClient.cs +++ b/Aetheria.State.Unity/AetheriaRuntimeCatalogClient.cs @@ -1,5 +1,6 @@ using GameCult.Aetheria.State.Verse; using GameCult.Mesh; +using EveSurfaceDocument = GameCult.Eve.Surface.EveSurfaceDocument; namespace Aetheria.State.Unity; diff --git a/Aetheria.State.Verify/Program.cs b/Aetheria.State.Verify/Program.cs index 949bc7a15..dad79bbf5 100644 --- a/Aetheria.State.Verify/Program.cs +++ b/Aetheria.State.Verify/Program.cs @@ -919,8 +919,9 @@ static void RequireSharedEvePackagesImportedFromEveRepo(string root) if (!runtimeCultCacheDocumentStore.Contains("CultMesh.OperationBindingRecord(command.Operation)", StringComparison.Ordinal) || !runtimeCultCacheDocumentStore.Contains("CultMesh.OperationBindingRecord(", StringComparison.Ordinal) || !runtimeCultCacheDocumentStore.Contains("routeDescription).ToBinding()", StringComparison.Ordinal) || - !runtimeSurfaceDocuments.Contains("public static GameCult.Mesh.EveSurfaceDocument ToPortableSurface(AetheriaRuntimeSurfaceDocument document)", StringComparison.Ordinal) || - !runtimeSurfaceDocuments.Contains("new GameCult.Mesh.EveSurfaceCommandTemplate(command.Operation)", StringComparison.Ordinal) || + !runtimeSurfaceDocuments.Contains("public static EveUiSurfaceDocument ToPortableSurface(AetheriaRuntimeSurfaceDocument document)", StringComparison.Ordinal) || + !runtimeSurfaceDocuments.Contains("new EveUiCommandTemplate(command.Operation)", StringComparison.Ordinal) || + runtimeSurfaceDocuments.Contains("GameCult.Mesh.EveSurface", StringComparison.Ordinal) || runtimeCultCacheDocumentStore.Contains("new CultMeshOperationBindingDescriptor(", StringComparison.Ordinal) || runtimeSurfaceDocuments.Contains("new CultMeshOperationBindingDescriptor(", StringComparison.Ordinal)) { @@ -3347,7 +3348,7 @@ static void RequireEveRuntimeBootstrap(string root) ".EveSurfaceDocument(surfaceId)", "?.Reactive()", "AetheriaEveRuntimeUnityHooks.TryCreateStateRefResolver(", - "CultMeshReactiveDocument", + "CultMeshReactiveDocument", "ResolveReactiveDaemonSurfaceState(", "DisposeReactiveSurfaceState()", "AetheriaRuntimeSurfaceDocuments.ToEveSurfaceDocument(", @@ -8717,7 +8718,7 @@ static void RequireAetheriaManagedStateAccessorsCoverDomainDocuments(string root "public CultMeshDocumentHandle Catalog { get; }", "public CultMeshDocumentHandle PlayerSettings { get; }", "public static bool TryResolveEveSurface(", - "public CultMeshDocumentHandle? EveSurfaceDocument(", + "public CultMeshDocumentHandle? EveSurfaceDocument(", "public CultMeshDocumentHandle RtsViewport(", "public CultMeshDocumentHandle ObjectsViewport(", "public CultMeshDocumentHandle GravityViewport(", @@ -11551,11 +11552,12 @@ static void RequireDaemonVersePublication(string root) "Daemon Eve surface state lowering still lives in Aetheria.State projector chaff instead of the runtime surface documents."); } - if (!runtimeSurfaceDocuments.Contains("public static GameCult.Mesh.EveSurfaceDocument ToPortableSurface(AetheriaRuntimeSurfaceDocument document)", StringComparison.Ordinal) || - !runtimeSurfaceDocuments.Contains("GameCult.Mesh.EveSurfaceCommandTemplate", StringComparison.Ordinal) || - !runtimeSurfaceDocuments.Contains("GameCult.Mesh.EveSurfaceComponent", StringComparison.Ordinal)) + if (!runtimeSurfaceDocuments.Contains("public static EveUiSurfaceDocument ToPortableSurface(AetheriaRuntimeSurfaceDocument document)", StringComparison.Ordinal) || + !runtimeSurfaceDocuments.Contains("new EveUiCommandTemplate(command.Operation)", StringComparison.Ordinal) || + !runtimeSurfaceDocuments.Contains("new EveUiSurfaceComponent(", StringComparison.Ordinal) || + runtimeSurfaceDocuments.Contains("GameCult.Mesh.EveSurface", StringComparison.Ordinal)) { - throw new InvalidOperationException("Runtime surface documents no longer lower daemon surfaces into portable CultMesh Eve surface documents."); + throw new InvalidOperationException("Runtime surface documents no longer lower daemon surfaces into canonical Eve surface documents published through CultMesh."); } if (!daemonDocuments.Contains("AetheriaRuntimeDaemonCommandKinds", StringComparison.Ordinal)) @@ -12350,10 +12352,10 @@ static void RequireUnityRuntimeCatalogClientUsesManagedDocument(string root) var requiredSymbols = new[] { - "using MeshEveSurfaceDocument = GameCult.Mesh.EveSurfaceDocument;", + "using EveSurfaceDocument = GameCult.Eve.Surface.EveSurfaceDocument;", "CultMeshDocumentHandle catalog", "public CultMeshDocumentHandle Catalog", - "public CultMeshDocumentHandle? EveSurfaceDocument(", + "public CultMeshDocumentHandle? EveSurfaceDocument(", "AetheriaClientEveSurface.Game => GameSurface", "AetheriaClientEveSurface.Editor => EditorSurface" }; @@ -12370,7 +12372,7 @@ static void RequireUnityRuntimeCatalogClientUsesManagedDocument(string root) var requiredVerseClientSymbols = new[] { "BootstrapCatalogDocument(", - "Document(", + "Document(", "AetheriaRuntimeVerseRecordKeys.DaemonGameSurface", "AetheriaRuntimeVerseRecordKeys.DaemonEditorSurface" }; @@ -12562,7 +12564,7 @@ static void RequireAetheriaRuntimeVerseClientContract(string root) if (File.Exists(surfaceStatePath)) { throw new InvalidOperationException( - "AetheriaRuntimeEveSurfaceState.cs is legacy surface-state cruft; daemon UI surfaces must publish GameCult.Mesh.EveSurfaceDocument."); + "AetheriaRuntimeEveSurfaceState.cs is legacy surface-state cruft; daemon UI surfaces must publish GameCult.Eve.Surface.EveSurfaceDocument."); } var requiredClientSymbols = new[] @@ -12585,7 +12587,7 @@ static void RequireAetheriaRuntimeVerseClientContract(string root) "public static CultRecordKey StarbridgeSessionSummary", "new CultRecordKey(\"daemon:aetheria.starbridge.session.latest.v1\")", "Document(", - "typeof(MeshEveSurfaceDocument)", + "typeof(EveSurfaceDocument)", "private AetheriaClientState? _aetheriaState", "private CultMeshReactiveDocument? _managedDaemonFrame", "private CultMeshReactiveDocument? _managedCatalog", @@ -16715,9 +16717,9 @@ static void RequireRuntimeStateReaderOwnsUnityStateAcquisition(string root) var requiredSurfaceDocumentSymbols = new[] { "public static class AetheriaRuntimeSurfaceDocuments", - "public static GameCult.Mesh.EveSurfaceDocument ToPortableSurface(AetheriaRuntimeSurfaceDocument document)", + "public static EveUiSurfaceDocument ToPortableSurface(AetheriaRuntimeSurfaceDocument document)", "public static EveUiSurfaceDocument ToEveSurfaceDocument(AetheriaRuntimeSurfaceDocument document)", - "public static EveUiSurfaceDocument ToEveSurfaceDocument(GameCult.Mesh.EveSurfaceDocument document)", + "public static EveUiSurfaceDocument ToEveSurfaceDocument(EveUiSurfaceDocument document)", "public static EveUiSurfaceDocument ResolveStateRefs(", "CultMeshStateRefResolver? stateRefResolver", "ResolvePropRefs(props, resolveStateRef)", @@ -17059,11 +17061,11 @@ static void RequireRuntimeStateReaderOwnsUnityStateAcquisition(string root) "public CultMeshDocumentHandle AuthorityPolicy { get; }", "public CultMeshDocumentHandle DaemonFrame { get; }", "public CultMeshDocumentHandle DaemonSoaView { get; }", - "using MeshEveSurfaceDocument = GameCult.Mesh.EveSurfaceDocument;", - "public CultMeshDocumentHandle GameSurface { get; }", - "public CultMeshDocumentHandle GameTuiSurface { get; }", - "public CultMeshDocumentHandle EditorSurface { get; }", - "public CultMeshDocumentHandle EditorTuiSurface { get; }", + "using EveSurfaceDocument = GameCult.Eve.Surface.EveSurfaceDocument;", + "public CultMeshDocumentHandle GameSurface { get; }", + "public CultMeshDocumentHandle GameTuiSurface { get; }", + "public CultMeshDocumentHandle EditorSurface { get; }", + "public CultMeshDocumentHandle EditorTuiSurface { get; }", "public CultMeshDocumentHandle Catalog { get; }", "public CultMeshDocumentHandle LoadoutTemplates { get; }", "public CultMeshDocumentHandle PlayerSettings { get; }", diff --git a/Aetheria.State/AetheriaDocumentRegistry.cs b/Aetheria.State/AetheriaDocumentRegistry.cs index 47f9a9a60..bf15454bf 100644 --- a/Aetheria.State/AetheriaDocumentRegistry.cs +++ b/Aetheria.State/AetheriaDocumentRegistry.cs @@ -1,6 +1,7 @@ using Aetheria.State.Documents; using GameCult.Caching; using GameCult.Aetheria.State.Verse; +using GameCult.Eve.Surface; using GameCult.Mesh; using GameCult.Networking; diff --git a/Aetheria.State/AetheriaEveCommandBridge.cs b/Aetheria.State/AetheriaEveCommandBridge.cs index 4bb546d97..8d7659616 100644 --- a/Aetheria.State/AetheriaEveCommandBridge.cs +++ b/Aetheria.State/AetheriaEveCommandBridge.cs @@ -1,6 +1,7 @@ using Aetheria.State.Documents; using GameCult.Aetheria.State.Verse; using GameCult.Mesh; +using EveSurfaceDocument = GameCult.Eve.Surface.EveSurfaceDocument; namespace Aetheria.State; diff --git a/Aetheria.State/AetheriaEveSurfaceDocuments.cs b/Aetheria.State/AetheriaEveSurfaceDocuments.cs index 2016f6517..abf468cb9 100644 --- a/Aetheria.State/AetheriaEveSurfaceDocuments.cs +++ b/Aetheria.State/AetheriaEveSurfaceDocuments.cs @@ -4,9 +4,11 @@ using System.Linq; using Aetheria.State.Documents; using GameCult.Aetheria.State.Verse; using GameCult.Mesh; -using EveSurfaceComponent = GameCult.Mesh.EveSurfaceComponent; -using EveSurfaceDocument = GameCult.Mesh.EveSurfaceDocument; -using EveSurfaceTree = GameCult.Mesh.EveSurfaceTree; +using EveCommandTemplate = GameCult.Eve.Surface.EveCommandTemplate; +using EveStyleToken = GameCult.Eve.Surface.EveStyleToken; +using EveSurfaceComponent = GameCult.Eve.Surface.EveSurfaceComponent; +using EveSurfaceDocument = GameCult.Eve.Surface.EveSurfaceDocument; +using EveSurfaceTree = GameCult.Eve.Surface.EveSurfaceTree; namespace Aetheria.State; @@ -91,10 +93,10 @@ public static class AetheriaEveSurfaceDocuments "card", [("title", "Corporations")], Node("aetheria.catalog.corporation.rows", "inspector.kv", [], corporations))), - Array.Empty()), + Array.Empty()), new[] { - new EveSurfaceCommandTemplate(refreshCommand.ToBinding()) + new EveCommandTemplate(refreshCommand.ToBinding()) }); } @@ -175,10 +177,10 @@ public static class AetheriaEveSurfaceDocuments ("runtime", runtimeSession?.RuntimeId ?? ""), ("started", runtimeSession?.StartedAtUtc ?? ""), ("lastSeen", runtimeSession?.LastSeenAtUtc ?? "")))), - Array.Empty()), + Array.Empty()), new[] { - new EveSurfaceCommandTemplate(refreshCommand.ToBinding()) + new EveCommandTemplate(refreshCommand.ToBinding()) }); } diff --git a/Aetheria.State/AetheriaStateNode.cs b/Aetheria.State/AetheriaStateNode.cs index a2f1be800..0e61c2837 100644 --- a/Aetheria.State/AetheriaStateNode.cs +++ b/Aetheria.State/AetheriaStateNode.cs @@ -8,6 +8,7 @@ using GameCult.Caching.MessagePack; using GameCult.Mesh; using GameCult.Networking; using R3; +using EveSurfaceDocument = GameCult.Eve.Surface.EveSurfaceDocument; namespace Aetheria.State; diff --git a/Aetheria.State/docs/cultmesh-cross-runtime-primitives.md b/Aetheria.State/docs/cultmesh-cross-runtime-primitives.md index 584e59567..30a2017d4 100644 --- a/Aetheria.State/docs/cultmesh-cross-runtime-primitives.md +++ b/Aetheria.State/docs/cultmesh-cross-runtime-primitives.md @@ -75,7 +75,7 @@ First implementation footholds now exist in CultLib: - `E:/Projects/CultLib/src/GameCult.Mesh/CultMeshPrimitives.cs` also exposes fluent operation/query context builders, with `CultMesh.OperationContextFor(...)` and `CultMesh.QueryContextFor(...)` entrypoints. Application code should read like a typed Verse call, not like manual transport setup. - `E:/Projects/CultLib/src/GameCult.Geometry/CultGeometryPrimitives.cs` defines shared `CultVec2`, `CultVec3`, `CultRect`, `CultCircle`, and `CultSphere` values for query and physics contracts. - `E:/Projects/CultLib/packages/cultmesh-ts/src/index.ts` now exposes TS `CultMeshVec2`, `CultMeshRect`, `CultMeshViewportRequest`, `CultMeshQuerySurface`, `CultMeshQueryContext`, `CultMeshOperationHandle`, `CultMeshOperationContext`, `CultMeshOperationPayload`, `CultMeshDocumentHandle`, `CultMeshDocumentCatalog`, `CultMeshCollectionHandle`, `CultMeshStatePointer`, `CultMeshStateBindingDescriptor`, `CultMeshOperationBindingDescriptor`, `CultMeshOperationInvocationDescriptor`, native slice descriptors, authority claims, route hints, fluent context builders, and handle helpers like `CultMesh.rectFromBounds(...)`, `CultMesh.viewportRequest(...)`, `CultMesh.query(...)`, `CultMesh.querySource(...)`, `CultMesh.operation(...)`, `CultMesh.document(...)`, `CultMesh.documents(...)`, `CultMesh.collection(...)`, `CultMesh.operationPayload(...)`, `CultMesh.statePointer(...)`, `CultMesh.stateBinding(...)`, `CultMesh.operationBinding(...)`, `CultMesh.operationInvocation(...)`, `CultMesh.nativeSliceView(...)`, `CultMesh.operationContextFor(...)`, and `CultMesh.queryContextFor(...)`. -- `Packages/org.gamecult.aetheria.state/Runtime/AetheriaRuntimePlayerSettingsSurfaceBuilder.cs` and `GameCult.Mesh.EveSurfaceDocument` now expose component state bindings as CultMesh-owned portable binding records. Eve no longer owns a parallel live binding DTO, and Aetheria no longer owns a parallel persisted Eve surface state. Aetheria can build runtime surface source data, then publishes the shared CultMesh surface document before renderers lower it. +- `Packages/org.gamecult.aetheria.state/Runtime/AetheriaRuntimePlayerSettingsSurfaceBuilder.cs` builds Aetheria runtime surface source data, then lowers it to the canonical `GameCult.Eve.Surface.EveSurfaceDocument` published through CultMesh. CultMesh owns state and operation binding descriptors; Eve owns the surface document and CultUI composition model. Mesh no longer defines a parallel Eve surface DTO. - `E:/Projects/Eve/packages/org.gamecult.eve.surface/Runtime/EveSurfaceDocument.cs` also exposes component `EmbeddedDocuments` as first-class CultUI slots. Aetheria runtime surfaces mirror that shape with `AetheriaRuntimeEmbeddedDocumentSlot`, so daemon-owned UI can compose nested synced surfaces such as inventory dropdowns without a Unity-only model, facade, or projector. - Aetheria and Eve live command templates now carry `CultMeshOperationBindingDescriptor`. Eve command requests carry `CultMeshOperationInvocationDescriptor` plus `CultMeshOperationPayload`, so renderer click/change events preserve operation id, schema, route hint, idempotency, and scalar field reads as shared CultMesh metadata. Legacy `command`, `label`, `transport`, and string payload fields remain compatibility projections and persisted DTO fields, but the live API no longer exposes raw command-string/dictionary constructors; controls point at typed CultMesh operations and renderers build requests from shared CultMesh primitives. - `Packages/org.gamecult.aetheria.state/Runtime/AetheriaRuntimeDaemonOperationsClient.cs` is now a typed operation handle surface that returns `CultMeshOperationReceipt` from semantic verbs such as `SetMoveVector`, `SetTarget`, `DockNearest`, and inventory transfers. The lower-level daemon command envelope remains an internal transport wrapper, but public client code should receive shared CultMesh receipts, not Aetheria-specific command envelopes. diff --git a/Assets/Scripts/Tests/DaemonRuntimeDocumentTests.cs b/Assets/Scripts/Tests/DaemonRuntimeDocumentTests.cs index 0a0f9a763..6cc37b383 100644 --- a/Assets/Scripts/Tests/DaemonRuntimeDocumentTests.cs +++ b/Assets/Scripts/Tests/DaemonRuntimeDocumentTests.cs @@ -13,7 +13,7 @@ using EveSurfaceCommandRequest = GameCult.Eve.Surface.EveSurfaceCommandRequest; using EveSurfaceComponent = GameCult.Eve.Surface.EveSurfaceComponent; using EveSurfaceDocument = GameCult.Eve.Surface.EveSurfaceDocument; using EveSurfaceTree = GameCult.Eve.Surface.EveSurfaceTree; -using MeshEveSurfaceDocument = GameCult.Mesh.EveSurfaceDocument; +using EveSurfaceDocument = GameCult.Eve.Surface.EveSurfaceDocument; public class DaemonRuntimeDocumentTests { @@ -4351,25 +4351,25 @@ public class DaemonRuntimeDocumentTests .GetAwaiter() .GetResult(); client - .MutableDocument( + .MutableDocument( AetheriaRuntimeVerseRecordKeys.DaemonGameSurface) .ReplaceAsync(AetheriaRuntimeSurfaceDocuments.ToPortableSurface(result.GameSurface)) .GetAwaiter() .GetResult(); client - .MutableDocument( + .MutableDocument( AetheriaRuntimeVerseRecordKeys.DaemonGameTuiSurface) .ReplaceAsync(AetheriaRuntimeSurfaceDocuments.ToPortableSurface(result.GameTuiSurface)) .GetAwaiter() .GetResult(); client - .MutableDocument( + .MutableDocument( AetheriaRuntimeVerseRecordKeys.DaemonEditorSurface) .ReplaceAsync(AetheriaRuntimeSurfaceDocuments.ToPortableSurface(result.EditorSurface)) .GetAwaiter() .GetResult(); client - .MutableDocument( + .MutableDocument( AetheriaRuntimeVerseRecordKeys.DaemonEditorTuiSurface) .ReplaceAsync(AetheriaRuntimeSurfaceDocuments.ToPortableSurface(result.EditorTuiSurface)) .GetAwaiter() diff --git a/GameCult.Eve.Surface.csproj b/GameCult.Eve.Surface.csproj index 95862dadf..d68e11cb2 100644 --- a/GameCult.Eve.Surface.csproj +++ b/GameCult.Eve.Surface.csproj @@ -47,6 +47,7 @@ + @@ -97,6 +98,9 @@ E:\Projects\Brokkr\surfaces\unity\Packages\com.gamecult.brokkr\Plugins\CultMesh\GameCult.Caching.dll + + E:\Projects\Brokkr\surfaces\unity\Packages\com.gamecult.brokkr\Plugins\CultMesh\MessagePack.Annotations.dll + E:\Projects\Aetheria\Assets\Plugins\QuickGraph.dll diff --git a/Packages/org.gamecult.aetheria.eve-runtime/Runtime/AetheriaEveSurfacePresenter.cs b/Packages/org.gamecult.aetheria.eve-runtime/Runtime/AetheriaEveSurfacePresenter.cs index 7f594cc60..e26b7567d 100644 --- a/Packages/org.gamecult.aetheria.eve-runtime/Runtime/AetheriaEveSurfacePresenter.cs +++ b/Packages/org.gamecult.aetheria.eve-runtime/Runtime/AetheriaEveSurfacePresenter.cs @@ -5,7 +5,7 @@ using GameCult.Eve.Surface; using GameCult.Mesh; using UnityEngine; using UnityEngine.UIElements; -using MeshEveSurfaceDocument = GameCult.Mesh.EveSurfaceDocument; +using EveSurfaceDocument = GameCult.Eve.Surface.EveSurfaceDocument; #nullable enable @@ -36,7 +36,7 @@ namespace GameCult.Aetheria.EveRuntime private string _mountedSurfaceId = ""; private long _mountedSurfaceVersion = -1; private string _mountedSurfaceUpdatedAtUtc = ""; - private CultMeshReactiveDocument? _reactiveSurfaceState; + private CultMeshReactiveDocument? _reactiveSurfaceState; private string _reactiveSurfaceStatePath = ""; private string _reactiveSurfaceId = ""; private static readonly AetheriaEveUnitySurfaceChrome RootOnlyChrome = new AetheriaEveUnitySurfaceChrome @@ -141,14 +141,14 @@ namespace GameCult.Aetheria.EveRuntime "unity-eve-surface-presenter")); } - private MeshEveSurfaceDocument? ReadDaemonSurfaceState( + private EveSurfaceDocument? ReadDaemonSurfaceState( AetheriaRuntimeStateBootReport stateBoot) { var reactive = ResolveReactiveDaemonSurfaceState(stateBoot); return reactive?.Current; } - private CultMeshReactiveDocument? ResolveReactiveDaemonSurfaceState( + private CultMeshReactiveDocument? ResolveReactiveDaemonSurfaceState( AetheriaRuntimeStateBootReport stateBoot) { if (_reactiveSurfaceState != null && @@ -169,7 +169,7 @@ namespace GameCult.Aetheria.EveRuntime return _reactiveSurfaceState; } - private CultMeshReactiveDocument? CreateReactiveDaemonSurfaceState( + private CultMeshReactiveDocument? CreateReactiveDaemonSurfaceState( AetheriaRuntimeStateBootReport stateBoot) { try diff --git a/Packages/org.gamecult.aetheria.state/Runtime/AetheriaClientState.cs b/Packages/org.gamecult.aetheria.state/Runtime/AetheriaClientState.cs index c7e7969d3..4804aac6f 100644 --- a/Packages/org.gamecult.aetheria.state/Runtime/AetheriaClientState.cs +++ b/Packages/org.gamecult.aetheria.state/Runtime/AetheriaClientState.cs @@ -2,7 +2,7 @@ using System; using System.Collections.Generic; using GameCult.Mesh; using MessagePack; -using MeshEveSurfaceDocument = GameCult.Mesh.EveSurfaceDocument; +using EveSurfaceDocument = GameCult.Eve.Surface.EveSurfaceDocument; #nullable enable @@ -42,10 +42,10 @@ namespace GameCult.Aetheria.State.Verse CultMeshDocumentHandle authorityPolicy, CultMeshDocumentHandle daemonFrame, CultMeshDocumentHandle daemonSoaView, - CultMeshDocumentHandle gameSurface, - CultMeshDocumentHandle gameTuiSurface, - CultMeshDocumentHandle editorSurface, - CultMeshDocumentHandle editorTuiSurface, + CultMeshDocumentHandle gameSurface, + CultMeshDocumentHandle gameTuiSurface, + CultMeshDocumentHandle editorSurface, + CultMeshDocumentHandle editorTuiSurface, CultMeshDocumentHandle catalog, CultMeshDocumentHandle loadoutTemplates, CultMeshDocumentHandle playerSettings, @@ -127,13 +127,13 @@ namespace GameCult.Aetheria.State.Verse public CultMeshDocumentHandle LoadoutTemplates { get; } - public CultMeshDocumentHandle GameSurface { get; } + public CultMeshDocumentHandle GameSurface { get; } - public CultMeshDocumentHandle GameTuiSurface { get; } + public CultMeshDocumentHandle GameTuiSurface { get; } - public CultMeshDocumentHandle EditorSurface { get; } + public CultMeshDocumentHandle EditorSurface { get; } - public CultMeshDocumentHandle EditorTuiSurface { get; } + public CultMeshDocumentHandle EditorTuiSurface { get; } public CultMeshDocumentHandle PlayerSettings { get; } @@ -191,7 +191,7 @@ namespace GameCult.Aetheria.State.Verse return false; } - public CultMeshDocumentHandle? EveSurfaceDocument( + public CultMeshDocumentHandle? EveSurfaceDocument( string? surfaceId) { if (!TryResolveEveSurface(surfaceId, out var surface)) diff --git a/Packages/org.gamecult.aetheria.state/Runtime/AetheriaRuntimeMainMenuSurfaceBuilder.cs b/Packages/org.gamecult.aetheria.state/Runtime/AetheriaRuntimeMainMenuSurfaceBuilder.cs index d0bf0c34b..c0f88f60e 100644 --- a/Packages/org.gamecult.aetheria.state/Runtime/AetheriaRuntimeMainMenuSurfaceBuilder.cs +++ b/Packages/org.gamecult.aetheria.state/Runtime/AetheriaRuntimeMainMenuSurfaceBuilder.cs @@ -333,13 +333,13 @@ namespace GameCult.Aetheria.State.Verse .ToArray()); } - private static GameCult.Mesh.EveSurfaceBuilder MainMenuSurface( + private static GameCult.Eve.Surface.EveSurfaceBuilder MainMenuSurface( string surfaceId, string title, string updatedAtUtc, long version) { - var builder = GameCult.Mesh.EveSurface.Create(surfaceId) + var builder = GameCult.Eve.Surface.EveSurface.Create(surfaceId) .Provider(ProviderId, ProviderKind) .Version(version) .UpdatedAtUtc(updatedAtUtc); diff --git a/Packages/org.gamecult.aetheria.state/Runtime/AetheriaRuntimeSurfaceDocuments.cs b/Packages/org.gamecult.aetheria.state/Runtime/AetheriaRuntimeSurfaceDocuments.cs index e58fc7876..380654e09 100644 --- a/Packages/org.gamecult.aetheria.state/Runtime/AetheriaRuntimeSurfaceDocuments.cs +++ b/Packages/org.gamecult.aetheria.state/Runtime/AetheriaRuntimeSurfaceDocuments.cs @@ -369,28 +369,28 @@ namespace GameCult.Aetheria.State.Verse public static class AetheriaRuntimeSurfaceDocuments { - public static GameCult.Mesh.EveSurfaceDocument ToPortableSurface(AetheriaRuntimeSurfaceDocument document) + public static EveUiSurfaceDocument ToPortableSurface(AetheriaRuntimeSurfaceDocument document) { if (document == null) throw new ArgumentNullException(nameof(document)); - return new GameCult.Mesh.EveSurfaceDocument( + return new EveUiSurfaceDocument( document.ProviderId, document.ProviderKind, document.Title, document.Version, document.UpdatedAtUtc, - new GameCult.Mesh.EveSurfaceTree( + new EveUiSurfaceTree( document.Surface.Id, - ToPortableComponent(document.Surface.Root), + ToEveSurfaceComponent(document.Surface.Root), document.Surface.Styles - .Select(style => new GameCult.Mesh.EveSurfaceStyleToken(style.Name, style.Value)) + .Select(style => new EveUiStyleToken(style.Name, style.Value)) .ToArray()), document.Commands - .Select(command => new GameCult.Mesh.EveSurfaceCommandTemplate(command.Operation)) + .Select(command => new EveUiCommandTemplate(command.Operation)) .ToArray()); } - public static AetheriaRuntimeSurfaceDocument FromPortableSurface(GameCult.Mesh.EveSurfaceDocument document) + public static AetheriaRuntimeSurfaceDocument FromPortableSurface(EveUiSurfaceDocument document) { if (document == null) throw new ArgumentNullException(nameof(document)); @@ -408,7 +408,7 @@ namespace GameCult.Aetheria.State.Verse .ToArray()), document.Commands .Select(command => new AetheriaRuntimeSurfaceCommandTemplate( - FromPortableOperation(command.Operation))) + command.Operation)) .ToArray()); } @@ -417,18 +417,18 @@ namespace GameCult.Aetheria.State.Verse return ToEveSurfaceDocument(document, null); } - public static EveUiSurfaceDocument ToEveSurfaceDocument(GameCult.Mesh.EveSurfaceDocument document) + public static EveUiSurfaceDocument ToEveSurfaceDocument(EveUiSurfaceDocument document) { return ToEveSurfaceDocument(document, null); } public static EveUiSurfaceDocument ToEveSurfaceDocument( - GameCult.Mesh.EveSurfaceDocument document, + EveUiSurfaceDocument document, CultMeshStateRefResolver? stateRefResolver) { if (document == null) throw new ArgumentNullException(nameof(document)); - return ToEveSurfaceDocument(FromPortableSurface(document), stateRefResolver); + return ResolveStateRefs(document, stateRefResolver); } public static EveUiSurfaceDocument ToEveSurfaceDocument( @@ -437,25 +437,7 @@ namespace GameCult.Aetheria.State.Verse { if (document == null) throw new ArgumentNullException(nameof(document)); - var surface = new EveUiSurfaceDocument( - "surface-state", - "gamecult.eve.surface.v1", - document.ProviderId, - document.ProviderKind, - document.Title, - document.Version, - document.UpdatedAtUtc, - new EveUiSurfaceTree( - document.Surface.Id, - ToEveSurfaceComponent(document.Surface.Root), - document.Surface.Styles - .Select(style => new EveUiStyleToken(style.Name, style.Value)) - .ToArray()), - document.Commands - .Select(command => new EveUiCommandTemplate(command.Operation)) - .ToArray()); - - return ResolveStateRefs(surface, stateRefResolver); + return ResolveStateRefs(ToPortableSurface(document), stateRefResolver); } public static EveUiSurfaceDocument ResolveStateRefs( @@ -533,6 +515,12 @@ namespace GameCult.Aetheria.State.Verse return binding; } + private static CultMeshStateBindingDescriptor FromPortableStateBinding( + CultMeshStateBindingDescriptor binding) + { + return binding; + } + private static EveUiSurfaceComponent ResolveStateRefs( EveUiSurfaceComponent component, Func resolveStateRef) @@ -562,7 +550,7 @@ namespace GameCult.Aetheria.State.Verse return resolved; } - private static AetheriaRuntimeSurfaceComponent FromPortableComponent(GameCult.Mesh.EveSurfaceComponent component) + private static AetheriaRuntimeSurfaceComponent FromPortableComponent(EveUiSurfaceComponent component) { return new AetheriaRuntimeSurfaceComponent( component.Id, @@ -574,71 +562,14 @@ namespace GameCult.Aetheria.State.Verse } private static AetheriaRuntimeEmbeddedDocumentSlot FromPortableEmbeddedDocumentSlot( - GameCult.Mesh.EveEmbeddedDocumentSlot slot) + EveUiEmbeddedDocumentSlot slot) { return new AetheriaRuntimeEmbeddedDocumentSlot( slot.SlotId, slot.DocumentId, slot.SchemaId, slot.PresentationKind, - FromPortableRoute(slot.RouteHint)); - } - - private static CultMeshStateBindingDescriptor FromPortableStateBinding( - GameCult.Mesh.EveSurfaceStateBinding binding) - { - return CultMesh.StateBindingRecord( - binding.TargetProp, - binding.PointerId, - binding.SourceId, - binding.SchemaId, - binding.RouteHint.Kind, - binding.RouteHint.Description).ToBinding(); - } - - private static CultMeshOperationBindingDescriptor FromPortableOperation( - GameCult.Mesh.EveSurfaceOperationBinding operation) - { - return CultMesh.OperationBindingRecord( - operation.OperationId, - operation.Label, - operation.SchemaId, - operation.RouteHint.Kind, - operation.RouteHint.Description).ToBinding(); - } - - private static CultMeshRouteHint FromPortableRoute(GameCult.Mesh.EveSurfaceRouteHint route) - { - return new CultMeshRouteRecord(route.Kind, route.Description).ToRoute(CultMeshRouteHint.Automatic); - } - - private static GameCult.Mesh.EveSurfaceComponent ToPortableComponent(AetheriaRuntimeSurfaceComponent component) - { - var props = new Dictionary(component.Props, StringComparer.Ordinal); - AetheriaRuntimeSurfaceStateBindings.AddPointerProps(props, component.StateBindings); - - return new GameCult.Mesh.EveSurfaceComponent( - component.Id, - component.Kind, - props, - component.Children.Select(ToPortableComponent).ToArray(), - component.StateBindings - .Select(GameCult.Mesh.EveSurfaceStateBinding.FromDescriptor) - .ToArray(), - component.EmbeddedDocuments - .Select(ToPortableEmbeddedDocumentSlot) - .ToArray()); - } - - private static GameCult.Mesh.EveEmbeddedDocumentSlot ToPortableEmbeddedDocumentSlot( - AetheriaRuntimeEmbeddedDocumentSlot slot) - { - return new GameCult.Mesh.EveEmbeddedDocumentSlot( - slot.SlotId, - slot.DocumentId, - slot.SchemaId, - slot.PresentationKind, - GameCult.Mesh.EveSurfaceRouteHint.FromRoute(slot.RouteHint)); + slot.RouteHint); } private static void ResolvePropRefs( diff --git a/Packages/org.gamecult.aetheria.state/Runtime/AetheriaRuntimeVerseClient.cs b/Packages/org.gamecult.aetheria.state/Runtime/AetheriaRuntimeVerseClient.cs index df691df8c..4f6cd43b6 100644 --- a/Packages/org.gamecult.aetheria.state/Runtime/AetheriaRuntimeVerseClient.cs +++ b/Packages/org.gamecult.aetheria.state/Runtime/AetheriaRuntimeVerseClient.cs @@ -10,7 +10,7 @@ using GameCult.Mesh; using GameCult.Networking; using R3; using EveUiCommandRequest = GameCult.Eve.Surface.EveSurfaceCommandRequest; -using MeshEveSurfaceDocument = GameCult.Mesh.EveSurfaceDocument; +using EveSurfaceDocument = GameCult.Eve.Surface.EveSurfaceDocument; #nullable enable @@ -122,7 +122,7 @@ namespace GameCult.Aetheria.State.Verse typeof(AetheriaRuntimePlayerSettingsDocument), typeof(AetheriaRuntimeVerseHostSettingsDocument), typeof(AetheriaRuntimeSurfaceDocument), - typeof(MeshEveSurfaceDocument), + typeof(EveSurfaceDocument), typeof(AetheriaRuntimeDaemonCommandDocument), typeof(AetheriaRuntimeEveCommandDocument) }; @@ -421,13 +421,13 @@ namespace GameCult.Aetheria.State.Verse latestFrameDocument, Document( AetheriaRuntimeVerseRecordKeys.DaemonSoaViewLatest), - Document( + Document( AetheriaRuntimeVerseRecordKeys.DaemonGameSurface), - Document( + Document( AetheriaRuntimeVerseRecordKeys.DaemonGameTuiSurface), - Document( + Document( AetheriaRuntimeVerseRecordKeys.DaemonEditorSurface), - Document( + Document( AetheriaRuntimeVerseRecordKeys.DaemonEditorTuiSurface), catalogDocument, loadoutTemplatesDocument, diff --git a/docs/aetheria-verse-client-contract.md b/docs/aetheria-verse-client-contract.md index 397daf295..0b8f78260 100644 --- a/docs/aetheria-verse-client-contract.md +++ b/docs/aetheria-verse-client-contract.md @@ -134,11 +134,12 @@ The daemon already publishes game and editor Eve surface records at these keys: `AetheriaRuntimeVerseRecordKeys` exposes those keys and `AetheriaRuntimeVerseClient` exposes typed reads, mutable state pointers, and -`WatchRecord(CultRecordKey)` subscriptions for -all four. The Eve surface document contract lives in CultMesh because Eve is the -UI projection language, not an Aetheria persisted-state owner. A Unity client, +`WatchRecord(CultRecordKey)` +subscriptions for all four. Eve owns the surface document and composition DSL; +CultMesh owns the transport, typed handles, state refs, operation bindings, and +route hints that let clients observe and invoke that surface. A Unity client, terminal client, daemon inspector, or later non-C# runtime binding lowers the -same published `GameCult.Mesh.EveSurfaceDocument`. The existing Eve Unity -runtime host can keep resolving Aetheria state refs automatically; it should -consume those refs as part of lowering the shared surface, not as a separate -authority path. +same published `GameCult.Eve.Surface.EveSurfaceDocument`. The existing Eve Unity +runtime host can keep resolving Aetheria state refs automatically; it consumes +those refs as part of lowering the shared surface, not as a separate authority +path. diff --git a/docs/developer-navigation.md b/docs/developer-navigation.md index c058dc378..15f9101d4 100644 --- a/docs/developer-navigation.md +++ b/docs/developer-navigation.md @@ -314,7 +314,7 @@ Work on Unity thin-client migration: Work on Eve/CultUI surfaces: -- `GameCult.Mesh.EveSurfaceDocument` for daemon-published CultUI/Eve surfaces +- `GameCult.Eve.Surface.EveSurfaceDocument` for daemon-published CultUI/Eve surfaces - `Packages/org.gamecult.aetheria.state/Runtime/AetheriaRuntimeSurfaceDocuments.cs` - `Packages/org.gamecult.aetheria.state/Runtime/AetheriaRuntimeEveCommandClient.cs` - `Packages/org.gamecult.aetheria.state/Runtime/AetheriaRuntime*SurfaceBuilder.cs`