From ebd44028a5bc686ed93af515c85f0d36f5532e82 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Thu, 9 Jul 2026 13:14:52 +0100 Subject: [PATCH] Add EveUnity TeX projection shells --- docs/eve-migration-roadmap.md | 33 +++++---- docs/parity-testing-harness.md | 5 +- .../Runtime/EveUiToolkitSurfaceOptions.cs | 3 +- .../TeXMathUiToolkitProjectionAdapter.cs | 69 +++++++++++++++++++ .../Editor/EveUiToolkitSurfaceLowererTests.cs | 24 ++++++- .../eve-runtime-capability.json | 13 ++-- .../Runtime/EveUnitySceneSurfaceLowerer.cs | 5 ++ .../TeXMathUnitySceneProjectionAdapter.cs | 56 +++++++++++++++ .../EveUnitySceneSurfaceLowererTests.cs | 23 ++++++- .../eve-runtime-capability.json | 16 +++-- .../eveunity-scene-split-handoff.json | 18 ++++- scripts/run-aetheria-unity-package-smoke.ps1 | 3 +- scripts/run-eveunity-lifecycle-smoke.ps1 | 3 +- .../run-eveunity-scene-lifecycle-smoke.ps1 | 25 ++++--- ...un-eveunity-scene-provider-shell-smoke.ps1 | 12 +++- ...run-eveunity-scene-split-handoff-smoke.ps1 | 11 ++- ...ntime-owner-conformance-consumer-smoke.ps1 | 10 ++- ...plit-target-conformance-consumer-smoke.ps1 | 1 + tools/parity/parity-manifest.json | 35 ++++++---- 19 files changed, 304 insertions(+), 61 deletions(-) create mode 100644 packages/org.gamecult.eve.unity-uitoolkit/Runtime/TeXMathUiToolkitProjectionAdapter.cs create mode 100644 runtimes/incubating/eve-unity-scene/Runtime/TeXMathUnitySceneProjectionAdapter.cs diff --git a/docs/eve-migration-roadmap.md b/docs/eve-migration-roadmap.md index 1bcf778..7a89fae 100644 --- a/docs/eve-migration-roadmap.md +++ b/docs/eve-migration-roadmap.md @@ -391,15 +391,16 @@ Recently cut: are available, but Sai does not own their graph or math semantics. - Runtime/plugin projection claims are now exported as root `runtimePluginProjectionCoverage[]` records. Runtime-owner smokes assert - Unity UI Toolkit support for `sai.vn` and `norn.graph`, Unity scene support - for `sai.vn` and `norn.graph`, the declared TeX gaps, and the pending + Unity UI Toolkit support for `sai.vn`, `norn.graph`, and `tex.math`, Unity + scene support for the same three plugin capabilities, and the pending Electron unsupported Sai projection until its generic lowerer exists. - Provider/runtime/plugin projection coverage is now exported as `providerRuntimePluginProjectionCoverage[]`. The runtime-owner smoke proves the Sai VN provider surface lowers fully in web, lowers in Unity UI Toolkit - with Norn support and TeX as a degraded optional nested plugin, and does not - let UIKit's generic embedded-document path impersonate required Sai VN or - optional Norn graph projection. + with optional independent Norn and TeX nested plugin projection when those + plugins are available, and does not let UIKit's generic embedded-document path + impersonate required Sai VN, optional Norn graph, or optional TeX math + projection. - Runtime/plugin projection gaps are now exported as `runtimePluginProjectionGaps[]`. The runtime-owner smoke asserts Unity and Electron plugin gaps as typed records, so missing Sai, Norn, or TeX projection @@ -430,16 +431,16 @@ Recently cut: `scripts/run-eveunity-scene-capture-contract-smoke.ps1`, while the actual Unity scene PNG/frame artifact remains pending. The scene graph now preserves embedded document slot identity for resolver-backed child surfaces without - owning the nested plugin semantics. Sai and Norn scene projection adapters now - exist; TeX stays unsupported until a scene-space or UI overlay adapter exists - in the Unity scene runtime. + owning the nested plugin semantics. Sai, Norn, and TeX scene projection + adapters now exist as runtime-owned shells; TeX parsing, typesetting, + baseline metrics, and render-cache semantics remain plugin-owned. - Unity scene now has a direct split handoff smoke at `scripts/run-eveunity-scene-split-handoff-smoke.ps1`. The smoke verifies the scene runtime's current source paths for runtime body, scene graph lowering, - Sai/Norn plugin projection, and command transport, does not treat Aetheria - product paths, Sai story state, or Norn implementation state as generic - runtime source, names the required Eve contracts, and keeps capture as an - external proof until EveUnity owns it. + Sai/Norn/TeX plugin projection, and command transport, does not treat + Aetheria product paths, Sai story state, Norn implementation state, or TeX + implementation state as generic runtime source, names the required Eve + contracts, and keeps capture as an external proof until EveUnity owns it. - Runtime split handoff documents now have a catalog-backed schema, `gamecult.eve.runtime_split_handoff.v1`. EveConformance exports that schema so runtime owner repos can consume split target, move set, contract input, @@ -843,9 +844,11 @@ Recently cut: `packages/org.gamecult.eve.unity-uitoolkit/eve-runtime-capability.json`. The parity harness validates that manifest against `gamecult.eve.runtime_capability.v1`, cross-checks supported features, - supported Sai and Norn plugin declarations, the unsupported TeX declaration, - command transport schema, and incubation metadata, then exports the manifest - path and validation errors through the conformance report. + supported Sai, Norn, and TeX plugin projection declarations, command transport + schema, and incubation metadata, then exports the manifest path and validation + errors through the conformance report. Unity owns source-fallback projection + shells only; TeX parsing, typesetting, baseline metrics, and cached render + semantics remain EvePlugins-owned. - Aetheria now consumes the exported conformance pack from its own working directory through `scripts/run-aetheria-conformance-consumer-smoke.ps1`. The smoke asserts the provider pack, `aetheria-world` fixture, `aetheria` diff --git a/docs/parity-testing-harness.md b/docs/parity-testing-harness.md index b7eddeb..ee365ad 100644 --- a/docs/parity-testing-harness.md +++ b/docs/parity-testing-harness.md @@ -31,8 +31,9 @@ manifests. Web uses `web/eve-runtime-capability.json` to make the browser oracle explicit: it consumes provider advertisements, lowers provider-owned surfaces, emits `gamecult.eve.command.v1` intents, and records Chrome headless capture evidence without becoming provider truth. Unity UI Toolkit uses the same path -for its `sai.vn` and `norn.graph` plugin projection adapter proofs while -leaving `tex.math` as explicit unsupported plugin semantics. +for its `sai.vn`, `norn.graph`, and `tex.math` plugin projection adapter proofs +while leaving Sai, Norn, and TeX semantic authority in their independent +sidecar plugin owners. ## Run diff --git a/packages/org.gamecult.eve.unity-uitoolkit/Runtime/EveUiToolkitSurfaceOptions.cs b/packages/org.gamecult.eve.unity-uitoolkit/Runtime/EveUiToolkitSurfaceOptions.cs index e972f4e..b58ae10 100644 --- a/packages/org.gamecult.eve.unity-uitoolkit/Runtime/EveUiToolkitSurfaceOptions.cs +++ b/packages/org.gamecult.eve.unity-uitoolkit/Runtime/EveUiToolkitSurfaceOptions.cs @@ -19,7 +19,8 @@ namespace GameCult.Eve.UnityUIToolkit PluginProjectionAdapters = pluginProjectionAdapters ?? new IEveUiToolkitPluginProjectionAdapter[] { new SaiVisualNovelUiToolkitProjectionAdapter(), - new NornGraphUiToolkitProjectionAdapter() + new NornGraphUiToolkitProjectionAdapter(), + new TeXMathUiToolkitProjectionAdapter() }; } diff --git a/packages/org.gamecult.eve.unity-uitoolkit/Runtime/TeXMathUiToolkitProjectionAdapter.cs b/packages/org.gamecult.eve.unity-uitoolkit/Runtime/TeXMathUiToolkitProjectionAdapter.cs new file mode 100644 index 0000000..51ef3d0 --- /dev/null +++ b/packages/org.gamecult.eve.unity-uitoolkit/Runtime/TeXMathUiToolkitProjectionAdapter.cs @@ -0,0 +1,69 @@ +using System; +using System.Collections.Generic; +using GameCult.Eve.Surface; +using UnityEngine.UIElements; + +#nullable enable + +namespace GameCult.Eve.UnityUIToolkit +{ + public sealed class TeXMathUiToolkitProjectionAdapter : IEveUiToolkitPluginProjectionAdapter + { + public string PluginId => "tex.math"; + + public IReadOnlyList Capabilities { get; } = new[] + { + "embed.tex", + "tex.inline", + "tex.block" + }; + + public bool CanLower(EveSurfaceComponent component) + { + return string.Equals(component.Kind, "embed.tex", StringComparison.Ordinal); + } + + public VisualElement Lower( + EveSurfaceComponent component, + EveSurfaceDocument document, + Action? commandSink) + { + var tex = new VisualElement(); + tex.AddToClassList("eve-plugin-projection"); + tex.AddToClassList("eve-plugin-tex-math"); + tex.AddToClassList("tex-math"); + tex.AddToClassList($"tex-display-{SafeClass(component.GetProp("display", "inline"))}"); + tex.style.flexDirection = FlexDirection.Column; + + var label = component.GetProp("label", "TeX"); + if (!string.IsNullOrWhiteSpace(label)) + { + var labelElement = new Label(label); + labelElement.AddToClassList("tex-math-label"); + tex.Add(labelElement); + } + + var source = component.GetProp("source", component.GetProp("sourceUri", "")); + var sourceElement = new Label(source); + sourceElement.AddToClassList("tex-math-source-fallback"); + tex.Add(sourceElement); + + return tex; + } + + private static string SafeClass(string value) + { + if (string.IsNullOrWhiteSpace(value)) + return "unknown"; + + var characters = value.ToCharArray(); + for (var index = 0; index < characters.Length; index++) + { + if (!char.IsLetterOrDigit(characters[index])) + characters[index] = '-'; + } + + return new string(characters).Trim('-').ToLowerInvariant(); + } + } +} diff --git a/packages/org.gamecult.eve.unity-uitoolkit/Tests/Editor/EveUiToolkitSurfaceLowererTests.cs b/packages/org.gamecult.eve.unity-uitoolkit/Tests/Editor/EveUiToolkitSurfaceLowererTests.cs index 1390f5e..a9d88fb 100644 --- a/packages/org.gamecult.eve.unity-uitoolkit/Tests/Editor/EveUiToolkitSurfaceLowererTests.cs +++ b/packages/org.gamecult.eve.unity-uitoolkit/Tests/Editor/EveUiToolkitSurfaceLowererTests.cs @@ -12,12 +12,13 @@ namespace GameCult.Eve.UnityUIToolkit.Tests public sealed class EveUiToolkitSurfaceLowererTests { [Test] - public void DefaultOptionsExposeSaiAndNornProjectionAdapters() + public void DefaultOptionsExposeSaiNornAndTeXProjectionAdapters() { var options = EveUiToolkitSurfaceOptions.Default; Assert.That(options.FindPluginProjectionAdapter(Component("stage", "vn.stage"))?.PluginId, Is.EqualTo("sai.vn")); Assert.That(options.FindPluginProjectionAdapter(Component("graph", "embed.norn"))?.PluginId, Is.EqualTo("norn.graph")); + Assert.That(options.FindPluginProjectionAdapter(Component("math", "embed.tex"))?.PluginId, Is.EqualTo("tex.math")); } [Test] @@ -58,6 +59,27 @@ namespace GameCult.Eve.UnityUIToolkit.Tests Assert.That(root.ClassListContains("norn-graph"), Is.True); } + [Test] + public void TeXMathLowersThroughRuntimeProjectionAdapterAsSourceFallback() + { + var document = Document(Component( + "math", + "embed.tex", + new Dictionary + { + ["label"] = "Bifrost voting weight", + ["source"] = "\\\\mathrm{votes}(p)=1+\\\\lfloor\\\\log_b(1+p)\\\\rfloor", + ["display"] = "block" + })); + + var root = new EveUiToolkitSurfaceLowerer().Lower(document); + + Assert.That(root.ClassListContains("eve-plugin-projection"), Is.True); + Assert.That(root.ClassListContains("eve-plugin-tex-math"), Is.True); + Assert.That(root.ClassListContains("tex-math"), Is.True); + Assert.That(root.ClassListContains("tex-display-block"), Is.True); + } + [Test] public void EmbeddedDocumentSlotMountsResolverBackedChildSurface() { diff --git a/packages/org.gamecult.eve.unity-uitoolkit/eve-runtime-capability.json b/packages/org.gamecult.eve.unity-uitoolkit/eve-runtime-capability.json index 82cd14b..f431c49 100644 --- a/packages/org.gamecult.eve.unity-uitoolkit/eve-runtime-capability.json +++ b/packages/org.gamecult.eve.unity-uitoolkit/eve-runtime-capability.json @@ -33,14 +33,18 @@ "embed.norn" ], "projectionAdapter": "NornGraphUiToolkitProjectionAdapter" - } - ], - "unsupportedPlugins": [ + }, { "pluginId": "tex.math", - "reason": "Unity UI Toolkit currently preserves embed.tex as generic Eve structure; no adapter exists for the TeX sidecar-advertised projection in this runtime." + "capabilities": [ + "embed.tex", + "tex.inline", + "tex.block" + ], + "projectionAdapter": "TeXMathUiToolkitProjectionAdapter" } ], + "unsupportedPlugins": [], "commandTransport": { "schema": "gamecult.eve.command.v1", "emitter": "EveUiToolkitSurfaceLowerer.EmitCommand", @@ -55,6 +59,7 @@ "ownership": "runtime-lowers-provider-world-surface-without-owning-world-state", "evidencePaths": [ "packages/org.gamecult.eve.unity-uitoolkit/Runtime/EveUiToolkitSurfaceLowerer.cs", + "packages/org.gamecult.eve.unity-uitoolkit/Runtime/TeXMathUiToolkitProjectionAdapter.cs", "packages/org.gamecult.eve.unity-uitoolkit/Tests/Editor/EveUiToolkitSurfaceLowererTests.cs", "web/fixtures/aetheria.provider-advertisement.json" ] diff --git a/runtimes/incubating/eve-unity-scene/Runtime/EveUnitySceneSurfaceLowerer.cs b/runtimes/incubating/eve-unity-scene/Runtime/EveUnitySceneSurfaceLowerer.cs index 632c2ad..ecde456 100644 --- a/runtimes/incubating/eve-unity-scene/Runtime/EveUnitySceneSurfaceLowerer.cs +++ b/runtimes/incubating/eve-unity-scene/Runtime/EveUnitySceneSurfaceLowerer.cs @@ -11,6 +11,7 @@ namespace GameCult.Eve.UnityScene { private static readonly SaiVisualNovelUnitySceneProjectionAdapter SaiVisualNovelAdapter = new SaiVisualNovelUnitySceneProjectionAdapter(); private static readonly NornGraphUnitySceneProjectionAdapter NornGraphAdapter = new NornGraphUnitySceneProjectionAdapter(); + private static readonly TeXMathUnitySceneProjectionAdapter TeXMathAdapter = new TeXMathUnitySceneProjectionAdapter(); public EveUnitySceneProjection Lower( EveSurfaceDocument document, @@ -98,6 +99,8 @@ namespace GameCult.Eve.UnityScene return SaiVisualNovelAdapter.Project(component); if (NornGraphAdapter.CanProject(component)) return NornGraphAdapter.Project(component); + if (TeXMathAdapter.CanProject(component)) + return TeXMathAdapter.Project(component); return null; } @@ -131,6 +134,8 @@ namespace GameCult.Eve.UnityScene return "command-control"; if (string.Equals(componentKind, "embed.norn", StringComparison.Ordinal)) return "norn-graph-scene-projection"; + if (string.Equals(componentKind, "embed.tex", StringComparison.Ordinal)) + return "tex-math-scene-projection"; if (componentKind.StartsWith("embed.", StringComparison.Ordinal)) return "plugin-placeholder"; if (string.Equals(componentKind, "surface.slot", StringComparison.Ordinal)) diff --git a/runtimes/incubating/eve-unity-scene/Runtime/TeXMathUnitySceneProjectionAdapter.cs b/runtimes/incubating/eve-unity-scene/Runtime/TeXMathUnitySceneProjectionAdapter.cs new file mode 100644 index 0000000..c1632b4 --- /dev/null +++ b/runtimes/incubating/eve-unity-scene/Runtime/TeXMathUnitySceneProjectionAdapter.cs @@ -0,0 +1,56 @@ +using System; +using System.Collections.Generic; +using GameCult.Eve.Surface; + +#nullable enable + +namespace GameCult.Eve.UnityScene +{ + public sealed class TeXMathUnitySceneProjectionAdapter + { + public string PluginId => "tex.math"; + + public IReadOnlyList Capabilities { get; } = new[] + { + "embed.tex", + "tex.inline", + "tex.block", + "tex.scene-placement" + }; + + public bool CanProject(EveSurfaceComponent component) + { + return component != null && string.Equals(component.Kind, "embed.tex", StringComparison.Ordinal); + } + + public EveUnityScenePluginProjection Project(EveSurfaceComponent component) + { + if (component == null) throw new ArgumentNullException(nameof(component)); + if (!CanProject(component)) + { + throw new InvalidOperationException( + $"TeX scene projection adapter cannot project component kind '{component.Kind}'."); + } + + return new EveUnityScenePluginProjection( + PluginId, + ProjectionKind(component), + "gamecult.eve.plugin_abi.v1", + "sidecar-advertised-plugin-abi", + Capabilities, + "", + component.GetProp("sourceUri", component.GetProp("source", "")), + "EvePlugins"); + } + + private static string ProjectionKind(EveSurfaceComponent component) + { + var display = component.GetProp("display", "inline"); + if (string.Equals(display, "block", StringComparison.Ordinal)) + return "tex-math-scene-block-fallback-shell"; + if (string.Equals(display, "page", StringComparison.Ordinal)) + return "tex-math-scene-page-fallback-shell"; + return "tex-math-scene-inline-fallback-shell"; + } + } +} diff --git a/runtimes/incubating/eve-unity-scene/Tests/Editor/EveUnitySceneSurfaceLowererTests.cs b/runtimes/incubating/eve-unity-scene/Tests/Editor/EveUnitySceneSurfaceLowererTests.cs index 92976f1..b4d3e17 100644 --- a/runtimes/incubating/eve-unity-scene/Tests/Editor/EveUnitySceneSurfaceLowererTests.cs +++ b/runtimes/incubating/eve-unity-scene/Tests/Editor/EveUnitySceneSurfaceLowererTests.cs @@ -88,6 +88,16 @@ namespace GameCult.Eve.UnityScene.Tests Assert.That(choice.PluginProjection.ProjectionKind, Is.EqualTo("sai-vn-scene-story-command-shell")); Assert.That(choice.PluginProjection.Command, Is.EqualTo("story.choose")); Assert.That(choice.PluginProjection.SemanticOwner, Is.EqualTo("Sai")); + + var tex = projection.Root.Children[2]; + Assert.That(tex.SceneObjectKind, Is.EqualTo("tex-math-scene-projection")); + Assert.That(tex.PluginProjection, Is.Not.Null); + Assert.That(tex.PluginProjection!.PluginId, Is.EqualTo("tex.math")); + Assert.That(tex.PluginProjection.ProjectionKind, Is.EqualTo("tex-math-scene-block-fallback-shell")); + Assert.That(tex.PluginProjection.Capabilities, Does.Contain("embed.tex")); + Assert.That(tex.PluginProjection.Capabilities, Does.Contain("tex.scene-placement")); + Assert.That(tex.PluginProjection.DocumentId, Is.EqualTo("\\\\mathrm{votes}(p)=1+\\\\lfloor\\\\log_b(1+p)\\\\rfloor")); + Assert.That(tex.PluginProjection.SemanticOwner, Is.EqualTo("EvePlugins")); } [Test] @@ -217,7 +227,18 @@ namespace GameCult.Eve.UnityScene.Tests ["targetPath"] = "eve" }, Array.Empty()) - }) + }), + new EveSurfaceComponent( + "sai.tex.log-power", + "embed.tex", + new Dictionary(StringComparer.Ordinal) + { + ["label"] = "Bifrost voting weight", + ["source"] = "\\\\mathrm{votes}(p)=1+\\\\lfloor\\\\log_b(1+p)\\\\rfloor", + ["format"] = "latex", + ["display"] = "block" + }, + Array.Empty()) }), Array.Empty()), new[] diff --git a/runtimes/incubating/eve-unity-scene/eve-runtime-capability.json b/runtimes/incubating/eve-unity-scene/eve-runtime-capability.json index 3908a4d..e0dbfe3 100644 --- a/runtimes/incubating/eve-unity-scene/eve-runtime-capability.json +++ b/runtimes/incubating/eve-unity-scene/eve-runtime-capability.json @@ -36,14 +36,19 @@ "embed.norn" ], "projectionAdapter": "NornGraphUnitySceneProjectionAdapter" - } - ], - "unsupportedPlugins": [ + }, { "pluginId": "tex.math", - "reason": "Unity scene graph projection exists, but no scene-space or UI overlay adapter exists for TeX sidecar-advertised math projection in this runtime." + "capabilities": [ + "embed.tex", + "tex.inline", + "tex.block", + "tex.scene-placement" + ], + "projectionAdapter": "TeXMathUnitySceneProjectionAdapter" } ], + "unsupportedPlugins": [], "worldSurfaceLowering": [ { "targetId": "unity-scene", @@ -55,6 +60,7 @@ "runtimes/incubating/eve-unity-scene/Runtime/EveUnitySceneSurfaceLowerer.cs", "runtimes/incubating/eve-unity-scene/Runtime/SaiVisualNovelUnitySceneProjectionAdapter.cs", "runtimes/incubating/eve-unity-scene/Runtime/NornGraphUnitySceneProjectionAdapter.cs", + "runtimes/incubating/eve-unity-scene/Runtime/TeXMathUnitySceneProjectionAdapter.cs", "runtimes/incubating/eve-unity-scene/Tests/Editor/EveUnitySceneSurfaceLowererTests.cs", "web/fixtures/aetheria.provider-advertisement.json" ] @@ -89,6 +95,7 @@ "runtimes/incubating/eve-unity-scene/Runtime/EveUnitySceneSurfaceLowerer.cs", "runtimes/incubating/eve-unity-scene/Runtime/SaiVisualNovelUnitySceneProjectionAdapter.cs", "runtimes/incubating/eve-unity-scene/Runtime/NornGraphUnitySceneProjectionAdapter.cs", + "runtimes/incubating/eve-unity-scene/Runtime/TeXMathUnitySceneProjectionAdapter.cs", "runtimes/incubating/eve-unity-scene/eveunity-scene-split-handoff.json", "scripts/run-eveunity-scene-split-handoff-smoke.ps1", "scripts/run-eveunity-scene-release-contract-smoke.ps1", @@ -120,6 +127,7 @@ "runtimes/incubating/eve-unity-scene/Runtime/EveUnitySceneSurfaceLowerer.cs", "runtimes/incubating/eve-unity-scene/Runtime/SaiVisualNovelUnitySceneProjectionAdapter.cs", "runtimes/incubating/eve-unity-scene/Runtime/NornGraphUnitySceneProjectionAdapter.cs", + "runtimes/incubating/eve-unity-scene/Runtime/TeXMathUnitySceneProjectionAdapter.cs", "runtimes/incubating/eve-unity-scene/Tests/Editor/GameCult.Eve.UnityScene.Tests.asmdef", "runtimes/incubating/eve-unity-scene/Tests/Editor/EveUnitySceneSurfaceLowererTests.cs", "runtimes/incubating/eve-unity-scene/eveunity-scene-split-handoff.json", 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 9a96003..4985892 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/SaiVisualNovelUnitySceneProjectionAdapter.cs", "runtimes/incubating/eve-unity-scene/Runtime/NornGraphUnitySceneProjectionAdapter.cs", + "runtimes/incubating/eve-unity-scene/Runtime/TeXMathUnitySceneProjectionAdapter.cs", "runtimes/incubating/eve-unity-scene/Tests/Editor/GameCult.Eve.UnityScene.Tests.asmdef", "runtimes/incubating/eve-unity-scene/Tests/Editor/EveUnitySceneSurfaceLowererTests.cs" ], @@ -31,6 +32,7 @@ "runtimes/incubating/eve-unity-scene/Runtime/EveUnitySceneSurfaceLowerer.cs", "runtimes/incubating/eve-unity-scene/Runtime/SaiVisualNovelUnitySceneProjectionAdapter.cs", "runtimes/incubating/eve-unity-scene/Runtime/NornGraphUnitySceneProjectionAdapter.cs", + "runtimes/incubating/eve-unity-scene/Runtime/TeXMathUnitySceneProjectionAdapter.cs", "runtimes/incubating/eve-unity-scene/Tests/Editor/EveUnitySceneSurfaceLowererTests.cs", "runtimes/incubating/eve-unity-scene/eve-runtime-capability.json" ], @@ -61,6 +63,18 @@ "destinationOwner": "EveUnity", "replacementProof": "EveUnity owns only the Unity scene projection adapter for Norn's sidecar-advertised embed.norn capability; Norn keeps graph layout, graph state, and graph command semantics." }, + { + "id": "unity-scene-tex-plugin-projection", + "stage": "plugin-projection", + "currentPaths": [ + "runtimes/incubating/eve-unity-scene/Runtime/TeXMathUnitySceneProjectionAdapter.cs", + "runtimes/incubating/eve-unity-scene/Runtime/EveUnitySceneSurfaceLowerer.cs", + "runtimes/incubating/eve-unity-scene/Tests/Editor/EveUnitySceneSurfaceLowererTests.cs", + "runtimes/incubating/eve-unity-scene/eve-runtime-capability.json" + ], + "destinationOwner": "EveUnity", + "replacementProof": "EveUnity owns only the Unity scene projection shell for TeX's sidecar-advertised embed.tex capability; EvePlugins keeps TeX parsing, typesetting, baseline metrics, and render-cache semantics." + }, { "id": "unity-scene-command-transport", "stage": "command", @@ -98,7 +112,8 @@ "renderer-local world simulation as provider truth", "product assets bundled as Eve runtime contract", "Sai story state, VN/Ink semantics, or story command interpretation as Unity scene runtime authority", - "Norn graph layout, graph state, or command semantics as Unity scene runtime authority" + "Norn graph layout, graph state, or command semantics as Unity scene runtime authority", + "TeX parsing, typesetting, baseline metrics, or render-cache semantics as Unity scene runtime authority" ], "requiredExternalProofs": [ "EveUnity publishes a Unity scene runtime capability manifest.", @@ -106,6 +121,7 @@ "EveUnity owns the provider-agnostic scene graph lowerer outside Eve incubation.", "EveUnity owns the Unity scene Sai projection adapter outside Eve incubation without importing Sai story state or VN/Ink internals.", "EveUnity owns the Unity scene Norn projection adapter outside Eve incubation without importing Norn implementation state.", + "EveUnity owns the Unity scene TeX projection adapter outside Eve incubation without importing TeX implementation state.", "EveUnity lowers at least one non-Aetheria provider-authored world surface into Unity scene objects.", "EveUnity lowers Aetheria's game world surface through provider advertisements without importing Aetheria internals.", "Unity scene input emits gamecult.eve.command.v1 intents and renders provider receipts.", diff --git a/scripts/run-aetheria-unity-package-smoke.ps1 b/scripts/run-aetheria-unity-package-smoke.ps1 index c8411d3..d3de2c8 100644 --- a/scripts/run-aetheria-unity-package-smoke.ps1 +++ b/scripts/run-aetheria-unity-package-smoke.ps1 @@ -38,7 +38,8 @@ $requiredCompileItems = @( "Runtime\EveUiToolkitSurfaceLowerer.cs", "Runtime\IEveUiToolkitPluginProjectionAdapter.cs", "Runtime\SaiVisualNovelUiToolkitProjectionAdapter.cs", - "Runtime\NornGraphUiToolkitProjectionAdapter.cs" + "Runtime\NornGraphUiToolkitProjectionAdapter.cs", + "Runtime\TeXMathUiToolkitProjectionAdapter.cs" ) foreach ($compileItem in $requiredCompileItems) { $expected = Join-Path $eveRoot "packages\org.gamecult.eve.unity-uitoolkit\$compileItem" diff --git a/scripts/run-eveunity-lifecycle-smoke.ps1 b/scripts/run-eveunity-lifecycle-smoke.ps1 index a8a64e5..ab7ec58 100644 --- a/scripts/run-eveunity-lifecycle-smoke.ps1 +++ b/scripts/run-eveunity-lifecycle-smoke.ps1 @@ -52,7 +52,8 @@ foreach ($plugin in $manifest.supportedPlugins) { } foreach ($claim in @( @{ pluginId = "sai.vn"; capabilities = @("vn.stage", "story.choose", "story.continue", "story.jump") }, - @{ pluginId = "norn.graph"; capabilities = @("embed.norn") } + @{ pluginId = "norn.graph"; capabilities = @("embed.norn") }, + @{ pluginId = "tex.math"; capabilities = @("embed.tex", "tex.inline", "tex.block") } )) { if (-not $pluginClaims.ContainsKey($claim.pluginId)) { throw "EveUnity manifest missing plugin claim: $($claim.pluginId)" diff --git a/scripts/run-eveunity-scene-lifecycle-smoke.ps1 b/scripts/run-eveunity-scene-lifecycle-smoke.ps1 index b0021a1..42ca026 100644 --- a/scripts/run-eveunity-scene-lifecycle-smoke.ps1 +++ b/scripts/run-eveunity-scene-lifecycle-smoke.ps1 @@ -44,8 +44,8 @@ foreach ($feature in @("providerAdvertisements", "commandTransport", "sceneGraph throw "EveUnity scene manifest missing provider-shell feature: $feature" } } -if (@($manifest.supportedPlugins).Count -ne 2) { - throw "EveUnity scene must claim exactly two plugin projection adapters" +if (@($manifest.supportedPlugins).Count -ne 3) { + throw "EveUnity scene must claim exactly three plugin projection adapters" } $saiProjection = @($manifest.supportedPlugins) | Where-Object { $_.pluginId -eq "sai.vn" } | Select-Object -First 1 if (-not $saiProjection) { @@ -69,6 +69,18 @@ if ($nornProjection.projectionAdapter -ne "NornGraphUnitySceneProjectionAdapter" if (-not (@($nornProjection.capabilities) -contains "embed.norn")) { throw "EveUnity scene Norn projection adapter must claim embed.norn" } +$texProjection = @($manifest.supportedPlugins) | Where-Object { $_.pluginId -eq "tex.math" } | Select-Object -First 1 +if (-not $texProjection) { + throw "EveUnity scene manifest missing supported TeX projection adapter" +} +if ($texProjection.projectionAdapter -ne "TeXMathUnitySceneProjectionAdapter") { + throw "Unexpected EveUnity scene TeX projection adapter: $($texProjection.projectionAdapter)" +} +foreach ($capability in @("embed.tex", "tex.inline", "tex.block", "tex.scene-placement")) { + if (-not (@($texProjection.capabilities) -contains $capability)) { + throw "EveUnity scene TeX projection adapter must claim $capability" + } +} $worldSurfaceLoweringClaims = @() if ($null -ne $manifest.worldSurfaceLowering) { $worldSurfaceLoweringClaims = @($manifest.worldSurfaceLowering) @@ -93,18 +105,15 @@ foreach ($evidencePath in @($worldSurfaceLoweringClaim.evidencePaths)) { } } -foreach ($pluginId in @("tex.math")) { - $unsupported = @($manifest.unsupportedPlugins) | Where-Object { $_.pluginId -eq $pluginId } | Select-Object -First 1 - if (-not $unsupported) { - throw "EveUnity scene manifest missing unsupported plugin declaration: $pluginId" - } -} if (@($manifest.unsupportedPlugins) | Where-Object { $_.pluginId -eq "sai.vn" } | Select-Object -First 1) { throw "EveUnity scene must not report sai.vn unsupported while the projection adapter is declared" } if (@($manifest.unsupportedPlugins) | Where-Object { $_.pluginId -eq "norn.graph" } | Select-Object -First 1) { throw "EveUnity scene must not report norn.graph unsupported while the projection adapter is declared" } +if (@($manifest.unsupportedPlugins) | Where-Object { $_.pluginId -eq "tex.math" } | Select-Object -First 1) { + throw "EveUnity scene must not report tex.math unsupported while the projection adapter is declared" +} if ($manifest.commandTransport.schema -ne "gamecult.eve.command.v1") { throw "Unexpected EveUnity scene command schema: $($manifest.commandTransport.schema)" diff --git a/scripts/run-eveunity-scene-provider-shell-smoke.ps1 b/scripts/run-eveunity-scene-provider-shell-smoke.ps1 index 79b2628..40af870 100644 --- a/scripts/run-eveunity-scene-provider-shell-smoke.ps1 +++ b/scripts/run-eveunity-scene-provider-shell-smoke.ps1 @@ -66,6 +66,7 @@ $expectedFiles = @( "runtimes\incubating\eve-unity-scene\Runtime\EveUnitySceneSurfaceLowerer.cs", "runtimes\incubating\eve-unity-scene\Runtime\SaiVisualNovelUnitySceneProjectionAdapter.cs", "runtimes\incubating\eve-unity-scene\Runtime\NornGraphUnitySceneProjectionAdapter.cs", + "runtimes\incubating\eve-unity-scene\Runtime\TeXMathUnitySceneProjectionAdapter.cs", "runtimes\incubating\eve-unity-scene\Tests\Editor\GameCult.Eve.UnityScene.Tests.asmdef", "runtimes\incubating\eve-unity-scene\Tests\Editor\EveUnitySceneSurfaceLowererTests.cs" ) @@ -78,7 +79,7 @@ foreach ($relativePath in $expectedFiles) { } $lowererSource = Get-Content -LiteralPath (Join-Path $projectRoot "runtimes\incubating\eve-unity-scene\Runtime\EveUnitySceneSurfaceLowerer.cs") -Raw -foreach ($symbol in @("EveUnitySceneSurfaceLowerer", "EveUnitySceneProviderSurfaceAdvertisement", "WorldInteraction", "CommandBoundary", "ReceiptSchema", "EveSurfaceCommandRequest", "BuildSceneGraph", "BuildPluginProjection", "SaiVisualNovelUnitySceneProjectionAdapter", "EveUnityScenePluginProjection", "EveUnitySceneNode", "SceneObjectKind", "unity-scene")) { +foreach ($symbol in @("EveUnitySceneSurfaceLowerer", "EveUnitySceneProviderSurfaceAdvertisement", "WorldInteraction", "CommandBoundary", "ReceiptSchema", "EveSurfaceCommandRequest", "BuildSceneGraph", "BuildPluginProjection", "SaiVisualNovelUnitySceneProjectionAdapter", "TeXMathUnitySceneProjectionAdapter", "EveUnityScenePluginProjection", "EveUnitySceneNode", "SceneObjectKind", "unity-scene")) { if (-not $lowererSource.Contains($symbol)) { throw "EveUnity scene provider shell lowerer missing symbol: $symbol" } @@ -98,8 +99,15 @@ foreach ($symbol in @("NornGraphUnitySceneProjectionAdapter", "norn.graph", "emb } } +$texAdapterSource = Get-Content -LiteralPath (Join-Path $projectRoot "runtimes\incubating\eve-unity-scene\Runtime\TeXMathUnitySceneProjectionAdapter.cs") -Raw +foreach ($symbol in @("TeXMathUnitySceneProjectionAdapter", "tex.math", "embed.tex", "tex.scene-placement", "gamecult.eve.plugin_abi.v1", "sidecar-advertised-plugin-abi", "EvePlugins")) { + if (-not $texAdapterSource.Contains($symbol)) { + throw "EveUnity scene TeX projection adapter missing symbol: $symbol" + } +} + $testSource = Get-Content -LiteralPath (Join-Path $projectRoot "runtimes\incubating\eve-unity-scene\Tests\Editor\EveUnitySceneSurfaceLowererTests.cs") -Raw -foreach ($symbol in @("LowerCarriesProviderAdvertisedWorldBoundary", "LowerBuildsProviderAgnosticSceneGraphFromSurfaceTree", "SaiVisualNovelLowersThroughRuntimeProjectionAdapterWithoutOwningStoryState", "CommandIntentCarriesAdvertisedBoundaryWithoutOwningReceipts", "world-projection-node", "sai-vn-scene-stage", "norn-graph-scene-projection", "sai.vn", "norn.graph", "sidecar-advertised-plugin-abi", "aetheria.daemon.commands", "aetheria.eve_command_acceptance_status.v1")) { +foreach ($symbol in @("LowerCarriesProviderAdvertisedWorldBoundary", "LowerBuildsProviderAgnosticSceneGraphFromSurfaceTree", "SaiVisualNovelLowersThroughRuntimeProjectionAdapterWithoutOwningStoryState", "CommandIntentCarriesAdvertisedBoundaryWithoutOwningReceipts", "world-projection-node", "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-eveunity-scene-split-handoff-smoke.ps1 b/scripts/run-eveunity-scene-split-handoff-smoke.ps1 index 4dd8cf3..a7778d9 100644 --- a/scripts/run-eveunity-scene-split-handoff-smoke.ps1 +++ b/scripts/run-eveunity-scene-split-handoff-smoke.ps1 @@ -47,6 +47,7 @@ $expectedMoveSets = @{ "unity-scene-world-surface-lowering" = "world-surface-lowering" "unity-scene-sai-plugin-projection" = "plugin-projection" "unity-scene-norn-plugin-projection" = "plugin-projection" + "unity-scene-tex-plugin-projection" = "plugin-projection" "unity-scene-command-transport" = "command" "unity-scene-capture-lifecycle" = "capture" } @@ -67,7 +68,7 @@ foreach ($id in $expectedMoveSets.Keys) { } $currentPaths = if ($null -eq $moveSet.currentPaths) { @() } else { @($moveSet.currentPaths) } $observedProviderPaths = if ($null -eq $moveSet.observedProviderPaths) { @() } else { @($moveSet.observedProviderPaths) } - if ($id -in @("unity-scene-runtime-body", "unity-scene-world-surface-lowering", "unity-scene-sai-plugin-projection", "unity-scene-norn-plugin-projection", "unity-scene-command-transport", "unity-scene-capture-lifecycle")) { + if ($id -in @("unity-scene-runtime-body", "unity-scene-world-surface-lowering", "unity-scene-sai-plugin-projection", "unity-scene-norn-plugin-projection", "unity-scene-tex-plugin-projection", "unity-scene-command-transport", "unity-scene-capture-lifecycle")) { if ($currentPaths.Count -eq 0) { throw "EveUnity scene split handoff move set $id must name current Eve incubation paths" } @@ -102,7 +103,8 @@ foreach ($forbiddenImport in @( "renderer-local world simulation as provider truth", "product assets bundled as Eve runtime contract", "Sai story state, VN/Ink semantics, or story command interpretation as Unity scene runtime authority", - "Norn graph layout, graph state, or command semantics as Unity scene runtime authority" + "Norn graph layout, graph state, or command semantics as Unity scene runtime authority", + "TeX parsing, typesetting, baseline metrics, or render-cache semantics as Unity scene runtime authority" )) { if (-not (@($handoff.forbiddenImports) -contains $forbiddenImport)) { throw "EveUnity scene split handoff missing forbidden import: $forbiddenImport" @@ -119,6 +121,11 @@ if (-not (@($nornProjectionMoveSet.currentPaths) -contains "runtimes/incubating/ throw "EveUnity scene split handoff Norn projection move set must include the scene adapter path" } +$texProjectionMoveSet = $moveSets | Where-Object { $_.id -eq "unity-scene-tex-plugin-projection" } | Select-Object -First 1 +if (-not (@($texProjectionMoveSet.currentPaths) -contains "runtimes/incubating/eve-unity-scene/Runtime/TeXMathUnitySceneProjectionAdapter.cs")) { + throw "EveUnity scene split handoff TeX projection move set must include the scene adapter path" +} + foreach ($proof in @($handoff.requiredExternalProofs)) { if (-not $proof) { throw "EveUnity scene split handoff contains an empty required external proof" diff --git a/scripts/run-runtime-owner-conformance-consumer-smoke.ps1 b/scripts/run-runtime-owner-conformance-consumer-smoke.ps1 index 712c36d..cf2901b 100644 --- a/scripts/run-runtime-owner-conformance-consumer-smoke.ps1 +++ b/scripts/run-runtime-owner-conformance-consumer-smoke.ps1 @@ -91,23 +91,21 @@ node $consumerScript $consumerExport ` --expect-runtime-world-field tui:tui:ownership:runtime-lowers-provider-world-surface-without-owning-world-state ` --expect-runtime-plugin-projection unity-uitoolkit:sai.vn:supported:EveUnity ` --expect-runtime-plugin-projection unity-uitoolkit:norn.graph:supported:EveUnity ` - --expect-runtime-plugin-projection unity-uitoolkit:tex.math:unsupported:EveUnity ` + --expect-runtime-plugin-projection unity-uitoolkit:tex.math:supported:EveUnity ` --expect-runtime-plugin-projection unity-scene:sai.vn:supported:EveUnity ` --expect-runtime-plugin-projection unity-scene:norn.graph:supported:EveUnity ` - --expect-runtime-plugin-projection unity-scene:tex.math:unsupported:EveUnity ` + --expect-runtime-plugin-projection unity-scene:tex.math:supported:EveUnity ` --expect-runtime-plugin-projection electron-shell:sai.vn:unsupported:EveElectron ` --expect-provider-runtime-plugin-projection gamecult.home.vn:sai.visual_novel.surface:web:sai.vn:supported:Eve ` --expect-provider-runtime-plugin-projection gamecult.home.vn:sai.visual_novel.surface:web:tex.math:optional-supported:Eve ` --expect-provider-runtime-plugin-projection gamecult.home.vn:sai.visual_novel.surface:unity-uitoolkit:sai.vn:supported:EveUnity ` --expect-provider-runtime-plugin-projection gamecult.home.vn:sai.visual_novel.surface:unity-uitoolkit:norn.graph:optional-supported:EveUnity ` - --expect-provider-runtime-plugin-projection gamecult.home.vn:sai.visual_novel.surface:unity-uitoolkit:tex.math:optional-unsupported-runtime-projection:EveUnity ` + --expect-provider-runtime-plugin-projection gamecult.home.vn:sai.visual_novel.surface:unity-uitoolkit:tex.math:optional-supported:EveUnity ` --expect-provider-runtime-plugin-projection gamecult.home.vn:sai.visual_novel.surface:unity-scene:sai.vn:supported:EveUnity ` --expect-provider-runtime-plugin-projection gamecult.home.vn:sai.visual_novel.surface:unity-scene:norn.graph:optional-supported:EveUnity ` - --expect-provider-runtime-plugin-projection gamecult.home.vn:sai.visual_novel.surface:unity-scene:tex.math:optional-unsupported-runtime-projection:EveUnity ` + --expect-provider-runtime-plugin-projection gamecult.home.vn:sai.visual_novel.surface:unity-scene:tex.math:optional-supported:EveUnity ` --expect-provider-runtime-plugin-projection gamecult.home.vn:sai.visual_novel.surface:ios-uikit:sai.vn:unsupported-runtime-projection:EveIOS ` --expect-provider-runtime-plugin-projection gamecult.home.vn:sai.visual_novel.surface:ios-uikit:norn.graph:optional-unsupported-runtime-projection:EveIOS ` - --expect-runtime-plugin-gap unity-uitoolkit:tex.math:EveUnity ` - --expect-runtime-plugin-gap unity-scene:tex.math:EveUnity ` --expect-runtime-plugin-gap electron-shell:sai.vn:EveElectron ` --expect-runtime-plugin-gap electron-shell:norn.graph:EveElectron ` --expect-runtime-plugin-gap electron-shell:tex.math:EveElectron ` diff --git a/scripts/run-split-target-conformance-consumer-smoke.ps1 b/scripts/run-split-target-conformance-consumer-smoke.ps1 index 4bf3ec6..151a88c 100644 --- a/scripts/run-split-target-conformance-consumer-smoke.ps1 +++ b/scripts/run-split-target-conformance-consumer-smoke.ps1 @@ -50,6 +50,7 @@ try { --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-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-capture-lifecycle:current:exists:eveunity-capture-contract.mjs ` --expect-split-target-blocker "EveUnity:Tagged UPM release" ` diff --git a/tools/parity/parity-manifest.json b/tools/parity/parity-manifest.json index 1d31d16..05b59d4 100644 --- a/tools/parity/parity-manifest.json +++ b/tools/parity/parity-manifest.json @@ -610,13 +610,14 @@ ] }, { - "description": "Unity scene graph projection lowerer plus Sai and Norn projection adapters exist without claiming provider simulation, plugin semantics, or capture ownership.", + "description": "Unity scene graph projection lowerer plus Sai, Norn, and TeX projection adapters exist without claiming provider simulation, plugin semantics, or capture ownership.", "status": "passed", "evidencePaths": [ "runtimes/incubating/eve-unity-scene/package.json", "runtimes/incubating/eve-unity-scene/Runtime/EveUnitySceneSurfaceLowerer.cs", "runtimes/incubating/eve-unity-scene/Runtime/SaiVisualNovelUnitySceneProjectionAdapter.cs", "runtimes/incubating/eve-unity-scene/Runtime/NornGraphUnitySceneProjectionAdapter.cs", + "runtimes/incubating/eve-unity-scene/Runtime/TeXMathUnitySceneProjectionAdapter.cs", "runtimes/incubating/eve-unity-scene/Tests/Editor/EveUnitySceneSurfaceLowererTests.cs", "scripts/run-eveunity-scene-provider-shell-smoke.ps1" ] @@ -955,14 +956,14 @@ "pluginId": "norn.graph", "capabilities": ["embed.norn"], "projectionAdapter": "NornGraphUnitySceneProjectionAdapter" - } - ], - "unsupportedPlugins": [ + }, { "pluginId": "tex.math", - "reason": "Unity scene graph projection exists, but no scene-space or UI overlay adapter exists for TeX sidecar-advertised math projection in this runtime." + "capabilities": ["embed.tex", "tex.inline", "tex.block", "tex.scene-placement"], + "projectionAdapter": "TeXMathUnitySceneProjectionAdapter" } ], + "unsupportedPlugins": [], "worldSurfaceLowering": [ { "targetId": "unity-scene", @@ -974,6 +975,7 @@ "runtimes/incubating/eve-unity-scene/Runtime/EveUnitySceneSurfaceLowerer.cs", "runtimes/incubating/eve-unity-scene/Runtime/SaiVisualNovelUnitySceneProjectionAdapter.cs", "runtimes/incubating/eve-unity-scene/Runtime/NornGraphUnitySceneProjectionAdapter.cs", + "runtimes/incubating/eve-unity-scene/Runtime/TeXMathUnitySceneProjectionAdapter.cs", "runtimes/incubating/eve-unity-scene/Tests/Editor/EveUnitySceneSurfaceLowererTests.cs", "web/fixtures/aetheria.provider-advertisement.json" ] @@ -985,6 +987,7 @@ "runtimes/incubating/eve-unity-scene/Runtime/EveUnitySceneSurfaceLowerer.cs", "runtimes/incubating/eve-unity-scene/Runtime/SaiVisualNovelUnitySceneProjectionAdapter.cs", "runtimes/incubating/eve-unity-scene/Runtime/NornGraphUnitySceneProjectionAdapter.cs", + "runtimes/incubating/eve-unity-scene/Runtime/TeXMathUnitySceneProjectionAdapter.cs", "runtimes/incubating/eve-unity-scene/Tests/Editor/GameCult.Eve.UnityScene.Tests.asmdef", "runtimes/incubating/eve-unity-scene/Tests/Editor/EveUnitySceneSurfaceLowererTests.cs", "runtimes/incubating/eve-unity-scene/eve-runtime-capability.json", @@ -1001,7 +1004,7 @@ "expectedSourceSymbols": [ { "path": "runtimes/incubating/eve-unity-scene/Runtime/EveUnitySceneSurfaceLowerer.cs", - "contains": ["EveUnitySceneSurfaceLowerer", "EveUnitySceneProviderSurfaceAdvertisement", "WorldInteraction", "CommandBoundary", "ReceiptSchema", "EveSurfaceCommandRequest", "BuildSceneGraph", "BuildEmbeddedDocumentSlots", "BuildPluginProjection", "SaiVisualNovelUnitySceneProjectionAdapter", "EveUnitySceneEmbeddedDocumentSlot", "EveUnityScenePluginProjection", "EveUnitySceneNode", "SceneObjectKind", "unity-scene"] + "contains": ["EveUnitySceneSurfaceLowerer", "EveUnitySceneProviderSurfaceAdvertisement", "WorldInteraction", "CommandBoundary", "ReceiptSchema", "EveSurfaceCommandRequest", "BuildSceneGraph", "BuildEmbeddedDocumentSlots", "BuildPluginProjection", "SaiVisualNovelUnitySceneProjectionAdapter", "TeXMathUnitySceneProjectionAdapter", "EveUnitySceneEmbeddedDocumentSlot", "EveUnityScenePluginProjection", "EveUnitySceneNode", "SceneObjectKind", "unity-scene"] }, { "path": "runtimes/incubating/eve-unity-scene/Runtime/SaiVisualNovelUnitySceneProjectionAdapter.cs", @@ -1011,9 +1014,13 @@ "path": "runtimes/incubating/eve-unity-scene/Runtime/NornGraphUnitySceneProjectionAdapter.cs", "contains": ["NornGraphUnitySceneProjectionAdapter", "norn.graph", "embed.norn", "gamecult.eve.plugin_abi.v1", "sidecar-advertised-plugin-abi", "Norn"] }, + { + "path": "runtimes/incubating/eve-unity-scene/Runtime/TeXMathUnitySceneProjectionAdapter.cs", + "contains": ["TeXMathUnitySceneProjectionAdapter", "tex.math", "embed.tex", "tex.scene-placement", "gamecult.eve.plugin_abi.v1", "sidecar-advertised-plugin-abi", "EvePlugins"] + }, { "path": "runtimes/incubating/eve-unity-scene/Tests/Editor/EveUnitySceneSurfaceLowererTests.cs", - "contains": ["LowerCarriesProviderAdvertisedWorldBoundary", "LowerBuildsProviderAgnosticSceneGraphFromSurfaceTree", "SaiVisualNovelLowersThroughRuntimeProjectionAdapterWithoutOwningStoryState", "CommandIntentCarriesAdvertisedBoundaryWithoutOwningReceipts", "world-projection-node", "sai-vn-scene-stage", "norn-graph-scene-projection", "norn.map", "cultmesh://aetheria/norn/map", "sai.vn", "norn.graph", "sidecar-advertised-plugin-abi", "aetheria.daemon.commands", "aetheria.eve_command_acceptance_status.v1"] + "contains": ["LowerCarriesProviderAdvertisedWorldBoundary", "LowerBuildsProviderAgnosticSceneGraphFromSurfaceTree", "SaiVisualNovelLowersThroughRuntimeProjectionAdapterWithoutOwningStoryState", "CommandIntentCarriesAdvertisedBoundaryWithoutOwningReceipts", "world-projection-node", "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", @@ -1435,14 +1442,13 @@ { "pluginId": "norn.graph", "capabilities": ["embed.norn"] - } - ], - "unsupportedPlugins": [ + }, { "pluginId": "tex.math", - "reason": "Unity UI Toolkit currently preserves embed.tex as generic Eve structure; no adapter exists for the TeX sidecar-advertised projection in this runtime." + "capabilities": ["embed.tex", "tex.inline", "tex.block"] } ], + "unsupportedPlugins": [], "worldSurfaceLowering": [ { "targetId": "unity-uitoolkit", @@ -1462,6 +1468,7 @@ "packages/org.gamecult.eve.unity-uitoolkit/Runtime/IEveUiToolkitPluginProjectionAdapter.cs", "packages/org.gamecult.eve.unity-uitoolkit/Runtime/SaiVisualNovelUiToolkitProjectionAdapter.cs", "packages/org.gamecult.eve.unity-uitoolkit/Runtime/NornGraphUiToolkitProjectionAdapter.cs", + "packages/org.gamecult.eve.unity-uitoolkit/Runtime/TeXMathUiToolkitProjectionAdapter.cs", "packages/org.gamecult.eve.unity-uitoolkit/Tests/Editor/GameCult.Eve.UnityUIToolkit.Tests.asmdef", "packages/org.gamecult.eve.unity-uitoolkit/Tests/Editor/EveUiToolkitSurfaceLowererTests.cs", "packages/org.gamecult.eve.unity-uitoolkit/eveunity-split-handoff.json", @@ -1485,9 +1492,13 @@ "path": "packages/org.gamecult.eve.unity-uitoolkit/Runtime/NornGraphUiToolkitProjectionAdapter.cs", "contains": ["norn.graph", "embed.norn", "NornGraphUiToolkitProjectionAdapter", "norn-graph", "EmitGraphCommand", "EveSurfaceCommandRequest"] }, + { + "path": "packages/org.gamecult.eve.unity-uitoolkit/Runtime/TeXMathUiToolkitProjectionAdapter.cs", + "contains": ["tex.math", "embed.tex", "TeXMathUiToolkitProjectionAdapter", "tex-math", "tex-math-source-fallback"] + }, { "path": "packages/org.gamecult.eve.unity-uitoolkit/Tests/Editor/EveUiToolkitSurfaceLowererTests.cs", - "contains": ["FindPluginProjectionAdapter", "SaiStageLowersThroughRuntimeProjectionAdapter", "NornGraphLowersThroughRuntimeProjectionAdapter", "EmbeddedDocumentSlotMountsResolverBackedChildSurface", "eve-plugin-projection"] + "contains": ["FindPluginProjectionAdapter", "SaiStageLowersThroughRuntimeProjectionAdapter", "NornGraphLowersThroughRuntimeProjectionAdapter", "TeXMathLowersThroughRuntimeProjectionAdapterAsSourceFallback", "EmbeddedDocumentSlotMountsResolverBackedChildSurface", "eve-plugin-projection"] } ], "commandTransportSmoke": {