@forgeax/view 0.4.1 → 0.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (128) hide show
  1. package/README.md +21 -7
  2. package/dist/build-revision.json +1 -1
  3. package/dist/modules/backend.mjs +11 -11
  4. package/dist/modules/browser.mjs +16 -16
  5. package/dist/modules/chunks/{App-E3M52XTQ.mjs → App-4XQ5SNNT.mjs} +2 -2
  6. package/dist/modules/chunks/{chunk-3GIGTM7E.mjs → chunk-27XASYEH.mjs} +2 -2
  7. package/dist/modules/chunks/{chunk-UAGQZPAB.mjs → chunk-2Z5KEV6L.mjs} +2 -2
  8. package/dist/modules/chunks/{chunk-4NGODRIE.mjs → chunk-46UEGAXY.mjs} +4 -4
  9. package/dist/modules/chunks/{chunk-UZHTLAIZ.mjs → chunk-47RJSHLM.mjs} +2 -2
  10. package/dist/modules/chunks/{chunk-L5EV6NEE.mjs → chunk-4JGCYD3Q.mjs} +3 -3
  11. package/dist/modules/chunks/{chunk-ACOMGSSB.mjs → chunk-5PHAXNFO.mjs} +2 -2
  12. package/dist/modules/chunks/{chunk-45ZU2HHR.mjs → chunk-B6QUJ33G.mjs} +27 -23
  13. package/dist/modules/chunks/chunk-B6QUJ33G.mjs.map +7 -0
  14. package/dist/modules/chunks/{chunk-FKLYSAVN.mjs → chunk-CXOD7FW6.mjs} +7 -4
  15. package/dist/modules/chunks/chunk-CXOD7FW6.mjs.map +7 -0
  16. package/dist/modules/chunks/{chunk-CRNEX7YH.mjs → chunk-D25SR5FS.mjs} +2 -2
  17. package/dist/modules/chunks/{chunk-PG4AJFDC.mjs → chunk-DJZGRO7W.mjs} +12 -12
  18. package/dist/modules/chunks/{chunk-MHE5EBU4.mjs → chunk-E3PJGTLI.mjs} +22 -14
  19. package/dist/modules/chunks/chunk-E3PJGTLI.mjs.map +7 -0
  20. package/dist/modules/chunks/{chunk-3Q26HNFS.mjs → chunk-FICPCJKR.mjs} +2 -2
  21. package/dist/modules/chunks/{chunk-CWNB67UF.mjs → chunk-FMCHH5R4.mjs} +2 -2
  22. package/dist/modules/chunks/{chunk-TTFLJHQZ.mjs → chunk-H4UIESCF.mjs} +6 -6
  23. package/dist/modules/chunks/{chunk-TTFLJHQZ.mjs.map → chunk-H4UIESCF.mjs.map} +1 -1
  24. package/dist/modules/chunks/{chunk-MO5LILCP.mjs → chunk-HWZCLROY.mjs} +6 -2
  25. package/dist/modules/chunks/chunk-HWZCLROY.mjs.map +7 -0
  26. package/dist/modules/chunks/{chunk-2VJPRNYB.mjs → chunk-IZAHIOFU.mjs} +4 -4
  27. package/dist/modules/chunks/{chunk-BGK4ZEQ5.mjs → chunk-KX2WU5Z6.mjs} +2 -2
  28. package/dist/modules/chunks/{chunk-TBZZ37VI.mjs → chunk-KYTG2MKV.mjs} +3 -3
  29. package/dist/modules/chunks/{chunk-M5X56JWH.mjs → chunk-PW5CE2Y6.mjs} +3 -3
  30. package/dist/modules/chunks/{chunk-OHVTNEQ2.mjs → chunk-PZIAKZJC.mjs} +2 -2
  31. package/dist/modules/chunks/{chunk-WHVPE2P6.mjs → chunk-Q2ZYLFJM.mjs} +4 -4
  32. package/dist/modules/chunks/{chunk-WHVPE2P6.mjs.map → chunk-Q2ZYLFJM.mjs.map} +1 -1
  33. package/dist/modules/chunks/{chunk-JZ3V27HQ.mjs → chunk-U64FRQKP.mjs} +3 -3
  34. package/dist/modules/chunks/{chunk-W46L4HSP.mjs → chunk-U6UMATPV.mjs} +3 -3
  35. package/dist/modules/chunks/{chunk-7ICJKZYO.mjs → chunk-VKNIYV2W.mjs} +26 -21
  36. package/dist/modules/chunks/chunk-VKNIYV2W.mjs.map +7 -0
  37. package/dist/modules/chunks/{chunk-7R6CGQDU.mjs → chunk-VW2ZF3P4.mjs} +4 -4
  38. package/dist/modules/chunks/{chunk-AIIYGGGC.mjs → chunk-X4NNZ5X6.mjs} +2 -2
  39. package/dist/modules/chunks/{chunk-BCTPTLA6.mjs → chunk-XEE3E42Q.mjs} +3 -3
  40. package/dist/modules/chunks/{chunk-CDO6LELS.mjs → chunk-Y2IAXE2C.mjs} +3 -3
  41. package/dist/modules/chunks/{chunk-6WCG6WPC.mjs → chunk-YNHEYXDG.mjs} +3 -3
  42. package/dist/modules/chunks/{chunk-7MJUWNVI.mjs → chunk-ZGOGO7SS.mjs} +1 -1
  43. package/dist/modules/chunks/{chunk-VXSD4FK5.mjs → chunk-ZHO2G4JR.mjs} +3 -3
  44. package/dist/modules/embedded.mjs +100 -21
  45. package/dist/modules/embedded.mjs.map +3 -3
  46. package/dist/modules/frontend-root.mjs +15 -15
  47. package/dist/modules/index.mjs +21 -21
  48. package/dist/modules/plugin.mjs +11 -11
  49. package/dist/modules/plugins/asset/frontend.mjs +4 -4
  50. package/dist/modules/plugins/asset/identity.mjs +3 -3
  51. package/dist/modules/plugins/asset/ui.mjs +2 -2
  52. package/dist/modules/plugins/content-browser/ui.mjs +2 -2
  53. package/dist/modules/plugins/inspector/ui.mjs +2 -2
  54. package/dist/modules/plugins/material/frontend.mjs +4 -4
  55. package/dist/modules/plugins/material/identity.mjs +3 -3
  56. package/dist/modules/plugins/material/ui.mjs +5 -5
  57. package/dist/modules/plugins/mesh/frontend.mjs +4 -4
  58. package/dist/modules/plugins/mesh/identity.mjs +3 -3
  59. package/dist/modules/plugins/mesh/ui.mjs +5 -5
  60. package/dist/modules/plugins/plugins/ui/panel.mjs +2 -2
  61. package/dist/modules/plugins/plugins/ui.mjs +3 -3
  62. package/dist/modules/plugins/scene-tree/ui.mjs +2 -2
  63. package/dist/modules/plugins/texture/frontend.mjs +4 -4
  64. package/dist/modules/plugins/texture/identity.mjs +3 -3
  65. package/dist/modules/plugins/texture/ui.mjs +5 -5
  66. package/dist/modules/plugins/viewport/frontend.mjs +1 -1
  67. package/dist/modules/product.mjs +11 -11
  68. package/dist/modules/shell/frontend.mjs +1 -1
  69. package/dist/modules/viewer/catalog/backend.mjs +10 -10
  70. package/dist/modules/viewer/catalog/frontend.mjs +14 -14
  71. package/dist/modules/viewer/catalog/shared.mjs +7 -7
  72. package/dist/modules/viewer/catalog.mjs +17 -17
  73. package/dist/modules/viewer-host/frontend.mjs +16 -16
  74. package/dist/modules/viewer.mjs +17 -17
  75. package/dist/modules/workspace/backend.mjs +2 -2
  76. package/dist/modules/workspace/broker.mjs +1 -1
  77. package/dist/modules/workspace/preview-surface.mjs +1 -1
  78. package/dist/modules/workspace/resource-page.mjs +2 -2
  79. package/dist/viewer/assets/{embedded-DWrXFZbD.js → embedded-Ch4NawY-.js} +2 -2
  80. package/dist/viewer/assets/{embedded-DWrXFZbD.js.map → embedded-Ch4NawY-.js.map} +1 -1
  81. package/dist/viewer/assets/main-DUQJ1NlR.js +22 -0
  82. package/dist/viewer/assets/main-DUQJ1NlR.js.map +1 -0
  83. package/dist/viewer/assets/{panels-lazy-CUTQACqc.js → panels-lazy-DbOAvYN1.js} +3 -3
  84. package/dist/viewer/assets/{panels-lazy-CUTQACqc.js.map → panels-lazy-DbOAvYN1.js.map} +1 -1
  85. package/dist/viewer/assets/panels-ui-DICIsCag.js +12 -0
  86. package/dist/viewer/assets/panels-ui-DICIsCag.js.map +1 -0
  87. package/dist/viewer/assets/style-gOtSMZif.css +2 -0
  88. package/dist/viewer/index.html +4 -4
  89. package/dist/viewer/panels.js +1 -1
  90. package/package.json +3 -4
  91. package/scripts/browser-proof-workload.mjs +0 -1
  92. package/scripts/verify-runtime-content-engine.mjs +12 -6
  93. package/dist/modules/chunks/chunk-45ZU2HHR.mjs.map +0 -7
  94. package/dist/modules/chunks/chunk-7ICJKZYO.mjs.map +0 -7
  95. package/dist/modules/chunks/chunk-FKLYSAVN.mjs.map +0 -7
  96. package/dist/modules/chunks/chunk-MHE5EBU4.mjs.map +0 -7
  97. package/dist/modules/chunks/chunk-MO5LILCP.mjs.map +0 -7
  98. package/dist/viewer/assets/main-D0JG9szD.js +0 -22
  99. package/dist/viewer/assets/main-D0JG9szD.js.map +0 -1
  100. package/dist/viewer/assets/panels-ui-Kvu5G7za.js +0 -12
  101. package/dist/viewer/assets/panels-ui-Kvu5G7za.js.map +0 -1
  102. package/dist/viewer/assets/style-BM0losky.css +0 -2
  103. package/scripts/verify-game3d-workspace.mjs +0 -318
  104. /package/dist/modules/chunks/{App-E3M52XTQ.mjs.map → App-4XQ5SNNT.mjs.map} +0 -0
  105. /package/dist/modules/chunks/{chunk-3GIGTM7E.mjs.map → chunk-27XASYEH.mjs.map} +0 -0
  106. /package/dist/modules/chunks/{chunk-UAGQZPAB.mjs.map → chunk-2Z5KEV6L.mjs.map} +0 -0
  107. /package/dist/modules/chunks/{chunk-4NGODRIE.mjs.map → chunk-46UEGAXY.mjs.map} +0 -0
  108. /package/dist/modules/chunks/{chunk-UZHTLAIZ.mjs.map → chunk-47RJSHLM.mjs.map} +0 -0
  109. /package/dist/modules/chunks/{chunk-L5EV6NEE.mjs.map → chunk-4JGCYD3Q.mjs.map} +0 -0
  110. /package/dist/modules/chunks/{chunk-ACOMGSSB.mjs.map → chunk-5PHAXNFO.mjs.map} +0 -0
  111. /package/dist/modules/chunks/{chunk-CRNEX7YH.mjs.map → chunk-D25SR5FS.mjs.map} +0 -0
  112. /package/dist/modules/chunks/{chunk-PG4AJFDC.mjs.map → chunk-DJZGRO7W.mjs.map} +0 -0
  113. /package/dist/modules/chunks/{chunk-3Q26HNFS.mjs.map → chunk-FICPCJKR.mjs.map} +0 -0
  114. /package/dist/modules/chunks/{chunk-CWNB67UF.mjs.map → chunk-FMCHH5R4.mjs.map} +0 -0
  115. /package/dist/modules/chunks/{chunk-2VJPRNYB.mjs.map → chunk-IZAHIOFU.mjs.map} +0 -0
  116. /package/dist/modules/chunks/{chunk-BGK4ZEQ5.mjs.map → chunk-KX2WU5Z6.mjs.map} +0 -0
  117. /package/dist/modules/chunks/{chunk-TBZZ37VI.mjs.map → chunk-KYTG2MKV.mjs.map} +0 -0
  118. /package/dist/modules/chunks/{chunk-M5X56JWH.mjs.map → chunk-PW5CE2Y6.mjs.map} +0 -0
  119. /package/dist/modules/chunks/{chunk-OHVTNEQ2.mjs.map → chunk-PZIAKZJC.mjs.map} +0 -0
  120. /package/dist/modules/chunks/{chunk-JZ3V27HQ.mjs.map → chunk-U64FRQKP.mjs.map} +0 -0
  121. /package/dist/modules/chunks/{chunk-W46L4HSP.mjs.map → chunk-U6UMATPV.mjs.map} +0 -0
  122. /package/dist/modules/chunks/{chunk-7R6CGQDU.mjs.map → chunk-VW2ZF3P4.mjs.map} +0 -0
  123. /package/dist/modules/chunks/{chunk-AIIYGGGC.mjs.map → chunk-X4NNZ5X6.mjs.map} +0 -0
  124. /package/dist/modules/chunks/{chunk-BCTPTLA6.mjs.map → chunk-XEE3E42Q.mjs.map} +0 -0
  125. /package/dist/modules/chunks/{chunk-CDO6LELS.mjs.map → chunk-Y2IAXE2C.mjs.map} +0 -0
  126. /package/dist/modules/chunks/{chunk-6WCG6WPC.mjs.map → chunk-YNHEYXDG.mjs.map} +0 -0
  127. /package/dist/modules/chunks/{chunk-7MJUWNVI.mjs.map → chunk-ZGOGO7SS.mjs.map} +0 -0
  128. /package/dist/modules/chunks/{chunk-VXSD4FK5.mjs.map → chunk-ZHO2G4JR.mjs.map} +0 -0
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../packages/view-plugin-viewport/src/page-input-gate.ts", "../../../packages/view-plugin-viewport/src/play-toolbar.ts", "../../../packages/view-plugin-viewport/src/editor-surface.ts", "../../../packages/view-plugin-viewport/src/engine-fatal-banner.ts", "../../../packages/view-plugin-viewport/src/frontend.ts"],
4
+ "sourcesContent": ["import type { CanvasInputBoundary } from '@forgeax/engine/input';\nimport { PAGE_TYPE } from './identity.ts';\n\n/**\n * Engine's browser input backend listens on window. When the Editor page is\n * not the active page tab, drop those samples so a sibling preview cannot\n * drive the viewport camera or game.\n */\nexport function attachViewportPageInputGate({ element, input, pageType = PAGE_TYPE, document }: { element?: HTMLElement; input?: Pick<CanvasInputBoundary, 'editor'>; pageType?: string; document?: Document } = {}) {\n const editor = input?.editor;\n if (!element || typeof editor?.setInputAllowed !== 'function') return () => {};\n const ownerDocument = document ?? element.ownerDocument ?? globalThis.document;\n const sync = () => {\n const page = typeof element.closest === 'function'\n ? element.closest('[data-forgeax-view-dock-page]')\n : null;\n const pageHidden = page?.getAttribute?.('aria-hidden') === 'true';\n const activePage = ownerDocument?.documentElement?.dataset?.forgeaxViewActivePage;\n const active = !pageHidden && (activePage === undefined || activePage === pageType);\n editor.setInputAllowed?.(active);\n };\n const observer = typeof MutationObserver === 'function'\n ? new MutationObserver(sync)\n : undefined;\n const root = ownerDocument?.documentElement;\n try {\n if (root) observer?.observe(root, {\n attributes: true,\n attributeFilter: ['data-forgeax-view-active-page', 'aria-hidden'],\n subtree: true,\n });\n } catch {\n observer?.disconnect();\n }\n sync();\n return () => {\n observer?.disconnect();\n editor.setInputAllowed?.(true);\n };\n}\n", "import type { ViewWorkspaceClient } from '@forgeax/view-workspace-core/client';\nimport type { WorkspaceState } from '@forgeax/view-workspace-core/contract';\nimport { createWorkspaceStateReader } from '@forgeax/view-workspace-core/workspace-state';\n\n/** Presentation commands use the same target API as the CLI and object panels. */\nexport function mountPlayToolbar({ document, element, client }: { document: Document; element: HTMLElement; client: ViewWorkspaceClient }) {\n const toolbar = document.createElement('div');\n toolbar.setAttribute('role', 'toolbar');\n toolbar.setAttribute('aria-label', 'Editor execution');\n Object.assign(toolbar.style, { display: 'flex', gap: '6px', padding: '6px', alignItems: 'center', flexShrink: '0' });\n const surface = document.createElement('div');\n Object.assign(surface.style, { position: 'relative', flex: '1', minHeight: '0' });\n Object.assign(element.style, { display: 'flex', flexDirection: 'column', height: '100%' });\n element.append(toolbar, surface);\n let state: WorkspaceState | null = null;\n let navigationSpeed = 4;\n let errorText = '';\n let disposed = false;\n let playRequest: AbortController | undefined;\n let playStage = '';\n const pending = new Set<string>();\n const buttons: { button: HTMLButtonElement; label: () => string; available: () => boolean }[] = [];\n const status = document.createElement('span');\n status.title = 'WASD/QE: move \u00B7 Shift: boost \u00B7 RMB drag: look / fly \u00B7 RMB + wheel: speed \u00B7 MMB: pan \u00B7 Alt + drag: orbit/pan/dolly \u00B7 F: focus \u00B7 Esc: release';\n status.setAttribute('role', 'status');\n status.style.color = 'var(--fx-color-text-secondary)';\n // Always-visible navigation hint in the viewport corner; pointer-events stay\n // off so it never intercepts camera input.\n const navHint = document.createElement('div');\n navHint.textContent = 'WASD/QE move \u00B7 Shift boost \u00B7 RMB look/fly \u00B7 wheel speed \u00B7 F focus';\n Object.assign(navHint.style, {\n position: 'absolute', right: '8px', bottom: '6px', zIndex: '1',\n fontSize: '11px', lineHeight: '1.4', pointerEvents: 'none', userSelect: 'none',\n color: 'var(--fx-color-text-secondary)', opacity: '0.75',\n textShadow: '0 1px 2px var(--fx-color-background, rgba(0,0,0,0.5))',\n });\n surface.append(navHint);\n const args = () => ({ targetId: state!.play!.target.targetId, targetGeneration: state!.play!.target.generation });\n const control = () => state?.targetBinding === 'play' ? (state?.preview?.camera as { control?: string } | undefined)?.control : undefined;\n const running = () => state?.play?.phase === 'running' && state?.targetBinding === 'play';\n const add = (name: string | (() => string), run: (action: string) => unknown, available: () => boolean) => {\n const label = typeof name === 'string' ? () => name : name;\n const button = document.createElement('button');\n button.textContent = label();\n button.type = 'button';\n button.className = 'fx-button fx-button--compact';\n button.setAttribute('data-action', `editor.${label().toLowerCase()}`);\n button.addEventListener('click', async () => {\n const action = label();\n pending.add(action); errorText = ''; render();\n try { await run(action); if (!disposed) state = await client.getState(); }\n catch (error) { if (!disposed) errorText = error instanceof Error ? ('hint' in error && typeof error.hint === 'string' ? error.hint : error.message) : String(error); }\n finally { pending.delete(action); if (!disposed) render(); }\n });\n buttons.push({ button, label, available }); toolbar.append(button);\n };\n add(() => state?.play || pending.has('Play') ? 'Stop' : 'Play', async (action) => {\n if (action === 'Stop') {\n playRequest?.abort();\n if (state?.play) await client.call('play.stop', args());\n return;\n }\n const controller = new AbortController();\n const started = performance.now();\n const log = (stage: string) => console.info('[forgeax.play]', JSON.stringify({\n stage, elapsedMs: Math.round(performance.now() - started),\n }));\n playRequest = controller;\n try {\n log('click');\n const options = { signal: controller.signal };\n log('play.start');\n const opened = await client.call<WorkspaceState>('play.start', { projectId: state!.project!.id }, options);\n log('play.start-returned');\n controller.signal.throwIfAborted();\n state = opened;\n playStage = 'Waiting for the game page\u2026';\n render();\n const target = { targetId: opened.play!.target.targetId, targetGeneration: opened.play!.target.generation };\n log('play.ready');\n await client.call('play.ready', target, options);\n log('play.ready-returned');\n controller.signal.throwIfAborted();\n playStage = 'Reading the game camera\u2026';\n render();\n log('camera.get');\n await client.call('camera.get', target, options);\n log('camera.get-returned');\n } catch (error) {\n if (!controller.signal.aborted) throw error;\n } finally {\n playStage = '';\n if (playRequest === controller) playRequest = undefined;\n }\n }, () => !!state?.project || !!state?.play || pending.has('Play'));\n add('Eject', () => client.call('target.control', { ...args(), mode: 'observer' }), () => running() && control() !== 'observer');\n add('Possess', () => client.call('target.control', { ...args(), mode: 'player' }), () => running() && control() === 'observer');\n add('Editor', () => client.call('target.select', { targetId: state!.editorPreview!.target.targetId }), () => !!state?.editorPreview && state?.targetBinding === 'play');\n add('Game', async () => {\n await client.call('target.select', { targetId: state!.play!.target.targetId });\n await client.call('camera.get', args());\n }, () => !!state?.play && state?.targetBinding !== 'play');\n toolbar.append(status);\n const render = () => {\n for (const { button, label, available } of buttons) {\n const action = label();\n if (button.textContent !== action) {\n button.textContent = action;\n button.setAttribute('data-action', `editor.${action.toLowerCase()}`);\n }\n const disabled = pending.has(action) || (pending.size > 0 && action !== 'Stop') || !available();\n if (button.disabled !== disabled) button.disabled = disabled;\n }\n const target = state?.targetBinding ?? 'editor';\n if (surface.dataset.forgeaxToolTarget !== target) surface.dataset.forgeaxToolTarget = target;\n let nextStatus = errorText || (state?.play\n ? `${state.targetBinding === 'play' ? 'Game' : 'Editor'} tools \u00B7 ${state.play.phase}${control() === 'observer' ? ' \u00B7 Free camera' : ''}`\n : pending.has('Play') ? (playStage || 'Preparing Play\u2026') : 'Editor tools');\n if (!errorText && state?.targetBinding !== 'play')\n nextStatus += ' \u00B7 Speed ' + navigationSpeed.toFixed(2);\n if (status.textContent !== nextStatus) status.textContent = nextStatus;\n };\n const reader = createWorkspaceStateReader(client);\n const unsubscribe = reader.subscribe(() => { if (!disposed) { state = reader.getSnapshot(); render(); } });\n render();\n return { surface,\n setNavigationSpeed(speed: number) { navigationSpeed = speed; if (!disposed) render(); },\n dispose() { disposed = true; playRequest?.abort(); unsubscribe(); toolbar.remove(); surface.remove(); } };\n}\n", "/** Fit the borrowed Editor container without a transformed or cross-tree overlay. */\nexport function fitEditorSurface(surface: HTMLElement) {\n const previous = surface.getAttribute?.('style');\n Object.assign(surface.style, {\n width: '100%', height: '100%', maxWidth: '100%', maxHeight: '100%',\n position: 'relative', transform: 'none', overflow: 'hidden',\n });\n return () => {\n if (previous == null) surface.removeAttribute?.('style');\n else surface.setAttribute?.('style', previous);\n };\n}\n", "const ENGINE_FATAL_ID = 'forgeax-fatal';\nconst BANNER_CLASS = 'fx-engine-fatal-banner';\nconst MESSAGE_CLASS = 'fx-engine-fatal-banner__message';\nconst ACTIONS_CLASS = 'fx-engine-fatal-banner__actions';\n\nfunction fatalElement(document: Document | undefined) {\n if (!document) return null;\n return document.getElementById?.(ENGINE_FATAL_ID)\n ?? document.querySelector?.<HTMLElement>(`#${ENGINE_FATAL_ID}`)\n ?? null;\n}\n\nfunction resolveHost(host: HTMLElement | (() => HTMLElement | null) | undefined) {\n return typeof host === 'function' ? host() : host;\n}\n\n/** Canvas box: #app-shell wraps #app. Fall back to the View targets cell. */\nfunction canvasHost(document: Document, fallback: HTMLElement | (() => HTMLElement | null) | undefined) {\n const canvas = document.querySelector?.('.fx-view-viewport-surface #app')\n ?? document.querySelector?.('#app');\n if (canvas?.parentElement) return canvas.parentElement;\n return document.querySelector?.<HTMLElement>('.fx-view-viewport-surface [data-forgeax-view-workspace=\"targets\"]')\n ?? resolveHost(fallback);\n}\n\nfunction readFatalText(notice: HTMLElement | null) {\n return typeof notice?.textContent === 'string' ? notice.textContent.trim() : '';\n}\n\n/** Engine's generated overlay has no event. show() sets #forgeax-fatal text and inline display:grid. */\nfunction isEngineFatalShown(notice: HTMLElement | null) {\n return notice?.style?.display === 'grid' && readFatalText(notice) !== '';\n}\n\nfunction button(document: Document, label: string, ariaLabel: string) {\n const node = document.createElement('button');\n node.type = 'button';\n node.className = 'fx-button fx-button--compact fx-button--quiet';\n node.textContent = label;\n node.setAttribute('aria-label', ariaLabel);\n return node;\n}\n\nfunction createBanner(document: Document, { onCopy, onClose }: { onCopy: (text: string, button: HTMLButtonElement) => void; onClose: () => void }) {\n const banner = document.createElement('div');\n banner.className = `${BANNER_CLASS} fx-ui`;\n banner.setAttribute('role', 'alert');\n banner.hidden = true;\n const message = document.createElement('pre');\n message.className = MESSAGE_CLASS;\n const actions = document.createElement('div');\n actions.className = ACTIONS_CLASS;\n const copy = button(document, 'Copy error', 'Copy the error reason');\n const close = button(document, 'Close', 'Dismiss the error banner');\n copy.addEventListener('click', (event) => {\n event.preventDefault();\n event.stopPropagation();\n onCopy(message.textContent?.trim() ?? '', copy);\n });\n close.addEventListener('click', (event) => {\n event.preventDefault();\n event.stopPropagation();\n onClose();\n });\n actions.append(copy, close);\n banner.append(message, actions);\n return { banner, message, copy };\n}\n\nfunction placeBanner(banner: HTMLElement, host: HTMLElement | null | undefined) {\n if (!host || banner.parentNode === host) return;\n host.append?.(banner);\n}\n\n/**\n * Engine does not publish a fatal event. This watches the generated overlay\n * node: id=forgeax-fatal, inline style.display=grid, non-empty textContent.\n * The banner is View DOM, absolutely positioned on the canvas box.\n */\nexport function attachEngineFatalBanner({\n document = globalThis.document,\n host,\n} : { document?: Document; host?: HTMLElement | (() => HTMLElement | null) } = {}) {\n if (!document?.createElement) return () => {};\n const { banner, message, copy } = createBanner(document, {\n onCopy(text, button) {\n if (!text || typeof navigator?.clipboard?.writeText !== 'function') return;\n void navigator.clipboard.writeText(text).then(() => {\n button.textContent = 'Copied';\n setTimeout(() => {\n if (button.isConnected) button.textContent = 'Copy error';\n }, 2000);\n }).catch(() => {});\n },\n onClose() {\n // Restore Engine's initial hidden overlay. Keep the node and its text;\n // show() looks it up by id and writes display:grid again.\n fatalElement(document)?.style?.removeProperty?.('display');\n banner.hidden = true;\n },\n });\n\n const sync = () => {\n placeBanner(banner, canvasHost(document, host));\n const notice = fatalElement(document);\n const text = readFatalText(notice);\n if (!isEngineFatalShown(notice)) {\n banner.hidden = true;\n return;\n }\n if (message.textContent !== text) message.textContent = text;\n if (copy.textContent !== 'Copy error') copy.textContent = 'Copy error';\n banner.hidden = false;\n };\n\n if (typeof MutationObserver !== 'function') {\n sync();\n return () => banner.remove?.();\n }\n\n const noticeObserver = new MutationObserver(sync);\n let observed: HTMLElement | null | undefined;\n const watchNotice = () => {\n const notice = fatalElement(document);\n if (!notice || notice === observed) {\n sync();\n return;\n }\n observed = notice;\n noticeObserver.observe(notice, {\n attributes: true,\n attributeFilter: ['style'],\n childList: true,\n subtree: true,\n characterData: true,\n });\n sync();\n };\n\n watchNotice();\n const root = document.documentElement ?? document.body;\n const rootObserver = root ? new MutationObserver(watchNotice) : undefined;\n if (root) rootObserver?.observe(root, { childList: true, subtree: true });\n return () => {\n noticeObserver.disconnect();\n rootObserver?.disconnect();\n banner.remove?.();\n };\n}\n", "import type { Context } from '@forgeax/engine-plugin';\nimport type { EngineWorkspacePresentation, EngineWorkspaceTarget } from '@forgeax/engine/app';\nimport type { FrontendConfig, PanelHost } from '@forgeax/view-workspace-core/frontend-contract';\nimport type { ViewWorkspaceClient } from '@forgeax/view-workspace-core/client';\nimport type { WorkspaceInputOptions } from './workspace-shell.ts';\nexport type ViewportFrontendConfig = FrontendConfig & { presentation?: EngineWorkspacePresentation; targetPresentation?: EngineWorkspacePresentation; viewportSurface?: HTMLElement; workspace?: { mountId?: string } };\ndeclare module '@forgeax/engine-plugin' {\n interface EngineContextServices {\n viewWorkspaceShell: ViewWorkspaceShell;\n viewPreviewInputController: (options: WorkspaceInputOptions) => ViewWorkspaceInputController;\n }\n}\nimport { readEnginePresentation } from '@forgeax/view-workspace-core/engine-presentation';\nimport { createBrowserPagePresentation, ViewWorkspaceInputController, ViewWorkspaceShell } from './workspace-shell.ts';\nimport { PAGE_TYPE, PANEL_CLOSABLE, PANEL_LAYOUT, FRONTEND_PLUGIN_ID, SLOT, TITLE_I18N_KEY } from './identity.ts';\nimport { attachViewportRenderResizeSync } from './render-resize-sync.ts';\nimport { attachViewportPageInputGate } from './page-input-gate.ts';\nimport { mountPlayToolbar } from './play-toolbar.ts';\nimport { fitEditorSurface } from './editor-surface.ts';\nimport { viewPlayPresentationPlugin } from './play-presentation.ts';\nimport { attachEngineFatalBanner } from './engine-fatal-banner.ts';\n\nfunction claimViewportPanel(panelHost: PanelHost) {\n return panelHost.claim({\n id: SLOT, pageType: PAGE_TYPE, titleKey: TITLE_I18N_KEY,\n activity: { labelKey: TITLE_I18N_KEY, icon: 'box' }, layout: PANEL_LAYOUT,\n closable: PANEL_CLOSABLE,\n dockTitleHidden: true,\n });\n}\n\nfunction liveWorkspacePresentation(ctx: Context, config: ViewportFrontendConfig, { api, document }: { api: ViewWorkspaceClient; document: Document }): EngineWorkspacePresentation {\n const read = () => readEnginePresentation(config, ctx);\n return new Proxy<EngineWorkspacePresentation>({}, {\n get(_, prop) {\n if (prop === 'surfacePlacement') return 'shell';\n const workspace = read();\n if (prop === 'attach') {\n return async (input: { target: EngineWorkspaceTarget; element: unknown; tabId?: string }) => {\n const remove = await workspace?.attach?.(input);\n const surface = input.element as HTMLElement | null | undefined;\n if (!surface?.style || !surface.parentElement) return remove;\n const onContextMenu = (event: MouseEvent) => {\n event.preventDefault();\n };\n surface.addEventListener?.('contextmenu', onContextMenu);\n const restoreFit = fitEditorSurface(surface);\n const detachResize = attachViewportRenderResizeSync({\n api,\n surface,\n target: input.target,\n });\n return async () => {\n detachResize();\n surface.removeEventListener?.('contextmenu', onContextMenu);\n restoreFit();\n await remove?.();\n };\n };\n }\n if (prop === 'createSurface') {\n if (typeof workspace?.createSurface === 'function') return workspace.createSurface;\n return (input: { document?: Document }) => (input?.document ?? document)?.getElementById?.('app-shell') ?? null;\n }\n return prop === 'detach' ? workspace?.detach : undefined;\n },\n });\n}\n\nconst viewportSurfacePlugin = {\n name: FRONTEND_PLUGIN_ID,\n inject: ['viewOperationClient', 'viewPlayPresentation'],\n provide: ['viewWorkspaceShell', 'viewPreviewInputController'],\n async apply(ctx: Context, config: ViewportFrontendConfig = {}) {\n ctx.provide('viewPreviewInputController', (options) => new ViewWorkspaceInputController(options));\n const document = config.document ?? globalThis.document;\n const api = ctx.get('viewOperationClient')!;\n const element = config.viewportSurface;\n if (!element || !document?.createElement) return;\n const workspace = readEnginePresentation(config, ctx);\n if (workspace && !ctx.get('engineWorkspacePresentation', false)) {\n ctx.provide('engineWorkspacePresentation', workspace);\n }\n const presentation = {\n workspace: liveWorkspacePresentation(ctx, config, { api, document }),\n display: createBrowserPagePresentation({ document }),\n };\n let shell: ViewWorkspaceShell | undefined;\n let play: ReturnType<typeof mountPlayToolbar> | undefined;\n try {\n play = mountPlayToolbar({ document, element, client: api });\n const mainSurface = document.createElement('div');\n Object.assign(mainSurface.style, {\n flex: '1',\n minWidth: '0',\n minHeight: '0',\n width: '100%',\n height: '100%',\n position: 'relative',\n });\n Object.assign(play.surface.style, { display: 'flex' });\n play.surface.append(mainSurface);\n ctx.effect(() => ctx.get('viewPlayPresentation')!.attach(mainSurface));\n shell = new ViewWorkspaceShell({ document, element: mainSurface, mountId: element.id,\n api, presentation,\n resourceBrowser: false, inspectorPanel: false, presentationOnly: true,\n onNavigationSpeed: speed => play?.setNavigationSpeed(speed),\n });\n ctx.provide('viewWorkspaceShell', shell);\n ctx.effect(() => attachEngineFatalBanner({ document, host: mainSurface }));\n ctx.effect(() => attachViewportPageInputGate({\n element,\n input: ctx.get('engineWorkspaceInput', false),\n pageType: PAGE_TYPE,\n document,\n }));\n } catch (error) {\n await shell?.dispose(); play?.dispose(); throw error;\n }\n ctx.effect(() => async () => { await shell?.dispose(); play?.dispose(); });\n },\n};\n\nconst viewViewportFrontendPlugin = {\n name: FRONTEND_PLUGIN_ID,\n inject: ['viewOperationClient', 'viewScenePage'],\n async apply(ctx: Context, config: ViewportFrontendConfig = {}) {\n const panelHost = config.panelHost ?? ctx.get?.('panelHost', false);\n if (!panelHost) return;\n const unclaim = claimViewportPanel(panelHost);\n ctx.effect(() => unclaim);\n // Play/Engine providers suspend only the canvas inside this fill slot.\n // The dock is claimed with the other editor panels as soon as the page exists.\n const document = config.document ?? globalThis.document;\n if (!document?.createElement) return;\n const element = document.createElement('div');\n element.id = config.workspace?.mountId ?? 'forgeax-view-workspace';\n element.className = 'fx-view-viewport-surface';\n await panelHost.waitForSlot(SLOT);\n const unmount = panelHost.mount(SLOT, element);\n ctx.effect(() => () => unmount?.());\n await ctx.plugin({\n ...viewportSurfacePlugin,\n name: `${FRONTEND_PLUGIN_ID}.surface`,\n }, { ...config, viewportSurface: element });\n },\n};\n\nexport { viewViewportFrontendPlugin, viewPlayPresentationPlugin };\nexport default viewViewportFrontendPlugin;\n"],
5
+ "mappings": "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",
6
+ "names": ["button", "button"]
7
+ }
@@ -17,7 +17,7 @@ import {
17
17
  Toolbar,
18
18
  useOverlayRoot,
19
19
  useWorkspaceClientConnected
20
- } from "./chunk-FKLYSAVN.mjs";
20
+ } from "./chunk-CXOD7FW6.mjs";
21
21
  import {
22
22
  createWorkspaceObservation,
23
23
  createWorkspaceStateReader
@@ -919,4 +919,4 @@ async function mountSceneTreePanel(props) {
919
919
  export {
920
920
  mountSceneTreePanel
921
921
  };
922
- //# sourceMappingURL=chunk-3Q26HNFS.mjs.map
922
+ //# sourceMappingURL=chunk-FICPCJKR.mjs.map
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  RESOURCE_PREVIEW_LAYOUT,
3
3
  RESOURCE_PROPERTIES_LAYOUT
4
- } from "./chunk-BGK4ZEQ5.mjs";
4
+ } from "./chunk-KX2WU5Z6.mjs";
5
5
  import {
6
6
  VIEW_PAGE_TYPES
7
7
  } from "./chunk-E3Z7GLFU.mjs";
@@ -74,4 +74,4 @@ export {
74
74
  PROPERTIES_TITLE_I18N_KEY,
75
75
  identity_exports
76
76
  };
77
- //# sourceMappingURL=chunk-CWNB67UF.mjs.map
77
+ //# sourceMappingURL=chunk-FMCHH5R4.mjs.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  identity_exports as identity_exports9
3
- } from "./chunk-CRNEX7YH.mjs";
3
+ } from "./chunk-D25SR5FS.mjs";
4
4
  import {
5
5
  BACKEND_MODULE,
6
6
  BACKEND_PLUGIN_ID,
@@ -13,16 +13,16 @@ import {
13
13
  } from "./chunk-EWSCJF77.mjs";
14
14
  import {
15
15
  identity_exports as identity_exports7
16
- } from "./chunk-AIIYGGGC.mjs";
16
+ } from "./chunk-X4NNZ5X6.mjs";
17
17
  import {
18
18
  identity_exports as identity_exports8
19
- } from "./chunk-CWNB67UF.mjs";
19
+ } from "./chunk-FMCHH5R4.mjs";
20
20
  import {
21
21
  identity_exports as identity_exports5
22
22
  } from "./chunk-STQPRNEO.mjs";
23
23
  import {
24
24
  identity_exports as identity_exports6
25
- } from "./chunk-OHVTNEQ2.mjs";
25
+ } from "./chunk-PZIAKZJC.mjs";
26
26
  import {
27
27
  identity_exports as identity_exports3
28
28
  } from "./chunk-QUFVUMSY.mjs";
@@ -48,7 +48,7 @@ import {
48
48
  } from "./chunk-QAXALJEY.mjs";
49
49
 
50
50
  // view-revision:revision
51
- var revision_default = "e12a08a46206522734144b820f19473089520d9844dad428d9bfdda324acfbe5";
51
+ var revision_default = "92a9f98a182bc24c5e570237d659d9fcc6a2093d3a2ba34b5e2bc2f763c0dbf9";
52
52
 
53
53
  // packages/viewer/src/catalog-shared.ts
54
54
  var VIEW_PLUGIN_VERSION = "0.2.0";
@@ -125,4 +125,4 @@ export {
125
125
  VIEW_PRODUCT_PLUGINS,
126
126
  createViewProductPlan
127
127
  };
128
- //# sourceMappingURL=chunk-TTFLJHQZ.mjs.map
128
+ //# sourceMappingURL=chunk-H4UIESCF.mjs.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["view-revision:revision", "../../../packages/viewer/src/catalog-shared.ts"],
4
- "sourcesContent": ["export default \"e12a08a46206522734144b820f19473089520d9844dad428d9bfdda324acfbe5\"", "import type { ViewFrontendConfig } from './config.ts';\nimport type { EngineWorkspaceProvider } from '@forgeax/engine/app';\nimport type { ViewPlatform, CarrierCapabilities } from '@forgeax/view-plugin-display/carrier-contract';\nimport type { ViewWorkspaceBroker } from '@forgeax/view-workspace-core/broker';\nexport type ViewBackendProductConfig = {\n platform?: ViewPlatform; capabilities?: Partial<CarrierCapabilities>; workspaceEngine?: EngineWorkspaceProvider;\n workspaceAccessToken?: string; workspaceAuthorize?: NonNullable<ConstructorParameters<typeof ViewWorkspaceBroker>[0]>['authorize'];\n};\nimport buildRevision from './build-identity.ts';\nimport * as display from '@forgeax/view-plugin-display/identity';\nimport * as plugins from '@forgeax/view-plugin-plugins/identity';\nimport * as inspector from '@forgeax/view-plugin-inspector/identity';\nimport * as contentBrowser from '@forgeax/view-plugin-content-browser/identity';\nimport * as sceneTree from '@forgeax/view-plugin-scene-tree/identity';\nimport * as material from '@forgeax/view-plugin-material/identity';\nimport * as mesh from '@forgeax/view-plugin-mesh/identity';\nimport * as texture from '@forgeax/view-plugin-texture/identity';\nimport * as asset from '@forgeax/view-plugin-asset/identity';\nimport * as viewport from '@forgeax/view-plugin-viewport/identity';\nimport * as scene from '@forgeax/view-plugin-scene/identity';\n\nimport { SHELL_MODULE, SHELL_PLUGIN_ID } from './plugins/shell-identity.ts';\nimport { PRESENTATION_MODULE, PRESENTATION_PLUGIN_ID } from '@forgeax/view-plugin-viewport/presentation-identity';\n\nexport const VIEW_PLUGIN_VERSION = '0.2.0';\nexport const VIEW_FRONTEND_ROOT_PROGRAM = '@forgeax/view/frontend-root';\nexport const VIEW_FRONTEND_MODULE = Object.freeze({ specifier: VIEW_FRONTEND_ROOT_PROGRAM });\n\nexport function viewFrontendRoot(frontendConfig: ViewFrontendConfig | undefined, disabledPages: readonly string[] = []) {\n return Object.freeze({\n program: VIEW_FRONTEND_ROOT_PROGRAM,\n codeRevision: buildRevision,\n config: { frontendConfig, disabledPages },\n });\n}\n\nexport const VIEW_WORKSPACE_CORE = Object.freeze({\n BACKEND_PLUGIN_ID: 'forgeax.view.service.workspace.backend',\n FRONTEND_PLUGIN_ID: 'forgeax.view.service.workspace-client.frontend',\n BACKEND_MODULE: '@forgeax/view-workspace-core/backend',\n FRONTEND_MODULE: '@forgeax/view/workspace-frontend',\n});\n\nexport const VIEW_PRODUCT_PLUGINS = Object.freeze([\n scene,\n display,\n viewport,\n contentBrowser,\n plugins,\n inspector,\n sceneTree,\n material,\n mesh,\n texture,\n asset,\n]);\n\n/** Static native composition. Pack assets own game plugin identity; View owns only its UI policy. */\nexport function createViewProductPlan({ backendConfig, frontendConfig, disabledPages = [] }: { backendConfig?: ViewBackendProductConfig; frontendConfig?: ViewFrontendConfig; disabledPages?: readonly string[] } = {}) {\n const pages = new Set<string>(VIEW_PRODUCT_PLUGINS.map(plugin => plugin.PAGE_TYPE));\n for (const page of disabledPages) {\n if (!pages.has(page)) throw new TypeError(`Unknown View page: ${page}`);\n }\n const disabled = new Set(disabledPages);\n const displayBackendConfig = {\n platform: backendConfig?.platform,\n capabilities: backendConfig?.capabilities,\n };\n const workspaceBackendConfig = {\n workspaceEngine: backendConfig?.workspaceEngine,\n workspaceAccessToken: backendConfig?.workspaceAccessToken,\n workspaceAuthorize: backendConfig?.workspaceAuthorize,\n capabilities: backendConfig?.capabilities,\n };\n const backend = [\n { id: VIEW_WORKSPACE_CORE.BACKEND_PLUGIN_ID, module: VIEW_WORKSPACE_CORE.BACKEND_MODULE, config: workspaceBackendConfig },\n { id: display.BACKEND_PLUGIN_ID, module: display.BACKEND_MODULE, config: displayBackendConfig },\n { id: plugins.BACKEND_PLUGIN_ID, module: plugins.BACKEND_MODULE, config: {} },\n ];\n const frontend = [\n { id: SHELL_PLUGIN_ID, module: SHELL_MODULE },\n { id: VIEW_WORKSPACE_CORE.FRONTEND_PLUGIN_ID, module: VIEW_WORKSPACE_CORE.FRONTEND_MODULE },\n ...(!disabled.has(scene.PAGE_TYPE) ? [{ id: scene.FRONTEND_PLUGIN_ID, module: scene.FRONTEND_MODULE }] : []),\n { id: PRESENTATION_PLUGIN_ID, module: PRESENTATION_MODULE },\n ...VIEW_PRODUCT_PLUGINS.filter(plugin => plugin !== scene && !disabled.has(plugin.PAGE_TYPE))\n .map(plugin => ({ id: plugin.FRONTEND_PLUGIN_ID, module: plugin.FRONTEND_MODULE })),\n ];\n return Object.freeze({\n backend: Object.freeze(backend),\n frontend: Object.freeze(frontend),\n frontendConfig,\n disabledPages: Object.freeze([...disabled]),\n });\n}\n"],
4
+ "sourcesContent": ["export default \"92a9f98a182bc24c5e570237d659d9fcc6a2093d3a2ba34b5e2bc2f763c0dbf9\"", "import type { ViewFrontendConfig } from './config.ts';\nimport type { EngineWorkspaceProvider } from '@forgeax/engine/app';\nimport type { ViewPlatform, CarrierCapabilities } from '@forgeax/view-plugin-display/carrier-contract';\nimport type { ViewWorkspaceBroker } from '@forgeax/view-workspace-core/broker';\nexport type ViewBackendProductConfig = {\n platform?: ViewPlatform; capabilities?: Partial<CarrierCapabilities>; workspaceEngine?: EngineWorkspaceProvider;\n workspaceAccessToken?: string; workspaceAuthorize?: NonNullable<ConstructorParameters<typeof ViewWorkspaceBroker>[0]>['authorize'];\n};\nimport buildRevision from './build-identity.ts';\nimport * as display from '@forgeax/view-plugin-display/identity';\nimport * as plugins from '@forgeax/view-plugin-plugins/identity';\nimport * as inspector from '@forgeax/view-plugin-inspector/identity';\nimport * as contentBrowser from '@forgeax/view-plugin-content-browser/identity';\nimport * as sceneTree from '@forgeax/view-plugin-scene-tree/identity';\nimport * as material from '@forgeax/view-plugin-material/identity';\nimport * as mesh from '@forgeax/view-plugin-mesh/identity';\nimport * as texture from '@forgeax/view-plugin-texture/identity';\nimport * as asset from '@forgeax/view-plugin-asset/identity';\nimport * as viewport from '@forgeax/view-plugin-viewport/identity';\nimport * as scene from '@forgeax/view-plugin-scene/identity';\n\nimport { SHELL_MODULE, SHELL_PLUGIN_ID } from './plugins/shell-identity.ts';\nimport { PRESENTATION_MODULE, PRESENTATION_PLUGIN_ID } from '@forgeax/view-plugin-viewport/presentation-identity';\n\nexport const VIEW_PLUGIN_VERSION = '0.2.0';\nexport const VIEW_FRONTEND_ROOT_PROGRAM = '@forgeax/view/frontend-root';\nexport const VIEW_FRONTEND_MODULE = Object.freeze({ specifier: VIEW_FRONTEND_ROOT_PROGRAM });\n\nexport function viewFrontendRoot(frontendConfig: ViewFrontendConfig | undefined, disabledPages: readonly string[] = []) {\n return Object.freeze({\n program: VIEW_FRONTEND_ROOT_PROGRAM,\n codeRevision: buildRevision,\n config: { frontendConfig, disabledPages },\n });\n}\n\nexport const VIEW_WORKSPACE_CORE = Object.freeze({\n BACKEND_PLUGIN_ID: 'forgeax.view.service.workspace.backend',\n FRONTEND_PLUGIN_ID: 'forgeax.view.service.workspace-client.frontend',\n BACKEND_MODULE: '@forgeax/view-workspace-core/backend',\n FRONTEND_MODULE: '@forgeax/view/workspace-frontend',\n});\n\nexport const VIEW_PRODUCT_PLUGINS = Object.freeze([\n scene,\n display,\n viewport,\n contentBrowser,\n plugins,\n inspector,\n sceneTree,\n material,\n mesh,\n texture,\n asset,\n]);\n\n/** Static native composition. Pack assets own game plugin identity; View owns only its UI policy. */\nexport function createViewProductPlan({ backendConfig, frontendConfig, disabledPages = [] }: { backendConfig?: ViewBackendProductConfig; frontendConfig?: ViewFrontendConfig; disabledPages?: readonly string[] } = {}) {\n const pages = new Set<string>(VIEW_PRODUCT_PLUGINS.map(plugin => plugin.PAGE_TYPE));\n for (const page of disabledPages) {\n if (!pages.has(page)) throw new TypeError(`Unknown View page: ${page}`);\n }\n const disabled = new Set(disabledPages);\n const displayBackendConfig = {\n platform: backendConfig?.platform,\n capabilities: backendConfig?.capabilities,\n };\n const workspaceBackendConfig = {\n workspaceEngine: backendConfig?.workspaceEngine,\n workspaceAccessToken: backendConfig?.workspaceAccessToken,\n workspaceAuthorize: backendConfig?.workspaceAuthorize,\n capabilities: backendConfig?.capabilities,\n };\n const backend = [\n { id: VIEW_WORKSPACE_CORE.BACKEND_PLUGIN_ID, module: VIEW_WORKSPACE_CORE.BACKEND_MODULE, config: workspaceBackendConfig },\n { id: display.BACKEND_PLUGIN_ID, module: display.BACKEND_MODULE, config: displayBackendConfig },\n { id: plugins.BACKEND_PLUGIN_ID, module: plugins.BACKEND_MODULE, config: {} },\n ];\n const frontend = [\n { id: SHELL_PLUGIN_ID, module: SHELL_MODULE },\n { id: VIEW_WORKSPACE_CORE.FRONTEND_PLUGIN_ID, module: VIEW_WORKSPACE_CORE.FRONTEND_MODULE },\n ...(!disabled.has(scene.PAGE_TYPE) ? [{ id: scene.FRONTEND_PLUGIN_ID, module: scene.FRONTEND_MODULE }] : []),\n { id: PRESENTATION_PLUGIN_ID, module: PRESENTATION_MODULE },\n ...VIEW_PRODUCT_PLUGINS.filter(plugin => plugin !== scene && !disabled.has(plugin.PAGE_TYPE))\n .map(plugin => ({ id: plugin.FRONTEND_PLUGIN_ID, module: plugin.FRONTEND_MODULE })),\n ];\n return Object.freeze({\n backend: Object.freeze(backend),\n frontend: Object.freeze(frontend),\n frontendConfig,\n disabledPages: Object.freeze([...disabled]),\n });\n}\n"],
5
5
  "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,IAAO,mBAAQ;;;ACwBR,IAAM,sBAAsB;AAC5B,IAAM,6BAA6B;AACnC,IAAM,uBAAuB,OAAO,OAAO,EAAE,WAAW,2BAA2B,CAAC;AAEpF,SAAS,iBAAiB,gBAAgD,gBAAmC,CAAC,GAAG;AACtH,SAAO,OAAO,OAAO;AAAA,IACnB,SAAS;AAAA,IACT,cAAc;AAAA,IACd,QAAQ,EAAE,gBAAgB,cAAc;AAAA,EAC1C,CAAC;AACH;AAEO,IAAM,sBAAsB,OAAO,OAAO;AAAA,EAC/C,mBAAmB;AAAA,EACnB,oBAAoB;AAAA,EACpB,gBAAgB;AAAA,EAChB,iBAAiB;AACnB,CAAC;AAEM,IAAM,uBAAuB,OAAO,OAAO;AAAA,EAChDA;AAAA,EACA;AAAA,EACAA;AAAA,EACAA;AAAA,EACAA;AAAA,EACAA;AAAA,EACAA;AAAA,EACAA;AAAA,EACAA;AAAA,EACAA;AAAA,EACAA;AACF,CAAC;AAGM,SAAS,sBAAsB,EAAE,eAAe,gBAAgB,gBAAgB,CAAC,EAAE,IAA0H,CAAC,GAAG;AACtN,QAAM,QAAQ,IAAI,IAAY,qBAAqB,IAAI,YAAU,OAAO,SAAS,CAAC;AAClF,aAAW,QAAQ,eAAe;AAChC,QAAI,CAAC,MAAM,IAAI,IAAI,EAAG,OAAM,IAAI,UAAU,sBAAsB,IAAI,EAAE;AAAA,EACxE;AACA,QAAM,WAAW,IAAI,IAAI,aAAa;AACtC,QAAM,uBAAuB;AAAA,IAC3B,UAAU,eAAe;AAAA,IACzB,cAAc,eAAe;AAAA,EAC/B;AACA,QAAM,yBAAyB;AAAA,IAC7B,iBAAiB,eAAe;AAAA,IAChC,sBAAsB,eAAe;AAAA,IACrC,oBAAoB,eAAe;AAAA,IACnC,cAAc,eAAe;AAAA,EAC/B;AACA,QAAM,UAAU;AAAA,IACd,EAAE,IAAI,oBAAoB,mBAAmB,QAAQ,oBAAoB,gBAAgB,QAAQ,uBAAuB;AAAA,IACxH,EAAE,IAAY,mBAAmB,QAAgB,gBAAgB,QAAQ,qBAAqB;AAAA,IAC9F,EAAE,IAAYC,oBAAmB,QAAgBC,iBAAgB,QAAQ,CAAC,EAAE;AAAA,EAC9E;AACA,QAAM,WAAW;AAAA,IACf,EAAE,IAAI,iBAAiB,QAAQ,aAAa;AAAA,IAC5C,EAAE,IAAI,oBAAoB,oBAAoB,QAAQ,oBAAoB,gBAAgB;AAAA,IAC1F,GAAI,CAAC,SAAS,IAAU,SAAS,IAAI,CAAC,EAAE,IAAU,oBAAoB,QAAc,gBAAgB,CAAC,IAAI,CAAC;AAAA,IAC1G,EAAE,IAAI,wBAAwB,QAAQ,oBAAoB;AAAA,IAC1D,GAAG,qBAAqB,OAAO,YAAU,WAAWF,sBAAS,CAAC,SAAS,IAAI,OAAO,SAAS,CAAC,EACzF,IAAI,aAAW,EAAE,IAAI,OAAO,oBAAoB,QAAQ,OAAO,gBAAgB,EAAE;AAAA,EACtF;AACA,SAAO,OAAO,OAAO;AAAA,IACnB,SAAS,OAAO,OAAO,OAAO;AAAA,IAC9B,UAAU,OAAO,OAAO,QAAQ;AAAA,IAChC;AAAA,IACA,eAAe,OAAO,OAAO,CAAC,GAAG,QAAQ,CAAC;AAAA,EAC5C,CAAC;AACH;",
6
6
  "names": ["identity_exports", "BACKEND_PLUGIN_ID", "BACKEND_MODULE"]
7
7
  }
@@ -219,7 +219,11 @@ var ViewWorkspaceBroker = class {
219
219
  return live.find((preview) => String(preview.target.targetId) === String(selected.target.targetId));
220
220
  }
221
221
  boundTarget() {
222
- return this.targetBinding === "play" ? this.engine?.play : this.previews().find((preview) => preview.target.targetId === this.previewTargetId) ?? this.editorPreview();
222
+ if (this.targetBinding === "play") {
223
+ const play = this.engine?.play;
224
+ return play?.phase === "running" ? play : void 0;
225
+ }
226
+ return this.previews().find((preview) => preview.target.targetId === this.previewTargetId) ?? this.editorPreview();
223
227
  }
224
228
  hydrateAsset(asset) {
225
229
  if (!asset?.guid) return asset ?? null;
@@ -718,4 +722,4 @@ var ViewWorkspaceBroker = class {
718
722
  export {
719
723
  ViewWorkspaceBroker
720
724
  };
721
- //# sourceMappingURL=chunk-MO5LILCP.mjs.map
725
+ //# sourceMappingURL=chunk-HWZCLROY.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../packages/view-workspace-core/src/broker.ts", "../../../packages/view-workspace-core/src/file-preview.ts"],
4
+ "sourcesContent": ["import type { EngineWorkspaceRuntime, EngineWorkspacePreview, EngineWorkspacePlay, EngineWorkspaceProjectHandle, EngineWorkspaceCameraResult } from '@forgeax/engine/app';\nimport type { ToolApi, ToolCallerIdentity } from '@forgeax/engine-tool-runtime';\nimport type { WorkspaceAsset, WorkspaceInspection, WorkspaceOpenRequest, WorkspaceSceneSelection, WorkspaceState, WorkspacePreview, WorkspaceRequest, WorkspaceResourceOpen, WorkspaceTab } from './contract.ts';\nimport type { HostTransportServer } from '@forgeax/engine-host/transport';\nimport { workspaceDiagnosticRecord } from './command-error.ts';\nimport { randomUUID } from 'node:crypto';\nimport { runWorkspaceToolApi } from './tool-runtime.ts';\nimport {\n VIEW_DISPLAY_TAB_ID, VIEW_WORKSPACE_TAB_ID, VIEW_WORKSPACE_API_VERSION,\n VIEW_FILE_GET_SERVICE, VIEW_WORKSPACE_SERVICES, VIEW_WORKSPACE_STATE_TOPIC, VIEW_WORKSPACE_OPERATIONS,\n assertWorkspaceRequest, cloneWorkspaceValue, requireWorkspaceString,\n serializeWorkspaceState, serializeWorkspaceAsset, serializeWorkspaceInspection,\n serializeWorkspaceOpenRequest, workspaceCapabilities, workspaceError,\n workspaceUiFingerprint,\n} from './contract.ts';\nimport { createWorkspaceId } from './id.ts';\nimport {\n editorSceneTargetIds,\n isEditorWorkspaceAsset,\n isTypePreviewAsset,\n logResourceOpen,\n selectEditorWorkspacePreview,\n summarizeResourceAsset,\n} from './resource-open.ts';\nimport { readWorkspaceFilePreview } from './file-preview.ts';\nimport {\n isWorkspaceTargetRecoveryCode,\n resolveWorkspaceFailure,\n resolveWorkspaceReopenRoot,\n} from './workspace-recovery.ts';\n\nexport type WorkspaceAuthorization = (input: { clientId: string; operation: string; request: Pick<WorkspaceRequest, 'operation' | 'args' | 'clientId'> & Partial<WorkspaceRequest>; caller?: ToolCallerIdentity; signal?: AbortSignal }) => boolean | Promise<boolean>;\nexport type WorkspaceCallContext = { signal?: AbortSignal; caller?: ToolCallerIdentity; clientId?: string; token?: string; requestId?: string };\nexport type BrokerOptions = { engine?: EngineWorkspaceRuntime; toolApi?: ToolApi; display?: () => { state?: string; occupancy?: Pick<WorkspaceTab, 'run' | 'target' | 'targetId'> | null } | undefined; accessToken?: string; authorize?: WorkspaceAuthorization };\ntype Args = Record<string, unknown>;\ntype WorkspaceDomainResult = Partial<EngineWorkspaceCameraResult> & { assets?: WorkspaceAsset[]; inspection?: WorkspaceInspection; preview?: WorkspacePreview; asset?: WorkspaceAsset; target?: WorkspacePreview['target']; entityId?: string | null };\n\nconst ENGINE_SOURCE = 'engine-workspace';\nconst UI_OPERATIONS = Object.freeze<Record<string, (workspace: ViewWorkspaceBroker, args: Args, context: WorkspaceCallContext) => unknown>>({\n 'target.select': (workspace, args) => workspace.selectTarget(args),\n 'tabs.get': (workspace) => workspace.snapshot(),\n 'tabs.select': (workspace, args) => workspace.selectTab(args),\n 'scene.select': (workspace, args, context) => workspace.selectSceneEntity(args, context),\n 'scene.pick': (workspace, args, context) => workspace.pickSceneEntity(args, context),\n 'scene.clear': (workspace, args, context) => workspace.clearSceneSelection(args, context),\n});\n\n/** View bindings and display snapshots. Engine owns all project and target resources. */\nexport class ViewWorkspaceBroker {\n declare readonly engine: EngineWorkspaceRuntime | undefined;\n declare readonly toolApi: ToolApi | undefined;\n declare readonly display: NonNullable<BrokerOptions['display']>;\n declare readonly accessToken: string;\n declare readonly authorize: WorkspaceAuthorization | undefined;\n declare selectedTabId: string;\n declare targetBinding: 'editor' | 'play';\n declare editorTargetId: string | undefined;\n declare previewTargetId: string | undefined;\n declare playOwner: EngineWorkspacePlay | undefined;\n declare projectOwner: EngineWorkspaceProjectHandle | undefined;\n declare previewOwner: EngineWorkspacePreview | EngineWorkspacePlay | undefined;\n declare revision: number;\n declare listeners: Set<(state: WorkspaceState) => void>;\n declare assets: WorkspaceAsset[] | null;\n declare inspection: WorkspaceInspection | null;\n declare openRequest: WorkspaceOpenRequest | null;\n declare openRequestSequence: number;\n declare resourceOpens: Map<string, WorkspaceResourceOpen>;\n declare sceneSelection: WorkspaceSceneSelection | null;\n declare selectionAbort: AbortController | undefined;\n declare previewProjection: (WorkspacePreview & Pick<EngineWorkspacePreview, 'presentation'>) | null;\n declare workspaceTargetLost: boolean;\n declare catalogEpoch: number;\n declare disposing: boolean;\n declare publishFingerprint: string;\n constructor({ engine, toolApi, display = () => undefined, accessToken = randomUUID(), authorize }: BrokerOptions = {}) {\n this.engine = engine;\n this.toolApi = toolApi;\n this.display = display;\n this.accessToken = accessToken;\n this.authorize = authorize;\n this.selectedTabId = VIEW_WORKSPACE_TAB_ID;\n this.targetBinding = 'editor';\n this.editorTargetId = undefined;\n this.playOwner = undefined;\n this.revision = 0;\n this.listeners = new Set<(state: WorkspaceState) => void>();\n this.assets = null;\n this.inspection = null;\n this.openRequest = null;\n this.openRequestSequence = 0;\n this.resourceOpens = new Map();\n this.sceneSelection = null;\n this.selectionAbort?.abort();\n this.previewProjection = null;\n this.projectOwner = undefined;\n this.previewOwner = undefined;\n this.workspaceTargetLost = false;\n this.catalogEpoch = -1;\n this.disposing = false;\n this.publishFingerprint = '';\n }\n\n get project() { return this.engine?.project?.project ?? null; }\n get projectTarget() { return this.engine?.project?.target ?? null; }\n get preview() { this.syncBindings(); return this.previewProjection; }\n\n previews() { return this.engine?.previews ?? (this.engine?.preview ? [this.engine.preview] : []); }\n classifiedPreviews() {\n return this.previews().map((preview) => ({\n target: preview.target,\n asset: this.hydrateAsset(preview.asset),\n }));\n }\n editorPreview() {\n const live = this.previews();\n const selected = selectEditorWorkspacePreview(this.classifiedPreviews(), this.editorTargetId);\n if (!selected) return undefined;\n return live.find((preview) => String(preview.target.targetId) === String(selected.target.targetId));\n }\n boundTarget() {\n if (this.targetBinding === 'play') {\n const play = this.engine?.play;\n return play?.phase === 'running' ? play : undefined;\n }\n return this.previews().find(preview => preview.target.targetId === this.previewTargetId) ?? this.editorPreview();\n }\n hydrateAsset(asset: WorkspaceAsset | null | undefined) {\n if (!asset?.guid) return asset ?? null;\n if (asset.kind) return asset;\n const catalog = Array.isArray(this.assets)\n ? this.assets.find((entry) => entry.guid === asset.guid)\n : undefined;\n if (!catalog?.kind) return asset;\n return { ...asset, kind: catalog.kind, name: asset.name ?? catalog.name };\n }\n selectTarget({ targetId }: Args = {}) {\n if (targetId === this.engine?.play?.target.targetId) this.targetBinding = 'play';\n else {\n const preview = this.previews().find((entry) => entry.target.targetId === targetId);\n if (!preview) throw workspaceError('view-workspace-target-mismatch', 'An existing preview or Play target', 'Refresh tabs.get.');\n this.targetBinding = 'editor';\n this.previewTargetId = targetId as string;\n if (isEditorWorkspaceAsset(this.hydrateAsset(preview.asset))) this.editorTargetId = String(targetId);\n }\n this.changed();\n return this.snapshot();\n }\n syncBindings() {\n if (this.playOwner !== this.engine?.play) {\n this.playOwner = this.engine?.play;\n this.targetBinding = this.playOwner ? 'play' : 'editor';\n if (!this.playOwner) this.previewTargetId = this.editorPreview()?.target.targetId;\n }\n if (this.projectOwner !== this.engine?.project) {\n this.projectOwner = this.engine?.project;\n this.assets = null;\n this.inspection = null;\n this.openRequest = null;\n this.openRequestSequence = 0;\n this.resourceOpens = new Map();\n this.editorTargetId = undefined;\n this.sceneSelection = null;\n this.selectionAbort?.abort();\n }\n if (this.previewOwner !== this.boundTarget()) {\n this.previewOwner = this.boundTarget();\n this.sceneSelection = null;\n this.selectionAbort?.abort();\n this.previewProjection = this.previewOwner ? {\n target: this.previewOwner.target, asset: this.previewOwner.asset,\n presentation: this.previewOwner.presentation,\n assetBinding: this.previewOwner.assetBinding,\n } : null;\n }\n }\n\n snapshot(): WorkspaceState {\n this.syncBindings();\n const display = this.display?.();\n return serializeWorkspaceState({\n revision: this.revision, selectedTabId: this.selectedTabId,\n tabs: [\n { tabId: VIEW_DISPLAY_TAB_ID, kind: 'display', selected: this.selectedTabId === VIEW_DISPLAY_TAB_ID,\n state: display?.state, run: display?.occupancy?.run, target: display?.occupancy?.target,\n targetId: display?.occupancy?.targetId },\n { tabId: VIEW_WORKSPACE_TAB_ID, kind: 'workspace', selected: this.selectedTabId === VIEW_WORKSPACE_TAB_ID,\n state: this.previewProjection ? 'previewing' : this.project ? 'project-open' : 'empty',\n ...(this.previewProjection?.target ?? this.projectTarget ? { target: this.previewProjection?.target ?? this.projectTarget } : {}) },\n ],\n project: this.project, projectTarget: this.projectTarget,\n ...(this.engine?.project?.phase === undefined ? {} : { projectPhase: this.engine.project.phase }),\n ...(this.engine?.project?.browserGeneration === undefined ? {} : { browserGeneration: this.engine.project.browserGeneration }),\n assets: this.assets,\n preview: this.previewProjection && { ...this.previewProjection, target: this.boundTarget()!.target, asset: this.hydrateAsset(this.previewProjection.asset), assetBinding: this.boundTarget()!.assetBinding },\n editorPreview: this.editorPreview() ? { target: this.editorPreview()!.target, asset: this.hydrateAsset(this.editorPreview()!.asset), assetBinding: this.editorPreview()!.assetBinding } : null,\n previews: this.previews().map(preview => ({ target: preview.target, asset: this.hydrateAsset(preview.asset), assetBinding: preview.assetBinding })),\n play: this.engine?.play ? { target: this.engine.play.target, phase: this.engine.play.phase } : null,\n targetBinding: this.targetBinding,\n inspection: this.inspection,\n openRequest: this.openRequest,\n resourceOpens: Object.fromEntries(this.resourceOpens),\n sceneSelection: this.sceneSelection,\n workspaceTargetLost: this.workspaceTargetLost,\n });\n }\n\n changed() {\n const current = this.snapshot();\n const fingerprint = workspaceUiFingerprint(current);\n if (fingerprint === this.publishFingerprint) return;\n this.revision += 1;\n const state = this.snapshot();\n this.publishFingerprint = workspaceUiFingerprint(state);\n for (const listener of this.listeners) { try { listener(state); } catch { /* UI observers do not own operations. */ } }\n }\n subscribe(listener: (state: WorkspaceState) => void) {\n this.listeners.add(listener);\n const state = this.snapshot();\n this.publishFingerprint ||= workspaceUiFingerprint(state);\n listener(state);\n return () => this.listeners.delete(listener);\n }\n capabilities() {\n const descriptions = this.toolApi?.list().filter(record => record.callable && (record.owner.sourceId === ENGINE_SOURCE || record.descriptor.id.startsWith('view.display.')))\n .map(record => ({ id: record.descriptor.id.replace(/^(engine|view)\\./, ''), path: record.descriptor.path, title: record.descriptor.title, summary: record.descriptor.summary, inputSchema: record.descriptor.inputSchema, outputSchema: record.descriptor.outputSchema })) ?? [];\n const operations = [...Object.keys(UI_OPERATIONS), ...descriptions.map(item => item.id),\n ...VIEW_WORKSPACE_OPERATIONS.filter(id => id.startsWith('plugins.') && this.toolApi?.describe(id, 'view-backend').some(record => record.callable))]\n .filter(id => VIEW_WORKSPACE_OPERATIONS.includes(id));\n return { ...workspaceCapabilities({ ready: !!this.engine && !this.disposing, headed: this.projectTarget?.headed === true, operations }), descriptions };\n }\n async authorizeRequest(request: WorkspaceRequest, caller?: ToolCallerIdentity) {\n if (this.disposing) throw workspaceError('view-workspace-stopping', 'View bindings to remain available', 'Reconnect to the backend.');\n if (request.token !== this.accessToken || (this.authorize && !await this.authorize({ clientId: request.clientId, operation: request.operation, request, caller }))) {\n throw workspaceError('view-workspace-unauthorized', 'an authorized workspace connection', 'Connect with the issued token.', { clientId: request.clientId });\n }\n }\n async call(rawRequest: unknown, { signal, caller }: WorkspaceCallContext = {}) {\n const request = assertWorkspaceRequest(rawRequest);\n await this.authorizeRequest(request, caller);\n const ui = UI_OPERATIONS[request.operation];\n if (ui) return ui(this, request.args, { signal, caller, clientId: request.clientId });\n if (request.operation === 'project.reopen') {\n return this.reopenProject(request.args, {\n signal,\n caller,\n clientId: request.clientId,\n token: request.token,\n requestId: request.requestId,\n });\n }\n return this.invoke(request.operation, request.args, { signal, caller, clientId: request.clientId, token: request.token, requestId: request.requestId });\n }\n async invoke(operation: string, args: Args = {}, { signal, caller, clientId = 'view-owner', token, requestId }: WorkspaceCallContext = {}) {\n const { tabId, ...input } = args;\n if (tabId !== undefined) this.assertWorkspaceTab(tabId);\n const inspector = operation.startsWith('plugins.');\n const presentation = operation.startsWith('display.');\n const id = inspector ? operation : `${presentation ? 'view' : 'engine'}.${operation}`;\n const sourceId = inspector || presentation ? 'view-backend' : ENGINE_SOURCE;\n const owner = this.toolApi?.describe(id, sourceId).find(record => record.callable)?.owner;\n if (!owner) throw workspaceError('view-workspace-operation-unavailable', `Engine operation ${operation} to be installed`, 'Enable the Engine capability; UI plugins do not provide domain APIs.', { operation });\n this.syncBindings();\n const play = this.engine?.play;\n if (operation === 'play.stop' && this.targetBinding === 'play' && play &&\n input.targetId === play.target.targetId && input.targetGeneration === play.target.generation) {\n // Revoke Game panel observations before Engine closes their command channel.\n // Keep the presented Play owner and its iframe until the cleanup ACK arrives.\n this.targetBinding = 'editor';\n this.previewTargetId = this.editorPreview()?.target.targetId;\n this.changed();\n }\n const requestedPreview = [...this.previews(), this.engine?.play].find(preview => preview?.target.targetId === input.targetId);\n const terminal = await this.toolApi!.run<WorkspaceDomainResult>(id, inspector ? {\n apiVersion: 'forgeax.view.inspector/1', operation, args: input, ...input, clientId, token, requestId,\n } : presentation ? input : { ...input, clientId }, { sourceId, providerId: owner.providerId, generation: owner.generation, caller, signal }).terminal;\n if (terminal.outcome === 'failed') {\n const resolved = resolveWorkspaceFailure(terminal.failure);\n const addressesWorkspace = input.targetId === undefined ||\n [this.projectTarget, this.editorPreview()?.target].some(target => target &&\n target.targetId === input.targetId &&\n (input.targetGeneration === undefined || target.generation === input.targetGeneration));\n if (isWorkspaceTargetRecoveryCode(resolved.code) && addressesWorkspace) {\n this.workspaceTargetLost = true;\n }\n // Engine can revoke a target before its asynchronous close completes and\n // publishes state. Reconcile the actual binding before returning a late\n // query failure, so observers can revoke their obsolete requests.\n this.changed();\n throw workspaceError(resolved.code, resolved.expected, resolved.hint, resolved.detail);\n }\n const result = terminal.result;\n if (Array.isArray(result?.assets)) this.assets = result.assets.map(asset => serializeWorkspaceAsset({ ...asset, ...(asset.ddc || !asset.cookReceiptUrl ? {} : { ddc: { receiptUrl: asset.cookReceiptUrl } }) }));\n if (result?.inspection) this.inspection = serializeWorkspaceInspection(result.inspection);\n if (operation === 'asset.open') this.bindOpenedAsset(result, input.guid);\n if (operation === 'preview.close' && input.targetId != null && String(input.targetId) === this.editorTargetId) {\n this.editorTargetId = undefined;\n }\n this.syncBindings();\n if (operation === 'asset.open') this.recordOpenRequest({ requestId, result, guid: input.guid });\n if ((operation.startsWith('camera.') || operation === 'target.control') && this.previewProjection && this.boundTarget() === requestedPreview) {\n this.previewProjection.camera = result?.camera;\n this.previewProjection.cameraVersion = result?.version;\n this.previewProjection.interaction = result?.interaction ?? null;\n }\n if (!['scene-tree.get', 'entity.inspect', 'workspace.get', 'preview.capture'].includes(operation)) this.changed();\n if (['project.open', 'project.close', 'project.reopen', 'asset.open', 'preview.close', 'camera.abort', 'play.start', 'play.ready', 'play.stop'].includes(operation)) {\n if (operation === 'project.open' || operation === 'project.reopen') this.workspaceTargetLost = false;\n return this.snapshot();\n }\n if (operation.startsWith('camera.')) return { ...cloneWorkspaceValue(result), apiVersion: VIEW_WORKSPACE_API_VERSION, target: requestedPreview?.target };\n if (operation === 'assets.list') return { ...cloneWorkspaceValue(result), assets: this.assets };\n return cloneWorkspaceValue(result);\n }\n assertWorkspaceTab(tabId: unknown) {\n requireWorkspaceString(tabId, 'tabId');\n if (tabId !== VIEW_WORKSPACE_TAB_ID) throw workspaceError('view-workspace-tab-read-only', 'the Editor binding', 'Address AI execution through the Engine run API.', { tabId });\n }\n selectTab({ tabId }: Args = {}) {\n if (![VIEW_DISPLAY_TAB_ID, VIEW_WORKSPACE_TAB_ID].includes(tabId as string)) throw workspaceError('view-workspace-tab-not-found', 'an existing tab', 'Refresh tabs.get.', { tabId });\n this.selectedTabId = tabId as string; this.changed(); return this.snapshot();\n }\n async selectSceneEntity(args: Args = {}, context?: WorkspaceCallContext) {\n const entityId = requireWorkspaceString(args.entityId, 'entityId');\n return this.changeSceneSelection(args, context, () => ({ entityId, label: args.label }));\n }\n pickSceneEntity(args: Args = {}, context?: WorkspaceCallContext) {\n return this.changeSceneSelection(args, context, async requestContext => {\n const result = await this.invoke('target.pick', args, requestContext) as { entityId?: string | null };\n if (result?.entityId === null) return null;\n const entityId = requireWorkspaceString(result?.entityId, 'pick.entityId');\n return { entityId };\n });\n }\n clearSceneSelection(args: Args = {}, context?: WorkspaceCallContext) {\n return this.changeSceneSelection(args, context, () => null);\n }\n async changeSceneSelection({ tabId, targetId, targetGeneration }: Args = {}, context: WorkspaceCallContext | undefined, resolveSelection: (context: WorkspaceCallContext) => { entityId: string; label?: unknown } | null | Promise<{ entityId: string; label?: unknown } | null>) {\n if (tabId !== undefined) this.assertWorkspaceTab(tabId);\n this.syncBindings();\n const requested = this.boundTarget();\n if (!requested || requested.target.targetId !== targetId || requested.target.generation !== targetGeneration) throw workspaceError('view-workspace-selection-stale', 'The bound target and generation', 'Select the target before changing its selection.');\n this.selectionAbort?.abort();\n const controller = new AbortController();\n this.selectionAbort = controller;\n const signal = context?.signal ? AbortSignal.any([context.signal, controller.signal]) : controller.signal;\n const requestContext = { ...context, signal };\n const assertCurrent = () => {\n signal.throwIfAborted();\n if (this.boundTarget() !== requested) throw workspaceError('view-workspace-selection-stale', 'The same selected target', 'Refresh the hierarchy.');\n };\n const selection = await resolveSelection(requestContext);\n assertCurrent();\n const { entityId, label } = selection ?? {};\n if (selection) {\n const result = await this.invoke('entity.inspect', { entityId, targetId, targetGeneration }, requestContext) as { entityId?: string };\n assertCurrent();\n if (result?.entityId !== entityId) throw workspaceError(\n 'view-workspace-selection-stale', 'The inspected entity on the same target', 'Refresh the hierarchy before selecting.');\n }\n await this.invoke('entity.highlight', { ...(selection ? { entityId } : {}), targetId, targetGeneration }, requestContext);\n assertCurrent();\n this.sceneSelection = selection ? { primary: { entityId: entityId!, ...(label === undefined ? {} : { label: String(label) }) }, targetId: requested.target.targetId, targetGeneration: requested.target.generation } : null;\n this.changed();\n return this.snapshot();\n }\n openProject(args: Args, context?: WorkspaceCallContext) { return this.invoke('project.open', args, context); }\n async reopenProject(args: Args = {}, context?: WorkspaceCallContext) {\n const root = resolveWorkspaceReopenRoot(this.snapshot(), args.root);\n const { tabId, ...rest } = args;\n return this.openProject({ ...rest, root, ...(tabId === undefined ? {} : { tabId }) }, context);\n }\n closeProject(args: Args, context?: WorkspaceCallContext) { return this.invoke('project.close', args, context); }\n listAssets(args: Args, context?: WorkspaceCallContext) { return this.invoke('assets.list', args, context); }\n inspectAsset(args: Args, context?: WorkspaceCallContext) { return this.invoke('asset.inspect', args, context); }\n rebuildAssetSource(args: Args, { mode = 'rebuild', ...context }: WorkspaceCallContext & { mode?: 'rebuild' | 'cold-cook' } = {}) { return this.invoke(`asset-source.${mode}`, args, context); }\n bindOpenedAsset(result: WorkspaceDomainResult, guid: unknown) {\n this.targetBinding = 'editor';\n const kind = this.hydrateAsset(result?.preview?.asset)?.kind\n ?? this.hydrateAsset(result?.asset)?.kind\n ?? this.assets?.find((entry) => entry?.guid === guid)?.kind;\n if (kind && !isTypePreviewAsset({ kind, guid: typeof guid === 'string' ? guid : '' })) {\n const targetId = result?.preview?.target?.targetId\n ?? result?.target?.targetId\n ?? this.previews().find((entry) => this.hydrateAsset(entry.asset)?.guid === guid)?.target?.targetId;\n if (targetId != null) {\n this.editorTargetId = String(targetId);\n this.previewTargetId = this.editorTargetId;\n }\n return;\n }\n const editorId = this.editorPreview()?.target?.targetId;\n if (editorId !== undefined) this.previewTargetId = editorId;\n }\n recordOpenRequest({ requestId, result, guid }: { requestId?: string; result: WorkspaceDomainResult; guid?: unknown }) {\n const requested = typeof guid === 'string' && guid.trim() !== '' ? guid : undefined;\n const editor = this.editorPreview();\n const editorIds = editorSceneTargetIds(\n this.classifiedPreviews(),\n editor ? { target: editor.target, asset: this.hydrateAsset(editor.asset) } : undefined,\n );\n const extras = this.previews().filter((entry) =>\n entry?.target?.targetId && !editorIds.has(String(entry.target.targetId)),\n );\n const preview = [result?.preview, ...extras].find((entry) =>\n entry?.target &&\n !editorIds.has(String(entry.target.targetId)) &&\n (!entry.asset || requested === undefined || entry.asset.guid === requested),\n );\n const catalogAsset = requested && Array.isArray(this.assets)\n ? this.assets.find((entry) => entry?.guid === requested && entry?.kind)\n : undefined;\n const asset = [\n this.hydrateAsset(result?.preview?.asset),\n this.hydrateAsset(result?.asset),\n this.hydrateAsset(preview?.asset),\n catalogAsset,\n ].find((candidate) =>\n candidate?.guid &&\n candidate?.kind &&\n (requested === undefined || candidate.guid === requested),\n );\n if (!asset?.guid || !asset?.kind) {\n logResourceOpen('open-request-skipped', {\n reason: 'asset-kind-unavailable',\n requested: requested ?? null,\n resultPreview: summarizeResourceAsset(result?.preview?.asset),\n resultAsset: summarizeResourceAsset(result?.asset),\n extraPreview: summarizeResourceAsset(preview?.asset),\n extraPreviewCount: extras.length,\n catalog: summarizeResourceAsset(catalogAsset),\n editorTargetId: this.editorTargetId ?? null,\n }, { level: 'warn' });\n return;\n }\n this.openRequestSequence += 1;\n const inspection =\n result?.inspection?.guid === asset.guid\n ? result.inspection\n : (this.inspection?.guid === asset.guid ? this.inspection : undefined);\n const previewMatches = preview?.target && (!preview.asset || preview.asset.guid === asset.guid);\n const recordedPreview = previewMatches ? { asset, target: preview.target } : undefined;\n this.openRequest = serializeWorkspaceOpenRequest({\n requestId: typeof requestId === 'string' && requestId.trim() !== ''\n ? requestId\n : createWorkspaceId('open'),\n sequence: this.openRequestSequence,\n asset,\n preview: recordedPreview,\n ...(inspection === undefined ? {} : { inspection }),\n });\n this.resourceOpens.set(asset.kind, {\n asset,\n preview: recordedPreview,\n });\n logResourceOpen('open-request-recorded', {\n requestId: this.openRequest.requestId,\n sequence: this.openRequest.sequence,\n asset: summarizeResourceAsset(this.openRequest.asset),\n hasPreview: Boolean(this.openRequest.preview?.target),\n previewTargetId: this.openRequest.preview?.target?.targetId ?? null,\n });\n }\n openAsset(args: Args, context?: WorkspaceCallContext) { return this.invoke('asset.open', args, context); }\n closePreview(args: Args, context?: WorkspaceCallContext) { return this.invoke('preview.close', args, context); }\n capture(args: Args, context?: WorkspaceCallContext) { return this.invoke('preview.capture', args, context); }\n resizePreview(args: Args, context?: WorkspaceCallContext) { return this.invoke('preview.resize', args, context); }\n getCamera(args: Args, context?: WorkspaceCallContext) { return this.invoke('camera.get', args, context); }\n beginCamera(args: Args, context?: WorkspaceCallContext) { return this.invoke('camera.begin', { ...args, interactionId: args.interactionId ?? randomUUID() }, context); }\n updateCamera(args: Args, context?: WorkspaceCallContext) { return this.invoke('camera.update', args, context); }\n commitCamera(args: Args, context?: WorkspaceCallContext) { return this.invoke('camera.commit', args, context); }\n abortCamera(args: Args, context?: WorkspaceCallContext) { return this.invoke('camera.abort', args, context); }\n getSceneTree(args: Args, context?: WorkspaceCallContext) { return this.invoke('scene-tree.get', args, context); }\n async revokeConnection(connectionId: unknown) {\n if (typeof connectionId !== 'string') return;\n for (const preview of [this.engine?.preview, this.engine?.play]) {\n if (!preview) continue;\n // The target may already be gone together with its browser page; revoking\n // its input connection is best-effort cleanup, not a failure.\n try {\n const result = await preview.revokeConnection?.({ targetId: preview.target.targetId, connectionId }) as EngineWorkspaceCameraResult | undefined;\n this.syncBindings();\n if (this.previewOwner === preview && this.previewProjection && result) {\n this.previewProjection.interaction = result.interaction ?? null;\n this.previewProjection.cameraVersion = result.version;\n }\n } catch {\n // A lost target owns its own teardown.\n }\n }\n this.changed();\n }\n /**\n * Reset per-page UI session state when a new View frontend page is admitted.\n * The open project and its Engine session stay; everything the previous page\n * accumulated after project.open returns to the just-opened state, so a\n * refreshed page's first snapshot does not inherit the old page's history.\n */\n resetPageSession() {\n if (this.disposing) return;\n this.selectedTabId = VIEW_WORKSPACE_TAB_ID;\n this.targetBinding = 'editor';\n this.previewTargetId = undefined;\n this.inspection = null;\n this.openRequest = null;\n this.openRequestSequence = 0;\n this.resourceOpens = new Map();\n this.sceneSelection = null;\n this.selectionAbort?.abort();\n this.selectionAbort = undefined;\n // Rebuild the preview projection from the editor target so camera and\n // interaction state held for the previous page are not carried over.\n this.previewOwner = undefined;\n this.syncBindings();\n this.changed();\n // A refresh detaches the browser but keeps the project server. This probe\n // waits for the replacement page when one is starting, and still marks a\n // terminal loss through the existing recovery path.\n const project = this.project;\n if (project) {\n void this.invoke('assets.list', { projectId: project.id }).catch(() => {});\n }\n }\n registerTransport(transport: HostTransportServer, { routeThroughTools = false } = {}) {\n const capabilities = transport.register(VIEW_WORKSPACE_SERVICES.capabilities, () => this.capabilities());\n const call = transport.register<WorkspaceRequest, unknown>(VIEW_WORKSPACE_SERVICES.call, async ({ payload, signal, caller }) => {\n try {\n return routeThroughTools\n ? await runWorkspaceToolApi(this.toolApi!, {\n operation: `view.workspace.${payload.operation}`, args: payload.args,\n clientId: payload.clientId, token: payload.token, requestId: payload.requestId,\n caller, signal, sourceId: 'view-workspace',\n })\n : await this.call(payload, { signal, caller });\n }\n catch (error) {\n const failure = workspaceDiagnosticRecord(error);\n if (typeof failure.code !== 'string' || !failure.code.startsWith('view-')) throw error;\n throw Object.assign(new Error(String(failure.message)), { name: 'HostAssemblyError', code: 'host-transport-failure',\n expected: failure.expected, hint: failure.hint, detail: { ...workspaceDiagnosticRecord(failure.detail), remoteCode: failure.code } });\n }\n });\n const fileGet = transport.register<{ path?: unknown }, unknown>(VIEW_FILE_GET_SERVICE, async ({ payload }) => {\n try { return await readWorkspaceFilePreview(this, payload); }\n catch (error) {\n const failure = workspaceDiagnosticRecord(error);\n if (typeof failure.code !== 'string' || !failure.code.startsWith('view-')) throw error;\n throw Object.assign(new Error(String(failure.message)), { name: 'HostAssemblyError', code: 'host-transport-failure',\n expected: failure.expected, hint: failure.hint, detail: { ...workspaceDiagnosticRecord(failure.detail), remoteCode: failure.code } });\n }\n });\n const subscription = this.subscribe(state => transport.publish(VIEW_WORKSPACE_STATE_TOPIC, state));\n const observer = transport.connect();\n const engineSubscription = observer.subscribe<{ catalogEpoch?: number }>('engine.workspace.state', (snapshot) => {\n const epoch = snapshot && typeof snapshot.catalogEpoch === 'number' ? snapshot.catalogEpoch : undefined;\n if (epoch === undefined || epoch <= this.catalogEpoch) {\n this.changed();\n return;\n }\n this.catalogEpoch = epoch;\n const project = this.project;\n if (!project) return;\n const lost = this.workspaceTargetLost;\n void this.invoke('assets.list', { projectId: project.id }).catch(() => {\n this.workspaceTargetLost = lost;\n });\n });\n return () => { capabilities(); call(); fileGet(); subscription(); engineSubscription(); observer.close(); };\n }\n async dispose() { this.selectionAbort?.abort(); this.disposing = true; this.listeners.clear(); }\n}\n", "import { readFile, stat } from 'node:fs/promises';\nimport { extname, isAbsolute, relative, resolve } from 'node:path';\n\nimport type { WorkspaceProject } from './contract.ts';\nimport { workspaceError } from './contract.ts';\n\n/**\n * Editor `/api/files` classify() equivalent. Unknown extensions are text so\n * `.pack.json` / `.pack.ts` / `.ts` / `.js` decode as UTF-8. Binary kinds skip\n * decode and leave `content` unset \u2014 the preview then shows the no-text note.\n */\nconst EXT_KIND: Readonly<Record<string, { kind: string; mime: string }>> = Object.freeze({\n '.png': { kind: 'image', mime: 'image/png' },\n '.jpg': { kind: 'image', mime: 'image/jpeg' },\n '.jpeg': { kind: 'image', mime: 'image/jpeg' },\n '.gif': { kind: 'image', mime: 'image/gif' },\n '.webp': { kind: 'image', mime: 'image/webp' },\n '.avif': { kind: 'image', mime: 'image/avif' },\n '.bmp': { kind: 'image', mime: 'image/bmp' },\n '.ico': { kind: 'image', mime: 'image/x-icon' },\n '.svg': { kind: 'image', mime: 'image/svg+xml' },\n '.mp3': { kind: 'audio', mime: 'audio/mpeg' },\n '.wav': { kind: 'audio', mime: 'audio/wav' },\n '.ogg': { kind: 'audio', mime: 'audio/ogg' },\n '.m4a': { kind: 'audio', mime: 'audio/mp4' },\n '.flac': { kind: 'audio', mime: 'audio/flac' },\n '.aac': { kind: 'audio', mime: 'audio/aac' },\n '.mp4': { kind: 'video', mime: 'video/mp4' },\n '.webm': { kind: 'video', mime: 'video/webm' },\n '.mov': { kind: 'video', mime: 'video/quicktime' },\n '.glb': { kind: 'model', mime: 'model/gltf-binary' },\n '.gltf': { kind: 'model', mime: 'model/gltf+json' },\n '.fbx': { kind: 'model', mime: 'application/octet-stream' },\n '.ttf': { kind: 'binary', mime: 'font/ttf' },\n '.otf': { kind: 'binary', mime: 'font/otf' },\n '.woff': { kind: 'binary', mime: 'font/woff' },\n '.woff2': { kind: 'binary', mime: 'font/woff2' },\n});\n\n/** Inline data URLs for browser media preview in the content browser. */\nexport const MAX_BINARY_PREVIEW_BYTES = 10 * 1024 * 1024;\n\nconst BINARY_PREVIEW_KINDS = new Set(['image', 'audio', 'video', 'binary']);\n\nexport function classifyFile(path: string) {\n const ext = extname(path).toLowerCase();\n return EXT_KIND[ext] ?? { kind: 'text', mime: 'text/plain; charset=utf-8' };\n}\n\nexport function resolveProjectFilePath(root: unknown, input: unknown) {\n if (typeof root !== 'string' || root.trim() === '') return null;\n if (typeof input !== 'string' || input.length === 0 || input.includes('\\0')) return null;\n const rootAbs = resolve(root);\n const abs = isAbsolute(input) ? resolve(input) : resolve(rootAbs, input);\n const rel = relative(rootAbs, abs);\n if (rel === '' || rel.startsWith('..') || isAbsolute(rel)) return null;\n const normalized = rel.split(/[/\\\\]/).join('/');\n if (normalized === '.forgeax/ddc' || normalized.startsWith('.forgeax/ddc/')) return null;\n return { abs, rel: normalized };\n}\n\nexport async function readFilePreview(absPath: string, rel: string) {\n let info;\n try {\n info = await stat(absPath);\n } catch {\n throw new Error('not found');\n }\n if (info.isDirectory()) throw new Error('is a directory');\n const ext = extname(rel).toLowerCase();\n const { kind, mime } = classifyFile(rel);\n const base = { path: rel, kind, mime, size: info.size, mtime: info.mtimeMs };\n if (kind === 'text') {\n const content = await readFile(absPath, 'utf8');\n return { ...base, content };\n }\n if (kind === 'image' && ext === '.svg') {\n const content = await readFile(absPath, 'utf8');\n return { ...base, content };\n }\n if (BINARY_PREVIEW_KINDS.has(kind)) {\n if (info.size > MAX_BINARY_PREVIEW_BYTES) return base;\n const buffer = await readFile(absPath);\n return { ...base, dataUrl: `data:${mime};base64,${buffer.toString('base64')}` };\n }\n return base;\n}\n\nexport async function readWorkspaceFilePreview(workspace: { project?: WorkspaceProject | null } | undefined, payload: { path?: unknown } = {}) {\n const root = workspace?.project?.root;\n if (typeof root !== 'string' || root.trim() === '') {\n throw workspaceError(\n 'view-workspace-project-closed',\n 'an open project',\n 'Open a project before previewing source files.',\n );\n }\n const resolved = resolveProjectFilePath(root, payload?.path);\n if (!resolved) {\n throw workspaceError(\n 'view-workspace-invalid-args',\n 'path to be a file inside the open project',\n 'Provide a project-relative or in-project absolute path.',\n { field: 'path' },\n );\n }\n try {\n return await readFilePreview(resolved.abs, resolved.rel);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n if (message.startsWith('is a directory')) {\n throw workspaceError(\n 'view-workspace-invalid-args',\n 'a file path',\n message,\n { path: resolved.rel },\n );\n }\n throw workspaceError(\n 'view-workspace-file-not-found',\n 'the file to exist in the open project',\n 'Refresh the content browser and retry.',\n { path: resolved.rel },\n );\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -9,17 +9,17 @@ import {
9
9
  InspectorForm,
10
10
  OverlayRootProvider,
11
11
  PanelHeader
12
- } from "./chunk-FKLYSAVN.mjs";
12
+ } from "./chunk-CXOD7FW6.mjs";
13
13
  import {
14
14
  unwrapWorkspaceInspection
15
15
  } from "./chunk-ZYTHV373.mjs";
16
16
  import {
17
17
  PAGE_TYPE,
18
18
  RESOURCE_KINDS
19
- } from "./chunk-OHVTNEQ2.mjs";
19
+ } from "./chunk-PZIAKZJC.mjs";
20
20
  import {
21
21
  bindWorkspacePreviewSurface
22
- } from "./chunk-45ZU2HHR.mjs";
22
+ } from "./chunk-B6QUJ33G.mjs";
23
23
  import {
24
24
  selectWorkspaceResourcePreview,
25
25
  selectWorkspaceResourceSubject
@@ -410,4 +410,4 @@ export {
410
410
  mountMaterialPropertiesPanel,
411
411
  mountMaterialPreviewPanel
412
412
  };
413
- //# sourceMappingURL=chunk-2VJPRNYB.mjs.map
413
+ //# sourceMappingURL=chunk-IZAHIOFU.mjs.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  dedicatedPreviewPresentation
3
- } from "./chunk-45ZU2HHR.mjs";
3
+ } from "./chunk-B6QUJ33G.mjs";
4
4
  import {
5
5
  liveEnginePresentation
6
6
  } from "./chunk-IM3H4F4X.mjs";
@@ -126,4 +126,4 @@ export {
126
126
  createResourcePanelClaims,
127
127
  applyResourcePagePlugin
128
128
  };
129
- //# sourceMappingURL=chunk-BGK4ZEQ5.mjs.map
129
+ //# sourceMappingURL=chunk-KX2WU5Z6.mjs.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  VIEW_PRODUCT_BACKEND_CATALOG
3
- } from "./chunk-BCTPTLA6.mjs";
3
+ } from "./chunk-XEE3E42Q.mjs";
4
4
  import {
5
5
  startViewHostServer
6
6
  } from "./chunk-N2GEQFFK.mjs";
@@ -8,7 +8,7 @@ import {
8
8
  VIEW_FRONTEND_MODULE,
9
9
  createViewProductPlan,
10
10
  viewFrontendRoot
11
- } from "./chunk-TTFLJHQZ.mjs";
11
+ } from "./chunk-H4UIESCF.mjs";
12
12
  import {
13
13
  workspaceDiagnosticRecord
14
14
  } from "./chunk-U5R6MVM4.mjs";
@@ -171,4 +171,4 @@ export {
171
171
  createViewHostBinding,
172
172
  createViewBackend
173
173
  };
174
- //# sourceMappingURL=chunk-TBZZ37VI.mjs.map
174
+ //# sourceMappingURL=chunk-KYTG2MKV.mjs.map
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  PluginsPanel
3
- } from "./chunk-ACOMGSSB.mjs";
3
+ } from "./chunk-5PHAXNFO.mjs";
4
4
  import {
5
5
  OverlayRootProvider
6
- } from "./chunk-FKLYSAVN.mjs";
6
+ } from "./chunk-CXOD7FW6.mjs";
7
7
 
8
8
  // packages/view-plugin-plugins/src/ui/mount.tsx
9
9
  import { createRoot } from "react-dom/client";
@@ -39,4 +39,4 @@ async function mountPluginsPanel(props) {
39
39
  export {
40
40
  mountPluginsPanel
41
41
  };
42
- //# sourceMappingURL=chunk-M5X56JWH.mjs.map
42
+ //# sourceMappingURL=chunk-PW5CE2Y6.mjs.map
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  RESOURCE_PREVIEW_LAYOUT,
3
3
  RESOURCE_PROPERTIES_LAYOUT
4
- } from "./chunk-BGK4ZEQ5.mjs";
4
+ } from "./chunk-KX2WU5Z6.mjs";
5
5
  import {
6
6
  VIEW_PAGE_TYPES
7
7
  } from "./chunk-E3Z7GLFU.mjs";
@@ -83,4 +83,4 @@ export {
83
83
  TITLE_I18N_KEY,
84
84
  identity_exports
85
85
  };
86
- //# sourceMappingURL=chunk-OHVTNEQ2.mjs.map
86
+ //# sourceMappingURL=chunk-PZIAKZJC.mjs.map
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  VIEW_PRODUCT_FRONTEND_CATALOG
3
- } from "./chunk-PG4AJFDC.mjs";
3
+ } from "./chunk-DJZGRO7W.mjs";
4
4
  import {
5
5
  VIEW_FRONTEND_ROOT_PROGRAM,
6
6
  createViewProductPlan
7
- } from "./chunk-TTFLJHQZ.mjs";
7
+ } from "./chunk-H4UIESCF.mjs";
8
8
  import {
9
9
  viewInspectorFrontendPlugin
10
10
  } from "./chunk-7IGFAI5H.mjs";
@@ -25,7 +25,7 @@ var frontend_default = {
25
25
  typeId: "rhi-debug",
26
26
  context: "artifact",
27
27
  title: "RHI Debug",
28
- order: -10,
28
+ order: 40,
29
29
  closable: true,
30
30
  singleton: true,
31
31
  initial: true,
@@ -150,4 +150,4 @@ export {
150
150
  createViewFrontendRoot,
151
151
  frontend_root_default
152
152
  };
153
- //# sourceMappingURL=chunk-WHVPE2P6.mjs.map
153
+ //# sourceMappingURL=chunk-Q2ZYLFJM.mjs.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../packages/viewer/src/frontend-root.ts", "../../../../view-plugins/rhi-debug/frontend.ts", "../../../../view-plugins/profiler/frontend.ts", "../../../../view-plugins/integration/frontend-plugins.ts"],
4
- "sourcesContent": ["import { Inject } from '@forgeax/engine-plugin';\nimport type { Context, Plugin } from '@forgeax/engine-plugin';\nimport type { ViewFrontendConfig } from './config.ts';\nimport additionalPlugins from './frontend-plugins.ts';\nimport { viewInspectorFrontendPlugin } from '@forgeax/view-plugin-plugins/runtime';\nimport { createViewProductPlan, VIEW_FRONTEND_ROOT_PROGRAM } from './catalog-shared.ts';\nimport { VIEW_PRODUCT_FRONTEND_CATALOG } from './frontend-catalog.ts';\nexport { VIEW_FRONTEND_ROOT_PROGRAM } from './catalog-shared.ts';\n\n/** One native root for the optional View surface. The Host resolves only this program. */\nexport function createViewFrontendRoot(browserConfig: ViewFrontendConfig = {}) {\n return {\n name: VIEW_FRONTEND_ROOT_PROGRAM,\n async apply(ctx: Context, config: { disabledPages?: readonly string[]; frontendConfig?: ViewFrontendConfig } = {}) {\n const plan = createViewProductPlan({ disabledPages: config.disabledPages });\n const shared = {\n ...(config.frontendConfig ?? {}),\n ...browserConfig,\n workspace: {\n ...(config.frontendConfig?.workspace ?? {}),\n ...(browserConfig.workspace ?? {}),\n },\n };\n const deferred: Plugin.Object<ViewFrontendConfig>[] = [];\n for (const component of plan.frontend) {\n const record = VIEW_PRODUCT_FRONTEND_CATALOG.get(component.module);\n if (!record) throw new Error(`View frontend program is missing: ${component.module}`);\n const { default: plugin } = await record.load();\n if (ctx.fiber.uid === null) return;\n if (shared.embedded && !shared.presentation && !shared.targetPresentation && record.requiresWorkspacePresentation) {\n deferred.push(plugin);\n continue;\n }\n // Cordis fibers are thenable. Starting the page plugins must not await\n // their injection of Engine's presentation, which is supplied only\n // after the frontend root activates and the App bootstrap begins.\n const fiber = ctx.plugin(plugin, shared);\n if (component === plan.frontend[0]) await fiber.await();\n }\n if (ctx.fiber.uid === null) return;\n ctx.plugin(viewInspectorFrontendPlugin, shared);\n for (const plugin of additionalPlugins) ctx.plugin(plugin, shared);\n if (deferred.length) {\n let started = false;\n const startPresentationPages = () => {\n if (started || !ctx.get('engineWorkspacePresentation')) return;\n started = true;\n for (const plugin of deferred) ctx.plugin({\n ...plugin,\n inject: { ...Inject.resolve(plugin.inject), engineWorkspacePresentation: null },\n }, shared);\n };\n ctx.on('internal/service', (name) => {\n if (name === 'engineWorkspacePresentation') startPresentationPages();\n });\n startPresentationPages();\n }\n },\n };\n}\n\nexport default createViewFrontendRoot();\n", "import type { Context, Plugin } from '@forgeax/engine-plugin';\nimport type { Dispose } from '@forgeax/view-workspace-core/frontend-contract';\n/** Domain operations remain in the existing RHI viewer and RHI Debug packages. */\nexport default {\n name: 'forgeax.engine.view.rhi-debug',\n inject: ['pageHost', 'panelHost'],\n async apply(ctx: Context) {\n const page = ctx.pageHost;\n const node = document.createElement('section');\n node.dataset.forgeaxDiagnostic = 'rhi-debug';\n node.style.cssText = 'height:100%;min-height:0;overflow:auto';\n const unregister = page.registerType({ typeId: 'rhi-debug', context: 'artifact', title: 'RHI Debug', order: -10,\n closable: true, singleton: true, initial: true, openable: true, layout: 'surface', showPanelRail: false, hideWhenInactive: true });\n const unmount = page.mount('rhi-debug', node);\n let dispose: Dispose | undefined;\n let live = true;\n ctx.effect(() => async () => { live = false; await dispose?.(); unmount(); unregister(); });\n const mounted = await ctx.panelHost.mountPanelInto({ element: node, panel: 'RhiDebug' });\n if (live) dispose = mounted; else await mounted?.();\n },\n} satisfies Plugin.Object;\n", "import type { Context, Plugin } from '@forgeax/engine-plugin';\nimport type { Dispose } from '@forgeax/view-workspace-core/frontend-contract';\nimport { buildProfileModel, validateProfileCapture } from '@forgeax/engine-profiler';\nexport default {\n name: 'forgeax.engine.view.profiler',\n inject: ['pageHost', 'panelHost'],\n async apply(ctx: Context) {\n const page = ctx.pageHost;\n const node = document.createElement('section');\n node.dataset.forgeaxDiagnostic = 'profiler';\n node.style.cssText = 'height:100%;min-height:0;overflow:auto';\n const unregister = page.registerType({ typeId: 'profiler', context: 'artifact', title: 'CPU Profiler', order: 30,\n closable: true, singleton: true, initial: true, openable: true, layout: 'surface', showPanelRail: false, hideWhenInactive: true });\n const unmount = page.mount('profiler', node);\n let dispose: Dispose | undefined;\n let live = true;\n ctx.effect(() => async () => { live = false; await dispose?.(); unmount(); unregister(); });\n const mounted = await ctx.panelHost.mountPanelInto({ element: node, panel: 'Profiler', props: {\n readCapture(bytes: string) {\n const capture = JSON.parse(bytes);\n const result = validateProfileCapture(capture);\n return result.ok ? buildProfileModel(result.value) : result;\n },\n } });\n if (live) dispose = mounted; else await mounted?.();\n },\n} satisfies Plugin.Object;\n", "import type { Plugin } from '@forgeax/engine-plugin';\nimport rhiDebug from '../rhi-debug/frontend.ts';\nimport profiler from '../profiler/frontend.ts';\nexport default [rhiDebug, profiler] satisfies readonly Plugin.Object[];\n"],
4
+ "sourcesContent": ["import { Inject } from '@forgeax/engine-plugin';\nimport type { Context, Plugin } from '@forgeax/engine-plugin';\nimport type { ViewFrontendConfig } from './config.ts';\nimport additionalPlugins from './frontend-plugins.ts';\nimport { viewInspectorFrontendPlugin } from '@forgeax/view-plugin-plugins/runtime';\nimport { createViewProductPlan, VIEW_FRONTEND_ROOT_PROGRAM } from './catalog-shared.ts';\nimport { VIEW_PRODUCT_FRONTEND_CATALOG } from './frontend-catalog.ts';\nexport { VIEW_FRONTEND_ROOT_PROGRAM } from './catalog-shared.ts';\n\n/** One native root for the optional View surface. The Host resolves only this program. */\nexport function createViewFrontendRoot(browserConfig: ViewFrontendConfig = {}) {\n return {\n name: VIEW_FRONTEND_ROOT_PROGRAM,\n async apply(ctx: Context, config: { disabledPages?: readonly string[]; frontendConfig?: ViewFrontendConfig } = {}) {\n const plan = createViewProductPlan({ disabledPages: config.disabledPages });\n const shared = {\n ...(config.frontendConfig ?? {}),\n ...browserConfig,\n workspace: {\n ...(config.frontendConfig?.workspace ?? {}),\n ...(browserConfig.workspace ?? {}),\n },\n };\n const deferred: Plugin.Object<ViewFrontendConfig>[] = [];\n for (const component of plan.frontend) {\n const record = VIEW_PRODUCT_FRONTEND_CATALOG.get(component.module);\n if (!record) throw new Error(`View frontend program is missing: ${component.module}`);\n const { default: plugin } = await record.load();\n if (ctx.fiber.uid === null) return;\n if (shared.embedded && !shared.presentation && !shared.targetPresentation && record.requiresWorkspacePresentation) {\n deferred.push(plugin);\n continue;\n }\n // Cordis fibers are thenable. Starting the page plugins must not await\n // their injection of Engine's presentation, which is supplied only\n // after the frontend root activates and the App bootstrap begins.\n const fiber = ctx.plugin(plugin, shared);\n if (component === plan.frontend[0]) await fiber.await();\n }\n if (ctx.fiber.uid === null) return;\n ctx.plugin(viewInspectorFrontendPlugin, shared);\n for (const plugin of additionalPlugins) ctx.plugin(plugin, shared);\n if (deferred.length) {\n let started = false;\n const startPresentationPages = () => {\n if (started || !ctx.get('engineWorkspacePresentation')) return;\n started = true;\n for (const plugin of deferred) ctx.plugin({\n ...plugin,\n inject: { ...Inject.resolve(plugin.inject), engineWorkspacePresentation: null },\n }, shared);\n };\n ctx.on('internal/service', (name) => {\n if (name === 'engineWorkspacePresentation') startPresentationPages();\n });\n startPresentationPages();\n }\n },\n };\n}\n\nexport default createViewFrontendRoot();\n", "import type { Context, Plugin } from '@forgeax/engine-plugin';\nimport type { Dispose } from '@forgeax/view-workspace-core/frontend-contract';\n/** Domain operations remain in the existing RHI viewer and RHI Debug packages. */\nexport default {\n name: 'forgeax.engine.view.rhi-debug',\n inject: ['pageHost', 'panelHost'],\n async apply(ctx: Context) {\n const page = ctx.pageHost;\n const node = document.createElement('section');\n node.dataset.forgeaxDiagnostic = 'rhi-debug';\n node.style.cssText = 'height:100%;min-height:0;overflow:auto';\n const unregister = page.registerType({ typeId: 'rhi-debug', context: 'artifact', title: 'RHI Debug', order: 40,\n closable: true, singleton: true, initial: true, openable: true, layout: 'surface', showPanelRail: false, hideWhenInactive: true });\n const unmount = page.mount('rhi-debug', node);\n let dispose: Dispose | undefined;\n let live = true;\n ctx.effect(() => async () => { live = false; await dispose?.(); unmount(); unregister(); });\n const mounted = await ctx.panelHost.mountPanelInto({ element: node, panel: 'RhiDebug' });\n if (live) dispose = mounted; else await mounted?.();\n },\n} satisfies Plugin.Object;\n", "import type { Context, Plugin } from '@forgeax/engine-plugin';\nimport type { Dispose } from '@forgeax/view-workspace-core/frontend-contract';\nimport { buildProfileModel, validateProfileCapture } from '@forgeax/engine-profiler';\nexport default {\n name: 'forgeax.engine.view.profiler',\n inject: ['pageHost', 'panelHost'],\n async apply(ctx: Context) {\n const page = ctx.pageHost;\n const node = document.createElement('section');\n node.dataset.forgeaxDiagnostic = 'profiler';\n node.style.cssText = 'height:100%;min-height:0;overflow:auto';\n const unregister = page.registerType({ typeId: 'profiler', context: 'artifact', title: 'CPU Profiler', order: 30,\n closable: true, singleton: true, initial: true, openable: true, layout: 'surface', showPanelRail: false, hideWhenInactive: true });\n const unmount = page.mount('profiler', node);\n let dispose: Dispose | undefined;\n let live = true;\n ctx.effect(() => async () => { live = false; await dispose?.(); unmount(); unregister(); });\n const mounted = await ctx.panelHost.mountPanelInto({ element: node, panel: 'Profiler', props: {\n readCapture(bytes: string) {\n const capture = JSON.parse(bytes);\n const result = validateProfileCapture(capture);\n return result.ok ? buildProfileModel(result.value) : result;\n },\n } });\n if (live) dispose = mounted; else await mounted?.();\n },\n} satisfies Plugin.Object;\n", "import type { Plugin } from '@forgeax/engine-plugin';\nimport rhiDebug from '../rhi-debug/frontend.ts';\nimport profiler from '../profiler/frontend.ts';\nexport default [rhiDebug, profiler] satisfies readonly Plugin.Object[];\n"],
5
5
  "mappings": "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",
6
6
  "names": ["frontend_default", "frontend_default"]
7
7
  }
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  FRONTEND_PLUGIN_ID,
3
3
  identity_exports
4
- } from "./chunk-AIIYGGGC.mjs";
4
+ } from "./chunk-X4NNZ5X6.mjs";
5
5
  import {
6
6
  applyResourcePagePlugin
7
- } from "./chunk-BGK4ZEQ5.mjs";
7
+ } from "./chunk-KX2WU5Z6.mjs";
8
8
 
9
9
  // packages/view-plugin-mesh/src/frontend.ts
10
10
  var VIEW_MESH_FRONTEND_PLUGIN_ID = FRONTEND_PLUGIN_ID;
@@ -22,4 +22,4 @@ export {
22
22
  viewMeshFrontendPlugin,
23
23
  frontend_default
24
24
  };
25
- //# sourceMappingURL=chunk-JZ3V27HQ.mjs.map
25
+ //# sourceMappingURL=chunk-U64FRQKP.mjs.map
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  FRONTEND_PLUGIN_ID,
3
3
  identity_exports
4
- } from "./chunk-CWNB67UF.mjs";
4
+ } from "./chunk-FMCHH5R4.mjs";
5
5
  import {
6
6
  applyResourcePagePlugin
7
- } from "./chunk-BGK4ZEQ5.mjs";
7
+ } from "./chunk-KX2WU5Z6.mjs";
8
8
 
9
9
  // packages/view-plugin-texture/src/frontend.ts
10
10
  var VIEW_TEXTURE_FRONTEND_PLUGIN_ID = FRONTEND_PLUGIN_ID;
@@ -22,4 +22,4 @@ export {
22
22
  viewTextureFrontendPlugin,
23
23
  frontend_default
24
24
  };
25
- //# sourceMappingURL=chunk-W46L4HSP.mjs.map
25
+ //# sourceMappingURL=chunk-U6UMATPV.mjs.map