@forgeax/view 0.5.0-dev.13601.16969c83ee09 → 0.5.0-dev.13619.c20ebf66cef4

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 (279) hide show
  1. package/README.md +50 -6
  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-B6QUJ33G.mjs → chunk-25PFC2DY.mjs} +3 -3
  6. package/dist/modules/chunks/{chunk-6KM24NH6.mjs → chunk-3Y5WN22T.mjs} +3 -3
  7. package/dist/modules/chunks/chunk-3Y5WN22T.mjs.map +7 -0
  8. package/dist/modules/chunks/{chunk-D2RCKG7Q.mjs → chunk-43L37UYV.mjs} +6 -6
  9. package/dist/modules/chunks/{chunk-FNRGLCZW.mjs → chunk-4RTL3LS3.mjs} +36 -10
  10. package/dist/modules/chunks/chunk-4RTL3LS3.mjs.map +7 -0
  11. package/dist/modules/chunks/{chunk-WVU3CQ62.mjs → chunk-4ZI5DFBR.mjs} +3 -3
  12. package/dist/modules/chunks/{chunk-47RJSHLM.mjs → chunk-5HJ336VM.mjs} +3 -3
  13. package/dist/modules/chunks/{chunk-PVP5YBNR.mjs → chunk-5N5FDO5Y.mjs} +2 -2
  14. package/dist/modules/chunks/{chunk-APD2EWSZ.mjs → chunk-5PZL6W3F.mjs} +2 -2
  15. package/dist/modules/chunks/{chunk-LZ57Y73Z.mjs → chunk-5SHQXSSM.mjs} +9 -7
  16. package/dist/modules/chunks/chunk-5SHQXSSM.mjs.map +7 -0
  17. package/dist/modules/chunks/{chunk-KI4WGTWL.mjs → chunk-5WVRCLHN.mjs} +2 -2
  18. package/dist/modules/chunks/{chunk-YNHEYXDG.mjs → chunk-7MQIGD6Q.mjs} +3 -3
  19. package/dist/modules/chunks/{chunk-F5RLQAPN.mjs → chunk-7YWMB7HV.mjs} +3 -3
  20. package/dist/modules/chunks/{chunk-FICPCJKR.mjs → chunk-A22PJUZM.mjs} +3 -3
  21. package/dist/modules/chunks/{chunk-P5XMFZY4.mjs → chunk-A7HXBQUG.mjs} +2 -2
  22. package/dist/modules/chunks/{chunk-TTRUYO7Q.mjs → chunk-AOD6XLJC.mjs} +3 -3
  23. package/dist/modules/chunks/{chunk-TTRUYO7Q.mjs.map → chunk-AOD6XLJC.mjs.map} +2 -2
  24. package/dist/modules/chunks/{chunk-HRKW766Y.mjs → chunk-AZHCKPUL.mjs} +2 -2
  25. package/dist/modules/chunks/chunk-BJTFQQQR.mjs +13 -0
  26. package/dist/modules/chunks/chunk-BJTFQQQR.mjs.map +7 -0
  27. package/dist/modules/chunks/{chunk-6I7RY73G.mjs → chunk-CEB76QBE.mjs} +4 -4
  28. package/dist/modules/chunks/{chunk-VKNIYV2W.mjs → chunk-CRPXFJ6K.mjs} +202 -35
  29. package/dist/modules/chunks/chunk-CRPXFJ6K.mjs.map +7 -0
  30. package/dist/modules/chunks/{chunk-U64FRQKP.mjs → chunk-CVIF6DYH.mjs} +3 -3
  31. package/dist/modules/chunks/{chunk-DWT3TA6M.mjs → chunk-CYQ7BITZ.mjs} +9 -8
  32. package/dist/modules/chunks/chunk-CYQ7BITZ.mjs.map +7 -0
  33. package/dist/modules/chunks/{chunk-OQXDADAS.mjs → chunk-D3GX7HWI.mjs} +6 -6
  34. package/dist/modules/chunks/chunk-D3GX7HWI.mjs.map +7 -0
  35. package/dist/modules/chunks/{chunk-XQYF2P6M.mjs → chunk-D3ISMGT6.mjs} +7 -7
  36. package/dist/modules/chunks/{chunk-OKQ5RBKO.mjs → chunk-DC3PU6SO.mjs} +2 -2
  37. package/dist/modules/chunks/{chunk-4T3D67CS.mjs → chunk-DJKXBCZH.mjs} +7 -7
  38. package/dist/modules/chunks/{chunk-E3PJGTLI.mjs → chunk-DX4M6LZH.mjs} +5 -5
  39. package/dist/modules/chunks/{chunk-IZAHIOFU.mjs → chunk-EOW4JGVV.mjs} +6 -6
  40. package/dist/modules/chunks/{chunk-U5R6MVM4.mjs → chunk-EQRDY5CQ.mjs} +2 -2
  41. package/dist/modules/chunks/{chunk-7IGFAI5H.mjs → chunk-EW7VMNZA.mjs} +5 -5
  42. package/dist/modules/chunks/{chunk-FMCHH5R4.mjs → chunk-FSSKCXPL.mjs} +3 -3
  43. package/dist/modules/chunks/{chunk-357UOBAS.mjs → chunk-FSYQ3LBQ.mjs} +2 -2
  44. package/dist/modules/chunks/{chunk-D25SR5FS.mjs → chunk-FVSDKOXR.mjs} +3 -3
  45. package/dist/modules/chunks/{chunk-XMP4THLF.mjs → chunk-J7QRK3FU.mjs} +4 -4
  46. package/dist/modules/chunks/{chunk-D57DDEV2.mjs → chunk-JE4N575J.mjs} +5 -5
  47. package/dist/modules/chunks/{chunk-ZIDEETK4.mjs → chunk-JKDBKS7P.mjs} +3 -3
  48. package/dist/modules/chunks/{chunk-U5J7OTEB.mjs → chunk-K4C5WOTT.mjs} +3 -3
  49. package/dist/modules/chunks/{chunk-QUFVUMSY.mjs → chunk-KOBAWLZL.mjs} +2 -2
  50. package/dist/modules/chunks/{chunk-CX5WREJC.mjs → chunk-KY2AWNDR.mjs} +2 -2
  51. package/dist/modules/chunks/{chunk-RJVOH7G2.mjs → chunk-L24HPIQP.mjs} +27 -27
  52. package/dist/modules/chunks/{chunk-27XASYEH.mjs → chunk-LCVL3V5U.mjs} +17 -11
  53. package/dist/modules/chunks/chunk-LCVL3V5U.mjs.map +7 -0
  54. package/dist/modules/chunks/{chunk-PJFFCRRD.mjs → chunk-LOVO3P2Q.mjs} +2 -2
  55. package/dist/modules/chunks/{chunk-X4NNZ5X6.mjs → chunk-M66NDY35.mjs} +3 -3
  56. package/dist/modules/chunks/{chunk-EZSGDSCC.mjs → chunk-M7XSCLYV.mjs} +18 -4
  57. package/dist/modules/chunks/chunk-M7XSCLYV.mjs.map +7 -0
  58. package/dist/modules/chunks/{chunk-YLCJNKIW.mjs → chunk-MFEFV3YF.mjs} +70 -30
  59. package/dist/modules/chunks/chunk-MFEFV3YF.mjs.map +7 -0
  60. package/dist/modules/chunks/{chunk-55F55BQY.mjs → chunk-MUBV2LNK.mjs} +3 -3
  61. package/dist/modules/chunks/{chunk-M6S5YA6X.mjs → chunk-NHNPQ3ZS.mjs} +3 -3
  62. package/dist/modules/chunks/{chunk-STQPRNEO.mjs → chunk-NSPN5OQ5.mjs} +2 -2
  63. package/dist/modules/chunks/{chunk-XE6ITXHT.mjs → chunk-NZ4N7AVG.mjs} +2 -2
  64. package/dist/modules/chunks/{chunk-KAGFU64Y.mjs → chunk-OGFZB75B.mjs} +2 -2
  65. package/dist/modules/chunks/{chunk-EWSCJF77.mjs → chunk-OS7BK3FO.mjs} +2 -2
  66. package/dist/modules/chunks/{chunk-HWZCLROY.mjs → chunk-P27F2TZN.mjs} +248 -42
  67. package/dist/modules/chunks/chunk-P27F2TZN.mjs.map +7 -0
  68. package/dist/modules/chunks/{chunk-5W7SC5D4.mjs → chunk-P2Y73QJJ.mjs} +11 -1
  69. package/dist/modules/chunks/{chunk-5W7SC5D4.mjs.map → chunk-P2Y73QJJ.mjs.map} +2 -2
  70. package/dist/modules/chunks/{chunk-U6UMATPV.mjs → chunk-P3ZW2T37.mjs} +3 -3
  71. package/dist/modules/chunks/{chunk-INTTYJVW.mjs → chunk-PHCUCHVL.mjs} +2 -2
  72. package/dist/modules/chunks/{chunk-JK7K7RG3.mjs → chunk-QNJL265P.mjs} +4 -4
  73. package/dist/modules/chunks/{chunk-ZGOGO7SS.mjs → chunk-QNSUBUZF.mjs} +1 -1
  74. package/dist/modules/chunks/{chunk-5YTMN435.mjs → chunk-QNUBIFAY.mjs} +13 -3
  75. package/dist/modules/chunks/chunk-QNUBIFAY.mjs.map +7 -0
  76. package/dist/modules/chunks/{chunk-TXLD7JI5.mjs → chunk-QQP7ZGQD.mjs} +2 -2
  77. package/dist/modules/chunks/{chunk-E3Z7GLFU.mjs → chunk-QYJZ3SOV.mjs} +12 -1
  78. package/dist/modules/chunks/chunk-QYJZ3SOV.mjs.map +7 -0
  79. package/dist/modules/chunks/{chunk-PZIAKZJC.mjs → chunk-R6MT6F3T.mjs} +3 -3
  80. package/dist/modules/chunks/{chunk-P4UPH74B.mjs → chunk-RGM4S2BE.mjs} +3 -3
  81. package/dist/modules/chunks/{chunk-AGVLPYVE.mjs → chunk-SKZC6VTV.mjs} +2 -2
  82. package/dist/modules/chunks/{chunk-4D3Q7K44.mjs → chunk-SSVRSFTX.mjs} +2 -2
  83. package/dist/modules/chunks/{chunk-2Z5KEV6L.mjs → chunk-TFBSEYKW.mjs} +3 -3
  84. package/dist/modules/chunks/{chunk-K2QZRFLE.mjs → chunk-TPLT4PBX.mjs} +4 -4
  85. package/dist/modules/chunks/{chunk-5PHAXNFO.mjs → chunk-U5LBMAG3.mjs} +3 -3
  86. package/dist/modules/chunks/{chunk-46UEGAXY.mjs → chunk-V4SOFUJI.mjs} +6 -6
  87. package/dist/modules/chunks/{chunk-IJPWKKIU.mjs → chunk-VD3C4DYT.mjs} +14 -13
  88. package/dist/modules/chunks/chunk-VD3C4DYT.mjs.map +7 -0
  89. package/dist/modules/chunks/{chunk-YFQGSDK3.mjs → chunk-VD4QU7KY.mjs} +2 -2
  90. package/dist/modules/chunks/{chunk-KX2WU5Z6.mjs → chunk-WC6NGMGI.mjs} +3 -3
  91. package/dist/modules/chunks/{chunk-H256DQT6.mjs → chunk-XOZ5EMNY.mjs} +2 -2
  92. package/dist/modules/chunks/{chunk-ZHO2G4JR.mjs → chunk-XXJ32F5P.mjs} +3 -3
  93. package/dist/modules/chunks/{chunk-VW2ZF3P4.mjs → chunk-Y4SFATAM.mjs} +6 -6
  94. package/dist/modules/chunks/{chunk-SRYQLFBV.mjs → chunk-ZKFH7EMU.mjs} +2 -2
  95. package/dist/modules/chunks/{chunk-CKYXAT7H.mjs → chunk-ZRG7LDCA.mjs} +2 -2
  96. package/dist/modules/chunks/{chunk-PW5CE2Y6.mjs → chunk-ZW7LLDOL.mjs} +2 -2
  97. package/dist/modules/cli-contributions.mjs +14 -14
  98. package/dist/modules/cli.mjs +5 -5
  99. package/dist/modules/command-executor.mjs +3 -3
  100. package/dist/modules/embedded.mjs +82 -42
  101. package/dist/modules/embedded.mjs.map +2 -2
  102. package/dist/modules/extension-bridge.mjs +4 -4
  103. package/dist/modules/frontend-root.mjs +46 -46
  104. package/dist/modules/index.mjs +71 -65
  105. package/dist/modules/index.mjs.map +1 -1
  106. package/dist/modules/pages/scene.mjs +5 -5
  107. package/dist/modules/plugin.mjs +35 -35
  108. package/dist/modules/plugins/asset/frontend.mjs +10 -10
  109. package/dist/modules/plugins/asset/identity.mjs +9 -9
  110. package/dist/modules/plugins/asset/ui.mjs +3 -3
  111. package/dist/modules/plugins/content-browser/frontend.mjs +3 -3
  112. package/dist/modules/plugins/content-browser/identity.mjs +2 -2
  113. package/dist/modules/plugins/content-browser/ui.mjs +3 -3
  114. package/dist/modules/plugins/display/api.mjs +1 -1
  115. package/dist/modules/plugins/display/backend.mjs +4 -4
  116. package/dist/modules/plugins/display/frontend.mjs +5 -5
  117. package/dist/modules/plugins/display/identity.mjs +2 -2
  118. package/dist/modules/plugins/display/ui.mjs +3 -3
  119. package/dist/modules/plugins/inspector/frontend.mjs +3 -3
  120. package/dist/modules/plugins/inspector/identity.mjs +2 -2
  121. package/dist/modules/plugins/inspector/ui.mjs +3 -3
  122. package/dist/modules/plugins/material/frontend.mjs +10 -10
  123. package/dist/modules/plugins/material/identity.mjs +9 -9
  124. package/dist/modules/plugins/material/ui.mjs +10 -10
  125. package/dist/modules/plugins/mesh/frontend.mjs +10 -10
  126. package/dist/modules/plugins/mesh/identity.mjs +9 -9
  127. package/dist/modules/plugins/mesh/ui.mjs +10 -10
  128. package/dist/modules/plugins/plugins/api.mjs +4 -4
  129. package/dist/modules/plugins/plugins/backend.mjs +7 -7
  130. package/dist/modules/plugins/plugins/cli.mjs +5 -5
  131. package/dist/modules/plugins/plugins/frontend.mjs +3 -3
  132. package/dist/modules/plugins/plugins/identity.mjs +2 -2
  133. package/dist/modules/plugins/plugins/runtime.mjs +6 -6
  134. package/dist/modules/plugins/plugins/ui/panel.mjs +3 -3
  135. package/dist/modules/plugins/plugins/ui.mjs +4 -4
  136. package/dist/modules/plugins/scene/frontend.mjs +5 -5
  137. package/dist/modules/plugins/scene/identity.mjs +2 -2
  138. package/dist/modules/plugins/scene-tree/frontend.mjs +3 -3
  139. package/dist/modules/plugins/scene-tree/identity.mjs +2 -2
  140. package/dist/modules/plugins/scene-tree/ui.mjs +3 -3
  141. package/dist/modules/plugins/texture/frontend.mjs +10 -10
  142. package/dist/modules/plugins/texture/identity.mjs +9 -9
  143. package/dist/modules/plugins/texture/ui.mjs +10 -10
  144. package/dist/modules/plugins/viewport/frontend.mjs +12 -12
  145. package/dist/modules/plugins/viewport/identity.mjs +2 -2
  146. package/dist/modules/plugins/viewport/presentation.mjs +4 -4
  147. package/dist/modules/plugins/viewport/schema.mjs +2 -2
  148. package/dist/modules/plugins/viewport/workspace-shell.mjs +9 -9
  149. package/dist/modules/product.mjs +35 -35
  150. package/dist/modules/shell/frontend.mjs +1 -1
  151. package/dist/modules/viewer/catalog/backend.mjs +31 -31
  152. package/dist/modules/viewer/catalog/frontend.mjs +42 -42
  153. package/dist/modules/viewer/catalog/shared.mjs +20 -20
  154. package/dist/modules/viewer/catalog.mjs +51 -51
  155. package/dist/modules/viewer/cli.mjs +10 -10
  156. package/dist/modules/viewer-host/frontend.mjs +48 -48
  157. package/dist/modules/viewer-host/page-registry.mjs +6 -6
  158. package/dist/modules/viewer-host.mjs +7 -7
  159. package/dist/modules/viewer.mjs +51 -51
  160. package/dist/modules/workspace/api.mjs +1 -1
  161. package/dist/modules/workspace/backend.mjs +10 -10
  162. package/dist/modules/workspace/broker.mjs +9 -9
  163. package/dist/modules/workspace/cli.mjs +2 -2
  164. package/dist/modules/workspace/client.mjs +3 -3
  165. package/dist/modules/workspace/command-error.mjs +2 -2
  166. package/dist/modules/workspace/contract.mjs +7 -1
  167. package/dist/modules/workspace/engine-adapter.mjs +3 -3
  168. package/dist/modules/workspace/extension-bridge.mjs +4 -4
  169. package/dist/modules/workspace/frontend-plugin.mjs +8 -8
  170. package/dist/modules/workspace/frontend.mjs +9 -9
  171. package/dist/modules/workspace/page-title.mjs +3 -3
  172. package/dist/modules/workspace/presentation.mjs +4 -4
  173. package/dist/modules/workspace/preview-surface.mjs +7 -7
  174. package/dist/modules/workspace/project-session.mjs +2 -2
  175. package/dist/modules/workspace/render-resize-sync.mjs +2 -2
  176. package/dist/modules/workspace/resident.mjs +4 -4
  177. package/dist/modules/workspace/resource-open.mjs +5 -5
  178. package/dist/modules/workspace/resource-page.mjs +8 -8
  179. package/dist/modules/workspace/tool-runtime.mjs +7 -5
  180. package/dist/modules/workspace/view-trace.mjs +3 -3
  181. package/dist/modules/workspace/workspace-recovery.mjs +4 -4
  182. package/dist/modules/workspace/workspace-state.mjs +2 -2
  183. package/dist/modules/workspace-frontend.mjs +8 -8
  184. package/dist/viewer/assets/{embedded-Ch4NawY-.js → embedded-BZSPh0if.js} +2 -2
  185. package/dist/viewer/assets/{embedded-Ch4NawY-.js.map → embedded-BZSPh0if.js.map} +1 -1
  186. package/dist/viewer/assets/main-CmJEE-8D.js +22 -0
  187. package/dist/viewer/assets/main-CmJEE-8D.js.map +1 -0
  188. package/dist/viewer/assets/{panels-lazy-DbOAvYN1.js → panels-lazy-DqCwhGd9.js} +2 -2
  189. package/dist/viewer/assets/{panels-lazy-DbOAvYN1.js.map → panels-lazy-DqCwhGd9.js.map} +1 -1
  190. package/dist/viewer/assets/panels-ui-Cm3As_jE.js +12 -0
  191. package/dist/viewer/assets/panels-ui-Cm3As_jE.js.map +1 -0
  192. package/dist/viewer/assets/style-CcYzhsIZ.css +2 -0
  193. package/dist/viewer/assets/{wgpu_wasm-DZKPZXEq.js → wgpu_wasm--oeqTwVY.js} +1 -1
  194. package/dist/viewer/assets/{wgpu_wasm_bg-C1seepuF.wasm → wgpu_wasm_bg-WoZ1YI1I.wasm} +0 -0
  195. package/dist/viewer/index.html +4 -4
  196. package/dist/viewer/panels.js +1 -1
  197. package/package.json +2 -2
  198. package/scripts/verify-runtime-content-engine.mjs +7 -4
  199. package/skills/forgeax-view-cli/SKILL.md +4 -0
  200. package/dist/modules/chunks/chunk-27XASYEH.mjs.map +0 -7
  201. package/dist/modules/chunks/chunk-5YTMN435.mjs.map +0 -7
  202. package/dist/modules/chunks/chunk-6KM24NH6.mjs.map +0 -7
  203. package/dist/modules/chunks/chunk-DWT3TA6M.mjs.map +0 -7
  204. package/dist/modules/chunks/chunk-E3Z7GLFU.mjs.map +0 -7
  205. package/dist/modules/chunks/chunk-EZSGDSCC.mjs.map +0 -7
  206. package/dist/modules/chunks/chunk-FNRGLCZW.mjs.map +0 -7
  207. package/dist/modules/chunks/chunk-HWZCLROY.mjs.map +0 -7
  208. package/dist/modules/chunks/chunk-IJPWKKIU.mjs.map +0 -7
  209. package/dist/modules/chunks/chunk-LZ57Y73Z.mjs.map +0 -7
  210. package/dist/modules/chunks/chunk-OQXDADAS.mjs.map +0 -7
  211. package/dist/modules/chunks/chunk-QELNKFSI.mjs +0 -10
  212. package/dist/modules/chunks/chunk-QELNKFSI.mjs.map +0 -7
  213. package/dist/modules/chunks/chunk-VKNIYV2W.mjs.map +0 -7
  214. package/dist/modules/chunks/chunk-YLCJNKIW.mjs.map +0 -7
  215. package/dist/viewer/assets/main-DUQJ1NlR.js +0 -22
  216. package/dist/viewer/assets/main-DUQJ1NlR.js.map +0 -1
  217. package/dist/viewer/assets/panels-ui-DICIsCag.js +0 -12
  218. package/dist/viewer/assets/panels-ui-DICIsCag.js.map +0 -1
  219. package/dist/viewer/assets/style-gOtSMZif.css +0 -2
  220. /package/dist/modules/chunks/{chunk-B6QUJ33G.mjs.map → chunk-25PFC2DY.mjs.map} +0 -0
  221. /package/dist/modules/chunks/{chunk-D2RCKG7Q.mjs.map → chunk-43L37UYV.mjs.map} +0 -0
  222. /package/dist/modules/chunks/{chunk-WVU3CQ62.mjs.map → chunk-4ZI5DFBR.mjs.map} +0 -0
  223. /package/dist/modules/chunks/{chunk-47RJSHLM.mjs.map → chunk-5HJ336VM.mjs.map} +0 -0
  224. /package/dist/modules/chunks/{chunk-PVP5YBNR.mjs.map → chunk-5N5FDO5Y.mjs.map} +0 -0
  225. /package/dist/modules/chunks/{chunk-APD2EWSZ.mjs.map → chunk-5PZL6W3F.mjs.map} +0 -0
  226. /package/dist/modules/chunks/{chunk-KI4WGTWL.mjs.map → chunk-5WVRCLHN.mjs.map} +0 -0
  227. /package/dist/modules/chunks/{chunk-YNHEYXDG.mjs.map → chunk-7MQIGD6Q.mjs.map} +0 -0
  228. /package/dist/modules/chunks/{chunk-F5RLQAPN.mjs.map → chunk-7YWMB7HV.mjs.map} +0 -0
  229. /package/dist/modules/chunks/{chunk-FICPCJKR.mjs.map → chunk-A22PJUZM.mjs.map} +0 -0
  230. /package/dist/modules/chunks/{chunk-P5XMFZY4.mjs.map → chunk-A7HXBQUG.mjs.map} +0 -0
  231. /package/dist/modules/chunks/{chunk-HRKW766Y.mjs.map → chunk-AZHCKPUL.mjs.map} +0 -0
  232. /package/dist/modules/chunks/{chunk-6I7RY73G.mjs.map → chunk-CEB76QBE.mjs.map} +0 -0
  233. /package/dist/modules/chunks/{chunk-U64FRQKP.mjs.map → chunk-CVIF6DYH.mjs.map} +0 -0
  234. /package/dist/modules/chunks/{chunk-XQYF2P6M.mjs.map → chunk-D3ISMGT6.mjs.map} +0 -0
  235. /package/dist/modules/chunks/{chunk-OKQ5RBKO.mjs.map → chunk-DC3PU6SO.mjs.map} +0 -0
  236. /package/dist/modules/chunks/{chunk-4T3D67CS.mjs.map → chunk-DJKXBCZH.mjs.map} +0 -0
  237. /package/dist/modules/chunks/{chunk-E3PJGTLI.mjs.map → chunk-DX4M6LZH.mjs.map} +0 -0
  238. /package/dist/modules/chunks/{chunk-IZAHIOFU.mjs.map → chunk-EOW4JGVV.mjs.map} +0 -0
  239. /package/dist/modules/chunks/{chunk-U5R6MVM4.mjs.map → chunk-EQRDY5CQ.mjs.map} +0 -0
  240. /package/dist/modules/chunks/{chunk-7IGFAI5H.mjs.map → chunk-EW7VMNZA.mjs.map} +0 -0
  241. /package/dist/modules/chunks/{chunk-FMCHH5R4.mjs.map → chunk-FSSKCXPL.mjs.map} +0 -0
  242. /package/dist/modules/chunks/{chunk-357UOBAS.mjs.map → chunk-FSYQ3LBQ.mjs.map} +0 -0
  243. /package/dist/modules/chunks/{chunk-D25SR5FS.mjs.map → chunk-FVSDKOXR.mjs.map} +0 -0
  244. /package/dist/modules/chunks/{chunk-XMP4THLF.mjs.map → chunk-J7QRK3FU.mjs.map} +0 -0
  245. /package/dist/modules/chunks/{chunk-D57DDEV2.mjs.map → chunk-JE4N575J.mjs.map} +0 -0
  246. /package/dist/modules/chunks/{chunk-ZIDEETK4.mjs.map → chunk-JKDBKS7P.mjs.map} +0 -0
  247. /package/dist/modules/chunks/{chunk-U5J7OTEB.mjs.map → chunk-K4C5WOTT.mjs.map} +0 -0
  248. /package/dist/modules/chunks/{chunk-QUFVUMSY.mjs.map → chunk-KOBAWLZL.mjs.map} +0 -0
  249. /package/dist/modules/chunks/{chunk-CX5WREJC.mjs.map → chunk-KY2AWNDR.mjs.map} +0 -0
  250. /package/dist/modules/chunks/{chunk-RJVOH7G2.mjs.map → chunk-L24HPIQP.mjs.map} +0 -0
  251. /package/dist/modules/chunks/{chunk-PJFFCRRD.mjs.map → chunk-LOVO3P2Q.mjs.map} +0 -0
  252. /package/dist/modules/chunks/{chunk-X4NNZ5X6.mjs.map → chunk-M66NDY35.mjs.map} +0 -0
  253. /package/dist/modules/chunks/{chunk-55F55BQY.mjs.map → chunk-MUBV2LNK.mjs.map} +0 -0
  254. /package/dist/modules/chunks/{chunk-M6S5YA6X.mjs.map → chunk-NHNPQ3ZS.mjs.map} +0 -0
  255. /package/dist/modules/chunks/{chunk-STQPRNEO.mjs.map → chunk-NSPN5OQ5.mjs.map} +0 -0
  256. /package/dist/modules/chunks/{chunk-XE6ITXHT.mjs.map → chunk-NZ4N7AVG.mjs.map} +0 -0
  257. /package/dist/modules/chunks/{chunk-KAGFU64Y.mjs.map → chunk-OGFZB75B.mjs.map} +0 -0
  258. /package/dist/modules/chunks/{chunk-EWSCJF77.mjs.map → chunk-OS7BK3FO.mjs.map} +0 -0
  259. /package/dist/modules/chunks/{chunk-U6UMATPV.mjs.map → chunk-P3ZW2T37.mjs.map} +0 -0
  260. /package/dist/modules/chunks/{chunk-INTTYJVW.mjs.map → chunk-PHCUCHVL.mjs.map} +0 -0
  261. /package/dist/modules/chunks/{chunk-JK7K7RG3.mjs.map → chunk-QNJL265P.mjs.map} +0 -0
  262. /package/dist/modules/chunks/{chunk-ZGOGO7SS.mjs.map → chunk-QNSUBUZF.mjs.map} +0 -0
  263. /package/dist/modules/chunks/{chunk-TXLD7JI5.mjs.map → chunk-QQP7ZGQD.mjs.map} +0 -0
  264. /package/dist/modules/chunks/{chunk-PZIAKZJC.mjs.map → chunk-R6MT6F3T.mjs.map} +0 -0
  265. /package/dist/modules/chunks/{chunk-P4UPH74B.mjs.map → chunk-RGM4S2BE.mjs.map} +0 -0
  266. /package/dist/modules/chunks/{chunk-AGVLPYVE.mjs.map → chunk-SKZC6VTV.mjs.map} +0 -0
  267. /package/dist/modules/chunks/{chunk-4D3Q7K44.mjs.map → chunk-SSVRSFTX.mjs.map} +0 -0
  268. /package/dist/modules/chunks/{chunk-2Z5KEV6L.mjs.map → chunk-TFBSEYKW.mjs.map} +0 -0
  269. /package/dist/modules/chunks/{chunk-K2QZRFLE.mjs.map → chunk-TPLT4PBX.mjs.map} +0 -0
  270. /package/dist/modules/chunks/{chunk-5PHAXNFO.mjs.map → chunk-U5LBMAG3.mjs.map} +0 -0
  271. /package/dist/modules/chunks/{chunk-46UEGAXY.mjs.map → chunk-V4SOFUJI.mjs.map} +0 -0
  272. /package/dist/modules/chunks/{chunk-YFQGSDK3.mjs.map → chunk-VD4QU7KY.mjs.map} +0 -0
  273. /package/dist/modules/chunks/{chunk-KX2WU5Z6.mjs.map → chunk-WC6NGMGI.mjs.map} +0 -0
  274. /package/dist/modules/chunks/{chunk-H256DQT6.mjs.map → chunk-XOZ5EMNY.mjs.map} +0 -0
  275. /package/dist/modules/chunks/{chunk-ZHO2G4JR.mjs.map → chunk-XXJ32F5P.mjs.map} +0 -0
  276. /package/dist/modules/chunks/{chunk-VW2ZF3P4.mjs.map → chunk-Y4SFATAM.mjs.map} +0 -0
  277. /package/dist/modules/chunks/{chunk-SRYQLFBV.mjs.map → chunk-ZKFH7EMU.mjs.map} +0 -0
  278. /package/dist/modules/chunks/{chunk-CKYXAT7H.mjs.map → chunk-ZRG7LDCA.mjs.map} +0 -0
  279. /package/dist/modules/chunks/{chunk-PW5CE2Y6.mjs.map → chunk-ZW7LLDOL.mjs.map} +0 -0
@@ -1,11 +1,11 @@
1
1
  import {
2
2
  runWorkspaceToolApi
3
- } from "./chunk-EZSGDSCC.mjs";
3
+ } from "./chunk-M7XSCLYV.mjs";
4
4
  import {
5
5
  isWorkspaceTargetRecoveryCode,
6
6
  resolveWorkspaceFailure,
7
7
  resolveWorkspaceReopenRoot
8
- } from "./chunk-K2QZRFLE.mjs";
8
+ } from "./chunk-TPLT4PBX.mjs";
9
9
  import {
10
10
  editorSceneTargetIds,
11
11
  isEditorWorkspaceAsset,
@@ -13,13 +13,16 @@ import {
13
13
  logResourceOpen,
14
14
  selectEditorWorkspacePreview,
15
15
  summarizeResourceAsset
16
- } from "./chunk-ZIDEETK4.mjs";
16
+ } from "./chunk-JKDBKS7P.mjs";
17
17
  import {
18
18
  workspaceDiagnosticRecord
19
- } from "./chunk-U5R6MVM4.mjs";
19
+ } from "./chunk-EQRDY5CQ.mjs";
20
20
  import {
21
21
  VIEW_DISPLAY_TAB_ID,
22
22
  VIEW_FILE_GET_SERVICE,
23
+ VIEW_PACK_REVEAL_ACK_SERVICE,
24
+ VIEW_PACK_REVEAL_TOPIC,
25
+ VIEW_PACK_SOURCES_SERVICE,
23
26
  VIEW_WORKSPACE_API_VERSION,
24
27
  VIEW_WORKSPACE_OPERATIONS,
25
28
  VIEW_WORKSPACE_SERVICES,
@@ -35,7 +38,7 @@ import {
35
38
  workspaceCapabilities,
36
39
  workspaceError,
37
40
  workspaceUiFingerprint
38
- } from "./chunk-E3Z7GLFU.mjs";
41
+ } from "./chunk-QYJZ3SOV.mjs";
39
42
  import {
40
43
  createWorkspaceId
41
44
  } from "./chunk-4XEXLHX4.mjs";
@@ -158,6 +161,15 @@ async function readWorkspaceFilePreview(workspace, payload = {}) {
158
161
  // packages/view-workspace-core/src/broker.ts
159
162
  var ENGINE_SOURCE = "engine-workspace";
160
163
  var UI_OPERATIONS = Object.freeze({
164
+ "workspace.summary": (workspace) => workspace.summary(),
165
+ "pages.list": (workspace) => workspace.pages(),
166
+ "pack.reveal": (workspace, args, context) => workspace.revealPack({
167
+ projectId: requireWorkspaceString(args.projectId, "projectId"),
168
+ sourcePath: requireWorkspaceString(args.sourcePath, "sourcePath"),
169
+ revision: requireWorkspaceString(args.revision, "revision"),
170
+ ...args.packageId === void 0 ? {} : { packageId: requireWorkspaceString(args.packageId, "packageId") },
171
+ ...args.connectionId === void 0 ? {} : { connectionId: requireWorkspaceString(args.connectionId, "connectionId") }
172
+ }, context.signal),
161
173
  "target.select": (workspace, args) => workspace.selectTarget(args),
162
174
  "tabs.get": (workspace) => workspace.snapshot(),
163
175
  "tabs.select": (workspace, args) => workspace.selectTab(args),
@@ -165,13 +177,30 @@ var UI_OPERATIONS = Object.freeze({
165
177
  "scene.pick": (workspace, args, context) => workspace.pickSceneEntity(args, context),
166
178
  "scene.clear": (workspace, args, context) => workspace.clearSceneSelection(args, context)
167
179
  });
168
- var ViewWorkspaceBroker = class {
169
- constructor({ engine, toolApi, display = () => void 0, accessToken = randomUUID(), authorize } = {}) {
180
+ var PAGE_OPERATIONS = /* @__PURE__ */ new Set([
181
+ "tabs.get",
182
+ "tabs.select",
183
+ "target.select",
184
+ "scene.select",
185
+ "scene.pick",
186
+ "scene.clear",
187
+ "asset.open",
188
+ "preview.close",
189
+ "play.start",
190
+ "play.ready",
191
+ "play.stop"
192
+ ]);
193
+ var ViewWorkspaceBroker = class _ViewWorkspaceBroker {
194
+ constructor({ engine, engineForCaller, projectIntent, toolApi, display = () => void 0, accessToken = randomUUID(), authorize, packSources } = {}, caller) {
170
195
  this.engine = engine;
196
+ this.engineForCaller = engineForCaller;
197
+ this.projectIntent = projectIntent;
198
+ this.caller = caller;
171
199
  this.toolApi = toolApi;
172
200
  this.display = display;
173
201
  this.accessToken = accessToken;
174
202
  this.authorize = authorize;
203
+ this.packSources = packSources;
175
204
  this.selectedTabId = VIEW_WORKSPACE_TAB_ID;
176
205
  this.targetBinding = "editor";
177
206
  this.editorTargetId = void 0;
@@ -192,6 +221,8 @@ var ViewWorkspaceBroker = class {
192
221
  this.catalogEpoch = -1;
193
222
  this.disposing = false;
194
223
  this.publishFingerprint = "";
224
+ this.pageSessions = /* @__PURE__ */ new Map();
225
+ this.pendingReveals = /* @__PURE__ */ new Map();
195
226
  }
196
227
  get project() {
197
228
  return this.engine?.project?.project ?? null;
@@ -273,6 +304,35 @@ var ViewWorkspaceBroker = class {
273
304
  } : null;
274
305
  }
275
306
  }
307
+ summary() {
308
+ const project = this.project;
309
+ const previews = this.previews();
310
+ const projectTarget = this.projectTarget && this.engine?.preview?.target.targetId === this.projectTarget.targetId ? this.engine.preview.target : this.projectTarget;
311
+ const active = [
312
+ ...projectTarget ? [{ target: projectTarget, role: "project" }] : [],
313
+ ...this.engine?.play ? [{ target: this.engine.play.target, role: "play" }] : []
314
+ ];
315
+ const targets = [...active, ...previews.slice(0, Math.max(0, 16 - active.length)).map((preview) => ({ target: preview.target, role: "preview" }))];
316
+ return {
317
+ revision: this.revision,
318
+ project: project ? { id: project.id, root: project.root, name: project.name } : null,
319
+ projectPhase: this.engine?.project?.phase ?? null,
320
+ browserGeneration: this.engine?.project?.browserGeneration ?? null,
321
+ targets: targets.map(({ target, role }) => ({
322
+ targetId: target.targetId,
323
+ ...target.generation === void 0 ? {} : { generation: target.generation },
324
+ role
325
+ })),
326
+ hasMoreTargets: active.length + previews.length > 16
327
+ };
328
+ }
329
+ pages() {
330
+ const entries = [...this.pageSessions.entries()];
331
+ return {
332
+ pages: entries.slice(0, 16).map(([connectionId, page]) => ({ connectionId, ...page.broker.summary() })),
333
+ hasMorePages: entries.length > 16
334
+ };
335
+ }
276
336
  snapshot() {
277
337
  this.syncBindings();
278
338
  const display = this.display?.();
@@ -299,6 +359,7 @@ var ViewWorkspaceBroker = class {
299
359
  ],
300
360
  project: this.project,
301
361
  projectTarget: this.projectTarget,
362
+ ...!this.project && this.projectIntent?.() ? { projectIntent: { root: this.projectIntent() } } : {},
302
363
  ...this.engine?.project?.phase === void 0 ? {} : { projectPhase: this.engine.project.phase },
303
364
  ...this.engine?.project?.browserGeneration === void 0 ? {} : { browserGeneration: this.engine.project.browserGeneration },
304
365
  assets: this.assets,
@@ -352,7 +413,21 @@ var ViewWorkspaceBroker = class {
352
413
  }
353
414
  async call(rawRequest, { signal, caller } = {}) {
354
415
  const request = assertWorkspaceRequest(rawRequest);
416
+ if (request.operation === "pages.list" || request.operation === "pack.reveal") {
417
+ await this.authorizeRequest(request, caller);
418
+ return UI_OPERATIONS[request.operation](this, request.args, { signal, caller, clientId: request.clientId });
419
+ }
420
+ const page = caller?.connectionId && this.pageSessions.get(caller.connectionId);
421
+ if (page) return page.broker.call(rawRequest, { signal, caller });
355
422
  await this.authorizeRequest(request, caller);
423
+ if (PAGE_OPERATIONS.has(request.operation) && this.pageSessions.size > 0) {
424
+ if (this.pageSessions.size !== 1) throw workspaceError(
425
+ "view-page-ambiguous",
426
+ "one View page for this page operation",
427
+ "Select the exact View page before retrying."
428
+ );
429
+ return this.pageSessions.values().next().value.broker.call(request, { signal, caller });
430
+ }
356
431
  const ui = UI_OPERATIONS[request.operation];
357
432
  if (ui) return ui(this, request.args, { signal, caller, clientId: request.clientId });
358
433
  if (request.operation === "project.reopen") {
@@ -367,12 +442,15 @@ var ViewWorkspaceBroker = class {
367
442
  return this.invoke(request.operation, request.args, { signal, caller, clientId: request.clientId, token: request.token, requestId: request.requestId });
368
443
  }
369
444
  async invoke(operation, args = {}, { signal, caller, clientId = "view-owner", token, requestId } = {}) {
445
+ caller ??= this.caller;
370
446
  const { tabId, ...input } = args;
371
447
  if (tabId !== void 0) this.assertWorkspaceTab(tabId);
372
448
  const inspector = operation.startsWith("plugins.");
373
449
  const presentation = operation.startsWith("display.");
374
450
  const id = inspector ? operation : `${presentation ? "view" : "engine"}.${operation}`;
375
451
  const sourceId = inspector || presentation ? "view-backend" : ENGINE_SOURCE;
452
+ if (this.caller && !inspector && !presentation && !operation.startsWith("run.") && input.targetId === void 0 && this.projectTarget)
453
+ input.targetId = this.projectTarget.targetId;
376
454
  const owner = this.toolApi?.describe(id, sourceId).find((record) => record.callable)?.owner;
377
455
  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 });
378
456
  this.syncBindings();
@@ -605,6 +683,18 @@ var ViewWorkspaceBroker = class {
605
683
  }
606
684
  async revokeConnection(connectionId) {
607
685
  if (typeof connectionId !== "string") return;
686
+ if (!this.pageSessions.has(connectionId) && ![...this.pendingReveals.values()].some((pending) => pending.connectionId === connectionId)) return;
687
+ for (const [requestId, pending] of this.pendingReveals) {
688
+ if (pending.connectionId !== connectionId) continue;
689
+ this.pendingReveals.delete(requestId);
690
+ pending.settle({ ok: false, code: "view-page-gone", requestId });
691
+ }
692
+ const page = this.pageSessions.get(connectionId);
693
+ if (page) {
694
+ this.pageSessions.delete(connectionId);
695
+ page.unsubscribe();
696
+ await page.broker.dispose();
697
+ }
608
698
  for (const preview of [this.engine?.preview, this.engine?.play]) {
609
699
  if (!preview) continue;
610
700
  try {
@@ -619,37 +709,94 @@ var ViewWorkspaceBroker = class {
619
709
  }
620
710
  this.changed();
621
711
  }
622
- /**
623
- * Reset per-page UI session state when a new View frontend page is admitted.
624
- * The open project and its Engine session stay; everything the previous page
625
- * accumulated after project.open returns to the just-opened state, so a
626
- * refreshed page's first snapshot does not inherit the old page's history.
627
- */
628
- resetPageSession() {
629
- if (this.disposing) return;
630
- this.selectedTabId = VIEW_WORKSPACE_TAB_ID;
631
- this.targetBinding = "editor";
632
- this.previewTargetId = void 0;
633
- this.inspection = null;
634
- this.openRequest = null;
635
- this.openRequestSequence = 0;
636
- this.resourceOpens = /* @__PURE__ */ new Map();
637
- this.sceneSelection = null;
638
- this.selectionAbort?.abort();
639
- this.selectionAbort = void 0;
640
- this.previewOwner = void 0;
641
- this.syncBindings();
642
- this.changed();
643
- const project = this.project;
644
- if (project) {
645
- void this.invoke("assets.list", { projectId: project.id }).catch(() => {
646
- });
712
+ /** One accepted View frontend owns one presentation projection and event stream. */
713
+ attachPageSession(caller, transport) {
714
+ const engine = this.engineForCaller ? this.engineForCaller(caller) : this.engine;
715
+ const projectTarget = engine?.project?.target;
716
+ const projectCaller = projectTarget && caller.sourceId === `forgeax-workspace:${projectTarget.sessionId}:${projectTarget.targetId}`;
717
+ if (caller.kind !== "frontend" || caller.sourceId !== "view-frontend" && !projectCaller || this.pageSessions.has(caller.connectionId)) return;
718
+ const broker = new _ViewWorkspaceBroker({
719
+ engine,
720
+ toolApi: this.toolApi,
721
+ display: () => this.display(caller),
722
+ ...this.engineForCaller && caller.sourceId === "view-frontend" ? { projectIntent: () => this.project?.root } : {},
723
+ accessToken: this.accessToken,
724
+ authorize: this.authorize,
725
+ packSources: this.packSources
726
+ }, caller);
727
+ broker.snapshot();
728
+ if (engine === this.engine) broker.assets = this.assets;
729
+ const unsubscribe = broker.subscribe((state) => transport.publish(VIEW_WORKSPACE_STATE_TOPIC, state, { connectionId: caller.connectionId }));
730
+ this.pageSessions.set(caller.connectionId, { broker, unsubscribe });
731
+ }
732
+ publishPageSessions() {
733
+ for (const { broker } of this.pageSessions.values()) {
734
+ broker.snapshot();
735
+ if (broker.engine === this.engine && this.assets !== null) broker.assets = this.assets;
736
+ broker.changed();
647
737
  }
648
738
  }
739
+ async revealPack(input, signal) {
740
+ const transport = this.transport;
741
+ if (!transport) return { ok: false, code: "view-page-unavailable" };
742
+ if (signal?.aborted) return { ok: false, code: "view-reveal-cancelled" };
743
+ const candidates = [...this.pageSessions.keys()];
744
+ if (!input.connectionId && candidates.length !== 1)
745
+ return { ok: false, code: candidates.length ? "view-page-ambiguous" : "view-page-unavailable", candidates };
746
+ const connectionId = input.connectionId ?? candidates[0];
747
+ const page = this.pageSessions.get(connectionId);
748
+ if (!page) return { ok: false, code: "view-page-gone" };
749
+ const project = page.broker.project;
750
+ if (!project || project.id !== input.projectId) return { ok: false, code: "view-project-stale" };
751
+ if (!this.packSources) return { ok: false, code: "view-pack-sources-unavailable" };
752
+ const source = (await this.packSources(project.root)).sources.find((row) => row.sourcePath === input.sourcePath);
753
+ if (signal?.aborted) return { ok: false, code: "view-reveal-cancelled" };
754
+ if (!source || source.revision !== input.revision || input.packageId && source.packageId !== input.packageId)
755
+ return { ok: false, code: "view-pack-stale" };
756
+ const requestId = randomUUID();
757
+ const intent = {
758
+ requestId,
759
+ connectionId,
760
+ projectId: input.projectId,
761
+ sourcePath: input.sourcePath,
762
+ revision: input.revision,
763
+ ...source.packageId ? { packageId: source.packageId } : {}
764
+ };
765
+ return new Promise((resolve2) => {
766
+ const retire = (code) => {
767
+ this.pendingReveals.delete(requestId);
768
+ transport.publish(VIEW_PACK_REVEAL_TOPIC, { ...intent, cancelled: true }, { connectionId });
769
+ settle({ ok: false, code, requestId });
770
+ };
771
+ const cancel = () => {
772
+ retire("view-reveal-cancelled");
773
+ };
774
+ const settle = (value) => {
775
+ clearTimeout(timeout);
776
+ signal?.removeEventListener("abort", cancel);
777
+ resolve2(value);
778
+ };
779
+ const timeout = setTimeout(() => {
780
+ retire("view-reveal-timeout");
781
+ }, 12e3);
782
+ timeout.unref?.();
783
+ this.pendingReveals.set(requestId, {
784
+ connectionId,
785
+ projectId: input.projectId,
786
+ sourcePath: input.sourcePath,
787
+ revision: input.revision,
788
+ settle
789
+ });
790
+ signal?.addEventListener("abort", cancel, { once: true });
791
+ transport.publish(VIEW_PACK_REVEAL_TOPIC, intent, { connectionId });
792
+ });
793
+ }
649
794
  registerTransport(transport, { routeThroughTools = false } = {}) {
795
+ this.transport = transport;
650
796
  const capabilities = transport.register(VIEW_WORKSPACE_SERVICES.capabilities, () => this.capabilities());
651
797
  const call = transport.register(VIEW_WORKSPACE_SERVICES.call, async ({ payload, signal, caller }) => {
652
798
  try {
799
+ this.attachPageSession(caller, transport);
653
800
  return routeThroughTools ? await runWorkspaceToolApi(this.toolApi, {
654
801
  operation: `view.workspace.${payload.operation}`,
655
802
  args: payload.args,
@@ -672,9 +819,9 @@ var ViewWorkspaceBroker = class {
672
819
  });
673
820
  }
674
821
  });
675
- const fileGet = transport.register(VIEW_FILE_GET_SERVICE, async ({ payload }) => {
822
+ const fileGet = transport.register(VIEW_FILE_GET_SERVICE, async ({ payload, caller }) => {
676
823
  try {
677
- return await readWorkspaceFilePreview(this, payload);
824
+ return await readWorkspaceFilePreview(this.pageSessions.get(caller.connectionId)?.broker ?? this, payload);
678
825
  } catch (error) {
679
826
  const failure = workspaceDiagnosticRecord(error);
680
827
  if (typeof failure.code !== "string" || !failure.code.startsWith("view-")) throw error;
@@ -687,27 +834,77 @@ var ViewWorkspaceBroker = class {
687
834
  });
688
835
  }
689
836
  });
690
- const subscription = this.subscribe((state) => transport.publish(VIEW_WORKSPACE_STATE_TOPIC, state));
837
+ const packSources = transport.register(VIEW_PACK_SOURCES_SERVICE, async ({ payload, caller }) => {
838
+ const project = (this.pageSessions.get(caller.connectionId)?.broker ?? this).project;
839
+ if (!project || payload?.projectId !== project.id) throw workspaceError("view-project-stale", "the currently open project", "Refresh the workspace before listing Pack sources.");
840
+ if (!this.packSources) throw workspaceError("view-pack-sources-unavailable", "an installed Pack source provider", "Update the View Host Pack.");
841
+ return this.packSources(project.root);
842
+ });
843
+ const revealAck = transport.register(VIEW_PACK_REVEAL_ACK_SERVICE, async ({ payload, caller }) => {
844
+ const requestId = typeof payload?.requestId === "string" ? payload.requestId : "";
845
+ const pending = this.pendingReveals.get(requestId);
846
+ if (!pending || pending.connectionId !== caller.connectionId) return { ok: false, code: "view-reveal-stale" };
847
+ if (pending.projectId !== payload.projectId || pending.sourcePath !== payload.sourcePath || pending.revision !== payload.revision)
848
+ return { ok: false, code: "view-reveal-identity-mismatch" };
849
+ const page = this.pageSessions.get(caller.connectionId);
850
+ const project = page?.broker.project;
851
+ const source = project && this.packSources ? (await this.packSources(project.root)).sources.find((row) => row.sourcePath === pending.sourcePath) : void 0;
852
+ if (this.pendingReveals.get(requestId) !== pending) return { ok: false, code: "view-reveal-stale" };
853
+ if (!project || project.id !== pending.projectId || source?.revision !== pending.revision) {
854
+ this.pendingReveals.delete(requestId);
855
+ pending.settle({ ok: false, code: "view-reveal-stale", requestId });
856
+ return { ok: false, code: "view-reveal-stale" };
857
+ }
858
+ this.pendingReveals.delete(requestId);
859
+ pending.settle({
860
+ ok: payload.shown === true,
861
+ code: payload.shown === true ? "shown" : "view-reveal-not-shown",
862
+ requestId,
863
+ connectionId: caller.connectionId,
864
+ projectId: payload.projectId,
865
+ sourcePath: payload.sourcePath,
866
+ revision: payload.revision,
867
+ ...typeof payload.reason === "string" ? { reason: payload.reason.slice(0, 160) } : {}
868
+ });
869
+ return { ok: true };
870
+ });
871
+ const subscription = this.subscribe((state) => transport.publish(VIEW_WORKSPACE_STATE_TOPIC, state, {
872
+ excludeConnectionIds: [...this.pageSessions.keys()]
873
+ }));
874
+ const removeConnect = transport.onClientConnect((caller) => this.attachPageSession(caller, transport));
875
+ const removeDisconnect = transport.onClientDisconnect((caller) => {
876
+ void this.revokeConnection(caller.connectionId);
877
+ });
691
878
  const observer = transport.connect();
692
879
  const engineSubscription = observer.subscribe("engine.workspace.state", (snapshot) => {
693
880
  const epoch = snapshot && typeof snapshot.catalogEpoch === "number" ? snapshot.catalogEpoch : void 0;
694
881
  if (epoch === void 0 || epoch <= this.catalogEpoch) {
695
882
  this.changed();
883
+ this.publishPageSessions();
696
884
  return;
697
885
  }
698
886
  this.catalogEpoch = epoch;
699
- const project = this.project;
700
- if (!project) return;
701
- const lost = this.workspaceTargetLost;
702
- void this.invoke("assets.list", { projectId: project.id }).catch(() => {
703
- this.workspaceTargetLost = lost;
704
- });
887
+ for (const broker of [this, ...[...this.pageSessions.values()].map((page) => page.broker)]) {
888
+ broker.catalogEpoch = epoch;
889
+ const project = broker.project;
890
+ if (!project || broker.engine?.project?.phase !== void 0 && broker.engine.project.phase !== "running") continue;
891
+ const lost = broker.workspaceTargetLost;
892
+ void broker.invoke("assets.list", { projectId: project.id }).catch(() => {
893
+ broker.workspaceTargetLost = lost;
894
+ }).finally(() => broker.changed());
895
+ }
896
+ this.publishPageSessions();
705
897
  });
706
898
  return () => {
899
+ if (this.transport === transport) this.transport = void 0;
707
900
  capabilities();
708
901
  call();
709
902
  fileGet();
903
+ packSources();
904
+ revealAck();
710
905
  subscription();
906
+ removeConnect();
907
+ removeDisconnect();
711
908
  engineSubscription();
712
909
  observer.close();
713
910
  };
@@ -716,10 +913,19 @@ var ViewWorkspaceBroker = class {
716
913
  this.selectionAbort?.abort();
717
914
  this.disposing = true;
718
915
  this.listeners.clear();
916
+ for (const [requestId, pending] of this.pendingReveals) {
917
+ this.pendingReveals.delete(requestId);
918
+ pending.settle({ ok: false, code: "view-page-gone", requestId });
919
+ }
920
+ for (const [connectionId, page] of this.pageSessions) {
921
+ this.pageSessions.delete(connectionId);
922
+ page.unsubscribe();
923
+ await page.broker.dispose();
924
+ }
719
925
  }
720
926
  };
721
927
 
722
928
  export {
723
929
  ViewWorkspaceBroker
724
930
  };
725
- //# sourceMappingURL=chunk-HWZCLROY.mjs.map
931
+ //# sourceMappingURL=chunk-P27F2TZN.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../packages/view-workspace-core/src/broker.ts", "../../../packages/view-workspace-core/src/file-preview.ts"],
4
+ "sourcesContent": ["import type { EngineWorkspaceRuntime, EngineWorkspacePreview, EngineWorkspacePlay, EngineWorkspaceProjectHandle, EngineWorkspaceCameraResult } from '@forgeax/engine/app';\nimport type { ToolApi, ToolCallerIdentity } from '@forgeax/engine-tool-runtime';\nimport type { WorkspaceAsset, WorkspaceInspection, WorkspaceOpenRequest, WorkspaceSceneSelection, WorkspaceState, 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 'workspace.summary': (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
+ }