@pascal-app/core 1.0.1 → 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 (1116) 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 +1650 -131
  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 +83 -13
  360. package/dist/index.d.ts.map +1 -1
  361. package/dist/index.js +78 -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/node-visibility.d.ts +12 -0
  458. package/dist/lib/node-visibility.d.ts.map +1 -0
  459. package/dist/lib/node-visibility.js +12 -0
  460. package/dist/lib/object-cuts.d.ts +11 -0
  461. package/dist/lib/object-cuts.d.ts.map +1 -0
  462. package/dist/lib/object-cuts.js +63 -0
  463. package/dist/lib/opening-floor-datum.d.ts +24 -0
  464. package/dist/lib/opening-floor-datum.d.ts.map +1 -0
  465. package/dist/lib/opening-floor-datum.js +145 -0
  466. package/dist/lib/own-floor-intent.d.ts +15 -0
  467. package/dist/lib/own-floor-intent.d.ts.map +1 -0
  468. package/dist/lib/own-floor-intent.js +201 -0
  469. package/dist/lib/plate-reference.d.ts +3 -0
  470. package/dist/lib/plate-reference.d.ts.map +1 -0
  471. package/dist/lib/plate-reference.js +91 -0
  472. package/dist/lib/plate-surface.d.ts +120 -0
  473. package/dist/lib/plate-surface.d.ts.map +1 -0
  474. package/dist/lib/plate-surface.js +725 -0
  475. package/dist/lib/polygon-boolean.d.ts +17 -0
  476. package/dist/lib/polygon-boolean.d.ts.map +1 -0
  477. package/dist/lib/polygon-boolean.js +195 -0
  478. package/dist/lib/polygon-label.d.ts +7 -0
  479. package/dist/lib/polygon-label.d.ts.map +1 -0
  480. package/dist/lib/polygon-label.js +94 -0
  481. package/dist/lib/room-drawn-floor.d.ts +29 -0
  482. package/dist/lib/room-drawn-floor.d.ts.map +1 -0
  483. package/dist/lib/room-drawn-floor.js +88 -0
  484. package/dist/lib/room-floor-choices.d.ts +11 -0
  485. package/dist/lib/room-floor-choices.d.ts.map +1 -0
  486. package/dist/lib/room-floor-choices.js +60 -0
  487. package/dist/lib/room-floor-feasibility.d.ts +25 -0
  488. package/dist/lib/room-floor-feasibility.d.ts.map +1 -0
  489. package/dist/lib/room-floor-feasibility.js +293 -0
  490. package/dist/lib/room-floor-plate.d.ts +3 -0
  491. package/dist/lib/room-floor-plate.d.ts.map +1 -0
  492. package/dist/lib/room-floor-plate.js +4 -0
  493. package/dist/lib/room-graph.d.ts +79 -0
  494. package/dist/lib/room-graph.d.ts.map +1 -0
  495. package/dist/lib/room-graph.js +1265 -0
  496. package/dist/lib/room-name.d.ts +10 -0
  497. package/dist/lib/room-name.d.ts.map +1 -0
  498. package/dist/lib/room-name.js +22 -0
  499. package/dist/lib/room-topology-index.d.ts +53 -5
  500. package/dist/lib/room-topology-index.d.ts.map +1 -1
  501. package/dist/lib/room-topology-index.js +176 -30
  502. package/dist/lib/room-vertical-placement.d.ts +12 -0
  503. package/dist/lib/room-vertical-placement.d.ts.map +1 -0
  504. package/dist/lib/room-vertical-placement.js +28 -0
  505. package/dist/lib/room-zone-adoption.d.ts +74 -0
  506. package/dist/lib/room-zone-adoption.d.ts.map +1 -0
  507. package/dist/lib/room-zone-adoption.js +150 -0
  508. package/dist/lib/setback-envelope.d.ts +73 -0
  509. package/dist/lib/setback-envelope.d.ts.map +1 -0
  510. package/dist/lib/setback-envelope.js +506 -0
  511. package/dist/lib/slab-polygon.d.ts.map +1 -1
  512. package/dist/lib/slab-polygon.js +33 -12
  513. package/dist/lib/slots.d.ts +20 -0
  514. package/dist/lib/slots.d.ts.map +1 -1
  515. package/dist/lib/slots.js +44 -0
  516. package/dist/lib/space-detection.d.ts +14 -94
  517. package/dist/lib/space-detection.d.ts.map +1 -1
  518. package/dist/lib/space-detection.js +244 -1616
  519. package/dist/lib/structure-commit.d.ts +38 -0
  520. package/dist/lib/structure-commit.d.ts.map +1 -0
  521. package/dist/lib/structure-commit.js +52 -0
  522. package/dist/lib/structure-kernel.d.ts +66 -0
  523. package/dist/lib/structure-kernel.d.ts.map +1 -0
  524. package/dist/lib/structure-kernel.js +735 -0
  525. package/dist/lib/structure-reconcile.d.ts +15 -0
  526. package/dist/lib/structure-reconcile.d.ts.map +1 -0
  527. package/dist/lib/structure-reconcile.js +218 -0
  528. package/dist/lib/terrain-contours.d.ts +29 -0
  529. package/dist/lib/terrain-contours.d.ts.map +1 -0
  530. package/dist/lib/terrain-contours.js +199 -0
  531. package/dist/lib/terrain-source-persisted.d.ts +42 -0
  532. package/dist/lib/terrain-source-persisted.d.ts.map +1 -0
  533. package/dist/lib/terrain-source-persisted.js +68 -0
  534. package/dist/lib/terrain-source.d.ts +2 -40
  535. package/dist/lib/terrain-source.d.ts.map +1 -1
  536. package/dist/lib/terrain-source.js +2 -68
  537. package/dist/lib/terrain-support-query.d.ts +83 -0
  538. package/dist/lib/terrain-support-query.d.ts.map +1 -0
  539. package/dist/lib/terrain-support-query.js +187 -0
  540. package/dist/lib/terrain-support.d.ts +1 -77
  541. package/dist/lib/terrain-support.d.ts.map +1 -1
  542. package/dist/lib/terrain-support.js +3 -181
  543. package/dist/lib/unit-containment.js +2 -2
  544. package/dist/lib/unit-report.d.ts.map +1 -1
  545. package/dist/lib/unit-report.js +5 -4
  546. package/dist/lib/zone-colors.d.ts +11 -0
  547. package/dist/lib/zone-colors.d.ts.map +1 -0
  548. package/dist/lib/zone-colors.js +32 -0
  549. package/dist/lib/zone-quantities.d.ts.map +1 -1
  550. package/dist/lib/zone-quantities.js +113 -223
  551. package/dist/material-library.d.ts +9 -1
  552. package/dist/material-library.d.ts.map +1 -1
  553. package/dist/material-library.js +550 -1
  554. package/dist/node-slots/block.d.ts +7 -0
  555. package/dist/node-slots/block.d.ts.map +1 -0
  556. package/dist/node-slots/block.js +27 -0
  557. package/dist/node-slots/cabinet.d.ts +4 -0
  558. package/dist/node-slots/cabinet.d.ts.map +1 -0
  559. package/dist/node-slots/cabinet.js +24 -0
  560. package/dist/node-slots/ceiling.d.ts +6 -0
  561. package/dist/node-slots/ceiling.d.ts.map +1 -0
  562. package/dist/node-slots/ceiling.js +7 -0
  563. package/dist/node-slots/column.d.ts +9 -0
  564. package/dist/node-slots/column.d.ts.map +1 -0
  565. package/dist/node-slots/column.js +24 -0
  566. package/dist/node-slots/door.d.ts +9 -0
  567. package/dist/node-slots/door.d.ts.map +1 -0
  568. package/dist/node-slots/door.js +20 -0
  569. package/dist/node-slots/duct.d.ts +5 -0
  570. package/dist/node-slots/duct.d.ts.map +1 -0
  571. package/dist/node-slots/duct.js +5 -0
  572. package/dist/node-slots/elevator.d.ts +9 -0
  573. package/dist/node-slots/elevator.d.ts.map +1 -0
  574. package/dist/node-slots/elevator.js +17 -0
  575. package/dist/node-slots/fence.d.ts +10 -0
  576. package/dist/node-slots/fence.d.ts.map +1 -0
  577. package/dist/node-slots/fence.js +23 -0
  578. package/dist/node-slots/index.d.ts +25 -0
  579. package/dist/node-slots/index.d.ts.map +1 -0
  580. package/dist/node-slots/index.js +92 -0
  581. package/dist/node-slots/lean-to-extension.d.ts +5 -0
  582. package/dist/node-slots/lean-to-extension.d.ts.map +1 -0
  583. package/dist/node-slots/lean-to-extension.js +15 -0
  584. package/dist/node-slots/procedural-item.d.ts +4 -0
  585. package/dist/node-slots/procedural-item.d.ts.map +1 -0
  586. package/dist/node-slots/procedural-item.js +3 -0
  587. package/dist/node-slots/roof-accessories.d.ts +9 -0
  588. package/dist/node-slots/roof-accessories.d.ts.map +1 -0
  589. package/dist/node-slots/roof-accessories.js +34 -0
  590. package/dist/node-slots/shelf.d.ts +9 -0
  591. package/dist/node-slots/shelf.d.ts.map +1 -0
  592. package/dist/node-slots/shelf.js +30 -0
  593. package/dist/node-slots/slab.d.ts +7 -0
  594. package/dist/node-slots/slab.d.ts.map +1 -0
  595. package/dist/node-slots/slab.js +21 -0
  596. package/dist/node-slots/stair.d.ts +8 -0
  597. package/dist/node-slots/stair.d.ts.map +1 -0
  598. package/dist/node-slots/stair.js +17 -0
  599. package/dist/node-slots/wall.d.ts +12 -0
  600. package/dist/node-slots/wall.d.ts.map +1 -0
  601. package/dist/node-slots/wall.js +55 -0
  602. package/dist/node-slots/window.d.ts +5 -0
  603. package/dist/node-slots/window.d.ts.map +1 -0
  604. package/dist/node-slots/window.js +11 -0
  605. package/dist/procedural-items/design-placement.d.ts +49 -0
  606. package/dist/procedural-items/design-placement.d.ts.map +1 -0
  607. package/dist/procedural-items/design-placement.js +129 -0
  608. package/dist/procedural-items/design.d.ts +261 -0
  609. package/dist/procedural-items/design.d.ts.map +1 -0
  610. package/dist/procedural-items/design.js +707 -0
  611. package/dist/procedural-items/fixtures.d.ts +464 -24
  612. package/dist/procedural-items/fixtures.d.ts.map +1 -1
  613. package/dist/procedural-items/index.d.ts +5 -0
  614. package/dist/procedural-items/index.d.ts.map +1 -1
  615. package/dist/procedural-items/index.js +5 -0
  616. package/dist/procedural-items/integration.d.ts +127 -6
  617. package/dist/procedural-items/integration.d.ts.map +1 -1
  618. package/dist/procedural-items/joints.d.ts +56 -0
  619. package/dist/procedural-items/joints.d.ts.map +1 -0
  620. package/dist/procedural-items/joints.js +251 -0
  621. package/dist/procedural-items/library-colors.d.ts +12 -0
  622. package/dist/procedural-items/library-colors.d.ts.map +1 -1
  623. package/dist/procedural-items/library-colors.js +37 -3
  624. package/dist/procedural-items/motion-controller.d.ts +29 -0
  625. package/dist/procedural-items/motion-controller.d.ts.map +1 -0
  626. package/dist/procedural-items/motion-controller.js +130 -0
  627. package/dist/procedural-items/node.d.ts +490 -24
  628. package/dist/procedural-items/node.d.ts.map +1 -1
  629. package/dist/procedural-items/query.d.ts +19 -1
  630. package/dist/procedural-items/query.d.ts.map +1 -1
  631. package/dist/procedural-items/query.js +131 -48
  632. package/dist/procedural-items/recipe.d.ts +258 -14
  633. package/dist/procedural-items/recipe.d.ts.map +1 -1
  634. package/dist/procedural-items/recipe.js +933 -61
  635. package/dist/procedural-items/section.d.ts +27 -0
  636. package/dist/procedural-items/section.d.ts.map +1 -0
  637. package/dist/procedural-items/section.js +237 -0
  638. package/dist/procedural-items/spatial.d.ts +21 -0
  639. package/dist/procedural-items/spatial.d.ts.map +1 -1
  640. package/dist/procedural-items/spatial.js +90 -0
  641. package/dist/registry/handles.d.ts +30 -1
  642. package/dist/registry/handles.d.ts.map +1 -1
  643. package/dist/registry/index.d.ts +7 -5
  644. package/dist/registry/index.d.ts.map +1 -1
  645. package/dist/registry/index.js +4 -2
  646. package/dist/registry/mechanism.d.ts +9 -0
  647. package/dist/registry/mechanism.d.ts.map +1 -0
  648. package/dist/registry/mechanism.js +21 -0
  649. package/dist/registry/registry.d.ts +6 -3
  650. package/dist/registry/registry.d.ts.map +1 -1
  651. package/dist/registry/registry.js +59 -22
  652. package/dist/registry/scene-api.d.ts +20 -0
  653. package/dist/registry/scene-api.d.ts.map +1 -1
  654. package/dist/registry/scene-api.js +26 -13
  655. package/dist/registry/subtree.d.ts +8 -0
  656. package/dist/registry/subtree.d.ts.map +1 -1
  657. package/dist/registry/subtree.js +59 -0
  658. package/dist/registry/types.d.ts +352 -13
  659. package/dist/registry/types.d.ts.map +1 -1
  660. package/dist/schema/__fixtures__/node-fixtures.d.ts.map +1 -1
  661. package/dist/schema/__fixtures__/node-fixtures.js +2 -0
  662. package/dist/schema/assembly.d.ts +153 -0
  663. package/dist/schema/assembly.d.ts.map +1 -0
  664. package/dist/schema/assembly.js +155 -0
  665. package/dist/schema/asset-url.d.ts +2 -1
  666. package/dist/schema/asset-url.d.ts.map +1 -1
  667. package/dist/schema/asset-url.js +5 -2
  668. package/dist/schema/base.d.ts +26 -0
  669. package/dist/schema/base.d.ts.map +1 -1
  670. package/dist/schema/base.js +2 -0
  671. package/dist/schema/collection-templates.d.ts +46 -0
  672. package/dist/schema/collection-templates.d.ts.map +1 -0
  673. package/dist/schema/collection-templates.js +14 -0
  674. package/dist/schema/collections.d.ts +7 -0
  675. package/dist/schema/collections.d.ts.map +1 -1
  676. package/dist/schema/cut.d.ts +29 -0
  677. package/dist/schema/cut.d.ts.map +1 -0
  678. package/dist/schema/cut.js +50 -0
  679. package/dist/schema/geometry-metadata.d.ts +51 -0
  680. package/dist/schema/geometry-metadata.d.ts.map +1 -0
  681. package/dist/schema/geometry-metadata.js +57 -0
  682. package/dist/schema/geometry-source.d.ts +250 -0
  683. package/dist/schema/geometry-source.d.ts.map +1 -0
  684. package/dist/schema/geometry-source.js +130 -0
  685. package/dist/schema/index.d.ts +20 -7
  686. package/dist/schema/index.d.ts.map +1 -1
  687. package/dist/schema/index.js +22 -5
  688. package/dist/schema/nodes/block.d.ts +28 -2
  689. package/dist/schema/nodes/block.d.ts.map +1 -1
  690. package/dist/schema/nodes/block.js +22 -9
  691. package/dist/schema/nodes/box-vent.d.ts +26 -0
  692. package/dist/schema/nodes/box-vent.d.ts.map +1 -1
  693. package/dist/schema/nodes/building.d.ts +26 -0
  694. package/dist/schema/nodes/building.d.ts.map +1 -1
  695. package/dist/schema/nodes/cabinet.d.ts +61 -9
  696. package/dist/schema/nodes/cabinet.d.ts.map +1 -1
  697. package/dist/schema/nodes/ceiling.d.ts +37 -0
  698. package/dist/schema/nodes/ceiling.d.ts.map +1 -1
  699. package/dist/schema/nodes/ceiling.js +8 -0
  700. package/dist/schema/nodes/chimney.d.ts +26 -0
  701. package/dist/schema/nodes/chimney.d.ts.map +1 -1
  702. package/dist/schema/nodes/column.d.ts +126 -0
  703. package/dist/schema/nodes/column.d.ts.map +1 -1
  704. package/dist/schema/nodes/column.js +2 -0
  705. package/dist/schema/nodes/construction-dimension.d.ts +26 -0
  706. package/dist/schema/nodes/construction-dimension.d.ts.map +1 -1
  707. package/dist/schema/nodes/cupola.d.ts +26 -0
  708. package/dist/schema/nodes/cupola.d.ts.map +1 -1
  709. package/dist/schema/nodes/curtain-wall.d.ts +129 -0
  710. package/dist/schema/nodes/curtain-wall.d.ts.map +1 -0
  711. package/dist/schema/nodes/curtain-wall.js +49 -0
  712. package/dist/schema/nodes/door.d.ts +141 -22
  713. package/dist/schema/nodes/door.d.ts.map +1 -1
  714. package/dist/schema/nodes/door.js +18 -33
  715. package/dist/schema/nodes/dormer.d.ts +28 -2
  716. package/dist/schema/nodes/dormer.d.ts.map +1 -1
  717. package/dist/schema/nodes/downspout.d.ts +27 -1
  718. package/dist/schema/nodes/downspout.d.ts.map +1 -1
  719. package/dist/schema/nodes/duct-fitting.d.ts +27 -1
  720. package/dist/schema/nodes/duct-fitting.d.ts.map +1 -1
  721. package/dist/schema/nodes/duct-segment.d.ts +27 -1
  722. package/dist/schema/nodes/duct-segment.d.ts.map +1 -1
  723. package/dist/schema/nodes/duct-terminal.d.ts +26 -0
  724. package/dist/schema/nodes/duct-terminal.d.ts.map +1 -1
  725. package/dist/schema/nodes/elevator.d.ts +26 -0
  726. package/dist/schema/nodes/elevator.d.ts.map +1 -1
  727. package/dist/schema/nodes/eyebrow-vent.d.ts +26 -0
  728. package/dist/schema/nodes/eyebrow-vent.d.ts.map +1 -1
  729. package/dist/schema/nodes/fence-feature.d.ts +141 -0
  730. package/dist/schema/nodes/fence-feature.d.ts.map +1 -0
  731. package/dist/schema/nodes/fence-feature.js +21 -0
  732. package/dist/schema/nodes/fence.d.ts +186 -0
  733. package/dist/schema/nodes/fence.d.ts.map +1 -1
  734. package/dist/schema/nodes/fence.js +92 -7
  735. package/dist/schema/nodes/floor-opening.d.ts +61 -0
  736. package/dist/schema/nodes/floor-opening.d.ts.map +1 -0
  737. package/dist/schema/nodes/floor-opening.js +17 -0
  738. package/dist/schema/nodes/guide.d.ts +26 -0
  739. package/dist/schema/nodes/guide.d.ts.map +1 -1
  740. package/dist/schema/nodes/gutter.d.ts +26 -0
  741. package/dist/schema/nodes/gutter.d.ts.map +1 -1
  742. package/dist/schema/nodes/hvac-equipment.d.ts +26 -0
  743. package/dist/schema/nodes/hvac-equipment.d.ts.map +1 -1
  744. package/dist/schema/nodes/imported-mesh.d.ts +26 -0
  745. package/dist/schema/nodes/imported-mesh.d.ts.map +1 -1
  746. package/dist/schema/nodes/item.d.ts +153 -2
  747. package/dist/schema/nodes/item.d.ts.map +1 -1
  748. package/dist/schema/nodes/item.js +13 -0
  749. package/dist/schema/nodes/lean-to-extension.d.ts +26 -0
  750. package/dist/schema/nodes/lean-to-extension.d.ts.map +1 -1
  751. package/dist/schema/nodes/level.d.ts +27 -1
  752. package/dist/schema/nodes/level.d.ts.map +1 -1
  753. package/dist/schema/nodes/lineset.d.ts +26 -0
  754. package/dist/schema/nodes/lineset.d.ts.map +1 -1
  755. package/dist/schema/nodes/liquid-line.d.ts +26 -0
  756. package/dist/schema/nodes/liquid-line.d.ts.map +1 -1
  757. package/dist/schema/nodes/measurement.d.ts +26 -0
  758. package/dist/schema/nodes/measurement.d.ts.map +1 -1
  759. package/dist/schema/nodes/opening-types.d.ts +41 -0
  760. package/dist/schema/nodes/opening-types.d.ts.map +1 -0
  761. package/dist/schema/nodes/opening-types.js +48 -0
  762. package/dist/schema/nodes/pipe-fitting.d.ts +26 -0
  763. package/dist/schema/nodes/pipe-fitting.d.ts.map +1 -1
  764. package/dist/schema/nodes/pipe-segment.d.ts +26 -0
  765. package/dist/schema/nodes/pipe-segment.d.ts.map +1 -1
  766. package/dist/schema/nodes/pipe-trap.d.ts +26 -0
  767. package/dist/schema/nodes/pipe-trap.d.ts.map +1 -1
  768. package/dist/schema/nodes/ridge-vent.d.ts +26 -0
  769. package/dist/schema/nodes/ridge-vent.d.ts.map +1 -1
  770. package/dist/schema/nodes/roof-segment-walls.d.ts.map +1 -1
  771. package/dist/schema/nodes/roof-segment-walls.js +2 -1
  772. package/dist/schema/nodes/roof-segment.d.ts +30 -2
  773. package/dist/schema/nodes/roof-segment.d.ts.map +1 -1
  774. package/dist/schema/nodes/roof-segment.js +9 -0
  775. package/dist/schema/nodes/roof.d.ts +101 -0
  776. package/dist/schema/nodes/roof.d.ts.map +1 -1
  777. package/dist/schema/nodes/roof.js +6 -0
  778. package/dist/schema/nodes/scan.d.ts +26 -0
  779. package/dist/schema/nodes/scan.d.ts.map +1 -1
  780. package/dist/schema/nodes/separator.d.ts +50 -0
  781. package/dist/schema/nodes/separator.d.ts.map +1 -0
  782. package/dist/schema/nodes/separator.js +8 -0
  783. package/dist/schema/nodes/shelf.d.ts +26 -0
  784. package/dist/schema/nodes/shelf.d.ts.map +1 -1
  785. package/dist/schema/nodes/site.d.ts +192 -0
  786. package/dist/schema/nodes/site.d.ts.map +1 -1
  787. package/dist/schema/nodes/site.js +178 -1
  788. package/dist/schema/nodes/skylight.d.ts +30 -4
  789. package/dist/schema/nodes/skylight.d.ts.map +1 -1
  790. package/dist/schema/nodes/slab.d.ts +84 -0
  791. package/dist/schema/nodes/slab.d.ts.map +1 -1
  792. package/dist/schema/nodes/slab.js +37 -2
  793. package/dist/schema/nodes/solar-panel.d.ts +26 -0
  794. package/dist/schema/nodes/solar-panel.d.ts.map +1 -1
  795. package/dist/schema/nodes/spawn.d.ts +26 -0
  796. package/dist/schema/nodes/spawn.d.ts.map +1 -1
  797. package/dist/schema/nodes/stair-construction.d.ts +21 -0
  798. package/dist/schema/nodes/stair-construction.d.ts.map +1 -0
  799. package/dist/schema/nodes/stair-construction.js +13 -0
  800. package/dist/schema/nodes/stair-design-targets.d.ts +9 -0
  801. package/dist/schema/nodes/stair-design-targets.d.ts.map +1 -0
  802. package/dist/schema/nodes/stair-design-targets.js +7 -0
  803. package/dist/schema/nodes/stair-segment.d.ts +72 -4
  804. package/dist/schema/nodes/stair-segment.d.ts.map +1 -1
  805. package/dist/schema/nodes/stair-segment.js +13 -0
  806. package/dist/schema/nodes/stair.d.ts +119 -2
  807. package/dist/schema/nodes/stair.d.ts.map +1 -1
  808. package/dist/schema/nodes/stair.js +59 -2
  809. package/dist/schema/nodes/structural-grid.d.ts +26 -0
  810. package/dist/schema/nodes/structural-grid.d.ts.map +1 -1
  811. package/dist/schema/nodes/surface-hole-metadata.d.ts +3 -0
  812. package/dist/schema/nodes/surface-hole-metadata.d.ts.map +1 -1
  813. package/dist/schema/nodes/surface-hole-metadata.js +2 -1
  814. package/dist/schema/nodes/surface-paint-region.d.ts +14 -0
  815. package/dist/schema/nodes/surface-paint-region.d.ts.map +1 -0
  816. package/dist/schema/nodes/surface-paint-region.js +12 -0
  817. package/dist/schema/nodes/turbine-vent.d.ts +26 -0
  818. package/dist/schema/nodes/turbine-vent.d.ts.map +1 -1
  819. package/dist/schema/nodes/unit.d.ts +26 -0
  820. package/dist/schema/nodes/unit.d.ts.map +1 -1
  821. package/dist/schema/nodes/wall.d.ts +423 -59
  822. package/dist/schema/nodes/wall.d.ts.map +1 -1
  823. package/dist/schema/nodes/wall.js +188 -186
  824. package/dist/schema/nodes/window.d.ts +139 -20
  825. package/dist/schema/nodes/window.d.ts.map +1 -1
  826. package/dist/schema/nodes/window.js +12 -14
  827. package/dist/schema/nodes/zone.d.ts +69 -1
  828. package/dist/schema/nodes/zone.d.ts.map +1 -1
  829. package/dist/schema/nodes/zone.js +46 -0
  830. package/dist/schema/provenance.d.ts +118 -0
  831. package/dist/schema/provenance.d.ts.map +1 -0
  832. package/dist/schema/provenance.js +76 -0
  833. package/dist/schema/source-ref.d.ts +23 -0
  834. package/dist/schema/source-ref.d.ts.map +1 -0
  835. package/dist/schema/source-ref.js +29 -0
  836. package/dist/schema/types.d.ts +3389 -67
  837. package/dist/schema/types.d.ts.map +1 -1
  838. package/dist/schema/types.js +7 -0
  839. package/dist/services/__fixtures__/hosting.d.ts +3 -0
  840. package/dist/services/__fixtures__/hosting.d.ts.map +1 -0
  841. package/dist/services/__fixtures__/hosting.js +9 -0
  842. package/dist/services/__fixtures__/shelf-surface-rows.d.ts +4 -0
  843. package/dist/services/__fixtures__/shelf-surface-rows.d.ts.map +1 -0
  844. package/dist/services/__fixtures__/shelf-surface-rows.js +18 -0
  845. package/dist/services/alignment-anchors.d.ts +2 -1
  846. package/dist/services/alignment-anchors.d.ts.map +1 -1
  847. package/dist/services/alignment-anchors.js +9 -6
  848. package/dist/services/hosting.d.ts +3 -0
  849. package/dist/services/hosting.d.ts.map +1 -1
  850. package/dist/services/hosting.js +24 -7
  851. package/dist/services/index.d.ts +4 -4
  852. package/dist/services/index.d.ts.map +1 -1
  853. package/dist/services/index.js +4 -4
  854. package/dist/services/level-height.d.ts.map +1 -1
  855. package/dist/services/level-height.js +6 -4
  856. package/dist/services/snap.d.ts +3 -0
  857. package/dist/services/snap.d.ts.map +1 -1
  858. package/dist/services/snap.js +11 -0
  859. package/dist/services/storey.d.ts +21 -1
  860. package/dist/services/storey.d.ts.map +1 -1
  861. package/dist/services/storey.js +94 -8
  862. package/dist/services/surface-hosting.d.ts +6 -2
  863. package/dist/services/surface-hosting.d.ts.map +1 -1
  864. package/dist/services/surface-hosting.js +51 -11
  865. package/dist/store/actions/node-actions.d.ts +4563 -8
  866. package/dist/store/actions/node-actions.d.ts.map +1 -1
  867. package/dist/store/actions/node-actions.js +497 -269
  868. package/dist/store/derived-node-guard.d.ts +84 -0
  869. package/dist/store/derived-node-guard.d.ts.map +1 -0
  870. package/dist/store/derived-node-guard.js +586 -0
  871. package/dist/store/history-control.d.ts +34 -0
  872. package/dist/store/history-control.d.ts.map +1 -1
  873. package/dist/store/history-control.js +99 -1
  874. package/dist/store/history-drafts.d.ts +48 -0
  875. package/dist/store/history-drafts.d.ts.map +1 -0
  876. package/dist/store/history-drafts.js +403 -0
  877. package/dist/store/history-invalidation.d.ts.map +1 -1
  878. package/dist/store/history-invalidation.js +1 -0
  879. package/dist/store/item-interaction.d.ts +28 -0
  880. package/dist/store/item-interaction.d.ts.map +1 -0
  881. package/dist/store/item-interaction.js +34 -0
  882. package/dist/store/registered-node-defaults.d.ts +11 -0
  883. package/dist/store/registered-node-defaults.d.ts.map +1 -0
  884. package/dist/store/registered-node-defaults.js +25 -0
  885. package/dist/store/scene-annotations.d.ts +8969 -0
  886. package/dist/store/scene-annotations.d.ts.map +1 -0
  887. package/dist/store/scene-annotations.js +107 -0
  888. package/dist/store/use-interactive.d.ts +23 -1
  889. package/dist/store/use-interactive.d.ts.map +1 -1
  890. package/dist/store/use-interactive.js +128 -5
  891. package/dist/store/use-scene.d.ts +68 -12
  892. package/dist/store/use-scene.d.ts.map +1 -1
  893. package/dist/store/use-scene.js +429 -306
  894. package/dist/systems/elevator/elevator-opening-sync.d.ts.map +1 -1
  895. package/dist/systems/elevator/elevator-opening-sync.js +4 -6
  896. package/dist/systems/elevator/elevator-opening-system.d.ts.map +1 -1
  897. package/dist/systems/elevator/elevator-opening-system.js +12 -6
  898. package/dist/systems/elevator/elevator-service.d.ts.map +1 -1
  899. package/dist/systems/elevator/elevator-service.js +8 -3
  900. package/dist/systems/fence/fence-centerline.d.ts.map +1 -1
  901. package/dist/systems/fence/fence-centerline.js +6 -5
  902. package/dist/systems/fence/fence-features.d.ts +36 -0
  903. package/dist/systems/fence/fence-features.d.ts.map +1 -0
  904. package/dist/systems/fence/fence-features.js +105 -0
  905. package/dist/systems/fence/fence-spline.d.ts +8 -5
  906. package/dist/systems/fence/fence-spline.d.ts.map +1 -1
  907. package/dist/systems/fence/fence-spline.js +51 -16
  908. package/dist/systems/owned-floor-openings.d.ts +9 -0
  909. package/dist/systems/owned-floor-openings.d.ts.map +1 -0
  910. package/dist/systems/owned-floor-openings.js +326 -0
  911. package/dist/systems/reconcile-owned-floor-openings.d.ts +3 -0
  912. package/dist/systems/reconcile-owned-floor-openings.d.ts.map +1 -0
  913. package/dist/systems/reconcile-owned-floor-openings.js +25 -0
  914. package/dist/systems/slab/__fixtures__/doorway-steps.d.ts +8 -0
  915. package/dist/systems/slab/__fixtures__/doorway-steps.d.ts.map +1 -0
  916. package/dist/systems/slab/__fixtures__/doorway-steps.js +62 -0
  917. package/dist/systems/slab/__fixtures__/floor-step.d.ts +5636 -0
  918. package/dist/systems/slab/__fixtures__/floor-step.d.ts.map +1 -0
  919. package/dist/systems/slab/__fixtures__/floor-step.js +66 -0
  920. package/dist/systems/slab/__fixtures__/raised-room.d.ts +5775 -0
  921. package/dist/systems/slab/__fixtures__/raised-room.d.ts.map +1 -0
  922. package/dist/systems/slab/__fixtures__/raised-room.js +54 -0
  923. package/dist/systems/slab/ensure-slab-openings.d.ts +9 -0
  924. package/dist/systems/slab/ensure-slab-openings.d.ts.map +1 -0
  925. package/dist/systems/slab/ensure-slab-openings.js +41 -0
  926. package/dist/systems/slab/slab-support.d.ts +25 -6
  927. package/dist/systems/slab/slab-support.d.ts.map +1 -1
  928. package/dist/systems/slab/slab-support.js +471 -54
  929. package/dist/systems/stair/stair-base-elevation.d.ts +3 -0
  930. package/dist/systems/stair/stair-base-elevation.d.ts.map +1 -0
  931. package/dist/systems/stair/stair-base-elevation.js +49 -0
  932. package/dist/systems/stair/stair-clearance.d.ts +39 -0
  933. package/dist/systems/stair/stair-clearance.d.ts.map +1 -0
  934. package/dist/systems/stair/stair-clearance.js +508 -0
  935. package/dist/systems/stair/stair-construction.d.ts +37 -0
  936. package/dist/systems/stair/stair-construction.d.ts.map +1 -0
  937. package/dist/systems/stair/stair-construction.js +314 -0
  938. package/dist/systems/stair/stair-detail-budget.d.ts +13 -0
  939. package/dist/systems/stair/stair-detail-budget.d.ts.map +1 -0
  940. package/dist/systems/stair/stair-detail-budget.js +64 -0
  941. package/dist/systems/stair/stair-flight.d.ts +2 -2
  942. package/dist/systems/stair/stair-flight.d.ts.map +1 -1
  943. package/dist/systems/stair/stair-flight.js +4 -3
  944. package/dist/systems/stair/stair-floor-footprints.d.ts +7 -0
  945. package/dist/systems/stair/stair-floor-footprints.d.ts.map +1 -0
  946. package/dist/systems/stair/stair-floor-footprints.js +113 -0
  947. package/dist/systems/stair/stair-footprint.d.ts +3 -1
  948. package/dist/systems/stair/stair-footprint.d.ts.map +1 -1
  949. package/dist/systems/stair/stair-footprint.js +97 -44
  950. package/dist/systems/stair/stair-layout.d.ts +39 -0
  951. package/dist/systems/stair/stair-layout.d.ts.map +1 -0
  952. package/dist/systems/stair/stair-layout.js +58 -0
  953. package/dist/systems/stair/stair-opening-preview.d.ts +1650 -84
  954. package/dist/systems/stair/stair-opening-preview.d.ts.map +1 -1
  955. package/dist/systems/stair/stair-opening-sync.d.ts +8 -2
  956. package/dist/systems/stair/stair-opening-sync.d.ts.map +1 -1
  957. package/dist/systems/stair/stair-opening-sync.js +136 -315
  958. package/dist/systems/stair/stair-opening-system.d.ts.map +1 -1
  959. package/dist/systems/stair/stair-opening-system.js +40 -8
  960. package/dist/systems/stair/stair-presets.d.ts +276 -0
  961. package/dist/systems/stair/stair-presets.d.ts.map +1 -0
  962. package/dist/systems/stair/stair-presets.js +151 -0
  963. package/dist/systems/stair/stair-rail-budget.d.ts +6 -0
  964. package/dist/systems/stair/stair-rail-budget.d.ts.map +1 -0
  965. package/dist/systems/stair/stair-rail-budget.js +36 -0
  966. package/dist/systems/stair/stair-rail-path.d.ts +22 -0
  967. package/dist/systems/stair/stair-rail-path.d.ts.map +1 -0
  968. package/dist/systems/stair/stair-rail-path.js +497 -0
  969. package/dist/systems/stair/stair-rise-edit.d.ts +9 -0
  970. package/dist/systems/stair/stair-rise-edit.d.ts.map +1 -0
  971. package/dist/systems/stair/stair-rise-edit.js +46 -0
  972. package/dist/systems/stair/stair-rise-query.d.ts +24 -0
  973. package/dist/systems/stair/stair-rise-query.d.ts.map +1 -0
  974. package/dist/systems/stair/stair-rise-query.js +125 -0
  975. package/dist/systems/stair/stair-rise.d.ts +4 -19
  976. package/dist/systems/stair/stair-rise.d.ts.map +1 -1
  977. package/dist/systems/stair/stair-rise.js +8 -71
  978. package/dist/systems/stair/stair-sizing.d.ts +414 -0
  979. package/dist/systems/stair/stair-sizing.d.ts.map +1 -0
  980. package/dist/systems/stair/stair-sizing.js +255 -0
  981. package/dist/systems/stair/stair-sweep-edit.d.ts +7 -0
  982. package/dist/systems/stair/stair-sweep-edit.d.ts.map +1 -0
  983. package/dist/systems/stair/stair-sweep-edit.js +8 -0
  984. package/dist/systems/stair/stair-walking-line.d.ts +5 -0
  985. package/dist/systems/stair/stair-walking-line.d.ts.map +1 -0
  986. package/dist/systems/stair/stair-walking-line.js +91 -0
  987. package/dist/systems/stair/stair-winder.d.ts +36 -0
  988. package/dist/systems/stair/stair-winder.d.ts.map +1 -0
  989. package/dist/systems/stair/stair-winder.js +173 -0
  990. package/dist/systems/wall/wall-assembly.d.ts +234 -0
  991. package/dist/systems/wall/wall-assembly.d.ts.map +1 -0
  992. package/dist/systems/wall/wall-assembly.js +854 -0
  993. package/dist/systems/wall/wall-curve.d.ts +2 -1
  994. package/dist/systems/wall/wall-curve.d.ts.map +1 -1
  995. package/dist/systems/wall/wall-curve.js +21 -5
  996. package/dist/systems/wall/wall-finish.d.ts +102 -0
  997. package/dist/systems/wall/wall-finish.d.ts.map +1 -0
  998. package/dist/systems/wall/wall-finish.js +264 -0
  999. package/dist/systems/wall/wall-footprint.d.ts +3 -0
  1000. package/dist/systems/wall/wall-footprint.d.ts.map +1 -1
  1001. package/dist/systems/wall/wall-footprint.js +15 -13
  1002. package/dist/systems/wall/wall-frame.d.ts +45 -0
  1003. package/dist/systems/wall/wall-frame.d.ts.map +1 -0
  1004. package/dist/systems/wall/wall-frame.js +162 -0
  1005. package/dist/systems/wall/wall-layer-bands.d.ts +38 -0
  1006. package/dist/systems/wall/wall-layer-bands.d.ts.map +1 -0
  1007. package/dist/systems/wall/wall-layer-bands.js +109 -0
  1008. package/dist/systems/wall/wall-merge.d.ts +57 -0
  1009. package/dist/systems/wall/wall-merge.d.ts.map +1 -0
  1010. package/dist/systems/wall/wall-merge.js +411 -0
  1011. package/dist/systems/wall/wall-mitering.d.ts +6 -5
  1012. package/dist/systems/wall/wall-mitering.d.ts.map +1 -1
  1013. package/dist/systems/wall/wall-mitering.js +70 -20
  1014. package/dist/systems/wall/wall-operations.d.ts +28 -0
  1015. package/dist/systems/wall/wall-operations.d.ts.map +1 -0
  1016. package/dist/systems/wall/wall-operations.js +146 -0
  1017. package/dist/systems/wall/wall-paint-plan.d.ts +30 -0
  1018. package/dist/systems/wall/wall-paint-plan.d.ts.map +1 -0
  1019. package/dist/systems/wall/wall-paint-plan.js +167 -0
  1020. package/dist/systems/wall/wall-room-sides.d.ts +6 -0
  1021. package/dist/systems/wall/wall-room-sides.d.ts.map +1 -0
  1022. package/dist/systems/wall/wall-room-sides.js +14 -0
  1023. package/dist/systems/wall/wall-step-openings.d.ts +17 -0
  1024. package/dist/systems/wall/wall-step-openings.d.ts.map +1 -0
  1025. package/dist/systems/wall/wall-step-openings.js +32 -0
  1026. package/dist/systems/wall/wall-top.d.ts +2 -6
  1027. package/dist/systems/wall/wall-top.d.ts.map +1 -1
  1028. package/dist/systems/wall/wall-top.js +3 -9
  1029. package/dist/systems/wall/wall-topology.d.ts +28 -0
  1030. package/dist/systems/wall/wall-topology.d.ts.map +1 -1
  1031. package/dist/systems/wall/wall-topology.js +458 -9
  1032. package/dist/utils/clone-scene-graph.d.ts +6 -0
  1033. package/dist/utils/clone-scene-graph.d.ts.map +1 -1
  1034. package/dist/utils/clone-scene-graph.js +123 -15
  1035. package/dist/utils/ensure-scene-openings.d.ts +8965 -0
  1036. package/dist/utils/ensure-scene-openings.d.ts.map +1 -0
  1037. package/dist/utils/ensure-scene-openings.js +29 -0
  1038. package/dist/utils/exterior-threshold-migration.d.ts +4 -0
  1039. package/dist/utils/exterior-threshold-migration.d.ts.map +1 -0
  1040. package/dist/utils/exterior-threshold-migration.js +114 -0
  1041. package/dist/utils/floor-follow-migration.d.ts +3 -0
  1042. package/dist/utils/floor-follow-migration.d.ts.map +1 -0
  1043. package/dist/utils/floor-follow-migration.js +29 -0
  1044. package/dist/utils/floor-opening-migration.d.ts +13 -0
  1045. package/dist/utils/floor-opening-migration.d.ts.map +1 -0
  1046. package/dist/utils/floor-opening-migration.js +148 -0
  1047. package/dist/utils/floor-piece-adoption.d.ts +50 -0
  1048. package/dist/utils/floor-piece-adoption.d.ts.map +1 -0
  1049. package/dist/utils/floor-piece-adoption.js +182 -0
  1050. package/dist/utils/floor-plate-migration.d.ts +4507 -0
  1051. package/dist/utils/floor-plate-migration.d.ts.map +1 -0
  1052. package/dist/utils/floor-plate-migration.js +1360 -0
  1053. package/dist/utils/heal-plan-coordinates.d.ts +2 -0
  1054. package/dist/utils/heal-plan-coordinates.d.ts.map +1 -0
  1055. package/dist/utils/heal-plan-coordinates.js +69 -0
  1056. package/dist/utils/heal-scene-graph.d.ts +20 -6
  1057. package/dist/utils/heal-scene-graph.d.ts.map +1 -1
  1058. package/dist/utils/heal-scene-graph.js +61 -16
  1059. package/dist/utils/legacy-material-slots.d.ts +23 -0
  1060. package/dist/utils/legacy-material-slots.d.ts.map +1 -0
  1061. package/dist/utils/legacy-material-slots.js +120 -0
  1062. package/dist/utils/legacy-opening-datums.d.ts +11 -0
  1063. package/dist/utils/legacy-opening-datums.d.ts.map +1 -0
  1064. package/dist/utils/legacy-opening-datums.js +92 -0
  1065. package/dist/utils/legacy-wall-datums.d.ts +6 -0
  1066. package/dist/utils/legacy-wall-datums.d.ts.map +1 -0
  1067. package/dist/utils/legacy-wall-datums.js +199 -0
  1068. package/dist/utils/load-migration.d.ts +28 -0
  1069. package/dist/utils/load-migration.d.ts.map +1 -0
  1070. package/dist/utils/load-migration.js +89 -0
  1071. package/dist/utils/node-defaults.d.ts +37 -0
  1072. package/dist/utils/node-defaults.d.ts.map +1 -0
  1073. package/dist/utils/node-defaults.js +96 -0
  1074. package/dist/utils/normalize-legacy-structure.d.ts +2 -0
  1075. package/dist/utils/normalize-legacy-structure.d.ts.map +1 -0
  1076. package/dist/utils/normalize-legacy-structure.js +61 -0
  1077. package/dist/utils/omit-undefined.d.ts +2 -0
  1078. package/dist/utils/omit-undefined.d.ts.map +1 -0
  1079. package/dist/utils/omit-undefined.js +17 -0
  1080. package/dist/utils/owned-floor-opening-migration.d.ts +4489 -0
  1081. package/dist/utils/owned-floor-opening-migration.d.ts.map +1 -0
  1082. package/dist/utils/owned-floor-opening-migration.js +365 -0
  1083. package/dist/utils/reconcile-structure-on-load.d.ts +8965 -0
  1084. package/dist/utils/reconcile-structure-on-load.d.ts.map +1 -0
  1085. package/dist/utils/reconcile-structure-on-load.js +307 -0
  1086. package/dist/utils/room-zone-migration.d.ts +18 -0
  1087. package/dist/utils/room-zone-migration.d.ts.map +1 -0
  1088. package/dist/utils/room-zone-migration.js +258 -0
  1089. package/dist/utils/scene-migrations.d.ts +16 -1
  1090. package/dist/utils/scene-migrations.d.ts.map +1 -1
  1091. package/dist/utils/scene-migrations.js +15 -1
  1092. package/dist/utils/structure-id.d.ts +4 -0
  1093. package/dist/utils/structure-id.d.ts.map +1 -0
  1094. package/dist/utils/structure-id.js +115 -0
  1095. package/dist/utils/vertical-scene-migration.d.ts +8 -8
  1096. package/dist/utils/vertical-scene-migration.d.ts.map +1 -1
  1097. package/dist/utils/vertical-scene-migration.js +18 -8
  1098. package/dist/utils/wall-assembly-migration.d.ts +14 -0
  1099. package/dist/utils/wall-assembly-migration.d.ts.map +1 -0
  1100. package/dist/utils/wall-assembly-migration.js +23 -0
  1101. package/dist/utils/wall-face-migration.d.ts +23 -0
  1102. package/dist/utils/wall-face-migration.d.ts.map +1 -0
  1103. package/dist/utils/wall-face-migration.js +246 -0
  1104. package/dist/validation/opening-bounds.d.ts +36 -0
  1105. package/dist/validation/opening-bounds.d.ts.map +1 -0
  1106. package/dist/validation/opening-bounds.js +34 -0
  1107. package/dist/validation/validate-build-json.d.ts +2 -0
  1108. package/dist/validation/validate-build-json.d.ts.map +1 -1
  1109. package/dist/validation/validate-build-json.js +48 -1
  1110. package/package.json +37 -4
  1111. package/dist/services/surface-hosting-procedural-parity.fixtures.d.ts +0 -13
  1112. package/dist/services/surface-hosting-procedural-parity.fixtures.d.ts.map +0 -1
  1113. package/dist/services/surface-hosting-procedural-parity.fixtures.js +0 -4691
  1114. package/dist/services/surface-hosting-shelf-parity.fixtures.d.ts +0 -1060
  1115. package/dist/services/surface-hosting-shelf-parity.fixtures.d.ts.map +0 -1
  1116. 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,36 +907,93 @@ function sceneHistorySnapshotFromState(state) {
990
907
  pendingIds.push(childId);
991
908
  }
992
909
  }
993
- const historyNodes = {};
994
- for (const [id, node] of Object.entries(nodes)) {
910
+ const documentNodes = {};
911
+ for (const [id, sourceNode] of Object.entries(nodes)) {
995
912
  if (transientNodeIds.has(id))
996
913
  continue;
914
+ let node = sourceNode;
915
+ if (node.type === 'procedural-item') {
916
+ let attachments;
917
+ for (const childId of transientNodeIds) {
918
+ if (!Object.hasOwn(node.attachments, childId))
919
+ continue;
920
+ attachments ??= { ...node.attachments };
921
+ delete attachments[childId];
922
+ }
923
+ if (attachments)
924
+ node = { ...node, attachments };
925
+ }
997
926
  if (!('children' in node && Array.isArray(node.children))) {
998
- historyNodes[id] = node;
927
+ documentNodes[id] = node;
999
928
  continue;
1000
929
  }
1001
930
  const children = node.children.filter((childId) => !transientNodeIds.has(childId));
1002
- historyNodes[id] =
931
+ documentNodes[id] =
1003
932
  children.length === node.children.length ? node : { ...node, children };
1004
933
  }
1005
- const historyCollections = {};
934
+ const documentCollections = {};
1006
935
  for (const [id, collection] of Object.entries(collections)) {
1007
936
  const nodeIds = collection.nodeIds.filter((nodeId) => !transientNodeIds.has(nodeId));
1008
937
  if (collection.controlNodeId && transientNodeIds.has(collection.controlNodeId)) {
1009
938
  const { controlNodeId: _controlNodeId, ...rest } = collection;
1010
- historyCollections[id] = { ...rest, nodeIds };
939
+ documentCollections[id] = { ...rest, nodeIds };
1011
940
  }
1012
941
  else {
1013
- historyCollections[id] =
942
+ documentCollections[id] =
1014
943
  nodeIds.length === collection.nodeIds.length ? collection : { ...collection, nodeIds };
1015
944
  }
1016
945
  }
1017
946
  return {
1018
- nodes: historyNodes,
947
+ nodes: documentNodes,
1019
948
  rootNodeIds: rootNodeIds.filter((id) => !transientNodeIds.has(id)),
1020
- 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,
1021
976
  materials,
1022
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,
1023
997
  };
1024
998
  }
1025
999
  /**
@@ -1079,7 +1053,26 @@ function createSceneStore(config) {
1079
1053
  };
1080
1054
  return create()(hydratedConfig);
1081
1055
  }
1082
- 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) {
1083
1076
  if (!target?.nodes) {
1084
1077
  jump();
1085
1078
  return;
@@ -1092,7 +1085,6 @@ function runTemporalJump(target, jump) {
1092
1085
  const next = target.nodes[nodeId];
1093
1086
  if (previous === next)
1094
1087
  continue;
1095
- // Structural hierarchy changes keep the full-level reconciliation fallback.
1096
1088
  if ([previous, next].some((node) => node && ['site', 'building', 'level'].includes(node.type))) {
1097
1089
  jump();
1098
1090
  return;
@@ -1147,9 +1139,9 @@ const useScene = createSceneStore(temporal((set, get) => ({
1147
1139
  setScene: (nodes, rootNodeIds, extra) => {
1148
1140
  // Apply backward compatibility migrations
1149
1141
  const { nodes: patchedNodes, mintedMaterials } = migrateNodes(nodes);
1150
- // Scene materials minted by the wall legacy→slots migration join the
1151
- // loaded palette (existing refs win on id collision — there are none,
1152
- // 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.
1153
1145
  const materials = { ...mintedMaterials, ...(extra?.materials ?? {}) };
1154
1146
  // Remove orphans: nodes whose parentId points to a non-existent node
1155
1147
  const cleanedNodes = { ...patchedNodes };
@@ -1186,37 +1178,22 @@ const useScene = createSceneStore(temporal((set, get) => ({
1186
1178
  installedPlugins: Array.from(new Set(extra?.installedPlugins ?? [])),
1187
1179
  hasExplicitPluginInstallState: extra?.hasExplicitPluginInstallState ?? false,
1188
1180
  });
1189
- const applyNormalization = (updates) => {
1190
- if (updates.length > 0)
1191
- get().updateNodes(updates);
1192
- };
1193
- const hydratedNodes = Object.values(get().nodes);
1194
- if (!get().readOnly) {
1195
- pauseSceneHistory(useScene);
1196
- try {
1197
- if (hydratedNodes.some((node) => node.type === 'elevator')) {
1198
- 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);
1199
1192
  }
1200
- }
1201
- finally {
1202
- resumeSceneHistory(useScene);
1203
- }
1204
- if (hydratedNodes.some((node) => node.type === 'stair')) {
1205
- // Spatial-grid subscribers must settle first. Owning this pass
1206
- // here also covers opening systems that mount after the load.
1207
- queueSceneNormalization(() => {
1208
- if (get().hydrationId !== hydrationId)
1209
- return;
1210
- pauseSceneHistory(useScene);
1211
- try {
1212
- applyNormalization(syncStairRises(get().nodes));
1213
- applyNormalization(syncAutoStairOpenings(get().nodes));
1214
- }
1215
- finally {
1216
- resumeSceneHistory(useScene);
1217
- }
1218
- });
1219
- }
1193
+ finally {
1194
+ resumeSceneHistory(useScene);
1195
+ }
1196
+ });
1220
1197
  }
1221
1198
  // Mark all nodes as dirty to trigger re-validation
1222
1199
  Object.values(get().nodes).forEach((node) => {
@@ -1269,7 +1246,7 @@ const useScene = createSceneStore(temporal((set, get) => ({
1269
1246
  parentId: building.id,
1270
1247
  level: 0,
1271
1248
  children: [],
1272
- height: 2.5,
1249
+ height: DEFAULT_LEVEL_HEIGHT,
1273
1250
  });
1274
1251
  // Define all nodes flat
1275
1252
  const nodes = {
@@ -1291,33 +1268,24 @@ const useScene = createSceneStore(temporal((set, get) => ({
1291
1268
  clearDirty: (id) => {
1292
1269
  get().dirtyNodes.delete(id);
1293
1270
  },
1294
- createNodes: (ops) => nodeActions.createNodesAction(set, get, ops),
1295
- createNode: (node, parentId) => nodeActions.createNodesAction(set, get, [{ node, parentId }]),
1296
- applyNodeChanges: (changes) => nodeActions.applyNodeChangesAction(set, get, changes),
1297
- updateNodes: (updates) => nodeActions.updateNodesAction(set, get, updates),
1298
- 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),
1299
1277
  // --- DELETE ---
1300
- deleteNodes: (ids) => nodeActions.deleteNodesAction(set, get, ids),
1301
- 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),
1302
1280
  // --- COLLECTIONS ---
1303
1281
  createCollection: (name, nodeIds = []) => {
1304
1282
  if (get().readOnly)
1305
1283
  return '';
1306
1284
  const id = generateCollectionId();
1307
- const collection = { id, name, nodeIds };
1308
- set((state) => {
1309
- const nextCollections = { ...state.collections, [id]: collection };
1310
- // Denormalize: stamp collectionId onto each node
1311
- const nextNodes = { ...state.nodes };
1312
- for (const nodeId of nodeIds) {
1313
- const node = nextNodes[nodeId];
1314
- if (!node)
1315
- continue;
1316
- const existing = ('collectionIds' in node ? node.collectionIds : undefined) ?? [];
1317
- nextNodes[nodeId] = { ...node, collectionIds: [...existing, id] };
1318
- }
1319
- return { collections: nextCollections, nodes: nextNodes };
1320
- });
1285
+ set((state) => ({
1286
+ collections: { ...state.collections, [id]: { id, name, nodeIds: [...nodeIds] } },
1287
+ nodes: mirrorItemMembership(state.nodes, id, nodeIds, true),
1288
+ }));
1321
1289
  return id;
1322
1290
  },
1323
1291
  deleteCollection: (id) => {
@@ -1327,18 +1295,10 @@ const useScene = createSceneStore(temporal((set, get) => ({
1327
1295
  const col = state.collections[id];
1328
1296
  const nextCollections = { ...state.collections };
1329
1297
  delete nextCollections[id];
1330
- // Remove collectionId from all member nodes
1331
- const nextNodes = { ...state.nodes };
1332
- for (const nodeId of col?.nodeIds ?? []) {
1333
- const node = nextNodes[nodeId];
1334
- if (!(node && 'collectionIds' in node))
1335
- continue;
1336
- nextNodes[nodeId] = {
1337
- ...node,
1338
- collectionIds: node.collectionIds.filter((cid) => cid !== id),
1339
- };
1340
- }
1341
- return { collections: nextCollections, nodes: nextNodes };
1298
+ return {
1299
+ collections: nextCollections,
1300
+ nodes: mirrorItemMembership(state.nodes, id, col?.nodeIds ?? [], false),
1301
+ };
1342
1302
  });
1343
1303
  },
1344
1304
  updateCollection: (id, data) => {
@@ -1351,50 +1311,38 @@ const useScene = createSceneStore(temporal((set, get) => ({
1351
1311
  return { collections: { ...state.collections, [id]: { ...col, ...data } } };
1352
1312
  });
1353
1313
  },
1354
- addToCollection: (id, nodeId) => {
1314
+ addToCollection: (id, nodeIds) => {
1355
1315
  if (get().readOnly)
1356
1316
  return;
1357
1317
  set((state) => {
1358
1318
  const col = state.collections[id];
1359
- if (!col || col.nodeIds.includes(nodeId))
1319
+ const added = nodeIds.filter((nodeId) => !col?.nodeIds.includes(nodeId));
1320
+ if (!col || added.length === 0)
1360
1321
  return state;
1361
- const nextCollections = {
1362
- ...state.collections,
1363
- [id]: { ...col, nodeIds: [...col.nodeIds, nodeId] },
1364
- };
1365
- const node = state.nodes[nodeId];
1366
- if (!node)
1367
- return { collections: nextCollections };
1368
- const existing = ('collectionIds' in node ? node.collectionIds : undefined) ?? [];
1369
- const nextNodes = {
1370
- ...state.nodes,
1371
- [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),
1372
1328
  };
1373
- return { collections: nextCollections, nodes: nextNodes };
1374
1329
  });
1375
1330
  },
1376
- removeFromCollection: (id, nodeId) => {
1331
+ removeFromCollection: (id, nodeIds) => {
1377
1332
  if (get().readOnly)
1378
1333
  return;
1379
1334
  set((state) => {
1380
1335
  const col = state.collections[id];
1381
- if (!col)
1336
+ const removed = nodeIds.filter((nodeId) => col?.nodeIds.includes(nodeId));
1337
+ if (!col || removed.length === 0)
1382
1338
  return state;
1383
- const nextCollections = {
1384
- ...state.collections,
1385
- [id]: { ...col, nodeIds: col.nodeIds.filter((n) => n !== nodeId) },
1386
- };
1387
- const node = state.nodes[nodeId];
1388
- if (!(node && 'collectionIds' in node))
1389
- return { collections: nextCollections };
1390
- const nextNodes = {
1391
- ...state.nodes,
1392
- [nodeId]: {
1393
- ...node,
1394
- 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)) },
1395
1343
  },
1344
+ nodes: mirrorItemMembership(state.nodes, id, removed, false),
1396
1345
  };
1397
- return { collections: nextCollections, nodes: nextNodes };
1398
1346
  });
1399
1347
  },
1400
1348
  // --- SCENE MATERIALS ---
@@ -1426,7 +1374,7 @@ const useScene = createSceneStore(temporal((set, get) => ({
1426
1374
  },
1427
1375
  }), {
1428
1376
  partialize: (state) => sceneHistorySnapshotFromState(state),
1429
- equality: (pastState, currentState) => areSceneSnapshotsEqual(pastState, currentState),
1377
+ equality: (pastState, currentState) => areSceneSnapshotsEqual({ ...pastState, nodes: withoutSceneAnnotations(pastState.nodes) }, { ...currentState, nodes: withoutSceneAnnotations(currentState.nodes) }),
1430
1378
  onSave: (pastState, currentState) => {
1431
1379
  notifySceneCommit({
1432
1380
  origin: 'local',
@@ -1455,6 +1403,23 @@ const invalidateForLiveState = () => {
1455
1403
  useLiveNodeOverrides.subscribe(invalidateForLiveState);
1456
1404
  useLiveTransforms.subscribe(invalidateForLiveState);
1457
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
+ });
1458
1423
  export default useScene;
1459
1424
  let sceneReadOnlyLeaseCount = 0;
1460
1425
  let sceneReadOnlyLeaseBaseline = false;
@@ -1511,7 +1476,8 @@ function sceneOperationPatchHasLiveConflict(beforeState, changes) {
1511
1476
  return false;
1512
1477
  }
1513
1478
  function areScenePatchValuesEqual(left, right) {
1514
- if (Object.is(left, right))
1479
+ // Compensation crosses JSON, which serializes both signed zeros as 0.
1480
+ if (left === right)
1515
1481
  return true;
1516
1482
  if (typeof left !== typeof right || left === null || right === null)
1517
1483
  return false;
@@ -1525,8 +1491,10 @@ function areScenePatchValuesEqual(left, right) {
1525
1491
  return false;
1526
1492
  const leftRecord = left;
1527
1493
  const rightRecord = right;
1528
- const leftKeys = Object.keys(leftRecord);
1529
- 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)
1530
1498
  return false;
1531
1499
  return leftKeys.every((key) => Object.hasOwn(rightRecord, key) &&
1532
1500
  areScenePatchValuesEqual(leftRecord[key], rightRecord[key]));
@@ -1605,7 +1573,7 @@ function sceneOperationPatchNextState(beforeState, changes) {
1605
1573
  !Number.isSafeInteger(change.position) ||
1606
1574
  change.position < 0 ||
1607
1575
  siblings?.[change.position] !== id ||
1608
- !areScenePatchValuesEqual(current, change.node)) {
1576
+ !areScenePatchValuesEqual(withoutSceneNodeAnnotations(current), withoutSceneNodeAnnotations(change.node))) {
1609
1577
  return null;
1610
1578
  }
1611
1579
  deleteIds.add(id);
@@ -1614,11 +1582,6 @@ function sceneOperationPatchNextState(beforeState, changes) {
1614
1582
  if (deleteIds.has(id))
1615
1583
  return null;
1616
1584
  }
1617
- for (const node of Object.values(beforeState.nodes)) {
1618
- const parentId = node.parentId ?? null;
1619
- if (parentId && deleteIds.has(parentId) && !deleteIds.has(node.id))
1620
- return null;
1621
- }
1622
1585
  const nextNodes = { ...beforeState.nodes };
1623
1586
  let nextRootNodeIds = deleteIds.size > 0
1624
1587
  ? beforeState.rootNodeIds.filter((id) => !deleteIds.has(id))
@@ -1653,8 +1616,7 @@ function sceneOperationPatchNextState(beforeState, changes) {
1653
1616
  if (!parent)
1654
1617
  return null;
1655
1618
  if (createIds.has(parentId)) {
1656
- if (!('children' in parent) ||
1657
- !Array.isArray(parent.children) ||
1619
+ if (!('children' in parent && Array.isArray(parent.children)) ||
1658
1620
  parent.children[change.position] !== change.node.id) {
1659
1621
  return null;
1660
1622
  }
@@ -1664,6 +1626,66 @@ function sceneOperationPatchNextState(beforeState, changes) {
1664
1626
  placements.push(change);
1665
1627
  existingParentCreates.set(parentId, placements);
1666
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
+ }
1667
1689
  const insertedRoots = insertSceneStructuralPlacements(nextRootNodeIds, rootCreates);
1668
1690
  if (!insertedRoots)
1669
1691
  return null;
@@ -1677,6 +1699,10 @@ function sceneOperationPatchNextState(beforeState, changes) {
1677
1699
  return null;
1678
1700
  nextNodes[parentId] = { ...parent, children };
1679
1701
  }
1702
+ for (const node of Object.values(nextNodes)) {
1703
+ if (node.parentId && deleteIds.has(node.parentId))
1704
+ return null;
1705
+ }
1680
1706
  for (const change of parsedCreates) {
1681
1707
  const parentId = change.node.parentId ?? null;
1682
1708
  const siblings = structuralSiblingIds(nextNodes, nextRootNodeIds, parentId);
@@ -1689,31 +1715,6 @@ function sceneOperationPatchNextState(beforeState, changes) {
1689
1715
  return null;
1690
1716
  }
1691
1717
  }
1692
- for (const { id, data, removeFields } of changes.nodeUpdates) {
1693
- const node = nextNodes[id];
1694
- if (!node ||
1695
- createIds.has(id) ||
1696
- deleteIds.has(id) ||
1697
- updateIds.has(id) ||
1698
- ('id' in data && data.id !== node.id) ||
1699
- ('type' in data && data.type !== node.type) ||
1700
- ('object' in data && data.object !== node.object) ||
1701
- removeFields.some((field) => field === 'id' || field === 'object' || field === 'type' || Object.hasOwn(data, field))) {
1702
- return null;
1703
- }
1704
- updateIds.add(id);
1705
- const candidate = { ...node, ...data };
1706
- for (const field of removeFields)
1707
- delete candidate[field];
1708
- const validated = parseSceneOperationPatchNode(candidate);
1709
- if (!validated ||
1710
- validated.id !== id ||
1711
- validated.type !== node.type ||
1712
- validated.object !== node.object) {
1713
- return null;
1714
- }
1715
- nextNodes[id] = candidate;
1716
- }
1717
1718
  const materials = changes.materialChanges.length > 0 ? { ...beforeState.materials } : beforeState.materials;
1718
1719
  for (const { id, material } of changes.materialChanges) {
1719
1720
  if (materialIds.has(id) ||
@@ -1726,16 +1727,87 @@ function sceneOperationPatchNextState(beforeState, changes) {
1726
1727
  else
1727
1728
  materials[id] = material;
1728
1729
  }
1729
- 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
+ };
1730
1777
  }
1731
- export function applySceneOperationPatch(changes) {
1778
+ export function applySceneOperationPatch(changes, options = {}) {
1732
1779
  const beforeState = useScene.getState();
1733
1780
  if (changes.nodeUpdates.length === 0 &&
1734
1781
  changes.materialChanges.length === 0 &&
1735
1782
  changes.nodeCreates.length === 0 &&
1736
- changes.nodeDeletes.length === 0) {
1783
+ changes.nodeDeletes.length === 0 &&
1784
+ !changes.pluginChanges?.length &&
1785
+ !changes.collectionChanges?.length &&
1786
+ !changes.pluginInstallState) {
1737
1787
  return false;
1738
1788
  }
1789
+ if (options.undoable &&
1790
+ !(useScene.temporal.getState().isTracking &&
1791
+ getSceneHistoryPauseDepth() === 0 &&
1792
+ !hasSceneHistoryDrafts())) {
1793
+ return false;
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;
1739
1811
  if (sceneOperationPatchHasLiveConflict(beforeState, changes))
1740
1812
  return false;
1741
1813
  const next = sceneOperationPatchNextState(beforeState, changes);
@@ -1746,7 +1818,7 @@ export function applySceneOperationPatch(changes) {
1746
1818
  if (shouldScopeHistoryPause)
1747
1819
  pauseSceneHistory(useScene);
1748
1820
  try {
1749
- useScene.setState(next);
1821
+ runAsRemoteSceneChange(() => useScene.setState(next));
1750
1822
  }
1751
1823
  finally {
1752
1824
  if (shouldScopeHistoryPause)
@@ -1765,6 +1837,12 @@ export function applySceneOperationPatch(changes) {
1765
1837
  }
1766
1838
  if (areSceneSnapshotsEqual(before, current))
1767
1839
  return false;
1840
+ if (options.undoable) {
1841
+ useScene.temporal.setState(({ pastStates }) => ({
1842
+ pastStates: [...pastStates, before],
1843
+ futureStates: [],
1844
+ }));
1845
+ }
1768
1846
  for (const id of touchedNodeIds) {
1769
1847
  if (current.nodes[id])
1770
1848
  currentState.markDirty(id);
@@ -1804,10 +1882,22 @@ export function applySceneOperationPatch(changes) {
1804
1882
  currentState.markDirty(node.parentId);
1805
1883
  }
1806
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
+ }
1807
1897
  for (const { node } of changes.nodeDeletes)
1808
1898
  currentState.clearDirty(node.id);
1809
1899
  notifySceneCommit({
1810
- origin: 'host',
1900
+ origin: options.annotation ? 'local' : 'host',
1811
1901
  before,
1812
1902
  current,
1813
1903
  });
@@ -1823,18 +1913,19 @@ export function applyScenePatch(changes) {
1823
1913
  export function applySceneSnapshot(snapshot, options) {
1824
1914
  const before = sceneHistorySnapshotFromState(useScene.getState());
1825
1915
  const temporalState = useScene.temporal.getState();
1826
- if (!temporalState.isTracking || getSceneHistoryPauseDepth() > 0) {
1916
+ if (!temporalState.isTracking || getSceneHistoryPauseDepth() > 0 || hasSceneHistoryDrafts()) {
1827
1917
  throw new Error('Cannot replace the scene snapshot during an active interaction');
1828
1918
  }
1829
1919
  useLiveNodeOverrides.getState().clearAll();
1830
1920
  useLiveTransforms.getState().clearAll();
1831
1921
  pauseSceneHistory(useScene);
1832
1922
  try {
1833
- useScene.getState().setScene(snapshot.nodes, snapshot.rootNodeIds, {
1923
+ runAsRemoteSceneChange(() => useScene.getState().setScene(snapshot.nodes, snapshot.rootNodeIds, {
1834
1924
  collections: snapshot.collections,
1835
1925
  installedPlugins: snapshot.installedPlugins,
1926
+ hasExplicitPluginInstallState: options.explicitPluginInstallState,
1836
1927
  materials: snapshot.materials,
1837
- });
1928
+ }));
1838
1929
  useScene.temporal.getState().clear();
1839
1930
  }
1840
1931
  finally {
@@ -1849,8 +1940,37 @@ export function applySceneSnapshot(snapshot, options) {
1849
1940
  // Track previous temporal state lengths for identifying history jumps
1850
1941
  let prevPastLength = 0;
1851
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 };
1852
1971
  export function clearSceneHistory() {
1853
1972
  resetSceneHistoryPauseDepth();
1973
+ clearSceneHistoryDrafts();
1854
1974
  // Resetting the pause-depth counter without resuming would strand the
1855
1975
  // temporal store in `isTracking: false` if a pause window was active when
1856
1976
  // the scene was (re)loaded — every edit after the load would then be
@@ -1870,10 +1990,13 @@ useScene.temporal.subscribe((state, previousState) => {
1870
1990
  return;
1871
1991
  const currentPastLength = state.pastStates.length;
1872
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.
1873
1995
  // Undo: futureStates increases (state moved from past to future)
1874
1996
  // Redo: pastStates increases while futureStates decreases (state moved from future to past)
1875
- const didUndo = currentFutureLength > prevFutureLength;
1876
- const didRedo = currentPastLength > prevPastLength && currentFutureLength < prevFutureLength;
1997
+ const jumping = isRestoringSceneHistory();
1998
+ const didUndo = jumping && currentFutureLength > prevFutureLength;
1999
+ const didRedo = jumping && currentPastLength > prevPastLength && currentFutureLength < prevFutureLength;
1877
2000
  if (didUndo || didRedo) {
1878
2001
  // Capture both layouts before another synchronous jump can replace them.
1879
2002
  // The state pushed onto the opposite stack includes history-paused derived