@pascal-app/core 1.0.3 → 1.0.5

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 (1485) hide show
  1. package/dist/agent-operations/__fixtures__/add-object-cases.d.ts +247 -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 +429 -0
  4. package/dist/agent-operations/__fixtures__/add-stair-cases.d.ts +3 -0
  5. package/dist/agent-operations/__fixtures__/add-stair-cases.d.ts.map +1 -0
  6. package/dist/agent-operations/__fixtures__/add-stair-cases.js +176 -0
  7. package/dist/agent-operations/__fixtures__/build-room-cases.d.ts +4 -0
  8. package/dist/agent-operations/__fixtures__/build-room-cases.d.ts.map +1 -0
  9. package/dist/agent-operations/__fixtures__/build-room-cases.js +1005 -0
  10. package/dist/agent-operations/__fixtures__/cases.d.ts +67 -0
  11. package/dist/agent-operations/__fixtures__/cases.d.ts.map +1 -0
  12. package/dist/agent-operations/__fixtures__/cases.js +868 -0
  13. package/dist/agent-operations/__fixtures__/corner-window-cases.d.ts +3 -0
  14. package/dist/agent-operations/__fixtures__/corner-window-cases.d.ts.map +1 -0
  15. package/dist/agent-operations/__fixtures__/corner-window-cases.js +155 -0
  16. package/dist/agent-operations/__fixtures__/design-brief-cases.d.ts +14 -0
  17. package/dist/agent-operations/__fixtures__/design-brief-cases.d.ts.map +1 -0
  18. package/dist/agent-operations/__fixtures__/design-brief-cases.js +709 -0
  19. package/dist/agent-operations/__fixtures__/find-by-type-cases.d.ts +7 -0
  20. package/dist/agent-operations/__fixtures__/find-by-type-cases.d.ts.map +1 -0
  21. package/dist/agent-operations/__fixtures__/find-by-type-cases.js +21 -0
  22. package/dist/agent-operations/__fixtures__/finish-cases.d.ts +7 -0
  23. package/dist/agent-operations/__fixtures__/finish-cases.d.ts.map +1 -0
  24. package/dist/agent-operations/__fixtures__/finish-cases.js +758 -0
  25. package/dist/agent-operations/__fixtures__/lot-info-cases.d.ts +3 -0
  26. package/dist/agent-operations/__fixtures__/lot-info-cases.d.ts.map +1 -0
  27. package/dist/agent-operations/__fixtures__/lot-info-cases.js +370 -0
  28. package/dist/agent-operations/__fixtures__/merge-windows-cases.d.ts +3 -0
  29. package/dist/agent-operations/__fixtures__/merge-windows-cases.d.ts.map +1 -0
  30. package/dist/agent-operations/__fixtures__/merge-windows-cases.js +321 -0
  31. package/dist/agent-operations/__fixtures__/native-materials.d.ts +2237 -0
  32. package/dist/agent-operations/__fixtures__/native-materials.d.ts.map +1 -0
  33. package/dist/agent-operations/__fixtures__/native-materials.js +82 -0
  34. package/dist/agent-operations/__fixtures__/node-read-cases.d.ts +4 -0
  35. package/dist/agent-operations/__fixtures__/node-read-cases.d.ts.map +1 -0
  36. package/dist/agent-operations/__fixtures__/node-read-cases.js +639 -0
  37. package/dist/agent-operations/__fixtures__/notation-cases.d.ts +24 -0
  38. package/dist/agent-operations/__fixtures__/notation-cases.d.ts.map +1 -0
  39. package/dist/agent-operations/__fixtures__/notation-cases.js +356 -0
  40. package/dist/agent-operations/__fixtures__/place-items-cases.d.ts +17 -0
  41. package/dist/agent-operations/__fixtures__/place-items-cases.d.ts.map +1 -0
  42. package/dist/agent-operations/__fixtures__/place-items-cases.js +584 -0
  43. package/dist/agent-operations/__fixtures__/roof-bearing-cases.d.ts +19726 -0
  44. package/dist/agent-operations/__fixtures__/roof-bearing-cases.d.ts.map +1 -0
  45. package/dist/agent-operations/__fixtures__/roof-bearing-cases.js +106 -0
  46. package/dist/agent-operations/__fixtures__/roof-cases.d.ts +9 -0
  47. package/dist/agent-operations/__fixtures__/roof-cases.d.ts.map +1 -0
  48. package/dist/agent-operations/__fixtures__/roof-cases.js +382 -0
  49. package/dist/agent-operations/__fixtures__/room-cases.d.ts +4 -0
  50. package/dist/agent-operations/__fixtures__/room-cases.d.ts.map +1 -0
  51. package/dist/agent-operations/__fixtures__/room-cases.js +473 -0
  52. package/dist/agent-operations/__fixtures__/scene-check-cases.d.ts +4 -0
  53. package/dist/agent-operations/__fixtures__/scene-check-cases.d.ts.map +1 -0
  54. package/dist/agent-operations/__fixtures__/scene-check-cases.js +417 -0
  55. package/dist/agent-operations/__fixtures__/search-assets-cases.d.ts +5 -0
  56. package/dist/agent-operations/__fixtures__/search-assets-cases.d.ts.map +1 -0
  57. package/dist/agent-operations/__fixtures__/search-assets-cases.js +149 -0
  58. package/dist/agent-operations/__fixtures__/site-cases.d.ts +290 -0
  59. package/dist/agent-operations/__fixtures__/site-cases.d.ts.map +1 -0
  60. package/dist/agent-operations/__fixtures__/site-cases.js +780 -0
  61. package/dist/agent-operations/__fixtures__/structure-cases.d.ts +7 -0
  62. package/dist/agent-operations/__fixtures__/structure-cases.d.ts.map +1 -0
  63. package/dist/agent-operations/__fixtures__/structure-cases.js +1215 -0
  64. package/dist/agent-operations/__fixtures__/verify-scene-cases.d.ts +313 -0
  65. package/dist/agent-operations/__fixtures__/verify-scene-cases.d.ts.map +1 -0
  66. package/dist/agent-operations/__fixtures__/verify-scene-cases.js +350 -0
  67. package/dist/agent-operations/__fixtures__/view-assets-cases.d.ts +3 -0
  68. package/dist/agent-operations/__fixtures__/view-assets-cases.d.ts.map +1 -0
  69. package/dist/agent-operations/__fixtures__/view-assets-cases.js +155 -0
  70. package/dist/agent-operations/__fixtures__/view-scene-cases.d.ts +50 -0
  71. package/dist/agent-operations/__fixtures__/view-scene-cases.d.ts.map +1 -0
  72. package/dist/agent-operations/__fixtures__/view-scene-cases.js +425 -0
  73. package/dist/agent-operations/achieved.d.ts +21 -0
  74. package/dist/agent-operations/achieved.d.ts.map +1 -0
  75. package/dist/agent-operations/achieved.js +48 -0
  76. package/dist/agent-operations/add-column.d.ts +23 -0
  77. package/dist/agent-operations/add-column.d.ts.map +1 -0
  78. package/dist/agent-operations/add-column.js +99 -0
  79. package/dist/agent-operations/add-fence.d.ts +18 -0
  80. package/dist/agent-operations/add-fence.d.ts.map +1 -0
  81. package/dist/agent-operations/add-fence.js +48 -0
  82. package/dist/agent-operations/add-level.d.ts +17 -0
  83. package/dist/agent-operations/add-level.d.ts.map +1 -0
  84. package/dist/agent-operations/add-level.js +130 -0
  85. package/dist/agent-operations/add-object.d.ts +143 -0
  86. package/dist/agent-operations/add-object.d.ts.map +1 -0
  87. package/dist/agent-operations/add-object.js +522 -0
  88. package/dist/agent-operations/add-wall.d.ts +13 -0
  89. package/dist/agent-operations/add-wall.d.ts.map +1 -0
  90. package/dist/agent-operations/add-wall.js +73 -0
  91. package/dist/agent-operations/apply-changes.d.ts +22 -0
  92. package/dist/agent-operations/apply-changes.d.ts.map +1 -0
  93. package/dist/agent-operations/apply-changes.js +125 -0
  94. package/dist/agent-operations/apply-outcome.d.ts +21 -0
  95. package/dist/agent-operations/apply-outcome.d.ts.map +1 -0
  96. package/dist/agent-operations/apply-outcome.js +33 -0
  97. package/dist/agent-operations/asset-views.d.ts +75 -0
  98. package/dist/agent-operations/asset-views.d.ts.map +1 -0
  99. package/dist/agent-operations/asset-views.js +234 -0
  100. package/dist/agent-operations/author-scene.d.ts +157 -0
  101. package/dist/agent-operations/author-scene.d.ts.map +1 -0
  102. package/dist/agent-operations/author-scene.js +1076 -0
  103. package/dist/agent-operations/authored-scene-merge.d.ts +4 -0
  104. package/dist/agent-operations/authored-scene-merge.d.ts.map +1 -0
  105. package/dist/agent-operations/authored-scene-merge.js +96 -0
  106. package/dist/agent-operations/batch.d.ts +22 -0
  107. package/dist/agent-operations/batch.d.ts.map +1 -0
  108. package/dist/agent-operations/batch.js +104 -0
  109. package/dist/agent-operations/ceiling-object-observations.d.ts +31 -0
  110. package/dist/agent-operations/ceiling-object-observations.d.ts.map +1 -0
  111. package/dist/agent-operations/ceiling-object-observations.js +111 -0
  112. package/dist/agent-operations/collections.d.ts +28 -0
  113. package/dist/agent-operations/collections.d.ts.map +1 -0
  114. package/dist/agent-operations/collections.js +130 -0
  115. package/dist/agent-operations/corner-window.d.ts +19 -0
  116. package/dist/agent-operations/corner-window.d.ts.map +1 -0
  117. package/dist/agent-operations/corner-window.js +84 -0
  118. package/dist/agent-operations/create-roof.d.ts +32 -0
  119. package/dist/agent-operations/create-roof.d.ts.map +1 -0
  120. package/dist/agent-operations/create-roof.js +304 -0
  121. package/dist/agent-operations/create-room.d.ts +38 -0
  122. package/dist/agent-operations/create-room.d.ts.map +1 -0
  123. package/dist/agent-operations/create-room.js +245 -0
  124. package/dist/agent-operations/create-stair.d.ts +11 -0
  125. package/dist/agent-operations/create-stair.d.ts.map +1 -0
  126. package/dist/agent-operations/create-stair.js +330 -0
  127. package/dist/agent-operations/delete-node.d.ts +6 -0
  128. package/dist/agent-operations/delete-node.d.ts.map +1 -0
  129. package/dist/agent-operations/delete-node.js +9 -0
  130. package/dist/agent-operations/design-brief.d.ts +38 -0
  131. package/dist/agent-operations/design-brief.d.ts.map +1 -0
  132. package/dist/agent-operations/design-brief.js +300 -0
  133. package/dist/agent-operations/designs.d.ts +24 -0
  134. package/dist/agent-operations/designs.d.ts.map +1 -0
  135. package/dist/agent-operations/designs.js +48 -0
  136. package/dist/agent-operations/door-clearance.d.ts +150 -0
  137. package/dist/agent-operations/door-clearance.d.ts.map +1 -0
  138. package/dist/agent-operations/door-clearance.js +391 -0
  139. package/dist/agent-operations/duplicate-level.d.ts +12 -0
  140. package/dist/agent-operations/duplicate-level.d.ts.map +1 -0
  141. package/dist/agent-operations/duplicate-level.js +55 -0
  142. package/dist/agent-operations/find-by-type.d.ts +18 -0
  143. package/dist/agent-operations/find-by-type.d.ts.map +1 -0
  144. package/dist/agent-operations/find-by-type.js +317 -0
  145. package/dist/agent-operations/furnish-room.d.ts +39 -0
  146. package/dist/agent-operations/furnish-room.d.ts.map +1 -0
  147. package/dist/agent-operations/furnish-room.js +306 -0
  148. package/dist/agent-operations/furniture-kind.d.ts +22 -0
  149. package/dist/agent-operations/furniture-kind.d.ts.map +1 -0
  150. package/dist/agent-operations/furniture-kind.js +69 -0
  151. package/dist/agent-operations/get-node.d.ts +12 -0
  152. package/dist/agent-operations/get-node.d.ts.map +1 -0
  153. package/dist/agent-operations/get-node.js +105 -0
  154. package/dist/agent-operations/hosted-services.d.ts +14 -0
  155. package/dist/agent-operations/hosted-services.d.ts.map +1 -0
  156. package/dist/agent-operations/hosted-services.js +22 -0
  157. package/dist/agent-operations/index.d.ts +489 -0
  158. package/dist/agent-operations/index.d.ts.map +1 -0
  159. package/dist/agent-operations/index.js +141 -0
  160. package/dist/agent-operations/item-space.d.ts +22 -0
  161. package/dist/agent-operations/item-space.d.ts.map +1 -0
  162. package/dist/agent-operations/item-space.js +69 -0
  163. package/dist/agent-operations/layout-clearance.d.ts +157 -0
  164. package/dist/agent-operations/layout-clearance.d.ts.map +1 -0
  165. package/dist/agent-operations/layout-clearance.js +500 -0
  166. package/dist/agent-operations/level-height-fill.d.ts +12 -0
  167. package/dist/agent-operations/level-height-fill.d.ts.map +1 -0
  168. package/dist/agent-operations/level-height-fill.js +59 -0
  169. package/dist/agent-operations/level-reads.d.ts +37 -0
  170. package/dist/agent-operations/level-reads.d.ts.map +1 -0
  171. package/dist/agent-operations/level-reads.js +168 -0
  172. package/dist/agent-operations/level-target.d.ts +11 -0
  173. package/dist/agent-operations/level-target.d.ts.map +1 -0
  174. package/dist/agent-operations/level-target.js +29 -0
  175. package/dist/agent-operations/list-levels.d.ts +4 -0
  176. package/dist/agent-operations/list-levels.d.ts.map +1 -0
  177. package/dist/agent-operations/list-levels.js +54 -0
  178. package/dist/agent-operations/material-preset.d.ts +11 -0
  179. package/dist/agent-operations/material-preset.d.ts.map +1 -0
  180. package/dist/agent-operations/material-preset.js +68 -0
  181. package/dist/agent-operations/material-refs.d.ts +30 -0
  182. package/dist/agent-operations/material-refs.d.ts.map +1 -0
  183. package/dist/agent-operations/material-refs.js +105 -0
  184. package/dist/agent-operations/merge-windows.d.ts +6 -0
  185. package/dist/agent-operations/merge-windows.d.ts.map +1 -0
  186. package/dist/agent-operations/merge-windows.js +27 -0
  187. package/dist/agent-operations/move-roofs.d.ts +9 -0
  188. package/dist/agent-operations/move-roofs.d.ts.map +1 -0
  189. package/dist/agent-operations/move-roofs.js +29 -0
  190. package/dist/agent-operations/node-patch.d.ts +3 -0
  191. package/dist/agent-operations/node-patch.d.ts.map +1 -0
  192. package/dist/agent-operations/node-patch.js +114 -0
  193. package/dist/agent-operations/paint.d.ts +22 -0
  194. package/dist/agent-operations/paint.d.ts.map +1 -0
  195. package/dist/agent-operations/paint.js +329 -0
  196. package/dist/agent-operations/photo-elevation.d.ts +155 -0
  197. package/dist/agent-operations/photo-elevation.d.ts.map +1 -0
  198. package/dist/agent-operations/photo-elevation.js +761 -0
  199. package/dist/agent-operations/place-in-room.d.ts +29 -0
  200. package/dist/agent-operations/place-in-room.d.ts.map +1 -0
  201. package/dist/agent-operations/place-in-room.js +403 -0
  202. package/dist/agent-operations/place-items.d.ts +20 -0
  203. package/dist/agent-operations/place-items.d.ts.map +1 -0
  204. package/dist/agent-operations/place-items.js +239 -0
  205. package/dist/agent-operations/plan-geometry.d.ts +24 -0
  206. package/dist/agent-operations/plan-geometry.d.ts.map +1 -0
  207. package/dist/agent-operations/plan-geometry.js +97 -0
  208. package/dist/agent-operations/point-context.d.ts +139 -0
  209. package/dist/agent-operations/point-context.d.ts.map +1 -0
  210. package/dist/agent-operations/point-context.js +1 -0
  211. package/dist/agent-operations/project-files.d.ts +9 -0
  212. package/dist/agent-operations/project-files.d.ts.map +1 -0
  213. package/dist/agent-operations/project-files.js +25 -0
  214. package/dist/agent-operations/record-made.d.ts +18 -0
  215. package/dist/agent-operations/record-made.d.ts.map +1 -0
  216. package/dist/agent-operations/record-made.js +28 -0
  217. package/dist/agent-operations/roof-footprint.d.ts +24 -0
  218. package/dist/agent-operations/roof-footprint.d.ts.map +1 -0
  219. package/dist/agent-operations/roof-footprint.js +242 -0
  220. package/dist/agent-operations/roof-writes.d.ts +20 -0
  221. package/dist/agent-operations/roof-writes.d.ts.map +1 -0
  222. package/dist/agent-operations/roof-writes.js +165 -0
  223. package/dist/agent-operations/room-findings.d.ts +54 -0
  224. package/dist/agent-operations/room-findings.d.ts.map +1 -0
  225. package/dist/agent-operations/room-findings.js +143 -0
  226. package/dist/agent-operations/room-floor-script.d.ts +23 -0
  227. package/dist/agent-operations/room-floor-script.d.ts.map +1 -0
  228. package/dist/agent-operations/room-floor-script.js +54 -0
  229. package/dist/agent-operations/room-structure.d.ts +87 -0
  230. package/dist/agent-operations/room-structure.d.ts.map +1 -0
  231. package/dist/agent-operations/room-structure.js +144 -0
  232. package/dist/agent-operations/scene-checkpoint.d.ts +94 -0
  233. package/dist/agent-operations/scene-checkpoint.d.ts.map +1 -0
  234. package/dist/agent-operations/scene-checkpoint.js +176 -0
  235. package/dist/agent-operations/scene-materials.d.ts +15 -0
  236. package/dist/agent-operations/scene-materials.d.ts.map +1 -0
  237. package/dist/agent-operations/scene-materials.js +62 -0
  238. package/dist/agent-operations/scene-measure.d.ts +73 -0
  239. package/dist/agent-operations/scene-measure.d.ts.map +1 -0
  240. package/dist/agent-operations/scene-measure.js +73 -0
  241. package/dist/agent-operations/scene-queries.d.ts +4941 -0
  242. package/dist/agent-operations/scene-queries.d.ts.map +1 -0
  243. package/dist/agent-operations/scene-queries.js +74 -0
  244. package/dist/agent-operations/scene-review.d.ts +52 -0
  245. package/dist/agent-operations/scene-review.d.ts.map +1 -0
  246. package/dist/agent-operations/scene-review.js +106 -0
  247. package/dist/agent-operations/scene-view.d.ts +165 -0
  248. package/dist/agent-operations/scene-view.d.ts.map +1 -0
  249. package/dist/agent-operations/scene-view.js +916 -0
  250. package/dist/agent-operations/search-assets.d.ts +14 -0
  251. package/dist/agent-operations/search-assets.d.ts.map +1 -0
  252. package/dist/agent-operations/search-assets.js +43 -0
  253. package/dist/agent-operations/search-materials.d.ts +18 -0
  254. package/dist/agent-operations/search-materials.d.ts.map +1 -0
  255. package/dist/agent-operations/search-materials.js +165 -0
  256. package/dist/agent-operations/set-checkpoint.d.ts +9 -0
  257. package/dist/agent-operations/set-checkpoint.d.ts.map +1 -0
  258. package/dist/agent-operations/set-checkpoint.js +31 -0
  259. package/dist/agent-operations/set-ground-level.d.ts +12 -0
  260. package/dist/agent-operations/set-ground-level.d.ts.map +1 -0
  261. package/dist/agent-operations/set-ground-level.js +61 -0
  262. package/dist/agent-operations/site.d.ts +21 -0
  263. package/dist/agent-operations/site.d.ts.map +1 -0
  264. package/dist/agent-operations/site.js +123 -0
  265. package/dist/agent-operations/stairs.d.ts +5 -0
  266. package/dist/agent-operations/stairs.d.ts.map +1 -0
  267. package/dist/agent-operations/stairs.js +70 -0
  268. package/dist/agent-operations/types.d.ts +118 -0
  269. package/dist/agent-operations/types.d.ts.map +1 -0
  270. package/dist/agent-operations/types.js +1 -0
  271. package/dist/agent-operations/verify-scene.d.ts +84 -0
  272. package/dist/agent-operations/verify-scene.d.ts.map +1 -0
  273. package/dist/agent-operations/verify-scene.js +548 -0
  274. package/dist/agent-operations/wall-face-script.d.ts +28 -0
  275. package/dist/agent-operations/wall-face-script.d.ts.map +1 -0
  276. package/dist/agent-operations/wall-face-script.js +62 -0
  277. package/dist/agent-operations/wall-object-observations.d.ts +41 -0
  278. package/dist/agent-operations/wall-object-observations.d.ts.map +1 -0
  279. package/dist/agent-operations/wall-object-observations.js +249 -0
  280. package/dist/agent-operations/wall-opening.d.ts +65 -0
  281. package/dist/agent-operations/wall-opening.d.ts.map +1 -0
  282. package/dist/agent-operations/wall-opening.js +55 -0
  283. package/dist/agent-operations/wall-skirting.d.ts +24 -0
  284. package/dist/agent-operations/wall-skirting.d.ts.map +1 -0
  285. package/dist/agent-operations/wall-skirting.js +85 -0
  286. package/dist/agent-tools/achieved.d.ts +9 -0
  287. package/dist/agent-tools/achieved.d.ts.map +1 -0
  288. package/dist/agent-tools/achieved.js +8 -0
  289. package/dist/agent-tools/add-object.d.ts +47 -0
  290. package/dist/agent-tools/add-object.d.ts.map +1 -0
  291. package/dist/agent-tools/add-object.js +92 -0
  292. package/dist/agent-tools/assets.d.ts +21 -0
  293. package/dist/agent-tools/assets.d.ts.map +1 -0
  294. package/dist/agent-tools/assets.js +30 -0
  295. package/dist/agent-tools/author-scene.d.ts +651 -0
  296. package/dist/agent-tools/author-scene.d.ts.map +1 -0
  297. package/dist/agent-tools/author-scene.js +252 -0
  298. package/dist/agent-tools/batch.d.ts +25 -0
  299. package/dist/agent-tools/batch.d.ts.map +1 -0
  300. package/dist/agent-tools/batch.js +61 -0
  301. package/dist/agent-tools/checkpoints.d.ts +13 -0
  302. package/dist/agent-tools/checkpoints.d.ts.map +1 -0
  303. package/dist/agent-tools/checkpoints.js +16 -0
  304. package/dist/agent-tools/clear-scene.d.ts +10 -0
  305. package/dist/agent-tools/clear-scene.d.ts.map +1 -0
  306. package/dist/agent-tools/clear-scene.js +9 -0
  307. package/dist/agent-tools/collections.d.ts +35 -0
  308. package/dist/agent-tools/collections.d.ts.map +1 -0
  309. package/dist/agent-tools/collections.js +31 -0
  310. package/dist/agent-tools/columns.d.ts +44 -0
  311. package/dist/agent-tools/columns.d.ts.map +1 -0
  312. package/dist/agent-tools/columns.js +59 -0
  313. package/dist/agent-tools/contract.d.ts +68 -0
  314. package/dist/agent-tools/contract.d.ts.map +1 -0
  315. package/dist/agent-tools/contract.js +1 -0
  316. package/dist/agent-tools/corner-window.d.ts +46 -0
  317. package/dist/agent-tools/corner-window.d.ts.map +1 -0
  318. package/dist/agent-tools/corner-window.js +47 -0
  319. package/dist/agent-tools/create-room.d.ts +64 -0
  320. package/dist/agent-tools/create-room.d.ts.map +1 -0
  321. package/dist/agent-tools/create-room.js +97 -0
  322. package/dist/agent-tools/design-brief.d.ts +408 -0
  323. package/dist/agent-tools/design-brief.d.ts.map +1 -0
  324. package/dist/agent-tools/design-brief.js +149 -0
  325. package/dist/agent-tools/designs.d.ts +34 -0
  326. package/dist/agent-tools/designs.d.ts.map +1 -0
  327. package/dist/agent-tools/designs.js +50 -0
  328. package/dist/agent-tools/fences.d.ts +28 -0
  329. package/dist/agent-tools/fences.d.ts.map +1 -0
  330. package/dist/agent-tools/fences.js +31 -0
  331. package/dist/agent-tools/find-by-type.d.ts +18 -0
  332. package/dist/agent-tools/find-by-type.d.ts.map +1 -0
  333. package/dist/agent-tools/find-by-type.js +35 -0
  334. package/dist/agent-tools/furnish-room.d.ts +28 -0
  335. package/dist/agent-tools/furnish-room.d.ts.map +1 -0
  336. package/dist/agent-tools/furnish-room.js +37 -0
  337. package/dist/agent-tools/hosted-services.d.ts +438 -0
  338. package/dist/agent-tools/hosted-services.d.ts.map +1 -0
  339. package/dist/agent-tools/hosted-services.js +181 -0
  340. package/dist/agent-tools/index.d.ts +1543 -0
  341. package/dist/agent-tools/index.d.ts.map +1 -0
  342. package/dist/agent-tools/index.js +126 -0
  343. package/dist/agent-tools/levels.d.ts +80 -0
  344. package/dist/agent-tools/levels.d.ts.map +1 -0
  345. package/dist/agent-tools/levels.js +87 -0
  346. package/dist/agent-tools/measurement.d.ts +55 -0
  347. package/dist/agent-tools/measurement.d.ts.map +1 -0
  348. package/dist/agent-tools/measurement.js +144 -0
  349. package/dist/agent-tools/merge-windows.d.ts +10 -0
  350. package/dist/agent-tools/merge-windows.d.ts.map +1 -0
  351. package/dist/agent-tools/merge-windows.js +12 -0
  352. package/dist/agent-tools/node-id.d.ts +3 -0
  353. package/dist/agent-tools/node-id.d.ts.map +1 -0
  354. package/dist/agent-tools/node-id.js +2 -0
  355. package/dist/agent-tools/nodes.d.ts +17 -0
  356. package/dist/agent-tools/nodes.d.ts.map +1 -0
  357. package/dist/agent-tools/nodes.js +13 -0
  358. package/dist/agent-tools/notation-inventory.d.ts +16 -0
  359. package/dist/agent-tools/notation-inventory.d.ts.map +1 -0
  360. package/dist/agent-tools/notation-inventory.js +105 -0
  361. package/dist/agent-tools/paint.d.ts +46 -0
  362. package/dist/agent-tools/paint.d.ts.map +1 -0
  363. package/dist/agent-tools/paint.js +29 -0
  364. package/dist/agent-tools/photo-elevation.d.ts +32 -0
  365. package/dist/agent-tools/photo-elevation.d.ts.map +1 -0
  366. package/dist/agent-tools/photo-elevation.js +73 -0
  367. package/dist/agent-tools/place-in-room.d.ts +35 -0
  368. package/dist/agent-tools/place-in-room.d.ts.map +1 -0
  369. package/dist/agent-tools/place-in-room.js +61 -0
  370. package/dist/agent-tools/place-items.d.ts +19 -0
  371. package/dist/agent-tools/place-items.d.ts.map +1 -0
  372. package/dist/agent-tools/place-items.js +29 -0
  373. package/dist/agent-tools/project-files.d.ts +189 -0
  374. package/dist/agent-tools/project-files.d.ts.map +1 -0
  375. package/dist/agent-tools/project-files.js +99 -0
  376. package/dist/agent-tools/refusal.d.ts +20 -0
  377. package/dist/agent-tools/refusal.d.ts.map +1 -0
  378. package/dist/agent-tools/refusal.js +29 -0
  379. package/dist/agent-tools/retired.d.ts +21 -0
  380. package/dist/agent-tools/retired.d.ts.map +1 -0
  381. package/dist/agent-tools/retired.js +29 -0
  382. package/dist/agent-tools/roofs.d.ts +100 -0
  383. package/dist/agent-tools/roofs.d.ts.map +1 -0
  384. package/dist/agent-tools/roofs.js +96 -0
  385. package/dist/agent-tools/room-structure.d.ts +446 -0
  386. package/dist/agent-tools/room-structure.d.ts.map +1 -0
  387. package/dist/agent-tools/room-structure.js +210 -0
  388. package/dist/agent-tools/search-materials.d.ts +39 -0
  389. package/dist/agent-tools/search-materials.d.ts.map +1 -0
  390. package/dist/agent-tools/search-materials.js +31 -0
  391. package/dist/agent-tools/site.d.ts +27 -0
  392. package/dist/agent-tools/site.d.ts.map +1 -0
  393. package/dist/agent-tools/site.js +40 -0
  394. package/dist/agent-tools/sources.d.ts +12 -0
  395. package/dist/agent-tools/sources.d.ts.map +1 -0
  396. package/dist/agent-tools/sources.js +11 -0
  397. package/dist/agent-tools/stairs.d.ts +106 -0
  398. package/dist/agent-tools/stairs.d.ts.map +1 -0
  399. package/dist/agent-tools/stairs.js +146 -0
  400. package/dist/agent-tools/verify-scene.d.ts +13 -0
  401. package/dist/agent-tools/verify-scene.d.ts.map +1 -0
  402. package/dist/agent-tools/verify-scene.js +21 -0
  403. package/dist/agent-tools/view-scene.d.ts +81 -0
  404. package/dist/agent-tools/view-scene.d.ts.map +1 -0
  405. package/dist/agent-tools/view-scene.js +123 -0
  406. package/dist/agent-tools/wall-openings.d.ts +167 -0
  407. package/dist/agent-tools/wall-openings.d.ts.map +1 -0
  408. package/dist/agent-tools/wall-openings.js +148 -0
  409. package/dist/agent-tools/walls.d.ts +21 -0
  410. package/dist/agent-tools/walls.d.ts.map +1 -0
  411. package/dist/agent-tools/walls.js +35 -0
  412. package/dist/agent-tools/write-target.d.ts +12 -0
  413. package/dist/agent-tools/write-target.d.ts.map +1 -0
  414. package/dist/agent-tools/write-target.js +10 -0
  415. package/dist/building/__fixtures__/wall-opening-cases.d.ts +940 -0
  416. package/dist/building/__fixtures__/wall-opening-cases.d.ts.map +1 -0
  417. package/dist/building/__fixtures__/wall-opening-cases.js +367 -0
  418. package/dist/building/corner-window.d.ts +56 -0
  419. package/dist/building/corner-window.d.ts.map +1 -0
  420. package/dist/building/corner-window.js +179 -0
  421. package/dist/building/door-types.d.ts +22 -0
  422. package/dist/building/door-types.d.ts.map +1 -0
  423. package/dist/building/door-types.js +167 -0
  424. package/dist/building/floor-item-fit.d.ts +38 -0
  425. package/dist/building/floor-item-fit.d.ts.map +1 -0
  426. package/dist/building/floor-item-fit.js +47 -0
  427. package/dist/building/ground-level.d.ts +26 -0
  428. package/dist/building/ground-level.d.ts.map +1 -0
  429. package/dist/building/ground-level.js +58 -0
  430. package/dist/building/index.d.ts +12 -0
  431. package/dist/building/index.d.ts.map +1 -0
  432. package/dist/building/index.js +11 -0
  433. package/dist/building/level-duplication.d.ts +9842 -0
  434. package/dist/building/level-duplication.d.ts.map +1 -0
  435. package/dist/building/level-duplication.js +328 -0
  436. package/dist/building/level-insertion.d.ts +55 -0
  437. package/dist/building/level-insertion.d.ts.map +1 -0
  438. package/dist/building/level-insertion.js +35 -0
  439. package/dist/building/merge-windows.d.ts +58 -0
  440. package/dist/building/merge-windows.d.ts.map +1 -0
  441. package/dist/building/merge-windows.js +189 -0
  442. package/dist/building/opening-style-presets.d.ts +46 -0
  443. package/dist/building/opening-style-presets.d.ts.map +1 -0
  444. package/dist/building/opening-style-presets.js +195 -0
  445. package/dist/building/photo-elevation.d.ts +125 -0
  446. package/dist/building/photo-elevation.d.ts.map +1 -0
  447. package/dist/building/photo-elevation.js +404 -0
  448. package/dist/building/wall-gaps.d.ts +13 -0
  449. package/dist/building/wall-gaps.d.ts.map +1 -0
  450. package/dist/building/wall-gaps.js +158 -0
  451. package/dist/building/wall-openings.d.ts +480 -0
  452. package/dist/building/wall-openings.d.ts.map +1 -0
  453. package/dist/building/wall-openings.js +259 -0
  454. package/dist/building/window-types.d.ts +17 -0
  455. package/dist/building/window-types.d.ts.map +1 -0
  456. package/dist/building/window-types.js +31 -0
  457. package/dist/capture/schema.d.ts +22 -22
  458. package/dist/capture/source.d.ts.map +1 -1
  459. package/dist/capture/source.js +1 -1
  460. package/dist/commands/structure/apply-zone-transform.d.ts +23 -0
  461. package/dist/commands/structure/apply-zone-transform.d.ts.map +1 -0
  462. package/dist/commands/structure/apply-zone-transform.js +55 -0
  463. package/dist/commands/structure/create-mezzanine.d.ts +12 -0
  464. package/dist/commands/structure/create-mezzanine.d.ts.map +1 -0
  465. package/dist/commands/structure/create-mezzanine.js +46 -0
  466. package/dist/commands/structure/create-zone.d.ts +43 -0
  467. package/dist/commands/structure/create-zone.d.ts.map +1 -0
  468. package/dist/commands/structure/create-zone.js +175 -0
  469. package/dist/commands/structure/delete-zone.d.ts +51 -0
  470. package/dist/commands/structure/delete-zone.d.ts.map +1 -0
  471. package/dist/commands/structure/delete-zone.js +354 -0
  472. package/dist/commands/structure/divide-zone.d.ts +38 -0
  473. package/dist/commands/structure/divide-zone.d.ts.map +1 -0
  474. package/dist/commands/structure/divide-zone.js +186 -0
  475. package/dist/commands/structure/duplicate-zone.d.ts +7 -0
  476. package/dist/commands/structure/duplicate-zone.d.ts.map +1 -0
  477. package/dist/commands/structure/duplicate-zone.js +21 -0
  478. package/dist/commands/structure/floor-opening.d.ts +36 -0
  479. package/dist/commands/structure/floor-opening.d.ts.map +1 -0
  480. package/dist/commands/structure/floor-opening.js +124 -0
  481. package/dist/commands/structure/index.d.ts +22 -0
  482. package/dist/commands/structure/index.d.ts.map +1 -0
  483. package/dist/commands/structure/index.js +20 -0
  484. package/dist/commands/structure/lock-outside-faces.d.ts +12 -0
  485. package/dist/commands/structure/lock-outside-faces.d.ts.map +1 -0
  486. package/dist/commands/structure/lock-outside-faces.js +32 -0
  487. package/dist/commands/structure/merge-zones.d.ts +5 -0
  488. package/dist/commands/structure/merge-zones.d.ts.map +1 -0
  489. package/dist/commands/structure/merge-zones.js +22 -0
  490. package/dist/commands/structure/mezzanine-content.d.ts +16 -0
  491. package/dist/commands/structure/mezzanine-content.d.ts.map +1 -0
  492. package/dist/commands/structure/mezzanine-content.js +109 -0
  493. package/dist/commands/structure/plan-mezzanine-stair.d.ts +7 -0
  494. package/dist/commands/structure/plan-mezzanine-stair.d.ts.map +1 -0
  495. package/dist/commands/structure/plan-mezzanine-stair.js +127 -0
  496. package/dist/commands/structure/plan-wall-deletion.d.ts +9 -0
  497. package/dist/commands/structure/plan-wall-deletion.d.ts.map +1 -0
  498. package/dist/commands/structure/plan-wall-deletion.js +151 -0
  499. package/dist/commands/structure/rebase-floor-reference.d.ts +7 -0
  500. package/dist/commands/structure/rebase-floor-reference.d.ts.map +1 -0
  501. package/dist/commands/structure/rebase-floor-reference.js +90 -0
  502. package/dist/commands/structure/resize-mezzanine.d.ts +8 -0
  503. package/dist/commands/structure/resize-mezzanine.d.ts.map +1 -0
  504. package/dist/commands/structure/resize-mezzanine.js +43 -0
  505. package/dist/commands/structure/rotate-zone.d.ts +8 -0
  506. package/dist/commands/structure/rotate-zone.d.ts.map +1 -0
  507. package/dist/commands/structure/rotate-zone.js +28 -0
  508. package/dist/commands/structure/set-floor-foundation.d.ts +62 -0
  509. package/dist/commands/structure/set-floor-foundation.d.ts.map +1 -0
  510. package/dist/commands/structure/set-floor-foundation.js +162 -0
  511. package/dist/commands/structure/set-room-floor-construction.d.ts +8 -0
  512. package/dist/commands/structure/set-room-floor-construction.d.ts.map +1 -0
  513. package/dist/commands/structure/set-room-floor-construction.js +72 -0
  514. package/dist/commands/structure/set-wall-geometry.d.ts +10 -0
  515. package/dist/commands/structure/set-wall-geometry.d.ts.map +1 -0
  516. package/dist/commands/structure/set-wall-geometry.js +52 -0
  517. package/dist/commands/structure/set-zone-edges.d.ts +14 -0
  518. package/dist/commands/structure/set-zone-edges.d.ts.map +1 -0
  519. package/dist/commands/structure/set-zone-edges.js +143 -0
  520. package/dist/commands/structure/set-zone-intent.d.ts +43 -0
  521. package/dist/commands/structure/set-zone-intent.d.ts.map +1 -0
  522. package/dist/commands/structure/set-zone-intent.js +144 -0
  523. package/dist/commands/structure/shared.d.ts +4941 -0
  524. package/dist/commands/structure/shared.d.ts.map +1 -0
  525. package/dist/commands/structure/shared.js +102 -0
  526. package/dist/commands/structure/transform-zone.d.ts +23 -0
  527. package/dist/commands/structure/transform-zone.d.ts.map +1 -0
  528. package/dist/commands/structure/transform-zone.js +472 -0
  529. package/dist/commands/structure/validate-mezzanine.d.ts +5 -0
  530. package/dist/commands/structure/validate-mezzanine.d.ts.map +1 -0
  531. package/dist/commands/structure/validate-mezzanine.js +46 -0
  532. package/dist/commands/structure/zone-crossings.d.ts +8 -0
  533. package/dist/commands/structure/zone-crossings.d.ts.map +1 -0
  534. package/dist/commands/structure/zone-crossings.js +162 -0
  535. package/dist/commands/structure/zone-drop.d.ts +4 -0
  536. package/dist/commands/structure/zone-drop.d.ts.map +1 -0
  537. package/dist/commands/structure/zone-drop.js +68 -0
  538. package/dist/commands/structure/zone-insertion.d.ts +4 -0
  539. package/dist/commands/structure/zone-insertion.d.ts.map +1 -0
  540. package/dist/commands/structure/zone-insertion.js +200 -0
  541. package/dist/commands/structure/zone-transform-content.d.ts +6 -0
  542. package/dist/commands/structure/zone-transform-content.d.ts.map +1 -0
  543. package/dist/commands/structure/zone-transform-content.js +117 -0
  544. package/dist/commands/structure/zone-wall-merge.d.ts +5792 -0
  545. package/dist/commands/structure/zone-wall-merge.d.ts.map +1 -0
  546. package/dist/commands/structure/zone-wall-merge.js +135 -0
  547. package/dist/contracts/reference-discovery.d.ts +18 -0
  548. package/dist/contracts/reference-discovery.d.ts.map +1 -0
  549. package/dist/contracts/reference-discovery.js +100 -0
  550. package/dist/contracts/reference-inventory.d.ts +44 -0
  551. package/dist/contracts/reference-inventory.d.ts.map +1 -0
  552. package/dist/contracts/reference-inventory.js +952 -0
  553. package/dist/events/bus.d.ts +90 -10
  554. package/dist/events/bus.d.ts.map +1 -1
  555. package/dist/events/capture-sessions.d.ts +5 -0
  556. package/dist/events/capture-sessions.d.ts.map +1 -0
  557. package/dist/events/capture-sessions.js +31 -0
  558. package/dist/hooks/scene-registry/item-clip-registry.d.ts +6 -3
  559. package/dist/hooks/scene-registry/item-clip-registry.d.ts.map +1 -1
  560. package/dist/hooks/scene-registry/item-clip-registry.js +2 -1
  561. package/dist/hooks/scene-registry/scene-registry.d.ts.map +1 -1
  562. package/dist/hooks/spatial-grid/floor-placed-elevation.d.ts.map +1 -1
  563. package/dist/hooks/spatial-grid/floor-placed-elevation.js +15 -1
  564. package/dist/hooks/spatial-grid/spatial-grid-manager.d.ts +4 -4
  565. package/dist/hooks/spatial-grid/spatial-grid-manager.d.ts.map +1 -1
  566. package/dist/hooks/spatial-grid/spatial-grid-manager.js +56 -71
  567. package/dist/hooks/spatial-grid/spatial-grid-sync.d.ts +3948 -2034
  568. package/dist/hooks/spatial-grid/spatial-grid-sync.d.ts.map +1 -1
  569. package/dist/hooks/spatial-grid/spatial-grid-sync.js +86 -83
  570. package/dist/hooks/spatial-grid/spatial-grid.d.ts.map +1 -1
  571. package/dist/hooks/spatial-grid/support-host-patch.d.ts +1 -0
  572. package/dist/hooks/spatial-grid/support-host-patch.d.ts.map +1 -1
  573. package/dist/hooks/spatial-grid/support-host-patch.js +21 -5
  574. package/dist/hooks/spatial-grid/use-spatial-query.d.ts +3 -3
  575. package/dist/hooks/spatial-grid/wall-spatial-grid.d.ts.map +1 -1
  576. package/dist/index.d.ts +109 -14
  577. package/dist/index.d.ts.map +1 -1
  578. package/dist/index.js +103 -12
  579. package/dist/lib/__bench__/near-linear-walls.d.ts +2 -0
  580. package/dist/lib/__bench__/near-linear-walls.d.ts.map +1 -0
  581. package/dist/lib/__bench__/near-linear-walls.js +24 -0
  582. package/dist/lib/__bench__/structure-preview.bench.d.ts +2 -0
  583. package/dist/lib/__bench__/structure-preview.bench.d.ts.map +1 -0
  584. package/dist/lib/__bench__/structure-preview.bench.js +72 -0
  585. package/dist/lib/__fixtures__/mezzanine.d.ts +15636 -0
  586. package/dist/lib/__fixtures__/mezzanine.d.ts.map +1 -0
  587. package/dist/lib/__fixtures__/mezzanine.js +43 -0
  588. package/dist/lib/absorb-wall-separators.d.ts +4912 -0
  589. package/dist/lib/absorb-wall-separators.d.ts.map +1 -0
  590. package/dist/lib/absorb-wall-separators.js +65 -0
  591. package/dist/lib/angle-accumulator.d.ts +3 -0
  592. package/dist/lib/angle-accumulator.d.ts.map +1 -0
  593. package/dist/lib/angle-accumulator.js +13 -0
  594. package/dist/lib/artifact-store.d.ts +31 -0
  595. package/dist/lib/artifact-store.d.ts.map +1 -0
  596. package/dist/lib/artifact-store.js +42 -0
  597. package/dist/lib/assembly-stack.d.ts +54 -0
  598. package/dist/lib/assembly-stack.d.ts.map +1 -0
  599. package/dist/lib/assembly-stack.js +52 -0
  600. package/dist/lib/asset-storage.d.ts.map +1 -1
  601. package/dist/lib/asset-storage.js +3 -0
  602. package/dist/lib/below-grade-footprints.d.ts +65 -0
  603. package/dist/lib/below-grade-footprints.d.ts.map +1 -0
  604. package/dist/lib/below-grade-footprints.js +181 -0
  605. package/dist/lib/building-footprint.d.ts +33 -0
  606. package/dist/lib/building-footprint.d.ts.map +1 -0
  607. package/dist/lib/building-footprint.js +89 -0
  608. package/dist/lib/canonical-opening-ring.d.ts +3 -0
  609. package/dist/lib/canonical-opening-ring.d.ts.map +1 -0
  610. package/dist/lib/canonical-opening-ring.js +14 -0
  611. package/dist/lib/ceiling-children.d.ts +8 -0
  612. package/dist/lib/ceiling-children.d.ts.map +1 -0
  613. package/dist/lib/ceiling-children.js +36 -0
  614. package/dist/lib/ceiling-surface.d.ts +40 -0
  615. package/dist/lib/ceiling-surface.d.ts.map +1 -0
  616. package/dist/lib/ceiling-surface.js +65 -0
  617. package/dist/lib/corner-pair.d.ts +1129 -0
  618. package/dist/lib/corner-pair.d.ts.map +1 -0
  619. package/dist/lib/corner-pair.js +130 -0
  620. package/dist/lib/corner-snap.d.ts +54 -0
  621. package/dist/lib/corner-snap.d.ts.map +1 -0
  622. package/dist/lib/corner-snap.js +125 -0
  623. package/dist/lib/critically-damped.d.ts +11 -0
  624. package/dist/lib/critically-damped.d.ts.map +1 -0
  625. package/dist/lib/critically-damped.js +14 -0
  626. package/dist/lib/cutter-host.d.ts +5 -0
  627. package/dist/lib/cutter-host.d.ts.map +1 -0
  628. package/dist/lib/cutter-host.js +30 -0
  629. package/dist/lib/deepest-drawn.d.ts +18 -0
  630. package/dist/lib/deepest-drawn.d.ts.map +1 -0
  631. package/dist/lib/deepest-drawn.js +65 -0
  632. package/dist/lib/door-operation.d.ts +1 -1
  633. package/dist/lib/exterior-wall-loops.d.ts +17 -0
  634. package/dist/lib/exterior-wall-loops.d.ts.map +1 -0
  635. package/dist/lib/exterior-wall-loops.js +334 -0
  636. package/dist/lib/finish-script.d.ts +61 -0
  637. package/dist/lib/finish-script.d.ts.map +1 -0
  638. package/dist/lib/finish-script.js +86 -0
  639. package/dist/lib/floor-construction-lift.d.ts +4 -0
  640. package/dist/lib/floor-construction-lift.d.ts.map +1 -0
  641. package/dist/lib/floor-construction-lift.js +54 -0
  642. package/dist/lib/floor-footprint-key.d.ts +3 -0
  643. package/dist/lib/floor-footprint-key.d.ts.map +1 -0
  644. package/dist/lib/floor-footprint-key.js +9 -0
  645. package/dist/lib/floor-footprint-name.d.ts +11 -0
  646. package/dist/lib/floor-footprint-name.d.ts.map +1 -0
  647. package/dist/lib/floor-footprint-name.js +52 -0
  648. package/dist/lib/floor-foundation-datum.d.ts +31 -0
  649. package/dist/lib/floor-foundation-datum.d.ts.map +1 -0
  650. package/dist/lib/floor-foundation-datum.js +226 -0
  651. package/dist/lib/floor-foundation-stack.d.ts +16 -0
  652. package/dist/lib/floor-foundation-stack.d.ts.map +1 -0
  653. package/dist/lib/floor-foundation-stack.js +214 -0
  654. package/dist/lib/floor-intent-changes.d.ts +10 -0
  655. package/dist/lib/floor-intent-changes.d.ts.map +1 -0
  656. package/dist/lib/floor-intent-changes.js +461 -0
  657. package/dist/lib/floor-opening-footprints.d.ts +24 -0
  658. package/dist/lib/floor-opening-footprints.d.ts.map +1 -0
  659. package/dist/lib/floor-opening-footprints.js +127 -0
  660. package/dist/lib/floor-opening-intent.d.ts +16 -0
  661. package/dist/lib/floor-opening-intent.d.ts.map +1 -0
  662. package/dist/lib/floor-opening-intent.js +82 -0
  663. package/dist/lib/floor-plate-id.d.ts +5 -0
  664. package/dist/lib/floor-plate-id.d.ts.map +1 -0
  665. package/dist/lib/floor-plate-id.js +20 -0
  666. package/dist/lib/floor-plate-paint.d.ts +10 -0
  667. package/dist/lib/floor-plate-paint.d.ts.map +1 -0
  668. package/dist/lib/floor-plate-paint.js +31 -0
  669. package/dist/lib/floor-plates.d.ts +211 -0
  670. package/dist/lib/floor-plates.d.ts.map +1 -0
  671. package/dist/lib/floor-plates.js +729 -0
  672. package/dist/lib/floor-room-faces.d.ts +5 -0
  673. package/dist/lib/floor-room-faces.d.ts.map +1 -0
  674. package/dist/lib/floor-room-faces.js +29 -0
  675. package/dist/lib/floor-script.d.ts +24 -0
  676. package/dist/lib/floor-script.d.ts.map +1 -0
  677. package/dist/lib/floor-script.js +51 -0
  678. package/dist/lib/floor-step-finish.d.ts +49 -0
  679. package/dist/lib/floor-step-finish.d.ts.map +1 -0
  680. package/dist/lib/floor-step-finish.js +128 -0
  681. package/dist/lib/foundation-construction.d.ts +73 -0
  682. package/dist/lib/foundation-construction.d.ts.map +1 -0
  683. package/dist/lib/foundation-construction.js +242 -0
  684. package/dist/lib/foundation-standard.d.ts +30 -0
  685. package/dist/lib/foundation-standard.d.ts.map +1 -0
  686. package/dist/lib/foundation-standard.js +30 -0
  687. package/dist/lib/foundation-wall.d.ts +36 -0
  688. package/dist/lib/foundation-wall.d.ts.map +1 -0
  689. package/dist/lib/foundation-wall.js +66 -0
  690. package/dist/lib/generic-foundation.d.ts +40 -0
  691. package/dist/lib/generic-foundation.d.ts.map +1 -0
  692. package/dist/lib/generic-foundation.js +200 -0
  693. package/dist/lib/geometry-script-node.d.ts +111 -0
  694. package/dist/lib/geometry-script-node.d.ts.map +1 -0
  695. package/dist/lib/geometry-script-node.js +173 -0
  696. package/dist/lib/geometry-surfaces.d.ts +61 -0
  697. package/dist/lib/geometry-surfaces.d.ts.map +1 -0
  698. package/dist/lib/geometry-surfaces.js +156 -0
  699. package/dist/lib/grade-standing.d.ts +38 -0
  700. package/dist/lib/grade-standing.d.ts.map +1 -0
  701. package/dist/lib/grade-standing.js +137 -0
  702. package/dist/lib/ground-level.d.ts +20 -0
  703. package/dist/lib/ground-level.d.ts.map +1 -0
  704. package/dist/lib/ground-level.js +49 -0
  705. package/dist/lib/ground-over-part.d.ts +13 -0
  706. package/dist/lib/ground-over-part.d.ts.map +1 -0
  707. package/dist/lib/ground-over-part.js +94 -0
  708. package/dist/lib/ground-seat.d.ts +47 -0
  709. package/dist/lib/ground-seat.d.ts.map +1 -0
  710. package/dist/lib/ground-seat.js +61 -0
  711. package/dist/lib/ground-window.d.ts +39 -0
  712. package/dist/lib/ground-window.d.ts.map +1 -0
  713. package/dist/lib/ground-window.js +147 -0
  714. package/dist/lib/item-slab-support.d.ts +14 -0
  715. package/dist/lib/item-slab-support.d.ts.map +1 -0
  716. package/dist/lib/item-slab-support.js +40 -0
  717. package/dist/lib/level-footprints.d.ts +23 -0
  718. package/dist/lib/level-footprints.d.ts.map +1 -0
  719. package/dist/lib/level-footprints.js +398 -0
  720. package/dist/lib/level-name.d.ts +7 -0
  721. package/dist/lib/level-name.d.ts.map +1 -1
  722. package/dist/lib/level-name.js +11 -3
  723. package/dist/lib/new-zone.d.ts +10 -0
  724. package/dist/lib/new-zone.d.ts.map +1 -0
  725. package/dist/lib/new-zone.js +10 -0
  726. package/dist/lib/node-ancestry.d.ts +30 -0
  727. package/dist/lib/node-ancestry.d.ts.map +1 -0
  728. package/dist/lib/node-ancestry.js +76 -0
  729. package/dist/lib/object-cuts.d.ts +11 -0
  730. package/dist/lib/object-cuts.d.ts.map +1 -0
  731. package/dist/lib/object-cuts.js +63 -0
  732. package/dist/lib/opening-floor-datum.d.ts +24 -0
  733. package/dist/lib/opening-floor-datum.d.ts.map +1 -0
  734. package/dist/lib/opening-floor-datum.js +144 -0
  735. package/dist/lib/own-floor-intent.d.ts +15 -0
  736. package/dist/lib/own-floor-intent.d.ts.map +1 -0
  737. package/dist/lib/own-floor-intent.js +201 -0
  738. package/dist/lib/plate-reference.d.ts +3 -0
  739. package/dist/lib/plate-reference.d.ts.map +1 -0
  740. package/dist/lib/plate-reference.js +91 -0
  741. package/dist/lib/plate-surface.d.ts +120 -0
  742. package/dist/lib/plate-surface.d.ts.map +1 -0
  743. package/dist/lib/plate-surface.js +727 -0
  744. package/dist/lib/point-ask.d.ts +9 -0
  745. package/dist/lib/point-ask.d.ts.map +1 -0
  746. package/dist/lib/point-ask.js +36 -0
  747. package/dist/lib/polygon-boolean.d.ts +17 -0
  748. package/dist/lib/polygon-boolean.d.ts.map +1 -0
  749. package/dist/lib/polygon-boolean.js +195 -0
  750. package/dist/lib/polygon-label.d.ts +7 -0
  751. package/dist/lib/polygon-label.d.ts.map +1 -0
  752. package/dist/lib/polygon-label.js +94 -0
  753. package/dist/lib/room-drawn-floor.d.ts +29 -0
  754. package/dist/lib/room-drawn-floor.d.ts.map +1 -0
  755. package/dist/lib/room-drawn-floor.js +88 -0
  756. package/dist/lib/room-floor-choices.d.ts +11 -0
  757. package/dist/lib/room-floor-choices.d.ts.map +1 -0
  758. package/dist/lib/room-floor-choices.js +60 -0
  759. package/dist/lib/room-floor-feasibility.d.ts +25 -0
  760. package/dist/lib/room-floor-feasibility.d.ts.map +1 -0
  761. package/dist/lib/room-floor-feasibility.js +293 -0
  762. package/dist/lib/room-floor-plate.d.ts +3 -0
  763. package/dist/lib/room-floor-plate.d.ts.map +1 -0
  764. package/dist/lib/room-floor-plate.js +4 -0
  765. package/dist/lib/room-graph.d.ts +79 -0
  766. package/dist/lib/room-graph.d.ts.map +1 -0
  767. package/dist/lib/room-graph.js +1267 -0
  768. package/dist/lib/room-name.d.ts +12 -0
  769. package/dist/lib/room-name.d.ts.map +1 -0
  770. package/dist/lib/room-name.js +24 -0
  771. package/dist/lib/room-topology-index.d.ts +53 -5
  772. package/dist/lib/room-topology-index.d.ts.map +1 -1
  773. package/dist/lib/room-topology-index.js +176 -30
  774. package/dist/lib/room-vertical-placement.d.ts +12 -0
  775. package/dist/lib/room-vertical-placement.d.ts.map +1 -0
  776. package/dist/lib/room-vertical-placement.js +28 -0
  777. package/dist/lib/room-zone-adoption.d.ts +74 -0
  778. package/dist/lib/room-zone-adoption.d.ts.map +1 -0
  779. package/dist/lib/room-zone-adoption.js +150 -0
  780. package/dist/lib/script-inputs-key.d.ts +3 -0
  781. package/dist/lib/script-inputs-key.d.ts.map +1 -0
  782. package/dist/lib/script-inputs-key.js +13 -0
  783. package/dist/lib/setback-envelope.d.ts +163 -0
  784. package/dist/lib/setback-envelope.d.ts.map +1 -0
  785. package/dist/lib/setback-envelope.js +822 -0
  786. package/dist/lib/site-flatwork.d.ts +11 -0
  787. package/dist/lib/site-flatwork.d.ts.map +1 -0
  788. package/dist/lib/site-flatwork.js +11 -0
  789. package/dist/lib/site-ground-height.d.ts +13 -0
  790. package/dist/lib/site-ground-height.d.ts.map +1 -0
  791. package/dist/lib/site-ground-height.js +16 -0
  792. package/dist/lib/site-placement.d.ts +362 -0
  793. package/dist/lib/site-placement.d.ts.map +1 -0
  794. package/dist/lib/site-placement.js +942 -0
  795. package/dist/lib/slab-polygon.d.ts.map +1 -1
  796. package/dist/lib/slab-polygon.js +33 -12
  797. package/dist/lib/slots.d.ts +20 -0
  798. package/dist/lib/slots.d.ts.map +1 -1
  799. package/dist/lib/slots.js +44 -0
  800. package/dist/lib/snap-ease.d.ts +20 -0
  801. package/dist/lib/snap-ease.d.ts.map +1 -0
  802. package/dist/lib/snap-ease.js +50 -0
  803. package/dist/lib/space-detection.d.ts +14 -94
  804. package/dist/lib/space-detection.d.ts.map +1 -1
  805. package/dist/lib/space-detection.js +244 -1616
  806. package/dist/lib/structure-commit.d.ts +38 -0
  807. package/dist/lib/structure-commit.d.ts.map +1 -0
  808. package/dist/lib/structure-commit.js +52 -0
  809. package/dist/lib/structure-kernel.d.ts +66 -0
  810. package/dist/lib/structure-kernel.d.ts.map +1 -0
  811. package/dist/lib/structure-kernel.js +737 -0
  812. package/dist/lib/structure-reconcile.d.ts +15 -0
  813. package/dist/lib/structure-reconcile.d.ts.map +1 -0
  814. package/dist/lib/structure-reconcile.js +218 -0
  815. package/dist/lib/surface-support-references.d.ts +4 -0
  816. package/dist/lib/surface-support-references.d.ts.map +1 -0
  817. package/dist/lib/surface-support-references.js +19 -0
  818. package/dist/lib/terrain-contours.d.ts +29 -0
  819. package/dist/lib/terrain-contours.d.ts.map +1 -0
  820. package/dist/lib/terrain-contours.js +199 -0
  821. package/dist/lib/terrain-source-persisted.d.ts +42 -0
  822. package/dist/lib/terrain-source-persisted.d.ts.map +1 -0
  823. package/dist/lib/terrain-source-persisted.js +68 -0
  824. package/dist/lib/terrain-source.d.ts +2 -40
  825. package/dist/lib/terrain-source.d.ts.map +1 -1
  826. package/dist/lib/terrain-source.js +2 -68
  827. package/dist/lib/terrain-support-query.d.ts +93 -0
  828. package/dist/lib/terrain-support-query.d.ts.map +1 -0
  829. package/dist/lib/terrain-support-query.js +187 -0
  830. package/dist/lib/terrain-support.d.ts +1 -77
  831. package/dist/lib/terrain-support.d.ts.map +1 -1
  832. package/dist/lib/terrain-support.js +3 -181
  833. package/dist/lib/unit-containment.js +2 -2
  834. package/dist/lib/unit-report.d.ts.map +1 -1
  835. package/dist/lib/unit-report.js +5 -4
  836. package/dist/lib/wall-face-script.d.ts +66 -0
  837. package/dist/lib/wall-face-script.d.ts.map +1 -0
  838. package/dist/lib/wall-face-script.js +235 -0
  839. package/dist/lib/zone-colors.d.ts +11 -0
  840. package/dist/lib/zone-colors.d.ts.map +1 -0
  841. package/dist/lib/zone-colors.js +32 -0
  842. package/dist/lib/zone-quantities.d.ts.map +1 -1
  843. package/dist/lib/zone-quantities.js +117 -228
  844. package/dist/material-kinds.d.ts +9 -0
  845. package/dist/material-kinds.d.ts.map +1 -0
  846. package/dist/material-kinds.js +30 -0
  847. package/dist/material-library.d.ts +13 -5
  848. package/dist/material-library.d.ts.map +1 -1
  849. package/dist/material-library.js +622 -27
  850. package/dist/node-slots/block.d.ts +7 -0
  851. package/dist/node-slots/block.d.ts.map +1 -0
  852. package/dist/node-slots/block.js +27 -0
  853. package/dist/node-slots/cabinet.d.ts +4 -0
  854. package/dist/node-slots/cabinet.d.ts.map +1 -0
  855. package/dist/node-slots/cabinet.js +24 -0
  856. package/dist/node-slots/ceiling.d.ts +6 -0
  857. package/dist/node-slots/ceiling.d.ts.map +1 -0
  858. package/dist/node-slots/ceiling.js +7 -0
  859. package/dist/node-slots/column.d.ts +9 -0
  860. package/dist/node-slots/column.d.ts.map +1 -0
  861. package/dist/node-slots/column.js +24 -0
  862. package/dist/node-slots/door.d.ts +9 -0
  863. package/dist/node-slots/door.d.ts.map +1 -0
  864. package/dist/node-slots/door.js +20 -0
  865. package/dist/node-slots/duct.d.ts +5 -0
  866. package/dist/node-slots/duct.d.ts.map +1 -0
  867. package/dist/node-slots/duct.js +5 -0
  868. package/dist/node-slots/elevator.d.ts +9 -0
  869. package/dist/node-slots/elevator.d.ts.map +1 -0
  870. package/dist/node-slots/elevator.js +17 -0
  871. package/dist/node-slots/fence.d.ts +10 -0
  872. package/dist/node-slots/fence.d.ts.map +1 -0
  873. package/dist/node-slots/fence.js +23 -0
  874. package/dist/node-slots/index.d.ts +26 -0
  875. package/dist/node-slots/index.d.ts.map +1 -0
  876. package/dist/node-slots/index.js +98 -0
  877. package/dist/node-slots/lean-to-extension.d.ts +5 -0
  878. package/dist/node-slots/lean-to-extension.d.ts.map +1 -0
  879. package/dist/node-slots/lean-to-extension.js +15 -0
  880. package/dist/node-slots/procedural-item.d.ts +4 -0
  881. package/dist/node-slots/procedural-item.d.ts.map +1 -0
  882. package/dist/node-slots/procedural-item.js +3 -0
  883. package/dist/node-slots/roof-accessories.d.ts +9 -0
  884. package/dist/node-slots/roof-accessories.d.ts.map +1 -0
  885. package/dist/node-slots/roof-accessories.js +34 -0
  886. package/dist/node-slots/roof.d.ts +5 -0
  887. package/dist/node-slots/roof.d.ts.map +1 -0
  888. package/dist/node-slots/roof.js +12 -0
  889. package/dist/node-slots/shelf.d.ts +9 -0
  890. package/dist/node-slots/shelf.d.ts.map +1 -0
  891. package/dist/node-slots/shelf.js +30 -0
  892. package/dist/node-slots/slab.d.ts +7 -0
  893. package/dist/node-slots/slab.d.ts.map +1 -0
  894. package/dist/node-slots/slab.js +21 -0
  895. package/dist/node-slots/stair.d.ts +10 -0
  896. package/dist/node-slots/stair.d.ts.map +1 -0
  897. package/dist/node-slots/stair.js +21 -0
  898. package/dist/node-slots/wall.d.ts +12 -0
  899. package/dist/node-slots/wall.d.ts.map +1 -0
  900. package/dist/node-slots/wall.js +55 -0
  901. package/dist/node-slots/window.d.ts +5 -0
  902. package/dist/node-slots/window.d.ts.map +1 -0
  903. package/dist/node-slots/window.js +11 -0
  904. package/dist/procedural-items/design-placement.d.ts +49 -0
  905. package/dist/procedural-items/design-placement.d.ts.map +1 -0
  906. package/dist/procedural-items/design-placement.js +129 -0
  907. package/dist/procedural-items/design.d.ts +261 -0
  908. package/dist/procedural-items/design.d.ts.map +1 -0
  909. package/dist/procedural-items/design.js +707 -0
  910. package/dist/procedural-items/fixtures.d.ts +515 -75
  911. package/dist/procedural-items/fixtures.d.ts.map +1 -1
  912. package/dist/procedural-items/index.d.ts +5 -0
  913. package/dist/procedural-items/index.d.ts.map +1 -1
  914. package/dist/procedural-items/index.js +5 -0
  915. package/dist/procedural-items/integration.d.ts +156 -35
  916. package/dist/procedural-items/integration.d.ts.map +1 -1
  917. package/dist/procedural-items/joints.d.ts +56 -0
  918. package/dist/procedural-items/joints.d.ts.map +1 -0
  919. package/dist/procedural-items/joints.js +251 -0
  920. package/dist/procedural-items/library-colors.d.ts +34 -22
  921. package/dist/procedural-items/library-colors.d.ts.map +1 -1
  922. package/dist/procedural-items/library-colors.js +37 -3
  923. package/dist/procedural-items/motion-controller.d.ts +29 -0
  924. package/dist/procedural-items/motion-controller.d.ts.map +1 -0
  925. package/dist/procedural-items/motion-controller.js +130 -0
  926. package/dist/procedural-items/node.d.ts +528 -62
  927. package/dist/procedural-items/node.d.ts.map +1 -1
  928. package/dist/procedural-items/query.d.ts +19 -2
  929. package/dist/procedural-items/query.d.ts.map +1 -1
  930. package/dist/procedural-items/query.js +78 -39
  931. package/dist/procedural-items/recipe.d.ts +260 -16
  932. package/dist/procedural-items/recipe.d.ts.map +1 -1
  933. package/dist/procedural-items/recipe.js +933 -61
  934. package/dist/procedural-items/section.d.ts +27 -0
  935. package/dist/procedural-items/section.d.ts.map +1 -0
  936. package/dist/procedural-items/section.js +237 -0
  937. package/dist/procedural-items/spatial.d.ts +21 -0
  938. package/dist/procedural-items/spatial.d.ts.map +1 -1
  939. package/dist/procedural-items/spatial.js +90 -0
  940. package/dist/registry/handles.d.ts +2 -0
  941. package/dist/registry/handles.d.ts.map +1 -1
  942. package/dist/registry/index.d.ts +6 -4
  943. package/dist/registry/index.d.ts.map +1 -1
  944. package/dist/registry/index.js +4 -2
  945. package/dist/registry/mechanism.d.ts +9 -0
  946. package/dist/registry/mechanism.d.ts.map +1 -0
  947. package/dist/registry/mechanism.js +21 -0
  948. package/dist/registry/registry.d.ts +6 -3
  949. package/dist/registry/registry.d.ts.map +1 -1
  950. package/dist/registry/registry.js +59 -22
  951. package/dist/registry/scene-api.d.ts +21 -0
  952. package/dist/registry/scene-api.d.ts.map +1 -1
  953. package/dist/registry/scene-api.js +29 -13
  954. package/dist/registry/subtree.d.ts +8 -0
  955. package/dist/registry/subtree.d.ts.map +1 -1
  956. package/dist/registry/subtree.js +55 -0
  957. package/dist/registry/types.d.ts +460 -12
  958. package/dist/registry/types.d.ts.map +1 -1
  959. package/dist/schema/__fixtures__/node-fixtures.d.ts.map +1 -1
  960. package/dist/schema/__fixtures__/node-fixtures.js +2 -0
  961. package/dist/schema/assembly.d.ts +153 -0
  962. package/dist/schema/assembly.d.ts.map +1 -0
  963. package/dist/schema/assembly.js +155 -0
  964. package/dist/schema/asset-url.d.ts +2 -1
  965. package/dist/schema/asset-url.d.ts.map +1 -1
  966. package/dist/schema/asset-url.js +5 -2
  967. package/dist/schema/base.d.ts +28 -2
  968. package/dist/schema/base.d.ts.map +1 -1
  969. package/dist/schema/base.js +2 -0
  970. package/dist/schema/camera.d.ts +1 -1
  971. package/dist/schema/collection-templates.d.ts +46 -0
  972. package/dist/schema/collection-templates.d.ts.map +1 -0
  973. package/dist/schema/collection-templates.js +14 -0
  974. package/dist/schema/collections.d.ts +7 -0
  975. package/dist/schema/collections.d.ts.map +1 -1
  976. package/dist/schema/cut.d.ts +29 -0
  977. package/dist/schema/cut.d.ts.map +1 -0
  978. package/dist/schema/cut.js +50 -0
  979. package/dist/schema/geometry-metadata.d.ts +51 -0
  980. package/dist/schema/geometry-metadata.d.ts.map +1 -0
  981. package/dist/schema/geometry-metadata.js +57 -0
  982. package/dist/schema/geometry-source.d.ts +260 -0
  983. package/dist/schema/geometry-source.d.ts.map +1 -0
  984. package/dist/schema/geometry-source.js +144 -0
  985. package/dist/schema/index.d.ts +27 -12
  986. package/dist/schema/index.d.ts.map +1 -1
  987. package/dist/schema/index.js +29 -10
  988. package/dist/schema/material.d.ts +33 -33
  989. package/dist/schema/nodes/barrel-roof.d.ts +3 -0
  990. package/dist/schema/nodes/barrel-roof.d.ts.map +1 -0
  991. package/dist/schema/nodes/barrel-roof.js +11 -0
  992. package/dist/schema/nodes/block.d.ts +27 -1
  993. package/dist/schema/nodes/block.d.ts.map +1 -1
  994. package/dist/schema/nodes/block.js +1 -1
  995. package/dist/schema/nodes/box-vent.d.ts +32 -6
  996. package/dist/schema/nodes/box-vent.d.ts.map +1 -1
  997. package/dist/schema/nodes/building.d.ts +28 -1
  998. package/dist/schema/nodes/building.d.ts.map +1 -1
  999. package/dist/schema/nodes/building.js +2 -0
  1000. package/dist/schema/nodes/cabinet.d.ts +167 -114
  1001. package/dist/schema/nodes/cabinet.d.ts.map +1 -1
  1002. package/dist/schema/nodes/cabinet.js +1 -1
  1003. package/dist/schema/nodes/ceiling.d.ts +44 -7
  1004. package/dist/schema/nodes/ceiling.d.ts.map +1 -1
  1005. package/dist/schema/nodes/ceiling.js +8 -0
  1006. package/dist/schema/nodes/chimney.d.ts +42 -16
  1007. package/dist/schema/nodes/chimney.d.ts.map +1 -1
  1008. package/dist/schema/nodes/column.d.ts +321 -187
  1009. package/dist/schema/nodes/column.d.ts.map +1 -1
  1010. package/dist/schema/nodes/column.js +4 -0
  1011. package/dist/schema/nodes/construction-dimension.d.ts +53 -27
  1012. package/dist/schema/nodes/construction-dimension.d.ts.map +1 -1
  1013. package/dist/schema/nodes/cupola.d.ts +34 -8
  1014. package/dist/schema/nodes/cupola.d.ts.map +1 -1
  1015. package/dist/schema/nodes/curtain-wall.d.ts +21 -20
  1016. package/dist/schema/nodes/curtain-wall.d.ts.map +1 -1
  1017. package/dist/schema/nodes/curtain-wall.js +23 -0
  1018. package/dist/schema/nodes/door.d.ts +170 -44
  1019. package/dist/schema/nodes/door.d.ts.map +1 -1
  1020. package/dist/schema/nodes/door.js +37 -33
  1021. package/dist/schema/nodes/dormer.d.ts +56 -29
  1022. package/dist/schema/nodes/dormer.d.ts.map +1 -1
  1023. package/dist/schema/nodes/downspout.d.ts +36 -10
  1024. package/dist/schema/nodes/downspout.d.ts.map +1 -1
  1025. package/dist/schema/nodes/duct-fitting.d.ts +44 -18
  1026. package/dist/schema/nodes/duct-fitting.d.ts.map +1 -1
  1027. package/dist/schema/nodes/duct-segment.d.ts +34 -8
  1028. package/dist/schema/nodes/duct-segment.d.ts.map +1 -1
  1029. package/dist/schema/nodes/duct-terminal.d.ts +31 -5
  1030. package/dist/schema/nodes/duct-terminal.d.ts.map +1 -1
  1031. package/dist/schema/nodes/elevator.d.ts +34 -8
  1032. package/dist/schema/nodes/elevator.d.ts.map +1 -1
  1033. package/dist/schema/nodes/eyebrow-vent.d.ts +32 -6
  1034. package/dist/schema/nodes/eyebrow-vent.d.ts.map +1 -1
  1035. package/dist/schema/nodes/fence-feature.d.ts +141 -0
  1036. package/dist/schema/nodes/fence-feature.d.ts.map +1 -0
  1037. package/dist/schema/nodes/fence-feature.js +21 -0
  1038. package/dist/schema/nodes/fence-types.d.ts +32 -0
  1039. package/dist/schema/nodes/fence-types.d.ts.map +1 -0
  1040. package/dist/schema/nodes/fence-types.js +22 -0
  1041. package/dist/schema/nodes/fence.d.ts +175 -18
  1042. package/dist/schema/nodes/fence.d.ts.map +1 -1
  1043. package/dist/schema/nodes/fence.js +76 -7
  1044. package/dist/schema/nodes/floor-opening.d.ts +61 -0
  1045. package/dist/schema/nodes/floor-opening.d.ts.map +1 -0
  1046. package/dist/schema/nodes/floor-opening.js +17 -0
  1047. package/dist/schema/nodes/guide.d.ts +27 -1
  1048. package/dist/schema/nodes/guide.d.ts.map +1 -1
  1049. package/dist/schema/nodes/gutter.d.ts +33 -7
  1050. package/dist/schema/nodes/gutter.d.ts.map +1 -1
  1051. package/dist/schema/nodes/gutter.js +6 -5
  1052. package/dist/schema/nodes/hvac-equipment.d.ts +32 -6
  1053. package/dist/schema/nodes/hvac-equipment.d.ts.map +1 -1
  1054. package/dist/schema/nodes/imported-mesh.d.ts +27 -1
  1055. package/dist/schema/nodes/imported-mesh.d.ts.map +1 -1
  1056. package/dist/schema/nodes/item.d.ts +169 -13
  1057. package/dist/schema/nodes/item.d.ts.map +1 -1
  1058. package/dist/schema/nodes/item.js +13 -0
  1059. package/dist/schema/nodes/lean-to-extension.d.ts +55 -29
  1060. package/dist/schema/nodes/lean-to-extension.d.ts.map +1 -1
  1061. package/dist/schema/nodes/level.d.ts +28 -2
  1062. package/dist/schema/nodes/level.d.ts.map +1 -1
  1063. package/dist/schema/nodes/lineset.d.ts +27 -1
  1064. package/dist/schema/nodes/lineset.d.ts.map +1 -1
  1065. package/dist/schema/nodes/liquid-line.d.ts +27 -1
  1066. package/dist/schema/nodes/liquid-line.d.ts.map +1 -1
  1067. package/dist/schema/nodes/measurement.d.ts +27 -1
  1068. package/dist/schema/nodes/measurement.d.ts.map +1 -1
  1069. package/dist/schema/nodes/opening-types.d.ts +41 -0
  1070. package/dist/schema/nodes/opening-types.d.ts.map +1 -0
  1071. package/dist/schema/nodes/opening-types.js +48 -0
  1072. package/dist/schema/nodes/pipe-fitting.d.ts +34 -8
  1073. package/dist/schema/nodes/pipe-fitting.d.ts.map +1 -1
  1074. package/dist/schema/nodes/pipe-segment.d.ts +30 -4
  1075. package/dist/schema/nodes/pipe-segment.d.ts.map +1 -1
  1076. package/dist/schema/nodes/pipe-trap.d.ts +28 -2
  1077. package/dist/schema/nodes/pipe-trap.d.ts.map +1 -1
  1078. package/dist/schema/nodes/ridge-vent.d.ts +33 -7
  1079. package/dist/schema/nodes/ridge-vent.d.ts.map +1 -1
  1080. package/dist/schema/nodes/ridge-vent.js +3 -1
  1081. package/dist/schema/nodes/roof-glazing-config.d.ts +90 -0
  1082. package/dist/schema/nodes/roof-glazing-config.d.ts.map +1 -0
  1083. package/dist/schema/nodes/roof-glazing-config.js +34 -0
  1084. package/dist/schema/nodes/roof-glazing.d.ts +57 -0
  1085. package/dist/schema/nodes/roof-glazing.d.ts.map +1 -0
  1086. package/dist/schema/nodes/roof-glazing.js +514 -0
  1087. package/dist/schema/nodes/roof-segment-resize.d.ts +4 -0
  1088. package/dist/schema/nodes/roof-segment-resize.d.ts.map +1 -0
  1089. package/dist/schema/nodes/roof-segment-resize.js +21 -0
  1090. package/dist/schema/nodes/roof-segment-shape.d.ts +5 -0
  1091. package/dist/schema/nodes/roof-segment-shape.d.ts.map +1 -1
  1092. package/dist/schema/nodes/roof-segment-shape.js +44 -0
  1093. package/dist/schema/nodes/roof-segment-walls.d.ts +1 -1
  1094. package/dist/schema/nodes/roof-segment-walls.d.ts.map +1 -1
  1095. package/dist/schema/nodes/roof-segment-walls.js +26 -1
  1096. package/dist/schema/nodes/roof-segment.d.ts +175 -40
  1097. package/dist/schema/nodes/roof-segment.d.ts.map +1 -1
  1098. package/dist/schema/nodes/roof-segment.js +100 -20
  1099. package/dist/schema/nodes/roof-types.d.ts +14 -0
  1100. package/dist/schema/nodes/roof-types.d.ts.map +1 -0
  1101. package/dist/schema/nodes/roof-types.js +14 -0
  1102. package/dist/schema/nodes/roof.d.ts +122 -21
  1103. package/dist/schema/nodes/roof.d.ts.map +1 -1
  1104. package/dist/schema/nodes/roof.js +6 -0
  1105. package/dist/schema/nodes/scan.d.ts +27 -1
  1106. package/dist/schema/nodes/scan.d.ts.map +1 -1
  1107. package/dist/schema/nodes/separator.d.ts +50 -0
  1108. package/dist/schema/nodes/separator.d.ts.map +1 -0
  1109. package/dist/schema/nodes/separator.js +8 -0
  1110. package/dist/schema/nodes/shelf.d.ts +35 -9
  1111. package/dist/schema/nodes/shelf.d.ts.map +1 -1
  1112. package/dist/schema/nodes/site-facts.d.ts +64 -0
  1113. package/dist/schema/nodes/site-facts.d.ts.map +1 -0
  1114. package/dist/schema/nodes/site-facts.js +73 -0
  1115. package/dist/schema/nodes/site.d.ts +235 -1
  1116. package/dist/schema/nodes/site.d.ts.map +1 -1
  1117. package/dist/schema/nodes/site.js +115 -1
  1118. package/dist/schema/nodes/skylight.d.ts +64 -38
  1119. package/dist/schema/nodes/skylight.d.ts.map +1 -1
  1120. package/dist/schema/nodes/slab.d.ts +91 -7
  1121. package/dist/schema/nodes/slab.d.ts.map +1 -1
  1122. package/dist/schema/nodes/slab.js +37 -2
  1123. package/dist/schema/nodes/solar-panel.d.ts +40 -14
  1124. package/dist/schema/nodes/solar-panel.d.ts.map +1 -1
  1125. package/dist/schema/nodes/spawn.d.ts +27 -1
  1126. package/dist/schema/nodes/spawn.d.ts.map +1 -1
  1127. package/dist/schema/nodes/stair-construction.d.ts +21 -0
  1128. package/dist/schema/nodes/stair-construction.d.ts.map +1 -0
  1129. package/dist/schema/nodes/stair-construction.js +13 -0
  1130. package/dist/schema/nodes/stair-defaults.d.ts +16 -0
  1131. package/dist/schema/nodes/stair-defaults.d.ts.map +1 -0
  1132. package/dist/schema/nodes/stair-defaults.js +15 -0
  1133. package/dist/schema/nodes/stair-design-targets.d.ts +9 -0
  1134. package/dist/schema/nodes/stair-design-targets.d.ts.map +1 -0
  1135. package/dist/schema/nodes/stair-design-targets.js +7 -0
  1136. package/dist/schema/nodes/stair-segment.d.ts +78 -10
  1137. package/dist/schema/nodes/stair-segment.d.ts.map +1 -1
  1138. package/dist/schema/nodes/stair-segment.js +13 -0
  1139. package/dist/schema/nodes/stair-types.d.ts +29 -0
  1140. package/dist/schema/nodes/stair-types.d.ts.map +1 -0
  1141. package/dist/schema/nodes/stair-types.js +23 -0
  1142. package/dist/schema/nodes/stair.d.ts +131 -38
  1143. package/dist/schema/nodes/stair.d.ts.map +1 -1
  1144. package/dist/schema/nodes/stair.js +46 -3
  1145. package/dist/schema/nodes/structural-grid.d.ts +27 -1
  1146. package/dist/schema/nodes/structural-grid.d.ts.map +1 -1
  1147. package/dist/schema/nodes/surface-hole-metadata.d.ts +4 -1
  1148. package/dist/schema/nodes/surface-hole-metadata.d.ts.map +1 -1
  1149. package/dist/schema/nodes/surface-hole-metadata.js +2 -1
  1150. package/dist/schema/nodes/surface-paint-region.d.ts +14 -0
  1151. package/dist/schema/nodes/surface-paint-region.d.ts.map +1 -0
  1152. package/dist/schema/nodes/surface-paint-region.js +12 -0
  1153. package/dist/schema/nodes/turbine-vent.d.ts +32 -6
  1154. package/dist/schema/nodes/turbine-vent.d.ts.map +1 -1
  1155. package/dist/schema/nodes/unit.d.ts +29 -3
  1156. package/dist/schema/nodes/unit.d.ts.map +1 -1
  1157. package/dist/schema/nodes/wall.d.ts +771 -147
  1158. package/dist/schema/nodes/wall.d.ts.map +1 -1
  1159. package/dist/schema/nodes/wall.js +204 -186
  1160. package/dist/schema/nodes/window.d.ts +173 -38
  1161. package/dist/schema/nodes/window.d.ts.map +1 -1
  1162. package/dist/schema/nodes/window.js +22 -14
  1163. package/dist/schema/nodes/zone.d.ts +291 -4
  1164. package/dist/schema/nodes/zone.d.ts.map +1 -1
  1165. package/dist/schema/nodes/zone.js +56 -0
  1166. package/dist/schema/provenance.d.ts +118 -0
  1167. package/dist/schema/provenance.d.ts.map +1 -0
  1168. package/dist/schema/provenance.js +76 -0
  1169. package/dist/schema/scene-material.d.ts +5 -5
  1170. package/dist/schema/site-presentation.d.ts +100 -0
  1171. package/dist/schema/site-presentation.d.ts.map +1 -0
  1172. package/dist/schema/site-presentation.js +83 -0
  1173. package/dist/schema/source-ref.d.ts +23 -0
  1174. package/dist/schema/source-ref.d.ts.map +1 -0
  1175. package/dist/schema/source-ref.js +29 -0
  1176. package/dist/schema/types.d.ts +4442 -653
  1177. package/dist/schema/types.d.ts.map +1 -1
  1178. package/dist/schema/types.js +7 -0
  1179. package/dist/services/__fixtures__/wall-plane-top-boundary-repro.d.ts.map +1 -1
  1180. package/dist/services/alignment-anchors.d.ts +2 -1
  1181. package/dist/services/alignment-anchors.d.ts.map +1 -1
  1182. package/dist/services/alignment-anchors.js +9 -6
  1183. package/dist/services/index.d.ts +5 -1
  1184. package/dist/services/index.d.ts.map +1 -1
  1185. package/dist/services/index.js +5 -1
  1186. package/dist/services/level-height.d.ts.map +1 -1
  1187. package/dist/services/level-height.js +10 -4
  1188. package/dist/services/port-connectivity.d.ts +4 -0
  1189. package/dist/services/port-connectivity.d.ts.map +1 -1
  1190. package/dist/services/port-connectivity.js +35 -0
  1191. package/dist/services/project-file-sink.d.ts +9 -0
  1192. package/dist/services/project-file-sink.d.ts.map +1 -0
  1193. package/dist/services/project-file-sink.js +13 -0
  1194. package/dist/services/roof-bearing.d.ts +62 -0
  1195. package/dist/services/roof-bearing.d.ts.map +1 -0
  1196. package/dist/services/roof-bearing.js +234 -0
  1197. package/dist/services/roof-level.d.ts +121 -0
  1198. package/dist/services/roof-level.d.ts.map +1 -0
  1199. package/dist/services/roof-level.js +280 -0
  1200. package/dist/services/roof-move.d.ts +83 -0
  1201. package/dist/services/roof-move.d.ts.map +1 -0
  1202. package/dist/services/roof-move.js +316 -0
  1203. package/dist/services/stair-surface-snap.d.ts +14 -0
  1204. package/dist/services/stair-surface-snap.d.ts.map +1 -0
  1205. package/dist/services/stair-surface-snap.js +116 -0
  1206. package/dist/services/storey-datum.d.ts +12 -0
  1207. package/dist/services/storey-datum.d.ts.map +1 -0
  1208. package/dist/services/storey-datum.js +18 -0
  1209. package/dist/services/storey.d.ts +72 -6
  1210. package/dist/services/storey.d.ts.map +1 -1
  1211. package/dist/services/storey.js +215 -12
  1212. package/dist/services/surface-hosting.d.ts.map +1 -1
  1213. package/dist/services/surface-hosting.js +4 -1
  1214. package/dist/solar-panel-presets.d.ts +2 -2
  1215. package/dist/store/actions/node-actions.d.ts +4994 -8
  1216. package/dist/store/actions/node-actions.d.ts.map +1 -1
  1217. package/dist/store/actions/node-actions.js +541 -175
  1218. package/dist/store/derived-node-guard.d.ts +84 -0
  1219. package/dist/store/derived-node-guard.d.ts.map +1 -0
  1220. package/dist/store/derived-node-guard.js +586 -0
  1221. package/dist/store/history-control.d.ts +73 -0
  1222. package/dist/store/history-control.d.ts.map +1 -1
  1223. package/dist/store/history-control.js +183 -5
  1224. package/dist/store/history-drafts.d.ts +48 -0
  1225. package/dist/store/history-drafts.d.ts.map +1 -0
  1226. package/dist/store/history-drafts.js +403 -0
  1227. package/dist/store/history-invalidation.d.ts.map +1 -1
  1228. package/dist/store/history-invalidation.js +1 -0
  1229. package/dist/store/item-interaction.d.ts +28 -0
  1230. package/dist/store/item-interaction.d.ts.map +1 -0
  1231. package/dist/store/item-interaction.js +34 -0
  1232. package/dist/store/registered-node-defaults.d.ts +11 -0
  1233. package/dist/store/registered-node-defaults.d.ts.map +1 -0
  1234. package/dist/store/registered-node-defaults.js +25 -0
  1235. package/dist/store/scene-annotations.d.ts +9827 -0
  1236. package/dist/store/scene-annotations.d.ts.map +1 -0
  1237. package/dist/store/scene-annotations.js +107 -0
  1238. package/dist/store/scene-preview.d.ts +16 -0
  1239. package/dist/store/scene-preview.d.ts.map +1 -0
  1240. package/dist/store/scene-preview.js +144 -0
  1241. package/dist/store/use-interactive.d.ts +23 -1
  1242. package/dist/store/use-interactive.d.ts.map +1 -1
  1243. package/dist/store/use-interactive.js +128 -5
  1244. package/dist/store/use-live-node-overrides.d.ts.map +1 -1
  1245. package/dist/store/use-live-terrain.d.ts.map +1 -1
  1246. package/dist/store/use-live-transforms.d.ts.map +1 -1
  1247. package/dist/store/use-scene.d.ts +68 -12
  1248. package/dist/store/use-scene.d.ts.map +1 -1
  1249. package/dist/store/use-scene.js +452 -308
  1250. package/dist/systems/elevator/elevator-dispatch.js +1 -1
  1251. package/dist/systems/elevator/elevator-opening-sync.d.ts.map +1 -1
  1252. package/dist/systems/elevator/elevator-opening-sync.js +4 -6
  1253. package/dist/systems/elevator/elevator-opening-system.d.ts.map +1 -1
  1254. package/dist/systems/elevator/elevator-opening-system.js +12 -6
  1255. package/dist/systems/elevator/elevator-service.d.ts.map +1 -1
  1256. package/dist/systems/elevator/elevator-service.js +8 -3
  1257. package/dist/systems/fence/fence-centerline.d.ts.map +1 -1
  1258. package/dist/systems/fence/fence-centerline.js +6 -5
  1259. package/dist/systems/fence/fence-features.d.ts +36 -0
  1260. package/dist/systems/fence/fence-features.d.ts.map +1 -0
  1261. package/dist/systems/fence/fence-features.js +105 -0
  1262. package/dist/systems/fence/fence-spline.d.ts +8 -5
  1263. package/dist/systems/fence/fence-spline.d.ts.map +1 -1
  1264. package/dist/systems/fence/fence-spline.js +51 -16
  1265. package/dist/systems/owned-floor-openings.d.ts +9 -0
  1266. package/dist/systems/owned-floor-openings.d.ts.map +1 -0
  1267. package/dist/systems/owned-floor-openings.js +347 -0
  1268. package/dist/systems/reconcile-owned-floor-openings.d.ts +3 -0
  1269. package/dist/systems/reconcile-owned-floor-openings.d.ts.map +1 -0
  1270. package/dist/systems/reconcile-owned-floor-openings.js +25 -0
  1271. package/dist/systems/roof/roof-elevation-system.d.ts.map +1 -1
  1272. package/dist/systems/roof/roof-elevation-system.js +9 -3
  1273. package/dist/systems/roof/roof-elevation.d.ts +5 -0
  1274. package/dist/systems/roof/roof-elevation.d.ts.map +1 -1
  1275. package/dist/systems/roof/roof-elevation.js +91 -62
  1276. package/dist/systems/slab/__fixtures__/doorway-steps.d.ts +8 -0
  1277. package/dist/systems/slab/__fixtures__/doorway-steps.d.ts.map +1 -0
  1278. package/dist/systems/slab/__fixtures__/doorway-steps.js +62 -0
  1279. package/dist/systems/slab/__fixtures__/floor-step.d.ts +6743 -0
  1280. package/dist/systems/slab/__fixtures__/floor-step.d.ts.map +1 -0
  1281. package/dist/systems/slab/__fixtures__/floor-step.js +66 -0
  1282. package/dist/systems/slab/__fixtures__/raised-room.d.ts +6848 -0
  1283. package/dist/systems/slab/__fixtures__/raised-room.d.ts.map +1 -0
  1284. package/dist/systems/slab/__fixtures__/raised-room.js +54 -0
  1285. package/dist/systems/slab/ensure-slab-openings.d.ts +9 -0
  1286. package/dist/systems/slab/ensure-slab-openings.d.ts.map +1 -0
  1287. package/dist/systems/slab/ensure-slab-openings.js +41 -0
  1288. package/dist/systems/slab/slab-support.d.ts +30 -8
  1289. package/dist/systems/slab/slab-support.d.ts.map +1 -1
  1290. package/dist/systems/slab/slab-support.js +547 -62
  1291. package/dist/systems/stair/stair-base-elevation.d.ts +3 -0
  1292. package/dist/systems/stair/stair-base-elevation.d.ts.map +1 -0
  1293. package/dist/systems/stair/stair-base-elevation.js +49 -0
  1294. package/dist/systems/stair/stair-clearance.d.ts +39 -0
  1295. package/dist/systems/stair/stair-clearance.d.ts.map +1 -0
  1296. package/dist/systems/stair/stair-clearance.js +508 -0
  1297. package/dist/systems/stair/stair-construction.d.ts +37 -0
  1298. package/dist/systems/stair/stair-construction.d.ts.map +1 -0
  1299. package/dist/systems/stair/stair-construction.js +314 -0
  1300. package/dist/systems/stair/stair-detail-budget.d.ts +13 -0
  1301. package/dist/systems/stair/stair-detail-budget.d.ts.map +1 -0
  1302. package/dist/systems/stair/stair-detail-budget.js +64 -0
  1303. package/dist/systems/stair/stair-flight.d.ts +2 -2
  1304. package/dist/systems/stair/stair-flight.d.ts.map +1 -1
  1305. package/dist/systems/stair/stair-flight.js +4 -3
  1306. package/dist/systems/stair/stair-floor-footprints.d.ts +7 -0
  1307. package/dist/systems/stair/stair-floor-footprints.d.ts.map +1 -0
  1308. package/dist/systems/stair/stair-floor-footprints.js +113 -0
  1309. package/dist/systems/stair/stair-footprint.d.ts +9 -1
  1310. package/dist/systems/stair/stair-footprint.d.ts.map +1 -1
  1311. package/dist/systems/stair/stair-footprint.js +123 -57
  1312. package/dist/systems/stair/stair-layout.d.ts +39 -0
  1313. package/dist/systems/stair/stair-layout.d.ts.map +1 -0
  1314. package/dist/systems/stair/stair-layout.js +58 -0
  1315. package/dist/systems/stair/stair-opening-preview.d.ts +4022 -2061
  1316. package/dist/systems/stair/stair-opening-preview.d.ts.map +1 -1
  1317. package/dist/systems/stair/stair-opening-sync.d.ts +8 -2
  1318. package/dist/systems/stair/stair-opening-sync.d.ts.map +1 -1
  1319. package/dist/systems/stair/stair-opening-sync.js +136 -315
  1320. package/dist/systems/stair/stair-opening-system.d.ts.map +1 -1
  1321. package/dist/systems/stair/stair-opening-system.js +40 -8
  1322. package/dist/systems/stair/stair-presets.d.ts +284 -0
  1323. package/dist/systems/stair/stair-presets.d.ts.map +1 -0
  1324. package/dist/systems/stair/stair-presets.js +158 -0
  1325. package/dist/systems/stair/stair-rail-budget.d.ts +6 -0
  1326. package/dist/systems/stair/stair-rail-budget.d.ts.map +1 -0
  1327. package/dist/systems/stair/stair-rail-budget.js +36 -0
  1328. package/dist/systems/stair/stair-rail-path.d.ts +22 -0
  1329. package/dist/systems/stair/stair-rail-path.d.ts.map +1 -0
  1330. package/dist/systems/stair/stair-rail-path.js +497 -0
  1331. package/dist/systems/stair/stair-rise-edit.d.ts +9 -0
  1332. package/dist/systems/stair/stair-rise-edit.d.ts.map +1 -0
  1333. package/dist/systems/stair/stair-rise-edit.js +46 -0
  1334. package/dist/systems/stair/stair-rise-query.d.ts +40 -0
  1335. package/dist/systems/stair/stair-rise-query.d.ts.map +1 -0
  1336. package/dist/systems/stair/stair-rise-query.js +175 -0
  1337. package/dist/systems/stair/stair-rise.d.ts +4 -19
  1338. package/dist/systems/stair/stair-rise.d.ts.map +1 -1
  1339. package/dist/systems/stair/stair-rise.js +8 -71
  1340. package/dist/systems/stair/stair-sizing.d.ts +416 -0
  1341. package/dist/systems/stair/stair-sizing.d.ts.map +1 -0
  1342. package/dist/systems/stair/stair-sizing.js +255 -0
  1343. package/dist/systems/stair/stair-sweep-edit.d.ts +7 -0
  1344. package/dist/systems/stair/stair-sweep-edit.d.ts.map +1 -0
  1345. package/dist/systems/stair/stair-sweep-edit.js +8 -0
  1346. package/dist/systems/stair/stair-walking-line.d.ts +5 -0
  1347. package/dist/systems/stair/stair-walking-line.d.ts.map +1 -0
  1348. package/dist/systems/stair/stair-walking-line.js +91 -0
  1349. package/dist/systems/stair/stair-winder.d.ts +36 -0
  1350. package/dist/systems/stair/stair-winder.d.ts.map +1 -0
  1351. package/dist/systems/stair/stair-winder.js +173 -0
  1352. package/dist/systems/wall/wall-assembly.d.ts +245 -0
  1353. package/dist/systems/wall/wall-assembly.d.ts.map +1 -0
  1354. package/dist/systems/wall/wall-assembly.js +875 -0
  1355. package/dist/systems/wall/wall-curve.d.ts +7 -1
  1356. package/dist/systems/wall/wall-curve.d.ts.map +1 -1
  1357. package/dist/systems/wall/wall-curve.js +34 -5
  1358. package/dist/systems/wall/wall-finish.d.ts +102 -0
  1359. package/dist/systems/wall/wall-finish.d.ts.map +1 -0
  1360. package/dist/systems/wall/wall-finish.js +264 -0
  1361. package/dist/systems/wall/wall-footprint.d.ts +3 -0
  1362. package/dist/systems/wall/wall-footprint.d.ts.map +1 -1
  1363. package/dist/systems/wall/wall-footprint.js +15 -13
  1364. package/dist/systems/wall/wall-frame.d.ts +45 -0
  1365. package/dist/systems/wall/wall-frame.d.ts.map +1 -0
  1366. package/dist/systems/wall/wall-frame.js +170 -0
  1367. package/dist/systems/wall/wall-layer-bands.d.ts +38 -0
  1368. package/dist/systems/wall/wall-layer-bands.d.ts.map +1 -0
  1369. package/dist/systems/wall/wall-layer-bands.js +109 -0
  1370. package/dist/systems/wall/wall-merge.d.ts +20 -1
  1371. package/dist/systems/wall/wall-merge.d.ts.map +1 -1
  1372. package/dist/systems/wall/wall-merge.js +189 -18
  1373. package/dist/systems/wall/wall-mitering.d.ts +6 -5
  1374. package/dist/systems/wall/wall-mitering.d.ts.map +1 -1
  1375. package/dist/systems/wall/wall-mitering.js +70 -20
  1376. package/dist/systems/wall/wall-operations.d.ts +1 -1
  1377. package/dist/systems/wall/wall-operations.d.ts.map +1 -1
  1378. package/dist/systems/wall/wall-operations.js +2 -1
  1379. package/dist/systems/wall/wall-paint-plan.d.ts +30 -0
  1380. package/dist/systems/wall/wall-paint-plan.d.ts.map +1 -0
  1381. package/dist/systems/wall/wall-paint-plan.js +167 -0
  1382. package/dist/systems/wall/wall-room-sides.d.ts +14 -0
  1383. package/dist/systems/wall/wall-room-sides.d.ts.map +1 -0
  1384. package/dist/systems/wall/wall-room-sides.js +67 -0
  1385. package/dist/systems/wall/wall-step-openings.d.ts +17 -0
  1386. package/dist/systems/wall/wall-step-openings.d.ts.map +1 -0
  1387. package/dist/systems/wall/wall-step-openings.js +32 -0
  1388. package/dist/systems/wall/wall-top.d.ts +7 -8
  1389. package/dist/systems/wall/wall-top.d.ts.map +1 -1
  1390. package/dist/systems/wall/wall-top.js +15 -13
  1391. package/dist/systems/wall/wall-topology.d.ts +25 -0
  1392. package/dist/systems/wall/wall-topology.d.ts.map +1 -1
  1393. package/dist/systems/wall/wall-topology.js +408 -5
  1394. package/dist/systems/wall/wall-trim.d.ts +7 -0
  1395. package/dist/systems/wall/wall-trim.d.ts.map +1 -0
  1396. package/dist/systems/wall/wall-trim.js +10 -0
  1397. package/dist/utils/clone-scene-graph.d.ts +6 -0
  1398. package/dist/utils/clone-scene-graph.d.ts.map +1 -1
  1399. package/dist/utils/clone-scene-graph.js +131 -15
  1400. package/dist/utils/ensure-scene-openings.d.ts +9823 -0
  1401. package/dist/utils/ensure-scene-openings.d.ts.map +1 -0
  1402. package/dist/utils/ensure-scene-openings.js +29 -0
  1403. package/dist/utils/exterior-threshold-migration.d.ts +4 -0
  1404. package/dist/utils/exterior-threshold-migration.d.ts.map +1 -0
  1405. package/dist/utils/exterior-threshold-migration.js +114 -0
  1406. package/dist/utils/floor-follow-migration.d.ts +3 -0
  1407. package/dist/utils/floor-follow-migration.d.ts.map +1 -0
  1408. package/dist/utils/floor-follow-migration.js +29 -0
  1409. package/dist/utils/floor-opening-migration.d.ts +13 -0
  1410. package/dist/utils/floor-opening-migration.d.ts.map +1 -0
  1411. package/dist/utils/floor-opening-migration.js +148 -0
  1412. package/dist/utils/floor-piece-adoption.d.ts +50 -0
  1413. package/dist/utils/floor-piece-adoption.d.ts.map +1 -0
  1414. package/dist/utils/floor-piece-adoption.js +182 -0
  1415. package/dist/utils/floor-plate-migration.d.ts +4936 -0
  1416. package/dist/utils/floor-plate-migration.d.ts.map +1 -0
  1417. package/dist/utils/floor-plate-migration.js +1360 -0
  1418. package/dist/utils/heal-plan-coordinates.d.ts +2 -0
  1419. package/dist/utils/heal-plan-coordinates.d.ts.map +1 -0
  1420. package/dist/utils/heal-plan-coordinates.js +69 -0
  1421. package/dist/utils/heal-scene-graph.d.ts +32 -6
  1422. package/dist/utils/heal-scene-graph.d.ts.map +1 -1
  1423. package/dist/utils/heal-scene-graph.js +78 -16
  1424. package/dist/utils/legacy-material-slots.d.ts +23 -0
  1425. package/dist/utils/legacy-material-slots.d.ts.map +1 -0
  1426. package/dist/utils/legacy-material-slots.js +120 -0
  1427. package/dist/utils/legacy-opening-datums.d.ts +11 -0
  1428. package/dist/utils/legacy-opening-datums.d.ts.map +1 -0
  1429. package/dist/utils/legacy-opening-datums.js +92 -0
  1430. package/dist/utils/legacy-wall-datums.d.ts +6 -0
  1431. package/dist/utils/legacy-wall-datums.d.ts.map +1 -0
  1432. package/dist/utils/legacy-wall-datums.js +199 -0
  1433. package/dist/utils/load-migration.d.ts +28 -0
  1434. package/dist/utils/load-migration.d.ts.map +1 -0
  1435. package/dist/utils/load-migration.js +89 -0
  1436. package/dist/utils/node-defaults.d.ts +37 -0
  1437. package/dist/utils/node-defaults.d.ts.map +1 -0
  1438. package/dist/utils/node-defaults.js +96 -0
  1439. package/dist/utils/normalize-legacy-structure.d.ts +2 -0
  1440. package/dist/utils/normalize-legacy-structure.d.ts.map +1 -0
  1441. package/dist/utils/normalize-legacy-structure.js +61 -0
  1442. package/dist/utils/omit-undefined.d.ts +2 -0
  1443. package/dist/utils/omit-undefined.d.ts.map +1 -0
  1444. package/dist/utils/omit-undefined.js +17 -0
  1445. package/dist/utils/owned-floor-opening-migration.d.ts +4918 -0
  1446. package/dist/utils/owned-floor-opening-migration.d.ts.map +1 -0
  1447. package/dist/utils/owned-floor-opening-migration.js +365 -0
  1448. package/dist/utils/reconcile-structure-on-load.d.ts +4918 -0
  1449. package/dist/utils/reconcile-structure-on-load.d.ts.map +1 -0
  1450. package/dist/utils/reconcile-structure-on-load.js +307 -0
  1451. package/dist/utils/room-zone-migration.d.ts +18 -0
  1452. package/dist/utils/room-zone-migration.d.ts.map +1 -0
  1453. package/dist/utils/room-zone-migration.js +258 -0
  1454. package/dist/utils/scene-migrations.d.ts +16 -1
  1455. package/dist/utils/scene-migrations.d.ts.map +1 -1
  1456. package/dist/utils/scene-migrations.js +15 -1
  1457. package/dist/utils/semantic-equal.d.ts +3 -0
  1458. package/dist/utils/semantic-equal.d.ts.map +1 -0
  1459. package/dist/utils/semantic-equal.js +26 -0
  1460. package/dist/utils/structure-id.d.ts +4 -0
  1461. package/dist/utils/structure-id.d.ts.map +1 -0
  1462. package/dist/utils/structure-id.js +115 -0
  1463. package/dist/utils/types.d.ts.map +1 -1
  1464. package/dist/utils/vertical-scene-migration.d.ts +8 -8
  1465. package/dist/utils/vertical-scene-migration.d.ts.map +1 -1
  1466. package/dist/utils/vertical-scene-migration.js +18 -8
  1467. package/dist/utils/wall-assembly-migration.d.ts +14 -0
  1468. package/dist/utils/wall-assembly-migration.d.ts.map +1 -0
  1469. package/dist/utils/wall-assembly-migration.js +23 -0
  1470. package/dist/utils/wall-face-migration.d.ts +23 -0
  1471. package/dist/utils/wall-face-migration.d.ts.map +1 -0
  1472. package/dist/utils/wall-face-migration.js +246 -0
  1473. package/dist/validation/opening-bounds.d.ts +36 -0
  1474. package/dist/validation/opening-bounds.d.ts.map +1 -0
  1475. package/dist/validation/opening-bounds.js +34 -0
  1476. package/dist/validation/validate-build-json.d.ts +2 -0
  1477. package/dist/validation/validate-build-json.d.ts.map +1 -1
  1478. package/dist/validation/validate-build-json.js +36 -1
  1479. package/package.json +69 -10
  1480. package/dist/services/surface-hosting-procedural-parity.fixtures.d.ts +0 -13
  1481. package/dist/services/surface-hosting-procedural-parity.fixtures.d.ts.map +0 -1
  1482. package/dist/services/surface-hosting-procedural-parity.fixtures.js +0 -4691
  1483. package/dist/services/surface-hosting-shelf-parity.fixtures.d.ts +0 -1060
  1484. package/dist/services/surface-hosting-shelf-parity.fixtures.d.ts.map +0 -1
  1485. package/dist/services/surface-hosting-shelf-parity.fixtures.js +0 -3127
@@ -0,0 +1,1267 @@
1
+ import { getWallArcData, getWallCurveFrameAt, isCurvedWall } from '../systems/wall/wall-curve.js';
2
+ import { getWallBodyCenterOffset, getWallFaceOffsets } from '../systems/wall/wall-frame.js';
3
+ import { area, difference, intersection, union } from './polygon-boolean.js';
4
+ const ROOM_CURVE_TOLERANCE = 0.04;
5
+ const MAX_CURVE_SUBDIVISION_DEPTH = 6;
6
+ export const WALL_JUNCTION_TOLERANCE = 0.08;
7
+ export function pointFromTuple(point) {
8
+ return { x: point[0], y: point[1] };
9
+ }
10
+ export function pointToTuple(point) {
11
+ return [point.x, point.y];
12
+ }
13
+ function pointKey(point) {
14
+ return `${point.x.toFixed(3)},${point.y.toFixed(3)}`;
15
+ }
16
+ export function polygonArea(points) {
17
+ let area = 0;
18
+ for (let i = 0; i < points.length; i++) {
19
+ const a = points[i];
20
+ const b = points[(i + 1) % points.length];
21
+ if (!(a && b))
22
+ continue;
23
+ area += a.x * b.y - b.x * a.y;
24
+ }
25
+ return area / 2;
26
+ }
27
+ function minRotationSignature(keys) {
28
+ if (keys.length === 0)
29
+ return '';
30
+ let best = '';
31
+ for (let i = 0; i < keys.length; i++) {
32
+ const rotated = [...keys.slice(i), ...keys.slice(0, i)];
33
+ const value = rotated.join('|');
34
+ if (!best || value < best)
35
+ best = value;
36
+ }
37
+ return best;
38
+ }
39
+ export function polygonSignature(points) {
40
+ const keys = points.map(pointKey);
41
+ const forward = minRotationSignature(keys);
42
+ const reversed = minRotationSignature([...keys].reverse());
43
+ // biome-ignore lint/complexity/useMathMinMax: lexicographic string comparison
44
+ return forward < reversed ? forward : reversed;
45
+ }
46
+ function samePointWithinTolerance(a, b, tolerance = 1e-4) {
47
+ return Math.hypot(a.x - b.x, a.y - b.y) <= tolerance;
48
+ }
49
+ export function dedupeSequentialPoints(points, tolerance = 1e-4) {
50
+ const deduped = [];
51
+ for (const point of points) {
52
+ const previous = deduped[deduped.length - 1];
53
+ if (previous && samePointWithinTolerance(previous, point, tolerance)) {
54
+ continue;
55
+ }
56
+ deduped.push(point);
57
+ }
58
+ const firstPoint = deduped[0];
59
+ const lastPoint = deduped[deduped.length - 1];
60
+ if (deduped.length > 2 &&
61
+ firstPoint &&
62
+ lastPoint &&
63
+ samePointWithinTolerance(firstPoint, lastPoint, tolerance)) {
64
+ deduped.pop();
65
+ }
66
+ return deduped;
67
+ }
68
+ export function bboxOf(points) {
69
+ let minX = Number.POSITIVE_INFINITY;
70
+ let minY = Number.POSITIVE_INFINITY;
71
+ let maxX = Number.NEGATIVE_INFINITY;
72
+ let maxY = Number.NEGATIVE_INFINITY;
73
+ for (const point of points) {
74
+ minX = Math.min(minX, point.x);
75
+ minY = Math.min(minY, point.y);
76
+ maxX = Math.max(maxX, point.x);
77
+ maxY = Math.max(maxY, point.y);
78
+ }
79
+ return { minX, minY, maxX, maxY };
80
+ }
81
+ function pointLineDistance(point, start, end) {
82
+ const dx = end.x - start.x;
83
+ const dy = end.y - start.y;
84
+ const lengthSquared = dx * dx + dy * dy;
85
+ if (lengthSquared < 1e-9) {
86
+ return Math.hypot(point.x - start.x, point.y - start.y);
87
+ }
88
+ const cross = (point.x - start.x) * dy - (point.y - start.y) * dx;
89
+ return Math.abs(cross) / Math.sqrt(lengthSquared);
90
+ }
91
+ export function sampleWallPointsForRoomDetection(wall, tolerance = ROOM_CURVE_TOLERANCE) {
92
+ const start = { x: wall.start[0], y: wall.start[1] };
93
+ const end = { x: wall.end[0], y: wall.end[1] };
94
+ if (!isCurvedWall(wall)) {
95
+ return [start, end];
96
+ }
97
+ const subdivide = (t0, p0, t1, p1, depth) => {
98
+ const midT = (t0 + t1) / 2;
99
+ const midPoint = getWallCurveFrameAt(wall, midT).point;
100
+ const deviation = pointLineDistance(midPoint, p0, p1);
101
+ if (depth >= MAX_CURVE_SUBDIVISION_DEPTH || deviation <= tolerance) {
102
+ return [p0, p1];
103
+ }
104
+ const left = subdivide(t0, p0, midT, midPoint, depth + 1);
105
+ const right = subdivide(midT, midPoint, t1, p1, depth + 1);
106
+ return [...left.slice(0, -1), ...right];
107
+ };
108
+ return subdivide(0, start, 1, end, 0);
109
+ }
110
+ function segmentProjection(point, start, end) {
111
+ const dx = end.x - start.x;
112
+ const dy = end.y - start.y;
113
+ const lengthSquared = dx * dx + dy * dy;
114
+ if (lengthSquared < 1e-12) {
115
+ return { t: 0, distance: Math.hypot(point.x - start.x, point.y - start.y) };
116
+ }
117
+ const t = ((point.x - start.x) * dx + (point.y - start.y) * dy) / lengthSquared;
118
+ const clampedT = Math.max(0, Math.min(1, t));
119
+ const projX = start.x + clampedT * dx;
120
+ const projY = start.y + clampedT * dy;
121
+ return { t, distance: Math.hypot(point.x - projX, point.y - projY) };
122
+ }
123
+ // Break a straight wall at any junction vertex (another wall's endpoint) that
124
+ // lands on its interior, returning the ordered polyline [start, …splits, end].
125
+ // Splitting at the *vertex* position (not the projection) keeps the split node's
126
+ // key identical to the touching wall's endpoint so the two share a graph node.
127
+ function splitStraightWallAtVertices(start, end, vertices, separator = false) {
128
+ const length = Math.hypot(end.x - start.x, end.y - start.y);
129
+ if (length < 1e-9)
130
+ return [start, end];
131
+ const interior = [];
132
+ for (const vertex of vertices) {
133
+ // Separators have authored/snapped coordinates; proximity must not pull an
134
+ // island into a nearby wall or bend another segment of a multi-point path.
135
+ const tolerance = separator || !vertex.wallEndpoint ? 1e-6 : WALL_JUNCTION_TOLERANCE;
136
+ const { t, distance } = segmentProjection(vertex, start, end);
137
+ if (distance > tolerance)
138
+ continue;
139
+ const along = t * length;
140
+ if (along <= tolerance || along >= length - tolerance)
141
+ continue;
142
+ interior.push({ point: { x: vertex.x, y: vertex.y }, t });
143
+ }
144
+ interior.sort((a, b) => a.t - b.t);
145
+ const ordered = [start];
146
+ let lastKey = pointKey(start);
147
+ for (const { point } of interior) {
148
+ const key = pointKey(point);
149
+ if (key === lastKey)
150
+ continue;
151
+ ordered.push(point);
152
+ lastKey = key;
153
+ }
154
+ if (lastKey !== pointKey(end))
155
+ ordered.push(end);
156
+ return ordered;
157
+ }
158
+ function splitCurvedWallAtVertices(points, vertices, wall) {
159
+ const arc = getWallArcData(wall);
160
+ const stations = [0];
161
+ for (let i = 1; i < points.length; i++) {
162
+ stations.push(stations[i - 1] +
163
+ Math.hypot(points[i].x - points[i - 1].x, points[i].y - points[i - 1].y));
164
+ }
165
+ const length = stations.at(-1);
166
+ const cuts = [
167
+ { point: points[0], station: 0 },
168
+ { point: points.at(-1), station: length },
169
+ ];
170
+ for (const vertex of vertices) {
171
+ // Divide snaps to 64 chord samples; allow their sagitta, not the wall-junction radius.
172
+ const separatorTolerance = arc ? arc.radius * (1 - Math.cos(arc.delta / 128)) + 1e-6 : 1e-6;
173
+ if (!vertex.wallEndpoint &&
174
+ arc &&
175
+ Math.abs(Math.hypot(vertex.x - arc.center.x, vertex.y - arc.center.y) - arc.radius) >
176
+ separatorTolerance)
177
+ continue;
178
+ const endpointTolerance = vertex.wallEndpoint ? WALL_JUNCTION_TOLERANCE : 1e-6;
179
+ let best = { distance: Number.POSITIVE_INFINITY, station: 0 };
180
+ for (let i = 0; i < points.length - 1; i++) {
181
+ const { t, distance } = segmentProjection(vertex, points[i], points[i + 1]);
182
+ if (distance >= best.distance)
183
+ continue;
184
+ best = {
185
+ distance,
186
+ station: stations[i] + Math.max(0, Math.min(1, t)) * (stations[i + 1] - stations[i]),
187
+ };
188
+ }
189
+ if (best.distance > WALL_JUNCTION_TOLERANCE ||
190
+ best.station <= endpointTolerance ||
191
+ best.station >= length - endpointTolerance)
192
+ continue;
193
+ cuts.push({ point: { x: vertex.x, y: vertex.y }, station: best.station });
194
+ }
195
+ cuts.sort((a, b) => a.station - b.station);
196
+ return cuts.slice(0, -1).flatMap((cut, i) => {
197
+ const next = cuts[i + 1];
198
+ if (pointKey(cut.point) === pointKey(next.point))
199
+ return [];
200
+ return [
201
+ dedupeSequentialPoints([
202
+ cut.point,
203
+ ...points.filter((_, j) => stations[j] > cut.station + 1e-8 && stations[j] < next.station - 1e-8),
204
+ next.point,
205
+ ]),
206
+ ];
207
+ });
208
+ }
209
+ // Reference half-edges determine connectivity; body lines keep room geometry invariant
210
+ // when a reference moves beneath an unchanged wall body.
211
+ function roomBodyPolygon(edges) {
212
+ const shifted = edges.map(({ wall, points }) => {
213
+ const offset = wall.type === 'wall' ? getWallBodyCenterOffset(wall) : 0;
214
+ const arc = getWallArcData(wall);
215
+ const frame = getWallCurveFrameAt(wall, 0);
216
+ return points.map((point) => {
217
+ if (offset === 0)
218
+ return point;
219
+ if (arc) {
220
+ const scale = (arc.radius - arc.direction * offset) / arc.radius;
221
+ return {
222
+ x: arc.center.x + (point.x - arc.center.x) * scale,
223
+ y: arc.center.y + (point.y - arc.center.y) * scale,
224
+ };
225
+ }
226
+ return { x: point.x + frame.normal.x * offset, y: point.y + frame.normal.y * offset };
227
+ });
228
+ });
229
+ const result = [];
230
+ for (let i = 0; i < shifted.length; i++) {
231
+ const previous = shifted[(i + shifted.length - 1) % shifted.length];
232
+ const current = shifted[i];
233
+ const a = previous[previous.length - 2];
234
+ const b = previous[previous.length - 1];
235
+ const c = current[0];
236
+ const d = current[1];
237
+ const dx = b.x - a.x, dy = b.y - a.y;
238
+ const ex = d.x - c.x, ey = d.y - c.y;
239
+ const denominator = dx * ey - dy * ex;
240
+ if (Math.abs(denominator) < 1e-9) {
241
+ result.push(b, c);
242
+ }
243
+ else {
244
+ const t = ((c.x - a.x) * ey - (c.y - a.y) * ex) / denominator;
245
+ const intersection = { x: a.x + t * dx, y: a.y + t * dy };
246
+ const limit = 10 *
247
+ Math.max(Math.abs(boundaryBodyOffset(edges[i].wall)), Math.abs(boundaryBodyOffset(edges[(i + edges.length - 1) % edges.length].wall)), 1e-6);
248
+ if (Math.hypot(intersection.x - b.x, intersection.y - b.y) <= limit &&
249
+ Math.hypot(intersection.x - c.x, intersection.y - c.y) <= limit)
250
+ result.push(intersection);
251
+ else
252
+ result.push(b, c);
253
+ }
254
+ result.push(...current.slice(1, -1));
255
+ }
256
+ return dedupeSequentialPoints(result);
257
+ }
258
+ function boundaryBodyOffset(boundary) {
259
+ return boundary.type === 'wall' ? getWallBodyCenterOffset(boundary) : 0;
260
+ }
261
+ /** Largest visible gap between two wall bodies that still reads as a joint. */
262
+ const JOINT_GAP = 0.015;
263
+ /** Farthest a wall end may sit off another wall's reference line and still join its body. */
264
+ export const TEE_REACH = 0.4;
265
+ /**
266
+ * How far apart two boundaries' reference lines may be where they still join: the
267
+ * junction tolerance, or, for walls, as far as their drawn bodies can touch.
268
+ */
269
+ export function junctionReach(a, b) {
270
+ if (a.type !== 'wall' || b.type !== 'wall')
271
+ return WALL_JUNCTION_TOLERANCE;
272
+ // Metre-thick "walls" are blocks or slabs drawn with the wall tool, not joints.
273
+ if (Math.max(a.thickness ?? 0.1, b.thickness ?? 0.1) > 2 * TEE_REACH)
274
+ return WALL_JUNCTION_TOLERANCE;
275
+ return Math.max(WALL_JUNCTION_TOLERANCE, Math.min(TEE_REACH, Math.max(a.thickness ?? 0.1, b.thickness ?? 0.1) / 2 + JOINT_GAP));
276
+ }
277
+ const GRID_CELL = 1;
278
+ const MAX_GRID_CELLS = 256;
279
+ function sampleBoundary(boundary) {
280
+ const points = sampleWallPointsForRoomDetection(boundary);
281
+ const stations = [0];
282
+ for (let i = 1; i < points.length; i++)
283
+ stations.push(stations[i - 1] +
284
+ Math.hypot(points[i].x - points[i - 1].x, points[i].y - points[i - 1].y));
285
+ return { boundary, points, stations, length: stations.at(-1), box: bboxOf(points) };
286
+ }
287
+ function gridKeys(box, margin) {
288
+ const minX = Math.floor((box.minX - margin) / GRID_CELL);
289
+ const maxX = Math.floor((box.maxX + margin) / GRID_CELL);
290
+ const minY = Math.floor((box.minY - margin) / GRID_CELL);
291
+ const maxY = Math.floor((box.maxY + margin) / GRID_CELL);
292
+ if (![minX, maxX, minY, maxY].every(Number.isSafeInteger) ||
293
+ (maxX - minX + 1) * (maxY - minY + 1) > MAX_GRID_CELLS)
294
+ return null;
295
+ const keys = [];
296
+ for (let x = minX; x <= maxX; x++)
297
+ for (let y = minY; y <= maxY; y++)
298
+ keys.push(`${x},${y}`);
299
+ return keys;
300
+ }
301
+ /** Items near a box, bounded by a uniform grid; huge or extreme boxes fall back to a scan. */
302
+ function spatialIndex(items, boxOf) {
303
+ const cells = new Map();
304
+ const wide = [];
305
+ for (const item of items) {
306
+ const keys = gridKeys(boxOf(item), 0);
307
+ if (!keys) {
308
+ wide.push(item);
309
+ continue;
310
+ }
311
+ for (const key of keys) {
312
+ const cell = cells.get(key);
313
+ if (cell)
314
+ cell.push(item);
315
+ else
316
+ cells.set(key, [item]);
317
+ }
318
+ }
319
+ return (box, margin) => {
320
+ const keys = gridKeys(box, margin);
321
+ if (!keys)
322
+ return items;
323
+ const found = new Set(wide);
324
+ for (const key of keys)
325
+ for (const item of cells.get(key) ?? [])
326
+ found.add(item);
327
+ return found;
328
+ };
329
+ }
330
+ function pointBox(point) {
331
+ return { minX: point.x, minY: point.y, maxX: point.x, maxY: point.y };
332
+ }
333
+ function joinsBoundaryInterior(point, sampled) {
334
+ const tolerance = sampled.boundary.type === 'separator' ? 1e-6 : WALL_JUNCTION_TOLERANCE;
335
+ const { points, stations, length } = sampled;
336
+ for (let i = 0; i < points.length - 1; i++) {
337
+ const { t, distance } = segmentProjection(point, points[i], points[i + 1]);
338
+ const along = stations[i] + Math.max(0, Math.min(1, t)) * (stations[i + 1] - stations[i]);
339
+ if (distance <= tolerance && along > tolerance && along < length - tolerance)
340
+ return true;
341
+ }
342
+ return false;
343
+ }
344
+ function sampledCrossings(left, right) {
345
+ const margin = WALL_JUNCTION_TOLERANCE;
346
+ const crossings = [];
347
+ for (let i = 0; i < left.points.length - 1; i++) {
348
+ const p = left.points[i];
349
+ const r = { x: left.points[i + 1].x - p.x, y: left.points[i + 1].y - p.y };
350
+ for (let j = 0; j < right.points.length - 1; j++) {
351
+ const q = right.points[j];
352
+ const u = { x: right.points[j + 1].x - q.x, y: right.points[j + 1].y - q.y };
353
+ const denominator = r.x * u.y - r.y * u.x;
354
+ if (Math.abs(denominator) <= 1e-12)
355
+ continue;
356
+ const t = ((q.x - p.x) * u.y - (q.y - p.y) * u.x) / denominator;
357
+ const v = ((q.x - p.x) * r.y - (q.y - p.y) * r.x) / denominator;
358
+ if (t < 0 || t > 1 || v < 0 || v > 1)
359
+ continue;
360
+ const along = left.stations[i] + t * (left.stations[i + 1] - left.stations[i]);
361
+ const otherAlong = right.stations[j] + v * (right.stations[j + 1] - right.stations[j]);
362
+ if (along > margin &&
363
+ along < left.length - margin &&
364
+ otherAlong > margin &&
365
+ otherAlong < right.length - margin)
366
+ crossings.push({
367
+ point: { x: p.x + t * r.x, y: p.y + t * r.y },
368
+ along,
369
+ otherAlong,
370
+ sine: Math.abs(denominator) / (Math.hypot(r.x, r.y) * Math.hypot(u.x, u.y)),
371
+ });
372
+ }
373
+ }
374
+ return crossings;
375
+ }
376
+ function sampledCross(left, right) {
377
+ return sampledCrossings(left, right).length > 0;
378
+ }
379
+ /**
380
+ * Crossings where a wall end runs a short way past another wall: the stub past the crossing
381
+ * must end free, so a wall passing through another near its corner stays a plain crossing.
382
+ */
383
+ function overshootCrossings(left, right, free) {
384
+ if (left.boundary.type !== 'wall' ||
385
+ right.boundary.type !== 'wall' ||
386
+ isCurvedWall(left.boundary) ||
387
+ isCurvedWall(right.boundary) ||
388
+ Math.max(left.boundary.thickness ?? 0.1, right.boundary.thickness ?? 0.1) > 0.8)
389
+ return [];
390
+ const overshoots = (sampled, along) => (along <= TEE_REACH && free(sampled.points[0])) ||
391
+ (sampled.length - along <= TEE_REACH && free(sampled.points.at(-1)));
392
+ return sampledCrossings(left, right).filter(({ along, otherAlong, sine }) => sine >= Math.SQRT1_2 && (overshoots(left, along) || overshoots(right, otherAlong)));
393
+ }
394
+ /**
395
+ * True when two boundaries cross away from their ends (sample vertices included).
396
+ * Room detection and the incremental topology index share this predicate.
397
+ */
398
+ export function boundariesCross(a, b) {
399
+ return sampledCross(sampleBoundary(a), sampleBoundary(b));
400
+ }
401
+ /** The wall body as drawn: one quad per sampled segment, between its two faces. */
402
+ function bodyOf(sampled) {
403
+ if (sampled.body)
404
+ return sampled.body;
405
+ const wall = sampled.boundary;
406
+ const { a, b } = wall.type === 'wall' ? getWallFaceOffsets(wall) : { a: 0, b: 0 };
407
+ sampled.body = sampled.points.slice(0, -1).flatMap((p, i) => {
408
+ const q = sampled.points[i + 1];
409
+ const length = Math.hypot(q.x - p.x, q.y - p.y);
410
+ if (!(length > 1e-9))
411
+ return [];
412
+ const n = { x: -(q.y - p.y) / length, y: (q.x - p.x) / length };
413
+ return [
414
+ [
415
+ { x: p.x + n.x * a, y: p.y + n.y * a },
416
+ { x: q.x + n.x * a, y: q.y + n.y * a },
417
+ { x: q.x + n.x * b, y: q.y + n.y * b },
418
+ { x: p.x + n.x * b, y: p.y + n.y * b },
419
+ ],
420
+ ];
421
+ });
422
+ return sampled.body;
423
+ }
424
+ function insideQuad(point, quad) {
425
+ let inside = false;
426
+ for (let i = 0, j = quad.length - 1; i < quad.length; j = i++) {
427
+ const a = quad[i];
428
+ const b = quad[j];
429
+ if (a.y > point.y !== b.y > point.y &&
430
+ point.x < ((b.x - a.x) * (point.y - a.y)) / (b.y - a.y) + a.x)
431
+ inside = !inside;
432
+ }
433
+ return inside;
434
+ }
435
+ function quadGap(left, right) {
436
+ if (left.some((p) => insideQuad(p, right)) || right.some((p) => insideQuad(p, left)))
437
+ return 0;
438
+ let gap = Number.POSITIVE_INFINITY;
439
+ for (const [points, other] of [
440
+ [left, right],
441
+ [right, left],
442
+ ])
443
+ for (const p of points)
444
+ for (let i = 0; i < other.length; i++)
445
+ gap = Math.min(gap, segmentProjection(p, other[i], other[(i + 1) % other.length]).distance);
446
+ return gap;
447
+ }
448
+ /** What the user sees: the two drawn wall bodies touch, or nearly, at the joint. */
449
+ function bodyGap(left, right, near, minimumReach = 0) {
450
+ if (left.boundary.type !== 'wall' || right.boundary.type !== 'wall')
451
+ return Infinity;
452
+ const reach = Math.max(minimumReach, WALL_JUNCTION_TOLERANCE +
453
+ Math.max(left.boundary.thickness ?? 0.1, right.boundary.thickness ?? 0.1));
454
+ // Only the stretch of each body around the joint counts, never a touch elsewhere.
455
+ const local = (sampled) => bodyOf(sampled).filter((quad) => {
456
+ const box = bboxOf(quad);
457
+ return (near.x >= box.minX - reach &&
458
+ near.x <= box.maxX + reach &&
459
+ near.y >= box.minY - reach &&
460
+ near.y <= box.maxY + reach);
461
+ });
462
+ const rightQuads = local(right);
463
+ return Math.min(...local(left).flatMap((quad) => rightQuads.map((other) => quadGap(quad, other))));
464
+ }
465
+ function bodiesTouch(left, right, near) {
466
+ return bodyGap(left, right, near) <= JOINT_GAP;
467
+ }
468
+ function halfBody(sampled) {
469
+ return sampled.boundary.type === 'wall' ? (sampled.boundary.thickness ?? 0.1) / 2 : 0;
470
+ }
471
+ /** Unit direction a wall arrives at one of its ends. */
472
+ function endDirection(sampled, end) {
473
+ const { points } = sampled;
474
+ const atStart = pointKey(points[0]) === pointKey(end);
475
+ const [from, to] = atStart ? [points[1], points[0]] : [points.at(-2), points.at(-1)];
476
+ const length = Math.hypot(to.x - from.x, to.y - from.y) || 1;
477
+ return { x: (to.x - from.x) / length, y: (to.y - from.y) / length };
478
+ }
479
+ /** Nearest point of a wall's reference line to `point`, if it lies away from its ends. */
480
+ function interiorFoot(point, sampled) {
481
+ const { points, stations, length } = sampled;
482
+ let best;
483
+ for (let i = 0; i < points.length - 1; i++) {
484
+ const a = points[i];
485
+ const b = points[i + 1];
486
+ const segment = stations[i + 1] - stations[i];
487
+ if (!(segment > 1e-9))
488
+ continue;
489
+ const { t, distance } = segmentProjection(point, a, b);
490
+ const clamped = Math.max(0, Math.min(1, t));
491
+ const along = stations[i] + clamped * segment;
492
+ if (along <= WALL_JUNCTION_TOLERANCE || along >= length - WALL_JUNCTION_TOLERANCE)
493
+ continue;
494
+ if (best && distance >= best.distance)
495
+ continue;
496
+ best = {
497
+ point: { x: a.x + clamped * (b.x - a.x), y: a.y + clamped * (b.y - a.y) },
498
+ distance,
499
+ direction: { x: (b.x - a.x) / segment, y: (b.y - a.y) / segment },
500
+ };
501
+ }
502
+ return best;
503
+ }
504
+ /** Where a straight wall's line meets another straight wall's reference line between its ends. */
505
+ function ownAxisMeet(sampled, other) {
506
+ if (isCurvedWall(sampled.boundary) || isCurvedWall(other.boundary))
507
+ return;
508
+ const [p, p2] = sampled.points;
509
+ const [q, q2] = other.points;
510
+ const r = { x: p2.x - p.x, y: p2.y - p.y };
511
+ const u = { x: q2.x - q.x, y: q2.y - q.y };
512
+ const denominator = r.x * u.y - r.y * u.x;
513
+ if (Math.abs(denominator) < 1e-12)
514
+ return;
515
+ const along = ((q.x - p.x) * r.y - (q.y - p.y) * r.x) / denominator;
516
+ if (!(along > 0 && along < 1))
517
+ return;
518
+ const t = ((q.x - p.x) * u.y - (q.y - p.y) * u.x) / denominator;
519
+ return { x: p.x + t * r.x, y: p.y + t * r.y };
520
+ }
521
+ /** Where two loose straight wall ends would meet if both ran on to their corner. */
522
+ function cornerOf(cluster, byId, reachOf) {
523
+ if (cluster.length !== 2)
524
+ return;
525
+ const [a, b] = cluster.map((group) => byId.get([...group.boundaryIds][0])?.boundary);
526
+ if (!(a && b) || isCurvedWall(a) || isCurvedWall(b))
527
+ return;
528
+ const r = { x: a.end[0] - a.start[0], y: a.end[1] - a.start[1] };
529
+ const u = { x: b.end[0] - b.start[0], y: b.end[1] - b.start[1] };
530
+ const denominator = r.x * u.y - r.y * u.x;
531
+ // Only a real corner: walls nearly in line meet where their ends already are.
532
+ if (Math.abs(denominator) < 0.5 * Math.hypot(r.x, r.y) * Math.hypot(u.x, u.y))
533
+ return;
534
+ const t = ((b.start[0] - a.start[0]) * u.y - (b.start[1] - a.start[1]) * u.x) / denominator;
535
+ const corner = { x: a.start[0] + t * r.x, y: a.start[1] + t * r.y };
536
+ const reach = reachOf(a, b);
537
+ return cluster.every(({ point }) => Math.hypot(point.x - corner.x, point.y - corner.y) <= reach)
538
+ ? corner
539
+ : undefined;
540
+ }
541
+ /** Distance from a wall end touching this wall's body within the tolerance of its end at `corner`. */
542
+ function bodyReach(point, corner, sampled, reach = WALL_JUNCTION_TOLERANCE) {
543
+ if (sampled.boundary.type !== 'wall')
544
+ return Number.POSITIVE_INFINITY;
545
+ const { points } = sampled;
546
+ const atStart = pointKey(points[0]) === pointKey(corner.point);
547
+ const [a, b] = atStart ? [points[0], points[1]] : [points.at(-1), points.at(-2)];
548
+ const length = Math.hypot(b.x - a.x, b.y - a.y);
549
+ // A stub is reached through its ends only.
550
+ if (!(length > 2 * reach))
551
+ return Number.POSITIVE_INFINITY;
552
+ const along = ((point.x - a.x) * (b.x - a.x) + (point.y - a.y) * (b.y - a.y)) / length;
553
+ if (along < 0 || along > reach)
554
+ return Number.POSITIVE_INFINITY;
555
+ return Math.abs((point.x - a.x) * (b.y - a.y) - (point.y - a.y) * (b.x - a.x)) / length;
556
+ }
557
+ /**
558
+ * Walls drawn a few centimetres short of a corner read as joined when their drawn
559
+ * bodies touch there. A wall end that meets no other boundary joins the nearest
560
+ * boundary end within the junction tolerance, or a wall body that close to its end,
561
+ * whose drawn body touches its own (a visible gap, however small the walls, stays
562
+ * open). Returns exact endpoint keys mapped to their junction point. A junction only
563
+ * involves walls that touch within the tolerance, so incremental topology rebuilds of
564
+ * one component elect the same point as full ones.
565
+ */
566
+ function nearMissJunctions(boundaries, bodyJoints, diagnostics) {
567
+ const reachOf = (a, b) => bodyJoints ? junctionReach(a, b) : WALL_JUNCTION_TOLERANCE;
568
+ const sampled = boundaries.map(sampleBoundary);
569
+ const byId = new Map(sampled.map((item) => [item.boundary.id, item]));
570
+ const near = spatialIndex(sampled, (item) => item.box);
571
+ const groups = new Map();
572
+ for (const boundary of boundaries)
573
+ for (const tuple of [boundary.start, boundary.end]) {
574
+ const point = pointFromTuple(tuple);
575
+ const key = pointKey(point);
576
+ const group = groups.get(key) ?? { key, point, boundaryIds: new Set(), state: 'joined' };
577
+ group.boundaryIds.add(boundary.id);
578
+ groups.set(key, group);
579
+ }
580
+ const ordered = [...groups.values()].sort((a, b) => (a.key < b.key ? -1 : a.key > b.key ? 1 : 0));
581
+ const nearGroups = spatialIndex(ordered, (group) => pointBox(group.point));
582
+ const crossing = new Map();
583
+ const looseEnd = (end) => groups.get(pointKey(end))?.state === 'loose';
584
+ // The graph is planar only at junctions; connecting a wall that crosses another
585
+ // would close faces through the crossing.
586
+ const crosses = (wall) => {
587
+ let value = crossing.get(wall.boundary.id);
588
+ if (value === undefined) {
589
+ value = false;
590
+ for (const other of near(wall.box, 0))
591
+ if (other !== wall &&
592
+ sampledCrossings(wall, other).length >
593
+ (bodyJoints ? overshootCrossings(wall, other, looseEnd).length : 0)) {
594
+ value = true;
595
+ break;
596
+ }
597
+ crossing.set(wall.boundary.id, value);
598
+ }
599
+ return value;
600
+ };
601
+ for (const group of ordered) {
602
+ const [only, ...rest] = group.boundaryIds;
603
+ const wall = byId.get(only);
604
+ if (rest.length || wall.boundary.type !== 'wall')
605
+ continue;
606
+ let joined = false;
607
+ for (const other of near(pointBox(group.point), WALL_JUNCTION_TOLERANCE))
608
+ if (other !== wall && joinsBoundaryInterior(group.point, other)) {
609
+ joined = true;
610
+ break;
611
+ }
612
+ if (!joined)
613
+ group.state = 'loose';
614
+ }
615
+ const blocked = (group) => group.state === 'loose' && crosses(byId.get([...group.boundaryIds][0]));
616
+ const parent = new Map();
617
+ const find = (key) => {
618
+ const next = parent.get(key);
619
+ if (!next || next === key)
620
+ return key;
621
+ const root = find(next);
622
+ parent.set(key, root);
623
+ return root;
624
+ };
625
+ const members = new Map();
626
+ const membersOf = (root) => members.get(root) ?? new Set([root]);
627
+ const ends = new Map(boundaries.map((boundary) => [
628
+ boundary.id,
629
+ [pointKey(pointFromTuple(boundary.start)), pointKey(pointFromTuple(boundary.end))],
630
+ ]));
631
+ // Joining must neither collapse a wall onto one junction nor lay a wall on top of
632
+ // another one between the same two junctions.
633
+ const neighbours = (keys, joined) => {
634
+ const roots = new Set();
635
+ for (const key of keys)
636
+ for (const id of groups.get(key).boundaryIds) {
637
+ const [start, end] = ends.get(id);
638
+ if (start === end)
639
+ continue;
640
+ if (joined.has(start) && joined.has(end))
641
+ return null;
642
+ roots.add(find(joined.has(start) ? end : start));
643
+ }
644
+ return roots;
645
+ };
646
+ for (const group of ordered) {
647
+ if (group.state !== 'loose')
648
+ continue;
649
+ const wall = byId.get([...group.boundaryIds][0]);
650
+ const candidates = [];
651
+ for (const candidate of nearGroups(pointBox(group.point), 2 * TEE_REACH)) {
652
+ if (candidate === group || candidate.boundaryIds.has(wall.boundary.id))
653
+ continue;
654
+ // Thick walls are reached as far as their drawn bodies can touch the end.
655
+ const reach = Math.max(...[...candidate.boundaryIds].map((id) => reachOf(wall.boundary, byId.get(id).boundary)));
656
+ const distance = Math.min(Math.hypot(candidate.point.x - group.point.x, candidate.point.y - group.point.y), ...[...candidate.boundaryIds].map((id) => bodyReach(group.point, candidate, byId.get(id), reach)));
657
+ if (distance <= reach)
658
+ candidates.push({ group: candidate, distance });
659
+ }
660
+ if (!candidates.length || blocked(group))
661
+ continue;
662
+ candidates.sort((a, b) => a.distance - b.distance || (a.group.key < b.group.key ? -1 : 1));
663
+ const best = candidates.find(({ group: candidate }) => !blocked(candidate) &&
664
+ [...candidate.boundaryIds].some((id) => bodiesTouch(wall, byId.get(id), group.point)))?.group;
665
+ if (!best)
666
+ continue;
667
+ const left = find(group.key);
668
+ const right = find(best.key);
669
+ if (left === right)
670
+ continue;
671
+ const joined = new Set([...membersOf(left), ...membersOf(right)]);
672
+ const leftRoots = neighbours(membersOf(left), joined);
673
+ const rightRoots = neighbours(membersOf(right), joined);
674
+ if (!(leftRoots && rightRoots) || [...leftRoots].some((root) => rightRoots.has(root)))
675
+ continue;
676
+ parent.set(left, right);
677
+ members.set(right, joined);
678
+ members.delete(left);
679
+ }
680
+ // A wall end standing inside another wall's drawn body, away from its ends, joins it
681
+ // at the foot of that body's reference line even when the lines are far apart.
682
+ const tees = new Map();
683
+ for (const group of bodyJoints ? ordered : []) {
684
+ if (group.state !== 'loose' || membersOf(find(group.key)).size > 1 || blocked(group))
685
+ continue;
686
+ const wall = byId.get([...group.boundaryIds][0]);
687
+ const approach = endDirection(wall, group.point);
688
+ let best;
689
+ for (const other of near(pointBox(group.point), TEE_REACH)) {
690
+ if (other === wall || other.boundary.type !== 'wall')
691
+ continue;
692
+ const foot = interiorFoot(group.point, other);
693
+ if (!foot || foot.distance > junctionReach(wall.boundary, other.boundary))
694
+ continue;
695
+ // Walls running alongside each other are stacked, not joined.
696
+ if (Math.abs(approach.x * foot.direction.y - approach.y * foot.direction.x) < 0.5)
697
+ continue;
698
+ // A stub drawn entirely inside the other wall's body shows nothing to join.
699
+ const start = wall.points[pointKey(wall.points[0]) === group.key ? wall.points.length - 1 : 0];
700
+ if ((interiorFoot(start, other)?.distance ?? Number.POSITIVE_INFINITY) <= halfBody(other))
701
+ continue;
702
+ if (best && foot.distance >= best.distance)
703
+ continue;
704
+ if (bodiesTouch(wall, other, group.point))
705
+ best = foot;
706
+ }
707
+ if (best)
708
+ tees.set(group.key, best.point);
709
+ }
710
+ const junctions = new Map(tees);
711
+ for (const keys of members.values()) {
712
+ const cluster = [...keys].map((key) => groups.get(key));
713
+ const junction = cluster.find((group) => group.state === 'joined')?.point ??
714
+ cornerOf(cluster, byId, reachOf) ??
715
+ cluster.sort((a, b) => (a.key < b.key ? -1 : 1))[0].point;
716
+ for (const group of cluster)
717
+ if (pointKey(group.point) !== pointKey(junction))
718
+ junctions.set(group.key, junction);
719
+ }
720
+ if (diagnostics)
721
+ for (const group of ordered) {
722
+ for (const id of group.boundaryIds) {
723
+ const wall = byId.get(id);
724
+ if (wall.boundary.type !== 'wall')
725
+ continue;
726
+ const approach = endDirection(wall, group.point);
727
+ let best;
728
+ let crossingTarget;
729
+ for (const other of near(pointBox(group.point), 0.35)) {
730
+ if (other === wall || other.boundary.type !== 'wall')
731
+ continue;
732
+ const consider = (point, kind, parallel) => {
733
+ const distance = Math.hypot(point.x - group.point.x, point.y - group.point.y);
734
+ if (distance > 0.35 || (best && distance >= best.distance))
735
+ return;
736
+ best = {
737
+ candidate: { wallId: other.boundary.id, point: pointToTuple(point), kind },
738
+ distance,
739
+ parallel,
740
+ gap: bodyGap(wall, other, group.point, 0.35),
741
+ };
742
+ };
743
+ for (const point of [other.points[0], other.points.at(-1)])
744
+ consider(point, 'endpoint', false);
745
+ const foot = interiorFoot(group.point, other);
746
+ if (foot) {
747
+ const parallel = Math.abs(approach.x * foot.direction.y - approach.y * foot.direction.x) < 0.5;
748
+ // A straight wall joins a straight body where its own line meets it, never tilting.
749
+ const meet = parallel ? undefined : ownAxisMeet(wall, other);
750
+ consider(meet ?? foot.point, 'body', parallel);
751
+ }
752
+ for (const crossing of sampledCrossings(wall, other)) {
753
+ const distance = Math.hypot(crossing.point.x - group.point.x, crossing.point.y - group.point.y);
754
+ if (distance <= 0.35 && (!crossingTarget || distance < crossingTarget.distance))
755
+ crossingTarget = {
756
+ candidate: {
757
+ wallId: other.boundary.id,
758
+ point: pointToTuple(crossing.point),
759
+ kind: 'body',
760
+ },
761
+ distance,
762
+ parallel: false,
763
+ gap: 0,
764
+ };
765
+ }
766
+ }
767
+ const target = crossingTarget ?? best;
768
+ const reason = crossingTarget || crosses(wall)
769
+ ? 'crosses'
770
+ : best?.parallel
771
+ ? 'parallel'
772
+ : best && best.gap > JOINT_GAP
773
+ ? 'gap'
774
+ : best
775
+ ? 'rejected'
776
+ : 'isolated';
777
+ diagnostics.push({
778
+ wallId: id,
779
+ end: pointKey(pointFromTuple(wall.boundary.start)) === group.key ? 'start' : 'end',
780
+ point: pointToTuple(group.point),
781
+ reason,
782
+ ...(reason === 'gap' && best && Number.isFinite(best.gap) ? { gap: best.gap } : {}),
783
+ ...(target ? { candidate: target.candidate } : {}),
784
+ });
785
+ }
786
+ }
787
+ // Free once joints are elected: a loose end no joint connected.
788
+ const freeEnd = (end) => {
789
+ const key = pointKey(end);
790
+ return looseEnd(end) && !tees.has(key) && membersOf(find(key)).size === 1;
791
+ };
792
+ return { junctions, freeEnd };
793
+ }
794
+ export function wallEndJoinCandidates(nodes, levelId) {
795
+ const ends = [];
796
+ nearMissJunctions(Object.values(nodes).filter((node) => (node.type === 'wall' || node.type === 'separator') && node.parentId === levelId), true, ends);
797
+ return ends;
798
+ }
799
+ /** Separator edges preserve intentional openings after wall deletion; only wall ends are reported. */
800
+ export function detectOpenWallEnds(nodes, levelId) {
801
+ const boundaries = Object.values(nodes).filter((node) => (node.type === 'wall' || node.type === 'separator') && node.parentId === levelId);
802
+ const joined = extractRoomGraph(boundaries, {}, true, true);
803
+ if (!joined.bodyJoints)
804
+ return joined.openEnds;
805
+ const plain = extractRoomGraph(boundaries, {}, false, true);
806
+ const selected = new Set(keepPlainRoomsWhereLost(plain.rooms, joined.rooms));
807
+ const rejected = new Set(plain.rooms
808
+ .filter((room) => selected.has(room) && !joined.rooms.includes(room))
809
+ .flatMap((room) => room.spans.map((span) => span.boundaryId)));
810
+ return [
811
+ ...joined.openEnds.filter((end) => !rejected.has(end.wallId)),
812
+ ...plain.openEnds
813
+ .filter((end) => rejected.has(end.wallId))
814
+ .map((end) => ({ ...end, reason: 'rejected' })),
815
+ ].sort((a, b) => a.wallId.localeCompare(b.wallId) || a.end.localeCompare(b.end));
816
+ }
817
+ /**
818
+ * Rooms enclosed by walls and separators. Joints where drawn wall bodies touch (thick
819
+ * walls, ends inside another wall's body) only ever add or split rooms: wherever they
820
+ * would lose room area the plain junction rules drew, that structure keeps the plain
821
+ * result, so no scene loses a room it had.
822
+ */
823
+ export function extractRooms(boundaries, options = {}) {
824
+ boundaries = boundaries.filter((boundary) => boundary.metadata?.roomBoundary !== false);
825
+ const joined = extractRoomGraph(boundaries, options, true);
826
+ if (!joined.bodyJoints)
827
+ return joined.rooms;
828
+ const plain = extractRoomGraph(boundaries, options, false).rooms;
829
+ return keepPlainRoomsWhereLost(plain, joined.rooms);
830
+ }
831
+ function roomArea(rooms) {
832
+ return rooms.map((room) => ({ outer: room.referencePolygon, holes: room.holes }));
833
+ }
834
+ /** Joints may split rooms or close new ones, never shrink or merge the plain ones. */
835
+ function losesRooms(group) {
836
+ try {
837
+ const plain = roomArea(group.plain);
838
+ const joined = roomArea(group.joined);
839
+ if (area(difference(union(plain), union(joined))) > 0.01)
840
+ return true;
841
+ return joined.some((room) => plain.filter((other) => area(intersection(room, other)) > 0.2).length > 1);
842
+ }
843
+ catch {
844
+ return true;
845
+ }
846
+ }
847
+ function keepPlainRoomsWhereLost(plain, joined) {
848
+ // Structures: rooms of either result that share a boundary.
849
+ const all = [...plain, ...joined];
850
+ const parent = all.map((_, i) => i);
851
+ const find = (i) => {
852
+ while (parent[i] !== i)
853
+ i = parent[i];
854
+ return i;
855
+ };
856
+ const owner = new Map();
857
+ all.forEach((room, i) => {
858
+ for (const span of room.spans) {
859
+ const other = owner.get(span.boundaryId);
860
+ if (other === undefined)
861
+ owner.set(span.boundaryId, i);
862
+ else
863
+ parent[find(i)] = find(other);
864
+ }
865
+ });
866
+ const groups = new Map();
867
+ all.forEach((room, i) => {
868
+ const group = groups.get(find(i)) ?? { plain: [], joined: [] };
869
+ (i < plain.length ? group.plain : group.joined).push(room);
870
+ groups.set(find(i), group);
871
+ });
872
+ const rooms = [];
873
+ for (const group of groups.values()) {
874
+ const same = group.plain.length === group.joined.length &&
875
+ group.plain.every((room, i) => room.id === group.joined[i].id);
876
+ rooms.push(...(!same && group.plain.length && losesRooms(group) ? group.plain : group.joined));
877
+ }
878
+ rooms.sort((a, b) => Math.abs(polygonArea(b.polygon)) - Math.abs(polygonArea(a.polygon)));
879
+ return rooms;
880
+ }
881
+ function extractRoomGraph(boundaries, { includeHoles = true }, bodyJoints, diagnostics = false) {
882
+ if (boundaries.length < 3 && !diagnostics)
883
+ return { rooms: [], bodyJoints: false, openEnds: [] };
884
+ // Snapped junctions must elect the same representative in migrations,
885
+ // full index rebuilds and incremental edits, independent of map insertion order.
886
+ const walls = [...boundaries].sort((a, b) => a.id.localeCompare(b.id));
887
+ const wallById = new Map(walls.map((wall) => [wall.id, wall]));
888
+ const graph = new Map();
889
+ const halfEdges = new Map();
890
+ const upsertNode = (point) => {
891
+ const key = pointKey(point);
892
+ if (!graph.has(key)) {
893
+ graph.set(key, { point: { ...point }, outgoing: [] });
894
+ }
895
+ return key;
896
+ };
897
+ // Planarize first: collect every wall endpoint as a candidate graph vertex so
898
+ // straight walls can be split at T-junctions where another wall ends mid-span.
899
+ // Without this the touching wall's endpoint is a dangling degree-1 node and the
900
+ // enclosed area (e.g. a room added against the middle of an existing wall)
901
+ // never forms a cycle.
902
+ const openEnds = [];
903
+ const { junctions, freeEnd } = nearMissJunctions(walls, bodyJoints, diagnostics ? openEnds : undefined);
904
+ // Whether the body joints change the graph at all: new junctions, or doubled spans
905
+ // dropped where joints connect walls.
906
+ let changed = false;
907
+ if (bodyJoints) {
908
+ const plain = nearMissJunctions(walls, false).junctions;
909
+ changed =
910
+ plain.size !== junctions.size ||
911
+ [...junctions].some(([key, point]) => {
912
+ const other = plain.get(key);
913
+ return !other || pointKey(other) !== pointKey(point);
914
+ });
915
+ }
916
+ const junction = (tuple) => {
917
+ const point = pointFromTuple(tuple);
918
+ return junctions.get(pointKey(point)) ?? point;
919
+ };
920
+ const vertexByKey = new Map();
921
+ for (const wall of walls) {
922
+ for (const tuple of [wall.start, wall.end]) {
923
+ const point = junction(tuple);
924
+ const key = pointKey(point);
925
+ const existing = vertexByKey.get(key);
926
+ if (!existing)
927
+ vertexByKey.set(key, { ...point, wallEndpoint: wall.type === 'wall' });
928
+ else if (wall.type === 'wall')
929
+ existing.wallEndpoint = true;
930
+ }
931
+ }
932
+ const vertices = [...vertexByKey.values()];
933
+ if (bodyJoints) {
934
+ const sampled = walls.map(sampleBoundary);
935
+ const near = spatialIndex(sampled, (item) => item.box);
936
+ for (const wall of sampled)
937
+ for (const other of near(wall.box, 0)) {
938
+ if (wall.boundary.id >= other.boundary.id)
939
+ continue;
940
+ // An end already joined (e.g. onto the crossed wall's body) gets no second vertex at
941
+ // the crossing, which would only double that joint with a sliver.
942
+ for (const { point } of overshootCrossings(wall, other, freeEnd)) {
943
+ vertices.push({ ...point, wallEndpoint: false });
944
+ changed = true;
945
+ }
946
+ }
947
+ }
948
+ const nearVertices = spatialIndex(vertices, (vertex) => pointBox(vertex));
949
+ const parts = [];
950
+ for (const wall of walls) {
951
+ const start = pointFromTuple(wall.start);
952
+ const end = pointFromTuple(wall.end);
953
+ if (samePointWithinTolerance(start, end))
954
+ continue;
955
+ const points = sampleWallPointsForRoomDetection(wall);
956
+ const localVertices = [...nearVertices(bboxOf(points), WALL_JUNCTION_TOLERANCE)];
957
+ const subPolylines = isCurvedWall(wall)
958
+ ? splitCurvedWallAtVertices(points, localVertices, wall)
959
+ : (() => {
960
+ const ordered = splitStraightWallAtVertices(start, end, localVertices, wall.type === 'separator');
961
+ const parts = [];
962
+ for (let index = 0; index < ordered.length - 1; index += 1) {
963
+ parts.push([ordered[index], ordered[index + 1]]);
964
+ }
965
+ return parts;
966
+ })();
967
+ // A near-miss end moves onto its junction only after the body is split, so every
968
+ // T-junction found along the wall as drawn stays connected.
969
+ const startJunction = junctions.get(pointKey(start));
970
+ const endJunction = junctions.get(pointKey(end));
971
+ const snapped = new Set();
972
+ if (startJunction && subPolylines.length) {
973
+ subPolylines[0] = [startJunction, ...subPolylines[0].slice(1)];
974
+ snapped.add(0);
975
+ }
976
+ if (endJunction && subPolylines.length) {
977
+ subPolylines[subPolylines.length - 1] = [...subPolylines.at(-1).slice(0, -1), endJunction];
978
+ snapped.add(subPolylines.length - 1);
979
+ }
980
+ for (const [subIndex, points] of subPolylines.entries())
981
+ parts.push({ wall, points, subIndex, snapped: snapped.has(subIndex) });
982
+ }
983
+ // A moved end never doubles a span another boundary already draws between the same
984
+ // two nodes (e.g. parallel walls a few centimetres apart).
985
+ const pairKey = (points) => {
986
+ const keys = points.map(pointKey);
987
+ const reversed = [...keys].reverse();
988
+ return (keys.join('|') < reversed.join('|') ? keys : reversed).join('|');
989
+ };
990
+ const drawnPairs = new Set(parts.filter((part) => !part.snapped).map((part) => pairKey(part.points)));
991
+ // Where joints connect walls, a span drawn twice (walls stacked on each other) would
992
+ // give two edges with the same angle at a node, and the face walk could cut through
993
+ // rooms: keep one per span there. Elsewhere the graph stays exactly as drawn.
994
+ const componentOf = new Map();
995
+ const root = (key) => {
996
+ const next = componentOf.get(key);
997
+ if (!next || next === key)
998
+ return key;
999
+ const found = root(next);
1000
+ componentOf.set(key, found);
1001
+ return found;
1002
+ };
1003
+ for (const { points } of parts) {
1004
+ const a = root(pointKey(points[0]));
1005
+ const b = root(pointKey(points.at(-1)));
1006
+ if (a !== b)
1007
+ componentOf.set(a, b);
1008
+ }
1009
+ const joined = new Set(bodyJoints ? [...junctions.values()].map((point) => root(pointKey(point))) : []);
1010
+ const seenPairs = new Set();
1011
+ for (const { wall, points, subIndex, snapped } of parts) {
1012
+ const pair = pairKey(points);
1013
+ if (snapped && drawnPairs.has(pair))
1014
+ continue;
1015
+ if (joined.has(root(pointKey(points[0])))) {
1016
+ if (seenPairs.has(pair)) {
1017
+ changed = true;
1018
+ continue;
1019
+ }
1020
+ seenPairs.add(pair);
1021
+ }
1022
+ const from = points[0];
1023
+ const to = points[points.length - 1];
1024
+ const fromKey = upsertNode(from);
1025
+ const toKey = upsertNode(to);
1026
+ if (fromKey === toKey)
1027
+ continue;
1028
+ const reversePoints = [...points].reverse();
1029
+ const forwardId = `${wall.id}#${subIndex}:f`;
1030
+ const reverseId = `${wall.id}#${subIndex}:r`;
1031
+ halfEdges.set(forwardId, {
1032
+ id: forwardId,
1033
+ reverseId,
1034
+ fromKey,
1035
+ toKey,
1036
+ angle: Math.atan2(points[1].y - from.y, points[1].x - from.x),
1037
+ points,
1038
+ wallId: wall.id,
1039
+ face: 'front',
1040
+ });
1041
+ halfEdges.set(reverseId, {
1042
+ id: reverseId,
1043
+ reverseId: forwardId,
1044
+ fromKey: toKey,
1045
+ toKey: fromKey,
1046
+ angle: Math.atan2(reversePoints[1].y - to.y, reversePoints[1].x - to.x),
1047
+ points: reversePoints,
1048
+ wallId: wall.id,
1049
+ face: 'back',
1050
+ });
1051
+ graph.get(fromKey)?.outgoing.push(forwardId);
1052
+ graph.get(toKey)?.outgoing.push(reverseId);
1053
+ }
1054
+ const sortedOutgoing = new Map();
1055
+ for (const [key, node] of graph.entries()) {
1056
+ const outgoing = [...node.outgoing];
1057
+ outgoing.sort((a, b) => (halfEdges.get(a)?.angle ?? 0) - (halfEdges.get(b)?.angle ?? 0));
1058
+ sortedOutgoing.set(key, outgoing);
1059
+ }
1060
+ const nextEdge = (edgeId) => {
1061
+ const edge = halfEdges.get(edgeId);
1062
+ if (!edge)
1063
+ return null;
1064
+ const outgoing = sortedOutgoing.get(edge.toKey);
1065
+ if (!outgoing || outgoing.length === 0)
1066
+ return null;
1067
+ const idx = outgoing.indexOf(edge.reverseId);
1068
+ if (idx === -1)
1069
+ return null;
1070
+ const nextIdx = (idx - 1 + outgoing.length) % outgoing.length;
1071
+ return outgoing[nextIdx] ?? null;
1072
+ };
1073
+ const splitIntoSimpleCycles = (walkEdgeIds) => {
1074
+ const cycles = [];
1075
+ const firstEdge = halfEdges.get(walkEdgeIds[0] ?? '');
1076
+ if (!firstEdge)
1077
+ return cycles;
1078
+ const pathEdges = [];
1079
+ const pathVertices = [firstEdge.fromKey];
1080
+ const vertexIndex = new Map([[firstEdge.fromKey, 0]]);
1081
+ for (const edgeId of walkEdgeIds) {
1082
+ const edge = halfEdges.get(edgeId);
1083
+ if (!edge || edge.fromKey !== pathVertices[pathVertices.length - 1])
1084
+ return [];
1085
+ pathEdges.push(edgeId);
1086
+ const repeatedIndex = vertexIndex.get(edge.toKey);
1087
+ if (repeatedIndex === undefined) {
1088
+ pathVertices.push(edge.toKey);
1089
+ vertexIndex.set(edge.toKey, pathVertices.length - 1);
1090
+ continue;
1091
+ }
1092
+ const cycle = pathEdges.slice(repeatedIndex);
1093
+ if (cycle.length >= 3)
1094
+ cycles.push(cycle);
1095
+ for (let index = repeatedIndex + 1; index < pathVertices.length; index += 1) {
1096
+ vertexIndex.delete(pathVertices[index]);
1097
+ }
1098
+ pathVertices.length = repeatedIndex + 1;
1099
+ pathEdges.length = repeatedIndex;
1100
+ }
1101
+ return pathEdges.length === 0 && pathVertices.length === 1 ? cycles : [];
1102
+ };
1103
+ const visitedDirected = new Set();
1104
+ const rooms = [];
1105
+ const innerCycles = [];
1106
+ // A face walk cannot revisit a half-edge, so the half-edge count bounds its
1107
+ // length. It can revisit a vertex when dangling walls or other graph bridges
1108
+ // are traced out and back; those excursions are removed below.
1109
+ const maxSteps = Math.min(2000, halfEdges.size + 10);
1110
+ for (const edgeId of halfEdges.keys()) {
1111
+ if (visitedDirected.has(edgeId))
1112
+ continue;
1113
+ const cycleEdgeIds = [];
1114
+ let currentEdgeId = edgeId;
1115
+ let valid = true;
1116
+ let closed = false;
1117
+ for (let step = 0; step < maxSteps; step += 1) {
1118
+ const currentEdge = halfEdges.get(currentEdgeId);
1119
+ if (!currentEdge) {
1120
+ valid = false;
1121
+ break;
1122
+ }
1123
+ visitedDirected.add(currentEdgeId);
1124
+ cycleEdgeIds.push(currentEdgeId);
1125
+ const next = nextEdge(currentEdgeId);
1126
+ if (!next) {
1127
+ valid = false;
1128
+ break;
1129
+ }
1130
+ currentEdgeId = next;
1131
+ if (currentEdgeId === edgeId) {
1132
+ closed = true;
1133
+ break;
1134
+ }
1135
+ }
1136
+ if (!(valid && closed) || cycleEdgeIds.length < 3)
1137
+ continue;
1138
+ for (const simpleCycleEdgeIds of splitIntoSimpleCycles(cycleEdgeIds)) {
1139
+ const bodyEdges = simpleCycleEdgeIds.map((id) => {
1140
+ const edge = halfEdges.get(id);
1141
+ return { wall: wallById.get(edge.wallId), points: edge.points };
1142
+ });
1143
+ const polygon = bodyEdges.some(({ wall }) => wall.type === 'wall' && wall.justification !== undefined)
1144
+ ? roomBodyPolygon(bodyEdges)
1145
+ : dedupeSequentialPoints(simpleCycleEdgeIds.flatMap((id, index) => {
1146
+ const points = halfEdges.get(id)?.points ?? [];
1147
+ return index === simpleCycleEdgeIds.length - 1 ? points : points.slice(0, -1);
1148
+ }));
1149
+ if (polygon.length < 3)
1150
+ continue;
1151
+ const referencePoints = dedupeSequentialPoints(simpleCycleEdgeIds.flatMap((id) => halfEdges.get(id).points.slice(0, -1))).map(pointToTuple);
1152
+ // Room identity must not change when wall thickness or justification changes.
1153
+ const signedArea = polygonArea(referencePoints.map(pointFromTuple));
1154
+ if (signedArea <= 0 && !includeHoles)
1155
+ continue;
1156
+ const minArea = bodyEdges.every(({ wall }) => wall.type === 'separator') ? 0.25 : 0.5;
1157
+ if (Math.abs(signedArea) < minArea - 1e-9 || Math.abs(signedArea) > 10_000)
1158
+ continue;
1159
+ const cycles = signedArea > 0 ? rooms : innerCycles;
1160
+ const signature = polygonSignature(polygon);
1161
+ if (cycles.some((room) => polygonSignature(room.polygon) === signature))
1162
+ continue;
1163
+ let first = 0;
1164
+ for (let i = 1; i < referencePoints.length; i++) {
1165
+ const p = referencePoints[i], q = referencePoints[first];
1166
+ if (p[0] < q[0] || (p[0] === q[0] && p[1] < q[1]))
1167
+ first = i;
1168
+ }
1169
+ const referencePolygon = [...referencePoints.slice(first), ...referencePoints.slice(0, first)];
1170
+ const roomId = `room-${polygonSignature(referencePolygon.map(pointFromTuple))}`;
1171
+ const spans = simpleCycleEdgeIds.map((id) => {
1172
+ const edge = halfEdges.get(id);
1173
+ const boundary = wallById.get(edge.wallId);
1174
+ const start = pointFromTuple(boundary.start);
1175
+ const end = pointFromTuple(boundary.end);
1176
+ const from = segmentProjection(edge.points[0], start, end).t;
1177
+ const to = segmentProjection(edge.points.at(-1), start, end).t;
1178
+ return {
1179
+ roomId,
1180
+ boundaryId: boundary.id,
1181
+ kind: boundary.type,
1182
+ face: edge.face === 'front' ? 'a' : 'b',
1183
+ t0: Math.max(0, Math.min(1, Math.min(from, to))),
1184
+ t1: Math.max(0, Math.min(1, Math.max(from, to))),
1185
+ };
1186
+ });
1187
+ spans.sort((a, b) => a.boundaryId.localeCompare(b.boundaryId) || a.face.localeCompare(b.face) || a.t0 - b.t0);
1188
+ cycles.push({
1189
+ id: roomId,
1190
+ referencePolygon,
1191
+ holes: [],
1192
+ spans,
1193
+ polygon,
1194
+ boundaryFaces: simpleCycleEdgeIds.flatMap((id) => {
1195
+ const edge = halfEdges.get(id);
1196
+ if (!edge || wallById.get(edge.wallId)?.type !== 'wall')
1197
+ return [];
1198
+ return [
1199
+ {
1200
+ wallId: edge.wallId,
1201
+ face: edge.face,
1202
+ points: edge.points.map(pointToTuple),
1203
+ },
1204
+ ];
1205
+ }),
1206
+ });
1207
+ }
1208
+ }
1209
+ const shells = rooms
1210
+ .map((room) => ({
1211
+ room,
1212
+ area: Math.abs(polygonArea(room.referencePolygon.map(pointFromTuple))),
1213
+ bbox: bboxOf(room.referencePolygon.map(pointFromTuple)),
1214
+ }))
1215
+ .sort((a, b) => a.area - b.area || a.room.id.localeCompare(b.room.id));
1216
+ for (const cycle of innerCycles) {
1217
+ const ring = cycle.referencePolygon;
1218
+ const cycleArea = Math.abs(polygonArea(ring.map(pointFromTuple)));
1219
+ const bounds = bboxOf(ring.map(pointFromTuple));
1220
+ const containing = shells.find((shell) => shell.area > cycleArea + 1e-6 &&
1221
+ // The reverse walk of the same boundary is the exterior, even when
1222
+ // snapped endpoints give it a slightly smaller numerical area.
1223
+ !shell.room.spans.some((outer) => cycle.spans.some((inner) => outer.boundaryId === inner.boundaryId &&
1224
+ Math.min(outer.t1, inner.t1) - Math.max(outer.t0, inner.t0) > 1e-8)) &&
1225
+ shell.bbox.minX <= bounds.minX &&
1226
+ shell.bbox.minY <= bounds.minY &&
1227
+ shell.bbox.maxX >= bounds.maxX &&
1228
+ shell.bbox.maxY >= bounds.maxY &&
1229
+ area(difference(ring, shell.room.referencePolygon)) < 1e-6)?.room;
1230
+ if (!containing)
1231
+ continue;
1232
+ containing.holes.push(ring);
1233
+ containing.boundaryFaces.push(...cycle.boundaryFaces);
1234
+ containing.spans.push(...cycle.spans.map((span) => ({ ...span, roomId: containing.id })));
1235
+ }
1236
+ for (const room of rooms) {
1237
+ room.holes.sort((a, b) => polygonSignature(a.map(pointFromTuple)).localeCompare(polygonSignature(b.map(pointFromTuple))));
1238
+ room.spans.sort((a, b) => a.boundaryId.localeCompare(b.boundaryId) || a.face.localeCompare(b.face) || a.t0 - b.t0);
1239
+ }
1240
+ rooms.sort((a, b) => Math.abs(polygonArea(b.polygon)) - Math.abs(polygonArea(a.polygon)));
1241
+ return {
1242
+ rooms,
1243
+ bodyJoints: changed,
1244
+ openEnds: openEnds.filter((end) => {
1245
+ const point = junctions.get(pointKey(pointFromTuple(end.point))) ?? pointFromTuple(end.point);
1246
+ const node = graph.get(pointKey(point));
1247
+ return !node || new Set(node.outgoing.map((id) => halfEdges.get(id).wallId)).size < 2;
1248
+ }),
1249
+ };
1250
+ }
1251
+ export function detectRoomFaces(levelWalls, levelSeparators = []) {
1252
+ return extractRooms([...levelWalls, ...levelSeparators].sort((a, b) => a.id.localeCompare(b.id))).map((room) => ({
1253
+ key: room.id,
1254
+ polygon: room.referencePolygon,
1255
+ holes: room.holes,
1256
+ boundaryWallIds: [
1257
+ ...new Set(room.spans
1258
+ .filter((span) => span.kind === 'wall')
1259
+ .map((span) => span.boundaryId)),
1260
+ ].sort(),
1261
+ boundarySeparatorIds: [
1262
+ ...new Set(room.spans
1263
+ .filter((span) => span.kind === 'separator')
1264
+ .map((span) => span.boundaryId)),
1265
+ ].sort(),
1266
+ }));
1267
+ }