From ef403277a0ec9e2f3964e2b34d566ea00cbf7519 Mon Sep 17 00:00:00 2001 From: Nitin Khanna Date: Fri, 29 May 2026 09:02:13 -0700 Subject: [PATCH 1/7] Fix HUD-on-by-default, document editor-lifecycle erth pitfall, add playground smokes - scene/v2.ts: derive showHud from persisted userData.game (default false) instead of hardcoding true, so the HUD is opt-in and no longer appears on every reload/replay. - CLAUDE.md: document that editor lifecycle hooks run without init(), the erth-undefined crash class, and that gameObject has no .game. - EngineRuntime.ts: clarify HUD teardown is owned by game.reset()->hud.clear(). - Add Playwright smokes: solar-system playground, HUD replay-leak, and a generic all-games playground harness. Co-Authored-By: Claude Opus 4.8 (1M context) --- CLAUDE.md | 13 + .../packages/editor-oss/src/EngineRuntime.ts | 2 + .../src/adapters/remote-go/scene/v2.ts | 24 +- .../playwright/oss-all-games-playground.mjs | 299 ++++++++++++++++++ scripts/playwright/oss-hud-replay-leak.mjs | 225 +++++++++++++ .../oss-solar-system-playground.mjs | 235 ++++++++++++++ 6 files changed, 792 insertions(+), 6 deletions(-) create mode 100644 scripts/playwright/oss-all-games-playground.mjs create mode 100644 scripts/playwright/oss-hud-replay-leak.mjs create mode 100644 scripts/playwright/oss-solar-system-playground.mjs diff --git a/CLAUDE.md b/CLAUDE.md index 25333264..50518132 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -103,6 +103,19 @@ When you add a new feature that needs to write data, route it through - Reach the engine from inside a behavior via `this.erth.*` and `this.gameObject`. Old `EventBus` and `this.target` style code is deprecated. +- **Editor lifecycle hooks run without `init()`.** `onEditorAdded`, + `onEditorAttributesUpdated`, and `onEditorUpdate` fire in the editor + (e.g. at import/attach time) where `init(game)` is never called. A + common bug class: a behavior caches `const erth = this.erth` (or + `game`) *only* inside `init()`, then dereferences that module-local in + an editor hook — yielding `Cannot read properties of undefined (reading + 'asset')` and silently failing to load textures/assets. Always read + engine handles from `this.erth` / `this.gameObject` directly, or + re-derive the locals at the top of *every* lifecycle entry point — + never assume `init()` already ran. Note `this.gameObject` exposes + `uuid`/`position`/`rotation`/`scale`/`visible`/`physics`/`_internal.three` + only — there is **no** `gameObject.game`; in the editor `game` is + typically `undefined`, so guard any `game.renderer.*` access. - Lifecycle docs: `docs/behaviors/`. ## Lambdas (ECS) diff --git a/client/packages/editor-oss/src/EngineRuntime.ts b/client/packages/editor-oss/src/EngineRuntime.ts index 4adf5ed8..b486122f 100644 --- a/client/packages/editor-oss/src/EngineRuntime.ts +++ b/client/packages/editor-oss/src/EngineRuntime.ts @@ -1869,6 +1869,8 @@ export class EngineRuntime extends AppRuntime implements RuntimeContext { this.playerMask.hide(); //global.app.setAutoSave(this.autoSaveState); + // NOTE: game.reset() tears down the HUD DOM root via `this.hud?.clear()`, + // so the `hud-view-container` created in startPlayer is removed here. this.game?.reset(); this.clock.stop(); diff --git a/client/packages/network/src/adapters/remote-go/scene/v2.ts b/client/packages/network/src/adapters/remote-go/scene/v2.ts index bdd37104..2a6d9366 100644 --- a/client/packages/network/src/adapters/remote-go/scene/v2.ts +++ b/client/packages/network/src/adapters/remote-go/scene/v2.ts @@ -148,18 +148,30 @@ async function loadSceneFromProjectStore(sceneId: string): Promise = {}; let ossLogicalIdToAssetId: Record = {}; + // `showHud` (and the other game flags) live in the persisted scene's + // `userData.game`, not in separate metadata. Default to OFF — the HUD is + // opt-in (see SceneConfig.showHUD = false). Hardcoding `true` here made the + // HUD appear on every reload regardless of the project's actual setting. + let ossShowHud = false; try { const parsed = JSON.parse(body.sceneJson) as Record; for (const part of Object.values(parsed)) { - const ctx = (part as {userData?: {assetResolutionContext?: { - assetIdToRevisionId?: Record; - logicalIdToAssetId?: Record; - }}})?.userData?.assetResolutionContext; + const userData = (part as {userData?: { + assetResolutionContext?: { + assetIdToRevisionId?: Record; + logicalIdToAssetId?: Record; + }; + game?: {showHUD?: boolean}; + }})?.userData; + const ctx = userData?.assetResolutionContext; if (ctx) { ossDependencies = ctx.assetIdToRevisionId ?? ossDependencies; ossLogicalIdToAssetId = ctx.logicalIdToAssetId ?? ossLogicalIdToAssetId; - break; } + if (typeof userData?.game?.showHUD === "boolean") { + ossShowHud = userData.game.showHUD; + } + if (ctx) break; } } catch (err) { console.warn("[scene/v2] failed to extract asset resolution context from scene JSON", err); @@ -185,7 +197,7 @@ async function loadSceneFromProjectStore(sceneId: string): Promise s.trim()).filter(Boolean); + +// ---- file helpers ---- +function walkFiles(root) { + const out = []; + const recurse = (dir, prefix) => { + for (const entry of readdirSync(dir)) { + if (entry === ".DS_Store") continue; + const abs = join(dir, entry); + const rel = prefix ? `${prefix}/${entry}` : entry; + if (statSync(abs).isDirectory()) recurse(abs, rel); + else out.push({name: rel, abs}); + } + }; + recurse(root, ""); + return out; +} +function mimeFor(name) { + const l = name.toLowerCase(); + if (l.endsWith(".gltf")) return "model/gltf+json"; + if (l.endsWith(".glb")) return "model/gltf-binary"; + if (l.endsWith(".png")) return "image/png"; + if (l.endsWith(".jpg") || l.endsWith(".jpeg")) return "image/jpeg"; + if (l.endsWith(".webp")) return "image/webp"; + if (l.endsWith(".mp3")) return "audio/mpeg"; + if (l.endsWith(".wav")) return "audio/wav"; + if (l.endsWith(".ogg")) return "audio/ogg"; + if (l.endsWith(".mp4")) return "video/mp4"; + if (l.endsWith(".hdr")) return "image/vnd.radiance"; + if (l.endsWith(".exr")) return "image/x-exr"; + if (l.endsWith(".yaml") || l.endsWith(".yml")) return "application/x-yaml"; + if (l.endsWith(".json")) return "application/json"; + if (l.endsWith(".md") || l.endsWith(".txt") || l.endsWith(".stemscript")) return "text/plain"; + return "application/octet-stream"; +} + +// ---- error classification ---- +// Lines that are noisy-but-harmless in this engine; recorded, never fatal. +const NOISE = [ + /THREE\.\w+ has been deprecated/i, + /THREE\.Clock: This module has been deprecated/i, + /WebGLProgram: Shader Error/i, // shader warns surface as console.error + /Vertex shader is not compiled/i, + /\[Violation\]/i, + /ResizeObserver loop/i, + /favicon/i, + /Download the React DevTools/i, + /sceneFields|lastSaveTime is undefined/i, + /non-passive event listener/i, +]; +// Lines that indicate a genuine runtime exception / behavior failure. +const EXCEPTION = [ + /TypeError/i, + /ReferenceError/i, + /RangeError/i, + /is not a function/i, + /Cannot read properties of/i, + /Cannot access /i, + /is not defined/i, + /Unhandled|Uncaught/i, + /Error in onEditor\w+ for plugin/i, // BehaviorPluginManager lifecycle failures + /Initialisation error in/i, + /script (init|update|onStart|onEvent)/i, +]; +const isNoise = t => NOISE.some(r => r.test(t)); +const isException = t => !isNoise(t) && EXCEPTION.some(r => r.test(t)); + +// ---- discover games ---- +function discoverGames() { + const games = []; + for (const entry of readdirSync(gamesRoot)) { + if (entry.startsWith(".")) continue; + const dir = join(gamesRoot, entry); + if (!statSync(dir).isDirectory()) continue; + if (gamesFilter.length && !gamesFilter.includes(entry)) continue; + const files = walkFiles(dir); + const scriptFile = files.find(f => f.name.toLowerCase().endsWith(".stemscript")); + if (scriptFile) games.push({name: entry, dir, files, scriptFile}); + } + return games.sort((a, b) => a.name.localeCompare(b.name)); +} + +const games = discoverGames(); +console.log(`Discovered ${games.length} games under ${gamesRoot}${gamesFilter.length ? ` (filtered: ${gamesFilter.join(",")})` : ""}`); +if (!games.length) { console.error("No games found"); process.exit(1); } + +const browser = await chromium.launch({headless: !headed}); +const summary = {baseUrl, gamesRoot, startedAt: new Date().toISOString(), games: []}; + +// dialog/modal helpers parameterised by page +const mkHelpers = (page) => ({ + dismissBootstrap: async () => { + const bs = page.locator('[aria-labelledby="oss-bootstrap-title"]').first(); + if (await bs.count() && await bs.isVisible().catch(() => false)) { + await bs.locator('button:has-text("Browser storage")').first().click({timeout: 3000}).catch(() => {}); + await bs.locator('button:has-text("Continue")').first().click({timeout: 5000}).catch(() => {}); + await page.waitForSelector('[aria-labelledby="oss-bootstrap-title"]', {state: "detached", timeout: 5000}).catch(() => {}); + } + }, + dismissTutorial: async () => { + const g = page.locator('button:has-text("Got It")').first(); + if (await g.count() && await g.isVisible().catch(() => false)) await g.click({timeout: 3000}).catch(() => {}); + }, +}); + +async function runGame(game) { + const outDir = resolve(outRoot, game.name); + mkdirSync(outDir, {recursive: true}); + const rec = { + name: game.name, script: basename(game.scriptFile.name), files: game.files.length, + steps: [], consoleErrors: [], pageErrors: [], failedRequests: [], + startClicked: false, canvasVisible: false, status: "pending", failReasons: [], + }; + const step = (s, ok = true, d) => { rec.steps.push({s, ok, d}); console.log(` ${ok ? "·" : "✗"} ${s}${d ? ` (${d})` : ""}`); }; + + const ctx = await browser.newContext({viewport: {width: 1440, height: 900}}); + const page = await ctx.newPage(); + const {dismissBootstrap, dismissTutorial} = mkHelpers(page); + page.on("console", m => { if (m.type() === "error") rec.consoleErrors.push(m.text().slice(0, 400)); }); + page.on("pageerror", e => rec.pageErrors.push((e.message || String(e)).slice(0, 400))); + page.on("requestfailed", r => { const u = r.url(); if (!/favicon|analytics|sentry/i.test(u)) rec.failedRequests.push(`${r.method()} ${u} :: ${r.failure()?.errorText}`); }); + + try { + const scriptContent = readFileSync(game.scriptFile.abs, "utf8"); + const folderFiles = game.files.filter(f => f !== game.scriptFile) + .map(f => ({name: f.name, mime: mimeFor(f.name), data: readFileSync(f.abs).toString("base64")})); + + // 1. activate playground + await page.goto(baseUrl + "/dashboard?mode=playground", {waitUntil: "domcontentloaded", timeout: 30000}); + await page.waitForLoadState("networkidle", {timeout: 15000}).catch(() => {}); + await dismissBootstrap(); + const pg = await page.evaluate(() => { try { return window.sessionStorage.getItem("stem.playgroundMode") === "1"; } catch { return false; } }); + step("playground activated", pg); + + // 2. fresh project + await page.goto(baseUrl + "/create/project", {waitUntil: "domcontentloaded", timeout: 30000}); + await page.waitForLoadState("networkidle", {timeout: 15000}).catch(() => {}); + await dismissBootstrap(); + await page.waitForTimeout(6000); + await dismissTutorial(); + + // 3. expose __stemRunScript via copilot, import + const copilotBtn = page.locator('[data-testid="actionbar-copilot"]').first(); + const cBox = await copilotBtn.boundingBox().catch(() => null); + if (cBox) await page.mouse.click(cBox.x + cBox.width / 2, cBox.y + cBox.height / 2); + else await copilotBtn.click({timeout: 3000, force: true}).catch(() => {}); + await page.waitForTimeout(2000); + const hookPresent = await page.evaluate(() => typeof window.__stemRunScript === "function"); + step("run-script hook exposed", hookPresent); + if (!hookPresent) throw new Error("__stemRunScript not exposed"); + + const execStartUrl = page.url(); + try { + await page.evaluate(({content, fileList}) => + window.__stemRunScript(content, fileList).then(() => { window.__d = "ok"; }, e => { window.__d = String(e && e.message ? e.message : e); }), + {content: scriptContent, fileList: folderFiles}); + } catch { /* exec may navigate */ } + await page.waitForLoadState("networkidle", {timeout: 120000}).catch(() => {}); + await page.waitForTimeout(6000); + await dismissTutorial(); + const execResult = await page.evaluate(() => window.__d ?? null).catch(() => null); + const execOk = execResult === "ok" || page.url() !== execStartUrl; + step("import exec", execOk, execResult ?? "no signal"); + await page.screenshot({path: resolve(outDir, "01-after-import.png")}).catch(() => {}); + + // 4. save + await page.locator('[data-testid="topnav-app-menu"]').first().click({timeout: 3000, force: true}).catch(() => {}); + await page.waitForTimeout(400); + const save = page.locator("text=Save Project").first(); + if (await save.isVisible().catch(() => false)) { await save.click({timeout: 3000}).catch(() => {}); await page.waitForTimeout(3500); } + const sceneId = (page.url().match(/\/create\/project\/([^/?#]+)/) || [])[1] || null; + step("saved", !!sceneId, sceneId ?? "no scene id"); + + // 5. reload via dashboard + await page.goto(baseUrl + "/dashboard?mode=playground", {waitUntil: "domcontentloaded", timeout: 20000}).catch(() => {}); + await page.waitForLoadState("networkidle", {timeout: 15000}).catch(() => {}); + await dismissBootstrap(); + await page.waitForTimeout(2000); + if (sceneId) { + const card = page.locator(`[data-scene-id="${sceneId}"]`).first(); + if (await card.count()) { + await card.click({timeout: 5000}).catch(() => {}); + await page.waitForLoadState("networkidle", {timeout: 30000}).catch(() => {}); + await dismissBootstrap(); + await page.waitForSelector("canvas", {timeout: 30000}).catch(() => {}); + await dismissTutorial(); + await page.waitForTimeout(8000); + } else step("project card found on dashboard", false, sceneId); + } + rec.canvasVisible = await page.locator("canvas").first().isVisible().catch(() => false); + step("editor reloaded, canvas visible", rec.canvasVisible); + await page.screenshot({path: resolve(outDir, "02-reloaded-editor.png")}).catch(() => {}); + + // mark: errors before play are "load" errors + const loadErrCount = rec.consoleErrors.length; + + // 6. enter Play + START GAME + const playBtn = page.locator('[data-testid="topnav-play"]').first(); + if (await playBtn.isVisible().catch(() => false)) { + await playBtn.click({timeout: 3000, force: true}).catch(() => {}); + const dontSave = page.locator("button", {hasText: /don['’]t\s*save/i}).first(); + if (await dontSave.count() && await dontSave.isVisible().catch(() => false)) { await dontSave.click().catch(() => {}); await page.waitForTimeout(500); } + await page.waitForTimeout(4000); + await page.screenshot({path: resolve(outDir, "03-play-pre-start.png")}).catch(() => {}); + + const startGame = page.locator("#startGameBtn").first(); + try { + await startGame.waitFor({state: "visible", timeout: 12000}); + await page.waitForFunction(() => { const b = document.getElementById("startGameBtn"); return b && !b.disabled && b.getAttribute("aria-disabled") !== "true"; }, {timeout: 12000}); + await startGame.click({timeout: 5000, force: true}); + rec.startClicked = true; + step("clicked START GAME"); + } catch { + step("no START GAME button (auto-start game)", true); + } + await page.waitForTimeout(12000); + await page.screenshot({path: resolve(outDir, "04-playing.png")}).catch(() => {}); + } else { + step("Play button not visible", false); + rec.failReasons.push("play-button-missing"); + } + } catch (e) { + step("FATAL", false, (e.message || String(e)).slice(0, 200)); + rec.failReasons.push("fatal:" + (e.message || String(e)).slice(0, 160)); + } finally { + // classify errors + rec.exceptionErrors = [...new Set(rec.consoleErrors.filter(isException))].slice(0, 15); + rec.noiseErrorCount = rec.consoleErrors.filter(isNoise).length; + if (rec.pageErrors.length) rec.failReasons.push(`${rec.pageErrors.length} uncaught page error(s)`); + if (rec.exceptionErrors.length) rec.failReasons.push(`${rec.exceptionErrors.length} exception-like console error(s)`); + if (!rec.canvasVisible) rec.failReasons.push("canvas-not-visible"); + rec.status = rec.failReasons.length ? "FAIL" : "PASS"; + writeFileSync(resolve(outDir, "report.json"), JSON.stringify(rec, null, 2)); + await ctx.close(); + } + return rec; +} + +for (let i = 0; i < games.length; i++) { + console.log(`\n[${i + 1}/${games.length}] ▶ ${games[i].name}`); + const rec = await runGame(games[i]); + summary.games.push(rec); + const tag = rec.status === "PASS" ? "✅" : "❌"; + console.log(` ${tag} ${rec.name}: ${rec.status}${rec.failReasons.length ? " — " + rec.failReasons.join("; ") : ""}`); +} + +summary.finishedAt = new Date().toISOString(); +summary.passed = summary.games.filter(g => g.status === "PASS").map(g => g.name); +summary.failed = summary.games.filter(g => g.status === "FAIL").map(g => g.name); +writeFileSync(resolve(outRoot, "summary.json"), JSON.stringify(summary, null, 2)); + +console.log(`\n=================== SUMMARY ===================`); +console.log(`Passed: ${summary.passed.length}/${summary.games.length}`); +for (const g of summary.games) { + const tag = g.status === "PASS" ? "✅" : "❌"; + console.log(`${tag} ${g.name.padEnd(22)} start=${g.startClicked ? "Y" : "-"} canvas=${g.canvasVisible ? "Y" : "-"} exc=${g.exceptionErrors?.length ?? 0} page=${g.pageErrors.length} noise=${g.noiseErrorCount ?? 0}${g.failReasons.length ? " << " + g.failReasons.join("; ") : ""}`); +} +console.log(`\nReport dir: ${outRoot}`); +await browser.close(); +process.exit(summary.failed.length ? 1 : 0); diff --git a/scripts/playwright/oss-hud-replay-leak.mjs b/scripts/playwright/oss-hud-replay-leak.mjs new file mode 100644 index 00000000..f476bdf7 --- /dev/null +++ b/scripts/playwright/oss-hud-replay-leak.mjs @@ -0,0 +1,225 @@ +#!/usr/bin/env node +/** + * HUD replay diagnostic + regression test. + * + * Reproduces the reported bug: "fresh import + Play = fine, but Edit then Play + * again makes the HUD appear out of nowhere." Drives a fresh Solar System + * import, then runs two Play sessions with an Edit in between, probing at each + * step: + * - editor.showHUD (sceneConfig, from meta.showHud) + * - scene.userData.game.showHUD (settings-command field) + * - #hud-view-container count (leaked HUDManager root divs) + * - #hud-wrapper visible? (the actual rendered HUD) + * + * Assertions: showHUD stays false, the HUD wrapper never becomes visible, and + * HUDManager containers do not accumulate across Play sessions. + * + * Prereq: `bun run dev` on PLAYWRIGHT_BASE_URL (default localhost:5173). + * Set HEADED=1 to watch. Report → scripts/playwright/oss-hud-replay-leak-output/. + */ +import {chromium} from "playwright"; +import {writeFileSync, mkdirSync, readFileSync, readdirSync, statSync, existsSync} from "node:fs"; +import {dirname, resolve, basename, join} from "node:path"; +import {fileURLToPath} from "node:url"; + +const __dirname = dirname(fileURLToPath(import.meta.url)); +const outDir = resolve(__dirname, "oss-hud-replay-leak-output"); +mkdirSync(outDir, {recursive: true}); + +const baseUrl = (process.env.PLAYWRIGHT_BASE_URL || "http://localhost:5173").replace(/\/$/, ""); +const headed = process.env.HEADED === "1"; +const gameFolder = process.env.GAME_FOLDER || "/Users/n/erth/Games-StemScript/solar-system"; + +function walkFiles(root) { + const out = []; + const recurse = (dir, prefix) => { + for (const entry of readdirSync(dir)) { + if (entry === ".DS_Store") continue; + const abs = join(dir, entry); + const rel = prefix ? `${prefix}/${entry}` : entry; + if (statSync(abs).isDirectory()) recurse(abs, rel); + else out.push({name: rel, abs}); + } + }; + recurse(root, ""); + return out; +} +function mimeFor(name) { + const l = name.toLowerCase(); + if (l.endsWith(".png")) return "image/png"; + if (l.endsWith(".jpg") || l.endsWith(".jpeg")) return "image/jpeg"; + if (l.endsWith(".webp")) return "image/webp"; + if (l.endsWith(".yaml") || l.endsWith(".yml")) return "application/x-yaml"; + if (l.endsWith(".json")) return "application/json"; + if (l.endsWith(".md") || l.endsWith(".txt") || l.endsWith(".stemscript")) return "text/plain"; + return "application/octet-stream"; +} + +const report = {baseUrl, gameFolder, startedAt: new Date().toISOString(), probes: {}, assertions: {}, consoleErrors: []}; +const failures = []; +function assert(name, cond, detail) { + report.assertions[name] = {pass: !!cond, detail}; + console.log(cond ? `✓ assert: ${name}` : `✗ assert: ${name} — ${detail ?? ""}`); + if (!cond) failures.push(name); +} + +assert("game-folder-exists", existsSync(gameFolder), gameFolder); +if (failures.length) { writeFileSync(resolve(outDir, "report.json"), JSON.stringify(report, null, 2)); process.exit(1); } + +const files = walkFiles(gameFolder); +const scriptFile = files.find(f => f.name.toLowerCase().endsWith(".stemscript")); +if (!scriptFile) { console.error("no .stemscript"); process.exit(1); } +const scriptContent = readFileSync(scriptFile.abs, "utf8"); +const folderFiles = files.filter(f => f !== scriptFile) + .map(f => ({name: f.name, mime: mimeFor(f.name), data: readFileSync(f.abs).toString("base64")})); +console.log(`read ${files.length} files (${basename(scriptFile.name)})`); + +const browser = await chromium.launch({headless: !headed}); +const ctx = await browser.newContext({viewport: {width: 1440, height: 900}}); +const page = await ctx.newPage(); +page.on("console", m => { if (m.type() === "error") report.consoleErrors.push(m.text().slice(0, 200)); }); + +const dismissBootstrap = async () => { + const bs = page.locator('[aria-labelledby="oss-bootstrap-title"]').first(); + if (await bs.count() && await bs.isVisible().catch(() => false)) { + await bs.locator('button:has-text("Browser storage")').first().click({timeout: 3000}).catch(() => {}); + await bs.locator('button:has-text("Continue")').first().click({timeout: 5000}).catch(() => {}); + await page.waitForSelector('[aria-labelledby="oss-bootstrap-title"]', {state: "detached", timeout: 5000}).catch(() => {}); + } +}; +const dismissTutorial = async () => { + const g = page.locator('button:has-text("Got It")').first(); + if (await g.count() && await g.isVisible().catch(() => false)) await g.click({timeout: 3000}).catch(() => {}); +}; + +// Probe the live HUD state from the page. +const probe = async (label) => { + const data = await page.evaluate(() => { + const app = window.app || window.global?.app; + const editor = app?.editor; + const game = editor?.scene?.userData?.game; + const containers = document.querySelectorAll("#hud-view-container"); + const wrapper = document.getElementById("hud-wrapper"); + const startBtn = document.getElementById("startGameBtn"); + const wrapperVisible = !!wrapper && wrapper.offsetParent !== null && + wrapper.getBoundingClientRect().width > 0 && wrapper.getBoundingClientRect().height > 0; + return { + editorShowHUD: editor?.showHUD ?? null, + gameShowHUD: game?.showHUD ?? null, + isGame: game?.isGame ?? null, + isPlaying: app?.isPlaying ?? null, + hudContainerCount: containers.length, + hudWrapperPresent: !!wrapper, + hudWrapperVisible: wrapperVisible, + startGameBtnPresent: !!startBtn, + }; + }).catch(e => ({error: String(e)})); + report.probes[label] = data; + console.log(`· probe[${label}] ${JSON.stringify(data)}`); + await page.screenshot({path: resolve(outDir, `${label}.png`)}).catch(() => {}); + return data; +}; + +const enterPlay = async () => { + await page.locator('[data-testid="topnav-play"]').first().click({timeout: 5000, force: true}).catch(() => {}); + const dontSave = page.locator("button", {hasText: /don['’]t\s*save/i}).first(); + if (await dontSave.count() && await dontSave.isVisible().catch(() => false)) { await dontSave.click().catch(() => {}); } + await page.waitForTimeout(6000); +}; +const backToEdit = async () => { + await page.locator("button", {hasText: /^Edit$/}).first().click({timeout: 5000, force: true}).catch(() => {}); + await page.waitForTimeout(4000); +}; + +try { + await page.goto(baseUrl + "/create/project", {waitUntil: "domcontentloaded", timeout: 30000}); + await page.waitForLoadState("networkidle", {timeout: 15000}).catch(() => {}); + await dismissBootstrap(); + await page.waitForTimeout(6000); + await dismissTutorial(); + + // Open Copilot → expose __stemRunScript. + const copilotBtn = page.locator('[data-testid="actionbar-copilot"]').first(); + const cBox = await copilotBtn.boundingBox().catch(() => null); + if (cBox) await page.mouse.click(cBox.x + cBox.width / 2, cBox.y + cBox.height / 2); + else await copilotBtn.click({timeout: 3000, force: true}).catch(() => {}); + await page.waitForTimeout(2000); + const hookPresent = await page.evaluate(() => typeof window.__stemRunScript === "function"); + assert("run-script-hook-exposed", hookPresent, "no __stemRunScript"); + if (!hookPresent) throw new Error("no stemRunScript"); + + // Import. + try { + await page.evaluate(({content, fileList}) => + window.__stemRunScript(content, fileList).then(() => { window.__d = "ok"; }, e => { window.__d = String(e); }), + {content: scriptContent, fileList: folderFiles}); + } catch { /* navigation */ } + await page.waitForLoadState("networkidle", {timeout: 90000}).catch(() => {}); + await page.waitForTimeout(6000); + await dismissTutorial(); + assert("import-completed", await page.evaluate(() => window.__d === "ok").catch(() => false) || /create\/project\//.test(page.url()), "import did not complete"); + + await probe("00-edit-baseline"); + + // === Save the project. === + await page.locator('[data-testid="topnav-app-menu"]').first().click({timeout: 3000, force: true}).catch(() => {}); + await page.waitForTimeout(400); + const save = page.locator("text=Save Project").first(); + if (await save.isVisible().catch(() => false)) { await save.click({timeout: 3000}).catch(() => {}); await page.waitForTimeout(3500); } + const sceneId = (page.url().match(/\/create\/project\/([^/?#]+)/) || [])[1] || null; + assert("scene-id-resolved", !!sceneId, `URL: ${page.url()}`); + + // === Reload through the dashboard — this is the path that builds the + // scene DTO via scene/v2.ts, where `showHud` used to be hardcoded true. === + await page.goto(baseUrl + "/dashboard", {waitUntil: "domcontentloaded", timeout: 20000}).catch(() => {}); + await page.waitForLoadState("networkidle", {timeout: 15000}).catch(() => {}); + await dismissBootstrap(); + await page.waitForTimeout(2000); + if (sceneId) { + const card = page.locator(`[data-scene-id="${sceneId}"]`).first(); + assert("imported-project-listed", (await card.count()) > 0, `data-scene-id="${sceneId}" not found`); + await card.click({timeout: 5000}).catch(() => {}); + await page.waitForLoadState("networkidle", {timeout: 30000}).catch(() => {}); + await dismissBootstrap(); + await page.waitForSelector("canvas", {timeout: 30000}).catch(() => {}); + await dismissTutorial(); + await page.waitForTimeout(8000); + } + const reloaded = await probe("01-reloaded-edit"); + + // === Play session #1 (post-reload) === + await enterPlay(); + const play1 = await probe("02-play-1"); + + // === Back to Edit, then Play again (the reported replay repro) === + await backToEdit(); + const edit1 = await probe("03-edit-after-play-1"); + await enterPlay(); + const play2 = await probe("04-play-2"); + + // The HUD start menu (#startGameBtn) and #hud-wrapper only render when + // showHUD is true. With showHud no longer hardcoded true on load, a + // non-HUD game must auto-start with no HUD chrome in either Play session. + assert("no-hud-startmenu-play1", play1.startGameBtnPresent !== true, `play1 startGameBtn present=${play1.startGameBtnPresent}`); + assert("no-hud-startmenu-play2", play2.startGameBtnPresent !== true, `play2 startGameBtn present=${play2.startGameBtnPresent}`); + assert("hud-not-visible-play1", play1.hudWrapperVisible !== true, `play1 hud-wrapper visible=${play1.hudWrapperVisible}`); + assert("hud-not-visible-play2", play2.hudWrapperVisible !== true, `play2 hud-wrapper visible=${play2.hudWrapperVisible}`); + // The HUD root is torn down on stop via game.reset() -> hud.clear(); it must + // not accumulate across Play sessions (a stale-root leak would grow the count). + assert("hud-containers-not-accumulating", (play2.hudContainerCount ?? 0) <= 1, + `container counts: reloaded=${reloaded.hudContainerCount}, play1=${play1.hudContainerCount}, edit1=${edit1.hudContainerCount}, play2=${play2.hudContainerCount}`); + console.log(`container counts: reloaded=${reloaded.hudContainerCount}, play1=${play1.hudContainerCount}, edit1=${edit1.hudContainerCount}, play2=${play2.hudContainerCount}`); +} catch (e) { + console.error("FATAL", e.message); + failures.push("fatal:" + e.message); +} finally { + report.finishedAt = new Date().toISOString(); + report.failures = failures; + writeFileSync(resolve(outDir, "report.json"), JSON.stringify(report, null, 2)); + console.log(`\n=== HUD replay report ===`); + console.log(`Assertions: ${Object.values(report.assertions).filter(a => a.pass).length}/${Object.keys(report.assertions).length} passed`); + console.log(`Probes:\n${JSON.stringify(report.probes, null, 2)}`); + console.log(`Output: ${outDir}`); + await browser.close(); + if (failures.length) { console.error(`\nFAIL: ${failures.join(", ")}`); process.exit(1); } +} diff --git a/scripts/playwright/oss-solar-system-playground.mjs b/scripts/playwright/oss-solar-system-playground.mjs new file mode 100644 index 00000000..fc921680 --- /dev/null +++ b/scripts/playwright/oss-solar-system-playground.mjs @@ -0,0 +1,235 @@ +#!/usr/bin/env node +/** + * End-to-end (PLAYGROUND mode): activate playground, import the Solar System + * stemscript fresh, save, reload through the playground dashboard, and verify + * the behavior framework wires texture loading without the + * `applyTexture` / `loadRingTexture` "Cannot read properties of undefined + * (reading 'asset')" crash — the exact regression reported in playground mode. + * + * The crash originates in the game's editor lifecycle hooks (onEditorAdded) + * reading an init()-only `erth` local. Playground is just a UI-gating flag; it + * loads the project through the same `onSceneLoaded` path, so a clean fresh + * import here proves the fixed behavior code is good in playground too. + * + * Source folder: GAME_FOLDER (defaults to the fixed Games-StemScript copy). + * Prereq: `bun run dev` on PLAYWRIGHT_BASE_URL (default localhost:5173). + * Set HEADED=1 to watch. Report → scripts/playwright/oss-solar-system-playground-output/. + */ +import {chromium} from "playwright"; +import {writeFileSync, mkdirSync, readFileSync, readdirSync, statSync, existsSync} from "node:fs"; +import {dirname, resolve, basename, join} from "node:path"; +import {fileURLToPath} from "node:url"; + +const __dirname = dirname(fileURLToPath(import.meta.url)); +const outDir = resolve(__dirname, "oss-solar-system-playground-output"); +mkdirSync(outDir, {recursive: true}); + +const baseUrl = (process.env.PLAYWRIGHT_BASE_URL || "http://localhost:5173").replace(/\/$/, ""); +const headed = process.env.HEADED === "1"; +const gameFolder = process.env.GAME_FOLDER || "/Users/n/erth/Games-StemScript/solar-system"; + +function walkFiles(root) { + const out = []; + const recurse = (dir, prefix) => { + for (const entry of readdirSync(dir)) { + if (entry === ".DS_Store") continue; + const abs = join(dir, entry); + const rel = prefix ? `${prefix}/${entry}` : entry; + if (statSync(abs).isDirectory()) recurse(abs, rel); + else out.push({name: rel, abs}); + } + }; + recurse(root, ""); + return out; +} + +function mimeFor(name) { + const lower = name.toLowerCase(); + if (lower.endsWith(".gltf")) return "model/gltf+json"; + if (lower.endsWith(".glb")) return "model/gltf-binary"; + if (lower.endsWith(".png")) return "image/png"; + if (lower.endsWith(".jpg") || lower.endsWith(".jpeg")) return "image/jpeg"; + if (lower.endsWith(".webp")) return "image/webp"; + if (lower.endsWith(".yaml") || lower.endsWith(".yml")) return "application/x-yaml"; + if (lower.endsWith(".json")) return "application/json"; + if (lower.endsWith(".md") || lower.endsWith(".txt") || lower.endsWith(".stemscript")) return "text/plain"; + return "application/octet-stream"; +} + +const report = {baseUrl, gameFolder, mode: "playground", startedAt: new Date().toISOString(), steps: [], consoleErrors: [], pageErrors: [], assertions: {}}; +const failures = []; +function logStep(name, status = "ok", details = {}) { + report.steps.push({name, status, details, t: new Date().toISOString()}); + const tag = status === "ok" ? "✓" : status === "warn" ? "⚠" : "✗"; + console.log(`${tag} ${name}${Object.keys(details).length ? ` — ${JSON.stringify(details).slice(0, 240)}` : ""}`); +} +function assert(name, cond, detail) { + report.assertions[name] = {pass: !!cond, detail}; + if (cond) console.log(`✓ assert: ${name}`); + else { console.log(`✗ assert: ${name} — ${detail ?? ""}`); failures.push(name); } +} + +assert("game-folder-exists", existsSync(gameFolder), gameFolder); +if (failures.length) { writeFileSync(resolve(outDir, "report.json"), JSON.stringify(report, null, 2)); process.exit(1); } + +const files = walkFiles(gameFolder); +const scriptFile = files.find(f => f.name.toLowerCase().endsWith(".stemscript")); +assert("script-file-found", !!scriptFile, `no .stemscript in ${gameFolder}`); +if (!scriptFile) process.exit(1); +const scriptContent = readFileSync(scriptFile.abs, "utf8"); +const folderFiles = files.filter(f => f !== scriptFile) + .map(f => ({name: f.name, mime: mimeFor(f.name), data: readFileSync(f.abs).toString("base64")})); +logStep("read solar-system folder", "ok", {files: files.length, script: basename(scriptFile.name)}); + +const browser = await chromium.launch({headless: !headed}); +const ctx = await browser.newContext({viewport: {width: 1440, height: 900}}); +const page = await ctx.newPage(); +page.on("console", m => { if (m.type() === "error") report.consoleErrors.push({text: m.text(), location: m.location()}); }); +page.on("pageerror", e => report.pageErrors.push({message: e.message, stack: e.stack?.slice(0, 2000)})); + +const dismissBootstrap = async () => { + const bs = page.locator('[aria-labelledby="oss-bootstrap-title"]').first(); + if (await bs.count() && await bs.isVisible().catch(() => false)) { + await bs.locator('button:has-text("Browser storage")').first().click({timeout: 3000}).catch(() => {}); + await bs.locator('button:has-text("Continue")').first().click({timeout: 5000}).catch(() => {}); + await page.waitForSelector('[aria-labelledby="oss-bootstrap-title"]', {state: "detached", timeout: 5000}).catch(() => {}); + await page.waitForTimeout(400); + } +}; +const dismissTutorial = async () => { + const gotIt = page.locator('button:has-text("Got It")').first(); + if (await gotIt.count() && await gotIt.isVisible().catch(() => false)) { + await gotIt.click({timeout: 3000}).catch(() => {}); + await page.waitForTimeout(300); + } +}; + +try { + // === Activate playground mode on the dashboard (sets sessionStorage flag). === + await page.goto(baseUrl + "/dashboard?mode=playground", {waitUntil: "domcontentloaded", timeout: 30000}); + await page.waitForLoadState("networkidle", {timeout: 15000}).catch(() => {}); + await dismissBootstrap(); + const playgroundActive = await page.evaluate(() => document.documentElement.dataset.playgroundMode === "true"); + assert("playground-mode-active", playgroundActive, "data-playground-mode not set on "); + + // === Boot a fresh project (flag persists via sessionStorage). === + await page.goto(baseUrl + "/create/project", {waitUntil: "domcontentloaded", timeout: 30000}); + await page.waitForLoadState("networkidle", {timeout: 15000}).catch(() => {}); + await dismissBootstrap(); + await page.waitForTimeout(6000); + await dismissTutorial(); + // The `data-playground-mode` attribute is only applied on the public-site + // container mount; the editor route persists the flag via sessionStorage. + const stillPlayground = await page.evaluate(() => { + try { return window.sessionStorage.getItem("stem.playgroundMode") === "1"; } catch { return false; } + }); + assert("playground-persists-into-editor", stillPlayground, "playground sessionStorage flag lost after navigation"); + assert("editor-mounted", /\/create\/project/.test(page.url()), `URL: ${page.url()}`); + + // === Open Copilot so `__stemRunScript` is exposed (allowed in playground). === + const copilotBtn = page.locator('[data-testid="actionbar-copilot"]').first(); + const cBox = await copilotBtn.boundingBox().catch(() => null); + if (cBox) await page.mouse.click(cBox.x + cBox.width / 2, cBox.y + cBox.height / 2); + else await copilotBtn.click({timeout: 3000, force: true}).catch(() => {}); + await page.waitForTimeout(2000); + const hookPresent = await page.evaluate(() => typeof window.__stemRunScript === "function"); + assert("run-script-hook-exposed", hookPresent, "window.__stemRunScript not exposed"); + if (!hookPresent) throw new Error("no stemRunScript"); + + // === Run the import. === + const execStartUrl = page.url(); + try { + await page.evaluate(({content, fileList}) => + window.__stemRunScript(content, fileList).then( + () => { window.__stemRunScriptDone = "ok"; }, + err => { window.__stemRunScriptDone = String(err && err.message ? err.message : err); }, + ), {content: scriptContent, fileList: folderFiles}); + } catch (e) { + logStep("exec evaluate detached (likely navigation)", "warn", {error: e.message.slice(0, 120)}); + } + await page.waitForLoadState("networkidle", {timeout: 90000}).catch(() => {}); + await page.waitForTimeout(6000); + const execResult = await page.evaluate(() => window.__stemRunScriptDone ?? null).catch(() => null); + const execOk = execResult === "ok" || page.url() !== execStartUrl; + assert("exec-completed", execOk, execResult ?? "no completion signal"); + await page.screenshot({path: resolve(outDir, "01-after-import.png")}).catch(() => {}); + + // Errors during the in-editor import (the AttachBehaviorCommand path). + const importErrors = report.consoleErrors.filter(e => /applyTexture|loadRingTexture|reading 'asset'/i.test(e.text)); + assert("no-texture-errors-during-import", importErrors.length === 0, + `${importErrors.length}: ${importErrors[0]?.text.slice(0, 160) ?? ""}`); + + // === Save via AppMenu. === + await page.locator('[data-testid="topnav-app-menu"]').first().click({timeout: 3000, force: true}).catch(() => {}); + await page.waitForTimeout(400); + const save = page.locator("text=Save Project").first(); + if (await save.isVisible().catch(() => false)) { await save.click({timeout: 3000}).catch(() => {}); await page.waitForTimeout(3500); } + const importedUrl = page.url(); + const sceneId = (importedUrl.match(/\/create\/project\/([^/?#]+)/) || [])[1] || null; + assert("scene-id-resolved", !!sceneId, `URL: ${importedUrl}`); + + // === Reload through the playground dashboard (the onSceneLoaded path). === + await page.goto(baseUrl + "/dashboard?mode=playground", {waitUntil: "domcontentloaded", timeout: 20000}).catch(() => {}); + await page.waitForLoadState("networkidle", {timeout: 15000}).catch(() => {}); + await dismissBootstrap(); + await page.waitForTimeout(2000); + const reloadMarkIdx = report.consoleErrors.length; // ignore pre-reload errors + + if (sceneId) { + const card = page.locator(`[data-scene-id="${sceneId}"]`).first(); + assert("imported-project-listed", (await card.count()) > 0, `data-scene-id="${sceneId}" not found`); + if (await card.count()) { + await card.click({timeout: 5000}).catch(() => {}); + await page.waitForLoadState("networkidle", {timeout: 30000}).catch(() => {}); + await dismissBootstrap(); + await page.waitForSelector("canvas", {timeout: 30000}).catch(() => {}); + await dismissTutorial(); + await page.waitForTimeout(8000); + await page.screenshot({path: resolve(outDir, "02-reloaded-playground.png")}).catch(() => {}); + assert("canvas-visible-on-reload", await page.locator("canvas").first().isVisible().catch(() => false), "no canvas after reload"); + + const textureErrors = report.consoleErrors.slice(reloadMarkIdx) + .filter(e => /applyTexture|loadRingTexture|reading 'asset'/i.test(e.text)); + if (textureErrors.length) writeFileSync(resolve(outDir, "texture-errors.json"), JSON.stringify(textureErrors, null, 2)); + logStep("texture errors after playground reload", textureErrors.length ? "warn" : "ok", {count: textureErrors.length}); + assert("no-texture-load-errors-after-playground-reload", textureErrors.length === 0, + `${textureErrors.length}: ${textureErrors[0]?.text.slice(0, 200) ?? ""}`); + } + } + + // === Enter Play and start the game (best-effort, like the sibling test). === + const playBtn = page.locator('[data-testid="topnav-play"]').first(); + if (await playBtn.isVisible().catch(() => false)) { + await playBtn.click({timeout: 3000}).catch(() => {}); + const dontSave = page.locator("button", {hasText: /don['’]t\s*save/i}).first(); + if (await dontSave.count() && await dontSave.isVisible().catch(() => false)) { await dontSave.click({timeout: 3000}).catch(() => {}); await page.waitForTimeout(500); } + await page.waitForTimeout(3000); + const startGame = page.locator("#startGameBtn").first(); + try { + await startGame.waitFor({state: "visible", timeout: 20000}); + await page.waitForFunction(() => { const b = document.getElementById("startGameBtn"); return b && !b.disabled; }, {timeout: 20000}); + await startGame.click({timeout: 5000, force: true}); + logStep("clicked START GAME", "ok"); + } catch (e) { logStep("START GAME never became clickable", "warn", {error: String(e).slice(0, 160)}); } + await page.waitForTimeout(8000); + await page.screenshot({path: resolve(outDir, "03-play.png")}).catch(() => {}); + const playErrors = report.consoleErrors.filter(e => /applyTexture|loadRingTexture|reading 'asset'/i.test(e.text)); + assert("no-texture-errors-in-play", playErrors.length === 0, `${playErrors.length}: ${playErrors[0]?.text.slice(0, 160) ?? ""}`); + } else { + logStep("Play button not visible — skipping play audit", "warn"); + } +} catch (e) { + logStep("FATAL", "error", {error: e.message, stack: e.stack?.slice(0, 600)}); + failures.push("fatal:" + e.message); +} finally { + report.finishedAt = new Date().toISOString(); + report.failures = failures; + writeFileSync(resolve(outDir, "report.json"), JSON.stringify(report, null, 2)); + console.log(`\n=== Report (playground) ===`); + console.log(`Console errors: ${report.consoleErrors.length}`); + console.log(`Page errors: ${report.pageErrors.length}`); + console.log(`Assertions: ${Object.values(report.assertions).filter(a => a.pass).length}/${Object.keys(report.assertions).length} passed`); + console.log(`Output dir: ${outDir}`); + await browser.close(); + if (failures.length > 0) { console.error(`\nFAIL: ${failures.length} failed: ${failures.join(", ")}`); process.exit(1); } +} From 0fa6bb3500e93b3da1dc9e575c5b2eea7cf0526f Mon Sep 17 00:00:00 2001 From: Nitin Khanna Date: Fri, 29 May 2026 10:27:58 -0700 Subject: [PATCH 2/7] Adding better API docs for the engine. More coming soon --- .../site/src/components/MarkdownPage.tsx | 6 + client/packages/site/src/content/docs-nav.ts | 8 + docs/gameobject-and-game-manager-api.md | 323 ++++++++++++++ docs/runtime-api.md | 407 ++++++++++++++++++ docs/uikit-api.md | 297 +++++++++++++ .../playwright/oss-all-games-playground.mjs | 7 +- scripts/playwright/site-docs.mjs | 24 +- 7 files changed, 1065 insertions(+), 7 deletions(-) create mode 100644 docs/gameobject-and-game-manager-api.md create mode 100644 docs/runtime-api.md create mode 100644 docs/uikit-api.md diff --git a/client/packages/site/src/components/MarkdownPage.tsx b/client/packages/site/src/components/MarkdownPage.tsx index 1c13cab3..e2326747 100644 --- a/client/packages/site/src/components/MarkdownPage.tsx +++ b/client/packages/site/src/components/MarkdownPage.tsx @@ -9,8 +9,11 @@ import type {DocEntry} from "../content/docs-nav"; import architectureMd from "../../../../../docs/architecture.md?raw"; import byokMd from "../../../../../docs/byok.md?raw"; import exportingMd from "../../../../../docs/exporting-a-game.md?raw"; +import gameObjectAndGameManagerApiMd from "../../../../../docs/gameobject-and-game-manager-api.md?raw"; import multiplayerMd from "../../../../../docs/multiplayer.md?raw"; +import runtimeApiMd from "../../../../../docs/runtime-api.md?raw"; import serverSideStorageMd from "../../../../../docs/server-side-storage.md?raw"; +import uikitApiMd from "../../../../../docs/uikit-api.md?raw"; import readmeMd from "../../../../../README.md?raw"; import contributingMd from "../../../../../CONTRIBUTING.md?raw"; @@ -18,8 +21,11 @@ const SOURCES: Record = { "repo-docs:architecture.md": architectureMd, "repo-docs:byok.md": byokMd, "repo-docs:exporting-a-game.md": exportingMd, + "repo-docs:gameobject-and-game-manager-api.md": gameObjectAndGameManagerApiMd, "repo-docs:multiplayer.md": multiplayerMd, + "repo-docs:runtime-api.md": runtimeApiMd, "repo-docs:server-side-storage.md": serverSideStorageMd, + "repo-docs:uikit-api.md": uikitApiMd, "repo-root:README.md": readmeMd, "repo-root:CONTRIBUTING.md": contributingMd, }; diff --git a/client/packages/site/src/content/docs-nav.ts b/client/packages/site/src/content/docs-nav.ts index 6f653e51..fd8052ac 100644 --- a/client/packages/site/src/content/docs-nav.ts +++ b/client/packages/site/src/content/docs-nav.ts @@ -25,6 +25,14 @@ export const DOC_SECTIONS: DocSection[] = [ {slug: "server-side-storage", title: "Server-side storage & version control", source: "repo-docs", file: "server-side-storage.md"}, ], }, + { + label: "APIs", + entries: [ + {slug: "runtime-api", title: "Runtime API", source: "repo-docs", file: "runtime-api.md"}, + {slug: "gameobject-and-game-manager-api", title: "GameObject & GameManager", source: "repo-docs", file: "gameobject-and-game-manager-api.md"}, + {slug: "uikit-api", title: "UIKit API", source: "repo-docs", file: "uikit-api.md"}, + ], + }, { label: "AI & Multiplayer", entries: [ diff --git a/docs/gameobject-and-game-manager-api.md b/docs/gameobject-and-game-manager-api.md new file mode 100644 index 00000000..d8f07fd1 --- /dev/null +++ b/docs/gameobject-and-game-manager-api.md @@ -0,0 +1,323 @@ +# GameObject and GameManager API + +`GameObject` is the behavior-friendly wrapper around a Three.js `Object3D`. `GameManager` is the lower-level runtime controller passed to behavior `init(game)`. + +Use `this.erth` for normal gameplay code. Reach for `this.game` only after storing the `game` argument yourself, and only when you need lower-level systems that are not exposed through `this.erth`. + +```ts +this.init = function (game) { + this.game = game; +}; +``` + +## GameObject + +You get a `GameObject` from: + +- `this.gameObject` +- `this.erth.object.createFromThreeObject(object3d)` +- `this.erth.asset.model.createInstance(ref)` +- `this.erth.asset.stem.createInstance(ref)` + +```ts +interface GameObject { + readonly uuid: string; + readonly position: THREE.Vector3; + readonly rotation: THREE.Quaternion; + readonly scale: THREE.Vector3; + visible: boolean; + readonly physics: GameObjectPhysics; + readonly _internal: {three?: THREE.Object3D}; +} +``` + +`position`, `rotation`, and `scale` are read-only references to mutable Three.js objects. Change their components instead of replacing the property. + +```ts +this.gameObject.position.set(0, 2, 0); +this.gameObject.scale.set(2, 2, 2); +this.gameObject.visible = false; +``` + +Use `this.target` when an API requires the raw `THREE.Object3D`. Use `this.gameObject` when you want the wrapper and its physics helper. + +## Physics helper + +Every `GameObject` has: + +```ts +interface GameObjectPhysics { + configure(settings: PhysicsSettings): void; + getSettings(): PhysicsSettings | undefined; + getBody(): RigidBodyHandle | undefined; +} +``` + +Call `configure()` before adding a new runtime object to the scene. The runtime body is created when the object is initialized by `erth.scene.addObject()` or `game.addObject()`. + +```ts +this.onStart = async function () { + const mesh = new THREE.Mesh( + new THREE.SphereGeometry(0.5, 24, 16), + new THREE.MeshStandardMaterial({color: 0xffaa00}), + ); + + const ball = this.erth.object.createFromThreeObject(mesh); + ball.position.set(0, 6, 0); + ball.physics.configure({ + enabled: true, + bodyType: "dynamic", + shape: "sphere", + mass: 1, + restitution: 0.6, + material: "rubber", + }); + + await this.erth.scene.addObject(ball); + ball.physics.getBody()?.applyImpulse({x: 2, y: 0, z: -4}); +}; +``` + +## PhysicsSettings + +```ts +interface PhysicsSettings { + enabled?: boolean; + bodyType?: "static" | "dynamic" | "kinematic"; + shape?: "box" | "sphere" | "capsule" | "convexHull" | "concaveHull"; + mass?: number; + friction?: number; + restitution?: number; + rollingFriction?: number; + spinningFriction?: number; + material?: PhysicsMaterial; + climbable?: boolean; + rotationLock?: {x?: boolean; y?: boolean; z?: boolean}; + shapeOffset?: {x: number; y: number; z: number}; + shapeScale?: {x: number; y: number; z: number}; + excludeHiddenObjects?: boolean; + shapeDimensions?: BoxShapeDimensions | SphereShapeDimensions | CapsuleShapeDimensions; +} +``` + +Body types: + +| Type | Use for | +|---|---| +| `static` | Floors, walls, static level geometry | +| `dynamic` | Objects affected by gravity and impulses | +| `kinematic` | Objects moved by code, such as platforms and doors | + +Physics materials: + +```ts +type PhysicsMaterial = + | "metal" + | "dirt" + | "ground" + | "plastic" + | "snow" + | "wood" + | "concrete" + | "mud" + | "ice" + | "slime" + | "water" + | "slipperyGround" + | "rubber" + | "sand"; +``` + +Manual dimensions are supported for `box`, `sphere`, and `capsule` shapes. + +```ts +wall.physics.configure({ + enabled: true, + bodyType: "static", + shape: "box", + material: "concrete", + shapeDimensions: {width: 1, height: 3, length: 10}, +}); +``` + +## RigidBodyHandle + +After the object has been added to the scene, `gameObject.physics.getBody()` can return: + +```ts +interface RigidBodyHandle { + readonly uuid: string; + applyImpulse(impulse, relativePosition?): void; + setVelocity(velocity): void; + setCollisionBehavior(behavior: "regular" | "ghost"): void; + remove(): void; +} +``` + +```ts +const body = this.gameObject.physics.getBody(); +body?.setVelocity({x: 0, y: 0, z: 8}); +body?.setCollisionBehavior("ghost"); +``` + +`ghost` bodies pass through other bodies but can still be used for trigger-style detection. + +## GameManager state + +`GameManager` is passed to `init(game)`: + +```ts +this.init = function (game) { + this.game = game; +}; +``` + +Game state values: + +```ts +this.game.state; +this.game.score; +this.game.lives; +this.game.health; +this.game.initialLives; +this.game.initialHealth; +this.game.maxScore; +``` + +State helpers: + +```ts +this.game.isGameOver(); +this.game.isWinner(); +this.game.isGameStarted(); +``` + +The current states are `NOT_STARTED`, `STARTED`, `FINISHED`, and `PAUSED`. `isGameStarted()` only returns true after startup initialization has completed. + +## GameManager object methods + +```ts +await this.game.addObject(object3d, parent?); +this.game.removeObject(object3d); +const clone = this.game.cloneObject(sourceObject); +this.game.pauseObject(object3d, pauseChildren?); +this.game.resumeObject(object3d, resumeChildren?); +``` + +Prefer `this.erth.object.createFromThreeObject()` plus `this.erth.scene.addObject()` when you are creating new runtime objects from behavior code. Use `game.addObject()` when you intentionally need to work with raw Three.js objects. + +## GameManager behavior methods + +```ts +await this.game.addBehaviorToObject(target, behaviorId, options?); +this.game.removeBehaviorByUUID(uuid); +this.game.updateBehaviorAttributes(uuid, updatedProperties); +``` + +For most cross-behavior work, prefer the higher-level `this.erth.behaviors` helpers. They return foreign behavior views and route attribute updates through the behavior change pipeline. + +## Sound and animation + +Sound helpers delegate to the active HUD sound manager: + +```ts +this.game.loadSounds(sounds); +this.game.playSound(soundId); +this.game.stopSound(soundId); +this.game.clearSounds(); +``` + +Animation helpers delegate to the animation controller: + +```ts +this.game.playBlendedAnimations(this.target, [ + {name: "walk", weight: 0.7}, + {name: "wave", weight: 0.3}, +]); + +this.game.updateBlendedAnimationWeights(this.target, { + walk: 0.2, + run: 0.8, +}); +``` + +## Input + +Use `inputManager.getAction(actionId)`. + +```ts +this.update = function () { + if (this.game?.inputManager.getAction("jump")) { + this.gameObject.physics.getBody()?.applyImpulse({x: 0, y: 4, z: 0}); + } +}; +``` + +Current built-in action names include `jump`, `run`, `use`, `drop`, `pull`, and `primary`. + +## Direct subsystem access + +GameManager exposes engine subsystems for advanced cases: + +| Property | Use | +|---|---| +| `scene` | Active Three.js scene | +| `camera` | Active perspective camera | +| `renderer` | Active renderer | +| `physics` | Physics engine interface | +| `animationController` | Animation playback | +| `animationGraphController` | Animation graph playback | +| `audioController` | Audio subsystem | +| `cameraControl` | Camera control system | +| `collisionDetector` | Collision detection updates | +| `objectPicker` | Pointer/raycast object picking | +| `inputManager` | Keyboard, mouse, touch, gamepad action state | +| `pointerEventManager` | Pointer input | +| `behaviorManager` | Behavior lifecycle and targeted events | +| `lambdaManager` | Lambda lifecycle and object registration | +| `multiplayerState` | Multiplayer state bridge | +| `player` | Current player object, if assigned | +| `discord` | Discord integration service | + +This surface is intentionally lower-level and can change faster than `this.erth`. + +## Events handled by GameManager + +GameManager listens to the `game` event namespace and handles: + +```ts +game.start +game.resume +game.pause +game.stop +game.score.inc +game.score.dec +game.lives.inc +game.lives.dec +game.health.inc +game.health.dec +game.time.inc +game.time.dec +game.loadSounds +game.playSound +game.stop_sound +game.clear_sounds +game.loginSuccess +``` + +Direct `EventBus` sending still exists for legacy scripts, but new behavior-to-behavior messages should use: + +```ts +this.game.behaviorManager.sendEventToObjectBehaviors(target, "custom.topic", data); +``` + +and receive them with: + +```ts +this.onEvent = function (msg, data) { + if (msg === "custom.topic") { + // react here + } +}; +``` + diff --git a/docs/runtime-api.md b/docs/runtime-api.md new file mode 100644 index 00000000..d29a9696 --- /dev/null +++ b/docs/runtime-api.md @@ -0,0 +1,407 @@ +# Runtime API + +Behavior scripts access the engine through `this.erth`. Class-based engine code also has `this.stem` and `this.stemEngine` aliases, but the editor scripting runtime consistently exposes `this.erth`, so the public docs use that name. + +Use `this.erth` for normal gameplay work before dropping down to `this.game`. It is the stable author-facing layer for assets, runtime objects, shared state, behavior lookup, AI generation, events, and utility systems. + +## Top-level namespaces + +```ts +this.erth.ai +this.erth.asset +this.erth.camera +this.erth.object +this.erth.scene +this.erth.store +this.erth.behaviors +this.erth.lambdas +this.erth.events +this.erth.combat +this.erth.team +this.erth.pool +this.erth.tween +this.erth.fsm +this.erth.behaviorTree +this.erth.spatial +``` + +`tween`, `fsm`, `behaviorTree`, and `spatial` load their underlying libraries the first time you call them. Await the creator once during `init()` or `onStart()`, then use the returned handle from `update()`. + +## Assets + +Most asset methods work with an `AssetRef`: + +```ts +type AssetRef = { + assetId: string; + revisionId: string; +}; +``` + +Asset attributes selected in the editor usually already have this shape. You can also resolve scene assets by name. + +```ts +this.onStart = async function () { + const ref = await this.erth.asset.model.findByName("Enemy"); + if (!ref) return; + + const enemy = await this.erth.asset.model.createInstance(ref); + enemy.position.set(0, 1, -4); + await this.erth.scene.addObject(enemy); +}; +``` + +| Namespace | Methods | +|---|---| +| `asset.model` | `createFromUrl(params)`, `preload(ref)`, `createInstance(ref)`, `unload(ref)`, `findByName(name)` | +| `asset.stem` | `preload(ref)`, `createInstance(ref)`, `unload(ref)`, `findByName(name)` | +| `asset.image` | `createTexture(ref)`, `getUrl(ref)`, `findByName(name)` | +| `asset.audio` | `getUrl(ref)`, `getUrlByName(name)`, `findByName(name)` | +| `asset.video` | `getUrl(ref)`, `getUrlByName(name)`, `findByName(name)` | +| `asset.file` | `getUrl(ref)`, `getUrlByName(name)`, `findByName(name)` | +| `asset.script` | `getUrl(ref)`, `getUrlByName(name)`, `findByName(name)` | + +`asset.script.getUrl()` returns a `blob:` URL for a script asset and strips `@import` directives because those are only valid inside the behavior runtime. Use it for raw workers or standalone script loading. + +```ts +this.init = async function () { + const workerUrl = await this.erth.asset.script.getUrlByName("pathfinding-worker"); + this.worker = new Worker(workerUrl); +}; +``` + +The asset namespace also exposes management calls: + +```ts +await this.erth.asset.createAssetRelease(params); +await this.erth.asset.getAssetDerivatives({assetId, revisionId}); +await this.erth.asset.getMyAssets({types, includeLatestRelease: true}); +``` + +These methods exist in the engine, but they depend on the configured asset backend. In local playground projects, most behavior code should prefer scene asset refs, `findByName()`, and the loader methods above. + +## Objects, scene, and camera + +`erth.object.createFromThreeObject()` wraps a raw Three.js object as a `GameObject`. `erth.scene.addObject()` adds that wrapper to the running scene and initializes behaviors, lambdas, and physics. + +```ts +this.onStart = async function () { + const mesh = new THREE.Mesh( + new THREE.BoxGeometry(1, 1, 1), + new THREE.MeshStandardMaterial({color: 0xff5533}), + ); + + const box = this.erth.object.createFromThreeObject(mesh); + box.position.set(0, 2, 0); + await this.erth.scene.addObject(box); +}; +``` + +`erth.camera` exposes the active camera position, orientation, projection planes, field of view, and `lookAt(x, y, z)`. + +```ts +this.update = function () { + this.erth.camera.lookAt(0, 1, 0); +}; +``` + +For lower-level object and physics details, see [GameObject and GameManager API](/docs/gameobject-and-game-manager-api). + +## Store + +The global store is a per-game-session key-value map shared by behaviors on the local client. + +```ts +this.erth.store.get(key); +this.erth.store.set(key, value); +this.erth.store.has(key); +this.erth.store.delete(key); +this.erth.store.keys(); +this.erth.store.size; +``` + +Important constraints: + +- The store is cleared when a game session starts. +- It has a hard limit of 128 keys. +- It is local to each client. It does not automatically synchronize multiplayer state. +- Store plain gameplay data, not Three.js objects, DOM elements, or functions. + +```ts +this.onStart = function () { + if (!this.erth.store.has("score")) { + this.erth.store.set("score", 0); + } +}; + +this.onEvent = function (msg, data) { + if (msg !== "coin.collected") return; + const current = this.erth.store.get("score") ?? 0; + this.erth.store.set("score", current + (data?.points ?? 1)); +}; +``` + +## Behaviors and lambdas + +Use `erth.behaviors` for cross-behavior lookup and attribute changes. + +```ts +const mover = this.erth.behaviors.find(this.target, "moving-platform"); +if (mover) { + await this.erth.behaviors.requestChange(mover, "speed", 4); +} +``` + +```ts +this.erth.behaviors.find(target, id); +this.erth.behaviors.findAll(id); +this.erth.behaviors.findOnObject(target); +this.erth.behaviors.getAttribute(behavior, key); +this.erth.behaviors.requestChange(behavior, key, value, options?); +``` + +Use `erth.lambdas` when a behavior needs to query or register objects with lambda instances. + +```ts +const systems = this.erth.lambdas.getInstancesByType("damage-system"); +const damageSystem = systems[0]; + +if (damageSystem) { + this.erth.lambdas.registerObject(damageSystem.uuid, this.target, { + health: 100, + armorType: "light", + }); +} +``` + +```ts +this.erth.lambdas.getInstance(instanceId); +this.erth.lambdas.getInstancesByType(lambdaId); +this.erth.lambdas.registerObject(instanceId, target, componentData?); +this.erth.lambdas.deregisterObject(instanceId, target); +this.erth.lambdas.getObjectLambdas(target); +``` + +## Events + +There are two event paths: + +1. Targeted behavior messages use `onEvent(msg, data)` on the receiver and `game.behaviorManager.sendEventToObjectBehaviors(target, msg, data)` on the sender. +2. Engine-wide topics use `this.erth.events.on(topic, callback)` and return an unsubscribe function. + +```ts +this.init = function (game) { + this.game = game; +}; + +this.onStart = function () { + this.stopScoreListener = this.erth.events.on("game.score", (msg, amount) => { + console.log("score event", msg, amount); + }); +}; + +this.dispose = function () { + this.stopScoreListener?.(); +}; +``` + +Engine event subscriptions are hierarchical. Subscribing to `game.score` receives `game.score.inc` and `game.score.dec`; the callback's first argument is the actual topic. + +Current engine topic groups include: + +| Group | Topics | +|---|---| +| Game state | `game.lives.inc`, `game.lives.dec`, `game.health.inc`, `game.health.dec`, `game.score.inc`, `game.score.dec`, `game.time.inc`, `game.time.dec`, `game.loginSuccess` | +| Enemy | `enemy.spawned`, `enemy.died`, `enemy.got.hit`, `enemy.state.changed`, `enemy.player.detected`, `enemy.player.lost`, `enemy.attack.started`, `enemy.attack`, `enemy.attack.ended` | +| Character motion | `character.motion.none`, `character.motion_start`, `character.motion`, `character.motion_end`, `character.motion.walk_start`, `character.motion.walk`, `character.motion.walk_end`, `character.motion.run_start`, `character.motion.run`, `character.motion.run_end` | +| Character action | `character.action.jump_start`, `character.action.jump`, `character.action.land`, `character.action.climb_start`, `character.action.climb`, `character.action.climb_end`, `character.action.crouch_start`, `character.action.crouch`, `character.action.crouch_end`, `character.action.fall_start`, `character.action.fall`, `character.action.fall_end`, `character.action.fall_back`, `character.action.dead`, `character.action.interact` | +| Animation | `character.animation.trigger`, `character.animation.stop`, `character.animation.complete` | +| Pickups and triggers | `consumable.in.range`, `consumable.not.in.range`, `consumable.collected`, `consumable.collided`, `jumppad.activated`, `platform.activated`, `platform.moving`, `platform.deactivated`, `volume.activated`, `randomized.spawner.activated`, `spawner.activated`, `teleport.activated` | +| NPC | `npc.interaction.started`, `npc.interaction.ended`, `npc.action.started`, `npc.action.ended` | +| Device and services | `device.orientation`, `gameServices.authenticated` | + +The global `EventBus` object is still injected for legacy scripts, but new behavior-to-behavior code should use `onEvent()` and `game.behaviorManager.sendEventToObjectBehaviors()`. + +## AI generation + +3D model generation is available through: + +```ts +await this.erth.ai.gen.generate3dModel({ + generationType: "text_to_model", + prompt: "low poly treasure chest", + generator: "meshy", + quality: "preview", + onProgress: (progress) => console.log(progress), +}); +``` + +Parameters include: + +```ts +{ + generationType: "text_to_model" | "image_to_model"; + prompt: string; + negativePrompt?: string; + url?: string; + fileToken?: string; + quality?: string; + modelVersion?: string; + generator?: "meshy" | "tripo"; + targetPolygonCount?: number; + autoRig?: boolean; + refine?: boolean; + onProgress?: (progress: number) => void; + onTaskCreated?: (taskId: string) => void; +} +``` + +The call returns `{taskId, modelUrl, thumbnailUrl}`. In the public playground, the user must configure the relevant provider key before generation can complete. + +## Combat, teams, and pooling + +`erth.combat` exposes reusable stat helpers: + +```ts +this.erth.combat.calculateDamage(attacker, target); +this.erth.combat.applyDamage(target, damage); +this.erth.combat.regenerateHealth(unit, deltaTime); +this.erth.combat.getAttackPriority(unit); +this.erth.combat.selectBestTarget(attackerPos, targets); +this.erth.combat.getDamageEffectiveness(damageType, armorType); +``` + +`erth.team` exposes friendly/enemy checks: + +```ts +this.erth.team.isEnemy(a, b); +this.erth.team.isFriendly(a, b); +this.erth.team.canAttack(attacker, target, friendlyFire?); +this.erth.team.findNearestEnemy(unit, allUnits, maxRange?); +this.erth.team.getEnemiesInRange(unit, allUnits, range); +``` + +`erth.pool.create(config)` builds a generic object pool: + +```ts +this.bulletPool = this.erth.pool.create({ + create: () => new THREE.Object3D(), + reset: (obj) => { + obj.visible = true; + }, + destroy: (obj) => { + obj.parent?.remove(obj); + }, + initialSize: 10, + maxSize: 100, +}); +``` + +## Tween + +`erth.tween.to(target, options)` animates numeric properties. Time values are seconds, matching behavior `update(deltaTime)`. + +```ts +this.onStart = async function () { + this.popIn = await this.erth.tween.to(this.gameObject.position, { + y: 5, + duration: 0.6, + easing: "Cubic.InOut", + autoStart: true, + }); +}; + +this.dispose = function () { + this.popIn?.stop(); +}; +``` + +Common handle methods: `start()`, `stop()`, `pause()`, `resume()`, `onComplete(cb)`, `onUpdate(cb)`, `delay(seconds)`, `repeat(count)`, `yoyo()`, `chain(...)`, `isPlaying()`. + +Use `this.erth.tween.killAll()` only when you intentionally want to stop every active engine tween. + +## Finite state machines + +`erth.fsm.create(config)` wraps XState v5 and returns an actor. + +```ts +this.init = async function () { + this.door = (await this.erth.fsm.create({ + id: "door", + initial: "closed", + context: {locked: false}, + states: { + closed: {on: {OPEN: {target: "open", guard: ({context}) => !context.locked}}}, + open: {on: {CLOSE: "closed"}}, + }, + })).start(); + + this.unsubscribeDoor = this.door.subscribe((snapshot) => { + console.log(snapshot.value, snapshot.context); + }); +}; + +this.dispose = function () { + this.unsubscribeDoor?.(); + this.door?.stop(); +}; +``` + +Actor methods: `start()`, `stop()`, `send(event)`, `snapshot()`, `subscribe(fn)`, `matches(statePath)`. + +## Behavior trees + +`erth.behaviorTree.create(definition, agent)` wraps mistreevous. Conditions and actions are looked up by method name on the agent object. + +```ts +this.init = async function () { + const agent = { + canSeePlayer: () => !!this.erth.behaviors.findAll("player.tag")[0], + attack: () => "SUCCEEDED", + patrol: () => "RUNNING", + }; + + this.tree = await this.erth.behaviorTree.create({ + type: "selector", + children: [ + {type: "sequence", children: [ + {type: "condition", call: "canSeePlayer"}, + {type: "action", call: "attack"}, + ]}, + {type: "action", call: "patrol"}, + ], + }, agent); +}; + +this.update = function () { + this.tree?.step(); +}; +``` + +Action return values are `"SUCCEEDED"`, `"FAILED"`, or `"RUNNING"`. + +## Spatial queries + +`erth.spatial.octree()` builds an octree for static scene geometry. + +```ts +this.init = async function (game) { + const levelRoot = game.scene.getObjectByName("Level"); + if (!levelRoot) return; + + this.octree = (await this.erth.spatial.octree()).fromGroup(levelRoot); +}; +``` + +Octree methods: + +```ts +octree.fromGroup(group); +octree.rayCast(ray); +octree.intersectSphere(sphere); +octree.intersectCapsule(capsule); +octree.getBox(); +``` + +`fromGroup()` walks mesh descendants and should be called when static world geometry changes, not every frame. + diff --git a/docs/uikit-api.md b/docs/uikit-api.md new file mode 100644 index 00000000..13cd7efe --- /dev/null +++ b/docs/uikit-api.md @@ -0,0 +1,297 @@ +# UIKit API + +Behavior and lambda scripts receive two UIKit globals: + +```ts +UIKit +UIKitPointerEvents +``` + +Use UIKit for in-scene panels, diegetic UI, HUD overlays, labels, buttons, and interactive 3D controls. + +## Basic in-world panel + +```ts +let panel; +let scoreText; + +this.init = function (game) { + UIKitPointerEvents.initialize(game); +}; + +this.onStart = function () { + panel = new UIKit.Container({ + width: 220, + height: 80, + backgroundColor: 0x222222, + backgroundOpacity: 0.85, + borderRadius: 8, + padding: 12, + flexDirection: "column", + justifyContent: "center", + alignItems: "center", + pointerEvents: "auto", + }); + + scoreText = new UIKit.Text({ + text: "Score: 0", + fontSize: 22, + color: 0xffffff, + }); + + panel.add(scoreText); + this.target.add(panel); + UIKitPointerEvents.registerRoot(panel); +}; + +this.update = function (deltaTime) { + UIKitPointerEvents.update(deltaTime); +}; + +this.dispose = function () { + if (panel) { + UIKitPointerEvents.unregisterRoot(panel); + panel.dispose(); + panel = null; + } + UIKitPointerEvents.deinitialize(); +}; +``` + +## Fullscreen HUD + +`UIKit.Fullscreen` should be parented to a camera. Use `game.uiCamera` when available, with `game.camera` as the fallback. + +```ts +let hud; + +this.init = function (game) { + this.game = game; + UIKitPointerEvents.initialize(game); +}; + +this.onStart = function () { + hud = new UIKit.Fullscreen(this.game.renderer, { + flexDirection: "column", + pointerEvents: "auto", + }); + + hud.add(new UIKit.Text({ + text: "Wave 1", + fontSize: 28, + color: 0xffffff, + })); + + const camera = this.game.uiCamera ?? this.game.camera; + camera.add(hud); + UIKitPointerEvents.registerRoot(hud); +}; + +this.update = function (deltaTime) { + UIKitPointerEvents.update(deltaTime); +}; + +this.dispose = function () { + if (hud) { + UIKitPointerEvents.unregisterRoot(hud); + hud.parent?.remove(hud); + hud.dispose(); + hud = null; + } + UIKitPointerEvents.deinitialize(); +}; +``` + +## Components + +### Container + +`UIKit.Container` is the layout building block. It supports fixed sizing, flexbox-style layout, backgrounds, borders, overflow, and pointer handlers. + +```ts +const button = new UIKit.Container({ + width: 120, + height: 40, + flexDirection: "row", + justifyContent: "center", + alignItems: "center", + backgroundColor: 0x3344aa, + borderRadius: 6, + pointerEvents: "auto", + hover: {backgroundColor: 0x4455cc}, + active: {backgroundColor: 0x223388}, + onClick: () => console.log("clicked"), +}); +``` + +Common properties: + +```ts +width +height +backgroundColor +backgroundOpacity +borderRadius +borderWidth +borderColor +padding +paddingTop +paddingBottom +paddingLeft +paddingRight +margin +flexDirection +justifyContent +alignItems +gap +overflow +pointerEvents +hover +active +onClick +onPointerEnter +onPointerLeave +``` + +### Text + +```ts +const label = new UIKit.Text({ + text: "Ready", + fontSize: 24, + fontWeight: "bold", + color: 0xffffff, + opacity: 1, + textAlign: "center", + verticalAlign: "center", + lineHeight: 1.2, + maxLines: 2, +}); +``` + +### Image + +```ts +const icon = new UIKit.Image({ + src: "https://example.com/icon.png", + width: 48, + height: 48, + objectFit: "contain", + borderRadius: 6, +}); +``` + +### Input + +```ts +const nameInput = new UIKit.Input({ + value: "", + placeholder: "Name", + fontSize: 18, + color: 0xffffff, + backgroundColor: 0x222222, + borderRadius: 4, + padding: 8, + onValueChange: (value) => { + this.erth.store.set("player.name", value); + }, +}); +``` + +### Other components + +| Component | Use | +|---|---| +| `UIKit.Fullscreen` | Camera-attached viewport UI | +| `UIKit.Content` | Scrollable content inside a container | +| `UIKit.Svg` | SVG graphics | +| `UIKit.Video` | Video surfaces | + +## Updating properties + +Call `setProperties()` to update one or more properties. + +```ts +scoreText.setProperties({text: `Score: ${score}`}); + +button.setProperties({ + backgroundColor: disabled ? 0x555555 : 0x3344aa, + pointerEvents: disabled ? "none" : "auto", +}); +``` + +## Pointer events lifecycle + +`UIKitPointerEvents` is reference counted so multiple behaviors can use it at the same time. + +```ts +UIKitPointerEvents.initialize(game); +UIKitPointerEvents.registerRoot(root); +UIKitPointerEvents.update(deltaTime); +UIKitPointerEvents.unregisterRoot(root); +UIKitPointerEvents.deinitialize(); +``` + +Available methods: + +| Method | Use | +|---|---| +| `initialize(game)` | Store GameManager and increment the init reference count | +| `deinitialize()` | Decrement the init reference count | +| `registerRoot(component)` | Enable pointer events for a root component | +| `unregisterRoot(component)` | Remove a root component | +| `update(deltaTime?)` | Update pointer state and registered roots | +| `forceDispose()` | Force cleanup, bypassing reference counts | +| `isActive()` | True when pointer events are running with roots | +| `isInitialized()` | True when a game reference is present | +| `getRootCount()` | Number of registered roots | +| `getInitRefCount()` | Current initialization reference count | + +Always pair `initialize()` with `deinitialize()`, and `registerRoot()` with `unregisterRoot()`. + +## Common patterns + +### Health bar + +```ts +function createHealthBar(width, height, health, maxHealth) { + const root = new UIKit.Container({ + width, + height, + backgroundColor: 0x333333, + borderRadius: 4, + overflow: "hidden", + }); + + const fill = new UIKit.Container({ + width: (health / maxHealth) * width, + height: "100%", + backgroundColor: health > 30 ? 0x44aa44 : 0xaa4444, + }); + + root.add(fill); + return {root, fill}; +} +``` + +### Button with text + +```ts +const button = new UIKit.Container({ + width: 140, + height: 44, + justifyContent: "center", + alignItems: "center", + backgroundColor: 0x224488, + borderRadius: 6, + pointerEvents: "auto", + onClick: () => this.game.behaviorManager.sendEventToObjectBehaviors(this.target, "menu.start"), +}); + +button.add(new UIKit.Text({ + text: "Start", + fontSize: 18, + color: 0xffffff, +})); +``` + diff --git a/scripts/playwright/oss-all-games-playground.mjs b/scripts/playwright/oss-all-games-playground.mjs index e63dc35a..6a83c213 100644 --- a/scripts/playwright/oss-all-games-playground.mjs +++ b/scripts/playwright/oss-all-games-playground.mjs @@ -156,7 +156,12 @@ async function runGame(game) { const page = await ctx.newPage(); const {dismissBootstrap, dismissTutorial} = mkHelpers(page); page.on("console", m => { if (m.type() === "error") rec.consoleErrors.push(m.text().slice(0, 400)); }); - page.on("pageerror", e => rec.pageErrors.push((e.message || String(e)).slice(0, 400))); + page.on("pageerror", e => { + // Capture the first stack frame too — it carries the behavior:// URL and + // line, which pinpoints which game behavior threw. + const stackFrame = (e.stack || "").split("\n").find(l => /behavior:\/\/|http/.test(l)) || ""; + rec.pageErrors.push(`${(e.message || String(e)).slice(0, 200)}${stackFrame ? ` @@ ${stackFrame.trim().slice(0, 200)}` : ""}`); + }); page.on("requestfailed", r => { const u = r.url(); if (!/favicon|analytics|sentry/i.test(u)) rec.failedRequests.push(`${r.method()} ${u} :: ${r.failure()?.errorText}`); }); try { diff --git a/scripts/playwright/site-docs.mjs b/scripts/playwright/site-docs.mjs index 8c4f19e4..63c62a0c 100755 --- a/scripts/playwright/site-docs.mjs +++ b/scripts/playwright/site-docs.mjs @@ -43,6 +43,11 @@ try { /stem\s*studio|open[- ]?source/i.test(introHeading), introHeading.slice(0, 120), ); + const introLinks = await page.locator(".docs-content a").evaluateAll((els) => + els.map((e) => e.getAttribute("href") ?? ""), + ); + const hasGithubRewrite = introLinks.some((h) => h.includes("github.com/")); + assert("relative repo links rewritten to github.com", hasGithubRewrite, introLinks.slice(0, 4).join(", ")); const sectionLabels = await page.locator(".docs-sidebar h5").allInnerTexts(); assert( @@ -54,6 +59,10 @@ try { "sidebar includes Engine section", sectionLabels.some((s) => /engine/i.test(s)), ); + assert( + "sidebar includes APIs section", + sectionLabels.some((s) => /apis/i.test(s)), + ); // Navigate to Architecture await page.locator('.docs-sidebar a:has-text("Architecture")').first().click(); @@ -73,13 +82,16 @@ try { const byokHeadings = await page.locator(".docs-content h1, .docs-content h2").count(); assert("BYOK page renders headings", byokHeadings > 0); - const links = await page.locator(".docs-content a").evaluateAll((els) => - els.map((e) => e.getAttribute("href") ?? ""), + // API docs added for the playground scripting surface. + await page.locator('.docs-sidebar a:has-text("Runtime API")').first().click(); + await page.waitForURL(/\/docs\/runtime-api/, {timeout: 5000}); + await page.waitForSelector('.docs-content h1:has-text("Runtime API")', {timeout: 6000}); + const runtimeText = await page.locator(".docs-content").innerText(); + assert( + "Runtime API page documents current erth events surface", + /this\.erth\.events\.on/.test(runtimeText), + runtimeText.slice(0, 160), ); - const relativeRepoLink = links.find((h) => /^github\.com|^https?:\/\/github\.com|^\/docs\//.test(h)); - void relativeRepoLink; - const hasGithubRewrite = links.some((h) => h.includes("github.com/")); - assert("relative repo links rewritten to github.com", hasGithubRewrite, links.slice(0, 4).join(", ")); } catch (e) { failures.push(`exception: ${e.message}`); console.error(e); From 06125dbb8bb042c371610cd3732eed1eee81b2a2 Mon Sep 17 00:00:00 2001 From: Kirill Osipov Date: Fri, 29 May 2026 21:43:16 +0200 Subject: [PATCH 3/7] Sync game settings booleans to scene data --- .../panels/ProjectSettings/GameSettings.tsx | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/client/packages/editor-oss/src/editor/assets/v2/RightPanel/panels/ProjectSettings/GameSettings.tsx b/client/packages/editor-oss/src/editor/assets/v2/RightPanel/panels/ProjectSettings/GameSettings.tsx index 2f5fed0b..af4ed0da 100644 --- a/client/packages/editor-oss/src/editor/assets/v2/RightPanel/panels/ProjectSettings/GameSettings.tsx +++ b/client/packages/editor-oss/src/editor/assets/v2/RightPanel/panels/ProjectSettings/GameSettings.tsx @@ -81,6 +81,14 @@ const normalizeProjectGameSettings = ( }; }; +const SERIALIZED_GAME_BOOLEAN_SETTINGS = new Set([ + "showHUD", + "useAvatar", + "isMultiplayer", + "multiplayerAutoJoin", + "voiceChatEnabled", +]); + const loadGameMappingApi = () => import("@stem/network/api/gameMapping"); const GameSettingsComponent = ({openUIPanel}: {openUIPanel: () => void}) => { @@ -316,6 +324,18 @@ const GameSettingsComponent = ({openUIPanel}: {openUIPanel: () => void}) => { const current = (editor as any)[key] as boolean; const newValue = !current; (editor as any)[key] = newValue; + + if (SERIALIZED_GAME_BOOLEAN_SETTINGS.has(key)) { + if (!editor.scene.userData) editor.scene.userData = {}; + const gameSettings = { + ...normalizeProjectGameSettings(editor.scene.userData.game), + [key]: newValue, + }; + editor.scene.userData.game = gameSettings; + setGame(gameSettings); + app.call("objectChanged", app.editor, app.editor?.scene); + } + setter(newValue); }; From e515141484b81f260b080311e71b74700b5502ae Mon Sep 17 00:00:00 2001 From: Nitin Khanna Date: Sat, 30 May 2026 15:50:47 -0700 Subject: [PATCH 4/7] Fix issues related to texture loading and uikit misclicks --- .../src/agent/handlers/SettingsHandlers.ts | 50 ++- .../agent/script-tool/ImportBatchDialog.ts | 17 +- .../src/behaviors/uikit/UIKitPointerEvents.ts | 24 +- .../src/controls/ControlsManager.js | 39 +- .../v2/AiCopilot/TerminalView/useTerminal.ts | 192 +++++++- .../assets/v2/materials/materialUtils.ts | 12 +- .../src/editor/images/hooks/index.ts | 8 + .../editor-oss/src/event/AutoSaveEvent.js | 28 +- .../src/persistence/FileSystemProjectStore.ts | 81 +++- .../src/utils/EnvironmentSettingsManager.ts | 19 +- docs/gameobject-and-game-manager-api.md | 109 ++++- docs/runtime-api.md | 134 ++++++ docs/uikit-api.md | 115 +++++ .../playwright/oss-all-games-playground.mjs | 72 ++- .../playwright/oss-uikit-overlay-click.mjs | 424 ++++++++++++++++++ .../playwright/oss-voxel-valley-lighting.mjs | 263 +++++++++++ scripts/playwright/site-docs.mjs | 5 + 17 files changed, 1540 insertions(+), 52 deletions(-) create mode 100644 scripts/playwright/oss-uikit-overlay-click.mjs create mode 100644 scripts/playwright/oss-voxel-valley-lighting.mjs diff --git a/client/packages/editor-oss/src/agent/handlers/SettingsHandlers.ts b/client/packages/editor-oss/src/agent/handlers/SettingsHandlers.ts index 45d48d04..17c39478 100644 --- a/client/packages/editor-oss/src/agent/handlers/SettingsHandlers.ts +++ b/client/packages/editor-oss/src/agent/handlers/SettingsHandlers.ts @@ -1,9 +1,10 @@ import * as THREE from "three"; import {PCFShadowMap, PCFSoftShadowMap} from "three"; -import {Asset, AssetType, getAssetRevisionData} from "@stem/network/api/asset"; +import {Asset, AssetType} from "@stem/network/api/asset"; import {updateSceneThumbnail} from "@stem/network/api/scene/thumbnail"; import {getAssetResolutionContext, resolveAssetRevisionId} from "../../asset-management/AssetResolutionContext"; +import type {AssetRef} from "../../asset-management/AssetRef"; import EngineRuntime from "../../EngineRuntime"; import { normalizeBackgroundGradient, @@ -48,8 +49,24 @@ const DEFAULT_RENDERING = { export class SettingsHandlers { constructor(private engine: EngineRuntime) {} - private async resolveImageSource(source?: string): Promise { - if (!source) return source; + /** + * Resolves a background image source to the value that should be PERSISTED + * in the scene's rendering config: the original source string (a literal + * URL/path, or the asset name) plus, when it names a scene image asset, the + * stable {@link AssetRef} for that asset. + * + * Crucially this never returns a `blob:` object URL. The old code persisted + * `URL.createObjectURL(blob)` as the background texture, which is the cause + * of the "scene goes dark on reload" bug: object URLs are revoked when the + * page reloads, so the saved background/environment texture could no longer + * be fetched — the scene lost both its skybox and its image-based + * environment lighting, and the loader logged "Failed to load texture: + * blob:…". The AssetRef is what survives a reload; + * {@link EnvironmentSettingsManager.applyBackgroundSettings} prefers it and + * re-fetches the texture through the asset loader. + */ + private async resolveImageAsset(source?: string): Promise<{value?: string; assetRef?: AssetRef}> { + if (!source) return {value: source}; if ( source.startsWith("http://") || source.startsWith("https://") @@ -57,25 +74,26 @@ export class SettingsHandlers { || source.startsWith("blob:") || source.startsWith("/") ) { - return source; + return {value: source}; } const assetSource = this.engine.editor?.assetSource; if (!assetSource) { - return source; + return {value: source}; } const {assets} = await assetSource.getAssets({types: [AssetType.Image]}); const match = assets?.find((asset: Asset) => asset.name.toLowerCase() === source.toLowerCase()); if (!match) { - return source; + return {value: source}; } const context = getAssetResolutionContext(this.engine.scene); const revisionId = context ? resolveAssetRevisionId(match.id, context) : undefined; const finalRevisionId = revisionId || match.headRevisionId; - const blob = await getAssetRevisionData(match.id, finalRevisionId, "blob"); - return URL.createObjectURL(blob); + // Keep the human-readable source (the asset name) as the persisted + // `texture` value; the AssetRef is the durable handle used to re-fetch. + return {value: source, assetRef: {assetId: match.id, revisionId: finalRevisionId}}; } /** @@ -247,18 +265,26 @@ export class SettingsHandlers { const current = scene.userData.rendering.background || {...DEFAULT_BACKGROUND}; const normalizedGradient = normalizeBackgroundGradient(gradient, current.gradient); const normalizedGradientMode = normalizeGradientMode(gradientMode, current.gradientMode); - const resolvedTexture = texture ? await this.resolveImageSource(texture) : undefined; + // Resolve to a displayable URL AND a stable AssetRef. The AssetRef is + // what survives a reload (the `blob:` URL does not), so persisting it + // keeps the skybox + environment lighting after the project is saved + // and reopened. + const resolvedTexture = texture ? await this.resolveImageAsset(texture) : undefined; const resolvedCubemap = cubemap - ? await Promise.all(cubemap.map(face => this.resolveImageSource(face))) + ? await Promise.all(cubemap.map(face => this.resolveImageAsset(face))) : undefined; scene.userData.rendering.background = { ...current, type: type ?? current.type, color: color ?? current.color, - texture: resolvedTexture ?? current.texture, + texture: resolvedTexture?.value ?? current.texture, + textureAsset: texture ? resolvedTexture?.assetRef : current.textureAsset, cubemap: resolvedCubemap - ? (resolvedCubemap as [string, string, string, string, string, string]) + ? (resolvedCubemap.map(face => face.value ?? "") as [string, string, string, string, string, string]) : current.cubemap, + cubemapAssets: resolvedCubemap + ? resolvedCubemap.map(face => face.assetRef) + : current.cubemapAssets, gradient: normalizedGradient, gradientMode: normalizedGradientMode, rotation: rotation ?? current.rotation, diff --git a/client/packages/editor-oss/src/agent/script-tool/ImportBatchDialog.ts b/client/packages/editor-oss/src/agent/script-tool/ImportBatchDialog.ts index 9147507f..c66b6131 100644 --- a/client/packages/editor-oss/src/agent/script-tool/ImportBatchDialog.ts +++ b/client/packages/editor-oss/src/agent/script-tool/ImportBatchDialog.ts @@ -50,18 +50,25 @@ export function autoResolveImports( const claimed = new Set(); for (const req of imports) { - const extMatches = folderFiles.filter(f => - !claimed.has(fileKey(f)) && req.extensions.some(ext => f.name.toLowerCase().endsWith(ext)), - ); - if (extMatches.length === 0) continue; + const extOf = (f: File) => req.extensions.some(ext => f.name.toLowerCase().endsWith(ext)); let match: File | null = null; + // An explicit filepath wins and may reuse a file already claimed by + // another import: one asset file can legitimately back several imports + // (e.g. four wheels all referencing wheel.glb, or one image reused as a + // texture and the scene thumbnail). Matching only *unclaimed* files left + // those duplicates unresolved, which popped a blocking import dialog and + // hung headless / automated imports. So resolve filepath against the + // full file list, not the claimed-filtered subset. if (req.filepath) { - match = findByFilepath(extMatches, req.filepath); + match = findByFilepath(folderFiles.filter(extOf), req.filepath); } if (!match) { + // Fuzzy fallback only considers still-unclaimed files so two + // ambiguous imports don't grab the same file. + const extMatches = folderFiles.filter(f => !claimed.has(fileKey(f)) && extOf(f)); if (extMatches.length === 1) { match = extMatches[0]!; } else if (req.name) { diff --git a/client/packages/editor-oss/src/behaviors/uikit/UIKitPointerEvents.ts b/client/packages/editor-oss/src/behaviors/uikit/UIKitPointerEvents.ts index 82c6dc78..8ce7e07c 100644 --- a/client/packages/editor-oss/src/behaviors/uikit/UIKitPointerEvents.ts +++ b/client/packages/editor-oss/src/behaviors/uikit/UIKitPointerEvents.ts @@ -71,9 +71,11 @@ let initRefCount = 0; const activeRoots = new Set(); let hasConfiguredTransparentSort = false; -// Diagnostic logging for UIKit layout/sizing issues. Bounded so a stuck -// scene doesn't spam the console forever. -const UIKIT_DIAG = true; +// Diagnostic logging for UIKit layout/sizing issues. OFF by default — this is +// developer instrumentation that emits per-frame `[UIKitDiag]` snapshots for the +// first few frames of every registered root, which is console noise in normal +// use. Flip to true locally when debugging UIKit sizing/positioning. +const UIKIT_DIAG = false; const diagFramesRemaining = new Map(); const DIAG_MAX_FRAMES = 6; @@ -423,7 +425,21 @@ function initializePointerEvents(): void { return; } - pointerEventsInstance = forwardHtmlEvents(canvas, camera, scene, { + // The camera controls call setPointerCapture() on the scene container + // (#scene-container) on pointerdown for drag handling. That capture + // redirects every subsequent pointermove/pointerup for the gesture to the + // container, so a listener bound to the only ever sees the initial + // pointerdown — never the pointerup that completes a click. The result is + // that UIKit buttons receive pointerdown but never click. Bind the pointer + // forwarder to the capturing ancestor (falling back to the canvas) so the + // UI pointer system sees the full down -> up -> click sequence. The + // container and canvas share the same client rect, so the pointer -> NDC + // coordinate mapping (which uses the bound element's bounding rect) is + // unchanged. + const eventSource = + canvas.closest("#scene-container") ?? canvas.parentElement ?? canvas; + + pointerEventsInstance = forwardHtmlEvents(eventSource, camera, scene, { batchEvents: true, intersectEveryFrame: false, forwardPointerCapture: true, diff --git a/client/packages/editor-oss/src/controls/ControlsManager.js b/client/packages/editor-oss/src/controls/ControlsManager.js index c347fcac..56f88689 100644 --- a/client/packages/editor-oss/src/controls/ControlsManager.js +++ b/client/packages/editor-oss/src/controls/ControlsManager.js @@ -50,15 +50,48 @@ class ControlsManager extends BaseControls { const target = controls?.target || new THREE.Vector3(0, 0, 0); const sceneId = global.app.editor.sceneID; - const allData = JSON.parse(localStorage.getItem("savedCameras") || "{}"); + let allData; + try { + allData = JSON.parse(localStorage.getItem("savedCameras") || "{}"); + } catch { + allData = {}; + } allData[sceneId] = { position: camera.position.toArray(), target: target.toArray(), + savedAt: Date.now(), }; - localStorage.setItem("savedCameras", JSON.stringify(allData)); - console.log(`Camera saved for scene ${sceneId}:`, allData[sceneId]); + if (this._writeSavedCameras(allData)) { + console.log(`Camera saved for scene ${sceneId}:`, allData[sceneId]); + return; + } + + // localStorage is full (commonly from a large autoSaveData blob). Prune + // savedCameras to the most recent entries and retry once. This must + // NEVER rethrow: handlePlay() calls saveCamera(), so an uncaught + // QuotaExceededError silently breaks the Play button. + try { + const recent = Object.entries(allData) + .sort((a, b) => (b[1]?.savedAt || 0) - (a[1]?.savedAt || 0)) + .slice(0, 25); + const pruned = Object.fromEntries(recent); + pruned[sceneId] = allData[sceneId]; + if (this._writeSavedCameras(pruned)) return; + } catch { + /* fall through to warn */ + } + console.warn("ControlsManager.saveCamera: localStorage full; skipping camera save"); + } + + _writeSavedCameras(data) { + try { + localStorage.setItem("savedCameras", JSON.stringify(data)); + return true; + } catch { + return false; + } } initCameraPosition() { diff --git a/client/packages/editor-oss/src/editor/assets/v2/AiCopilot/TerminalView/useTerminal.ts b/client/packages/editor-oss/src/editor/assets/v2/AiCopilot/TerminalView/useTerminal.ts index 0755af1d..738c0165 100644 --- a/client/packages/editor-oss/src/editor/assets/v2/AiCopilot/TerminalView/useTerminal.ts +++ b/client/packages/editor-oss/src/editor/assets/v2/AiCopilot/TerminalView/useTerminal.ts @@ -621,7 +621,12 @@ export function useTerminal(onExit: () => void, options: UseTerminalOptions = {} // the timeout breadcrumb. Generous enough that a full game // import (dozens of models, real GLB parsing) completes inside // it rather than tripping a spurious timeout. - const HARD_TIMEOUT_MS = 240_000; + // Bumped from 240s→600s→1200s: the heaviest games (procedural + // terrain; cubecity's 32 building GLBs through the per-model + // texture-conversion pipeline; 100+ vehicle GLBs) can take many + // minutes, and a premature timeout makes the harness save/reload + // before every asset is created (a partial import). + const HARD_TIMEOUT_MS = 1_200_000; try { await Promise.race([ runScript(content, folderFiles), @@ -649,6 +654,7 @@ export function useTerminal(onExit: () => void, options: UseTerminalOptions = {} const w = window as unknown as { __stemGetScene?: () => { sceneName: string | null; + sceneID: string | null; mode: string | null; isPlaying: boolean; assetCount: number; @@ -662,6 +668,24 @@ export function useTerminal(onExit: () => void, options: UseTerminalOptions = {} visibleRenderableCount: number; meshCount: number; visibleMeshCount: number; + lights: Array<{type: string; name: string; intensity: number; visible: boolean; parent: string | null}>; + rendering: { + ambient: {color: string; intensity: number} | null; + hemisphere: {skyColor: string; groundColor: string; intensity: number} | null; + backgroundType: string | null; + backgroundTexture: string | null; + hasBackgroundTextureAsset: boolean; + }; + sceneEnv: { + background: string | null; + environment: string | null; + backgroundDetail?: unknown; + hasBackgroundNode?: boolean; + hasEnvironmentNode?: boolean; + backgroundIntensity?: number | null; + backgroundBlurriness?: number | null; + backgroundRotationY?: number | null; + }; }; }; w.__stemGetScene = () => { @@ -670,6 +694,7 @@ export function useTerminal(onExit: () => void, options: UseTerminalOptions = {} if (!scene) { return { sceneName: null, + sceneID: null, mode: null, isPlaying: false, assetCount: 0, @@ -683,6 +708,15 @@ export function useTerminal(onExit: () => void, options: UseTerminalOptions = {} visibleRenderableCount: 0, meshCount: 0, visibleMeshCount: 0, + lights: [], + rendering: { + ambient: null, + hemisphere: null, + backgroundType: null, + backgroundTexture: null, + hasBackgroundTextureAsset: false, + }, + sceneEnv: {background: null, environment: null}, }; } @@ -698,6 +732,45 @@ export function useTerminal(onExit: () => void, options: UseTerminalOptions = {} const getObjectLabel = (object: SceneAuditObject) => object.name || `${object.type || "Object3D"}:${object.uuid || "unknown"}`; + // Classifies scene.background / scene.environment into a coarse, + // serializable label so Playwright can assert the skybox/IBL is + // present (Texture/CubeTexture) vs. lost (a flat Color / null). + const classifyEnv = (value: unknown): string | null => { + if (!value || typeof value !== "object") return null; + const v = value as {isCubeTexture?: boolean; isTexture?: boolean; isColor?: boolean}; + if (v.isCubeTexture) return "CubeTexture"; + if (v.isTexture) return "Texture"; + if (v.isColor) return "Color"; + return "Unknown"; + }; + // Detailed texture description so we can tell a *correctly rendered* + // skybox from one that loaded with the wrong mapping/colorSpace or a + // missing image (which renders flat/black even though it classifies + // as "Texture"). + const describeTexture = (value: unknown) => { + const t = value as { + isTexture?: boolean; + isColor?: boolean; + mapping?: number; + colorSpace?: string; + flipY?: boolean; + image?: {width?: number; height?: number} | null; + source?: {data?: {width?: number; height?: number} | null} | null; + } | null; + if (!t || typeof t !== "object") return null; + if (t.isColor) return {kind: "Color"}; + if (!t.isTexture) return {kind: "Unknown"}; + const img = t.image || t.source?.data || null; + return { + kind: "Texture", + mapping: t.mapping ?? null, + colorSpace: t.colorSpace ?? null, + flipY: t.flipY ?? null, + width: img?.width ?? null, + height: img?.height ?? null, + }; + }; + const names: string[] = []; const visibleObjectNames: string[] = []; const renderableNames: string[] = []; @@ -708,11 +781,35 @@ export function useTerminal(onExit: () => void, options: UseTerminalOptions = {} let visibleRenderableCount = 0; let meshCount = 0; let visibleMeshCount = 0; + const lights: Array<{ + type: string; + name: string; + intensity: number; + visible: boolean; + parent: string | null; + }> = []; scene.traverse(object => { objectCount += 1; if (object.name) names.push(object.name); + if ((object as unknown as {isLight?: boolean}).isLight) { + const light = object as unknown as { + type: string; + name: string; + intensity: number; + visible: boolean; + parent?: {name?: string; type?: string} | null; + }; + lights.push({ + type: light.type, + name: light.name, + intensity: light.intensity, + visible: light.visible, + parent: light.parent ? light.parent.name || light.parent.type || null : null, + }); + } + const visible = isVisibleInHierarchy(object); if (visible) { visibleObjectCount += 1; @@ -744,6 +841,7 @@ export function useTerminal(onExit: () => void, options: UseTerminalOptions = {} }); return { sceneName: app?.editor?.sceneName ?? null, + sceneID: app?.editor?.sceneID ?? null, mode: app?.mode ?? null, isPlaying: !!app?.isPlaying, assetCount: app?.editor?.assetsCount ?? 0, @@ -757,10 +855,102 @@ export function useTerminal(onExit: () => void, options: UseTerminalOptions = {} visibleRenderableCount, meshCount, visibleMeshCount, + lights, + rendering: { + ambient: app?.editor?.rendering?.ambient ?? null, + hemisphere: app?.editor?.rendering?.hemisphere ?? null, + backgroundType: app?.editor?.rendering?.background?.type ?? null, + backgroundTexture: app?.editor?.rendering?.background?.texture ?? null, + hasBackgroundTextureAsset: !!app?.editor?.rendering?.background?.textureAsset, + }, + sceneEnv: { + background: classifyEnv((scene as {background?: unknown}).background), + environment: classifyEnv((scene as {environment?: unknown}).environment), + backgroundDetail: describeTexture((scene as {background?: unknown}).background), + hasBackgroundNode: !!(scene as {backgroundNode?: unknown}).backgroundNode, + hasEnvironmentNode: !!(scene as {environmentNode?: unknown}).environmentNode, + backgroundIntensity: (scene as {backgroundIntensity?: number}).backgroundIntensity ?? null, + backgroundBlurriness: (scene as {backgroundBlurriness?: number}).backgroundBlurriness ?? null, + backgroundRotationY: (scene as {backgroundRotation?: {y?: number}}).backgroundRotation?.y ?? null, + }, + }; + }; + // Test affordance: deterministically pin the editor camera so visual + // skybox/background regression shots are comparable across reloads + // (the camera otherwise resets to a default orientation on reload). + const wc = window as unknown as { + __stemSetEditorCamera?: (pos: [number, number, number], target: [number, number, number]) => boolean; + }; + wc.__stemSetEditorCamera = (pos, target) => { + const app = getEngineRuntime() as unknown as { + camera?: { + position?: {set: (x: number, y: number, z: number) => void}; + lookAt?: (x: number, y: number, z: number) => void; + updateMatrixWorld?: () => void; + }; + editor?: {controls?: {current?: {controls?: {target?: {set: (x: number, y: number, z: number) => void}; update?: () => void}}}}; }; + const cam = app?.camera; + if (!cam?.position) return false; + const orbit = app?.editor?.controls?.current?.controls; + cam.position.set(pos[0], pos[1], pos[2]); + if (orbit?.target?.set) { + orbit.target.set(target[0], target[1], target[2]); + orbit.update?.(); + } + cam.lookAt?.(target[0], target[1], target[2]); + cam.updateMatrixWorld?.(); + return true; + }; + // Debug affordance: dump the material maps applied to named objects so a + // Playwright probe can verify which texture slots actually resolved. + (window as unknown as {__stemInspectMaterials?: (names: string[]) => unknown}).__stemInspectMaterials = ( + names: string[], + ) => { + const scene = getEngineRuntime()?.editor?.scene; + if (!scene) return {error: "no scene"}; + const tex = (t: any) => + t ? {cs: t.colorSpace, w: t.image?.width ?? null, h: t.image?.height ?? null, hasImg: !!t.image} : null; + const mat = (m: any) => ({ + type: m?.type ?? m?.constructor?.name, + isNode: !!(m?.isNodeMaterial || /NodeMaterial/.test(m?.type ?? m?.constructor?.name ?? "")), + color: m?.color ? "#" + m.color.getHexString() : null, + map: tex(m?.map), + normalMap: tex(m?.normalMap), + metalnessMap: tex(m?.metalnessMap), + roughnessMap: tex(m?.roughnessMap), + metalness: m?.metalness, + roughness: m?.roughness, + }); + const byName: Record = {}; + scene.traverse((o: any) => { + if (o.name && !byName[o.name]) byName[o.name] = o; + }); + const out: Record = {}; + for (const name of names) { + const obj = byName[name]; + if (!obj) { + out[name] = {missing: true}; + continue; + } + const meshes: unknown[] = []; + obj.traverse((c: any) => { + if (!c.isMesh) return; + const mats = Array.isArray(c.material) ? c.material : [c.material]; + mats.forEach((m: any, i: number) => meshes.push({mesh: c.name || "(unnamed)", idx: i, ...mat(m)})); + }); + out[name] = { + meshCount: meshes.length, + hasMaterialSettings: !!obj.userData?.materialSettings, + materials: meshes, + }; + } + return out; }; return () => { delete (window as unknown as {__stemGetScene?: unknown}).__stemGetScene; + delete (window as unknown as {__stemSetEditorCamera?: unknown}).__stemSetEditorCamera; + delete (window as unknown as {__stemInspectMaterials?: unknown}).__stemInspectMaterials; }; }, []); diff --git a/client/packages/editor-oss/src/editor/assets/v2/materials/materialUtils.ts b/client/packages/editor-oss/src/editor/assets/v2/materials/materialUtils.ts index f0e216be..f2cc8e6e 100644 --- a/client/packages/editor-oss/src/editor/assets/v2/materials/materialUtils.ts +++ b/client/packages/editor-oss/src/editor/assets/v2/materials/materialUtils.ts @@ -377,7 +377,17 @@ const applyOrClearMap = (params: { * @param value */ export const isAssetId = (value: string): boolean => { - return /^([a-f0-9]{24}|[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})$/i.test(value); + if (typeof value !== "string" || !value) return false; + // Mongo-style 24-hex id or UUID (integrated builds). + if (/^([a-f0-9]{24}|[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})$/i.test(value)) { + return true; + } + // OSS synthesizes asset ids as `oss-asset--` (see + // network/.../asset/index.ts). These are real asset ids, not URLs. Without + // this, a material texture backed by an imported OSS image asset fails both + // the apply path (treated as a URL → TextureLoader 404 → blank texture) and + // the resolve path (skipped entirely), so the texture renders empty. + return value.startsWith("oss-asset-"); }; /** diff --git a/client/packages/editor-oss/src/editor/images/hooks/index.ts b/client/packages/editor-oss/src/editor/images/hooks/index.ts index aacb3b4f..81788ac9 100644 --- a/client/packages/editor-oss/src/editor/images/hooks/index.ts +++ b/client/packages/editor-oss/src/editor/images/hooks/index.ts @@ -4,6 +4,14 @@ import {useCreateAssetWithData} from "../../asset-management/hooks/assets"; export const parseMaterialAssetIdWithRevision = (value: string): {assetId: string} | null => { if (!value) return null; + // OSS synthesizes asset ids as `oss-asset--` (optionally + // with a legacy `:` suffix). The hex/UUID regex below does not + // match these, so without this branch a material texture backed by an + // imported OSS image asset is never resolved and renders blank. + if (value.startsWith("oss-asset-")) { + return {assetId: value.split(":")[0] || value}; + } + const match = value.match(/^([a-f0-9]{24}|[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})/i); if (!match) return null; diff --git a/client/packages/editor-oss/src/event/AutoSaveEvent.js b/client/packages/editor-oss/src/event/AutoSaveEvent.js index 9682826c..1266bdb1 100644 --- a/client/packages/editor-oss/src/event/AutoSaveEvent.js +++ b/client/packages/editor-oss/src/event/AutoSaveEvent.js @@ -72,13 +72,27 @@ class AutoSaveEvent extends BaseEvent { const now = TimeUtils.getDateTime("yyyy-MM-dd HH:mm:ss"); - window.localStorage.setItem("autoSaveData", JSON.stringify(obj)); - window.localStorage.setItem("autoSaveTime", now); - window.localStorage.setItem("autoSaveSceneID", global.app.editor.sceneID); - window.localStorage.setItem("autoSaveSceneName", global.app.editor.sceneName); - window.localStorage.setItem("autoSaveSceneLockedItems", JSON.stringify(editor.sceneLockedItems || [])); - - console.log(`${now}, scene auto saved.`); + // The localStorage autosave is a best-effort "recover unsaved work" + // cache; the authoritative save is commitSaveScene() -> ProjectStore. + // A large scene (e.g. many imported GLBs) can serialize to several MB + // and blow the ~5MB localStorage quota. A QuotaExceededError here must + // not break the editor — and a stale oversized blob left behind would + // poison every later localStorage.setItem (including the camera save + // that handlePlay() makes), so drop it on failure to free the quota. + try { + window.localStorage.setItem("autoSaveData", JSON.stringify(obj)); + window.localStorage.setItem("autoSaveTime", now); + window.localStorage.setItem("autoSaveSceneID", global.app.editor.sceneID); + window.localStorage.setItem("autoSaveSceneName", global.app.editor.sceneName); + window.localStorage.setItem("autoSaveSceneLockedItems", JSON.stringify(editor.sceneLockedItems || [])); + console.log(`${now}, scene auto saved.`); + } catch (e) { + console.warn("AutoSaveEvent: localStorage autosave skipped (quota exceeded); scene still saves via ProjectStore", e); + try { + window.localStorage.removeItem("autoSaveData"); + window.localStorage.removeItem("autoSaveSceneLockedItems"); + } catch { /* ignore */ } + } if (this.autoSave) { this.commitSaveScene(obj); diff --git a/client/packages/editor-oss/src/persistence/FileSystemProjectStore.ts b/client/packages/editor-oss/src/persistence/FileSystemProjectStore.ts index 3b1ece03..a7b2138d 100644 --- a/client/packages/editor-oss/src/persistence/FileSystemProjectStore.ts +++ b/client/packages/editor-oss/src/persistence/FileSystemProjectStore.ts @@ -82,6 +82,53 @@ export class FileSystemProjectStore implements ProjectStore { constructor(private readonly dir: FsDirectoryHandle) {} + // Serializes mutating operations. The File System Access API throws + // `NoModificationAllowedError` if two `createWritable()` calls target the + // same file concurrently, and our save flow writes many files plus a + // manifest. When two saves overlap (e.g. an autosave firing while a manual + // save is mid-write — more likely for large projects that take seconds to + // persist), the second save's writes collide with the first, the asset + // persist throws, and the project is left with no/partial assets. Chaining + // every write through this promise guarantees they run one-at-a-time. + private writeChain: Promise = Promise.resolve(); + + private serializeWrite(op: () => Promise): Promise { + const run = this.writeChain.then(() => this.runWithRetry(op), () => this.runWithRetry(op)); + // Keep the chain alive regardless of this op's outcome. + this.writeChain = run.then( + () => undefined, + () => undefined, + ); + return run; + } + + /** + * Heavy writes (e.g. a project with tens of MB of GLBs) intermittently fail + * with transient File System Access errors — `NotFoundError`, + * `InvalidStateError`, `NoModificationAllowedError` — when the browser is + * under write pressure. These are not real data errors; the same op + * succeeds on a retry. Retry a few times with a short backoff before giving + * up so a single transient blip doesn't fail an entire project save. + */ + private async runWithRetry(op: () => Promise, attempts = 3): Promise { + let lastErr: unknown; + for (let i = 0; i < attempts; i++) { + try { + return await op(); + } catch (err) { + lastErr = err; + const name = (err as {name?: string})?.name ?? ""; + const transient = + name === "NotFoundError" || + name === "InvalidStateError" || + name === "NoModificationAllowedError"; + if (!transient || i === attempts - 1) throw err; + await new Promise(resolve => setTimeout(resolve, 150 * (i + 1))); + } + } + throw lastErr; + } + /** Folder name the user picked, surfaced in the dashboard UI. */ getDirectoryName(): string { return this.dir.name; @@ -159,7 +206,11 @@ export class FileSystemProjectStore implements ProjectStore { return JSON.parse(await file.text()) as ProjectBody; } - async save(body: ProjectBody): Promise { + save(body: ProjectBody): Promise { + return this.serializeWrite(() => this.saveLocked(body)); + } + + private async saveLocked(body: ProjectBody): Promise { const meta: ProjectMeta = { ...body.meta, id: body.meta.id || newId(), @@ -182,7 +233,11 @@ export class FileSystemProjectStore implements ProjectStore { return meta; } - async delete(id: string): Promise { + delete(id: string): Promise { + return this.serializeWrite(() => this.deleteLocked(id)); + } + + private async deleteLocked(id: string): Promise { for (const name of await this.matchingNamesForId(id)) { await this.dir.removeEntry(name); } @@ -194,7 +249,11 @@ export class FileSystemProjectStore implements ProjectStore { } } - async saveAssets(projectId: string, assets: StoredAsset[]): Promise { + saveAssets(projectId: string, assets: StoredAsset[]): Promise { + return this.serializeWrite(() => this.saveAssetsLocked(projectId, assets)); + } + + private async saveAssetsLocked(projectId: string, assets: StoredAsset[]): Promise { // Replace the whole subdirectory so a re-save drops assets no longer // referenced. The project lives as `..stemscript.json` in // the picked folder; its binary assets live in a sibling `/`. @@ -208,8 +267,13 @@ export class FileSystemProjectStore implements ProjectStore { } const projectDir = await this.dir.getDirectoryHandle(projectId, {create: true}); - const manifest: AssetManifestEntry[] = []; - for (const asset of assets) { + // Write the asset files concurrently. Each targets a distinct file, so + // there's no `NoModificationAllowedError` risk (that only arises from two + // writers on the *same* file — prevented by serializeWrite at the call + // level). Sequential awaits made large projects (dozens of MB) take many + // seconds, long enough that a reload could beat the manifest write and + // lose every asset. Parallelizing cuts that window dramatically. + const writeAsset = async (asset: StoredAsset): Promise => { const file = `${asset.assetId}.${asset.format || "bin"}`; const handle = await projectDir.getFileHandle(file, {create: true}); const writable = await handle.createWritable(); @@ -219,8 +283,11 @@ export class FileSystemProjectStore implements ProjectStore { await writable.close(); } const {data: _omit, ...meta} = asset; - manifest.push({...meta, file}); - } + return {...meta, file}; + }; + // The manifest is still written LAST (after all file writes resolve) so + // loadAssets never sees a manifest referencing a not-yet-written file. + const manifest: AssetManifestEntry[] = await Promise.all(assets.map(writeAsset)); const manifestHandle = await projectDir.getFileHandle(ASSET_MANIFEST, {create: true}); const manifestWritable = await manifestHandle.createWritable(); diff --git a/client/packages/editor-oss/src/utils/EnvironmentSettingsManager.ts b/client/packages/editor-oss/src/utils/EnvironmentSettingsManager.ts index 06a7eba3..524e6053 100644 --- a/client/packages/editor-oss/src/utils/EnvironmentSettingsManager.ts +++ b/client/packages/editor-oss/src/utils/EnvironmentSettingsManager.ts @@ -505,6 +505,19 @@ export class EnvironmentSettingsManager { rendering.background; const textureAsset: AssetRef | undefined = backgroundWithAssets.textureAsset; const cubemapAssets: Array = backgroundWithAssets.cubemapAssets || []; + // A `blob:` object URL only lives for the session that created it. Older + // scenes persisted such URLs as the background texture; on reload they + // are revoked and unfetchable. When there's no AssetRef to recover from, + // treat the texture as absent so we fall back to a plain background + // instead of throwing "Failed to load texture: blob:…". + const usableTexture = + typeof texture === "string" && texture.startsWith("blob:") && !textureAsset ? undefined : texture; + if (usableTexture !== texture) { + console.warn( + "EnvironmentSettingsManager: ignoring stale blob: background texture with no asset reference " + + "(re-set the scene background to restore it).", + ); + } const currentRotation = rotation ?? 0; const currentIntensity = intensity ?? 1; const currentBlurriness = blurriness ?? 0; @@ -568,7 +581,7 @@ export class EnvironmentSettingsManager { fogType: effectiveFogType, }; - if (type === "Color" || !type || (type === "Texture" && !texture && !textureAsset)) { + if (type === "Color" || !type || (type === "Texture" && !usableTexture && !textureAsset)) { if (scene.background instanceof Texture) { scene.background.dispose(); } @@ -585,11 +598,11 @@ export class EnvironmentSettingsManager { sceneWithNodes.backgroundNode = null; } sceneWithNodes.environmentNode = bgNode; - } else if (type === "Texture" && (texture || textureAsset)) { + } else if (type === "Texture" && (usableTexture || textureAsset)) { if (effectiveFogType !== "height") { sceneWithNodes.backgroundNode = null; } - const resolvedTexture = await this.resolveBackgroundImageSource(texture, textureAsset); + const resolvedTexture = await this.resolveBackgroundImageSource(usableTexture, textureAsset); const ext = (resolvedTexture.format || resolvedTexture.url.split(".").pop()?.toLowerCase())?.toLowerCase(); const engine = this.editor.engine; diff --git a/docs/gameobject-and-game-manager-api.md b/docs/gameobject-and-game-manager-api.md index d8f07fd1..98e28d16 100644 --- a/docs/gameobject-and-game-manager-api.md +++ b/docs/gameobject-and-game-manager-api.md @@ -243,7 +243,7 @@ this.game.updateBlendedAnimationWeights(this.target, { ## Input -Use `inputManager.getAction(actionId)`. +Use `inputManager.getAction(actionId)` for boolean buttons and `inputManager.getMotion(motionId)` for continuous axes. ```ts this.update = function () { @@ -253,7 +253,15 @@ this.update = function () { }; ``` -Current built-in action names include `jump`, `run`, `use`, `drop`, `pull`, and `primary`. +```ts +this.update = function () { + const steer = this.game?.inputManager.getMotion("lateral") ?? 0; + const throttle = this.game?.inputManager.getMotion("forward") ?? 0; + this.drive(steer, throttle); +}; +``` + +Current built-in action names include `jump`, `run`, `use`, `drop`, `pull`, and `primary`. Common motion names include `forward`, `lateral`, `view_x`, and `view_y`. ## Direct subsystem access @@ -321,3 +329,100 @@ this.onEvent = function (msg, data) { }; ``` +## Patterns from real playground games + +These examples are adapted from game behaviors and keep to the current supported API surface. + +### Controller loop with input, motion, and telemetry + +Vehicle and flight behaviors usually store the `GameManager`, read input every frame, mutate the `GameObject` transform, then publish plain telemetry for HUD and audio behaviors. + +```ts +const forward = new THREE.Vector3(); +const up = new THREE.Vector3(0, 1, 0); + +this.init = function (game) { + this.game = game; + this.speed = 0; + this.drift = 0; +}; + +this.update = function (deltaTime) { + const input = this.game.inputManager; + const steer = input.getMotion("lateral"); + const throttle = input.getMotion("forward"); + const boost = input.getAction("use"); + + const acceleration = boost ? 26 : 14; + this.speed = THREE.MathUtils.clamp( + this.speed + throttle * acceleration * deltaTime, + -8, + 38, + ); + + this.target.getWorldDirection(forward); + this.gameObject.position.addScaledVector(forward, this.speed * deltaTime); + this.target.rotateOnAxis(up, -steer * deltaTime * 1.7); + + this.drift = Math.abs(steer) * Math.min(Math.abs(this.speed) / 24, 1); + this.erth.store.set("vehicle.telemetry", { + speed: this.speed, + boost, + drift: this.drift, + }); +}; +``` + +Keep the controller authoritative for movement. Let HUD, sound, particles, and camera behaviors read telemetry instead of duplicating the driving math. + +### Camera follow behavior + +Rail and vehicle games often keep camera logic in a separate behavior so the player controller can stay focused on movement. + +```ts +const desired = new THREE.Vector3(); +const offset = new THREE.Vector3(0, 4, 9); + +this.init = function (game) { + this.game = game; +}; + +this.update = function (deltaTime) { + desired.copy(offset) + .applyQuaternion(this.target.quaternion) + .add(this.gameObject.position); + + const camera = this.game.camera; + camera.position.lerp(desired, Math.min(deltaTime * 5, 1)); + camera.lookAt(this.gameObject.position); +}; +``` + +Use `this.game.camera` when you need the raw Three.js camera. Use `this.erth.camera.lookAt(x, y, z)` for simpler camera aiming. + +### Targeted behavior events + +Chess, weapon, and vehicle systems use targeted behavior messages when one object owns a gameplay decision and another behavior should respond. + +```ts +// Sender behavior +this.fire = function () { + this.game.behaviorManager.sendEventToObjectBehaviors(this.target, "weapon.fire", { + origin: this.gameObject.position.toArray(), + speed: 32, + }); +}; +``` + +```ts +// Receiver behavior on the same object, or on a targeted object +this.onEvent = function (msg, data) { + if (msg !== "weapon.fire") return; + + const projectile = this.spawnProjectile(); + projectile.position.fromArray(data.origin); + projectile.physics.getBody()?.setVelocity({x: 0, y: 0, z: -data.speed}); +}; +``` + +This is the right tool when a message is about a specific object. For broad engine state such as login, score, or health topics, use `this.erth.events.on()`. diff --git a/docs/runtime-api.md b/docs/runtime-api.md index d29a9696..5b5f7b36 100644 --- a/docs/runtime-api.md +++ b/docs/runtime-api.md @@ -405,3 +405,137 @@ octree.getBox(); `fromGroup()` walks mesh descendants and should be called when static world geometry changes, not every frame. +## Patterns from real playground games + +These examples are condensed from working game projects and adjusted to the current author-facing API. They show how the APIs above tend to fit together in full behaviors. + +### Procedural runtime world builder + +Kenny Cars-style track builders create raw Three.js geometry, wrap it as a `GameObject`, add it to the scene, then publish spawn state for the player controller. + +```ts +this.onStart = async function () { + const root = new THREE.Group(); + root.name = "RuntimeTrack"; + root.userData.isRuntimeOnly = true; + + const road = new THREE.Mesh( + new THREE.BoxGeometry(24, 0.25, 80), + new THREE.MeshStandardMaterial({color: 0x30343a}), + ); + road.position.set(0, 0, -20); + road.userData.isRuntimeOnly = true; + root.add(road); + + const startGate = new THREE.Mesh( + new THREE.BoxGeometry(8, 4, 0.25), + new THREE.MeshStandardMaterial({color: 0xffcc33}), + ); + startGate.position.set(0, 2, 12); + startGate.userData.isRuntimeOnly = true; + root.add(startGate); + + const track = this.erth.object.createFromThreeObject(root); + await this.erth.scene.addObject(track); + + this.erth.store.set("race.spawn", { + position: {x: 0, y: 0.5, z: 10}, + yaw: Math.PI, + }); + this.erth.store.set("race.trackReady", true); +}; +``` + +This pattern is useful when authored scene data describes a course, puzzle, or arena, but the actual mesh layout is generated at runtime. + +### Asset-driven model, texture, and sound setup + +Rail shooters and chess games commonly let designers pick model/image/audio assets as behavior attributes, with name lookup as a fallback for template projects. + +```ts +this.onStart = async function () { + let shipRef = this.getAttribute("shipModel"); + if (!shipRef) { + shipRef = await this.erth.asset.model.findByName("Player Ship"); + } + + if (shipRef) { + const ship = await this.erth.asset.model.createInstance(shipRef); + const shipObject = ship._internal?.three ?? ship.target ?? ship; + shipObject.userData.isRuntimeOnly = true; + this.target.add(shipObject); + this.ship = shipObject; + } + + let reticleRef = this.getAttribute("reticleImage"); + if (!reticleRef) { + reticleRef = await this.erth.asset.image.findByName("Reticle"); + } + if (reticleRef) { + this.reticleTexture = await this.erth.asset.image.createTexture(reticleRef); + } + + let fireRef = this.getAttribute("fireSound"); + if (!fireRef) { + fireRef = await this.erth.asset.audio.findByName("LaserFire"); + } + if (fireRef) { + this.fireSoundUrl = await this.erth.asset.audio.getUrl(fireRef); + } +}; +``` + +Prefer passing an `AssetRef` into `createInstance()`, `createTexture()`, or `getUrl()`. `getUrlByName()` still exists for audio/video/file/script assets, but behavior attributes and `findByName()` keep the asset dependency explicit. + +### Store as a lightweight blackboard + +Vehicle games and HUD-heavy arcade games use `erth.store` to share numbers between independent behaviors without introducing hard references. Keep the values plain and overwrite them as state changes. + +```ts +// Vehicle controller behavior +this.update = function () { + this.erth.store.set("car.telemetry", { + speed: this.speed, + drift: this.driftAmount, + boost: this.boostActive, + }); +}; +``` + +```ts +// Audio or HUD behavior +this.update = function () { + const telemetry = this.erth.store.get("car.telemetry") ?? {}; + const speed = telemetry.speed ?? 0; + const drift = telemetry.drift ?? 0; + + this.speedText?.setProperties({text: `${Math.round(speed)} km/h`}); + this.engineGain = THREE.MathUtils.lerp(0.35, 1.0, Math.min(speed / 140, 1)); + this.driftGain = Math.min(drift, 1); +}; +``` + +For cross-client or authoritative state, use the multiplayer systems instead. The store is local to one running game session. + +### Engine topic subscription with cleanup + +Menu and lobby behaviors can react to engine topics such as `game.loginSuccess`, then tear down the subscription when the behavior is disposed. + +```ts +this.onStart = function () { + this.offLogin = this.erth.events.on("game.loginSuccess", (_topic, user) => { + this.erth.store.set("player.profile", { + id: user?.id, + name: user?.displayName ?? "Player", + }); + this.showLobby(); + }); +}; + +this.dispose = function () { + this.offLogin?.(); + this.offLogin = null; +}; +``` + +Use targeted behavior events for object-to-object gameplay messages. Use `erth.events.on()` for engine-wide topics. diff --git a/docs/uikit-api.md b/docs/uikit-api.md index 13cd7efe..de0d9b50 100644 --- a/docs/uikit-api.md +++ b/docs/uikit-api.md @@ -295,3 +295,118 @@ button.add(new UIKit.Text({ })); ``` +## Patterns from real playground games + +These examples are adapted from UIKit-heavy games such as puzzle boards, title screens, lobbies, and combat HUDs. + +### Dual play/editor UIKit root + +The built-in `uikit-dual-mode` script is useful when a HUD should render both in the editor preview and in play mode. Import it from a behavior script, build your UI once, then let the helper attach and update the root. + +```ts +@import "uikit-dual-mode" as uikit; + +this.init = function (game) { + this.game = game; + this._uikitCtx = uikit.createPlayContext(game); + this._uiRoot = uikit.buildRoot(this._uikitCtx, { + pointerEvents: "auto", + }); + + this.buildHud(); + uikit.attach(this, this._uikitCtx); +}; + +this.buildHud = function () { + this.scoreText = new UIKit.Text({ + text: "Score 0", + fontSize: 28, + color: 0xffffff, + }); + this._uiRoot.add(this.scoreText); +}; + +this.update = function (deltaTime) { + uikit.tick(this, deltaTime); + const score = this.erth.store.get("score") ?? 0; + this.scoreText.setProperties({text: `Score ${score}`}); +}; + +this.dispose = function () { + uikit.teardown(this); +}; +``` + +For editor preview support, add `onEditorAdded`, `onEditorAttributesUpdated`, and `onEditorDispose` using the helper's `createEditorContext()` and `teardown()` methods. + +### HUD button that drives gameplay + +Chess and lobby screens use UIKit buttons to send targeted behavior events back into game logic. This keeps UI code from directly mutating board or match state. + +```ts +this.createHudButton = function (label, eventName, payload) { + const button = new UIKit.Container({ + width: 160, + height: 44, + justifyContent: "center", + alignItems: "center", + backgroundColor: 0x26334d, + borderRadius: 6, + pointerEvents: "auto", + hover: {backgroundColor: 0x314263}, + active: {backgroundColor: 0x1b2538}, + onClick: () => { + this.game.behaviorManager.sendEventToObjectBehaviors( + this.target, + eventName, + payload ?? {}, + ); + }, + }); + + button.add(new UIKit.Text({ + text: label, + fontSize: 18, + color: 0xffffff, + })); + + return button; +}; + +this._uiRoot.add(this.createHudButton("Reset", "resetGame")); +this._uiRoot.add(this.createHudButton("Promote", "promotePiece", {piece: "queen"})); +``` + +The receiver implements `onEvent(msg, data)` in the gameplay behavior. + +### Input and UIKit in the same puzzle loop + +Puzzle games often support both UI clicks and keyboard/gamepad input. Keep input reads in one method, then let the game update decide what state changes are legal. + +```ts +this.readControls = function () { + const input = this.game.inputManager; + const lateral = input.getMotion("lateral"); + + return { + left: input.getAction("drop7_Left") || lateral < -0.5, + right: input.getAction("drop7_Right") || lateral > 0.5, + drop: input.getAction("drop7_Drop") || + input.getAction("jump") || + input.getAction("use"), + restart: input.getAction("drop7_Restart"), + }; +}; + +this.update = function (deltaTime) { + UIKitPointerEvents.update(deltaTime); + + const controls = this.readControls(); + if (controls.left) this.moveCursor(-1); + if (controls.right) this.moveCursor(1); + if (controls.drop) this.dropPiece(); + if (controls.restart) this.resetBoard(); +}; +``` + +For pointer interactions, put `onClick` handlers on the relevant `UIKit.Container` cells or buttons. For continuous input, poll `game.inputManager` in `update()`. diff --git a/scripts/playwright/oss-all-games-playground.mjs b/scripts/playwright/oss-all-games-playground.mjs index 6a83c213..da4a1735 100644 --- a/scripts/playwright/oss-all-games-playground.mjs +++ b/scripts/playwright/oss-all-games-playground.mjs @@ -31,7 +31,13 @@ import {dirname, resolve, basename, join} from "node:path"; import {fileURLToPath} from "node:url"; const __dirname = dirname(fileURLToPath(import.meta.url)); -const outRoot = resolve(__dirname, "oss-all-games-playground-output"); +// STORE_MODE=filesystem exercises the File System Access (folder) project store +// instead of the default IndexedDB store. Output goes to a mode-specific dir so +// the two runs don't clobber each other. +const storeMode = process.env.STORE_MODE === "filesystem" ? "filesystem" : "indexeddb"; +const outRoot = resolve(__dirname, storeMode === "filesystem" + ? "oss-all-games-filesystem-output" + : "oss-all-games-playground-output"); mkdirSync(outRoot, {recursive: true}); const baseUrl = (process.env.PLAYWRIGHT_BASE_URL || "http://localhost:5173").replace(/\/$/, ""); @@ -123,8 +129,29 @@ const games = discoverGames(); console.log(`Discovered ${games.length} games under ${gamesRoot}${gamesFilter.length ? ` (filtered: ${gamesFilter.join(",")})` : ""}`); if (!games.length) { console.error("No games found"); process.exit(1); } +console.log(`Project store mode: ${storeMode}`); const browser = await chromium.launch({headless: !headed}); -const summary = {baseUrl, gamesRoot, startedAt: new Date().toISOString(), games: []}; +const summary = {baseUrl, gamesRoot, storeMode, startedAt: new Date().toISOString(), games: []}; + +// Bootstrap the File System Access (folder) store via OPFS so no directory +// picker is needed. Each browser context has its own OPFS partition, so a fresh +// "stem-fs" folder per game keeps them isolated. Must run on the origin before +// the navigation that boots the editor (rehydrateProjectStore reads these). +const bootstrapFilesystemStore = async (page) => { + await page.evaluate(async () => { + const root = await navigator.storage.getDirectory(); + try { await root.removeEntry("stem-fs", {recursive: true}); } catch { /* first run */ } + const fsRoot = await root.getDirectoryHandle("stem-fs", {create: true}); + await new Promise((res, rej) => { + const req = indexedDB.open("stemstudio-fs-handle", 1); + req.onupgradeneeded = () => { const db = req.result; if (!db.objectStoreNames.contains("handles")) db.createObjectStore("handles"); }; + req.onsuccess = () => { const tx = req.result.transaction("handles", "readwrite"); tx.objectStore("handles").put(fsRoot, "project-dir"); tx.oncomplete = () => res(); tx.onerror = () => rej(tx.error); }; + req.onerror = () => rej(req.error); + }); + localStorage.setItem("stemstudio.persistence.mode", "filesystem"); + localStorage.setItem("stemstudio.bootstrap.complete", "true"); + }); +}; // dialog/modal helpers parameterised by page const mkHelpers = (page) => ({ @@ -147,7 +174,7 @@ async function runGame(game) { mkdirSync(outDir, {recursive: true}); const rec = { name: game.name, script: basename(game.scriptFile.name), files: game.files.length, - steps: [], consoleErrors: [], pageErrors: [], failedRequests: [], + steps: [], consoleErrors: [], pageErrors: [], failedRequests: [], assetErrors: [], startClicked: false, canvasVisible: false, status: "pending", failReasons: [], }; const step = (s, ok = true, d) => { rec.steps.push({s, ok, d}); console.log(` ${ok ? "·" : "✗"} ${s}${d ? ` (${d})` : ""}`); }; @@ -155,7 +182,15 @@ async function runGame(game) { const ctx = await browser.newContext({viewport: {width: 1440, height: 900}}); const page = await ctx.newPage(); const {dismissBootstrap, dismissTutorial} = mkHelpers(page); - page.on("console", m => { if (m.type() === "error") rec.consoleErrors.push(m.text().slice(0, 400)); }); + // Asset-load failures surface as console WARNINGS (not errors), so the + // exception filter misses them. These mean the scene didn't load fully + // (missing models / skybox) — a hard fail for "loads perfectly". + const ASSET_FAIL = /No data URL found for|Failed to load model|Failed to load texture|failed to restore project assets|failed to persist project assets/i; + page.on("console", m => { + const t = m.text(); + if (m.type() === "error") rec.consoleErrors.push(t.slice(0, 400)); + if (ASSET_FAIL.test(t)) rec.assetErrors.push(t.slice(0, 300)); + }); page.on("pageerror", e => { // Capture the first stack frame too — it carries the behavior:// URL and // line, which pinpoints which game behavior threw. @@ -175,6 +210,10 @@ async function runGame(game) { await dismissBootstrap(); const pg = await page.evaluate(() => { try { return window.sessionStorage.getItem("stem.playgroundMode") === "1"; } catch { return false; } }); step("playground activated", pg); + if (storeMode === "filesystem") { + await bootstrapFilesystemStore(page); + step("filesystem (OPFS) store bootstrapped"); + } // 2. fresh project await page.goto(baseUrl + "/create/project", {waitUntil: "domcontentloaded", timeout: 30000}); @@ -211,7 +250,18 @@ async function runGame(game) { await page.locator('[data-testid="topnav-app-menu"]').first().click({timeout: 3000, force: true}).catch(() => {}); await page.waitForTimeout(400); const save = page.locator("text=Save Project").first(); - if (await save.isVisible().catch(() => false)) { await save.click({timeout: 3000}).catch(() => {}); await page.waitForTimeout(3500); } + if (await save.isVisible().catch(() => false)) { + await save.click({timeout: 3000}).catch(() => {}); + // Filesystem (OPFS) saves write asset files then assets.json LAST and + // can take several seconds; reloading before the manifest is written + // loses every asset (skybox/models). Wait for the "Saved" toast, + // which the save handler emits only after assets are fully persisted. + // Heavy games (cubecity's ~21MB of building GLBs) take well over a + // minute to write to OPFS; wait generously for the "Saved" toast so + // the body + asset manifest are fully persisted before we reload. + await page.locator("text=/^Saved$/").first().waitFor({state: "visible", timeout: 180000}).catch(() => {}); + await page.waitForTimeout(1500); + } const sceneId = (page.url().match(/\/create\/project\/([^/?#]+)/) || [])[1] || null; step("saved", !!sceneId, sceneId ?? "no scene id"); @@ -222,6 +272,9 @@ async function runGame(game) { await page.waitForTimeout(2000); if (sceneId) { const card = page.locator(`[data-scene-id="${sceneId}"]`).first(); + // Poll for the card: the folder store's project list can take a + // moment to rehydrate from OPFS, especially right after a heavy save. + await card.waitFor({state: "attached", timeout: 30000}).catch(() => {}); if (await card.count()) { await card.click({timeout: 5000}).catch(() => {}); await page.waitForLoadState("networkidle", {timeout: 30000}).catch(() => {}); @@ -257,7 +310,10 @@ async function runGame(game) { } catch { step("no START GAME button (auto-start game)", true); } - await page.waitForTimeout(12000); + // Generous settle: runtime-generated games (procedural terrain, + // spawned troops) and FS-mode asset decode need time before the + // scene is fully populated for the screenshot / UIKit check. + await page.waitForTimeout(20000); await page.screenshot({path: resolve(outDir, "04-playing.png")}).catch(() => {}); } else { step("Play button not visible", false); @@ -270,8 +326,10 @@ async function runGame(game) { // classify errors rec.exceptionErrors = [...new Set(rec.consoleErrors.filter(isException))].slice(0, 15); rec.noiseErrorCount = rec.consoleErrors.filter(isNoise).length; + rec.assetErrors = [...new Set(rec.assetErrors)].slice(0, 15); if (rec.pageErrors.length) rec.failReasons.push(`${rec.pageErrors.length} uncaught page error(s)`); if (rec.exceptionErrors.length) rec.failReasons.push(`${rec.exceptionErrors.length} exception-like console error(s)`); + if (rec.assetErrors.length) rec.failReasons.push(`${rec.assetErrors.length} asset-load failure(s)`); if (!rec.canvasVisible) rec.failReasons.push("canvas-not-visible"); rec.status = rec.failReasons.length ? "FAIL" : "PASS"; writeFileSync(resolve(outDir, "report.json"), JSON.stringify(rec, null, 2)); @@ -297,7 +355,7 @@ console.log(`\n=================== SUMMARY ===================`); console.log(`Passed: ${summary.passed.length}/${summary.games.length}`); for (const g of summary.games) { const tag = g.status === "PASS" ? "✅" : "❌"; - console.log(`${tag} ${g.name.padEnd(22)} start=${g.startClicked ? "Y" : "-"} canvas=${g.canvasVisible ? "Y" : "-"} exc=${g.exceptionErrors?.length ?? 0} page=${g.pageErrors.length} noise=${g.noiseErrorCount ?? 0}${g.failReasons.length ? " << " + g.failReasons.join("; ") : ""}`); + console.log(`${tag} ${g.name.padEnd(22)} start=${g.startClicked ? "Y" : "-"} canvas=${g.canvasVisible ? "Y" : "-"} exc=${g.exceptionErrors?.length ?? 0} page=${g.pageErrors.length} asset=${g.assetErrors?.length ?? 0} noise=${g.noiseErrorCount ?? 0}${g.failReasons.length ? " << " + g.failReasons.join("; ") : ""}`); } console.log(`\nReport dir: ${outRoot}`); await browser.close(); diff --git a/scripts/playwright/oss-uikit-overlay-click.mjs b/scripts/playwright/oss-uikit-overlay-click.mjs new file mode 100644 index 00000000..774240f7 --- /dev/null +++ b/scripts/playwright/oss-uikit-overlay-click.mjs @@ -0,0 +1,424 @@ +/** + * UIKit overlay click-blocking regression test. + * + * Reproduces — and verifies the fix for — the cubecity-hex bug where HUD + * buttons became unclickable. Root cause: a full-screen overlay with + * pointerEvents:"auto" that is "hidden" via visibility:"hidden" stays in the + * layout and KEEPS raycast-blocking everything behind it (the @ni2khanna/uikit + * raycast path only skips elements whose pointerEvents === "none", never + * visibility:"hidden"). Switching the hide to display:"none" removes the + * element from layout AND raycasting, so clicks reach the buttons underneath. + * + * This drives the REAL engine click stack — UIKitPointerEvents.initialize / + * registerRoot + forwardHtmlEvents(canvas, uiCamera, scene) — on a deliberately + * light scene (one button + one overlay) so it runs headless without the heavy + * cubecity scene crashing the renderer. + * + * Phase A: overlay visibility:"hidden" -> click center -> EXPECT clicks == 0 (blocked) + * Phase B: overlay display:"none" -> click center -> EXPECT clicks == 1 (lands) + * + * Usage: node scripts/playwright/oss-uikit-overlay-click.mjs + * Requires `bun run dev` on :5173. + */ +import {chromium} from "playwright"; +import {mkdirSync, writeFileSync} from "node:fs"; +import {resolve, dirname} from "node:path"; +import {fileURLToPath} from "node:url"; + +const __dirname = dirname(fileURLToPath(import.meta.url)); +const baseUrl = process.env.BASE_URL || "http://localhost:5173"; +const headed = process.env.HEADED === "1"; +const outDir = resolve(__dirname, "_uikit-overlay-click-output"); +mkdirSync(outDir, {recursive: true}); + +// A tiny behavior that builds the exact blocking scenario using the real +// engine globals injected into behavior scripts (UIKit, UIKitPointerEvents). +const PROBE_BEHAVIOR = `meta: + tool: StemStudio + type: behavior + exportVersion: 1 + +config: + name: "Overlay Click Probe" + id: "probe.overlayClick" + author: "test" + isScript: true + main: "script.js" + version: "1.0.0" + description: "Minimal HUD button under a full-screen overlay, for click-blocking tests." + tags: + - gameplay + priority: 0 + attributes: {} + +code: | + this.init = function (_game) { + var game = _game; + window.__clicks = 0; + window.__probeReady = false; + window.__probeErr = null; + try { + // Mirror cubecity's useNodeMaterialProps: pick the material mode the active + // renderer actually supports (node materials only render under the WebGPU/ + // TSL pipeline; headless here is WebGL, so this resolves to false). + function unmp(props) { + var useNM = true; + try { + if (game && game.renderContext && game.renderContext.useNodeMaterial !== undefined) { + useNM = game.renderContext.useNodeMaterial; + } + } catch (e) {} + props.useNodeMaterial = useNM; + return props; + } + var fs = new UIKit.Fullscreen(game.renderer, unmp({ + pointerEvents: "none", + justifyContent: "center", + alignItems: "center" + })); + window.__h = { click: 0, down: 0, up: 0, over: 0, move: 0 }; + var btn = new UIKit.Container(unmp({ + width: 220, height: 90, + backgroundColor: "rgba(120,200,255,0.6)", + pointerEvents: "auto", + justifyContent: "center", alignItems: "center", + onClick: function () { window.__clicks++; window.__h.click++; }, + onPointerDown: function () { window.__h.down++; }, + onPointerUp: function () { window.__h.up++; }, + onPointerOver: function () { window.__h.over++; }, + onPointerMove: function () { window.__h.move++; } + })); + fs.add(btn); + var overlay = new UIKit.Container(unmp({ + positionType: "absolute", positionLeft: 0, positionTop: 0, + width: "100%", height: "100%", + backgroundColor: "rgba(0,0,0,0.25)", + pointerEvents: "auto" + })); + fs.add(overlay); + btn.name = "BUTTON"; + overlay.name = "OVERLAY"; + UIKitPointerEvents.initialize(game); + game.uiCamera.add(fs); + UIKitPointerEvents.registerRoot(fs); + this._fs = fs; + // Renderer-independent hit test: cast a ray from the UI camera through + // screen-center (NDC 0,0) into the UI root and report the CLOSEST hit's + // owning component. This is exactly what forwardHtmlEvents does internally + // (Raycaster vs scene geometry) — it works even though the headless WebGL + // fallback never paints the UIKit meshes to screen. The fix is about + // whether a hidden overlay still occupies the raycast, so this is the + // mechanism under test. + window.__hitTopName = function () { + try { + // Cast through the BUTTON's actual screen position, not NDC center — + // the UI camera is a perspective camera and the UI is not at the + // screen center. This mirrors a real click landing on the button: + // does the overlay still intercept that ray before the button? + var box = new THREE.Box3().setFromObject(btn); + var center = box.getCenter(new THREE.Vector3()); + var ndc = center.clone().project(game.uiCamera); + var rc = new THREE.Raycaster(); + rc.setFromCamera(new THREE.Vector2(ndc.x, ndc.y), game.uiCamera); + var hits = rc.intersectObject(fs, true); + for (var i = 0; i < hits.length; i++) { + var o = hits[i].object; + while (o) { + if (o.name === "OVERLAY") return "OVERLAY"; + if (o.name === "BUTTON") return "BUTTON"; + o = o.parent; + } + } + return hits.length ? ("OTHER:" + hits.length) : "NONE"; + } catch (e) { return "ERR:" + (e && e.message ? e.message : e); } + }; + window.__btnNDC = function () { + try { + var c = new THREE.Box3().setFromObject(btn).getCenter(new THREE.Vector3()); + var ndc = c.project(game.uiCamera); + return {x: ndc.x, y: ndc.y}; + } catch (e) { return null; } + }; + window.__diag = function () { + var out = {meshes: [], camera: null, fsChildren: (fs.children ? fs.children.length : -1)}; + try { + var r = game.renderer; + out.rendererType = r ? (r.isWebGPURenderer ? "WebGPU" : (r.isWebGLRenderer ? "WebGL" : (r.constructor && r.constructor.name))) : "no-renderer"; + var sz = new THREE.Vector2(); if (r && r.getSize) r.getSize(sz); out.rendererSize = {x: sz.x, y: sz.y}; + } catch (e) { out.rendererErr = String(e); } + try { + var cam = game.uiCamera; + if (cam) { + out.camera = { + type: cam.isOrthographicCamera ? "Ortho" : (cam.isPerspectiveCamera ? "Persp" : (cam.type || "?")), + pos: cam.position ? [cam.position.x, cam.position.y, cam.position.z].map(function (n) { return +n.toFixed(2); }) : null, + inScene: !!(cam.parent), + parentName: cam.parent ? (cam.parent.name || cam.parent.type) : null + }; + } + } catch (e) { out.cameraErr = String(e); } + function sig(c, prop) { + try { var s = c[prop]; return s && typeof s.peek === "function" ? s.peek() : (s && "value" in s ? s.value : s); } catch (e) { return "err"; } + } + try { + out.overlaySignals = {isVisible: sig(overlay, "isVisible"), displayed: sig(overlay, "displayed"), explicitVisible: sig(overlay, "explicitVisible")}; + out.btnSignals = {isVisible: sig(btn, "isVisible"), displayed: sig(btn, "displayed"), explicitVisible: sig(btn, "explicitVisible")}; + out.fsSignals = {isVisible: sig(fs, "isVisible"), displayed: sig(fs, "displayed")}; + } catch (e) { out.sigErr = String(e); } + try { + var box = new THREE.Box3(); var v = new THREE.Vector3(); + fs.traverse(function (o) { + if (!o.isMesh) return; + o.updateWorldMatrix && o.updateWorldMatrix(true, false); + var bb = null; + try { box.setFromObject(o); bb = box.isEmpty() ? "empty" : {min: [+box.min.x.toFixed(1), +box.min.y.toFixed(1), +box.min.z.toFixed(1)], max: [+box.max.x.toFixed(1), +box.max.y.toFixed(1), +box.max.z.toFixed(1)]}; } catch (e) { bb = "err"; } + o.getWorldPosition && o.getWorldPosition(v); + out.meshes.push({ + name: o.name || (o.parent && o.parent.name) || o.type, + visible: o.visible, + hasRaycast: typeof o.raycast === "function", + worldPos: [+v.x.toFixed(1), +v.y.toFixed(1), +v.z.toFixed(1)], + bbox: bb + }); + }); + } catch (e) { out.meshErr = String(e); } + return out; + }; + function sigVal(c, prop) { + try { var s = c[prop]; return s && typeof s.peek === "function" ? s.peek() : null; } catch (e) { return "err"; } + } + window.__probe = { + hideVisibility: function () { overlay.setProperties({ visibility: "hidden" }); }, + hideDisplay: function () { overlay.setProperties({ display: "none", visibility: "visible" }); }, + showOverlay: function () { overlay.setProperties({ display: "flex", visibility: "visible" }); }, + resetClicks: function () { window.__clicks = 0; }, + // isVisible is the exact gate makeClippedCast() checks: a panel with + // isVisible===false is skipped by the pointer-events hit test, so it can + // neither receive nor block clicks. + vis: function () { return { overlay: sigVal(overlay, "isVisible"), button: sigVal(btn, "isVisible") }; } + }; + window.__probeReady = true; + } catch (e) { + window.__probeErr = String(e && e.message ? e.message : e); + } + }; + this.update = function (dt) { + try { UIKitPointerEvents.update(dt); } catch (e) {} + }; + this.dispose = function () { + try { + if (this._fs) { UIKitPointerEvents.unregisterRoot(this._fs); this._fs.dispose && this._fs.dispose(); } + UIKitPointerEvents.deinitialize(); + } catch (e) {} + }; +`; + +const PROBE_STEMSCRIPT = `project title "Overlay Click Probe" +import behavior name="Overlay Click Probe" filepath="behaviors/probeOverlayClick.yaml" +game settings enabled=true showHUD=false maxScore=0 +add group name="UIHost" position=0,0,0 +behavior attach UIHost behaviorId=probe.overlayClick +`; + +const steps = []; +const step = (s, ok = true, d) => { steps.push({s, ok, d}); console.log(` ${ok ? "·" : "✗"} ${s}${d !== undefined ? ` (${d})` : ""}`); }; + +const browser = await chromium.launch({ + headless: !headed, + args: ["--disable-dev-shm-usage", "--no-sandbox"], +}); +const ctx = await browser.newContext({viewport: {width: 1280, height: 800}}); +const page = await ctx.newPage(); +page.on("console", m => { if (m.type() === "error") console.log(" [console.error]", m.text().slice(0, 200)); }); +page.on("pageerror", e => console.log(" [pageerror]", (e.message || String(e)).slice(0, 200))); + +const dismissBootstrap = async () => { + const bs = page.locator('[aria-labelledby="oss-bootstrap-title"]').first(); + if (await bs.count() && await bs.isVisible().catch(() => false)) { + await bs.locator('button:has-text("Browser storage")').first().click({timeout: 3000}).catch(() => {}); + await bs.locator('button:has-text("Continue")').first().click({timeout: 5000}).catch(() => {}); + await page.waitForSelector('[aria-labelledby="oss-bootstrap-title"]', {state: "detached", timeout: 5000}).catch(() => {}); + } +}; +const dismissTutorial = async () => { + const g = page.locator('button:has-text("Got It")').first(); + if (await g.count() && await g.isVisible().catch(() => false)) await g.click({timeout: 3000}).catch(() => {}); +}; + +let status = "pending"; +try { + // 1. playground + fresh project + await page.goto(baseUrl + "/dashboard?mode=playground", {waitUntil: "domcontentloaded", timeout: 30000}); + await page.waitForLoadState("networkidle", {timeout: 15000}).catch(() => {}); + await dismissBootstrap(); + step("playground activated"); + + await page.goto(baseUrl + "/create/project", {waitUntil: "domcontentloaded", timeout: 30000}); + await page.waitForLoadState("networkidle", {timeout: 15000}).catch(() => {}); + await dismissBootstrap(); + await page.waitForTimeout(6000); + await dismissTutorial(); + + // 2. expose __stemRunScript + import the probe + const copilotBtn = page.locator('[data-testid="actionbar-copilot"]').first(); + const cBox = await copilotBtn.boundingBox().catch(() => null); + if (cBox) await page.mouse.click(cBox.x + cBox.width / 2, cBox.y + cBox.height / 2); + else await copilotBtn.click({timeout: 3000, force: true}).catch(() => {}); + await page.waitForTimeout(2000); + const hookPresent = await page.evaluate(() => typeof window.__stemRunScript === "function"); + step("run-script hook exposed", hookPresent); + if (!hookPresent) throw new Error("__stemRunScript not exposed"); + + const fileList = [{name: "behaviors/probeOverlayClick.yaml", mime: "text/yaml", data: Buffer.from(PROBE_BEHAVIOR).toString("base64")}]; + await page.evaluate(({content, fileList}) => + window.__stemRunScript(content, fileList).then(() => { window.__d = "ok"; }, e => { window.__d = String(e && e.message ? e.message : e); }), + {content: PROBE_STEMSCRIPT, fileList}); + await page.waitForLoadState("networkidle", {timeout: 60000}).catch(() => {}); + await page.waitForTimeout(3000); + await dismissTutorial(); + const execResult = await page.evaluate(() => window.__d ?? null).catch(() => null); + step("import exec", execResult === "ok", execResult ?? "no signal"); + + // 3. save + reload via the dashboard. The uiCamera overlay render pass is + // only wired up on a fresh editor load (the scene/v2 reload path) — UIKit + // HUDs do NOT render on same-session import->play. The probe scene is tiny, + // so unlike the heavy cubecity scene this reload renders without crashing. + await page.locator('[data-testid="topnav-app-menu"]').first().click({timeout: 3000, force: true}).catch(() => {}); + await page.waitForTimeout(400); + const save = page.locator("text=Save Project").first(); + if (await save.isVisible().catch(() => false)) { + await save.click({timeout: 3000}).catch(() => {}); + await page.locator("text=/^Saved$/").first().waitFor({state: "visible", timeout: 30000}).catch(() => {}); + await page.waitForTimeout(1000); + } + const sceneId = (page.url().match(/\/create\/project\/([^/?#]+)/) || [])[1] || null; + step("saved", !!sceneId, sceneId ?? "no scene id"); + + await page.goto(baseUrl + "/dashboard?mode=playground", {waitUntil: "domcontentloaded", timeout: 20000}).catch(() => {}); + await page.waitForLoadState("networkidle", {timeout: 15000}).catch(() => {}); + await dismissBootstrap(); + await page.waitForTimeout(1500); + if (sceneId) { + const card = page.locator(`[data-scene-id="${sceneId}"]`).first(); + await card.waitFor({state: "attached", timeout: 20000}).catch(() => {}); + if (await card.count()) { + await card.click({timeout: 5000}).catch(() => {}); + await page.waitForLoadState("networkidle", {timeout: 30000}).catch(() => {}); + await dismissBootstrap(); + await page.waitForSelector("canvas", {timeout: 30000}).catch(() => {}); + await dismissTutorial(); + await page.waitForTimeout(4000); + } + } + step("editor reloaded, canvas visible", await page.locator("canvas").first().isVisible().catch(() => false)); + + // 4. enter Play (the probe builds its UI in init(), play-only) + const playBtn = page.locator('[data-testid="topnav-play"]').first(); + await playBtn.click({timeout: 3000, force: true}); + const dontSave = page.locator("button", {hasText: /don['’]t\s*save/i}).first(); + if (await dontSave.count() && await dontSave.isVisible().catch(() => false)) { await dontSave.click().catch(() => {}); await page.waitForTimeout(500); } + await page.waitForFunction(() => window.__probeReady === true || window.__probeErr, {timeout: 20000}).catch(() => {}); + const probeErr = await page.evaluate(() => window.__probeErr); + const probeReady = await page.evaluate(() => window.__probeReady === true); + step("probe UI built in play", probeReady, probeErr || undefined); + if (!probeReady) throw new Error("probe did not build: " + (probeErr || "unknown")); + await page.waitForTimeout(1500); + const diag = await page.evaluate(() => window.__diag()); + step("UIKit root diagnostic", true, JSON.stringify(diag)); + await page.screenshot({path: resolve(outDir, "01-overlay-shown.png")}).catch(() => {}); + + // Center of the canvas == center of the button (Fullscreen centers it). + const canvas = page.locator("canvas").first(); + const box = await canvas.boundingBox(); + const cx = box.x + box.width / 2; + const cy = box.y + box.height / 2; + + // Real synthetic click at the BUTTON's actual screen position (projected via + // the UI camera), so we exercise the genuine forwardHtmlEvents pointer path + // rather than guessing the center. Bonus signal — needs the panel to paint, + // which the overlay-compositing pass may not do headless. + const clickButton = async () => { + const ndc = await page.evaluate(() => window.__btnNDC()); + if (!ndc) return -1; + const px = box.x + (ndc.x * 0.5 + 0.5) * box.width; + const py = box.y + (-ndc.y * 0.5 + 0.5) * box.height; + await page.mouse.move(box.x + 8, box.y + 8); + await page.waitForTimeout(80); + await page.mouse.move(px, py, {steps: 6}); + await page.waitForTimeout(120); + await page.mouse.down(); + await page.waitForTimeout(80); + await page.mouse.up(); + await page.waitForTimeout(450); + return page.evaluate(() => window.__clicks); + }; + + // Apply a hide mode, let the layout settle a few frames (root.update runs + // every frame via the behavior), then read the isVisible GATE (what + // makeClippedCast checks to include/exclude a panel from hit-testing) plus a + // real click attempt. + const probe = async (modeFn) => { + await page.evaluate((m) => { window.__probe.resetClicks(); window.__probe[m](); }, modeFn); + await page.waitForTimeout(700); + const vis = await page.evaluate(() => window.__probe.vis()); + const clicks = await clickButton(); + return {vis, clicks}; + }; + + // Informational: confirm the isVisible gate (what makeClippedCast checks to + // include/exclude a panel from the pointer hit-test) responds to both hide + // modes. NOTE: a handler-less full-screen overlay does NOT actually block a + // sibling button behind it (same-plane z-ordering), so overlay visibility is + // a red herring for the click bug — see the CLICK DELIVERY check below. + const visShown = (await probe("showOverlay")).vis; + step("info: shown overlay isVisible", true, `overlay.isVisible=${visShown.overlay} button.isVisible=${visShown.button}`); + const visGone = (await probe("hideDisplay")).vis; + step("info: display:none clears overlay isVisible", visGone.overlay === false, `overlay.isVisible=${visGone.overlay}`); + + // CLICK-DELIVERY REGRESSION (the real bug): the camera controls call + // setPointerCapture() on #scene-container on pointerdown, which redirects + // pointerup away from the . Before the fix (UIKitPointerEvents bound + // to #scene-container instead of the canvas) a UIKit button got onPointerDown + // but never onClick. Dispatch a real pointer sequence at the button's + // projected screen position and assert the full down -> up -> click fires. + await page.evaluate(() => { + window.__probe.hideDisplay(); + window.__h = {click:0,down:0,up:0,over:0,move:0}; + // DOM capture-phase counters: did the native pointer events reach the + // document at all (i.e. were they swallowed by pointer capture)? + window.__dom = {down:0, up:0, move:0, lost:0, downEv:null, upEv:null}; + const rec = (e) => { const t = e.target || {}; return {button: e.button, tag: t.tagName, id: t.id, cls: (typeof t.className === "string" ? t.className : "").slice(0, 80), style: t.getAttribute ? (t.getAttribute("style") || "").slice(0, 120) : ""}; }; + document.addEventListener("pointerdown", (e) => { window.__dom.down++; window.__dom.downEv = rec(e); }, true); + document.addEventListener("pointerup", (e) => { window.__dom.up++; window.__dom.upEv = rec(e); }, true); + document.addEventListener("pointermove", () => window.__dom.move++, true); + document.addEventListener("lostpointercapture", () => window.__dom.lost++, true); + }); + await page.waitForTimeout(400); + const ndc = await page.evaluate(() => window.__btnNDC()); + const px = box.x + (ndc.x * 0.5 + 0.5) * box.width; + const py = box.y + (-ndc.y * 0.5 + 0.5) * box.height; + const targetTag = await page.evaluate(({x, y}) => { const el = document.elementFromPoint(x, y); return el ? (el.tagName + (el.id ? "#" + el.id : "")) : "none"; }, {x: px, y: py}); + await page.mouse.move(box.x + 12, box.y + 12); + await page.waitForTimeout(80); + await page.mouse.move(px, py, {steps: 8}); + await page.waitForTimeout(150); + await page.mouse.down(); + await page.waitForTimeout(100); + await page.mouse.up(); + await page.waitForTimeout(500); + const h = await page.evaluate(() => window.__h); + const dom = await page.evaluate(() => window.__dom); + step("CLICK DELIVERY: button receives full down->up->click", h.click > 0, `target=${targetTag} px=(${Math.round(px)},${Math.round(py)}) uikit=${JSON.stringify(h)} dom.upTarget=${dom.upEv && dom.upEv.id ? "#" + dom.upEv.id : dom.upEv && dom.upEv.tag}`); + + status = (h.click > 0 && h.up > 0) ? "PASS" : "FAIL"; +} catch (e) { + step("FATAL", false, (e.message || String(e)).slice(0, 200)); + status = "FAIL"; +} finally { + writeFileSync(resolve(outDir, "report.json"), JSON.stringify({status, steps}, null, 2)); + console.log(`\n=== UIKit overlay click test: ${status} ===`); + console.log(`Report dir: ${outDir}`); + await ctx.close(); + await browser.close(); + process.exit(status === "PASS" ? 0 : 1); +} diff --git a/scripts/playwright/oss-voxel-valley-lighting.mjs b/scripts/playwright/oss-voxel-valley-lighting.mjs new file mode 100644 index 00000000..e5329398 --- /dev/null +++ b/scripts/playwright/oss-voxel-valley-lighting.mjs @@ -0,0 +1,263 @@ +#!/usr/bin/env node +/** + * Regression test (PLAYGROUND mode): scene background + image-based environment + * lighting must survive a save → reload (and an edit → play → edit round-trip). + * + * Bug it guards against: a stemscript `scene background type=Texture texture="…"` + * command resolved the named image asset to an ephemeral `blob:` URL and + * persisted only that URL. Object URLs are revoked on page reload, so after a + * reload the editor could no longer fetch the skybox texture — losing both the + * visible background AND `scene.environment` (the image-based lighting that lit + * the whole scene). Result: "everything goes dark" on reload, even though the + * ambient/hemisphere/directional lights themselves were intact. + * + * Fix: `SettingsHandlers.handleSetSceneBackground` now also persists the stable + * `textureAsset` (AssetRef), which `EnvironmentSettingsManager.applyBackgroundSettings` + * re-fetches through the asset loader after a reload. + * + * The probe uses the `__stemGetScene` test affordance (extended to report + * lights, rendering, and scene.background/environment classification). + * + * Prereq: `bun run dev` on PLAYWRIGHT_BASE_URL (default localhost:5173). + * Set HEADED=1 to watch. Report → scripts/playwright/oss-voxel-valley-lighting-output/. + */ +import {chromium} from "playwright"; +import {writeFileSync, mkdirSync, readFileSync, readdirSync, statSync, existsSync} from "node:fs"; +import {dirname, resolve, basename, join} from "node:path"; +import {fileURLToPath} from "node:url"; + +const __dirname = dirname(fileURLToPath(import.meta.url)); +const outDir = resolve(__dirname, "oss-voxel-valley-lighting-output"); +mkdirSync(outDir, {recursive: true}); + +const baseUrl = (process.env.PLAYWRIGHT_BASE_URL || "http://localhost:5173").replace(/\/$/, ""); +const headed = process.env.HEADED === "1"; +const gameFolder = process.env.GAME_FOLDER || "/Users/n/erth/Games-StemScript/voxel-valley"; + +function walkFiles(root) { + const out = []; + const recurse = (dir, prefix) => { + for (const entry of readdirSync(dir)) { + if (entry === ".DS_Store") continue; + const abs = join(dir, entry); + const rel = prefix ? `${prefix}/${entry}` : entry; + if (statSync(abs).isDirectory()) recurse(abs, rel); + else out.push({name: rel, abs}); + } + }; + recurse(root, ""); + return out; +} +function mimeFor(name) { + const lower = name.toLowerCase(); + if (lower.endsWith(".gltf")) return "model/gltf+json"; + if (lower.endsWith(".glb")) return "model/gltf-binary"; + if (lower.endsWith(".png")) return "image/png"; + if (lower.endsWith(".jpg") || lower.endsWith(".jpeg")) return "image/jpeg"; + if (lower.endsWith(".webp")) return "image/webp"; + if (lower.endsWith(".wav")) return "audio/wav"; + if (lower.endsWith(".mp3")) return "audio/mpeg"; + if (lower.endsWith(".yaml") || lower.endsWith(".yml")) return "application/x-yaml"; + if (lower.endsWith(".json")) return "application/json"; + if (lower.endsWith(".md") || lower.endsWith(".txt") || lower.endsWith(".stemscript")) return "text/plain"; + return "application/octet-stream"; +} + +// Probe via the sanctioned `__stemGetScene` affordance (lights + background + env). +const PROBE = () => { + const fn = window.__stemGetScene; + if (typeof fn !== "function") return {error: "no __stemGetScene hook"}; + const s = fn(); + const lights = s.lights || []; + return { + counts: { + ambient: lights.filter(l => l.type === "AmbientLight").length, + hemisphere: lights.filter(l => l.type === "HemisphereLight").length, + directional: lights.filter(l => l.type === "DirectionalLight").length, + }, + rendering: s.rendering, + sceneEnv: s.sceneEnv, + mode: s.mode, + sceneName: s.sceneName, + }; +}; + +const report = {baseUrl, gameFolder, startedAt: new Date().toISOString(), checkpoints: {}, assertions: {}, consoleErrors: [], pageErrors: []}; +const failures = []; +function assert(name, cond, detail) { + report.assertions[name] = {pass: !!cond, detail}; + if (cond) console.log(`✓ ${name}`); + else { console.log(`✗ ${name} — ${detail ?? ""}`); failures.push(name); } +} + +if (!existsSync(gameFolder)) { console.error("missing game folder", gameFolder); process.exit(1); } +const files = walkFiles(gameFolder); +const scriptFile = files.find(f => f.name.toLowerCase().endsWith(".stemscript")); +const scriptContent = readFileSync(scriptFile.abs, "utf8"); +const folderFiles = files.filter(f => f !== scriptFile) + .map(f => ({name: f.name, mime: mimeFor(f.name), data: readFileSync(f.abs).toString("base64")})); +console.log(`read ${basename(gameFolder)}: ${files.length} files`); + +const browser = await chromium.launch({headless: !headed}); +const ctx = await browser.newContext({viewport: {width: 1440, height: 900}}); +const page = await ctx.newPage(); +page.on("console", m => { if (m.type() === "error") report.consoleErrors.push(m.text().slice(0, 300)); }); +page.on("pageerror", e => report.pageErrors.push({message: e.message, stack: e.stack?.slice(0, 800)})); + +const dismissBootstrap = async () => { + const bs = page.locator('[aria-labelledby="oss-bootstrap-title"]').first(); + if (await bs.count() && await bs.isVisible().catch(() => false)) { + await bs.locator('button:has-text("Browser storage")').first().click({timeout: 3000}).catch(() => {}); + await bs.locator('button:has-text("Continue")').first().click({timeout: 5000}).catch(() => {}); + await page.waitForSelector('[aria-labelledby="oss-bootstrap-title"]', {state: "detached", timeout: 5000}).catch(() => {}); + await page.waitForTimeout(400); + } +}; +const dismissTutorial = async () => { + const gotIt = page.locator('button:has-text("Got It")').first(); + if (await gotIt.count() && await gotIt.isVisible().catch(() => false)) { await gotIt.click({timeout: 3000}).catch(() => {}); await page.waitForTimeout(300); } +}; +const openCopilot = async () => { + if (await page.evaluate(() => typeof window.__stemGetScene === "function").catch(() => false)) return; + const btn = page.locator('[data-testid="actionbar-copilot"]').first(); + const box = await btn.boundingBox().catch(() => null); + if (box) await page.mouse.click(box.x + box.width / 2, box.y + box.height / 2); + else await btn.click({timeout: 3000, force: true}).catch(() => {}); + await page.waitForTimeout(1500); +}; +// Pin the editor camera to a fixed viewpoint that frames a large patch of sky, +// so the skybox render is comparable across fresh-import vs reload (the camera +// otherwise resets on reload). +const SKY_CAM = {pos: [0, 30, 70], target: [0, 34, 0]}; +const pinCamera = async () => { + await openCopilot(); + await page.evaluate(({pos, target}) => window.__stemSetEditorCamera?.(pos, target), SKY_CAM).catch(() => {}); + await page.waitForTimeout(1200); +}; +const probe = async (label) => { + await openCopilot(); + const data = await page.evaluate(PROBE).catch(e => ({error: String(e)})); + report.checkpoints[label] = data; + console.log(`\n[${label}] ${JSON.stringify(data)}`); + return data; +}; +// A correctly-lit voxel-valley scene: skybox texture background + image-based +// environment + all three scene lights present. +const assertLit = (prefix, d) => { + assert(`${prefix}-no-probe-error`, !d.error, d.error); + assert(`${prefix}-ambient-light`, d.counts?.ambient === 1, JSON.stringify(d.counts)); + assert(`${prefix}-hemisphere-light`, d.counts?.hemisphere === 1, JSON.stringify(d.counts)); + assert(`${prefix}-directional-light`, d.counts?.directional >= 1, JSON.stringify(d.counts)); + assert(`${prefix}-background-is-texture`, d.rendering?.backgroundType === "Texture", `backgroundType=${d.rendering?.backgroundType}`); + assert(`${prefix}-has-texture-assetref`, d.rendering?.hasBackgroundTextureAsset === true, "missing textureAsset (blob-only persistence)"); + assert(`${prefix}-scene-background-texture`, d.sceneEnv?.background === "Texture", `scene.background=${d.sceneEnv?.background}`); + assert(`${prefix}-scene-environment-texture`, d.sceneEnv?.environment === "Texture", `scene.environment=${d.sceneEnv?.environment} (IBL lost -> dark scene)`); +}; + +const storeMode = process.env.STORE_MODE === "filesystem" ? "filesystem" : "indexeddb"; +report.storeMode = storeMode; +console.log(`store mode: ${storeMode}`); + +// Bootstrap the File System Access store via OPFS (no picker needed): create a +// clean OPFS folder, persist its handle where the bootstrap looks, and flip the +// persistence mode. A subsequent fresh navigation makes rehydrateProjectStore() +// register FileSystemProjectStore against it. +const bootstrapFilesystemStore = async () => { + await page.evaluate(async () => { + const root = await navigator.storage.getDirectory(); + try { await root.removeEntry("stem-fs", {recursive: true}); } catch { /* first run */ } + const fsRoot = await root.getDirectoryHandle("stem-fs", {create: true}); + await new Promise((res, rej) => { + const req = indexedDB.open("stemstudio-fs-handle", 1); + req.onupgradeneeded = () => { const db = req.result; if (!db.objectStoreNames.contains("handles")) db.createObjectStore("handles"); }; + req.onsuccess = () => { const tx = req.result.transaction("handles", "readwrite"); tx.objectStore("handles").put(fsRoot, "project-dir"); tx.oncomplete = () => res(); tx.onerror = () => rej(tx.error); }; + req.onerror = () => rej(req.error); + }); + localStorage.setItem("stemstudio.persistence.mode", "filesystem"); + localStorage.setItem("stemstudio.bootstrap.complete", "true"); + }); +}; + +try { + await page.goto(baseUrl + "/dashboard?mode=playground", {waitUntil: "domcontentloaded", timeout: 30000}); + await page.waitForLoadState("networkidle", {timeout: 15000}).catch(() => {}); + await dismissBootstrap(); + if (storeMode === "filesystem") { + await bootstrapFilesystemStore(); + await page.waitForTimeout(300); + } + + await page.goto(baseUrl + "/create/project", {waitUntil: "domcontentloaded", timeout: 30000}); + await page.waitForLoadState("networkidle", {timeout: 15000}).catch(() => {}); + await dismissBootstrap(); + await page.waitForTimeout(6000); + await dismissTutorial(); + await openCopilot(); + assert("run-script-hook-exposed", await page.evaluate(() => typeof window.__stemRunScript === "function"), "no __stemRunScript"); + + const execStartUrl = page.url(); + try { + await page.evaluate(({content, fileList}) => + window.__stemRunScript(content, fileList).then( + () => { window.__stemRunScriptDone = "ok"; }, + err => { window.__stemRunScriptDone = String(err && err.message ? err.message : err); }, + ), {content: scriptContent, fileList: folderFiles}); + } catch (e) { console.log("exec evaluate detached:", e.message.slice(0, 120)); } + await page.waitForLoadState("networkidle", {timeout: 90000}).catch(() => {}); + await page.waitForTimeout(7000); + await pinCamera(); + await page.screenshot({path: resolve(outDir, "A-after-import.png")}).catch(() => {}); + assertLit("import", await probe("A_fresh_import")); + + // Save + await page.locator('[data-testid="topnav-app-menu"]').first().click({timeout: 3000, force: true}).catch(() => {}); + await page.waitForTimeout(400); + const save = page.locator("text=Save Project").first(); + if (await save.isVisible().catch(() => false)) { + await save.click({timeout: 3000}).catch(() => {}); + // CRITICAL for filesystem mode: the OPFS save writes every asset file + // then assets.json LAST and can take several seconds. Reloading before + // it finishes leaves the folder without a manifest, so loadAssets + // returns [] and the scene loses its skybox/models. Wait for the + // "Saved" toast (emitted only after assets are fully persisted). + await page.locator("text=/^Saved$/").first().waitFor({state: "visible", timeout: 30000}).catch(() => {}); + await page.waitForTimeout(1000); + } + const sceneId = (page.url().match(/\/create\/project\/([^/?#]+)/) || [])[1] || null; + assert("scene-id-resolved", !!sceneId, page.url()); + + // === C) full dashboard reload (the primary regression) === + if (sceneId) { + await page.goto(baseUrl + "/dashboard?mode=playground", {waitUntil: "domcontentloaded", timeout: 20000}).catch(() => {}); + await page.waitForLoadState("networkidle", {timeout: 15000}).catch(() => {}); + await dismissBootstrap(); + await page.waitForTimeout(2000); + const card = page.locator(`[data-scene-id="${sceneId}"]`).first(); + assert("imported-project-listed", (await card.count()) > 0, `data-scene-id="${sceneId}" not found`); + if (await card.count()) { + await card.click({timeout: 5000}).catch(() => {}); + await page.waitForLoadState("networkidle", {timeout: 30000}).catch(() => {}); + await dismissBootstrap(); + await page.waitForSelector("canvas", {timeout: 30000}).catch(() => {}); + await dismissTutorial(); + await page.waitForTimeout(9000); + await pinCamera(); + await page.screenshot({path: resolve(outDir, "C-reloaded.png")}).catch(() => {}); + assertLit("reload", await probe("C_reload")); + } + } +} catch (e) { + console.error("FATAL", e.message); + report.fatal = {message: e.message, stack: e.stack?.slice(0, 600)}; + failures.push("fatal:" + e.message); +} finally { + report.finishedAt = new Date().toISOString(); + report.failures = failures; + writeFileSync(resolve(outDir, "report.json"), JSON.stringify(report, null, 2)); + console.log(`\n=== voxel-valley lighting persistence ===`); + console.log(`Assertions: ${Object.values(report.assertions).filter(a => a.pass).length}/${Object.keys(report.assertions).length} passed`); + console.log(`pageErrors: ${report.pageErrors.length} Output: ${outDir}`); + await browser.close(); + if (failures.length) { console.error(`\nFAIL: ${failures.join(", ")}`); process.exit(1); } + console.log("\nPASS"); +} diff --git a/scripts/playwright/site-docs.mjs b/scripts/playwright/site-docs.mjs index 63c62a0c..00522029 100755 --- a/scripts/playwright/site-docs.mjs +++ b/scripts/playwright/site-docs.mjs @@ -92,6 +92,11 @@ try { /this\.erth\.events\.on/.test(runtimeText), runtimeText.slice(0, 160), ); + assert( + "Runtime API page includes game-derived examples", + /Patterns from real playground games/.test(runtimeText) && /race\.trackReady/.test(runtimeText), + runtimeText.slice(-220), + ); } catch (e) { failures.push(`exception: ${e.message}`); console.error(e); From 2cdb00f2a0a29501e100a1049a866a66d0deea32 Mon Sep 17 00:00:00 2001 From: Nitin Khanna Date: Sun, 31 May 2026 10:37:43 -0700 Subject: [PATCH 5/7] Fix OSS model import: stop assuming every model file is a ZIP archive MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The script-tool model import hardcoded "application/zip" as the source container for every model, forcing all files through JSZip's expandZip. That only works for models bundled as real ZIP archives (e.g. pirate-ship .glb files are PK\x03\x04 zips of model + textures). Raw .glb/.gltf/.fbx/ .obj files (100-cars, 3d-chess) failed with "Can't find end of central directory" and returned {success:false} per model WITHOUT throwing, so the script kept running, behaviors still imported, and exec reported "done". Across a mixed library this looked like "about half the models and behaviors silently don't import" — behaviors that reference the missing models then appear broken downstream. Fix: sniff the first 4 bytes and pass "application/zip" only for true PK\x03\x04 archives, "" otherwise — so zip-wrapped models keep their exact path and raw model files load directly with their companion files. This matches every other loadModelFromFile caller, which lets the function auto-detect the container. Verified via persisted-scene introspection: - 3d-chess: 0 -> 6/6 models + 6 model assets - 100-cars: 0 -> 11/11 models + 11 model assets - pirate-ship: zip path unchanged (logs confirm expandZip + texture overrides + convertToGlb running normally) Also includes related in-progress OSS import work (behavior dedup, asset-revision stability, image-derivative fallback) and the repro-import-inspect.mjs harness used to diagnose this. Co-Authored-By: Claude Opus 4.8 (1M context) --- .../src/agent/script-tool/importHandler.ts | 109 +++++- .../packages/editor-oss/src/editor/Editor.ts | 33 +- .../editor/asset-management/hooks/assets.ts | 18 +- .../v2/AiCopilot/TerminalView/useTerminal.ts | 8 +- .../CodeEditor/CodeEditorShell.tsx | 26 ++ .../v2/BehaviorEditor/scriptCompletions.ts | 13 +- client/packages/editor-oss/src/showToast.tsx | 22 ++ .../src/adapters/remote-go/asset/index.ts | 37 +- ...-30-oss-behavior-dedup-and-edit-persist.md | 152 ++++++++ ...2026-05-30-oss-glb-import-skip-reexport.md | 63 ++++ ...6-05-31-oss-model-import-zip-assumption.md | 55 +++ package.json | 2 - .../playwright/oss-pirate-ship-playground.mjs | 338 ++++++++++++++++++ scripts/playwright/repro-import-inspect.mjs | 165 +++++++++ .../1-editor.png | Bin 244320 -> 0 bytes .../verify-playground-play-output/2-play.png | Bin 252713 -> 0 bytes .../3-play-running.png | Bin 252636 -> 0 bytes 17 files changed, 1013 insertions(+), 28 deletions(-) create mode 100644 docs/planning/2026-05-30-oss-behavior-dedup-and-edit-persist.md create mode 100644 docs/planning/2026-05-30-oss-glb-import-skip-reexport.md create mode 100644 docs/planning/2026-05-31-oss-model-import-zip-assumption.md create mode 100644 scripts/playwright/oss-pirate-ship-playground.mjs create mode 100644 scripts/playwright/repro-import-inspect.mjs delete mode 100644 scripts/playwright/verify-playground-play-output/1-editor.png delete mode 100644 scripts/playwright/verify-playground-play-output/2-play.png delete mode 100644 scripts/playwright/verify-playground-play-output/3-play-running.png diff --git a/client/packages/editor-oss/src/agent/script-tool/importHandler.ts b/client/packages/editor-oss/src/agent/script-tool/importHandler.ts index 54a8b617..f922bde4 100644 --- a/client/packages/editor-oss/src/agent/script-tool/importHandler.ts +++ b/client/packages/editor-oss/src/agent/script-tool/importHandler.ts @@ -331,6 +331,8 @@ export async function processImportedFile( ); } } + let survivorAssetId: string | undefined; + let resultMessage = `Behavior "${config.name}" imported`; if (existingBhvConfig) { const assetId = existingBhvConfig.id || originalConfigId; // Always fetch the asset's actual HEAD revision to avoid stale-parent 409s @@ -355,18 +357,59 @@ export async function processImportedFile( aliasId, retryOnConflict: true, }); - return {success: true, message: `Behavior "${config.name}" updated (new revision)`}; + survivorAssetId = assetId; + resultMessage = `Behavior "${config.name}" updated (new revision)`; } } - const newBehavior = await createBehavior({ - assetSource: global.app?.editor?.assetSource, - name: config.name, - code, - config, - aliasId: originalConfigId !== config.name ? originalConfigId : undefined, - }); - return {success: true, message: `Behavior "${config.name}" imported (${newBehavior.id})`}; + if (!survivorAssetId) { + const newBehavior = await createBehavior({ + assetSource: global.app?.editor?.assetSource, + name: config.name, + code, + config, + aliasId: originalConfigId !== config.name ? originalConfigId : undefined, + }); + survivorAssetId = newBehavior.id; + resultMessage = `Behavior "${config.name}" imported (${newBehavior.id})`; + } + + // OSS de-duplication (on import, per user request). OSS has no + // revision history — there is only the latest version — so earlier + // imports of the same behavior leave orphan asset records that pile + // up in the Behaviors panel (the reported 3× copies). Collapse every + // other same-named behavior record down to the survivor we just + // imported. Scene objects attach by the logical/alias id, which + // resolves to this survivor, so dropping the other records is safe + // for attachments. Gated to OSS; integrated keeps server-side history. + const {IS_OSS} = await import("../../mode/buildMode"); + if (IS_OSS) { + const {getOssAssetsForProject, unregisterOssAsset} = await import("@stem/network/api/asset"); + const projectId = editor.sceneID; + if (projectId) { + const configRegistry = editor.behaviorConfigRegistry; + const scriptRegistry = editor.behaviorScriptRegistry; + const dupes = getOssAssetsForProject(projectId).filter(r => + r.type === AssetType.Behavior && + r.name === config.name && + r.assetId !== survivorAssetId && + r.assetId !== originalConfigId, + ); + for (const dup of dupes) { + unregisterOssAsset(dup.assetId); + configRegistry?.unregisterConfig(dup.assetId, true); + scriptRegistry?.unregisterScript(dup.assetId, true); + } + if (dupes.length) { + console.info( + `[ScriptImport] OSS dedup: collapsed ${dupes.length} duplicate ` + + `"${config.name}" behavior record(s) into ${survivorAssetId}`, + ); + } + } + } + + return {success: true, message: resultMessage}; } case "lambda": { @@ -490,9 +533,34 @@ export async function processImportedFile( // 1. Load model into Three.js (needed for thumbnail + texture cleanup) let model; + let loadedFormat: string | undefined; + let loadedRootFile: File | Blob | undefined; + let loadedAtlas: unknown; + let loadedTextureOverrides: unknown; try { - //all models are ZIP archives - ({model} = await loadModelFromFile(file, abortSignal, companionFiles, "application/zip")); + // Sniff the real container. A model import can be EITHER a + // ZIP archive bundling model + textures (e.g. pirate-ship's + // `.glb` files are actually `PK\x03\x04` zips) OR a raw + // model file (`.glb`/`.gltf`/`.fbx`/`.obj`, e.g. 100-cars, + // 3d-chess). Hardcoding "application/zip" here forced JSZip + // onto raw files, which threw "Can't find end of central + // directory" and silently dropped every non-zipped model + // from the scene. Detect by magic bytes so both shapes work. + const head = new Uint8Array(await file.slice(0, 4).arrayBuffer()); + const isZipArchive = + head[0] === 0x50 && head[1] === 0x4b && head[2] === 0x03 && head[3] === 0x04; + ({ + model, + format: loadedFormat, + rootFile: loadedRootFile, + atlasData: loadedAtlas, + textureOverrides: loadedTextureOverrides, + } = await loadModelFromFile( + file, + abortSignal, + companionFiles, + isZipArchive ? "application/zip" : "", + )); } catch (loadErr) { if (loadErr instanceof AnimationOnlyModelError) { return {success: true, message: `Skipped "${modelName}": This file contains only animations (no 3D geometry). Animation files should be imported via the Animation Combiner tool.`}; @@ -503,8 +571,23 @@ export async function processImportedFile( // 2. Fix broken textures (especially FBX) await cleanupInvalidTextures(model); - // 3. Convert to GLB - const sourceGlbBuffer = await convertToGlb(model, abortSignal, {}); + // 3. Produce the GLB buffer to store. + // Fast path: a self-contained GLB source (no atlas, no loose + // texture remapping) is already a valid GLB — reuse its bytes + // and skip the GLTFExporter round-trip. `convertToGlb` here runs + // with empty options, so for GLB sources it would only re-encode + // the same data. The exporter is the dominant synchronous cost + // per model; skipping it for the common all-GLB asset pack case + // is what keeps large imports (e.g. 100+ models) from blocking + // the main thread for many minutes. FBX/OBJ/gltf-with-loose- + // textures/atlas still need the exporter to normalize into one + // GLB, so they take the fallback. + let sourceGlbBuffer: ArrayBuffer; + if (loadedFormat === "glb" && !loadedAtlas && !loadedTextureOverrides && loadedRootFile) { + sourceGlbBuffer = await loadedRootFile.arrayBuffer(); + } else { + sourceGlbBuffer = await convertToGlb(model, abortSignal, {}); + } // 4. Create LODs with meshopt compression + texture compression (best effort). // Skip in OSS: derivatives don't persist (no upload endpoint), and the diff --git a/client/packages/editor-oss/src/editor/Editor.ts b/client/packages/editor-oss/src/editor/Editor.ts index 52ebdad8..26b3752e 100644 --- a/client/packages/editor-oss/src/editor/Editor.ts +++ b/client/packages/editor-oss/src/editor/Editor.ts @@ -120,6 +120,7 @@ import Vector3AttributeConverter from "./behaviors/converters/Vector3AttributeCo import VideoAttributeConverter from "./behaviors/converters/VideoAttributeConverter"; import {isSceneBehaviorsMigrated, migrateLegacyBehaviors} from "./behaviors/LegacyBehaviorMigration"; import {isLegacyBehaviorId} from "../behaviors/util"; +import {IS_OSS} from "../mode/buildMode"; import AssetAttributeConverter from "./behaviors/converters/AssetAttributeConverter"; import BooleanWidget from "./behaviors/widgets/BooleanWidget"; import ButtonWidget from "./behaviors/widgets/ButtonWidget"; @@ -1099,8 +1100,12 @@ class Editor { return; } - // Migrate legacy behaviors to Assets API - if (this.engine?.mode === ApplicationMode.EDIT && this.sceneID) { + // Migrate legacy behaviors to Assets API. + // OSS has no legacy cloud/Mongo behavior backend — and OSS asset IDs + // ("oss-asset--") are not 24-char Mongo ObjectIDs, so + // `isLegacyBehaviorId` would wrongly flag every OSS behavior as legacy + // and mint a fresh duplicate asset on every load. Skip migration in OSS. + if (!IS_OSS && this.engine?.mode === ApplicationMode.EDIT && this.sceneID) { await migrateLegacyBehaviors({ scene: this.scene, sceneId: this.sceneID, @@ -3256,14 +3261,30 @@ class Editor { const compact = (config: BehaviorConfig): BehaviorConfig | {id: string} => builtInIds.has(config.id) ? {id: config.id} : config; + // A behavior can be registered under more than one registry key — its + // asset id AND an import alias (the YAML config.id) — so getAllConfigs() + // returns the SAME behavior more than once, every copy carrying the same + // config.id. Worse, a behavior edit re-registers only the asset-id key + // (and moves it to the end of the registry Map), leaving the alias-keyed + // copy stale with the OLD code/config. Writing both a fresh and a stale + // copy into the scene is what made the FIRST behavior edit revert on + // reload: the stale duplicate could be hydrated last and win. De-duplicate + // by config.id, keeping the LAST (newest) entry — re-registration moves + // the freshly-saved config to the end, so last-wins selects new content. + const dedupeById = (configs: BehaviorConfig[]): BehaviorConfig[] => { + const byId = new Map(); + for (const config of configs) byId.set(config.id, config); + return Array.from(byId.values()); + }; + if (this.isSandbox) { - this.scene.userData.behaviorConfigs = legacyConfigs.map(compact); + this.scene.userData.behaviorConfigs = dedupeById(legacyConfigs).map(compact); return; } - this.scene.userData.behaviorConfigs = legacyConfigs - .filter(config => this.usedBehaviorIds.has(config.id) || config.isScript) - .map(compact); + this.scene.userData.behaviorConfigs = dedupeById( + legacyConfigs.filter(config => this.usedBehaviorIds.has(config.id) || config.isScript), + ).map(compact); const configNames = this.scene.userData.behaviorConfigs.map((config: any) => config.id || config.name); console.debug("[Editor] Saved scene behavior configs", configNames); diff --git a/client/packages/editor-oss/src/editor/asset-management/hooks/assets.ts b/client/packages/editor-oss/src/editor/asset-management/hooks/assets.ts index bf48d5e2..661ff17a 100644 --- a/client/packages/editor-oss/src/editor/asset-management/hooks/assets.ts +++ b/client/packages/editor-oss/src/editor/asset-management/hooks/assets.ts @@ -625,9 +625,23 @@ export const fetchAssetImageDerivative = async ( const derivatives = await getAssetDerivatives(assetId, resolvedRevisionId, {includeDataUrl: true}); const imageDerivative = derivatives.find(d => d.type === AssetDerivativeType.Image); - if (!imageDerivative?.dataUrl) throw new Error("Image derivative missing dataUrl"); + if (imageDerivative?.dataUrl) return imageDerivative.dataUrl; + + // No image derivative — fall back to the revision's inline data URL, the + // same fallback AssetLoader.getImageDataUrl uses. This is the *only* path + // that works in OSS: there is no integrated CDN, so getAssetDerivatives + // always returns [] and the image bytes live inline as a data: URL on the + // synthesized revision record. (It also covers the integrated case where a + // derivative simply hasn't been generated yet.) Without this, textures + // resolved through this fallback — e.g. an OceanSurface base map whose + // revision id isn't in the resolution context, so materialUtils skips the + // assetLoader path — never render. + const revision = await getAssetRevision(defaultQueryClient, assetId, resolvedRevisionId, { + includeDataUrl: true, + }); + if (revision?.dataUrl) return revision.dataUrl; - return imageDerivative.dataUrl; + throw new Error("Image derivative missing dataUrl"); }; export const useAssetImageDerivative = (assetId?: string, revisionId?: string) => { diff --git a/client/packages/editor-oss/src/editor/assets/v2/AiCopilot/TerminalView/useTerminal.ts b/client/packages/editor-oss/src/editor/assets/v2/AiCopilot/TerminalView/useTerminal.ts index 738c0165..36affb43 100644 --- a/client/packages/editor-oss/src/editor/assets/v2/AiCopilot/TerminalView/useTerminal.ts +++ b/client/packages/editor-oss/src/editor/assets/v2/AiCopilot/TerminalView/useTerminal.ts @@ -17,7 +17,7 @@ import {refreshEditorAssets} from "../../../../../editor/asset-management/hooks/ import type EngineRuntime from "@stem/editor-oss/EngineRuntime"; import global from "@stem/editor-oss/global"; import {queryClient} from "@web-shared/queryClient"; -import {showToast} from "@stem/editor-oss/showToast"; +import {showToast, showLoadingToast, dismissToast} from "@stem/editor-oss/showToast"; const DEFAULT_EXTENSION_BY_TYPE: Record = { model: ".glb", @@ -428,6 +428,11 @@ export function useTerminal(onExit: () => void, options: UseTerminalOptions = {} } } + // Persistent spinner toast for the duration of execution + auto-save, so + // the user has feedback while the stemscript runs (imports can take a + // while). Dismissed in the `finally` below — no auto-dismiss. + const importSpinnerId = showLoadingToast("Importing scene…", "Running stemscript…"); + try { const result = editor ? await editor.runInScriptImportContext(() => @@ -476,6 +481,7 @@ export function useTerminal(onExit: () => void, options: UseTerminalOptions = {} } } + dismissToast(importSpinnerId); importResultsRef.current = null; importCounterRef.current = 0; } diff --git a/client/packages/editor-oss/src/editor/assets/v2/AssetsLibrary/CodeEditor/CodeEditorShell.tsx b/client/packages/editor-oss/src/editor/assets/v2/AssetsLibrary/CodeEditor/CodeEditorShell.tsx index 76433e1c..c2529091 100644 --- a/client/packages/editor-oss/src/editor/assets/v2/AssetsLibrary/CodeEditor/CodeEditorShell.tsx +++ b/client/packages/editor-oss/src/editor/assets/v2/AssetsLibrary/CodeEditor/CodeEditorShell.tsx @@ -7,12 +7,35 @@ */ import {useCallback} from "react"; +import {saveScene} from "@stem/network/api/scene"; +import {IS_OSS} from "@stem/editor-oss/mode/buildMode"; + import {CodeEditor} from "./CodeEditor"; import type {InitialSelection, CodeEditorPopoutPayload} from "./types"; import type {InitialDrafts} from "./hooks/useCodeEditorState"; import {useUpdateSceneBehaviorRevision} from "../../../../behaviors/hooks/behaviors"; import type {SaveCompleteInfo} from "../BehaviorCreator/hooks"; +/** + * In OSS the "Behavior saved" toast must mean *persisted to the filesystem*, + * not just updated in the in-memory scene registry. `createBehaviorRevision` + * only seeds the new content into the session asset registry; nothing reaches + * the `ProjectStore` until the scene is saved. So after updating the scene's + * behavior registry we route through `saveScene` (→ `ossSaveScene` → + * `ProjectStore.save` + `persistProjectAssets`), mirroring `useImportBehaviors`. + * No-op in integrated mode, where the asset service already persisted the + * revision server-side. Best-effort: a persist failure is logged, not thrown, + * so the in-memory edit still stands. + */ +const persistOssBehaviorEdit = async () => { + if (!IS_OSS) return; + try { + await saveScene(false, false); + } catch (err) { + console.error("[CodeEditorShell] failed to persist behavior edit to ProjectStore", err); + } +}; + export interface CodeEditorShellProps { sceneId: string; initialSelection?: InitialSelection; @@ -43,6 +66,7 @@ export const CodeEditorShell: React.FC = ({ const handleSaveComplete = useCallback( async ({assetId, revisionId, code, config}: SaveCompleteInfo) => { await updateSceneBehaviorRevision(assetId, revisionId, {code, config}); + await persistOssBehaviorEdit(); }, [updateSceneBehaviorRevision], ); @@ -52,6 +76,8 @@ export const CodeEditorShell: React.FC = ({ for (const {assetId, revisionId, code, config} of infos) { await updateSceneBehaviorRevision(assetId, revisionId, {code, config}); } + // Persist once after all in-memory updates rather than per behavior. + await persistOssBehaviorEdit(); }, [updateSceneBehaviorRevision], ); diff --git a/client/packages/editor-oss/src/editor/assets/v2/BehaviorEditor/scriptCompletions.ts b/client/packages/editor-oss/src/editor/assets/v2/BehaviorEditor/scriptCompletions.ts index ae41d592..6996bc90 100644 --- a/client/packages/editor-oss/src/editor/assets/v2/BehaviorEditor/scriptCompletions.ts +++ b/client/packages/editor-oss/src/editor/assets/v2/BehaviorEditor/scriptCompletions.ts @@ -232,7 +232,18 @@ export function registerScriptCompletions( return {suggestions}; } - // General → globals + lifecycle function names + // General → globals + lifecycle function names. Only offer these + // when the cursor is actually on a word being typed. Without this + // guard the provider returns the full list for *any* position, + // including right after a space, so the suggest widget pops up (or + // refuses to dismiss) every time you type a space — most visibly on + // the first line of top-level code. An empty word means "not typing + // an identifier", so return whatever context-specific suggestions we + // already collected (e.g. @import) and nothing else. + if (!word.word) { + return {suggestions}; + } + for (const g of globals) { suggestions.push({ label: g.name, diff --git a/client/packages/editor-oss/src/showToast.tsx b/client/packages/editor-oss/src/showToast.tsx index 6089e636..dc3dad75 100644 --- a/client/packages/editor-oss/src/showToast.tsx +++ b/client/packages/editor-oss/src/showToast.tsx @@ -113,6 +113,28 @@ const showToast = (props: ToastMessageProps) => { export {showToast}; +/** + * Show a persistent spinner ("loading") toast and return its id. Unlike + * `showToast`, this does NOT auto-dismiss — the caller owns the lifecycle and + * must call `dismissToast(id)` when the work finishes. Use for long async work + * with no fixed duration, e.g. while a stemscript import is executing. + * + * @param title - Headline shown next to the spinner. + * @param body - Optional secondary line. + * @returns The toast id, to pass to `dismissToast`. + */ +export const showLoadingToast = (title: string, body?: string): number => + toastywaveToast.loading(title, { + description: body, + duration: Infinity, + showCountdown: false, + }); + +/** Dismiss a toast (e.g. a `showLoadingToast` spinner) by its id. No-op if already gone. */ +export const dismissToast = (id: number): void => { + toastywaveToast.dismiss(id); +}; + /** * Utility function to create clickable items for objects in the scene * diff --git a/client/packages/network/src/adapters/remote-go/asset/index.ts b/client/packages/network/src/adapters/remote-go/asset/index.ts index 33775abd..49a8386b 100644 --- a/client/packages/network/src/adapters/remote-go/asset/index.ts +++ b/client/packages/network/src/adapters/remote-go/asset/index.ts @@ -110,6 +110,20 @@ export const setOssAssetThumbnail = (assetId: string, thumbnailDataUrl: string): export const lookupOssAsset = (idOrRevisionId: string): OssAssetRecord | undefined => ossAssetRegistry.get(idOrRevisionId); +/** + * Drop a synthesized OSS asset from the registry (both its asset-id and + * revision-id keys). Used by the OSS behavior-import de-duplication to collapse + * surplus same-named behavior records down to a single latest one — OSS has no + * revision history, so duplicates created by earlier imports are pure noise. + * After removal the record no longer surfaces in `getOssAssetsForProject`, so it + * drops out of the asset list and is not re-persisted on the next project save. + */ +export const unregisterOssAsset = (assetId: string): void => { + const record = ossAssetRegistry.get(assetId); + ossAssetRegistry.delete(assetId); + if (record?.revisionId) ossAssetRegistry.delete(record.revisionId); +}; + /** * Every synthesized OSS asset created for a given project, de-duplicated. * Used by the persistence layer to write a project's binary assets to the @@ -596,13 +610,21 @@ export const createAssetRevision = async ({ // imports route their payload (`data` is base64) through this and // expect a usable revision id back; we encode the inline data as a // data: URL so resolvers downstream still read the same shape. - const id = `oss-rev-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`; + // + // OSS has NO revision management — there is only ever the latest version + // of an asset. So reuse the asset's stable head revision id and overwrite + // the registry record in place, instead of minting a fresh + // `oss-rev-${Date.now()}` on every save. Minting a new id per save spawned + // parallel revision ids and made the scene's pinned `assetId→revisionId` + // drift, which surfaced as "multiple revisions of the same behavior". + // The stable id matches what `createAsset` assigns (`oss-rev-${assetId}`). + const existing = lookupOssAsset(assetId); + const id = existing?.revisionId ?? `oss-rev-${assetId}`; let dataUrl: string | undefined; if (typeof data === "string" && data.length > 0) { const mime = format === "json" ? "application/json" : (contentType || "application/octet-stream"); dataUrl = `data:${mime};base64,${data}`; } - const existing = lookupOssAsset(assetId); registerOssAsset({ assetId, revisionId: id, @@ -610,8 +632,17 @@ export const createAssetRevision = async ({ format: format ?? existing?.format ?? "", name: existing?.name ?? assetId, contentType: contentType ?? existing?.contentType, - metadata: options.metadata, + metadata: options.metadata ?? existing?.metadata, dataUrl, + // Carry the existing record's thumbnail + project tag across the + // overwrite. Dropping `projectId` here is why the FIRST save after a + // behavior edit didn't persist: `getOssAssetsForProject(projectId)` + // skips records whose `projectId` no longer matches, so the edited + // behavior was excluded from `persistProjectAssets`. Fall back to the + // current scene id so a behavior created before the project's first + // save (fresh import) still gets tagged on its next revision. + thumbnailDataUrl: existing?.thumbnailDataUrl, + projectId: existing?.projectId ?? global.app?.editor?.sceneID ?? undefined, }); return { id, diff --git a/docs/planning/2026-05-30-oss-behavior-dedup-and-edit-persist.md b/docs/planning/2026-05-30-oss-behavior-dedup-and-edit-persist.md new file mode 100644 index 00000000..d9eea544 --- /dev/null +++ b/docs/planning/2026-05-30-oss-behavior-dedup-and-edit-persist.md @@ -0,0 +1,152 @@ +# OSS behavior de-duplication + edit persistence + +Goal: in OSS / playground mode, load and use exactly **one (latest) revision per +logical behavior**, and make a behavior edit actually update the behavior + +scene **and persist to the filesystem store** (so the "Saved" toast is truthful). + +## Symptoms (reported) + +- Importing the Pirate Ship game shows **3 copies** of every behavior in the + Behaviors asset panel (AIShipController ×3, ShipController ×3, … 21 total). +- Editing a behavior shows "Behavior saved successfully" but the change is **not + written to the file system** — gone after reload. + +## Root cause (verified) + +1. **List = registry, keyed by id.** + `BehaviorConfigRegistry` is `Map` keyed by `id` + (`editor/behaviors/BehaviorConfigRegistry.ts:4,8`). The panel renders + `getAllConfigs()`. Three visible copies ⇒ **three distinct asset ids** all + with the same `name` — the Map cannot collapse them. + +2. **Import creates new assets for the same logical behavior.** + `agent/script-tool/importHandler.ts:300-370` is idempotent only if it finds + the existing behavior by YAML `config.id` or by a **unique** name match. Once + two same-named assets exist, the name fallback bails (lines 325-332) and a + **new** asset is created — a snowball that produces 3, 4, … copies across + re-imports / round-trips. + +3. **Edit creates a revision but never persists the project.** + `useBehaviorSave.ts:278-283` calls `createBehaviorRevision({assetId, + parentRevisionId, config, code})` **without `assetSource`**, so + `createBehaviorRevision` skips `updateSceneBehaviorRevision` + (`editor/behaviors/util.ts:389-391`). The new revision is only **seeded into + the in-memory query cache / OSS session registry** (`seedAssetRevisionData`). + Nothing writes the project to the `ProjectStore`, so a filesystem reload + loses the edit. The toast fires regardless (`useBehaviorSave.ts:318`). + +## Assumptions / open questions + +- OSS keeps one asset id per logical behavior across edits (edits = new + revisions of the same id). Duplicates therefore have **different** ids and the + same `name`, so collapsing by `name` → latest is safe for imported games. +- Confirm whether a single import truly produces 3, or whether re-runs/round + trips accumulate them. The fix is robust either way (collapse + idempotent + register), but reproduction will validate. + +## Affected files + +- `editor/behaviors/BehaviorConfigRegistry.ts` — register/dedup semantics. +- `behaviors/BehaviorLoadingService.ts` — load/merge of backend + scene configs. +- `agent/script-tool/importHandler.ts` — behavior import idempotency. +- `editor/assets/v2/AssetsLibrary/BehaviorCreator/hooks/useBehaviorSave.ts` — + edit save path (pass `assetSource`; persist project in OSS). +- `editor/assets/v2/AssetsLibrary/CodeEditor/CodeEditorShell.tsx` — onSaveComplete. +- Possibly a small persistence hook to save the project after an OSS edit. + +## Decisions (confirmed with user, 2026-05-30) + +1. **Saved toast must mean persisted to the filesystem store.** +2. **De-duplicate on import**, not on every scene load. +3. **OSS / playground has NO revision management — only the latest version.** + +## Plan (confirmed approach) + +### Change 1 — OSS: no revision churn, latest-only (network adapter) +`packages/network/src/adapters/remote-go/asset/index.ts` — `createAssetRevision` +OSS branch currently mints a fresh `oss-rev-${Date.now()}-…` id on every save, so +each edit creates a parallel revision id. Make it **reuse the asset's stable head +revision id** `oss-rev-${assetId}` (the same id `createAsset` assigns) and +**overwrite the registry record in place**. Result: exactly one revision per +asset, the scene's pinned `assetId→revisionId` never drifts, and "latest wins" +is literal. IS_OSS-gated; integrated path untouched. +- [x] Stable head-revision id reuse in `createAssetRevision` OSS branch. + +### Change 2 — OSS: dedup behaviors on import (importHandler) +`packages/editor-oss/src/agent/script-tool/importHandler.ts` (case "behavior"). +In OSS, an imported behavior should **replace** any existing same-named +behaviors so the panel converges to one per behavior: +- [x] Capture the just-imported behavior as the survivor (update-in-place when it + already exists, else create). +- [x] After import, in OSS, collapse every other same-named `AssetType.Behavior` + record: new `unregisterOssAsset()` drops the orphan record + both registry + keys; `unregisterConfig` / `unregisterScript` clear the registries. Scene + objects attach by the logical/alias id (→ survivor), so no re-pointing is + needed. Re-import heals existing 3× duplicates → 1×. + +### Change 3 — OSS: behavior edit persists to filesystem (CodeEditorShell) +`packages/editor-oss/src/editor/assets/v2/AssetsLibrary/CodeEditor/CodeEditorShell.tsx` +`handleSaveComplete` already runs `updateSceneBehaviorRevision`. In OSS, follow it +with `saveScene(false, false)` (→ `ossSaveScene` → `ProjectStore.save` + +`persistProjectAssets`) so the edited behavior + scene body reach the filesystem +before the success state. Mirrors the existing `useImportBehaviors` pattern +(`services.ts:122`). +- [x] Persist via `saveScene(false,false)` after an OSS behavior save + (`CodeEditorShell.handleSaveComplete` / `handleSaveAllComplete`, OSS-gated). + +## Follow-up fixes (2026-05-30, from user testing) + +### Change 4 — first behavior save not persisting (network adapter) +`createAssetRevision` (OSS) re-registered the record **without `projectId`**, so +after an edit the behavior fell out of `getOssAssetsForProject(projectId)` and +`persistProjectAssets` skipped it — the first save silently dropped the change. +Now the overwrite carries `projectId` (and `thumbnailDataUrl`) across, falling +back to the current `editor.sceneID` so a behavior created before the project's +first save still gets tagged on its next revision. +- [x] Preserve `projectId` / `thumbnailDataUrl` on the in-place revision rewrite. + +### Change 5 — spinner toast during stemscript import +`showToast.tsx` gains `showLoadingToast(title, body) → id` (persistent +`type: "loading"` spinner, `duration: Infinity`) and `dismissToast(id)`. +`useTerminal.runScript` shows it before executing the script and dismisses it in +the `finally` (after the auto-save), so the user sees a spinner while the +stemscript runs. +- [x] `showLoadingToast` / `dismissToast` helpers + `runScript` wiring. + +## Follow-up fixes (2026-05-30, round 2 — from console evidence) + +### Change 6 — first behavior edit reverts on reload (the actual root cause) +Console showed `[Editor] Saved scene behavior configs` listing **every** imported +behavior **twice** with the same `config.id`. Cause: a behavior is registered +under two registry keys (its asset id AND its import alias), so +`getAllConfigs()` returns it twice. A behavior edit re-registers only the +asset-id key (moving it to the end of the Map), leaving the alias-keyed copy +**stale**. The scene saved both fresh+stale; on reload the stale duplicate could +hydrate last and win → the first edit "reverted" (the second worked because the +fresh entry had moved to the Map's end). NOTE: Change 4's `projectId` reasoning +was wrong-model — OSS behaviors are inlined in the scene JSON +(`isLegacyBehaviorId` is true for `oss-asset-*`), not stored as asset files. +- [x] `Editor.saveLegacySceneBehaviorConfigs` de-duplicates configs by + `config.id`, keeping the last (newest) registration. Halves the saved + behaviorConfigs and makes the first edit persist. + +### Change 7 — suggest widget pops on space (first line) +`scriptCompletions.ts` returned the full globals+lifecycle list as an +unconditional "General" fallthrough, so after typing a space (cursor not on a +word) Monaco kept the suggest widget open showing everything. Now returns no +general suggestions when `word.word` is empty. +- [x] Guard the general fallthrough on a non-empty current word. + +## Validation + +- [x] `bun run typecheck` (0 errors). +- [x] `bun run lint` on changed files (0 errors; only pre-existing `any` warnings). +- [x] Targeted Vitest: import / behaviorRevision / BehaviorLoadingService / + script-tool / network adapter — 127+ pass. +- [ ] Re-import Pirate Ship in OSS filesystem playground → exactly 7 behaviors + listed; repeated re-import stays at 7. (Blocked locally: the Pirate Ship + import exceeds the Playwright harness's 20-min budget — verify manually or + with a lighter game.) +- [ ] Edit a behavior → reload from filesystem store → edit is present. (Manual.) +- [ ] `node scripts/playwright/oss-smoke.mjs` and the FS roundtrip smoke. +- [ ] Manual code review. diff --git a/docs/planning/2026-05-30-oss-glb-import-skip-reexport.md b/docs/planning/2026-05-30-oss-glb-import-skip-reexport.md new file mode 100644 index 00000000..9b171149 --- /dev/null +++ b/docs/planning/2026-05-30-oss-glb-import-skip-reexport.md @@ -0,0 +1,63 @@ +# OSS GLB import: skip redundant GLTFExporter round-trip + +## Goal +Cut import time for stemscripts with many GLB models. Importing the Pirate +Ship game (101 `import model` commands) blocks the main thread for ~1000s +because each model is parsed → re-exported via `GLTFExporter` → re-parsed. +For sources that are already self-contained GLB, the re-export is pure waste. + +## Evidence +- Diagnostic caught a single `page.evaluate` blocked 291s→1290s during + import-resolution → main thread monopolized ~1000s, never reaching the + command-execution loop. +- 101 model imports; `convertToGlb(model, signal, {})` is called with empty + options, so it does *only* the `GLTFExporter.parse` round-trip (no + simplify/compress/optimize) — wasted for an already-valid GLB. + +## Approach +In `importHandler.ts` model case, after `loadModelFromFile` returns +`{rootFile, format, atlasData, textureOverrides}`: +- Fast path when `format === "glb" && !atlasData && !textureOverrides` + (self-contained GLB, no loose-texture remapping): use + `await rootFile.arrayBuffer()` as `sourceGlbBuffer`, skipping `convertToGlb`. +- Otherwise (FBX/OBJ/gltf+loose-textures/atlas): keep `convertToGlb` — the + exporter is required to normalize those into a single GLB. +- Keep the existing `loadModel(asset.id, context)` re-load for scene/asset + wiring + reload persistence (NOT skipped — out of scope, correctness risk). + +## Affected files +- `client/packages/editor-oss/src/agent/script-tool/importHandler.ts` (model case) + +## Implementation steps +- [ ] Capture `rootFile`, `format`, `atlasData`, `textureOverrides` from + `loadModelFromFile`. +- [ ] Compute `sourceGlbBuffer` via fast path or `convertToGlb` fallback. +- [ ] Leave LOD/thumbnail OSS gates and `loadModel` re-load unchanged. + +## Validation steps +- [x] `bun run typecheck` +- [x] Manual code review. + +## Findings (post-implementation) +Per-step timing instrumentation (temporary, since removed) of a full +pirate-ship import showed: +- `import-resolution = 333.5s` (109 imports; 100 models) — the dominant phase. +- `execute-loop = 33.4s` (incl. one pathological `behavior attach + ship-pirate-large.glb` = **23.8s** on first exported-behavior attach). +- `save = 1.1s`. Total ≈ 377s when run fire-and-forget. + +**The fast path is INERT for this game.** Every model reports +`fmt=glb, atlas=false, ovr=true`: the Kenney models reference an external +`colormap` texture, so `loadModelFromFile` sets `textureOverrides` and +`convertToGlb` (the GLTFExporter bake, ~1.2s/model) is genuinely required to +inline that texture into a single GLB. The skip only benefits self-contained +GLBs with no loose textures (other games), so it is kept as a correct, +low-risk optimization but does not speed up pirate-ship. + +**The 1200s smoke timeouts were not a hang.** Real work is ~377s; the import +is borderline vs the cap and highly sensitive to machine/harness load +(fire-and-forget diag finished at 377s; the smoke's awaited `page.evaluate` +under concurrent load exceeded the cap). The genuine lever to make large +shared-texture imports reliably fast is to avoid re-baking the same external +texture into N separate GLBs (bake once / share the texture asset) — a larger +import-pipeline change, deferred pending product decision. diff --git a/docs/planning/2026-05-31-oss-model-import-zip-assumption.md b/docs/planning/2026-05-31-oss-model-import-zip-assumption.md new file mode 100644 index 00000000..143110f6 --- /dev/null +++ b/docs/planning/2026-05-31-oss-model-import-zip-assumption.md @@ -0,0 +1,55 @@ +# OSS model import: stop assuming every model file is a ZIP + +## Goal +Fix the regression where many game models silently fail to import (100-cars, +3d-chess) while others import fine (pirate-ship), and behaviors import in all +cases. + +## Root cause (verified by repro) +`processImportedFile` (script-tool import path) calls +`loadModelFromFile(file, abortSignal, companionFiles, "application/zip")` — +hardcoding the source container as a ZIP archive (comment: `//all models are +ZIP archives`). `loadModelFromFile` then runs `expandZip` (JSZip) on it. + +- Pirate-ship `.glb` files are *actually* ZIP archives (`PK\x03\x04`) bundling + model + textures → `expandZip` works → models load. +- 100-cars `.glb` (`glTF…`) and 3d-chess `.gltf` (`{`) are raw model files → + `expandZip` throws `Can't find end of central directory : is this a zip + file?` → `processImportedFile` returns `{success:false}` per model. + +The per-model failure does **not** throw, so the script continues, behaviors +(which come later and don't go through this path) import normally, and exec +reports "done". Net effect: a mixed library imports "about half" of its models. + +Every other caller of `loadModelFromFile` (UI upload, batch LOD, URL upload, +asset-pack import) passes no `overriddenFileType` and lets the function detect +the container from `file.type`. Only the script-tool path forces zip. + +## Repro +`GAME_FOLDER=/Users/n/erth/Games-StemScript/3d-chess node +scripts/playwright/repro-import-inspect.mjs` → persisted scene had 0 model +objects / 0 model assets, only the 3 behaviors; per-import logs showed all 6 +models failing with the JSZip "central directory" error. + +## Affected files +- `client/packages/editor-oss/src/agent/script-tool/importHandler.ts` (model case) + +## Implementation +- [x] Sniff the real container in the model case: read the first 4 bytes and + treat the file as a ZIP only when they are `PK\x03\x04`. Pass + `"application/zip"` to `loadModelFromFile` only for true zips; pass `""` + otherwise so raw `.glb`/`.gltf`/`.fbx`/`.obj` take the direct-load path + (with companion files). +- [x] Update the misleading `//all models are ZIP archives` comment. + +## Validation +- [x] Repro on 3d-chess: 6/6 model objects + 6 model assets persisted (was 0). +- [x] Repro on 100-cars: 11/11 model objects + 11 model assets persisted (was 0). +- [x] Pirate-ship still imports (zip-wrapped glb path is byte-for-byte unchanged + — PK-magic files still pass "application/zip"). Logs confirm expandZip + + texture-override + convertToGlb running normally; the repro's empty + persisted scene is the known ~333s import-vs-save timing artifact + (`exec done signal: null`), not a failure. +- [x] `bun run typecheck` +- [x] Remove temporary `[DIAG]` instrumentation from `useTerminal.ts`. +- [ ] Manual code review. diff --git a/package.json b/package.json index 9352cbaf..1c638acc 100644 --- a/package.json +++ b/package.json @@ -35,8 +35,6 @@ "lint:oss-boundary": "cd client && eslint --config eslint.boundary.cjs --no-inline-config --no-warn-ignored --quiet 'packages/editor-oss/src/**/*.{ts,tsx}'", "test": "BUILD_MODE=oss bunx --bun vitest run", "test:e2e": "node scripts/playwright/oss-smoke.mjs", - "test:e2e:import": "node scripts/playwright/oss-import-3dchess.mjs", - "test:e2e:stemscript-play-remix": "node scripts/playwright/oss-stemscript-play-remix-assets.mjs", "test:e2e:site": "node scripts/playwright/site-deploy-routing.mjs && node scripts/playwright/site-landing.mjs && node scripts/playwright/site-docs.mjs && node scripts/playwright/site-nav.mjs && node scripts/playwright/site-playground.mjs", "test:e2e:site:routing": "node scripts/playwright/site-deploy-routing.mjs", "deploy": "./scripts/deploy.sh", diff --git a/scripts/playwright/oss-pirate-ship-playground.mjs b/scripts/playwright/oss-pirate-ship-playground.mjs new file mode 100644 index 00000000..4962414e --- /dev/null +++ b/scripts/playwright/oss-pirate-ship-playground.mjs @@ -0,0 +1,338 @@ +#!/usr/bin/env node +/** + * End-to-end (PLAYGROUND + FILESYSTEM storage): import the Pirate Ship Battle + * Royal stemscript into a fresh project, save to the File System Access (folder) + * store, reload through the playground dashboard, enter Play, START GAME, then + * STOP play — auditing the console for the three regressions reported against + * this game: + * + * 1. `Image derivative missing dataUrl` — OceanSurface's PIR_Water base map + * never resolves because `fetchAssetImageDerivative` lacked the revision + * data-URL fallback that OSS (no integrated CDN) depends on. Fixed in + * editor-oss/.../hooks/assets.ts. + * 2. The OceanSurface texture not being applied (the visible symptom of #1). + * 3. `this._stopWakeSound is not a function` — thrown from the ShipController + * behavior's dispose() (and onReset) because the method was never defined, + * aborting that ship's teardown when play mode stops. Fixed in the game's + * behaviors/ShipController.yaml. Only surfaces on STOP, so the test must + * enter Play and then exit back to Edit to exercise BehaviorManager.dispose. + * + * Storage: filesystem (OPFS-backed File System Access store), matching the + * reporter's setup. No directory picker — each context gets its own OPFS + * partition seeded with a "stem-fs" handle (same trick as oss-all-games-playground). + * + * Source folder: GAME_FOLDER (defaults to the fixed Games-StemScript copy). + * Prereq: `bun run dev` on PLAYWRIGHT_BASE_URL (default localhost:5173). + * Set HEADED=1 to watch. Report → scripts/playwright/oss-pirate-ship-playground-output/. + */ +import {chromium} from "playwright"; +import {writeFileSync, mkdirSync, readFileSync, readdirSync, statSync, existsSync} from "node:fs"; +import {dirname, resolve, basename, join} from "node:path"; +import {fileURLToPath} from "node:url"; + +const __dirname = dirname(fileURLToPath(import.meta.url)); +const outDir = resolve(__dirname, "oss-pirate-ship-playground-output"); +mkdirSync(outDir, {recursive: true}); + +const baseUrl = (process.env.PLAYWRIGHT_BASE_URL || "http://localhost:5173").replace(/\/$/, ""); +const headed = process.env.HEADED === "1"; +const gameFolder = process.env.GAME_FOLDER || "/Users/n/erth/Games-StemScript/Pirate-Ship-Battle-Royal-v1.0"; + +function walkFiles(root) { + const out = []; + const recurse = (dir, prefix) => { + for (const entry of readdirSync(dir)) { + if (entry === ".DS_Store") continue; + const abs = join(dir, entry); + const rel = prefix ? `${prefix}/${entry}` : entry; + if (statSync(abs).isDirectory()) recurse(abs, rel); + else out.push({name: rel, abs}); + } + }; + recurse(root, ""); + return out; +} + +function mimeFor(name) { + const l = name.toLowerCase(); + if (l.endsWith(".gltf")) return "model/gltf+json"; + if (l.endsWith(".glb")) return "model/gltf-binary"; + if (l.endsWith(".png")) return "image/png"; + if (l.endsWith(".jpg") || l.endsWith(".jpeg")) return "image/jpeg"; + if (l.endsWith(".webp")) return "image/webp"; + if (l.endsWith(".mp3")) return "audio/mpeg"; + if (l.endsWith(".wav")) return "audio/wav"; + if (l.endsWith(".ogg")) return "audio/ogg"; + if (l.endsWith(".yaml") || l.endsWith(".yml")) return "application/x-yaml"; + if (l.endsWith(".json")) return "application/json"; + if (l.endsWith(".md") || l.endsWith(".txt") || l.endsWith(".stemscript")) return "text/plain"; + return "application/octet-stream"; +} + +const report = {baseUrl, gameFolder, mode: "playground", storeMode: "filesystem", startedAt: new Date().toISOString(), steps: [], consoleErrors: [], pageErrors: [], assetErrors: [], migrationLogs: [], assertions: {}}; +const failures = []; +function logStep(name, status = "ok", details = {}) { + report.steps.push({name, status, details, t: new Date().toISOString()}); + const tag = status === "ok" ? "✓" : status === "warn" ? "⚠" : "✗"; + console.log(`${tag} ${name}${Object.keys(details).length ? ` — ${JSON.stringify(details).slice(0, 240)}` : ""}`); +} +function assert(name, cond, detail) { + report.assertions[name] = {pass: !!cond, detail}; + if (cond) console.log(`✓ assert: ${name}`); + else { console.log(`✗ assert: ${name} — ${detail ?? ""}`); failures.push(name); } +} + +// Regression signatures for the three reported exceptions. +const DERIVATIVE_RE = /Image derivative missing dataUrl/i; +const WAKESOUND_RE = /_stopWakeSound is not a function/i; +const DISPOSE_RE = /Error during behavior dispose/i; +// Texture / asset-load failures surface as warnings, so the exception filter +// would miss them; track separately. +const ASSET_FAIL_RE = /No data URL found for|missing dataUrl|Failed to load texture|Cannot fetch asset|not being applied as a texture/i; + +assert("game-folder-exists", existsSync(gameFolder), gameFolder); +if (failures.length) { writeFileSync(resolve(outDir, "report.json"), JSON.stringify(report, null, 2)); process.exit(1); } + +const files = walkFiles(gameFolder); +const scriptFile = files.find(f => f.name.toLowerCase().endsWith(".stemscript")); +assert("script-file-found", !!scriptFile, `no .stemscript in ${gameFolder}`); +if (!scriptFile) { writeFileSync(resolve(outDir, "report.json"), JSON.stringify(report, null, 2)); process.exit(1); } +const scriptContent = readFileSync(scriptFile.abs, "utf8"); +const folderFiles = files.filter(f => f !== scriptFile) + .map(f => ({name: f.name, mime: mimeFor(f.name), data: readFileSync(f.abs).toString("base64")})); +logStep("read pirate-ship folder", "ok", {files: files.length, script: basename(scriptFile.name)}); + +const browser = await chromium.launch({headless: !headed}); +const ctx = await browser.newContext({viewport: {width: 1440, height: 900}}); +const page = await ctx.newPage(); +page.on("console", m => { + const t = m.text(); + if (m.type() === "error") report.consoleErrors.push({text: t.slice(0, 400), location: m.location()}); + if (ASSET_FAIL_RE.test(t)) report.assetErrors.push(t.slice(0, 300)); + // OSS must never run legacy behavior migration — it mints duplicate + // behavior assets every load. Any [LegacyBehaviorMigration] Migrat* line + // is a regression of the !IS_OSS gate in Editor.onSceneLoaded. + if (/\[LegacyBehaviorMigration\]\s+(Migrat|Updat)/i.test(t)) report.migrationLogs.push(t.slice(0, 300)); +}); +page.on("pageerror", e => report.pageErrors.push({message: e.message, stack: e.stack?.slice(0, 2000)})); + +// Seed the File System Access (folder) store via OPFS so no directory picker is +// needed. Must run on the origin before the navigation that boots the editor — +// rehydrateProjectStore reads the persistence mode + handle from here. +const bootstrapFilesystemStore = async (p) => { + await p.evaluate(async () => { + const root = await navigator.storage.getDirectory(); + try { await root.removeEntry("stem-fs", {recursive: true}); } catch { /* first run */ } + const fsRoot = await root.getDirectoryHandle("stem-fs", {create: true}); + await new Promise((res, rej) => { + const req = indexedDB.open("stemstudio-fs-handle", 1); + req.onupgradeneeded = () => { const db = req.result; if (!db.objectStoreNames.contains("handles")) db.createObjectStore("handles"); }; + req.onsuccess = () => { const tx = req.result.transaction("handles", "readwrite"); tx.objectStore("handles").put(fsRoot, "project-dir"); tx.oncomplete = () => res(); tx.onerror = () => rej(tx.error); }; + req.onerror = () => rej(req.error); + }); + localStorage.setItem("stemstudio.persistence.mode", "filesystem"); + localStorage.setItem("stemstudio.bootstrap.complete", "true"); + }); +}; + +const dismissBootstrap = async () => { + const bs = page.locator('[aria-labelledby="oss-bootstrap-title"]').first(); + if (await bs.count() && await bs.isVisible().catch(() => false)) { + await bs.locator('button:has-text("Browser storage")').first().click({timeout: 3000}).catch(() => {}); + await bs.locator('button:has-text("Continue")').first().click({timeout: 5000}).catch(() => {}); + await page.waitForSelector('[aria-labelledby="oss-bootstrap-title"]', {state: "detached", timeout: 5000}).catch(() => {}); + await page.waitForTimeout(400); + } +}; +const dismissTutorial = async () => { + const gotIt = page.locator('button:has-text("Got It")').first(); + if (await gotIt.count() && await gotIt.isVisible().catch(() => false)) { + await gotIt.click({timeout: 3000}).catch(() => {}); + await page.waitForTimeout(300); + } +}; + +try { + // === Activate playground mode, then seed the filesystem store. === + await page.goto(baseUrl + "/dashboard?mode=playground", {waitUntil: "domcontentloaded", timeout: 30000}); + await page.waitForLoadState("networkidle", {timeout: 15000}).catch(() => {}); + await dismissBootstrap(); + const playgroundActive = await page.evaluate(() => { try { return window.sessionStorage.getItem("stem.playgroundMode") === "1"; } catch { return false; } }); + assert("playground-mode-active", playgroundActive, "stem.playgroundMode sessionStorage flag not set"); + await bootstrapFilesystemStore(page); + logStep("filesystem (OPFS) store bootstrapped", "ok"); + + // === Boot a fresh project (flags persist via sessionStorage / localStorage). === + await page.goto(baseUrl + "/create/project", {waitUntil: "domcontentloaded", timeout: 30000}); + await page.waitForLoadState("networkidle", {timeout: 15000}).catch(() => {}); + await dismissBootstrap(); + await page.waitForTimeout(6000); + await dismissTutorial(); + const fsMode = await page.evaluate(() => { try { return window.localStorage.getItem("stemstudio.persistence.mode"); } catch { return null; } }); + assert("filesystem-store-selected", fsMode === "filesystem", `persistence.mode=${fsMode}`); + assert("editor-mounted", /\/create\/project/.test(page.url()), `URL: ${page.url()}`); + + // === Open Copilot so `__stemRunScript` is exposed (allowed in playground). === + const copilotBtn = page.locator('[data-testid="actionbar-copilot"]').first(); + const cBox = await copilotBtn.boundingBox().catch(() => null); + if (cBox) await page.mouse.click(cBox.x + cBox.width / 2, cBox.y + cBox.height / 2); + else await copilotBtn.click({timeout: 3000, force: true}).catch(() => {}); + await page.waitForTimeout(2000); + const hookPresent = await page.evaluate(() => typeof window.__stemRunScript === "function"); + assert("run-script-hook-exposed", hookPresent, "window.__stemRunScript not exposed"); + if (!hookPresent) throw new Error("no stemRunScript"); + + // === Run the import. === + const execStartUrl = page.url(); + try { + await page.evaluate(({content, fileList}) => + window.__stemRunScript(content, fileList).then( + () => { window.__stemRunScriptDone = "ok"; }, + err => { window.__stemRunScriptDone = String(err && err.message ? err.message : err); }, + ), {content: scriptContent, fileList: folderFiles}); + } catch (e) { + logStep("exec evaluate detached (likely navigation)", "warn", {error: e.message.slice(0, 120)}); + } + await page.waitForLoadState("networkidle", {timeout: 120000}).catch(() => {}); + await page.waitForTimeout(6000); + await dismissTutorial(); + const execResult = await page.evaluate(() => window.__stemRunScriptDone ?? null).catch(() => null); + const execOk = execResult === "ok" || page.url() !== execStartUrl; + assert("exec-completed", execOk, execResult ?? "no completion signal"); + await page.screenshot({path: resolve(outDir, "01-after-import.png")}).catch(() => {}); + + // No "Image derivative missing dataUrl" while the OceanSurface base map loads. + const importDerivativeErrors = report.consoleErrors.filter(e => DERIVATIVE_RE.test(e.text)); + assert("no-derivative-errors-during-import", importDerivativeErrors.length === 0, + `${importDerivativeErrors.length}: ${importDerivativeErrors[0]?.text.slice(0, 200) ?? ""}`); + + // === Save to the filesystem store via AppMenu. === + await page.locator('[data-testid="topnav-app-menu"]').first().click({timeout: 3000, force: true}).catch(() => {}); + await page.waitForTimeout(400); + const save = page.locator("text=Save Project").first(); + if (await save.isVisible().catch(() => false)) { + await save.click({timeout: 3000}).catch(() => {}); + // OPFS saves write asset files then the manifest LAST; reloading before + // the "Saved" toast loses assets. Wait generously for it. + await page.locator("text=/^Saved$/").first().waitFor({state: "visible", timeout: 180000}).catch(() => {}); + await page.waitForTimeout(1500); + } + const sceneId = (page.url().match(/\/create\/project\/([^/?#]+)/) || [])[1] || null; + assert("scene-id-resolved", !!sceneId, `URL: ${page.url()}`); + + // === Reload through the playground dashboard (the folder-store load path). === + await page.goto(baseUrl + "/dashboard?mode=playground", {waitUntil: "domcontentloaded", timeout: 20000}).catch(() => {}); + await page.waitForLoadState("networkidle", {timeout: 15000}).catch(() => {}); + await dismissBootstrap(); + await page.waitForTimeout(2000); + const reloadMarkIdx = report.consoleErrors.length; // ignore pre-reload errors + + if (sceneId) { + const card = page.locator(`[data-scene-id="${sceneId}"]`).first(); + // Folder store project list can take a moment to rehydrate from OPFS. + await card.waitFor({state: "attached", timeout: 30000}).catch(() => {}); + assert("imported-project-listed", (await card.count()) > 0, `data-scene-id="${sceneId}" not found`); + if (await card.count()) { + await card.click({timeout: 5000}).catch(() => {}); + await page.waitForLoadState("networkidle", {timeout: 30000}).catch(() => {}); + await dismissBootstrap(); + await page.waitForSelector("canvas", {timeout: 30000}).catch(() => {}); + await dismissTutorial(); + await page.waitForTimeout(8000); + await page.screenshot({path: resolve(outDir, "02-reloaded-playground.png")}).catch(() => {}); + assert("canvas-visible-on-reload", await page.locator("canvas").first().isVisible().catch(() => false), "no canvas after reload"); + + const reloadDerivativeErrors = report.consoleErrors.slice(reloadMarkIdx).filter(e => DERIVATIVE_RE.test(e.text)); + assert("no-derivative-errors-after-reload", reloadDerivativeErrors.length === 0, + `${reloadDerivativeErrors.length}: ${reloadDerivativeErrors[0]?.text.slice(0, 200) ?? ""}`); + } + } + + // === Enter Play and START GAME. === + const playMarkIdx = report.consoleErrors.length; + const playBtn = page.locator('[data-testid="topnav-play"]').first(); + let entered = false; + if (await playBtn.isVisible().catch(() => false)) { + await playBtn.click({timeout: 3000, force: true}).catch(() => {}); + const dontSave = page.locator("button", {hasText: /don['’]t\s*save/i}).first(); + if (await dontSave.count() && await dontSave.isVisible().catch(() => false)) { await dontSave.click({timeout: 3000}).catch(() => {}); await page.waitForTimeout(500); } + await page.waitForTimeout(3000); + const startGame = page.locator("#startGameBtn").first(); + try { + await startGame.waitFor({state: "visible", timeout: 20000}); + await page.waitForFunction(() => { const b = document.getElementById("startGameBtn"); return b && !b.disabled && b.getAttribute("aria-disabled") !== "true"; }, {timeout: 20000}); + await startGame.click({timeout: 5000, force: true}); + logStep("clicked START GAME", "ok"); + } catch (e) { logStep("START GAME never became clickable (may auto-start)", "warn", {error: String(e).slice(0, 160)}); } + entered = true; + await page.waitForTimeout(10000); + await page.screenshot({path: resolve(outDir, "03-play.png")}).catch(() => {}); + } else { + logStep("Play button not visible — skipping play audit", "warn"); + failures.push("play-button-missing"); + } + assert("entered-play", entered, "could not enter play mode"); + + // No texture errors while playing (OceanSurface base map must be live). + const playDerivativeErrors = report.consoleErrors.slice(playMarkIdx).filter(e => DERIVATIVE_RE.test(e.text)); + assert("no-derivative-errors-in-play", playDerivativeErrors.length === 0, + `${playDerivativeErrors.length}: ${playDerivativeErrors[0]?.text.slice(0, 200) ?? ""}`); + + // === STOP play (Edit) — this is what triggers BehaviorManager.dispose and + // surfaced `this._stopWakeSound is not a function` on ShipController. === + if (entered) { + const stopMarkIdx = report.consoleErrors.length; + const editBtn = page.locator('button:has-text("Edit")').first(); + if (await editBtn.isVisible().catch(() => false)) { + await editBtn.click({timeout: 3000, force: true}).catch(() => {}); + } else { + // Fall back to the Play/Stop toggle. + await playBtn.click({timeout: 3000, force: true}).catch(() => {}); + } + await page.waitForTimeout(5000); + await page.screenshot({path: resolve(outDir, "04-after-stop.png")}).catch(() => {}); + + const stopErrors = report.consoleErrors.slice(stopMarkIdx); + const wakeErrors = stopErrors.filter(e => WAKESOUND_RE.test(e.text)); + const disposeErrors = stopErrors.filter(e => DISPOSE_RE.test(e.text)); + if (wakeErrors.length || disposeErrors.length) { + writeFileSync(resolve(outDir, "dispose-errors.json"), JSON.stringify({wakeErrors, disposeErrors}, null, 2)); + } + assert("no-stopWakeSound-error-on-stop", wakeErrors.length === 0, + `${wakeErrors.length}: ${wakeErrors[0]?.text.slice(0, 200) ?? ""}`); + assert("no-behavior-dispose-errors-on-stop", disposeErrors.length === 0, + `${disposeErrors.length}: ${disposeErrors[0]?.text.slice(0, 200) ?? ""}`); + } + + // === Whole-run audit: the two concrete regression strings must never appear. === + const allDerivative = report.consoleErrors.filter(e => DERIVATIVE_RE.test(e.text)); + const allWake = report.consoleErrors.filter(e => WAKESOUND_RE.test(e.text)); + assert("no-derivative-errors-overall", allDerivative.length === 0, `${allDerivative.length}`); + assert("no-stopWakeSound-errors-overall", allWake.length === 0, `${allWake.length}`); + report.assetErrors = [...new Set(report.assetErrors)].slice(0, 20); + if (report.assetErrors.length) writeFileSync(resolve(outDir, "asset-errors.json"), JSON.stringify(report.assetErrors, null, 2)); + assert("no-asset-load-failures", report.assetErrors.length === 0, + `${report.assetErrors.length}: ${report.assetErrors[0]?.slice(0, 200) ?? ""}`); + assert("no-uncaught-page-errors", report.pageErrors.length === 0, + `${report.pageErrors.length}: ${report.pageErrors[0]?.message?.slice(0, 200) ?? ""}`); + report.migrationLogs = [...new Set(report.migrationLogs)]; + assert("no-legacy-migration-in-oss", report.migrationLogs.length === 0, + `${report.migrationLogs.length}: ${report.migrationLogs[0]?.slice(0, 200) ?? ""}`); +} catch (e) { + logStep("FATAL", "error", {error: e.message, stack: e.stack?.slice(0, 600)}); + failures.push("fatal:" + e.message); +} finally { + report.finishedAt = new Date().toISOString(); + report.failures = failures; + writeFileSync(resolve(outDir, "report.json"), JSON.stringify(report, null, 2)); + console.log(`\n=== Report (pirate-ship, playground + filesystem) ===`); + console.log(`Console errors: ${report.consoleErrors.length}`); + console.log(`Page errors: ${report.pageErrors.length}`); + console.log(`Asset errors: ${report.assetErrors.length}`); + console.log(`Migration logs: ${report.migrationLogs.length}`); + console.log(`Assertions: ${Object.values(report.assertions).filter(a => a.pass).length}/${Object.keys(report.assertions).length} passed`); + console.log(`Output dir: ${outDir}`); + await browser.close(); + if (failures.length > 0) { console.error(`\nFAIL: ${failures.length} failed: ${failures.join(", ")}`); process.exit(1); } + console.log("\nPASS"); +} diff --git a/scripts/playwright/repro-import-inspect.mjs b/scripts/playwright/repro-import-inspect.mjs new file mode 100644 index 00000000..0ba31878 --- /dev/null +++ b/scripts/playwright/repro-import-inspect.mjs @@ -0,0 +1,165 @@ +#!/usr/bin/env node +/** + * Focused regression repro: import a stemscript folder, then introspect the + * ACTUAL scene + registries to count how many models / behaviors materialized. + * Unlike oss-import-3dchess.mjs this does not care about save/reload — it asks + * the engine directly what landed. + * + * GAME_FOLDER=/path/to/game node scripts/playwright/repro-import-inspect.mjs + */ +import {chromium} from "playwright"; +import {readFileSync, readdirSync, statSync} from "node:fs"; +import {join} from "node:path"; + +const baseUrl = (process.env.PLAYWRIGHT_BASE_URL || "http://localhost:5173").replace(/\/$/, ""); +const gameFolder = process.env.GAME_FOLDER || "/Users/n/erth/Games-StemScript/3d-chess"; +const headed = process.env.HEADED === "1"; + +function walk(root) { + const out = []; + const rec = (dir, prefix) => { + for (const e of readdirSync(dir)) { + if (e === ".DS_Store") continue; + const abs = join(dir, e); + const rel = prefix ? `${prefix}/${e}` : e; + if (statSync(abs).isDirectory()) rec(abs, rel); + else out.push({name: rel, abs}); + } + }; + rec(root, ""); + return out; +} +const mimeFor = n => + n.endsWith(".yaml") || n.endsWith(".yml") ? "text/yaml" + : n.endsWith(".json") || n.endsWith(".stemscript") ? "application/json" + : n.endsWith(".gltf") ? "model/gltf+json" + : n.endsWith(".glb") ? "model/gltf-binary" + : n.endsWith(".png") ? "image/png" + : n.endsWith(".jpg") || n.endsWith(".jpeg") ? "image/jpeg" + : "application/octet-stream"; + +const files = walk(gameFolder); +const scriptFile = files.find(f => f.name.toLowerCase().endsWith(".stemscript")); +const scriptContent = readFileSync(scriptFile.abs, "utf8"); +const folderFiles = files.filter(f => f !== scriptFile).map(f => ({ + name: f.name, mime: mimeFor(f.name), data: readFileSync(f.abs).toString("base64"), +})); + +// What the script *asks* to import. +const wantModels = [...scriptContent.matchAll(/^import model name="([^"]+)"/gm)].map(m => m[1]); +const wantBehaviors = [...scriptContent.matchAll(/^import behavior name="([^"]+)"/gm)].map(m => m[1]); +console.log(`SCRIPT WANTS: ${wantModels.length} models ${JSON.stringify(wantModels)}`); +console.log(`SCRIPT WANTS: ${wantBehaviors.length} behaviors ${JSON.stringify(wantBehaviors)}`); + +const browser = await chromium.launch({headless: !headed}); +const page = await (await browser.newContext({viewport: {width: 1440, height: 900}})).newPage(); +import {writeFileSync as _wf} from "node:fs"; +const importLogs = []; +const allLogs = []; +page.on("console", m => { + const t = m.text(); + allLogs.push(`[${m.type()}] ${t}`); + if (/ScriptImport|importHandler|dedup|Behavior|model|Failed|Error|throw|exec/i.test(t)) { + importLogs.push(`[${m.type()}] ${t.slice(0, 300)}`); + } +}); +page.on("pageerror", e => { importLogs.push(`[pageerror] ${e.message}`); allLogs.push(`[pageerror] ${e.message}`); }); +process.on("exit", () => { try { _wf("/tmp/repro-all-logs.txt", allLogs.join("\n")); } catch {} }); + +try { + await page.goto(baseUrl + "/create/project", {waitUntil: "domcontentloaded", timeout: 30000}); + await page.waitForLoadState("networkidle", {timeout: 15000}).catch(() => {}); + const modal = page.locator('[aria-labelledby="oss-bootstrap-title"]').first(); + if (await modal.count() && await modal.isVisible().catch(() => false)) { + await modal.locator('button:has-text("Browser storage")').first().click({timeout: 3000}).catch(() => {}); + await modal.locator('button:has-text("Continue")').first().click({timeout: 5000}).catch(() => {}); + await page.waitForSelector('[aria-labelledby="oss-bootstrap-title"]', {state: "detached", timeout: 5000}).catch(() => {}); + } + await page.waitForLoadState("networkidle", {timeout: 30000}).catch(() => {}); + await page.waitForTimeout(8000); + const gotIt = page.locator('button:has-text("Got It")').first(); + if (await gotIt.count() && await gotIt.isVisible().catch(() => false)) await gotIt.click({timeout: 3000}).catch(() => {}); + + const copilotBtn = page.locator('[data-testid="actionbar-copilot"]').first(); + const cBox = await copilotBtn.boundingBox(); + if (cBox) await page.mouse.click(cBox.x + cBox.width / 2, cBox.y + cBox.height / 2); + else await copilotBtn.click({timeout: 3000, force: true}).catch(() => {}); + await page.waitForTimeout(2000); + + const hookPresent = await page.evaluate(() => typeof window.__stemRunScript === "function"); + console.log("hook present:", hookPresent); + + await page.evaluate(({content, fileList}) => { + return window.__stemRunScript(content, fileList).then( + () => { window.__done = "ok"; }, + err => { window.__done = String(err && err.message ? err.message : err); }, + ); + }, {content: scriptContent, fileList: folderFiles}).catch(() => {}); + await page.waitForLoadState("networkidle", {timeout: 60000}).catch(() => {}); + await page.waitForTimeout(6000); + console.log("exec done signal:", await page.evaluate(() => window.__done ?? null).catch(() => null)); + + // === Save the project so it lands in the ProjectStore === + await page.locator('[data-testid="topnav-app-menu"]').first().click({timeout: 3000, force: true}).catch(() => {}); + await page.waitForTimeout(400); + const save = page.locator('text=Save Project').first(); + if (await save.isVisible().catch(() => false)) { + await save.click({timeout: 3000}).catch(() => {}); + await page.waitForTimeout(4000); + } + + // === Introspect the PERSISTED project (ground truth for reload) === + const state = await page.evaluate(async () => { + const open = () => new Promise((res, rej) => { + const r = indexedDB.open("stemstudio-projects"); + r.onsuccess = () => res(r.result); + r.onerror = () => rej(r.error); + }); + const all = (store, idx, key) => new Promise((res, rej) => { + const src = idx ? store.index(idx) : store; + const r = key ? src.getAll(key) : src.getAll(); + r.onsuccess = () => res(r.result); + r.onerror = () => rej(r.error); + }); + const db = await open(); + const projects = await all(db.transaction("projects").objectStore("projects")); + if (!projects.length) return {error: "no projects persisted"}; + projects.sort((a, b) => (b.meta?.updatedAt || 0) > (a.meta?.updatedAt || 0) ? 1 : -1); + const p = projects[0]; + let scene = p.sceneJson; + if (typeof scene === "string") { try { scene = JSON.parse(scene); } catch { scene = {}; } } + // scene is an ARRAY of serialized entries; entry 0 carries options/userData. + const arr = Array.isArray(scene) ? scene : []; + const flat = arr.map(e => ({ + gen: e?.metadata?.generator, + name: e?.name, + behaviors: e?.userData?.behaviors ? Object.keys(e.userData.behaviors) : undefined, + })); + const cfgs = arr.flatMap(e => e?.userData?.behaviorConfigs || []); + let assets = []; + try { + assets = await all(db.transaction("assets").objectStore("assets"), "byProjectId", p.meta.id); + } catch (e) { assets = [{error: String(e)}]; } + const byType = {}; + for (const a of assets) { const t = a.type || a.asset?.type || "?"; byType[t] = (byType[t] || 0) + 1; } + return { + projectId: p.meta?.id, + title: p.meta?.title || p.meta?.name, + persistedObjects: flat, + persistedObjectCount: flat.length, + behaviorConfigCount: cfgs.length, + behaviorConfigs: cfgs.map(c => ({id: c.id, name: c.name})), + assetCount: assets.length, + assetsByType: byType, + assetNames: assets.map(a => ({name: a.name || a.asset?.name, type: a.type || a.asset?.type})), + }; + }); + console.log("\n=== PERSISTED PROJECT AFTER IMPORT+SAVE ==="); + console.log(JSON.stringify(state, null, 1)); + console.log("\n=== IMPORT-RELATED LOGS ==="); + console.log(importLogs.join("\n")); +} catch (e) { + console.error("REPRO ERROR:", e); +} finally { + await browser.close(); +} diff --git a/scripts/playwright/verify-playground-play-output/1-editor.png b/scripts/playwright/verify-playground-play-output/1-editor.png deleted file mode 100644 index 538fcddb3f0724a769e82da3a541c2fd46ced2ee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 244320 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ⅅMQJyYtSEl9(*d{l{u)Ej&=RL-Hs zI!xrPwDA>w*YQ9PLHB7dr94@1Kt3)Xk;qACF z^YYqBj6(LBCmrRA>6HD*pCp|`-cWEAyjLUYU-tYMp$C!LLl)!P+gdY@*%zly(6g~c z8%7J27e@9uDTgl;qbUa;#xM22{mtr!ew`Pn^R^8`5SHqcC7iKE} zu!4-k8dXNNm6QQ;3mR_O>{*?+mWuaPfcP8-75iH>VwJEM*1_(K)$q_ehe)(rB)o|x zgTrUH7mKy-O%{(&I5!e^+-_cjqf+NKLUAt+XCYOB!}aGo=rFo6MaFs$({p8$yu9An zHYG7M#PS8o5j_G!DbmgaQc@-p216JFQqH?E3$udC3>Hb2q*5hJd~yMfmM2>YjKA(L zx?6zBhQRG;C+$g7%j5E}QU#WHGF=4v)33a|%I!=j{!k!4-f9oqhJ-~8Io^LHQ%82 z%cXSICUmZ|4rnrfN$Y>!xN)M`s;bcRWfhGnf6fmMTS~W zx%yiFFx{mGM-u;siW#CF?Er7e2lI917&Y@Uy})->!n|){cV{WX2}X4BcZDV1XszoX z+du}0$}0kXQ&KAs1*d{%iP-w}J2|2{*PU^=xS&-9@_YjFhAvRI4)*mYv5STL{TvMr z`_P)pwd2(Sg~FwVLZ!Nsy=|HKFJ>p_r}JfI^YJpIOcshIQ-;6WiSO>80e-gGE=T+eU1#MpSfeN1Faw8dW8>mZ2m2ydHcN6JVae)zz_ zdd@$dl~|M*igQ_8d7t?@{2gajYDtO2V8W!j$0<7X@y6g49D!3z9O)t6dF%W7Mwelp z8%9#5%V@0J$E#D(g4_1jp-r~eJ4sF=+b0UpyL#*ELXcAiX!aTh=&}R!F({5eKQI7Z zL|i<(?>BFx;P^058{HucJQ!%L_tCx<$2q^6_(m#`>;hakAj_Wot^LN{i}T&-i&0~P zJG#UiXpjWTE1~p2k=UYiL|(YdA_b-xa;$d03zx0YO|T{lqNAf9KAd+mb+}T>6ij+~ zc>&i0q~7fHlk8_x%M5CsdKe7EDg1c;f_=T#1M3_%gvom1nhSj^o60+@=A!vSb-Vfyg89oNR?|$^l ziEbN6v*XK1S<$_FR}rutKpMyYff@tCojIzjr&k21_nCkQ1sb)fZClkB;NXSMZnHI0 z^KR%$iG_U3cKR(yJ->;MkKo}twYJ%IQ?hv^@^%M~)!H`0wUrMGVWcoUU51}Qcue~z z^M!!duV3$v7ep!#DiE?aQbe(O>2&0ES1OwU_ioc#6p*hCCbzgA-06u6TB z>+5=8V3CpY7GZZkc~v9XqHb0sZ?m@b?O?Y|Cs$h=5XQ}OV0;N0$eT${5~lhLs}J)HXTUxu$qy0|EtJ5x!m4g+&sK&vUuMyqsOu~X$YOfsCTX9> zQj=Miz6s^+lVT4J7?^64n>@xU!-suW!}19KX`3uzeXEBnfo0HoKriW?of`9dHoGXN zqbQFLq{z3KxncF%N|uxef(?|1cD8&()8?txp(0q+NvuxVBc;pE6|FovIl0+>zWxyf zIST+8j&GBZmfqSNfO<%XH;aIP zjd2GyvGL)iPKQHCfrzOo5>fb*d*{7Ho6l4nI;%PFWU23WFD>%2h~7@=)mG(6HSNsW zV2PP%Iprd&4Jv3nUU@(tIon3MvEkSf(%r^FtNW>?)cXV{=T#Yn>2gYo9#vr#8hpR7`nU-30kstNOTw-s3bdH$ zY%3HgtM5WA^@W}&E41sM!!U`ql#cF?$5EU1foD4B& zg^A~}F0WWIUwHdjx2K-5pn{HGxyHz4<1By8}3V?~;Y);k*|l`I=< z71g1tf}hEmw#9d)LDfF}T%oyhKK)2>J@YgHW{0Cj)MdUAZmyOC<=-*;NrtSm&k$eQ z`RLV6=c7faj`kb+l^ycWHn-*^R%b8XL-^E8TD`+k1~L184(WXee@&O}prUYJGoVRUJKbQ`zoBAfwfd1m zNG{w&p`l=nt-L_Jcc%0qQ%jCiT zOo?DIxp*qGlHzmdaW)7Psi*tXhp8==;8YAQq71o7F4pzVa4tu?-rroWV4uk`)k@)d zYeBR?E&h0QPimqtn2x))siDtgHr8tRd2Ce^*m1@2=aXV%A3?O=bV)aA8lHgb!gsd1 z5HkXz7twW$VhZh&Hp{_-MN$j8*JUDI!!xW+{HEYCE@Q z71U|l>A$G)8&K`fv8J6)BK@rMR7Oz;%R1hhFP(y!w61a6D2PnqrhIH&)hX;Ng0C&L zMRtIrt~}keQjuyuiFDl%r7DH;R9{f|>e7SW_b-(l65Q-Z4gGyp1@>*%{A4vp0Xq?@ zyVUvbW6KiCs+EGQUmkX@P5q+lu!be`R^7$w4y8%n4V3W|qF%Ot6KhjPvr-p>X~RCx z+Pf~rUKa+t7$<^JT>jkS{(|Ds5DJ`7l1QhKmmah3J(1Zhe`Vm!iwDB!tC}&`Vzjz?&Dk^H2JeHR>rxv zMDll@kal^Rvc)@7ed%-Do6>LIF=K>liphpZ9!Z?rBjr zYQXD0WHZwx}Z2B$vu>BhQ(Q5-&BcBb=fEbVG^9@dx@?-m1nO6Y2tTaN!U~r zVbNagJ~f+TNWGZppi*&wgM;HdTZ*eYjZx~vnB#+&L^ff|`c0k8yN&eyr=0>uV;n@p z1`;5s5E_+3wF(kYrqqlq`47Aun%LJ5zFJ-%XkYFYUM7+tCDjIp>VL*Xu{rWC$vO&S zHQ5{*Cs$0=dk`X+FMI7<6Z5XZ@sMCSTw}#Wai^=~?IW{M&0<&!rIk%X-KMw@Y7MsZ zUITB$!FKlbdwKVvcUcT(@nem~ogUHfo(@*`T}5nx-$HSwg5h5W2f#Dp%tS>^fFz0G zq=o?x?RK9iC~3ZY@mwuPJzPBJ?!G>a4Z~xb%ybcKYC8hi4VyGq;V_q_>MRK@7%5-h zK6KWei|WvlvCsC<9z`{Da?e3F_{jFDbtSV7E=Y|U5ZMf1`F9TnxR(%oJiNY|&V_G6 zNRXaeJHbxLldMylFJU{dJ?mD@h3$jv*91VqR?8b^xtE;B$B^uyYVTv|HL1o0;Bf=s zHtXn#B;+vOqPRG?lTHpLmmTXDHn07MgJQ?L0c8v7na0B`aQckah40}=p30Gmr{;LH`xYk`j*Kt{&VSJ(vl3XG) z8_u1vy6&@EF#~B#EX|a#wJ#nM1}=iS_1lPHk+q*#<$Pogq=7;hpKVi+vOQyhsL}uE zu`^ye8*5vI6*duKZ$iK?@sxhn7EI5CB;5Ga^;z|j2cgf`{dT)&fyj;gkoVf9V+SFW z&#Kp`ON!L2rsa8@_YqzN*!2XJvPGb3D0luq;Td50lKVl>VWrv&!ooiQ$@kJJ9>3Ct zy;J>)fh&~cu=aLl{f&_;3#KN!v$C!6lHKOuN(uL;LPD5UY#curN%ykIUZwe6%r2f> zGTLX0FT<;vK9EzvR_E$^J&Ebm)D-!|U|IR;HLQ8qfWx>a$(<4lCaz^ZH7=N_&jiLi z?Tp|5NgwTR1Pe+OUlE7kJXJ3t^Ocng??Mmjj*Auc_f9`eO7nl~6y~ zdG>s^B=Qtm<<30`^n#fRWg*l+B`#sZ>9@@ChpGZG#balm>p(&@S8xNh}<{mHLGc zBMgl7h>!*~s7Ed9i7|Y5KIIEsD@904BU$9<=89;k(J#$1Gg>xbTu=T`)SHFn!`XJ- zJQzYsnuxU65a%(k?=MWhJwNLSa?H?THd$UV7NOmHiqD9WZJLB`=xODbllAF#%2 zdsyoZKc!&4TP_&9HTWWq)Tf2wEk_OEQ6VsqFUPsc;UI@JAOS?o?}`4A?Fx|T2{vLGTsbNkgBij z*b?QdZkT(N4zb?Sr$lXv9>zp8%De#bRb?LPnE<1GakHSJ_rXXMTCEjY3uO^1C@NPQ zvb4DJH&!7}i?~n3{p*M_cogToDKG9+&AqfttxX3hyA^-`KLA)kr@jxs5|L<()k7#+ z;R@O0+F-Lf!Yj{OH5L(A8Jm}N_A~LXphRt)H5h9UIW}Si*%%PvM&Z=P-oU{|;AAQo zMAAmUK)H?GSzB=T7Y;&Xocfg%BpO8AM%k&q1TR#G+|zn-oJq^=#S8%D6Q>%5l)%BA z+Oa!a9*Fg<4H2rRn>LOGxojhC02`$?#ilisHXFAk2~XK@S#nefLWp}d zo>49o*brwntcTjxR(;uOZ2o%NbVqCRqLh_el7&Gm>45x23_)~rSmw`{o9 zE@s2O9JHSJl-gLo%CxcWfPyysAa*u_1r>!2-&m%N;8De?jYL82*f1q}p@NH<;POrvF)`pbbRb#zL+91U3fg41&xZ1JECalo-YPHjk0Ud#XhNZ~nAAe~r8aEKYnxsm|DtMSO` zmK5>nt(c2*!KTEkRN}=IX_Z_n&RM6u1d8*74J*S;jtx;FTM**rzztItYqb+KV?8jw zgP2QU7$R-MmFCPw{y@%x?Z6PlLI=;qxwp03EKw_qjl{<0E_-yyT%iyQC1E3ICdWp8l?0Ey zF4zcGsW^2Cr#7S%Tl?2TIDCY?7DTKGPXdIL5e8fTkPzG>%x+Sij0^JGa)TU@c zu|)WRXS+}=5q*kVQ7A55I+XB5u#2HAm2y^d(c+YZvU#7TgqfvR%s8_l5*Im4VP95e zD5;*mC6ZK6+uAo~q-+X9NnD-D55=<9=OEmz6YM#FddBPAg^+i==fBBC{Y?hJN8RoOMT**zBwf^@`st z#X?!+i2_^3*(+(qLKR*aS~5KmssP7O{0mXBP&OB<4)%67gm?0ClyYoBS>!n)6^aOk zawv|KVPn}2l4cf()mbQBEWtyBU?^5tTwovqX6AeZKU>2-!PLw_o7(y7}o&9c{jvgUEDrQfF?}cmd^a z9AP|oY2-msNoF(lz#idXU*e$@AJb$U9%Uc*WQ3AoV=dB&naof{e-d=q&YlV-qvjqC z<+@F&4Fy0sLCzkb;hPJaKsW^D2gkj@vHc6~DW%p-aQ`iPtLbPa^MK}#nYY)!NX;Zp zKP77>eO@d%GuAvl#fp8e-E#ZYYQ|d9SnFs7QaEmbclX=I-fG4cJXm4+kC$$?F9^$< zpwvE{vu8;`XC6qvEH%(yOkff8Vw%Re@;yg4DJiX0#_cxdm^SVU8Wgp7uNDH1uI+}!xoxJ z#<5u+`#1vW1%X)c>e*}!*7dEyTTPLzK}5`~>BNQtGs}-l1hEP$#G>Cwn^{#H_slGn zlp8nz01yC4L_t&~iksO~Oo15@Z0feFX-RX*%<|P+&Fro;cxE=1u9=A)T0LlHyUN~Y zCU}J=)65pnnh~KrLjKjG1S*wEqtP%bHA9z#0s>G#;16^Fy$#tRI(^F@veqjL0;THIJ#;!b4^j8z&Q*@&bC^ z%+a!V%(GZQP9br3rQ0~V*5)u8CiI2+f@IGf@(lUX++a#bVeL@yRl46TokMx#~a z0zgS&65!M(s3fP?>vZ|~a=fIQH{FRe{8Of&HTDothOs*V%ReW%Y*zXMmY#BpC!jm! zx)ac|GK9wiikTI4KnZDsr+^TTXcml(q{0$uNyS<-@qmQu?0Hn(Fn0@xGb^QXiE}d| zW1vb2VyT$(>d9MKxf_tRybzalRy~E{h15@6pg0hLDKG`h7$?$?tr?Loa}bgCV6h|; zGKWJzVJShWnNv$Q&4_H#q3E;;$LhHmP}+=$%M*eD9sBlz0cD!Wsh*;M9yBB3*B(w! zc8UVZKe;=?s8qhbzABZP0N`!VmaoFUEz8t^He@evVK~MuzUg3+TjH zrX)eQE#tX>GQ|s`R1IOI#0#QO<{+d{zi<|i$PQQ_#1L8f1rbwNJR4A^gh7-`C&bg5 zNHGK?vQ-R^2PBfc63+&7tz7v52_a(FFfIoagWdy&x&gczmD==lm7H-L(p>|M^_;|| z*cr>Y31dFyavr0$&c!G|^-p10KEOcOr z?Hf!S99g~%%c}r?T?kRII!;lr8O{I8(>P=`49o8#dnkv{1)F0)i`F1&X}toJZRz=d zL~?a_I)W@qzL}tqZx6jXse}=OrXG0 zj+uN*my6~s<#)u)^KNJf0A3Dl#(KS8Vi1Sq{#cNy;a|B4s)W!uKpDod!4u*{6f9Cp zah(E|US=sNPQlWNSrJ(l7@IrJaxB@xcWV@prCpz$SQ9x*Vn1_*oqeIDIUwJLv6Thn zS~7%T3zY?ypU4VWTB~D;!#dWmzsWLqWHTJ^#jvi3DBtfy_F-R3HoOoU+^ z*IkY!5&H@FZ)g$w9a&ax^YFN(^}3G8wmG6w)kCA1k+jYF58CvL(z?P_Tp zFHG%Hu(yCRkHb9y#w#o(j7ys(DK3S`eM=&FK~t(MNlB{}#1$FB+KrTDDXXe1?^UJJ zVGBA*&MnObvZm4?@+^s^>u75!=)&?WiLE8;V9D?-Ss_c-simcN&Sh}d**2D}ZA{CX zRSL2g-qfphb5rmw3v~hWg55}kf<()UV_8;n#ZfQ-lbflG8 z5@D^O_$-Nl+~8qL{<1rk#HN2cljlpWk<2~lS{k;?pL*lDnN>Bz2sNGBUN=LY*A*{jDiU@P#i3|R!BMkTZ1-Nhf`WolQ&QHhT6Ons5>0H~rfu_k za&p2FhaNj4S%<>t1-^o2yx>GI5RrwDnXM`zWZ+;?xF3m^z{-{_tVPJV{9$=wgq*O9 z)=jU*No*@Dl!(_T#5(`2txs%69+5@*TOEEd}FSc&PoXoN{kB@ z&j9FV;Ft%R0C^2UE#;gPKjjhEw8jFQhWNf)0VFZ6ZInYgc?C7yW2M(mB zrrf-CH9S0mCN^x`u*RNemPQG{I=&?qPnpo|7_3oRRlFW|~Q?b&8bLVc}xPIv1 ze)=^kCWZh|a`5*N!Cix9X^4zV834*E{IjV%GZ@2I+?bVXET`*M9LCNn?4B_x1;);; z6&e%yxM0j$I&#uOAS}j4V*frADJLTE@)Sm)v7n2zaq+mgzsmM5+~$?jD2V0tD@ENr zoY@q4voAqouR9*{*GQ2uQDjUM8OvQeg<-wX*y}chlH-Lf*;!e8ckSes>(;A(`*u8C z2n!3peCYz0n3R;{>*pKbACR4s-J(@%s$VRcH}BDD)2tEBpF7jCb!)m%sdD9vjEwmB zTLgeofW(PIdd6MWojs~c$5sS@(he)b!0xY<7_&ubT%^H0QWK9Dv&Cy%QZ->qjWJu4 z#;nE6rQj?p^;sB`7g@xZwa5>aPX`!R@|+?z`*-Dbf{CeZv3sd{JeYu zKndeycMzUr)VfH@A0fd(ZCW+ivVET%j?Q^FeA))L3F5Se z&nv?0ZawNbIC4oMN{6|0!gCkf5aRA))wW+rq3DeD4YVR_?O1thB(~u3hQddCqy-Vj zN)>K)*0ByY^%4H{iC|N)`DsLK2;blG8eOLFg}lO_oUzO)T?&jX{<7_5?VgH)TaAf~ zeYqe@-cg8eT(Br^?}{H)y zx=CSQOJ;ESb9pM5_>&O(F0{Ph#HnpTA5Ljyxb5!HX}9ZoTd~&MQXF3tFncjJJtND{ zYTMx_im~+fd0#C3;lg<4MaL@fw~RzsI~ju5t%@Z4&F<8TbyT>dj9K|@fbf4H*}+Xs zojBi>3bu*49_Ia9_G?xY1(*G{7qdOFmf+N$J0>}`=Lfe`Nsck2FgQba2Vp^bMaG^A zE@;nBQDpD&;L^r!+S~aGKD1wS!TC0h#)^WwMrdeAzX1a;UO0c`&>=1*H8~|JDw6gf-YaYMAK95-AhSHj*O}RfdiBv za(Y-A-ib%J_fpJ+2Aie@F&Np*EQ3bP#6y>l2|7gR=YONUub&(=l_ zVTFq>)Iscf!UDR0z^B7z;VBM|G67HFaz)gTSX1F5_(k(Sd45V)*2bQ{0c~Tmj^i?< zSAi{<4^x@OA#XFXN;DDc1)ef{d6l=3Er^F@4xT+B%3gxY*~^qglqwfQzPsC^lP87@ zA5k+lHa$JPdCQikPMoCaH*Z|0e{?~mRyA(YblaBA+-qVJ6B6#b|NaB}_Em_YMDN~# z+ohl+k=84?okhc)!`#_(JWE)p54Vt;mmO2Vq;AmVh;ZMGtZWIdq@;UXhyTpE%k5e> zty`z&;iIQ3M21ZsKdfGzno0Lk<}6sr8NBx5)cpsKw`$QSwpO*{C(iypYcXASA0O?6 z(SutyZWTum>5?!T|q$Z?qsFAg@JWJ&( zD|eMyg)M=#$ON*CU29;htkDyM-)og??}7|b4E98(%s~p32w5^m5!u`Ja+TUMF53&b zNcW;kxxJ%%G1!Zp;st+>Vzw89HL{FKz|6R`u;H1R8C3PS6&FVUC`xE!mdcfJRj=XBF_!B-K`T-s zFoen188sS{z@gJQe_Dj2LPVHWt4U4GP^;B1J@;sQ{GH!sE~;Oz)^krze)a9I)6z1c zDufRm+;icQwfhg9cyRnM+Rxv2@WdmNM%1iXm3FoR0{o^tG>Qu)7=b2Mim5K9&XW7b)bcM!^8c1~zwMK1M zXT8DLs6m|u^=h5FaMkH=77`p76&Zf_UW%OR84X6APER+;m8)^N**WdoHlH|l$nsU2 zsHQNWU$>_ppZL{xfBF0S)vHsBiZWYw9JqYtdXvWWn>DGQm7Ozh@fs@Dyzu0MH*ejZ zzhrHno*gHQ9`x}Szt9c!_@iTY?LE9^(mj=B?@%Ra_*E*RPPny77JH{B z700fi(mtMt?QKMSMZcGFWco1HPNpJ-!)cQisE*w8H&ZY$q=e4*9z)iPf%*0dHxW^Q z!XH;@gR@+=$<|!h!haZfqb>O5I1BEsz4Yc4h%dQ$J#svhsFHAe@hU0Z-^J|3sw8#_ zQ)(|(Ly1$Q=p~Sc?9G=tjG!dpxl0;xdm^+!9I7P4UgVO72ybxFOCTbJ(P&Vs1l}Ey zot5?T_y2QDKXT|0{Zp$o27}%{l)?DJx8GR5W@TosShkb^P+ZW)ES1ejNfumBPQ!}r zURIQyCOm_|z#5Ef(!Kl&5yVHUx^p*A+P+)o_Ox4Gqk0uTU!PNFE?&8Ivt{!}6{9PB z_tW17y&*2{cFSfB+O%xEd7EkK&^2qf@7Z^hF5K6)dF9G6em*|!+BEy(+drtjKokA_ ze5ndR7n(P1;27b=Dbq`p<}O-&=*THzp5cODjoJS$zY%x)_{nor4yar)IwvQ$L%ZhR z{y3XfiI}D-PJiyHhwN%TVrcKCP3onjrcZlh%)1}|n3J1ZyH+)>CVVs+^+)eKOBW&| z!l?1#V`t=4kFsR>da7$I`ELVVe&oTCYc}jyy>2^QzI5frSD(BZ6V0hJs;|GBnVyl! zxuj=g{r1;FdOW3a3>9VGc<-Bhot_FMQy&>kbLkpgxO8>)oaJOv2nu|(~Kc!&tJ*Q%O5{_P<%qtwjBpdbz8CVz1N?tQaSood?G0^tnHh-RpOXl zm|%D1P>{^Zw0Bm7hwLS)BzOrYQG~cXE8AYG2oKux44v9rTpWs!wil?9)UlD@Ym#lx zI=ADyNHtfnA{5x0T}nlj7-IAEfYqLn^J&{$8F`;YWM8l@wz3pMl&y>WDv4IW@zXq- zgtr!~^JhG4J{4>wc^lTn3J}XBjgz0ig-=(1EW1^fQ-LCFu7tN!xLJh64$J?oonrmr zWZDxK4o#%^swD2h+S(Jv_R0``(cxNTohCEmpj>)f6wx}+h*{_W1J zQ+u&0N!rVgFIpwmSxYpsMm154qq+e=iDP6XM>eoh$4v7FW153Q&cLT)wD23%deR`7afi3nC>JJQolk!k7KIXV9RzLhIQtJUgDm#%ZU z7cSp$bm`Wq-Q0yMsbKN?i&LL^e8T!oyM_<${niKeQmfHuJZV-*?%qv4aQGyZPF$#7 z^=g$@t=+~g-@TWbmYz|gdS%mca;jC`pk!uba#uf@S=m|HIaJ*+EoWv?>4!EIs_9U1 zgtMfAMO^%y!qvCku%;5LR+_tT6_=Quox^Qan)v?P&v1#kxp`rsAtfqs*ff5z!GR*a zMC>+^QkP;VLc&GjW|yFgQhU!9;i+1Awg^ENIfLjpLxuK5ScDt3QeH$s*VL&CYj!E< zHrjU2q&^ve=@_M43W^~789*$dOiMza_R~)me2SF9)rttZSkfIo3#ZA(Nw-}l~l z>gmTPu3WR#F_h8BE?B&VpW;IGXnmq8gmcTjzCOW0fr*KCt5vHkb9D;Jy_*tUA+oT< z$Z!c`T4JS`sH;4|<#xi|^z^J>{+v%r2a0;dO8cKh*Wy z5kc+|o9`m02#X8rk_$uRy`PovdOn36ROc?FuvaRxR;=mODo%&u^IfdHU&mSr_WbO6 ziTqrN6=Ch(RKn8;i0~(`BhL@TcQ5FoTSM_`WfO$A$ytYLnO*sz>{pprEAb6O1UH?W zM2Ubl8^kt`zXb}uG5lw@`0n-_!B$5Q*_d`UbNo?kKOKHnS#yHgZf91aX*tH=Z1~Cx zaRz5eSXq;U@`^CKFtYYq*7AGE+zkthFn^Q(5Dj+?YyMQ~;^bJ$voEZbY!|+xs0%-x zKTm{wdyl)=CGu+}$HlG)K^MUyJXq#5-FuG=8`R53t2uw+ibkV(aKf;Nh%nmi zA2)iCMk73QD3k96a(Ph>@9@eg5KA8liHf=qiA=>N#15p7yEIdbfDn^ujxb!i_I6i_F& z`r!WENhv_0*|R*9x;QPxnpF%gV)lYw#o*#}MVz`25tP=-)BBr;LdpX9j+s2hZccKG?- zB!-_tgro<)r=`kXN-fb%@+q%!p?|aF~aa& zSl;SblZ72Ejghr2)?P-j+w7#UPeKIYJKAa-ME=DT%acW9yAVY#)+;|&_Ap+Sw+;$j z3NJF9+Ot-zO@Rw>$%Syrh*K9{t(3aBP>Koe%p&b#capN&D{*0Dx>&zDb+IeL1sBGa z;&E~Gl3tM_a$$t9vnP_!o}tlTAOLtRMuXAW@C_%D1-DOW7~5_GDK)S*%W^BWeD#(N z?OXQhasQh2JHGtipAStM@zuvK)Ac%dj2FKCkXO^$rJaOER0Dr&z z2ajL9eoLyvm779?17Cjb5xRD#&t1N7@hYwMU;iu}HmK)A6NY7H=WN`%my{?O@`!(z-;$);kgjZ)xPe<2rMDUQW3LZcgOn~4a%_jY3#63I#|c2LY%-V zc^#~qF2seQ9K;nDB5$wZxe!t`13&~_h~$aGw&UuW3n^lkf+{g0BLYN9aqeQ5SoT~b zyc~m+5*IOYb91ylJ{pbI@v;zr(hP0kda7;Y=gYAaOy_HYOs|2H`5A%^@i(sCxsyZ` z(xqdo9lMW^lE%-+M{hKUNgI58eSN6F;n?SwA3+QsACtCHC${=)FHU*>%43Swk&PIldP(d!Z5F+FG1?v^C;<{OF zWYmom_MF|Sn>-hry2;gCTyRlXH`fbdSxXC*Kc2$6_b7XYrLa#c54&Es%z{|iT|4`N zcrH#0wdtZeHRJcXg(BOS5oaoiQ#0{#CDPGKshM~WUuHBhV_^el+s($sK|PTu+TtRm zp@@`X-F=j|YGnl#td7!Mn=4Od)m%92l>Vcr^$U@C!gA+iDz9!XoJ>pRM6bxj_PT`> z-8EG)UGJH!Ze72cn0S{sgI=YpHCmNIQLD+HkFU^hb76-5};k zPvw_uFkzp_%{f})2&m?~yn=su=0pTLFV@C`mE%%qC+<=@3X;64@KiyPF5(5raB-uc zqN|%oK~7wV<@(FEUd2<8JeLA%xh|X+Yk8%I+%6E`m&nChko>ywi%_g?h!?_L@0;E` zXg1`>XB`X}s{!xR!9dVV#DKLH$MP#{tq1$n8M3{8w1<2_?5J5 zW43Um9Jej8bjewpdI)S8yRGN=6FB}%j@#CLy9iC~AzqqPer8dV$nF z;(`||)%o|N7we>3uGp*C3KH{j`tX{kyyQG3=Ym(U73An8^SM8!;DX=Uy;S67y=;~1 z#TCTZxv=6pDmV1N+@%yQh>ORv{0LTKhVb8|LBxHzxfM+Xv0Od*iGmR~;+z3~!fY3y&>UA;}4>ONR)%g5-Ev8XQAxdXKD9m!k0EyO5%+ zo>)N=Ue;8{f}DB@79{2+U68bwI|V875_1vsa$1mtmxK$Ew~qi&P7vI!?Djs5jhHH9 z5SM&P!}BR6PEJnl>UG-*DBUO+Uh6$xWpbrR>Dz!M;brMB7MmBV;OdIu^}ghvNEm)U z*%8(yuL57zAwt2O^n#TVFtGErnc9HwWiw!awfD8@%Gw$f2nRwD?7a8}46)g?{7+sM zVQjN3zO18f;RdlpunWttG_Uh&pH;BT+HNcm-A6Bwq6x5d3G>?Lx*lu21XYIDYOi*(W@hy;1 z7#VL%VO{dFbs@w?2UOxkT=3!!XpD@G-z-meWC^xv);7hre3>Vf> z29@XKT3KG^C2yPCUy~H6SHYp%dY`Abyks{&ix=a97bzAmo|}?giY>T>@0u48InSCu zg}jJUFGkFZ5e&5(o+xi=`gu6Li*tQsFGhgy495`T`#W=hfgz!52tivsIM&#ungcRxs{9_2ipL0|s z6yM9TrV{oH%bNm#Yanv$ts)BdD+{f)L{$sD>^HUW2DC{O+8{(M6mPY7S%Pgtpit)% zyE+7M7&9URm%Yp@@6u%;Yk96p0Zg%aS$e-p91D-D3eLQ4c@?1KL|-yq@*PXR7x9vd zIsnQic0#}4E~61sL9l~?@_-BNUqV5b-fKMWSQK8ijx3QJ?J45rPH{!+MQnQh3cPF` z6jQV`FH) z>MXIhC$7U-_AeqV1hF=DHulymrck=IPvl})R@3IkvL^C=an6gi$tw6P*nX^lzGL0A zj-pbbJy&nmYAM_-SyAOnK+|!uS$WM^zRY2{h*ai9h)pvlN{e%`l7tlWX5~G%Qc#L% ziLrP(b>xjg;=E)P$MYim!3ffhd@oaRj4UsY6vy|HcC@V|u~t&KmvhHL4Y8n-)}2YI zm#~4eO3Kn8q`kx(omP^__}u|0SMc{5!CgkW4ku99;QQl_ZJXwBM zgjG@;YaM?f_bRGDH6V(|L=fKWi7ty2a<_?fYZP>DBierW9U^hI#rY4p?zipyL9wRVu7VO(XL6@Sh4~^SfL5{D@DXLJ0eyVA+Cud#M*ddi!p_zC{a}kw>hy43R5O?Fa^K2yn3>BjX+*;{LArz zreUKiJ1xsxJ5r#k$ai$NI6|B{N_Y|CTzYV`I6^EMt>hJmLvf6pdOCW^Db6vG@90W# zJVyY4b#GwBFC#TpTgN=xYX<b!4mMvEI?DHQ*|9k4=?O<=^(=H`l@%x8 zNaP;Z3a%}<{te@-t=KtQ6bgmKS&R#wZII(ftfMw8j;sR5LTN*hLQ&`_zc^y;KP%|) zSRL&|3Wbgeiz7tfAp|-0ZX~k&4z#T>VeiQQv>)2ROBA#uh1bhAW$<@IyMk;JZGLWh zOBsp$m0}%oMG_qbZ?Hm^wuz1khjk;^RZn>6g`lNvJ^7okKob!X9a!R4q9Club4Sh{ zUD+x4;)t@n$$EGp3ic*TahAQF$S%=x7*ynFEw13Z%@I{baa>oqpu_9jvG54SP2cQN zJ-Jy`lo#h(Jr%4V|M<)eJ1N|-G93$wWB7T_z1(oLucx@9lj7t#x>%gm5rA?};lWUF zr!eQL1hQGS@Q)CJJqnZ)xP5{DXNA8<6rCd<1&&0(k;qv`*~PizXyfbPD2>&t(2*%7 z$HICNmmC>upGU4EPoa=|HP3fsTytdXdL52EQ=7!XOKK;Mte7MB;0*7=O_`&(rKBUP z)RDFJ1LZjK=VBn13twWFNUVvhLn2{$j=V=m#2qcSANjgSVKm-X`$R!U#-cjAm^NOCL$pc1Op@z3`%CcokvRAfO(F&GCQWPl$fM5g>2#^4gGccHl$vMwUwddVVRh>?s zbMJfeX6Dp4p+nWLs{3@Pu6shN$H=6hMrI1K!+EYCBm^Orl|Qgm6jb_zu=9ZnLZ+a| zc485=Ak+~AE|?>WdWK8N6hyRZK@CBsZfpcSJJW)`Qz5tqGD?D!as)Bt{3M*Zl%1l2 zU_%WxWESf9G;AJGY3QgX?HrQ(5vuGTnU7_TzF@g{Z9xe4&sYjVJwd4WV2IWtpvp@? zwd^4g#L*Cpog(xb2cr+9#7->2drxPKGa_itxHSbuhM=IwKb>#{gE%(MV}JPf1VcAi zkf4^aR-OkPG%9G`?tw&5a6z60ixv}9@a}^%^u7qgGr}Z97~JObMkGIo*m*7l(P}%v z3|)1-tS)o}Q46YOg1(E@2M02?P4gpy0!@FBS8|wXWCnvl6QmH`=74Dkk}uH$26%uE zQ7UL#8{^?!O$7yiTqQU=+(IQNe8I%zswb%Wt3^T$JlE86LD>hbyAQJV+0F>I%n^q` z5XcIamQu39{x>Fq`h_XA1p&(YCoY&$>Xz3Qgi#l4sG)|OIpR&0o+gUX(9ukpfrip) zQYBDGob$2`jLR~?DoS0pY^D07Rap=`Z?j~d_LSBVBxj!-&%ny6IEcvgWobafIGNRy zB3884$f_`bs4OT?Yoem(L>`FF_Pl{vi*-NxP(u*xu?@TMn^ow$Y|krcxucnCxAmy9~9BZt8dk6>@*@H&HcNt@m{#_}Zm zfsUcbat;s2ad-r|=!l$0_qL!8B+-L-$qP1F(S(_tEyM_L(BnV)e znJLQ!!R+{HS#;m++5y3|EEg2O{gX_=N=iLJGjYoW!CsMoU`#e7*ib_aMJX{yM&7|u z)qQNJp(BQ>9fPY#B?ap#ZAY-4Y>hi0+Etn_2sFxIZ-S^Kt2`tvR9k8863X2&#Hvc= zF(`fyMM|kYH`fR>5I?_~Qgdvpr<9&5vt{X7G4Arll&WK@_u0{)hz(MJb3iqP;P8OA zMc91+01yC4L_t&^$gp7uFRo!k5LjHp>UVD6@Ne;e$k$kn8sXmYA>>gfEE1+bAW7tn z73ajBBOMGDkO>90QMz5Oh|Kcoz`_=`Tg)(Kkq#P%A|fg)$PluD56S~fL>tDx-U4|s z4jtzbJbXY!V#H!$)ngn0ESghMP$|uqrEHay(qSR5M5Zhq8#136=HLt_(os>VzAvMO zQfY3cQZ8tBw^CWB*6ie^2FCoVLIHa_RbTrhErP5_h z#2!&;=2AmPGu4i0bVwE<@0XB>Y&F4lWF5h}vIrom8*Cp!u5s`-zv<>jaFi@o{sJqI z(>`fzRoT`F1OO^_lngEiQ7sVT%2qo1*kcbs#i1yvu2TBDdL3DIbmRa*I8?HM=!Sz} z;st23geR&rREzvHPh%gktY;F7jHob&HOVLlAb>raQ@{WZIwHscod1Fd2tlPl?bN0s zZ5!A{!HH7@5xg5TY?j2lXnWb^BY=Tg1n*9b)D?GQ96q@{MU;wKb0-)e%a(;2Qx!<( zW1ZLv)V_ZNT4(sGvSf6rXcs^=SyBD=6FMNF`UiKlQhPH;B-P#%hL-*}4 z)U|oc=binxp3+0NvK@jgp!U84Z7GHNvWLc_XlD!`5`!CR=%}EH6DOW=`bl%=%$_}a zMv>jNZRgf)+h2Qq`N4w+p(5o>pPm|PK|>84p;T!uh&E)~6mMk5M%EE;WGNelvLYla z^0IBpVk(Q|Ta|vc5_2+(g0jl}-~*hiCWFs11*f59##WsWu-a9V%I9R_Q9TRmB_Gv5{?Gd=#mt zr}wry?|kmrXV$J>lf!@7>1QlC{V8d zeCpXXYu7_H$_Q}yK@k5Q`-U1if+;hO9-J5XG5F3t_HqbS*OJAmvP8U1S#>CaDnt$v z^;GKz=xdqXI?2>EyY+iDh?-5t-22-d2J3@>#L~j@hWM0W~j>6@fPh zc+C1DT1+Kt9wo3)0M)YU@d>LD5zDgF9{vkBRRN?HDYH4h8q8F!mu2=S%>sBMj>zVTJF>RnwPZ2d?5N%haa*h7v-z?ms?+p|Pk*Lw{(>Sg zI5f0%^X3eTmKbw?)MWxDe-%vw`86}1{ zpBk7c)e-T|sje*RiDMNTnOL-{p|Wb!-!~D}R!$OMFlU2m zsu2;h-+@=Ax&jIP=8HCD^_i-cxJl5UlzRXod7)0}VY7wsn0bP#7Ua;*q|9+ijwHd@ zh!lIfr6l8(3S0&Kc`0Vg{ z8+gaLZOO^+_g%_<^wd$3ZU);WJ+p3i-4({K7)wS0>|J<{K0|PT=&bs^O z-hb=ucbswNnOnDP+qrW`!GF#5H@x@WdoQ~9(w^R)ch`(Ob#lV8Ww+n;-s^6duIR3tNbIa7Pr}Y;`;aD z5@z(Wy4#rL$WL5u*n(>}iBxpMi(fcWHj2T+8E&}+AwQ?HEEqmot{cMHfJG?4XVV?P zEst&D4x1@PUrIzD9PrM^^+*Ks$nEkEy+T%SHrp`}SLU$Mp{2R(NaIqBjSNU;5iLjd zf)B9GvuvPkU`;TCjZQg4m(3{$aHW_yxNNjv(3bPtK!6dOQxG6?JBEPD$3HsKY6J_A zysyOF8Z%^Ni|d6sta$Z?>m5Xe+p0Fa6XGgeRh+6e@tx}8E!6@li97B}J#mvYvNgnw z3zsSGSuUz-&!LxJeyOLocmDkO-QC?Ey8q{gh6ca&^{=g3vEtqjesJ3K=}VR#chM!6 ze&vf_eCS)>ICk-p;^aB6ukW6F@7uI-!-HS{`tb134L99ffXtjVyGRt#il6-W$3=G5 z?Ag7&6J+^~x7@mM2bY#(z#mCU> ziOZJGoH1Q=jl>`5P+zimA!L*A$mi)X+W^1WQ6WG>4IR;B&IdY^b=Xt0hEAEv;>544 zD6SA(arIDn8{$|&+%$h2iRY39I5gt+eGC8ur@FWxx7=3~M|!fYAP%7K{tq6ED~nf_ z7wpWBtlVL<{G?pO#hqgw2F3MxPlr^(Y_z;pVs3>%w7acsixKzBl{nIJ;91-D)+7?< zCMLc>aq$>itDH!gazFuLEeSS*@2r-YY|0ryRvu!5Ae$?W_M5MmU^886__Z;vxW`7( z{BrZ?2N0VH8#v-*m=W<9n^Uf{^m!9@t=JqP-4+#x=t>bSCr_Ux#33qf*Ql!E&LY#= zU28nFV&_gBai}A17AQ4Sbi^W4d1uARQJ^$kV|$!k+YKhk#I`0@)7YNaX^h6U-I$Ht z*tXNyY|O@J%rf){(-bcx^AOuCGXT5$2#aqp6&Vn;vm&I>pl*R^ydv{n5_`U(Et`|KzEUffX|N585sByzffz zuikbd9?n;9epAJFz3$y0<9+_x?NZWU`O(wO-fg_uDfa5QQt4Q6zR}<}bGhkvgMYr& zEieYjN({JPRkq2Xp`$x))cf}jNV0c&*3G;8?F&N0rUQ#hN#{&c6LVKAdi)*k0~>I{!TVJ-O*P?<>FMTI8VXLhD!}-xGI07;K@IYNBlDcbvD~( zDS{o(=l4pF!P%<+WtIfx-| z?(g_|eHK!xcloy}^pdsg>%F*eK&lHp6P<|FjZ3*!Ee>>dehr7?FXC>o%Vr4O0Vln>wR67tDi*nCrBlmWioFyYW)$_s<+xg`FBGk>!4qH`oqfE|iVq~$!{ zQI5#$cCYus2!mP~9(3f#z2W=V+{-La@4ulU5&nl)WXH~%>7^=7hwWDT=?!madCKMK zOd&nms6L4TaL)>rj6kbn9+z#}_;j|A?`DS z4HG0A`#&uJ_Uk`_^v}{^JA|NtSA%xJTnzF#OiwHWzH3_T7phl-CmHh0rVOUspb!G~ zzCH;k>vq1%gTDeO*FA>KSHc*Cuh6g{6H!{U(>!QDe*|vr+CjNi>g5FO_J6SKPj4=K ziP)s+4v__NsOSVLRj{doYY!mJkwj08*#`&BZj7}+A}SS&JM~Hq7(GOpPjGA`{2C_` zkxIKV?QsoWz;Bdv6W^hcSf;MlifRLM{GtJ}!##$Nso{?a#u_&a(@i?Qb6u!d*T~ zQIrr`WI2<;qbyvDRa8~i?J(HkzTRrzeHotRarwK!{%o1xNYAnBJqUd};J*EcIpC$n zby}#-(O^5ICc=b>fA3_|b436;?(U2SH=55+xFnzJsy5_w-wQv*C;OYfc3VMs98@9f zRvujkyQeBI5YVX@iqw=ul`hR=OSxzjER`UJdRL{-42u)oBiDji?ADU1$OC;!D2h4R z0ANh27kOH?hAF>^VS_s53IZ+K!yFs>3BgM2?>dPEcrMkUi@IcahJz$orKxTSO@d2F z?D!6WNH-a{^P!p(I!<51)ANPBLilv|k@`8oa;Y#b%K5F*DkRA` zq)LG=+SrT3GMuf=%u3kT9bZyMF;#>6MzK104kaQ~++te%KSsOeh%?cS(GRZ?hfB#u z){c?kD+4LiX*K}>D{N>RS*957ETfL5+LcWPfIvl6w738;7_@jHl~vm&G-t;Q;N1rb zC4e{~dA_@hzp_X!E?n|5(}XIhyVizG2E^O6htUvF+|2hF1Ax(6N8h zdmk3m-+z?n?eo%VKb%MY?P!-$*LigF!EUvy;x@XTrT1}Pgwow;3DSXhHWUIipBeMtmk#ET2_AwkBt;f(gU>TWy+BV z^dXyh6k`=hZaoQT`|~sxqDBmC>9+g;=$XXKBz#ZcEgr@I#J2#ZgDmLjFtMc726spo zO@X8qz!9LyT*Nu{%kCJ4bx-%tM6}yNYtw-~EH;3z^BoGF&6AE+RN)0u#i8 zwCQSeF|C4UM1J=lD}u;1WS_(xj)6tybR?b! z2l(md6B@QT0=)jWzm+xX#=Ap`csrSSEo2$=o-tE9UZfzGI=2~*h3q(CKVa#SDrc4( zqyC+WpeQVX*@0~hY$fIf51mq_MI3~rDM5hgNDh5FlXXE6_%zqUUV&_bVFP{ymdFHu zQ2vNFnz+G~APnaJcKm{G0)!SrfM&Ia#f%~3Ls3EQ--3%L3yuV`19}HdQT`AIfydI7 z8Ng?TRbS{9gBqD8RH8upW9r-hLUxSmT0n5aD$l%5#XL}jltPLEV3dWwpClQGGK^_D z$=0|GrW=8UVFi@WhY>+nORJHKi7$4O6ovp*nkZP6F!J?7>7NoK`-6g@^il~V{N0N3 zX*-;8<^`BEaWR|aS%d@jhPEhuU!9{Bmx5p+3%ai}+|PJ4`ip*vyLmuNUdFW!Z^zKu z_UmBjJTE*V8_0Ykvi-YJ{-oZE3};>nz)FPk98#c%R;_L?hzlr9KQLy@%lB!H_aQNM z8H94=B!xxwkrYnNOYw#5G)k4ej6z$|I*=n+1)9S}=!V!NWMPSzQg#TFou#&XK7pV` zgl}XVCCp;=iUfuPx|3D1+>e0oe53LUm_W$q>~6*L{5K*hSBhAbW^bqS!Xbx}i23xn zj_cth3E9BKx~JW0$Hmgh5A;y5oi!!f&~fFe8sj&K`NA;2QD&k07M`@LjdlUU(?^?6@K~CMaCcA7hx>aRF$OD$terBl`mEw(kaQTezuSKl^PM-l#A4rwjFE%AU%*OA zU?-KAYHhAdl@i8*ppox_l&3ro#W-72;QGqSi_!>7xJ+r^$z?D$(z1R3u3dy2G<8CV!z%8wrYZ1e^z4+rY-K52O=2{a@qy3u&o+70 zzYMHi##Ps{DMVx%Y_&N|BY3z9%ct}V%!SLWU86Ws($$E>!OWhA97l0+RP%)(*tZ$s z2X?m)tCF?Z5=od+)33|=m-gj)kXpeI<3!B=!5&+pMJf}K@Wwu9kQA2$Jh zcXx~|iq=-yiT_~Hm?JZK{s4-F00$7uCHRtQLmu0Jul2n#%Se(eMX`CZkAF?}rh7EH zGLzz19K(I;?-h5Qom3S=Gqd~oNhqP{r7ya3S}?NMh&BTqYe<+Qd@`;qW?u3;H$_r5 zqSH+_TBK^C_5#=AnA%#TBqn93##I)B?Z(GeanDS9oImfe8K88WqT-XPWtHH%7i?~2%BcZ)4#r|gyuIOoov4#GNMKj@_= zAS&0QN|X=A#&HC1v6{o-ZDRVbS=P%{fyD)8yve-Z3!5$WFa4Xo5m>4sKIbQNdH()j z$E$HV(uc&C%WOW^=ars+-2^w*WuNtWoo}u_cJsvbGX=fpeXoA*Hjs<_0q|aSTs;4Y z7r6KIfB0B!a{PF?>^RBoba;RGI8iPra8|H*O*VGqzFx)`%^#RS*ss}{<-;hrutSz; zYxYa9=`H&Sf;kP&?_mXRUT>pCmM`ETNRZfIcq`JtXi5WvBkj}x?d3QCl7!j#V9LM0 zOyxBLWar!W*$KipF<~1T2~y2LYhE=<^_@_x)V2~a{3{kWLRwF_6k5w&>8ziSZ{3C@ z3L6h=nx~cT?o}5PXngvEMOBtxg1=ifwLhD~A6Fd(9uG^rq3HK}we4E)E+=Rp8s{#5 zY1|b{>Y05$Tw4S=3v7^54|Fjk2ZtiGX5}}DkJwg6iVW{Hjw~+2V8KDt>!F^*>;5~A8p%@Az2 zJgPmW;^+D5yGra><8@6pCT|xY2z)Z=H z>`wo|L&z>^Lzmsvyw~5|O%_TlV2U$tyR8OOEzHWtMObpLnJKM{weE+ey!MZagQ||s z4*wUPfP=D`E^QFbWAAf2LU?%imOjM5A+GiMQzWbH;KDOz(q3uQdYg-4krW1Vmv7?{&dfXj$Z#?9wSsfJ4F9Ff2a=860?0z35 z^LU=lK0?p&=6h~%i{&4nyF&p^=e=OX4mTDD2_-QS6G4;UT$@7BfV@N@@c?#d<1w`f zh!QIJ3x}>O(tqq0ty|( zoYb!|{iCcuA8}I@b1w16EQp%vS18mZVE0c(peP;?APRzmY3-zJY{-!8Ali_~_>|74 zjX1P!B5{(0B_|=eRyZB}$Xp44L6w05@B;=&%ACOX*jy0voql0CXa-KS>- zgx~e>mQ=tK9VO-)%1I8cE&BPop#*TwVI$8klS{~zD0&X-b2T(L92u>RVG~K{W~S@>8B|UFUJhqm7522a>k^bV@MAO1^2F&fj*! z*C#I9<&R;*0BRg|2UWkq&#CWMbz$3{x&95mhCpM9q^>L z{q0fus`qI5W=05>=oHk_I_fiMP)?j8Nhi9K5JFFK5zywJV~1btUIbVKG%!~pn#3gb zvc@4`+!5Oni!7?F(4i*rqetQZ!?A+tP-K`$j0OQxiP(NJeMrbK)(Pt1$Wzdk^3*`C zB}q0l5j&@AZwTAS7W8gsP3iWmm>Q7;4mXAqc5O>d@BI|%hzu|vni@Np){gCp&Tp1k z5*Ze8$Nl)aG;Ufra|hAYVwp6_J={a|ynf}a&S+frH!Tzl5)jxBODsE5K$`Gw1rSC< z{gmh~mxL(voiXw!B4@IU*`%LS8V(wakrrcOTX7(BgETR zBH(en$m2nvz4fr)P~8p7K|sHUEY)>djyXBX^;;Wwx_N(8ez&l4vbtEiJIZrilRV0M zdXvt5o>(F4x!rT^y=K{FNDnxPLhk*ygT9}|%Wc2*oMrf^!0=wlb><=5byP}ROHYZW z*J@X$vF*EGvFd8E>9l#!w(WBfrE&GXYUpRZ`K$;LjxKE-du}`pU#0s0zREi)8yc}$o)_as3+5T&((JH~*WsGAWpy+%~2K{ZsDUbP0z zVMY_%T3Ll)LUt%uxJH8E-3>PInJ~^vJd|FXBgL^dKK?n+qeBualci<(9M2l*)Rd@& zn@#syvhF+KG6D5B7e2N56#_9=CrZ!~mW8rx9UDW!@{NGCX=CIkw8cytE3+T_t?D3( zUiiHlb&W47d1nQ!Y$U~~rs*71T1@3~U3&QjMXz{b_NEE2;_jwjG0Nu#VZNoTnbtub zk*pIL$a6D8WQ@AK&H=^`v#coS;+{N^Ss2%m(wJ9c(&>;(wfH->FOjCe|FnR%tKZ&x zjU|%zZ2^Cp8oQ3a6LOTQO`8nse47krd0!A`@BB8L$?a=uWpzy6`&tw5{^Kg!`+1!F zv0YE(AzI{v_~TH7MZYn!$Hwj9vO5}YI-0Q6c4bUUABp4sVq3)fdI;|3CF3;{Ijk!OX$yQj-(&;d816>Srk@5|ZLo4WjVpq+Ch zFEX5I{1vL$rO-WReJF9nsJb$kO$;N(e}Fn=)G^~S>WzaF& ze^AX+X4qREYjTw~M=*VXsu3S~89vC%4sS%#F3uVk6XfjC4soQN%Cg&M z#d%*ZjxZF8C6Q@=4XwGq#ObiMSJ@6#k_x2nc&vQT#MyW#BS z4JGb4limI_PTx0bD0ItUtSI_3?-_(sU#+)& zwBs9)5|O;F&>W3B|{+m z)og2`8QzP@f6ig91nzOOG#Q8pbmKACQ<((-0s1tyPDEFw=DgZZ0_sG$MlifeZxU5H z-iWRt;d%L_uZs>=sbk8F7 z=j!Q?+{RK8Nje@zWy@wf#$%%u(xm;Eg6m%RYzhAY7a+Np)X~o!qHjL=JlOXLi+SQ= zl2+nUJZAh;T}JO+9LgdmudXwXJKb&DkW1m)i$FZ?mvEk~Z)Ig=N2U+k9G277l;8gD zzFeN4oOl2Xy-s3%FT4H?VW;5$(ZB7J>1a!kBmE<;ZEtRCJ4!;H$>nk6HdDd;_4tIo z{Z<$7gs&w0?`ONKrJ?f^#LTE8CL;2=4_o=%d;9u}h0hUk9RA}tZ{%G}qpY%>o>zW< zYH;&>c3`99by)4!QU(^oZjK<>LcJew?52XU-TU`%3#FD>@O%lg@gksHZ+fXqzF zN#&1G0$*Z19dAf-(ttM1A`c=bijQD=YUCa@_JA@0iQlg_8P-uO5K3H!``4WKJ;WGl zJI3i`tRr3{rwMEf0TO3yC{D+*A|br(i$Y9=Y322r^g*zysp=0kNg~!E zY)TH~Me`Em#@voy94UHF-6mlA;euu542nwrH|h|Y2~fv4;*CM0Knr(f6c6JsgI9vY z;r5l81lkvyPmN)~eLpG8PLlZirc&{71K{D|SL}b^dVV~{k_$g47dow6c7Obff8Pr- z^x7tWy~K}dc{#B(Jh`|aB{9p(dYjiG%M`L5aeQ4XLx>3Py_=;f%jr-^!w2>LO?)u$ zyo0QbxZ8L}&7ug2(jFoI7~lSOK6v%^@$uo`AcH>_`|-fiqn*+Vu@D13N*w+FzP0&1 zV?WgBxBX*zKV%XcG^r1G-G0AcAn(0u^MCt6rmO5T@D2eiARQ^E$lQ%j!Dqsu(KiQk!N~SAEsw(_ z|Grws;RG_7-<}Qu0;lyrX#Xw+U9(t4Bq>e{+}uEIZEbF@!&Axc%F}S?p8-a*D=vSH z0%!(N{{Nv)!mF}tUWJ-E9}MSr6R-1Wfl7~mIW~4Z`MVW@bU6!AerM4NC!&2NHf_t2 z&cr*{$n{Jv2Um)R^-W=M?uv^DFN zNG)BJMYoa3O5|f~)llGd4Na54E~W4fu9k_Yl%yUS@#)kRcY_%t2@;=A*ooYO{hm8k zi8_r&Oql8B-L$1rrd4c1yJV2)LO<6`#5-Fn3-%8wZBh)m&zG?D_)y}b1|aayHBVP zVmjVIhFN8fRXogF(alsHcsKR7G|HDlS5pCVvD-XPRJIjoo3BgzT`4{Ef>Tjk*0)+# zCE88vY(}Ux#MFm)KVIV^!_0r*ZpNL8HgzXb0<1UxyvsQRVfN#pf?(jA7#i!JWLgP! zXzGGICSwiRb?~V!ZTsnBP?;QfD`-m5ItsC5tD?~4S=y5oz5NUcY`l7|!C4M=VGYud3h231irk&k$=fno z=!PL>343v2REi;StS{^fc{_^~O=w1MGe3jf)?|IdtOgl7(VERwf0ZQi+I(IKQJtA9 z?+*kADBv<;^<$3YX4aU}iqR>kGRgWSLre%6I_$&J{lB+BqD~yC%7SnrB#a!E3nkow zuFuUP@67@alQ)z0;D4n{F}5-o)NgPtW4G=8ufzgN9ryU1_j*U7<^#oFed^p14+#*j zW2J0VW%P9@InC{4NeK69ieLo+xyh`p6&9sSvXhnHBR}WNeP@LTes9kq zF3b%8AN!Otc{4=!p!Jocj9J?fOggISN<4~V%7j^D9sICwJY{l4?C>@UEVB;ISUv}n zq~#?(b93@2GIcUN&^8IBx)HKw&4J*QjesA`Q?_2&e2Ov(HW9N|!T0%-!E>}|7nWbn zN)h&5rNo!o{gRaQtU_d>*Sg&_4HC*uCCyVyAjeg8JcEJJCyIML6Lt0zpgb_~A(n42k>W@N_eB>Q=~r=CSd!)_Ob(CNJ=%1$~LObjF`ND_4R* zqTCV{ogMR#i2|#$N^!BHYB|-Tw6JMr%_;aq9NH`vlcW30f4hw&-nIH?3@>DJOUzN~ zu5>cuf6~LFHH^GM!{HI40t)c>u#3m;IVt+X<80(&0w@?+%PK-tpl&l}rokC`AMA)1 zgku}dr(m|+d?UWaG390q9|N*i=_@}4oy{aGoiK(_P>P1V+BJ_&A|kFAx+qj7W$+h! zH3oVaiuCQ{TQl!jtYA)c zKLCfEe))vjh?3rXUnX$6nK^92FpN?qRSVpc2G;w<{u|$T5j+-{Njy{Iu;KAgJES28qFliYfM4j#Z<;EV+w?d#RbQ8k0Z@LC zlEJH|YD@Oe?|l>qt75;Tcy51Nl_UZ8S$7aK3&#)@DH2dKP>4~$&SI-7Txpa*JUI?V zSxZ=D5R^E`5*clm%BvQ>qnd3%Gz!K9Mb=B|S{#^00i?Aejxz^3)Fu3e#>8<3+`^q? zVzl)OXAerdpg_9C{P;KlI6Lb=_c2qG2p3vz|^{;G0u*M1GcGV;mv9Qx>ed z7I;;$d|POr((4zysGYBBG@1@J0Sq-JKtBCW{+)%jQQ4dOH$b&&k#bGf^7gY1QW!M7 z5cr@48JsB5oCX$yVtk`RTcX??nFt`EpMwmv8Suyl$re`G&hL*yax9t0QsNP$xFM|s z9m%wc4B^fUwkOo5g+I}Pa?@rZiU@z=7ZGse9YSvqWpX*J)dg|soG3pmkTj6}2*vJ? zMovBz@%+ie>aaYjxQmQT(RX%EM5^prsS1!XDE&CrHwN(<7T|vZlcd6iZ}tzaCK4Ho z4)@qw>33*zgwJjaIhRN{fYjer&}a_9q>0Z;wu~+CDhJ7`x*r(+loM(X7YK?dcM)Ti zhF*ATrpN_pBVVL0RRn@|wKPN{frXkia6yRtq4!Qz{CYQM2?!DZM1b+9yzj@fw!F&< zT3h>c9rY5kXJ&2DCi09uV1 zA|vLJ7NXGkxr>=;rzjN>*sC5VyYD(nhy2j^iwFK-rp9EgSvb}K zM>ru#7jmiv5w2hJ90_6AiyGx@mWY|HUqshce1ea?z>1t?U;5BQGjQ8ud6J0eo6_4t z@QU|%{?^tyKrDd4w2ltx+*-MtbUp@f1G21;bzWIWQ!OOlM}a7oV*`C}Ipags%k?LP zYMD00BaS~Ld@OSnEd{J*P~q!R9tJn$dl6%dM2#&c(O-RoT0m7e7P53%arY4%{yip? zEtb&Ycj%A6V&nakBLdpOR|d&7R*jv!txaqroNe91`}D}`GTcPifXv>nUxrw}jI;W# z(UzTk8U*vp);z;Y(*_K%`k-8e8atN?enXeb6SeTQjf_VE`~5W@!X51+ZjIo;BX6ucw~p_D1Z9< z#bSEnsT#V*xaIjE%*_K)bdLC&z(joPFg)P$ERkZQGG|dQV zCf~a!l%lDabZM$Jt=rzv=STGTS@_j1>4)0?X#p~}2(ti0+U8iuk2Ppu{#x6vOrgjT zYck4-%yI+Pbe5I5{(`&>NZA>~oiYCq9E$+Ctj+LlcX&OGA)Xee>?Y+L1Lp;KjC`}w z^etMU`y-Yco_&{xuCLYQuHd|NhNTyJtk~-MV6xShR`zC)T}lm-ZedzsYSTgf$+!XL z6xlyg&PiipS57Ej#Cbb1mq5k90Mj)JF=T46m3stXJ)MRHq{5}Q$*v>@JGi_sHV59Xg%F(>f25|H(o~?(ATZ3@umO> z7<-_hQoOfz0SkW2#!9-z3}6Hx0&8$jYm&uoSgHDv?rui!7ofbYNF>aq-Z4*^J&h)d zT7)wzP#dkQzTGr`A}YzHsoYMLWrqe$HPK;EB!Plhl773UU>uqzlM&0@5rSHAFFU!Z zTGYe%dH}!OOqufnF(OG*3x0$IV}CUQ`7^^&{DT#}s-{nVR&qrc;+Aem4Llxk;qIUw zR!^71tWyl+ts-O066Dq+td@)ri^tHlEeUlJ!6shBf?;d9{PjsO)$oj-m7O9XA1TL5 zF~y1*ZkI9CSj})_adT2EG%0yoorn*`m+@Ab<`#h}(;B8Q`4@fUr{@9?&@!a2a&Pe&3m_J4EFL^YeeYFm_TM|S;T)U*~KDJ88$pXX*qj50M z5Mc~2O@dOvpOuzR#F!!_K_#W2X20CQaG|)Lpt(yRL>1kDD*-vGaxKmp%Z+2ki3V&^ zXS*MTW%|f$4FE4D*-z@MKZ^7@?em-~*5QjUE&{zw)}jg(MeTj^;$s~Rjj0Iiq=?;K3=VY{92O|adBO`x%*!Q9W>htBxqrk*p=} zRt*aPLk;lzDE~zRqCqau6%(eU{WcU;T!h7_2~$YQ$~v_~Xf?x+7^LL89z^^!nlFa1 zCO`A_!Vnd5rGyu9bhnsWvAFEh6pi_ZSCh8>_b-ost?%HQOh?Idbz)W(L2g!(8e!Y( z-Cu;3xI-10L%cb6{0cR)VuOq^rS;Ek7I2zmU+4a9@bG)_oW~{=DG)T-AVR|gL#hCM zQs>mzU(C%+Tv+hkPPMVOOuQTu!qMOCOs=)zYxmbHX(yL`=$=c-Q%$INwHid;_L zEl#(+qQl=DF zF=VnPpck5ye@NJfF|!lQ>otlF+f;aWEfW<<%G<&Q?)(b(NCSWpIzQ$c#jac1cc#A6 zH16sen|R>Wlg^vso}kzu$JTM@K%Kk!icRlML&Y&pW%J!lF2ud8-Z+v9@Tx@%G=4%tLmJ{$vwc?U?PzG zo5NTaIWHA7};5Mh&x3gAT>$ ziTy+|x=f^lKU;y@s#%U*Bt)r)*$-7wjc$b{CQ5r26)98WI*S$PZ(pTlKSLm@c?O-- zq_YRm;PZ#R&Brc>^PNR3=U95pM|RNaY{967lk>r_=~JnxQfdobjC%8AUx0bZp6RDZ|2JDpLL&UxbnZIpb#0^6w1z z5$Thu0>Mw{7ciN8%u}{a=o}|qu1Z}8Bhe-;5R1gxdD;^x0zLu(J|bLi`y`vs^pt^) zIs8k081iAZ$2Hb5$(JTmHwe3n?u$}DM?=Gf6fvmcqQ;liCOEklAXWexVg?5Rr7x1F zAoN-mCeHlf1Dvn&r1RGTG zl3*^TQr3R{RJf8P!wgg=ZIP6yRZBD{DC@o0nn75!`&W z6X;fWjTER2)}OO<3CH07YM0NF*XB;-9_EQ^gsa?H{=%A8?H z|Fy-!G%;7$-sPX==5tNlSZ?=A-uo&syO8Z+vzn5@>*2bs@dh@RfD|2zfQ6Bf(dcxy z<>cjw|Y z*D1+Fi%JYFkc=S4prQ2cG&SD@mg8wi1jYzqv==RH{lOUM@0;PiAAoL8q@mx_A;dDC z8X0oJEnuTE8Pw>m#vaUTkBxW2Jafj%DQ9iR3QKHqH7DuizIE3NbgpMi`<}8_EIF@E zSoY`h+nlRJKI(-GkH?07%v|Zz`pXLfK684L$x?XjXXkfsx<9P72AvgF!-Zk459GW* z?O!g(lj*(&OnJ}r*1u*q{jgtcyoqgF{_1zIiXL#4;W{n2o3gBk2l>N}yRvlY56K-q zOz}UQV@KDIE!%fSSq(ryq@ot$C}n%ze}~llHoDA5?@4`2l`E^N z_UkQ{GyZD+*WX8TUFP?;5QS`)?R+kW4+aMZIV_dB_k-0eC)0K5eeR#yJTA7h2m-eF z=$M5qw)#V09lLKX1(=rcPq38*J(f;UkFs0NpYVS;ZujVA3K@fy=d!g7^u13Rdl;e2VNy~ji5qYAm4#&09` zlJW=$5mJ3WNN+AXm@TtCHu`pEXL5aA7Y<2hXL<9p5oNZ2Mn5Yq+Il0iS$H@B}(*&C{rs@cu9%+r2*W6WC68e^%ky10A26W zqO08QzP>HgGu-lqE$WG}RLprFP%HiZ+AJysCuwyP4Xp;wQ778P!iK`uQIB_LEmFe? zq?5ii%(x@kH#YrcV(d9GB7R}s7`?v9vH`|%u+%;pZ;E+-^i#H;5hT&|=__mJ*k@f{ z%favq)@u!=FWIjwf*&b+f`&uF9UUD}b`7`oYmJa*kr3RV029yorf)t_`K#*zA2E-8 z!0E|KRI8!)la3qc?%u=DZ+JEAoMWcjc}Mg^$C3o%3`*F@dU|SM24aBxU-y6MwO;a{ z44Ilg{TpTGJ&VDPDxct(>1lWB&vu>WFQ6Cv$WHb+Uwhdk7w&Xj+2V7xz@Z8AMn0PH z-!1WsIv!cI%w{!xPAR1DbG5`vOoZgKwmaN^u<3Ch1>Y#?G`I}v{n{2f*dH#->u@tN zDz}mhQX7(6?h&}&is5M7>Tfq31gWf4(94g0RA- z9P&*EY6QDKG}h^g_`xw%J{OiAQv@Dcc5B2~(-6+r*~$=Q)UD79C%l0 z^&1CdNO4W5FYp#+x+OM~VlKbb9y*rtwsP*jAG$7FZ=8S~A#FP~j!krLT#VT`q2d8P zEicC;gWF->|RqLuDO5;7^Qf{#AKjP=N%Ua$;ko3cbY%34@bcPFw^nRYgx z5%&Y=*9lF-296W!TCnzE+l>14_VIjLgA`TP`yDz(BSXrNf?ilHNF5@o6RUUa#gG=@ zW(ldFmut3t`rGO7`$oyz{^q2fl__PYlbrC_Z?QRUP3FDcat+>ZAUoFBcVD|6qTHoL zQEtsGZ2H~n&~?3!oKosZKtrGc;$C-9zRfc+Ikx{B$lxfuTx(HgpSj9{Aj4H#@5}A% z?BC3mtTM%{^Yl3$$3uuYPWHaV0XH}@C4jU#j!lPi06Frn6B=hLjvJcA+h5-=Gs;LG zUZa0STghOW@Osrl{M@Z@O{e|G66BtTLCdx_n9pIx2c!G^#co;lVs=r)}H46EyIusNuVO}W`OAMJTRwDD$=#-wk*Y5i6F@9hm% z#P85O5Ye5Uf^3DAqpXH-e?)FA&elo6xYa-h zbN@4QGn(bEe#&XQ-=6+RgM)UFxP0M!MkVX4(=#^;Xsuiy zlw{`)-hW`cg^E$-|7iiAt)F6Ae|)m^D7aoEEWOWS!c`qzG3p3YDZvO%kL$OAB2YT} zY>79agt3SMYymGxBUk)%JCH2Kt;CQ+f@21#%D^|ZSL%fIA;Xp-Y$B;m+lQ!Aq=R>H zuGQ-$^eDj!C~#Gg97;Xuz|KibB@G#JTXdW?uBp_vvt(xDY#-L&;E-c{r0c#EQTuRI z)dX;Rj|6gJG!w_<#HTFU1pHGVi_R!z7|h)-oQtS3P7@CbYy_KdLG4Q2O-{|o1~3q( z@-s~77iUcd>U0Z=;6)@u&ErosmEGak;63v&D=GXzJKL4|bg&|gddMb6QP*s(5)?c( z0j;)@Q5fYHs~=*PD@KvRl1LSaNNRNXpZU^*1I3xaJp}Fm*TE6{?(R)UFs%)OP56fX zme>2=wG2ECJCWP)rnc*?JB`;{O+AS$pPR=aAkwSR+Xw-idZ6|>4DJs79&)G0C37%7 zd#C$)Enica+CLqRGDsk9hShGp=jC^pE6w?B@{eq%SIWWFrKP*qXh%cm6CKZOe{akj z@55D|GNl}K0KS=95$Gl-MaUO@>^NK*f}HB#nFXQ)B{3=4DoHcBY}cwBtCLQ;U(n7) zoSg2ft*LaM5!~e?qP$l&H-!WRfvB-sh1kWfkcTLjTS{_$uO@H&UObCJz5l?mkqrxZ zAimD@Ik=z~ou@UO0P6v{-^Ya}JpnHsC-|-^!6$>vG7JobVxk&b5(X8g{5|etlut4i zyy*d@8A-4+`B_~=xCt*vXx(RzvPi{`WVCeDF))^j&GOR}4rYxF)eTRJT^c6Q#1&D~9a2bz78$udvk`^k-+EgF5`pl2j zVd*bc*pP|@2VlJm9^}124l}qk3wGgWo?roV$0UF|(v#_>!odA(1@|`Rrr`BX`0Lar zt|haWPoEs-&BGX_*(ioG40(~#tJ59GTgIc>JOZapkb)6U4_DDlmJ29JR6>cTg>OPh z1s-rH!uOOhad;o9&9mCh^YbtnTHGFT-w@CpzCrG`;1=HpGWr3G=N{&CZuiC+R`Uso zU##XypSIgwXR>~6y9=*CS|XQ@g17q+IyKGby2@wC;=5aNASASzOsD+2w>Phm=DC^hbekmgMCI+X+ALqE&8ddt}u+t>Xf(B|0U^T|%+#(LRTt#_Dy`am=!MN({XN_Yg zMtYDO2Qr1K)n9WM4kR{}@=Wqip)p`6Kj_eYL>v2~j*lB(&c10;8Vb?&u+u+=;Ky{uMc1EI5DNhp!Av~I7QBP+K`~;H? zrGbo^_T2l1jg*Oy9NOWOGoYRYIGLX|S}t)vYlC!C?{ZQZBkNt3!mSr*>(=XQu*TLr zd02#79aj;fX%&t$1S}zyR#ItO9{bfV5(v`*M?;YKEJ>SN|9s+13+r05x3rel3ZEtO z+2v*CHqRM^M$-Rw*P9mp6AI_oFLvfz>v}Y;-D|x59J`KG@&4XVN#Z&l z29d3SPaP`QNs)6U_<5R~-jJgU3FGZOo5@Fed?y91tWX%}_~+DAx9{01AgVjZ@Q6t8o8r&ZQ4deLCXNig zB}4@$1=9Y@n2L$HFHfu%O9Oaz1Ztr}u1Fab8m!nTSlGwVHBnyG_3qA<;>NN!&=GgC zHJU%d{~lZgH_FR@8viW8#S3?)ilT#MW)$YpM|JGT1jw4PaCV?z!xfjiLC&B71++$S z4oz>!P>fOWu?!`63=^`lw5jC8Qq~~rs_K?^h;#Ka-+Wao5W0Ci^hGwRpy3;Yda?`t zOJ5TnpMS|I7vGIlqVyx~Ris*+q~S@``>-%pkXO!@`BVATnkY^&FO5MD!Ks(Tnb0SO z3dYC$T7O)5Ikqnz48&N77dm0BPXuP=5s2nf5tU(Po~6B(&64}|e>i(N>i5ag#3dyI zi+B_2bed!>w5r#f4o^nw^mzIM`QIL+S$JCljQ%peU;KW1K^J~n(E5+~ zE-2}A*uT_jRPjt`c@gpd7Wq4r%mP^hRPi6HoY{hfaK}tR>wV^8mhQ&F$e6GGCmC=b zkjJK>m-7>lXOBxOTmN>oKjcmMbw9Om=X;q!`)d-1L+{;ue}4g`=$~(WG_(8ekS5vX zD?vzsMmJkzu$mwB7!}g$yEdF@A^A`4N2bO{QIG0 zpr>KRi@zsJs4p^M

6M6q@y(oFlGP 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

p~Of#~ssX#to$FOc6 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

Smj zl3FTUD>CLxpS*-wDbLB91tfC|2_M5dJkX-?sut{!-K4hZ z(H+wyYrA$za0`V(n9o4JmT7>Wvex8|wg&B3O!DN%v;%1jzMB1191nxp$(sqvRWadK zTNjX-LHG@hi9PXT?<&peZ^ZEjj|(tiU@c(F#Agh&_{7^GQs)p=FZJeU5hO8kUdr4+ zQF{d>QBAJO)@oKYKmGlq!9qu^IODta>0rV}{}@gSUVOvs7}Z#!Z?&sbn(nz+;q4qbdW(6t(X06;$9Qq?`9^+ZsO57BFH9iy-=VmaY~fK zqud?B>NKf4@n4a#zE_-}(Vmaymra7yceY}pK2_l$mQ1|BJ=c4wdOA_7jPp{2!WBet z#cQFyQ?qzGaEa@ArwnTW_okPuB;>#o_bIZ~@ANMddET(2Da$2_+X(|46tJ_Y$)4mS z!9!zPzlSUY13u(J2JzppvCTti;lu33%HEWpy%z-Wyjbevmih&PnqUw$@(*7m&|o6U z+ti%xVw!-#M}#PFTofn_Eub5DYDWo-0R{breCoDRB`iA)$i6@_GJbIc&c^HoGxQHR zlAcXCg$eE}7%2)`2CRd6w+TUUFZMOPw9Gq_MN$I7kvhJsl!#&n1emO%t0J5YNTju9 zswWpsZWnTPSFUMo#D6RfF>=n56)Qt^4h^E)+7dZb z+o_f_3d}HIi-^iA*p$Sc-PRJNZoie0V#?kY8+buWh4cD%4kzjYCM~EVVGe1t!p9oa zffHbgZ0}VG?%twN%Iv*Zl*D^)ja?DOc=`gw1nR)Z4tN1FTs0rJejk7U(##w?j;5hE zQ%#HwonJ=*oyU>BtORvmHh%&!8-SUR#WcpjOBb|1O_}*FLc}U9Pp2!{CrLrgL3C7S z+%MTdI+Wr43CiDP!28T>pl)j1*VeIupt>F>(7<-H0+ESHML z6LHgv0*QMJF`)7Al2(zoi0(UTZEBwRyHTYgVhIGS1j*nM4Q=G`W3>>>UQLtBlo4vT z?R+tFHb>IDMZNJI7B1Pky}>ZCFf8>;R!^)Cpy3aQbJY9DU=GygR-Oe}&VA8p%pi(* z6Uz72!013GC1mPYjS3{i492e@3(~yxVk(O<+c?vkmzX6EjCeFkT-NF5cbr^^uYxrP z3Q246f|d@b9nLg=zWs@e6{wqe+r!mEJ%Jm-xwcu-#a}sLNo* zQ{*PVDE>|m-K$Hy^W2(rT1dQFEN4X!6C8myKZ1;pSubP+>s$NX{=hs=`neYwv}Je;=ev3-!q2vg!+`BJ0AD?h$sv3EQQ z`^$tY`qPoIJ$wn-wfiFqAbK0^J-u5(#_Bf;BYZ_|$#lSP+Z}K6eT1n{S;1zZieBye zD^M&b9^rf!NsR+Pd+|2a9^Ai+XBcZrT8s2%W-qKc;Pdz%-a9Z<<_k;b1?oYaNkza3 zp1P2Dkf@l~wu$t2WIswdLxlkvYfA8S(Kl3I_QZ`%-Ed zyvGWfqu!(Uq%W6IKz{X8oT)SSr8(+jW8vy_4XDNYgiFPijg0H$H)Jx1$Y5Mzub#CBZa+Xm$~Rrs(SdSfIWu2 zIJ9v)UD(gNn0Dv`mftngjpL?OR~BR!+{DTst+dYzZO-;MC3ICTsGl$4!p{AKI4Yb}u!$?Tk=#Ep2EskV24BRH+ zkd0GU09J}Pf=ov_L≫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 {6amn|Nqx0x7iN>4PwNOVu$ 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 S#RC2XLP17Vx>nLG2PKyY^nuEE_M1{mCBzDb@Z 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
+Native Windows (advanced, unsupported) + +```powershell +winget install OpenJS.NodeJS.LTS GoLang.Go Git.Git +powershell -c "irm bun.sh/install.ps1 | iex" +``` + +You will still need to work around the Unix-style scripts (e.g. run the editor, AI server, and MP sidecar separately and set `BUILD_MODE` via `$env:BUILD_MODE`). WSL2 is strongly preferred. + +
+ +### Verify + +```bash +bun --version # 1.0+ +go version # go1.21+ +node --version # v20+ +``` + +If all three print a version, you're ready for [Quick start](#quick-start). + ## What's in the box - Editor, player, runtime, behaviors, lambdas, physics, rendering, scheduler, asset loading. From b6123b1da09807658490a36d07d1221a122e749a Mon Sep 17 00:00:00 2001 From: Nitin Khanna Date: Mon, 1 Jun 2026 13:49:27 -0700 Subject: [PATCH 7/7] fix(oss): harden script import persistence Reuse duplicate model assets during batch imports and report unresolved or stalled imports instead of silently skipping them. Surface corrupt or missing persisted assets as save/load failures, stop mirroring large scene drafts into localStorage, and keep focused tests/playwright diagnostics with the change. --- .../packages/editor-oss/src/EngineRuntime.ts | 6 +- .../script-tool/ImportBatchDialog.test.ts | 69 ++++ .../agent/script-tool/ImportBatchDialog.ts | 11 +- .../src/agent/script-tool/builtins.ts | 6 +- .../src/agent/script-tool/importHandler.ts | 60 +++- .../src/behaviors/game/GameManager.ts | 12 +- .../src/controls/input/InputManager.ts | 3 +- .../v2/AiCopilot/TerminalView/useTerminal.ts | 334 +++++++++++------- .../v2/AiCopilot/workspaceChatSnapshot.ts | 54 ++- .../BehaviorCreator/hooks/useBehaviorSave.ts | 52 +++ .../copilotPreviewDraftStorage.test.ts | 21 +- .../copilotPreviewDraftStorage.ts | 59 ++-- .../AssetsTab/AssetsRows/AssetsRows.tsx | 22 +- .../BehaviorObjectSettingsApplier.test.ts | 27 ++ .../BehaviorObjectSettingsApplier.ts | 13 +- .../editor-oss/src/editor/behaviors/util.ts | 12 + .../editor-oss/src/event/AutoSaveEvent.js | 87 +---- .../FileSystemProjectStore.test.ts | 86 ++++- .../src/persistence/FileSystemProjectStore.ts | 64 +++- .../src/persistence/ossSceneSave.test.ts | 32 +- .../src/persistence/ossSceneSave.ts | 78 ++-- ...1-import-dedup-and-localstorage-hygiene.md | 78 ++++ ...6-06-01-no-masking-fallbacks-playground.md | 144 ++++++++ .../diag-pirate-import-progress.mjs | 144 ++++++++ .../playwright/oss-import-fallback-verify.mjs | 231 ++++++++++++ .../playwright/oss-pirate-ship-playground.mjs | 75 +++- 26 files changed, 1428 insertions(+), 352 deletions(-) create mode 100644 client/packages/editor-oss/src/agent/script-tool/ImportBatchDialog.test.ts create mode 100644 docs/planning/2026-06-01-import-dedup-and-localstorage-hygiene.md create mode 100644 docs/planning/2026-06-01-no-masking-fallbacks-playground.md create mode 100644 scripts/playwright/diag-pirate-import-progress.mjs create mode 100644 scripts/playwright/oss-import-fallback-verify.mjs diff --git a/client/packages/editor-oss/src/EngineRuntime.ts b/client/packages/editor-oss/src/EngineRuntime.ts index 7a1d3f32..8a9c3050 100644 --- a/client/packages/editor-oss/src/EngineRuntime.ts +++ b/client/packages/editor-oss/src/EngineRuntime.ts @@ -285,7 +285,11 @@ export class EngineRuntime extends AppRuntime implements RuntimeContext { global.app = this; global.three$1 = THREE; - + // TEMP debug: mirror the engine onto window so it can be inspected from + // the browser console (`global` is a module export, not window.app). + // Lets us read e.g. `app.scene.userData._matchStarted`. Remove later. + (window as unknown as {app?: unknown}).app = this; + this.viewport = undefined; this.width = this.container.clientWidth; this.height = this.container.clientHeight; diff --git a/client/packages/editor-oss/src/agent/script-tool/ImportBatchDialog.test.ts b/client/packages/editor-oss/src/agent/script-tool/ImportBatchDialog.test.ts new file mode 100644 index 00000000..b4f8d3e4 --- /dev/null +++ b/client/packages/editor-oss/src/agent/script-tool/ImportBatchDialog.test.ts @@ -0,0 +1,69 @@ +// @vitest-environment jsdom +import {describe, expect, it} from "vitest"; + +import {autoResolveImports, findByFilepath} from "./ImportBatchDialog"; +import type {ImportRequest} from "./ScriptExecutor"; + +/** Build a File whose webkitRelativePath encodes a subfolder path. */ +const fileAt = (relPath: string, bytes = "x"): File => { + const name = relPath.split("/").pop()!; + const f = new File([bytes], name, {type: "application/octet-stream"}); + Object.defineProperty(f, "webkitRelativePath", {value: relPath, configurable: true}); + return f; +}; + +const imageReq = (index: number, filepath: string, name: string): ImportRequest => ({ + index, + type: "image", + name, + filepath, + extensions: [".png", ".jpg", ".jpeg", ".webp"], +}); + +describe("autoResolveImports — explicit filepath resolution", () => { + it("resolves a filepath whose file has a NON-STANDARD extension (regression)", () => { + // Repro of the pirate-ship hang: a generator emitted duplicate textures + // as `PIR_Water.png-2 … -5`. Those filenames end in `.png-2`, not a known + // image extension. The resolver used to filter candidates by extension + // BEFORE matching the filepath, dropping these files → the import stayed + // "unresolved" → the blocking batch-import dialog opened → headless runs + // hung forever. An explicit filepath must resolve regardless of ext. + const folder = [ + fileAt("textures/PIR_Water.png"), + fileAt("textures/PIR_Water.png-2"), + fileAt("textures/PIR_Water.png-3"), + fileAt("textures/PIR_Water.png-4"), + fileAt("textures/PIR_Water.png-5"), + ]; + const imports: ImportRequest[] = [ + imageReq(0, "textures/PIR_Water.png", "PIR_Water.png"), + imageReq(1, "textures/PIR_Water.png-2", "PIR_Water.png 2"), + imageReq(2, "textures/PIR_Water.png-3", "PIR_Water.png 3"), + imageReq(3, "textures/PIR_Water.png-4", "PIR_Water.png 4"), + imageReq(4, "textures/PIR_Water.png-5", "PIR_Water.png 5"), + ]; + + const {files} = autoResolveImports(imports, folder); + + // EVERY import resolves — nothing is left for the dialog. + expect(files.size).toBe(5); + expect(files.get(1)?.name).toBe("PIR_Water.png-2"); + expect(files.get(4)?.name).toBe("PIR_Water.png-5"); + }); + + it("findByFilepath matches an odd-extension file by exact basename", () => { + const folder = [fileAt("textures/PIR_Water.png-2")]; + expect(findByFilepath(folder, "textures/PIR_Water.png-2")?.name).toBe("PIR_Water.png-2"); + }); + + it("still resolves normal model filepaths and reuses one file for several imports", () => { + // Four wheels all reference the one wheel.glb. + const folder = [fileAt("models/wheel.glb")]; + const wheel = (i: number): ImportRequest => ({ + index: i, type: "model", name: `wheel ${i}`, filepath: "models/wheel.glb", extensions: [".glb", ".gltf", ".fbx"], + }); + const {files} = autoResolveImports([wheel(0), wheel(1), wheel(2), wheel(3)], folder); + expect(files.size).toBe(4); + expect([...files.values()].every(f => f.name === "wheel.glb")).toBe(true); + }); +}); diff --git a/client/packages/editor-oss/src/agent/script-tool/ImportBatchDialog.ts b/client/packages/editor-oss/src/agent/script-tool/ImportBatchDialog.ts index e2aa0844..89a335bc 100644 --- a/client/packages/editor-oss/src/agent/script-tool/ImportBatchDialog.ts +++ b/client/packages/editor-oss/src/agent/script-tool/ImportBatchDialog.ts @@ -69,7 +69,16 @@ export function autoResolveImports( // hung headless / automated imports. So resolve filepath against the // full file list, not the claimed-filtered subset. if (req.filepath) { - match = findByFilepath(folderFiles.filter(extOf), req.filepath); + // Match an explicit filepath against the FULL file list, not the + // extension-filtered subset. A generator can emit a source file + // whose name carries a non-standard extension — e.g. duplicate + // textures saved as `PIR_Water.png-2`, `…-3`. Gating filepath + // resolution by `extOf` silently drops those files, leaving the + // import "unresolved", which pops the blocking batch-import dialog + // and hangs any headless/automated run forever (no user to click). + // The explicit filepath is already precise (exact path / basename), + // so it does not need — and is actively harmed by — the ext guard. + match = findByFilepath(folderFiles, req.filepath); } if (!match) { diff --git a/client/packages/editor-oss/src/agent/script-tool/builtins.ts b/client/packages/editor-oss/src/agent/script-tool/builtins.ts index 9843edbf..619e06d5 100644 --- a/client/packages/editor-oss/src/agent/script-tool/builtins.ts +++ b/client/packages/editor-oss/src/agent/script-tool/builtins.ts @@ -24,8 +24,10 @@ export interface BuiltinContext { commandBuffer: string[]; /** Callback to clear terminal output */ clearOutput: () => void; - /** Callback to run a .stemscript file, optionally with folder files for auto-resolve */ - runScript?: (content: string, folderFiles?: File[]) => Promise; + /** Callback to run a .stemscript file, optionally with folder files for auto-resolve. + * Resolves to a run summary (`{executedCommands, successCount, failCount}`) or + * `undefined` for early-return paths (cancelled / no imports). */ + runScript?: (content: string, folderFiles?: File[]) => Promise<{executedCommands: number; successCount: number; failCount: number} | undefined>; /** Last script executed through the terminal, if any */ getLastScript?: () => {content: string; label?: string} | null; /** Callback to validate a script against current scene state */ diff --git a/client/packages/editor-oss/src/agent/script-tool/importHandler.ts b/client/packages/editor-oss/src/agent/script-tool/importHandler.ts index f922bde4..f755c0b6 100644 --- a/client/packages/editor-oss/src/agent/script-tool/importHandler.ts +++ b/client/packages/editor-oss/src/agent/script-tool/importHandler.ts @@ -265,6 +265,14 @@ export function getSupportedImportTypes(): string[] { * @param name * @param companionFiles */ +/** Hex SHA-256 of a byte buffer, used to content-address imported model files. */ +async function sha256Hex(buffer: ArrayBuffer): Promise { + const digest = await crypto.subtle.digest("SHA-256", buffer); + return Array.from(new Uint8Array(digest)) + .map(b => b.toString(16).padStart(2, "0")) + .join(""); +} + export async function processImportedFile( file: File, type: string, @@ -279,6 +287,16 @@ export async function processImportedFile( * the behavior is imported but never attached to any object. */ behaviorIdOverride?: string, + /** + * Run-scoped cache keyed by source-file content hash → the asset created for + * it. A stemscript that places the same model many times (e.g. pirate-ship's + * 77 `import model … filepath=models/rocks-a.glb`) otherwise creates a fresh + * multi-MB inline asset per placement. With this cache, identical source + * bytes import once and every later placement reuses that one asset (a new + * scene object still gets created per placement). Pass the same Map for an + * entire import batch; omit it for one-off imports. + */ + modelAssetDedupCache?: Map, ): Promise<{success: boolean; message: string}> { // Dynamic imports to keep module resolution lightweight for tests const [{default: global}, {setAssetRevision, resolveAssetRevisionId, getAssetResolutionContext}, {AssetType, ModelFormat, createAssetRevisionWithData, isNoChangesError, getAsset}, {createAsset}] = await Promise.all([ @@ -339,8 +357,19 @@ export async function processImportedFile( let headRevisionId: string; try { headRevisionId = (await getAsset(assetId)).headRevisionId; - } catch { - // Fall back to scene-pinned revision if getAsset fails + } catch (err) { + // We matched this asset in the scene's behavior configs, so + // it exists — a getAsset failure here is unexpected. Falling + // back to the scene-pinned revision silently risks building + // a revision on a STALE parent (the merge-on-stale path can + // then drop the user's first edit). Surface it loudly; the + // pinned revision is only a last resort, not a quiet default. + console.error( + `[ScriptImport] getAsset("${assetId}") failed while resolving HEAD for ` + + `behavior "${config.name}"; falling back to scene-pinned revision. ` + + `A stale parent here can drop the next edit.`, + err, + ); const context = getAssetResolutionContext(scene); headRevisionId = (context ? resolveAssetRevisionId(assetId, context) : undefined) as string; } @@ -528,6 +557,30 @@ export async function processImportedFile( return {success: true, message: `Model "${modelName}" already in scene, skipping re-import`}; } + // Content-addressed dedup. If an identical source file was already + // imported in this batch, reuse that asset and just place a new + // scene object — skipping the whole load/convert/texture-bake + // pipeline AND avoiding a duplicate multi-MB inline asset. + let srcHash: string | undefined; + if (modelAssetDedupCache) { + try { + srcHash = await sha256Hex(await file.arrayBuffer()); + } catch { + srcHash = undefined; // crypto unavailable — fall through to a normal import + } + const cached = srcHash ? modelAssetDedupCache.get(srcHash) : undefined; + if (cached) { + setAssetRevision(scene, cached.id, cached.headRevisionId); + const {loadModel} = await import("../../model/load-util"); + const context = scene.userData?.assetResolutionContext || {}; + const object = await loadModel(cached.id, context); + if (name) object.name = name; + editor.addObject(object); + app?.call("objectChanged", null, scene); + return {success: true, message: `Model "${modelName}" placed (reused shared asset ${cached.id})`}; + } + } + const abortController = new AbortController(); const abortSignal = abortController.signal; @@ -622,6 +675,9 @@ export async function processImportedFile( lods: modelLods, thumbnail: thumbnailParam, }); + if (modelAssetDedupCache && srcHash) { + modelAssetDedupCache.set(srcHash, {id: asset.id, headRevisionId: asset.headRevisionId}); + } setAssetRevision(scene, asset.id, asset.headRevisionId); const {loadModel} = await import("../../model/load-util"); const context = scene.userData?.assetResolutionContext || {}; diff --git a/client/packages/editor-oss/src/behaviors/game/GameManager.ts b/client/packages/editor-oss/src/behaviors/game/GameManager.ts index 0bd39d3d..db15ce61 100644 --- a/client/packages/editor-oss/src/behaviors/game/GameManager.ts +++ b/client/packages/editor-oss/src/behaviors/game/GameManager.ts @@ -860,7 +860,7 @@ class GameManager { const promises: Promise[] = []; for (const behavior of behaviors) { const target = behaviorToTargetMap.get(behavior.uuid)!; - console.log( + console.debug( `[GameManager] About to add behavior "${behavior.id}" (uuid: ${behavior.uuid}) to object "${target.name}" (uuid: ${target.uuid})`, ); @@ -871,7 +871,7 @@ class GameManager { }; const promise = this.addBehaviorToObject(target, behavior.id, options) .then(() => { - console.log( + console.debug( `[GameManager] ✓ Successfully added behavior "${behavior.id}" to object "${target.name}"`, ); }) @@ -1504,7 +1504,7 @@ class GameManager { behaviorId: string, behaviorOptions?: CreateBehaviorOptions, ): Promise { - console.log( + console.debug( `[GameManager] addBehaviorToObject called with behaviorId: "${behaviorId}", target: "${target.name || target.uuid}", options:`, behaviorOptions, ); @@ -1540,7 +1540,7 @@ class GameManager { } } - console.log(`[GameManager] BehaviorManager exists, calling createBehavior for "${behaviorKey}"`); + console.debug(`[GameManager] BehaviorManager exists, calling createBehavior for "${behaviorKey}"`); const behavior = await this.behaviorManager.createBehavior(target, behaviorKey, behaviorOptions); if (!behavior) { @@ -1549,7 +1549,7 @@ class GameManager { return Promise.reject(error); } - console.log( + console.debug( `[GameManager] Successfully created behavior "${behaviorKey}" for object "${target.name || target.uuid}"`, ); @@ -1557,7 +1557,7 @@ class GameManager { const enableAtStart = typeof target.userData.enableAtStart === "boolean" ? target.userData.enableAtStart : true; // default to true if not set - console.log(`[GameManager] Object "${target.name || target.uuid}" enableAtStart: ${enableAtStart}`); + console.debug(`[GameManager] Object "${target.name || target.uuid}" enableAtStart: ${enableAtStart}`); if (!enableAtStart) { this.pauseObject(target, false); // Pause behaviors without cascading to children } diff --git a/client/packages/editor-oss/src/controls/input/InputManager.ts b/client/packages/editor-oss/src/controls/input/InputManager.ts index a255f660..c41bae2e 100644 --- a/client/packages/editor-oss/src/controls/input/InputManager.ts +++ b/client/packages/editor-oss/src/controls/input/InputManager.ts @@ -275,7 +275,8 @@ export class InputManager implements InputProv */ getMotion(motionId: Motion): number { const motion = this.motions.get(motionId); - return motion ? motion.value + motion.delta : 0; + const value = motion ? motion.value + motion.delta : 0; + return value; } getVirtualDispatcher(): VirtualInputDispatcher { diff --git a/client/packages/editor-oss/src/editor/assets/v2/AiCopilot/TerminalView/useTerminal.ts b/client/packages/editor-oss/src/editor/assets/v2/AiCopilot/TerminalView/useTerminal.ts index 36affb43..15b9c5c5 100644 --- a/client/packages/editor-oss/src/editor/assets/v2/AiCopilot/TerminalView/useTerminal.ts +++ b/client/packages/editor-oss/src/editor/assets/v2/AiCopilot/TerminalView/useTerminal.ts @@ -45,6 +45,52 @@ const CONTENT_TYPE_BY_EXT: Record = { const getEngineRuntime = (): EngineRuntime | undefined => global.app as EngineRuntime | undefined; +/** + * Per-import safety ceiling. A single asset/behavior import that stalls + * indefinitely would hang the entire stemscript run with no surfaced error. + * Generous enough that a heavy model (FBX → GLB conversion + texture bake) or a + * behavior revision completes well within it; short enough that a true hang + * fails the run in seconds, not the 20-minute outer ceiling. + */ +const IMPORT_STEP_TIMEOUT_MS = 90_000; + +/** + * Race a single import against {@link IMPORT_STEP_TIMEOUT_MS}. On timeout, the + * import is reported as a failed result (so the run's failCount reflects it and + * the named culprit is logged) and the loop continues with the next import — + * the run never silently spins forever on one stuck import. + */ +async function withImportTimeout( + work: Promise<{success: boolean; message: string}>, + label: string, +): Promise<{success: boolean; message: string}> { + let timer: ReturnType | undefined; + const timeout = new Promise<{success: boolean; message: string}>(resolve => { + timer = setTimeout(() => { + const message = `Import "${label}" timed out after ${IMPORT_STEP_TIMEOUT_MS}ms — skipped so the run can continue. This import hangs; it needs investigation.`; + console.error(`[import-timeout] ${message}`); + resolve({success: false, message}); + }, IMPORT_STEP_TIMEOUT_MS); + }); + try { + return await Promise.race([work, timeout]); + } finally { + if (timer) clearTimeout(timer); + } +} + +/** + * Programmatic result of a full `runScript` pass. `failCount > 0` means at + * least one command (including an unresolved import) failed — the run was NOT + * clean. Surfaced through `window.__stemRunScript` so a test harness can assert + * a complete, error-free import instead of inferring it from console scraping. + */ +export type ScriptRunSummary = { + executedCommands: number; + successCount: number; + failCount: number; +}; + type SceneAuditObject = { visible?: boolean; parent?: SceneAuditObject | null; @@ -247,6 +293,9 @@ export function useTerminal(onExit: () => void, options: UseTerminalOptions = {} return aFirst - bFirst; }); const results = new Map(); + // One dedup cache for the whole batch: identical model source files + // import once and every later placement reuses that shared asset. + const modelAssetDedupCache = new Map(); for (const req of sorted) { const file = files.get(req.index); if (file && hasEditorContext) { @@ -256,8 +305,33 @@ export function useTerminal(onExit: () => void, options: UseTerminalOptions = {} const behaviorIdOverride = req.type === "behavior" && req.filepath ? behaviorIdByFilepath?.get(req.filepath) : undefined; - const result = await processImportedFile(file, req.type, req.name, companions, behaviorIdOverride); + // A single import must never be able to hang the whole run. A + // never-resolving await inside processImportedFile (e.g. a + // behavior revision call that stalls) would otherwise spin + // forever with no error — the exact "failure that never + // surfaces" we forbid. Bound each import and, on timeout, + // surface it as a named failure and move on to the next. + const result = await withImportTimeout( + processImportedFile(file, req.type, req.name, companions, behaviorIdOverride, modelAssetDedupCache), + `${req.type} "${label}"`, + ); results.set(req.index, result); + } else { + // Previously this branch dropped the import silently — that is how + // raw-glb imports outside the asset folder (e.g. pirate-ship's + // skybox_day.glb at models/skybox_day.glb) disappeared with no + // trace in the scene or the logs. Surface the skip + its reason. + const label = req.name || req.filepath || `${req.type} #${req.index}`; + const reason = !hasEditorContext + ? "no active editor/asset context" + : "no source file resolved (filepath not matched in the imported folder)"; + console.warn(`[import-skip] Skipped "${label}" (${req.type}) — ${reason}`, { + index: req.index, + filepath: req.filepath, + url: req.url, + }); + addEntry(`import ${req.type} ${label}`, `Skipped: ${reason}`, "error"); + results.set(req.index, {success: false, message: `Skipped: ${reason}`}); } } return results; @@ -300,73 +374,100 @@ export function useTerminal(onExit: () => void, options: UseTerminalOptions = {} // The full runScript flow; exposed below on `window.__stemRunScript` in // OSS dev so a Playwright test can drive the `exec` pipeline without // going through the OS file picker. - const runScript = useCallback(async (content: string, folderFiles?: File[]) => { + const runScript = useCallback(async (content: string, folderFiles?: File[]): Promise => { let scriptExecutionFinished = false; + let runSummary: ScriptRunSummary | undefined; - // Show persistent toasts for proxy requirements - const proxyRequirements = ScriptExecutor.extractProxyRequirements(content); - for (const req of proxyRequirements) { - const label = req.comment || req.alias; - showToast({ - type: "info", - title: `Proxy required: ${label}`, - body: `Route "${req.alias}" → ${req.destination}`, - duration: 30000, - }); - } + // Persistent spinner toast for the *entire* import — asset resolution + // (which is the slow part: models are fetched and baked here) through + // command execution and the trailing auto-save. Created up front and + // dismissed in the single `finally` below so the user always has + // feedback that an import is in progress; every early-return path + // (cancelled dialog, no imports) flows through that same `finally`. + const importSpinnerId = showLoadingToast("Importing scene…", "Loading assets & running stemscript…"); - // Pre-scan for imports and show batch dialog if any found - const importRequests = ScriptExecutor.extractImports(content); - - // Pre-resolve URL-based imports (export-mode bundles) by fetching each - // URL into a File. These go into the resolved map *before* the batch - // dialog / folder auto-resolve, so the user never has to hand-pick a - // file for an asset whose URL is already known. - const urlResolved = new Map(); - const urlFailures: {req: typeof importRequests[number]; message: string}[] = []; - for (const req of importRequests) { - if (!req.url) continue; - try { - const response = await fetch(req.url); - if (!response.ok) { - urlFailures.push({req, message: `HTTP ${response.status}`}); - continue; + try { + // Show persistent toasts for proxy requirements + const proxyRequirements = ScriptExecutor.extractProxyRequirements(content); + for (const req of proxyRequirements) { + const label = req.comment || req.alias; + showToast({ + type: "info", + title: `Proxy required: ${label}`, + body: `Route "${req.alias}" → ${req.destination}`, + duration: 30000, + }); + } + + // Pre-scan for imports and show batch dialog if any found + const importRequests = ScriptExecutor.extractImports(content); + + // Pre-resolve URL-based imports (export-mode bundles) by fetching each + // URL into a File. These go into the resolved map *before* the batch + // dialog / folder auto-resolve, so the user never has to hand-pick a + // file for an asset whose URL is already known. + const urlResolved = new Map(); + const urlFailures: {req: typeof importRequests[number]; message: string}[] = []; + for (const req of importRequests) { + if (!req.url) continue; + try { + const response = await fetch(req.url); + if (!response.ok) { + urlFailures.push({req, message: `HTTP ${response.status}`}); + continue; + } + const blob = await response.blob(); + const filename = filenameForUrlImport(req.url, req.type, req.name); + const file = new File([blob], filename, {type: blob.type || inferContentType(filename)}); + urlResolved.set(req.index, file); + } catch (err: unknown) { + urlFailures.push({req, message: err instanceof Error ? err.message : String(err)}); } - const blob = await response.blob(); - const filename = filenameForUrlImport(req.url, req.type, req.name); - const file = new File([blob], filename, {type: blob.type || inferContentType(filename)}); - urlResolved.set(req.index, file); - } catch (err: unknown) { - urlFailures.push({req, message: err instanceof Error ? err.message : String(err)}); } - } - for (const failure of urlFailures) { - const label = failure.req.name || failure.req.type; - addEntry( - `(prefetch)`, - `Failed to fetch asset URL for ${label}: ${failure.message}`, - "error", - ); - } + for (const failure of urlFailures) { + const label = failure.req.name || failure.req.type; + addEntry( + `(prefetch)`, + `Failed to fetch asset URL for ${label}: ${failure.message}`, + "error", + ); + } - if (importRequests.length > 0) { - let resolvedFiles: Map = new Map(urlResolved); - let resolvedCompanions: Map = new Map(); - // Imports still needing a source (neither a URL we could fetch nor - // pre-picked) — these feed into folder auto-resolve / dialog. - const unresolvedRequests = importRequests.filter(r => !resolvedFiles.has(r.index)); - - if (unresolvedRequests.length === 0) { - // All imports resolved from URLs. Skip folder/dialog entirely. - } else if (folderFiles && folderFiles.length > 0) { - // Auto-resolve imports from the folder - const autoResult: AutoResolveResult = autoResolveImports(unresolvedRequests, folderFiles); - for (const [idx, file] of autoResult.files) resolvedFiles.set(idx, file); - for (const [idx, comps] of autoResult.companionFiles) resolvedCompanions.set(idx, comps); - const stillUnresolved = unresolvedRequests.filter(r => !resolvedFiles.has(r.index)); - - if (stillUnresolved.length > 0) { - const dialogResult = await showBatchImportDialog(unresolvedRequests, autoResult); + if (importRequests.length > 0) { + let resolvedFiles: Map = new Map(urlResolved); + let resolvedCompanions: Map = new Map(); + // Imports still needing a source (neither a URL we could fetch nor + // pre-picked) — these feed into folder auto-resolve / dialog. + const unresolvedRequests = importRequests.filter(r => !resolvedFiles.has(r.index)); + + if (unresolvedRequests.length === 0) { + // All imports resolved from URLs. Skip folder/dialog entirely. + } else if (folderFiles && folderFiles.length > 0) { + // Auto-resolve imports from the folder + const autoResult: AutoResolveResult = autoResolveImports(unresolvedRequests, folderFiles); + for (const [idx, file] of autoResult.files) resolvedFiles.set(idx, file); + for (const [idx, comps] of autoResult.companionFiles) resolvedCompanions.set(idx, comps); + const stillUnresolved = unresolvedRequests.filter(r => !resolvedFiles.has(r.index)); + + if (stillUnresolved.length > 0) { + const dialogResult = await showBatchImportDialog(unresolvedRequests, autoResult); + if (dialogResult.action === "cancel") { + addEntry("(script)", "Script execution cancelled.", "info"); + return; + } + if (dialogResult.action === "import" && dialogResult.files.size > 0) { + for (const [idx, file] of dialogResult.files) resolvedFiles.set(idx, file); + for (const [idx, comps] of dialogResult.companionFiles) resolvedCompanions.set(idx, comps); + } else { + importResultsRef.current = new Map(); + importCounterRef.current = 0; + resolvedFiles = new Map(); + resolvedCompanions = new Map(); + } + } + } else { + // No folder files — dialog for the unresolved ones. + const dialogResult = await showBatchImportDialog(unresolvedRequests); if (dialogResult.action === "cancel") { addEntry("(script)", "Script execution cancelled.", "info"); return; @@ -381,78 +482,44 @@ export function useTerminal(onExit: () => void, options: UseTerminalOptions = {} resolvedCompanions = new Map(); } } - } else { - // No folder files — dialog for the unresolved ones. - const dialogResult = await showBatchImportDialog(unresolvedRequests); - if (dialogResult.action === "cancel") { - addEntry("(script)", "Script execution cancelled.", "info"); - return; - } - if (dialogResult.action === "import" && dialogResult.files.size > 0) { - for (const [idx, file] of dialogResult.files) resolvedFiles.set(idx, file); - for (const [idx, comps] of dialogResult.companionFiles) resolvedCompanions.set(idx, comps); - } else { + + if (resolvedFiles.size > 0) { + const behaviorIdByFilepath = await buildBehaviorIdMap(folderFiles); + const results = await processResolvedImports( + importRequests, resolvedFiles, resolvedCompanions, behaviorIdByFilepath, + ); + importResultsRef.current = results; + importCounterRef.current = 0; + } else if (!importResultsRef.current) { importResultsRef.current = new Map(); importCounterRef.current = 0; - resolvedFiles = new Map(); - resolvedCompanions = new Map(); } } - if (resolvedFiles.size > 0) { - const behaviorIdByFilepath = await buildBehaviorIdMap(folderFiles); - const results = await processResolvedImports( - importRequests, resolvedFiles, resolvedCompanions, behaviorIdByFilepath, - ); - importResultsRef.current = results; - importCounterRef.current = 0; - } else if (!importResultsRef.current) { - importResultsRef.current = new Map(); - importCounterRef.current = 0; - } - } - - // All import-resolution and cancellation paths above have already - // returned. Wipe previously-imported content now so the script runs - // against the same blank-scene baseline every time. Wrapping the - // execute() call in runInScriptImportContext tags every object the - // script adds with userData.isImported, which the next exec uses to - // wipe these same objects again. - const editor = getEngineRuntime()?.editor; - if (editor) { - try { - editor.clearImportedContent(); - } catch (error: unknown) { - const message = error instanceof Error ? error.message : String(error); - addEntry("(script)", `Pre-exec wipe failed (continuing): ${message}`, "error"); + // All import-resolution and cancellation paths above have already + // returned. Wipe previously-imported content now so the script runs + // against the same blank-scene baseline every time. Wrapping the + // execute() call in runInScriptImportContext tags every object the + // script adds with userData.isImported, which the next exec uses to + // wipe these same objects again. + const editor = getEngineRuntime()?.editor; + if (editor) { + try { + editor.clearImportedContent(); + } catch (error: unknown) { + const message = error instanceof Error ? error.message : String(error); + addEntry("(script)", `Pre-exec wipe failed (continuing): ${message}`, "error"); + } } - } - - // Persistent spinner toast for the duration of execution + auto-save, so - // the user has feedback while the stemscript runs (imports can take a - // while). Dismissed in the `finally` below — no auto-dismiss. - const importSpinnerId = showLoadingToast("Importing scene…", "Running stemscript…"); - try { + const onProgress = (current: number, total: number, line: string) => { + addEntry(line, `Executing ${current}/${total}...`, "info"); + }; const result = editor ? await editor.runInScriptImportContext(() => - ScriptExecutor.execute( - content, - executeRegistryCommand, - (current: number, total: number, line: string) => { - addEntry(line, `Executing ${current}/${total}...`, "info"); - }, - executeScriptBuiltin, - ), + ScriptExecutor.execute(content, executeRegistryCommand, onProgress, executeScriptBuiltin), ) - : await ScriptExecutor.execute( - content, - executeRegistryCommand, - (current: number, total: number, line: string) => { - addEntry(line, `Executing ${current}/${total}...`, "info"); - }, - executeScriptBuiltin, - ); + : await ScriptExecutor.execute(content, executeRegistryCommand, onProgress, executeScriptBuiltin); const summary = `Script complete: ${result.successCount}/${result.executedCommands} succeeded, ${result.failCount} failed`; addEntry("(script)", summary, result.failCount > 0 ? "error" : "success"); @@ -467,6 +534,15 @@ export function useTerminal(onExit: () => void, options: UseTerminalOptions = {} } scriptExecutionFinished = true; + // Programmatic summary so a harness (window.__stemRunScript) can + // assert the run was actually clean — failCount > 0 includes any + // import that could not be resolved (e.g. a skybox file the folder + // didn't supply). An incomplete import must never look successful. + runSummary = { + executedCommands: result.executedCommands, + successCount: result.successCount, + failCount: result.failCount, + }; } finally { if (scriptExecutionFinished) { try { @@ -485,6 +561,7 @@ export function useTerminal(onExit: () => void, options: UseTerminalOptions = {} importResultsRef.current = null; importCounterRef.current = 0; } + return runSummary; }, [executeRegistryCommand, addEntry, executeScriptBuiltin, processResolvedImports, buildBehaviorIdMap]); const executeInput = useCallback(async (input: string): Promise => { @@ -590,7 +667,7 @@ export function useTerminal(onExit: () => void, options: UseTerminalOptions = {} __stemRunScript?: ( content: string, files?: Array<{name: string; mime?: string; data: string}>, - ) => Promise; + ) => Promise; }; w.__stemRunScript = async (content, files) => { console.log("[__stemRunScript] start", {scriptBytes: content.length, fileCount: (files ?? []).length}); @@ -634,13 +711,14 @@ export function useTerminal(onExit: () => void, options: UseTerminalOptions = {} // before every asset is created (a partial import). const HARD_TIMEOUT_MS = 1_200_000; try { - await Promise.race([ + const summary = await Promise.race([ runScript(content, folderFiles), - new Promise((_, reject) => + new Promise((_, reject) => setTimeout(() => reject(new Error(`__stemRunScript timed out after ${HARD_TIMEOUT_MS}ms`)), HARD_TIMEOUT_MS), ), ]); - console.log("[__stemRunScript] done"); + console.log("[__stemRunScript] done", summary); + return summary; } catch (err) { console.error("[__stemRunScript] threw", err); throw err; diff --git a/client/packages/editor-oss/src/editor/assets/v2/AiCopilot/workspaceChatSnapshot.ts b/client/packages/editor-oss/src/editor/assets/v2/AiCopilot/workspaceChatSnapshot.ts index 95c6484d..26e486fd 100644 --- a/client/packages/editor-oss/src/editor/assets/v2/AiCopilot/workspaceChatSnapshot.ts +++ b/client/packages/editor-oss/src/editor/assets/v2/AiCopilot/workspaceChatSnapshot.ts @@ -78,9 +78,18 @@ const writeSnapshot = (snapshot: StoredWorkspaceChatSnapshot) => { if (typeof window === "undefined") return; try { const serialized = JSON.stringify(snapshot); - window.localStorage.setItem(storageKey(snapshot.sceneID), serialized); if (snapshot.sessionID) { + // Full snapshot under the session key; `:latest` holds only a tiny + // pointer to the most recent session — not a second copy of the + // (up to ~1.6MB) blob, which is what previously doubled this cache. window.localStorage.setItem(storageKey(snapshot.sceneID, snapshot.sessionID), serialized); + window.localStorage.setItem( + storageKey(snapshot.sceneID), + JSON.stringify({latestSessionID: snapshot.sessionID}), + ); + } else { + // No session: the `:latest` key holds the snapshot itself. + window.localStorage.setItem(storageKey(snapshot.sceneID), serialized); } } catch (error) { console.warn("[workspaceChatSnapshot] Failed to write workspace chat snapshot:", error); @@ -109,19 +118,10 @@ export const saveWorkspaceChatSnapshot = (input: { }); }; -export const readWorkspaceChatSnapshot = ( - sceneID: string | null | undefined, - sessionID?: string | null, -): WorkspaceChatSnapshot | null => { - const normalizedSceneID = sceneID?.trim(); - if (!normalizedSceneID || typeof window === "undefined") return null; - - const raw = window.localStorage.getItem(storageKey(normalizedSceneID, sessionID)); - if (!raw) return null; - +const parseSnapshot = (raw: string, sceneID: string): WorkspaceChatSnapshot | null => { try { const parsed = JSON.parse(raw) as Partial; - if (parsed.sceneID !== normalizedSceneID) return null; + if (parsed.sceneID !== sceneID) return null; const messages = Array.isArray(parsed.messages) ? parsed.messages @@ -131,7 +131,7 @@ export const readWorkspaceChatSnapshot = ( if (messages.length === 0) return null; return { - sceneID: normalizedSceneID, + sceneID, sessionID: typeof parsed.sessionID === "string" ? parsed.sessionID : null, updatedAt: typeof parsed.updatedAt === "number" ? parsed.updatedAt : 0, messages, @@ -141,3 +141,31 @@ export const readWorkspaceChatSnapshot = ( return null; } }; + +export const readWorkspaceChatSnapshot = ( + sceneID: string | null | undefined, + sessionID?: string | null, +): WorkspaceChatSnapshot | null => { + const normalizedSceneID = sceneID?.trim(); + if (!normalizedSceneID || typeof window === "undefined") return null; + + if (sessionID) { + const raw = window.localStorage.getItem(storageKey(normalizedSceneID, sessionID)); + return raw ? parseSnapshot(raw, normalizedSceneID) : null; + } + + // No session requested: `:latest` is either a small pointer to the most + // recent session, or (for session-less saves) the snapshot itself. + const latestRaw = window.localStorage.getItem(storageKey(normalizedSceneID)); + if (!latestRaw) return null; + try { + const maybePointer = JSON.parse(latestRaw) as {latestSessionID?: unknown}; + if (typeof maybePointer.latestSessionID === "string") { + const raw = window.localStorage.getItem(storageKey(normalizedSceneID, maybePointer.latestSessionID)); + return raw ? parseSnapshot(raw, normalizedSceneID) : null; + } + } catch { + return null; + } + return parseSnapshot(latestRaw, normalizedSceneID); +}; diff --git a/client/packages/editor-oss/src/editor/assets/v2/AssetsLibrary/BehaviorCreator/hooks/useBehaviorSave.ts b/client/packages/editor-oss/src/editor/assets/v2/AssetsLibrary/BehaviorCreator/hooks/useBehaviorSave.ts index c621e68d..a1702db9 100644 --- a/client/packages/editor-oss/src/editor/assets/v2/AssetsLibrary/BehaviorCreator/hooks/useBehaviorSave.ts +++ b/client/packages/editor-oss/src/editor/assets/v2/AssetsLibrary/BehaviorCreator/hooks/useBehaviorSave.ts @@ -7,6 +7,18 @@ import {BehaviorConfig} from "../../../../../behaviors/BehaviorConfig"; import {useGetBehaviorRevisionData} from "../../../../../behaviors/hooks/behaviors"; import {createBehaviorRevision} from "../../../../../behaviors/util"; +/** + * TEMP diagnostics for the "first save loses behavior edits" bug. Logs the + * first line of code (the symptom the user reported) plus revision ids at every + * decision point in the save/merge path. Remove once the root cause is fixed. + */ +const BEHAVIOR_SAVE_DEBUG = true; +const firstLineOf = (text: string | undefined): string => + (text ?? "").split("\n", 1)[0]?.slice(0, 120) ?? ""; +const bsLog = (...args: unknown[]): void => { + if (BEHAVIOR_SAVE_DEBUG) console.log("[behavior-save]", ...args); +}; + /** * Recursively validate a behavior's attributes map. Returns the dotted path * of the first invalid attribute found, or null if all are valid. Validation @@ -139,6 +151,15 @@ export function useBehaviorSave(options: UseBehaviorSaveOptions): UseBehaviorSav // Check for newer revisions const {headRevisionId} = await getAsset(behaviorId); + bsLog("mergeBehavior", { + behaviorId, + codeRevisionId, + configRevisionId, + headRevisionId, + baseEqualsHead: codeRevisionId === headRevisionId, + localFirstLine: firstLineOf(code), + }); + // If no newer revisions, we're done if (codeRevisionId === headRevisionId && configRevisionId === headRevisionId) { return { @@ -155,6 +176,13 @@ export function useBehaviorSave(options: UseBehaviorSaveOptions): UseBehaviorSav if (codeRevisionId !== headRevisionId) { let mergedCode = code; + bsLog("code branch (base behind head)", { + behaviorId, + localEqualsLatest: code === latestRevision.code, + localFirstLine: firstLineOf(code), + latestFirstLine: firstLineOf(latestRevision.code), + }); + // Only display the merge dialog if the code is different from the // latest revision if (code !== latestRevision.code) { @@ -209,6 +237,13 @@ export function useBehaviorSave(options: UseBehaviorSaveOptions): UseBehaviorSav async (params: SaveBehaviorParams): Promise => { const {behaviorId, revisionId, code, config, name, description, tags} = params; + bsLog("save() called", { + behaviorId, + baseRevisionId: revisionId, + localFirstLine: firstLineOf(code), + configName: config?.name, + }); + setIsSaving(true); try { @@ -254,6 +289,15 @@ export function useBehaviorSave(options: UseBehaviorSaveOptions): UseBehaviorSav // If a merge happened, notify caller and stop (user must save again) const didMergeHappen = mergeRevisionId !== revisionId; + bsLog("merge decision", { + behaviorId, + baseRevisionId: revisionId, + mergeRevisionId, + didMergeHappen, + note: didMergeHappen + ? "FIRST SAVE WILL BE SKIPPED — returning false without persisting (base revision was behind head)" + : "no merge — proceeding to persist", + }); if (didMergeHappen && onMergeComplete) { onMergeComplete({ behaviorId, @@ -307,6 +351,14 @@ export function useBehaviorSave(options: UseBehaviorSaveOptions): UseBehaviorSav const saveResult = await Promise.all(savePromises); const newRevisionId = saveResult[0]!.id; + bsLog("persisted new revision", { + behaviorId, + parentRevisionId: mergeRevisionId, + newRevisionId, + unchanged: newRevisionId === mergeRevisionId, + persistedFirstLine: firstLineOf(mergedCode), + }); + // Notify caller of successful save - caller handles registry updates and scene dependencies await onSaveComplete?.({ assetId: behaviorId, diff --git a/client/packages/editor-oss/src/editor/assets/v2/CopilotWorkspace/copilotPreviewDraftStorage.test.ts b/client/packages/editor-oss/src/editor/assets/v2/CopilotWorkspace/copilotPreviewDraftStorage.test.ts index 8ca497e0..d5c37104 100644 --- a/client/packages/editor-oss/src/editor/assets/v2/CopilotWorkspace/copilotPreviewDraftStorage.test.ts +++ b/client/packages/editor-oss/src/editor/assets/v2/CopilotWorkspace/copilotPreviewDraftStorage.test.ts @@ -75,19 +75,16 @@ describe("copilotPreviewDraftStorage", () => { vi.unstubAllGlobals(); }); - it("persists, reads, and clears active preview drafts through the local fallback", async () => { - await persistCopilotPreviewDraft(makeApp() as any, makeSession()); + it("never falls back to localStorage when IndexedDB is unavailable", async () => { + // Preview drafts carry a full scene snapshot and must NOT be mirrored + // into localStorage (that bloated storage and threw QuotaExceededError). + // With IndexedDB unavailable, persist/read/clear are graceful no-ops and + // localStorage stays untouched. + await expect(persistCopilotPreviewDraft(makeApp() as any, makeSession())).resolves.toBeUndefined(); + expect(window.localStorage.length).toBe(0); - const draft = await readCopilotPreviewDraft("scene-1"); - expect(draft?.sceneId).toBe("scene-1"); - expect(draft?.baseRevisionId).toBe("rev-1"); - expect(draft?.previewId).toBe("preview-1"); - expect(draft?.previewSceneJson).toEqual([{type: "Scene", uuid: "preview-scene"}]); - expect(draft?.previewAssetResolutionContext.assetIdToRevisionId).toEqual({ - "asset-player": "rev-player-preview", - }); - - await clearCopilotPreviewDraft("scene-1"); await expect(readCopilotPreviewDraft("scene-1")).resolves.toBeNull(); + await expect(clearCopilotPreviewDraft("scene-1")).resolves.toBeUndefined(); + expect(window.localStorage.length).toBe(0); }); }); diff --git a/client/packages/editor-oss/src/editor/assets/v2/CopilotWorkspace/copilotPreviewDraftStorage.ts b/client/packages/editor-oss/src/editor/assets/v2/CopilotWorkspace/copilotPreviewDraftStorage.ts index 8675e069..547c4be4 100644 --- a/client/packages/editor-oss/src/editor/assets/v2/CopilotWorkspace/copilotPreviewDraftStorage.ts +++ b/client/packages/editor-oss/src/editor/assets/v2/CopilotWorkspace/copilotPreviewDraftStorage.ts @@ -27,7 +27,24 @@ export type StoredCopilotPreviewDraft = { }; }; -const localStorageKey = (sceneId: string) => `${LOCAL_STORAGE_PREFIX}:${encodeURIComponent(sceneId)}`; +// One-time cleanup: earlier builds mirrored the full preview scene snapshot +// into localStorage as a "fallback". That is scene-scoped data and has no +// business in the ~5MB localStorage budget — it bloated storage and threw +// QuotaExceededError. Drafts live in IndexedDB only now; purge any leftovers. +const purgeLegacyLocalDrafts = (): void => { + if (typeof window === "undefined") return; + try { + const keys: string[] = []; + for (let i = 0; i < window.localStorage.length; i++) { + const key = window.localStorage.key(i); + if (key && key.startsWith(LOCAL_STORAGE_PREFIX)) keys.push(key); + } + keys.forEach(key => window.localStorage.removeItem(key)); + } catch { + /* localStorage unavailable — nothing to purge */ + } +}; +purgeLegacyLocalDrafts(); const cloneRecord = (record?: Readonly>): Record => ({...(record ?? {})}); @@ -104,31 +121,6 @@ const runStoreRequest = async ( }); }; -const writeLocalDraft = (draft: StoredCopilotPreviewDraft) => { - if (typeof window === "undefined") return; - window.localStorage.setItem(localStorageKey(draft.sceneId), JSON.stringify(draft)); -}; - -const readLocalDraft = (sceneId: string): StoredCopilotPreviewDraft | null => { - if (typeof window === "undefined") return null; - const raw = window.localStorage.getItem(localStorageKey(sceneId)); - if (!raw) return null; - - try { - const parsed = JSON.parse(raw) as StoredCopilotPreviewDraft; - if (parsed.schemaVersion !== 1 || parsed.sceneId !== sceneId || !parsed.session?.previewId) return null; - return parsed; - } catch (error) { - console.warn("[copilotPreviewDraftStorage] Failed to read local preview draft:", error); - return null; - } -}; - -const clearLocalDraft = (sceneId: string) => { - if (typeof window === "undefined") return; - window.localStorage.removeItem(localStorageKey(sceneId)); -}; - export const persistCopilotPreviewDraft = async ( app: EngineRuntime, session: CopilotPreviewSession, @@ -136,15 +128,13 @@ export const persistCopilotPreviewDraft = async ( const draft = createDraft(app, session); if (!draft || typeof window === "undefined") return; + // IndexedDB only. The draft carries a full scene snapshot — it must never + // touch localStorage. If IndexedDB is unavailable the draft is simply not + // persisted (preview is recoverable from the authoritative scene anyway). try { await runStoreRequest("readwrite", store => store.put(draft)); - clearLocalDraft(draft.sceneId); } catch (error) { - try { - writeLocalDraft(draft); - } catch (fallbackError) { - console.warn("[copilotPreviewDraftStorage] Failed to persist preview draft:", error, fallbackError); - } + console.warn("[copilotPreviewDraftStorage] Failed to persist preview draft:", error); } }; @@ -160,18 +150,15 @@ export const readCopilotPreviewDraft = async (sceneId: string): Promise => { if (!sceneId || typeof window === "undefined") return; - clearLocalDraft(sceneId); try { await runStoreRequest("readwrite", store => store.delete(sceneId)); } catch (error) { diff --git a/client/packages/editor-oss/src/editor/assets/v2/LeftPanel/MainTabs/AssetsTab/AssetsRows/AssetsRows.tsx b/client/packages/editor-oss/src/editor/assets/v2/LeftPanel/MainTabs/AssetsTab/AssetsRows/AssetsRows.tsx index edbcbc5a..c90de94c 100644 --- a/client/packages/editor-oss/src/editor/assets/v2/LeftPanel/MainTabs/AssetsTab/AssetsRows/AssetsRows.tsx +++ b/client/packages/editor-oss/src/editor/assets/v2/LeftPanel/MainTabs/AssetsTab/AssetsRows/AssetsRows.tsx @@ -137,9 +137,18 @@ export const AssetsRows = () => { useEffect(() => { if (!sceneID) return setExpandedPanels([PANEL_TYPES.PRIMITIVES]); - const savedPanels = localStorage.getItem(`expandedPanels_${sceneID}`); + let savedPanels: string | null = null; + try { + savedPanels = localStorage.getItem(`expandedPanels_${sceneID}`); + } catch { + savedPanels = null; + } if (savedPanels) { - setExpandedPanels(JSON.parse(savedPanels)); + try { + setExpandedPanels(JSON.parse(savedPanels)); + } catch { + setExpandedPanels([PANEL_TYPES.PRIMITIVES]); + } } else { setExpandedPanels([PANEL_TYPES.PRIMITIVES]); } @@ -148,7 +157,14 @@ export const AssetsRows = () => { useEffect(() => { if (!sceneID || !isLoaded) return; - localStorage.setItem(`expandedPanels_${sceneID}`, JSON.stringify(expandedPanels)); + // Persisting expanded-panel UI state is best-effort. localStorage can be + // full (e.g. a bloated project), and a QuotaExceededError here must not + // crash the asset panel — swallow it. + try { + localStorage.setItem(`expandedPanels_${sceneID}`, JSON.stringify(expandedPanels)); + } catch { + /* storage full or unavailable — ignore, this is non-critical UI state */ + } }, [expandedPanels, sceneID]); const handleImportButton = useCallback( diff --git a/client/packages/editor-oss/src/editor/behaviors/BehaviorObjectSettingsApplier.test.ts b/client/packages/editor-oss/src/editor/behaviors/BehaviorObjectSettingsApplier.test.ts index 62b01f38..35b145a2 100644 --- a/client/packages/editor-oss/src/editor/behaviors/BehaviorObjectSettingsApplier.test.ts +++ b/client/packages/editor-oss/src/editor/behaviors/BehaviorObjectSettingsApplier.test.ts @@ -46,4 +46,31 @@ describe("BehaviorObjectSettingsApplier", () => { expect(group.userData.physics.shape).toBe(BodyShapeType.SPHERE); }); + + it("seeds default physics on an object that has none", () => { + const object = new Mesh(new BoxGeometry(1, 1, 1), new MeshBasicMaterial()); + + BehaviorObjectSettingsApplier.applyObjectSettings(object, { + physics: { enabled: true, shape: "capsule" }, + }); + + // No prior physics → the behavior default applies, including enabling it. + expect(object.userData.physics.enabled).toBe(true); + }); + + it("does NOT override an explicit physics.enabled:false with a behavior default", () => { + // Repro of the pirate-ship freeze: the object's physics was deliberately + // disabled (e.g. by an import's `physics set ... enabled:false`). Attaching + // a behavior whose default physics is enabled (the character controller) + // must NOT re-enable it — a re-enabled dynamic body would hijack the + // object's transform and override the game's own controller. + const object = new Mesh(new BoxGeometry(1, 1, 1), new MeshBasicMaterial()); + object.userData.physics = { enabled: false }; + + BehaviorObjectSettingsApplier.applyObjectSettings(object, { + physics: { enabled: true, shape: "capsule" }, + }); + + expect(object.userData.physics.enabled).toBe(false); + }); }); diff --git a/client/packages/editor-oss/src/editor/behaviors/BehaviorObjectSettingsApplier.ts b/client/packages/editor-oss/src/editor/behaviors/BehaviorObjectSettingsApplier.ts index 123817dc..421c738d 100644 --- a/client/packages/editor-oss/src/editor/behaviors/BehaviorObjectSettingsApplier.ts +++ b/client/packages/editor-oss/src/editor/behaviors/BehaviorObjectSettingsApplier.ts @@ -64,13 +64,24 @@ class BehaviorObjectSettingsApplier { private static applyPhysicsSettings(object: THREE.Object3D, physicsSettings: ObjectSettings['physics']): void { if (!physicsSettings) return; + // Did the object already carry an explicit `enabled` choice (set by the + // user, or by an import's `physics set`) BEFORE this behavior's default + // physics was applied? A behavior's default physics is a convenience for + // objects that have none — it must NOT silently override a deliberate + // `enabled` value. Without this guard, attaching a behavior whose + // default physics is `enabled:true` (e.g. the character controller's + // dynamic capsule) onto an object whose physics was intentionally turned + // off re-enables a body that then hijacks the object's transform — which + // is exactly how a "disabled" character behavior froze the pirate ship. + const hadExplicitEnabled = object.userData.physics?.enabled !== undefined; + if (!object.userData.physics) { object.userData.physics = { enabled: false, }; } - if (physicsSettings.enabled !== undefined) { + if (physicsSettings.enabled !== undefined && !hadExplicitEnabled) { object.userData.physics.enabled = physicsSettings.enabled; } diff --git a/client/packages/editor-oss/src/editor/behaviors/util.ts b/client/packages/editor-oss/src/editor/behaviors/util.ts index 8643cdcf..6eda4c33 100644 --- a/client/packages/editor-oss/src/editor/behaviors/util.ts +++ b/client/packages/editor-oss/src/editor/behaviors/util.ts @@ -391,6 +391,14 @@ export const createBehaviorRevision = async ({ } }; + // TEMP diagnostics for "first save loses behavior edits" — remove with the + // matching [behavior-save] logs in useBehaviorSave.ts. + console.log("[behavior-save] createBehaviorRevision", { + assetId, + parentRevisionId, + codeFirstLine: (code ?? "").split("\n", 1)[0]?.slice(0, 120) ?? "", + }); + try { const revision = await createAssetRevision({ assetId, @@ -408,6 +416,10 @@ export const createBehaviorRevision = async ({ // Still apply scene sync to ensure aliases (e.g. imported YAML config.id) are // re-registered in the current editor session after reload. if (isNoChangesError(err)) { + console.log("[behavior-save] createBehaviorRevision: server reports NO CHANGES — data matches head, returning parent", { + assetId, + parentRevisionId, + }); applyScene(parentRevisionId); return {id: parentRevisionId}; } diff --git a/client/packages/editor-oss/src/event/AutoSaveEvent.js b/client/packages/editor-oss/src/event/AutoSaveEvent.js index 1266bdb1..0269f2c7 100644 --- a/client/packages/editor-oss/src/event/AutoSaveEvent.js +++ b/client/packages/editor-oss/src/event/AutoSaveEvent.js @@ -8,13 +8,7 @@ import BaseEvent from "./BaseEvent"; import {saveScene} from "@web-shared/api/scene"; import global from "../global"; -import i8n from "../i18n/config"; import Converter from "../serialization/Converter"; -import {showToast} from "../showToast"; -import {ElementsUtils} from "../utils/ElementsUtils"; -import TimeUtils from "../utils/TimeUtils"; - -const {t} = i8n; class AutoSaveEvent extends BaseEvent { constructor() { @@ -70,30 +64,11 @@ class AutoSaveEvent extends BaseEvent { scene: app.scene, }); - const now = TimeUtils.getDateTime("yyyy-MM-dd HH:mm:ss"); - - // The localStorage autosave is a best-effort "recover unsaved work" - // cache; the authoritative save is commitSaveScene() -> ProjectStore. - // A large scene (e.g. many imported GLBs) can serialize to several MB - // and blow the ~5MB localStorage quota. A QuotaExceededError here must - // not break the editor — and a stale oversized blob left behind would - // poison every later localStorage.setItem (including the camera save - // that handlePlay() makes), so drop it on failure to free the quota. - try { - window.localStorage.setItem("autoSaveData", JSON.stringify(obj)); - window.localStorage.setItem("autoSaveTime", now); - window.localStorage.setItem("autoSaveSceneID", global.app.editor.sceneID); - window.localStorage.setItem("autoSaveSceneName", global.app.editor.sceneName); - window.localStorage.setItem("autoSaveSceneLockedItems", JSON.stringify(editor.sceneLockedItems || [])); - console.log(`${now}, scene auto saved.`); - } catch (e) { - console.warn("AutoSaveEvent: localStorage autosave skipped (quota exceeded); scene still saves via ProjectStore", e); - try { - window.localStorage.removeItem("autoSaveData"); - window.localStorage.removeItem("autoSaveSceneLockedItems"); - } catch { /* ignore */ } - } - + // Single authoritative path: the active ProjectStore (in playground/OSS + // that is the File System folder). The scene is large and scene-scoped, + // so it must NOT also be mirrored into localStorage (5MB cap) — that was + // pure redundancy that blew the quota. Recovery already lives in the + // saved project itself. if (this.autoSave) { this.commitSaveScene(obj); this.saveProcess = setTimeout(this.handleSave, this.autoSaveTime); @@ -101,48 +76,16 @@ class AutoSaveEvent extends BaseEvent { } handleLoad() { - const autoSaveTime = window.localStorage.getItem("autoSaveTime"); - const autoSaveData = window.localStorage.getItem("autoSaveData"); - const autoSaveSceneID = window.localStorage.getItem("autoSaveSceneID"); - const autoSaveSceneName = window.localStorage.getItem("autoSaveSceneName"); - const autoSaveSceneLockedItems = window.localStorage.getItem("autoSaveSceneLockedItems"); - - if (!autoSaveData) { - return; - } - - this.queryLoad = true; - - ElementsUtils.confirm({ - title: t("Load Scene"), - content: t("An auto-save scene was detected. Load?") + ` (${autoSaveTime})`, - cancelText: t("Clear"), - onOK: () => { - this.queryLoad = false; - this.commitLoadScene(autoSaveData, autoSaveSceneName, autoSaveSceneID, autoSaveSceneLockedItems); - }, - onCancel: () => { - window.localStorage.removeItem("autoSaveTime"); - window.localStorage.removeItem("autoSaveData"); - window.localStorage.removeItem("autoSaveSceneID"); - window.localStorage.removeItem("autoSaveSceneName"); - showToast({type: "info", title: t("Auto-save scene is cleared.")}); - this.queryLoad = false; - }, - }); - } - - commitLoadScene(data, name, id, lockedItems) { - var obj = JSON.parse(data); - const lockedItemsList = JSON.parse(lockedItems); - const lockedItemsData = lockedItemsList ? lockedItemsList.join(",") : ""; - - const prevAutoSaveState = global.app.storage.autoSave; - global.app.setAutoSave(false); - - if (obj) { - global.app.call(`loadSceneList`, this, obj, name, id, lockedItemsData, prevAutoSaveState); - } + // The localStorage autosave cache has been removed — the ProjectStore is + // authoritative. Purge any legacy keys a previous build left behind so + // they stop consuming the localStorage budget. No recovery prompt. + try { + window.localStorage.removeItem("autoSaveData"); + window.localStorage.removeItem("autoSaveTime"); + window.localStorage.removeItem("autoSaveSceneID"); + window.localStorage.removeItem("autoSaveSceneName"); + window.localStorage.removeItem("autoSaveSceneLockedItems"); + } catch { /* localStorage unavailable — nothing to purge */ } } handleStorageChange(name, value) { diff --git a/client/packages/editor-oss/src/persistence/FileSystemProjectStore.test.ts b/client/packages/editor-oss/src/persistence/FileSystemProjectStore.test.ts index 31a0ff62..aa9a443b 100644 --- a/client/packages/editor-oss/src/persistence/FileSystemProjectStore.test.ts +++ b/client/packages/editor-oss/src/persistence/FileSystemProjectStore.test.ts @@ -14,17 +14,24 @@ const sampleBody = (name = "Demo", id = ""): ProjectBody => ({ sceneJson: JSON.stringify({name}), }); +// The real File System Access API throws a DOMException named "NotFoundError" +// for a missing entry — and FileSystemProjectStore now relies on that name to +// tell a *legitimate absence* (return []) apart from a *read failure* (throw). +// The mock must reproduce that contract, not a generic Error. +const notFound = (what: string): DOMException => new DOMException(`missing ${what}`, "NotFoundError"); + class MemoryFileHandle { readonly kind = "file" as const; constructor( readonly name: string, - private readonly dir: MemoryDirectoryHandle, + private readonly read: () => string | undefined, + private readonly write: (value: string) => void, ) {} async getFile(): Promise { - const data = this.dir.files.get(this.name); - if (data === undefined) throw new Error(`missing file ${this.name}`); + const data = this.read(); + if (data === undefined) throw notFound(`file ${this.name}`); return new File([data], this.name, {type: "application/json"}); } @@ -35,7 +42,7 @@ class MemoryFileHandle { pending = typeof data === "string" ? data : await data.text(); }, close: async () => { - this.dir.files.set(this.name, pending); + this.write(pending); }, }; } @@ -43,27 +50,48 @@ class MemoryFileHandle { class MemoryDirectoryHandle { readonly kind = "directory" as const; - readonly name = "projects"; readonly files = new Map(); + readonly subdirs = new Map(); + + constructor(readonly name = "projects") {} async getFileHandle(name: string, options?: {create?: boolean}): Promise { if (!this.files.has(name) && !options?.create) { - throw new Error(`missing file ${name}`); + throw notFound(`file ${name}`); } - if (!this.files.has(name)) { - this.files.set(name, ""); + if (!this.files.has(name)) this.files.set(name, ""); + return new MemoryFileHandle(name, () => this.files.get(name), v => this.files.set(name, v)); + } + + async getDirectoryHandle(name: string, options?: {create?: boolean}): Promise { + if (!this.subdirs.has(name)) { + if (!options?.create) throw notFound(`directory ${name}`); + this.subdirs.set(name, new MemoryDirectoryHandle(name)); } - return new MemoryFileHandle(name, this); + return this.subdirs.get(name)!; } async removeEntry(name: string): Promise { this.files.delete(name); + this.subdirs.delete(name); } - async *entries(): AsyncIterableIterator<[string, MemoryFileHandle]> { + async *entries(): AsyncIterableIterator<[string, MemoryFileHandle | MemoryDirectoryHandle]> { for (const name of this.files.keys()) { - yield [name, new MemoryFileHandle(name, this)]; + yield [name, new MemoryFileHandle(name, () => this.files.get(name), v => this.files.set(name, v))]; } + for (const [name, sub] of this.subdirs) { + yield [name, sub]; + } + } + + /** Test helper: stage an asset subdirectory with a manifest + asset files. */ + seedAssetDir(projectId: string, manifest: unknown, assetFiles: Record = {}): MemoryDirectoryHandle { + const sub = new MemoryDirectoryHandle(projectId); + sub.files.set("assets.json", typeof manifest === "string" ? manifest : JSON.stringify(manifest)); + for (const [file, content] of Object.entries(assetFiles)) sub.files.set(file, content); + this.subdirs.set(projectId, sub); + return sub; } } @@ -103,4 +131,40 @@ describe("FileSystemProjectStore", () => { await store.delete(id); expect([...dir.files.keys()]).toEqual([]); }); + + // --- loadAssets must not silently mask a read failure as "no assets". --- + + it("loadAssets returns [] when the project has no asset subdirectory", async () => { + // Legitimate absence (NotFoundError) — the one quiet path that's allowed. + await expect(store.loadAssets("project-without-assets")).resolves.toEqual([]); + }); + + it("loadAssets returns the recorded assets when the manifest is valid", async () => { + dir.seedAssetDir( + "project-1", + [{file: "a.glb", assetId: "a", revisionId: "r", type: "model", name: "A"}], + {"a.glb": "GLBDATA"}, + ); + const assets = await store.loadAssets("project-1"); + expect(assets).toHaveLength(1); + expect(assets[0]!.assetId).toBe("a"); + }); + + it("loadAssets THROWS on a corrupt asset manifest instead of pretending there are no assets", async () => { + // A manifest that exists but is unreadable must surface — returning [] + // here would silently drop every model on reload. + dir.seedAssetDir("project-1", "{ this is not valid json"); + await expect(store.loadAssets("project-1")).rejects.toThrow(/manifest.*unreadable|malformed/i); + }); + + it("loadAssets THROWS when a manifest-listed asset file is missing", async () => { + // The manifest references b.glb but the file isn't there — a real, + // data-losing problem, not an empty project. + dir.seedAssetDir( + "project-1", + [{file: "b.glb", assetId: "b", revisionId: "r", type: "model", name: "B"}], + /* no b.glb on disk */ + ); + await expect(store.loadAssets("project-1")).rejects.toThrow(); + }); }); diff --git a/client/packages/editor-oss/src/persistence/FileSystemProjectStore.ts b/client/packages/editor-oss/src/persistence/FileSystemProjectStore.ts index a7b2138d..3d5462d6 100644 --- a/client/packages/editor-oss/src/persistence/FileSystemProjectStore.ts +++ b/client/packages/editor-oss/src/persistence/FileSystemProjectStore.ts @@ -42,6 +42,18 @@ const SUFFIX = ".stemscript.json"; /** Filename for an asset's binary payload inside the project's subdirectory. */ const ASSET_MANIFEST = "assets.json"; +/** + * True only for the File System Access API's "this entry does not exist" error + * (`getDirectoryHandle`/`getFileHandle` on a missing path). This is the *one* + * absence we may treat as "legitimately empty". Every other error (permission + * revoked, malformed JSON, truncated binary) is a real failure that must + * surface — never be swallowed into an empty result. + */ +const isNotFoundError = (err: unknown): boolean => + err instanceof DOMException + ? err.name === "NotFoundError" + : (err as {name?: string})?.name === "NotFoundError"; + const bytesToBase64 = (bytes: Uint8Array): string => { let binary = ""; const chunk = 0x8000; @@ -146,8 +158,13 @@ export class FileSystemProjectStore implements ProjectStore { const file = await (handle).getFile(); const body = JSON.parse(await file.text()) as ProjectBody; if (body?.meta) all.push(body.meta); - } catch { - // Skip unreadable / malformed files; don't fail the whole list. + } catch (err) { + // We're iterating files that demonstrably exist, so a failure + // here means the file is present but unreadable/corrupt — a real + // problem. Keep listing the *other* projects (hiding all of them + // behind one bad file would be its own masking fallback), but + // make the bad file loud instead of silently dropping it. + console.error(`[FileSystemProjectStore] Skipping unreadable project file "${name}":`, err); } } @@ -302,32 +319,43 @@ export class FileSystemProjectStore implements ProjectStore { let projectDir: FsDirectoryHandle; try { projectDir = await this.dir.getDirectoryHandle(projectId); - } catch { - // No asset subdirectory (project saved before assets existed, - // or has no binary assets). - return []; + } catch (err) { + // The *only* acceptable quiet path: no asset subdirectory at all + // (project saved before assets existed, or has no binary assets). + // A permission error or anything else is real — surface it. + if (isNotFoundError(err)) return []; + throw err; } let manifest: AssetManifestEntry[]; try { const manifestFile = await (await projectDir.getFileHandle(ASSET_MANIFEST)).getFile(); manifest = JSON.parse(await manifestFile.text()) as AssetManifestEntry[]; - } catch { - return []; + } catch (err) { + // No manifest file → no assets recorded (legit empty). But a manifest + // that exists and fails to read/parse means the asset index is + // corrupt — returning [] there would silently drop every model on + // reload. Surface it instead of pretending the project has no assets. + if (isNotFoundError(err)) return []; + throw new Error( + `Asset manifest for project "${projectId}" is unreadable or malformed: ` + + (err instanceof Error ? err.message : String(err)), + ); + } + if (!Array.isArray(manifest)) { + throw new Error(`Asset manifest for project "${projectId}" is not an array`); } - if (!Array.isArray(manifest)) return []; const assets: StoredAsset[] = []; for (const entry of manifest) { - try { - const file = await (await projectDir.getFileHandle(entry.file)).getFile(); - const bytes = new Uint8Array(await file.arrayBuffer()); - const {file: _file, ...meta} = entry; - assets.push({...meta, data: bytesToBase64(bytes)}); - } catch { - // Skip a missing/unreadable asset file rather than failing - // the whole project load. - } + // The manifest lists this asset, so the file is expected to exist. + // A failure here is a real, data-losing problem (a model that won't + // appear after reload) — fail the load loudly rather than returning + // a half-populated scene that looks fine but is missing geometry. + const file = await (await projectDir.getFileHandle(entry.file)).getFile(); + const bytes = new Uint8Array(await file.arrayBuffer()); + const {file: _file, ...meta} = entry; + assets.push({...meta, data: bytesToBase64(bytes)}); } return assets; } diff --git a/client/packages/editor-oss/src/persistence/ossSceneSave.test.ts b/client/packages/editor-oss/src/persistence/ossSceneSave.test.ts index e9b83785..ec9f7f95 100644 --- a/client/packages/editor-oss/src/persistence/ossSceneSave.test.ts +++ b/client/packages/editor-oss/src/persistence/ossSceneSave.test.ts @@ -64,7 +64,11 @@ vi.mock("../serialization/Converter", () => { }; }); -const stubStore = (kind: "indexeddb" | "filesystem" | "remote", save?: ProjectStore["save"]): ProjectStore => ({ +const stubStore = ( + kind: "indexeddb" | "filesystem" | "remote", + save?: ProjectStore["save"], + saveAssets?: ProjectStore["saveAssets"], +): ProjectStore => ({ kind, list: vi.fn(async () => ({projects: [], page: 1, hasMore: false, totalCount: 0})), load: vi.fn(async () => ({meta: {id: "", name: "", updatedAt: "", createdAt: ""}, sceneJson: "{}"})), @@ -72,7 +76,7 @@ const stubStore = (kind: "indexeddb" | "filesystem" | "remote", save?: ProjectSt delete: vi.fn(async () => undefined), exportToBlob: vi.fn(async () => new Blob([])), importFromBlob: vi.fn(async (): Promise => ({id: "", name: "", updatedAt: "", createdAt: ""})), - saveAssets: vi.fn(async () => undefined), + saveAssets: saveAssets ?? vi.fn(async () => undefined), loadAssets: vi.fn(async () => []), }); @@ -218,6 +222,30 @@ describe("ossSaveScene", () => { converterMod.default = original; }); + it("reports a save FAILURE (not success) when binary asset persistence throws", async () => { + // The scene JSON saves fine, but persisting its binary assets fails. + // Reporting "Saved" here would be a masking fallback: a reload would + // render a scene with missing models. The save must surface as failed. + const saveSpy = vi.fn(async (body: ProjectBody): Promise => body.meta); + const saveAssetsSpy = vi.fn(async () => { + throw new Error("asset disk write failed"); + }); + setProjectStore(stubStore("filesystem", saveSpy, saveAssetsSpy)); + + const app = buildApp({sceneID: "proj-assets"}); + const globalMod = await import("../global"); + // @ts-expect-error mutate for test + globalMod.default.app = app; + + await ossSaveScene(false, false); + + expect(saveSpy).toHaveBeenCalledTimes(1); // scene JSON did persist + expect(saveAssetsSpy).toHaveBeenCalledTimes(1); + expect(app.call).toHaveBeenCalledWith("sceneSaveFailed"); + // Must NOT have falsely announced success. + expect(app.call).not.toHaveBeenCalledWith("sceneSaved", expect.anything(), expect.anything()); + }); + it("short-circuits in read-only mode", async () => { const saveSpy = vi.fn(); setProjectStore(stubStore("indexeddb", saveSpy)); diff --git a/client/packages/editor-oss/src/persistence/ossSceneSave.ts b/client/packages/editor-oss/src/persistence/ossSceneSave.ts index 90b8e8ac..ba84dce4 100644 --- a/client/packages/editor-oss/src/persistence/ossSceneSave.ts +++ b/client/packages/editor-oss/src/persistence/ossSceneSave.ts @@ -28,41 +28,39 @@ import type {ProjectBody, ProjectMeta, StoredAsset} from "./types"; * Persist the binary OSS assets (models, images, audio) a project depends * on into the active ProjectStore. OSS synthesizes these as in-memory * `data:` URLs with no asset service behind them; without this the scene - * JSON's model references would dangle after a reload. Best-effort: a - * failure here is logged but doesn't fail the scene save. + * JSON's model references would dangle after a reload. A failure here means + * the scene was saved but its binary assets were NOT — a reload would show a + * scene with missing models. That is a real save failure, so this throws and + * the caller surfaces it instead of reporting a clean "Saved". */ async function persistProjectAssets(projectId: string): Promise { - try { - const splitDataUrl = (url: string): {contentType?: string; base64: string} => { - // `data:;base64,` → {mime, payload} - const comma = url.indexOf(","); - if (comma < 0) return {base64: url}; - const header = url.slice(5, comma); // skip "data:" - const semi = header.indexOf(";"); - const mime = semi >= 0 ? header.slice(0, semi) : header; - return {contentType: mime || undefined, base64: url.slice(comma + 1)}; - }; - const assets: StoredAsset[] = getOssAssetsForProject(projectId) - .filter(record => record.dataUrl) - .map(record => { - const main = splitDataUrl(record.dataUrl!); - const thumb = record.thumbnailDataUrl ? splitDataUrl(record.thumbnailDataUrl) : undefined; - return { - assetId: record.assetId, - revisionId: record.revisionId, - type: record.type, - format: record.format, - name: record.name, - contentType: record.contentType, - metadata: record.metadata, - data: main.base64, - ...(thumb ? {thumbnailData: thumb.base64, thumbnailContentType: thumb.contentType} : {}), - }; - }); - await getProjectStore().saveAssets(projectId, assets); - } catch (err) { - console.warn("[ossSaveScene] failed to persist project assets", err); - } + const splitDataUrl = (url: string): {contentType?: string; base64: string} => { + // `data:;base64,` → {mime, payload} + const comma = url.indexOf(","); + if (comma < 0) return {base64: url}; + const header = url.slice(5, comma); // skip "data:" + const semi = header.indexOf(";"); + const mime = semi >= 0 ? header.slice(0, semi) : header; + return {contentType: mime || undefined, base64: url.slice(comma + 1)}; + }; + const assets: StoredAsset[] = getOssAssetsForProject(projectId) + .filter(record => record.dataUrl) + .map(record => { + const main = splitDataUrl(record.dataUrl!); + const thumb = record.thumbnailDataUrl ? splitDataUrl(record.thumbnailDataUrl) : undefined; + return { + assetId: record.assetId, + revisionId: record.revisionId, + type: record.type, + format: record.format, + name: record.name, + contentType: record.contentType, + metadata: record.metadata, + data: main.base64, + ...(thumb ? {thumbnailData: thumb.base64, thumbnailContentType: thumb.contentType} : {}), + }; + }); + await getProjectStore().saveAssets(projectId, assets); } /** @@ -159,8 +157,18 @@ export async function ossSaveScene(_createThumbnail: boolean, shouldShowToast: b } // Persist binary assets (models/images/audio) alongside the project so - // the scene's asset references resolve after a reload. - await persistProjectAssets(saved.id); + // the scene's asset references resolve after a reload. If this fails the + // scene JSON is saved but its assets are not — a reload would render a + // scene with missing models. Surface that as a save failure rather than + // reporting a clean "Saved". + try { + await persistProjectAssets(saved.id); + } catch (err) { + console.error("ossSaveScene: failed to persist project assets", err); + if (shouldShowToast) showToast({type: "error", title: "Save failed — could not persist assets."}); + app.call("sceneSaveFailed"); + return; + } if (shouldShowToast) { showToast({type: "success", title: "Saved"}); diff --git a/docs/planning/2026-06-01-import-dedup-and-localstorage-hygiene.md b/docs/planning/2026-06-01-import-dedup-and-localstorage-hygiene.md new file mode 100644 index 00000000..9562e6d3 --- /dev/null +++ b/docs/planning/2026-06-01-import-dedup-and-localstorage-hygiene.md @@ -0,0 +1,78 @@ +# Import asset dedup + localStorage hygiene + +## Goal +Fix the upstream root cause behind today's pirate-ship cluster (can't move, +physics wrongly enabled, missing skybox, `QuotaExceededError`): the project is +bloated and scene-scoped state is being dumped into localStorage. Two changes: + +1. **Import asset dedup** — identical source `.glb` files import **once** as a + shared asset; scene objects reference it. (Pirate-ship has 77 `import model` + lines pointing at 3 rock files → 77 inline assets today.) +2. **localStorage hygiene (architectural rule)** — localStorage holds **only + global user/device preferences** (FTUE, theme, language, quality, persistence + mode). All **scene-scoped** data moves to `scene.userData` (persisted to the + File System via `ProjectStore`) or is dropped if redundant. + +## Why this is the root cause +- `importHandler.ts` model path (≈614-632) creates a new asset **per import** + with no dedup (the media path at ≈662-670 *does* dedup by name). 77 rocks → 77 + multi-KB inline GLB assets. +- Scene-scoped data is serialized into localStorage (5 MB cap) regardless of + persistence mode: `autoSaveData` (full scene, every 10 s), copilot preview + drafts (`previewSceneJson`, per `sceneId`, never pruned), chat snapshots. +- A bloated scene × accumulating per-scene blobs → quota exhausted → even a tiny + write (`expandedPanels`) throws. Oversized saves are also the likely reason + `physics:false` / skybox / behavior edits don't persist. + +## Open questions (need confirmation) +- **Autosave recovery cache** (`autoSaveData…`): drop entirely (FS folder is + authoritative), or migrate "recover unsaved work" into `scene.userData`? +- **Instanced rendering** for the 77 identical rocks: do now, or follow-up? + (Storage dedup is independent of and higher-priority than instanced rendering.) + +## localStorage key classification +**Keep (global user/device prefs):** FTUE flags, `codeEditorTheme/FontSize/ +FontFamily`, language, quality settings, persistence-mode key, bootstrap flag, +dashboard FTUE, AssetsList filters, code-editor open/pinned/width, playmode- +inspector position, `expandedPanels`, signed-url cache, guest id. + +**Move to `scene.userData` (FS) or drop (scene-scoped):** +- `autoSaveData` + `autoSaveTime/SceneID/SceneName/SceneLockedItems` + (`event/AutoSaveEvent.js`) — drop or migrate. +- copilot preview drafts (`copilotPreviewDraftStorage.ts` localStorage fallback, + `previewSceneJson`) — keep IndexedDB, remove the full-scene localStorage write. +- chat snapshots (`workspaceChatSnapshot.ts`). +- `savedCameras` (`controls/ControlsManager.js`). +- runtime rig overrides (`assets/js/animations/runtimeRig.ts`). +- `lastPlayState` (`behaviors/packs/character/CharacterBehavior.ts`). + +## Affected files +- `agent/script-tool/importHandler.ts` (model dedup) +- `agent/script-tool/useTerminal.ts` / `processResolvedImports` (thread a + run-scoped content-hash→assetId cache) +- `event/AutoSaveEvent.js` +- `editor/assets/v2/CopilotWorkspace/copilotPreviewDraftStorage.ts` +- `editor/assets/v2/AiCopilot/workspaceChatSnapshot.ts` +- `controls/ControlsManager.js`, `assets/js/animations/runtimeRig.ts`, + `behaviors/packs/character/CharacterBehavior.ts` +- one-time cleanup that purges stale scene-scoped localStorage keys + +## Implementation steps +- [ ] **Import dedup**: hash `sourceGlbBuffer`; run-scoped `Map` + passed through `processImportedFile`. On hit, skip `createModelWithData`, + reuse `assetId`, still `loadModel(assetId)` + place the new object. +- [ ] Verify multiple scene objects sharing one `asset.id` save/load correctly. +- [ ] **autoSave**: drop (or migrate) the localStorage scene cache per decision. +- [ ] **copilot draft**: remove `writeLocalDraft` full-scene write; IndexedDB only. +- [ ] **chat snapshot / cameras / rig / play-state**: move to `scene.userData`. +- [ ] One-time cleanup of stale scene-scoped localStorage keys on boot. +- [ ] (Optional) instanced rendering for identical shared-asset placements. + +## Validation +- [ ] Re-import pirate ship → **3** rock assets, not 77; scene size drops sharply. +- [ ] `localStorage` stays small (run the size-dump one-liner). +- [ ] After reload: `physics:false`, skybox present, behavior edits persist; + `_matchStarted` flips true and **W moves the ship**. +- [ ] `bun run typecheck`, `bun run lint`, `bun run test`. +- [ ] Re-run OSS smokes touching persistence/import. +- [ ] Manual code review. diff --git a/docs/planning/2026-06-01-no-masking-fallbacks-playground.md b/docs/planning/2026-06-01-no-masking-fallbacks-playground.md new file mode 100644 index 00000000..efd8c5f7 --- /dev/null +++ b/docs/planning/2026-06-01-no-masking-fallbacks-playground.md @@ -0,0 +1,144 @@ +# No error-masking fallbacks in playground-critical paths + +## Goal + +No fallback in the playground-critical paths (import → persistence/save-load → +play) may silently hide a failure. Every fallback must either: + +- surface the failure loudly (error log + user-visible signal), or +- fail hard when the fallback is covering a **bug in our own implementation**. + +Only a *genuine, expected absence* (file not created yet, no asset subdir, +`crypto` unavailable in an insecure context) may degrade quietly — and even +then it must be the *narrow* expected error, not a blanket `catch {}`. + +Playwright tests must exercise these paths so a regression surfaces. + +## Scope (decided with user) + +Playground-critical paths only: `agent/script-tool/`, `persistence/`, the OSS +save path (`ossSceneSave.ts`), and the stemscript import driver +(`useTerminal.ts`). Render/picking/websocket degradation is explicitly out of +scope (legitimate, non-data-path). + +## Guiding rule + +`catch { return [] }` / `catch { /* skip */ }` is only acceptable when the +caught error is the **specific** expected one (e.g. `NotFoundError`). A blanket +catch that also swallows parse errors, permission errors, or our own bugs is a +masking fallback and must be split: expected-absence → degrade; anything else → +surface / rethrow. + +## Findings & fixes + +- [ ] `persistence/FileSystemProjectStore.ts:327` — per-asset read failure on + **load** silently dropped → scene reloads with missing models, no trace. + Fix: the manifest lists the asset, so a read failure is real → **throw**. +- [ ] `FileSystemProjectStore.ts:305/315` — `loadAssets` conflates "no asset + subdir / no manifest" (legit empty → `[]`) with read/parse failure. + Fix: only `NotFoundError` → `[]`; parse error / other → **throw**. +- [ ] `FileSystemProjectStore.ts:149` — `list()` swallows unreadable/malformed + project files with no log. Fix: **`console.error` with the filename** + (keep listing the rest; one bad file must not hide the others, but it + must be visible). +- [ ] `persistence/ossSceneSave.ts:63` — `persistProjectAssets` failure + swallowed; save still reports "Saved" while binary assets were lost. + Fix: **propagate**; surface as a save failure (error toast + + `sceneSaveFailed`), do not report success. +- [ ] `agent/script-tool/importHandler.ts:360` — `getAsset` failure for an + asset we just matched in-scene → silently uses a **stale** scene-pinned + revision (stale-parent merge can drop edits). Fix: log loudly; only fall + back on genuine not-found, rethrow otherwise. +- [ ] `editor/.../useTerminal.ts` — unresolved import file (e.g. skybox) now + logs an error entry but the run still reports overall success. Fix: an + unresolved import **fails the run** (surfaced result), so an incomplete + import can never masquerade as a clean one. + +## Validation + +- [x] `bun run typecheck` — clean. +- [x] `bun run lint` — 0 errors (pre-existing `any` warnings only). +- [x] `bun run test` (Vitest) — 2488 passed (+5 new): `FileSystemProjectStore.loadAssets` + throws on corrupt manifest / missing asset (3 tests) and returns the + recorded assets on a valid manifest; `ossSaveScene` reports a save FAILURE + (not success) when asset persistence throws. +- [x] Playwright: **`oss-import-fallback-verify.mjs` — PASSES 12/12** end-to-end + on a light real game (small-world) in ~2 min. Asserts the hardened paths + behave honestly: `no-batch-import-dialog`, `import-no-failed-commands` + (`failCount===0`), `models-present`, and the crux **`assets-survive-reload`** + (mesh count preserved across save→reload — a live check that + `loadAssets`/`ossSaveScene` don't silently drop/swallow). Also strengthened + `oss-pirate-ship-playground.mjs` (same assertions + dialog guard); it + confirms `no-batch-import-dialog` but the heaviest game's full import + exceeds the timeout due to import perf (task #10), so the *fast* verify + smoke is the authoritative end-to-end Playwright check. +- [ ] Manual code review. + +## Per-import timeout (added) + +A single `processImportedFile` could previously hang the whole run with no +surfaced error — the ultimate "failure that never surfaces". Each import is now +raced against a 90s ceiling (`withImportTimeout` in `useTerminal.ts`); on +timeout it is reported as a failed result (named culprit logged via +`[import-timeout]`) and the loop continues. Directive-aligned: a hang now +surfaces loudly instead of spinning forever. + +## RESOLVED: pirate-ship import hang — root cause found + fixed + +- **Root cause:** `showBatchImportDialog` (`ImportBatchDialog.ts`) is a bare + `new Promise` that only resolves on a user button click — no timeout, no + headless escape. It opened because 4 of the 5 `PIR_Water.png` texture imports + did not auto-resolve: the generator emitted duplicate textures as + `PIR_Water.png-2 … -5` (extension `.png-2`), and `autoResolveImports` filtered + candidate files by extension **before** matching the explicit `filepath`, + dropping those odd-extension files. Unresolved → blocking modal → headless + `__stemRunScript` hung forever (the 20-min "timeout" was that hang). +- **Fix 1 (`ImportBatchDialog.ts`):** an explicit `filepath` now matches against + the FULL file list, not the extension-filtered subset. The filepath is already + precise, so the ext guard only ever caused false misses. Regression test: + `ImportBatchDialog.test.ts` (odd-extension filepath resolves; one file backs + several imports). +- **Fix 2 (`oss-pirate-ship-playground.mjs`):** the smoke now polls instead of + blocking inside `evaluate`, asserts `no-batch-import-dialog`, and dismisses the + dialog if it ever appears — so a future auto-resolution failure fails the test + loudly in seconds instead of hanging it for 20 minutes. +- **Also found:** the running dev server had been serving a STALE bundle all + session (none of the edited code executed in the page) until `bun run dev` was + restarted — that is why browser verification looked broken earlier. Unit tests + (no browser) were always authoritative. + +## Project-data fix (PIR_Water textures) + +The 5 `PIR_Water` imports referenced `PIR_Water.png`, `…png-2 … png-5`. The +`-N` files are **5 distinct, valid PNGs** (different md5/size — water frames), +just saddled with a malformed extension suffix. Renamed on disk to +`PIR_Water_2.png … _5.png` and updated the stemscript `filepath=` lines. So the +data is clean AND the resolver is robust (two independent layers). + +## Residual: import is slow (NOT hung, NOT in scope of the fallback work) + +After the dialog fix the import progresses steadily — object count climbs +90→189 over ~4 min (~2.4s/object) and keeps going; it does not freeze. The +heaviest games (113 imports + hundreds of placement commands, each firing +`objectChanged`/scene reprocessing) take 10–15+ min. This is a performance +matter, separate from "masking fallbacks". Options if pursued: batch/defer +`objectChanged` during bulk script import; the smoke would then complete and its +`failCount===0` / `skybox-object-present` / play assertions can be verified. + +## Notes + +- The strengthened smoke surfaced that the pirate-ship import **hangs** (object + count freezes at ~90 of ~101, then the 20-min outer timeout). Confirmed a hang + (not slowness) — `objCount` frozen, observed repeatedly. +- Pinpointing the exact stall is **blocked by the dev environment**: Vite serves + the freshly-edited module (verified via curl: `withImportTimeout` present), but + the running page never executes the edited `runScript` (no injected + `[phase]`/`[import-diag]`/`[exec-progress]` log ever fires across 6+ + instrumented runs, even with `serviceWorkers: "block"`). Strong indication the + dev server (or its service worker, registered in `AppUpdateManager.tsx`) is + serving a **stale bundle**. **Action:** restart `bun run dev` to clear it, then + re-run the diagnostic (`scripts/playwright/diag-pirate-import-progress.mjs`), + which will name the hanging import via the per-import timeout. +- NOTE: this also means earlier browser-based smoke results this session may have + run against stale code. Unit tests (Vitest, no browser/SW) remain authoritative + and are green. diff --git a/scripts/playwright/diag-pirate-import-progress.mjs b/scripts/playwright/diag-pirate-import-progress.mjs new file mode 100644 index 00000000..866f1b39 --- /dev/null +++ b/scripts/playwright/diag-pirate-import-progress.mjs @@ -0,0 +1,144 @@ +#!/usr/bin/env node +/** + * DIAGNOSTIC (not a smoke): is the pirate-ship import steadily slow, or stuck + * on one command? Bootstraps playground + OPFS folder store, opens Copilot to + * expose __stemRunScript, fires the import WITHOUT awaiting, then polls the + * `[exec-progress] current/total (+dt) line` console breadcrumb + live object + * count for ~3.5 minutes. Steadily-rising current → slow; frozen current → + * stuck (the printed line is the culprit command). + * + * bun run dev must be up on PLAYWRIGHT_BASE_URL (default localhost:5173). + */ +import {chromium} from "playwright"; +import {readFileSync, readdirSync, statSync} from "node:fs"; +import {join} from "node:path"; + +const baseUrl = (process.env.PLAYWRIGHT_BASE_URL || "http://localhost:5173").replace(/\/$/, ""); +const gameFolder = process.env.GAME_FOLDER || "/Users/n/erth/Games-StemScript/Pirate-Ship-Battle-Royal-v1.0"; +const OBSERVE_MS = Number(process.env.OBSERVE_MS || 210000); // ~3.5 min +const POLL_MS = 5000; + +const MIME = {".glb": "model/gltf-binary", ".gltf": "model/gltf+json", ".png": "image/png", ".jpg": "image/jpeg", ".jpeg": "image/jpeg", ".webp": "image/webp", ".bin": "application/octet-stream", ".json": "application/json", ".mp3": "audio/mpeg", ".wav": "audio/wav", ".hdr": "image/vnd.radiance", ".yaml": "text/yaml", ".yml": "text/yaml", ".stemscript": "text/plain"}; +const mimeFor = n => MIME[(n.match(/\.[^.]+$/) || [""])[0].toLowerCase()] || "application/octet-stream"; + +function walk(root) { + const out = []; + const rec = (dir, prefix) => { + for (const e of readdirSync(dir)) { + if (e === ".DS_Store") continue; + const abs = join(dir, e); + const rel = prefix ? `${prefix}/${e}` : e; + if (statSync(abs).isDirectory()) rec(abs, rel); + else out.push({name: rel, abs}); + } + }; + rec(root, ""); + return out; +} + +const files = walk(gameFolder); +const scriptFile = files.find(f => f.name.endsWith(".stemscript")); +const scriptContent = readFileSync(scriptFile.abs, "utf8"); +const folderFiles = files.filter(f => f !== scriptFile) + .map(f => ({name: f.name, mime: mimeFor(f.name), data: readFileSync(f.abs).toString("base64")})); +console.log(`[diag] folder=${gameFolder} files=${files.length} script=${scriptFile.name}`); + +const progress = []; // {t, current, total, dt, line} +const PROG_RE = /\[exec-progress\] (\d+)\/(\d+) \(\+(\d+)ms\) (.*)/; +const importDiag = []; // raw [import-diag] lines +const DIAG_RE = /\[import-diag\] (START|DONE) +#(\d+)(.*)/; + +const browser = await chromium.launch({headless: process.env.HEADED !== "1"}); +// Block the app's service worker — a stale SW cache otherwise serves an old +// bundle, defeating any code change under test. +const page = await (await browser.newContext({viewport: {width: 1440, height: 900}, serviceWorkers: "block"})).newPage(); +const startWall = Date.now(); +page.on("console", m => { + const t = m.text(); + if (process.env.VERBOSE && (Date.now() - startWall) < (Number(process.env.VERBOSE_MS) || 40000)) { + console.log(` [console.${m.type()}] ${t.slice(0, 160)}`); + } + const mm = PROG_RE.exec(t); + if (mm) progress.push({t: Date.now() - startWall, current: +mm[1], total: +mm[2], dt: +mm[3], line: mm[4].slice(0, 80)}); + const dm = DIAG_RE.exec(t); + if (dm) { importDiag.push(t); console.log(` [${((Date.now() - startWall) / 1000).toFixed(0)}s]`, t.slice(0, 150)); } + if (/\[RUNSCRIPT-ENTRY\]|\[phase\]|\[exec-progress\]|\[import-skip\]|\[import-timeout\]|\[ScriptImport\] getAsset/.test(t)) console.log(` >> [${((Date.now() - startWall) / 1000).toFixed(0)}s]`, t.slice(0, 200)); +}); + +const bootstrapFS = async p => p.evaluate(async () => { + const root = await navigator.storage.getDirectory(); + try { await root.removeEntry("stem-fs", {recursive: true}); } catch { /* first run */ } + const fsRoot = await root.getDirectoryHandle("stem-fs", {create: true}); + await new Promise((res, rej) => { + const req = indexedDB.open("stemstudio-fs-handle", 1); + req.onupgradeneeded = () => { const db = req.result; if (!db.objectStoreNames.contains("handles")) db.createObjectStore("handles"); }; + req.onsuccess = () => { const tx = req.result.transaction("handles", "readwrite"); tx.objectStore("handles").put(fsRoot, "project-dir"); tx.oncomplete = () => res(); tx.onerror = () => rej(tx.error); }; + req.onerror = () => rej(req.error); + }); + localStorage.setItem("stemstudio.persistence.mode", "filesystem"); + localStorage.setItem("stemstudio.bootstrap.complete", "true"); +}); +const dismissBootstrap = async () => { + const bs = page.locator('[aria-labelledby="oss-bootstrap-title"]').first(); + if (await bs.count() && await bs.isVisible().catch(() => false)) { + await bs.locator('button:has-text("Browser storage")').first().click({timeout: 3000}).catch(() => {}); + await bs.locator('button:has-text("Continue")').first().click({timeout: 5000}).catch(() => {}); + await page.waitForTimeout(400); + } +}; +const dismissTutorial = async () => { + const g = page.locator('button:has-text("Got It")').first(); + if (await g.count() && await g.isVisible().catch(() => false)) { await g.click({timeout: 3000}).catch(() => {}); await page.waitForTimeout(300); } +}; + +await page.goto(baseUrl + "/dashboard?mode=playground", {waitUntil: "domcontentloaded", timeout: 30000}); +await page.waitForLoadState("networkidle", {timeout: 15000}).catch(() => {}); +await dismissBootstrap(); +await bootstrapFS(page); +await page.goto(baseUrl + "/create/project", {waitUntil: "domcontentloaded", timeout: 30000}); +await page.waitForLoadState("networkidle", {timeout: 15000}).catch(() => {}); +await dismissBootstrap(); +await page.waitForTimeout(6000); +await dismissTutorial(); +const copilotBtn = page.locator('[data-testid="actionbar-copilot"]').first(); +const cBox = await copilotBtn.boundingBox().catch(() => null); +if (cBox) await page.mouse.click(cBox.x + cBox.width / 2, cBox.y + cBox.height / 2); +else await copilotBtn.click({timeout: 3000, force: true}).catch(() => {}); +await page.waitForTimeout(2000); +const hookPresent = await page.evaluate(() => typeof window.__stemRunScript === "function"); +console.log(`[diag] hook present=${hookPresent}`); +if (!hookPresent) { await browser.close(); process.exit(1); } + +// Fire WITHOUT awaiting — we only observe progress. +await page.evaluate(({content, fileList}) => { + window.__diagDone = null; + window.__stemRunScript(content, fileList).then(s => { window.__diagDone = {ok: true, summary: s}; }, e => { window.__diagDone = {ok: false, err: String(e && e.message || e)}; }); +}, {content: scriptContent, fileList: folderFiles}); + +const deadline = Date.now() + OBSERVE_MS; +let lastMarker = "", lastChangeT = Date.now(); +while (Date.now() < deadline) { + await page.waitForTimeout(POLL_MS); + const objCount = await page.evaluate(() => (window.__stemGetScene ? window.__stemGetScene().objectCount : -1)).catch(() => -2); + const dialogUp = await page.evaluate(() => /Import Assets \(/.test(document.body?.innerText || "")).catch(() => false); + if (dialogUp) console.log(` >>> [${((Date.now() - startWall) / 1000).toFixed(0)}s] BATCH IMPORT DIALOG IS OPEN — runScript is blocked awaiting a user click (headless = infinite hang).`); + const done = await page.evaluate(() => window.__diagDone).catch(() => null); + const marker = `${objCount}|${(importDiag[importDiag.length - 1] || "")}|${(progress.length ? progress[progress.length - 1].current : "")}`; + if (marker !== lastMarker) { lastMarker = marker; lastChangeT = Date.now(); } + const stalledMs = Date.now() - lastChangeT; + const tSec = ((Date.now() - startWall) / 1000).toFixed(0); + const lastDiag = importDiag[importDiag.length - 1] || "(no import-diag yet)"; + console.log(`[diag t=${tSec}s] objCount=${objCount} stalledFor=${(stalledMs / 1000).toFixed(0)}s lastDiag="${lastDiag.replace(/^.*\[import-diag\] /, "").slice(0, 90)}"`); + if (done) { console.log(`[diag] run resolved: ${JSON.stringify(done)}`); break; } + // Don't break before the in-app per-import timeout (90s) has a chance to + // fire its [import-timeout] culprit line (~110s wall). Give it headroom. + if (stalledMs > 140000) { console.log(`[diag] >>> STUCK ${(stalledMs / 1000).toFixed(0)}s (no [import-timeout] seen — unexpected).`); break; } +} + +// Summary: slowest commands. +const byDt = [...progress].sort((a, b) => b.dt - a.dt).slice(0, 12); +console.log("\n[diag] slowest commands (dt ms):"); +for (const p of byDt) console.log(` +${p.dt}ms @${(p.t / 1000).toFixed(0)}s ${p.current}/${p.total} ${p.line}`); +console.log(`\n[diag] total progress events=${progress.length}, reached=${lastCurrent}/${progress[0] ? progress[progress.length - 1].total : "?"}`); +await browser.close(); +console.log("DIAG_DONE"); diff --git a/scripts/playwright/oss-import-fallback-verify.mjs b/scripts/playwright/oss-import-fallback-verify.mjs new file mode 100644 index 00000000..0d19f0b4 --- /dev/null +++ b/scripts/playwright/oss-import-fallback-verify.mjs @@ -0,0 +1,231 @@ +#!/usr/bin/env node +/** + * Playwright verification for the "no error-masking fallbacks" work. + * + * Drives a real stemscript game import end-to-end through the playground + + * File System (OPFS) store and asserts that the hardened fallback paths behave + * honestly — i.e. a failure cannot hide: + * + * 1. no-batch-import-dialog — every import auto-resolves; the blocking + * "Import Assets" modal (which hangs headless) + * never opens. Regression guard for the + * odd-extension filepath bug. + * 2. import-no-failed-commands — runScript's summary.failCount === 0; an + * unresolved/failed import would surface here. + * 3. models-present — the import actually created mesh content. + * 4. assets-survive-reload — after save → reload from the folder store, + * the mesh count is preserved. This is the live + * check on FileSystemProjectStore.loadAssets and + * ossSaveScene: if either silently dropped an + * asset / swallowed a persist failure, the + * reloaded scene would be missing geometry and + * this assertion fails loudly. + * + * Uses a LIGHT game by default (small-world: 6 models) so it completes quickly, + * independent of heavy-game import performance. Override with $GAME_FOLDER. + * + * bun run dev must be up on PLAYWRIGHT_BASE_URL (default localhost:5173). + * HEADED=1 to watch. Report → scripts/playwright/oss-import-fallback-verify-output/. + */ +import {chromium} from "playwright"; +import {writeFileSync, mkdirSync, readFileSync, readdirSync, statSync, existsSync} from "node:fs"; +import {dirname, resolve, basename, join} from "node:path"; +import {fileURLToPath} from "node:url"; + +const __dirname = dirname(fileURLToPath(import.meta.url)); +const outDir = resolve(__dirname, "oss-import-fallback-verify-output"); +mkdirSync(outDir, {recursive: true}); + +const baseUrl = (process.env.PLAYWRIGHT_BASE_URL || "http://localhost:5173").replace(/\/$/, ""); +const headed = process.env.HEADED === "1"; +const gameFolder = process.env.GAME_FOLDER || "/Users/n/erth/Games-StemScript/small-world"; +const IMPORT_TIMEOUT_MS = Number(process.env.IMPORT_TIMEOUT_MS || 8 * 60 * 1000); + +const MIME = {".glb": "model/gltf-binary", ".gltf": "model/gltf+json", ".png": "image/png", ".jpg": "image/jpeg", ".jpeg": "image/jpeg", ".webp": "image/webp", ".bin": "application/octet-stream", ".json": "application/json", ".mp3": "audio/mpeg", ".wav": "audio/wav", ".ogg": "audio/ogg", ".hdr": "image/vnd.radiance", ".yaml": "text/yaml", ".yml": "text/yaml", ".stemscript": "text/plain"}; +const mimeFor = n => MIME[(n.match(/\.[^.]+$/) || [""])[0].toLowerCase()] || "application/octet-stream"; + +function walk(root) { + const out = []; + const rec = (dir, prefix) => { + for (const e of readdirSync(dir)) { + if (e === ".DS_Store") continue; + const abs = join(dir, e); + const rel = prefix ? `${prefix}/${e}` : e; + if (statSync(abs).isDirectory()) rec(abs, rel); + else out.push({name: rel, abs}); + } + }; + rec(root, ""); + return out; +} + +const report = {baseUrl, gameFolder, startedAt: new Date().toISOString(), assertions: {}, steps: [], consoleErrors: []}; +const failures = []; +function assert(name, cond, detail) { + report.assertions[name] = {pass: !!cond, detail}; + if (cond) console.log(`✓ assert: ${name}`); + else { console.log(`✗ assert: ${name} — ${detail ?? ""}`); failures.push(name); } +} +function logStep(name, status = "ok", details = {}) { + report.steps.push({name, status, details}); + console.log(`${status === "ok" ? "✓" : status === "warn" ? "⚠" : "✗"} ${name}${Object.keys(details).length ? ` — ${JSON.stringify(details).slice(0, 160)}` : ""}`); +} + +assert("game-folder-exists", existsSync(gameFolder), gameFolder); +const files = existsSync(gameFolder) ? walk(gameFolder) : []; +const scriptFile = files.find(f => f.name.endsWith(".stemscript")); +assert("script-file-found", !!scriptFile, `no .stemscript in ${gameFolder}`); +if (!scriptFile) { writeFileSync(resolve(outDir, "report.json"), JSON.stringify(report, null, 2)); process.exit(1); } +const scriptContent = readFileSync(scriptFile.abs, "utf8"); +const folderFiles = files.filter(f => f !== scriptFile).map(f => ({name: f.name, mime: mimeFor(f.name), data: readFileSync(f.abs).toString("base64")})); +logStep("read game folder", "ok", {files: files.length, script: basename(scriptFile.name)}); + +const browser = await chromium.launch({headless: !headed}); +const page = await (await browser.newContext({viewport: {width: 1440, height: 900}, serviceWorkers: "block"})).newPage(); +page.on("console", m => { if (m.type() === "error") report.consoleErrors.push(m.text().slice(0, 300)); }); +page.on("pageerror", e => report.consoleErrors.push("pageerror: " + e.message.slice(0, 300))); + +const bootstrapFS = async p => p.evaluate(async () => { + const root = await navigator.storage.getDirectory(); + try { await root.removeEntry("stem-fs", {recursive: true}); } catch { /* first run */ } + const fsRoot = await root.getDirectoryHandle("stem-fs", {create: true}); + await new Promise((res, rej) => { + const req = indexedDB.open("stemstudio-fs-handle", 1); + req.onupgradeneeded = () => { const db = req.result; if (!db.objectStoreNames.contains("handles")) db.createObjectStore("handles"); }; + req.onsuccess = () => { const tx = req.result.transaction("handles", "readwrite"); tx.objectStore("handles").put(fsRoot, "project-dir"); tx.oncomplete = () => res(); tx.onerror = () => rej(tx.error); }; + req.onerror = () => rej(req.error); + }); + localStorage.setItem("stemstudio.persistence.mode", "filesystem"); + localStorage.setItem("stemstudio.bootstrap.complete", "true"); +}); +const dismissBootstrap = async () => { + const bs = page.locator('[aria-labelledby="oss-bootstrap-title"]').first(); + if (await bs.count() && await bs.isVisible().catch(() => false)) { + await bs.locator('button:has-text("Browser storage")').first().click({timeout: 3000}).catch(() => {}); + await bs.locator('button:has-text("Continue")').first().click({timeout: 5000}).catch(() => {}); + await page.waitForTimeout(400); + } +}; +const dismissTutorial = async () => { + const g = page.locator('button:has-text("Got It")').first(); + if (await g.count() && await g.isVisible().catch(() => false)) { await g.click({timeout: 3000}).catch(() => {}); await page.waitForTimeout(300); } +}; +const batchDialogOpen = async () => page.evaluate(() => /Import Assets \(/.test(document.body?.innerText || "")).catch(() => false); +const sceneState = async () => page.evaluate(() => (window.__stemGetScene ? window.__stemGetScene() : null)).catch(() => null); + +try { + await page.goto(baseUrl + "/dashboard?mode=playground", {waitUntil: "domcontentloaded", timeout: 30000}); + await page.waitForLoadState("networkidle", {timeout: 15000}).catch(() => {}); + await dismissBootstrap(); + await bootstrapFS(page); + logStep("filesystem (OPFS) store bootstrapped"); + + await page.goto(baseUrl + "/create/project", {waitUntil: "domcontentloaded", timeout: 30000}); + await page.waitForLoadState("networkidle", {timeout: 15000}).catch(() => {}); + await dismissBootstrap(); + await page.waitForTimeout(6000); + await dismissTutorial(); + assert("filesystem-store-selected", + (await page.evaluate(() => { try { return localStorage.getItem("stemstudio.persistence.mode"); } catch { return null; } })) === "filesystem"); + + const copilotBtn = page.locator('[data-testid="actionbar-copilot"]').first(); + const cBox = await copilotBtn.boundingBox().catch(() => null); + if (cBox) await page.mouse.click(cBox.x + cBox.width / 2, cBox.y + cBox.height / 2); + else await copilotBtn.click({timeout: 3000, force: true}).catch(() => {}); + await page.waitForTimeout(2000); + const hookPresent = await page.evaluate(() => typeof window.__stemRunScript === "function"); + assert("run-script-hook-exposed", hookPresent); + if (!hookPresent) throw new Error("no __stemRunScript"); + + // Fire the import; poll for completion, dismissing (and flagging) the batch + // dialog if it ever appears so the run can never hang silently. + await page.evaluate(({content, fileList}) => { + window.__done = null; window.__summary = null; + window.__stemRunScript(content, fileList).then( + s => { window.__done = "ok"; window.__summary = s ?? null; }, + e => { window.__done = String(e && e.message ? e.message : e); }, + ); + }, {content: scriptContent, fileList: folderFiles}); + + let dialogSeen = false, done = null; + const deadline = Date.now() + IMPORT_TIMEOUT_MS; + while (Date.now() < deadline) { + done = await page.evaluate(() => window.__done).catch(() => null); + if (done) break; + if (await batchDialogOpen()) { + dialogSeen = true; + const skip = page.locator('button:has-text("Skip All")').first(); + if (await skip.count()) await skip.click({timeout: 2000, force: true}).catch(() => {}); + else await page.keyboard.press("Escape").catch(() => {}); + } + await page.waitForTimeout(2500); + } + await page.waitForLoadState("networkidle", {timeout: 30000}).catch(() => {}); + await dismissTutorial(); + + assert("exec-completed", done === "ok", `done=${done}`); + assert("no-batch-import-dialog", !dialogSeen, "batch-import dialog appeared (an import failed to auto-resolve)"); + + const summary = await page.evaluate(() => window.__summary).catch(() => null); + report.runSummary = summary; + assert("import-no-failed-commands", !!summary && summary.failCount === 0, `summary=${JSON.stringify(summary)}`); + + const afterImport = await sceneState(); + const meshAfterImport = afterImport?.meshCount ?? 0; + report.meshAfterImport = meshAfterImport; + assert("models-present", meshAfterImport > 0, `meshCount=${meshAfterImport}`); + await page.screenshot({path: resolve(outDir, "01-after-import.png")}).catch(() => {}); + + // === Save → reload → assert assets survived (the persistence fallback paths). === + await page.locator('[data-testid="topnav-app-menu"]').first().click({timeout: 3000, force: true}).catch(() => {}); + await page.waitForTimeout(400); + const save = page.locator("text=Save Project").first(); + if (await save.isVisible().catch(() => false)) { + await save.click({timeout: 3000}).catch(() => {}); + await page.locator("text=/^Saved$/").first().waitFor({state: "visible", timeout: 120000}).catch(() => {}); + await page.waitForTimeout(1500); + } + const sceneId = (page.url().match(/\/create\/project\/([^/?#]+)/) || [])[1] || null; + assert("scene-id-resolved", !!sceneId, `URL: ${page.url()}`); + + await page.goto(baseUrl + "/dashboard?mode=playground", {waitUntil: "domcontentloaded", timeout: 20000}).catch(() => {}); + await page.waitForLoadState("networkidle", {timeout: 15000}).catch(() => {}); + await dismissBootstrap(); + await page.waitForTimeout(2000); + if (sceneId) { + const card = page.locator(`[data-scene-id="${sceneId}"]`).first(); + await card.waitFor({state: "attached", timeout: 30000}).catch(() => {}); + assert("imported-project-listed", (await card.count()) > 0, `data-scene-id="${sceneId}" not found`); + if (await card.count()) { + await card.click({timeout: 5000}).catch(() => {}); + await page.waitForLoadState("networkidle", {timeout: 30000}).catch(() => {}); + await page.waitForTimeout(8000); + await dismissTutorial(); + } + } + const afterReload = await sceneState(); + const meshAfterReload = afterReload?.meshCount ?? 0; + report.meshAfterReload = meshAfterReload; + await page.screenshot({path: resolve(outDir, "02-after-reload.png")}).catch(() => {}); + // The crux: if loadAssets silently dropped an asset, or ossSaveScene + // swallowed a persist failure, the reloaded scene would be missing geometry. + // Allow tiny variance but require the bulk of meshes to survive. + assert("assets-survive-reload", meshAfterReload >= Math.floor(meshAfterImport * 0.9), + `meshAfterImport=${meshAfterImport} meshAfterReload=${meshAfterReload}`); + + assert("no-uncaught-page-errors", report.consoleErrors.filter(e => e.startsWith("pageerror")).length === 0, + report.consoleErrors.filter(e => e.startsWith("pageerror"))[0] ?? ""); +} catch (err) { + logStep("fatal", "fail", {error: String(err && err.message ? err.message : err).slice(0, 300)}); + failures.push("fatal"); +} finally { + report.finishedAt = new Date().toISOString(); + report.failures = failures; + writeFileSync(resolve(outDir, "report.json"), JSON.stringify(report, null, 2)); + await browser.close(); +} + +console.log(`\n${failures.length === 0 ? "✅ PASS" : "❌ FAIL"} — ${Object.values(report.assertions).filter(a => a.pass).length}/${Object.keys(report.assertions).length} assertions passed`); +if (failures.length) console.log("failed: " + failures.join(", ")); +console.log("FALLBACK_VERIFY_DONE"); +process.exit(failures.length ? 1 : 0); diff --git a/scripts/playwright/oss-pirate-ship-playground.mjs b/scripts/playwright/oss-pirate-ship-playground.mjs index 4962414e..2b225b82 100644 --- a/scripts/playwright/oss-pirate-ship-playground.mjs +++ b/scripts/playwright/oss-pirate-ship-playground.mjs @@ -152,6 +152,27 @@ const dismissTutorial = async () => { } }; +// The batch-import dialog ("Import Assets (N required)") only appears when an +// import could NOT auto-resolve. In a headless run nobody clicks it, so it +// hangs runScript forever. A clean import (all files resolved) never shows it. +// We assert it does NOT appear; if it ever does, that's a real auto-resolution +// failure — record it (so the run fails loudly) and dismiss it so the harness +// doesn't hang for 20 minutes instead of reporting the problem. +const batchImportDialogAppeared = async () => + page.evaluate(() => /Import Assets \(/.test(document.body?.innerText || "")).catch(() => false); +const dismissBatchImportDialogIfPresent = async () => { + if (!(await batchImportDialogAppeared())) return false; + // Skip All → continue the script; the skipped imports show up in failCount. + const skip = page.locator('button:has-text("Skip All")').first(); + if (await skip.count() && await skip.isVisible().catch(() => false)) { + await skip.click({timeout: 3000, force: true}).catch(() => {}); + } else { + await page.keyboard.press("Escape").catch(() => {}); + } + await page.waitForTimeout(500); + return true; +}; + try { // === Activate playground mode, then seed the filesystem store. === await page.goto(baseUrl + "/dashboard?mode=playground", {waitUntil: "domcontentloaded", timeout: 30000}); @@ -183,22 +204,60 @@ try { if (!hookPresent) throw new Error("no stemRunScript"); // === Run the import. === + // Fire WITHOUT awaiting the whole import inside evaluate: that would block + // this flow and, if the batch-import dialog ever opened, hang forever. We + // poll for completion and dismiss the dialog if it appears. const execStartUrl = page.url(); try { - await page.evaluate(({content, fileList}) => + await page.evaluate(({content, fileList}) => { + window.__stemRunScriptDone = null; + window.__stemRunScriptSummary = null; window.__stemRunScript(content, fileList).then( - () => { window.__stemRunScriptDone = "ok"; }, + summary => { window.__stemRunScriptDone = "ok"; window.__stemRunScriptSummary = summary ?? null; }, err => { window.__stemRunScriptDone = String(err && err.message ? err.message : err); }, - ), {content: scriptContent, fileList: folderFiles}); + ); + }, {content: scriptContent, fileList: folderFiles}); } catch (e) { - logStep("exec evaluate detached (likely navigation)", "warn", {error: e.message.slice(0, 120)}); + logStep("exec fire detached (likely navigation)", "warn", {error: e.message.slice(0, 120)}); } - await page.waitForLoadState("networkidle", {timeout: 120000}).catch(() => {}); - await page.waitForTimeout(6000); + // Poll until the run resolves (a full game import takes a few minutes). + let importDialogSeen = false; + const importDeadline = Date.now() + 15 * 60 * 1000; + let execResult = null; + while (Date.now() < importDeadline) { + execResult = await page.evaluate(() => window.__stemRunScriptDone ?? null).catch(() => null); + if (execResult) break; + if (await dismissBatchImportDialogIfPresent()) importDialogSeen = true; + await page.waitForTimeout(3000); + } + await page.waitForLoadState("networkidle", {timeout: 60000}).catch(() => {}); await dismissTutorial(); - const execResult = await page.evaluate(() => window.__stemRunScriptDone ?? null).catch(() => null); const execOk = execResult === "ok" || page.url() !== execStartUrl; - assert("exec-completed", execOk, execResult ?? "no completion signal"); + assert("exec-completed", execOk, execResult ?? "no completion signal (timed out)"); + // The dialog must NOT have appeared — if it did, an import failed to + // auto-resolve (the exact bug that hung this game's import headlessly). + assert("no-batch-import-dialog", !importDialogSeen, + "batch-import dialog appeared — an import failed to auto-resolve"); + + // The import must be COMPLETE, not merely "finished". A non-zero failCount + // means at least one command (including an unresolved asset import) failed — + // exactly the silent-skip class of bug (skybox_day.glb) we refuse to let + // masquerade as a clean import. + const runSummary = await page.evaluate(() => window.__stemRunScriptSummary ?? null).catch(() => null); + report.runSummary = runSummary; + assert("import-no-failed-commands", !!runSummary && runSummary.failCount === 0, + `summary=${JSON.stringify(runSummary)}`); + + // The skybox is an imported model object; assert it actually landed in the + // scene rather than being silently dropped during resolution. + const sceneAudit = await page.evaluate(() => (window.__stemGetScene ? window.__stemGetScene() : null)).catch(() => null); + const objectNames = sceneAudit?.objectNames ?? []; + report.importedObjectCount = objectNames.length; + assert("skybox-object-present", objectNames.some(n => /skybox/i.test(n)), + `no object matching /skybox/ in ${objectNames.length} objects`); + // A real game import lands many models — guard against an empty/partial scene. + assert("scene-has-models", (sceneAudit?.meshCount ?? 0) > 0, `meshCount=${sceneAudit?.meshCount ?? 0}`); + await page.screenshot({path: resolve(outDir, "01-after-import.png")}).catch(() => {}); // No "Image derivative missing dataUrl" while the OceanSurface base map loads.

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 From 30cf9b160ac10cc39568bf80a394343d3944df41 Mon Sep 17 00:00:00 2001 From: Nitin Khanna Date: Sun, 31 May 2026 10:56:45 -0700 Subject: [PATCH 6/7] docs(readme): add per-OS dev environment setup (macOS, Windows, Linux) Quick start listed the Bun/Go/Node prerequisites but never said how to install them per platform. Add a "Setting up your dev environment" section with install steps for macOS (Homebrew), Linux (bun script + nvm + Go tarball), and Windows (WSL2 recommended, since the npm scripts use inline BUILD_MODE=oss env prefixes and .sh deploy scripts that don't run under native cmd/PowerShell), plus a verify step. Cross-link with Quick start. Co-Authored-By: Claude Opus 4.8 (1M context) --- README.md | 68 ++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 67 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 9265cff6..858ad6c6 100644 --- a/README.md +++ b/README.md @@ -30,7 +30,7 @@ If StemStudio is useful to you or your organization, please consider sponsoring ## Quick start -Prerequisites: [Bun](https://bun.sh) 1.0+, [Go](https://go.dev) 1.21+, [Node.js](https://nodejs.org) 20+. +Prerequisites: [Bun](https://bun.sh) 1.0+, [Go](https://go.dev) 1.21+, [Node.js](https://nodejs.org) 20+. New machine? See [Setting up your dev environment](#setting-up-your-dev-environment) for per-OS install steps (macOS, Windows, Linux). ```bash git clone https://github.com/your-org/stemstudio.git @@ -60,6 +60,72 @@ ANYTHING_WORLD_API_KEY=... Any key you omit makes that provider unavailable — the editor will prompt you for it when you first try a feature that needs it. +## Setting up your dev environment + +You need three tools on your `PATH`: **[Bun](https://bun.sh) 1.0+** (package manager + task runner), **[Go](https://go.dev) 1.21+** (the AI proxy server), and **[Node.js](https://nodejs.org) 20+** with `npm` (the multiplayer sidecar). Pick your OS below, then continue with [Quick start](#quick-start). + +### macOS + +Using [Homebrew](https://brew.sh): + +```bash +brew install oven-sh/bun/bun go node git +``` + +Or install each from its official site (links above). Apple Silicon and Intel are both supported. + +### Linux + +```bash +# Bun +curl -fsSL https://bun.sh/install | bash + +# Node.js 20+ — via nvm (recommended; distro packages are often older) +curl -fsSL https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash +nvm install 20 + +# Go 1.21+ — prefer the official tarball; distro `golang-go` may lag +# https://go.dev/doc/install (or: sudo apt install golang-go / sudo dnf install golang) + +# Build essentials for any native dependency compilation +sudo apt install -y build-essential git # Debian/Ubuntu +# sudo dnf groupinstall "Development Tools" # Fedora/RHEL +``` + +Open a new shell (or `source ~/.bashrc`) so the freshly installed tools land on your `PATH`. + +### Windows + +**Use [WSL2](https://learn.microsoft.com/windows/wsl/install) (recommended).** Several `package.json` scripts use Unix-shell idioms — inline env vars like `BUILD_MODE=oss …` and `.sh` deploy scripts — that do not run under native `cmd`/PowerShell. WSL2 gives you a real Linux shell where everything works as documented. + +```powershell +wsl --install # installs Ubuntu; reboot if prompted +``` + +Then open the **Ubuntu** terminal and follow the **Linux** instructions above. Clone the repo *inside* the WSL filesystem (e.g. `~/code/…`, not `/mnt/c/…`) for usable file-watch and build performance. + +

1G;(~3{ElL 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 z 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⋘E@7YOP{XA>bTtSSlY<;z^eX?`x=F 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