@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
@@ -821,6 +821,34 @@ export class RhiWgpuQueue {
821
821
  const ptr = this.__destroy_into_raw();
822
822
  wasm.__wbg_rhiwgpuqueue_free(ptr, 0);
823
823
  }
824
+ /**
825
+ * `queue.copyExternalImageToTexture(...)` flat-args form, mirroring
826
+ * writeTexture: the texture is borrowed so its JS pointer survives.
827
+ * WebGL2 has no `texture_external`, so video and canvas sources reach
828
+ * sampled textures only through this copy.
829
+ * @param {any} source
830
+ * @param {number} source_origin_x
831
+ * @param {number} source_origin_y
832
+ * @param {boolean} flip_y
833
+ * @param {RhiWgpuTexture} texture
834
+ * @param {number} mip_level
835
+ * @param {number} origin_x
836
+ * @param {number} origin_y
837
+ * @param {number} origin_z
838
+ * @param {number} aspect
839
+ * @param {boolean} display_p3
840
+ * @param {boolean} premultiplied_alpha
841
+ * @param {number} size_width
842
+ * @param {number} size_height
843
+ * @param {number} size_depth
844
+ */
845
+ copyExternalImageToTexture(source, source_origin_x, source_origin_y, flip_y, texture, mip_level, origin_x, origin_y, origin_z, aspect, display_p3, premultiplied_alpha, size_width, size_height, size_depth) {
846
+ _assertClass(texture, RhiWgpuTexture);
847
+ const ret = wasm.rhiwgpuqueue_copyExternalImageToTexture(this.__wbg_ptr, source, source_origin_x, source_origin_y, flip_y, texture.__wbg_ptr, mip_level, origin_x, origin_y, origin_z, aspect, display_p3, premultiplied_alpha, size_width, size_height, size_depth);
848
+ if (ret[1]) {
849
+ throw takeFromExternrefTable0(ret[0]);
850
+ }
851
+ }
824
852
  /**
825
853
  * @param {Array<any>} buffers
826
854
  */
@@ -2359,6 +2387,26 @@ function __wbg_get_imports() {
2359
2387
  const ret = arg0[arg1];
2360
2388
  return ret;
2361
2389
  },
2390
+ __wbg_height_393f1c4e4e4c0469: function(arg0) {
2391
+ const ret = arg0.height;
2392
+ return ret;
2393
+ },
2394
+ __wbg_height_4758eef353c25bbc: function(arg0) {
2395
+ const ret = arg0.height;
2396
+ return ret;
2397
+ },
2398
+ __wbg_height_9edadb8dd6231945: function(arg0) {
2399
+ const ret = arg0.height;
2400
+ return ret;
2401
+ },
2402
+ __wbg_height_aef2a2eb10d0d530: function(arg0) {
2403
+ const ret = arg0.height;
2404
+ return ret;
2405
+ },
2406
+ __wbg_height_c03c0f550edd8863: function(arg0) {
2407
+ const ret = arg0.height;
2408
+ return ret;
2409
+ },
2362
2410
  __wbg_includes_0ec85e8f9acc8cac: function(arg0, arg1, arg2) {
2363
2411
  const ret = arg0.includes(arg1, arg2);
2364
2412
  return ret;
@@ -2383,6 +2431,56 @@ function __wbg_get_imports() {
2383
2431
  const ret = result;
2384
2432
  return ret;
2385
2433
  },
2434
+ __wbg_instanceof_HtmlImageElement_491672dffc711dd2: function(arg0) {
2435
+ let result;
2436
+ try {
2437
+ result = arg0 instanceof HTMLImageElement;
2438
+ } catch (_) {
2439
+ result = false;
2440
+ }
2441
+ const ret = result;
2442
+ return ret;
2443
+ },
2444
+ __wbg_instanceof_HtmlVideoElement_47753cce6403a53c: function(arg0) {
2445
+ let result;
2446
+ try {
2447
+ result = arg0 instanceof HTMLVideoElement;
2448
+ } catch (_) {
2449
+ result = false;
2450
+ }
2451
+ const ret = result;
2452
+ return ret;
2453
+ },
2454
+ __wbg_instanceof_ImageBitmap_978cd0345c96f59d: function(arg0) {
2455
+ let result;
2456
+ try {
2457
+ result = arg0 instanceof ImageBitmap;
2458
+ } catch (_) {
2459
+ result = false;
2460
+ }
2461
+ const ret = result;
2462
+ return ret;
2463
+ },
2464
+ __wbg_instanceof_ImageData_67574703a56e9f41: function(arg0) {
2465
+ let result;
2466
+ try {
2467
+ result = arg0 instanceof ImageData;
2468
+ } catch (_) {
2469
+ result = false;
2470
+ }
2471
+ const ret = result;
2472
+ return ret;
2473
+ },
2474
+ __wbg_instanceof_OffscreenCanvas_55f621c0555607ff: function(arg0) {
2475
+ let result;
2476
+ try {
2477
+ result = arg0 instanceof OffscreenCanvas;
2478
+ } catch (_) {
2479
+ result = false;
2480
+ }
2481
+ const ret = result;
2482
+ return ret;
2483
+ },
2386
2484
  __wbg_instanceof_Uint32Array_6aece1e91fed8df4: function(arg0) {
2387
2485
  let result;
2388
2486
  try {
@@ -2910,12 +3008,40 @@ function __wbg_get_imports() {
2910
3008
  __wbg_vertexAttribPointer_85566c79cb366300: function(arg0, arg1, arg2, arg3, arg4, arg5, arg6) {
2911
3009
  arg0.vertexAttribPointer(arg1 >>> 0, arg2, arg3 >>> 0, arg4 !== 0, arg5, arg6);
2912
3010
  },
3011
+ __wbg_videoHeight_5d213235c6116abb: function(arg0) {
3012
+ const ret = arg0.videoHeight;
3013
+ return ret;
3014
+ },
3015
+ __wbg_videoWidth_527fa69158ca4289: function(arg0) {
3016
+ const ret = arg0.videoWidth;
3017
+ return ret;
3018
+ },
2913
3019
  __wbg_viewport_3c149d0c6435f0ed: function(arg0, arg1, arg2, arg3, arg4) {
2914
3020
  arg0.viewport(arg1, arg2, arg3, arg4);
2915
3021
  },
2916
3022
  __wbg_viewport_c25030cfbe3cddf4: function(arg0, arg1, arg2, arg3, arg4) {
2917
3023
  arg0.viewport(arg1, arg2, arg3, arg4);
2918
3024
  },
3025
+ __wbg_width_0501569208b20317: function(arg0) {
3026
+ const ret = arg0.width;
3027
+ return ret;
3028
+ },
3029
+ __wbg_width_113c4af498e36672: function(arg0) {
3030
+ const ret = arg0.width;
3031
+ return ret;
3032
+ },
3033
+ __wbg_width_14ddc8f4e1a3dcbe: function(arg0) {
3034
+ const ret = arg0.width;
3035
+ return ret;
3036
+ },
3037
+ __wbg_width_e987166926c3367c: function(arg0) {
3038
+ const ret = arg0.width;
3039
+ return ret;
3040
+ },
3041
+ __wbg_width_ef1b207dc2488a66: function(arg0) {
3042
+ const ret = arg0.width;
3043
+ return ret;
3044
+ },
2919
3045
  __wbindgen_cast_0000000000000001: function(arg0, arg1) {
2920
3046
  // Cast intrinsic for `Closure(Closure { owned: true, function: Function { arguments: [Externref], shim_idx: 1619, ret: Result(Unit), inner_ret: Some(Result(Unit)) }, mutable: true }) -> Externref`.
2921
3047
  const ret = makeMutClosure(arg0, arg1, wasm_bindgen_5989510ce0f9510c___convert__closures_____invoke___wasm_bindgen_5989510ce0f9510c___JsValue__core_f4ce2b6cc8c3b44d___result__Result_____wasm_bindgen_5989510ce0f9510c___JsError___true_);
@@ -4,11 +4,11 @@
4
4
  <meta charset="UTF-8" />
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
6
  <title>ForgeaX View</title>
7
- <script type="module" crossorigin src="/assets/main-CI6ZQziX.js"></script>
7
+ <script type="module" crossorigin src="/assets/main-BQrn6wsa.js"></script>
8
8
  <link rel="modulepreload" crossorigin href="/assets/rolldown-runtime-S-ySWqyJ.js">
9
- <link rel="modulepreload" crossorigin href="/assets/panels-lazy-DqCwhGd9.js">
10
- <link rel="modulepreload" crossorigin href="/assets/panels-ui-CfUtl68h.js">
11
- <link rel="stylesheet" crossorigin href="/assets/style-gOtSMZif.css">
9
+ <link rel="modulepreload" crossorigin href="/assets/panels-lazy-C_Cs-76A.js">
10
+ <link rel="modulepreload" crossorigin href="/assets/panels-ui-DEDHJLuE.js">
11
+ <link rel="stylesheet" crossorigin href="/assets/style-CcYzhsIZ.css">
12
12
  </head>
13
13
  <body>
14
14
  <div id="root"></div>
@@ -1,2 +1,2 @@
1
- import{n as e}from"./assets/rolldown-runtime-S-ySWqyJ.js";import{a as t,c as n,d as r,f as i,i as a,l as o,m as s,n as c,o as l,p as u,r as d,s as f,t as p,u as m}from"./assets/panels-ui-CfUtl68h.js";var h=e({mountAssetPropertiesPanel:()=>t,mountContentBrowserPanel:()=>s,mountInspectorPanel:()=>u,mountMaterialPanel:()=>m,mountMaterialPreviewPanel:()=>r,mountMaterialPropertiesPanel:()=>i,mountMeshPreviewPanel:()=>n,mountMeshPropertiesPanel:()=>o,mountPluginsPanel:()=>a,mountProfilerPanel:()=>p,mountRhiDebugPanel:()=>c,mountSceneTreePanel:()=>d,mountTexturePreviewPanel:()=>l,mountTexturePropertiesPanel:()=>f});export{t as mountAssetPropertiesPanel,s as mountContentBrowserPanel,u as mountInspectorPanel,m as mountMaterialPanel,r as mountMaterialPreviewPanel,i as mountMaterialPropertiesPanel,n as mountMeshPreviewPanel,o as mountMeshPropertiesPanel,a as mountPluginsPanel,p as mountProfilerPanel,c as mountRhiDebugPanel,d as mountSceneTreePanel,l as mountTexturePreviewPanel,f as mountTexturePropertiesPanel,h as t};
1
+ import{n as e}from"./assets/rolldown-runtime-S-ySWqyJ.js";import{a as t,c as n,d as r,f as i,i as a,l as o,m as s,n as c,o as l,p as u,r as d,s as f,t as p,u as m}from"./assets/panels-ui-DEDHJLuE.js";var h=e({mountAssetPropertiesPanel:()=>t,mountContentBrowserPanel:()=>s,mountInspectorPanel:()=>u,mountMaterialPanel:()=>m,mountMaterialPreviewPanel:()=>r,mountMaterialPropertiesPanel:()=>i,mountMeshPreviewPanel:()=>n,mountMeshPropertiesPanel:()=>o,mountPluginsPanel:()=>a,mountProfilerPanel:()=>p,mountRhiDebugPanel:()=>c,mountSceneTreePanel:()=>d,mountTexturePreviewPanel:()=>l,mountTexturePropertiesPanel:()=>f});export{t as mountAssetPropertiesPanel,s as mountContentBrowserPanel,u as mountInspectorPanel,m as mountMaterialPanel,r as mountMaterialPreviewPanel,i as mountMaterialPropertiesPanel,n as mountMeshPreviewPanel,o as mountMeshPropertiesPanel,a as mountPluginsPanel,p as mountProfilerPanel,c as mountRhiDebugPanel,d as mountSceneTreePanel,l as mountTexturePreviewPanel,f as mountTexturePropertiesPanel,h as t};
2
2
  //# sourceMappingURL=panels.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@forgeax/view",
3
- "version": "0.5.0-dev.13604.c415409c3b9d",
3
+ "version": "0.5.0-dev.13713.d28c4863d779",
4
4
  "type": "module",
5
5
  "description": "An optional display host for ForgeaX CLI runs",
6
6
  "files": [
@@ -19,7 +19,7 @@
19
19
  "registry": "https://registry.npmjs.org/"
20
20
  },
21
21
  "dependencies": {
22
- "@forgeax/engine": "0.5.0-dev.13604.c415409c3b9d",
22
+ "@forgeax/engine": "0.5.0-dev.13713.d28c4863d779",
23
23
  "dockview": "^6.6.1",
24
24
  "lucide-react": "^0.460.0",
25
25
  "playwright": "1.63.0",
@@ -373,7 +373,7 @@ try {
373
373
  const admitted = await runtime('inspect');
374
374
  assert.equal(admitted.packs.length, 1);
375
375
  assert.deepEqual(admitted.executions, []);
376
- const rows = await client.listAssets(state.project.id);
376
+ const rows = await client.listAssets(state.project.id, { targetId: state.projectTarget.targetId });
377
377
  assert.ok(rows.assets.some(asset => asset.guid === guid('box') && asset.kind === 'mesh'));
378
378
  const loaded = await page.evaluate(guid => globalThis.__runtimePackReadDirect(guid), guid('box'));
379
379
  assert.deepEqual(loaded, expected, 'the live browser AssetRegistry must restore every position and index as typed data');
@@ -483,7 +483,7 @@ try {
483
483
  const guid = key => AssetGuid.format(AssetGuid.derive(definePackageId(instanceId), key));
484
484
  const generated = await runtime('inspect');
485
485
  assert.equal(generated.executions[0].instance.values.width, 2);
486
- const rows = await client.listAssets(state.project.id);
486
+ const rows = await client.listAssets(state.project.id, { targetId: state.projectTarget.targetId });
487
487
  assert.ok(rows.assets.some(asset => asset.guid === guid('box') && asset.kind === 'mesh'));
488
488
  assert.ok(rows.assets.some(asset => asset.guid === guid('behavior') && asset.kind === 'plugin'));
489
489
  phase = 'plugin';
@@ -517,7 +517,10 @@ try {
517
517
  assert.equal(await panel.getByLabel('Instance', { exact: true }).inputValue(), instanceId);
518
518
  const replaced = await runtime('inspect');
519
519
  assert.equal(replaced.executions[0].instance.values.width, 4);
520
- const inspected = await client.inspectAsset(guid('box'), { projectId: state.project.id });
520
+ const inspected = await client.inspectAsset(guid('box'), {
521
+ projectId: state.project.id, targetId: state.projectTarget.targetId,
522
+ targetGeneration: state.projectTarget.generation,
523
+ });
521
524
  assert.deepEqual(inspected.inspection.meta.aabb, [-2, -1, -1, 2, 1, 1]);
522
525
  const oldBinding = await captureTarget(previewTarget, 'previous-consumer');
523
526
  assert.deepEqual(await readBinding(previewTarget), initialBinding);
@@ -557,7 +560,7 @@ try {
557
560
  await panel.locator('summary').filter({ hasText: 'Admitted packs' }).click();
558
561
  await panel.getByRole('button', { name: 'Withdraw pack', exact: true }).click();
559
562
  assert.equal((await runtime('inspect')).packs.length, 0);
560
- assert.equal((await client.listAssets(state.project.id)).assets.some(asset => asset.guid === guid('box')), false);
563
+ assert.equal((await client.listAssets(state.project.id, { targetId: state.projectTarget.targetId })).assets.some(asset => asset.guid === guid('box')), false);
561
564
  await importRuntimeContent(page, panel, { name: 'saved-content.json', mimeType: 'application/json', buffer: persistedBytes });
562
565
  await panel.getByLabel('Generator', { exact: true }).selectOption(parent);
563
566
  await panel.getByLabel('Instance', { exact: true }).selectOption(instanceId);
@@ -16,6 +16,13 @@ description: >-
16
16
 
17
17
  ## Find the live contract
18
18
 
19
+ Public ToolApi IDs are also CLI paths: `view.workspace.pack.reveal` becomes
20
+ `forgeax view workspace pack reveal`; pass its argument object through `--input`.
21
+ `view.workspace.summary.get` reads bounded workspace facts. The running Engine
22
+ backend discovers these current owner descriptors without mounting new plugins.
23
+ The standalone workspace client uses relative IDs (`pack.reveal`, `summary.get`).
24
+
25
+
19
26
  Read `@forgeax/view/workspace/contract` for operation names and request shape
20
27
  (`packages/view-workspace-core/src/contract.ts` in this repository). For
21
28
  programmatic clients, call
@@ -32,6 +39,7 @@ of guessing from paths, names, or a previous target.
32
39
  | Allocate an Editor project on the running View | `forgeax view project open --root <backend-root> --project <project-root> --json`; open the returned headed URL |
33
40
  | Call one resident workspace operation through Engine CLI | `forgeax view workspace call --root <backend-root> --operation <id> --args <json> --json`; requires the selected View host Pack and running View owner |
34
41
  | Call the resident View workspace API | `forgeax-view workspace --operation <id> --args <json>` with the issued endpoint and token |
42
+ | List pages and reveal a Pack | `forgeax view workspace call --operation pages.list --args '{}' --json`, then `--operation pack.reveal --args '{"projectId":"...","sourcePath":"assets/example.pack.ts","revision":"...","connectionId":"..."}' --json` |
35
43
  | Author assets or control an independent AI run | Engine CLI; use the installed `forgeax-engine-cli` skill when available |
36
44
 
37
45
  `forgeax help view --tree --json` discovers declarations from the running
@@ -46,6 +54,9 @@ transport and both CLI entries reach the same View owner. The Engine CLI
46
54
  entry uses the backend's existing authentication. Select the package host
47
55
  with `backend start --host-pack`; a downloaded View package alone
48
56
  does not make this command discoverable.
57
+ `pages.list` exposes a bounded page inventory; `pack.reveal` waits for the
58
+ addressed frontend to show the Pack. With multiple pages, select the exact
59
+ `connectionId`; a stale page or source revision returns a non-action result.
49
60
 
50
61
  ## Open a scene through the API
51
62
 
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../packages/view-workspace-core/src/backend.ts"],
4
- "sourcesContent": ["import type { Context } from '@forgeax/engine-plugin';\nimport type { ToolContribution } from '@forgeax/engine-tool-runtime';\nimport type { WorkspaceAuthorization } from './broker.ts';\nexport type WorkspaceBackendConfig = { workspaceAccessToken?: string; workspaceAuthorize?: WorkspaceAuthorization };\ndeclare module '@forgeax/engine-plugin' { interface EngineContextServices { viewWorkspaceCore: ViewWorkspaceBroker; viewWorkspaceAccessToken: string; } }\nimport { ViewWorkspaceBroker } from './broker.ts';\nimport { registerTools } from '@forgeax/engine-plugin';\nimport { defineTool, toolJsonSchema } from '@forgeax/engine-tool-runtime';\nimport { VIEW_WORKSPACE_OPERATIONS, createWorkspaceRequest } from './contract.ts';\nimport { createWorkspaceToolContributions, defineWorkspaceOperations } from './tool-runtime.ts';\n\nexport const VIEW_WORKSPACE_CORE_PLUGIN_ID = 'forgeax.view.service.workspace.backend';\nexport const VIEW_WORKSPACE_CORE_MODULE = '@forgeax/view-workspace-core/backend';\n\nexport const viewWorkspaceCoreBackendPlugin = {\n name: VIEW_WORKSPACE_CORE_PLUGIN_ID,\n inject: ['toolApi'],\n provide: ['viewWorkspaceCore', 'viewWorkspaceAccessToken'],\n apply(ctx: Context, config: WorkspaceBackendConfig = {}) {\n const workspace = new ViewWorkspaceBroker({\n engine: ctx.get?.('engineWorkspace', false),\n toolApi: ctx.get?.('toolApi', false),\n display: () => ctx.get?.('viewStatus', false)?.(),\n accessToken: config.workspaceAccessToken,\n authorize: config.workspaceAuthorize,\n });\n const toolApi = ctx.get?.('toolApi', false);\n const operations = defineWorkspaceOperations(VIEW_WORKSPACE_OPERATIONS.map(operation => ({\n id: `view.workspace.${operation}`,\n operation,\n })));\n const tools: ToolContribution[] = createWorkspaceToolContributions(workspace, operations);\n tools.push(defineTool({\n id: 'view.workspace.call', path: ['view', 'workspace', 'call'],\n title: 'Call View workspace API', summary: 'Call an operation on the running View workspace.',\n realm: 'host',\n argsSchema: toolJsonSchema({ type: 'object', properties: { operation: { type: 'string' }, args: { type: 'object' }, root: { type: 'string' } }, required: ['operation'], additionalProperties: false }),\n resultSchema: toolJsonSchema({}), inputSchema: { type: 'object' }, outputSchema: {}, evidence: [],\n }, (input, context) => workspace.call(createWorkspaceRequest((input as { operation: string }).operation, (input as { args?: Record<string, unknown> }).args ?? {}, {\n clientId: 'view-cli', token: workspace.accessToken,\n }), { signal: context.signal, caller: context.caller })));\n const revokeTools = toolApi ? registerTools(ctx, tools, {\n sourceId: 'view-workspace', module: '@forgeax/view-workspace-core/backend', realm: 'host',\n }) : undefined;\n const connection = ctx.get?.('hostTransport', false);\n const transport = connection && 'register' in connection ? connection : undefined;\n const unregister = transport ? workspace.registerTransport(transport, {\n routeThroughTools: Boolean(revokeTools),\n }) : undefined;\n ctx.provide('viewWorkspaceCore', workspace);\n ctx.provide('viewWorkspaceAccessToken', workspace.accessToken);\n ctx.effect(() => async () => { unregister?.(); await revokeTools?.(); await workspace.dispose(); });\n },\n};\nexport default viewWorkspaceCoreBackendPlugin;\n"],
5
- "mappings": ";;;;;;;;;;;;;AAMA,SAAS,qBAAqB;AAC9B,SAAS,YAAY,sBAAsB;AAIpC,IAAM,gCAAgC;AACtC,IAAM,6BAA6B;AAEnC,IAAM,iCAAiC;AAAA,EAC5C,MAAM;AAAA,EACN,QAAQ,CAAC,SAAS;AAAA,EAClB,SAAS,CAAC,qBAAqB,0BAA0B;AAAA,EACzD,MAAM,KAAc,SAAiC,CAAC,GAAG;AACvD,UAAM,YAAY,IAAI,oBAAoB;AAAA,MACxC,QAAQ,IAAI,MAAM,mBAAmB,KAAK;AAAA,MAC1C,SAAS,IAAI,MAAM,WAAW,KAAK;AAAA,MACnC,SAAS,MAAM,IAAI,MAAM,cAAc,KAAK,IAAI;AAAA,MAChD,aAAa,OAAO;AAAA,MACpB,WAAW,OAAO;AAAA,IACpB,CAAC;AACD,UAAM,UAAU,IAAI,MAAM,WAAW,KAAK;AAC1C,UAAM,aAAa,0BAA0B,0BAA0B,IAAI,gBAAc;AAAA,MACvF,IAAI,kBAAkB,SAAS;AAAA,MAC/B;AAAA,IACF,EAAE,CAAC;AACH,UAAM,QAA4B,iCAAiC,WAAW,UAAU;AACxF,UAAM,KAAK,WAAW;AAAA,MACpB,IAAI;AAAA,MAAuB,MAAM,CAAC,QAAQ,aAAa,MAAM;AAAA,MAC7D,OAAO;AAAA,MAA2B,SAAS;AAAA,MAC3C,OAAO;AAAA,MACP,YAAY,eAAe,EAAE,MAAM,UAAU,YAAY,EAAE,WAAW,EAAE,MAAM,SAAS,GAAG,MAAM,EAAE,MAAM,SAAS,GAAG,MAAM,EAAE,MAAM,SAAS,EAAE,GAAG,UAAU,CAAC,WAAW,GAAG,sBAAsB,MAAM,CAAC;AAAA,MACtM,cAAc,eAAe,CAAC,CAAC;AAAA,MAAG,aAAa,EAAE,MAAM,SAAS;AAAA,MAAG,cAAc,CAAC;AAAA,MAAG,UAAU,CAAC;AAAA,IAClG,GAAG,CAAC,OAAO,YAAY,UAAU,KAAK,uBAAwB,MAAgC,WAAY,MAA6C,QAAQ,CAAC,GAAG;AAAA,MACjK,UAAU;AAAA,MAAY,OAAO,UAAU;AAAA,IACzC,CAAC,GAAG,EAAE,QAAQ,QAAQ,QAAQ,QAAQ,QAAQ,OAAO,CAAC,CAAC,CAAC;AACxD,UAAM,cAAc,UAAU,cAAc,KAAK,OAAO;AAAA,MACtD,UAAU;AAAA,MAAkB,QAAQ;AAAA,MAAwC,OAAO;AAAA,IACrF,CAAC,IAAI;AACL,UAAM,aAAa,IAAI,MAAM,iBAAiB,KAAK;AACnD,UAAM,YAAY,cAAc,cAAc,aAAa,aAAa;AACxE,UAAM,aAAa,YAAY,UAAU,kBAAkB,WAAW;AAAA,MACpE,mBAAmB,QAAQ,WAAW;AAAA,IACxC,CAAC,IAAI;AACL,QAAI,QAAQ,qBAAqB,SAAS;AAC1C,QAAI,QAAQ,4BAA4B,UAAU,WAAW;AAC7D,QAAI,OAAO,MAAM,YAAY;AAAE,mBAAa;AAAG,YAAM,cAAc;AAAG,YAAM,UAAU,QAAQ;AAAA,IAAG,CAAC;AAAA,EACpG;AACF;AACA,IAAO,kBAAQ;",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
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 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 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) => changed({ busy: false, error: error instanceof Error ? error.message : String(error) });\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 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 // 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,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/cli-contributions.ts"],
4
- "sourcesContent": ["import type { ViewCliOptions } from '@forgeax/view-viewer/config';\nimport { contract } from './commands.ts';\nimport {\n createViewCliContributions as createProductCliContributions,\n VIEW_CLI_CONTRIBUTION_ID,\n} from '@forgeax/view-viewer/cli';\n\nimport { runViewProjectOpen } from './view-project-open.ts';\nimport {\n runViewStartInteractive,\n runViewStatus,\n runViewStop,\n} from './view-start.ts';\nimport { workspaceCoreCliContributions } from '@forgeax/view-workspace-core/cli';\n\nexport { VIEW_CLI_CONTRIBUTION_ID };\n\nexport function createViewHostCliContributions() {\n const executors = {\n start: runViewStartInteractive,\n status: runViewStatus,\n stop: runViewStop,\n projectOpen: runViewProjectOpen,\n };\n return Object.freeze(contract.commands.map(command => ({\n id: `forgeax.${command.id}`, path: command.path, summary: command.summary, ...('exportName' in command ? { run: executors[command.exportName] } : {}),\n })));\n}\n\nfunction hasWorkspaceCapabilities(options?: ViewCliOptions) {\n return Array.isArray(options?.capabilities) || (options?.capabilities !== undefined && 'operations' in options.capabilities && Array.isArray(options.capabilities.operations));\n}\n\nfunction filterCapabilities(contributions: typeof workspaceCoreCliContributions, options?: ViewCliOptions) {\n const declared = Array.isArray(options?.capabilities)\n ? options.capabilities\n : options?.capabilities && 'operations' in options.capabilities ? options.capabilities.operations : undefined;\n if (!Array.isArray(declared)) return contributions;\n const operations = new Set(declared);\n return contributions.filter(({ operation }) => operations.has(operation));\n}\n\n/** Compose package lifecycle and explicitly active workspace/product commands. */\nexport function createViewCliContributions(options?: ViewCliOptions) {\n return Object.freeze([\n ...createViewHostCliContributions(),\n ...(hasWorkspaceCapabilities(options)\n ? filterCapabilities(workspaceCoreCliContributions, options)\n : []),\n ...createProductCliContributions(options),\n ]);\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;AAiBO,SAAS,iCAAiC;AAC/C,QAAM,YAAY;AAAA,IAChB,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,aAAa;AAAA,EACf;AACA,SAAO,OAAO,OAAO,SAAS,SAAS,IAAI,cAAY;AAAA,IACrD,IAAI,WAAW,QAAQ,EAAE;AAAA,IAAI,MAAM,QAAQ;AAAA,IAAM,SAAS,QAAQ;AAAA,IAAS,GAAI,gBAAgB,UAAU,EAAE,KAAK,UAAU,QAAQ,UAAU,EAAE,IAAI,CAAC;AAAA,EACrJ,EAAE,CAAC;AACL;AAEA,SAAS,yBAAyB,SAA0B;AAC1D,SAAO,MAAM,QAAQ,SAAS,YAAY,KAAM,SAAS,iBAAiB,UAAa,gBAAgB,QAAQ,gBAAgB,MAAM,QAAQ,QAAQ,aAAa,UAAU;AAC9K;AAEA,SAAS,mBAAmB,eAAqD,SAA0B;AACzG,QAAM,WAAW,MAAM,QAAQ,SAAS,YAAY,IAChD,QAAQ,eACR,SAAS,gBAAgB,gBAAgB,QAAQ,eAAe,QAAQ,aAAa,aAAa;AACtG,MAAI,CAAC,MAAM,QAAQ,QAAQ,EAAG,QAAO;AACrC,QAAM,aAAa,IAAI,IAAI,QAAQ;AACnC,SAAO,cAAc,OAAO,CAAC,EAAE,UAAU,MAAM,WAAW,IAAI,SAAS,CAAC;AAC1E;AAGO,SAASA,4BAA2B,SAA0B;AACnE,SAAO,OAAO,OAAO;AAAA,IACnB,GAAG,+BAA+B;AAAA,IAClC,GAAI,yBAAyB,OAAO,IAChC,mBAAmB,+BAA+B,OAAO,IACzD,CAAC;AAAA,IACL,GAAG,2BAA8B,OAAO;AAAA,EAC1C,CAAC;AACH;",
6
- "names": ["createViewCliContributions"]
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../packages/view-plugin-display/src/tool-runtime.ts", "../../../packages/view-plugin-display/src/api.ts"],
4
- "sourcesContent": ["import type { ToolApi, ToolCallerIdentity, ToolRuntimeError, ToolSchema, ToolDescriptor } from '@forgeax/engine-tool-runtime';\nimport { defineTool } from '@forgeax/engine-tool-runtime';\n\nexport const VIEW_STATUS_OPERATION = 'view.display.status';\n\nfunction toolFailureError(failure: ToolRuntimeError) {\n const diagnostic =\n (typeof failure?.hint === 'string' && failure.hint.trim() !== '' ? failure.hint : undefined)\n ?? (typeof failure?.expected === 'string' && failure.expected.trim() !== '' ? failure.expected : undefined);\n const detail = failure.detail && typeof failure.detail === 'object' && !Array.isArray(failure.detail) ? failure.detail as Record<string, unknown> : {};\n return Object.assign(new Error(diagnostic ?? String(failure ?? 'view-status-provider-failed')), { name: 'ViewToolError', code: detail.code ?? detail.remoteCode ?? failure.code, expected: failure.expected, hint: failure.hint ?? diagnostic, detail: failure.detail ?? { failure } });\n}\n\nexport async function runViewToolApi(\n api: ToolApi,\n { operation, args = {}, caller, signal, providerId, generation }: { operation: string; args?: unknown; caller?: ToolCallerIdentity; signal?: AbortSignal; providerId?: string; generation?: number },\n) {\n const run = api.run(operation, args, {\n sourceId: 'view-backend',\n providerId,\n generation,\n caller,\n signal,\n });\n const terminal = await run.terminal;\n if (terminal.outcome === 'failed') throw toolFailureError(terminal.failure);\n return terminal.result;\n}\n\nexport function createViewStatusToolContributions(broker: { handshake: () => object | Promise<object> }, description: Pick<ToolDescriptor, \"id\" | \"path\" | \"title\" | \"summary\">) {\n const argsSchema: ToolSchema<object> = {\n parse(value) {\n return value === undefined || (value !== null && typeof value === 'object' && !Array.isArray(value))\n ? { ok: true, value: value ?? {} }\n : { ok: false, error: 'View status arguments must be an object' };\n },\n describe: 'JSON object accepted by the read-only View status operation.',\n };\n const resultSchema: ToolSchema<object> = {\n parse(value) {\n return value !== null && typeof value === 'object' && !Array.isArray(value)\n ? { ok: true, value }\n : { ok: false, error: 'View status result must be an object' };\n },\n describe: 'JSON object returned by the View status operation.',\n };\n return [\n defineTool<unknown, object>(\n {\n id: description.id,\n path: description.path,\n title: description.title,\n summary: description.summary,\n realm: 'host',\n argsSchema,\n resultSchema,\n inputSchema: { type: 'object' },\n outputSchema: { type: 'object' },\n evidence: [],\n },\n async () => broker.handshake(),\n ),\n ];\n}\n", "import type { ToolSchema } from '@forgeax/engine-tool-runtime';\nimport type { DisplayStatusInput } from './status.ts';\nexport type DisplayBindArgs = { root: null; runId?: string } | { root: string; runId: string };\nexport type DisplayService = { handshake: () => object | Promise<object>; bind?: (input: DisplayBindArgs) => DisplayStatusInput };\nimport { createViewStatusToolContributions } from './tool-runtime.ts';\nimport { defineTool, toolJsonSchema } from '@forgeax/engine-tool-runtime';\nexport const DISPLAY_STATUS_OPERATION_DESCRIPTION = Object.freeze({\n id: 'view.display.status',\n path: ['view', 'display', 'status'],\n title: 'View status',\n summary: 'Read the current View display and workspace status.',\n});\n\nconst bindingInput = {\n type: 'object',\n properties: { root: { type: ['string', 'null'] }, runId: { type: 'string', minLength: 1 } },\n required: ['root'], additionalProperties: false,\n};\nconst bindingArgs: ToolSchema<DisplayBindArgs> = {\n describe: JSON.stringify(bindingInput),\n parse(value: unknown) {\n const input = value as Partial<DisplayBindArgs> | null;\n const valid = value && typeof value === 'object' && !Array.isArray(value)\n && Object.keys(value).every(key => key === 'root' || key === 'runId')\n && (input?.root === null || (typeof input?.root === 'string' && input?.root.trim()\n && typeof input?.runId === 'string' && input?.runId.trim()));\n return valid ? { ok: true, value: value as DisplayBindArgs } : { ok: false, error: 'Provide root and exact runId, or null root to disconnect.' };\n },\n};\n\n/** API (Tool) contributions for the display product plugin. */\nexport function createDisplayApiTools(broker: DisplayService) {\n return [\n ...createViewStatusToolContributions(broker, DISPLAY_STATUS_OPERATION_DESCRIPTION),\n ...(broker.bind ? [defineTool<unknown, unknown>({\n id: 'view.display.bind', path: ['view', 'display', 'bind'], title: 'Bind observed run',\n summary: 'Observe one explicit Engine run independently of the Editor project; null root disconnects.',\n realm: 'host',\n argsSchema: bindingArgs,\n resultSchema: toolJsonSchema({ type: 'object' }), inputSchema: bindingInput, outputSchema: { type: 'object' }, evidence: [],\n }, args => broker.bind!(args as DisplayBindArgs))] : []),\n ];\n}\n"],
5
- "mappings": "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",
6
- "names": ["defineTool"]
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/plugins/product.ts"],
4
- "sourcesContent": ["import type { Context, Fiber } from '@forgeax/engine-plugin';\nimport type {} from '@forgeax/engine/devkit';\nimport type { HostRootDescriptor } from '@forgeax/engine-host/protocol';\nimport type { ToolJsonSchema, ToolSchema } from '@forgeax/engine-tool-runtime';\nimport type { ViewWorkspaceBroker } from '@forgeax/view-workspace-core/broker';\nimport type { ViewFrontendConfig } from '@forgeax/view-viewer/config';\nimport { workspaceDiagnosticRecord } from '@forgeax/view-workspace-core/command-error';\nexport type ViewProductConfig = { disabledPages?: readonly string[]; staticRoot?: string; frontendConfig?: Pick<ViewFrontendConfig, 'layout'>; frontend?: { root?: Partial<HostRootDescriptor>; module?: string } };\ntype LifecycleArgs = { root?: string; project?: string; frontendConfig?: Pick<ViewFrontendConfig, 'layout'> };\nimport { randomUUID } from 'node:crypto';\nimport { createRequire } from 'node:module';\nimport { dirname, join, resolve } from 'node:path';\nimport { existsSync } from 'node:fs';\nimport { createHostAssembly } from '@forgeax/engine-host/protocol';\nimport { defineTool, toolJsonSchema } from '@forgeax/engine-tool-runtime';\nimport { registerTools, startNativePlugin } from '@forgeax/engine-plugin';\nimport { createViewProductPlan, viewFrontendRoot, VIEW_FRONTEND_MODULE } from '@forgeax/view-viewer/catalog/shared';\nimport { VIEW_PRODUCT_BACKEND_CATALOG } from '@forgeax/view-viewer/catalog/backend';\nimport { startViewHostServer } from '@forgeax/view-workspace-core/resident';\n\nimport { openViewProject, viewProjectOpenError } from '../view-project-open.ts';\nimport { resolveProjectIntent, withProjectIntent } from '../view-start.ts';\nimport { viewStartFrontendConfigSchema } from '../commands.ts';\n\nconst ownerArgs = toolJsonSchema({ type: 'object', properties: { root: { type: 'string' } }, additionalProperties: false });\nconst startArgs = toolJsonSchema({ type: 'object', properties: {\n root: { type: 'string' }, project: { type: 'string' },\n frontendConfig: viewStartFrontendConfigSchema,\n}, additionalProperties: false });\nconst projectOpenSchema = {\n type: 'object',\n properties: { root: { type: 'string' }, project: { type: 'string' } },\n required: ['project'],\n additionalProperties: false,\n} satisfies ToolJsonSchema;\n\nfunction readWorkspaceCore(owner?: Context) {\n if (!owner || typeof owner.get !== 'function') return undefined;\n try {\n const value = owner.get('viewWorkspaceCore', false);\n return value && typeof value.openProject === 'function' && typeof value.snapshot === 'function' ? value : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction installedViewStaticRoot(projectRoot: string) {\n try {\n const pluginEntry = createRequire(join(projectRoot, 'forge.json')).resolve('@forgeax/view/plugin');\n const staticRoot = resolve(dirname(pluginEntry), '../viewer');\n return existsSync(join(staticRoot, 'index.html')) ? staticRoot : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction projectFailure(error: unknown) {\n const record = workspaceDiagnosticRecord(error);\n const hint = typeof record.hint === 'string' ? record.hint : typeof record.message === 'string' ? record.message : String(error);\n return {\n ok: false,\n error: {\n code: typeof record.code === 'string' ? record.code : 'view-project-open-failed',\n expected: typeof record.expected === 'string' ? record.expected : hint,\n hint,\n ...(record.detail === undefined ? {} : { detail: record.detail }),\n },\n };\n}\n\nfunction projectSuccess(body: Awaited<ReturnType<typeof openViewProject>>) {\n return {\n ok: true,\n value: {\n ok: true,\n alreadyOpen: body.alreadyOpen === true,\n ...(body.viewerUrl === undefined ? {} : { viewerUrl: body.viewerUrl }),\n project: body.project,\n projectTarget: body.projectTarget,\n },\n };\n}\n\n/** Installed on Engine's resident Host. View owns only its plugin Fibers and sockets. */\nexport default {\n name: 'forgeax.view',\n inject: ['devkitBackend', 'engineWorkspace', 'toolApi'],\n async apply(ctx: Context, config: ViewProductConfig = {}) {\n const { host } = ctx.devkitBackend;\n let fiber: Fiber | undefined;\n let server: Awaited<ReturnType<typeof startViewHostServer>> | undefined;\n let serverEffect: ReturnType<Context['effect']> | undefined;\n let failure: ReturnType<typeof failed> | undefined;\n const failed = (error: unknown) => {\n const record = workspaceDiagnosticRecord(error);\n return ({\n code: typeof record.code === 'string' ? record.code : 'view-cleanup-failed',\n expected: typeof record.expected === 'string' ? record.expected : 'View-owned contributions to finish cleanup',\n hint: typeof record.hint === 'string' ? record.hint : typeof record.message === 'string' ? record.message : String(error),\n cleanup: workspaceDiagnosticRecord(record.detail).cleanup ?? 'failed',\n }); };\n let workspaceCore: ViewWorkspaceBroker | undefined;\n let openAbort: AbortController | undefined;\n let sessionEpoch = 0;\n let queue: Promise<unknown> = Promise.resolve();\n const enqueue = <T>(execute: () => T | Promise<T>) => {\n const result = queue.then(execute);\n queue = result.catch(() => {});\n return result;\n };\n const status = () => failure ? { phase: 'failed', error: failure } : ({ phase: server ? 'ready' : 'stopped', ...(server ? { url: server.viewerUrl } : {}) });\n const stop = async () => {\n if (failure) throw new Error(`${failure.code}: ${failure.hint}`);\n sessionEpoch += 1;\n openAbort?.abort();\n openAbort = undefined;\n workspaceCore = undefined;\n try { await serverEffect?.(); await server?.close(); await fiber?.dispose(); }\n catch (error) { failure = failed(error); throw error; }\n fiber = undefined;\n server = undefined;\n return status();\n };\n const start = async (args: LifecycleArgs = {}) => {\n if (failure) throw new Error(`${failure.code}: ${failure.hint}`);\n const project = resolveProjectIntent(args.project === undefined ? [] : ['--project', args.project], ctx.devkitBackend.root);\n if (fiber) return withProjectIntent(status(), project);\n const token = randomUUID();\n const workspaceClient = { clientId: 'view-frontend', token, resourceBrowser: true };\n const layout = args.frontendConfig?.layout ?? config.frontendConfig?.layout;\n const frontendConfig: ViewFrontendConfig = {\n embedded: true,\n workspace: workspaceClient,\n ...(layout === undefined ? {} : { layout }),\n };\n const plan = createViewProductPlan({\n disabledPages: config.disabledPages,\n backendConfig: { workspaceAccessToken: token },\n frontendConfig,\n });\n const installation = {\n name: 'forgeax.view.product',\n provide: ['devkitWorkspaceFrontend'],\n async apply(owner: Context) {\n for (const component of plan.backend) {\n const record = VIEW_PRODUCT_BACKEND_CATALOG.get(component.module);\n if (!record) throw new Error(`View backend program is missing: ${component.module}`);\n const module = await record.load();\n await (await owner.plugin(module.default, component.config)).await();\n }\n const builtRoot = config.staticRoot ? undefined : installedViewStaticRoot(\n ctx.devkitBackend.hostPackageRoot ?? ctx.devkitBackend.root,\n );\n if (!config.staticRoot && !builtRoot) throw new Error('View UI is not built. Build or install the View package before starting it.');\n // The launcher is the parent fiber. Cordis get walks ancestors, so the\n // broker provided by this installation is read here and kept for the tool.\n workspaceCore = readWorkspaceCore(owner);\n const core = workspaceCore;\n serverEffect = owner.effect(async () => {\n const ownedServer = await startViewHostServer({\n backendHost: host,\n accessToken: token,\n staticRoot: config.staticRoot ?? builtRoot,\n frontendConfig,\n ...(core === undefined ? {} : {\n onClientConnect: () => core.resetPageSession(),\n onClientDisconnect: (caller) => core.revokeConnection(caller.connectionId),\n }),\n });\n server = ownedServer;\n return () => ownedServer.close();\n });\n await serverEffect;\n Object.assign(workspaceClient, { endpoint: server!.frontendEndpoint, frontendTicket: server!.frontendTicket });\n const frontendRoot = viewFrontendRoot(frontendConfig, plan.disabledPages);\n const assembly = createHostAssembly({ root: config.frontend ? { ...frontendRoot, ...config.frontend.root, config: frontendRoot.config } : frontendRoot });\n owner.provide('devkitWorkspaceFrontend', { assembly, module: config.frontend?.module ?? VIEW_FRONTEND_MODULE });\n const removeAdmission = host.transport.onClientConnect(caller => {\n if (caller.kind === 'frontend' && caller.sourceId === 'view-frontend') {\n host.bindProjection(caller, { assembly });\n }\n });\n owner.effect(() => removeAdmission);\n },\n };\n const started = await startNativePlugin(ctx, installation);\n if (!started.ok) {\n workspaceCore = undefined;\n if (workspaceDiagnosticRecord(started.error.detail).cleanup !== 'completed') failure = failed(started.error);\n else server = undefined;\n throw Object.assign(new Error(`${started.error.code}: ${started.error.hint}`), started.error);\n }\n fiber = started.value;\n return withProjectIntent(status(), project);\n };\n\n const openProject = async (args: LifecycleArgs = {}, epoch = sessionEpoch) => {\n const stopped = () => projectFailure(viewProjectOpenError(\n 'view-not-started',\n 'View has stopped. Run forgeax view start again when needed.',\n ));\n if (epoch !== sessionEpoch || !server || !workspaceCore) {\n return projectFailure(viewProjectOpenError(\n 'view-not-started',\n epoch !== sessionEpoch\n ? 'View has stopped. Run forgeax view start again when needed.'\n : 'Run forgeax backend start, then forgeax view start.',\n ));\n }\n const project = typeof args.project === 'string' ? args.project : '';\n const controller = new AbortController();\n openAbort = controller;\n try {\n if (epoch !== sessionEpoch || controller.signal.aborted) return stopped();\n const body = await openViewProject(workspaceCore, project, {\n signal: controller.signal,\n viewerUrl: server.viewerUrl,\n });\n if (epoch !== sessionEpoch || controller.signal.aborted) return stopped();\n return projectSuccess(body);\n } catch (error) {\n if (epoch !== sessionEpoch || controller.signal.aborted) return stopped();\n return projectFailure(error);\n } finally {\n if (openAbort === controller) openAbort = undefined;\n }\n };\n const lifecycleTool = (operation: string, execute: (args: LifecycleArgs) => unknown, { before, argsSchema = ownerArgs }: { before?: () => void; argsSchema?: ToolSchema<unknown> } = {}) => defineTool<unknown, unknown>({\n id: `view.${operation}`, path: ['view', operation], title: `View ${operation}`,\n summary: `${operation} the optional View interface on the existing Engine backend.`, realm: 'host',\n argsSchema, resultSchema: toolJsonSchema({ type: 'object' }), inputSchema: { type: 'object' }, outputSchema: { type: 'object' }, evidence: [],\n }, (args) => {\n before?.();\n return enqueue(() => execute(args as LifecycleArgs));\n });\n const tools = [\n lifecycleTool('start', start, { argsSchema: startArgs }),\n lifecycleTool('status', status),\n lifecycleTool('stop', stop, { before: () => { sessionEpoch += 1; openAbort?.abort(); } }),\n defineTool<unknown, unknown>({\n id: 'view.project.open',\n path: ['view', 'project', 'open'],\n title: 'Open View project',\n summary: 'Open an editor project on the running View and return its headed document URL.',\n realm: 'host',\n argsSchema: toolJsonSchema(projectOpenSchema),\n resultSchema: toolJsonSchema({ type: 'object' }),\n inputSchema: projectOpenSchema,\n outputSchema: { type: 'object' },\n evidence: [],\n }, (args) => {\n const epoch = sessionEpoch;\n return enqueue(() => openProject(args as LifecycleArgs, epoch));\n }),\n ];\n const revoke = registerTools(ctx, tools, { sourceId: 'view-launcher', module: '@forgeax/view/plugin', realm: 'host' });\n ctx.effect(() => async () => { await revoke(); await queue; await stop(); });\n },\n};\n"],
5
- "mappings": "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",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../packages/view-workspace-core/src/scene-selection.ts", "../../../packages/view-workspace-core/src/contract.ts"],
4
- "sourcesContent": ["import { type WorkspaceSceneSelection, requireWorkspaceString } from './contract.ts';\n\n/**\n * Workspace-authoritative scene entity selection (Inspector + Hierarchy + Viewport).\n * Orthogonal to asset catalog selection and `inspection` (asset.inspect metadata).\n */\nexport function serializeWorkspaceSceneSelection(sceneSelection: WorkspaceSceneSelection | null | undefined) {\n if (!sceneSelection?.primary) return null;\n const entityId = requireWorkspaceString(\n sceneSelection.primary.entityId,\n 'sceneSelection.primary.entityId',\n );\n return {\n ...(sceneSelection.targetId === undefined ? {} : { targetId: sceneSelection.targetId, targetGeneration: sceneSelection.targetGeneration }),\n primary: {\n entityId,\n ...(sceneSelection.primary.label === undefined\n ? {}\n : { label: String(sceneSelection.primary.label) }),\n },\n };\n}\n\nexport function createEmptySceneSelection() {\n return null;\n}\n", "import type { EngineWorkspaceTarget, EngineWorkspaceProject, EngineWorkspaceAsset, EngineWorkspaceCameraResult, EngineWorkspaceAssetBinding } from '@forgeax/engine/app';\nimport { createWorkspaceId } from './id.ts';\nimport { serializeWorkspaceSceneSelection } from './scene-selection.ts';\n\nexport type WorkspaceTarget = Partial<EngineWorkspaceTarget> & Pick<EngineWorkspaceTarget, 'targetId'>;\nexport type WorkspaceProject = EngineWorkspaceProject;\nexport type WorkspaceDdc = { state?: string; guid?: string; desiredKey?: string; receiptUrl?: string; hint?: string };\nexport type WorkspaceAsset = EngineWorkspaceAsset & {\n sourcePath?: string;\n sourceKind?: string; packageId?: string; packageUrl?: string; cookReceiptUrl?: string;\n label?: string; revision?: string; previewable?: boolean; ddc?: WorkspaceDdc;\n};\nexport type WorkspaceInspection = {\n guid?: string; kind?: string; asset?: WorkspaceAsset; source?: { path?: string; kind?: string; revision?: string };\n meta?: Record<string, unknown>; ddc?: WorkspaceDdc; revision?: string;\n};\nexport type WorkspaceSceneSelection = {\n targetId?: string; targetGeneration?: number; primary: { entityId: string; label?: string };\n};\nexport type WorkspaceResourceOpen = { asset: WorkspaceAsset; preview?: WorkspacePreview };\nexport type WorkspaceTab = { tabId: string; kind: string; selected: boolean; state?: string; width?: number; height?: number; target?: WorkspaceTarget | null; targetId?: string; run?: unknown };\nexport type WorkspaceRequest = { apiVersion: string; operation: string; clientId: string; requestId: string; args: Record<string, unknown>; token?: string };\nexport type WorkspacePreview = {\n target: WorkspaceTarget; asset?: WorkspaceAsset | null; assetBinding?: EngineWorkspaceAssetBinding;\n camera?: EngineWorkspaceCameraResult['camera']; cameraVersion?: number; interaction?: Pick<NonNullable<EngineWorkspaceCameraResult['interaction']>, 'interactionId'> | null;\n};\nexport type WorkspaceOpenRequest = {\n requestId: string; sequence: number; asset: WorkspaceAsset; preview?: WorkspacePreview;\n target?: WorkspaceTarget; inspection?: WorkspaceInspection;\n};\nexport type WorkspaceState = {\n apiVersion?: string; revision?: number; selectedTabId?: string | null; tabs?: readonly WorkspaceTab[];\n project?: WorkspaceProject | null; projectTarget?: WorkspaceTarget | null; assets?: readonly WorkspaceAsset[] | null;\n preview?: WorkspacePreview | null; previews?: readonly WorkspacePreview[]; editorPreview?: WorkspacePreview | null;\n play?: { target: WorkspaceTarget; phase?: string } | null; targetBinding?: string;\n inspection?: WorkspaceInspection | null; openRequest?: WorkspaceOpenRequest | null;\n resourceOpens?: Map<string, WorkspaceResourceOpen> | Record<string, WorkspaceResourceOpen>;\n sceneSelection?: WorkspaceSceneSelection | null; workspaceTargetLost?: boolean; projectPhase?: string; browserGeneration?: number;\n};\n\n/**\n * Public wire contract for the user workspace. The contract is deliberately\n * transport agnostic: the CLI and the browser client both send these calls to\n * the same Engine Host service. No command implementation lives in the\n * frontend.\n */\nexport const VIEW_WORKSPACE_API_VERSION = 'forgeax.view.workspace/1';\n\nexport const VIEW_WORKSPACE_SERVICES = Object.freeze({\n capabilities: 'forgeax.view.workspace.capabilities',\n call: 'forgeax.view.workspace.call',\n});\n\n/** Host service for Content Browser source preview. Not a workspace CLI operation. */\nexport const VIEW_FILE_GET_SERVICE = 'forgeax.view.file.get';\n\nexport const VIEW_WORKSPACE_STATE_TOPIC = 'forgeax.view.workspace.state';\n\nexport const VIEW_PAGE_TYPES = Object.freeze({\n editor: 'editor',\n display: 'display',\n plugins: 'plugins',\n material: 'material',\n mesh: 'mesh',\n texture: 'texture',\n asset: 'asset',\n});\n\nexport const VIEW_WORKSPACE_COOK_MODES = Object.freeze(['rebuild', 'cold-cook']);\n\nexport const VIEW_WORKSPACE_CORE_OPERATIONS = Object.freeze([\n 'tabs.get',\n 'tabs.select',\n 'scene.select',\n 'scene.pick',\n 'scene.clear',\n 'project.open',\n 'project.close',\n 'project.reopen',\n]);\n\nexport const VIEW_WORKSPACE_DOMAIN_OPERATIONS = Object.freeze([\n ...VIEW_WORKSPACE_CORE_OPERATIONS,\n 'display.bind', 'display.status',\n 'assets.list',\n 'asset.inspect',\n 'asset-source.rebuild',\n 'asset-source.cold-cook',\n 'asset.open',\n 'runtime-pack.inspect', 'runtime-pack.admit', 'runtime-pack.generate',\n 'runtime-pack.snapshot', 'runtime-pack.restore', 'runtime-pack.withdraw',\n 'runtime-pack.plugin-install', 'runtime-pack.plugin-inspect', 'runtime-pack.plugin-dispose',\n 'runtime-pack.prepare',\n 'play.start', 'play.ready', 'play.stop', 'target.control', 'target.select', 'target.pick', 'entity.highlight',\n 'preview.close',\n 'preview.capture',\n 'preview.resize',\n 'camera.get',\n 'camera.begin',\n 'camera.update',\n 'camera.commit',\n 'camera.abort',\n 'scene-tree.get',\n 'entity.inspect',\n 'entity.focus',\n 'run.start', 'run.status', 'run.reload', 'run.stop', 'run.capture', 'run.eval', 'run.find', 'run.focus', 'run.camera.get', 'run.camera.set', 'run.camera.release',\n]);\n\n// The CLI/help surface is derived from both ordinary workspace and inspector\n// plugin contributions. Inspector calls use their own Engine Host services.\nexport const VIEW_WORKSPACE_OPERATIONS = Object.freeze([\n ...VIEW_WORKSPACE_DOMAIN_OPERATIONS,\n 'plugins.sources',\n 'plugins.inspect',\n 'plugins.watch',\n]);\n\nexport const VIEW_DISPLAY_TAB_ID = 'forgeax-cli-display';\nexport const VIEW_WORKSPACE_TAB_ID = 'forgeax-user-workspace';\n\nconst OPERATION_SET = new Set(VIEW_WORKSPACE_OPERATIONS);\n\nconst OPAQUE_WORKSPACE_DIAGNOSTICS = new Set([\n 'the contribution executor to return a result',\n 'the producer operation to succeed',\n 'the workspace command to complete',\n 'Inspect the resident View workspace and retry.',\n 'Inspect the provider snapshot and retry.',\n 'Inspect detail and repair the owning producer before retrying.',\n 'Inspect the browser page failure details.',\n 'Inspect the Engine command or tool result.',\n 'Refresh the inspector source and retry.',\n 'the View workspace provider to complete the operation',\n 'the View API provider to complete the operation',\n]);\n\nexport function isOpaqueWorkspaceDiagnostic(value: unknown) {\n if (typeof value !== 'string') return true;\n const text = value.trim();\n if (text === '') return true;\n if (OPAQUE_WORKSPACE_DIAGNOSTICS.has(text)) return true;\n if (/^the browser workspace operation \\S+ to complete$/.test(text)) return true;\n if (/^(?:workspace|inspector) operation \\S+ to complete$/.test(text)) return true;\n if (/^Engine .+ to succeed$/.test(text)) return true;\n return false;\n}\n\nfunction workspaceErrorMessage(code: string, expected: string | undefined, hint: string | undefined) {\n const parts: string[] = [];\n for (const value of [expected, hint]) {\n if (typeof value !== 'string') continue;\n const text = value.trim();\n if (!text || parts.includes(text)) continue;\n parts.push(text);\n }\n const real = parts.filter((text) => !isOpaqueWorkspaceDiagnostic(text));\n const chosen = real.length > 0 ? real : parts;\n return chosen.length > 0 ? `${code}: ${chosen.join(' \u2014 ')}` : String(code ?? 'view-workspace-error');\n}\n\nexport class ViewWorkspaceError extends Error {\n declare readonly code: string;\n declare readonly expected: string | undefined;\n declare readonly hint: string | undefined;\n declare readonly detail: Record<string, unknown>;\n constructor(code: string, expected: string | undefined, hint: string | undefined, detail: Record<string, unknown> = {}) {\n super(workspaceErrorMessage(code, expected, hint));\n this.name = 'ViewWorkspaceError';\n this.code = code;\n this.expected = expected;\n this.hint = hint;\n this.detail = detail;\n }\n}\n\nexport function workspaceError(code: string, expected: string | undefined, hint: string | undefined, detail: Record<string, unknown> = {}) {\n return new ViewWorkspaceError(code, expected, hint, detail);\n}\n\nexport function requireWorkspaceString(value: unknown, field: string) {\n if (typeof value !== 'string' || value.trim() === '') {\n throw workspaceError(\n 'view-workspace-invalid-args',\n `${field} to be a non-empty string`,\n `Provide a non-empty ${field}.`,\n { field },\n );\n }\n return value;\n}\n\nexport function requireWorkspaceObject(value: unknown, field: string) {\n if (value === null || typeof value !== 'object' || Array.isArray(value)) {\n throw workspaceError(\n 'view-workspace-invalid-args',\n `${field} to be an object`,\n `Provide an object for ${field}.`,\n { field },\n );\n }\n return value as Record<string, unknown>;\n}\n\nexport function requireWorkspaceInteger(value: unknown, field: string, { min = 0 } = {}) {\n if (typeof value !== 'number' || !Number.isSafeInteger(value) || value < min) {\n throw workspaceError(\n 'view-workspace-invalid-args',\n `${field} to be an integer >= ${min}`,\n `Provide a valid ${field}.`,\n { field, min },\n );\n }\n return value;\n}\n\nexport function cloneWorkspaceValue<T>(value: T): T {\n if (value === undefined) return value;\n return JSON.parse(JSON.stringify(value));\n}\n\nexport function jsonUnchanged(left: unknown, right: unknown) {\n if (left === right) return true;\n if (left == null || right == null) return left === right;\n return JSON.stringify(left) === JSON.stringify(right);\n}\n\nfunction omitUiTelemetry(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(omitUiTelemetry);\n if (!value || typeof value !== 'object') return value;\n const next: Record<string, unknown> = {};\n for (const [key, nested] of Object.entries(value)) {\n if (key === 'frameId' || key === 'cameraVersion' || key === 'interaction' || key === 'inputVersion') continue;\n if (key === 'camera' && nested && typeof nested === 'object' && !Array.isArray(nested)) {\n if ('control' in nested && nested.control !== undefined) next.camera = { control: nested.control };\n continue;\n }\n next[key] = omitUiTelemetry(nested);\n }\n return next;\n}\n\n/**\n * Stable UI identity for a workspace snapshot. Omits per-frame telemetry so\n * camera orbit, submitted frame ids, play input versions, and revision bumps\n * do not rebuild panels. Nested `tabs[].target.frameId` is included in the walk.\n */\nexport function workspaceUiFingerprint(state: WorkspaceState | null | undefined) {\n if (!state) return '';\n const { revision: _revision, ...rest } = state;\n return JSON.stringify(omitUiTelemetry(rest));\n}\n\nexport function createWorkspaceRequest(operation: string, args: Record<string, unknown> = {}, { clientId, token, requestId }: { clientId?: string; token?: string; requestId?: string } = {}) {\n if (!OPERATION_SET.has(operation)) {\n throw workspaceError(\n 'view-workspace-operation-unknown',\n 'operation to be present in the View workspace API',\n 'Refresh the workspace API capabilities and use a supported operation.',\n { operation },\n );\n }\n const request: WorkspaceRequest = {\n apiVersion: VIEW_WORKSPACE_API_VERSION,\n operation,\n clientId: requireWorkspaceString(clientId, 'clientId'),\n requestId: requestId === undefined ? createWorkspaceId('request') : requireWorkspaceString(requestId, 'requestId'),\n args: requireWorkspaceObject(args, 'args'),\n };\n if (token !== undefined) request.token = requireWorkspaceString(token, 'token');\n return Object.freeze(request);\n}\n\nexport function assertWorkspaceRequest(value: unknown) {\n const request = requireWorkspaceObject(value, 'request');\n if (request.apiVersion !== VIEW_WORKSPACE_API_VERSION) {\n throw workspaceError(\n 'view-workspace-version-mismatch',\n `API version ${VIEW_WORKSPACE_API_VERSION}`,\n 'Install a matching View workspace client.',\n { actual: request.apiVersion, expected: VIEW_WORKSPACE_API_VERSION },\n );\n }\n if (typeof request.operation !== 'string' || !OPERATION_SET.has(request.operation)) {\n throw workspaceError(\n 'view-workspace-operation-unknown',\n 'operation to be present in the View workspace API',\n 'Refresh the workspace API capabilities and use a supported operation.',\n { operation: request.operation },\n );\n }\n requireWorkspaceString(request.clientId, 'clientId');\n requireWorkspaceString(request.requestId, 'requestId');\n requireWorkspaceObject(request.args, 'args');\n return request as WorkspaceRequest;\n}\n\nexport function workspaceCapabilities({\n ready = true,\n headed = ready,\n reason,\n code,\n operations = VIEW_WORKSPACE_OPERATIONS,\n}: { ready?: boolean; headed?: boolean; reason?: unknown; code?: unknown; operations?: readonly string[] } = {}) {\n return {\n apiVersion: VIEW_WORKSPACE_API_VERSION,\n ready: Boolean(ready),\n headed: Boolean(headed),\n operations: [...operations],\n ...(reason === undefined ? {} : { reason: String(reason) }),\n ...(code === undefined ? {} : { code: String(code) }),\n };\n}\n\nexport function serializeWorkspaceTarget(target: WorkspaceTarget): WorkspaceTarget;\nexport function serializeWorkspaceTarget(target: null | undefined): null;\nexport function serializeWorkspaceTarget(target: WorkspaceTarget | null | undefined): WorkspaceTarget | null;\nexport function serializeWorkspaceTarget(target: WorkspaceTarget | null | undefined): WorkspaceTarget | null {\n if (!target) return null;\n requireWorkspaceString(target.targetId, 'target.targetId');\n return {\n targetId: target.targetId,\n ...(target.generation === undefined ? {} : { generation: target.generation }),\n ...(target.sessionId === undefined ? {} : { sessionId: String(target.sessionId) }),\n ...(target.worldId === undefined ? {} : { worldId: String(target.worldId) }),\n headed: target.headed === true,\n ...(target.frameId === undefined ? {} : { frameId: target.frameId }),\n ...(target.width === undefined ? {} : { width: target.width }),\n ...(target.height === undefined ? {} : { height: target.height }),\n ...(target.url === undefined ? {} : { url: String(target.url) }),\n ...(target.surface === undefined || typeof target.surface !== 'string'\n ? {}\n : { surface: target.surface }),\n };\n}\n\nexport function serializeWorkspaceProject(project: WorkspaceProject | null | undefined) {\n if (!project) return null;\n requireWorkspaceString(project.id, 'project.id');\n requireWorkspaceString(project.root, 'project.root');\n return {\n id: project.id,\n root: project.root,\n ...(project.name === undefined ? {} : { name: String(project.name) }),\n ...(project.revision === undefined ? {} : { revision: String(project.revision) }),\n };\n}\n\nexport function serializeWorkspaceAsset(asset: WorkspaceAsset) {\n requireWorkspaceString(asset.guid, 'asset.guid');\n requireWorkspaceString(asset.kind, 'asset.kind');\n return {\n guid: asset.guid,\n kind: asset.kind,\n ...(asset.name === undefined ? {} : { name: String(asset.name) }),\n ...(asset.sourceKey === undefined ? {} : { sourceKey: String(asset.sourceKey) }),\n ...(asset.path === undefined ? {} : { path: String(asset.path) }),\n ...(asset.sourcePath === undefined ? {} : { sourcePath: String(asset.sourcePath) }),\n ...(asset.sourceKind === undefined ? {} : { sourceKind: String(asset.sourceKind) }),\n ...(asset.packageId === undefined ? {} : { packageId: String(asset.packageId) }),\n ...(asset.packageUrl === undefined ? {} : { packageUrl: String(asset.packageUrl) }),\n ...(asset.cookReceiptUrl === undefined ? {} : { cookReceiptUrl: String(asset.cookReceiptUrl) }),\n ...(asset.label === undefined ? {} : { label: String(asset.label) }),\n ...(asset.revision === undefined ? {} : { revision: String(asset.revision) }),\n ...(asset.previewable === undefined ? {} : { previewable: Boolean(asset.previewable) }),\n ...(serializeWorkspaceDdc(asset.ddc) === undefined ? {} : { ddc: serializeWorkspaceDdc(asset.ddc) }),\n };\n}\n\nexport function serializeWorkspaceDdc(ddc: WorkspaceDdc | null | undefined) {\n if (!ddc || typeof ddc !== 'object' || Array.isArray(ddc)) return undefined;\n const state = ddc.state === undefined ? undefined : String(ddc.state);\n return cloneWorkspaceValue({\n ...(state === undefined ? {} : { state }),\n ...(ddc.guid === undefined ? {} : { guid: String(ddc.guid) }),\n ...(ddc.desiredKey === undefined ? {} : { desiredKey: String(ddc.desiredKey) }),\n ...(ddc.receiptUrl === undefined ? {} : { receiptUrl: String(ddc.receiptUrl) }),\n ...(ddc.hint === undefined ? {} : { hint: String(ddc.hint) }),\n });\n}\n\nexport function serializeWorkspaceOpenRequest(request: WorkspaceOpenRequest): WorkspaceOpenRequest;\nexport function serializeWorkspaceOpenRequest(request: null | undefined): null;\nexport function serializeWorkspaceOpenRequest(request: WorkspaceOpenRequest | null | undefined): WorkspaceOpenRequest | null;\nexport function serializeWorkspaceOpenRequest(request: WorkspaceOpenRequest | null | undefined): WorkspaceOpenRequest | null {\n if (!request) return null;\n requireWorkspaceString(request.requestId, 'openRequest.requestId');\n requireWorkspaceInteger(request.sequence, 'openRequest.sequence', { min: 1 });\n const asset = serializeWorkspaceAsset(request.asset);\n const previewTarget = request.preview?.target ?? request.target;\n const previewAsset = request.preview?.asset ?? (previewTarget ? asset : undefined);\n return {\n requestId: request.requestId,\n sequence: request.sequence,\n asset,\n ...(previewTarget\n ? {\n preview: {\n asset: previewAsset ? serializeWorkspaceAsset(previewAsset) : asset,\n target: serializeWorkspaceTarget(previewTarget),\n },\n }\n : {}),\n ...(request.inspection\n ? { inspection: serializeWorkspaceInspection(request.inspection) }\n : {}),\n };\n}\n\nexport function serializeWorkspaceResourceOpens(opens: WorkspaceState['resourceOpens']) {\n if (!opens || typeof opens !== 'object') return undefined;\n const entries = opens instanceof Map ? [...opens.entries()] : Object.entries(opens);\n const serialized: Record<string, { asset: WorkspaceAsset; preview?: WorkspacePreview }> = {};\n for (const [kind, entry] of entries) {\n if (typeof kind !== 'string' || !entry?.asset) continue;\n const asset = serializeWorkspaceAsset(entry.asset);\n const previewTarget = entry.preview?.target;\n serialized[kind] = {\n asset,\n ...(previewTarget\n ? {\n preview: {\n asset: serializeWorkspaceAsset(entry.preview?.asset ?? asset),\n target: serializeWorkspaceTarget(previewTarget),\n },\n }\n : {}),\n };\n }\n return serialized;\n}\n\nexport function workspaceInspectionFactRows(inspection: WorkspaceInspection | null | undefined) {\n if (!inspection || typeof inspection !== 'object' || Array.isArray(inspection)) {\n return Object.freeze([]);\n }\n const asset: Partial<WorkspaceAsset> = inspection.asset && typeof inspection.asset === 'object' ? inspection.asset : {};\n const rows: { label: string; value: string }[] = [];\n const add = (label: string, value: unknown) => {\n if (value === undefined || value === null) return;\n if (typeof value === 'string' && value.trim() === '') return;\n rows.push(\n Object.freeze({\n label,\n value: typeof value === 'object' ? JSON.stringify(value) : String(value),\n }),\n );\n };\n add('GUID', inspection.guid ?? asset.guid);\n add('Kind', asset.kind);\n add('Name', asset.name);\n add('Path', asset.path);\n add('Source', inspection.source?.path ?? asset.sourcePath);\n add('Revision', inspection.revision ?? asset.revision ?? inspection.source?.revision);\n add('Package', asset.packageId ?? asset.packageUrl);\n if (inspection.ddc?.state) add('DDC', inspection.ddc.state);\n const meta = inspection.meta;\n if (meta && typeof meta === 'object' && !Array.isArray(meta)) {\n for (const [key, value] of Object.entries(meta)) add(key, value);\n }\n return Object.freeze(rows);\n}\n\nexport function serializeWorkspaceInspection(inspection: WorkspaceInspection): WorkspaceInspection;\nexport function serializeWorkspaceInspection(inspection: null | undefined): null;\nexport function serializeWorkspaceInspection(inspection: WorkspaceInspection | null | undefined): WorkspaceInspection | null;\nexport function serializeWorkspaceInspection(inspection: WorkspaceInspection | null | undefined): WorkspaceInspection | null {\n if (!inspection) return null;\n const guid = requireWorkspaceString(inspection.guid ?? inspection.asset?.guid, 'inspection.guid');\n const asset = serializeWorkspaceAsset({\n ...inspection.asset,\n guid,\n kind: requireWorkspaceString(inspection.asset?.kind ?? inspection.kind, 'inspection.kind'),\n });\n const source = inspection.source;\n return {\n guid,\n asset,\n ...(source === undefined || source === null\n ? {}\n : {\n source: {\n ...(source.path === undefined ? {} : { path: String(source.path) }),\n ...(source.kind === undefined ? {} : { kind: String(source.kind) }),\n ...(source.revision === undefined ? {} : { revision: String(source.revision) }),\n },\n }),\n ...(inspection.meta !== null && typeof inspection.meta === 'object' && !Array.isArray(inspection.meta)\n ? { meta: cloneWorkspaceValue(inspection.meta) }\n : {}),\n ...(serializeWorkspaceDdc(inspection.ddc) === undefined\n ? {}\n : { ddc: serializeWorkspaceDdc(inspection.ddc) }),\n ...(inspection.revision === undefined ? {} : { revision: String(inspection.revision) }),\n };\n}\n\nexport function serializeWorkspaceState(state: WorkspaceState): WorkspaceState {\n return cloneWorkspaceValue({\n apiVersion: VIEW_WORKSPACE_API_VERSION,\n revision: state.revision,\n selectedTabId: state.selectedTabId,\n tabs: state.tabs,\n project: serializeWorkspaceProject(state.project),\n projectTarget: serializeWorkspaceTarget(state.projectTarget),\n assets: Array.isArray(state.assets) ? state.assets.map((asset) => serializeWorkspaceAsset(asset)) : null,\n preview: state.preview\n ? {\n asset: state.preview.asset ? serializeWorkspaceAsset(state.preview.asset) : null,\n target: serializeWorkspaceTarget(state.preview.target),\n assetBinding: state.preview.assetBinding,\n camera: state.preview.camera,\n cameraVersion: state.preview.cameraVersion,\n interaction: state.preview.interaction\n ? { interactionId: state.preview.interaction.interactionId }\n : null,\n }\n : null,\n previews: (state.previews ?? []).map(preview => ({ target: serializeWorkspaceTarget(preview.target), asset: preview.asset ? serializeWorkspaceAsset(preview.asset) : null, assetBinding: preview.assetBinding })),\n editorPreview: state.editorPreview ? { target: serializeWorkspaceTarget(state.editorPreview.target), asset: state.editorPreview.asset ? serializeWorkspaceAsset(state.editorPreview.asset) : null, assetBinding: state.editorPreview.assetBinding } : null,\n play: state.play ? { target: serializeWorkspaceTarget(state.play.target), phase: state.play.phase } : null,\n targetBinding: state.targetBinding ?? 'editor',\n inspection: serializeWorkspaceInspection(state.inspection),\n openRequest: serializeWorkspaceOpenRequest(state.openRequest),\n resourceOpens: serializeWorkspaceResourceOpens(state.resourceOpens),\n sceneSelection: serializeWorkspaceSceneSelection(state.sceneSelection),\n workspaceTargetLost: state.workspaceTargetLost === true,\n ...(state.projectPhase === undefined ? {} : { projectPhase: state.projectPhase }),\n ...(state.browserGeneration === undefined ? {} : { browserGeneration: state.browserGeneration }),\n });\n}\n"],
5
- "mappings": "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",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../packages/view-workspace-core/src/tool-runtime.ts"],
4
- "sourcesContent": ["import type { ToolApi, ToolApiRunOptions, ToolRuntimeError, ToolSchema, JsonValue } from '@forgeax/engine-tool-runtime';\nimport type { WorkspaceRequest } from './contract.ts';\nimport type { ViewWorkspaceBroker } from './broker.ts';\nimport { workspaceDiagnosticRecord } from './command-error.ts';\nexport type WorkspaceOperation = { id: string; operation?: string; path?: readonly string[]; title?: string; summary?: string };\nimport { defineTool, toolJsonSchema } from '@forgeax/engine-tool-runtime';\n\nimport {\n VIEW_WORKSPACE_API_VERSION,\n ViewWorkspaceError,\n cloneWorkspaceValue,\n workspaceError,\n} from './contract.ts';\n\nfunction safeClone<T>(value: T) {\n try {\n return cloneWorkspaceValue(value);\n } catch {\n return null;\n }\n}\n\nfunction toolFailureError(failure: ToolRuntimeError) {\n const detail = workspaceDiagnosticRecord(failure?.detail);\n const code = [detail?.code, detail?.remoteCode].find(\n (candidate) => typeof candidate === 'string' && candidate.startsWith('view-'),\n );\n const payload = detail?.payload ?? detail?.detail;\n const diagnostic =\n (typeof failure?.hint === 'string' && failure.hint.trim() !== '' ? failure.hint : undefined)\n ?? (typeof failure?.expected === 'string' && failure.expected.trim() !== '' ? failure.expected : undefined)\n ?? (failure === undefined || failure === null ? undefined : String(failure));\n if (typeof code === 'string') {\n return workspaceError(\n code,\n typeof detail.expected === 'string' ? detail.expected : failure.expected,\n typeof detail.hint === 'string' ? detail.hint : diagnostic,\n {\n failure: safeClone(failure) ?? { failure },\n ...(payload && typeof payload === 'object' ? { cause: payload } : {}),\n },\n );\n }\n return workspaceError(\n 'view-workspace-provider-failed',\n typeof failure?.expected === 'string' ? failure.expected : diagnostic,\n diagnostic,\n { failure: safeClone(failure) ?? { failure } },\n );\n}\n\nexport async function runWorkspaceToolApi(\n api: ToolApi,\n {\n operation,\n args,\n clientId,\n token,\n requestId,\n caller,\n signal,\n providerId,\n generation,\n sourceId = 'view-backend',\n apiVersion = VIEW_WORKSPACE_API_VERSION,\n }: ToolApiRunOptions & { operation: string; args?: Record<string, unknown>; clientId: string; token?: string; requestId?: string; apiVersion?: string },\n) {\n const run = api.run(\n operation,\n {\n apiVersion,\n operation,\n ...args,\n args,\n clientId,\n token,\n requestId,\n },\n { sourceId, providerId, generation, caller, signal },\n );\n const terminal = await run.terminal;\n if (terminal.outcome === 'failed') throw toolFailureError(terminal.failure);\n return terminal.result;\n}\n\nexport function defineWorkspaceOperations(operations: readonly WorkspaceOperation[]) {\n return Object.freeze(\n operations.map((operation) =>\n Object.freeze({\n path: operation.id.split('.'),\n title: operation.id,\n summary: `View workspace operation ${operation.id}.`,\n ...operation,\n }),\n ),\n );\n}\n\nexport function createWorkspaceToolContributions(workspace: Pick<ViewWorkspaceBroker, 'call'>, operations: ReturnType<typeof defineWorkspaceOperations>) {\n const schema: ToolSchema<unknown> = {\n parse(value: unknown) {\n return value !== null && typeof value === 'object' && !Array.isArray(value)\n ? { ok: true, value: value as WorkspaceRequest }\n : { ok: false, error: 'workspace API arguments must be an object' };\n },\n describe: 'JSON object accepted by the View workspace operation.',\n };\n return operations.map((description) =>\n defineTool(\n {\n id: description.id,\n path: description.path,\n title: description.title,\n summary: description.summary,\n realm: 'host',\n argsSchema: schema,\n resultSchema: toolJsonSchema({}),\n inputSchema: { type: 'object' },\n outputSchema: {},\n evidence: [],\n },\n async (input, context) => {\n const envelope = input as WorkspaceRequest;\n try {\n return safeClone(\n await workspace.call(\n {\n apiVersion: VIEW_WORKSPACE_API_VERSION,\n operation: description.operation ?? description.id,\n clientId: envelope.clientId,\n requestId: envelope.requestId,\n args: envelope.args,\n ...(envelope.token === undefined ? {} : { token: envelope.token }),\n },\n { signal: context.signal, caller: context.caller },\n ),\n );\n } catch (error) {\n if (error instanceof ViewWorkspaceError) {\n return {\n ok: false,\n error: {\n code: error.code,\n expected: error.expected,\n hint: error.hint,\n detail: safeClone(error.detail) as JsonValue,\n },\n };\n }\n throw error;\n }\n },\n ),\n );\n}\n"],
5
- "mappings": "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",
6
- "names": []
7
- }