@ifc-lite/viewer 1.17.3 → 1.17.6

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 (530) hide show
  1. package/.turbo/turbo-build.log +39 -30
  2. package/.turbo/turbo-typecheck.log +1 -1
  3. package/CHANGELOG.md +132 -0
  4. package/DESKTOP_CONTRACT_VERSION +1 -0
  5. package/dist/assets/arrow-CZ5kQ26f.js +20 -0
  6. package/dist/assets/basketViewActivator-86rgogji.js +1 -0
  7. package/dist/assets/{bcf-D5-QWGO9.js → bcf-DOG9_WPX.js} +1 -1
  8. package/dist/assets/{browser-CKs-FY1P.js → browser-C5TFR7sH.js} +1 -1
  9. package/dist/assets/cesium-ADbP7waU.css +1 -0
  10. package/dist/assets/cesium-DUOzBlqv.js +17817 -0
  11. package/dist/assets/drawing-2d-DoxKMqbO.js +257 -0
  12. package/dist/assets/{exporters-C_6J153K.js → exporters-CcPS9MK5.js} +2898 -2380
  13. package/dist/assets/geometry.worker-BFUYA08u.js +1 -0
  14. package/dist/assets/ids-DQ5jY0E8.js +1 -0
  15. package/dist/assets/ifc-lite_bg-BINvzoCP.wasm +0 -0
  16. package/dist/assets/{index-jhBr1wbn.js → index-Bfms9I4A.js} +41036 -34613
  17. package/dist/assets/index-_bfZsDCC.css +1 -0
  18. package/dist/assets/{maplibre-gl-BpvwNKKy.js → maplibre-gl-CGLcoNXc.js} +1 -1
  19. package/dist/assets/native-bridge-DUyLCMZS.js +429 -0
  20. package/dist/assets/{sandbox-B79eavQ3.js → sandbox-C8575tul.js} +4342 -4324
  21. package/dist/assets/{server-client-D3bUPJJc.js → server-client-BuZK7OST.js} +4 -4
  22. package/dist/assets/tauri-core-stub-D8Fa-u43.js +1 -0
  23. package/dist/assets/tauri-dialog-stub-r7Wksg7o.js +1 -0
  24. package/dist/assets/tauri-fs-stub-BdeRC7aK.js +1 -0
  25. package/dist/assets/wasm-bridge-JsqEGDV8.js +1 -0
  26. package/dist/assets/{zip-B-jFFAGa.js → zip-DBEtpeu6.js} +3 -3
  27. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_0.json +1 -0
  28. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_1.json +1 -0
  29. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_10.json +1 -0
  30. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_11.json +1 -0
  31. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_12.json +1 -0
  32. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_13.json +1 -0
  33. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_14.json +1 -0
  34. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_15.json +1 -0
  35. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_16.json +1 -0
  36. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_17.json +1 -0
  37. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_18.json +1 -0
  38. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_19.json +1 -0
  39. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_2.json +1 -0
  40. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_20.json +1 -0
  41. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_21.json +1 -0
  42. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_22.json +1 -0
  43. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_23.json +1 -0
  44. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_24.json +1 -0
  45. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_25.json +1 -0
  46. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_26.json +1 -0
  47. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_27.json +1 -0
  48. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_3.json +1 -0
  49. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_4.json +1 -0
  50. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_5.json +1 -0
  51. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_6.json +1 -0
  52. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_7.json +1 -0
  53. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_8.json +1 -0
  54. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_9.json +1 -0
  55. package/dist/cesium/Assets/Images/bing_maps_credit.png +0 -0
  56. package/dist/cesium/Assets/Images/cesium_credit.png +0 -0
  57. package/dist/cesium/Assets/Images/google_earth_credit.png +0 -0
  58. package/dist/cesium/Assets/Images/ion-credit.png +0 -0
  59. package/dist/cesium/Assets/Textures/LensFlare/DirtMask.jpg +0 -0
  60. package/dist/cesium/Assets/Textures/LensFlare/StarBurst.jpg +0 -0
  61. package/dist/cesium/Assets/Textures/NaturalEarthII/0/0/0.jpg +0 -0
  62. package/dist/cesium/Assets/Textures/NaturalEarthII/0/1/0.jpg +0 -0
  63. package/dist/cesium/Assets/Textures/NaturalEarthII/1/0/0.jpg +0 -0
  64. package/dist/cesium/Assets/Textures/NaturalEarthII/1/0/1.jpg +0 -0
  65. package/dist/cesium/Assets/Textures/NaturalEarthII/1/1/0.jpg +0 -0
  66. package/dist/cesium/Assets/Textures/NaturalEarthII/1/1/1.jpg +0 -0
  67. package/dist/cesium/Assets/Textures/NaturalEarthII/1/2/0.jpg +0 -0
  68. package/dist/cesium/Assets/Textures/NaturalEarthII/1/2/1.jpg +0 -0
  69. package/dist/cesium/Assets/Textures/NaturalEarthII/1/3/0.jpg +0 -0
  70. package/dist/cesium/Assets/Textures/NaturalEarthII/1/3/1.jpg +0 -0
  71. package/dist/cesium/Assets/Textures/NaturalEarthII/2/0/0.jpg +0 -0
  72. package/dist/cesium/Assets/Textures/NaturalEarthII/2/0/1.jpg +0 -0
  73. package/dist/cesium/Assets/Textures/NaturalEarthII/2/0/2.jpg +0 -0
  74. package/dist/cesium/Assets/Textures/NaturalEarthII/2/0/3.jpg +0 -0
  75. package/dist/cesium/Assets/Textures/NaturalEarthII/2/1/0.jpg +0 -0
  76. package/dist/cesium/Assets/Textures/NaturalEarthII/2/1/1.jpg +0 -0
  77. package/dist/cesium/Assets/Textures/NaturalEarthII/2/1/2.jpg +0 -0
  78. package/dist/cesium/Assets/Textures/NaturalEarthII/2/1/3.jpg +0 -0
  79. package/dist/cesium/Assets/Textures/NaturalEarthII/2/2/0.jpg +0 -0
  80. package/dist/cesium/Assets/Textures/NaturalEarthII/2/2/1.jpg +0 -0
  81. package/dist/cesium/Assets/Textures/NaturalEarthII/2/2/2.jpg +0 -0
  82. package/dist/cesium/Assets/Textures/NaturalEarthII/2/2/3.jpg +0 -0
  83. package/dist/cesium/Assets/Textures/NaturalEarthII/2/3/0.jpg +0 -0
  84. package/dist/cesium/Assets/Textures/NaturalEarthII/2/3/1.jpg +0 -0
  85. package/dist/cesium/Assets/Textures/NaturalEarthII/2/3/2.jpg +0 -0
  86. package/dist/cesium/Assets/Textures/NaturalEarthII/2/3/3.jpg +0 -0
  87. package/dist/cesium/Assets/Textures/NaturalEarthII/2/4/0.jpg +0 -0
  88. package/dist/cesium/Assets/Textures/NaturalEarthII/2/4/1.jpg +0 -0
  89. package/dist/cesium/Assets/Textures/NaturalEarthII/2/4/2.jpg +0 -0
  90. package/dist/cesium/Assets/Textures/NaturalEarthII/2/4/3.jpg +0 -0
  91. package/dist/cesium/Assets/Textures/NaturalEarthII/2/5/0.jpg +0 -0
  92. package/dist/cesium/Assets/Textures/NaturalEarthII/2/5/1.jpg +0 -0
  93. package/dist/cesium/Assets/Textures/NaturalEarthII/2/5/2.jpg +0 -0
  94. package/dist/cesium/Assets/Textures/NaturalEarthII/2/5/3.jpg +0 -0
  95. package/dist/cesium/Assets/Textures/NaturalEarthII/2/6/0.jpg +0 -0
  96. package/dist/cesium/Assets/Textures/NaturalEarthII/2/6/1.jpg +0 -0
  97. package/dist/cesium/Assets/Textures/NaturalEarthII/2/6/2.jpg +0 -0
  98. package/dist/cesium/Assets/Textures/NaturalEarthII/2/6/3.jpg +0 -0
  99. package/dist/cesium/Assets/Textures/NaturalEarthII/2/7/0.jpg +0 -0
  100. package/dist/cesium/Assets/Textures/NaturalEarthII/2/7/1.jpg +0 -0
  101. package/dist/cesium/Assets/Textures/NaturalEarthII/2/7/2.jpg +0 -0
  102. package/dist/cesium/Assets/Textures/NaturalEarthII/2/7/3.jpg +0 -0
  103. package/dist/cesium/Assets/Textures/NaturalEarthII/tilemapresource.xml +14 -0
  104. package/dist/cesium/Assets/Textures/SkyBox/tycho2t3_80_mx.jpg +0 -0
  105. package/dist/cesium/Assets/Textures/SkyBox/tycho2t3_80_my.jpg +0 -0
  106. package/dist/cesium/Assets/Textures/SkyBox/tycho2t3_80_mz.jpg +0 -0
  107. package/dist/cesium/Assets/Textures/SkyBox/tycho2t3_80_px.jpg +0 -0
  108. package/dist/cesium/Assets/Textures/SkyBox/tycho2t3_80_py.jpg +0 -0
  109. package/dist/cesium/Assets/Textures/SkyBox/tycho2t3_80_pz.jpg +0 -0
  110. package/dist/cesium/Assets/Textures/maki/airfield.png +0 -0
  111. package/dist/cesium/Assets/Textures/maki/airport.png +0 -0
  112. package/dist/cesium/Assets/Textures/maki/alcohol-shop.png +0 -0
  113. package/dist/cesium/Assets/Textures/maki/america-football.png +0 -0
  114. package/dist/cesium/Assets/Textures/maki/art-gallery.png +0 -0
  115. package/dist/cesium/Assets/Textures/maki/bakery.png +0 -0
  116. package/dist/cesium/Assets/Textures/maki/bank.png +0 -0
  117. package/dist/cesium/Assets/Textures/maki/bar.png +0 -0
  118. package/dist/cesium/Assets/Textures/maki/baseball.png +0 -0
  119. package/dist/cesium/Assets/Textures/maki/basketball.png +0 -0
  120. package/dist/cesium/Assets/Textures/maki/beer.png +0 -0
  121. package/dist/cesium/Assets/Textures/maki/bicycle.png +0 -0
  122. package/dist/cesium/Assets/Textures/maki/building.png +0 -0
  123. package/dist/cesium/Assets/Textures/maki/bus.png +0 -0
  124. package/dist/cesium/Assets/Textures/maki/cafe.png +0 -0
  125. package/dist/cesium/Assets/Textures/maki/camera.png +0 -0
  126. package/dist/cesium/Assets/Textures/maki/campsite.png +0 -0
  127. package/dist/cesium/Assets/Textures/maki/car.png +0 -0
  128. package/dist/cesium/Assets/Textures/maki/cemetery.png +0 -0
  129. package/dist/cesium/Assets/Textures/maki/cesium.png +0 -0
  130. package/dist/cesium/Assets/Textures/maki/chemist.png +0 -0
  131. package/dist/cesium/Assets/Textures/maki/cinema.png +0 -0
  132. package/dist/cesium/Assets/Textures/maki/circle-stroked.png +0 -0
  133. package/dist/cesium/Assets/Textures/maki/circle.png +0 -0
  134. package/dist/cesium/Assets/Textures/maki/city.png +0 -0
  135. package/dist/cesium/Assets/Textures/maki/clothing-store.png +0 -0
  136. package/dist/cesium/Assets/Textures/maki/college.png +0 -0
  137. package/dist/cesium/Assets/Textures/maki/commercial.png +0 -0
  138. package/dist/cesium/Assets/Textures/maki/cricket.png +0 -0
  139. package/dist/cesium/Assets/Textures/maki/cross.png +0 -0
  140. package/dist/cesium/Assets/Textures/maki/dam.png +0 -0
  141. package/dist/cesium/Assets/Textures/maki/danger.png +0 -0
  142. package/dist/cesium/Assets/Textures/maki/disability.png +0 -0
  143. package/dist/cesium/Assets/Textures/maki/dog-park.png +0 -0
  144. package/dist/cesium/Assets/Textures/maki/embassy.png +0 -0
  145. package/dist/cesium/Assets/Textures/maki/emergency-telephone.png +0 -0
  146. package/dist/cesium/Assets/Textures/maki/entrance.png +0 -0
  147. package/dist/cesium/Assets/Textures/maki/farm.png +0 -0
  148. package/dist/cesium/Assets/Textures/maki/fast-food.png +0 -0
  149. package/dist/cesium/Assets/Textures/maki/ferry.png +0 -0
  150. package/dist/cesium/Assets/Textures/maki/fire-station.png +0 -0
  151. package/dist/cesium/Assets/Textures/maki/fuel.png +0 -0
  152. package/dist/cesium/Assets/Textures/maki/garden.png +0 -0
  153. package/dist/cesium/Assets/Textures/maki/gift.png +0 -0
  154. package/dist/cesium/Assets/Textures/maki/golf.png +0 -0
  155. package/dist/cesium/Assets/Textures/maki/grocery.png +0 -0
  156. package/dist/cesium/Assets/Textures/maki/hairdresser.png +0 -0
  157. package/dist/cesium/Assets/Textures/maki/harbor.png +0 -0
  158. package/dist/cesium/Assets/Textures/maki/heart.png +0 -0
  159. package/dist/cesium/Assets/Textures/maki/heliport.png +0 -0
  160. package/dist/cesium/Assets/Textures/maki/hospital.png +0 -0
  161. package/dist/cesium/Assets/Textures/maki/ice-cream.png +0 -0
  162. package/dist/cesium/Assets/Textures/maki/industrial.png +0 -0
  163. package/dist/cesium/Assets/Textures/maki/land-use.png +0 -0
  164. package/dist/cesium/Assets/Textures/maki/laundry.png +0 -0
  165. package/dist/cesium/Assets/Textures/maki/library.png +0 -0
  166. package/dist/cesium/Assets/Textures/maki/lighthouse.png +0 -0
  167. package/dist/cesium/Assets/Textures/maki/lodging.png +0 -0
  168. package/dist/cesium/Assets/Textures/maki/logging.png +0 -0
  169. package/dist/cesium/Assets/Textures/maki/london-underground.png +0 -0
  170. package/dist/cesium/Assets/Textures/maki/marker-stroked.png +0 -0
  171. package/dist/cesium/Assets/Textures/maki/marker.png +0 -0
  172. package/dist/cesium/Assets/Textures/maki/minefield.png +0 -0
  173. package/dist/cesium/Assets/Textures/maki/mobilephone.png +0 -0
  174. package/dist/cesium/Assets/Textures/maki/monument.png +0 -0
  175. package/dist/cesium/Assets/Textures/maki/museum.png +0 -0
  176. package/dist/cesium/Assets/Textures/maki/music.png +0 -0
  177. package/dist/cesium/Assets/Textures/maki/oil-well.png +0 -0
  178. package/dist/cesium/Assets/Textures/maki/park.png +0 -0
  179. package/dist/cesium/Assets/Textures/maki/park2.png +0 -0
  180. package/dist/cesium/Assets/Textures/maki/parking-garage.png +0 -0
  181. package/dist/cesium/Assets/Textures/maki/parking.png +0 -0
  182. package/dist/cesium/Assets/Textures/maki/pharmacy.png +0 -0
  183. package/dist/cesium/Assets/Textures/maki/pitch.png +0 -0
  184. package/dist/cesium/Assets/Textures/maki/place-of-worship.png +0 -0
  185. package/dist/cesium/Assets/Textures/maki/playground.png +0 -0
  186. package/dist/cesium/Assets/Textures/maki/police.png +0 -0
  187. package/dist/cesium/Assets/Textures/maki/polling-place.png +0 -0
  188. package/dist/cesium/Assets/Textures/maki/post.png +0 -0
  189. package/dist/cesium/Assets/Textures/maki/prison.png +0 -0
  190. package/dist/cesium/Assets/Textures/maki/rail-above.png +0 -0
  191. package/dist/cesium/Assets/Textures/maki/rail-light.png +0 -0
  192. package/dist/cesium/Assets/Textures/maki/rail-metro.png +0 -0
  193. package/dist/cesium/Assets/Textures/maki/rail-underground.png +0 -0
  194. package/dist/cesium/Assets/Textures/maki/rail.png +0 -0
  195. package/dist/cesium/Assets/Textures/maki/religious-christian.png +0 -0
  196. package/dist/cesium/Assets/Textures/maki/religious-jewish.png +0 -0
  197. package/dist/cesium/Assets/Textures/maki/religious-muslim.png +0 -0
  198. package/dist/cesium/Assets/Textures/maki/restaurant.png +0 -0
  199. package/dist/cesium/Assets/Textures/maki/roadblock.png +0 -0
  200. package/dist/cesium/Assets/Textures/maki/rocket.png +0 -0
  201. package/dist/cesium/Assets/Textures/maki/school.png +0 -0
  202. package/dist/cesium/Assets/Textures/maki/scooter.png +0 -0
  203. package/dist/cesium/Assets/Textures/maki/shop.png +0 -0
  204. package/dist/cesium/Assets/Textures/maki/skiing.png +0 -0
  205. package/dist/cesium/Assets/Textures/maki/slaughterhouse.png +0 -0
  206. package/dist/cesium/Assets/Textures/maki/soccer.png +0 -0
  207. package/dist/cesium/Assets/Textures/maki/square-stroked.png +0 -0
  208. package/dist/cesium/Assets/Textures/maki/square.png +0 -0
  209. package/dist/cesium/Assets/Textures/maki/star-stroked.png +0 -0
  210. package/dist/cesium/Assets/Textures/maki/star.png +0 -0
  211. package/dist/cesium/Assets/Textures/maki/suitcase.png +0 -0
  212. package/dist/cesium/Assets/Textures/maki/swimming.png +0 -0
  213. package/dist/cesium/Assets/Textures/maki/telephone.png +0 -0
  214. package/dist/cesium/Assets/Textures/maki/tennis.png +0 -0
  215. package/dist/cesium/Assets/Textures/maki/theatre.png +0 -0
  216. package/dist/cesium/Assets/Textures/maki/toilets.png +0 -0
  217. package/dist/cesium/Assets/Textures/maki/town-hall.png +0 -0
  218. package/dist/cesium/Assets/Textures/maki/town.png +0 -0
  219. package/dist/cesium/Assets/Textures/maki/triangle-stroked.png +0 -0
  220. package/dist/cesium/Assets/Textures/maki/triangle.png +0 -0
  221. package/dist/cesium/Assets/Textures/maki/village.png +0 -0
  222. package/dist/cesium/Assets/Textures/maki/warehouse.png +0 -0
  223. package/dist/cesium/Assets/Textures/maki/waste-basket.png +0 -0
  224. package/dist/cesium/Assets/Textures/maki/water.png +0 -0
  225. package/dist/cesium/Assets/Textures/maki/wetland.png +0 -0
  226. package/dist/cesium/Assets/Textures/maki/zoo.png +0 -0
  227. package/dist/cesium/Assets/Textures/moonSmall.jpg +0 -0
  228. package/dist/cesium/Assets/Textures/pin.svg +1 -0
  229. package/dist/cesium/Assets/Textures/waterNormals.jpg +0 -0
  230. package/dist/cesium/Assets/Textures/waterNormalsSmall.jpg +0 -0
  231. package/dist/cesium/Assets/approximateTerrainHeights.json +1 -0
  232. package/dist/cesium/ThirdParty/Workers/package.json +1 -0
  233. package/dist/cesium/ThirdParty/Workers/zip-web-worker.js +1 -0
  234. package/dist/cesium/ThirdParty/basis_transcoder.wasm +0 -0
  235. package/dist/cesium/ThirdParty/draco_decoder.wasm +0 -0
  236. package/dist/cesium/ThirdParty/google-earth-dbroot-parser.js +1 -0
  237. package/dist/cesium/ThirdParty/wasm_splats_bg.wasm +0 -0
  238. package/dist/cesium/ThirdParty/zip-module.wasm +0 -0
  239. package/dist/cesium/Widgets/Animation/Animation.css +127 -0
  240. package/dist/cesium/Widgets/Animation/lighter.css +70 -0
  241. package/dist/cesium/Widgets/BaseLayerPicker/BaseLayerPicker.css +108 -0
  242. package/dist/cesium/Widgets/BaseLayerPicker/lighter.css +22 -0
  243. package/dist/cesium/Widgets/Cesium3DTilesInspector/Cesium3DTilesInspector.css +102 -0
  244. package/dist/cesium/Widgets/CesiumInspector/CesiumInspector.css +113 -0
  245. package/dist/cesium/Widgets/CesiumWidget/CesiumWidget.css +119 -0
  246. package/dist/cesium/Widgets/CesiumWidget/lighter.css +14 -0
  247. package/dist/cesium/Widgets/FullscreenButton/FullscreenButton.css +8 -0
  248. package/dist/cesium/Widgets/Geocoder/Geocoder.css +70 -0
  249. package/dist/cesium/Widgets/Geocoder/lighter.css +17 -0
  250. package/dist/cesium/Widgets/I3SBuildingSceneLayerExplorer/I3SBuildingSceneLayerExplorer.css +27 -0
  251. package/dist/cesium/Widgets/Images/ImageryProviders/ArcGisMapServiceWorldHillshade.png +0 -0
  252. package/dist/cesium/Widgets/Images/ImageryProviders/ArcGisMapServiceWorldImagery.png +0 -0
  253. package/dist/cesium/Widgets/Images/ImageryProviders/ArcGisMapServiceWorldOcean.png +0 -0
  254. package/dist/cesium/Widgets/Images/ImageryProviders/azureAerial.png +0 -0
  255. package/dist/cesium/Widgets/Images/ImageryProviders/azureRoads.png +0 -0
  256. package/dist/cesium/Widgets/Images/ImageryProviders/bingAerial.png +0 -0
  257. package/dist/cesium/Widgets/Images/ImageryProviders/bingAerialLabels.png +0 -0
  258. package/dist/cesium/Widgets/Images/ImageryProviders/bingRoads.png +0 -0
  259. package/dist/cesium/Widgets/Images/ImageryProviders/blueMarble.png +0 -0
  260. package/dist/cesium/Widgets/Images/ImageryProviders/earthAtNight.png +0 -0
  261. package/dist/cesium/Widgets/Images/ImageryProviders/googleContour.png +0 -0
  262. package/dist/cesium/Widgets/Images/ImageryProviders/googleRoadmap.png +0 -0
  263. package/dist/cesium/Widgets/Images/ImageryProviders/googleSatellite.png +0 -0
  264. package/dist/cesium/Widgets/Images/ImageryProviders/googleSatelliteLabels.png +0 -0
  265. package/dist/cesium/Widgets/Images/ImageryProviders/mapQuestOpenStreetMap.png +0 -0
  266. package/dist/cesium/Widgets/Images/ImageryProviders/mapboxSatellite.png +0 -0
  267. package/dist/cesium/Widgets/Images/ImageryProviders/mapboxStreets.png +0 -0
  268. package/dist/cesium/Widgets/Images/ImageryProviders/mapboxTerrain.png +0 -0
  269. package/dist/cesium/Widgets/Images/ImageryProviders/naturalEarthII.png +0 -0
  270. package/dist/cesium/Widgets/Images/ImageryProviders/openStreetMap.png +0 -0
  271. package/dist/cesium/Widgets/Images/ImageryProviders/sentinel-2.png +0 -0
  272. package/dist/cesium/Widgets/Images/ImageryProviders/stadiaAlidadeSmooth.png +0 -0
  273. package/dist/cesium/Widgets/Images/ImageryProviders/stadiaAlidadeSmoothDark.png +0 -0
  274. package/dist/cesium/Widgets/Images/ImageryProviders/stamenToner.png +0 -0
  275. package/dist/cesium/Widgets/Images/ImageryProviders/stamenWatercolor.png +0 -0
  276. package/dist/cesium/Widgets/Images/NavigationHelp/Mouse.svg +84 -0
  277. package/dist/cesium/Widgets/Images/NavigationHelp/MouseLeft.svg +76 -0
  278. package/dist/cesium/Widgets/Images/NavigationHelp/MouseMiddle.svg +76 -0
  279. package/dist/cesium/Widgets/Images/NavigationHelp/MouseRight.svg +76 -0
  280. package/dist/cesium/Widgets/Images/NavigationHelp/Touch.svg +120 -0
  281. package/dist/cesium/Widgets/Images/NavigationHelp/TouchDrag.svg +129 -0
  282. package/dist/cesium/Widgets/Images/NavigationHelp/TouchRotate.svg +76 -0
  283. package/dist/cesium/Widgets/Images/NavigationHelp/TouchTilt.svg +135 -0
  284. package/dist/cesium/Widgets/Images/NavigationHelp/TouchZoom.svg +74 -0
  285. package/dist/cesium/Widgets/Images/TerrainProviders/CesiumWorldTerrain.png +0 -0
  286. package/dist/cesium/Widgets/Images/TerrainProviders/Ellipsoid.png +0 -0
  287. package/dist/cesium/Widgets/Images/TimelineIcons.png +0 -0
  288. package/dist/cesium/Widgets/Images/info-loading.gif +0 -0
  289. package/dist/cesium/Widgets/InfoBox/InfoBox.css +92 -0
  290. package/dist/cesium/Widgets/InfoBox/InfoBoxDescription.css +178 -0
  291. package/dist/cesium/Widgets/NavigationHelpButton/NavigationHelpButton.css +93 -0
  292. package/dist/cesium/Widgets/NavigationHelpButton/lighter.css +38 -0
  293. package/dist/cesium/Widgets/PerformanceWatchdog/PerformanceWatchdog.css +15 -0
  294. package/dist/cesium/Widgets/ProjectionPicker/ProjectionPicker.css +38 -0
  295. package/dist/cesium/Widgets/SceneModePicker/SceneModePicker.css +56 -0
  296. package/dist/cesium/Widgets/SelectionIndicator/SelectionIndicator.css +20 -0
  297. package/dist/cesium/Widgets/Timeline/Timeline.css +103 -0
  298. package/dist/cesium/Widgets/Timeline/lighter.css +23 -0
  299. package/dist/cesium/Widgets/VRButton/VRButton.css +8 -0
  300. package/dist/cesium/Widgets/Viewer/Viewer.css +107 -0
  301. package/dist/cesium/Widgets/VoxelInspector/VoxelInspector.css +16 -0
  302. package/dist/cesium/Widgets/lighter.css +237 -0
  303. package/dist/cesium/Widgets/lighterShared.css +46 -0
  304. package/dist/cesium/Widgets/shared.css +103 -0
  305. package/dist/cesium/Widgets/widgets.css +1342 -0
  306. package/dist/cesium/Workers/chunk-23ZQ2IVV.js +29 -0
  307. package/dist/cesium/Workers/chunk-2EQO3Q56.js +26 -0
  308. package/dist/cesium/Workers/chunk-2MJIIVP4.js +26 -0
  309. package/dist/cesium/Workers/chunk-2TE5NTVD.js +26 -0
  310. package/dist/cesium/Workers/chunk-2ZBHLJST.js +26 -0
  311. package/dist/cesium/Workers/chunk-5TJMAQVL.js +26 -0
  312. package/dist/cesium/Workers/chunk-6BD4U3VO.js +26 -0
  313. package/dist/cesium/Workers/chunk-7TVGLKQF.js +26 -0
  314. package/dist/cesium/Workers/chunk-BTSYJ5XU.js +26 -0
  315. package/dist/cesium/Workers/chunk-BXMEEOCS.js +63 -0
  316. package/dist/cesium/Workers/chunk-BYLCY7GP.js +29 -0
  317. package/dist/cesium/Workers/chunk-CTHM3W6I.js +26 -0
  318. package/dist/cesium/Workers/chunk-CUUSNIVQ.js +26 -0
  319. package/dist/cesium/Workers/chunk-E3JOOS3S.js +26 -0
  320. package/dist/cesium/Workers/chunk-E7KYDCM5.js +26 -0
  321. package/dist/cesium/Workers/chunk-EDVBB7SS.js +27 -0
  322. package/dist/cesium/Workers/chunk-EFBN7QNX.js +26 -0
  323. package/dist/cesium/Workers/chunk-EQ4YRVWL.js +26 -0
  324. package/dist/cesium/Workers/chunk-F6PRE7D6.js +26 -0
  325. package/dist/cesium/Workers/chunk-FC4ZZ65J.js +26 -0
  326. package/dist/cesium/Workers/chunk-FFBVWF2L.js +26 -0
  327. package/dist/cesium/Workers/chunk-GBAA6GVX.js +26 -0
  328. package/dist/cesium/Workers/chunk-ICALLYLG.js +26 -0
  329. package/dist/cesium/Workers/chunk-ILRYTWTP.js +26 -0
  330. package/dist/cesium/Workers/chunk-IRNLBSEJ.js +26 -0
  331. package/dist/cesium/Workers/chunk-IX4VMHEV.js +26 -0
  332. package/dist/cesium/Workers/chunk-L6QHHACZ.js +26 -0
  333. package/dist/cesium/Workers/chunk-LI2ZSORM.js +26 -0
  334. package/dist/cesium/Workers/chunk-LSLE2RL4.js +26 -0
  335. package/dist/cesium/Workers/chunk-M4HLDBCG.js +26 -0
  336. package/dist/cesium/Workers/chunk-MJHHSGEH.js +26 -0
  337. package/dist/cesium/Workers/chunk-NMVKML6W.js +26 -0
  338. package/dist/cesium/Workers/chunk-OCWJRAXS.js +26 -0
  339. package/dist/cesium/Workers/chunk-OIRKANTH.js +26 -0
  340. package/dist/cesium/Workers/chunk-OIT7J4IC.js +26 -0
  341. package/dist/cesium/Workers/chunk-OLZ3FYUM.js +26 -0
  342. package/dist/cesium/Workers/chunk-Q5BPHJQF.js +26 -0
  343. package/dist/cesium/Workers/chunk-QFM5DCMQ.js +26 -0
  344. package/dist/cesium/Workers/chunk-QKUIYMGC.js +28 -0
  345. package/dist/cesium/Workers/chunk-S44JILQT.js +26 -0
  346. package/dist/cesium/Workers/chunk-SLT4J352.js +26 -0
  347. package/dist/cesium/Workers/chunk-SQMIIXB7.js +26 -0
  348. package/dist/cesium/Workers/chunk-TJ4XLGBQ.js +26 -0
  349. package/dist/cesium/Workers/chunk-TNSUQXWK.js +27 -0
  350. package/dist/cesium/Workers/chunk-UBOGZS7F.js +26 -0
  351. package/dist/cesium/Workers/chunk-V3OSTMM6.js +26 -0
  352. package/dist/cesium/Workers/chunk-V7QEYVP3.js +26 -0
  353. package/dist/cesium/Workers/chunk-VUKYSU4H.js +26 -0
  354. package/dist/cesium/Workers/chunk-W37FE5GR.js +26 -0
  355. package/dist/cesium/Workers/chunk-WBOV35NL.js +26 -0
  356. package/dist/cesium/Workers/chunk-WPMZLB3Y.js +26 -0
  357. package/dist/cesium/Workers/chunk-WWWZVEEH.js +26 -0
  358. package/dist/cesium/Workers/chunk-XFIQ5DEQ.js +28 -0
  359. package/dist/cesium/Workers/chunk-XQHLGIO7.js +26 -0
  360. package/dist/cesium/Workers/chunk-XUSCFAVF.js +26 -0
  361. package/dist/cesium/Workers/chunk-YP7I5QBZ.js +26 -0
  362. package/dist/cesium/Workers/chunk-Z3QF2EHT.js +26 -0
  363. package/dist/cesium/Workers/combineGeometry.js +26 -0
  364. package/dist/cesium/Workers/createBoxGeometry.js +26 -0
  365. package/dist/cesium/Workers/createBoxOutlineGeometry.js +26 -0
  366. package/dist/cesium/Workers/createCircleGeometry.js +26 -0
  367. package/dist/cesium/Workers/createCircleOutlineGeometry.js +26 -0
  368. package/dist/cesium/Workers/createCoplanarPolygonGeometry.js +26 -0
  369. package/dist/cesium/Workers/createCoplanarPolygonOutlineGeometry.js +26 -0
  370. package/dist/cesium/Workers/createCorridorGeometry.js +26 -0
  371. package/dist/cesium/Workers/createCorridorOutlineGeometry.js +26 -0
  372. package/dist/cesium/Workers/createCylinderGeometry.js +26 -0
  373. package/dist/cesium/Workers/createCylinderOutlineGeometry.js +26 -0
  374. package/dist/cesium/Workers/createEllipseGeometry.js +26 -0
  375. package/dist/cesium/Workers/createEllipseOutlineGeometry.js +26 -0
  376. package/dist/cesium/Workers/createEllipsoidGeometry.js +26 -0
  377. package/dist/cesium/Workers/createEllipsoidOutlineGeometry.js +26 -0
  378. package/dist/cesium/Workers/createFrustumGeometry.js +26 -0
  379. package/dist/cesium/Workers/createFrustumOutlineGeometry.js +26 -0
  380. package/dist/cesium/Workers/createGeometry.js +26 -0
  381. package/dist/cesium/Workers/createGroundPolylineGeometry.js +26 -0
  382. package/dist/cesium/Workers/createPlaneGeometry.js +26 -0
  383. package/dist/cesium/Workers/createPlaneOutlineGeometry.js +26 -0
  384. package/dist/cesium/Workers/createPolygonGeometry.js +26 -0
  385. package/dist/cesium/Workers/createPolygonOutlineGeometry.js +26 -0
  386. package/dist/cesium/Workers/createPolylineGeometry.js +26 -0
  387. package/dist/cesium/Workers/createPolylineVolumeGeometry.js +26 -0
  388. package/dist/cesium/Workers/createPolylineVolumeOutlineGeometry.js +26 -0
  389. package/dist/cesium/Workers/createRectangleGeometry.js +26 -0
  390. package/dist/cesium/Workers/createRectangleOutlineGeometry.js +26 -0
  391. package/dist/cesium/Workers/createSimplePolylineGeometry.js +26 -0
  392. package/dist/cesium/Workers/createSphereGeometry.js +26 -0
  393. package/dist/cesium/Workers/createSphereOutlineGeometry.js +26 -0
  394. package/dist/cesium/Workers/createTaskProcessorWorker.js +26 -0
  395. package/dist/cesium/Workers/createVectorTileClampedPolylines.js +26 -0
  396. package/dist/cesium/Workers/createVectorTileGeometries.js +26 -0
  397. package/dist/cesium/Workers/createVectorTilePoints.js +26 -0
  398. package/dist/cesium/Workers/createVectorTilePolygons.js +26 -0
  399. package/dist/cesium/Workers/createVectorTilePolylines.js +26 -0
  400. package/dist/cesium/Workers/createVerticesFromCesium3DTilesTerrain.js +26 -0
  401. package/dist/cesium/Workers/createVerticesFromGoogleEarthEnterpriseBuffer.js +26 -0
  402. package/dist/cesium/Workers/createVerticesFromHeightmap.js +26 -0
  403. package/dist/cesium/Workers/createVerticesFromQuantizedTerrainMesh.js +26 -0
  404. package/dist/cesium/Workers/createWallGeometry.js +26 -0
  405. package/dist/cesium/Workers/createWallOutlineGeometry.js +26 -0
  406. package/dist/cesium/Workers/decodeDraco.js +26 -0
  407. package/dist/cesium/Workers/decodeGoogleEarthEnterprisePacket.js +26 -0
  408. package/dist/cesium/Workers/decodeI3S.js +26 -0
  409. package/dist/cesium/Workers/gaussianSplatSorter.js +26 -0
  410. package/dist/cesium/Workers/gaussianSplatTextureGenerator.js +26 -0
  411. package/dist/cesium/Workers/incrementallyBuildTerrainPicker.js +26 -0
  412. package/dist/cesium/Workers/transcodeKTX2.js +56 -0
  413. package/dist/cesium/Workers/transferTypedArrayTest.js +26 -0
  414. package/dist/cesium/Workers/upsampleQuantizedTerrainMesh.js +26 -0
  415. package/dist/cesium/Workers/upsampleVerticesFromCesium3DTilesTerrain.js +26 -0
  416. package/dist/index.html +13 -10
  417. package/index.html +1 -0
  418. package/package.json +18 -15
  419. package/src/App.tsx +7 -9
  420. package/src/components/viewer/BCFPanel.tsx +46 -4
  421. package/src/components/viewer/CesiumOverlay.tsx +715 -0
  422. package/src/components/viewer/CesiumSettingsDialog.tsx +100 -0
  423. package/src/components/viewer/ChatPanel.tsx +232 -90
  424. package/src/components/viewer/CommandPalette.tsx +6 -1
  425. package/src/components/viewer/DesktopEntitlementBanner.tsx +74 -0
  426. package/src/components/viewer/ExportChangesButton.tsx +6 -1
  427. package/src/components/viewer/ExportDialog.tsx +22 -6
  428. package/src/components/viewer/HierarchyPanel.tsx +196 -0
  429. package/src/components/viewer/IDSPanel.tsx +52 -3
  430. package/src/components/viewer/KeyboardShortcutsDialog.tsx +1 -1
  431. package/src/components/viewer/MainToolbar.tsx +355 -28
  432. package/src/components/viewer/PropertiesPanel.tsx +234 -81
  433. package/src/components/viewer/ScriptPanel.tsx +34 -8
  434. package/src/components/viewer/SettingsPage.tsx +581 -0
  435. package/src/components/viewer/StatusBar.tsx +17 -1
  436. package/src/components/viewer/ThemeSwitch.tsx +63 -7
  437. package/src/components/viewer/ViewerLayout.tsx +48 -6
  438. package/src/components/viewer/Viewport.tsx +61 -8
  439. package/src/components/viewer/ViewportContainer.tsx +265 -28
  440. package/src/components/viewer/ViewportOverlays.tsx +132 -27
  441. package/src/components/viewer/bcf/BCFTopicDetail.tsx +4 -4
  442. package/src/components/viewer/chat/ModelSelector.tsx +90 -54
  443. package/src/components/viewer/properties/GeoreferencingPanel.tsx +229 -55
  444. package/src/components/viewer/properties/LocationMap.tsx +462 -19
  445. package/src/components/viewer/properties/ModelMetadataPanel.tsx +1 -1
  446. package/src/components/viewer/selectionHandlers.ts +4 -3
  447. package/src/components/viewer/tools/SectionCapControls.tsx +237 -0
  448. package/src/components/viewer/tools/SectionPanel.tsx +39 -18
  449. package/src/components/viewer/useAnimationLoop.ts +13 -1
  450. package/src/components/viewer/useGeometryStreaming.ts +127 -40
  451. package/src/components/viewer/useMouseControls.ts +4 -1
  452. package/src/components/viewer/useRenderUpdates.ts +1 -1
  453. package/src/hooks/ids/idsDataAccessor.ts +60 -24
  454. package/src/hooks/ingest/viewerModelIngest.ts +280 -0
  455. package/src/hooks/useIDS.ts +1 -1
  456. package/src/hooks/useIfc.ts +7 -1
  457. package/src/hooks/useIfcCache.ts +28 -15
  458. package/src/hooks/useIfcFederation.ts +378 -291
  459. package/src/hooks/useIfcLoader.ts +1657 -130
  460. package/src/hooks/useIfcServer.ts +0 -69
  461. package/src/hooks/useViewControls.ts +13 -5
  462. package/src/index.css +484 -10
  463. package/src/lib/desktop/desktopEntitlementEvents.ts +39 -0
  464. package/src/lib/desktop-entitlement.ts +43 -0
  465. package/src/lib/desktop-product.ts +124 -0
  466. package/src/lib/geo/cesium-bridge.ts +318 -0
  467. package/src/lib/geo/effective-georef.test.ts +73 -0
  468. package/src/lib/geo/effective-georef.ts +111 -0
  469. package/src/lib/geo/reproject.ts +249 -37
  470. package/src/lib/llm/byok-guard.test.ts +77 -0
  471. package/src/lib/llm/byok-guard.ts +39 -0
  472. package/src/lib/llm/free-models.test.ts +0 -6
  473. package/src/lib/llm/models.ts +104 -42
  474. package/src/lib/llm/stream-client.ts +74 -110
  475. package/src/lib/llm/stream-direct.test.ts +130 -0
  476. package/src/lib/llm/stream-direct.ts +316 -0
  477. package/src/lib/llm/types.ts +14 -2
  478. package/src/lib/recent-files.ts +2 -1
  479. package/src/main.tsx +1 -10
  480. package/src/services/analysis-extensions.ts +125 -0
  481. package/src/services/api-keys.ts +73 -0
  482. package/src/services/app-navigation.ts +13 -0
  483. package/src/services/bsdd.ts +53 -4
  484. package/src/services/cacheService.ts +1 -1
  485. package/src/services/desktop-cache.ts +43 -0
  486. package/src/services/desktop-export.ts +77 -0
  487. package/src/services/desktop-harness.ts +196 -0
  488. package/src/services/desktop-logger.ts +20 -0
  489. package/src/services/desktop-native-metadata.ts +207 -0
  490. package/src/services/desktop-panel-actions.ts +43 -0
  491. package/src/services/desktop-preferences.ts +44 -0
  492. package/src/services/file-dialog.ts +147 -0
  493. package/src/services/tauri-core-stub.ts +7 -0
  494. package/src/services/tauri-dialog-stub.ts +7 -0
  495. package/src/services/tauri-fs-stub.ts +7 -0
  496. package/src/store/constants.ts +20 -2
  497. package/src/store/index.ts +52 -7
  498. package/src/store/slices/cesiumSlice.ts +127 -0
  499. package/src/store/slices/chatSlice.test.ts +6 -76
  500. package/src/store/slices/chatSlice.ts +21 -58
  501. package/src/store/slices/dataSlice.ts +139 -28
  502. package/src/store/slices/desktopEntitlementSlice.ts +86 -0
  503. package/src/store/slices/loadingSlice.ts +14 -2
  504. package/src/store/slices/modelSlice.ts +58 -3
  505. package/src/store/slices/sectionSlice.test.ts +87 -7
  506. package/src/store/slices/sectionSlice.ts +151 -5
  507. package/src/store/slices/uiSlice.ts +28 -5
  508. package/src/store/types.ts +122 -2
  509. package/src/store.ts +1 -1
  510. package/src/utils/desktopModelSnapshot.ts +358 -0
  511. package/src/utils/ifcConfig.ts +6 -1
  512. package/src/utils/nativeSpatialDataStore.ts +253 -0
  513. package/src/utils/serverDataModel.ts +4 -0
  514. package/src/utils/spatialHierarchy.ts +10 -11
  515. package/src/utils/viewportUtils.ts +7 -2
  516. package/src/vite-env.d.ts +0 -4
  517. package/vite.config.ts +24 -0
  518. package/dist/assets/arrow-DJf2ErbF.js +0 -20
  519. package/dist/assets/basketViewActivator-aojwdomq.js +0 -1
  520. package/dist/assets/desktop-cache-oPzaWXYE.js +0 -1
  521. package/dist/assets/drawing-2d-gWfpdfYe.js +0 -257
  522. package/dist/assets/geometry.worker-Nz9_YIqh.js +0 -1
  523. package/dist/assets/ids-B4jTqB1O.js +0 -1
  524. package/dist/assets/ifc-lite_bg-eSkBTizQ.wasm +0 -0
  525. package/dist/assets/index-pbE7itQS.css +0 -1
  526. package/dist/assets/native-bridge-DSIyEYXG.js +0 -113
  527. package/dist/assets/wasm-bridge-B0J07fZZ.js +0 -1
  528. package/src/components/viewer/UpgradePage.tsx +0 -69
  529. package/src/lib/llm/ClerkChatSync.tsx +0 -74
  530. package/src/lib/llm/clerk-auth.ts +0 -62
@@ -141,3 +141,46 @@ export async function hasCached(key: string): Promise<boolean> {
141
141
  const data = await getCached(key);
142
142
  return data !== null;
143
143
  }
144
+
145
+ export async function hasNativeGeometryCache(key: string): Promise<boolean> {
146
+ try {
147
+ const inv = await getInvoke();
148
+ return await inv<boolean>('has_native_geometry_cache', { cacheKey: key });
149
+ } catch (error) {
150
+ console.warn('[DesktopCache] Failed to check native geometry cache:', error);
151
+ return false;
152
+ }
153
+ }
154
+
155
+ export async function getNativeModelSnapshot(key: string): Promise<ArrayBuffer | null> {
156
+ try {
157
+ const inv = await getInvoke();
158
+ const data = await inv<number[] | null>('get_native_model_snapshot', { cacheKey: key });
159
+ return data ? new Uint8Array(data).buffer : null;
160
+ } catch (error) {
161
+ console.warn('[DesktopCache] Failed to read native model snapshot:', error);
162
+ return null;
163
+ }
164
+ }
165
+
166
+ export async function setNativeModelSnapshot(key: string, buffer: ArrayBuffer): Promise<void> {
167
+ try {
168
+ const inv = await getInvoke();
169
+ await inv('set_native_model_snapshot', {
170
+ cacheKey: key,
171
+ data: Array.from(new Uint8Array(buffer)),
172
+ });
173
+ } catch (error) {
174
+ console.warn('[DesktopCache] Failed to write native model snapshot:', error);
175
+ }
176
+ }
177
+
178
+ export async function hasNativeModelSnapshot(key: string): Promise<boolean> {
179
+ try {
180
+ const inv = await getInvoke();
181
+ return await inv<boolean>('has_native_model_snapshot', { cacheKey: key });
182
+ } catch (error) {
183
+ console.warn('[DesktopCache] Failed to check native model snapshot:', error);
184
+ return false;
185
+ }
186
+ }
@@ -0,0 +1,77 @@
1
+ /* This Source Code Form is subject to the terms of the Mozilla Public
2
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
3
+ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4
+
5
+ import { IfcParser, type IfcDataStore } from '@ifc-lite/parser';
6
+ import { getViewerStoreApi } from '@/store';
7
+ import { toast } from '@/components/ui/toast';
8
+ import { readNativeFile } from '@/services/file-dialog';
9
+
10
+ const exportHydrationByModel = new Map<string, Promise<IfcDataStore | null>>();
11
+
12
+ function isDesktopRuntime(): boolean {
13
+ const win = globalThis as Window & { __TAURI_INTERNALS__?: { invoke?: unknown } };
14
+ return typeof win.__TAURI_INTERNALS__?.invoke === 'function';
15
+ }
16
+
17
+ function hasFullStepSource(dataStore: IfcDataStore | null | undefined): dataStore is IfcDataStore {
18
+ return Boolean(dataStore?.source?.length && dataStore.entityIndex?.byId?.size);
19
+ }
20
+
21
+ function toExactArrayBuffer(bytes: Uint8Array): ArrayBuffer {
22
+ if (
23
+ bytes.buffer instanceof ArrayBuffer
24
+ && bytes.byteOffset === 0
25
+ && bytes.byteLength === bytes.buffer.byteLength
26
+ ) {
27
+ return bytes.buffer;
28
+ }
29
+ return bytes.slice().buffer;
30
+ }
31
+
32
+ export async function ensureModelExportReady(modelId: string): Promise<IfcDataStore | null> {
33
+ const store = getViewerStoreApi();
34
+ const state = store.getState();
35
+
36
+ if (modelId === '__legacy__') {
37
+ return state.ifcDataStore;
38
+ }
39
+
40
+ const model = state.models.get(modelId);
41
+ if (!model) {
42
+ return null;
43
+ }
44
+
45
+ if (hasFullStepSource(model.ifcDataStore)) {
46
+ return model.ifcDataStore;
47
+ }
48
+
49
+ if (!isDesktopRuntime() || !model.nativeMetadata?.filePath) {
50
+ return model.ifcDataStore;
51
+ }
52
+
53
+ const pending = exportHydrationByModel.get(modelId);
54
+ if (pending) {
55
+ return pending;
56
+ }
57
+
58
+ const hydrationPromise = (async () => {
59
+ toast.info(`Preparing ${model.name} for IFC export...`);
60
+ const bytes = await readNativeFile(model.nativeMetadata!.filePath);
61
+ const parser = new IfcParser();
62
+ const hydratedStore = await parser.parseColumnar(toExactArrayBuffer(bytes));
63
+
64
+ store.getState().updateModel(modelId, {
65
+ ifcDataStore: hydratedStore,
66
+ schemaVersion: hydratedStore.schemaVersion,
67
+ metadataLoadState: 'complete',
68
+ });
69
+
70
+ return hydratedStore;
71
+ })().finally(() => {
72
+ exportHydrationByModel.delete(modelId);
73
+ });
74
+
75
+ exportHydrationByModel.set(modelId, hydrationPromise);
76
+ return hydrationPromise;
77
+ }
@@ -0,0 +1,196 @@
1
+ /* This Source Code Form is subject to the terms of the Mozilla Public
2
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
3
+ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4
+
5
+ import type { NativeFileHandle } from './file-dialog.js';
6
+
7
+ type InvokeFn = <T>(cmd: string, args?: Record<string, unknown>) => Promise<T>;
8
+
9
+ interface TauriInternals {
10
+ invoke: InvokeFn;
11
+ }
12
+
13
+ export interface DesktopHarnessRequest {
14
+ file: NativeFileHandle;
15
+ replaceFile?: NativeFileHandle;
16
+ telemetryOutputPath?: string;
17
+ runLabel?: string;
18
+ exitAfterTelemetry: boolean;
19
+ waitForMetadataCompletion: boolean;
20
+ }
21
+
22
+ export interface DesktopTelemetryReport {
23
+ schemaVersion: number;
24
+ source: 'desktop-native';
25
+ mode: 'startup-harness' | 'manual';
26
+ success: boolean;
27
+ runLabel?: string;
28
+ cache?: {
29
+ key?: string | null;
30
+ hit?: boolean | null;
31
+ manifestMeshCount?: number | null;
32
+ manifestShardCount?: number | null;
33
+ } | null;
34
+ file: {
35
+ path: string;
36
+ name: string;
37
+ sizeBytes: number;
38
+ sizeMB: number;
39
+ };
40
+ timings: Record<string, number | null>;
41
+ batches: Record<string, number | string | null>;
42
+ nativeStats?: Record<string, number | null> | null;
43
+ metadata?: Record<string, number | boolean | null> | null;
44
+ firstBatchTelemetry?: Record<string, number | string | null> | null;
45
+ error?: string;
46
+ }
47
+
48
+ let activeHarnessRequest: DesktopHarnessRequest | null = null;
49
+ let startupHarnessRequestPromise: Promise<DesktopHarnessRequest | null> | null = null;
50
+ const STORAGE_KEY = 'ifc-lite:desktop-harness-request';
51
+ const CLAIMED_KEY = 'ifc-lite:desktop-harness-claimed';
52
+
53
+ function getInvoke(): InvokeFn | null {
54
+ const win = globalThis as unknown as { __TAURI_INTERNALS__?: TauriInternals };
55
+ return win.__TAURI_INTERNALS__?.invoke ?? null;
56
+ }
57
+
58
+ async function consumeStartupHarnessRequest(): Promise<DesktopHarnessRequest | null> {
59
+ const invoke = getInvoke();
60
+ if (!invoke) {
61
+ return null;
62
+ }
63
+
64
+ try {
65
+ return await invoke<DesktopHarnessRequest | null>('consume_startup_harness_request');
66
+ } catch (error) {
67
+ console.warn('[DesktopHarness] Failed to consume startup harness request:', error);
68
+ return null;
69
+ }
70
+ }
71
+
72
+ function getHarnessRequestFingerprint(request: DesktopHarnessRequest): string {
73
+ return JSON.stringify({
74
+ path: request.file.path,
75
+ replacePath: request.replaceFile?.path ?? null,
76
+ telemetryOutputPath: request.telemetryOutputPath ?? null,
77
+ runLabel: request.runLabel ?? null,
78
+ exitAfterTelemetry: request.exitAfterTelemetry,
79
+ waitForMetadataCompletion: request.waitForMetadataCompletion,
80
+ });
81
+ }
82
+
83
+ function getClaimedFingerprint(): string | null {
84
+ try {
85
+ return sessionStorage.getItem(CLAIMED_KEY);
86
+ } catch {
87
+ return null;
88
+ }
89
+ }
90
+
91
+ function setClaimedFingerprint(fingerprint: string | null): void {
92
+ try {
93
+ if (fingerprint) {
94
+ sessionStorage.setItem(CLAIMED_KEY, fingerprint);
95
+ } else {
96
+ sessionStorage.removeItem(CLAIMED_KEY);
97
+ }
98
+ } catch {
99
+ // Ignore storage issues.
100
+ }
101
+ }
102
+
103
+ export function setActiveHarnessRequest(request: DesktopHarnessRequest | null): void {
104
+ activeHarnessRequest = request;
105
+ try {
106
+ if (request) {
107
+ sessionStorage.setItem(STORAGE_KEY, JSON.stringify(request));
108
+ if (getClaimedFingerprint() !== getHarnessRequestFingerprint(request)) {
109
+ setClaimedFingerprint(null);
110
+ }
111
+ } else {
112
+ sessionStorage.removeItem(STORAGE_KEY);
113
+ }
114
+ } catch {
115
+ // Ignore storage issues in non-browser or restricted contexts.
116
+ }
117
+ }
118
+
119
+ export function getActiveHarnessRequest(): DesktopHarnessRequest | null {
120
+ if (!activeHarnessRequest) {
121
+ try {
122
+ const raw = sessionStorage.getItem(STORAGE_KEY);
123
+ if (raw) {
124
+ activeHarnessRequest = JSON.parse(raw) as DesktopHarnessRequest;
125
+ }
126
+ } catch {
127
+ // Ignore storage parse failures and fall back to in-memory state.
128
+ }
129
+ }
130
+ return activeHarnessRequest;
131
+ }
132
+
133
+ export async function getStartupHarnessRequest(): Promise<DesktopHarnessRequest | null> {
134
+ const existing = getActiveHarnessRequest();
135
+ if (existing) {
136
+ return existing;
137
+ }
138
+
139
+ if (!startupHarnessRequestPromise) {
140
+ startupHarnessRequestPromise = consumeStartupHarnessRequest().then((request) => {
141
+ if (request) {
142
+ setActiveHarnessRequest(request);
143
+ }
144
+ return request;
145
+ });
146
+ }
147
+
148
+ return await startupHarnessRequestPromise;
149
+ }
150
+
151
+ export function tryClaimStartupHarnessRequest(request: DesktopHarnessRequest): boolean {
152
+ const active = getActiveHarnessRequest();
153
+ if (!active) {
154
+ return false;
155
+ }
156
+
157
+ const requestFingerprint = getHarnessRequestFingerprint(request);
158
+ if (getHarnessRequestFingerprint(active) !== requestFingerprint) {
159
+ return false;
160
+ }
161
+
162
+ if (getClaimedFingerprint() === requestFingerprint) {
163
+ return false;
164
+ }
165
+
166
+ setClaimedFingerprint(requestFingerprint);
167
+ return true;
168
+ }
169
+
170
+ export function clearActiveHarnessRequest(): void {
171
+ activeHarnessRequest = null;
172
+ startupHarnessRequestPromise = null;
173
+ try {
174
+ sessionStorage.removeItem(STORAGE_KEY);
175
+ } catch {
176
+ // Ignore storage issues.
177
+ }
178
+ setClaimedFingerprint(null);
179
+ }
180
+
181
+ export async function finalizeActiveHarnessRun(report: DesktopTelemetryReport): Promise<string | null> {
182
+ const invoke = getInvoke();
183
+ const request = getActiveHarnessRequest();
184
+ clearActiveHarnessRequest();
185
+
186
+ if (!invoke || !request) {
187
+ return null;
188
+ }
189
+
190
+ try {
191
+ return await invoke<string>('write_desktop_telemetry', { report });
192
+ } catch (error) {
193
+ console.warn('[DesktopHarness] Failed to write desktop telemetry:', error);
194
+ return null;
195
+ }
196
+ }
@@ -0,0 +1,20 @@
1
+ /* This Source Code Form is subject to the terms of the Mozilla Public
2
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
3
+ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4
+
5
+ type InvokeFn = <T>(cmd: string, args?: Record<string, unknown>) => Promise<T>;
6
+
7
+ type LogLevel = 'info' | 'warn' | 'error';
8
+
9
+ export async function logToDesktopTerminal(level: LogLevel, message: string): Promise<void> {
10
+ const win = globalThis as unknown as { __TAURI_INTERNALS__?: { invoke: InvokeFn } };
11
+ if (!win.__TAURI_INTERNALS__?.invoke) {
12
+ return;
13
+ }
14
+
15
+ try {
16
+ await win.__TAURI_INTERNALS__.invoke('frontend_debug_log', { level, message });
17
+ } catch {
18
+ // Debug logging should never break app behavior.
19
+ }
20
+ }
@@ -0,0 +1,207 @@
1
+ /* This Source Code Form is subject to the terms of the Mozilla Public
2
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
3
+ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4
+
5
+ import type {
6
+ NativeMetadataEntityDetails,
7
+ NativeMetadataEntitySummary,
8
+ NativeMetadataSnapshot,
9
+ } from '@/store/types';
10
+ import type { MetadataBootstrapPayload } from '@ifc-lite/geometry';
11
+ import { getNativeModelSnapshot, setNativeModelSnapshot } from './desktop-cache';
12
+
13
+ type InvokeFn = <T>(cmd: string, args?: Record<string, unknown>) => Promise<T>;
14
+
15
+ async function getInvoke(): Promise<InvokeFn> {
16
+ const win = globalThis as unknown as { __TAURI_INTERNALS__?: { invoke: InvokeFn } };
17
+ if (win.__TAURI_INTERNALS__?.invoke) {
18
+ return win.__TAURI_INTERNALS__.invoke;
19
+ }
20
+ const core = await import('@tauri-apps/api/core');
21
+ return core.invoke as InvokeFn;
22
+ }
23
+
24
+ interface NativeMetadataBootstrapPayload {
25
+ cacheKey: string;
26
+ schemaVersion: string;
27
+ entityCount: number;
28
+ spatialTree: NativeMetadataSnapshot['spatialTree'];
29
+ }
30
+
31
+ function toSchemaVersion(schemaVersion: string): NativeMetadataSnapshot['schemaVersion'] {
32
+ if (schemaVersion === 'IFC4X3' || schemaVersion === 'IFC4' || schemaVersion === 'IFC5') {
33
+ return schemaVersion;
34
+ }
35
+ return 'IFC2X3';
36
+ }
37
+
38
+ export function nativeMetadataSnapshotFromBootstrap(
39
+ path: string,
40
+ payload: MetadataBootstrapPayload
41
+ ): NativeMetadataSnapshot {
42
+ return {
43
+ mode: 'desktop-lazy',
44
+ cacheKey: payload.cacheKey,
45
+ filePath: path,
46
+ schemaVersion: toSchemaVersion(payload.schemaVersion),
47
+ entityCount: payload.entityCount,
48
+ spatialTree: payload.spatialTree ?? null,
49
+ };
50
+ }
51
+
52
+ export async function bootstrapNativeMetadata(path: string, cacheKey: string): Promise<NativeMetadataSnapshot> {
53
+ const invoke = await getInvoke();
54
+ const result = await invoke<NativeMetadataBootstrapPayload>('bootstrap_native_metadata', {
55
+ path,
56
+ cacheKey,
57
+ });
58
+ return {
59
+ mode: 'desktop-lazy',
60
+ cacheKey: result.cacheKey,
61
+ filePath: path,
62
+ schemaVersion: toSchemaVersion(result.schemaVersion),
63
+ entityCount: result.entityCount,
64
+ spatialTree: result.spatialTree ?? null,
65
+ };
66
+ }
67
+
68
+ export async function restoreNativeMetadataSnapshot(cacheKey: string): Promise<NativeMetadataSnapshot | null> {
69
+ const buffer = await getNativeModelSnapshot(cacheKey);
70
+ if (!buffer) return null;
71
+ try {
72
+ const payload = JSON.parse(new TextDecoder().decode(new Uint8Array(buffer))) as NativeMetadataSnapshot;
73
+ if (payload?.mode !== 'desktop-lazy' || payload.cacheKey !== cacheKey) {
74
+ return null;
75
+ }
76
+ return {
77
+ ...payload,
78
+ schemaVersion: toSchemaVersion(payload.schemaVersion),
79
+ spatialTree: payload.spatialTree ?? null,
80
+ };
81
+ } catch {
82
+ return null;
83
+ }
84
+ }
85
+
86
+ export async function persistNativeMetadataSnapshot(snapshot: NativeMetadataSnapshot): Promise<void> {
87
+ const bytes = new TextEncoder().encode(JSON.stringify(snapshot));
88
+ await setNativeModelSnapshot(snapshot.cacheKey, bytes.buffer);
89
+ }
90
+
91
+ export async function getNativeMetadataChildren(cacheKey: string, expressId: number): Promise<NativeMetadataEntitySummary[]> {
92
+ const invoke = await getInvoke();
93
+ const result = await invoke<Array<{
94
+ expressId: number;
95
+ typeName: string;
96
+ name: string;
97
+ globalId?: string | null;
98
+ kind: 'spatial' | 'element';
99
+ hasChildren: boolean;
100
+ elementCount?: number;
101
+ elevation?: number | null;
102
+ }>>('get_native_metadata_children', {
103
+ cacheKey,
104
+ expressId,
105
+ });
106
+ return result.map((entry) => ({
107
+ expressId: entry.expressId,
108
+ type: entry.typeName,
109
+ name: entry.name,
110
+ globalId: entry.globalId ?? undefined,
111
+ kind: entry.kind,
112
+ hasChildren: entry.hasChildren,
113
+ elementCount: entry.elementCount,
114
+ elevation: entry.elevation ?? undefined,
115
+ }));
116
+ }
117
+
118
+ export async function getNativeEntityDetails(cacheKey: string, expressId: number): Promise<NativeMetadataEntityDetails> {
119
+ const invoke = await getInvoke();
120
+ const result = await invoke<{
121
+ summary: {
122
+ expressId: number;
123
+ typeName: string;
124
+ name: string;
125
+ globalId?: string | null;
126
+ kind: 'spatial' | 'element';
127
+ hasChildren: boolean;
128
+ elementCount?: number;
129
+ elevation?: number | null;
130
+ };
131
+ typeSummary?: {
132
+ expressId: number;
133
+ typeName: string;
134
+ name: string;
135
+ globalId?: string | null;
136
+ kind: 'spatial' | 'element';
137
+ hasChildren: boolean;
138
+ elementCount?: number;
139
+ elevation?: number | null;
140
+ } | null;
141
+ spatial?: {
142
+ storeyId?: number | null;
143
+ storeyName?: string | null;
144
+ elevation?: number | null;
145
+ height?: number | null;
146
+ } | null;
147
+ properties: NativeMetadataEntityDetails['properties'];
148
+ quantities: NativeMetadataEntityDetails['quantities'];
149
+ }>('get_native_entity_details', {
150
+ cacheKey,
151
+ expressId,
152
+ });
153
+
154
+ const mapSummary = (entry: NonNullable<typeof result['summary']>): NativeMetadataEntitySummary => ({
155
+ expressId: entry.expressId,
156
+ type: entry.typeName,
157
+ name: entry.name,
158
+ globalId: entry.globalId ?? undefined,
159
+ kind: entry.kind,
160
+ hasChildren: entry.hasChildren,
161
+ elementCount: entry.elementCount,
162
+ elevation: entry.elevation ?? undefined,
163
+ });
164
+
165
+ return {
166
+ summary: mapSummary(result.summary),
167
+ typeSummary: result.typeSummary ? mapSummary(result.typeSummary) : null,
168
+ spatial: result.spatial
169
+ ? {
170
+ storeyId: result.spatial.storeyId ?? null,
171
+ storeyName: result.spatial.storeyName ?? null,
172
+ elevation: result.spatial.elevation ?? null,
173
+ height: result.spatial.height ?? null,
174
+ }
175
+ : null,
176
+ properties: result.properties,
177
+ quantities: result.quantities,
178
+ };
179
+ }
180
+
181
+ export async function searchNativeMetadataEntities(cacheKey: string, query: string, limit = 100): Promise<NativeMetadataEntitySummary[]> {
182
+ const invoke = await getInvoke();
183
+ const result = await invoke<Array<{
184
+ expressId: number;
185
+ typeName: string;
186
+ name: string;
187
+ globalId?: string | null;
188
+ kind: 'spatial' | 'element';
189
+ hasChildren: boolean;
190
+ elementCount?: number;
191
+ elevation?: number | null;
192
+ }>>('search_native_metadata_entities', {
193
+ cacheKey,
194
+ query,
195
+ limit,
196
+ });
197
+ return result.map((entry) => ({
198
+ expressId: entry.expressId,
199
+ type: entry.typeName,
200
+ name: entry.name,
201
+ globalId: entry.globalId ?? undefined,
202
+ kind: entry.kind,
203
+ hasChildren: entry.hasChildren,
204
+ elementCount: entry.elementCount,
205
+ elevation: entry.elevation ?? undefined,
206
+ }));
207
+ }
@@ -0,0 +1,43 @@
1
+ /* This Source Code Form is subject to the terms of the Mozilla Public
2
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
3
+ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4
+
5
+ export type DesktopPanelActionType =
6
+ | 'bcf-import'
7
+ | 'bcf-export'
8
+ | 'ids-open'
9
+ | 'ids-run-validation';
10
+
11
+ interface DesktopPanelAction {
12
+ id: number;
13
+ type: DesktopPanelActionType;
14
+ }
15
+
16
+ type DesktopPanelActionListener = () => void;
17
+
18
+ let nextActionId = 1;
19
+ const pendingActions: DesktopPanelAction[] = [];
20
+ const listeners = new Set<DesktopPanelActionListener>();
21
+
22
+ export function requestDesktopPanelAction(type: DesktopPanelActionType): void {
23
+ pendingActions.push({ id: nextActionId++, type });
24
+ for (const listener of listeners) {
25
+ listener();
26
+ }
27
+ }
28
+
29
+ export function claimNextDesktopPanelAction(type: DesktopPanelActionType): DesktopPanelAction | null {
30
+ const index = pendingActions.findIndex((action) => action.type === type);
31
+ if (index < 0) {
32
+ return null;
33
+ }
34
+ const [action] = pendingActions.splice(index, 1);
35
+ return action ?? null;
36
+ }
37
+
38
+ export function subscribeDesktopPanelActions(listener: DesktopPanelActionListener): () => void {
39
+ listeners.add(listener);
40
+ return () => {
41
+ listeners.delete(listener);
42
+ };
43
+ }
@@ -0,0 +1,44 @@
1
+ /* This Source Code Form is subject to the terms of the Mozilla Public
2
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
3
+ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4
+
5
+ export interface DesktopPreferences {
6
+ reopenLastModelOnLaunch: boolean;
7
+ restoreWorkspaceLayoutOnLaunch: boolean;
8
+ }
9
+
10
+ const STORAGE_KEY = 'ifc-lite:desktop-preferences:v1';
11
+ const CHANGED_EVENT = 'ifc-lite:desktop-preferences-changed';
12
+
13
+ const DEFAULT_PREFERENCES: DesktopPreferences = {
14
+ reopenLastModelOnLaunch: true,
15
+ restoreWorkspaceLayoutOnLaunch: true,
16
+ };
17
+
18
+ function sanitizePreferences(value: unknown): DesktopPreferences {
19
+ const parsed = (value && typeof value === 'object') ? value as Partial<DesktopPreferences> : {};
20
+ return {
21
+ reopenLastModelOnLaunch: parsed.reopenLastModelOnLaunch ?? DEFAULT_PREFERENCES.reopenLastModelOnLaunch,
22
+ restoreWorkspaceLayoutOnLaunch: parsed.restoreWorkspaceLayoutOnLaunch ?? DEFAULT_PREFERENCES.restoreWorkspaceLayoutOnLaunch,
23
+ };
24
+ }
25
+
26
+ export function getDesktopPreferences(): DesktopPreferences {
27
+ try {
28
+ return sanitizePreferences(JSON.parse(localStorage.getItem(STORAGE_KEY) ?? '{}'));
29
+ } catch {
30
+ return { ...DEFAULT_PREFERENCES };
31
+ }
32
+ }
33
+
34
+ export function updateDesktopPreferences(updates: Partial<DesktopPreferences>): DesktopPreferences {
35
+ const next = { ...getDesktopPreferences(), ...updates };
36
+ localStorage.setItem(STORAGE_KEY, JSON.stringify(next));
37
+ window.dispatchEvent(new Event(CHANGED_EVENT));
38
+ return next;
39
+ }
40
+
41
+ export function subscribeDesktopPreferences(listener: () => void): () => void {
42
+ window.addEventListener(CHANGED_EVENT, listener);
43
+ return () => window.removeEventListener(CHANGED_EVENT, listener);
44
+ }