@pascal-app/core 1.0.3 → 1.0.4

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 (1098) hide show
  1. package/dist/agent-operations/__fixtures__/add-object-cases.d.ts +235 -0
  2. package/dist/agent-operations/__fixtures__/add-object-cases.d.ts.map +1 -0
  3. package/dist/agent-operations/__fixtures__/add-object-cases.js +129 -0
  4. package/dist/agent-operations/__fixtures__/build-room-cases.d.ts +4 -0
  5. package/dist/agent-operations/__fixtures__/build-room-cases.d.ts.map +1 -0
  6. package/dist/agent-operations/__fixtures__/build-room-cases.js +635 -0
  7. package/dist/agent-operations/__fixtures__/cases.d.ts +52 -0
  8. package/dist/agent-operations/__fixtures__/cases.d.ts.map +1 -0
  9. package/dist/agent-operations/__fixtures__/cases.js +689 -0
  10. package/dist/agent-operations/__fixtures__/find-by-type-cases.d.ts +7 -0
  11. package/dist/agent-operations/__fixtures__/find-by-type-cases.d.ts.map +1 -0
  12. package/dist/agent-operations/__fixtures__/find-by-type-cases.js +21 -0
  13. package/dist/agent-operations/__fixtures__/place-items-cases.d.ts +17 -0
  14. package/dist/agent-operations/__fixtures__/place-items-cases.d.ts.map +1 -0
  15. package/dist/agent-operations/__fixtures__/place-items-cases.js +506 -0
  16. package/dist/agent-operations/__fixtures__/room-cases.d.ts +3 -0
  17. package/dist/agent-operations/__fixtures__/room-cases.d.ts.map +1 -0
  18. package/dist/agent-operations/__fixtures__/room-cases.js +338 -0
  19. package/dist/agent-operations/__fixtures__/search-assets-cases.d.ts +5 -0
  20. package/dist/agent-operations/__fixtures__/search-assets-cases.d.ts.map +1 -0
  21. package/dist/agent-operations/__fixtures__/search-assets-cases.js +137 -0
  22. package/dist/agent-operations/__fixtures__/structure-cases.d.ts +6 -0
  23. package/dist/agent-operations/__fixtures__/structure-cases.d.ts.map +1 -0
  24. package/dist/agent-operations/__fixtures__/structure-cases.js +588 -0
  25. package/dist/agent-operations/__fixtures__/verify-scene-cases.d.ts +3 -0
  26. package/dist/agent-operations/__fixtures__/verify-scene-cases.d.ts.map +1 -0
  27. package/dist/agent-operations/__fixtures__/verify-scene-cases.js +302 -0
  28. package/dist/agent-operations/achieved.d.ts +16 -0
  29. package/dist/agent-operations/achieved.d.ts.map +1 -0
  30. package/dist/agent-operations/achieved.js +28 -0
  31. package/dist/agent-operations/add-column.d.ts +23 -0
  32. package/dist/agent-operations/add-column.d.ts.map +1 -0
  33. package/dist/agent-operations/add-column.js +97 -0
  34. package/dist/agent-operations/add-level.d.ts +14 -0
  35. package/dist/agent-operations/add-level.d.ts.map +1 -0
  36. package/dist/agent-operations/add-level.js +94 -0
  37. package/dist/agent-operations/add-object.d.ts +114 -0
  38. package/dist/agent-operations/add-object.d.ts.map +1 -0
  39. package/dist/agent-operations/add-object.js +361 -0
  40. package/dist/agent-operations/add-wall.d.ts +15 -0
  41. package/dist/agent-operations/add-wall.d.ts.map +1 -0
  42. package/dist/agent-operations/add-wall.js +47 -0
  43. package/dist/agent-operations/apply-changes.d.ts +16 -0
  44. package/dist/agent-operations/apply-changes.d.ts.map +1 -0
  45. package/dist/agent-operations/apply-changes.js +93 -0
  46. package/dist/agent-operations/apply-outcome.d.ts +15 -0
  47. package/dist/agent-operations/apply-outcome.d.ts.map +1 -0
  48. package/dist/agent-operations/apply-outcome.js +18 -0
  49. package/dist/agent-operations/collections.d.ts +28 -0
  50. package/dist/agent-operations/collections.d.ts.map +1 -0
  51. package/dist/agent-operations/collections.js +130 -0
  52. package/dist/agent-operations/create-room.d.ts +36 -0
  53. package/dist/agent-operations/create-room.d.ts.map +1 -0
  54. package/dist/agent-operations/create-room.js +177 -0
  55. package/dist/agent-operations/create-stair.d.ts +33 -0
  56. package/dist/agent-operations/create-stair.d.ts.map +1 -0
  57. package/dist/agent-operations/create-stair.js +247 -0
  58. package/dist/agent-operations/delete-node.d.ts +6 -0
  59. package/dist/agent-operations/delete-node.d.ts.map +1 -0
  60. package/dist/agent-operations/delete-node.js +9 -0
  61. package/dist/agent-operations/door-clearance.d.ts +135 -0
  62. package/dist/agent-operations/door-clearance.d.ts.map +1 -0
  63. package/dist/agent-operations/door-clearance.js +334 -0
  64. package/dist/agent-operations/duplicate-level.d.ts +12 -0
  65. package/dist/agent-operations/duplicate-level.d.ts.map +1 -0
  66. package/dist/agent-operations/duplicate-level.js +54 -0
  67. package/dist/agent-operations/find-by-type.d.ts +11 -0
  68. package/dist/agent-operations/find-by-type.d.ts.map +1 -0
  69. package/dist/agent-operations/find-by-type.js +94 -0
  70. package/dist/agent-operations/furnish-room.d.ts +18 -0
  71. package/dist/agent-operations/furnish-room.d.ts.map +1 -0
  72. package/dist/agent-operations/furnish-room.js +259 -0
  73. package/dist/agent-operations/get-node.d.ts +9 -0
  74. package/dist/agent-operations/get-node.d.ts.map +1 -0
  75. package/dist/agent-operations/get-node.js +33 -0
  76. package/dist/agent-operations/hosted-services.d.ts +13 -0
  77. package/dist/agent-operations/hosted-services.d.ts.map +1 -0
  78. package/dist/agent-operations/hosted-services.js +22 -0
  79. package/dist/agent-operations/index.d.ts +277 -0
  80. package/dist/agent-operations/index.d.ts.map +1 -0
  81. package/dist/agent-operations/index.js +80 -0
  82. package/dist/agent-operations/layout-clearance.d.ts +108 -0
  83. package/dist/agent-operations/layout-clearance.d.ts.map +1 -0
  84. package/dist/agent-operations/layout-clearance.js +190 -0
  85. package/dist/agent-operations/level-reads.d.ts +33 -0
  86. package/dist/agent-operations/level-reads.d.ts.map +1 -0
  87. package/dist/agent-operations/level-reads.js +161 -0
  88. package/dist/agent-operations/level-target.d.ts +11 -0
  89. package/dist/agent-operations/level-target.d.ts.map +1 -0
  90. package/dist/agent-operations/level-target.js +29 -0
  91. package/dist/agent-operations/list-levels.d.ts +4 -0
  92. package/dist/agent-operations/list-levels.d.ts.map +1 -0
  93. package/dist/agent-operations/list-levels.js +31 -0
  94. package/dist/agent-operations/material-preset.d.ts +11 -0
  95. package/dist/agent-operations/material-preset.d.ts.map +1 -0
  96. package/dist/agent-operations/material-preset.js +74 -0
  97. package/dist/agent-operations/material-refs.d.ts +24 -0
  98. package/dist/agent-operations/material-refs.d.ts.map +1 -0
  99. package/dist/agent-operations/material-refs.js +100 -0
  100. package/dist/agent-operations/node-patch.d.ts +3 -0
  101. package/dist/agent-operations/node-patch.d.ts.map +1 -0
  102. package/dist/agent-operations/node-patch.js +114 -0
  103. package/dist/agent-operations/paint.d.ts +21 -0
  104. package/dist/agent-operations/paint.d.ts.map +1 -0
  105. package/dist/agent-operations/paint.js +219 -0
  106. package/dist/agent-operations/place-items.d.ts +20 -0
  107. package/dist/agent-operations/place-items.d.ts.map +1 -0
  108. package/dist/agent-operations/place-items.js +226 -0
  109. package/dist/agent-operations/plan-geometry.d.ts +24 -0
  110. package/dist/agent-operations/plan-geometry.d.ts.map +1 -0
  111. package/dist/agent-operations/plan-geometry.js +94 -0
  112. package/dist/agent-operations/room-structure.d.ts +87 -0
  113. package/dist/agent-operations/room-structure.d.ts.map +1 -0
  114. package/dist/agent-operations/room-structure.js +144 -0
  115. package/dist/agent-operations/scene-materials.d.ts +15 -0
  116. package/dist/agent-operations/scene-materials.d.ts.map +1 -0
  117. package/dist/agent-operations/scene-materials.js +62 -0
  118. package/dist/agent-operations/scene-measure.d.ts +73 -0
  119. package/dist/agent-operations/scene-measure.d.ts.map +1 -0
  120. package/dist/agent-operations/scene-measure.js +73 -0
  121. package/dist/agent-operations/scene-queries.d.ts +4510 -0
  122. package/dist/agent-operations/scene-queries.d.ts.map +1 -0
  123. package/dist/agent-operations/scene-queries.js +84 -0
  124. package/dist/agent-operations/scene-view.d.ts +98 -0
  125. package/dist/agent-operations/scene-view.d.ts.map +1 -0
  126. package/dist/agent-operations/scene-view.js +559 -0
  127. package/dist/agent-operations/search-assets.d.ts +14 -0
  128. package/dist/agent-operations/search-assets.d.ts.map +1 -0
  129. package/dist/agent-operations/search-assets.js +42 -0
  130. package/dist/agent-operations/search-materials.d.ts +12 -0
  131. package/dist/agent-operations/search-materials.d.ts.map +1 -0
  132. package/dist/agent-operations/search-materials.js +111 -0
  133. package/dist/agent-operations/stairs.d.ts +5 -0
  134. package/dist/agent-operations/stairs.d.ts.map +1 -0
  135. package/dist/agent-operations/stairs.js +70 -0
  136. package/dist/agent-operations/types.d.ts +59 -0
  137. package/dist/agent-operations/types.d.ts.map +1 -0
  138. package/dist/agent-operations/types.js +1 -0
  139. package/dist/agent-operations/verify-scene.d.ts +50 -0
  140. package/dist/agent-operations/verify-scene.d.ts.map +1 -0
  141. package/dist/agent-operations/verify-scene.js +369 -0
  142. package/dist/agent-operations/wall-opening.d.ts +65 -0
  143. package/dist/agent-operations/wall-opening.d.ts.map +1 -0
  144. package/dist/agent-operations/wall-opening.js +55 -0
  145. package/dist/agent-tools/achieved.d.ts +9 -0
  146. package/dist/agent-tools/achieved.d.ts.map +1 -0
  147. package/dist/agent-tools/achieved.js +8 -0
  148. package/dist/agent-tools/add-object.d.ts +43 -0
  149. package/dist/agent-tools/add-object.d.ts.map +1 -0
  150. package/dist/agent-tools/add-object.js +86 -0
  151. package/dist/agent-tools/assets.d.ts +13 -0
  152. package/dist/agent-tools/assets.d.ts.map +1 -0
  153. package/dist/agent-tools/assets.js +18 -0
  154. package/dist/agent-tools/clear-scene.d.ts +10 -0
  155. package/dist/agent-tools/clear-scene.d.ts.map +1 -0
  156. package/dist/agent-tools/clear-scene.js +9 -0
  157. package/dist/agent-tools/collections.d.ts +35 -0
  158. package/dist/agent-tools/collections.d.ts.map +1 -0
  159. package/dist/agent-tools/collections.js +31 -0
  160. package/dist/agent-tools/columns.d.ts +44 -0
  161. package/dist/agent-tools/columns.d.ts.map +1 -0
  162. package/dist/agent-tools/columns.js +59 -0
  163. package/dist/agent-tools/contract.d.ts +68 -0
  164. package/dist/agent-tools/contract.d.ts.map +1 -0
  165. package/dist/agent-tools/contract.js +1 -0
  166. package/dist/agent-tools/create-room.d.ts +63 -0
  167. package/dist/agent-tools/create-room.d.ts.map +1 -0
  168. package/dist/agent-tools/create-room.js +90 -0
  169. package/dist/agent-tools/find-by-type.d.ts +11 -0
  170. package/dist/agent-tools/find-by-type.d.ts.map +1 -0
  171. package/dist/agent-tools/find-by-type.js +14 -0
  172. package/dist/agent-tools/furnish-room.d.ts +26 -0
  173. package/dist/agent-tools/furnish-room.d.ts.map +1 -0
  174. package/dist/agent-tools/furnish-room.js +35 -0
  175. package/dist/agent-tools/hosted-services.d.ts +402 -0
  176. package/dist/agent-tools/hosted-services.d.ts.map +1 -0
  177. package/dist/agent-tools/hosted-services.js +148 -0
  178. package/dist/agent-tools/index.d.ts +864 -0
  179. package/dist/agent-tools/index.d.ts.map +1 -0
  180. package/dist/agent-tools/index.js +82 -0
  181. package/dist/agent-tools/levels.d.ts +72 -0
  182. package/dist/agent-tools/levels.d.ts.map +1 -0
  183. package/dist/agent-tools/levels.js +76 -0
  184. package/dist/agent-tools/measurement.d.ts +37 -0
  185. package/dist/agent-tools/measurement.d.ts.map +1 -0
  186. package/dist/agent-tools/measurement.js +94 -0
  187. package/dist/agent-tools/node-id.d.ts +3 -0
  188. package/dist/agent-tools/node-id.d.ts.map +1 -0
  189. package/dist/agent-tools/node-id.js +2 -0
  190. package/dist/agent-tools/nodes.d.ts +17 -0
  191. package/dist/agent-tools/nodes.d.ts.map +1 -0
  192. package/dist/agent-tools/nodes.js +13 -0
  193. package/dist/agent-tools/paint.d.ts +46 -0
  194. package/dist/agent-tools/paint.d.ts.map +1 -0
  195. package/dist/agent-tools/paint.js +29 -0
  196. package/dist/agent-tools/place-items.d.ts +19 -0
  197. package/dist/agent-tools/place-items.d.ts.map +1 -0
  198. package/dist/agent-tools/place-items.js +29 -0
  199. package/dist/agent-tools/refusal.d.ts +20 -0
  200. package/dist/agent-tools/refusal.d.ts.map +1 -0
  201. package/dist/agent-tools/refusal.js +29 -0
  202. package/dist/agent-tools/room-structure.d.ts +438 -0
  203. package/dist/agent-tools/room-structure.d.ts.map +1 -0
  204. package/dist/agent-tools/room-structure.js +207 -0
  205. package/dist/agent-tools/search-materials.d.ts +20 -0
  206. package/dist/agent-tools/search-materials.d.ts.map +1 -0
  207. package/dist/agent-tools/search-materials.js +32 -0
  208. package/dist/agent-tools/stairs.d.ts +86 -0
  209. package/dist/agent-tools/stairs.d.ts.map +1 -0
  210. package/dist/agent-tools/stairs.js +103 -0
  211. package/dist/agent-tools/verify-scene.d.ts +13 -0
  212. package/dist/agent-tools/verify-scene.d.ts.map +1 -0
  213. package/dist/agent-tools/verify-scene.js +21 -0
  214. package/dist/agent-tools/view-scene.d.ts +43 -0
  215. package/dist/agent-tools/view-scene.d.ts.map +1 -0
  216. package/dist/agent-tools/view-scene.js +80 -0
  217. package/dist/agent-tools/wall-openings.d.ts +163 -0
  218. package/dist/agent-tools/wall-openings.d.ts.map +1 -0
  219. package/dist/agent-tools/wall-openings.js +144 -0
  220. package/dist/agent-tools/walls.d.ts +21 -0
  221. package/dist/agent-tools/walls.d.ts.map +1 -0
  222. package/dist/agent-tools/walls.js +30 -0
  223. package/dist/agent-tools/write-target.d.ts +12 -0
  224. package/dist/agent-tools/write-target.d.ts.map +1 -0
  225. package/dist/agent-tools/write-target.js +10 -0
  226. package/dist/building/__fixtures__/wall-opening-cases.d.ts +736 -0
  227. package/dist/building/__fixtures__/wall-opening-cases.d.ts.map +1 -0
  228. package/dist/building/__fixtures__/wall-opening-cases.js +307 -0
  229. package/dist/building/door-types.d.ts +22 -0
  230. package/dist/building/door-types.d.ts.map +1 -0
  231. package/dist/building/door-types.js +167 -0
  232. package/dist/building/floor-item-fit.d.ts +38 -0
  233. package/dist/building/floor-item-fit.d.ts.map +1 -0
  234. package/dist/building/floor-item-fit.js +47 -0
  235. package/dist/building/index.d.ts +7 -0
  236. package/dist/building/index.d.ts.map +1 -0
  237. package/dist/building/index.js +6 -0
  238. package/dist/building/level-duplication.d.ts +8983 -0
  239. package/dist/building/level-duplication.d.ts.map +1 -0
  240. package/dist/building/level-duplication.js +314 -0
  241. package/dist/building/opening-style-presets.d.ts +46 -0
  242. package/dist/building/opening-style-presets.d.ts.map +1 -0
  243. package/dist/building/opening-style-presets.js +195 -0
  244. package/dist/building/wall-openings.d.ts +445 -0
  245. package/dist/building/wall-openings.d.ts.map +1 -0
  246. package/dist/building/wall-openings.js +231 -0
  247. package/dist/building/window-types.d.ts +17 -0
  248. package/dist/building/window-types.d.ts.map +1 -0
  249. package/dist/building/window-types.js +31 -0
  250. package/dist/commands/structure/apply-zone-transform.d.ts +23 -0
  251. package/dist/commands/structure/apply-zone-transform.d.ts.map +1 -0
  252. package/dist/commands/structure/apply-zone-transform.js +55 -0
  253. package/dist/commands/structure/create-mezzanine.d.ts +12 -0
  254. package/dist/commands/structure/create-mezzanine.d.ts.map +1 -0
  255. package/dist/commands/structure/create-mezzanine.js +46 -0
  256. package/dist/commands/structure/create-zone.d.ts +32 -0
  257. package/dist/commands/structure/create-zone.d.ts.map +1 -0
  258. package/dist/commands/structure/create-zone.js +126 -0
  259. package/dist/commands/structure/delete-zone.d.ts +51 -0
  260. package/dist/commands/structure/delete-zone.d.ts.map +1 -0
  261. package/dist/commands/structure/delete-zone.js +354 -0
  262. package/dist/commands/structure/divide-zone.d.ts +38 -0
  263. package/dist/commands/structure/divide-zone.d.ts.map +1 -0
  264. package/dist/commands/structure/divide-zone.js +186 -0
  265. package/dist/commands/structure/duplicate-zone.d.ts +7 -0
  266. package/dist/commands/structure/duplicate-zone.d.ts.map +1 -0
  267. package/dist/commands/structure/duplicate-zone.js +21 -0
  268. package/dist/commands/structure/floor-opening.d.ts +36 -0
  269. package/dist/commands/structure/floor-opening.d.ts.map +1 -0
  270. package/dist/commands/structure/floor-opening.js +124 -0
  271. package/dist/commands/structure/index.d.ts +22 -0
  272. package/dist/commands/structure/index.d.ts.map +1 -0
  273. package/dist/commands/structure/index.js +20 -0
  274. package/dist/commands/structure/lock-outside-faces.d.ts +12 -0
  275. package/dist/commands/structure/lock-outside-faces.d.ts.map +1 -0
  276. package/dist/commands/structure/lock-outside-faces.js +32 -0
  277. package/dist/commands/structure/merge-zones.d.ts +5 -0
  278. package/dist/commands/structure/merge-zones.d.ts.map +1 -0
  279. package/dist/commands/structure/merge-zones.js +22 -0
  280. package/dist/commands/structure/mezzanine-content.d.ts +16 -0
  281. package/dist/commands/structure/mezzanine-content.d.ts.map +1 -0
  282. package/dist/commands/structure/mezzanine-content.js +109 -0
  283. package/dist/commands/structure/plan-mezzanine-stair.d.ts +7 -0
  284. package/dist/commands/structure/plan-mezzanine-stair.d.ts.map +1 -0
  285. package/dist/commands/structure/plan-mezzanine-stair.js +127 -0
  286. package/dist/commands/structure/plan-wall-deletion.d.ts +9 -0
  287. package/dist/commands/structure/plan-wall-deletion.d.ts.map +1 -0
  288. package/dist/commands/structure/plan-wall-deletion.js +151 -0
  289. package/dist/commands/structure/rebase-floor-reference.d.ts +7 -0
  290. package/dist/commands/structure/rebase-floor-reference.d.ts.map +1 -0
  291. package/dist/commands/structure/rebase-floor-reference.js +90 -0
  292. package/dist/commands/structure/resize-mezzanine.d.ts +8 -0
  293. package/dist/commands/structure/resize-mezzanine.d.ts.map +1 -0
  294. package/dist/commands/structure/resize-mezzanine.js +43 -0
  295. package/dist/commands/structure/rotate-zone.d.ts +8 -0
  296. package/dist/commands/structure/rotate-zone.d.ts.map +1 -0
  297. package/dist/commands/structure/rotate-zone.js +28 -0
  298. package/dist/commands/structure/set-floor-foundation.d.ts +62 -0
  299. package/dist/commands/structure/set-floor-foundation.d.ts.map +1 -0
  300. package/dist/commands/structure/set-floor-foundation.js +162 -0
  301. package/dist/commands/structure/set-room-floor-construction.d.ts +8 -0
  302. package/dist/commands/structure/set-room-floor-construction.d.ts.map +1 -0
  303. package/dist/commands/structure/set-room-floor-construction.js +72 -0
  304. package/dist/commands/structure/set-wall-geometry.d.ts +10 -0
  305. package/dist/commands/structure/set-wall-geometry.d.ts.map +1 -0
  306. package/dist/commands/structure/set-wall-geometry.js +52 -0
  307. package/dist/commands/structure/set-zone-edges.d.ts +14 -0
  308. package/dist/commands/structure/set-zone-edges.d.ts.map +1 -0
  309. package/dist/commands/structure/set-zone-edges.js +143 -0
  310. package/dist/commands/structure/set-zone-intent.d.ts +39 -0
  311. package/dist/commands/structure/set-zone-intent.d.ts.map +1 -0
  312. package/dist/commands/structure/set-zone-intent.js +125 -0
  313. package/dist/commands/structure/shared.d.ts +4512 -0
  314. package/dist/commands/structure/shared.d.ts.map +1 -0
  315. package/dist/commands/structure/shared.js +102 -0
  316. package/dist/commands/structure/transform-zone.d.ts +23 -0
  317. package/dist/commands/structure/transform-zone.d.ts.map +1 -0
  318. package/dist/commands/structure/transform-zone.js +472 -0
  319. package/dist/commands/structure/validate-mezzanine.d.ts +5 -0
  320. package/dist/commands/structure/validate-mezzanine.d.ts.map +1 -0
  321. package/dist/commands/structure/validate-mezzanine.js +46 -0
  322. package/dist/commands/structure/zone-crossings.d.ts +8 -0
  323. package/dist/commands/structure/zone-crossings.d.ts.map +1 -0
  324. package/dist/commands/structure/zone-crossings.js +162 -0
  325. package/dist/commands/structure/zone-drop.d.ts +4 -0
  326. package/dist/commands/structure/zone-drop.d.ts.map +1 -0
  327. package/dist/commands/structure/zone-drop.js +68 -0
  328. package/dist/commands/structure/zone-insertion.d.ts +4 -0
  329. package/dist/commands/structure/zone-insertion.d.ts.map +1 -0
  330. package/dist/commands/structure/zone-insertion.js +200 -0
  331. package/dist/commands/structure/zone-transform-content.d.ts +6 -0
  332. package/dist/commands/structure/zone-transform-content.d.ts.map +1 -0
  333. package/dist/commands/structure/zone-transform-content.js +117 -0
  334. package/dist/commands/structure/zone-wall-merge.d.ts +4977 -0
  335. package/dist/commands/structure/zone-wall-merge.d.ts.map +1 -0
  336. package/dist/commands/structure/zone-wall-merge.js +135 -0
  337. package/dist/contracts/reference-discovery.d.ts +18 -0
  338. package/dist/contracts/reference-discovery.d.ts.map +1 -0
  339. package/dist/contracts/reference-discovery.js +100 -0
  340. package/dist/contracts/reference-inventory.d.ts +44 -0
  341. package/dist/contracts/reference-inventory.d.ts.map +1 -0
  342. package/dist/contracts/reference-inventory.js +872 -0
  343. package/dist/events/bus.d.ts +70 -9
  344. package/dist/events/bus.d.ts.map +1 -1
  345. package/dist/hooks/scene-registry/item-clip-registry.d.ts +6 -3
  346. package/dist/hooks/scene-registry/item-clip-registry.d.ts.map +1 -1
  347. package/dist/hooks/scene-registry/item-clip-registry.js +2 -1
  348. package/dist/hooks/spatial-grid/floor-placed-elevation.d.ts.map +1 -1
  349. package/dist/hooks/spatial-grid/floor-placed-elevation.js +15 -1
  350. package/dist/hooks/spatial-grid/spatial-grid-manager.d.ts +3 -2
  351. package/dist/hooks/spatial-grid/spatial-grid-manager.d.ts.map +1 -1
  352. package/dist/hooks/spatial-grid/spatial-grid-manager.js +53 -66
  353. package/dist/hooks/spatial-grid/spatial-grid-sync.d.ts +1612 -127
  354. package/dist/hooks/spatial-grid/spatial-grid-sync.d.ts.map +1 -1
  355. package/dist/hooks/spatial-grid/spatial-grid-sync.js +86 -83
  356. package/dist/hooks/spatial-grid/support-host-patch.d.ts +1 -0
  357. package/dist/hooks/spatial-grid/support-host-patch.d.ts.map +1 -1
  358. package/dist/hooks/spatial-grid/support-host-patch.js +12 -5
  359. package/dist/index.d.ts +80 -13
  360. package/dist/index.d.ts.map +1 -1
  361. package/dist/index.js +75 -11
  362. package/dist/lib/__bench__/near-linear-walls.d.ts +2 -0
  363. package/dist/lib/__bench__/near-linear-walls.d.ts.map +1 -0
  364. package/dist/lib/__bench__/near-linear-walls.js +24 -0
  365. package/dist/lib/__bench__/structure-preview.bench.d.ts +2 -0
  366. package/dist/lib/__bench__/structure-preview.bench.d.ts.map +1 -0
  367. package/dist/lib/__bench__/structure-preview.bench.js +72 -0
  368. package/dist/lib/__fixtures__/mezzanine.d.ts +13968 -0
  369. package/dist/lib/__fixtures__/mezzanine.d.ts.map +1 -0
  370. package/dist/lib/__fixtures__/mezzanine.js +43 -0
  371. package/dist/lib/absorb-wall-separators.d.ts +4483 -0
  372. package/dist/lib/absorb-wall-separators.d.ts.map +1 -0
  373. package/dist/lib/absorb-wall-separators.js +65 -0
  374. package/dist/lib/angle-accumulator.d.ts +3 -0
  375. package/dist/lib/angle-accumulator.d.ts.map +1 -0
  376. package/dist/lib/angle-accumulator.js +13 -0
  377. package/dist/lib/artifact-store.d.ts +31 -0
  378. package/dist/lib/artifact-store.d.ts.map +1 -0
  379. package/dist/lib/artifact-store.js +42 -0
  380. package/dist/lib/assembly-stack.d.ts +54 -0
  381. package/dist/lib/assembly-stack.d.ts.map +1 -0
  382. package/dist/lib/assembly-stack.js +52 -0
  383. package/dist/lib/asset-storage.d.ts.map +1 -1
  384. package/dist/lib/asset-storage.js +3 -0
  385. package/dist/lib/canonical-opening-ring.d.ts +3 -0
  386. package/dist/lib/canonical-opening-ring.d.ts.map +1 -0
  387. package/dist/lib/canonical-opening-ring.js +14 -0
  388. package/dist/lib/ceiling-children.d.ts +8 -0
  389. package/dist/lib/ceiling-children.d.ts.map +1 -0
  390. package/dist/lib/ceiling-children.js +36 -0
  391. package/dist/lib/ceiling-surface.d.ts +40 -0
  392. package/dist/lib/ceiling-surface.d.ts.map +1 -0
  393. package/dist/lib/ceiling-surface.js +65 -0
  394. package/dist/lib/cutter-host.d.ts +5 -0
  395. package/dist/lib/cutter-host.d.ts.map +1 -0
  396. package/dist/lib/cutter-host.js +30 -0
  397. package/dist/lib/floor-construction-lift.d.ts +4 -0
  398. package/dist/lib/floor-construction-lift.d.ts.map +1 -0
  399. package/dist/lib/floor-construction-lift.js +54 -0
  400. package/dist/lib/floor-footprint-key.d.ts +3 -0
  401. package/dist/lib/floor-footprint-key.d.ts.map +1 -0
  402. package/dist/lib/floor-footprint-key.js +9 -0
  403. package/dist/lib/floor-footprint-name.d.ts +11 -0
  404. package/dist/lib/floor-footprint-name.d.ts.map +1 -0
  405. package/dist/lib/floor-footprint-name.js +52 -0
  406. package/dist/lib/floor-foundation-datum.d.ts +31 -0
  407. package/dist/lib/floor-foundation-datum.d.ts.map +1 -0
  408. package/dist/lib/floor-foundation-datum.js +226 -0
  409. package/dist/lib/floor-foundation-stack.d.ts +16 -0
  410. package/dist/lib/floor-foundation-stack.d.ts.map +1 -0
  411. package/dist/lib/floor-foundation-stack.js +214 -0
  412. package/dist/lib/floor-intent-changes.d.ts +10 -0
  413. package/dist/lib/floor-intent-changes.d.ts.map +1 -0
  414. package/dist/lib/floor-intent-changes.js +461 -0
  415. package/dist/lib/floor-opening-footprints.d.ts +24 -0
  416. package/dist/lib/floor-opening-footprints.d.ts.map +1 -0
  417. package/dist/lib/floor-opening-footprints.js +127 -0
  418. package/dist/lib/floor-opening-intent.d.ts +16 -0
  419. package/dist/lib/floor-opening-intent.d.ts.map +1 -0
  420. package/dist/lib/floor-opening-intent.js +82 -0
  421. package/dist/lib/floor-plate-id.d.ts +5 -0
  422. package/dist/lib/floor-plate-id.d.ts.map +1 -0
  423. package/dist/lib/floor-plate-id.js +20 -0
  424. package/dist/lib/floor-plate-paint.d.ts +8 -0
  425. package/dist/lib/floor-plate-paint.d.ts.map +1 -0
  426. package/dist/lib/floor-plate-paint.js +11 -0
  427. package/dist/lib/floor-plates.d.ts +211 -0
  428. package/dist/lib/floor-plates.d.ts.map +1 -0
  429. package/dist/lib/floor-plates.js +729 -0
  430. package/dist/lib/floor-room-faces.d.ts +5 -0
  431. package/dist/lib/floor-room-faces.d.ts.map +1 -0
  432. package/dist/lib/floor-room-faces.js +29 -0
  433. package/dist/lib/floor-step-finish.d.ts +49 -0
  434. package/dist/lib/floor-step-finish.d.ts.map +1 -0
  435. package/dist/lib/floor-step-finish.js +128 -0
  436. package/dist/lib/geometry-script-node.d.ts +82 -0
  437. package/dist/lib/geometry-script-node.d.ts.map +1 -0
  438. package/dist/lib/geometry-script-node.js +147 -0
  439. package/dist/lib/geometry-surfaces.d.ts +61 -0
  440. package/dist/lib/geometry-surfaces.d.ts.map +1 -0
  441. package/dist/lib/geometry-surfaces.js +156 -0
  442. package/dist/lib/item-slab-support.d.ts +14 -0
  443. package/dist/lib/item-slab-support.d.ts.map +1 -0
  444. package/dist/lib/item-slab-support.js +40 -0
  445. package/dist/lib/level-footprints.d.ts +23 -0
  446. package/dist/lib/level-footprints.d.ts.map +1 -0
  447. package/dist/lib/level-footprints.js +398 -0
  448. package/dist/lib/level-name.d.ts +7 -0
  449. package/dist/lib/level-name.d.ts.map +1 -1
  450. package/dist/lib/level-name.js +11 -3
  451. package/dist/lib/new-zone.d.ts +10 -0
  452. package/dist/lib/new-zone.d.ts.map +1 -0
  453. package/dist/lib/new-zone.js +10 -0
  454. package/dist/lib/node-ancestry.d.ts +30 -0
  455. package/dist/lib/node-ancestry.d.ts.map +1 -0
  456. package/dist/lib/node-ancestry.js +76 -0
  457. package/dist/lib/object-cuts.d.ts +11 -0
  458. package/dist/lib/object-cuts.d.ts.map +1 -0
  459. package/dist/lib/object-cuts.js +63 -0
  460. package/dist/lib/opening-floor-datum.d.ts +24 -0
  461. package/dist/lib/opening-floor-datum.d.ts.map +1 -0
  462. package/dist/lib/opening-floor-datum.js +145 -0
  463. package/dist/lib/own-floor-intent.d.ts +15 -0
  464. package/dist/lib/own-floor-intent.d.ts.map +1 -0
  465. package/dist/lib/own-floor-intent.js +201 -0
  466. package/dist/lib/plate-reference.d.ts +3 -0
  467. package/dist/lib/plate-reference.d.ts.map +1 -0
  468. package/dist/lib/plate-reference.js +91 -0
  469. package/dist/lib/plate-surface.d.ts +120 -0
  470. package/dist/lib/plate-surface.d.ts.map +1 -0
  471. package/dist/lib/plate-surface.js +725 -0
  472. package/dist/lib/polygon-boolean.d.ts +17 -0
  473. package/dist/lib/polygon-boolean.d.ts.map +1 -0
  474. package/dist/lib/polygon-boolean.js +195 -0
  475. package/dist/lib/polygon-label.d.ts +7 -0
  476. package/dist/lib/polygon-label.d.ts.map +1 -0
  477. package/dist/lib/polygon-label.js +94 -0
  478. package/dist/lib/room-drawn-floor.d.ts +29 -0
  479. package/dist/lib/room-drawn-floor.d.ts.map +1 -0
  480. package/dist/lib/room-drawn-floor.js +88 -0
  481. package/dist/lib/room-floor-choices.d.ts +11 -0
  482. package/dist/lib/room-floor-choices.d.ts.map +1 -0
  483. package/dist/lib/room-floor-choices.js +60 -0
  484. package/dist/lib/room-floor-feasibility.d.ts +25 -0
  485. package/dist/lib/room-floor-feasibility.d.ts.map +1 -0
  486. package/dist/lib/room-floor-feasibility.js +293 -0
  487. package/dist/lib/room-floor-plate.d.ts +3 -0
  488. package/dist/lib/room-floor-plate.d.ts.map +1 -0
  489. package/dist/lib/room-floor-plate.js +4 -0
  490. package/dist/lib/room-graph.d.ts +79 -0
  491. package/dist/lib/room-graph.d.ts.map +1 -0
  492. package/dist/lib/room-graph.js +1265 -0
  493. package/dist/lib/room-name.d.ts +10 -0
  494. package/dist/lib/room-name.d.ts.map +1 -0
  495. package/dist/lib/room-name.js +22 -0
  496. package/dist/lib/room-topology-index.d.ts +53 -5
  497. package/dist/lib/room-topology-index.d.ts.map +1 -1
  498. package/dist/lib/room-topology-index.js +176 -30
  499. package/dist/lib/room-vertical-placement.d.ts +12 -0
  500. package/dist/lib/room-vertical-placement.d.ts.map +1 -0
  501. package/dist/lib/room-vertical-placement.js +28 -0
  502. package/dist/lib/room-zone-adoption.d.ts +74 -0
  503. package/dist/lib/room-zone-adoption.d.ts.map +1 -0
  504. package/dist/lib/room-zone-adoption.js +150 -0
  505. package/dist/lib/setback-envelope.d.ts +73 -0
  506. package/dist/lib/setback-envelope.d.ts.map +1 -0
  507. package/dist/lib/setback-envelope.js +506 -0
  508. package/dist/lib/slab-polygon.d.ts.map +1 -1
  509. package/dist/lib/slab-polygon.js +33 -12
  510. package/dist/lib/slots.d.ts +20 -0
  511. package/dist/lib/slots.d.ts.map +1 -1
  512. package/dist/lib/slots.js +44 -0
  513. package/dist/lib/space-detection.d.ts +14 -94
  514. package/dist/lib/space-detection.d.ts.map +1 -1
  515. package/dist/lib/space-detection.js +244 -1616
  516. package/dist/lib/structure-commit.d.ts +38 -0
  517. package/dist/lib/structure-commit.d.ts.map +1 -0
  518. package/dist/lib/structure-commit.js +52 -0
  519. package/dist/lib/structure-kernel.d.ts +66 -0
  520. package/dist/lib/structure-kernel.d.ts.map +1 -0
  521. package/dist/lib/structure-kernel.js +735 -0
  522. package/dist/lib/structure-reconcile.d.ts +15 -0
  523. package/dist/lib/structure-reconcile.d.ts.map +1 -0
  524. package/dist/lib/structure-reconcile.js +218 -0
  525. package/dist/lib/terrain-contours.d.ts +29 -0
  526. package/dist/lib/terrain-contours.d.ts.map +1 -0
  527. package/dist/lib/terrain-contours.js +199 -0
  528. package/dist/lib/terrain-source-persisted.d.ts +42 -0
  529. package/dist/lib/terrain-source-persisted.d.ts.map +1 -0
  530. package/dist/lib/terrain-source-persisted.js +68 -0
  531. package/dist/lib/terrain-source.d.ts +2 -40
  532. package/dist/lib/terrain-source.d.ts.map +1 -1
  533. package/dist/lib/terrain-source.js +2 -68
  534. package/dist/lib/terrain-support-query.d.ts +83 -0
  535. package/dist/lib/terrain-support-query.d.ts.map +1 -0
  536. package/dist/lib/terrain-support-query.js +187 -0
  537. package/dist/lib/terrain-support.d.ts +1 -77
  538. package/dist/lib/terrain-support.d.ts.map +1 -1
  539. package/dist/lib/terrain-support.js +3 -181
  540. package/dist/lib/unit-containment.js +2 -2
  541. package/dist/lib/unit-report.d.ts.map +1 -1
  542. package/dist/lib/unit-report.js +5 -4
  543. package/dist/lib/zone-colors.d.ts +11 -0
  544. package/dist/lib/zone-colors.d.ts.map +1 -0
  545. package/dist/lib/zone-colors.js +32 -0
  546. package/dist/lib/zone-quantities.d.ts.map +1 -1
  547. package/dist/lib/zone-quantities.js +113 -223
  548. package/dist/material-library.d.ts +9 -1
  549. package/dist/material-library.d.ts.map +1 -1
  550. package/dist/material-library.js +550 -1
  551. package/dist/node-slots/block.d.ts +7 -0
  552. package/dist/node-slots/block.d.ts.map +1 -0
  553. package/dist/node-slots/block.js +27 -0
  554. package/dist/node-slots/cabinet.d.ts +4 -0
  555. package/dist/node-slots/cabinet.d.ts.map +1 -0
  556. package/dist/node-slots/cabinet.js +24 -0
  557. package/dist/node-slots/ceiling.d.ts +6 -0
  558. package/dist/node-slots/ceiling.d.ts.map +1 -0
  559. package/dist/node-slots/ceiling.js +7 -0
  560. package/dist/node-slots/column.d.ts +9 -0
  561. package/dist/node-slots/column.d.ts.map +1 -0
  562. package/dist/node-slots/column.js +24 -0
  563. package/dist/node-slots/door.d.ts +9 -0
  564. package/dist/node-slots/door.d.ts.map +1 -0
  565. package/dist/node-slots/door.js +20 -0
  566. package/dist/node-slots/duct.d.ts +5 -0
  567. package/dist/node-slots/duct.d.ts.map +1 -0
  568. package/dist/node-slots/duct.js +5 -0
  569. package/dist/node-slots/elevator.d.ts +9 -0
  570. package/dist/node-slots/elevator.d.ts.map +1 -0
  571. package/dist/node-slots/elevator.js +17 -0
  572. package/dist/node-slots/fence.d.ts +10 -0
  573. package/dist/node-slots/fence.d.ts.map +1 -0
  574. package/dist/node-slots/fence.js +23 -0
  575. package/dist/node-slots/index.d.ts +25 -0
  576. package/dist/node-slots/index.d.ts.map +1 -0
  577. package/dist/node-slots/index.js +92 -0
  578. package/dist/node-slots/lean-to-extension.d.ts +5 -0
  579. package/dist/node-slots/lean-to-extension.d.ts.map +1 -0
  580. package/dist/node-slots/lean-to-extension.js +15 -0
  581. package/dist/node-slots/procedural-item.d.ts +4 -0
  582. package/dist/node-slots/procedural-item.d.ts.map +1 -0
  583. package/dist/node-slots/procedural-item.js +3 -0
  584. package/dist/node-slots/roof-accessories.d.ts +9 -0
  585. package/dist/node-slots/roof-accessories.d.ts.map +1 -0
  586. package/dist/node-slots/roof-accessories.js +34 -0
  587. package/dist/node-slots/shelf.d.ts +9 -0
  588. package/dist/node-slots/shelf.d.ts.map +1 -0
  589. package/dist/node-slots/shelf.js +30 -0
  590. package/dist/node-slots/slab.d.ts +7 -0
  591. package/dist/node-slots/slab.d.ts.map +1 -0
  592. package/dist/node-slots/slab.js +21 -0
  593. package/dist/node-slots/stair.d.ts +8 -0
  594. package/dist/node-slots/stair.d.ts.map +1 -0
  595. package/dist/node-slots/stair.js +17 -0
  596. package/dist/node-slots/wall.d.ts +12 -0
  597. package/dist/node-slots/wall.d.ts.map +1 -0
  598. package/dist/node-slots/wall.js +55 -0
  599. package/dist/node-slots/window.d.ts +5 -0
  600. package/dist/node-slots/window.d.ts.map +1 -0
  601. package/dist/node-slots/window.js +11 -0
  602. package/dist/procedural-items/design-placement.d.ts +49 -0
  603. package/dist/procedural-items/design-placement.d.ts.map +1 -0
  604. package/dist/procedural-items/design-placement.js +129 -0
  605. package/dist/procedural-items/design.d.ts +261 -0
  606. package/dist/procedural-items/design.d.ts.map +1 -0
  607. package/dist/procedural-items/design.js +707 -0
  608. package/dist/procedural-items/fixtures.d.ts +464 -24
  609. package/dist/procedural-items/fixtures.d.ts.map +1 -1
  610. package/dist/procedural-items/index.d.ts +5 -0
  611. package/dist/procedural-items/index.d.ts.map +1 -1
  612. package/dist/procedural-items/index.js +5 -0
  613. package/dist/procedural-items/integration.d.ts +127 -6
  614. package/dist/procedural-items/integration.d.ts.map +1 -1
  615. package/dist/procedural-items/joints.d.ts +56 -0
  616. package/dist/procedural-items/joints.d.ts.map +1 -0
  617. package/dist/procedural-items/joints.js +251 -0
  618. package/dist/procedural-items/library-colors.d.ts +12 -0
  619. package/dist/procedural-items/library-colors.d.ts.map +1 -1
  620. package/dist/procedural-items/library-colors.js +37 -3
  621. package/dist/procedural-items/motion-controller.d.ts +29 -0
  622. package/dist/procedural-items/motion-controller.d.ts.map +1 -0
  623. package/dist/procedural-items/motion-controller.js +130 -0
  624. package/dist/procedural-items/node.d.ts +490 -24
  625. package/dist/procedural-items/node.d.ts.map +1 -1
  626. package/dist/procedural-items/query.d.ts +18 -1
  627. package/dist/procedural-items/query.d.ts.map +1 -1
  628. package/dist/procedural-items/query.js +78 -39
  629. package/dist/procedural-items/recipe.d.ts +258 -14
  630. package/dist/procedural-items/recipe.d.ts.map +1 -1
  631. package/dist/procedural-items/recipe.js +933 -61
  632. package/dist/procedural-items/section.d.ts +27 -0
  633. package/dist/procedural-items/section.d.ts.map +1 -0
  634. package/dist/procedural-items/section.js +237 -0
  635. package/dist/procedural-items/spatial.d.ts +21 -0
  636. package/dist/procedural-items/spatial.d.ts.map +1 -1
  637. package/dist/procedural-items/spatial.js +90 -0
  638. package/dist/registry/handles.d.ts +2 -0
  639. package/dist/registry/handles.d.ts.map +1 -1
  640. package/dist/registry/index.d.ts +6 -4
  641. package/dist/registry/index.d.ts.map +1 -1
  642. package/dist/registry/index.js +4 -2
  643. package/dist/registry/mechanism.d.ts +9 -0
  644. package/dist/registry/mechanism.d.ts.map +1 -0
  645. package/dist/registry/mechanism.js +21 -0
  646. package/dist/registry/registry.d.ts +6 -3
  647. package/dist/registry/registry.d.ts.map +1 -1
  648. package/dist/registry/registry.js +59 -22
  649. package/dist/registry/scene-api.d.ts +20 -0
  650. package/dist/registry/scene-api.d.ts.map +1 -1
  651. package/dist/registry/scene-api.js +26 -13
  652. package/dist/registry/subtree.d.ts +8 -0
  653. package/dist/registry/subtree.d.ts.map +1 -1
  654. package/dist/registry/subtree.js +53 -0
  655. package/dist/registry/types.d.ts +340 -11
  656. package/dist/registry/types.d.ts.map +1 -1
  657. package/dist/schema/__fixtures__/node-fixtures.d.ts.map +1 -1
  658. package/dist/schema/__fixtures__/node-fixtures.js +2 -0
  659. package/dist/schema/assembly.d.ts +153 -0
  660. package/dist/schema/assembly.d.ts.map +1 -0
  661. package/dist/schema/assembly.js +155 -0
  662. package/dist/schema/asset-url.d.ts +2 -1
  663. package/dist/schema/asset-url.d.ts.map +1 -1
  664. package/dist/schema/asset-url.js +5 -2
  665. package/dist/schema/base.d.ts +26 -0
  666. package/dist/schema/base.d.ts.map +1 -1
  667. package/dist/schema/base.js +2 -0
  668. package/dist/schema/collection-templates.d.ts +46 -0
  669. package/dist/schema/collection-templates.d.ts.map +1 -0
  670. package/dist/schema/collection-templates.js +14 -0
  671. package/dist/schema/collections.d.ts +7 -0
  672. package/dist/schema/collections.d.ts.map +1 -1
  673. package/dist/schema/cut.d.ts +29 -0
  674. package/dist/schema/cut.d.ts.map +1 -0
  675. package/dist/schema/cut.js +50 -0
  676. package/dist/schema/geometry-metadata.d.ts +51 -0
  677. package/dist/schema/geometry-metadata.d.ts.map +1 -0
  678. package/dist/schema/geometry-metadata.js +57 -0
  679. package/dist/schema/geometry-source.d.ts +250 -0
  680. package/dist/schema/geometry-source.d.ts.map +1 -0
  681. package/dist/schema/geometry-source.js +130 -0
  682. package/dist/schema/index.d.ts +19 -7
  683. package/dist/schema/index.d.ts.map +1 -1
  684. package/dist/schema/index.js +21 -5
  685. package/dist/schema/nodes/block.d.ts +26 -0
  686. package/dist/schema/nodes/block.d.ts.map +1 -1
  687. package/dist/schema/nodes/block.js +1 -1
  688. package/dist/schema/nodes/box-vent.d.ts +26 -0
  689. package/dist/schema/nodes/box-vent.d.ts.map +1 -1
  690. package/dist/schema/nodes/building.d.ts +26 -0
  691. package/dist/schema/nodes/building.d.ts.map +1 -1
  692. package/dist/schema/nodes/cabinet.d.ts +61 -9
  693. package/dist/schema/nodes/cabinet.d.ts.map +1 -1
  694. package/dist/schema/nodes/ceiling.d.ts +37 -0
  695. package/dist/schema/nodes/ceiling.d.ts.map +1 -1
  696. package/dist/schema/nodes/ceiling.js +8 -0
  697. package/dist/schema/nodes/chimney.d.ts +26 -0
  698. package/dist/schema/nodes/chimney.d.ts.map +1 -1
  699. package/dist/schema/nodes/column.d.ts +126 -0
  700. package/dist/schema/nodes/column.d.ts.map +1 -1
  701. package/dist/schema/nodes/column.js +2 -0
  702. package/dist/schema/nodes/construction-dimension.d.ts +26 -0
  703. package/dist/schema/nodes/construction-dimension.d.ts.map +1 -1
  704. package/dist/schema/nodes/cupola.d.ts +26 -0
  705. package/dist/schema/nodes/cupola.d.ts.map +1 -1
  706. package/dist/schema/nodes/curtain-wall.d.ts +5 -5
  707. package/dist/schema/nodes/door.d.ts +139 -20
  708. package/dist/schema/nodes/door.d.ts.map +1 -1
  709. package/dist/schema/nodes/door.js +18 -33
  710. package/dist/schema/nodes/dormer.d.ts +28 -2
  711. package/dist/schema/nodes/dormer.d.ts.map +1 -1
  712. package/dist/schema/nodes/downspout.d.ts +27 -1
  713. package/dist/schema/nodes/downspout.d.ts.map +1 -1
  714. package/dist/schema/nodes/duct-fitting.d.ts +27 -1
  715. package/dist/schema/nodes/duct-fitting.d.ts.map +1 -1
  716. package/dist/schema/nodes/duct-segment.d.ts +27 -1
  717. package/dist/schema/nodes/duct-segment.d.ts.map +1 -1
  718. package/dist/schema/nodes/duct-terminal.d.ts +26 -0
  719. package/dist/schema/nodes/duct-terminal.d.ts.map +1 -1
  720. package/dist/schema/nodes/elevator.d.ts +26 -0
  721. package/dist/schema/nodes/elevator.d.ts.map +1 -1
  722. package/dist/schema/nodes/eyebrow-vent.d.ts +26 -0
  723. package/dist/schema/nodes/eyebrow-vent.d.ts.map +1 -1
  724. package/dist/schema/nodes/fence-feature.d.ts +141 -0
  725. package/dist/schema/nodes/fence-feature.d.ts.map +1 -0
  726. package/dist/schema/nodes/fence-feature.js +21 -0
  727. package/dist/schema/nodes/fence.d.ts +186 -0
  728. package/dist/schema/nodes/fence.d.ts.map +1 -1
  729. package/dist/schema/nodes/fence.js +92 -7
  730. package/dist/schema/nodes/floor-opening.d.ts +61 -0
  731. package/dist/schema/nodes/floor-opening.d.ts.map +1 -0
  732. package/dist/schema/nodes/floor-opening.js +17 -0
  733. package/dist/schema/nodes/guide.d.ts +26 -0
  734. package/dist/schema/nodes/guide.d.ts.map +1 -1
  735. package/dist/schema/nodes/gutter.d.ts +26 -0
  736. package/dist/schema/nodes/gutter.d.ts.map +1 -1
  737. package/dist/schema/nodes/hvac-equipment.d.ts +26 -0
  738. package/dist/schema/nodes/hvac-equipment.d.ts.map +1 -1
  739. package/dist/schema/nodes/imported-mesh.d.ts +26 -0
  740. package/dist/schema/nodes/imported-mesh.d.ts.map +1 -1
  741. package/dist/schema/nodes/item.d.ts +153 -2
  742. package/dist/schema/nodes/item.d.ts.map +1 -1
  743. package/dist/schema/nodes/item.js +13 -0
  744. package/dist/schema/nodes/lean-to-extension.d.ts +26 -0
  745. package/dist/schema/nodes/lean-to-extension.d.ts.map +1 -1
  746. package/dist/schema/nodes/level.d.ts +27 -1
  747. package/dist/schema/nodes/level.d.ts.map +1 -1
  748. package/dist/schema/nodes/lineset.d.ts +26 -0
  749. package/dist/schema/nodes/lineset.d.ts.map +1 -1
  750. package/dist/schema/nodes/liquid-line.d.ts +26 -0
  751. package/dist/schema/nodes/liquid-line.d.ts.map +1 -1
  752. package/dist/schema/nodes/measurement.d.ts +26 -0
  753. package/dist/schema/nodes/measurement.d.ts.map +1 -1
  754. package/dist/schema/nodes/opening-types.d.ts +41 -0
  755. package/dist/schema/nodes/opening-types.d.ts.map +1 -0
  756. package/dist/schema/nodes/opening-types.js +48 -0
  757. package/dist/schema/nodes/pipe-fitting.d.ts +26 -0
  758. package/dist/schema/nodes/pipe-fitting.d.ts.map +1 -1
  759. package/dist/schema/nodes/pipe-segment.d.ts +26 -0
  760. package/dist/schema/nodes/pipe-segment.d.ts.map +1 -1
  761. package/dist/schema/nodes/pipe-trap.d.ts +26 -0
  762. package/dist/schema/nodes/pipe-trap.d.ts.map +1 -1
  763. package/dist/schema/nodes/ridge-vent.d.ts +26 -0
  764. package/dist/schema/nodes/ridge-vent.d.ts.map +1 -1
  765. package/dist/schema/nodes/roof-segment-walls.d.ts.map +1 -1
  766. package/dist/schema/nodes/roof-segment-walls.js +2 -1
  767. package/dist/schema/nodes/roof-segment.d.ts +30 -2
  768. package/dist/schema/nodes/roof-segment.d.ts.map +1 -1
  769. package/dist/schema/nodes/roof-segment.js +9 -0
  770. package/dist/schema/nodes/roof.d.ts +101 -0
  771. package/dist/schema/nodes/roof.d.ts.map +1 -1
  772. package/dist/schema/nodes/roof.js +6 -0
  773. package/dist/schema/nodes/scan.d.ts +26 -0
  774. package/dist/schema/nodes/scan.d.ts.map +1 -1
  775. package/dist/schema/nodes/separator.d.ts +50 -0
  776. package/dist/schema/nodes/separator.d.ts.map +1 -0
  777. package/dist/schema/nodes/separator.js +8 -0
  778. package/dist/schema/nodes/shelf.d.ts +26 -0
  779. package/dist/schema/nodes/shelf.d.ts.map +1 -1
  780. package/dist/schema/nodes/site.d.ts +192 -0
  781. package/dist/schema/nodes/site.d.ts.map +1 -1
  782. package/dist/schema/nodes/site.js +178 -1
  783. package/dist/schema/nodes/skylight.d.ts +30 -4
  784. package/dist/schema/nodes/skylight.d.ts.map +1 -1
  785. package/dist/schema/nodes/slab.d.ts +84 -0
  786. package/dist/schema/nodes/slab.d.ts.map +1 -1
  787. package/dist/schema/nodes/slab.js +37 -2
  788. package/dist/schema/nodes/solar-panel.d.ts +26 -0
  789. package/dist/schema/nodes/solar-panel.d.ts.map +1 -1
  790. package/dist/schema/nodes/spawn.d.ts +26 -0
  791. package/dist/schema/nodes/spawn.d.ts.map +1 -1
  792. package/dist/schema/nodes/stair-construction.d.ts +21 -0
  793. package/dist/schema/nodes/stair-construction.d.ts.map +1 -0
  794. package/dist/schema/nodes/stair-construction.js +13 -0
  795. package/dist/schema/nodes/stair-design-targets.d.ts +9 -0
  796. package/dist/schema/nodes/stair-design-targets.d.ts.map +1 -0
  797. package/dist/schema/nodes/stair-design-targets.js +7 -0
  798. package/dist/schema/nodes/stair-segment.d.ts +72 -4
  799. package/dist/schema/nodes/stair-segment.d.ts.map +1 -1
  800. package/dist/schema/nodes/stair-segment.js +13 -0
  801. package/dist/schema/nodes/stair.d.ts +119 -2
  802. package/dist/schema/nodes/stair.d.ts.map +1 -1
  803. package/dist/schema/nodes/stair.js +59 -2
  804. package/dist/schema/nodes/structural-grid.d.ts +26 -0
  805. package/dist/schema/nodes/structural-grid.d.ts.map +1 -1
  806. package/dist/schema/nodes/surface-hole-metadata.d.ts +3 -0
  807. package/dist/schema/nodes/surface-hole-metadata.d.ts.map +1 -1
  808. package/dist/schema/nodes/surface-hole-metadata.js +2 -1
  809. package/dist/schema/nodes/surface-paint-region.d.ts +14 -0
  810. package/dist/schema/nodes/surface-paint-region.d.ts.map +1 -0
  811. package/dist/schema/nodes/surface-paint-region.js +12 -0
  812. package/dist/schema/nodes/turbine-vent.d.ts +26 -0
  813. package/dist/schema/nodes/turbine-vent.d.ts.map +1 -1
  814. package/dist/schema/nodes/unit.d.ts +26 -0
  815. package/dist/schema/nodes/unit.d.ts.map +1 -1
  816. package/dist/schema/nodes/wall.d.ts +352 -61
  817. package/dist/schema/nodes/wall.d.ts.map +1 -1
  818. package/dist/schema/nodes/wall.js +185 -186
  819. package/dist/schema/nodes/window.d.ts +139 -20
  820. package/dist/schema/nodes/window.d.ts.map +1 -1
  821. package/dist/schema/nodes/window.js +12 -14
  822. package/dist/schema/nodes/zone.d.ts +69 -1
  823. package/dist/schema/nodes/zone.d.ts.map +1 -1
  824. package/dist/schema/nodes/zone.js +46 -0
  825. package/dist/schema/provenance.d.ts +118 -0
  826. package/dist/schema/provenance.d.ts.map +1 -0
  827. package/dist/schema/provenance.js +76 -0
  828. package/dist/schema/source-ref.d.ts +23 -0
  829. package/dist/schema/source-ref.d.ts.map +1 -0
  830. package/dist/schema/source-ref.js +29 -0
  831. package/dist/schema/types.d.ts +3317 -68
  832. package/dist/schema/types.d.ts.map +1 -1
  833. package/dist/schema/types.js +7 -0
  834. package/dist/services/alignment-anchors.d.ts +2 -1
  835. package/dist/services/alignment-anchors.d.ts.map +1 -1
  836. package/dist/services/alignment-anchors.js +9 -6
  837. package/dist/services/index.d.ts +1 -1
  838. package/dist/services/index.d.ts.map +1 -1
  839. package/dist/services/index.js +1 -1
  840. package/dist/services/level-height.d.ts.map +1 -1
  841. package/dist/services/level-height.js +6 -4
  842. package/dist/services/storey.d.ts +21 -1
  843. package/dist/services/storey.d.ts.map +1 -1
  844. package/dist/services/storey.js +94 -8
  845. package/dist/services/surface-hosting.d.ts.map +1 -1
  846. package/dist/services/surface-hosting.js +4 -1
  847. package/dist/store/actions/node-actions.d.ts +4563 -8
  848. package/dist/store/actions/node-actions.d.ts.map +1 -1
  849. package/dist/store/actions/node-actions.js +495 -174
  850. package/dist/store/derived-node-guard.d.ts +84 -0
  851. package/dist/store/derived-node-guard.d.ts.map +1 -0
  852. package/dist/store/derived-node-guard.js +586 -0
  853. package/dist/store/history-control.d.ts +34 -0
  854. package/dist/store/history-control.d.ts.map +1 -1
  855. package/dist/store/history-control.js +99 -1
  856. package/dist/store/history-drafts.d.ts +48 -0
  857. package/dist/store/history-drafts.d.ts.map +1 -0
  858. package/dist/store/history-drafts.js +403 -0
  859. package/dist/store/history-invalidation.d.ts.map +1 -1
  860. package/dist/store/history-invalidation.js +1 -0
  861. package/dist/store/item-interaction.d.ts +28 -0
  862. package/dist/store/item-interaction.d.ts.map +1 -0
  863. package/dist/store/item-interaction.js +34 -0
  864. package/dist/store/registered-node-defaults.d.ts +11 -0
  865. package/dist/store/registered-node-defaults.d.ts.map +1 -0
  866. package/dist/store/registered-node-defaults.js +25 -0
  867. package/dist/store/scene-annotations.d.ts +8969 -0
  868. package/dist/store/scene-annotations.d.ts.map +1 -0
  869. package/dist/store/scene-annotations.js +107 -0
  870. package/dist/store/use-interactive.d.ts +23 -1
  871. package/dist/store/use-interactive.d.ts.map +1 -1
  872. package/dist/store/use-interactive.js +128 -5
  873. package/dist/store/use-scene.d.ts +68 -12
  874. package/dist/store/use-scene.d.ts.map +1 -1
  875. package/dist/store/use-scene.js +416 -305
  876. package/dist/systems/elevator/elevator-opening-sync.d.ts.map +1 -1
  877. package/dist/systems/elevator/elevator-opening-sync.js +4 -6
  878. package/dist/systems/elevator/elevator-opening-system.d.ts.map +1 -1
  879. package/dist/systems/elevator/elevator-opening-system.js +12 -6
  880. package/dist/systems/elevator/elevator-service.d.ts.map +1 -1
  881. package/dist/systems/elevator/elevator-service.js +8 -3
  882. package/dist/systems/fence/fence-centerline.d.ts.map +1 -1
  883. package/dist/systems/fence/fence-centerline.js +6 -5
  884. package/dist/systems/fence/fence-features.d.ts +36 -0
  885. package/dist/systems/fence/fence-features.d.ts.map +1 -0
  886. package/dist/systems/fence/fence-features.js +105 -0
  887. package/dist/systems/fence/fence-spline.d.ts +8 -5
  888. package/dist/systems/fence/fence-spline.d.ts.map +1 -1
  889. package/dist/systems/fence/fence-spline.js +51 -16
  890. package/dist/systems/owned-floor-openings.d.ts +9 -0
  891. package/dist/systems/owned-floor-openings.d.ts.map +1 -0
  892. package/dist/systems/owned-floor-openings.js +326 -0
  893. package/dist/systems/reconcile-owned-floor-openings.d.ts +3 -0
  894. package/dist/systems/reconcile-owned-floor-openings.d.ts.map +1 -0
  895. package/dist/systems/reconcile-owned-floor-openings.js +25 -0
  896. package/dist/systems/slab/__fixtures__/doorway-steps.d.ts +8 -0
  897. package/dist/systems/slab/__fixtures__/doorway-steps.d.ts.map +1 -0
  898. package/dist/systems/slab/__fixtures__/doorway-steps.js +62 -0
  899. package/dist/systems/slab/__fixtures__/floor-step.d.ts +5636 -0
  900. package/dist/systems/slab/__fixtures__/floor-step.d.ts.map +1 -0
  901. package/dist/systems/slab/__fixtures__/floor-step.js +66 -0
  902. package/dist/systems/slab/__fixtures__/raised-room.d.ts +5775 -0
  903. package/dist/systems/slab/__fixtures__/raised-room.d.ts.map +1 -0
  904. package/dist/systems/slab/__fixtures__/raised-room.js +54 -0
  905. package/dist/systems/slab/ensure-slab-openings.d.ts +9 -0
  906. package/dist/systems/slab/ensure-slab-openings.d.ts.map +1 -0
  907. package/dist/systems/slab/ensure-slab-openings.js +41 -0
  908. package/dist/systems/slab/slab-support.d.ts +25 -6
  909. package/dist/systems/slab/slab-support.d.ts.map +1 -1
  910. package/dist/systems/slab/slab-support.js +471 -54
  911. package/dist/systems/stair/stair-base-elevation.d.ts +3 -0
  912. package/dist/systems/stair/stair-base-elevation.d.ts.map +1 -0
  913. package/dist/systems/stair/stair-base-elevation.js +49 -0
  914. package/dist/systems/stair/stair-clearance.d.ts +39 -0
  915. package/dist/systems/stair/stair-clearance.d.ts.map +1 -0
  916. package/dist/systems/stair/stair-clearance.js +508 -0
  917. package/dist/systems/stair/stair-construction.d.ts +37 -0
  918. package/dist/systems/stair/stair-construction.d.ts.map +1 -0
  919. package/dist/systems/stair/stair-construction.js +314 -0
  920. package/dist/systems/stair/stair-detail-budget.d.ts +13 -0
  921. package/dist/systems/stair/stair-detail-budget.d.ts.map +1 -0
  922. package/dist/systems/stair/stair-detail-budget.js +64 -0
  923. package/dist/systems/stair/stair-flight.d.ts +2 -2
  924. package/dist/systems/stair/stair-flight.d.ts.map +1 -1
  925. package/dist/systems/stair/stair-flight.js +4 -3
  926. package/dist/systems/stair/stair-floor-footprints.d.ts +7 -0
  927. package/dist/systems/stair/stair-floor-footprints.d.ts.map +1 -0
  928. package/dist/systems/stair/stair-floor-footprints.js +113 -0
  929. package/dist/systems/stair/stair-footprint.d.ts +3 -1
  930. package/dist/systems/stair/stair-footprint.d.ts.map +1 -1
  931. package/dist/systems/stair/stair-footprint.js +97 -44
  932. package/dist/systems/stair/stair-layout.d.ts +39 -0
  933. package/dist/systems/stair/stair-layout.d.ts.map +1 -0
  934. package/dist/systems/stair/stair-layout.js +58 -0
  935. package/dist/systems/stair/stair-opening-preview.d.ts +1612 -80
  936. package/dist/systems/stair/stair-opening-preview.d.ts.map +1 -1
  937. package/dist/systems/stair/stair-opening-sync.d.ts +8 -2
  938. package/dist/systems/stair/stair-opening-sync.d.ts.map +1 -1
  939. package/dist/systems/stair/stair-opening-sync.js +136 -315
  940. package/dist/systems/stair/stair-opening-system.d.ts.map +1 -1
  941. package/dist/systems/stair/stair-opening-system.js +40 -8
  942. package/dist/systems/stair/stair-presets.d.ts +276 -0
  943. package/dist/systems/stair/stair-presets.d.ts.map +1 -0
  944. package/dist/systems/stair/stair-presets.js +151 -0
  945. package/dist/systems/stair/stair-rail-budget.d.ts +6 -0
  946. package/dist/systems/stair/stair-rail-budget.d.ts.map +1 -0
  947. package/dist/systems/stair/stair-rail-budget.js +36 -0
  948. package/dist/systems/stair/stair-rail-path.d.ts +22 -0
  949. package/dist/systems/stair/stair-rail-path.d.ts.map +1 -0
  950. package/dist/systems/stair/stair-rail-path.js +497 -0
  951. package/dist/systems/stair/stair-rise-edit.d.ts +9 -0
  952. package/dist/systems/stair/stair-rise-edit.d.ts.map +1 -0
  953. package/dist/systems/stair/stair-rise-edit.js +46 -0
  954. package/dist/systems/stair/stair-rise-query.d.ts +24 -0
  955. package/dist/systems/stair/stair-rise-query.d.ts.map +1 -0
  956. package/dist/systems/stair/stair-rise-query.js +125 -0
  957. package/dist/systems/stair/stair-rise.d.ts +4 -19
  958. package/dist/systems/stair/stair-rise.d.ts.map +1 -1
  959. package/dist/systems/stair/stair-rise.js +8 -71
  960. package/dist/systems/stair/stair-sizing.d.ts +414 -0
  961. package/dist/systems/stair/stair-sizing.d.ts.map +1 -0
  962. package/dist/systems/stair/stair-sizing.js +255 -0
  963. package/dist/systems/stair/stair-sweep-edit.d.ts +7 -0
  964. package/dist/systems/stair/stair-sweep-edit.d.ts.map +1 -0
  965. package/dist/systems/stair/stair-sweep-edit.js +8 -0
  966. package/dist/systems/stair/stair-walking-line.d.ts +5 -0
  967. package/dist/systems/stair/stair-walking-line.d.ts.map +1 -0
  968. package/dist/systems/stair/stair-walking-line.js +91 -0
  969. package/dist/systems/stair/stair-winder.d.ts +36 -0
  970. package/dist/systems/stair/stair-winder.d.ts.map +1 -0
  971. package/dist/systems/stair/stair-winder.js +173 -0
  972. package/dist/systems/wall/wall-assembly.d.ts +234 -0
  973. package/dist/systems/wall/wall-assembly.d.ts.map +1 -0
  974. package/dist/systems/wall/wall-assembly.js +854 -0
  975. package/dist/systems/wall/wall-curve.d.ts +2 -1
  976. package/dist/systems/wall/wall-curve.d.ts.map +1 -1
  977. package/dist/systems/wall/wall-curve.js +21 -5
  978. package/dist/systems/wall/wall-finish.d.ts +102 -0
  979. package/dist/systems/wall/wall-finish.d.ts.map +1 -0
  980. package/dist/systems/wall/wall-finish.js +264 -0
  981. package/dist/systems/wall/wall-footprint.d.ts +3 -0
  982. package/dist/systems/wall/wall-footprint.d.ts.map +1 -1
  983. package/dist/systems/wall/wall-footprint.js +15 -13
  984. package/dist/systems/wall/wall-frame.d.ts +45 -0
  985. package/dist/systems/wall/wall-frame.d.ts.map +1 -0
  986. package/dist/systems/wall/wall-frame.js +162 -0
  987. package/dist/systems/wall/wall-layer-bands.d.ts +38 -0
  988. package/dist/systems/wall/wall-layer-bands.d.ts.map +1 -0
  989. package/dist/systems/wall/wall-layer-bands.js +109 -0
  990. package/dist/systems/wall/wall-merge.d.ts +20 -1
  991. package/dist/systems/wall/wall-merge.d.ts.map +1 -1
  992. package/dist/systems/wall/wall-merge.js +189 -18
  993. package/dist/systems/wall/wall-mitering.d.ts +6 -5
  994. package/dist/systems/wall/wall-mitering.d.ts.map +1 -1
  995. package/dist/systems/wall/wall-mitering.js +70 -20
  996. package/dist/systems/wall/wall-operations.d.ts +1 -1
  997. package/dist/systems/wall/wall-operations.d.ts.map +1 -1
  998. package/dist/systems/wall/wall-operations.js +2 -1
  999. package/dist/systems/wall/wall-paint-plan.d.ts +30 -0
  1000. package/dist/systems/wall/wall-paint-plan.d.ts.map +1 -0
  1001. package/dist/systems/wall/wall-paint-plan.js +167 -0
  1002. package/dist/systems/wall/wall-room-sides.d.ts +6 -0
  1003. package/dist/systems/wall/wall-room-sides.d.ts.map +1 -0
  1004. package/dist/systems/wall/wall-room-sides.js +14 -0
  1005. package/dist/systems/wall/wall-step-openings.d.ts +17 -0
  1006. package/dist/systems/wall/wall-step-openings.d.ts.map +1 -0
  1007. package/dist/systems/wall/wall-step-openings.js +32 -0
  1008. package/dist/systems/wall/wall-top.d.ts +2 -6
  1009. package/dist/systems/wall/wall-top.d.ts.map +1 -1
  1010. package/dist/systems/wall/wall-top.js +3 -9
  1011. package/dist/systems/wall/wall-topology.d.ts +21 -0
  1012. package/dist/systems/wall/wall-topology.d.ts.map +1 -1
  1013. package/dist/systems/wall/wall-topology.js +405 -4
  1014. package/dist/utils/clone-scene-graph.d.ts +6 -0
  1015. package/dist/utils/clone-scene-graph.d.ts.map +1 -1
  1016. package/dist/utils/clone-scene-graph.js +123 -15
  1017. package/dist/utils/ensure-scene-openings.d.ts +8965 -0
  1018. package/dist/utils/ensure-scene-openings.d.ts.map +1 -0
  1019. package/dist/utils/ensure-scene-openings.js +29 -0
  1020. package/dist/utils/exterior-threshold-migration.d.ts +4 -0
  1021. package/dist/utils/exterior-threshold-migration.d.ts.map +1 -0
  1022. package/dist/utils/exterior-threshold-migration.js +114 -0
  1023. package/dist/utils/floor-follow-migration.d.ts +3 -0
  1024. package/dist/utils/floor-follow-migration.d.ts.map +1 -0
  1025. package/dist/utils/floor-follow-migration.js +29 -0
  1026. package/dist/utils/floor-opening-migration.d.ts +13 -0
  1027. package/dist/utils/floor-opening-migration.d.ts.map +1 -0
  1028. package/dist/utils/floor-opening-migration.js +148 -0
  1029. package/dist/utils/floor-piece-adoption.d.ts +50 -0
  1030. package/dist/utils/floor-piece-adoption.d.ts.map +1 -0
  1031. package/dist/utils/floor-piece-adoption.js +182 -0
  1032. package/dist/utils/floor-plate-migration.d.ts +4507 -0
  1033. package/dist/utils/floor-plate-migration.d.ts.map +1 -0
  1034. package/dist/utils/floor-plate-migration.js +1360 -0
  1035. package/dist/utils/heal-plan-coordinates.d.ts +2 -0
  1036. package/dist/utils/heal-plan-coordinates.d.ts.map +1 -0
  1037. package/dist/utils/heal-plan-coordinates.js +69 -0
  1038. package/dist/utils/heal-scene-graph.d.ts +20 -6
  1039. package/dist/utils/heal-scene-graph.d.ts.map +1 -1
  1040. package/dist/utils/heal-scene-graph.js +61 -16
  1041. package/dist/utils/legacy-material-slots.d.ts +23 -0
  1042. package/dist/utils/legacy-material-slots.d.ts.map +1 -0
  1043. package/dist/utils/legacy-material-slots.js +120 -0
  1044. package/dist/utils/legacy-opening-datums.d.ts +11 -0
  1045. package/dist/utils/legacy-opening-datums.d.ts.map +1 -0
  1046. package/dist/utils/legacy-opening-datums.js +92 -0
  1047. package/dist/utils/legacy-wall-datums.d.ts +6 -0
  1048. package/dist/utils/legacy-wall-datums.d.ts.map +1 -0
  1049. package/dist/utils/legacy-wall-datums.js +199 -0
  1050. package/dist/utils/load-migration.d.ts +28 -0
  1051. package/dist/utils/load-migration.d.ts.map +1 -0
  1052. package/dist/utils/load-migration.js +89 -0
  1053. package/dist/utils/node-defaults.d.ts +37 -0
  1054. package/dist/utils/node-defaults.d.ts.map +1 -0
  1055. package/dist/utils/node-defaults.js +96 -0
  1056. package/dist/utils/normalize-legacy-structure.d.ts +2 -0
  1057. package/dist/utils/normalize-legacy-structure.d.ts.map +1 -0
  1058. package/dist/utils/normalize-legacy-structure.js +61 -0
  1059. package/dist/utils/omit-undefined.d.ts +2 -0
  1060. package/dist/utils/omit-undefined.d.ts.map +1 -0
  1061. package/dist/utils/omit-undefined.js +17 -0
  1062. package/dist/utils/owned-floor-opening-migration.d.ts +4489 -0
  1063. package/dist/utils/owned-floor-opening-migration.d.ts.map +1 -0
  1064. package/dist/utils/owned-floor-opening-migration.js +365 -0
  1065. package/dist/utils/reconcile-structure-on-load.d.ts +8965 -0
  1066. package/dist/utils/reconcile-structure-on-load.d.ts.map +1 -0
  1067. package/dist/utils/reconcile-structure-on-load.js +307 -0
  1068. package/dist/utils/room-zone-migration.d.ts +18 -0
  1069. package/dist/utils/room-zone-migration.d.ts.map +1 -0
  1070. package/dist/utils/room-zone-migration.js +258 -0
  1071. package/dist/utils/scene-migrations.d.ts +16 -1
  1072. package/dist/utils/scene-migrations.d.ts.map +1 -1
  1073. package/dist/utils/scene-migrations.js +15 -1
  1074. package/dist/utils/structure-id.d.ts +4 -0
  1075. package/dist/utils/structure-id.d.ts.map +1 -0
  1076. package/dist/utils/structure-id.js +115 -0
  1077. package/dist/utils/vertical-scene-migration.d.ts +8 -8
  1078. package/dist/utils/vertical-scene-migration.d.ts.map +1 -1
  1079. package/dist/utils/vertical-scene-migration.js +18 -8
  1080. package/dist/utils/wall-assembly-migration.d.ts +14 -0
  1081. package/dist/utils/wall-assembly-migration.d.ts.map +1 -0
  1082. package/dist/utils/wall-assembly-migration.js +23 -0
  1083. package/dist/utils/wall-face-migration.d.ts +23 -0
  1084. package/dist/utils/wall-face-migration.d.ts.map +1 -0
  1085. package/dist/utils/wall-face-migration.js +246 -0
  1086. package/dist/validation/opening-bounds.d.ts +36 -0
  1087. package/dist/validation/opening-bounds.d.ts.map +1 -0
  1088. package/dist/validation/opening-bounds.js +34 -0
  1089. package/dist/validation/validate-build-json.d.ts +2 -0
  1090. package/dist/validation/validate-build-json.d.ts.map +1 -1
  1091. package/dist/validation/validate-build-json.js +36 -1
  1092. package/package.json +36 -3
  1093. package/dist/services/surface-hosting-procedural-parity.fixtures.d.ts +0 -13
  1094. package/dist/services/surface-hosting-procedural-parity.fixtures.d.ts.map +0 -1
  1095. package/dist/services/surface-hosting-procedural-parity.fixtures.js +0 -4691
  1096. package/dist/services/surface-hosting-shelf-parity.fixtures.d.ts +0 -1060
  1097. package/dist/services/surface-hosting-shelf-parity.fixtures.d.ts.map +0 -1
  1098. package/dist/services/surface-hosting-shelf-parity.fixtures.js +0 -3127
@@ -1,7 +1,7 @@
1
1
  'use client';
2
2
  import { temporal } from 'zundo';
3
3
  import { create } from 'zustand';
4
- import { parseMaterialRef, toSceneMaterialRef } from '../material-library.js';
4
+ import { toSceneMaterialRef } from '../material-library.js';
5
5
  import { getNodePluginId, isNodeKindEnabled, nodeRegistry } from '../registry/registry.js';
6
6
  import { BuildingNode } from '../schema/index.js';
7
7
  import { generateCollectionId } from '../schema/collections.js';
@@ -16,19 +16,28 @@ import { ShelfNode as ShelfNodeSchema } from '../schema/nodes/shelf.js';
16
16
  import { SiteNode } from '../schema/nodes/site.js';
17
17
  import { getEffectiveStairSurfaceMaterial, StairNode as StairNodeSchema, } from '../schema/nodes/stair.js';
18
18
  import { StairSegmentNode as StairSegmentNodeSchema } from '../schema/nodes/stair-segment.js';
19
- import { getEffectiveWallSurfaceMaterial } from '../schema/nodes/wall.js';
20
19
  import { WindowNode as WindowNodeSchema } from '../schema/nodes/window.js';
21
- import { generateSceneMaterialId, SceneMaterial, } from '../schema/scene-material.js';
20
+ import { SceneMaterial } from '../schema/scene-material.js';
22
21
  import { AnyNode as AnyNodeSchema } from '../schema/types.js';
23
- import { syncAutoElevatorOpenings } from '../systems/elevator/elevator-opening-sync.js';
24
- import { syncAutoStairOpenings } from '../systems/stair/stair-opening-sync.js';
25
- import { syncStairRises } from '../systems/stair/stair-rise.js';
22
+ import { DEFAULT_LEVEL_HEIGHT } from '../services/level-height.js';
23
+ import { ensureSceneOpenings } from '../utils/ensure-scene-openings.js';
24
+ import { migrateFloorPlates, migrateSlabSlots } from '../utils/floor-plate-migration.js';
26
25
  import { healSceneNodes } from '../utils/heal-scene-graph.js';
26
+ import { legacySpecToMaterialRef, migrateSingleMaterialSlots, migrateWallSurfaceMaterials, } from '../utils/legacy-material-slots.js';
27
+ import { materializeNodeDefaults } from '../utils/node-defaults.js';
28
+ import { normalizeLegacyStructure } from '../utils/normalize-legacy-structure.js';
29
+ import { materializeLegacyAutoOpenings } from '../utils/owned-floor-opening-migration.js';
30
+ import { reconcileStructureOnLoad } from '../utils/reconcile-structure-on-load.js';
27
31
  import { removeRetiredDrawingSheetNodes } from '../utils/retired-scene-nodes.js';
32
+ import { migrateCeilingRoomLinks, migrateRoomZones } from '../utils/room-zone-migration.js';
28
33
  import { migrateVerticalSceneNodes } from '../utils/vertical-scene-migration.js';
34
+ import { migrateLegacyWallAssemblies } from '../utils/wall-assembly-migration.js';
35
+ import { migrateWallFaceBands, migrateWallFaceKeys } from '../utils/wall-face-migration.js';
29
36
  import * as nodeActions from './actions/node-actions.js';
30
- import { areSceneSnapshotsEqual, getSceneHistoryPauseDepth, notifySceneCommit, pauseSceneHistory, resetSceneHistoryPauseDepth, resumeSceneHistory, runWithSceneCommitNodeIds, } from './history-control.js';
37
+ import { areSceneSnapshotsEqual, beginSceneHistoryPauseSession, getSceneHistoryPauseDepth, isRestoringSceneHistory, notifySceneCommit, pauseSceneHistory, resetSceneHistoryPauseDepth, resumeSceneHistory, runAsRemoteSceneChange, runAsSceneHistoryRestore, runWithSceneCommitNodeIds, } from './history-control.js';
38
+ import { beginSceneHistoryDraft as beginSceneHistoryDraftIn, clearSceneHistoryDrafts, createdSceneHistoryDraftIds, hasSceneHistoryDrafts, noteSceneHistoryDraftWrite, sceneHistoryDraftRevertUpdates as sceneHistoryDraftRevertUpdatesIn, settleSceneHistoryDrafts, withAdoptedDraftsAsOriginal, withDraftsRestored, } from './history-drafts.js';
31
39
  import { getHistoryDirtyNodeIds } from './history-invalidation.js';
40
+ import { retainSceneAnnotations, withoutSceneAnnotations, withoutSceneNodeAnnotations, writeSceneNodeField, } from './scene-annotations.js';
32
41
  import { invalidatePendingHydration, isHydrationNormalization, queueSceneNormalization, runSceneHydration, } from './scene-hydration.js';
33
42
  import useLiveNodeOverrides from './use-live-node-overrides.js';
34
43
  import useLiveTransforms from './use-live-transforms.js';
@@ -217,91 +226,6 @@ function migrateElevatorParent(id, node, nodes) {
217
226
  parentId: buildingId,
218
227
  };
219
228
  }
220
- // Reuse an already-minted scene material for an identical inline legacy
221
- // material so a whole building painted one custom colour collapses to one
222
- // shared datablock (mirrors `commitSlotPaint`'s dedupe-on-match).
223
- function findMintedSceneMaterialRef(material, mintedMaterials) {
224
- const target = JSON.stringify(material);
225
- for (const sceneMaterial of Object.values(mintedMaterials)) {
226
- if (JSON.stringify(sceneMaterial.material) === target) {
227
- return toSceneMaterialRef(sceneMaterial.id);
228
- }
229
- }
230
- return undefined;
231
- }
232
- // Turn a legacy surface spec (`{ material, materialPreset }`) into a
233
- // `MaterialRef`: a preset that's already a `library:`/`scene:` ref is used
234
- // as-is; an inline material mints (or reuses) a scene material. Returns
235
- // undefined when the spec carries no material. Shared by every legacy→slots
236
- // migration below.
237
- function legacySpecToMaterialRef(spec, mintedMaterials) {
238
- if (typeof spec.materialPreset === 'string' && parseMaterialRef(spec.materialPreset)) {
239
- return spec.materialPreset;
240
- }
241
- if (spec.material !== undefined) {
242
- const existing = findMintedSceneMaterialRef(spec.material, mintedMaterials);
243
- if (existing)
244
- return existing;
245
- const id = generateSceneMaterialId();
246
- mintedMaterials[id] = {
247
- id,
248
- name: `Material ${Object.keys(mintedMaterials).length + 1}`,
249
- material: spec.material,
250
- };
251
- return toSceneMaterialRef(id);
252
- }
253
- return undefined;
254
- }
255
- // Move the retired inline `material*` / `interiorMaterial*` / `exteriorMaterial*`
256
- // fields onto the unified `node.slots` model (interior / exterior → a
257
- // `library:`/`scene:` ref), minting scene materials for inline customs into
258
- // `mintedMaterials` (merged into the scene material map by the caller). Already
259
- // slot-modelled walls and walls with no legacy material are left untouched.
260
- function migrateWallSurfaceMaterials(node, mintedMaterials) {
261
- if (node.slots && (node.slots.interior !== undefined || node.slots.exterior !== undefined)) {
262
- return node;
263
- }
264
- const slots = { ...(node.slots ?? {}) };
265
- for (const side of ['interior', 'exterior']) {
266
- const spec = getEffectiveWallSurfaceMaterial(node, side);
267
- const ref = legacySpecToMaterialRef(spec, mintedMaterials);
268
- if (ref)
269
- slots[side] = ref;
270
- }
271
- if (Object.keys(slots).length === 0) {
272
- return node;
273
- }
274
- return {
275
- ...node,
276
- slots,
277
- material: undefined,
278
- materialPreset: undefined,
279
- interiorMaterial: undefined,
280
- interiorMaterialPreset: undefined,
281
- exteriorMaterial: undefined,
282
- exteriorMaterialPreset: undefined,
283
- };
284
- }
285
- // Move a kind's single legacy `material` / `materialPreset` onto its declared
286
- // slots. A pre-slot-model node painted one material rendered that material on
287
- // every part (each slot resolves `node.slots[slot]` → legacy → default), so the
288
- // migration writes the same ref to every slot id the kind can expose — unused
289
- // conditional slots are harmless. Already slot-modelled or unpainted nodes are
290
- // left untouched. Mirrors `migrateWallSurfaceMaterials` for single-surface and
291
- // whole-object kinds (slab, ceiling, fence, column, shelf).
292
- function migrateSingleMaterialSlots(node, slotIds, mintedMaterials) {
293
- if (node.slots && Object.keys(node.slots).length > 0) {
294
- return node;
295
- }
296
- const ref = legacySpecToMaterialRef({ material: node.material, materialPreset: node.materialPreset }, mintedMaterials);
297
- if (!ref) {
298
- return node;
299
- }
300
- const slots = {};
301
- for (const slotId of slotIds)
302
- slots[slotId] = ref;
303
- return { ...node, slots, material: undefined, materialPreset: undefined };
304
- }
305
229
  function migrateRoleMaterialSlots(node, roles, mintedMaterials) {
306
230
  const slots = { ...(node.slots ?? {}) };
307
231
  const next = { ...node };
@@ -509,22 +433,6 @@ function migrateConstructionDimension(node) {
509
433
  }),
510
434
  };
511
435
  }
512
- function migrateWallAssembly(node) {
513
- if (!Object.hasOwn(node, 'assemblyLayers'))
514
- return node;
515
- const assemblyThickness = Array.isArray(node.assemblyLayers)
516
- ? node.assemblyLayers.reduce((total, layer) => {
517
- if (!(layer && typeof layer === 'object'))
518
- return total;
519
- const thickness = layer.thickness;
520
- return typeof thickness === 'number' && Number.isFinite(thickness) && thickness > 0
521
- ? total + thickness
522
- : total;
523
- }, 0)
524
- : 0;
525
- const { assemblyLayers: _assemblyLayers, ...wall } = node;
526
- return assemblyThickness > 0 ? { ...wall, thickness: assemblyThickness } : wall;
527
- }
528
436
  function migrateBlockRename(id, node, nodes) {
529
437
  if (node.type !== 'custom-mesh')
530
438
  return [id, node];
@@ -561,7 +469,7 @@ function migrateBlockHostedItem(node) {
561
469
  function migrateNodes(nodes) {
562
470
  // Repair pre-existing corruption (null children, zero-length walls) before
563
471
  // any per-type migration runs, so already-saved scenes load cleanly.
564
- const { nodes: healed } = healSceneNodes(nodes);
472
+ const { nodes: healed } = healSceneNodes(normalizeLegacyStructure(nodes));
565
473
  const { nodes: patchedNodes } = removeRetiredDrawingSheetNodes(healed);
566
474
  // Scene materials minted while moving legacy wall fields onto `node.slots`;
567
475
  // merged into the scene material map by the caller (`setScene`).
@@ -706,7 +614,7 @@ function migrateNodes(nodes) {
706
614
  }
707
615
  }
708
616
  if (node.type === 'wall') {
709
- patchedNodes[id] = migrateWallSurfaceMaterials(migrateWallAssembly(patchedNodes[id]), mintedMaterials);
617
+ patchedNodes[id] = migrateWallSurfaceMaterials(patchedNodes[id], mintedMaterials);
710
618
  }
711
619
  // Cabinet v2→v3: node-level `doorStyle` was dead (geometry reads only the
712
620
  // per-compartment `doorType`) and was removed from both cabinet schemas;
@@ -822,30 +730,6 @@ function migrateNodes(nodes) {
822
730
  if (node.type === 'roof') {
823
731
  patchedNodes[id] = migrateRoofSurfaceMaterials(patchedNodes[id]);
824
732
  }
825
- // Legacy: site.children used to hold nested BuildingNode / ItemNode
826
- // objects (see the SiteNode schema before the children-as-ids fix).
827
- // Flatten any leftover nested children into ids, and absorb the
828
- // embedded nodes into the flat map so the rest of the loader can
829
- // treat the site like every other parent.
830
- if (node.type === 'site' && Array.isArray(node.children)) {
831
- let needsFlatten = false;
832
- const flattened = [];
833
- for (const child of node.children) {
834
- if (typeof child === 'string') {
835
- flattened.push(child);
836
- }
837
- else if (child && typeof child === 'object' && typeof child.id === 'string') {
838
- needsFlatten = true;
839
- flattened.push(child.id);
840
- if (!patchedNodes[child.id]) {
841
- patchedNodes[child.id] = { ...child, parentId: id };
842
- }
843
- }
844
- }
845
- if (needsFlatten) {
846
- patchedNodes[id] = { ...node, children: flattened };
847
- }
848
- }
849
733
  // Level children normalization.
850
734
  // Pre-0.9.1 JSONs may carry child IDs that no longer exist in the node
851
735
  // map (e.g. elevator IDs that lived under a level before the elevator
@@ -898,8 +782,28 @@ function migrateNodes(nodes) {
898
782
  patchedNodes[id] = normalized;
899
783
  }
900
784
  }
901
- const vertical = migrateVerticalSceneNodes(patchedNodes);
902
- return { nodes: vertical.nodes, mintedMaterials };
785
+ const walls = migrateLegacyWallAssemblies(patchedNodes);
786
+ const vertical = migrateVerticalSceneNodes(walls.nodes);
787
+ const rooms = migrateRoomZones(vertical.nodes);
788
+ const ceilings = migrateCeilingRoomLinks(rooms.nodes);
789
+ const legacyOpeningsPrepared = Object.values(ceilings.nodes).some((value) => {
790
+ const node = value;
791
+ return node.type === 'slab' && node.autoFromWalls && !node.plateRole;
792
+ }) &&
793
+ Object.values(ceilings.nodes).some((value) => {
794
+ const node = value;
795
+ return node.type === 'stair' || node.type === 'elevator';
796
+ });
797
+ const plates = migrateFloorPlates(materializeLegacyAutoOpenings(ceilings.nodes, true));
798
+ const slots = migrateSlabSlots(plates.nodes);
799
+ const openings = ensureSceneOpenings(slots.nodes).nodes;
800
+ // M1 before M2: bands move onto geometric faces, then become paint regions.
801
+ const wallFaces = migrateWallFaceKeys(openings);
802
+ const structure = reconcileStructureOnLoad(migrateWallFaceBands(wallFaces.nodes).nodes, vertical.nodes, { legacyOpeningsPrepared });
803
+ return {
804
+ nodes: materializeNodeDefaults(structure.nodes).nodes,
805
+ mintedMaterials,
806
+ };
903
807
  }
904
808
  function getNodeChildIds(node) {
905
809
  if (!('children' in node && Array.isArray(node.children))) {
@@ -949,23 +853,36 @@ function collectReachableNodeIds(nodes, rootNodeIds) {
949
853
  }
950
854
  return reachable;
951
855
  }
952
- function sceneHistorySnapshotFromState(state) {
953
- const { nodes, rootNodeIds, collections, materials, installedPlugins } = state;
954
- // Fresh placement nodes are renderable drafts, not document history. Excluding their
955
- // entire subtree here protects both local undo and external commit subscribers.
956
- const transientNodeIds = new Set();
957
- for (const node of Object.values(nodes)) {
958
- const metadata = node.metadata;
959
- if (metadata &&
960
- typeof metadata === 'object' &&
961
- !Array.isArray(metadata) &&
962
- metadata.isNew === true) {
963
- transientNodeIds.add(node.id);
964
- }
965
- }
966
- if (transientNodeIds.size === 0) {
967
- return { nodes, rootNodeIds, collections, materials, installedPlugins };
856
+ /** Collection membership lives in `collection.nodeIds`; items alone mirror it in `collectionIds`. */
857
+ function mirrorItemMembership(nodes, collectionId, nodeIds, member) {
858
+ let next = nodes;
859
+ for (const nodeId of nodeIds) {
860
+ const node = next[nodeId];
861
+ if (node?.type !== 'item')
862
+ continue;
863
+ const current = node.collectionIds ?? [];
864
+ if (current.includes(collectionId) === member)
865
+ continue;
866
+ if (next === nodes)
867
+ next = { ...nodes };
868
+ next[nodeId] = {
869
+ ...node,
870
+ collectionIds: member
871
+ ? [...current, collectionId]
872
+ : current.filter((id) => id !== collectionId),
873
+ };
968
874
  }
875
+ return next;
876
+ }
877
+ /**
878
+ * `parts` without the subtrees of `draftIds`, and without the references to them (children,
879
+ * procedural attachments, collections, roots). Returns `parts` itself when there is nothing to drop.
880
+ */
881
+ function withoutDraftSubtrees(parts, draftIds) {
882
+ const { nodes, rootNodeIds, collections } = parts;
883
+ const transientNodeIds = new Set([...draftIds].filter((id) => Boolean(nodes[id])));
884
+ if (transientNodeIds.size === 0)
885
+ return parts;
969
886
  const childIdsByParentId = new Map();
970
887
  const addChild = (parentId, childId) => {
971
888
  const childIds = childIdsByParentId.get(parentId) ?? new Set();
@@ -990,7 +907,7 @@ function sceneHistorySnapshotFromState(state) {
990
907
  pendingIds.push(childId);
991
908
  }
992
909
  }
993
- const historyNodes = {};
910
+ const documentNodes = {};
994
911
  for (const [id, sourceNode] of Object.entries(nodes)) {
995
912
  if (transientNodeIds.has(id))
996
913
  continue;
@@ -1007,31 +924,76 @@ function sceneHistorySnapshotFromState(state) {
1007
924
  node = { ...node, attachments };
1008
925
  }
1009
926
  if (!('children' in node && Array.isArray(node.children))) {
1010
- historyNodes[id] = node;
927
+ documentNodes[id] = node;
1011
928
  continue;
1012
929
  }
1013
930
  const children = node.children.filter((childId) => !transientNodeIds.has(childId));
1014
- historyNodes[id] =
931
+ documentNodes[id] =
1015
932
  children.length === node.children.length ? node : { ...node, children };
1016
933
  }
1017
- const historyCollections = {};
934
+ const documentCollections = {};
1018
935
  for (const [id, collection] of Object.entries(collections)) {
1019
936
  const nodeIds = collection.nodeIds.filter((nodeId) => !transientNodeIds.has(nodeId));
1020
937
  if (collection.controlNodeId && transientNodeIds.has(collection.controlNodeId)) {
1021
938
  const { controlNodeId: _controlNodeId, ...rest } = collection;
1022
- historyCollections[id] = { ...rest, nodeIds };
939
+ documentCollections[id] = { ...rest, nodeIds };
1023
940
  }
1024
941
  else {
1025
- historyCollections[id] =
942
+ documentCollections[id] =
1026
943
  nodeIds.length === collection.nodeIds.length ? collection : { ...collection, nodeIds };
1027
944
  }
1028
945
  }
1029
946
  return {
1030
- nodes: historyNodes,
947
+ nodes: documentNodes,
1031
948
  rootNodeIds: rootNodeIds.filter((id) => !transientNodeIds.has(id)),
1032
- collections: historyCollections,
949
+ collections: documentCollections,
950
+ };
951
+ }
952
+ function isFreshPlacementNode(node) {
953
+ const metadata = node.metadata;
954
+ return (!!metadata &&
955
+ typeof metadata === 'object' &&
956
+ !Array.isArray(metadata) &&
957
+ metadata.isNew === true);
958
+ }
959
+ /**
960
+ * Fresh placement nodes are renderable drafts, not document history. Excluding their entire
961
+ * subtree here protects both local undo and external commit subscribers. Carried drafts
962
+ * (history-drafts.ts) are kept out the same way.
963
+ */
964
+ function sceneHistorySnapshotFromState(state) {
965
+ const { nodes, materials, installedPlugins, hasExplicitPluginInstallState } = state;
966
+ const kept = withoutDraftSubtrees(state, [
967
+ ...createdSceneHistoryDraftIds(),
968
+ ...Object.values(nodes)
969
+ .filter(isFreshPlacementNode)
970
+ .map((node) => node.id),
971
+ ]);
972
+ return {
973
+ nodes: withAdoptedDraftsAsOriginal(nodes, kept.nodes),
974
+ rootNodeIds: kept.rootNodeIds,
975
+ collections: kept.collections,
1033
976
  materials,
1034
977
  installedPlugins,
978
+ hasExplicitPluginInstallState,
979
+ };
980
+ }
981
+ /**
982
+ * The current scene as every save writes it: without the drafts an interaction is carrying —
983
+ * created carry drafts (history-drafts.ts) and the `drafts` the caller owns — and with adopted
984
+ * carry drafts as they were before the carry. Never inferred from metadata: committed nodes can
985
+ * still carry `metadata.isNew`, so only explicitly owned drafts are left out.
986
+ */
987
+ export function getSceneDocument(drafts = []) {
988
+ const state = useScene.getState();
989
+ const kept = withoutDraftSubtrees(state, [...createdSceneHistoryDraftIds(), ...drafts]);
990
+ return {
991
+ nodes: withAdoptedDraftsAsOriginal(state.nodes, kept.nodes),
992
+ rootNodeIds: kept.rootNodeIds,
993
+ collections: kept.collections,
994
+ materials: state.materials,
995
+ installedPlugins: state.installedPlugins,
996
+ hasExplicitPluginInstallState: state.hasExplicitPluginInstallState,
1035
997
  };
1036
998
  }
1037
999
  /**
@@ -1091,7 +1053,26 @@ function createSceneStore(config) {
1091
1053
  };
1092
1054
  return create()(hydratedConfig);
1093
1055
  }
1094
- function runTemporalJump(target, jump) {
1056
+ function runTemporalJump(target, restore) {
1057
+ const draftsBefore = useScene.getState().nodes;
1058
+ const restoreDrafts = () => {
1059
+ const current = useScene.getState().nodes;
1060
+ const nodes = retainSceneAnnotations(draftsBefore, withDraftsRestored(draftsBefore, current) ?? current);
1061
+ if (nodes === current)
1062
+ return;
1063
+ // The carry's own state, not a new step: a tracked write here would clear redo.
1064
+ const pause = beginSceneHistoryPauseSession(useScene);
1065
+ try {
1066
+ useScene.setState({ nodes });
1067
+ }
1068
+ finally {
1069
+ pause.end();
1070
+ }
1071
+ };
1072
+ runTemporalJumpOnly(target, () => runAsSceneHistoryRestore(restore));
1073
+ restoreDrafts();
1074
+ }
1075
+ function runTemporalJumpOnly(target, jump) {
1095
1076
  if (!target?.nodes) {
1096
1077
  jump();
1097
1078
  return;
@@ -1104,7 +1085,6 @@ function runTemporalJump(target, jump) {
1104
1085
  const next = target.nodes[nodeId];
1105
1086
  if (previous === next)
1106
1087
  continue;
1107
- // Structural hierarchy changes keep the full-level reconciliation fallback.
1108
1088
  if ([previous, next].some((node) => node && ['site', 'building', 'level'].includes(node.type))) {
1109
1089
  jump();
1110
1090
  return;
@@ -1159,9 +1139,9 @@ const useScene = createSceneStore(temporal((set, get) => ({
1159
1139
  setScene: (nodes, rootNodeIds, extra) => {
1160
1140
  // Apply backward compatibility migrations
1161
1141
  const { nodes: patchedNodes, mintedMaterials } = migrateNodes(nodes);
1162
- // Scene materials minted by the wall legacy→slots migration join the
1163
- // loaded palette (existing refs win on id collision — there are none,
1164
- // ids are freshly generated).
1142
+ // Scene materials minted by the legacy→slots migrations join the
1143
+ // loaded palette. Their ids are content-derived, so an existing entry
1144
+ // with the same id (the hosted authority minted it) is the same material.
1165
1145
  const materials = { ...mintedMaterials, ...(extra?.materials ?? {}) };
1166
1146
  // Remove orphans: nodes whose parentId points to a non-existent node
1167
1147
  const cleanedNodes = { ...patchedNodes };
@@ -1198,37 +1178,22 @@ const useScene = createSceneStore(temporal((set, get) => ({
1198
1178
  installedPlugins: Array.from(new Set(extra?.installedPlugins ?? [])),
1199
1179
  hasExplicitPluginInstallState: extra?.hasExplicitPluginInstallState ?? false,
1200
1180
  });
1201
- const applyNormalization = (updates) => {
1202
- if (updates.length > 0)
1203
- get().updateNodes(updates);
1204
- };
1205
- const hydratedNodes = Object.values(get().nodes);
1206
- if (!get().readOnly) {
1207
- pauseSceneHistory(useScene);
1208
- try {
1209
- if (hydratedNodes.some((node) => node.type === 'elevator')) {
1210
- applyNormalization(syncAutoElevatorOpenings(get().nodes));
1181
+ if (!get().readOnly &&
1182
+ Object.values(get().nodes).some((node) => node.type === 'stair')) {
1183
+ queueSceneNormalization(() => {
1184
+ if (get().hydrationId !== hydrationId)
1185
+ return;
1186
+ const { updates } = ensureSceneOpenings(get().nodes);
1187
+ if (!updates.length)
1188
+ return;
1189
+ pauseSceneHistory(useScene);
1190
+ try {
1191
+ get().updateNodes(updates);
1211
1192
  }
1212
- }
1213
- finally {
1214
- resumeSceneHistory(useScene);
1215
- }
1216
- if (hydratedNodes.some((node) => node.type === 'stair')) {
1217
- // Spatial-grid subscribers must settle first. Owning this pass
1218
- // here also covers opening systems that mount after the load.
1219
- queueSceneNormalization(() => {
1220
- if (get().hydrationId !== hydrationId)
1221
- return;
1222
- pauseSceneHistory(useScene);
1223
- try {
1224
- applyNormalization(syncStairRises(get().nodes));
1225
- applyNormalization(syncAutoStairOpenings(get().nodes));
1226
- }
1227
- finally {
1228
- resumeSceneHistory(useScene);
1229
- }
1230
- });
1231
- }
1193
+ finally {
1194
+ resumeSceneHistory(useScene);
1195
+ }
1196
+ });
1232
1197
  }
1233
1198
  // Mark all nodes as dirty to trigger re-validation
1234
1199
  Object.values(get().nodes).forEach((node) => {
@@ -1281,7 +1246,7 @@ const useScene = createSceneStore(temporal((set, get) => ({
1281
1246
  parentId: building.id,
1282
1247
  level: 0,
1283
1248
  children: [],
1284
- height: 2.5,
1249
+ height: DEFAULT_LEVEL_HEIGHT,
1285
1250
  });
1286
1251
  // Define all nodes flat
1287
1252
  const nodes = {
@@ -1303,33 +1268,24 @@ const useScene = createSceneStore(temporal((set, get) => ({
1303
1268
  clearDirty: (id) => {
1304
1269
  get().dirtyNodes.delete(id);
1305
1270
  },
1306
- createNodes: (ops) => nodeActions.createNodesAction(set, get, ops),
1307
- createNode: (node, parentId) => nodeActions.createNodesAction(set, get, [{ node, parentId }]),
1308
- applyNodeChanges: (changes) => nodeActions.applyNodeChangesAction(set, get, changes),
1309
- updateNodes: (updates) => nodeActions.updateNodesAction(set, get, updates),
1310
- updateNode: (id, data) => nodeActions.updateNodesAction(set, get, [{ id, data }]),
1271
+ createNodes: (ops, options) => nodeActions.createNodesAction(set, get, ops, options),
1272
+ createNode: (node, parentId, options) => nodeActions.createNodesAction(set, get, [{ node, parentId }], options),
1273
+ applyNodeChanges: (changes, options) => nodeActions.applyNodeChangesAction(set, get, changes, options),
1274
+ updateNodes: (updates, options) => nodeActions.updateNodesAction(set, get, updates, options),
1275
+ updateNode: (id, data, options) => nodeActions.updateNodesAction(set, get, [{ id, data }], options),
1276
+ detachDerivedNode: (id, data) => nodeActions.detachDerivedNodeAction(set, get, id, data),
1311
1277
  // --- DELETE ---
1312
- deleteNodes: (ids) => nodeActions.deleteNodesAction(set, get, ids),
1313
- deleteNode: (id) => nodeActions.deleteNodesAction(set, get, [id]),
1278
+ deleteNodes: (ids, options) => nodeActions.deleteNodesAction(set, get, ids, options),
1279
+ deleteNode: (id, options) => nodeActions.deleteNodesAction(set, get, [id], options),
1314
1280
  // --- COLLECTIONS ---
1315
1281
  createCollection: (name, nodeIds = []) => {
1316
1282
  if (get().readOnly)
1317
1283
  return '';
1318
1284
  const id = generateCollectionId();
1319
- const collection = { id, name, nodeIds };
1320
- set((state) => {
1321
- const nextCollections = { ...state.collections, [id]: collection };
1322
- // Denormalize: stamp collectionId onto each node
1323
- const nextNodes = { ...state.nodes };
1324
- for (const nodeId of nodeIds) {
1325
- const node = nextNodes[nodeId];
1326
- if (!node)
1327
- continue;
1328
- const existing = ('collectionIds' in node ? node.collectionIds : undefined) ?? [];
1329
- nextNodes[nodeId] = { ...node, collectionIds: [...existing, id] };
1330
- }
1331
- return { collections: nextCollections, nodes: nextNodes };
1332
- });
1285
+ set((state) => ({
1286
+ collections: { ...state.collections, [id]: { id, name, nodeIds: [...nodeIds] } },
1287
+ nodes: mirrorItemMembership(state.nodes, id, nodeIds, true),
1288
+ }));
1333
1289
  return id;
1334
1290
  },
1335
1291
  deleteCollection: (id) => {
@@ -1339,18 +1295,10 @@ const useScene = createSceneStore(temporal((set, get) => ({
1339
1295
  const col = state.collections[id];
1340
1296
  const nextCollections = { ...state.collections };
1341
1297
  delete nextCollections[id];
1342
- // Remove collectionId from all member nodes
1343
- const nextNodes = { ...state.nodes };
1344
- for (const nodeId of col?.nodeIds ?? []) {
1345
- const node = nextNodes[nodeId];
1346
- if (!(node && 'collectionIds' in node))
1347
- continue;
1348
- nextNodes[nodeId] = {
1349
- ...node,
1350
- collectionIds: node.collectionIds.filter((cid) => cid !== id),
1351
- };
1352
- }
1353
- return { collections: nextCollections, nodes: nextNodes };
1298
+ return {
1299
+ collections: nextCollections,
1300
+ nodes: mirrorItemMembership(state.nodes, id, col?.nodeIds ?? [], false),
1301
+ };
1354
1302
  });
1355
1303
  },
1356
1304
  updateCollection: (id, data) => {
@@ -1363,50 +1311,38 @@ const useScene = createSceneStore(temporal((set, get) => ({
1363
1311
  return { collections: { ...state.collections, [id]: { ...col, ...data } } };
1364
1312
  });
1365
1313
  },
1366
- addToCollection: (id, nodeId) => {
1314
+ addToCollection: (id, nodeIds) => {
1367
1315
  if (get().readOnly)
1368
1316
  return;
1369
1317
  set((state) => {
1370
1318
  const col = state.collections[id];
1371
- if (!col || col.nodeIds.includes(nodeId))
1319
+ const added = nodeIds.filter((nodeId) => !col?.nodeIds.includes(nodeId));
1320
+ if (!col || added.length === 0)
1372
1321
  return state;
1373
- const nextCollections = {
1374
- ...state.collections,
1375
- [id]: { ...col, nodeIds: [...col.nodeIds, nodeId] },
1376
- };
1377
- const node = state.nodes[nodeId];
1378
- if (!node)
1379
- return { collections: nextCollections };
1380
- const existing = ('collectionIds' in node ? node.collectionIds : undefined) ?? [];
1381
- const nextNodes = {
1382
- ...state.nodes,
1383
- [nodeId]: { ...node, collectionIds: [...existing, id] },
1322
+ return {
1323
+ collections: {
1324
+ ...state.collections,
1325
+ [id]: { ...col, nodeIds: [...col.nodeIds, ...added] },
1326
+ },
1327
+ nodes: mirrorItemMembership(state.nodes, id, added, true),
1384
1328
  };
1385
- return { collections: nextCollections, nodes: nextNodes };
1386
1329
  });
1387
1330
  },
1388
- removeFromCollection: (id, nodeId) => {
1331
+ removeFromCollection: (id, nodeIds) => {
1389
1332
  if (get().readOnly)
1390
1333
  return;
1391
1334
  set((state) => {
1392
1335
  const col = state.collections[id];
1393
- if (!col)
1336
+ const removed = nodeIds.filter((nodeId) => col?.nodeIds.includes(nodeId));
1337
+ if (!col || removed.length === 0)
1394
1338
  return state;
1395
- const nextCollections = {
1396
- ...state.collections,
1397
- [id]: { ...col, nodeIds: col.nodeIds.filter((n) => n !== nodeId) },
1398
- };
1399
- const node = state.nodes[nodeId];
1400
- if (!(node && 'collectionIds' in node))
1401
- return { collections: nextCollections };
1402
- const nextNodes = {
1403
- ...state.nodes,
1404
- [nodeId]: {
1405
- ...node,
1406
- collectionIds: node.collectionIds.filter((cid) => cid !== id),
1339
+ return {
1340
+ collections: {
1341
+ ...state.collections,
1342
+ [id]: { ...col, nodeIds: col.nodeIds.filter((nodeId) => !removed.includes(nodeId)) },
1407
1343
  },
1344
+ nodes: mirrorItemMembership(state.nodes, id, removed, false),
1408
1345
  };
1409
- return { collections: nextCollections, nodes: nextNodes };
1410
1346
  });
1411
1347
  },
1412
1348
  // --- SCENE MATERIALS ---
@@ -1438,7 +1374,7 @@ const useScene = createSceneStore(temporal((set, get) => ({
1438
1374
  },
1439
1375
  }), {
1440
1376
  partialize: (state) => sceneHistorySnapshotFromState(state),
1441
- equality: (pastState, currentState) => areSceneSnapshotsEqual(pastState, currentState),
1377
+ equality: (pastState, currentState) => areSceneSnapshotsEqual({ ...pastState, nodes: withoutSceneAnnotations(pastState.nodes) }, { ...currentState, nodes: withoutSceneAnnotations(currentState.nodes) }),
1442
1378
  onSave: (pastState, currentState) => {
1443
1379
  notifySceneCommit({
1444
1380
  origin: 'local',
@@ -1467,6 +1403,23 @@ const invalidateForLiveState = () => {
1467
1403
  useLiveNodeOverrides.subscribe(invalidateForLiveState);
1468
1404
  useLiveTransforms.subscribe(invalidateForLiveState);
1469
1405
  useScene.subscribe(invalidateForLiveState);
1406
+ // Systems rebuild a node's geometry only when it is dirty, so a preview that
1407
+ // drops its override without marking the node left it drawn at the preview
1408
+ // (a cancelled wall move's floor still pushed out). Whoever clears an
1409
+ // override, or one of its fields, the node rebuilds from the scene.
1410
+ useLiveNodeOverrides.subscribe(function markClearedOverridesDirty(state, previous) {
1411
+ if (state.overrides === previous.overrides)
1412
+ return;
1413
+ let scene = null;
1414
+ for (const [id, before] of previous.overrides) {
1415
+ const after = state.overrides.get(id);
1416
+ if (after === before || (after && Object.keys(before).every((key) => key in after)))
1417
+ continue;
1418
+ scene ??= useScene.getState();
1419
+ if (scene.nodes[id])
1420
+ scene.markDirty(id);
1421
+ }
1422
+ });
1470
1423
  export default useScene;
1471
1424
  let sceneReadOnlyLeaseCount = 0;
1472
1425
  let sceneReadOnlyLeaseBaseline = false;
@@ -1523,7 +1476,8 @@ function sceneOperationPatchHasLiveConflict(beforeState, changes) {
1523
1476
  return false;
1524
1477
  }
1525
1478
  function areScenePatchValuesEqual(left, right) {
1526
- if (Object.is(left, right))
1479
+ // Compensation crosses JSON, which serializes both signed zeros as 0.
1480
+ if (left === right)
1527
1481
  return true;
1528
1482
  if (typeof left !== typeof right || left === null || right === null)
1529
1483
  return false;
@@ -1537,8 +1491,10 @@ function areScenePatchValuesEqual(left, right) {
1537
1491
  return false;
1538
1492
  const leftRecord = left;
1539
1493
  const rightRecord = right;
1540
- const leftKeys = Object.keys(leftRecord);
1541
- if (leftKeys.length !== Object.keys(rightRecord).length)
1494
+ // Recorded compensation nodes have crossed JSON, which omits undefined properties.
1495
+ const leftKeys = Object.keys(leftRecord).filter((key) => leftRecord[key] !== undefined);
1496
+ const rightKeys = Object.keys(rightRecord).filter((key) => rightRecord[key] !== undefined);
1497
+ if (leftKeys.length !== rightKeys.length)
1542
1498
  return false;
1543
1499
  return leftKeys.every((key) => Object.hasOwn(rightRecord, key) &&
1544
1500
  areScenePatchValuesEqual(leftRecord[key], rightRecord[key]));
@@ -1617,7 +1573,7 @@ function sceneOperationPatchNextState(beforeState, changes) {
1617
1573
  !Number.isSafeInteger(change.position) ||
1618
1574
  change.position < 0 ||
1619
1575
  siblings?.[change.position] !== id ||
1620
- !areScenePatchValuesEqual(current, change.node)) {
1576
+ !areScenePatchValuesEqual(withoutSceneNodeAnnotations(current), withoutSceneNodeAnnotations(change.node))) {
1621
1577
  return null;
1622
1578
  }
1623
1579
  deleteIds.add(id);
@@ -1626,11 +1582,6 @@ function sceneOperationPatchNextState(beforeState, changes) {
1626
1582
  if (deleteIds.has(id))
1627
1583
  return null;
1628
1584
  }
1629
- for (const node of Object.values(beforeState.nodes)) {
1630
- const parentId = node.parentId ?? null;
1631
- if (parentId && deleteIds.has(parentId) && !deleteIds.has(node.id))
1632
- return null;
1633
- }
1634
1585
  const nextNodes = { ...beforeState.nodes };
1635
1586
  let nextRootNodeIds = deleteIds.size > 0
1636
1587
  ? beforeState.rootNodeIds.filter((id) => !deleteIds.has(id))
@@ -1665,8 +1616,7 @@ function sceneOperationPatchNextState(beforeState, changes) {
1665
1616
  if (!parent)
1666
1617
  return null;
1667
1618
  if (createIds.has(parentId)) {
1668
- if (!('children' in parent) ||
1669
- !Array.isArray(parent.children) ||
1619
+ if (!('children' in parent && Array.isArray(parent.children)) ||
1670
1620
  parent.children[change.position] !== change.node.id) {
1671
1621
  return null;
1672
1622
  }
@@ -1676,6 +1626,66 @@ function sceneOperationPatchNextState(beforeState, changes) {
1676
1626
  placements.push(change);
1677
1627
  existingParentCreates.set(parentId, placements);
1678
1628
  }
1629
+ for (const { id, data, removeFields } of changes.nodeUpdates) {
1630
+ const node = nextNodes[id];
1631
+ if (!node ||
1632
+ createIds.has(id) ||
1633
+ deleteIds.has(id) ||
1634
+ updateIds.has(id) ||
1635
+ ('id' in data && data.id !== node.id) ||
1636
+ ('type' in data && data.type !== node.type) ||
1637
+ ('object' in data && data.object !== node.object) ||
1638
+ removeFields.some((field) => field === 'id' || field === 'object' || field === 'type' || Object.hasOwn(data, field))) {
1639
+ return null;
1640
+ }
1641
+ updateIds.add(id);
1642
+ let candidate = { ...node };
1643
+ for (const [field, value] of Object.entries(data)) {
1644
+ const written = writeSceneNodeField(candidate, field, value, true);
1645
+ if (!written)
1646
+ return null;
1647
+ candidate = written;
1648
+ }
1649
+ for (const field of removeFields) {
1650
+ const written = writeSceneNodeField(candidate, field, undefined, false);
1651
+ if (!written)
1652
+ return null;
1653
+ candidate = written;
1654
+ }
1655
+ const validated = parseSceneOperationPatchNode(candidate);
1656
+ if (!validated ||
1657
+ validated.id !== id ||
1658
+ validated.type !== node.type ||
1659
+ validated.object !== node.object) {
1660
+ return null;
1661
+ }
1662
+ nextNodes[id] = candidate;
1663
+ }
1664
+ for (const id of updateIds) {
1665
+ const previousParent = beforeState.nodes[id]?.parentId;
1666
+ const parentId = nextNodes[id]?.parentId;
1667
+ if (previousParent === parentId)
1668
+ continue;
1669
+ if (previousParent) {
1670
+ const parent = nextNodes[previousParent];
1671
+ if (parent && 'children' in parent && Array.isArray(parent.children))
1672
+ nextNodes[previousParent] = {
1673
+ ...parent,
1674
+ children: parent.children.filter((child) => child !== id),
1675
+ };
1676
+ }
1677
+ else
1678
+ nextRootNodeIds = nextRootNodeIds.filter((child) => child !== id);
1679
+ if (parentId) {
1680
+ const parent = nextNodes[parentId];
1681
+ if (!(parent && 'children' in parent && Array.isArray(parent.children)))
1682
+ return null;
1683
+ if (!parent.children.includes(id))
1684
+ nextNodes[parentId] = { ...parent, children: [...parent.children, id] };
1685
+ }
1686
+ else if (!nextRootNodeIds.includes(id))
1687
+ nextRootNodeIds = [...nextRootNodeIds, id];
1688
+ }
1679
1689
  const insertedRoots = insertSceneStructuralPlacements(nextRootNodeIds, rootCreates);
1680
1690
  if (!insertedRoots)
1681
1691
  return null;
@@ -1689,6 +1699,10 @@ function sceneOperationPatchNextState(beforeState, changes) {
1689
1699
  return null;
1690
1700
  nextNodes[parentId] = { ...parent, children };
1691
1701
  }
1702
+ for (const node of Object.values(nextNodes)) {
1703
+ if (node.parentId && deleteIds.has(node.parentId))
1704
+ return null;
1705
+ }
1692
1706
  for (const change of parsedCreates) {
1693
1707
  const parentId = change.node.parentId ?? null;
1694
1708
  const siblings = structuralSiblingIds(nextNodes, nextRootNodeIds, parentId);
@@ -1701,31 +1715,6 @@ function sceneOperationPatchNextState(beforeState, changes) {
1701
1715
  return null;
1702
1716
  }
1703
1717
  }
1704
- for (const { id, data, removeFields } of changes.nodeUpdates) {
1705
- const node = nextNodes[id];
1706
- if (!node ||
1707
- createIds.has(id) ||
1708
- deleteIds.has(id) ||
1709
- updateIds.has(id) ||
1710
- ('id' in data && data.id !== node.id) ||
1711
- ('type' in data && data.type !== node.type) ||
1712
- ('object' in data && data.object !== node.object) ||
1713
- removeFields.some((field) => field === 'id' || field === 'object' || field === 'type' || Object.hasOwn(data, field))) {
1714
- return null;
1715
- }
1716
- updateIds.add(id);
1717
- const candidate = { ...node, ...data };
1718
- for (const field of removeFields)
1719
- delete candidate[field];
1720
- const validated = parseSceneOperationPatchNode(candidate);
1721
- if (!validated ||
1722
- validated.id !== id ||
1723
- validated.type !== node.type ||
1724
- validated.object !== node.object) {
1725
- return null;
1726
- }
1727
- nextNodes[id] = candidate;
1728
- }
1729
1718
  const materials = changes.materialChanges.length > 0 ? { ...beforeState.materials } : beforeState.materials;
1730
1719
  for (const { id, material } of changes.materialChanges) {
1731
1720
  if (materialIds.has(id) ||
@@ -1738,16 +1727,87 @@ function sceneOperationPatchNextState(beforeState, changes) {
1738
1727
  else
1739
1728
  materials[id] = material;
1740
1729
  }
1741
- return { materials, nodes: nextNodes, rootNodeIds: nextRootNodeIds };
1730
+ const collectionChanges = changes.collectionChanges ?? [];
1731
+ const collections = collectionChanges.length > 0 ? { ...beforeState.collections } : beforeState.collections;
1732
+ const collectionIds = new Set();
1733
+ for (const { id, collection } of collectionChanges) {
1734
+ if (collectionIds.has(id) || (collection !== null && collection.id !== id))
1735
+ return null;
1736
+ collectionIds.add(id);
1737
+ if (collection === null)
1738
+ delete collections[id];
1739
+ else
1740
+ collections[id] = collection;
1741
+ }
1742
+ const pluginChanges = changes.pluginChanges ?? [];
1743
+ if (changes.pluginInstallState) {
1744
+ return {
1745
+ collections,
1746
+ materials,
1747
+ nodes: nextNodes,
1748
+ rootNodeIds: nextRootNodeIds,
1749
+ installedPlugins: [...changes.pluginInstallState.installedPlugins],
1750
+ hasExplicitPluginInstallState: changes.pluginInstallState.explicit,
1751
+ };
1752
+ }
1753
+ if (pluginChanges.length === 0) {
1754
+ return { collections, materials, nodes: nextNodes, rootNodeIds: nextRootNodeIds };
1755
+ }
1756
+ const installedPlugins = new Set(beforeState.installedPlugins);
1757
+ const pluginIds = new Set();
1758
+ for (const { id, installed } of pluginChanges) {
1759
+ if (!id || pluginIds.has(id))
1760
+ return null;
1761
+ pluginIds.add(id);
1762
+ if (installed)
1763
+ installedPlugins.add(id);
1764
+ else
1765
+ installedPlugins.delete(id);
1766
+ }
1767
+ return {
1768
+ collections,
1769
+ materials,
1770
+ nodes: nextNodes,
1771
+ rootNodeIds: nextRootNodeIds,
1772
+ installedPlugins: Array.from(installedPlugins),
1773
+ // A shared install list is a decision someone made, so hosts must not
1774
+ // re-add their default plugins on top of it.
1775
+ hasExplicitPluginInstallState: true,
1776
+ };
1742
1777
  }
1743
- export function applySceneOperationPatch(changes) {
1778
+ export function applySceneOperationPatch(changes, options = {}) {
1744
1779
  const beforeState = useScene.getState();
1745
1780
  if (changes.nodeUpdates.length === 0 &&
1746
1781
  changes.materialChanges.length === 0 &&
1747
1782
  changes.nodeCreates.length === 0 &&
1748
- changes.nodeDeletes.length === 0) {
1783
+ changes.nodeDeletes.length === 0 &&
1784
+ !changes.pluginChanges?.length &&
1785
+ !changes.collectionChanges?.length &&
1786
+ !changes.pluginInstallState) {
1787
+ return false;
1788
+ }
1789
+ if (options.undoable &&
1790
+ !(useScene.temporal.getState().isTracking &&
1791
+ getSceneHistoryPauseDepth() === 0 &&
1792
+ !hasSceneHistoryDrafts())) {
1749
1793
  return false;
1750
1794
  }
1795
+ if (options.annotation &&
1796
+ (options.undoable ||
1797
+ beforeState.readOnly ||
1798
+ !useScene.temporal.getState().isTracking ||
1799
+ getSceneHistoryPauseDepth() > 0 ||
1800
+ hasSceneHistoryDrafts()))
1801
+ return false;
1802
+ if (options.annotation &&
1803
+ (changes.nodeCreates.length ||
1804
+ changes.nodeDeletes.length ||
1805
+ changes.materialChanges.length ||
1806
+ changes.pluginChanges?.length ||
1807
+ changes.collectionChanges?.length ||
1808
+ changes.pluginInstallState ||
1809
+ changes.nodeUpdates.some(({ data, removeFields }) => removeFields.length || Object.keys(data).some((field) => field !== 'source.images'))))
1810
+ return false;
1751
1811
  if (sceneOperationPatchHasLiveConflict(beforeState, changes))
1752
1812
  return false;
1753
1813
  const next = sceneOperationPatchNextState(beforeState, changes);
@@ -1758,7 +1818,7 @@ export function applySceneOperationPatch(changes) {
1758
1818
  if (shouldScopeHistoryPause)
1759
1819
  pauseSceneHistory(useScene);
1760
1820
  try {
1761
- useScene.setState(next);
1821
+ runAsRemoteSceneChange(() => useScene.setState(next));
1762
1822
  }
1763
1823
  finally {
1764
1824
  if (shouldScopeHistoryPause)
@@ -1777,6 +1837,12 @@ export function applySceneOperationPatch(changes) {
1777
1837
  }
1778
1838
  if (areSceneSnapshotsEqual(before, current))
1779
1839
  return false;
1840
+ if (options.undoable) {
1841
+ useScene.temporal.setState(({ pastStates }) => ({
1842
+ pastStates: [...pastStates, before],
1843
+ futureStates: [],
1844
+ }));
1845
+ }
1780
1846
  for (const id of touchedNodeIds) {
1781
1847
  if (current.nodes[id])
1782
1848
  currentState.markDirty(id);
@@ -1816,10 +1882,22 @@ export function applySceneOperationPatch(changes) {
1816
1882
  currentState.markDirty(node.parentId);
1817
1883
  }
1818
1884
  }
1885
+ if (changes.pluginChanges?.length || changes.pluginInstallState) {
1886
+ for (const node of Object.values(current.nodes)) {
1887
+ if (!getNodePluginId(node.type))
1888
+ continue;
1889
+ if (!isNodeKindEnabled(node.type, currentState.installedPlugins)) {
1890
+ currentState.clearDirty(node.id);
1891
+ }
1892
+ else if (!isNodeKindEnabled(node.type, beforeState.installedPlugins)) {
1893
+ currentState.markDirty(node.id);
1894
+ }
1895
+ }
1896
+ }
1819
1897
  for (const { node } of changes.nodeDeletes)
1820
1898
  currentState.clearDirty(node.id);
1821
1899
  notifySceneCommit({
1822
- origin: 'host',
1900
+ origin: options.annotation ? 'local' : 'host',
1823
1901
  before,
1824
1902
  current,
1825
1903
  });
@@ -1835,18 +1913,19 @@ export function applyScenePatch(changes) {
1835
1913
  export function applySceneSnapshot(snapshot, options) {
1836
1914
  const before = sceneHistorySnapshotFromState(useScene.getState());
1837
1915
  const temporalState = useScene.temporal.getState();
1838
- if (!temporalState.isTracking || getSceneHistoryPauseDepth() > 0) {
1916
+ if (!temporalState.isTracking || getSceneHistoryPauseDepth() > 0 || hasSceneHistoryDrafts()) {
1839
1917
  throw new Error('Cannot replace the scene snapshot during an active interaction');
1840
1918
  }
1841
1919
  useLiveNodeOverrides.getState().clearAll();
1842
1920
  useLiveTransforms.getState().clearAll();
1843
1921
  pauseSceneHistory(useScene);
1844
1922
  try {
1845
- useScene.getState().setScene(snapshot.nodes, snapshot.rootNodeIds, {
1923
+ runAsRemoteSceneChange(() => useScene.getState().setScene(snapshot.nodes, snapshot.rootNodeIds, {
1846
1924
  collections: snapshot.collections,
1847
1925
  installedPlugins: snapshot.installedPlugins,
1926
+ hasExplicitPluginInstallState: options.explicitPluginInstallState,
1848
1927
  materials: snapshot.materials,
1849
- });
1928
+ }));
1850
1929
  useScene.temporal.getState().clear();
1851
1930
  }
1852
1931
  finally {
@@ -1861,8 +1940,37 @@ export function applySceneSnapshot(snapshot, options) {
1861
1940
  // Track previous temporal state lengths for identifying history jumps
1862
1941
  let prevPastLength = 0;
1863
1942
  let prevFutureLength = 0;
1943
+ /**
1944
+ * Runs one of a carry's own writes to its drafts (see history-drafts.ts) under a short pause,
1945
+ * and marks the adopted drafts' fields it changed as carry-owned.
1946
+ */
1947
+ export function runSceneHistoryDraftWrite(write) {
1948
+ const before = useScene.getState().nodes;
1949
+ const wasRawPaused = !useScene.temporal.getState().isTracking && getSceneHistoryPauseDepth() === 0;
1950
+ const pause = beginSceneHistoryPauseSession(useScene);
1951
+ try {
1952
+ return write();
1953
+ }
1954
+ finally {
1955
+ noteSceneHistoryDraftWrite(before, useScene.getState().nodes);
1956
+ pause.end();
1957
+ // Legacy movers can co-mount with the overlay without owning a counted pause.
1958
+ if (wasRawPaused && getSceneHistoryPauseDepth() === 0)
1959
+ useScene.temporal.getState().pause();
1960
+ }
1961
+ }
1962
+ /** Updates that revert the fields a carry still holds on `ids` (see history-drafts.ts). */
1963
+ export function sceneHistoryDraftRevertUpdates(ids) {
1964
+ return sceneHistoryDraftRevertUpdatesIn(useScene.getState().nodes, ids);
1965
+ }
1966
+ /** Registers a carried draft (see history-drafts.ts); returns the call that ends it. */
1967
+ export function beginSceneHistoryDraft(id, original) {
1968
+ return beginSceneHistoryDraftIn(id, original, useScene.getState().nodes);
1969
+ }
1970
+ export { settleSceneHistoryDrafts };
1864
1971
  export function clearSceneHistory() {
1865
1972
  resetSceneHistoryPauseDepth();
1973
+ clearSceneHistoryDrafts();
1866
1974
  // Resetting the pause-depth counter without resuming would strand the
1867
1975
  // temporal store in `isTracking: false` if a pause window was active when
1868
1976
  // the scene was (re)loaded — every edit after the load would then be
@@ -1882,10 +1990,13 @@ useScene.temporal.subscribe((state, previousState) => {
1882
1990
  return;
1883
1991
  const currentPastLength = state.pastStates.length;
1884
1992
  const currentFutureLength = state.futureStates.length;
1993
+ // Only the store's own undo / redo jump history: a new edit after an undo also
1994
+ // grows the past and drops the redo stack, and is not a redo.
1885
1995
  // Undo: futureStates increases (state moved from past to future)
1886
1996
  // Redo: pastStates increases while futureStates decreases (state moved from future to past)
1887
- const didUndo = currentFutureLength > prevFutureLength;
1888
- const didRedo = currentPastLength > prevPastLength && currentFutureLength < prevFutureLength;
1997
+ const jumping = isRestoringSceneHistory();
1998
+ const didUndo = jumping && currentFutureLength > prevFutureLength;
1999
+ const didRedo = jumping && currentPastLength > prevPastLength && currentFutureLength < prevFutureLength;
1889
2000
  if (didUndo || didRedo) {
1890
2001
  // Capture both layouts before another synchronous jump can replace them.
1891
2002
  // The state pushed onto the opposite stack includes history-paused derived