From 071c5aef76a10c17d6b74631a49c9fff904c8b76 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Thu, 9 Jul 2026 16:44:14 +0100 Subject: [PATCH] Add generic world surface control fixture --- docs/eve-migration-roadmap.md | 8 ++ scripts/run-conformance-consumer-smoke.ps1 | 20 +++ scripts/run-parity-harness.ps1 | 6 + ...ntime-owner-conformance-consumer-smoke.ps1 | 14 +++ tools/parity/parity-manifest.json | 61 +++++++++- web/eve-runtime-capability.json | 3 +- .../eve-world-smoke-surface.conformance.json | 19 +++ web/fixtures/eve-world-smoke-surface.json | 114 ++++++++++++++++++ ...ve-world-smoke.provider-advertisement.json | 63 ++++++++++ web/local-provider-catalog.json | 13 ++ web/provider-advertisements.test.mjs | 15 +++ 11 files changed, 330 insertions(+), 6 deletions(-) create mode 100644 web/fixtures/eve-world-smoke-surface.conformance.json create mode 100644 web/fixtures/eve-world-smoke-surface.json create mode 100644 web/fixtures/eve-world-smoke.provider-advertisement.json diff --git a/docs/eve-migration-roadmap.md b/docs/eve-migration-roadmap.md index 529a9f0..f969f38 100644 --- a/docs/eve-migration-roadmap.md +++ b/docs/eve-migration-roadmap.md @@ -994,6 +994,14 @@ Recently cut: incubation resolution, and the EveUnity split handoff requirement. The runtime capability schema, parity comparator, lifecycle smoke, and runtime-owner conformance smoke all verify that boundary. +- Eve now has a non-Aetheria interactive world control fixture at + `web/fixtures/eve-world-smoke-surface.json` with an advertisement at + `web/fixtures/eve-world-smoke.provider-advertisement.json`. The local + provider catalog, web advertisement merge test, web layout probe, generic + conformance consumer, and runtime-owner consumer all assert that + `web-reference`, `unity-uitoolkit`, `unity-scene`, `electron-shell`, and + `tui` lower the same provider-owned world/command boundary without importing + Aetheria product state. - Sai, Norn, and TeX now have plugin ABI fixtures for describe, validate, project, lower, measure, and apply behavior. The parity harness validates those fixtures against plugin manifests, so Eve proves the ABI shape without diff --git a/scripts/run-conformance-consumer-smoke.ps1 b/scripts/run-conformance-consumer-smoke.ps1 index 1bae901..9759321 100644 --- a/scripts/run-conformance-consumer-smoke.ps1 +++ b/scripts/run-conformance-consumer-smoke.ps1 @@ -52,16 +52,27 @@ try { --expect-capability-gap runtime:Fensalir:direct2d:capture:missing ` --expect-local-provider-catalog web:valid:local-provider-catalog.json ` --expect-local-provider-catalog-provider web:aetheria ` + --expect-local-provider-catalog-provider web:eve.world-smoke ` --expect-local-provider-catalog-provider web:repixelizer ` --expect-local-provider-catalog-provider web:gamecult.home.vn ` --expect-local-provider-catalog-advertisement web:aetheria.provider-advertisement.json ` + --expect-local-provider-catalog-advertisement web:eve-world-smoke.provider-advertisement.json ` --expect-local-provider-catalog-advertisement web:repixelizer.provider-advertisement.json ` --expect-local-provider-catalog-advertisement web:sai-vn.provider-advertisement.json ` + --expect-interactive-world-surface eve.world-smoke:eve.world-smoke.surface:web-reference:Eve ` + --expect-interactive-world-surface eve.world-smoke:eve.world-smoke.surface:unity-scene:Eve ` + --expect-interactive-world-surface eve.world-smoke:eve.world-smoke.surface:electron-shell:Eve ` + --expect-interactive-world-surface eve.world-smoke:eve.world-smoke.surface:tui:Eve ` --expect-world-lowering-coverage aetheria:aetheria.daemon.game:web-reference:claimed:Eve:web ` --expect-world-lowering-coverage aetheria:aetheria.daemon.game:unity-uitoolkit:claimed:EveUnity:unity-uitoolkit ` --expect-world-lowering-coverage aetheria:aetheria.daemon.game:unity-scene:claimed:EveUnity:unity-scene ` --expect-world-lowering-coverage aetheria:aetheria.daemon.game:electron-shell:claimed:EveElectron:electron-shell ` --expect-world-lowering-coverage aetheria:aetheria.daemon.game:tui:claimed:EveTui:tui ` + --expect-world-lowering-coverage eve.world-smoke:eve.world-smoke.surface:web-reference:claimed:Eve:web ` + --expect-world-lowering-coverage eve.world-smoke:eve.world-smoke.surface:unity-uitoolkit:claimed:EveUnity:unity-uitoolkit ` + --expect-world-lowering-coverage eve.world-smoke:eve.world-smoke.surface:unity-scene:claimed:EveUnity:unity-scene ` + --expect-world-lowering-coverage eve.world-smoke:eve.world-smoke.surface:electron-shell:claimed:EveElectron:electron-shell ` + --expect-world-lowering-coverage eve.world-smoke:eve.world-smoke.surface:tui:claimed:EveTui:tui ` --expect-world-lowering-coverage aetheria:aetheria.daemon.editor:electron-shell:claimed:EveElectron:electron-shell ` --expect-world-lowering-coverage aetheria:aetheria.daemon.editor:tui:claimed:EveTui:tui ` --expect-command-boundary-coverage aetheria:aetheria.daemon.game:web-reference:covered:Eve:web ` @@ -69,6 +80,11 @@ try { --expect-command-boundary-coverage aetheria:aetheria.daemon.game:unity-scene:covered:EveUnity:unity-scene ` --expect-command-boundary-coverage aetheria:aetheria.daemon.game:electron-shell:covered:EveElectron:electron-shell ` --expect-command-boundary-coverage aetheria:aetheria.daemon.game:tui:covered:EveTui:tui ` + --expect-command-boundary-coverage eve.world-smoke:eve.world-smoke.surface:web-reference:covered:Eve:web ` + --expect-command-boundary-coverage eve.world-smoke:eve.world-smoke.surface:unity-uitoolkit:covered:EveUnity:unity-uitoolkit ` + --expect-command-boundary-coverage eve.world-smoke:eve.world-smoke.surface:unity-scene:covered:EveUnity:unity-scene ` + --expect-command-boundary-coverage eve.world-smoke:eve.world-smoke.surface:electron-shell:covered:EveElectron:electron-shell ` + --expect-command-boundary-coverage eve.world-smoke:eve.world-smoke.surface:tui:covered:EveTui:tui ` --expect-command-boundary-coverage aetheria:aetheria.daemon.editor:electron-shell:covered:EveElectron:electron-shell ` --expect-command-boundary-coverage aetheria:aetheria.daemon.editor:tui:covered:EveTui:tui ` --expect-screenshot-metric web:embedded-surface:structure:pass ` @@ -78,6 +94,10 @@ try { --expect-screenshot-metric web:sai-vn:structure:pass ` --expect-screenshot-metric web:sai-vn:color-tokens:pass ` --expect-screenshot-metric web:sai-vn:bounding-boxes:pass ` + --expect-screenshot-metric web:eve-world-smoke:structure:pass ` + --expect-screenshot-metric web:eve-world-smoke:color-tokens:pass ` + --expect-screenshot-metric web:eve-world-smoke:text-presence:pass ` + --expect-screenshot-metric web:eve-world-smoke:bounding-boxes:pass ` --expect-screenshot-metric electron-shell:aetheria-world:bounding-boxes:pending-capture ` --expect-runtime-capture-probe unity-uitoolkit:semantic-artifact-present-capture-pending:png:EveUnity ` --expect-runtime-capture-probe unity-scene:semantic-artifact-present-capture-pending:png:EveUnity ` diff --git a/scripts/run-parity-harness.ps1 b/scripts/run-parity-harness.ps1 index 56e0f7f..c3e2560 100644 --- a/scripts/run-parity-harness.ps1 +++ b/scripts/run-parity-harness.ps1 @@ -20,6 +20,12 @@ try { -OutputPath "artifacts\web-reference-layout-probe\latest\sai-vn.json" ` -Port 8893 ` -SkipBuild + & (Join-Path $PSScriptRoot "run-web-reference-layout-probe-smoke.ps1") ` + -ProviderId "eve.world-smoke" ` + -FixtureId "eve-world-smoke" ` + -OutputPath "artifacts\web-reference-layout-probe\latest\eve-world-smoke.json" ` + -Port 8894 ` + -SkipBuild & (Join-Path $PSScriptRoot "run-eveunity-uitoolkit-capture-smoke.ps1") & (Join-Path $PSScriptRoot "run-evetui-capture-smoke.ps1") node .\tools\parity\run-parity.mjs diff --git a/scripts/run-runtime-owner-conformance-consumer-smoke.ps1 b/scripts/run-runtime-owner-conformance-consumer-smoke.ps1 index 595b0ff..270d85c 100644 --- a/scripts/run-runtime-owner-conformance-consumer-smoke.ps1 +++ b/scripts/run-runtime-owner-conformance-consumer-smoke.ps1 @@ -93,6 +93,16 @@ node $consumerScript $consumerExport ` --expect-runtime-world-target tui:tui ` --expect-runtime-world-field tui:tui:supportLevel:terminal-grid-command-surface ` --expect-runtime-world-field tui:tui:ownership:runtime-lowers-provider-world-surface-without-owning-world-state ` + --expect-world-lowering-coverage eve.world-smoke:eve.world-smoke.surface:web-reference:claimed:Eve:web ` + --expect-world-lowering-coverage eve.world-smoke:eve.world-smoke.surface:unity-uitoolkit:claimed:EveUnity:unity-uitoolkit ` + --expect-world-lowering-coverage eve.world-smoke:eve.world-smoke.surface:unity-scene:claimed:EveUnity:unity-scene ` + --expect-world-lowering-coverage eve.world-smoke:eve.world-smoke.surface:electron-shell:claimed:EveElectron:electron-shell ` + --expect-world-lowering-coverage eve.world-smoke:eve.world-smoke.surface:tui:claimed:EveTui:tui ` + --expect-command-boundary-coverage eve.world-smoke:eve.world-smoke.surface:web-reference:covered:Eve:web ` + --expect-command-boundary-coverage eve.world-smoke:eve.world-smoke.surface:unity-uitoolkit:covered:EveUnity:unity-uitoolkit ` + --expect-command-boundary-coverage eve.world-smoke:eve.world-smoke.surface:unity-scene:covered:EveUnity:unity-scene ` + --expect-command-boundary-coverage eve.world-smoke:eve.world-smoke.surface:electron-shell:covered:EveElectron:electron-shell ` + --expect-command-boundary-coverage eve.world-smoke:eve.world-smoke.surface:tui:covered:EveTui:tui ` --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:supported:EveUnity ` @@ -153,6 +163,10 @@ node $consumerScript $consumerExport ` --expect-screenshot-metric web:sai-vn:structure:pass ` --expect-screenshot-metric web:sai-vn:color-tokens:pass ` --expect-screenshot-metric web:sai-vn:bounding-boxes:pass ` + --expect-screenshot-metric web:eve-world-smoke:structure:pass ` + --expect-screenshot-metric web:eve-world-smoke:color-tokens:pass ` + --expect-screenshot-metric web:eve-world-smoke:text-presence:pass ` + --expect-screenshot-metric web:eve-world-smoke:bounding-boxes:pass ` --expect-screenshot-metric unity-scene:aetheria-world:bounding-boxes:pending-capture ` --expect-screenshot-metric electron-shell:aetheria-world:bounding-boxes:pending-capture ` --expect-screenshot-metric tui:aetheria-world:bounding-boxes:terminal-grid-capture ` diff --git a/tools/parity/parity-manifest.json b/tools/parity/parity-manifest.json index 613aea1..bd514d5 100644 --- a/tools/parity/parity-manifest.json +++ b/tools/parity/parity-manifest.json @@ -222,6 +222,26 @@ "commandReferencesDeclared": true } }, + { + "id": "eve-world-smoke", + "title": "Generic Interactive World Smoke", + "pack": "core", + "ownerRepo": "Eve", + "surface": { + "transport": "local-json", + "path": "web/fixtures/eve-world-smoke-surface.json" + }, + "metadataPath": "web/fixtures/eve-world-smoke-surface.conformance.json", + "expect": { + "providerId": "eve.world-smoke", + "componentKinds": ["surface", "card", "text", "metric", "field.surface2d", "control.button"], + "styleTokens": ["colorBackground", "colorPanel", "colorText", "colorMuted", "colorAccent", "fontBody", "fontTitle"], + "bindings": ["eve.world-smoke.frame", "eve.world-smoke.field"], + "commandDescriptors": ["eve.world-smoke.commands"], + "commandDescriptorSchema": "gamecult.eve.command.v1", + "commandReferencesDeclared": true + } + }, { "id": "fensalir-direct2d", "title": "Fensalir Direct2D Adapter", @@ -379,6 +399,27 @@ "web/fixtures/aetheria-provider-handoff.json", "scripts/run-aetheria-provider-handoff-smoke.ps1" ] + }, + { + "providerId": "eve.world-smoke", + "title": "Generic Interactive World Smoke", + "kind": "contract.fixture", + "ownerRepo": "Eve", + "repoRole": "core-contract-fixture", + "graduationTrigger": "Stays in Eve core as the minimal non-product interactive-world control fixture.", + "schemaPath": "schemas/gamecult.eve.provider_advertisement.v1.schema.json", + "advertisementPath": "web/fixtures/eve-world-smoke.provider-advertisement.json", + "requiredFixtures": ["eve-world-smoke"], + "expectedSchemas": ["gamecult.eve.surface.v1", "gamecult.eve.command.v1", "eve.world_smoke.frame.v1"], + "expectedSurfaces": ["eve.world-smoke.surface"], + "expectedSurfaceKinds": { + "eve.world-smoke.surface": "interactive-world" + }, + "expectedCommands": ["eve.world-smoke.commands"], + "expectedPaths": [ + "web/fixtures/eve-world-smoke-surface.json", + "web/fixtures/eve-world-smoke-surface.conformance.json" + ] } ], "pluginManifests": [ @@ -1102,14 +1143,15 @@ "manifestPath": "web/eve-runtime-capability.json" }, "semanticHarness": true, - "requiredFixtures": ["embedded-surface"], + "requiredFixtures": ["embedded-surface", "eve-world-smoke"], "pluginFixtures": ["sai-vn"], "supportedFeatures": ["embeddedDocuments", "providerAdvertisements", "stateBindings", "styleTokens", "authorityWitnesses"], "localProviderCatalog": { "path": "web/local-provider-catalog.json", - "requiredProviders": ["aetheria", "repixelizer", "gamecult.home.vn"], + "requiredProviders": ["aetheria", "eve.world-smoke", "repixelizer", "gamecult.home.vn"], "requiredAdvertisements": [ "web/fixtures/aetheria.provider-advertisement.json", + "web/fixtures/eve-world-smoke.provider-advertisement.json", "web/fixtures/repixelizer.provider-advertisement.json", "web/fixtures/sai-vn.provider-advertisement.json" ] @@ -1138,7 +1180,8 @@ "evidencePaths": [ "web/surface.js", "packages/eve-browser-lowering/src/index.ts", - "web/fixtures/aetheria.provider-advertisement.json" + "web/fixtures/aetheria.provider-advertisement.json", + "web/fixtures/eve-world-smoke.provider-advertisement.json" ] } ], @@ -1153,11 +1196,11 @@ }, { "path": "web/provider-advertisements.test.mjs", - "contains": ["preserves Sai required and optional nested plugin requirements from advertisement", "merges local fixture transport with advertised Aetheria world interaction", "requiresPlugins", "worldInteraction", "optional-nested", "aetheria.daemon.commands"] + "contains": ["preserves Sai required and optional nested plugin requirements from advertisement", "merges local fixture transport with advertised Aetheria world interaction", "merges generic world fixture transport with advertised world interaction", "requiresPlugins", "worldInteraction", "optional-nested", "aetheria.daemon.commands", "eve.world-smoke.commands"] }, { "path": "web/local-provider-catalog.json", - "contains": ["aetheria.provider-advertisement.json", "repixelizer.provider-advertisement.json", "sai-vn.provider-advertisement.json"] + "contains": ["aetheria.provider-advertisement.json", "eve-world-smoke.provider-advertisement.json", "repixelizer.provider-advertisement.json", "sai-vn.provider-advertisement.json"] }, { "path": "packages/eve-browser-lowering/src/index.ts", @@ -1239,6 +1282,14 @@ "schema": "gamecult.eve.web_layout_probe.v1", "path": "artifacts/web-reference-layout-probe/latest/sai-vn.json", "runner": "scripts/run-web-reference-layout-probe-smoke.ps1" + }, + { + "fixtureId": "eve-world-smoke", + "providerId": "eve.world-smoke", + "surfaceId": "eve.world-smoke.surface", + "schema": "gamecult.eve.web_layout_probe.v1", + "path": "artifacts/web-reference-layout-probe/latest/eve-world-smoke.json", + "runner": "scripts/run-web-reference-layout-probe-smoke.ps1" } ] } diff --git a/web/eve-runtime-capability.json b/web/eve-runtime-capability.json index e9153d2..e4a5416 100644 --- a/web/eve-runtime-capability.json +++ b/web/eve-runtime-capability.json @@ -58,7 +58,8 @@ "evidencePaths": [ "web/surface.js", "packages/eve-browser-lowering/src/index.ts", - "web/fixtures/aetheria.provider-advertisement.json" + "web/fixtures/aetheria.provider-advertisement.json", + "web/fixtures/eve-world-smoke.provider-advertisement.json" ] } ], diff --git a/web/fixtures/eve-world-smoke-surface.conformance.json b/web/fixtures/eve-world-smoke-surface.conformance.json new file mode 100644 index 0000000..8010962 --- /dev/null +++ b/web/fixtures/eve-world-smoke-surface.conformance.json @@ -0,0 +1,19 @@ +{ + "schema": "gamecult.eve.conformance_fixture.v1", + "fixtureId": "eve-world-smoke", + "title": "Generic Interactive World Smoke", + "pack": "core", + "ownerRepo": "Eve", + "surface": { + "transport": "local-json", + "path": "web/fixtures/eve-world-smoke-surface.json" + }, + "purpose": "Proves interactive-world lowering is provider-agnostic and does not require Aetheria product state.", + "exitCriteria": "Stays in Eve core as the minimal control fixture for provider-owned world surface contracts.", + "asserts": [ + "interactive-world surface shape", + "provider-owned command boundary", + "field.surface2d projection", + "generic runtime lowering target coverage" + ] +} diff --git a/web/fixtures/eve-world-smoke-surface.json b/web/fixtures/eve-world-smoke-surface.json new file mode 100644 index 0000000..37cd10b --- /dev/null +++ b/web/fixtures/eve-world-smoke-surface.json @@ -0,0 +1,114 @@ +{ + "type": "surface-state", + "schema": "gamecult.eve.surface.v1", + "providerId": "eve.world-smoke", + "providerKind": "contract.fixture", + "title": "Generic Interactive World Smoke", + "version": 1, + "updatedAtUtc": "2026-07-09T00:00:00Z", + "surface": { + "id": "eve.world-smoke.surface", + "root": { + "id": "eve.world-smoke.root", + "kind": "surface", + "props": {}, + "children": [ + { + "id": "eve.world-smoke.summary", + "kind": "card", + "props": { + "title": "World Contract Control" + }, + "children": [ + { + "id": "eve.world-smoke.summary.text", + "kind": "text", + "props": { + "text": "A tiny provider-owned world surface used to prove generic runtime lowering without Aetheria product state." + }, + "children": [] + }, + { + "id": "eve.world-smoke.tick", + "kind": "metric", + "props": { + "label": "Tick", + "bind": "eve.world-smoke.frame", + "value": "42" + }, + "children": [] + } + ] + }, + { + "id": "eve.world-smoke.field", + "kind": "field.surface2d", + "props": { + "label": "Contract Field", + "bind": "eve.world-smoke.field", + "fieldId": "eve.world-smoke.contract-field", + "fieldKind": "scalar2d", + "bounds": "-128,-128,128,128", + "bodies": "Beacon:0:0:90;Probe:48:-32:24", + "objects": "beacon:0:0;probe:48:-32", + "sampleCount": "16", + "visualizer": "points" + }, + "children": [] + }, + { + "id": "eve.world-smoke.commands", + "kind": "card", + "props": { + "title": "Command Boundary" + }, + "children": [ + { + "id": "eve.world-smoke.command.focus", + "kind": "control.button", + "props": { + "label": "Focus Beacon", + "command": "eve.world-smoke.commands", + "commandId": "eve.world-smoke.focus", + "action": { + "target": "eve.world-smoke.commands", + "operation": "focus_object", + "objectId": "Beacon" + } + }, + "children": [] + }, + { + "id": "eve.world-smoke.authority", + "kind": "text", + "props": { + "text": "The provider owns accepted state and receipts; runtimes only lower this command surface." + }, + "children": [] + } + ] + } + ] + }, + "styles": { + "tokens": { + "colorBackground": "#11161A", + "colorPanel": "#263238", + "colorText": "#EEF4F1", + "colorMuted": "#9FB0AA", + "colorAccent": "#7DC7B8", + "fontBody": "Inter", + "fontTitle": "Inter" + } + } + }, + "commands": [ + { + "command": "eve.world-smoke.commands", + "schema": "gamecult.eve.command.v1", + "transport": "cultmesh", + "authority": "eve.world-smoke.provider", + "result": "accepted-denied-or-reconciled" + } + ] +} diff --git a/web/fixtures/eve-world-smoke.provider-advertisement.json b/web/fixtures/eve-world-smoke.provider-advertisement.json new file mode 100644 index 0000000..6cbd8c8 --- /dev/null +++ b/web/fixtures/eve-world-smoke.provider-advertisement.json @@ -0,0 +1,63 @@ +{ + "schema": "gamecult.eve.provider_advertisement.v1", + "providerId": "eve.world-smoke", + "serviceId": "eve.world-smoke.service", + "verseId": "eve.local", + "rootVerse": "eve", + "canonicalService": "eve.world-smoke", + "locatedService": "eve.local", + "cultMeshAddress": "cultmesh://eve.local/eve/providers/eve.world-smoke", + "title": "Generic Interactive World Smoke", + "kind": "contract.fixture", + "updatedAtUtc": "2026-07-09T00:00:00Z", + "freshness": { + "state": "fixture", + "lastSeenAtUtc": "2026-07-09T00:00:00Z", + "maxAgeMs": 15000 + }, + "schemas": [ + "eve.world_smoke.frame.v1", + "eve.world_smoke.command_receipt.v1", + "gamecult.eve.surface.v1", + "gamecult.eve.command.v1" + ], + "witnesses": [ + { + "kind": "fixture", + "ref": "web/fixtures/eve-world-smoke-surface.json", + "summary": "Minimal provider-owned interactive world surface used as a non-Aetheria runtime lowering control." + } + ], + "surfaces": [ + { + "schema": "gamecult.eve.surface.v1", + "surfaceId": "eve.world-smoke.surface", + "key": "eve:surface:eve.world-smoke.surface", + "transport": "cultmesh-record", + "status": "available", + "audience": "runtime-owner", + "mode": "interactive", + "surfaceKind": "interactive-world", + "interactionModel": "provider-command-receipts", + "worldInteraction": { + "projectionKind": "provider-authored-world-surface", + "stateSchemas": [ + "eve.world_smoke.frame.v1" + ], + "commandBoundary": "eve.world-smoke.commands", + "receiptSchema": "eve.world_smoke.command_receipt.v1", + "loweringTargets": ["web-reference", "unity-uitoolkit", "unity-scene", "electron-shell", "tui"], + "ownership": "provider-owns-world-state-and-command-receipts" + }, + "summary": "Tiny contract fixture for proving runtime world-surface lowering without product-specific provider state." + } + ], + "commands": [ + { + "command": "eve.world-smoke.commands", + "schema": "gamecult.eve.command.v1", + "transport": "cultmesh", + "summary": "Fixture command boundary for provider-owned world command intents." + } + ] +} diff --git a/web/local-provider-catalog.json b/web/local-provider-catalog.json index 78c087e..dc5ea17 100644 --- a/web/local-provider-catalog.json +++ b/web/local-provider-catalog.json @@ -15,6 +15,19 @@ } ] }, + { + "providerId": "eve.world-smoke", + "title": "Generic Interactive World Smoke", + "kind": "contract.fixture", + "advertisement": "./fixtures/eve-world-smoke.provider-advertisement.json", + "surfaces": [ + { + "transport": "local-json", + "surfaceId": "eve.world-smoke.surface", + "url": "./fixtures/eve-world-smoke-surface.json" + } + ] + }, { "providerId": "repixelizer", "title": "Repixelizer", diff --git a/web/provider-advertisements.test.mjs b/web/provider-advertisements.test.mjs index fb1f6f2..6751e5b 100644 --- a/web/provider-advertisements.test.mjs +++ b/web/provider-advertisements.test.mjs @@ -5,6 +5,7 @@ import { findProviderCatalogEntry, mergeProviderAdvertisement } from "./provider const catalog = JSON.parse(readFileSync(new URL("./local-provider-catalog.json", import.meta.url), "utf8")); const aetheriaAdvertisement = JSON.parse(readFileSync(new URL("./fixtures/aetheria.provider-advertisement.json", import.meta.url), "utf8")); +const worldSmokeAdvertisement = JSON.parse(readFileSync(new URL("./fixtures/eve-world-smoke.provider-advertisement.json", import.meta.url), "utf8")); const saiAdvertisement = JSON.parse(readFileSync(new URL("./fixtures/sai-vn.provider-advertisement.json", import.meta.url), "utf8")); test("merges local fixture transport with advertised Aetheria world interaction", () => { @@ -21,6 +22,20 @@ test("merges local fixture transport with advertised Aetheria world interaction" assert.equal(provider.localAdvertisement.providerId, "aetheria"); }); +test("merges generic world fixture transport with advertised world interaction", () => { + const catalogProvider = findProviderCatalogEntry(catalog, "eve.world-smoke"); + const provider = mergeProviderAdvertisement(catalogProvider, worldSmokeAdvertisement); + const surface = provider.surfaces.find(candidate => candidate.surfaceId === "eve.world-smoke.surface"); + + assert.equal(surface.transport, "local-json"); + assert.equal(surface.url, "./fixtures/eve-world-smoke-surface.json"); + assert.equal(surface.surfaceKind, "interactive-world"); + assert.equal(surface.worldInteraction.projectionKind, "provider-authored-world-surface"); + assert.equal(surface.worldInteraction.commandBoundary, "eve.world-smoke.commands"); + assert.equal(surface.worldInteraction.receiptSchema, "eve.world_smoke.command_receipt.v1"); + assert.deepEqual(surface.worldInteraction.loweringTargets, ["web-reference", "unity-uitoolkit", "unity-scene", "electron-shell", "tui"]); +}); + test("preserves Sai required and optional nested plugin requirements from advertisement", () => { const catalogProvider = findProviderCatalogEntry(catalog, "gamecult.home.vn"); const provider = mergeProviderAdvertisement(catalogProvider, saiAdvertisement);