@forgeax/view 0.5.0-dev.13604.c415409c3b9d → 0.5.0-dev.13713.d28c4863d779

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 (280) hide show
  1. package/README.md +67 -9
  2. package/dist/build-revision.json +1 -1
  3. package/dist/modules/backend.mjs +34 -34
  4. package/dist/modules/browser.mjs +55 -49
  5. package/dist/modules/chunks/{chunk-EWSCJF77.mjs → chunk-2CMCY54A.mjs} +2 -2
  6. package/dist/modules/chunks/{chunk-M6S5YA6X.mjs → chunk-2RUKPDIE.mjs} +4 -4
  7. package/dist/modules/chunks/{chunk-M6S5YA6X.mjs.map → chunk-2RUKPDIE.mjs.map} +1 -1
  8. package/dist/modules/chunks/{chunk-DWT3TA6M.mjs → chunk-3FBX3P3H.mjs} +9 -8
  9. package/dist/modules/chunks/chunk-3FBX3P3H.mjs.map +7 -0
  10. package/dist/modules/chunks/{chunk-6KM24NH6.mjs → chunk-3Y5WN22T.mjs} +3 -3
  11. package/dist/modules/chunks/chunk-3Y5WN22T.mjs.map +7 -0
  12. package/dist/modules/chunks/{chunk-YFQGSDK3.mjs → chunk-45WL24XN.mjs} +2 -2
  13. package/dist/modules/chunks/{chunk-FMCHH5R4.mjs → chunk-4FYKRL46.mjs} +3 -3
  14. package/dist/modules/chunks/{chunk-VW2ZF3P4.mjs → chunk-4MJHVZMB.mjs} +6 -6
  15. package/dist/modules/chunks/{chunk-XQYF2P6M.mjs → chunk-5HVXQEO3.mjs} +7 -7
  16. package/dist/modules/chunks/{chunk-XMP4THLF.mjs → chunk-66LM6NO6.mjs} +4 -4
  17. package/dist/modules/chunks/{chunk-P4UPH74B.mjs → chunk-6C4OCCYB.mjs} +12 -12
  18. package/dist/modules/chunks/{chunk-P4UPH74B.mjs.map → chunk-6C4OCCYB.mjs.map} +1 -1
  19. package/dist/modules/chunks/{chunk-ZGOGO7SS.mjs → chunk-6J27SWMY.mjs} +1 -1
  20. package/dist/modules/chunks/{chunk-JK7K7RG3.mjs → chunk-6VK7HB4X.mjs} +4 -4
  21. package/dist/modules/chunks/{chunk-HRKW766Y.mjs → chunk-6WZZ7TIC.mjs} +2 -2
  22. package/dist/modules/chunks/{chunk-FICPCJKR.mjs → chunk-7DFCIN3T.mjs} +3 -3
  23. package/dist/modules/chunks/{chunk-FICPCJKR.mjs.map → chunk-7DFCIN3T.mjs.map} +1 -1
  24. package/dist/modules/chunks/{chunk-U64FRQKP.mjs → chunk-7MWZK7HS.mjs} +3 -3
  25. package/dist/modules/chunks/{chunk-F5RLQAPN.mjs → chunk-A7OGXJAV.mjs} +3 -3
  26. package/dist/modules/chunks/{chunk-QUFVUMSY.mjs → chunk-AUINYWZP.mjs} +2 -2
  27. package/dist/modules/chunks/{chunk-PZIAKZJC.mjs → chunk-B24VYGHV.mjs} +3 -3
  28. package/dist/modules/chunks/{chunk-SRYQLFBV.mjs → chunk-BIUWJROZ.mjs} +3 -3
  29. package/dist/modules/chunks/{chunk-SRYQLFBV.mjs.map → chunk-BIUWJROZ.mjs.map} +2 -2
  30. package/dist/modules/chunks/{chunk-X4NNZ5X6.mjs → chunk-C2AMOM7H.mjs} +3 -3
  31. package/dist/modules/chunks/{chunk-IZAHIOFU.mjs → chunk-C3WVSJZF.mjs} +6 -6
  32. package/dist/modules/chunks/{chunk-2Z5KEV6L.mjs → chunk-CAXCOZ7Y.mjs} +3 -3
  33. package/dist/modules/chunks/{chunk-HWZCLROY.mjs → chunk-CN6YN4HP.mjs} +251 -45
  34. package/dist/modules/chunks/chunk-CN6YN4HP.mjs.map +7 -0
  35. package/dist/modules/chunks/{chunk-B6QUJ33G.mjs → chunk-CXFQME65.mjs} +3 -3
  36. package/dist/modules/chunks/{chunk-IJPWKKIU.mjs → chunk-CYOLEAAY.mjs} +14 -13
  37. package/dist/modules/chunks/chunk-CYOLEAAY.mjs.map +7 -0
  38. package/dist/modules/chunks/{chunk-U6UMATPV.mjs → chunk-CYU3WWN6.mjs} +3 -3
  39. package/dist/modules/chunks/{chunk-AGVLPYVE.mjs → chunk-D2LZIQE2.mjs} +2 -2
  40. package/dist/modules/chunks/{chunk-5YTMN435.mjs → chunk-DC5JP46Y.mjs} +13 -3
  41. package/dist/modules/chunks/chunk-DC5JP46Y.mjs.map +7 -0
  42. package/dist/modules/chunks/{chunk-YNHEYXDG.mjs → chunk-DOU4MNMQ.mjs} +3 -3
  43. package/dist/modules/chunks/{chunk-ZIDEETK4.mjs → chunk-E4G4HDOC.mjs} +3 -3
  44. package/dist/modules/chunks/{chunk-ZHO2G4JR.mjs → chunk-EZAJ66NW.mjs} +3 -3
  45. package/dist/modules/chunks/{chunk-APD2EWSZ.mjs → chunk-FIWL6TQS.mjs} +2 -2
  46. package/dist/modules/chunks/{chunk-U5J7OTEB.mjs → chunk-FSSARTVM.mjs} +3 -3
  47. package/dist/modules/chunks/{chunk-47RJSHLM.mjs → chunk-FXXPWAXM.mjs} +3 -3
  48. package/dist/modules/chunks/{chunk-D2RCKG7Q.mjs → chunk-G2QCXN56.mjs} +6 -6
  49. package/dist/modules/chunks/{chunk-4T3D67CS.mjs → chunk-GRDCA6LD.mjs} +8 -8
  50. package/dist/modules/chunks/{chunk-4T3D67CS.mjs.map → chunk-GRDCA6LD.mjs.map} +1 -1
  51. package/dist/modules/chunks/{chunk-WVU3CQ62.mjs → chunk-GUVUL6D2.mjs} +3 -3
  52. package/dist/modules/chunks/{chunk-YLCJNKIW.mjs → chunk-I32EONBF.mjs} +70 -30
  53. package/dist/modules/chunks/chunk-I32EONBF.mjs.map +7 -0
  54. package/dist/modules/chunks/{chunk-E3PJGTLI.mjs → chunk-IGIELQZ2.mjs} +5 -5
  55. package/dist/modules/chunks/{chunk-5PHAXNFO.mjs → chunk-IMDR26Y3.mjs} +3 -3
  56. package/dist/modules/chunks/{chunk-55F55BQY.mjs → chunk-JVOHFCI4.mjs} +3 -3
  57. package/dist/modules/chunks/{chunk-6I7RY73G.mjs → chunk-KCM7ZCQ3.mjs} +5 -5
  58. package/dist/modules/chunks/chunk-KCM7ZCQ3.mjs.map +7 -0
  59. package/dist/modules/chunks/{chunk-K2QZRFLE.mjs → chunk-KJTMDFFX.mjs} +4 -4
  60. package/dist/modules/chunks/{chunk-KX2WU5Z6.mjs → chunk-KPLESRQY.mjs} +3 -3
  61. package/dist/modules/chunks/{chunk-PW5CE2Y6.mjs → chunk-KUOWDTI6.mjs} +2 -2
  62. package/dist/modules/chunks/chunk-L6IHUN7X.mjs +13 -0
  63. package/dist/modules/chunks/chunk-L6IHUN7X.mjs.map +7 -0
  64. package/dist/modules/chunks/{chunk-INTTYJVW.mjs → chunk-LBQ6DFMP.mjs} +2 -2
  65. package/dist/modules/chunks/{chunk-OKQ5RBKO.mjs → chunk-LVWHM3UN.mjs} +2 -2
  66. package/dist/modules/chunks/{chunk-D57DDEV2.mjs → chunk-MDQMARAN.mjs} +6 -6
  67. package/dist/modules/chunks/{chunk-D57DDEV2.mjs.map → chunk-MDQMARAN.mjs.map} +2 -2
  68. package/dist/modules/chunks/{chunk-STQPRNEO.mjs → chunk-MLXRIWJA.mjs} +2 -2
  69. package/dist/modules/chunks/{chunk-D25SR5FS.mjs → chunk-N2SH3JGI.mjs} +3 -3
  70. package/dist/modules/chunks/{chunk-KI4WGTWL.mjs → chunk-N7NXZ6R3.mjs} +4 -4
  71. package/dist/modules/chunks/{chunk-KI4WGTWL.mjs.map → chunk-N7NXZ6R3.mjs.map} +2 -2
  72. package/dist/modules/chunks/{chunk-7IGFAI5H.mjs → chunk-O5QX6H3U.mjs} +5 -5
  73. package/dist/modules/chunks/{chunk-5W7SC5D4.mjs → chunk-P2Y73QJJ.mjs} +11 -1
  74. package/dist/modules/chunks/{chunk-5W7SC5D4.mjs.map → chunk-P2Y73QJJ.mjs.map} +2 -2
  75. package/dist/modules/chunks/{chunk-FNRGLCZW.mjs → chunk-PCQNUFDL.mjs} +39 -13
  76. package/dist/modules/chunks/chunk-PCQNUFDL.mjs.map +7 -0
  77. package/dist/modules/chunks/{chunk-46UEGAXY.mjs → chunk-Q7M7VUOZ.mjs} +6 -6
  78. package/dist/modules/chunks/{chunk-XE6ITXHT.mjs → chunk-QB33CMEU.mjs} +2 -2
  79. package/dist/modules/chunks/{chunk-E3Z7GLFU.mjs → chunk-QJHQN6OD.mjs} +15 -4
  80. package/dist/modules/chunks/chunk-QJHQN6OD.mjs.map +7 -0
  81. package/dist/modules/chunks/{chunk-KAGFU64Y.mjs → chunk-QW2VT3XB.mjs} +2 -2
  82. package/dist/modules/chunks/{chunk-U5R6MVM4.mjs → chunk-RFTLGEB5.mjs} +2 -2
  83. package/dist/modules/chunks/{chunk-VKNIYV2W.mjs → chunk-RYYKMDNI.mjs} +202 -35
  84. package/dist/modules/chunks/chunk-RYYKMDNI.mjs.map +7 -0
  85. package/dist/modules/chunks/{chunk-P5XMFZY4.mjs → chunk-SFB5BDTB.mjs} +2 -2
  86. package/dist/modules/chunks/{chunk-4D3Q7K44.mjs → chunk-SNICHQJP.mjs} +2 -2
  87. package/dist/modules/chunks/{chunk-CX5WREJC.mjs → chunk-SPGFO2TA.mjs} +2 -2
  88. package/dist/modules/chunks/{chunk-H256DQT6.mjs → chunk-TMPTVIAP.mjs} +2 -2
  89. package/dist/modules/chunks/{chunk-OQXDADAS.mjs → chunk-UWJYROKS.mjs} +6 -6
  90. package/dist/modules/chunks/chunk-UWJYROKS.mjs.map +7 -0
  91. package/dist/modules/chunks/{chunk-TTRUYO7Q.mjs → chunk-UZH2664E.mjs} +3 -3
  92. package/dist/modules/chunks/{chunk-TTRUYO7Q.mjs.map → chunk-UZH2664E.mjs.map} +2 -2
  93. package/dist/modules/chunks/{chunk-CKYXAT7H.mjs → chunk-VC4OEPDH.mjs} +2 -2
  94. package/dist/modules/chunks/{chunk-RJVOH7G2.mjs → chunk-VKWEA6NG.mjs} +27 -27
  95. package/dist/modules/chunks/{chunk-LZ57Y73Z.mjs → chunk-VSJOW7J4.mjs} +9 -7
  96. package/dist/modules/chunks/chunk-VSJOW7J4.mjs.map +7 -0
  97. package/dist/modules/chunks/{chunk-PVP5YBNR.mjs → chunk-WFM434WJ.mjs} +2 -2
  98. package/dist/modules/chunks/{chunk-TXLD7JI5.mjs → chunk-WJNASQF2.mjs} +2 -2
  99. package/dist/modules/chunks/{chunk-357UOBAS.mjs → chunk-XUNDH3E7.mjs} +2 -2
  100. package/dist/modules/chunks/{chunk-PJFFCRRD.mjs → chunk-YDARD4EP.mjs} +2 -2
  101. package/dist/modules/chunks/{chunk-27XASYEH.mjs → chunk-YU3HRQX7.mjs} +17 -11
  102. package/dist/modules/chunks/chunk-YU3HRQX7.mjs.map +7 -0
  103. package/dist/modules/chunks/{chunk-EZSGDSCC.mjs → chunk-ZRE7BDDB.mjs} +30 -5
  104. package/dist/modules/chunks/chunk-ZRE7BDDB.mjs.map +7 -0
  105. package/dist/modules/cli-contributions.mjs +14 -14
  106. package/dist/modules/cli.mjs +5 -5
  107. package/dist/modules/command-executor.mjs +3 -3
  108. package/dist/modules/embedded.mjs +82 -42
  109. package/dist/modules/embedded.mjs.map +2 -2
  110. package/dist/modules/extension-bridge.mjs +4 -4
  111. package/dist/modules/frontend-root.mjs +46 -46
  112. package/dist/modules/index.mjs +71 -65
  113. package/dist/modules/index.mjs.map +1 -1
  114. package/dist/modules/pages/scene.mjs +5 -5
  115. package/dist/modules/plugin.mjs +35 -35
  116. package/dist/modules/plugins/asset/frontend.mjs +10 -10
  117. package/dist/modules/plugins/asset/identity.mjs +9 -9
  118. package/dist/modules/plugins/asset/ui.mjs +3 -3
  119. package/dist/modules/plugins/content-browser/frontend.mjs +3 -3
  120. package/dist/modules/plugins/content-browser/identity.mjs +2 -2
  121. package/dist/modules/plugins/content-browser/ui.mjs +3 -3
  122. package/dist/modules/plugins/display/api.mjs +1 -1
  123. package/dist/modules/plugins/display/backend.mjs +4 -4
  124. package/dist/modules/plugins/display/frontend.mjs +5 -5
  125. package/dist/modules/plugins/display/identity.mjs +2 -2
  126. package/dist/modules/plugins/display/ui.mjs +3 -3
  127. package/dist/modules/plugins/inspector/frontend.mjs +3 -3
  128. package/dist/modules/plugins/inspector/identity.mjs +2 -2
  129. package/dist/modules/plugins/inspector/ui.mjs +3 -3
  130. package/dist/modules/plugins/material/frontend.mjs +10 -10
  131. package/dist/modules/plugins/material/identity.mjs +9 -9
  132. package/dist/modules/plugins/material/ui.mjs +10 -10
  133. package/dist/modules/plugins/mesh/frontend.mjs +10 -10
  134. package/dist/modules/plugins/mesh/identity.mjs +9 -9
  135. package/dist/modules/plugins/mesh/ui.mjs +10 -10
  136. package/dist/modules/plugins/plugins/api.mjs +4 -4
  137. package/dist/modules/plugins/plugins/backend.mjs +7 -7
  138. package/dist/modules/plugins/plugins/cli.mjs +5 -5
  139. package/dist/modules/plugins/plugins/frontend.mjs +3 -3
  140. package/dist/modules/plugins/plugins/identity.mjs +2 -2
  141. package/dist/modules/plugins/plugins/runtime.mjs +6 -6
  142. package/dist/modules/plugins/plugins/ui/panel.mjs +3 -3
  143. package/dist/modules/plugins/plugins/ui.mjs +4 -4
  144. package/dist/modules/plugins/scene/frontend.mjs +5 -5
  145. package/dist/modules/plugins/scene/identity.mjs +2 -2
  146. package/dist/modules/plugins/scene-tree/frontend.mjs +3 -3
  147. package/dist/modules/plugins/scene-tree/identity.mjs +2 -2
  148. package/dist/modules/plugins/scene-tree/ui.mjs +3 -3
  149. package/dist/modules/plugins/texture/frontend.mjs +10 -10
  150. package/dist/modules/plugins/texture/identity.mjs +9 -9
  151. package/dist/modules/plugins/texture/ui.mjs +10 -10
  152. package/dist/modules/plugins/viewport/frontend.mjs +12 -12
  153. package/dist/modules/plugins/viewport/identity.mjs +2 -2
  154. package/dist/modules/plugins/viewport/presentation.mjs +4 -4
  155. package/dist/modules/plugins/viewport/schema.mjs +2 -2
  156. package/dist/modules/plugins/viewport/workspace-shell.mjs +9 -9
  157. package/dist/modules/product.mjs +35 -35
  158. package/dist/modules/shell/frontend.mjs +1 -1
  159. package/dist/modules/viewer/catalog/backend.mjs +31 -31
  160. package/dist/modules/viewer/catalog/frontend.mjs +42 -42
  161. package/dist/modules/viewer/catalog/shared.mjs +20 -20
  162. package/dist/modules/viewer/catalog.mjs +51 -51
  163. package/dist/modules/viewer/cli.mjs +10 -10
  164. package/dist/modules/viewer-host/frontend.mjs +48 -48
  165. package/dist/modules/viewer-host/page-registry.mjs +6 -6
  166. package/dist/modules/viewer-host.mjs +7 -7
  167. package/dist/modules/viewer.mjs +51 -51
  168. package/dist/modules/workspace/api.mjs +1 -1
  169. package/dist/modules/workspace/backend.mjs +10 -10
  170. package/dist/modules/workspace/broker.mjs +9 -9
  171. package/dist/modules/workspace/cli.mjs +2 -2
  172. package/dist/modules/workspace/client.mjs +3 -3
  173. package/dist/modules/workspace/command-error.mjs +2 -2
  174. package/dist/modules/workspace/contract.mjs +7 -1
  175. package/dist/modules/workspace/engine-adapter.mjs +3 -3
  176. package/dist/modules/workspace/extension-bridge.mjs +4 -4
  177. package/dist/modules/workspace/frontend-plugin.mjs +8 -8
  178. package/dist/modules/workspace/frontend.mjs +9 -9
  179. package/dist/modules/workspace/page-title.mjs +3 -3
  180. package/dist/modules/workspace/presentation.mjs +4 -4
  181. package/dist/modules/workspace/preview-surface.mjs +7 -7
  182. package/dist/modules/workspace/project-session.mjs +2 -2
  183. package/dist/modules/workspace/render-resize-sync.mjs +2 -2
  184. package/dist/modules/workspace/resident.mjs +4 -4
  185. package/dist/modules/workspace/resource-open.mjs +5 -5
  186. package/dist/modules/workspace/resource-page.mjs +8 -8
  187. package/dist/modules/workspace/tool-runtime.mjs +7 -5
  188. package/dist/modules/workspace/view-trace.mjs +3 -3
  189. package/dist/modules/workspace/workspace-recovery.mjs +4 -4
  190. package/dist/modules/workspace/workspace-state.mjs +2 -2
  191. package/dist/modules/workspace-frontend.mjs +8 -8
  192. package/dist/viewer/assets/{embedded-DXSSFAyM.js → embedded-BKEAtUD6.js} +2 -2
  193. package/dist/viewer/assets/{embedded-DXSSFAyM.js.map → embedded-BKEAtUD6.js.map} +1 -1
  194. package/dist/viewer/assets/main-BQrn6wsa.js +22 -0
  195. package/dist/viewer/assets/main-BQrn6wsa.js.map +1 -0
  196. package/dist/viewer/assets/{panels-lazy-DqCwhGd9.js → panels-lazy-C_Cs-76A.js} +2 -2
  197. package/dist/viewer/assets/{panels-lazy-DqCwhGd9.js.map → panels-lazy-C_Cs-76A.js.map} +1 -1
  198. package/dist/viewer/assets/panels-ui-DEDHJLuE.js +12 -0
  199. package/dist/viewer/assets/panels-ui-DEDHJLuE.js.map +1 -0
  200. package/dist/viewer/assets/style-CcYzhsIZ.css +2 -0
  201. package/dist/viewer/assets/{wgpu_wasm--oeqTwVY.js → wgpu_wasm-cNR5izZM.js} +126 -0
  202. package/dist/viewer/assets/{wgpu_wasm_bg-WoZ1YI1I.wasm → wgpu_wasm_bg-Dps0jNcQ.wasm} +0 -0
  203. package/dist/viewer/index.html +4 -4
  204. package/dist/viewer/panels.js +1 -1
  205. package/package.json +2 -2
  206. package/scripts/verify-runtime-content-engine.mjs +7 -4
  207. package/skills/forgeax-view-cli/SKILL.md +11 -0
  208. package/dist/modules/chunks/chunk-27XASYEH.mjs.map +0 -7
  209. package/dist/modules/chunks/chunk-5YTMN435.mjs.map +0 -7
  210. package/dist/modules/chunks/chunk-6I7RY73G.mjs.map +0 -7
  211. package/dist/modules/chunks/chunk-6KM24NH6.mjs.map +0 -7
  212. package/dist/modules/chunks/chunk-DWT3TA6M.mjs.map +0 -7
  213. package/dist/modules/chunks/chunk-E3Z7GLFU.mjs.map +0 -7
  214. package/dist/modules/chunks/chunk-EZSGDSCC.mjs.map +0 -7
  215. package/dist/modules/chunks/chunk-FNRGLCZW.mjs.map +0 -7
  216. package/dist/modules/chunks/chunk-HWZCLROY.mjs.map +0 -7
  217. package/dist/modules/chunks/chunk-IJPWKKIU.mjs.map +0 -7
  218. package/dist/modules/chunks/chunk-LZ57Y73Z.mjs.map +0 -7
  219. package/dist/modules/chunks/chunk-OQXDADAS.mjs.map +0 -7
  220. package/dist/modules/chunks/chunk-QELNKFSI.mjs +0 -10
  221. package/dist/modules/chunks/chunk-QELNKFSI.mjs.map +0 -7
  222. package/dist/modules/chunks/chunk-VKNIYV2W.mjs.map +0 -7
  223. package/dist/modules/chunks/chunk-YLCJNKIW.mjs.map +0 -7
  224. package/dist/viewer/assets/main-CI6ZQziX.js +0 -22
  225. package/dist/viewer/assets/main-CI6ZQziX.js.map +0 -1
  226. package/dist/viewer/assets/panels-ui-CfUtl68h.js +0 -12
  227. package/dist/viewer/assets/panels-ui-CfUtl68h.js.map +0 -1
  228. package/dist/viewer/assets/style-gOtSMZif.css +0 -2
  229. /package/dist/modules/chunks/{chunk-EWSCJF77.mjs.map → chunk-2CMCY54A.mjs.map} +0 -0
  230. /package/dist/modules/chunks/{chunk-YFQGSDK3.mjs.map → chunk-45WL24XN.mjs.map} +0 -0
  231. /package/dist/modules/chunks/{chunk-FMCHH5R4.mjs.map → chunk-4FYKRL46.mjs.map} +0 -0
  232. /package/dist/modules/chunks/{chunk-VW2ZF3P4.mjs.map → chunk-4MJHVZMB.mjs.map} +0 -0
  233. /package/dist/modules/chunks/{chunk-XQYF2P6M.mjs.map → chunk-5HVXQEO3.mjs.map} +0 -0
  234. /package/dist/modules/chunks/{chunk-XMP4THLF.mjs.map → chunk-66LM6NO6.mjs.map} +0 -0
  235. /package/dist/modules/chunks/{chunk-ZGOGO7SS.mjs.map → chunk-6J27SWMY.mjs.map} +0 -0
  236. /package/dist/modules/chunks/{chunk-JK7K7RG3.mjs.map → chunk-6VK7HB4X.mjs.map} +0 -0
  237. /package/dist/modules/chunks/{chunk-HRKW766Y.mjs.map → chunk-6WZZ7TIC.mjs.map} +0 -0
  238. /package/dist/modules/chunks/{chunk-U64FRQKP.mjs.map → chunk-7MWZK7HS.mjs.map} +0 -0
  239. /package/dist/modules/chunks/{chunk-F5RLQAPN.mjs.map → chunk-A7OGXJAV.mjs.map} +0 -0
  240. /package/dist/modules/chunks/{chunk-QUFVUMSY.mjs.map → chunk-AUINYWZP.mjs.map} +0 -0
  241. /package/dist/modules/chunks/{chunk-PZIAKZJC.mjs.map → chunk-B24VYGHV.mjs.map} +0 -0
  242. /package/dist/modules/chunks/{chunk-X4NNZ5X6.mjs.map → chunk-C2AMOM7H.mjs.map} +0 -0
  243. /package/dist/modules/chunks/{chunk-IZAHIOFU.mjs.map → chunk-C3WVSJZF.mjs.map} +0 -0
  244. /package/dist/modules/chunks/{chunk-2Z5KEV6L.mjs.map → chunk-CAXCOZ7Y.mjs.map} +0 -0
  245. /package/dist/modules/chunks/{chunk-B6QUJ33G.mjs.map → chunk-CXFQME65.mjs.map} +0 -0
  246. /package/dist/modules/chunks/{chunk-U6UMATPV.mjs.map → chunk-CYU3WWN6.mjs.map} +0 -0
  247. /package/dist/modules/chunks/{chunk-AGVLPYVE.mjs.map → chunk-D2LZIQE2.mjs.map} +0 -0
  248. /package/dist/modules/chunks/{chunk-YNHEYXDG.mjs.map → chunk-DOU4MNMQ.mjs.map} +0 -0
  249. /package/dist/modules/chunks/{chunk-ZIDEETK4.mjs.map → chunk-E4G4HDOC.mjs.map} +0 -0
  250. /package/dist/modules/chunks/{chunk-ZHO2G4JR.mjs.map → chunk-EZAJ66NW.mjs.map} +0 -0
  251. /package/dist/modules/chunks/{chunk-APD2EWSZ.mjs.map → chunk-FIWL6TQS.mjs.map} +0 -0
  252. /package/dist/modules/chunks/{chunk-U5J7OTEB.mjs.map → chunk-FSSARTVM.mjs.map} +0 -0
  253. /package/dist/modules/chunks/{chunk-47RJSHLM.mjs.map → chunk-FXXPWAXM.mjs.map} +0 -0
  254. /package/dist/modules/chunks/{chunk-D2RCKG7Q.mjs.map → chunk-G2QCXN56.mjs.map} +0 -0
  255. /package/dist/modules/chunks/{chunk-WVU3CQ62.mjs.map → chunk-GUVUL6D2.mjs.map} +0 -0
  256. /package/dist/modules/chunks/{chunk-E3PJGTLI.mjs.map → chunk-IGIELQZ2.mjs.map} +0 -0
  257. /package/dist/modules/chunks/{chunk-5PHAXNFO.mjs.map → chunk-IMDR26Y3.mjs.map} +0 -0
  258. /package/dist/modules/chunks/{chunk-55F55BQY.mjs.map → chunk-JVOHFCI4.mjs.map} +0 -0
  259. /package/dist/modules/chunks/{chunk-K2QZRFLE.mjs.map → chunk-KJTMDFFX.mjs.map} +0 -0
  260. /package/dist/modules/chunks/{chunk-KX2WU5Z6.mjs.map → chunk-KPLESRQY.mjs.map} +0 -0
  261. /package/dist/modules/chunks/{chunk-PW5CE2Y6.mjs.map → chunk-KUOWDTI6.mjs.map} +0 -0
  262. /package/dist/modules/chunks/{chunk-INTTYJVW.mjs.map → chunk-LBQ6DFMP.mjs.map} +0 -0
  263. /package/dist/modules/chunks/{chunk-OKQ5RBKO.mjs.map → chunk-LVWHM3UN.mjs.map} +0 -0
  264. /package/dist/modules/chunks/{chunk-STQPRNEO.mjs.map → chunk-MLXRIWJA.mjs.map} +0 -0
  265. /package/dist/modules/chunks/{chunk-D25SR5FS.mjs.map → chunk-N2SH3JGI.mjs.map} +0 -0
  266. /package/dist/modules/chunks/{chunk-7IGFAI5H.mjs.map → chunk-O5QX6H3U.mjs.map} +0 -0
  267. /package/dist/modules/chunks/{chunk-46UEGAXY.mjs.map → chunk-Q7M7VUOZ.mjs.map} +0 -0
  268. /package/dist/modules/chunks/{chunk-XE6ITXHT.mjs.map → chunk-QB33CMEU.mjs.map} +0 -0
  269. /package/dist/modules/chunks/{chunk-KAGFU64Y.mjs.map → chunk-QW2VT3XB.mjs.map} +0 -0
  270. /package/dist/modules/chunks/{chunk-U5R6MVM4.mjs.map → chunk-RFTLGEB5.mjs.map} +0 -0
  271. /package/dist/modules/chunks/{chunk-P5XMFZY4.mjs.map → chunk-SFB5BDTB.mjs.map} +0 -0
  272. /package/dist/modules/chunks/{chunk-4D3Q7K44.mjs.map → chunk-SNICHQJP.mjs.map} +0 -0
  273. /package/dist/modules/chunks/{chunk-CX5WREJC.mjs.map → chunk-SPGFO2TA.mjs.map} +0 -0
  274. /package/dist/modules/chunks/{chunk-H256DQT6.mjs.map → chunk-TMPTVIAP.mjs.map} +0 -0
  275. /package/dist/modules/chunks/{chunk-CKYXAT7H.mjs.map → chunk-VC4OEPDH.mjs.map} +0 -0
  276. /package/dist/modules/chunks/{chunk-RJVOH7G2.mjs.map → chunk-VKWEA6NG.mjs.map} +0 -0
  277. /package/dist/modules/chunks/{chunk-PVP5YBNR.mjs.map → chunk-WFM434WJ.mjs.map} +0 -0
  278. /package/dist/modules/chunks/{chunk-TXLD7JI5.mjs.map → chunk-WJNASQF2.mjs.map} +0 -0
  279. /package/dist/modules/chunks/{chunk-357UOBAS.mjs.map → chunk-XUNDH3E7.mjs.map} +0 -0
  280. /package/dist/modules/chunks/{chunk-PJFFCRRD.mjs.map → chunk-YDARD4EP.mjs.map} +0 -0
@@ -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, WorkspaceSummary, WorkspacePages, WorkspacePackReveal, WorkspacePreview, WorkspaceRequest, WorkspaceResourceOpen, WorkspaceTab } from './contract.ts';\nimport type { HostCallerIdentity, 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_PACK_SOURCES_SERVICE, VIEW_PACK_REVEAL_TOPIC, VIEW_PACK_REVEAL_ACK_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 PackSourceListing = { sources: readonly { sourcePath: string; revision?: string; packageId?: string; outputs: readonly { guid: string; kind: string; sourceKey?: string }[]; diagnostic?: { code: string; hint: string } }[]; hasMore: boolean };\nexport type BrokerOptions = { engine?: EngineWorkspaceRuntime; projectIntent?: () => string | undefined; engineForCaller?: (caller?: ToolCallerIdentity, targetId?: string) => EngineWorkspaceRuntime | undefined; toolApi?: ToolApi; display?: (caller?: ToolCallerIdentity) => { state?: string; occupancy?: Pick<WorkspaceTab, 'run' | 'target' | 'targetId'> | null } | undefined; accessToken?: string; authorize?: WorkspaceAuthorization; packSources?: (projectRoot: string) => Promise<PackSourceListing> };\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 'summary.get': (workspace) => workspace.summary(),\n 'pages.list': (workspace) => workspace.pages(),\n 'pack.reveal': (workspace, args, context) => workspace.revealPack({\n projectId: requireWorkspaceString(args.projectId, 'projectId'),\n sourcePath: requireWorkspaceString(args.sourcePath, 'sourcePath'),\n revision: requireWorkspaceString(args.revision, 'revision'),\n ...(args.packageId === undefined ? {} : { packageId: requireWorkspaceString(args.packageId, 'packageId') }),\n ...(args.connectionId === undefined ? {} : { connectionId: requireWorkspaceString(args.connectionId, 'connectionId') }),\n }, context.signal),\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});\nconst PAGE_OPERATIONS = new Set([\n 'tabs.get', 'tabs.select', 'target.select', 'scene.select', 'scene.pick', 'scene.clear',\n 'asset.open', 'preview.close', 'play.start', 'play.ready', 'play.stop',\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 engineForCaller: BrokerOptions['engineForCaller'];\n declare readonly projectIntent: BrokerOptions['projectIntent'];\n declare readonly caller: ToolCallerIdentity | 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 readonly packSources: BrokerOptions['packSources'];\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 declare readonly pageSessions: Map<string, { broker: ViewWorkspaceBroker; unsubscribe: () => void }>;\n declare transport?: HostTransportServer;\n declare readonly pendingReveals: Map<string, { connectionId: string; projectId: string; sourcePath: string; revision: string; settle: (value: unknown) => void }>;\n constructor({ engine, engineForCaller, projectIntent, toolApi, display = () => undefined, accessToken = randomUUID(), authorize, packSources }: BrokerOptions = {}, caller?: ToolCallerIdentity) {\n this.engine = engine;\n this.engineForCaller = engineForCaller;\n this.projectIntent = projectIntent;\n this.caller = caller;\n this.toolApi = toolApi;\n this.display = display;\n this.accessToken = accessToken;\n this.authorize = authorize;\n this.packSources = packSources;\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 this.pageSessions = new Map();\n this.pendingReveals = new Map();\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 summary(): WorkspaceSummary {\n const project = this.project;\n const previews = this.previews();\n const projectTarget = this.projectTarget && this.engine?.preview?.target.targetId === this.projectTarget.targetId\n ? this.engine.preview.target : this.projectTarget;\n const active = [\n ...(projectTarget ? [{ target: projectTarget, role: 'project' as const }] : []),\n ...(this.engine?.play ? [{ target: this.engine.play.target, role: 'play' as const }] : []),\n ];\n const targets = [...active, ...previews.slice(0, Math.max(0, 16 - active.length))\n .map(preview => ({ target: preview.target, role: 'preview' as const }))];\n return {\n revision: this.revision,\n project: project ? { id: project.id, root: project.root, name: project.name } : null,\n projectPhase: this.engine?.project?.phase ?? null,\n browserGeneration: this.engine?.project?.browserGeneration ?? null,\n targets: targets.map(({ target, role }) => ({\n targetId: target.targetId, ...(target.generation === undefined ? {} : { generation: target.generation }), role,\n })),\n hasMoreTargets: active.length + previews.length > 16,\n };\n }\n\n pages(): WorkspacePages {\n const entries = [...this.pageSessions.entries()];\n return { pages: entries.slice(0, 16).map(([connectionId, page]) => ({ connectionId, ...page.broker.summary() })),\n hasMorePages: entries.length > 16 };\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.project && this.projectIntent?.() ? { projectIntent: { root: this.projectIntent()! } } : {}),\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 = {}): Promise<unknown> {\n const request = assertWorkspaceRequest(rawRequest);\n if (request.operation === 'pages.list' || request.operation === 'pack.reveal') {\n await this.authorizeRequest(request, caller);\n return UI_OPERATIONS[request.operation](this, request.args, { signal, caller, clientId: request.clientId });\n }\n const page = caller?.connectionId && this.pageSessions.get(caller.connectionId);\n if (page) return page.broker.call(rawRequest, { signal, caller });\n await this.authorizeRequest(request, caller);\n if (PAGE_OPERATIONS.has(request.operation) && this.pageSessions.size > 0) {\n if (this.pageSessions.size !== 1) throw workspaceError('view-page-ambiguous',\n 'one View page for this page operation', 'Select the exact View page before retrying.');\n return this.pageSessions.values().next().value!.broker.call(request, { signal, caller });\n }\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 caller ??= this.caller;\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 if (this.caller && !inspector && !presentation && !operation.startsWith('run.') && input.targetId === undefined && this.projectTarget)\n input.targetId = this.projectTarget.targetId;\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 if (!this.pageSessions.has(connectionId) && ![...this.pendingReveals.values()].some(pending => pending.connectionId === connectionId)) return;\n for (const [requestId, pending] of this.pendingReveals) {\n if (pending.connectionId !== connectionId) continue;\n this.pendingReveals.delete(requestId);\n pending.settle({ ok: false, code: 'view-page-gone', requestId });\n }\n const page = this.pageSessions.get(connectionId);\n if (page) {\n this.pageSessions.delete(connectionId);\n page.unsubscribe();\n await page.broker.dispose();\n }\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 /** One accepted View frontend owns one presentation projection and event stream. */\n attachPageSession(caller: HostCallerIdentity, transport: HostTransportServer) {\n const engine = this.engineForCaller ? this.engineForCaller(caller) : this.engine;\n const projectTarget = engine?.project?.target;\n const projectCaller = projectTarget && caller.sourceId === `forgeax-workspace:${projectTarget.sessionId}:${projectTarget.targetId}`;\n if (caller.kind !== 'frontend' || (caller.sourceId !== 'view-frontend' && !projectCaller) || this.pageSessions.has(caller.connectionId)) return;\n const broker = new ViewWorkspaceBroker({\n engine, toolApi: this.toolApi, display: () => this.display(caller),\n ...(this.engineForCaller && caller.sourceId === 'view-frontend'\n ? { projectIntent: () => this.project?.root } : {}),\n accessToken: this.accessToken, authorize: this.authorize, packSources: this.packSources,\n }, caller);\n broker.snapshot();\n if (engine === this.engine) broker.assets = this.assets;\n const unsubscribe = broker.subscribe(state => transport.publish(VIEW_WORKSPACE_STATE_TOPIC, state, { connectionId: caller.connectionId }));\n this.pageSessions.set(caller.connectionId, { broker, unsubscribe });\n }\n publishPageSessions() {\n for (const { broker } of this.pageSessions.values()) {\n broker.snapshot();\n if (broker.engine === this.engine && this.assets !== null) broker.assets = this.assets;\n broker.changed();\n }\n }\n async revealPack(input: WorkspacePackReveal, signal?: AbortSignal) {\n const transport = this.transport;\n if (!transport) return { ok: false, code: 'view-page-unavailable' };\n if (signal?.aborted) return { ok: false, code: 'view-reveal-cancelled' };\n const candidates = [...this.pageSessions.keys()];\n if (!input.connectionId && candidates.length !== 1)\n return { ok: false, code: candidates.length ? 'view-page-ambiguous' : 'view-page-unavailable', candidates };\n const connectionId = input.connectionId ?? candidates[0];\n const page = this.pageSessions.get(connectionId);\n if (!page) return { ok: false, code: 'view-page-gone' };\n const project = page.broker.project;\n if (!project || project.id !== input.projectId) return { ok: false, code: 'view-project-stale' };\n if (!this.packSources) return { ok: false, code: 'view-pack-sources-unavailable' };\n const source = (await this.packSources(project.root)).sources.find(row => row.sourcePath === input.sourcePath);\n if (signal?.aborted) return { ok: false, code: 'view-reveal-cancelled' };\n if (!source || source.revision !== input.revision || (input.packageId && source.packageId !== input.packageId))\n return { ok: false, code: 'view-pack-stale' };\n const requestId = randomUUID();\n const intent = { requestId, connectionId, projectId: input.projectId,\n sourcePath: input.sourcePath, revision: input.revision,\n ...(source.packageId ? { packageId: source.packageId } : {}) };\n return new Promise<unknown>(resolve => {\n const retire = (code: string) => {\n this.pendingReveals.delete(requestId);\n transport.publish(VIEW_PACK_REVEAL_TOPIC, { ...intent, cancelled: true }, { connectionId });\n settle({ ok: false, code, requestId });\n };\n const cancel = () => {\n retire('view-reveal-cancelled');\n };\n const settle = (value: unknown) => {\n clearTimeout(timeout);\n signal?.removeEventListener('abort', cancel);\n resolve(value);\n };\n const timeout = setTimeout(() => {\n retire('view-reveal-timeout');\n }, 12000);\n timeout.unref?.();\n this.pendingReveals.set(requestId, { connectionId, projectId: input.projectId, sourcePath: input.sourcePath,\n revision: input.revision, settle });\n signal?.addEventListener('abort', cancel, { once: true });\n transport.publish(VIEW_PACK_REVEAL_TOPIC, intent, { connectionId });\n });\n }\n registerTransport(transport: HostTransportServer, { routeThroughTools = false } = {}) {\n this.transport = transport;\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 // The top-level View URL connects as view-frontend. Once a project\n // opens, its full View shell lives on the exact Engine target page.\n // That caller may connect before the project handle is published,\n // so admit it on its first workspace request as well as connect.\n this.attachPageSession(caller, transport);\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, caller }) => {\n try { return await readWorkspaceFilePreview(this.pageSessions.get(caller.connectionId)?.broker ?? 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 packSources = transport.register<{ projectId?: unknown }, unknown>(VIEW_PACK_SOURCES_SERVICE, async ({ payload, caller }) => {\n const project = (this.pageSessions.get(caller.connectionId)?.broker ?? this).project;\n if (!project || payload?.projectId !== project.id) throw workspaceError('view-project-stale', 'the currently open project', 'Refresh the workspace before listing Pack sources.');\n if (!this.packSources) throw workspaceError('view-pack-sources-unavailable', 'an installed Pack source provider', 'Update the View Host Pack.');\n return this.packSources(project.root);\n });\n const revealAck = transport.register<{ requestId?: unknown; shown?: unknown; projectId?: unknown; sourcePath?: unknown; revision?: unknown; reason?: unknown }, unknown>(VIEW_PACK_REVEAL_ACK_SERVICE, async ({ payload, caller }) => {\n const requestId = typeof payload?.requestId === 'string' ? payload.requestId : '';\n const pending = this.pendingReveals.get(requestId);\n if (!pending || pending.connectionId !== caller.connectionId) return { ok: false, code: 'view-reveal-stale' };\n if (pending.projectId !== payload.projectId || pending.sourcePath !== payload.sourcePath || pending.revision !== payload.revision)\n return { ok: false, code: 'view-reveal-identity-mismatch' };\n const page = this.pageSessions.get(caller.connectionId);\n const project = page?.broker.project;\n const source = project && this.packSources\n ? (await this.packSources(project.root)).sources.find(row => row.sourcePath === pending.sourcePath) : undefined;\n // A visible old card cannot confirm a changed source, project or retired page.\n if (this.pendingReveals.get(requestId) !== pending) return { ok: false, code: 'view-reveal-stale' };\n if (!project || project.id !== pending.projectId || source?.revision !== pending.revision) {\n this.pendingReveals.delete(requestId);\n pending.settle({ ok: false, code: 'view-reveal-stale', requestId });\n return { ok: false, code: 'view-reveal-stale' };\n }\n this.pendingReveals.delete(requestId);\n pending.settle({ ok: payload.shown === true, code: payload.shown === true ? 'shown' : 'view-reveal-not-shown',\n requestId, connectionId: caller.connectionId, projectId: payload.projectId,\n sourcePath: payload.sourcePath, revision: payload.revision,\n ...(typeof payload.reason === 'string' ? { reason: payload.reason.slice(0, 160) } : {}) });\n return { ok: true };\n });\n const subscription = this.subscribe(state => transport.publish(VIEW_WORKSPACE_STATE_TOPIC, state, {\n excludeConnectionIds: [...this.pageSessions.keys()],\n }));\n const removeConnect = transport.onClientConnect(caller => this.attachPageSession(caller, transport));\n const removeDisconnect = transport.onClientDisconnect(caller => { void this.revokeConnection(caller.connectionId); });\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 this.publishPageSessions();\n return;\n }\n this.catalogEpoch = epoch;\n for (const broker of [this, ...[...this.pageSessions.values()].map(page => page.broker)]) {\n broker.catalogEpoch = epoch;\n const project = broker.project;\n if (!project || (broker.engine?.project?.phase !== undefined && broker.engine.project.phase !== 'running')) continue;\n const lost = broker.workspaceTargetLost;\n void broker.invoke('assets.list', { projectId: project.id }).catch(() => {\n broker.workspaceTargetLost = lost;\n }).finally(() => broker.changed());\n }\n this.publishPageSessions();\n });\n return () => { if (this.transport === transport) this.transport = undefined; capabilities(); call(); fileGet(); packSources(); revealAck(); subscription(); removeConnect(); removeDisconnect(); engineSubscription(); observer.close(); };\n }\n async dispose() {\n this.selectionAbort?.abort(); this.disposing = true; this.listeners.clear();\n for (const [requestId, pending] of this.pendingReveals) {\n this.pendingReveals.delete(requestId);\n pending.settle({ ok: false, code: 'view-page-gone', requestId });\n }\n for (const [connectionId, page] of this.pageSessions) {\n this.pageSessions.delete(connectionId);\n page.unsubscribe();\n await page.broker.dispose();\n }\n }\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": ["resolve"]
7
+ }
@@ -1,13 +1,13 @@
1
1
  import {
2
2
  attachPreviewRenderResizeSync
3
- } from "./chunk-PJFFCRRD.mjs";
3
+ } from "./chunk-YDARD4EP.mjs";
4
4
  import {
5
5
  keepSurfaceInContainer,
6
6
  watchUntilReady
7
7
  } from "./chunk-QW3ZY2AD.mjs";
8
8
  import {
9
9
  logResourceOpen
10
- } from "./chunk-ZIDEETK4.mjs";
10
+ } from "./chunk-E4G4HDOC.mjs";
11
11
 
12
12
  // packages/view-workspace-core/src/preview-surface.ts
13
13
  var OWNER_PLACEMENT = "owner";
@@ -240,4 +240,4 @@ export {
240
240
  dedicatedPreviewPresentation,
241
241
  bindWorkspacePreviewSurface
242
242
  };
243
- //# sourceMappingURL=chunk-B6QUJ33G.mjs.map
243
+ //# sourceMappingURL=chunk-CXFQME65.mjs.map
@@ -1,37 +1,37 @@
1
1
  import {
2
2
  identity_exports as identity_exports9
3
- } from "./chunk-D25SR5FS.mjs";
3
+ } from "./chunk-N2SH3JGI.mjs";
4
4
  import {
5
5
  BACKEND_MODULE,
6
6
  BACKEND_PLUGIN_ID,
7
7
  identity_exports
8
- } from "./chunk-AGVLPYVE.mjs";
8
+ } from "./chunk-D2LZIQE2.mjs";
9
9
  import {
10
10
  BACKEND_MODULE as BACKEND_MODULE2,
11
11
  BACKEND_PLUGIN_ID as BACKEND_PLUGIN_ID2,
12
12
  identity_exports as identity_exports2
13
- } from "./chunk-EWSCJF77.mjs";
13
+ } from "./chunk-2CMCY54A.mjs";
14
14
  import {
15
15
  identity_exports as identity_exports7
16
- } from "./chunk-X4NNZ5X6.mjs";
16
+ } from "./chunk-C2AMOM7H.mjs";
17
17
  import {
18
18
  identity_exports as identity_exports8
19
- } from "./chunk-FMCHH5R4.mjs";
19
+ } from "./chunk-4FYKRL46.mjs";
20
20
  import {
21
21
  identity_exports as identity_exports5
22
- } from "./chunk-STQPRNEO.mjs";
22
+ } from "./chunk-MLXRIWJA.mjs";
23
23
  import {
24
24
  identity_exports as identity_exports6
25
- } from "./chunk-PZIAKZJC.mjs";
25
+ } from "./chunk-B24VYGHV.mjs";
26
26
  import {
27
27
  identity_exports as identity_exports3
28
- } from "./chunk-QUFVUMSY.mjs";
28
+ } from "./chunk-AUINYWZP.mjs";
29
29
  import {
30
30
  identity_exports as identity_exports4
31
- } from "./chunk-HRKW766Y.mjs";
31
+ } from "./chunk-6WZZ7TIC.mjs";
32
32
  import {
33
33
  identity_exports as identity_exports10
34
- } from "./chunk-H256DQT6.mjs";
34
+ } from "./chunk-TMPTVIAP.mjs";
35
35
  import {
36
36
  PRESENTATION_MODULE,
37
37
  PRESENTATION_PLUGIN_ID
@@ -41,14 +41,14 @@ import {
41
41
  FRONTEND_PLUGIN_ID,
42
42
  PAGE_TYPE,
43
43
  identity_exports as identity_exports11
44
- } from "./chunk-P5XMFZY4.mjs";
44
+ } from "./chunk-SFB5BDTB.mjs";
45
45
  import {
46
46
  SHELL_MODULE,
47
47
  SHELL_PLUGIN_ID
48
48
  } from "./chunk-QAXALJEY.mjs";
49
49
 
50
50
  // view-revision:revision
51
- var revision_default = "1803fe06a4440233ec0495ef340afc9f8b0e350ce211dd66b15412f48dfecad1";
51
+ var revision_default = "d9f8f160baa8c79a98e292a9cfeb82afd6b984ce9994c42ebf2e4e7ce2c72a91";
52
52
 
53
53
  // packages/viewer/src/catalog-shared.ts
54
54
  var VIEW_PLUGIN_VERSION = "0.2.0";
@@ -94,6 +94,7 @@ function createViewProductPlan({ backendConfig, frontendConfig, disabledPages =
94
94
  workspaceEngine: backendConfig?.workspaceEngine,
95
95
  workspaceAccessToken: backendConfig?.workspaceAccessToken,
96
96
  workspaceAuthorize: backendConfig?.workspaceAuthorize,
97
+ packSources: backendConfig?.packSources,
97
98
  capabilities: backendConfig?.capabilities
98
99
  };
99
100
  const backend = [
@@ -125,4 +126,4 @@ export {
125
126
  VIEW_PRODUCT_PLUGINS,
126
127
  createViewProductPlan
127
128
  };
128
- //# sourceMappingURL=chunk-IJPWKKIU.mjs.map
129
+ //# sourceMappingURL=chunk-CYOLEAAY.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["view-revision:revision", "../../../packages/viewer/src/catalog-shared.ts"],
4
+ "sourcesContent": ["export default \"d9f8f160baa8c79a98e292a9cfeb82afd6b984ce9994c42ebf2e4e7ce2c72a91\"", "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 packSources?: NonNullable<ConstructorParameters<typeof ViewWorkspaceBroker>[0]>['packSources'];\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 packSources: backendConfig?.packSources,\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
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,IAAO,mBAAQ;;;ACyBR,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,aAAa,eAAe;AAAA,IAC5B,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
+ "names": ["identity_exports", "BACKEND_PLUGIN_ID", "BACKEND_MODULE"]
7
+ }
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  FRONTEND_PLUGIN_ID,
3
3
  identity_exports
4
- } from "./chunk-FMCHH5R4.mjs";
4
+ } from "./chunk-4FYKRL46.mjs";
5
5
  import {
6
6
  applyResourcePagePlugin
7
- } from "./chunk-KX2WU5Z6.mjs";
7
+ } from "./chunk-KPLESRQY.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-U6UMATPV.mjs.map
25
+ //# sourceMappingURL=chunk-CYU3WWN6.mjs.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  VIEW_PAGE_TYPES
3
- } from "./chunk-E3Z7GLFU.mjs";
3
+ } from "./chunk-QJHQN6OD.mjs";
4
4
  import {
5
5
  __export
6
6
  } from "./chunk-FLGC65SR.mjs";
@@ -46,4 +46,4 @@ export {
46
46
  VIEW_STATUS_SERVICE,
47
47
  identity_exports
48
48
  };
49
- //# sourceMappingURL=chunk-AGVLPYVE.mjs.map
49
+ //# sourceMappingURL=chunk-D2LZIQE2.mjs.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  VIEW_WORKSPACE_TAB_ID
3
- } from "./chunk-E3Z7GLFU.mjs";
3
+ } from "./chunk-QJHQN6OD.mjs";
4
4
 
5
5
  // packages/view-workspace-core/src/project-session.ts
6
6
  var KEY = "forgeax.view.project-session/1";
@@ -94,6 +94,7 @@ function createProjectSession(client, { window = globalThis } = {}) {
94
94
  restoring: Boolean(pageTarget ? navigation?.type === "reload" : explicitRoot || record?.root && record?.targetId)
95
95
  };
96
96
  let initializing = true;
97
+ let openedIntent = Boolean(pageTarget || explicitRoot || record?.targetId);
97
98
  let retryTimer;
98
99
  let cancelDelay;
99
100
  let reconnecting;
@@ -145,6 +146,10 @@ function createProjectSession(client, { window = globalThis } = {}) {
145
146
  if (disposed || (snapshot.revision ?? 0) < (state.snapshot.revision ?? -1)) return;
146
147
  changed({ snapshot });
147
148
  releaseReload(snapshot);
149
+ if (!pageTarget && !explicitRoot && !record?.targetId && !initializing && !state.busy && !openedIntent && snapshot.projectIntent?.root) {
150
+ void open(snapshot.projectIntent.root);
151
+ return;
152
+ }
148
153
  const remoteTargetUrl = snapshot?.projectTarget?.url;
149
154
  if (!pageTarget && !explicitRoot && !record?.targetId && !initializing && !state.busy && snapshot?.workspaceTargetLost !== true && snapshot?.projectPhase !== "failed" && typeof snapshot?.project?.root === "string" && snapshot.project.root.trim() !== "" && typeof remoteTargetUrl === "string" && remoteTargetUrl.trim() !== "") {
150
155
  void Promise.resolve(navigate(snapshot)).catch(fail);
@@ -159,7 +164,10 @@ function createProjectSession(client, { window = globalThis } = {}) {
159
164
  };
160
165
  save(window, record);
161
166
  };
162
- const fail = (error) => changed({ busy: false, error: error instanceof Error ? error.message : String(error) });
167
+ const fail = (error) => {
168
+ reloadWatch = false;
169
+ changed({ busy: false, restoring: false, error: error instanceof Error ? error.message : String(error) });
170
+ };
163
171
  const run = async (action) => {
164
172
  if (disposed || state.busy) return;
165
173
  changed({ busy: true, error: null, restoring: true });
@@ -205,6 +213,7 @@ function createProjectSession(client, { window = globalThis } = {}) {
205
213
  return navigate(await client.reopenProject({ ...options, expectedTargetId, expectedTargetState: "lost" }));
206
214
  };
207
215
  const open = (root) => run(async () => {
216
+ openedIntent = true;
208
217
  const snapshot = await client.getState({ signal: controller.signal });
209
218
  accept(snapshot);
210
219
  if (snapshot.project) {
@@ -285,6 +294,7 @@ function createProjectSession(client, { window = globalThis } = {}) {
285
294
  if (!pageTarget) {
286
295
  if (explicitRoot) await open(explicitRoot);
287
296
  else if (record?.root && record?.targetId) await reconnect();
297
+ else if (snapshot.projectIntent?.root) await open(snapshot.projectIntent.root);
288
298
  return;
289
299
  }
290
300
  })().catch(fail).finally(() => {
@@ -322,4 +332,4 @@ export {
322
332
  navigateProjectSession,
323
333
  createProjectSession
324
334
  };
325
- //# sourceMappingURL=chunk-5YTMN435.mjs.map
335
+ //# sourceMappingURL=chunk-DC5JP46Y.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../packages/view-workspace-core/src/project-session.ts"],
4
+ "sourcesContent": ["import type { WorkspaceState } from './contract.ts';\nimport type { ViewWorkspaceClient } from './client.ts';\nexport type ProjectSessionWindow = Pick<Window, 'location' | 'localStorage' | 'sessionStorage' | 'performance' | 'history' | 'addEventListener' | 'removeEventListener'> & { fetch: typeof fetch };\ntype ProjectSessionRecord = { version: number; root?: string; entry?: string; targetId?: string; preferences?: Record<string, string> };\nexport type ProjectSessionState = { snapshot: WorkspaceState; busy: boolean; error: string | null; restoring: boolean };\nexport type ProjectSession = ReturnType<typeof createProjectSession>;\n\nimport { VIEW_WORKSPACE_TAB_ID } from './contract.ts';\n\nconst KEY = 'forgeax.view.project-session/1';\nconst HASH = 'forgeaxViewRestore';\nconst PREFERENCES = ['forgeax-view-theme', 'forgeax.view.locale'];\nconst isLoopback = (hostname: string) => ['localhost', '127.0.0.1', '[::1]'].includes(hostname);\n\nexport function restoreProjectPreferences(window: ProjectSessionWindow = globalThis) {\n const record = readProjectSession(window);\n for (const key of PREFERENCES) {\n const value = record?.preferences?.[key];\n if (typeof value === 'string') {\n try { window.localStorage?.setItem(key, value); } catch { /* Optional preference. */ }\n }\n }\n}\n\nexport function readProjectSession(window: ProjectSessionWindow = globalThis): ProjectSessionRecord | null {\n try {\n const hash = new URLSearchParams(new URL(window.location.href).hash.slice(1));\n const raw = hash.get(HASH) ?? window.sessionStorage?.getItem(KEY) ?? 'null';\n if (raw.length > 64000) return null;\n const value = JSON.parse(raw);\n if (value?.version !== 1 || typeof value.root !== 'string' || !value.root.trim()) return null;\n if (value.targetId !== undefined && typeof value.targetId !== 'string') return null;\n if (value.resources !== undefined && (!Array.isArray(value.resources) ||\n value.resources.length > 32 || !value.resources.every((guid: unknown) => typeof guid === 'string'))) return null;\n const presentation = value.presentation;\n if (presentation !== undefined && (!presentation || typeof presentation !== 'object' || Array.isArray(presentation) ||\n (presentation.pageOrder !== undefined && (!Array.isArray(presentation.pageOrder) ||\n !presentation.pageOrder.every((type: unknown) => typeof type === 'string'))) ||\n (presentation.activeType !== undefined && typeof presentation.activeType !== 'string') ||\n (presentation.layouts !== undefined && (!presentation.layouts || typeof presentation.layouts !== 'object' ||\n Array.isArray(presentation.layouts))))) return null;\n if (value.entry) {\n const entry = new URL(value.entry);\n const current = new URL(window.location.href);\n const sameHost = entry.hostname === current.hostname || (isLoopback(entry.hostname) && isLoopback(current.hostname));\n if (!sameHost || entry.protocol !== current.protocol ||\n !['http:', 'https:'].includes(entry.protocol) || entry.username || entry.password) return null;\n }\n // Read old records without reviving their resource, camera or layout history.\n return { version: 1, root: value.root, entry: value.entry, targetId: value.targetId, preferences: value.preferences };\n } catch { return null; }\n}\n\nfunction save(window: ProjectSessionWindow, value: ProjectSessionRecord | null) {\n if (!value) return;\n value.preferences = {};\n for (const key of PREFERENCES) {\n try {\n const preference = window.localStorage?.getItem(key);\n if (preference) value.preferences[key] = preference;\n } catch { /* Storage is optional. */ }\n }\n try { window.sessionStorage?.setItem(KEY, JSON.stringify(value)); } catch { /* Storage is optional. */ }\n}\n\nexport function projectSessionUrl(url: string, record: ProjectSessionRecord | null) {\n const next = new URL(url);\n next.hash = new URLSearchParams({ [HASH]: JSON.stringify(record) }).toString();\n return next.href;\n}\n\n/** Transfer the confirmed project identity across origins, never runtime history. */\nexport function navigateProjectSession(snapshot: WorkspaceState, window: ProjectSessionWindow = globalThis, record: ProjectSessionRecord | null = readProjectSession(window)) {\n const url = snapshot?.projectTarget?.url;\n if (!url || !window.location?.assign) return;\n if (!snapshot.project?.root) { window.location.assign(url); return; }\n const current = new URL(window.location.href);\n const next = {\n ...record, version: 1, root: snapshot.project.root,\n targetId: snapshot.projectTarget?.targetId,\n entry: record?.entry ?? current.origin + current.pathname,\n };\n save(window, next);\n window.location.assign(projectSessionUrl(url, next));\n}\n\n/** One Cordis-owned project intent/recovery projection shared by all React consumers. */\nexport function createProjectSession(client: ViewWorkspaceClient, { window = globalThis }: { window?: ProjectSessionWindow } = {}) {\n let disposed = false;\n let record = readProjectSession(window);\n const location = window.location;\n const url = location?.href ? new URL(location.href) : null;\n const explicitRoot = url?.searchParams.get('project')?.trim();\n const pageTarget = url?.searchParams.get('forgeaxWorkspaceTarget');\n const navigation = window.performance?.getEntriesByType?.('navigation')?.[0] as PerformanceNavigationTiming | undefined;\n let state: ProjectSessionState = {\n snapshot: {}, busy: false, error: null,\n restoring: Boolean(pageTarget ? navigation?.type === 'reload' : explicitRoot || (record?.root && record?.targetId)),\n };\n let initializing = true;\n let openedIntent = Boolean(pageTarget || explicitRoot || record?.targetId);\n let retryTimer: ReturnType<typeof setTimeout> | undefined;\n let cancelDelay: (() => void) | undefined;\n let reconnecting: Promise<void> | undefined;\n let cancelNavigation: (() => void) | undefined;\n const listeners = new Set<(state: ProjectSessionState) => void>();\n const controller = new AbortController();\n const options = { tabId: VIEW_WORKSPACE_TAB_ID, signal: controller.signal };\n const changed = (patch: Partial<ProjectSessionState>) => {\n if (disposed) return;\n state = { ...state, ...patch };\n for (const listener of listeners) listener(state);\n };\n let reloadWatch = Boolean(pageTarget && navigation?.type === 'reload');\n let reloadSawStarting = false;\n let reloadFloor = -1;\n const releaseReload = (snapshot: WorkspaceState) => {\n if (!reloadWatch) return;\n if (snapshot?.workspaceTargetLost === true) {\n reloadWatch = false;\n changed({ restoring: false, busy: false });\n return;\n }\n if (snapshot?.projectTarget?.targetId !== pageTarget) return;\n const phase = snapshot.projectPhase;\n const generation = typeof snapshot.browserGeneration === 'number' ? snapshot.browserGeneration : undefined;\n if (phase === 'starting') {\n reloadSawStarting = true;\n reloadFloor = generation ?? reloadFloor;\n changed({ restoring: true });\n return;\n }\n if (phase === 'failed') {\n reloadWatch = false;\n changed({ restoring: false, busy: false });\n return;\n }\n if (phase === 'running') {\n if (reloadSawStarting && (generation ?? 0) <= reloadFloor) return;\n // The detach may not have been observed yet. Leave the watch open so a\n // later `starting` hides the shell again until the replacement generation.\n if (reloadSawStarting) reloadWatch = false;\n changed({ restoring: false, busy: false });\n return;\n }\n // An engine that does not report browser phase must not trap the shell on refresh.\n if (phase === undefined) {\n reloadWatch = false;\n changed({ restoring: false, busy: false });\n }\n };\n const accept = (snapshot: WorkspaceState) => {\n if (disposed || (snapshot.revision ?? 0) < (state.snapshot.revision ?? -1)) return;\n changed({ snapshot });\n releaseReload(snapshot);\n // A project opened outside this page (for example `view project open`)\n // is adopted by an empty shell that holds no earlier target identity.\n // Headed documents carry pageTarget and never adopt; a page remembering\n // another target keeps its explicit conflict instead of chasing someone\n // else's session.\n if (!pageTarget && !explicitRoot && !record?.targetId && !initializing && !state.busy && !openedIntent\n && snapshot.projectIntent?.root) {\n void open(snapshot.projectIntent.root);\n return;\n }\n const remoteTargetUrl = snapshot?.projectTarget?.url;\n if (!pageTarget && !explicitRoot && !record?.targetId && !initializing && !state.busy\n && snapshot?.workspaceTargetLost !== true && snapshot?.projectPhase !== 'failed'\n && typeof snapshot?.project?.root === 'string' && snapshot.project.root.trim() !== ''\n && typeof remoteTargetUrl === 'string' && remoteTargetUrl.trim() !== '') {\n void Promise.resolve(navigate(snapshot)).catch(fail);\n return;\n }\n if (initializing || !pageTarget || snapshot.projectTarget?.targetId !== pageTarget || !snapshot.project?.root) return;\n record = {\n ...record, version: 1, root: snapshot.project.root, targetId: pageTarget,\n };\n save(window, record);\n };\n const fail = (error: unknown) => {\n // A terminal failure ends restoration. Keep the error visible and allow an\n // explicit retry instead of leaving project pages behind a loading screen.\n reloadWatch = false;\n changed({ busy: false, restoring: false, error: error instanceof Error ? error.message : String(error) });\n };\n const run = async (action: () => Promise<unknown>) => {\n if (disposed || state.busy) return;\n changed({ busy: true, error: null, restoring: true });\n try { await action(); }\n catch (error) { if (!controller.signal.aborted) fail(error); }\n finally { changed({ busy: false }); }\n };\n const navigate = (snapshot: WorkspaceState) => {\n if (disposed) return;\n record = { ...record, version: 1, root: snapshot?.project?.root,\n targetId: snapshot?.projectTarget?.targetId };\n if (!snapshot?.projectTarget?.url || !window.addEventListener) return navigateProjectSession(snapshot, window, record);\n // Keep this document's activation pending until the browser leaves. Starting\n // another App here races the old project server's guarded replacement.\n return new Promise<void>(resolve => {\n const leave = () => {\n window.removeEventListener('pagehide', leave);\n cancelNavigation = undefined;\n resolve();\n };\n cancelNavigation = leave;\n window.addEventListener('pagehide', leave, { once: true });\n try { navigateProjectSession(snapshot, window, record); }\n catch (error) { leave(); throw error; }\n });\n };\n const recover = async () => {\n const snapshot = await client.getState({ signal: controller.signal });\n accept(snapshot);\n const expectedTargetId = pageTarget ?? record?.targetId;\n if (!expectedTargetId || snapshot.projectTarget?.targetId !== expectedTargetId)\n throw new Error('The project changed in another page. Open the current View entry and choose a project explicitly.');\n return navigate(await client.reopenProject({ ...options, expectedTargetId, expectedTargetState: 'lost' }));\n };\n const open = (root: string) => run(async () => {\n openedIntent = true;\n const snapshot = await client.getState({ signal: controller.signal });\n accept(snapshot);\n if (snapshot.project) {\n if (snapshot.project.root !== root) throw new Error('Another project is already open. Close it explicitly before opening a different project.');\n record = { ...record, version: 1, root, targetId: snapshot.projectTarget?.targetId };\n await recover();\n return;\n }\n record = { version: 1, root, entry: url ? url.origin + url.pathname : undefined };\n return navigate(await client.openProject(root, { ...options, expectedTargetId: null }));\n });\n const reconnect = () => run(recover);\n const stop = client.subscribe(accept);\n const probeEntry = async () => {\n if (!record?.entry || disposed) return;\n changed({ busy: true, error: null, restoring: true });\n for (const delay of [0, 250, 500, 1000, 2000, 4000]) {\n await new Promise<void>(resolve => {\n cancelDelay = resolve;\n retryTimer = setTimeout(resolve, delay);\n });\n cancelDelay = undefined;\n if (disposed) return;\n try {\n const response = await window.fetch(new URL('/__forgeax/view/health', record.entry), {\n cache: 'no-store', signal: AbortSignal.any([controller.signal, AbortSignal.timeout(2000)]),\n });\n if (!response.ok) throw new Error('View entry is unavailable');\n if (!disposed) {\n const destination = projectSessionUrl(record.entry, record);\n if (!window.addEventListener) location.replace(destination);\n else await new Promise<void>(resolve => {\n const leave = () => {\n window.removeEventListener('pagehide', leave);\n cancelNavigation = undefined;\n resolve();\n };\n cancelNavigation = leave;\n window.addEventListener('pagehide', leave, { once: true });\n try { location.replace(destination); }\n catch (error) { leave(); throw error; }\n });\n }\n return;\n } catch (error) { if (disposed) return; }\n }\n fail(new Error('View is unavailable. Start or reconnect the backend and View, then retry.'));\n };\n const returnToEntry = () => reconnecting ??= probeEntry().finally(() => { reconnecting = undefined; });\n const disconnect = pageTarget ? client.onDisconnect?.(error => {\n if (/stopped|stopping|unauthorized|forbidden|incompatible/i.test(error?.message ?? '')) {\n fail(error);\n } else void returnToEntry();\n }) : undefined;\n const ready = (async () => {\n if (!url) return;\n if (url.hash.includes(HASH)) {\n save(window, record);\n url.hash = '';\n window.history?.replaceState(null, '', url.href);\n }\n // Refresh keeps this document. The project server and its catalog stay up;\n // the replacement browser reports ready and the shell leaves `restoring`.\n // Do not reopen the project or replay the previous page's resource history.\n if (pageTarget && navigation?.type === 'reload') {\n const snapshot = await client.getState({ signal: controller.signal });\n accept(snapshot);\n return;\n }\n const snapshot = await client.getState({ signal: controller.signal });\n accept(snapshot);\n if (!pageTarget) {\n if (explicitRoot) await open(explicitRoot);\n else if (record?.root && record?.targetId) await reconnect();\n else if (snapshot.projectIntent?.root) await open(snapshot.projectIntent.root);\n // A project remote-opened before this page loaded leaves no explicit\n // intent and no remembered target here; the post-initialization accept\n // below adopts its headed document.\n return;\n }\n })().catch(fail).finally(() => { initializing = false; accept(state.snapshot); });\n return {\n ready, open, reconnect,\n reconnectHost: returnToEntry,\n getSnapshot: () => state,\n subscribe(listener: (state: ProjectSessionState) => void) { listeners.add(listener); listener(state); return () => listeners.delete(listener); },\n dispose() {\n disposed = true;\n controller.abort();\n clearTimeout(retryTimer);\n cancelDelay?.();\n cancelNavigation?.();\n disconnect?.();\n stop();\n listeners.clear();\n },\n };\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["snapshot"]
7
+ }
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  FRONTEND_PLUGIN_ID,
3
3
  identity_exports
4
- } from "./chunk-D25SR5FS.mjs";
4
+ } from "./chunk-N2SH3JGI.mjs";
5
5
  import {
6
6
  applyResourcePagePlugin
7
- } from "./chunk-KX2WU5Z6.mjs";
7
+ } from "./chunk-KPLESRQY.mjs";
8
8
 
9
9
  // packages/view-plugin-asset/src/frontend.ts
10
10
  var VIEW_ASSET_FRONTEND_PLUGIN_ID = FRONTEND_PLUGIN_ID;
@@ -22,4 +22,4 @@ export {
22
22
  viewAssetFrontendPlugin,
23
23
  frontend_default
24
24
  };
25
- //# sourceMappingURL=chunk-YNHEYXDG.mjs.map
25
+ //# sourceMappingURL=chunk-DOU4MNMQ.mjs.map
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  traceView
3
- } from "./chunk-KAGFU64Y.mjs";
3
+ } from "./chunk-QW2VT3XB.mjs";
4
4
  import {
5
5
  createWorkspaceStateReader
6
- } from "./chunk-TXLD7JI5.mjs";
6
+ } from "./chunk-WJNASQF2.mjs";
7
7
 
8
8
  // packages/view-workspace-core/src/resource-open.ts
9
9
  var LOG_PREFIX = "[forgeax.view.resource-open]";
@@ -162,4 +162,4 @@ export {
162
162
  selectWorkspaceResourcePreview,
163
163
  observeWorkspaceOpenRequests
164
164
  };
165
- //# sourceMappingURL=chunk-ZIDEETK4.mjs.map
165
+ //# sourceMappingURL=chunk-E4G4HDOC.mjs.map
@@ -2,10 +2,10 @@ import {
2
2
  FRONTEND_MODULE,
3
3
  FRONTEND_PLUGIN_ID,
4
4
  identity_exports
5
- } from "./chunk-PZIAKZJC.mjs";
5
+ } from "./chunk-B24VYGHV.mjs";
6
6
  import {
7
7
  applyResourcePagePlugin
8
- } from "./chunk-KX2WU5Z6.mjs";
8
+ } from "./chunk-KPLESRQY.mjs";
9
9
 
10
10
  // packages/view-plugin-material/src/frontend.ts
11
11
  var VIEW_MATERIAL_FRONTEND_PLUGIN_ID = FRONTEND_PLUGIN_ID;
@@ -29,4 +29,4 @@ export {
29
29
  viewMaterialFrontendPlugin,
30
30
  frontend_default
31
31
  };
32
- //# sourceMappingURL=chunk-ZHO2G4JR.mjs.map
32
+ //# sourceMappingURL=chunk-EZAJ66NW.mjs.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  viewPlayPresentationPlugin
3
- } from "./chunk-357UOBAS.mjs";
3
+ } from "./chunk-XUNDH3E7.mjs";
4
4
  import {
5
5
  PRESENTATION_PLUGIN_ID
6
6
  } from "./chunk-J5B4LX5H.mjs";
@@ -14,4 +14,4 @@ var presentation_default = {
14
14
  export {
15
15
  presentation_default
16
16
  };
17
- //# sourceMappingURL=chunk-APD2EWSZ.mjs.map
17
+ //# sourceMappingURL=chunk-FIWL6TQS.mjs.map
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  createViewWorkspaceClient
3
- } from "./chunk-FNRGLCZW.mjs";
3
+ } from "./chunk-PCQNUFDL.mjs";
4
4
  import {
5
5
  requireWorkspaceString,
6
6
  workspaceError
7
- } from "./chunk-E3Z7GLFU.mjs";
7
+ } from "./chunk-QJHQN6OD.mjs";
8
8
 
9
9
  // packages/view-workspace-core/src/resident.ts
10
10
  import { createReadStream, existsSync, statSync } from "node:fs";
@@ -295,4 +295,4 @@ export {
295
295
  startViewHostServer,
296
296
  connectViewWorkspace
297
297
  };
298
- //# sourceMappingURL=chunk-U5J7OTEB.mjs.map
298
+ //# sourceMappingURL=chunk-FSSARTVM.mjs.map
@@ -29,10 +29,10 @@ import {
29
29
  import {
30
30
  createWorkspaceObservation,
31
31
  createWorkspaceStateReader
32
- } from "./chunk-TXLD7JI5.mjs";
32
+ } from "./chunk-WJNASQF2.mjs";
33
33
  import {
34
34
  jsonUnchanged
35
- } from "./chunk-E3Z7GLFU.mjs";
35
+ } from "./chunk-QJHQN6OD.mjs";
36
36
 
37
37
  // packages/view-plugin-inspector/src/ui/mount.tsx
38
38
  import { createRoot } from "react-dom/client";
@@ -431,4 +431,4 @@ async function mountInspectorPanel(props) {
431
431
  export {
432
432
  mountInspectorPanel
433
433
  };
434
- //# sourceMappingURL=chunk-47RJSHLM.mjs.map
434
+ //# sourceMappingURL=chunk-FXXPWAXM.mjs.map
@@ -1,22 +1,22 @@
1
1
  import {
2
2
  createViewFrontendRoot
3
- } from "./chunk-XMP4THLF.mjs";
3
+ } from "./chunk-66LM6NO6.mjs";
4
4
  import {
5
5
  createViewPageHost,
6
6
  createViewPageTypeRegistry
7
- } from "./chunk-PVP5YBNR.mjs";
7
+ } from "./chunk-WFM434WJ.mjs";
8
8
  import {
9
9
  createViewSlotRegistry
10
10
  } from "./chunk-GQOXQ4AV.mjs";
11
11
  import {
12
12
  VIEW_FRONTEND_ROOT_PROGRAM
13
- } from "./chunk-IJPWKKIU.mjs";
13
+ } from "./chunk-CYOLEAAY.mjs";
14
14
  import {
15
15
  workspaceBrowserEndpoint
16
- } from "./chunk-FNRGLCZW.mjs";
16
+ } from "./chunk-PCQNUFDL.mjs";
17
17
  import {
18
18
  requireWorkspaceString
19
- } from "./chunk-E3Z7GLFU.mjs";
19
+ } from "./chunk-QJHQN6OD.mjs";
20
20
 
21
21
  // packages/viewer/src/host/frontend.ts
22
22
  import { createFrontendHost } from "@forgeax/engine/host/frontend";
@@ -135,4 +135,4 @@ export {
135
135
  mountViewWorkspace,
136
136
  mountViewViewer
137
137
  };
138
- //# sourceMappingURL=chunk-D2RCKG7Q.mjs.map
138
+ //# sourceMappingURL=chunk-G2QCXN56.mjs.map