@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,13 @@
1
+ import { planWallDeletion } from '../../commands/structure/plan-wall-deletion.js';
2
+ import { withoutFloorStepOverrideKeys } from '../../lib/floor-step-finish.js';
3
+ import { isSpaceDetectionPaused } from '../../lib/space-detection.js';
1
4
  import { nodeRegistry } from '../../registry/registry.js';
2
5
  import { validateNodeRelations } from '../../registry/validate-relations.js';
3
- import { AnyNode as AnyNodeSchema, createDefaultGuttersForSegment, createDefaultRidgeVentsForSegment, DownspoutNode as DownspoutNodeSchema, defaultDownspoutMetadata, generateId, getDefaultGutterSide, getEffectiveWallSurfaceMaterial, getWallSurfaceMaterialSignature, isAutoGutterEnabled, isAutoRidgeVentEnabled, isDefaultDownspoutNode, isDefaultGutterNode, isDefaultRidgeVentNode, parseNode, planAutomaticDownspouts, resolveAutomaticDownspoutLength, } from '../../schema/index.js';
6
+ import { AnyNode as AnyNodeSchema, createDefaultGuttersForSegment, createDefaultRidgeVentsForSegment, DownspoutNode as DownspoutNodeSchema, defaultDownspoutMetadata, generateId, getDefaultGutterSide, isAutoGutterEnabled, isAutoRidgeVentEnabled, isDefaultDownspoutNode, isDefaultGutterNode, isDefaultRidgeVentNode, parseNode, planAutomaticDownspouts, resolveAutomaticDownspoutLength, } from '../../schema/index.js';
7
+ import { Provenance } from '../../schema/provenance.js';
4
8
  import { constrainWallCurveOffsetToAvoidIntersections } from '../../systems/wall/wall-curve.js';
9
+ import { areWallStylesCompatible, areWallsCollinearAcrossPoint, buildMergedWallAttachmentUpdates, getWallEndpointAtPoint, mergeWallFaceRegions, planMergedZoneReferences, resolveMergedWallEndpoints, } from '../../systems/wall/wall-merge.js';
10
+ import { convertDerivedPlateHoleWrites, DERIVED_WRITER_TOKEN, derivedDeletionIntent, derivedDetachPatch, filterDerivedNodeWrites, isDerivedNode, } from '../derived-node-guard.js';
5
11
  import { activeSceneCommitNodeIds, addActiveSceneCommitNodeIds, runWithSceneCommitNodeIds, } from '../history-control.js';
6
12
  const DEFAULT_RIDGE_VENT_REFRESH_FIELDS = new Set([
7
13
  'roofType',
@@ -366,12 +372,42 @@ function warnSanitizedNodeMutation(mutation, nodeId, issues) {
366
372
  // A broken diagnostic sink must not interrupt a node mutation either.
367
373
  }
368
374
  }
375
+ /**
376
+ * Source ids cannot be repaired the way the numeric fallback repairs a value:
377
+ * any fix would drop or rewrite them (D5). A write that sets an invalid
378
+ * `provenance` throws, whatever the node's kind (a plain plugin kind never
379
+ * reaches a schema that knows the field), so the mutation applies nothing.
380
+ */
381
+ function assertProvenanceWrite(nodeId, value) {
382
+ if (value === undefined)
383
+ return;
384
+ const parsed = Provenance.safeParse(value);
385
+ if (parsed.success)
386
+ return;
387
+ const issue = parsed.error.issues[0];
388
+ const at = ['provenance', ...(issue?.path ?? [])].join('.');
389
+ throw new Error(`Node "${nodeId}": provenance refused at ${at}: ${issue?.message}`);
390
+ }
391
+ /**
392
+ * A strict kind parses everything but `provenance`, which core checks on write
393
+ * and carries verbatim: a stored over-cap value (kept at load) must not make
394
+ * the node uneditable, and a schema that never declared the base field must
395
+ * not drop it.
396
+ */
397
+ function parseStrict(schema, candidate) {
398
+ if (!Object.hasOwn(candidate, 'provenance'))
399
+ return schema.parse(candidate);
400
+ const { provenance, ...rest } = candidate;
401
+ const parsed = schema.parse(rest);
402
+ return provenance === undefined ? parsed : { ...parsed, provenance };
403
+ }
369
404
  function parseCreatedNode(node, parentId) {
370
405
  const candidate = { ...node, parentId };
406
+ assertProvenanceWrite(candidate.id, candidate.provenance);
371
407
  const registered = nodeRegistry.get(candidate.type)?.schema;
372
408
  // Generated definitions must reject invalid geometry instead of retaining a failed parse.
373
409
  if (registered?.meta?.()?.strictMutations === true)
374
- return registered.parse(candidate);
410
+ return parseStrict(registered, candidate);
375
411
  const parsed = parseNode(candidate);
376
412
  if (parsed.success)
377
413
  return parsed.data;
@@ -397,6 +433,9 @@ function mergeNodeUpdate(currentNode, patch) {
397
433
  return merged;
398
434
  }
399
435
  function parseUpdatedNode(currentNode, data) {
436
+ // Only a write of the field is checked: a stored over-cap value stays editable.
437
+ if (Object.hasOwn(data, 'provenance'))
438
+ assertProvenanceWrite(currentNode.id, data.provenance);
400
439
  const candidate = mergeNodeUpdate(currentNode, data);
401
440
  // Graph links survive schemas that omit children; only an explicit patch may change them.
402
441
  const preserveChildren = (updated) => !Object.hasOwn(data, 'children') &&
@@ -407,7 +446,7 @@ function parseUpdatedNode(currentNode, data) {
407
446
  const registered = nodeRegistry.get(currentNode.type)?.schema;
408
447
  // Generated definitions must reject invalid geometry instead of retaining a failed parse.
409
448
  if (registered?.meta?.()?.strictMutations === true)
410
- return preserveChildren(registered.parse(candidate));
449
+ return preserveChildren(parseStrict(registered, candidate));
411
450
  const parsed = parseNode(candidate);
412
451
  if (parsed.success)
413
452
  return preserveChildren(parsed.data);
@@ -750,100 +789,6 @@ function refreshDefaultGuttersForRoofIds(nextNodes, roofIds, dirtyIds, deletedId
750
789
  // Track pending RAF for updateNodesAction to prevent multiple queued callbacks
751
790
  let pendingRafId = null;
752
791
  let pendingUpdates = new Set();
753
- function pointsEqual(a, b, tolerance = 1e-6) {
754
- const dx = a[0] - b[0];
755
- const dz = a[1] - b[1];
756
- return dx * dx + dz * dz <= tolerance * tolerance;
757
- }
758
- function wallLength(wall) {
759
- return Math.hypot(wall.end[0] - wall.start[0], wall.end[1] - wall.start[1]);
760
- }
761
- function getWallEndpointAtPoint(wall, point) {
762
- if (pointsEqual(wall.start, point))
763
- return 'start';
764
- if (pointsEqual(wall.end, point))
765
- return 'end';
766
- return null;
767
- }
768
- function getWallFreeEndpoint(wall, sharedPoint) {
769
- return pointsEqual(wall.start, sharedPoint) ? wall.end : wall.start;
770
- }
771
- function areWallStylesCompatible(a, b) {
772
- const aInterior = getWallSurfaceMaterialSignature(getEffectiveWallSurfaceMaterial(a, 'interior'));
773
- const bInterior = getWallSurfaceMaterialSignature(getEffectiveWallSurfaceMaterial(b, 'interior'));
774
- const aExterior = getWallSurfaceMaterialSignature(getEffectiveWallSurfaceMaterial(a, 'exterior'));
775
- const bExterior = getWallSurfaceMaterialSignature(getEffectiveWallSurfaceMaterial(b, 'exterior'));
776
- return ((a.parentId ?? null) === (b.parentId ?? null) &&
777
- Math.abs((a.curveOffset ?? 0) - (b.curveOffset ?? 0)) <= 1e-6 &&
778
- Math.abs((a.thickness ?? 0.2) - (b.thickness ?? 0.2)) <= 1e-6 &&
779
- // Absent height means plane-bound (follows the storey), which must never
780
- // merge with an explicit height — even one that currently matches the plane.
781
- (a.height == null) === (b.height == null) &&
782
- Math.abs((a.height ?? 0) - (b.height ?? 0)) <= 1e-6 &&
783
- aInterior === bInterior &&
784
- aExterior === bExterior &&
785
- a.frontSide === b.frontSide &&
786
- a.backSide === b.backSide &&
787
- a.visible === b.visible);
788
- }
789
- function areWallsCollinearAcrossPoint(a, b, sharedPoint) {
790
- const freeA = getWallFreeEndpoint(a, sharedPoint);
791
- const freeB = getWallFreeEndpoint(b, sharedPoint);
792
- const ax = freeA[0] - sharedPoint[0];
793
- const az = freeA[1] - sharedPoint[1];
794
- const bx = freeB[0] - sharedPoint[0];
795
- const bz = freeB[1] - sharedPoint[1];
796
- const lenA = Math.hypot(ax, az);
797
- const lenB = Math.hypot(bx, bz);
798
- if (lenA < 1e-6 || lenB < 1e-6)
799
- return false;
800
- const cross = (ax * bz - az * bx) / (lenA * lenB);
801
- const dot = (ax * bx + az * bz) / (lenA * lenB);
802
- return Math.abs(cross) <= 1e-4 && dot < -0.999;
803
- }
804
- function resolveMergedWallEndpoints(primary, secondary, sharedPoint) {
805
- const primaryEndpoint = getWallEndpointAtPoint(primary, sharedPoint);
806
- const secondaryEndpoint = getWallEndpointAtPoint(secondary, sharedPoint);
807
- if (primaryEndpoint === 'end' && secondaryEndpoint === 'start') {
808
- return { start: primary.start, end: secondary.end };
809
- }
810
- if (primaryEndpoint === 'start' && secondaryEndpoint === 'end') {
811
- return { start: secondary.start, end: primary.end };
812
- }
813
- if (primaryEndpoint === 'start' && secondaryEndpoint === 'start') {
814
- return { start: primary.end, end: secondary.end };
815
- }
816
- return { start: primary.start, end: secondary.start };
817
- }
818
- function buildMergedWallAttachmentUpdates(primary, secondary, mergedWallId, mergedStart, mergedEnd, nodes) {
819
- const mergedLength = Math.max(Math.hypot(mergedEnd[0] - mergedStart[0], mergedEnd[1] - mergedStart[1]), 1e-6);
820
- const tangentX = (mergedEnd[0] - mergedStart[0]) / mergedLength;
821
- const tangentZ = (mergedEnd[1] - mergedStart[1]) / mergedLength;
822
- const updates = [];
823
- const wallChildren = [...(primary.children ?? []), ...(secondary.children ?? [])];
824
- for (const childId of wallChildren) {
825
- const child = nodes[childId];
826
- if (!(child && 'position' in child && Array.isArray(child.position))) {
827
- continue;
828
- }
829
- const sourceWall = child.parentId === secondary.id ? secondary : primary;
830
- const sourceLength = Math.max(wallLength(sourceWall), 1e-6);
831
- const localX = typeof child.position[0] === 'number' ? child.position[0] : 0;
832
- const worldX = sourceWall.start[0] + ((sourceWall.end[0] - sourceWall.start[0]) * localX) / sourceLength;
833
- const worldZ = sourceWall.start[1] + ((sourceWall.end[1] - sourceWall.start[1]) * localX) / sourceLength;
834
- const nextLocalX = Math.max(0, Math.min(mergedLength, (worldX - mergedStart[0]) * tangentX + (worldZ - mergedStart[1]) * tangentZ));
835
- updates.push({
836
- id: childId,
837
- data: {
838
- parentId: mergedWallId,
839
- wallId: mergedWallId,
840
- position: [nextLocalX, child.position[1], child.position[2]],
841
- ...('wallT' in child ? { wallT: nextLocalX / mergedLength } : {}),
842
- },
843
- });
844
- }
845
- return updates;
846
- }
847
792
  function buildWallMergePlans(nodes, idsToDelete) {
848
793
  const deletedWalls = idsToDelete
849
794
  .map((id) => nodes[id])
@@ -861,7 +806,7 @@ function buildWallMergePlans(nodes, idsToDelete) {
861
806
  return false;
862
807
  if ((node.parentId ?? null) !== (deletedWall.parentId ?? null))
863
808
  return false;
864
- return pointsEqual(node.start, junction) || pointsEqual(node.end, junction);
809
+ return getWallEndpointAtPoint(node, junction) !== null;
865
810
  });
866
811
  if (candidates.length !== 2) {
867
812
  continue;
@@ -881,6 +826,11 @@ function buildWallMergePlans(nodes, idsToDelete) {
881
826
  continue;
882
827
  }
883
828
  const { start, end } = resolveMergedWallEndpoints(primary, secondary, junction);
829
+ // A heal that would repaint a room or overflow a side's regions leaves the walls split.
830
+ const mergedFaceRegions = mergeWallFaceRegions([primary, secondary], start, end);
831
+ const zoneUpdates = planMergedZoneReferences(nodes, primary, secondary, start, end);
832
+ if (!(mergedFaceRegions && zoneUpdates))
833
+ continue;
884
834
  const mergedChildren = Array.from(new Set([...(primary.children ?? []), ...(secondary.children ?? [])]));
885
835
  const attachmentUpdates = buildMergedWallAttachmentUpdates(primary, secondary, primary.id, start, end, nodes);
886
836
  mergePlans.push({
@@ -889,7 +839,9 @@ function buildWallMergePlans(nodes, idsToDelete) {
889
839
  mergedStart: start,
890
840
  mergedEnd: end,
891
841
  mergedChildren,
842
+ mergedFaceRegions: mergedFaceRegions.length > 0 ? mergedFaceRegions : undefined,
892
843
  attachmentUpdates,
844
+ zoneUpdates,
893
845
  });
894
846
  usedWallIds.add(primary.id);
895
847
  usedWallIds.add(secondary.id);
@@ -897,17 +849,21 @@ function buildWallMergePlans(nodes, idsToDelete) {
897
849
  }
898
850
  return mergePlans;
899
851
  }
900
- const createNodesActionImpl = (set, get, ops) => {
852
+ const createNodesActionImpl = (set, get, ops, options) => {
901
853
  if (get().readOnly)
902
854
  return;
855
+ ops = filterDerivedNodeWrites(get().nodes, { create: ops }, options).create;
856
+ if (!ops.length)
857
+ return;
903
858
  const extraNodesToMarkDirty = new Set();
904
859
  const extraNodesToClearDirty = new Set();
905
860
  set((state) => {
906
861
  const nextNodes = { ...state.nodes };
907
862
  const nextRootIds = [...state.rootNodeIds];
908
- for (const { node, parentId } of ops) {
863
+ const nextCollections = { ...state.collections };
864
+ for (const { node, parentId, collectionIds } of ops) {
909
865
  const effectiveParentId = parentId ?? node.parentId ?? null;
910
- const newNode = parseCreatedNode(node, effectiveParentId);
866
+ const newNode = joinCollections(nextCollections, parseCreatedNode(node, effectiveParentId), collectionIds);
911
867
  nextNodes[newNode.id] = newNode;
912
868
  // 2. Update the Parent's children list. We append to ANY container
913
869
  // parent (kind has `children` in its schema) — if the field is
@@ -946,7 +902,12 @@ const createNodesActionImpl = (set, get, ops) => {
946
902
  }
947
903
  refreshDefaultGuttersForRoofIds(nextNodes, refreshedRoofIds, extraNodesToMarkDirty, extraNodesToClearDirty);
948
904
  addActiveSceneCommitNodeIds([...extraNodesToMarkDirty, ...extraNodesToClearDirty]);
949
- return { nodes: nextNodes, rootNodeIds: nextRootIds };
905
+ const joined = Object.entries(nextCollections).some(([id, collection]) => state.collections[id] !== collection);
906
+ return {
907
+ nodes: nextNodes,
908
+ rootNodeIds: nextRootIds,
909
+ ...(joined && { collections: nextCollections }),
910
+ };
950
911
  });
951
912
  // 4. System Sync
952
913
  ops.forEach(({ node, parentId }) => {
@@ -961,11 +922,55 @@ const createNodesActionImpl = (set, get, ops) => {
961
922
  for (const id of extraNodesToClearDirty)
962
923
  get().clearDirty(id);
963
924
  };
964
- const applyNodeChangesActionImpl = (set, get, changes) => {
925
+ /**
926
+ * A created node joins the collections it is given, or an item those its mirror
927
+ * names, so a duplicate or a same-project paste stays a member; ids of
928
+ * collections this scene lacks (a paste from another project) are dropped.
929
+ * Writes the joined collections into `collections` and returns the node, an
930
+ * item with its mirror set to what it joined.
931
+ */
932
+ export function joinCollections(collections, node, requested = node.type === 'item' ? node.collectionIds : undefined) {
933
+ const collectionIds = (requested ?? []).filter((id) => collections[id]);
934
+ for (const id of collectionIds) {
935
+ const collection = collections[id];
936
+ if (!collection.nodeIds.includes(node.id))
937
+ collections[id] = { ...collection, nodeIds: [...collection.nodeIds, node.id] };
938
+ }
939
+ if (node.type !== 'item' || sameIds(node.collectionIds ?? [], collectionIds))
940
+ return node;
941
+ return { ...node, collectionIds };
942
+ }
943
+ function sameIds(left, right) {
944
+ return left.length === right.length && left.every((id, index) => right[index] === id);
945
+ }
946
+ /** The collections `id` belongs to: membership lives on the collection for every kind. */
947
+ export function collectionIdsOf(collections, id) {
948
+ return Object.values(collections)
949
+ .filter((collection) => collection.nodeIds.includes(id))
950
+ .map((collection) => collection.id);
951
+ }
952
+ /** Membership lives on the collection; only items mirror it, so every collection is checked. */
953
+ function removeFromCollections(collections, id) {
954
+ for (const [collectionId, collection] of Object.entries(collections)) {
955
+ if (collection.nodeIds.includes(id))
956
+ collections[collectionId] = {
957
+ ...collection,
958
+ nodeIds: collection.nodeIds.filter((nodeId) => nodeId !== id),
959
+ };
960
+ }
961
+ }
962
+ const applyNodeChangesActionImpl = (set, get, changes, options) => {
965
963
  if (get().readOnly)
966
964
  return;
965
+ changes = convertDerivedPlateHoleWrites(get().nodes, changes, options);
966
+ changes = filterDerivedNodeWrites(get().nodes, changes, options);
967
+ if (!changes.create?.length && !changes.update?.length && !changes.delete?.length)
968
+ return;
967
969
  const createOps = changes.create ?? [];
968
- const updateOps = changes.update ?? [];
970
+ const deletionIntent = options?.derivedWriter === DERIVED_WRITER_TOKEN
971
+ ? []
972
+ : derivedDeletionIntent(get().nodes, changes.delete ?? []);
973
+ const updateOps = [...(changes.update ?? []), ...deletionIntent];
969
974
  const deleteOps = changes.delete ?? [];
970
975
  const nodesToMarkDirty = new Set();
971
976
  const nodesToClearDirty = new Set();
@@ -1016,9 +1021,9 @@ const applyNodeChangesActionImpl = (set, get, changes) => {
1016
1021
  }
1017
1022
  nodesToMarkDirty.add(id);
1018
1023
  }
1019
- for (const { node, parentId } of createOps) {
1024
+ for (const { node, parentId, collectionIds } of createOps) {
1020
1025
  const effectiveParentId = parentId ?? node.parentId ?? null;
1021
- const newNode = parseCreatedNode(node, effectiveParentId);
1026
+ const newNode = joinCollections(nextCollections, parseCreatedNode(node, effectiveParentId), collectionIds);
1022
1027
  nextNodes[newNode.id] = newNode;
1023
1028
  nodesToMarkDirty.add(newNode.id);
1024
1029
  if (newNode.type === 'roof-segment' && effectiveParentId) {
@@ -1077,17 +1082,7 @@ const applyNodeChangesActionImpl = (set, get, changes) => {
1077
1082
  }
1078
1083
  }
1079
1084
  resolvedRootIds = resolvedRootIds.filter((rootId) => rootId !== id);
1080
- if ('collectionIds' in node && node.collectionIds) {
1081
- for (const collectionId of node.collectionIds) {
1082
- const collection = nextCollections[collectionId];
1083
- if (collection) {
1084
- nextCollections[collectionId] = {
1085
- ...collection,
1086
- nodeIds: collection.nodeIds.filter((nodeId) => nodeId !== id),
1087
- };
1088
- }
1089
- }
1090
- }
1085
+ removeFromCollections(nextCollections, id);
1091
1086
  delete nextNodes[id];
1092
1087
  }
1093
1088
  refreshDefaultGuttersForRoofIds(nextNodes, roofsToRefresh, nodesToMarkDirty, nodesToClearDirty);
@@ -1115,9 +1110,17 @@ const applyNodeChangesActionImpl = (set, get, changes) => {
1115
1110
  }
1116
1111
  }
1117
1112
  };
1118
- const updateNodesActionImpl = (set, get, updates) => {
1113
+ const updateNodesActionImpl = (set, get, updates, options, deferDirty = true) => {
1119
1114
  if (get().readOnly)
1120
1115
  return;
1116
+ const converted = convertDerivedPlateHoleWrites(get().nodes, { update: updates }, options);
1117
+ if (converted.create?.length || converted.delete?.length) {
1118
+ applyNodeChangesActionImpl(set, get, converted, options);
1119
+ return;
1120
+ }
1121
+ updates = filterDerivedNodeWrites(get().nodes, { update: converted.update ?? [] }, options).update;
1122
+ if (!updates.length)
1123
+ return;
1121
1124
  const parentsToUpdate = new Set();
1122
1125
  const extraNodesToUpdate = new Set();
1123
1126
  const extraNodesToDelete = new Set();
@@ -1194,6 +1197,13 @@ const updateNodesActionImpl = (set, get, updates) => {
1194
1197
  ]);
1195
1198
  return { nodes: nextNodes };
1196
1199
  });
1200
+ if (!deferDirty) {
1201
+ for (const id of [...updates.map((u) => u.id), ...parentsToUpdate, ...extraNodesToUpdate])
1202
+ get().markDirty(id);
1203
+ for (const id of extraNodesToDelete)
1204
+ get().clearDirty(id);
1205
+ return;
1206
+ }
1197
1207
  // Batch dirty-marking into a single RAF to avoid redundant callbacks during rapid updates
1198
1208
  for (const u of updates) {
1199
1209
  // Visibility is applied by React before the deferred dirty callback. Mark
@@ -1223,175 +1233,309 @@ const updateNodesActionImpl = (set, get, updates) => {
1223
1233
  pendingRafId = null;
1224
1234
  });
1225
1235
  };
1226
- const deleteNodesActionImpl = (set, get, ids) => {
1227
- if (get().readOnly)
1228
- return;
1236
+ /**
1237
+ * The delete store action's planner, without committing: the requested ids,
1238
+ * their `children` subtrees and kind `onDeleteCascade` companions, collinear
1239
+ * walls merged across a deleted junction, the separators that keep two rooms
1240
+ * apart when the wall between them goes, derived-construction deletion intent,
1241
+ * neighbour patches, support and unit cleanup, and the default gutter and
1242
+ * downspout refresh.
1243
+ *
1244
+ * The refresh mints gutters, downspouts and outlets with random ids, and which
1245
+ * existing defaults it keeps can depend on them. With `mintDefaults: false`
1246
+ * (a preview, such as the MCP patch dry run) the refresh does not run: the
1247
+ * existing defaults it would touch are listed in `unsettledIds`, and the plan
1248
+ * is deterministic and equals the commit for every other existing id. The
1249
+ * delete action mints.
1250
+ */
1251
+ export function planNodeDeletion(scene, ids, { mintDefaults = true, options, wallDeletionPlan, } = {}) {
1229
1252
  const parentsToMarkDirty = new Set();
1230
1253
  const nodesToMarkDirty = new Set();
1231
1254
  const deletedIds = new Set();
1232
- const mergePlans = buildWallMergePlans(get().nodes, ids);
1255
+ const mergePlans = buildWallMergePlans(scene.nodes, ids);
1233
1256
  const requestedDeleteIds = new Set(ids);
1234
- set((state) => {
1235
- const nextNodes = { ...state.nodes };
1236
- const nextCollections = { ...state.collections };
1237
- let nextRootIds = [...state.rootNodeIds];
1238
- // Collect all ids to delete (the requested ids + all their descendants) before
1239
- // mutating anything, so the recursive walk reads consistent state.
1240
- const allIds = new Set();
1241
- const collect = (id) => {
1242
- if (allIds.has(id))
1243
- return;
1244
- allIds.add(id);
1245
- const node = nextNodes[id];
1246
- const cascadeDeletes = node
1247
- ? nodeRegistry
1248
- .get(node.type)
1249
- ?.parametrics?.onDeleteCascade?.(node, nextNodes, allIds, requestedDeleteIds)
1250
- : null;
1251
- if (cascadeDeletes) {
1252
- for (const companionId of cascadeDeletes)
1253
- collect(companionId);
1257
+ // Deleting derived construction is an intent edit ("this room has no
1258
+ // ceiling"), not a refusal — the reconciler must not rebuild it.
1259
+ const deletionIntent = options?.derivedWriter === DERIVED_WRITER_TOKEN ? [] : derivedDeletionIntent(scene.nodes, ids);
1260
+ // A preview names the separators a room-preserving delete adds without random ids.
1261
+ let previewCount = 0;
1262
+ const previewId = (kind) => {
1263
+ let id;
1264
+ do
1265
+ id = `${kind}_preview${++previewCount}`;
1266
+ while (id in scene.nodes);
1267
+ return id;
1268
+ };
1269
+ const nextNodes = { ...scene.nodes };
1270
+ const nextCollections = { ...scene.collections };
1271
+ let nextRootIds = [...scene.rootNodeIds];
1272
+ // Collect all ids to delete (the requested ids + all their descendants) before
1273
+ // mutating anything, so the recursive walk reads consistent state.
1274
+ const allIds = new Set();
1275
+ const collect = (id) => {
1276
+ if (allIds.has(id))
1277
+ return;
1278
+ allIds.add(id);
1279
+ const node = nextNodes[id];
1280
+ const cascadeDeletes = node
1281
+ ? nodeRegistry
1282
+ .get(node.type)
1283
+ ?.parametrics?.onDeleteCascade?.(node, nextNodes, allIds, requestedDeleteIds)
1284
+ : null;
1285
+ if (cascadeDeletes) {
1286
+ for (const companionId of cascadeDeletes)
1287
+ collect(companionId);
1288
+ }
1289
+ if (node && 'children' in node) {
1290
+ for (const cid of node.children)
1291
+ collect(cid);
1292
+ }
1293
+ };
1294
+ for (const id of ids)
1295
+ collect(id);
1296
+ if (wallDeletionPlan ||
1297
+ (options?.derivedWriter !== DERIVED_WRITER_TOKEN && !isSpaceDetectionPaused())) {
1298
+ const plan = wallDeletionPlan ??
1299
+ planWallDeletion(scene.nodes, {
1300
+ nodeIds: [...allIds],
1301
+ mintId: mintDefaults ? generateId : previewId,
1302
+ });
1303
+ for (const change of plan.changes) {
1304
+ if (change.op === 'delete')
1305
+ collect(change.id);
1306
+ else if (change.op === 'update') {
1307
+ const current = nextNodes[change.id];
1308
+ if (current)
1309
+ nextNodes[change.id] = parseUpdatedNode(current, change.data);
1310
+ nodesToMarkDirty.add(change.id);
1254
1311
  }
1255
- if (node && 'children' in node) {
1256
- for (const cid of node.children)
1257
- collect(cid);
1312
+ else {
1313
+ const node = change.node;
1314
+ nextNodes[node.id] = node;
1315
+ nodesToMarkDirty.add(node.id);
1316
+ const parent = node.parentId ? nextNodes[node.parentId] : undefined;
1317
+ if (parent && 'children' in parent && Array.isArray(parent.children)) {
1318
+ nextNodes[parent.id] = { ...parent, children: [...parent.children, node.id] };
1319
+ parentsToMarkDirty.add(parent.id);
1320
+ }
1258
1321
  }
1259
- };
1260
- for (const id of ids)
1261
- collect(id);
1262
- for (const plan of mergePlans) {
1263
- allIds.add(plan.secondaryWallId);
1264
1322
  }
1265
- const affectedRoofIds = new Set();
1266
- for (const id of allIds) {
1267
- const node = nextNodes[id];
1268
- addLeanToHostRoofId(node, nextNodes, affectedRoofIds);
1269
- if (node?.type === 'roof-segment' && node.parentId) {
1270
- affectedRoofIds.add(node.parentId);
1271
- }
1323
+ }
1324
+ for (const plan of mergePlans) {
1325
+ allIds.add(plan.secondaryWallId);
1326
+ }
1327
+ const affectedRoofIds = new Set();
1328
+ for (const id of allIds) {
1329
+ const node = nextNodes[id];
1330
+ addLeanToHostRoofId(node, nextNodes, affectedRoofIds);
1331
+ if (node?.type === 'roof-segment' && node.parentId) {
1332
+ affectedRoofIds.add(node.parentId);
1272
1333
  }
1273
- for (const id of allIds)
1274
- deletedIds.add(id);
1275
- // Let each deleted kind undo what it imposed on its neighbours (e.g. an
1276
- // auto-inserted elbow re-extends the duct runs it trimmed back onto the
1277
- // corner it replaced). Read against pre-deletion `nextNodes`; skip
1278
- // patches that target a node also being deleted.
1279
- for (const id of allIds) {
1280
- const node = nextNodes[id];
1281
- if (!node)
1334
+ }
1335
+ for (const id of allIds)
1336
+ deletedIds.add(id);
1337
+ // Let each deleted kind undo what it imposed on its neighbours (e.g. an
1338
+ // auto-inserted elbow re-extends the duct runs it trimmed back onto the
1339
+ // corner it replaced). Read against pre-deletion `nextNodes`; skip
1340
+ // patches that target a node also being deleted.
1341
+ for (const id of allIds) {
1342
+ const node = nextNodes[id];
1343
+ if (!node)
1344
+ continue;
1345
+ const onDelete = nodeRegistry.get(node.type)?.parametrics?.onDelete;
1346
+ if (!onDelete)
1347
+ continue;
1348
+ for (const { id: targetId, data } of onDelete(node, nextNodes, allIds, requestedDeleteIds)) {
1349
+ if (allIds.has(targetId))
1282
1350
  continue;
1283
- const onDelete = nodeRegistry.get(node.type)?.parametrics?.onDelete;
1284
- if (!onDelete)
1351
+ const target = nextNodes[targetId];
1352
+ if (!target)
1285
1353
  continue;
1286
- for (const { id: targetId, data } of onDelete(node, nextNodes, allIds, requestedDeleteIds)) {
1287
- if (allIds.has(targetId))
1288
- continue;
1289
- const target = nextNodes[targetId];
1290
- if (!target)
1291
- continue;
1292
- nextNodes[targetId] = { ...target, ...data };
1293
- nodesToMarkDirty.add(targetId);
1294
- }
1354
+ nextNodes[targetId] = { ...target, ...data };
1355
+ nodesToMarkDirty.add(targetId);
1295
1356
  }
1296
- for (const plan of mergePlans) {
1297
- const primaryWall = nextNodes[plan.primaryWallId];
1298
- if (!(primaryWall && primaryWall.type === 'wall') || allIds.has(plan.primaryWallId)) {
1357
+ }
1358
+ for (const plan of mergePlans) {
1359
+ const primaryWall = nextNodes[plan.primaryWallId];
1360
+ if (!(primaryWall && primaryWall.type === 'wall') || allIds.has(plan.primaryWallId)) {
1361
+ continue;
1362
+ }
1363
+ const { faceRegions: _regions, ...keptWall } = primaryWall;
1364
+ nextNodes[plan.primaryWallId] = {
1365
+ ...keptWall,
1366
+ ...(plan.mergedFaceRegions ? { faceRegions: plan.mergedFaceRegions } : {}),
1367
+ start: plan.mergedStart,
1368
+ end: plan.mergedEnd,
1369
+ children: plan.mergedChildren,
1370
+ };
1371
+ nodesToMarkDirty.add(plan.primaryWallId);
1372
+ for (const update of plan.zoneUpdates) {
1373
+ if (allIds.has(update.id))
1299
1374
  continue;
1300
- }
1301
- nextNodes[plan.primaryWallId] = {
1302
- ...primaryWall,
1303
- start: plan.mergedStart,
1304
- end: plan.mergedEnd,
1305
- children: plan.mergedChildren,
1306
- };
1307
- nodesToMarkDirty.add(plan.primaryWallId);
1308
- for (const update of plan.attachmentUpdates) {
1309
- if (allIds.has(update.id))
1310
- continue;
1311
- const child = nextNodes[update.id];
1312
- if (!child)
1313
- continue;
1314
- nextNodes[update.id] = { ...child, ...update.data };
1315
- nodesToMarkDirty.add(update.id);
1316
- }
1375
+ const zone = nextNodes[update.id];
1376
+ if (zone)
1377
+ nextNodes[update.id] = { ...zone, ...update.data };
1317
1378
  }
1318
- // Deleting a slab strips `supportSlabId` / `deckSlabId` references from
1319
- // surviving nodes in the same undo commit (mirrors the collectionIds
1320
- // cleanup below), so those nodes re-elect their support / re-derive
1321
- // their rise. Deletion is the ONLY writer — a host merely reshaped away
1322
- // keeps the field and the read path falls back, letting hosting resume
1323
- // if the slab returns.
1324
- const deletedSlabIds = new Set();
1325
- for (const id of allIds) {
1326
- if (nextNodes[id]?.type === 'slab')
1327
- deletedSlabIds.add(id);
1379
+ for (const update of plan.attachmentUpdates) {
1380
+ if (allIds.has(update.id))
1381
+ continue;
1382
+ const child = nextNodes[update.id];
1383
+ if (!child)
1384
+ continue;
1385
+ nextNodes[update.id] = { ...child, ...update.data };
1386
+ nodesToMarkDirty.add(update.id);
1328
1387
  }
1329
- if (deletedSlabIds.size > 0) {
1330
- for (const [nodeId, node] of Object.entries(nextNodes)) {
1331
- if (allIds.has(nodeId))
1332
- continue;
1333
- const patch = {};
1334
- const hostId = node.supportSlabId;
1335
- if (hostId && deletedSlabIds.has(hostId))
1336
- patch.supportSlabId = undefined;
1337
- const deckId = node.deckSlabId;
1338
- if (deckId && deletedSlabIds.has(deckId))
1339
- patch.deckSlabId = undefined;
1340
- if (Object.keys(patch).length > 0) {
1341
- nextNodes[nodeId] = { ...node, ...patch };
1342
- nodesToMarkDirty.add(nodeId);
1343
- }
1388
+ }
1389
+ // Deleting a slab strips `supportSlabId` / `deckSlabId` references from
1390
+ // surviving nodes in the same undo commit (mirrors the collectionIds
1391
+ // cleanup below), so those nodes re-elect their support / re-derive
1392
+ // their rise. Deletion is the ONLY writer — a host merely reshaped away
1393
+ // keeps the field and the read path falls back, letting hosting resume
1394
+ // if the slab returns.
1395
+ const deletedSlabIds = new Set();
1396
+ for (const id of allIds) {
1397
+ if (nextNodes[id]?.type === 'slab')
1398
+ deletedSlabIds.add(id);
1399
+ }
1400
+ if (deletedSlabIds.size > 0) {
1401
+ for (const [nodeId, node] of Object.entries(nextNodes)) {
1402
+ if (allIds.has(nodeId))
1403
+ continue;
1404
+ const patch = {};
1405
+ const hostId = node.supportSlabId;
1406
+ if (hostId && deletedSlabIds.has(hostId))
1407
+ patch.supportSlabId = undefined;
1408
+ const deckId = node.deckSlabId;
1409
+ if (deckId && deletedSlabIds.has(deckId))
1410
+ patch.deckSlabId = undefined;
1411
+ if (Object.keys(patch).length > 0) {
1412
+ nextNodes[nodeId] = { ...node, ...patch };
1413
+ nodesToMarkDirty.add(nodeId);
1344
1414
  }
1345
1415
  }
1346
- const deletedZoneIds = new Set();
1347
- for (const id of allIds) {
1348
- if (nextNodes[id]?.type === 'zone')
1349
- deletedZoneIds.add(id);
1416
+ }
1417
+ // A deleted door takes its step paint with it, in the same undo step; every
1418
+ // other doorway keeps its own.
1419
+ for (const node of Object.values(nextNodes)) {
1420
+ if (node.type !== 'zone' || allIds.has(node.id))
1421
+ continue;
1422
+ const pruned = withoutFloorStepOverrideKeys(node, allIds);
1423
+ if (!pruned)
1424
+ continue;
1425
+ nextNodes[node.id] = pruned;
1426
+ nodesToMarkDirty.add(node.id);
1427
+ }
1428
+ const deletedZoneIds = new Set();
1429
+ for (const id of allIds) {
1430
+ if (nextNodes[id]?.type === 'zone')
1431
+ deletedZoneIds.add(id);
1432
+ }
1433
+ if (deletedZoneIds.size > 0) {
1434
+ for (const node of Object.values(nextNodes)) {
1435
+ if (node.type !== 'unit' || allIds.has(node.id))
1436
+ continue;
1437
+ const members = node.members.filter((id) => !deletedZoneIds.has(id));
1438
+ if (members.length === node.members.length)
1439
+ continue;
1440
+ nextNodes[node.id] = { ...node, members };
1441
+ nodesToMarkDirty.add(node.id);
1350
1442
  }
1351
- if (deletedZoneIds.size > 0) {
1352
- for (const node of Object.values(nextNodes)) {
1353
- if (node.type !== 'unit' || allIds.has(node.id))
1354
- continue;
1355
- const members = node.members.filter((id) => !deletedZoneIds.has(id));
1356
- if (members.length === node.members.length)
1357
- continue;
1358
- nextNodes[node.id] = { ...node, members };
1359
- nodesToMarkDirty.add(node.id);
1443
+ }
1444
+ for (const id of allIds) {
1445
+ const node = nextNodes[id];
1446
+ if (!node)
1447
+ continue;
1448
+ // Legacy graphs can link children without a reciprocal parentId.
1449
+ const parentId = (node.parentId ??
1450
+ Object.values(nextNodes).find((candidate) => 'children' in candidate && candidate.children?.some((childId) => childId === id))?.id);
1451
+ if (parentId && nextNodes[parentId] && !allIds.has(parentId)) {
1452
+ const parent = nextNodes[parentId];
1453
+ if (parent.children) {
1454
+ nextNodes[parent.id] = {
1455
+ ...parent,
1456
+ children: parent.children.filter((cid) => cid !== id),
1457
+ };
1458
+ parentsToMarkDirty.add(parent.id);
1360
1459
  }
1361
1460
  }
1362
- for (const id of allIds) {
1363
- const node = nextNodes[id];
1364
- if (!node)
1461
+ // 2. Remove from root list
1462
+ nextRootIds = nextRootIds.filter((rid) => rid !== id);
1463
+ // 3. Remove from any collections it belongs to
1464
+ removeFromCollections(nextCollections, id);
1465
+ // 4. Delete the node itself
1466
+ delete nextNodes[id];
1467
+ }
1468
+ for (const { id, data } of deletionIntent) {
1469
+ const zone = nextNodes[id];
1470
+ if (!zone)
1471
+ continue;
1472
+ nextNodes[id] = { ...zone, ...data };
1473
+ nodesToMarkDirty.add(id);
1474
+ }
1475
+ const unsettledIds = new Set();
1476
+ const regeneratedHostIds = new Set();
1477
+ if (mintDefaults) {
1478
+ refreshDefaultGuttersForRoofIds(nextNodes, affectedRoofIds, nodesToMarkDirty, deletedIds);
1479
+ }
1480
+ else {
1481
+ collectRefreshedDefaults(nextNodes, affectedRoofIds, unsettledIds, regeneratedHostIds);
1482
+ }
1483
+ return {
1484
+ nodes: nextNodes,
1485
+ rootNodeIds: nextRootIds,
1486
+ collections: nextCollections,
1487
+ deletedIds,
1488
+ parentsToMarkDirty,
1489
+ nodesToMarkDirty,
1490
+ unsettledIds,
1491
+ regeneratedHostIds,
1492
+ };
1493
+ }
1494
+ /**
1495
+ * The existing nodes the default gutter refresh of `roofIds` may keep, move or
1496
+ * replace: each roof's default gutters and the downspouts on them. Which of
1497
+ * them survive depends on the gutters the refresh mints, whose ids are random.
1498
+ * `hosts` receives the roof segments whose `children` the refresh rewrites.
1499
+ */
1500
+ function collectRefreshedDefaults(nodes, roofIds, out, hosts) {
1501
+ const gutterIds = new Set();
1502
+ for (const roofId of new Set(roofIds)) {
1503
+ const roof = nodes[roofId];
1504
+ if (roof?.type !== 'roof')
1505
+ continue;
1506
+ for (const segmentId of roof.children ?? []) {
1507
+ const segment = nodes[segmentId];
1508
+ if (segment?.type !== 'roof-segment')
1365
1509
  continue;
1366
- // 1. Remove reference from parent — only if the parent itself is NOT also being deleted
1367
- const parentId = node.parentId;
1368
- if (parentId && nextNodes[parentId] && !allIds.has(parentId)) {
1369
- const parent = nextNodes[parentId];
1370
- if (parent.children) {
1371
- nextNodes[parent.id] = {
1372
- ...parent,
1373
- children: parent.children.filter((cid) => cid !== id),
1374
- };
1375
- parentsToMarkDirty.add(parent.id);
1510
+ hosts.add(segment.id);
1511
+ for (const childId of segment.children ?? []) {
1512
+ if (isDefaultGutterNode(nodes[childId], segment.id)) {
1513
+ gutterIds.add(childId);
1376
1514
  }
1377
1515
  }
1378
- // 2. Remove from root list
1379
- nextRootIds = nextRootIds.filter((rid) => rid !== id);
1380
- // 3. Remove from any collections it belongs to
1381
- if ('collectionIds' in node && node.collectionIds) {
1382
- for (const cid of node.collectionIds) {
1383
- const col = nextCollections[cid];
1384
- if (col) {
1385
- nextCollections[cid] = { ...col, nodeIds: col.nodeIds.filter((nid) => nid !== id) };
1386
- }
1387
- }
1388
- }
1389
- // 4. Delete the node itself
1390
- delete nextNodes[id];
1391
1516
  }
1392
- refreshDefaultGuttersForRoofIds(nextNodes, affectedRoofIds, nodesToMarkDirty, deletedIds);
1517
+ }
1518
+ for (const id of gutterIds)
1519
+ out.add(id);
1520
+ for (const node of Object.values(nodes)) {
1521
+ if (node?.type === 'downspout' && node.gutterId && gutterIds.has(node.gutterId)) {
1522
+ out.add(node.id);
1523
+ }
1524
+ }
1525
+ }
1526
+ const deleteNodesActionImpl = (set, get, ids, options, wallDeletionPlan) => {
1527
+ if (get().readOnly)
1528
+ return;
1529
+ let deletedIds = new Set();
1530
+ let parentsToMarkDirty = new Set();
1531
+ let nodesToMarkDirty = new Set();
1532
+ set((state) => {
1533
+ const plan = planNodeDeletion(state, ids, { options, wallDeletionPlan });
1534
+ deletedIds = plan.deletedIds;
1535
+ parentsToMarkDirty = plan.parentsToMarkDirty;
1536
+ nodesToMarkDirty = plan.nodesToMarkDirty;
1393
1537
  addActiveSceneCommitNodeIds([...deletedIds, ...parentsToMarkDirty, ...nodesToMarkDirty]);
1394
- return { nodes: nextNodes, rootNodeIds: nextRootIds, collections: nextCollections };
1538
+ return { nodes: plan.nodes, rootNodeIds: plan.rootNodeIds, collections: plan.collections };
1395
1539
  });
1396
1540
  // Deleted ids must leave the dirty set: every consumer skips missing
1397
1541
  // nodes without clearing them, so a mark on a deleted node would sit in
@@ -1421,17 +1565,101 @@ function validatedSet(set) {
1421
1565
  return patch;
1422
1566
  });
1423
1567
  }
1424
- export const createNodesAction = (set, get, ops) => runWithSceneCommitNodeIds(ops.flatMap(({ node, parentId }) => {
1568
+ /** Runs the same deletion hooks and update constraints for headless scene owners. */
1569
+ export function planSceneNodeChanges(snapshot, changes) {
1570
+ const dirtyIds = new Set();
1571
+ let state = {
1572
+ ...snapshot,
1573
+ readOnly: false,
1574
+ markDirty: (id) => {
1575
+ dirtyIds.add(id);
1576
+ },
1577
+ clearDirty: (id) => {
1578
+ dirtyIds.delete(id);
1579
+ },
1580
+ };
1581
+ const set = (update) => {
1582
+ state = { ...state, ...update(state) };
1583
+ };
1584
+ if (changes.update?.length)
1585
+ updateNodesActionImpl(set, () => state, changes.update, undefined, false);
1586
+ if (changes.delete?.length)
1587
+ deleteNodesActionImpl(set, () => state, changes.delete, undefined, changes.wallDeletionPlan);
1588
+ return {
1589
+ nodes: state.nodes,
1590
+ rootNodeIds: state.rootNodeIds,
1591
+ collections: state.collections,
1592
+ dirtyIds: [...dirtyIds],
1593
+ };
1594
+ }
1595
+ export const createNodesAction = (set, get, ops, options) => runWithSceneCommitNodeIds(ops.flatMap(({ node, parentId }) => {
1425
1596
  const effectiveParentId = parentId ?? node.parentId;
1426
1597
  return effectiveParentId ? [node.id, effectiveParentId] : [node.id];
1427
- }), () => createNodesActionImpl(validatedSet(set), get, ops));
1428
- export const applyNodeChangesAction = (set, get, changes) => runWithSceneCommitNodeIds([
1598
+ }), () => createNodesActionImpl(validatedSet(set), get, ops, options));
1599
+ export const applyNodeChangesAction = (set, get, changes, options) => runWithSceneCommitNodeIds([
1429
1600
  ...(changes.create ?? []).flatMap(({ node, parentId }) => {
1430
1601
  const effectiveParentId = parentId ?? node.parentId;
1431
1602
  return effectiveParentId ? [node.id, effectiveParentId] : [node.id];
1432
1603
  }),
1433
1604
  ...(changes.update ?? []).map(({ id }) => id),
1434
1605
  ...(changes.delete ?? []),
1435
- ], () => applyNodeChangesActionImpl(validatedSet(set), get, changes));
1436
- export const updateNodesAction = (set, get, updates) => runWithSceneCommitNodeIds(updates.map(({ id }) => id), () => updateNodesActionImpl(validatedSet(set), get, updates));
1437
- export const deleteNodesAction = (set, get, ids) => runWithSceneCommitNodeIds(ids, () => deleteNodesActionImpl(validatedSet(set), get, ids));
1606
+ ], () => applyNodeChangesActionImpl(validatedSet(set), get, changes, options));
1607
+ export const updateNodesAction = (set, get, updates, options) => runWithSceneCommitNodeIds(updates.map(({ id }) => id), () => updateNodesActionImpl(validatedSet(set), get, updates, options));
1608
+ export const deleteNodesAction = (set, get, ids, options) => runWithSceneCommitNodeIds(ids, () => deleteNodesActionImpl(validatedSet(set), get, ids, options));
1609
+ /**
1610
+ * The sanctioned conversion from derived construction to an authored surface:
1611
+ * the boundary editors' polygon edit, a 2D reshape, a manual move. Clears the
1612
+ * derived markers (and the zone link) in the same update that carries the
1613
+ * caller's own change, so the reconciler stops owning the surface from this
1614
+ * commit on.
1615
+ */
1616
+ export const detachDerivedNodeAction = (set, get, id, data) => {
1617
+ const node = get().nodes[id];
1618
+ if (!node)
1619
+ return;
1620
+ // An automatic ceiling draws its room's paint regions; once it is its own it
1621
+ // keeps them on itself.
1622
+ const zone = node.type === 'ceiling' && node.zoneId ? get().nodes[node.zoneId] : null;
1623
+ const keptRegions = node.type === 'ceiling' &&
1624
+ isDerivedNode(node) &&
1625
+ zone?.type === 'zone' &&
1626
+ zone.ceiling?.regions?.length &&
1627
+ !(data && 'regions' in data)
1628
+ ? { regions: zone.ceiling.regions }
1629
+ : {};
1630
+ // Spread through a plain record: merging two `Partial<AnyNode>` unions
1631
+ // explodes into a union TypeScript cannot represent.
1632
+ const patch = {
1633
+ ...data,
1634
+ ...keptRegions,
1635
+ ...(isDerivedNode(node) ? derivedDetachPatch(node) : {}),
1636
+ ...(node.type === 'slab' && isDerivedNode(node)
1637
+ ? { associatedZoneIds: node.zoneIds ?? [] }
1638
+ : {}),
1639
+ };
1640
+ if (Object.keys(patch).length === 0)
1641
+ return;
1642
+ const ownerUpdates = node.type === 'slab' && isDerivedNode(node)
1643
+ ? (node.zoneIds ?? []).flatMap((zoneId) => {
1644
+ const zone = get().nodes[zoneId];
1645
+ return zone?.type === 'zone'
1646
+ ? [{ id: zone.id, data: { floor: { ...zone.floor, sourceSlabId: node.id } } }]
1647
+ : [];
1648
+ })
1649
+ : [];
1650
+ runWithSceneCommitNodeIds([id, ...ownerUpdates.map(({ id }) => id)], () => updateNodesActionImpl(validatedSet(set), get, [{ id, data: patch }, ...ownerUpdates], {
1651
+ derivedWriter: DERIVED_WRITER_TOKEN,
1652
+ }));
1653
+ };
1654
+ /**
1655
+ * What the default gutter refresh of `roofIds` would touch, without running
1656
+ * it: the existing default gutters and downspouts it may keep or replace, and
1657
+ * the roof segments whose `children` it rewrites. For previews of edits that
1658
+ * trigger the refresh (a roof segment update, a delete).
1659
+ */
1660
+ export function previewDefaultGutterRefresh(nodes, roofIds) {
1661
+ const unsettledIds = new Set();
1662
+ const regeneratedHostIds = new Set();
1663
+ collectRefreshedDefaults(nodes, roofIds, unsettledIds, regeneratedHostIds);
1664
+ return { unsettledIds, regeneratedHostIds };
1665
+ }