@pascal-app/core 1.0.5 → 1.0.7

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 (940) hide show
  1. package/dist/agent-operations/__fixtures__/add-object-cases.d.ts +31 -0
  2. package/dist/agent-operations/__fixtures__/add-object-cases.d.ts.map +1 -1
  3. package/dist/agent-operations/__fixtures__/build-room-cases.d.ts.map +1 -1
  4. package/dist/agent-operations/__fixtures__/build-room-cases.js +27 -0
  5. package/dist/agent-operations/__fixtures__/cases.d.ts.map +1 -1
  6. package/dist/agent-operations/__fixtures__/cases.js +19 -11
  7. package/dist/agent-operations/__fixtures__/design-brief-cases.d.ts +25 -2
  8. package/dist/agent-operations/__fixtures__/design-brief-cases.d.ts.map +1 -1
  9. package/dist/agent-operations/__fixtures__/design-brief-cases.js +509 -66
  10. package/dist/agent-operations/__fixtures__/dressing-scenes.d.ts +30 -0
  11. package/dist/agent-operations/__fixtures__/dressing-scenes.d.ts.map +1 -0
  12. package/dist/agent-operations/__fixtures__/dressing-scenes.js +82 -0
  13. package/dist/agent-operations/__fixtures__/native-materials.d.ts +407 -9
  14. package/dist/agent-operations/__fixtures__/native-materials.d.ts.map +1 -1
  15. package/dist/agent-operations/__fixtures__/notation-cases.d.ts.map +1 -1
  16. package/dist/agent-operations/__fixtures__/notation-cases.js +14 -0
  17. package/dist/agent-operations/__fixtures__/roof-bearing-cases.d.ts +7253 -4053
  18. package/dist/agent-operations/__fixtures__/roof-bearing-cases.d.ts.map +1 -1
  19. package/dist/agent-operations/__fixtures__/room-cases.d.ts +1 -0
  20. package/dist/agent-operations/__fixtures__/room-cases.d.ts.map +1 -1
  21. package/dist/agent-operations/__fixtures__/room-cases.js +57 -1
  22. package/dist/agent-operations/__fixtures__/room-check-scenes.d.ts +51 -0
  23. package/dist/agent-operations/__fixtures__/room-check-scenes.d.ts.map +1 -0
  24. package/dist/agent-operations/__fixtures__/room-check-scenes.js +121 -0
  25. package/dist/agent-operations/__fixtures__/scene-check-cases.d.ts.map +1 -1
  26. package/dist/agent-operations/__fixtures__/scene-check-cases.js +152 -18
  27. package/dist/agent-operations/__fixtures__/search-assets-cases.d.ts.map +1 -1
  28. package/dist/agent-operations/__fixtures__/search-assets-cases.js +91 -0
  29. package/dist/agent-operations/__fixtures__/site-cases.d.ts +40 -1
  30. package/dist/agent-operations/__fixtures__/site-cases.d.ts.map +1 -1
  31. package/dist/agent-operations/__fixtures__/structure-cases.d.ts +3 -0
  32. package/dist/agent-operations/__fixtures__/structure-cases.d.ts.map +1 -1
  33. package/dist/agent-operations/__fixtures__/structure-cases.js +199 -18
  34. package/dist/agent-operations/__fixtures__/unit-cases.d.ts +6 -0
  35. package/dist/agent-operations/__fixtures__/unit-cases.d.ts.map +1 -0
  36. package/dist/agent-operations/__fixtures__/unit-cases.js +266 -0
  37. package/dist/agent-operations/__fixtures__/verify-scene-cases.d.ts +109 -73
  38. package/dist/agent-operations/__fixtures__/verify-scene-cases.d.ts.map +1 -1
  39. package/dist/agent-operations/add-column.d.ts.map +1 -1
  40. package/dist/agent-operations/add-column.js +32 -3
  41. package/dist/agent-operations/add-fence.d.ts.map +1 -1
  42. package/dist/agent-operations/add-fence.js +2 -1
  43. package/dist/agent-operations/add-level.d.ts.map +1 -1
  44. package/dist/agent-operations/add-level.js +4 -4
  45. package/dist/agent-operations/add-object.d.ts +32 -6
  46. package/dist/agent-operations/add-object.d.ts.map +1 -1
  47. package/dist/agent-operations/add-object.js +59 -12
  48. package/dist/agent-operations/add-wall.d.ts +3 -8
  49. package/dist/agent-operations/add-wall.d.ts.map +1 -1
  50. package/dist/agent-operations/add-wall.js +31 -8
  51. package/dist/agent-operations/apply-changes.d.ts.map +1 -1
  52. package/dist/agent-operations/apply-changes.js +2 -1
  53. package/dist/agent-operations/asset-catalog.d.ts +63 -0
  54. package/dist/agent-operations/asset-catalog.d.ts.map +1 -0
  55. package/dist/agent-operations/asset-catalog.js +182 -0
  56. package/dist/agent-operations/asset-views.d.ts +4 -2
  57. package/dist/agent-operations/asset-views.d.ts.map +1 -1
  58. package/dist/agent-operations/asset-views.js +1 -3
  59. package/dist/agent-operations/author-scene-checks.d.ts +38 -0
  60. package/dist/agent-operations/author-scene-checks.d.ts.map +1 -0
  61. package/dist/agent-operations/author-scene-checks.js +266 -0
  62. package/dist/agent-operations/author-scene.d.ts +54 -20
  63. package/dist/agent-operations/author-scene.d.ts.map +1 -1
  64. package/dist/agent-operations/author-scene.js +1164 -196
  65. package/dist/agent-operations/authored-scene-merge.d.ts.map +1 -1
  66. package/dist/agent-operations/authored-scene-merge.js +61 -3
  67. package/dist/agent-operations/batch.d.ts +1 -1
  68. package/dist/agent-operations/batch.d.ts.map +1 -1
  69. package/dist/agent-operations/batch.js +38 -39
  70. package/dist/agent-operations/ceiling-object-observations.d.ts.map +1 -1
  71. package/dist/agent-operations/ceiling-object-observations.js +5 -4
  72. package/dist/agent-operations/circulation-geometry.d.ts +14 -0
  73. package/dist/agent-operations/circulation-geometry.d.ts.map +1 -0
  74. package/dist/agent-operations/circulation-geometry.js +151 -0
  75. package/dist/agent-operations/circulation-graph.d.ts +72 -0
  76. package/dist/agent-operations/circulation-graph.d.ts.map +1 -0
  77. package/dist/agent-operations/circulation-graph.js +713 -0
  78. package/dist/agent-operations/circulation-non-spaces.d.ts +10 -0
  79. package/dist/agent-operations/circulation-non-spaces.d.ts.map +1 -0
  80. package/dist/agent-operations/circulation-non-spaces.js +88 -0
  81. package/dist/agent-operations/circulation-spaces.d.ts +5880 -0
  82. package/dist/agent-operations/circulation-spaces.d.ts.map +1 -0
  83. package/dist/agent-operations/circulation-spaces.js +368 -0
  84. package/dist/agent-operations/collections.d.ts.map +1 -1
  85. package/dist/agent-operations/collections.js +9 -7
  86. package/dist/agent-operations/corner-window.d.ts.map +1 -1
  87. package/dist/agent-operations/corner-window.js +2 -4
  88. package/dist/agent-operations/create-roof.d.ts.map +1 -1
  89. package/dist/agent-operations/create-roof.js +5 -7
  90. package/dist/agent-operations/create-room.d.ts +4 -1
  91. package/dist/agent-operations/create-room.d.ts.map +1 -1
  92. package/dist/agent-operations/create-room.js +7 -4
  93. package/dist/agent-operations/create-stair.js +2 -2
  94. package/dist/agent-operations/design-brief.d.ts +13 -7
  95. package/dist/agent-operations/design-brief.d.ts.map +1 -1
  96. package/dist/agent-operations/design-brief.js +172 -92
  97. package/dist/agent-operations/door-clearance.d.ts +68 -8
  98. package/dist/agent-operations/door-clearance.d.ts.map +1 -1
  99. package/dist/agent-operations/door-clearance.js +127 -20
  100. package/dist/agent-operations/dress-targets.d.ts +23 -0
  101. package/dist/agent-operations/dress-targets.d.ts.map +1 -0
  102. package/dist/agent-operations/dress-targets.js +34 -0
  103. package/dist/agent-operations/duplicate-node.d.ts +14 -0
  104. package/dist/agent-operations/duplicate-node.d.ts.map +1 -0
  105. package/dist/agent-operations/duplicate-node.js +173 -0
  106. package/dist/agent-operations/find-by-type.d.ts.map +1 -1
  107. package/dist/agent-operations/find-by-type.js +3 -0
  108. package/dist/agent-operations/furnish-room.d.ts +2 -0
  109. package/dist/agent-operations/furnish-room.d.ts.map +1 -1
  110. package/dist/agent-operations/furnish-room.js +15 -4
  111. package/dist/agent-operations/furniture-kind.d.ts +28 -1
  112. package/dist/agent-operations/furniture-kind.d.ts.map +1 -1
  113. package/dist/agent-operations/furniture-kind.js +105 -6
  114. package/dist/agent-operations/ground-reader.d.ts +10 -0
  115. package/dist/agent-operations/ground-reader.d.ts.map +1 -0
  116. package/dist/agent-operations/ground-reader.js +25 -0
  117. package/dist/agent-operations/index.d.ts +118 -12
  118. package/dist/agent-operations/index.d.ts.map +1 -1
  119. package/dist/agent-operations/index.js +26 -1
  120. package/dist/agent-operations/item-solids.d.ts +39 -0
  121. package/dist/agent-operations/item-solids.d.ts.map +1 -0
  122. package/dist/agent-operations/item-solids.js +128 -0
  123. package/dist/agent-operations/layout-clearance.d.ts +91 -11
  124. package/dist/agent-operations/layout-clearance.d.ts.map +1 -1
  125. package/dist/agent-operations/layout-clearance.js +280 -73
  126. package/dist/agent-operations/level-height-fill.d.ts.map +1 -1
  127. package/dist/agent-operations/level-height-fill.js +7 -1
  128. package/dist/agent-operations/level-reads.d.ts +5 -0
  129. package/dist/agent-operations/level-reads.d.ts.map +1 -1
  130. package/dist/agent-operations/level-reads.js +38 -2
  131. package/dist/agent-operations/list-levels.d.ts.map +1 -1
  132. package/dist/agent-operations/list-levels.js +2 -4
  133. package/dist/agent-operations/move-node.d.ts +12 -0
  134. package/dist/agent-operations/move-node.d.ts.map +1 -0
  135. package/dist/agent-operations/move-node.js +28 -0
  136. package/dist/agent-operations/move-plan.d.ts +28 -0
  137. package/dist/agent-operations/move-plan.d.ts.map +1 -0
  138. package/dist/agent-operations/move-plan.js +257 -0
  139. package/dist/agent-operations/node-patch.d.ts.map +1 -1
  140. package/dist/agent-operations/node-patch.js +15 -0
  141. package/dist/agent-operations/paint.d.ts +3 -1
  142. package/dist/agent-operations/paint.d.ts.map +1 -1
  143. package/dist/agent-operations/paint.js +14 -1
  144. package/dist/agent-operations/photo-elevation.d.ts.map +1 -1
  145. package/dist/agent-operations/photo-elevation.js +2 -1
  146. package/dist/agent-operations/place-in-room.d.ts.map +1 -1
  147. package/dist/agent-operations/place-in-room.js +1 -0
  148. package/dist/agent-operations/place-items.d.ts.map +1 -1
  149. package/dist/agent-operations/place-items.js +3 -4
  150. package/dist/agent-operations/plan-clearance.d.ts +28 -0
  151. package/dist/agent-operations/plan-clearance.d.ts.map +1 -0
  152. package/dist/agent-operations/plan-clearance.js +47 -0
  153. package/dist/agent-operations/plan-geometry.d.ts +2 -0
  154. package/dist/agent-operations/plan-geometry.d.ts.map +1 -1
  155. package/dist/agent-operations/plan-geometry.js +10 -0
  156. package/dist/agent-operations/project-files.d.ts +10 -0
  157. package/dist/agent-operations/project-files.d.ts.map +1 -1
  158. package/dist/agent-operations/reachability.d.ts +41 -0
  159. package/dist/agent-operations/reachability.d.ts.map +1 -0
  160. package/dist/agent-operations/reachability.js +199 -0
  161. package/dist/agent-operations/room-checks.d.ts +60 -0
  162. package/dist/agent-operations/room-checks.d.ts.map +1 -0
  163. package/dist/agent-operations/room-checks.js +226 -0
  164. package/dist/agent-operations/room-faces.d.ts +30 -0
  165. package/dist/agent-operations/room-faces.d.ts.map +1 -0
  166. package/dist/agent-operations/room-faces.js +31 -0
  167. package/dist/agent-operations/room-findings.d.ts +5 -2
  168. package/dist/agent-operations/room-findings.d.ts.map +1 -1
  169. package/dist/agent-operations/room-findings.js +30 -0
  170. package/dist/agent-operations/room-finishes.d.ts +87 -0
  171. package/dist/agent-operations/room-finishes.d.ts.map +1 -0
  172. package/dist/agent-operations/room-finishes.js +193 -0
  173. package/dist/agent-operations/room-floor-script.d.ts +3 -3
  174. package/dist/agent-operations/room-floor-script.js +3 -3
  175. package/dist/agent-operations/room-readings.d.ts +90 -0
  176. package/dist/agent-operations/room-readings.d.ts.map +1 -0
  177. package/dist/agent-operations/room-readings.js +369 -0
  178. package/dist/agent-operations/room-tile.d.ts +15 -0
  179. package/dist/agent-operations/room-tile.d.ts.map +1 -0
  180. package/dist/agent-operations/room-tile.js +30 -0
  181. package/dist/agent-operations/room-wet.d.ts +55 -0
  182. package/dist/agent-operations/room-wet.d.ts.map +1 -0
  183. package/dist/agent-operations/room-wet.js +203 -0
  184. package/dist/agent-operations/scene-check-policy.d.ts +5 -0
  185. package/dist/agent-operations/scene-check-policy.d.ts.map +1 -0
  186. package/dist/agent-operations/scene-check-policy.js +24 -0
  187. package/dist/agent-operations/scene-checkpoint.d.ts +10 -0
  188. package/dist/agent-operations/scene-checkpoint.d.ts.map +1 -1
  189. package/dist/agent-operations/scene-checkpoint.js +31 -0
  190. package/dist/agent-operations/scene-issue-groups.d.ts +17 -0
  191. package/dist/agent-operations/scene-issue-groups.d.ts.map +1 -0
  192. package/dist/agent-operations/scene-issue-groups.js +71 -0
  193. package/dist/agent-operations/scene-materials.d.ts +23 -0
  194. package/dist/agent-operations/scene-materials.d.ts.map +1 -1
  195. package/dist/agent-operations/scene-materials.js +41 -0
  196. package/dist/agent-operations/scene-queries.d.ts +1667 -866
  197. package/dist/agent-operations/scene-queries.d.ts.map +1 -1
  198. package/dist/agent-operations/scene-queries.js +3 -3
  199. package/dist/agent-operations/scene-review.d.ts.map +1 -1
  200. package/dist/agent-operations/scene-review.js +3 -2
  201. package/dist/agent-operations/scene-view.d.ts.map +1 -1
  202. package/dist/agent-operations/scene-view.js +91 -21
  203. package/dist/agent-operations/search-assets.d.ts +10 -6
  204. package/dist/agent-operations/search-assets.d.ts.map +1 -1
  205. package/dist/agent-operations/search-assets.js +37 -22
  206. package/dist/agent-operations/set-checkpoint.d.ts.map +1 -1
  207. package/dist/agent-operations/set-checkpoint.js +1 -0
  208. package/dist/agent-operations/set-ground-level.d.ts +1 -1
  209. package/dist/agent-operations/set-ground-level.d.ts.map +1 -1
  210. package/dist/agent-operations/set-ground-level.js +3 -14
  211. package/dist/agent-operations/site.js +3 -2
  212. package/dist/agent-operations/slab-surface-script.d.ts +25 -0
  213. package/dist/agent-operations/slab-surface-script.d.ts.map +1 -0
  214. package/dist/agent-operations/slab-surface-script.js +60 -0
  215. package/dist/agent-operations/stair-plan-footprint.d.ts +9 -0
  216. package/dist/agent-operations/stair-plan-footprint.d.ts.map +1 -0
  217. package/dist/agent-operations/stair-plan-footprint.js +50 -0
  218. package/dist/agent-operations/types.d.ts +10 -5
  219. package/dist/agent-operations/types.d.ts.map +1 -1
  220. package/dist/agent-operations/units.d.ts +26 -0
  221. package/dist/agent-operations/units.d.ts.map +1 -0
  222. package/dist/agent-operations/units.js +110 -0
  223. package/dist/agent-operations/unreachable-rooms-check.d.ts +17 -0
  224. package/dist/agent-operations/unreachable-rooms-check.d.ts.map +1 -0
  225. package/dist/agent-operations/unreachable-rooms-check.js +35 -0
  226. package/dist/agent-operations/usage-checks.d.ts +2 -0
  227. package/dist/agent-operations/usage-checks.d.ts.map +1 -0
  228. package/dist/agent-operations/usage-checks.js +12 -0
  229. package/dist/agent-operations/verify-scene.d.ts +8 -11
  230. package/dist/agent-operations/verify-scene.d.ts.map +1 -1
  231. package/dist/agent-operations/verify-scene.js +55 -11
  232. package/dist/agent-operations/wall-face-defaults.d.ts +44 -0
  233. package/dist/agent-operations/wall-face-defaults.d.ts.map +1 -0
  234. package/dist/agent-operations/wall-face-defaults.js +229 -0
  235. package/dist/agent-operations/wall-joins.d.ts +119 -0
  236. package/dist/agent-operations/wall-joins.d.ts.map +1 -0
  237. package/dist/agent-operations/wall-joins.js +308 -0
  238. package/dist/agent-operations/wall-object-observations.d.ts.map +1 -1
  239. package/dist/agent-operations/wall-object-observations.js +4 -6
  240. package/dist/agent-operations/wall-skirting.d.ts.map +1 -1
  241. package/dist/agent-operations/wall-skirting.js +2 -0
  242. package/dist/agent-operations/wall-type.d.ts +49 -0
  243. package/dist/agent-operations/wall-type.d.ts.map +1 -0
  244. package/dist/agent-operations/wall-type.js +31 -0
  245. package/dist/agent-operations/zone-coverage.d.ts +85 -0
  246. package/dist/agent-operations/zone-coverage.d.ts.map +1 -0
  247. package/dist/agent-operations/zone-coverage.js +208 -0
  248. package/dist/agent-tools/add-object.d.ts +31 -0
  249. package/dist/agent-tools/add-object.d.ts.map +1 -1
  250. package/dist/agent-tools/add-object.js +44 -7
  251. package/dist/agent-tools/assets.d.ts +4 -0
  252. package/dist/agent-tools/assets.d.ts.map +1 -1
  253. package/dist/agent-tools/assets.js +11 -1
  254. package/dist/agent-tools/author-scene.d.ts +810 -15
  255. package/dist/agent-tools/author-scene.d.ts.map +1 -1
  256. package/dist/agent-tools/author-scene.js +275 -34
  257. package/dist/agent-tools/batch.d.ts +1 -1
  258. package/dist/agent-tools/batch.d.ts.map +1 -1
  259. package/dist/agent-tools/batch.js +5 -1
  260. package/dist/agent-tools/checkpoints.js +1 -1
  261. package/dist/agent-tools/columns.d.ts +14 -0
  262. package/dist/agent-tools/columns.d.ts.map +1 -1
  263. package/dist/agent-tools/columns.js +14 -2
  264. package/dist/agent-tools/contract.d.ts +10 -0
  265. package/dist/agent-tools/contract.d.ts.map +1 -1
  266. package/dist/agent-tools/contract.js +5 -1
  267. package/dist/agent-tools/corner-window.d.ts +1 -0
  268. package/dist/agent-tools/corner-window.d.ts.map +1 -1
  269. package/dist/agent-tools/corner-window.js +1 -1
  270. package/dist/agent-tools/create-room.d.ts +85 -0
  271. package/dist/agent-tools/create-room.d.ts.map +1 -1
  272. package/dist/agent-tools/create-room.js +8 -1
  273. package/dist/agent-tools/design-brief.d.ts +513 -7
  274. package/dist/agent-tools/design-brief.d.ts.map +1 -1
  275. package/dist/agent-tools/design-brief.js +192 -14
  276. package/dist/agent-tools/designs.js +1 -1
  277. package/dist/agent-tools/find-by-type.js +1 -1
  278. package/dist/agent-tools/index.d.ts +658 -10
  279. package/dist/agent-tools/index.d.ts.map +1 -1
  280. package/dist/agent-tools/index.js +9 -1
  281. package/dist/agent-tools/levels.js +4 -4
  282. package/dist/agent-tools/move-duplicate.d.ts +65 -0
  283. package/dist/agent-tools/move-duplicate.d.ts.map +1 -0
  284. package/dist/agent-tools/move-duplicate.js +68 -0
  285. package/dist/agent-tools/paint.d.ts +6 -0
  286. package/dist/agent-tools/paint.d.ts.map +1 -1
  287. package/dist/agent-tools/paint.js +7 -3
  288. package/dist/agent-tools/photo-elevation.js +1 -1
  289. package/dist/agent-tools/project-files.d.ts +2 -2
  290. package/dist/agent-tools/project-files.d.ts.map +1 -1
  291. package/dist/agent-tools/project-files.js +1 -1
  292. package/dist/agent-tools/refusal.d.ts +9 -1
  293. package/dist/agent-tools/refusal.d.ts.map +1 -1
  294. package/dist/agent-tools/refusal.js +5 -1
  295. package/dist/agent-tools/roofs.js +1 -1
  296. package/dist/agent-tools/room-structure.d.ts +60 -0
  297. package/dist/agent-tools/room-structure.d.ts.map +1 -1
  298. package/dist/agent-tools/room-structure.js +20 -1
  299. package/dist/agent-tools/search-materials.d.ts +1 -0
  300. package/dist/agent-tools/search-materials.d.ts.map +1 -1
  301. package/dist/agent-tools/site.js +1 -1
  302. package/dist/agent-tools/stairs.js +1 -1
  303. package/dist/agent-tools/units.d.ts +84 -0
  304. package/dist/agent-tools/units.d.ts.map +1 -0
  305. package/dist/agent-tools/units.js +54 -0
  306. package/dist/agent-tools/verify-scene-usage.d.ts +44 -0
  307. package/dist/agent-tools/verify-scene-usage.d.ts.map +1 -0
  308. package/dist/agent-tools/verify-scene-usage.js +146 -0
  309. package/dist/agent-tools/verify-scene.d.ts +12 -1
  310. package/dist/agent-tools/verify-scene.d.ts.map +1 -1
  311. package/dist/agent-tools/verify-scene.js +183 -3
  312. package/dist/agent-tools/view-scene.d.ts +3 -0
  313. package/dist/agent-tools/view-scene.d.ts.map +1 -1
  314. package/dist/agent-tools/view-scene.js +4 -1
  315. package/dist/agent-tools/wall-openings.d.ts +121 -2
  316. package/dist/agent-tools/wall-openings.d.ts.map +1 -1
  317. package/dist/agent-tools/wall-openings.js +123 -18
  318. package/dist/agent-tools/walls.d.ts +30 -0
  319. package/dist/agent-tools/walls.d.ts.map +1 -1
  320. package/dist/agent-tools/walls.js +54 -2
  321. package/dist/building/__fixtures__/wall-opening-cases.d.ts +340 -195
  322. package/dist/building/__fixtures__/wall-opening-cases.d.ts.map +1 -1
  323. package/dist/building/__fixtures__/wall-opening-cases.js +13 -0
  324. package/dist/building/code-profile.d.ts +231 -0
  325. package/dist/building/code-profile.d.ts.map +1 -0
  326. package/dist/building/code-profile.js +208 -0
  327. package/dist/building/corner-window.d.ts +2 -2
  328. package/dist/building/corner-window.d.ts.map +1 -1
  329. package/dist/building/corner-window.js +11 -2
  330. package/dist/building/door-types.d.ts +1 -0
  331. package/dist/building/door-types.d.ts.map +1 -1
  332. package/dist/building/door-types.js +2 -0
  333. package/dist/building/floor-item-fit.d.ts.map +1 -1
  334. package/dist/building/floor-item-fit.js +2 -4
  335. package/dist/building/ground-level.d.ts +1 -3
  336. package/dist/building/ground-level.d.ts.map +1 -1
  337. package/dist/building/ground-level.js +3 -5
  338. package/dist/building/index.d.ts +2 -0
  339. package/dist/building/index.d.ts.map +1 -1
  340. package/dist/building/index.js +2 -0
  341. package/dist/building/level-duplication.d.ts +5951 -4351
  342. package/dist/building/level-duplication.d.ts.map +1 -1
  343. package/dist/building/level-insertion.d.ts +1 -1
  344. package/dist/building/level-wall-copy.d.ts +24 -0
  345. package/dist/building/level-wall-copy.d.ts.map +1 -0
  346. package/dist/building/level-wall-copy.js +53 -0
  347. package/dist/building/merge-windows.d.ts.map +1 -1
  348. package/dist/building/merge-windows.js +1 -0
  349. package/dist/building/opening-style-presets.d.ts +2 -0
  350. package/dist/building/opening-style-presets.d.ts.map +1 -1
  351. package/dist/building/opening-style-presets.js +26 -5
  352. package/dist/building/room-use.d.ts +26 -0
  353. package/dist/building/room-use.d.ts.map +1 -0
  354. package/dist/building/room-use.js +102 -0
  355. package/dist/building/wall-openings.d.ts +115 -7
  356. package/dist/building/wall-openings.d.ts.map +1 -1
  357. package/dist/building/wall-openings.js +121 -29
  358. package/dist/building/window-types.d.ts +1 -0
  359. package/dist/building/window-types.d.ts.map +1 -1
  360. package/dist/building/window-types.js +3 -0
  361. package/dist/coherence/__fixtures__/enclosure-scenes.d.ts +84 -0
  362. package/dist/coherence/__fixtures__/enclosure-scenes.d.ts.map +1 -0
  363. package/dist/coherence/__fixtures__/enclosure-scenes.js +44 -0
  364. package/dist/commands/structure/attached-walls.d.ts +16 -0
  365. package/dist/commands/structure/attached-walls.d.ts.map +1 -0
  366. package/dist/commands/structure/attached-walls.js +53 -0
  367. package/dist/commands/structure/index.d.ts +3 -0
  368. package/dist/commands/structure/index.d.ts.map +1 -1
  369. package/dist/commands/structure/index.js +3 -0
  370. package/dist/commands/structure/move-separators.d.ts +62 -0
  371. package/dist/commands/structure/move-separators.d.ts.map +1 -0
  372. package/dist/commands/structure/move-separators.js +346 -0
  373. package/dist/commands/structure/set-floor-foundation.d.ts +5 -0
  374. package/dist/commands/structure/set-floor-foundation.d.ts.map +1 -1
  375. package/dist/commands/structure/set-wall-geometry.d.ts.map +1 -1
  376. package/dist/commands/structure/set-wall-geometry.js +44 -11
  377. package/dist/commands/structure/set-zone-intent.d.ts +26 -0
  378. package/dist/commands/structure/set-zone-intent.d.ts.map +1 -1
  379. package/dist/commands/structure/set-zone-intent.js +107 -2
  380. package/dist/commands/structure/shared.d.ts +888 -88
  381. package/dist/commands/structure/shared.d.ts.map +1 -1
  382. package/dist/commands/structure/wall-overlap.d.ts +45 -0
  383. package/dist/commands/structure/wall-overlap.d.ts.map +1 -0
  384. package/dist/commands/structure/wall-overlap.js +289 -0
  385. package/dist/commands/structure/zone-wall-merge.d.ts +3326 -2370
  386. package/dist/commands/structure/zone-wall-merge.d.ts.map +1 -1
  387. package/dist/contracts/reference-discovery.d.ts +2 -2
  388. package/dist/contracts/reference-discovery.d.ts.map +1 -1
  389. package/dist/contracts/reference-discovery.js +5 -3
  390. package/dist/contracts/reference-inventory.d.ts.map +1 -1
  391. package/dist/contracts/reference-inventory.js +75 -24
  392. package/dist/events/bus.d.ts +15 -2
  393. package/dist/events/bus.d.ts.map +1 -1
  394. package/dist/hooks/spatial-grid/built-in-floor-placed.d.ts +40 -0
  395. package/dist/hooks/spatial-grid/built-in-floor-placed.d.ts.map +1 -0
  396. package/dist/hooks/spatial-grid/built-in-floor-placed.js +220 -0
  397. package/dist/hooks/spatial-grid/floor-placed-elevation.d.ts.map +1 -1
  398. package/dist/hooks/spatial-grid/floor-placed-elevation.js +13 -7
  399. package/dist/hooks/spatial-grid/spatial-grid-manager.d.ts +56 -1
  400. package/dist/hooks/spatial-grid/spatial-grid-manager.d.ts.map +1 -1
  401. package/dist/hooks/spatial-grid/spatial-grid-manager.js +177 -27
  402. package/dist/hooks/spatial-grid/spatial-grid-sync.d.ts +1631 -831
  403. package/dist/hooks/spatial-grid/spatial-grid-sync.d.ts.map +1 -1
  404. package/dist/hooks/spatial-grid/spatial-grid-sync.js +24 -1
  405. package/dist/hooks/spatial-grid/support-host-patch.js +10 -10
  406. package/dist/i18n/format.d.ts +41 -0
  407. package/dist/i18n/format.d.ts.map +1 -0
  408. package/dist/i18n/format.js +124 -0
  409. package/dist/i18n/index.d.ts +5 -0
  410. package/dist/i18n/index.d.ts.map +1 -0
  411. package/dist/i18n/index.js +3 -0
  412. package/dist/i18n/registry.d.ts +78 -0
  413. package/dist/i18n/registry.d.ts.map +1 -0
  414. package/dist/i18n/registry.js +252 -0
  415. package/dist/i18n/use-translate.d.ts +16 -0
  416. package/dist/i18n/use-translate.d.ts.map +1 -0
  417. package/dist/i18n/use-translate.js +23 -0
  418. package/dist/index.d.ts +32 -16
  419. package/dist/index.d.ts.map +1 -1
  420. package/dist/index.js +31 -15
  421. package/dist/lib/__fixtures__/mezzanine.d.ts +6840 -4169
  422. package/dist/lib/__fixtures__/mezzanine.d.ts.map +1 -1
  423. package/dist/lib/absorb-wall-separators.d.ts +2128 -1328
  424. package/dist/lib/absorb-wall-separators.d.ts.map +1 -1
  425. package/dist/lib/beam.d.ts +137 -0
  426. package/dist/lib/beam.d.ts.map +1 -0
  427. package/dist/lib/beam.js +297 -0
  428. package/dist/lib/below-grade-footprints.d.ts +13 -5
  429. package/dist/lib/below-grade-footprints.d.ts.map +1 -1
  430. package/dist/lib/below-grade-footprints.js +53 -10
  431. package/dist/lib/build-up.d.ts +89 -0
  432. package/dist/lib/build-up.d.ts.map +1 -0
  433. package/dist/lib/build-up.js +216 -0
  434. package/dist/lib/corner-pair.d.ts +205 -4
  435. package/dist/lib/corner-pair.d.ts.map +1 -1
  436. package/dist/lib/deck-boards.d.ts +80 -0
  437. package/dist/lib/deck-boards.d.ts.map +1 -0
  438. package/dist/lib/deck-boards.js +184 -0
  439. package/dist/lib/deck-framing.d.ts +150 -0
  440. package/dist/lib/deck-framing.d.ts.map +1 -0
  441. package/dist/lib/deck-framing.js +515 -0
  442. package/dist/lib/deepest-drawn.d.ts +3 -6
  443. package/dist/lib/deepest-drawn.d.ts.map +1 -1
  444. package/dist/lib/deepest-drawn.js +4 -8
  445. package/dist/lib/door-opening.d.ts +19 -0
  446. package/dist/lib/door-opening.d.ts.map +1 -0
  447. package/dist/lib/door-opening.js +27 -0
  448. package/dist/lib/door-operation.d.ts +2 -0
  449. package/dist/lib/door-operation.d.ts.map +1 -1
  450. package/dist/lib/door-operation.js +4 -0
  451. package/dist/lib/exterior-wall-loops.d.ts.map +1 -1
  452. package/dist/lib/exterior-wall-loops.js +2 -1
  453. package/dist/lib/finish-script.d.ts +5 -5
  454. package/dist/lib/finish-script.d.ts.map +1 -1
  455. package/dist/lib/finish-script.js +12 -5
  456. package/dist/lib/floor-footprint-name.d.ts +17 -0
  457. package/dist/lib/floor-footprint-name.d.ts.map +1 -1
  458. package/dist/lib/floor-footprint-name.js +17 -4
  459. package/dist/lib/floor-intent-changes.d.ts.map +1 -1
  460. package/dist/lib/floor-intent-changes.js +60 -35
  461. package/dist/lib/floor-opening-footprints.d.ts +1 -1
  462. package/dist/lib/floor-opening-footprints.d.ts.map +1 -1
  463. package/dist/lib/floor-opening-footprints.js +10 -4
  464. package/dist/lib/floor-plate-paint.d.ts +2 -0
  465. package/dist/lib/floor-plate-paint.d.ts.map +1 -1
  466. package/dist/lib/floor-plate-paint.js +12 -0
  467. package/dist/lib/floor-plates.d.ts +250 -0
  468. package/dist/lib/floor-plates.d.ts.map +1 -1
  469. package/dist/lib/floor-plates.js +43 -4
  470. package/dist/lib/floor-script.d.ts +35 -6
  471. package/dist/lib/floor-script.d.ts.map +1 -1
  472. package/dist/lib/floor-script.js +96 -16
  473. package/dist/lib/foundation-construction.d.ts +4 -13
  474. package/dist/lib/foundation-construction.d.ts.map +1 -1
  475. package/dist/lib/foundation-construction.js +4 -14
  476. package/dist/lib/foundation-standard.d.ts +2 -3
  477. package/dist/lib/foundation-standard.d.ts.map +1 -1
  478. package/dist/lib/foundation-standard.js +2 -3
  479. package/dist/lib/foundation-wall.d.ts +1 -2
  480. package/dist/lib/foundation-wall.d.ts.map +1 -1
  481. package/dist/lib/foundation-wall.js +1 -2
  482. package/dist/lib/framing-post.d.ts +91 -0
  483. package/dist/lib/framing-post.d.ts.map +1 -0
  484. package/dist/lib/framing-post.js +174 -0
  485. package/dist/lib/geometry-script-node.d.ts +11 -0
  486. package/dist/lib/geometry-script-node.d.ts.map +1 -1
  487. package/dist/lib/geometry-script-node.js +35 -0
  488. package/dist/lib/grade-standing.d.ts +16 -2
  489. package/dist/lib/grade-standing.d.ts.map +1 -1
  490. package/dist/lib/grade-standing.js +129 -9
  491. package/dist/lib/ground-seat.d.ts +2 -22
  492. package/dist/lib/ground-seat.d.ts.map +1 -1
  493. package/dist/lib/ground-seat.js +2 -17
  494. package/dist/lib/ground-window.d.ts +2 -1
  495. package/dist/lib/ground-window.d.ts.map +1 -1
  496. package/dist/lib/ground-window.js +5 -2
  497. package/dist/lib/level-footprints.d.ts +2 -0
  498. package/dist/lib/level-footprints.d.ts.map +1 -1
  499. package/dist/lib/level-footprints.js +7 -0
  500. package/dist/lib/opening-casing.d.ts +67 -0
  501. package/dist/lib/opening-casing.d.ts.map +1 -0
  502. package/dist/lib/opening-casing.js +131 -0
  503. package/dist/lib/opening-exterior-face.d.ts +6 -0
  504. package/dist/lib/opening-exterior-face.d.ts.map +1 -0
  505. package/dist/lib/opening-exterior-face.js +15 -0
  506. package/dist/lib/opening-floor-datum.d.ts +11 -5
  507. package/dist/lib/opening-floor-datum.d.ts.map +1 -1
  508. package/dist/lib/opening-floor-datum.js +38 -6
  509. package/dist/lib/opening-frame-depth.d.ts +18 -0
  510. package/dist/lib/opening-frame-depth.d.ts.map +1 -0
  511. package/dist/lib/opening-frame-depth.js +22 -0
  512. package/dist/lib/outdoor-room.d.ts +32 -0
  513. package/dist/lib/outdoor-room.d.ts.map +1 -0
  514. package/dist/lib/outdoor-room.js +66 -0
  515. package/dist/lib/plate-surface.d.ts +8 -0
  516. package/dist/lib/plate-surface.d.ts.map +1 -1
  517. package/dist/lib/plate-surface.js +53 -3
  518. package/dist/lib/porch-framing-sync.d.ts +46 -0
  519. package/dist/lib/porch-framing-sync.d.ts.map +1 -0
  520. package/dist/lib/porch-framing-sync.js +206 -0
  521. package/dist/lib/porch-framing.d.ts +44 -0
  522. package/dist/lib/porch-framing.d.ts.map +1 -0
  523. package/dist/lib/porch-framing.js +159 -0
  524. package/dist/lib/railing-rooms.d.ts +13 -0
  525. package/dist/lib/railing-rooms.d.ts.map +1 -0
  526. package/dist/lib/railing-rooms.js +37 -0
  527. package/dist/lib/roof-eave.d.ts +135 -0
  528. package/dist/lib/roof-eave.d.ts.map +1 -0
  529. package/dist/lib/roof-eave.js +186 -0
  530. package/dist/lib/room-floor-plate.d.ts +3 -1
  531. package/dist/lib/room-floor-plate.d.ts.map +1 -1
  532. package/dist/lib/room-floor-plate.js +7 -0
  533. package/dist/lib/space-detection.d.ts +13 -0
  534. package/dist/lib/space-detection.d.ts.map +1 -1
  535. package/dist/lib/space-detection.js +112 -24
  536. package/dist/lib/structure-kernel.d.ts +22 -9
  537. package/dist/lib/structure-kernel.d.ts.map +1 -1
  538. package/dist/lib/structure-kernel.js +146 -28
  539. package/dist/lib/structure-reconcile.d.ts +1 -1
  540. package/dist/lib/structure-reconcile.d.ts.map +1 -1
  541. package/dist/lib/structure-reconcile.js +7 -4
  542. package/dist/lib/surface-intent.d.ts +10 -0
  543. package/dist/lib/surface-intent.d.ts.map +1 -0
  544. package/dist/lib/surface-intent.js +18 -0
  545. package/dist/lib/terrain-source.d.ts.map +1 -1
  546. package/dist/lib/terrain-source.js +2 -1
  547. package/dist/lib/wall-face-script.d.ts.map +1 -1
  548. package/dist/lib/wall-face-script.js +5 -2
  549. package/dist/material-kinds.d.ts +1 -1
  550. package/dist/material-kinds.d.ts.map +1 -1
  551. package/dist/material-kinds.js +1 -0
  552. package/dist/material-library.d.ts +15 -0
  553. package/dist/material-library.d.ts.map +1 -1
  554. package/dist/material-library.js +458 -59
  555. package/dist/node-slots/door.d.ts +3 -4
  556. package/dist/node-slots/door.d.ts.map +1 -1
  557. package/dist/node-slots/door.js +4 -3
  558. package/dist/node-slots/wall.d.ts.map +1 -1
  559. package/dist/node-slots/wall.js +21 -3
  560. package/dist/node-slots/window.d.ts +2 -2
  561. package/dist/node-slots/window.d.ts.map +1 -1
  562. package/dist/node-slots/window.js +6 -1
  563. package/dist/procedural-items/design.d.ts +8 -0
  564. package/dist/procedural-items/design.d.ts.map +1 -1
  565. package/dist/procedural-items/design.js +169 -21
  566. package/dist/procedural-items/motion-controller.d.ts +2 -0
  567. package/dist/procedural-items/motion-controller.d.ts.map +1 -1
  568. package/dist/procedural-items/motion-controller.js +2 -1
  569. package/dist/registry/index.d.ts +2 -2
  570. package/dist/registry/index.d.ts.map +1 -1
  571. package/dist/registry/index.js +1 -1
  572. package/dist/registry/mechanism.d.ts +4 -1
  573. package/dist/registry/mechanism.d.ts.map +1 -1
  574. package/dist/registry/mechanism.js +10 -0
  575. package/dist/registry/types.d.ts +65 -23
  576. package/dist/registry/types.d.ts.map +1 -1
  577. package/dist/runtime/__fixtures__/live-scene.d.ts +14 -0
  578. package/dist/runtime/__fixtures__/live-scene.d.ts.map +1 -0
  579. package/dist/runtime/__fixtures__/live-scene.js +64 -0
  580. package/dist/runtime/apply.d.ts +42 -0
  581. package/dist/runtime/apply.d.ts.map +1 -0
  582. package/dist/runtime/apply.js +274 -0
  583. package/dist/runtime/dependencies.d.ts +97 -0
  584. package/dist/runtime/dependencies.d.ts.map +1 -0
  585. package/dist/runtime/dependencies.js +42 -0
  586. package/dist/runtime/ids.d.ts +11 -0
  587. package/dist/runtime/ids.d.ts.map +1 -0
  588. package/dist/runtime/ids.js +80 -0
  589. package/dist/runtime/index.d.ts +14 -0
  590. package/dist/runtime/index.d.ts.map +1 -0
  591. package/dist/runtime/index.js +11 -0
  592. package/dist/runtime/node-queries.d.ts +16 -0
  593. package/dist/runtime/node-queries.d.ts.map +1 -0
  594. package/dist/runtime/node-queries.js +30 -0
  595. package/dist/runtime/patch.d.ts +26 -0
  596. package/dist/runtime/patch.d.ts.map +1 -0
  597. package/dist/runtime/patch.js +165 -0
  598. package/dist/runtime/reader.d.ts +104 -0
  599. package/dist/runtime/reader.d.ts.map +1 -0
  600. package/dist/runtime/reader.js +455 -0
  601. package/dist/runtime/scene-runtime.d.ts +112 -0
  602. package/dist/runtime/scene-runtime.d.ts.map +1 -0
  603. package/dist/runtime/scene-runtime.js +302 -0
  604. package/dist/schema/__fixtures__/node-fixtures.d.ts.map +1 -1
  605. package/dist/schema/__fixtures__/node-fixtures.js +1 -0
  606. package/dist/schema/assembly.d.ts +3 -0
  607. package/dist/schema/assembly.d.ts.map +1 -1
  608. package/dist/schema/assembly.js +13 -0
  609. package/dist/schema/asset-url.d.ts +37 -2
  610. package/dist/schema/asset-url.d.ts.map +1 -1
  611. package/dist/schema/asset-url.js +80 -11
  612. package/dist/schema/base.d.ts +8 -0
  613. package/dist/schema/base.d.ts.map +1 -1
  614. package/dist/schema/base.js +19 -1
  615. package/dist/schema/build-up.d.ts +247 -0
  616. package/dist/schema/build-up.d.ts.map +1 -0
  617. package/dist/schema/build-up.js +83 -0
  618. package/dist/schema/geometry-source.d.ts +80 -0
  619. package/dist/schema/geometry-source.d.ts.map +1 -1
  620. package/dist/schema/geometry-source.js +38 -0
  621. package/dist/schema/index.d.ts +12 -7
  622. package/dist/schema/index.d.ts.map +1 -1
  623. package/dist/schema/index.js +12 -6
  624. package/dist/schema/material.d.ts +5 -0
  625. package/dist/schema/material.d.ts.map +1 -1
  626. package/dist/schema/material.js +6 -0
  627. package/dist/schema/nodes/beam.d.ts +264 -0
  628. package/dist/schema/nodes/beam.d.ts.map +1 -0
  629. package/dist/schema/nodes/beam.js +139 -0
  630. package/dist/schema/nodes/box-vent.d.ts +5 -0
  631. package/dist/schema/nodes/box-vent.d.ts.map +1 -1
  632. package/dist/schema/nodes/cabinet.d.ts +10 -0
  633. package/dist/schema/nodes/cabinet.d.ts.map +1 -1
  634. package/dist/schema/nodes/ceiling.d.ts +48 -0
  635. package/dist/schema/nodes/ceiling.d.ts.map +1 -1
  636. package/dist/schema/nodes/ceiling.js +5 -0
  637. package/dist/schema/nodes/chimney.d.ts +10 -0
  638. package/dist/schema/nodes/chimney.d.ts.map +1 -1
  639. package/dist/schema/nodes/column.d.ts +42 -0
  640. package/dist/schema/nodes/column.d.ts.map +1 -1
  641. package/dist/schema/nodes/column.js +11 -1
  642. package/dist/schema/nodes/cupola.d.ts +5 -0
  643. package/dist/schema/nodes/cupola.d.ts.map +1 -1
  644. package/dist/schema/nodes/door.d.ts +54 -3
  645. package/dist/schema/nodes/door.d.ts.map +1 -1
  646. package/dist/schema/nodes/door.js +41 -7
  647. package/dist/schema/nodes/dormer.d.ts +20 -0
  648. package/dist/schema/nodes/dormer.d.ts.map +1 -1
  649. package/dist/schema/nodes/downspout.d.ts +5 -0
  650. package/dist/schema/nodes/downspout.d.ts.map +1 -1
  651. package/dist/schema/nodes/elevator.d.ts +5 -0
  652. package/dist/schema/nodes/elevator.d.ts.map +1 -1
  653. package/dist/schema/nodes/eyebrow-vent.d.ts +5 -0
  654. package/dist/schema/nodes/eyebrow-vent.d.ts.map +1 -1
  655. package/dist/schema/nodes/fence.d.ts +5 -0
  656. package/dist/schema/nodes/fence.d.ts.map +1 -1
  657. package/dist/schema/nodes/guide.d.ts +14 -0
  658. package/dist/schema/nodes/guide.d.ts.map +1 -1
  659. package/dist/schema/nodes/guide.js +2 -0
  660. package/dist/schema/nodes/gutter.d.ts +5 -0
  661. package/dist/schema/nodes/gutter.d.ts.map +1 -1
  662. package/dist/schema/nodes/item.d.ts +71 -0
  663. package/dist/schema/nodes/item.d.ts.map +1 -1
  664. package/dist/schema/nodes/item.js +5 -1
  665. package/dist/schema/nodes/level.d.ts +1 -1
  666. package/dist/schema/nodes/level.d.ts.map +1 -1
  667. package/dist/schema/nodes/opening-types.d.ts +13 -0
  668. package/dist/schema/nodes/opening-types.d.ts.map +1 -1
  669. package/dist/schema/nodes/opening-types.js +8 -1
  670. package/dist/schema/nodes/railing-wall.d.ts +112 -0
  671. package/dist/schema/nodes/railing-wall.d.ts.map +1 -0
  672. package/dist/schema/nodes/railing-wall.js +160 -0
  673. package/dist/schema/nodes/ridge-vent.d.ts +5 -0
  674. package/dist/schema/nodes/ridge-vent.d.ts.map +1 -1
  675. package/dist/schema/nodes/roof-segment.d.ts +224 -1
  676. package/dist/schema/nodes/roof-segment.d.ts.map +1 -1
  677. package/dist/schema/nodes/roof-segment.js +57 -10
  678. package/dist/schema/nodes/roof-types.d.ts +11 -0
  679. package/dist/schema/nodes/roof-types.d.ts.map +1 -1
  680. package/dist/schema/nodes/roof-types.js +6 -0
  681. package/dist/schema/nodes/roof.d.ts +60 -0
  682. package/dist/schema/nodes/roof.d.ts.map +1 -1
  683. package/dist/schema/nodes/roof.js +4 -0
  684. package/dist/schema/nodes/shelf.d.ts +5 -0
  685. package/dist/schema/nodes/shelf.d.ts.map +1 -1
  686. package/dist/schema/nodes/site.d.ts +80 -0
  687. package/dist/schema/nodes/site.d.ts.map +1 -1
  688. package/dist/schema/nodes/site.js +7 -0
  689. package/dist/schema/nodes/skylight.d.ts +10 -0
  690. package/dist/schema/nodes/skylight.d.ts.map +1 -1
  691. package/dist/schema/nodes/slab.d.ts +137 -0
  692. package/dist/schema/nodes/slab.d.ts.map +1 -1
  693. package/dist/schema/nodes/slab.js +3 -0
  694. package/dist/schema/nodes/solar-panel.d.ts +10 -0
  695. package/dist/schema/nodes/solar-panel.d.ts.map +1 -1
  696. package/dist/schema/nodes/stair-segment.d.ts +5 -0
  697. package/dist/schema/nodes/stair-segment.d.ts.map +1 -1
  698. package/dist/schema/nodes/stair-structure.d.ts +69 -0
  699. package/dist/schema/nodes/stair-structure.d.ts.map +1 -0
  700. package/dist/schema/nodes/stair-structure.js +39 -0
  701. package/dist/schema/nodes/stair.d.ts +46 -0
  702. package/dist/schema/nodes/stair.d.ts.map +1 -1
  703. package/dist/schema/nodes/stair.js +3 -0
  704. package/dist/schema/nodes/turbine-vent.d.ts +5 -0
  705. package/dist/schema/nodes/turbine-vent.d.ts.map +1 -1
  706. package/dist/schema/nodes/wall.d.ts +135 -2
  707. package/dist/schema/nodes/wall.d.ts.map +1 -1
  708. package/dist/schema/nodes/wall.js +42 -6
  709. package/dist/schema/nodes/window.d.ts +66 -1
  710. package/dist/schema/nodes/window.d.ts.map +1 -1
  711. package/dist/schema/nodes/window.js +50 -5
  712. package/dist/schema/nodes/zone.d.ts +68 -0
  713. package/dist/schema/nodes/zone.d.ts.map +1 -1
  714. package/dist/schema/nodes/zone.js +32 -0
  715. package/dist/schema/scene-material.d.ts +5 -0
  716. package/dist/schema/scene-material.d.ts.map +1 -1
  717. package/dist/schema/types.d.ts +1079 -4
  718. package/dist/schema/types.d.ts.map +1 -1
  719. package/dist/schema/types.js +2 -0
  720. package/dist/schema/wall-type.d.ts +95 -0
  721. package/dist/schema/wall-type.d.ts.map +1 -0
  722. package/dist/schema/wall-type.js +32 -0
  723. package/dist/services/roof-bearing.d.ts.map +1 -1
  724. package/dist/services/roof-bearing.js +6 -3
  725. package/dist/services/roof-level.d.ts.map +1 -1
  726. package/dist/services/roof-level.js +4 -3
  727. package/dist/services/roof-move.d.ts.map +1 -1
  728. package/dist/services/roof-move.js +13 -7
  729. package/dist/services/storey.d.ts.map +1 -1
  730. package/dist/services/storey.js +13 -8
  731. package/dist/spatial/usage-field/beds.d.ts +51 -0
  732. package/dist/spatial/usage-field/beds.d.ts.map +1 -0
  733. package/dist/spatial/usage-field/beds.js +346 -0
  734. package/dist/spatial/usage-field/blocked.d.ts +28 -0
  735. package/dist/spatial/usage-field/blocked.d.ts.map +1 -0
  736. package/dist/spatial/usage-field/blocked.js +185 -0
  737. package/dist/spatial/usage-field/boxes.d.ts +17 -0
  738. package/dist/spatial/usage-field/boxes.d.ts.map +1 -0
  739. package/dist/spatial/usage-field/boxes.js +82 -0
  740. package/dist/spatial/usage-field/catalogue-shapes.d.ts +3 -0
  741. package/dist/spatial/usage-field/catalogue-shapes.d.ts.map +1 -0
  742. package/dist/spatial/usage-field/catalogue-shapes.js +257 -0
  743. package/dist/spatial/usage-field/catalogue.d.ts +6 -0
  744. package/dist/spatial/usage-field/catalogue.d.ts.map +1 -0
  745. package/dist/spatial/usage-field/catalogue.js +11 -0
  746. package/dist/spatial/usage-field/clash.d.ts +40 -0
  747. package/dist/spatial/usage-field/clash.d.ts.map +1 -0
  748. package/dist/spatial/usage-field/clash.js +187 -0
  749. package/dist/spatial/usage-field/door-stairs.d.ts +18 -0
  750. package/dist/spatial/usage-field/door-stairs.d.ts.map +1 -0
  751. package/dist/spatial/usage-field/door-stairs.js +129 -0
  752. package/dist/spatial/usage-field/entry-way.d.ts +14 -0
  753. package/dist/spatial/usage-field/entry-way.d.ts.map +1 -0
  754. package/dist/spatial/usage-field/entry-way.js +219 -0
  755. package/dist/spatial/usage-field/fences.d.ts +18 -0
  756. package/dist/spatial/usage-field/fences.d.ts.map +1 -0
  757. package/dist/spatial/usage-field/fences.js +253 -0
  758. package/dist/spatial/usage-field/field.d.ts +44 -0
  759. package/dist/spatial/usage-field/field.d.ts.map +1 -0
  760. package/dist/spatial/usage-field/field.js +145 -0
  761. package/dist/spatial/usage-field/findings.d.ts +76 -0
  762. package/dist/spatial/usage-field/findings.d.ts.map +1 -0
  763. package/dist/spatial/usage-field/findings.js +252 -0
  764. package/dist/spatial/usage-field/fixtures.d.ts +18 -0
  765. package/dist/spatial/usage-field/fixtures.d.ts.map +1 -0
  766. package/dist/spatial/usage-field/fixtures.js +160 -0
  767. package/dist/spatial/usage-field/flag.d.ts +10 -0
  768. package/dist/spatial/usage-field/flag.d.ts.map +1 -0
  769. package/dist/spatial/usage-field/flag.js +12 -0
  770. package/dist/spatial/usage-field/floors.d.ts +13 -0
  771. package/dist/spatial/usage-field/floors.d.ts.map +1 -0
  772. package/dist/spatial/usage-field/floors.js +36 -0
  773. package/dist/spatial/usage-field/index.d.ts +7 -0
  774. package/dist/spatial/usage-field/index.d.ts.map +1 -0
  775. package/dist/spatial/usage-field/index.js +5 -0
  776. package/dist/spatial/usage-field/items.d.ts +38 -0
  777. package/dist/spatial/usage-field/items.d.ts.map +1 -0
  778. package/dist/spatial/usage-field/items.js +261 -0
  779. package/dist/spatial/usage-field/labels.d.ts +8 -0
  780. package/dist/spatial/usage-field/labels.d.ts.map +1 -0
  781. package/dist/spatial/usage-field/labels.js +14 -0
  782. package/dist/spatial/usage-field/level-field.d.ts +47 -0
  783. package/dist/spatial/usage-field/level-field.d.ts.map +1 -0
  784. package/dist/spatial/usage-field/level-field.js +96 -0
  785. package/dist/spatial/usage-field/measure.d.ts +324 -0
  786. package/dist/spatial/usage-field/measure.d.ts.map +1 -0
  787. package/dist/spatial/usage-field/measure.js +458 -0
  788. package/dist/spatial/usage-field/obstacles.d.ts +63 -0
  789. package/dist/spatial/usage-field/obstacles.d.ts.map +1 -0
  790. package/dist/spatial/usage-field/obstacles.js +215 -0
  791. package/dist/spatial/usage-field/openings.d.ts +12 -0
  792. package/dist/spatial/usage-field/openings.d.ts.map +1 -0
  793. package/dist/spatial/usage-field/openings.js +162 -0
  794. package/dist/spatial/usage-field/path.d.ts +48 -0
  795. package/dist/spatial/usage-field/path.d.ts.map +1 -0
  796. package/dist/spatial/usage-field/path.js +354 -0
  797. package/dist/spatial/usage-field/pieces.d.ts +27 -0
  798. package/dist/spatial/usage-field/pieces.d.ts.map +1 -0
  799. package/dist/spatial/usage-field/pieces.js +89 -0
  800. package/dist/spatial/usage-field/shapes.d.ts +18 -0
  801. package/dist/spatial/usage-field/shapes.d.ts.map +1 -0
  802. package/dist/spatial/usage-field/shapes.js +92 -0
  803. package/dist/spatial/usage-field/stairs.d.ts +23 -0
  804. package/dist/spatial/usage-field/stairs.d.ts.map +1 -0
  805. package/dist/spatial/usage-field/stairs.js +163 -0
  806. package/dist/spatial/usage-field/support.d.ts +24 -0
  807. package/dist/spatial/usage-field/support.d.ts.map +1 -0
  808. package/dist/spatial/usage-field/support.js +46 -0
  809. package/dist/spatial/usage-field/swings.d.ts +846 -0
  810. package/dist/spatial/usage-field/swings.d.ts.map +1 -0
  811. package/dist/spatial/usage-field/swings.js +427 -0
  812. package/dist/spatial/usage-field/types.d.ts +65 -0
  813. package/dist/spatial/usage-field/types.d.ts.map +1 -0
  814. package/dist/spatial/usage-field/types.js +1 -0
  815. package/dist/spatial/usage-field/walls.d.ts +1057 -0
  816. package/dist/spatial/usage-field/walls.d.ts.map +1 -0
  817. package/dist/spatial/usage-field/walls.js +166 -0
  818. package/dist/spatial/usage-field/way-in.d.ts +26 -0
  819. package/dist/spatial/usage-field/way-in.d.ts.map +1 -0
  820. package/dist/spatial/usage-field/way-in.js +113 -0
  821. package/dist/store/actions/node-actions.d.ts +2124 -1322
  822. package/dist/store/actions/node-actions.d.ts.map +1 -1
  823. package/dist/store/actions/node-actions.js +42 -16
  824. package/dist/store/derived-node-guard.d.ts +10 -2
  825. package/dist/store/derived-node-guard.d.ts.map +1 -1
  826. package/dist/store/derived-node-guard.js +31 -11
  827. package/dist/store/document-settling.d.ts +9 -0
  828. package/dist/store/document-settling.d.ts.map +1 -0
  829. package/dist/store/document-settling.js +22 -0
  830. package/dist/store/history-control.d.ts +19 -10
  831. package/dist/store/history-control.d.ts.map +1 -1
  832. package/dist/store/history-control.js +176 -127
  833. package/dist/store/history-drafts.d.ts.map +1 -1
  834. package/dist/store/history-drafts.js +21 -17
  835. package/dist/store/live-previews.d.ts +9 -0
  836. package/dist/store/live-previews.d.ts.map +1 -0
  837. package/dist/store/live-previews.js +19 -0
  838. package/dist/store/scene-annotations.d.ts +6751 -5151
  839. package/dist/store/scene-annotations.d.ts.map +1 -1
  840. package/dist/store/scene-environment.d.ts +33 -0
  841. package/dist/store/scene-environment.d.ts.map +1 -0
  842. package/dist/store/scene-environment.js +54 -0
  843. package/dist/store/scene-hydration.d.ts.map +1 -1
  844. package/dist/store/scene-hydration.js +41 -30
  845. package/dist/store/use-interactive.d.ts +9 -3
  846. package/dist/store/use-interactive.d.ts.map +1 -1
  847. package/dist/store/use-interactive.js +43 -11
  848. package/dist/store/use-live-node-overrides.d.ts.map +1 -1
  849. package/dist/store/use-live-node-overrides.js +3 -0
  850. package/dist/store/use-scene.d.ts +25 -0
  851. package/dist/store/use-scene.d.ts.map +1 -1
  852. package/dist/store/use-scene.js +408 -336
  853. package/dist/systems/document-reconcile.d.ts +40 -0
  854. package/dist/systems/document-reconcile.d.ts.map +1 -0
  855. package/dist/systems/document-reconcile.js +159 -0
  856. package/dist/systems/elevator/elevator-opening-system.d.ts.map +1 -1
  857. package/dist/systems/elevator/elevator-opening-system.js +9 -24
  858. package/dist/systems/fence/guard-layout.d.ts +69 -0
  859. package/dist/systems/fence/guard-layout.d.ts.map +1 -0
  860. package/dist/systems/fence/guard-layout.js +194 -0
  861. package/dist/systems/owned-floor-openings.d.ts +13 -1
  862. package/dist/systems/owned-floor-openings.d.ts.map +1 -1
  863. package/dist/systems/owned-floor-openings.js +58 -2
  864. package/dist/systems/reconcile-owned-floor-openings.d.ts +3 -1
  865. package/dist/systems/reconcile-owned-floor-openings.d.ts.map +1 -1
  866. package/dist/systems/reconcile-owned-floor-openings.js +4 -4
  867. package/dist/systems/roof/roof-elevation-system.d.ts.map +1 -1
  868. package/dist/systems/roof/roof-elevation-system.js +8 -26
  869. package/dist/systems/roof/roof-elevation.d.ts +16 -1
  870. package/dist/systems/roof/roof-elevation.d.ts.map +1 -1
  871. package/dist/systems/roof/roof-elevation.js +85 -4
  872. package/dist/systems/roof/roof-footprint.d.ts +42 -1
  873. package/dist/systems/roof/roof-footprint.d.ts.map +1 -1
  874. package/dist/systems/roof/roof-footprint.js +160 -4
  875. package/dist/systems/slab/__fixtures__/floor-step.d.ts +3163 -1934
  876. package/dist/systems/slab/__fixtures__/floor-step.d.ts.map +1 -1
  877. package/dist/systems/slab/__fixtures__/raised-room.d.ts +2495 -1249
  878. package/dist/systems/slab/__fixtures__/raised-room.d.ts.map +1 -1
  879. package/dist/systems/stair/stair-clearance.d.ts +7 -0
  880. package/dist/systems/stair/stair-clearance.d.ts.map +1 -1
  881. package/dist/systems/stair/stair-clearance.js +31 -11
  882. package/dist/systems/stair/stair-construction.d.ts +8 -3
  883. package/dist/systems/stair/stair-construction.d.ts.map +1 -1
  884. package/dist/systems/stair/stair-construction.js +55 -4
  885. package/dist/systems/stair/stair-opening-preview.d.ts +889 -89
  886. package/dist/systems/stair/stair-opening-preview.d.ts.map +1 -1
  887. package/dist/systems/stair/stair-opening-system.d.ts.map +1 -1
  888. package/dist/systems/stair/stair-opening-system.js +18 -34
  889. package/dist/systems/stair/stair-presets.d.ts +36 -0
  890. package/dist/systems/stair/stair-presets.d.ts.map +1 -1
  891. package/dist/systems/stair/stair-rise-query.d.ts.map +1 -1
  892. package/dist/systems/stair/stair-rise-query.js +3 -2
  893. package/dist/systems/stair/stair-rise.d.ts.map +1 -1
  894. package/dist/systems/stair/stair-rise.js +6 -0
  895. package/dist/systems/stair/stair-sizing.d.ts +42 -11
  896. package/dist/systems/stair/stair-sizing.d.ts.map +1 -1
  897. package/dist/systems/stair/stair-sizing.js +10 -1
  898. package/dist/systems/stair/stair-structure.d.ts +277 -0
  899. package/dist/systems/stair/stair-structure.d.ts.map +1 -0
  900. package/dist/systems/stair/stair-structure.js +496 -0
  901. package/dist/systems/wall/wall-assembly.d.ts +84 -6
  902. package/dist/systems/wall/wall-assembly.d.ts.map +1 -1
  903. package/dist/systems/wall/wall-assembly.js +204 -5
  904. package/dist/systems/wall/wall-finish.d.ts +38 -2
  905. package/dist/systems/wall/wall-finish.d.ts.map +1 -1
  906. package/dist/systems/wall/wall-finish.js +70 -2
  907. package/dist/systems/wall/wall-footprint.js +2 -2
  908. package/dist/systems/wall/wall-merge.d.ts.map +1 -1
  909. package/dist/systems/wall/wall-merge.js +28 -7
  910. package/dist/systems/wall/wall-mitering.d.ts +1 -0
  911. package/dist/systems/wall/wall-mitering.d.ts.map +1 -1
  912. package/dist/systems/wall/wall-mitering.js +152 -52
  913. package/dist/systems/wall/wall-move.d.ts +23 -6
  914. package/dist/systems/wall/wall-move.d.ts.map +1 -1
  915. package/dist/systems/wall/wall-move.js +65 -0
  916. package/dist/systems/wall/wall-top.d.ts +2 -2
  917. package/dist/systems/wall/wall-top.d.ts.map +1 -1
  918. package/dist/systems/wall/wall-top.js +6 -1
  919. package/dist/systems/wall/wall-topology.d.ts +32 -1
  920. package/dist/systems/wall/wall-topology.d.ts.map +1 -1
  921. package/dist/systems/wall/wall-topology.js +118 -10
  922. package/dist/systems/wall/wall-trim-profiles.d.ts +12 -0
  923. package/dist/systems/wall/wall-trim-profiles.d.ts.map +1 -0
  924. package/dist/systems/wall/wall-trim-profiles.js +191 -0
  925. package/dist/utils/ensure-scene-openings.d.ts +6523 -4923
  926. package/dist/utils/ensure-scene-openings.d.ts.map +1 -1
  927. package/dist/utils/floor-piece-adoption.d.ts +5 -0
  928. package/dist/utils/floor-piece-adoption.d.ts.map +1 -1
  929. package/dist/utils/floor-plate-migration.d.ts +1930 -1130
  930. package/dist/utils/floor-plate-migration.d.ts.map +1 -1
  931. package/dist/utils/owned-floor-opening-migration.d.ts +888 -88
  932. package/dist/utils/owned-floor-opening-migration.d.ts.map +1 -1
  933. package/dist/utils/reconcile-structure-on-load.d.ts +1930 -1130
  934. package/dist/utils/reconcile-structure-on-load.d.ts.map +1 -1
  935. package/dist/utils/structure-id.d.ts.map +1 -1
  936. package/dist/utils/structure-id.js +4 -0
  937. package/package.json +22 -5
  938. package/dist/lib/generic-foundation.d.ts +0 -40
  939. package/dist/lib/generic-foundation.d.ts.map +0 -1
  940. package/dist/lib/generic-foundation.js +0 -200
@@ -0,0 +1,40 @@
1
+ import { type SpatialGridManager } from '../hooks/spatial-grid/spatial-grid-manager.js';
2
+ import type { SceneNodes } from '../lib/structure-kernel.js';
3
+ import type { AnyNode } from '../schema/index.js';
4
+ import type { SceneStore } from '../store/use-scene.js';
5
+ /** Kinds whose change re-sizes a straight stair's flights or re-cuts its floor openings. */
6
+ export declare function isStairOpeningInput(node: AnyNode | undefined): boolean;
7
+ /** Kinds whose change re-cuts an elevator's (and so every owner's) floor openings. */
8
+ export declare function isElevatorOpeningInput(node: AnyNode | undefined): boolean;
9
+ /** Whether any node of an input kind differs between two versions of a scene. */
10
+ export declare function changedInputs(before: SceneNodes, after: SceneNodes, isInput: (node: AnyNode | undefined) => boolean, options?: {
11
+ ignoreChildLists?: boolean;
12
+ }): boolean;
13
+ export type DocumentReconcileOptions = {
14
+ /**
15
+ * The view the passes read a version of the nodes through: a detached scene's tracked view, so
16
+ * their reads are recorded. Applied to every version a pass compares, so identity holds between.
17
+ */
18
+ read?: (nodes: SceneNodes) => SceneNodes;
19
+ /** Re-derive every level's structure, not only the levels whose structure changed since `before`. */
20
+ allLevels?: boolean;
21
+ /** The support index the passes query; by default one built from the store's own nodes. */
22
+ grid?: () => SpatialGridManager;
23
+ };
24
+ /**
25
+ * Every derived write the document owes after an edit, in one synchronous pass, so a patch taken
26
+ * afterwards is complete and applying it to the editor leaves its systems nothing to write:
27
+ *
28
+ * - room structure (zones, auto ceilings, floor plates) for the levels whose structure changed,
29
+ * as space detection derives it for a batch;
30
+ * - stair rises and the floor openings stairs and elevators own, as the opening systems do;
31
+ * - the elevation of wall-supported roofs, and of a roof kept over the storey it covers when its
32
+ * level moves, as the roof system does.
33
+ *
34
+ * The opening and roof systems still run in the editor (on a microtask, for edits made by hand);
35
+ * they plan with the same functions, so after this pass they find nothing to do. Writes are
36
+ * history-paused: they join the triggering edit's undo step. Support queries read an index built
37
+ * from the store's nodes, never the editor's previews.
38
+ */
39
+ export declare function reconcileDocument(store: SceneStore, before: SceneNodes, options?: DocumentReconcileOptions): void;
40
+ //# sourceMappingURL=document-reconcile.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"document-reconcile.d.ts","sourceRoot":"","sources":["../../src/systems/document-reconcile.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,kBAAkB,EAGxB,MAAM,4CAA4C,CAAA;AAInD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAA;AACzD,OAAO,KAAK,EAAE,OAAO,EAAa,MAAM,WAAW,CAAA;AAKnD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAWpD,4FAA4F;AAC5F,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,OAAO,GAAG,SAAS,GAAG,OAAO,CAStE;AAED,sFAAsF;AACtF,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,OAAO,GAAG,SAAS,GAAG,OAAO,CAQzE;AAED,iFAAiF;AACjF,wBAAgB,aAAa,CAC3B,MAAM,EAAE,UAAU,EAClB,KAAK,EAAE,UAAU,EACjB,OAAO,EAAE,CAAC,IAAI,EAAE,OAAO,GAAG,SAAS,KAAK,OAAO,EAC/C,OAAO,GAAE;IAAE,gBAAgB,CAAC,EAAE,OAAO,CAAA;CAAO,GAC3C,OAAO,CAST;AAYD,MAAM,MAAM,wBAAwB,GAAG;IACrC;;;OAGG;IACH,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,UAAU,CAAA;IACxC,qGAAqG;IACrG,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,2FAA2F;IAC3F,IAAI,CAAC,EAAE,MAAM,kBAAkB,CAAA;CAChC,CAAA;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,UAAU,EACjB,MAAM,EAAE,UAAU,EAClB,OAAO,GAAE,wBAA6B,GACrC,IAAI,CA0FN"}
@@ -0,0 +1,159 @@
1
+ import { structureChangeBatch } from '../commands/structure/shared.js';
2
+ import { supportIndexOf, withSpatialGrid, } from '../hooks/spatial-grid/spatial-grid-manager.js';
3
+ import { resolveLevelId } from '../lib/node-ancestry.js';
4
+ import { structureLevelsForChange } from '../lib/space-detection.js';
5
+ import { applyStructureReconciliation } from '../lib/structure-commit.js';
6
+ import { generateId } from '../schema/base.js';
7
+ import { roofsKeptOverStorey } from '../services/roof-move.js';
8
+ import { pauseSceneHistory, resumeSceneHistory } from '../store/history-control.js';
9
+ import { withoutLivePreviews } from '../store/live-previews.js';
10
+ import { planOwnedFloorOpenings } from './owned-floor-openings.js';
11
+ import { reconcileOwnedFloorOpeningChanges } from './reconcile-owned-floor-openings.js';
12
+ import { isRoofElevationInput, planRoofElevationUpdates, roofsAffectedBy, } from './roof/roof-elevation.js';
13
+ import { changedStairOpeningOwners } from './stair/stair-opening-sync.js';
14
+ import { syncStairRises } from './stair/stair-rise.js';
15
+ /** Kinds whose change re-sizes a straight stair's flights or re-cuts its floor openings. */
16
+ export function isStairOpeningInput(node) {
17
+ return (node?.type === 'building' ||
18
+ node?.type === 'ceiling' ||
19
+ node?.type === 'level' ||
20
+ node?.type === 'slab' ||
21
+ node?.type === 'stair' ||
22
+ node?.type === 'stair-segment');
23
+ }
24
+ /** Kinds whose change re-cuts an elevator's (and so every owner's) floor openings. */
25
+ export function isElevatorOpeningInput(node) {
26
+ return (node?.type === 'building' ||
27
+ node?.type === 'ceiling' ||
28
+ node?.type === 'elevator' ||
29
+ node?.type === 'level' ||
30
+ node?.type === 'slab');
31
+ }
32
+ /** Whether any node of an input kind differs between two versions of a scene. */
33
+ export function changedInputs(before, after, isInput, options = {}) {
34
+ if (before === after)
35
+ return false;
36
+ const differs = (previous, next) => previous !== next &&
37
+ (isInput(previous) || isInput(next)) &&
38
+ !(options.ignoreChildLists && onlyChildListChanged(previous, next));
39
+ for (const id in after)
40
+ if (differs(before[id], after[id]))
41
+ return true;
42
+ for (const id in before)
43
+ if (!(id in after) && differs(before[id], undefined))
44
+ return true;
45
+ return false;
46
+ }
47
+ /** Only a node's child list changed: its children's own changes are what passes react to. */
48
+ function onlyChildListChanged(previous, next) {
49
+ if (!(previous && next))
50
+ return false;
51
+ const a = previous;
52
+ const b = next;
53
+ for (const key in b)
54
+ if (key !== 'children' && a[key] !== b[key])
55
+ return false;
56
+ for (const key in a)
57
+ if (key !== 'children' && !(key in b))
58
+ return false;
59
+ return true;
60
+ }
61
+ /**
62
+ * Every derived write the document owes after an edit, in one synchronous pass, so a patch taken
63
+ * afterwards is complete and applying it to the editor leaves its systems nothing to write:
64
+ *
65
+ * - room structure (zones, auto ceilings, floor plates) for the levels whose structure changed,
66
+ * as space detection derives it for a batch;
67
+ * - stair rises and the floor openings stairs and elevators own, as the opening systems do;
68
+ * - the elevation of wall-supported roofs, and of a roof kept over the storey it covers when its
69
+ * level moves, as the roof system does.
70
+ *
71
+ * The opening and roof systems still run in the editor (on a microtask, for edits made by hand);
72
+ * they plan with the same functions, so after this pass they find nothing to do. Writes are
73
+ * history-paused: they join the triggering edit's undo step. Support queries read an index built
74
+ * from the store's nodes, never the editor's previews.
75
+ */
76
+ export function reconcileDocument(store, before, options = {}) {
77
+ const read = options.read ?? ((nodes) => nodes);
78
+ const nodes = () => store.getState().nodes;
79
+ const view = () => read(nodes());
80
+ const grid = options.grid ?? (() => supportIndexOf(store, resolveLevelId));
81
+ // The kernel and opening planners read the store's nodes through `read`; their writes go to it.
82
+ const readingStore = {
83
+ getState: () => ({ ...store.getState(), nodes: view() }),
84
+ };
85
+ const write = (apply) => {
86
+ pauseSceneHistory(store);
87
+ try {
88
+ apply();
89
+ }
90
+ finally {
91
+ resumeSceneHistory(store);
92
+ }
93
+ };
94
+ const applyOpenings = (changes) => {
95
+ if (!changes.length)
96
+ return;
97
+ const previous = nodes();
98
+ write(() => {
99
+ store.getState().applyNodeChanges(structureChangeBatch(changes));
100
+ reconcileOwnedFloorOpeningChanges(readingStore, read(previous), changes);
101
+ });
102
+ };
103
+ withoutLivePreviews(() => withSpatialGrid(grid, () => {
104
+ const levelIds = options.allLevels ? undefined : structureLevelsForChange(before, nodes());
105
+ if (!levelIds || levelIds.length)
106
+ write(() => applyStructureReconciliation(readingStore, {
107
+ levelIds,
108
+ previousNodes: options.allLevels ? undefined : read(before),
109
+ mintId: generateId,
110
+ }));
111
+ // A parent's child list is bookkeeping: what was added or removed is an input of its own.
112
+ const settled = { ignoreChildLists: true };
113
+ let stairsFrom = before;
114
+ let elevatorsFrom = before;
115
+ let roofsFrom = before;
116
+ // Each pass can feed another (a stair's openings change slabs, slabs carry roofs); a pass runs
117
+ // again only on a change to its own inputs, so this settles in a few rounds.
118
+ for (let round = 0; round < 8; round++) {
119
+ const start = nodes();
120
+ if (changedInputs(stairsFrom, start, isStairOpeningInput, settled)) {
121
+ const from = stairsFrom;
122
+ stairsFrom = start;
123
+ const rises = syncStairRises(view());
124
+ if (rises.length)
125
+ write(() => store.getState().updateNodes(rises));
126
+ // Which stairs this edit moved is the edit's own bookkeeping; the re-cut reads the scene.
127
+ const owners = changedStairOpeningOwners(from, nodes());
128
+ applyOpenings(planOwnedFloorOpenings(view(), { ownerIds: owners }));
129
+ stairsFrom = nodes();
130
+ }
131
+ if (changedInputs(elevatorsFrom, nodes(), isElevatorOpeningInput, settled)) {
132
+ applyOpenings(planOwnedFloorOpenings(view()));
133
+ elevatorsFrom = nodes();
134
+ }
135
+ // A roof's own child list is an input: a segment added reshapes its footprint.
136
+ const current = nodes();
137
+ const changed = [];
138
+ for (const id in current)
139
+ if (current[id] !== roofsFrom[id] &&
140
+ (current[id]?.type === 'roof' || !onlyChildListChanged(roofsFrom[id], current[id])))
141
+ changed.push(id);
142
+ for (const id in roofsFrom)
143
+ if (!(id in current))
144
+ changed.push(id);
145
+ const roofInput = (node) => isRoofElevationInput(node) || node?.type === 'roof-segment';
146
+ if (changed.some((id) => roofInput(roofsFrom[id]) || roofInput(current[id]))) {
147
+ const roofs = [
148
+ ...roofsKeptOverStorey(roofsFrom, view()),
149
+ ...planRoofElevationUpdates(view(), roofsAffectedBy(roofsFrom, current, changed)),
150
+ ];
151
+ if (roofs.length)
152
+ write(() => store.getState().updateNodes(roofs));
153
+ roofsFrom = nodes();
154
+ }
155
+ if (nodes() === start)
156
+ break;
157
+ }
158
+ }));
159
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"elevator-opening-system.d.ts","sourceRoot":"","sources":["../../../src/systems/elevator/elevator-opening-system.tsx"],"names":[],"mappings":"AAsCA,wBAAgB,6BAA6B,eAyB5C;AAED,eAAO,MAAM,qBAAqB,YAIjC,CAAA"}
1
+ {"version":3,"file":"elevator-opening-system.d.ts","sourceRoot":"","sources":["../../../src/systems/elevator/elevator-opening-system.tsx"],"names":[],"mappings":"AAYA,wBAAgB,6BAA6B,eAgC5C;AAED,eAAO,MAAM,qBAAqB,YAIjC,CAAA"}
@@ -1,32 +1,13 @@
1
1
  'use client';
2
2
  import { useEffect } from 'react';
3
3
  import { structureChangeBatch } from '../../commands/structure/shared.js';
4
+ import { isSettlingDocument } from '../../store/document-settling.js';
4
5
  import { pauseSceneHistory, resumeSceneHistory } from '../../store/history-control.js';
5
6
  import { isHydrationNormalization } from '../../store/scene-hydration.js';
6
7
  import useScene from '../../store/use-scene.js';
8
+ import { changedInputs, isElevatorOpeningInput } from '../document-reconcile.js';
7
9
  import { planOwnedFloorOpenings } from '../owned-floor-openings.js';
8
10
  import { reconcileOwnedFloorOpeningChanges } from '../reconcile-owned-floor-openings.js';
9
- function isOpeningRelevantNode(node) {
10
- return (node?.type === 'building' ||
11
- node?.type === 'ceiling' ||
12
- node?.type === 'elevator' ||
13
- node?.type === 'level' ||
14
- node?.type === 'slab');
15
- }
16
- function hasOpeningRelevantNodeChange(nextNodes, prevNodes) {
17
- if (nextNodes === prevNodes)
18
- return false;
19
- const ids = new Set([...Object.keys(nextNodes), ...Object.keys(prevNodes)]);
20
- for (const id of ids) {
21
- const nextNode = nextNodes[id];
22
- const prevNode = prevNodes[id];
23
- if (nextNode === prevNode)
24
- continue;
25
- if (isOpeningRelevantNode(nextNode) || isOpeningRelevantNode(prevNode))
26
- return true;
27
- }
28
- return false;
29
- }
30
11
  export function initializeElevatorOpeningSync() {
31
12
  let syncingAutoOpenings = false;
32
13
  const applyChanges = (skipExistingSurfaces = false) => {
@@ -38,7 +19,7 @@ export function initializeElevatorOpeningSync() {
38
19
  try {
39
20
  const before = useScene.getState().nodes;
40
21
  useScene.getState().applyNodeChanges(structureChangeBatch(changes));
41
- reconcileOwnedFloorOpeningChanges(before, changes);
22
+ reconcileOwnedFloorOpeningChanges(useScene, before, changes);
42
23
  }
43
24
  finally {
44
25
  resumeSceneHistory(useScene);
@@ -47,9 +28,13 @@ export function initializeElevatorOpeningSync() {
47
28
  };
48
29
  applyChanges(true);
49
30
  return useScene.subscribe((state, prevState) => {
50
- if (syncingAutoOpenings)
31
+ if (syncingAutoOpenings || isSettlingDocument(useScene))
51
32
  return;
52
- if (!hasOpeningRelevantNodeChange(state.nodes, prevState.nodes))
33
+ // A level's child list is bookkeeping (furniture re-parenting under it): what joined or left
34
+ // is an input of its own, as the document reconcile reads it.
35
+ if (!changedInputs(prevState.nodes, state.nodes, isElevatorOpeningInput, {
36
+ ignoreChildLists: true,
37
+ }))
53
38
  return;
54
39
  applyChanges(isHydrationNormalization() || state.hydrationId !== prevState.hydrationId);
55
40
  });
@@ -0,0 +1,69 @@
1
+ import type { FenceNode } from '../../schema/index.js';
2
+ /** A box standing on the fence's base: its centre, the turn about the vertical axis, its size along its own axes. */
3
+ export type GuardPost = {
4
+ position: [number, number, number];
5
+ rotationY: number;
6
+ scale: [number, number, number];
7
+ /** A 4-sided cone, square base aligned to the box. */
8
+ shape?: 'pyramid';
9
+ };
10
+ /**
11
+ * A run along the centreline between two fractions of its length, `depth` across it, `height` tall
12
+ * round `centerY`. `split` runs are cut into short segments so a curved fence bends them.
13
+ */
14
+ export type GuardBlock = {
15
+ startT: number;
16
+ endT: number;
17
+ centerY: number;
18
+ height: number;
19
+ depth: number;
20
+ split: boolean;
21
+ };
22
+ export type GuardLayout = {
23
+ posts: GuardPost[];
24
+ /** The cap rail flat over the posts and the top rail on edge under it. */
25
+ rail: GuardBlock[];
26
+ /** The bottom rail the balusters stand on (balusters only). */
27
+ base: GuardBlock[];
28
+ /** Balusters, cables or boards. */
29
+ infill: GuardBlock[];
30
+ };
31
+ /**
32
+ * A deck guard the way the AWC Deck Construction Guide (DCA 6) draws one: 4x4 posts (`postSize`) no
33
+ * more than `postSpacing` apart, the two ends counted as posts whether drawn or not (`startPost` /
34
+ * `endPost` false: the rails die into a post already standing there), a 2x6 cap rail flat over the
35
+ * posts, a 2x4 top rail on edge under it, and the infill: balusters (2x2 on a 2x4 bottom rail
36
+ * `groundClearance` over the deck, `slatGap` clear), cable (½ in runs `slatGap` apart from
37
+ * `groundClearance` up), or boards (`thickness` x 5½ in, `slatGap` apart from `groundClearance`
38
+ * up). `postThrough` runs the posts 3 in past the cap under a cap of their own (`postCap`).
39
+ *
40
+ * The pure layout the guard renderer builds its meshes from and the usage field reads its
41
+ * obstacles from, so the two cannot disagree.
42
+ */
43
+ export declare function layoutGuardFence(fence: FenceNode): GuardLayout;
44
+ /**
45
+ * The fractions a run between `startT` and `endT` is cut at: segments no longer than
46
+ * `maxSegmentLength`, so a curved fence bends them.
47
+ */
48
+ export declare function fenceBlockSegments(fence: FenceNode, startT: number, endT: number, maxSegmentLength: number): [number, number][];
49
+ type Corner = [number, number];
50
+ /**
51
+ * The four plan corners of a run between `startT` and `endT`, `depth` across the centreline and
52
+ * shifted `lateralOffset` to the side the frame's normal points: the outer then the inner corner at
53
+ * the start, then at the end.
54
+ */
55
+ export declare function fenceBlockCorners(fence: FenceNode, startT: number, endT: number, depth: number, lateralOffset?: number): [Corner, Corner, Corner, Corner];
56
+ /**
57
+ * Where a run's end moves to when its fence meets `neighbor` at a corner: the two end corners slide
58
+ * along the fence so the run meets the neighbour's in a mitre. `side` is -1 for the inner corner and
59
+ * 1 for the outer, `reach` the metres along the unit vector `(ux, uz)`; null where the two run
60
+ * nearly straight on, or the mitre would reach absurdly far.
61
+ */
62
+ export declare function fenceMiter(fence: FenceNode, endpoint: 'start' | 'end', neighbor: FenceNode, depth: number, lateralOffset?: number): {
63
+ side: -1 | 1;
64
+ reach: number;
65
+ ux: number;
66
+ uz: number;
67
+ }[] | null;
68
+ export {};
69
+ //# sourceMappingURL=guard-layout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guard-layout.d.ts","sourceRoot":"","sources":["../../../src/systems/fence/guard-layout.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AAe7C,qHAAqH;AACrH,MAAM,MAAM,SAAS,GAAG;IACtB,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;IAClC,SAAS,EAAE,MAAM,CAAA;IACjB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;IAC/B,sDAAsD;IACtD,KAAK,CAAC,EAAE,SAAS,CAAA;CAClB,CAAA;AAED;;;GAGG;AACH,MAAM,MAAM,UAAU,GAAG;IACvB,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,OAAO,CAAA;CACf,CAAA;AAED,MAAM,MAAM,WAAW,GAAG;IACxB,KAAK,EAAE,SAAS,EAAE,CAAA;IAClB,0EAA0E;IAC1E,IAAI,EAAE,UAAU,EAAE,CAAA;IAClB,+DAA+D;IAC/D,IAAI,EAAE,UAAU,EAAE,CAAA;IAClB,mCAAmC;IACnC,MAAM,EAAE,UAAU,EAAE,CAAA;CACrB,CAAA;AASD;;;;;;;;;;;GAWG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,SAAS,GAAG,WAAW,CAgG9D;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,SAAS,EAChB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,gBAAgB,EAAE,MAAM,GACvB,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAOpB;AAED,KAAK,MAAM,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;AAE9B;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,SAAS,EAChB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,aAAa,SAAI,GAChB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAclC;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CACxB,KAAK,EAAE,SAAS,EAChB,QAAQ,EAAE,OAAO,GAAG,KAAK,EACzB,QAAQ,EAAE,SAAS,EACnB,KAAK,EAAE,MAAM,EACb,aAAa,SAAI,GAChB;IAAE,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,EAAE,GAAG,IAAI,CA2BlE"}
@@ -0,0 +1,194 @@
1
+ import { getFenceCenterlineFrameAt, getFenceCenterlineLength } from './fence-centerline.js';
2
+ /** Dressed lumber the guard is built from, metres. */
3
+ const IN = 0.0254;
4
+ const GUARD_CAP_T = 1.5 * IN;
5
+ const GUARD_CAP_W = 5.5 * IN;
6
+ const GUARD_RAIL_T = 1.5 * IN;
7
+ const GUARD_RAIL_D = 3.5 * IN;
8
+ const GUARD_BALUSTER = 1.5 * IN;
9
+ const GUARD_BOARD_D = 5.5 * IN;
10
+ const GUARD_CABLE = 0.5 * IN;
11
+ const GUARD_POST_ABOVE_CAP = 3 * IN;
12
+ const GUARD_POST_CAP_T = 1 * IN;
13
+ function frameAt(fence, t) {
14
+ const { point, tangent } = getFenceCenterlineFrameAt(fence, t);
15
+ return { x: point.x, z: point.y, angle: Math.atan2(tangent.y, tangent.x) };
16
+ }
17
+ /**
18
+ * A deck guard the way the AWC Deck Construction Guide (DCA 6) draws one: 4x4 posts (`postSize`) no
19
+ * more than `postSpacing` apart, the two ends counted as posts whether drawn or not (`startPost` /
20
+ * `endPost` false: the rails die into a post already standing there), a 2x6 cap rail flat over the
21
+ * posts, a 2x4 top rail on edge under it, and the infill: balusters (2x2 on a 2x4 bottom rail
22
+ * `groundClearance` over the deck, `slatGap` clear), cable (½ in runs `slatGap` apart from
23
+ * `groundClearance` up), or boards (`thickness` x 5½ in, `slatGap` apart from `groundClearance`
24
+ * up). `postThrough` runs the posts 3 in past the cap under a cap of their own (`postCap`).
25
+ *
26
+ * The pure layout the guard renderer builds its meshes from and the usage field reads its
27
+ * obstacles from, so the two cannot disagree.
28
+ */
29
+ export function layoutGuardFence(fence) {
30
+ const posts = [];
31
+ const infill = [];
32
+ const base = [];
33
+ const rail = [];
34
+ const length = Math.max(getFenceCenterlineLength(fence), 0.01);
35
+ const H = Math.max(fence.height, 0.4);
36
+ const postW = Math.max(fence.postSize, 0.02);
37
+ const clearance = Math.max(fence.groundClearance, 0);
38
+ const gap = Math.max(fence.slatGap ?? 0.09, 0.01);
39
+ const infillKind = fence.guardInfill ?? 'balusters';
40
+ const through = fence.postThrough === true;
41
+ const capTop = H;
42
+ const capBottom = H - GUARD_CAP_T;
43
+ const topRailBottom = capBottom - GUARD_RAIL_D;
44
+ const bays = Math.max(1, Math.ceil(length / Math.max(fence.postSpacing, postW * 2)));
45
+ const stations = [];
46
+ for (let i = 0; i <= bays; i++)
47
+ stations.push(i / bays);
48
+ // posts: to the cap's underside, or through it with a cap
49
+ const postH = through ? capTop + GUARD_POST_ABOVE_CAP : capBottom;
50
+ for (const [i, t] of stations.entries()) {
51
+ if (i === 0 && fence.startPost === false)
52
+ continue;
53
+ if (i === stations.length - 1 && fence.endPost === false)
54
+ continue;
55
+ const frame = frameAt(fence, t);
56
+ posts.push({
57
+ position: [frame.x, postH / 2, frame.z],
58
+ rotationY: -frame.angle,
59
+ scale: [postW, postH, postW],
60
+ });
61
+ if (through && (fence.postCap ?? 'flat') !== 'none') {
62
+ const cap = fence.postCap ?? 'flat';
63
+ if (cap === 'pyramid') {
64
+ posts.push({
65
+ position: [frame.x, postH + postW * 0.45, frame.z],
66
+ rotationY: -frame.angle,
67
+ scale: [postW * 1.18, postW * 0.9, postW * 1.18],
68
+ shape: 'pyramid',
69
+ });
70
+ }
71
+ else {
72
+ posts.push({
73
+ position: [frame.x, postH + GUARD_POST_CAP_T / 2, frame.z],
74
+ rotationY: -frame.angle,
75
+ scale: [postW + 2 * IN, GUARD_POST_CAP_T, postW + 2 * IN],
76
+ });
77
+ }
78
+ }
79
+ }
80
+ const run = (centerY, height, depth) => ({
81
+ startT: 0,
82
+ endT: 1,
83
+ centerY,
84
+ height,
85
+ depth,
86
+ split: true,
87
+ });
88
+ rail.push(run(capBottom + GUARD_CAP_T / 2, GUARD_CAP_T, GUARD_CAP_W));
89
+ rail.push(run(topRailBottom + GUARD_RAIL_D / 2, GUARD_RAIL_D, GUARD_RAIL_T));
90
+ const postHalfT = postW / 2 / length;
91
+ const clearOfPosts = (t, halfT) => !stations.some((s) => Math.abs(s - t) < postHalfT + halfT);
92
+ if (infillKind === 'balusters') {
93
+ // the 2x4 bottom rail `clearance` over the deck, the balusters on it
94
+ const bottomRailTop = clearance + GUARD_RAIL_D;
95
+ base.push(run(clearance + GUARD_RAIL_D / 2, GUARD_RAIL_D, GUARD_RAIL_T));
96
+ const balH = Math.max(topRailBottom - bottomRailTop, 0.05);
97
+ const pitch = GUARD_BALUSTER + gap;
98
+ const halfT = GUARD_BALUSTER / 2 / length;
99
+ for (let s = pitch; s < length - GUARD_BALUSTER; s += pitch) {
100
+ const t = s / length;
101
+ if (!clearOfPosts(t, halfT))
102
+ continue;
103
+ if (2 * halfT <= 1e-5)
104
+ continue;
105
+ infill.push({
106
+ startT: t - halfT,
107
+ endT: t + halfT,
108
+ centerY: bottomRailTop + balH / 2,
109
+ height: balH,
110
+ depth: GUARD_BALUSTER,
111
+ split: false,
112
+ });
113
+ }
114
+ }
115
+ else if (infillKind === 'cable') {
116
+ // ½ in cables `gap` apart from `clearance` up to under the top rail
117
+ for (let y = clearance; y < topRailBottom - GUARD_CABLE; y += gap)
118
+ infill.push(run(y + GUARD_CABLE / 2, GUARD_CABLE, GUARD_CABLE));
119
+ }
120
+ else {
121
+ // boards `gap` apart from `clearance` up to under the top rail
122
+ const boardT = Math.max(fence.thickness, 0.012);
123
+ for (let y = clearance; y + GUARD_BOARD_D <= topRailBottom + 1e-6; y += GUARD_BOARD_D + gap)
124
+ infill.push(run(y + GUARD_BOARD_D / 2, GUARD_BOARD_D, boardT));
125
+ }
126
+ return { posts, infill, base, rail };
127
+ }
128
+ /**
129
+ * The fractions a run between `startT` and `endT` is cut at: segments no longer than
130
+ * `maxSegmentLength`, so a curved fence bends them.
131
+ */
132
+ export function fenceBlockSegments(fence, startT, endT, maxSegmentLength) {
133
+ const length = getFenceCenterlineLength(fence) * Math.max(1e-4, endT - startT);
134
+ const count = Math.max(1, Math.ceil(length / Math.max(1e-4, maxSegmentLength)));
135
+ return Array.from({ length: count }, (_, index) => [
136
+ startT + (endT - startT) * (index / count),
137
+ startT + (endT - startT) * ((index + 1) / count),
138
+ ]);
139
+ }
140
+ /**
141
+ * The four plan corners of a run between `startT` and `endT`, `depth` across the centreline and
142
+ * shifted `lateralOffset` to the side the frame's normal points: the outer then the inner corner at
143
+ * the start, then at the end.
144
+ */
145
+ export function fenceBlockCorners(fence, startT, endT, depth, lateralOffset = 0) {
146
+ const half = depth / 2;
147
+ const at = (t) => {
148
+ const frame = frameAt(fence, t);
149
+ const nx = -Math.sin(frame.angle);
150
+ const nz = Math.cos(frame.angle);
151
+ return [
152
+ [frame.x + nx * (half + lateralOffset), frame.z + nz * (half + lateralOffset)],
153
+ [frame.x - nx * (half - lateralOffset), frame.z - nz * (half - lateralOffset)],
154
+ ];
155
+ };
156
+ const [startOuter, startInner] = at(startT);
157
+ const [endOuter, endInner] = at(endT);
158
+ return [startOuter, startInner, endOuter, endInner];
159
+ }
160
+ /**
161
+ * Where a run's end moves to when its fence meets `neighbor` at a corner: the two end corners slide
162
+ * along the fence so the run meets the neighbour's in a mitre. `side` is -1 for the inner corner and
163
+ * 1 for the outer, `reach` the metres along the unit vector `(ux, uz)`; null where the two run
164
+ * nearly straight on, or the mitre would reach absurdly far.
165
+ */
166
+ export function fenceMiter(fence, endpoint, neighbor, depth, lateralOffset = 0) {
167
+ const point = fence[endpoint];
168
+ const frame = getFenceCenterlineFrameAt(fence, endpoint === 'start' ? 0 : 1);
169
+ const sign = endpoint === 'start' ? 1 : -1;
170
+ const ux = frame.tangent.x * sign;
171
+ const uz = frame.tangent.y * sign;
172
+ const neighborAtStart = Math.hypot(neighbor.start[0] - point[0], neighbor.start[1] - point[1]) < 0.001;
173
+ const other = getFenceCenterlineFrameAt(neighbor, neighborAtStart ? 0 : 1);
174
+ const vx = other.tangent.x * (neighborAtStart ? 1 : -1);
175
+ const vz = other.tangent.y * (neighborAtStart ? 1 : -1);
176
+ const cross = ux * vz - uz * vx;
177
+ if (Math.abs(cross) < 0.15)
178
+ return null;
179
+ const ratio = Math.max(neighbor.thickness, 0.03) / Math.max(fence.thickness, 0.03);
180
+ const out = [];
181
+ for (const side of [-1, 1]) {
182
+ const offset = lateralOffset + (side * depth) / 2;
183
+ const neighborOffset = -offset * sign * ratio;
184
+ const nx = -uz * offset * sign;
185
+ const nz = ux * offset * sign;
186
+ const mx = -vz * neighborOffset;
187
+ const mz = vx * neighborOffset;
188
+ const reach = ((mx - nx) * vz - (mz - nz) * vx) / cross;
189
+ if (Math.abs(reach) > Math.max(depth, depth * ratio) * 4)
190
+ continue;
191
+ out.push({ side, reach, ux, uz });
192
+ }
193
+ return out;
194
+ }
@@ -1,5 +1,17 @@
1
1
  import type { NodePatch } from '../lib/structure-kernel.js';
2
- import type { AnyNode } from '../schema/index.js';
2
+ import type { AnyNode, AnyNodeId, FloorOpeningNode } from '../schema/index.js';
3
+ /**
4
+ * A stair opening reshaped by hand: the floor cut and the ceiling cut below it (the stair's openings
5
+ * on its own two levels) take `polygon` and become openings the stair owns as drawn, so the plate
6
+ * and ceiling are cut by that shape (not the derived rectangle) and keep it when the stair is
7
+ * reselected or re-synced. The stair's current pose is recorded so they still follow it when it
8
+ * moves or resizes. Returns the patches; empty when `openingId` is not a stair opening that can be
9
+ * authored this way (an opening on a level between two the stair joins keeps following it).
10
+ */
11
+ export declare function authorStairOpeningPatches(nodes: Record<string, AnyNode>, openingId: string, polygon: [number, number][]): Array<{
12
+ id: AnyNodeId;
13
+ data: Partial<FloorOpeningNode>;
14
+ }>;
3
15
  export declare function planOwnedFloorOpenings(nodes: Record<string, AnyNode>, options?: {
4
16
  ownerIds?: ReadonlySet<string>;
5
17
  skipExistingSurfaces?: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"owned-floor-openings.d.ts","sourceRoot":"","sources":["../../src/systems/owned-floor-openings.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;AACxD,OAAO,KAAK,EAAE,OAAO,EAAoD,MAAM,WAAW,CAAA;AA8H1F,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,OAAO,GAAE;IACP,QAAQ,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAA;IAC9B,oBAAoB,CAAC,EAAE,OAAO,CAAA;IAC9B,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CACvC,GACL,SAAS,EAAE,CAyRb"}
1
+ {"version":3,"file":"owned-floor-openings.d.ts","sourceRoot":"","sources":["../../src/systems/owned-floor-openings.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;AAExD,OAAO,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAuB,MAAM,WAAW,CAAA;AAwI1F;;;;;;;GAOG;AACH,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,GAC1B,KAAK,CAAC;IAAE,EAAE,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAA;CAAE,CAAC,CAuC3D;AAED,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,OAAO,GAAE;IACP,QAAQ,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAA;IAC9B,oBAAoB,CAAC,EAAE,OAAO,CAAA;IAC9B,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CACvC,GACL,SAAS,EAAE,CA2Rb"}
@@ -1,4 +1,5 @@
1
1
  import { canonicalOpeningRing } from '../lib/canonical-opening-ring.js';
2
+ import { queryNodes } from '../runtime/node-queries.js';
2
3
  import { FloorOpeningNode as FloorOpeningSchema } from '../schema/nodes/floor-opening.js';
3
4
  import { resolveCeilingHeight } from '../services/level-height.js';
4
5
  import { getLevelElevations } from '../services/storey.js';
@@ -99,12 +100,67 @@ function cutsFromSurfaces(surfaces, owners) {
99
100
  }
100
101
  return cuts;
101
102
  }
103
+ /** The level an authored stair opening is kept on: its source level for a ceiling cut, else its destination. */
104
+ function authoredOpeningTarget(opening, owner) {
105
+ return opening.metadata.ownerOpeningTarget === 'source' || opening.drawnOn === 'ceiling'
106
+ ? owner.fromLevelId
107
+ : owner.toLevelId;
108
+ }
109
+ /**
110
+ * A stair opening reshaped by hand: the floor cut and the ceiling cut below it (the stair's openings
111
+ * on its own two levels) take `polygon` and become openings the stair owns as drawn, so the plate
112
+ * and ceiling are cut by that shape (not the derived rectangle) and keep it when the stair is
113
+ * reselected or re-synced. The stair's current pose is recorded so they still follow it when it
114
+ * moves or resizes. Returns the patches; empty when `openingId` is not a stair opening that can be
115
+ * authored this way (an opening on a level between two the stair joins keeps following it).
116
+ */
117
+ export function authorStairOpeningPatches(nodes, openingId, polygon) {
118
+ const opening = nodes[openingId];
119
+ if (opening?.type !== 'floor-opening' || opening.source !== 'stair' || !opening.ownerId)
120
+ return [];
121
+ const owner = nodes[opening.ownerId];
122
+ if (owner?.type !== 'stair' || authoredOpeningTarget(opening, owner) !== opening.parentId)
123
+ return [];
124
+ const segment = owner.children
125
+ .map((id) => nodes[id])
126
+ .find((node) => node?.type === 'stair-segment');
127
+ const footprint = stairFootprintAABB({ ...owner, position: [0, 0, 0], rotation: 0 }, nodes);
128
+ const pose = {
129
+ position: owner.position,
130
+ rotation: owner.rotation,
131
+ width: owner.width,
132
+ runLength: segment?.type === 'stair-segment' ? segment.length : 1,
133
+ ...(isBox(footprint) ? { footprint } : {}),
134
+ };
135
+ const ring = canonicalOpeningRing(polygon);
136
+ return Object.values(nodes).flatMap((node) => node.type === 'floor-opening' &&
137
+ node.source === 'stair' &&
138
+ node.ownerId === owner.id &&
139
+ authoredOpeningTarget(node, owner) === node.parentId
140
+ ? [
141
+ {
142
+ id: node.id,
143
+ data: {
144
+ polygon: ring,
145
+ surfaceId: undefined,
146
+ legacyPlateCuts: undefined,
147
+ legacyCeilingCuts: undefined,
148
+ cutsPrimary: true,
149
+ cutsAdjacent: false,
150
+ metadata: { ...node.metadata, ownerPose: pose },
151
+ },
152
+ },
153
+ ]
154
+ : []);
155
+ }
102
156
  export function planOwnedFloorOpenings(nodes, options = {}) {
103
- const values = Object.values(nodes);
104
- if (!values.some((node) => node.type === 'stair' ||
157
+ // Owners and their openings first: a scene with none has nothing to plan.
158
+ const owned = queryNodes(nodes, { type: ['stair', 'elevator', 'floor-opening'] });
159
+ if (!owned.some((node) => node.type === 'stair' ||
105
160
  node.type === 'elevator' ||
106
161
  (node.type === 'floor-opening' && (node.source === 'stair' || node.source === 'elevator'))))
107
162
  return [];
163
+ const values = Object.values(nodes);
108
164
  const existing = values.filter((node) => node.type === 'floor-opening' &&
109
165
  (node.source === 'stair' || node.source === 'elevator') &&
110
166
  !!node.ownerId &&
@@ -1,3 +1,5 @@
1
1
  import type { NodePatch, SceneNodes } from '../lib/structure-kernel.js';
2
- export declare function reconcileOwnedFloorOpeningChanges(before: SceneNodes, changes: NodePatch[]): void;
2
+ import type { SceneStore } from '../store/use-scene.js';
3
+ /** Re-derives the structure of every level an owned opening change cut into or out of. */
4
+ export declare function reconcileOwnedFloorOpeningChanges(store: Pick<SceneStore, 'getState'>, before: SceneNodes, changes: NodePatch[]): void;
3
5
  //# sourceMappingURL=reconcile-owned-floor-openings.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"reconcile-owned-floor-openings.d.ts","sourceRoot":"","sources":["../../src/systems/reconcile-owned-floor-openings.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAA;AAKpE,wBAAgB,iCAAiC,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,SAAS,EAAE,QAkBzF"}
1
+ {"version":3,"file":"reconcile-owned-floor-openings.d.ts","sourceRoot":"","sources":["../../src/systems/reconcile-owned-floor-openings.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAA;AAGpE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAEpD,0FAA0F;AAC1F,wBAAgB,iCAAiC,CAC/C,KAAK,EAAE,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,EACnC,MAAM,EAAE,UAAU,EAClB,OAAO,EAAE,SAAS,EAAE,QAmBrB"}