@pascal-app/core 1.0.1 → 1.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1116) hide show
  1. package/dist/agent-operations/__fixtures__/add-object-cases.d.ts +235 -0
  2. package/dist/agent-operations/__fixtures__/add-object-cases.d.ts.map +1 -0
  3. package/dist/agent-operations/__fixtures__/add-object-cases.js +129 -0
  4. package/dist/agent-operations/__fixtures__/build-room-cases.d.ts +4 -0
  5. package/dist/agent-operations/__fixtures__/build-room-cases.d.ts.map +1 -0
  6. package/dist/agent-operations/__fixtures__/build-room-cases.js +635 -0
  7. package/dist/agent-operations/__fixtures__/cases.d.ts +52 -0
  8. package/dist/agent-operations/__fixtures__/cases.d.ts.map +1 -0
  9. package/dist/agent-operations/__fixtures__/cases.js +689 -0
  10. package/dist/agent-operations/__fixtures__/find-by-type-cases.d.ts +7 -0
  11. package/dist/agent-operations/__fixtures__/find-by-type-cases.d.ts.map +1 -0
  12. package/dist/agent-operations/__fixtures__/find-by-type-cases.js +21 -0
  13. package/dist/agent-operations/__fixtures__/place-items-cases.d.ts +17 -0
  14. package/dist/agent-operations/__fixtures__/place-items-cases.d.ts.map +1 -0
  15. package/dist/agent-operations/__fixtures__/place-items-cases.js +506 -0
  16. package/dist/agent-operations/__fixtures__/room-cases.d.ts +3 -0
  17. package/dist/agent-operations/__fixtures__/room-cases.d.ts.map +1 -0
  18. package/dist/agent-operations/__fixtures__/room-cases.js +338 -0
  19. package/dist/agent-operations/__fixtures__/search-assets-cases.d.ts +5 -0
  20. package/dist/agent-operations/__fixtures__/search-assets-cases.d.ts.map +1 -0
  21. package/dist/agent-operations/__fixtures__/search-assets-cases.js +137 -0
  22. package/dist/agent-operations/__fixtures__/structure-cases.d.ts +6 -0
  23. package/dist/agent-operations/__fixtures__/structure-cases.d.ts.map +1 -0
  24. package/dist/agent-operations/__fixtures__/structure-cases.js +588 -0
  25. package/dist/agent-operations/__fixtures__/verify-scene-cases.d.ts +3 -0
  26. package/dist/agent-operations/__fixtures__/verify-scene-cases.d.ts.map +1 -0
  27. package/dist/agent-operations/__fixtures__/verify-scene-cases.js +302 -0
  28. package/dist/agent-operations/achieved.d.ts +16 -0
  29. package/dist/agent-operations/achieved.d.ts.map +1 -0
  30. package/dist/agent-operations/achieved.js +28 -0
  31. package/dist/agent-operations/add-column.d.ts +23 -0
  32. package/dist/agent-operations/add-column.d.ts.map +1 -0
  33. package/dist/agent-operations/add-column.js +97 -0
  34. package/dist/agent-operations/add-level.d.ts +14 -0
  35. package/dist/agent-operations/add-level.d.ts.map +1 -0
  36. package/dist/agent-operations/add-level.js +94 -0
  37. package/dist/agent-operations/add-object.d.ts +114 -0
  38. package/dist/agent-operations/add-object.d.ts.map +1 -0
  39. package/dist/agent-operations/add-object.js +361 -0
  40. package/dist/agent-operations/add-wall.d.ts +15 -0
  41. package/dist/agent-operations/add-wall.d.ts.map +1 -0
  42. package/dist/agent-operations/add-wall.js +47 -0
  43. package/dist/agent-operations/apply-changes.d.ts +16 -0
  44. package/dist/agent-operations/apply-changes.d.ts.map +1 -0
  45. package/dist/agent-operations/apply-changes.js +93 -0
  46. package/dist/agent-operations/apply-outcome.d.ts +15 -0
  47. package/dist/agent-operations/apply-outcome.d.ts.map +1 -0
  48. package/dist/agent-operations/apply-outcome.js +18 -0
  49. package/dist/agent-operations/collections.d.ts +28 -0
  50. package/dist/agent-operations/collections.d.ts.map +1 -0
  51. package/dist/agent-operations/collections.js +130 -0
  52. package/dist/agent-operations/create-room.d.ts +36 -0
  53. package/dist/agent-operations/create-room.d.ts.map +1 -0
  54. package/dist/agent-operations/create-room.js +177 -0
  55. package/dist/agent-operations/create-stair.d.ts +33 -0
  56. package/dist/agent-operations/create-stair.d.ts.map +1 -0
  57. package/dist/agent-operations/create-stair.js +247 -0
  58. package/dist/agent-operations/delete-node.d.ts +6 -0
  59. package/dist/agent-operations/delete-node.d.ts.map +1 -0
  60. package/dist/agent-operations/delete-node.js +9 -0
  61. package/dist/agent-operations/door-clearance.d.ts +135 -0
  62. package/dist/agent-operations/door-clearance.d.ts.map +1 -0
  63. package/dist/agent-operations/door-clearance.js +334 -0
  64. package/dist/agent-operations/duplicate-level.d.ts +12 -0
  65. package/dist/agent-operations/duplicate-level.d.ts.map +1 -0
  66. package/dist/agent-operations/duplicate-level.js +54 -0
  67. package/dist/agent-operations/find-by-type.d.ts +11 -0
  68. package/dist/agent-operations/find-by-type.d.ts.map +1 -0
  69. package/dist/agent-operations/find-by-type.js +94 -0
  70. package/dist/agent-operations/furnish-room.d.ts +18 -0
  71. package/dist/agent-operations/furnish-room.d.ts.map +1 -0
  72. package/dist/agent-operations/furnish-room.js +259 -0
  73. package/dist/agent-operations/get-node.d.ts +9 -0
  74. package/dist/agent-operations/get-node.d.ts.map +1 -0
  75. package/dist/agent-operations/get-node.js +33 -0
  76. package/dist/agent-operations/hosted-services.d.ts +13 -0
  77. package/dist/agent-operations/hosted-services.d.ts.map +1 -0
  78. package/dist/agent-operations/hosted-services.js +22 -0
  79. package/dist/agent-operations/index.d.ts +277 -0
  80. package/dist/agent-operations/index.d.ts.map +1 -0
  81. package/dist/agent-operations/index.js +80 -0
  82. package/dist/agent-operations/layout-clearance.d.ts +108 -0
  83. package/dist/agent-operations/layout-clearance.d.ts.map +1 -0
  84. package/dist/agent-operations/layout-clearance.js +190 -0
  85. package/dist/agent-operations/level-reads.d.ts +33 -0
  86. package/dist/agent-operations/level-reads.d.ts.map +1 -0
  87. package/dist/agent-operations/level-reads.js +161 -0
  88. package/dist/agent-operations/level-target.d.ts +11 -0
  89. package/dist/agent-operations/level-target.d.ts.map +1 -0
  90. package/dist/agent-operations/level-target.js +29 -0
  91. package/dist/agent-operations/list-levels.d.ts +4 -0
  92. package/dist/agent-operations/list-levels.d.ts.map +1 -0
  93. package/dist/agent-operations/list-levels.js +31 -0
  94. package/dist/agent-operations/material-preset.d.ts +11 -0
  95. package/dist/agent-operations/material-preset.d.ts.map +1 -0
  96. package/dist/agent-operations/material-preset.js +74 -0
  97. package/dist/agent-operations/material-refs.d.ts +24 -0
  98. package/dist/agent-operations/material-refs.d.ts.map +1 -0
  99. package/dist/agent-operations/material-refs.js +100 -0
  100. package/dist/agent-operations/node-patch.d.ts +3 -0
  101. package/dist/agent-operations/node-patch.d.ts.map +1 -0
  102. package/dist/agent-operations/node-patch.js +114 -0
  103. package/dist/agent-operations/paint.d.ts +21 -0
  104. package/dist/agent-operations/paint.d.ts.map +1 -0
  105. package/dist/agent-operations/paint.js +219 -0
  106. package/dist/agent-operations/place-items.d.ts +20 -0
  107. package/dist/agent-operations/place-items.d.ts.map +1 -0
  108. package/dist/agent-operations/place-items.js +226 -0
  109. package/dist/agent-operations/plan-geometry.d.ts +24 -0
  110. package/dist/agent-operations/plan-geometry.d.ts.map +1 -0
  111. package/dist/agent-operations/plan-geometry.js +94 -0
  112. package/dist/agent-operations/room-structure.d.ts +87 -0
  113. package/dist/agent-operations/room-structure.d.ts.map +1 -0
  114. package/dist/agent-operations/room-structure.js +144 -0
  115. package/dist/agent-operations/scene-materials.d.ts +15 -0
  116. package/dist/agent-operations/scene-materials.d.ts.map +1 -0
  117. package/dist/agent-operations/scene-materials.js +62 -0
  118. package/dist/agent-operations/scene-measure.d.ts +73 -0
  119. package/dist/agent-operations/scene-measure.d.ts.map +1 -0
  120. package/dist/agent-operations/scene-measure.js +73 -0
  121. package/dist/agent-operations/scene-queries.d.ts +4510 -0
  122. package/dist/agent-operations/scene-queries.d.ts.map +1 -0
  123. package/dist/agent-operations/scene-queries.js +84 -0
  124. package/dist/agent-operations/scene-view.d.ts +98 -0
  125. package/dist/agent-operations/scene-view.d.ts.map +1 -0
  126. package/dist/agent-operations/scene-view.js +559 -0
  127. package/dist/agent-operations/search-assets.d.ts +14 -0
  128. package/dist/agent-operations/search-assets.d.ts.map +1 -0
  129. package/dist/agent-operations/search-assets.js +42 -0
  130. package/dist/agent-operations/search-materials.d.ts +12 -0
  131. package/dist/agent-operations/search-materials.d.ts.map +1 -0
  132. package/dist/agent-operations/search-materials.js +111 -0
  133. package/dist/agent-operations/stairs.d.ts +5 -0
  134. package/dist/agent-operations/stairs.d.ts.map +1 -0
  135. package/dist/agent-operations/stairs.js +70 -0
  136. package/dist/agent-operations/types.d.ts +59 -0
  137. package/dist/agent-operations/types.d.ts.map +1 -0
  138. package/dist/agent-operations/types.js +1 -0
  139. package/dist/agent-operations/verify-scene.d.ts +50 -0
  140. package/dist/agent-operations/verify-scene.d.ts.map +1 -0
  141. package/dist/agent-operations/verify-scene.js +369 -0
  142. package/dist/agent-operations/wall-opening.d.ts +65 -0
  143. package/dist/agent-operations/wall-opening.d.ts.map +1 -0
  144. package/dist/agent-operations/wall-opening.js +55 -0
  145. package/dist/agent-tools/achieved.d.ts +9 -0
  146. package/dist/agent-tools/achieved.d.ts.map +1 -0
  147. package/dist/agent-tools/achieved.js +8 -0
  148. package/dist/agent-tools/add-object.d.ts +43 -0
  149. package/dist/agent-tools/add-object.d.ts.map +1 -0
  150. package/dist/agent-tools/add-object.js +86 -0
  151. package/dist/agent-tools/assets.d.ts +13 -0
  152. package/dist/agent-tools/assets.d.ts.map +1 -0
  153. package/dist/agent-tools/assets.js +18 -0
  154. package/dist/agent-tools/clear-scene.d.ts +10 -0
  155. package/dist/agent-tools/clear-scene.d.ts.map +1 -0
  156. package/dist/agent-tools/clear-scene.js +9 -0
  157. package/dist/agent-tools/collections.d.ts +35 -0
  158. package/dist/agent-tools/collections.d.ts.map +1 -0
  159. package/dist/agent-tools/collections.js +31 -0
  160. package/dist/agent-tools/columns.d.ts +44 -0
  161. package/dist/agent-tools/columns.d.ts.map +1 -0
  162. package/dist/agent-tools/columns.js +59 -0
  163. package/dist/agent-tools/contract.d.ts +68 -0
  164. package/dist/agent-tools/contract.d.ts.map +1 -0
  165. package/dist/agent-tools/contract.js +1 -0
  166. package/dist/agent-tools/create-room.d.ts +63 -0
  167. package/dist/agent-tools/create-room.d.ts.map +1 -0
  168. package/dist/agent-tools/create-room.js +90 -0
  169. package/dist/agent-tools/find-by-type.d.ts +11 -0
  170. package/dist/agent-tools/find-by-type.d.ts.map +1 -0
  171. package/dist/agent-tools/find-by-type.js +14 -0
  172. package/dist/agent-tools/furnish-room.d.ts +26 -0
  173. package/dist/agent-tools/furnish-room.d.ts.map +1 -0
  174. package/dist/agent-tools/furnish-room.js +35 -0
  175. package/dist/agent-tools/hosted-services.d.ts +402 -0
  176. package/dist/agent-tools/hosted-services.d.ts.map +1 -0
  177. package/dist/agent-tools/hosted-services.js +148 -0
  178. package/dist/agent-tools/index.d.ts +864 -0
  179. package/dist/agent-tools/index.d.ts.map +1 -0
  180. package/dist/agent-tools/index.js +82 -0
  181. package/dist/agent-tools/levels.d.ts +72 -0
  182. package/dist/agent-tools/levels.d.ts.map +1 -0
  183. package/dist/agent-tools/levels.js +76 -0
  184. package/dist/agent-tools/measurement.d.ts +37 -0
  185. package/dist/agent-tools/measurement.d.ts.map +1 -0
  186. package/dist/agent-tools/measurement.js +94 -0
  187. package/dist/agent-tools/node-id.d.ts +3 -0
  188. package/dist/agent-tools/node-id.d.ts.map +1 -0
  189. package/dist/agent-tools/node-id.js +2 -0
  190. package/dist/agent-tools/nodes.d.ts +17 -0
  191. package/dist/agent-tools/nodes.d.ts.map +1 -0
  192. package/dist/agent-tools/nodes.js +13 -0
  193. package/dist/agent-tools/paint.d.ts +46 -0
  194. package/dist/agent-tools/paint.d.ts.map +1 -0
  195. package/dist/agent-tools/paint.js +29 -0
  196. package/dist/agent-tools/place-items.d.ts +19 -0
  197. package/dist/agent-tools/place-items.d.ts.map +1 -0
  198. package/dist/agent-tools/place-items.js +29 -0
  199. package/dist/agent-tools/refusal.d.ts +20 -0
  200. package/dist/agent-tools/refusal.d.ts.map +1 -0
  201. package/dist/agent-tools/refusal.js +29 -0
  202. package/dist/agent-tools/room-structure.d.ts +438 -0
  203. package/dist/agent-tools/room-structure.d.ts.map +1 -0
  204. package/dist/agent-tools/room-structure.js +207 -0
  205. package/dist/agent-tools/search-materials.d.ts +20 -0
  206. package/dist/agent-tools/search-materials.d.ts.map +1 -0
  207. package/dist/agent-tools/search-materials.js +32 -0
  208. package/dist/agent-tools/stairs.d.ts +86 -0
  209. package/dist/agent-tools/stairs.d.ts.map +1 -0
  210. package/dist/agent-tools/stairs.js +103 -0
  211. package/dist/agent-tools/verify-scene.d.ts +13 -0
  212. package/dist/agent-tools/verify-scene.d.ts.map +1 -0
  213. package/dist/agent-tools/verify-scene.js +21 -0
  214. package/dist/agent-tools/view-scene.d.ts +43 -0
  215. package/dist/agent-tools/view-scene.d.ts.map +1 -0
  216. package/dist/agent-tools/view-scene.js +80 -0
  217. package/dist/agent-tools/wall-openings.d.ts +163 -0
  218. package/dist/agent-tools/wall-openings.d.ts.map +1 -0
  219. package/dist/agent-tools/wall-openings.js +144 -0
  220. package/dist/agent-tools/walls.d.ts +21 -0
  221. package/dist/agent-tools/walls.d.ts.map +1 -0
  222. package/dist/agent-tools/walls.js +30 -0
  223. package/dist/agent-tools/write-target.d.ts +12 -0
  224. package/dist/agent-tools/write-target.d.ts.map +1 -0
  225. package/dist/agent-tools/write-target.js +10 -0
  226. package/dist/building/__fixtures__/wall-opening-cases.d.ts +736 -0
  227. package/dist/building/__fixtures__/wall-opening-cases.d.ts.map +1 -0
  228. package/dist/building/__fixtures__/wall-opening-cases.js +307 -0
  229. package/dist/building/door-types.d.ts +22 -0
  230. package/dist/building/door-types.d.ts.map +1 -0
  231. package/dist/building/door-types.js +167 -0
  232. package/dist/building/floor-item-fit.d.ts +38 -0
  233. package/dist/building/floor-item-fit.d.ts.map +1 -0
  234. package/dist/building/floor-item-fit.js +47 -0
  235. package/dist/building/index.d.ts +7 -0
  236. package/dist/building/index.d.ts.map +1 -0
  237. package/dist/building/index.js +6 -0
  238. package/dist/building/level-duplication.d.ts +8983 -0
  239. package/dist/building/level-duplication.d.ts.map +1 -0
  240. package/dist/building/level-duplication.js +314 -0
  241. package/dist/building/opening-style-presets.d.ts +46 -0
  242. package/dist/building/opening-style-presets.d.ts.map +1 -0
  243. package/dist/building/opening-style-presets.js +195 -0
  244. package/dist/building/wall-openings.d.ts +445 -0
  245. package/dist/building/wall-openings.d.ts.map +1 -0
  246. package/dist/building/wall-openings.js +231 -0
  247. package/dist/building/window-types.d.ts +17 -0
  248. package/dist/building/window-types.d.ts.map +1 -0
  249. package/dist/building/window-types.js +31 -0
  250. package/dist/commands/structure/apply-zone-transform.d.ts +23 -0
  251. package/dist/commands/structure/apply-zone-transform.d.ts.map +1 -0
  252. package/dist/commands/structure/apply-zone-transform.js +55 -0
  253. package/dist/commands/structure/create-mezzanine.d.ts +12 -0
  254. package/dist/commands/structure/create-mezzanine.d.ts.map +1 -0
  255. package/dist/commands/structure/create-mezzanine.js +46 -0
  256. package/dist/commands/structure/create-zone.d.ts +32 -0
  257. package/dist/commands/structure/create-zone.d.ts.map +1 -0
  258. package/dist/commands/structure/create-zone.js +126 -0
  259. package/dist/commands/structure/delete-zone.d.ts +51 -0
  260. package/dist/commands/structure/delete-zone.d.ts.map +1 -0
  261. package/dist/commands/structure/delete-zone.js +354 -0
  262. package/dist/commands/structure/divide-zone.d.ts +38 -0
  263. package/dist/commands/structure/divide-zone.d.ts.map +1 -0
  264. package/dist/commands/structure/divide-zone.js +186 -0
  265. package/dist/commands/structure/duplicate-zone.d.ts +7 -0
  266. package/dist/commands/structure/duplicate-zone.d.ts.map +1 -0
  267. package/dist/commands/structure/duplicate-zone.js +21 -0
  268. package/dist/commands/structure/floor-opening.d.ts +36 -0
  269. package/dist/commands/structure/floor-opening.d.ts.map +1 -0
  270. package/dist/commands/structure/floor-opening.js +124 -0
  271. package/dist/commands/structure/index.d.ts +22 -0
  272. package/dist/commands/structure/index.d.ts.map +1 -0
  273. package/dist/commands/structure/index.js +20 -0
  274. package/dist/commands/structure/lock-outside-faces.d.ts +12 -0
  275. package/dist/commands/structure/lock-outside-faces.d.ts.map +1 -0
  276. package/dist/commands/structure/lock-outside-faces.js +32 -0
  277. package/dist/commands/structure/merge-zones.d.ts +5 -0
  278. package/dist/commands/structure/merge-zones.d.ts.map +1 -0
  279. package/dist/commands/structure/merge-zones.js +22 -0
  280. package/dist/commands/structure/mezzanine-content.d.ts +16 -0
  281. package/dist/commands/structure/mezzanine-content.d.ts.map +1 -0
  282. package/dist/commands/structure/mezzanine-content.js +109 -0
  283. package/dist/commands/structure/plan-mezzanine-stair.d.ts +7 -0
  284. package/dist/commands/structure/plan-mezzanine-stair.d.ts.map +1 -0
  285. package/dist/commands/structure/plan-mezzanine-stair.js +127 -0
  286. package/dist/commands/structure/plan-wall-deletion.d.ts +9 -0
  287. package/dist/commands/structure/plan-wall-deletion.d.ts.map +1 -0
  288. package/dist/commands/structure/plan-wall-deletion.js +151 -0
  289. package/dist/commands/structure/rebase-floor-reference.d.ts +7 -0
  290. package/dist/commands/structure/rebase-floor-reference.d.ts.map +1 -0
  291. package/dist/commands/structure/rebase-floor-reference.js +90 -0
  292. package/dist/commands/structure/resize-mezzanine.d.ts +8 -0
  293. package/dist/commands/structure/resize-mezzanine.d.ts.map +1 -0
  294. package/dist/commands/structure/resize-mezzanine.js +43 -0
  295. package/dist/commands/structure/rotate-zone.d.ts +8 -0
  296. package/dist/commands/structure/rotate-zone.d.ts.map +1 -0
  297. package/dist/commands/structure/rotate-zone.js +28 -0
  298. package/dist/commands/structure/set-floor-foundation.d.ts +62 -0
  299. package/dist/commands/structure/set-floor-foundation.d.ts.map +1 -0
  300. package/dist/commands/structure/set-floor-foundation.js +162 -0
  301. package/dist/commands/structure/set-room-floor-construction.d.ts +8 -0
  302. package/dist/commands/structure/set-room-floor-construction.d.ts.map +1 -0
  303. package/dist/commands/structure/set-room-floor-construction.js +72 -0
  304. package/dist/commands/structure/set-wall-geometry.d.ts +10 -0
  305. package/dist/commands/structure/set-wall-geometry.d.ts.map +1 -0
  306. package/dist/commands/structure/set-wall-geometry.js +52 -0
  307. package/dist/commands/structure/set-zone-edges.d.ts +14 -0
  308. package/dist/commands/structure/set-zone-edges.d.ts.map +1 -0
  309. package/dist/commands/structure/set-zone-edges.js +143 -0
  310. package/dist/commands/structure/set-zone-intent.d.ts +39 -0
  311. package/dist/commands/structure/set-zone-intent.d.ts.map +1 -0
  312. package/dist/commands/structure/set-zone-intent.js +125 -0
  313. package/dist/commands/structure/shared.d.ts +4512 -0
  314. package/dist/commands/structure/shared.d.ts.map +1 -0
  315. package/dist/commands/structure/shared.js +102 -0
  316. package/dist/commands/structure/transform-zone.d.ts +23 -0
  317. package/dist/commands/structure/transform-zone.d.ts.map +1 -0
  318. package/dist/commands/structure/transform-zone.js +472 -0
  319. package/dist/commands/structure/validate-mezzanine.d.ts +5 -0
  320. package/dist/commands/structure/validate-mezzanine.d.ts.map +1 -0
  321. package/dist/commands/structure/validate-mezzanine.js +46 -0
  322. package/dist/commands/structure/zone-crossings.d.ts +8 -0
  323. package/dist/commands/structure/zone-crossings.d.ts.map +1 -0
  324. package/dist/commands/structure/zone-crossings.js +162 -0
  325. package/dist/commands/structure/zone-drop.d.ts +4 -0
  326. package/dist/commands/structure/zone-drop.d.ts.map +1 -0
  327. package/dist/commands/structure/zone-drop.js +68 -0
  328. package/dist/commands/structure/zone-insertion.d.ts +4 -0
  329. package/dist/commands/structure/zone-insertion.d.ts.map +1 -0
  330. package/dist/commands/structure/zone-insertion.js +200 -0
  331. package/dist/commands/structure/zone-transform-content.d.ts +6 -0
  332. package/dist/commands/structure/zone-transform-content.d.ts.map +1 -0
  333. package/dist/commands/structure/zone-transform-content.js +117 -0
  334. package/dist/commands/structure/zone-wall-merge.d.ts +4977 -0
  335. package/dist/commands/structure/zone-wall-merge.d.ts.map +1 -0
  336. package/dist/commands/structure/zone-wall-merge.js +135 -0
  337. package/dist/contracts/reference-discovery.d.ts +18 -0
  338. package/dist/contracts/reference-discovery.d.ts.map +1 -0
  339. package/dist/contracts/reference-discovery.js +100 -0
  340. package/dist/contracts/reference-inventory.d.ts +44 -0
  341. package/dist/contracts/reference-inventory.d.ts.map +1 -0
  342. package/dist/contracts/reference-inventory.js +872 -0
  343. package/dist/events/bus.d.ts +70 -9
  344. package/dist/events/bus.d.ts.map +1 -1
  345. package/dist/hooks/scene-registry/item-clip-registry.d.ts +6 -3
  346. package/dist/hooks/scene-registry/item-clip-registry.d.ts.map +1 -1
  347. package/dist/hooks/scene-registry/item-clip-registry.js +2 -1
  348. package/dist/hooks/spatial-grid/floor-placed-elevation.d.ts.map +1 -1
  349. package/dist/hooks/spatial-grid/floor-placed-elevation.js +15 -1
  350. package/dist/hooks/spatial-grid/spatial-grid-manager.d.ts +3 -2
  351. package/dist/hooks/spatial-grid/spatial-grid-manager.d.ts.map +1 -1
  352. package/dist/hooks/spatial-grid/spatial-grid-manager.js +53 -66
  353. package/dist/hooks/spatial-grid/spatial-grid-sync.d.ts +1650 -131
  354. package/dist/hooks/spatial-grid/spatial-grid-sync.d.ts.map +1 -1
  355. package/dist/hooks/spatial-grid/spatial-grid-sync.js +86 -83
  356. package/dist/hooks/spatial-grid/support-host-patch.d.ts +1 -0
  357. package/dist/hooks/spatial-grid/support-host-patch.d.ts.map +1 -1
  358. package/dist/hooks/spatial-grid/support-host-patch.js +12 -5
  359. package/dist/index.d.ts +83 -13
  360. package/dist/index.d.ts.map +1 -1
  361. package/dist/index.js +78 -11
  362. package/dist/lib/__bench__/near-linear-walls.d.ts +2 -0
  363. package/dist/lib/__bench__/near-linear-walls.d.ts.map +1 -0
  364. package/dist/lib/__bench__/near-linear-walls.js +24 -0
  365. package/dist/lib/__bench__/structure-preview.bench.d.ts +2 -0
  366. package/dist/lib/__bench__/structure-preview.bench.d.ts.map +1 -0
  367. package/dist/lib/__bench__/structure-preview.bench.js +72 -0
  368. package/dist/lib/__fixtures__/mezzanine.d.ts +13968 -0
  369. package/dist/lib/__fixtures__/mezzanine.d.ts.map +1 -0
  370. package/dist/lib/__fixtures__/mezzanine.js +43 -0
  371. package/dist/lib/absorb-wall-separators.d.ts +4483 -0
  372. package/dist/lib/absorb-wall-separators.d.ts.map +1 -0
  373. package/dist/lib/absorb-wall-separators.js +65 -0
  374. package/dist/lib/angle-accumulator.d.ts +3 -0
  375. package/dist/lib/angle-accumulator.d.ts.map +1 -0
  376. package/dist/lib/angle-accumulator.js +13 -0
  377. package/dist/lib/artifact-store.d.ts +31 -0
  378. package/dist/lib/artifact-store.d.ts.map +1 -0
  379. package/dist/lib/artifact-store.js +42 -0
  380. package/dist/lib/assembly-stack.d.ts +54 -0
  381. package/dist/lib/assembly-stack.d.ts.map +1 -0
  382. package/dist/lib/assembly-stack.js +52 -0
  383. package/dist/lib/asset-storage.d.ts.map +1 -1
  384. package/dist/lib/asset-storage.js +3 -0
  385. package/dist/lib/canonical-opening-ring.d.ts +3 -0
  386. package/dist/lib/canonical-opening-ring.d.ts.map +1 -0
  387. package/dist/lib/canonical-opening-ring.js +14 -0
  388. package/dist/lib/ceiling-children.d.ts +8 -0
  389. package/dist/lib/ceiling-children.d.ts.map +1 -0
  390. package/dist/lib/ceiling-children.js +36 -0
  391. package/dist/lib/ceiling-surface.d.ts +40 -0
  392. package/dist/lib/ceiling-surface.d.ts.map +1 -0
  393. package/dist/lib/ceiling-surface.js +65 -0
  394. package/dist/lib/cutter-host.d.ts +5 -0
  395. package/dist/lib/cutter-host.d.ts.map +1 -0
  396. package/dist/lib/cutter-host.js +30 -0
  397. package/dist/lib/floor-construction-lift.d.ts +4 -0
  398. package/dist/lib/floor-construction-lift.d.ts.map +1 -0
  399. package/dist/lib/floor-construction-lift.js +54 -0
  400. package/dist/lib/floor-footprint-key.d.ts +3 -0
  401. package/dist/lib/floor-footprint-key.d.ts.map +1 -0
  402. package/dist/lib/floor-footprint-key.js +9 -0
  403. package/dist/lib/floor-footprint-name.d.ts +11 -0
  404. package/dist/lib/floor-footprint-name.d.ts.map +1 -0
  405. package/dist/lib/floor-footprint-name.js +52 -0
  406. package/dist/lib/floor-foundation-datum.d.ts +31 -0
  407. package/dist/lib/floor-foundation-datum.d.ts.map +1 -0
  408. package/dist/lib/floor-foundation-datum.js +226 -0
  409. package/dist/lib/floor-foundation-stack.d.ts +16 -0
  410. package/dist/lib/floor-foundation-stack.d.ts.map +1 -0
  411. package/dist/lib/floor-foundation-stack.js +214 -0
  412. package/dist/lib/floor-intent-changes.d.ts +10 -0
  413. package/dist/lib/floor-intent-changes.d.ts.map +1 -0
  414. package/dist/lib/floor-intent-changes.js +461 -0
  415. package/dist/lib/floor-opening-footprints.d.ts +24 -0
  416. package/dist/lib/floor-opening-footprints.d.ts.map +1 -0
  417. package/dist/lib/floor-opening-footprints.js +127 -0
  418. package/dist/lib/floor-opening-intent.d.ts +16 -0
  419. package/dist/lib/floor-opening-intent.d.ts.map +1 -0
  420. package/dist/lib/floor-opening-intent.js +82 -0
  421. package/dist/lib/floor-plate-id.d.ts +5 -0
  422. package/dist/lib/floor-plate-id.d.ts.map +1 -0
  423. package/dist/lib/floor-plate-id.js +20 -0
  424. package/dist/lib/floor-plate-paint.d.ts +8 -0
  425. package/dist/lib/floor-plate-paint.d.ts.map +1 -0
  426. package/dist/lib/floor-plate-paint.js +11 -0
  427. package/dist/lib/floor-plates.d.ts +211 -0
  428. package/dist/lib/floor-plates.d.ts.map +1 -0
  429. package/dist/lib/floor-plates.js +729 -0
  430. package/dist/lib/floor-room-faces.d.ts +5 -0
  431. package/dist/lib/floor-room-faces.d.ts.map +1 -0
  432. package/dist/lib/floor-room-faces.js +29 -0
  433. package/dist/lib/floor-step-finish.d.ts +49 -0
  434. package/dist/lib/floor-step-finish.d.ts.map +1 -0
  435. package/dist/lib/floor-step-finish.js +128 -0
  436. package/dist/lib/geometry-script-node.d.ts +82 -0
  437. package/dist/lib/geometry-script-node.d.ts.map +1 -0
  438. package/dist/lib/geometry-script-node.js +147 -0
  439. package/dist/lib/geometry-surfaces.d.ts +61 -0
  440. package/dist/lib/geometry-surfaces.d.ts.map +1 -0
  441. package/dist/lib/geometry-surfaces.js +156 -0
  442. package/dist/lib/item-slab-support.d.ts +14 -0
  443. package/dist/lib/item-slab-support.d.ts.map +1 -0
  444. package/dist/lib/item-slab-support.js +40 -0
  445. package/dist/lib/level-footprints.d.ts +23 -0
  446. package/dist/lib/level-footprints.d.ts.map +1 -0
  447. package/dist/lib/level-footprints.js +398 -0
  448. package/dist/lib/level-name.d.ts +7 -0
  449. package/dist/lib/level-name.d.ts.map +1 -1
  450. package/dist/lib/level-name.js +11 -3
  451. package/dist/lib/new-zone.d.ts +10 -0
  452. package/dist/lib/new-zone.d.ts.map +1 -0
  453. package/dist/lib/new-zone.js +10 -0
  454. package/dist/lib/node-ancestry.d.ts +30 -0
  455. package/dist/lib/node-ancestry.d.ts.map +1 -0
  456. package/dist/lib/node-ancestry.js +76 -0
  457. package/dist/lib/node-visibility.d.ts +12 -0
  458. package/dist/lib/node-visibility.d.ts.map +1 -0
  459. package/dist/lib/node-visibility.js +12 -0
  460. package/dist/lib/object-cuts.d.ts +11 -0
  461. package/dist/lib/object-cuts.d.ts.map +1 -0
  462. package/dist/lib/object-cuts.js +63 -0
  463. package/dist/lib/opening-floor-datum.d.ts +24 -0
  464. package/dist/lib/opening-floor-datum.d.ts.map +1 -0
  465. package/dist/lib/opening-floor-datum.js +145 -0
  466. package/dist/lib/own-floor-intent.d.ts +15 -0
  467. package/dist/lib/own-floor-intent.d.ts.map +1 -0
  468. package/dist/lib/own-floor-intent.js +201 -0
  469. package/dist/lib/plate-reference.d.ts +3 -0
  470. package/dist/lib/plate-reference.d.ts.map +1 -0
  471. package/dist/lib/plate-reference.js +91 -0
  472. package/dist/lib/plate-surface.d.ts +120 -0
  473. package/dist/lib/plate-surface.d.ts.map +1 -0
  474. package/dist/lib/plate-surface.js +725 -0
  475. package/dist/lib/polygon-boolean.d.ts +17 -0
  476. package/dist/lib/polygon-boolean.d.ts.map +1 -0
  477. package/dist/lib/polygon-boolean.js +195 -0
  478. package/dist/lib/polygon-label.d.ts +7 -0
  479. package/dist/lib/polygon-label.d.ts.map +1 -0
  480. package/dist/lib/polygon-label.js +94 -0
  481. package/dist/lib/room-drawn-floor.d.ts +29 -0
  482. package/dist/lib/room-drawn-floor.d.ts.map +1 -0
  483. package/dist/lib/room-drawn-floor.js +88 -0
  484. package/dist/lib/room-floor-choices.d.ts +11 -0
  485. package/dist/lib/room-floor-choices.d.ts.map +1 -0
  486. package/dist/lib/room-floor-choices.js +60 -0
  487. package/dist/lib/room-floor-feasibility.d.ts +25 -0
  488. package/dist/lib/room-floor-feasibility.d.ts.map +1 -0
  489. package/dist/lib/room-floor-feasibility.js +293 -0
  490. package/dist/lib/room-floor-plate.d.ts +3 -0
  491. package/dist/lib/room-floor-plate.d.ts.map +1 -0
  492. package/dist/lib/room-floor-plate.js +4 -0
  493. package/dist/lib/room-graph.d.ts +79 -0
  494. package/dist/lib/room-graph.d.ts.map +1 -0
  495. package/dist/lib/room-graph.js +1265 -0
  496. package/dist/lib/room-name.d.ts +10 -0
  497. package/dist/lib/room-name.d.ts.map +1 -0
  498. package/dist/lib/room-name.js +22 -0
  499. package/dist/lib/room-topology-index.d.ts +53 -5
  500. package/dist/lib/room-topology-index.d.ts.map +1 -1
  501. package/dist/lib/room-topology-index.js +176 -30
  502. package/dist/lib/room-vertical-placement.d.ts +12 -0
  503. package/dist/lib/room-vertical-placement.d.ts.map +1 -0
  504. package/dist/lib/room-vertical-placement.js +28 -0
  505. package/dist/lib/room-zone-adoption.d.ts +74 -0
  506. package/dist/lib/room-zone-adoption.d.ts.map +1 -0
  507. package/dist/lib/room-zone-adoption.js +150 -0
  508. package/dist/lib/setback-envelope.d.ts +73 -0
  509. package/dist/lib/setback-envelope.d.ts.map +1 -0
  510. package/dist/lib/setback-envelope.js +506 -0
  511. package/dist/lib/slab-polygon.d.ts.map +1 -1
  512. package/dist/lib/slab-polygon.js +33 -12
  513. package/dist/lib/slots.d.ts +20 -0
  514. package/dist/lib/slots.d.ts.map +1 -1
  515. package/dist/lib/slots.js +44 -0
  516. package/dist/lib/space-detection.d.ts +14 -94
  517. package/dist/lib/space-detection.d.ts.map +1 -1
  518. package/dist/lib/space-detection.js +244 -1616
  519. package/dist/lib/structure-commit.d.ts +38 -0
  520. package/dist/lib/structure-commit.d.ts.map +1 -0
  521. package/dist/lib/structure-commit.js +52 -0
  522. package/dist/lib/structure-kernel.d.ts +66 -0
  523. package/dist/lib/structure-kernel.d.ts.map +1 -0
  524. package/dist/lib/structure-kernel.js +735 -0
  525. package/dist/lib/structure-reconcile.d.ts +15 -0
  526. package/dist/lib/structure-reconcile.d.ts.map +1 -0
  527. package/dist/lib/structure-reconcile.js +218 -0
  528. package/dist/lib/terrain-contours.d.ts +29 -0
  529. package/dist/lib/terrain-contours.d.ts.map +1 -0
  530. package/dist/lib/terrain-contours.js +199 -0
  531. package/dist/lib/terrain-source-persisted.d.ts +42 -0
  532. package/dist/lib/terrain-source-persisted.d.ts.map +1 -0
  533. package/dist/lib/terrain-source-persisted.js +68 -0
  534. package/dist/lib/terrain-source.d.ts +2 -40
  535. package/dist/lib/terrain-source.d.ts.map +1 -1
  536. package/dist/lib/terrain-source.js +2 -68
  537. package/dist/lib/terrain-support-query.d.ts +83 -0
  538. package/dist/lib/terrain-support-query.d.ts.map +1 -0
  539. package/dist/lib/terrain-support-query.js +187 -0
  540. package/dist/lib/terrain-support.d.ts +1 -77
  541. package/dist/lib/terrain-support.d.ts.map +1 -1
  542. package/dist/lib/terrain-support.js +3 -181
  543. package/dist/lib/unit-containment.js +2 -2
  544. package/dist/lib/unit-report.d.ts.map +1 -1
  545. package/dist/lib/unit-report.js +5 -4
  546. package/dist/lib/zone-colors.d.ts +11 -0
  547. package/dist/lib/zone-colors.d.ts.map +1 -0
  548. package/dist/lib/zone-colors.js +32 -0
  549. package/dist/lib/zone-quantities.d.ts.map +1 -1
  550. package/dist/lib/zone-quantities.js +113 -223
  551. package/dist/material-library.d.ts +9 -1
  552. package/dist/material-library.d.ts.map +1 -1
  553. package/dist/material-library.js +550 -1
  554. package/dist/node-slots/block.d.ts +7 -0
  555. package/dist/node-slots/block.d.ts.map +1 -0
  556. package/dist/node-slots/block.js +27 -0
  557. package/dist/node-slots/cabinet.d.ts +4 -0
  558. package/dist/node-slots/cabinet.d.ts.map +1 -0
  559. package/dist/node-slots/cabinet.js +24 -0
  560. package/dist/node-slots/ceiling.d.ts +6 -0
  561. package/dist/node-slots/ceiling.d.ts.map +1 -0
  562. package/dist/node-slots/ceiling.js +7 -0
  563. package/dist/node-slots/column.d.ts +9 -0
  564. package/dist/node-slots/column.d.ts.map +1 -0
  565. package/dist/node-slots/column.js +24 -0
  566. package/dist/node-slots/door.d.ts +9 -0
  567. package/dist/node-slots/door.d.ts.map +1 -0
  568. package/dist/node-slots/door.js +20 -0
  569. package/dist/node-slots/duct.d.ts +5 -0
  570. package/dist/node-slots/duct.d.ts.map +1 -0
  571. package/dist/node-slots/duct.js +5 -0
  572. package/dist/node-slots/elevator.d.ts +9 -0
  573. package/dist/node-slots/elevator.d.ts.map +1 -0
  574. package/dist/node-slots/elevator.js +17 -0
  575. package/dist/node-slots/fence.d.ts +10 -0
  576. package/dist/node-slots/fence.d.ts.map +1 -0
  577. package/dist/node-slots/fence.js +23 -0
  578. package/dist/node-slots/index.d.ts +25 -0
  579. package/dist/node-slots/index.d.ts.map +1 -0
  580. package/dist/node-slots/index.js +92 -0
  581. package/dist/node-slots/lean-to-extension.d.ts +5 -0
  582. package/dist/node-slots/lean-to-extension.d.ts.map +1 -0
  583. package/dist/node-slots/lean-to-extension.js +15 -0
  584. package/dist/node-slots/procedural-item.d.ts +4 -0
  585. package/dist/node-slots/procedural-item.d.ts.map +1 -0
  586. package/dist/node-slots/procedural-item.js +3 -0
  587. package/dist/node-slots/roof-accessories.d.ts +9 -0
  588. package/dist/node-slots/roof-accessories.d.ts.map +1 -0
  589. package/dist/node-slots/roof-accessories.js +34 -0
  590. package/dist/node-slots/shelf.d.ts +9 -0
  591. package/dist/node-slots/shelf.d.ts.map +1 -0
  592. package/dist/node-slots/shelf.js +30 -0
  593. package/dist/node-slots/slab.d.ts +7 -0
  594. package/dist/node-slots/slab.d.ts.map +1 -0
  595. package/dist/node-slots/slab.js +21 -0
  596. package/dist/node-slots/stair.d.ts +8 -0
  597. package/dist/node-slots/stair.d.ts.map +1 -0
  598. package/dist/node-slots/stair.js +17 -0
  599. package/dist/node-slots/wall.d.ts +12 -0
  600. package/dist/node-slots/wall.d.ts.map +1 -0
  601. package/dist/node-slots/wall.js +55 -0
  602. package/dist/node-slots/window.d.ts +5 -0
  603. package/dist/node-slots/window.d.ts.map +1 -0
  604. package/dist/node-slots/window.js +11 -0
  605. package/dist/procedural-items/design-placement.d.ts +49 -0
  606. package/dist/procedural-items/design-placement.d.ts.map +1 -0
  607. package/dist/procedural-items/design-placement.js +129 -0
  608. package/dist/procedural-items/design.d.ts +261 -0
  609. package/dist/procedural-items/design.d.ts.map +1 -0
  610. package/dist/procedural-items/design.js +707 -0
  611. package/dist/procedural-items/fixtures.d.ts +464 -24
  612. package/dist/procedural-items/fixtures.d.ts.map +1 -1
  613. package/dist/procedural-items/index.d.ts +5 -0
  614. package/dist/procedural-items/index.d.ts.map +1 -1
  615. package/dist/procedural-items/index.js +5 -0
  616. package/dist/procedural-items/integration.d.ts +127 -6
  617. package/dist/procedural-items/integration.d.ts.map +1 -1
  618. package/dist/procedural-items/joints.d.ts +56 -0
  619. package/dist/procedural-items/joints.d.ts.map +1 -0
  620. package/dist/procedural-items/joints.js +251 -0
  621. package/dist/procedural-items/library-colors.d.ts +12 -0
  622. package/dist/procedural-items/library-colors.d.ts.map +1 -1
  623. package/dist/procedural-items/library-colors.js +37 -3
  624. package/dist/procedural-items/motion-controller.d.ts +29 -0
  625. package/dist/procedural-items/motion-controller.d.ts.map +1 -0
  626. package/dist/procedural-items/motion-controller.js +130 -0
  627. package/dist/procedural-items/node.d.ts +490 -24
  628. package/dist/procedural-items/node.d.ts.map +1 -1
  629. package/dist/procedural-items/query.d.ts +19 -1
  630. package/dist/procedural-items/query.d.ts.map +1 -1
  631. package/dist/procedural-items/query.js +131 -48
  632. package/dist/procedural-items/recipe.d.ts +258 -14
  633. package/dist/procedural-items/recipe.d.ts.map +1 -1
  634. package/dist/procedural-items/recipe.js +933 -61
  635. package/dist/procedural-items/section.d.ts +27 -0
  636. package/dist/procedural-items/section.d.ts.map +1 -0
  637. package/dist/procedural-items/section.js +237 -0
  638. package/dist/procedural-items/spatial.d.ts +21 -0
  639. package/dist/procedural-items/spatial.d.ts.map +1 -1
  640. package/dist/procedural-items/spatial.js +90 -0
  641. package/dist/registry/handles.d.ts +30 -1
  642. package/dist/registry/handles.d.ts.map +1 -1
  643. package/dist/registry/index.d.ts +7 -5
  644. package/dist/registry/index.d.ts.map +1 -1
  645. package/dist/registry/index.js +4 -2
  646. package/dist/registry/mechanism.d.ts +9 -0
  647. package/dist/registry/mechanism.d.ts.map +1 -0
  648. package/dist/registry/mechanism.js +21 -0
  649. package/dist/registry/registry.d.ts +6 -3
  650. package/dist/registry/registry.d.ts.map +1 -1
  651. package/dist/registry/registry.js +59 -22
  652. package/dist/registry/scene-api.d.ts +20 -0
  653. package/dist/registry/scene-api.d.ts.map +1 -1
  654. package/dist/registry/scene-api.js +26 -13
  655. package/dist/registry/subtree.d.ts +8 -0
  656. package/dist/registry/subtree.d.ts.map +1 -1
  657. package/dist/registry/subtree.js +59 -0
  658. package/dist/registry/types.d.ts +352 -13
  659. package/dist/registry/types.d.ts.map +1 -1
  660. package/dist/schema/__fixtures__/node-fixtures.d.ts.map +1 -1
  661. package/dist/schema/__fixtures__/node-fixtures.js +2 -0
  662. package/dist/schema/assembly.d.ts +153 -0
  663. package/dist/schema/assembly.d.ts.map +1 -0
  664. package/dist/schema/assembly.js +155 -0
  665. package/dist/schema/asset-url.d.ts +2 -1
  666. package/dist/schema/asset-url.d.ts.map +1 -1
  667. package/dist/schema/asset-url.js +5 -2
  668. package/dist/schema/base.d.ts +26 -0
  669. package/dist/schema/base.d.ts.map +1 -1
  670. package/dist/schema/base.js +2 -0
  671. package/dist/schema/collection-templates.d.ts +46 -0
  672. package/dist/schema/collection-templates.d.ts.map +1 -0
  673. package/dist/schema/collection-templates.js +14 -0
  674. package/dist/schema/collections.d.ts +7 -0
  675. package/dist/schema/collections.d.ts.map +1 -1
  676. package/dist/schema/cut.d.ts +29 -0
  677. package/dist/schema/cut.d.ts.map +1 -0
  678. package/dist/schema/cut.js +50 -0
  679. package/dist/schema/geometry-metadata.d.ts +51 -0
  680. package/dist/schema/geometry-metadata.d.ts.map +1 -0
  681. package/dist/schema/geometry-metadata.js +57 -0
  682. package/dist/schema/geometry-source.d.ts +250 -0
  683. package/dist/schema/geometry-source.d.ts.map +1 -0
  684. package/dist/schema/geometry-source.js +130 -0
  685. package/dist/schema/index.d.ts +20 -7
  686. package/dist/schema/index.d.ts.map +1 -1
  687. package/dist/schema/index.js +22 -5
  688. package/dist/schema/nodes/block.d.ts +28 -2
  689. package/dist/schema/nodes/block.d.ts.map +1 -1
  690. package/dist/schema/nodes/block.js +22 -9
  691. package/dist/schema/nodes/box-vent.d.ts +26 -0
  692. package/dist/schema/nodes/box-vent.d.ts.map +1 -1
  693. package/dist/schema/nodes/building.d.ts +26 -0
  694. package/dist/schema/nodes/building.d.ts.map +1 -1
  695. package/dist/schema/nodes/cabinet.d.ts +61 -9
  696. package/dist/schema/nodes/cabinet.d.ts.map +1 -1
  697. package/dist/schema/nodes/ceiling.d.ts +37 -0
  698. package/dist/schema/nodes/ceiling.d.ts.map +1 -1
  699. package/dist/schema/nodes/ceiling.js +8 -0
  700. package/dist/schema/nodes/chimney.d.ts +26 -0
  701. package/dist/schema/nodes/chimney.d.ts.map +1 -1
  702. package/dist/schema/nodes/column.d.ts +126 -0
  703. package/dist/schema/nodes/column.d.ts.map +1 -1
  704. package/dist/schema/nodes/column.js +2 -0
  705. package/dist/schema/nodes/construction-dimension.d.ts +26 -0
  706. package/dist/schema/nodes/construction-dimension.d.ts.map +1 -1
  707. package/dist/schema/nodes/cupola.d.ts +26 -0
  708. package/dist/schema/nodes/cupola.d.ts.map +1 -1
  709. package/dist/schema/nodes/curtain-wall.d.ts +129 -0
  710. package/dist/schema/nodes/curtain-wall.d.ts.map +1 -0
  711. package/dist/schema/nodes/curtain-wall.js +49 -0
  712. package/dist/schema/nodes/door.d.ts +141 -22
  713. package/dist/schema/nodes/door.d.ts.map +1 -1
  714. package/dist/schema/nodes/door.js +18 -33
  715. package/dist/schema/nodes/dormer.d.ts +28 -2
  716. package/dist/schema/nodes/dormer.d.ts.map +1 -1
  717. package/dist/schema/nodes/downspout.d.ts +27 -1
  718. package/dist/schema/nodes/downspout.d.ts.map +1 -1
  719. package/dist/schema/nodes/duct-fitting.d.ts +27 -1
  720. package/dist/schema/nodes/duct-fitting.d.ts.map +1 -1
  721. package/dist/schema/nodes/duct-segment.d.ts +27 -1
  722. package/dist/schema/nodes/duct-segment.d.ts.map +1 -1
  723. package/dist/schema/nodes/duct-terminal.d.ts +26 -0
  724. package/dist/schema/nodes/duct-terminal.d.ts.map +1 -1
  725. package/dist/schema/nodes/elevator.d.ts +26 -0
  726. package/dist/schema/nodes/elevator.d.ts.map +1 -1
  727. package/dist/schema/nodes/eyebrow-vent.d.ts +26 -0
  728. package/dist/schema/nodes/eyebrow-vent.d.ts.map +1 -1
  729. package/dist/schema/nodes/fence-feature.d.ts +141 -0
  730. package/dist/schema/nodes/fence-feature.d.ts.map +1 -0
  731. package/dist/schema/nodes/fence-feature.js +21 -0
  732. package/dist/schema/nodes/fence.d.ts +186 -0
  733. package/dist/schema/nodes/fence.d.ts.map +1 -1
  734. package/dist/schema/nodes/fence.js +92 -7
  735. package/dist/schema/nodes/floor-opening.d.ts +61 -0
  736. package/dist/schema/nodes/floor-opening.d.ts.map +1 -0
  737. package/dist/schema/nodes/floor-opening.js +17 -0
  738. package/dist/schema/nodes/guide.d.ts +26 -0
  739. package/dist/schema/nodes/guide.d.ts.map +1 -1
  740. package/dist/schema/nodes/gutter.d.ts +26 -0
  741. package/dist/schema/nodes/gutter.d.ts.map +1 -1
  742. package/dist/schema/nodes/hvac-equipment.d.ts +26 -0
  743. package/dist/schema/nodes/hvac-equipment.d.ts.map +1 -1
  744. package/dist/schema/nodes/imported-mesh.d.ts +26 -0
  745. package/dist/schema/nodes/imported-mesh.d.ts.map +1 -1
  746. package/dist/schema/nodes/item.d.ts +153 -2
  747. package/dist/schema/nodes/item.d.ts.map +1 -1
  748. package/dist/schema/nodes/item.js +13 -0
  749. package/dist/schema/nodes/lean-to-extension.d.ts +26 -0
  750. package/dist/schema/nodes/lean-to-extension.d.ts.map +1 -1
  751. package/dist/schema/nodes/level.d.ts +27 -1
  752. package/dist/schema/nodes/level.d.ts.map +1 -1
  753. package/dist/schema/nodes/lineset.d.ts +26 -0
  754. package/dist/schema/nodes/lineset.d.ts.map +1 -1
  755. package/dist/schema/nodes/liquid-line.d.ts +26 -0
  756. package/dist/schema/nodes/liquid-line.d.ts.map +1 -1
  757. package/dist/schema/nodes/measurement.d.ts +26 -0
  758. package/dist/schema/nodes/measurement.d.ts.map +1 -1
  759. package/dist/schema/nodes/opening-types.d.ts +41 -0
  760. package/dist/schema/nodes/opening-types.d.ts.map +1 -0
  761. package/dist/schema/nodes/opening-types.js +48 -0
  762. package/dist/schema/nodes/pipe-fitting.d.ts +26 -0
  763. package/dist/schema/nodes/pipe-fitting.d.ts.map +1 -1
  764. package/dist/schema/nodes/pipe-segment.d.ts +26 -0
  765. package/dist/schema/nodes/pipe-segment.d.ts.map +1 -1
  766. package/dist/schema/nodes/pipe-trap.d.ts +26 -0
  767. package/dist/schema/nodes/pipe-trap.d.ts.map +1 -1
  768. package/dist/schema/nodes/ridge-vent.d.ts +26 -0
  769. package/dist/schema/nodes/ridge-vent.d.ts.map +1 -1
  770. package/dist/schema/nodes/roof-segment-walls.d.ts.map +1 -1
  771. package/dist/schema/nodes/roof-segment-walls.js +2 -1
  772. package/dist/schema/nodes/roof-segment.d.ts +30 -2
  773. package/dist/schema/nodes/roof-segment.d.ts.map +1 -1
  774. package/dist/schema/nodes/roof-segment.js +9 -0
  775. package/dist/schema/nodes/roof.d.ts +101 -0
  776. package/dist/schema/nodes/roof.d.ts.map +1 -1
  777. package/dist/schema/nodes/roof.js +6 -0
  778. package/dist/schema/nodes/scan.d.ts +26 -0
  779. package/dist/schema/nodes/scan.d.ts.map +1 -1
  780. package/dist/schema/nodes/separator.d.ts +50 -0
  781. package/dist/schema/nodes/separator.d.ts.map +1 -0
  782. package/dist/schema/nodes/separator.js +8 -0
  783. package/dist/schema/nodes/shelf.d.ts +26 -0
  784. package/dist/schema/nodes/shelf.d.ts.map +1 -1
  785. package/dist/schema/nodes/site.d.ts +192 -0
  786. package/dist/schema/nodes/site.d.ts.map +1 -1
  787. package/dist/schema/nodes/site.js +178 -1
  788. package/dist/schema/nodes/skylight.d.ts +30 -4
  789. package/dist/schema/nodes/skylight.d.ts.map +1 -1
  790. package/dist/schema/nodes/slab.d.ts +84 -0
  791. package/dist/schema/nodes/slab.d.ts.map +1 -1
  792. package/dist/schema/nodes/slab.js +37 -2
  793. package/dist/schema/nodes/solar-panel.d.ts +26 -0
  794. package/dist/schema/nodes/solar-panel.d.ts.map +1 -1
  795. package/dist/schema/nodes/spawn.d.ts +26 -0
  796. package/dist/schema/nodes/spawn.d.ts.map +1 -1
  797. package/dist/schema/nodes/stair-construction.d.ts +21 -0
  798. package/dist/schema/nodes/stair-construction.d.ts.map +1 -0
  799. package/dist/schema/nodes/stair-construction.js +13 -0
  800. package/dist/schema/nodes/stair-design-targets.d.ts +9 -0
  801. package/dist/schema/nodes/stair-design-targets.d.ts.map +1 -0
  802. package/dist/schema/nodes/stair-design-targets.js +7 -0
  803. package/dist/schema/nodes/stair-segment.d.ts +72 -4
  804. package/dist/schema/nodes/stair-segment.d.ts.map +1 -1
  805. package/dist/schema/nodes/stair-segment.js +13 -0
  806. package/dist/schema/nodes/stair.d.ts +119 -2
  807. package/dist/schema/nodes/stair.d.ts.map +1 -1
  808. package/dist/schema/nodes/stair.js +59 -2
  809. package/dist/schema/nodes/structural-grid.d.ts +26 -0
  810. package/dist/schema/nodes/structural-grid.d.ts.map +1 -1
  811. package/dist/schema/nodes/surface-hole-metadata.d.ts +3 -0
  812. package/dist/schema/nodes/surface-hole-metadata.d.ts.map +1 -1
  813. package/dist/schema/nodes/surface-hole-metadata.js +2 -1
  814. package/dist/schema/nodes/surface-paint-region.d.ts +14 -0
  815. package/dist/schema/nodes/surface-paint-region.d.ts.map +1 -0
  816. package/dist/schema/nodes/surface-paint-region.js +12 -0
  817. package/dist/schema/nodes/turbine-vent.d.ts +26 -0
  818. package/dist/schema/nodes/turbine-vent.d.ts.map +1 -1
  819. package/dist/schema/nodes/unit.d.ts +26 -0
  820. package/dist/schema/nodes/unit.d.ts.map +1 -1
  821. package/dist/schema/nodes/wall.d.ts +423 -59
  822. package/dist/schema/nodes/wall.d.ts.map +1 -1
  823. package/dist/schema/nodes/wall.js +188 -186
  824. package/dist/schema/nodes/window.d.ts +139 -20
  825. package/dist/schema/nodes/window.d.ts.map +1 -1
  826. package/dist/schema/nodes/window.js +12 -14
  827. package/dist/schema/nodes/zone.d.ts +69 -1
  828. package/dist/schema/nodes/zone.d.ts.map +1 -1
  829. package/dist/schema/nodes/zone.js +46 -0
  830. package/dist/schema/provenance.d.ts +118 -0
  831. package/dist/schema/provenance.d.ts.map +1 -0
  832. package/dist/schema/provenance.js +76 -0
  833. package/dist/schema/source-ref.d.ts +23 -0
  834. package/dist/schema/source-ref.d.ts.map +1 -0
  835. package/dist/schema/source-ref.js +29 -0
  836. package/dist/schema/types.d.ts +3389 -67
  837. package/dist/schema/types.d.ts.map +1 -1
  838. package/dist/schema/types.js +7 -0
  839. package/dist/services/__fixtures__/hosting.d.ts +3 -0
  840. package/dist/services/__fixtures__/hosting.d.ts.map +1 -0
  841. package/dist/services/__fixtures__/hosting.js +9 -0
  842. package/dist/services/__fixtures__/shelf-surface-rows.d.ts +4 -0
  843. package/dist/services/__fixtures__/shelf-surface-rows.d.ts.map +1 -0
  844. package/dist/services/__fixtures__/shelf-surface-rows.js +18 -0
  845. package/dist/services/alignment-anchors.d.ts +2 -1
  846. package/dist/services/alignment-anchors.d.ts.map +1 -1
  847. package/dist/services/alignment-anchors.js +9 -6
  848. package/dist/services/hosting.d.ts +3 -0
  849. package/dist/services/hosting.d.ts.map +1 -1
  850. package/dist/services/hosting.js +24 -7
  851. package/dist/services/index.d.ts +4 -4
  852. package/dist/services/index.d.ts.map +1 -1
  853. package/dist/services/index.js +4 -4
  854. package/dist/services/level-height.d.ts.map +1 -1
  855. package/dist/services/level-height.js +6 -4
  856. package/dist/services/snap.d.ts +3 -0
  857. package/dist/services/snap.d.ts.map +1 -1
  858. package/dist/services/snap.js +11 -0
  859. package/dist/services/storey.d.ts +21 -1
  860. package/dist/services/storey.d.ts.map +1 -1
  861. package/dist/services/storey.js +94 -8
  862. package/dist/services/surface-hosting.d.ts +6 -2
  863. package/dist/services/surface-hosting.d.ts.map +1 -1
  864. package/dist/services/surface-hosting.js +51 -11
  865. package/dist/store/actions/node-actions.d.ts +4563 -8
  866. package/dist/store/actions/node-actions.d.ts.map +1 -1
  867. package/dist/store/actions/node-actions.js +497 -269
  868. package/dist/store/derived-node-guard.d.ts +84 -0
  869. package/dist/store/derived-node-guard.d.ts.map +1 -0
  870. package/dist/store/derived-node-guard.js +586 -0
  871. package/dist/store/history-control.d.ts +34 -0
  872. package/dist/store/history-control.d.ts.map +1 -1
  873. package/dist/store/history-control.js +99 -1
  874. package/dist/store/history-drafts.d.ts +48 -0
  875. package/dist/store/history-drafts.d.ts.map +1 -0
  876. package/dist/store/history-drafts.js +403 -0
  877. package/dist/store/history-invalidation.d.ts.map +1 -1
  878. package/dist/store/history-invalidation.js +1 -0
  879. package/dist/store/item-interaction.d.ts +28 -0
  880. package/dist/store/item-interaction.d.ts.map +1 -0
  881. package/dist/store/item-interaction.js +34 -0
  882. package/dist/store/registered-node-defaults.d.ts +11 -0
  883. package/dist/store/registered-node-defaults.d.ts.map +1 -0
  884. package/dist/store/registered-node-defaults.js +25 -0
  885. package/dist/store/scene-annotations.d.ts +8969 -0
  886. package/dist/store/scene-annotations.d.ts.map +1 -0
  887. package/dist/store/scene-annotations.js +107 -0
  888. package/dist/store/use-interactive.d.ts +23 -1
  889. package/dist/store/use-interactive.d.ts.map +1 -1
  890. package/dist/store/use-interactive.js +128 -5
  891. package/dist/store/use-scene.d.ts +68 -12
  892. package/dist/store/use-scene.d.ts.map +1 -1
  893. package/dist/store/use-scene.js +429 -306
  894. package/dist/systems/elevator/elevator-opening-sync.d.ts.map +1 -1
  895. package/dist/systems/elevator/elevator-opening-sync.js +4 -6
  896. package/dist/systems/elevator/elevator-opening-system.d.ts.map +1 -1
  897. package/dist/systems/elevator/elevator-opening-system.js +12 -6
  898. package/dist/systems/elevator/elevator-service.d.ts.map +1 -1
  899. package/dist/systems/elevator/elevator-service.js +8 -3
  900. package/dist/systems/fence/fence-centerline.d.ts.map +1 -1
  901. package/dist/systems/fence/fence-centerline.js +6 -5
  902. package/dist/systems/fence/fence-features.d.ts +36 -0
  903. package/dist/systems/fence/fence-features.d.ts.map +1 -0
  904. package/dist/systems/fence/fence-features.js +105 -0
  905. package/dist/systems/fence/fence-spline.d.ts +8 -5
  906. package/dist/systems/fence/fence-spline.d.ts.map +1 -1
  907. package/dist/systems/fence/fence-spline.js +51 -16
  908. package/dist/systems/owned-floor-openings.d.ts +9 -0
  909. package/dist/systems/owned-floor-openings.d.ts.map +1 -0
  910. package/dist/systems/owned-floor-openings.js +326 -0
  911. package/dist/systems/reconcile-owned-floor-openings.d.ts +3 -0
  912. package/dist/systems/reconcile-owned-floor-openings.d.ts.map +1 -0
  913. package/dist/systems/reconcile-owned-floor-openings.js +25 -0
  914. package/dist/systems/slab/__fixtures__/doorway-steps.d.ts +8 -0
  915. package/dist/systems/slab/__fixtures__/doorway-steps.d.ts.map +1 -0
  916. package/dist/systems/slab/__fixtures__/doorway-steps.js +62 -0
  917. package/dist/systems/slab/__fixtures__/floor-step.d.ts +5636 -0
  918. package/dist/systems/slab/__fixtures__/floor-step.d.ts.map +1 -0
  919. package/dist/systems/slab/__fixtures__/floor-step.js +66 -0
  920. package/dist/systems/slab/__fixtures__/raised-room.d.ts +5775 -0
  921. package/dist/systems/slab/__fixtures__/raised-room.d.ts.map +1 -0
  922. package/dist/systems/slab/__fixtures__/raised-room.js +54 -0
  923. package/dist/systems/slab/ensure-slab-openings.d.ts +9 -0
  924. package/dist/systems/slab/ensure-slab-openings.d.ts.map +1 -0
  925. package/dist/systems/slab/ensure-slab-openings.js +41 -0
  926. package/dist/systems/slab/slab-support.d.ts +25 -6
  927. package/dist/systems/slab/slab-support.d.ts.map +1 -1
  928. package/dist/systems/slab/slab-support.js +471 -54
  929. package/dist/systems/stair/stair-base-elevation.d.ts +3 -0
  930. package/dist/systems/stair/stair-base-elevation.d.ts.map +1 -0
  931. package/dist/systems/stair/stair-base-elevation.js +49 -0
  932. package/dist/systems/stair/stair-clearance.d.ts +39 -0
  933. package/dist/systems/stair/stair-clearance.d.ts.map +1 -0
  934. package/dist/systems/stair/stair-clearance.js +508 -0
  935. package/dist/systems/stair/stair-construction.d.ts +37 -0
  936. package/dist/systems/stair/stair-construction.d.ts.map +1 -0
  937. package/dist/systems/stair/stair-construction.js +314 -0
  938. package/dist/systems/stair/stair-detail-budget.d.ts +13 -0
  939. package/dist/systems/stair/stair-detail-budget.d.ts.map +1 -0
  940. package/dist/systems/stair/stair-detail-budget.js +64 -0
  941. package/dist/systems/stair/stair-flight.d.ts +2 -2
  942. package/dist/systems/stair/stair-flight.d.ts.map +1 -1
  943. package/dist/systems/stair/stair-flight.js +4 -3
  944. package/dist/systems/stair/stair-floor-footprints.d.ts +7 -0
  945. package/dist/systems/stair/stair-floor-footprints.d.ts.map +1 -0
  946. package/dist/systems/stair/stair-floor-footprints.js +113 -0
  947. package/dist/systems/stair/stair-footprint.d.ts +3 -1
  948. package/dist/systems/stair/stair-footprint.d.ts.map +1 -1
  949. package/dist/systems/stair/stair-footprint.js +97 -44
  950. package/dist/systems/stair/stair-layout.d.ts +39 -0
  951. package/dist/systems/stair/stair-layout.d.ts.map +1 -0
  952. package/dist/systems/stair/stair-layout.js +58 -0
  953. package/dist/systems/stair/stair-opening-preview.d.ts +1650 -84
  954. package/dist/systems/stair/stair-opening-preview.d.ts.map +1 -1
  955. package/dist/systems/stair/stair-opening-sync.d.ts +8 -2
  956. package/dist/systems/stair/stair-opening-sync.d.ts.map +1 -1
  957. package/dist/systems/stair/stair-opening-sync.js +136 -315
  958. package/dist/systems/stair/stair-opening-system.d.ts.map +1 -1
  959. package/dist/systems/stair/stair-opening-system.js +40 -8
  960. package/dist/systems/stair/stair-presets.d.ts +276 -0
  961. package/dist/systems/stair/stair-presets.d.ts.map +1 -0
  962. package/dist/systems/stair/stair-presets.js +151 -0
  963. package/dist/systems/stair/stair-rail-budget.d.ts +6 -0
  964. package/dist/systems/stair/stair-rail-budget.d.ts.map +1 -0
  965. package/dist/systems/stair/stair-rail-budget.js +36 -0
  966. package/dist/systems/stair/stair-rail-path.d.ts +22 -0
  967. package/dist/systems/stair/stair-rail-path.d.ts.map +1 -0
  968. package/dist/systems/stair/stair-rail-path.js +497 -0
  969. package/dist/systems/stair/stair-rise-edit.d.ts +9 -0
  970. package/dist/systems/stair/stair-rise-edit.d.ts.map +1 -0
  971. package/dist/systems/stair/stair-rise-edit.js +46 -0
  972. package/dist/systems/stair/stair-rise-query.d.ts +24 -0
  973. package/dist/systems/stair/stair-rise-query.d.ts.map +1 -0
  974. package/dist/systems/stair/stair-rise-query.js +125 -0
  975. package/dist/systems/stair/stair-rise.d.ts +4 -19
  976. package/dist/systems/stair/stair-rise.d.ts.map +1 -1
  977. package/dist/systems/stair/stair-rise.js +8 -71
  978. package/dist/systems/stair/stair-sizing.d.ts +414 -0
  979. package/dist/systems/stair/stair-sizing.d.ts.map +1 -0
  980. package/dist/systems/stair/stair-sizing.js +255 -0
  981. package/dist/systems/stair/stair-sweep-edit.d.ts +7 -0
  982. package/dist/systems/stair/stair-sweep-edit.d.ts.map +1 -0
  983. package/dist/systems/stair/stair-sweep-edit.js +8 -0
  984. package/dist/systems/stair/stair-walking-line.d.ts +5 -0
  985. package/dist/systems/stair/stair-walking-line.d.ts.map +1 -0
  986. package/dist/systems/stair/stair-walking-line.js +91 -0
  987. package/dist/systems/stair/stair-winder.d.ts +36 -0
  988. package/dist/systems/stair/stair-winder.d.ts.map +1 -0
  989. package/dist/systems/stair/stair-winder.js +173 -0
  990. package/dist/systems/wall/wall-assembly.d.ts +234 -0
  991. package/dist/systems/wall/wall-assembly.d.ts.map +1 -0
  992. package/dist/systems/wall/wall-assembly.js +854 -0
  993. package/dist/systems/wall/wall-curve.d.ts +2 -1
  994. package/dist/systems/wall/wall-curve.d.ts.map +1 -1
  995. package/dist/systems/wall/wall-curve.js +21 -5
  996. package/dist/systems/wall/wall-finish.d.ts +102 -0
  997. package/dist/systems/wall/wall-finish.d.ts.map +1 -0
  998. package/dist/systems/wall/wall-finish.js +264 -0
  999. package/dist/systems/wall/wall-footprint.d.ts +3 -0
  1000. package/dist/systems/wall/wall-footprint.d.ts.map +1 -1
  1001. package/dist/systems/wall/wall-footprint.js +15 -13
  1002. package/dist/systems/wall/wall-frame.d.ts +45 -0
  1003. package/dist/systems/wall/wall-frame.d.ts.map +1 -0
  1004. package/dist/systems/wall/wall-frame.js +162 -0
  1005. package/dist/systems/wall/wall-layer-bands.d.ts +38 -0
  1006. package/dist/systems/wall/wall-layer-bands.d.ts.map +1 -0
  1007. package/dist/systems/wall/wall-layer-bands.js +109 -0
  1008. package/dist/systems/wall/wall-merge.d.ts +57 -0
  1009. package/dist/systems/wall/wall-merge.d.ts.map +1 -0
  1010. package/dist/systems/wall/wall-merge.js +411 -0
  1011. package/dist/systems/wall/wall-mitering.d.ts +6 -5
  1012. package/dist/systems/wall/wall-mitering.d.ts.map +1 -1
  1013. package/dist/systems/wall/wall-mitering.js +70 -20
  1014. package/dist/systems/wall/wall-operations.d.ts +28 -0
  1015. package/dist/systems/wall/wall-operations.d.ts.map +1 -0
  1016. package/dist/systems/wall/wall-operations.js +146 -0
  1017. package/dist/systems/wall/wall-paint-plan.d.ts +30 -0
  1018. package/dist/systems/wall/wall-paint-plan.d.ts.map +1 -0
  1019. package/dist/systems/wall/wall-paint-plan.js +167 -0
  1020. package/dist/systems/wall/wall-room-sides.d.ts +6 -0
  1021. package/dist/systems/wall/wall-room-sides.d.ts.map +1 -0
  1022. package/dist/systems/wall/wall-room-sides.js +14 -0
  1023. package/dist/systems/wall/wall-step-openings.d.ts +17 -0
  1024. package/dist/systems/wall/wall-step-openings.d.ts.map +1 -0
  1025. package/dist/systems/wall/wall-step-openings.js +32 -0
  1026. package/dist/systems/wall/wall-top.d.ts +2 -6
  1027. package/dist/systems/wall/wall-top.d.ts.map +1 -1
  1028. package/dist/systems/wall/wall-top.js +3 -9
  1029. package/dist/systems/wall/wall-topology.d.ts +28 -0
  1030. package/dist/systems/wall/wall-topology.d.ts.map +1 -1
  1031. package/dist/systems/wall/wall-topology.js +458 -9
  1032. package/dist/utils/clone-scene-graph.d.ts +6 -0
  1033. package/dist/utils/clone-scene-graph.d.ts.map +1 -1
  1034. package/dist/utils/clone-scene-graph.js +123 -15
  1035. package/dist/utils/ensure-scene-openings.d.ts +8965 -0
  1036. package/dist/utils/ensure-scene-openings.d.ts.map +1 -0
  1037. package/dist/utils/ensure-scene-openings.js +29 -0
  1038. package/dist/utils/exterior-threshold-migration.d.ts +4 -0
  1039. package/dist/utils/exterior-threshold-migration.d.ts.map +1 -0
  1040. package/dist/utils/exterior-threshold-migration.js +114 -0
  1041. package/dist/utils/floor-follow-migration.d.ts +3 -0
  1042. package/dist/utils/floor-follow-migration.d.ts.map +1 -0
  1043. package/dist/utils/floor-follow-migration.js +29 -0
  1044. package/dist/utils/floor-opening-migration.d.ts +13 -0
  1045. package/dist/utils/floor-opening-migration.d.ts.map +1 -0
  1046. package/dist/utils/floor-opening-migration.js +148 -0
  1047. package/dist/utils/floor-piece-adoption.d.ts +50 -0
  1048. package/dist/utils/floor-piece-adoption.d.ts.map +1 -0
  1049. package/dist/utils/floor-piece-adoption.js +182 -0
  1050. package/dist/utils/floor-plate-migration.d.ts +4507 -0
  1051. package/dist/utils/floor-plate-migration.d.ts.map +1 -0
  1052. package/dist/utils/floor-plate-migration.js +1360 -0
  1053. package/dist/utils/heal-plan-coordinates.d.ts +2 -0
  1054. package/dist/utils/heal-plan-coordinates.d.ts.map +1 -0
  1055. package/dist/utils/heal-plan-coordinates.js +69 -0
  1056. package/dist/utils/heal-scene-graph.d.ts +20 -6
  1057. package/dist/utils/heal-scene-graph.d.ts.map +1 -1
  1058. package/dist/utils/heal-scene-graph.js +61 -16
  1059. package/dist/utils/legacy-material-slots.d.ts +23 -0
  1060. package/dist/utils/legacy-material-slots.d.ts.map +1 -0
  1061. package/dist/utils/legacy-material-slots.js +120 -0
  1062. package/dist/utils/legacy-opening-datums.d.ts +11 -0
  1063. package/dist/utils/legacy-opening-datums.d.ts.map +1 -0
  1064. package/dist/utils/legacy-opening-datums.js +92 -0
  1065. package/dist/utils/legacy-wall-datums.d.ts +6 -0
  1066. package/dist/utils/legacy-wall-datums.d.ts.map +1 -0
  1067. package/dist/utils/legacy-wall-datums.js +199 -0
  1068. package/dist/utils/load-migration.d.ts +28 -0
  1069. package/dist/utils/load-migration.d.ts.map +1 -0
  1070. package/dist/utils/load-migration.js +89 -0
  1071. package/dist/utils/node-defaults.d.ts +37 -0
  1072. package/dist/utils/node-defaults.d.ts.map +1 -0
  1073. package/dist/utils/node-defaults.js +96 -0
  1074. package/dist/utils/normalize-legacy-structure.d.ts +2 -0
  1075. package/dist/utils/normalize-legacy-structure.d.ts.map +1 -0
  1076. package/dist/utils/normalize-legacy-structure.js +61 -0
  1077. package/dist/utils/omit-undefined.d.ts +2 -0
  1078. package/dist/utils/omit-undefined.d.ts.map +1 -0
  1079. package/dist/utils/omit-undefined.js +17 -0
  1080. package/dist/utils/owned-floor-opening-migration.d.ts +4489 -0
  1081. package/dist/utils/owned-floor-opening-migration.d.ts.map +1 -0
  1082. package/dist/utils/owned-floor-opening-migration.js +365 -0
  1083. package/dist/utils/reconcile-structure-on-load.d.ts +8965 -0
  1084. package/dist/utils/reconcile-structure-on-load.d.ts.map +1 -0
  1085. package/dist/utils/reconcile-structure-on-load.js +307 -0
  1086. package/dist/utils/room-zone-migration.d.ts +18 -0
  1087. package/dist/utils/room-zone-migration.d.ts.map +1 -0
  1088. package/dist/utils/room-zone-migration.js +258 -0
  1089. package/dist/utils/scene-migrations.d.ts +16 -1
  1090. package/dist/utils/scene-migrations.d.ts.map +1 -1
  1091. package/dist/utils/scene-migrations.js +15 -1
  1092. package/dist/utils/structure-id.d.ts +4 -0
  1093. package/dist/utils/structure-id.d.ts.map +1 -0
  1094. package/dist/utils/structure-id.js +115 -0
  1095. package/dist/utils/vertical-scene-migration.d.ts +8 -8
  1096. package/dist/utils/vertical-scene-migration.d.ts.map +1 -1
  1097. package/dist/utils/vertical-scene-migration.js +18 -8
  1098. package/dist/utils/wall-assembly-migration.d.ts +14 -0
  1099. package/dist/utils/wall-assembly-migration.d.ts.map +1 -0
  1100. package/dist/utils/wall-assembly-migration.js +23 -0
  1101. package/dist/utils/wall-face-migration.d.ts +23 -0
  1102. package/dist/utils/wall-face-migration.d.ts.map +1 -0
  1103. package/dist/utils/wall-face-migration.js +246 -0
  1104. package/dist/validation/opening-bounds.d.ts +36 -0
  1105. package/dist/validation/opening-bounds.d.ts.map +1 -0
  1106. package/dist/validation/opening-bounds.js +34 -0
  1107. package/dist/validation/validate-build-json.d.ts +2 -0
  1108. package/dist/validation/validate-build-json.d.ts.map +1 -1
  1109. package/dist/validation/validate-build-json.js +48 -1
  1110. package/package.json +37 -4
  1111. package/dist/services/surface-hosting-procedural-parity.fixtures.d.ts +0 -13
  1112. package/dist/services/surface-hosting-procedural-parity.fixtures.d.ts.map +0 -1
  1113. package/dist/services/surface-hosting-procedural-parity.fixtures.js +0 -4691
  1114. package/dist/services/surface-hosting-shelf-parity.fixtures.d.ts +0 -1060
  1115. package/dist/services/surface-hosting-shelf-parity.fixtures.d.ts.map +0 -1
  1116. package/dist/services/surface-hosting-shelf-parity.fixtures.js +0 -3127
@@ -1,8 +1,13 @@
1
+ import type { StructurePlan } from '../../commands/structure/shared.js';
1
2
  import { type AnyNode, type AnyNodeId } from '../../schema/index.js';
3
+ import type { Collection, CollectionId } from '../../schema/collections.js';
4
+ import { type DerivedWriteOptions } from '../derived-node-guard.js';
2
5
  import type { SceneState } from '../use-scene.js';
3
6
  type NodeCreateOp = {
4
7
  node: AnyNode;
5
8
  parentId?: AnyNodeId;
9
+ /** Collections the node joins, for any kind; an item's own `collectionIds` otherwise. */
10
+ collectionIds?: CollectionId[];
6
11
  };
7
12
  type NodeUpdateOp = {
8
13
  id: AnyNodeId;
@@ -16,20 +21,4570 @@ type NumericSanitizeIssue = {
16
21
  action: 'clamped' | 'dropped' | 'rounded';
17
22
  };
18
23
  export declare function numericSanitizeIssuesToMessage(issues: NumericSanitizeIssue[] | null | undefined): string;
19
- declare const createNodesActionImpl: (set: (fn: (state: SceneState) => Partial<SceneState>) => void, get: () => SceneState, ops: NodeCreateOp[]) => void;
24
+ declare const createNodesActionImpl: (set: (fn: (state: SceneState) => Partial<SceneState>) => void, get: () => SceneState, ops: NodeCreateOp[], options?: DerivedWriteOptions) => void;
25
+ /**
26
+ * A created node joins the collections it is given, or an item those its mirror
27
+ * names, so a duplicate or a same-project paste stays a member; ids of
28
+ * collections this scene lacks (a paste from another project) are dropped.
29
+ * Writes the joined collections into `collections` and returns the node, an
30
+ * item with its mirror set to what it joined.
31
+ */
32
+ export declare function joinCollections(collections: Record<CollectionId, Collection>, node: AnyNode, requested?: `collection_${string}`[] | undefined): AnyNode;
33
+ /** The collections `id` belongs to: membership lives on the collection for every kind. */
34
+ export declare function collectionIdsOf(collections: Readonly<Record<CollectionId, Collection>>, id: AnyNodeId): CollectionId[];
20
35
  declare const applyNodeChangesActionImpl: (set: (fn: (state: SceneState) => Partial<SceneState>) => void, get: () => SceneState, changes: {
21
36
  create?: NodeCreateOp[];
22
37
  update?: NodeUpdateOp[];
23
38
  delete?: NodeDeleteOp[];
24
- }) => void;
39
+ }, options?: DerivedWriteOptions) => void;
25
40
  declare const updateNodesActionImpl: (set: (fn: (state: SceneState) => Partial<SceneState>) => void, get: () => SceneState, updates: {
26
41
  id: AnyNodeId;
27
42
  data: Partial<AnyNode>;
28
- }[]) => void;
29
- declare const deleteNodesActionImpl: (set: (fn: (state: SceneState) => Partial<SceneState>) => void, get: () => SceneState, ids: AnyNodeId[]) => void;
30
- export declare const createNodesAction: (set: Parameters<typeof createNodesActionImpl>[0], get: Parameters<typeof createNodesActionImpl>[1], ops: NodeCreateOp[]) => void;
31
- export declare const applyNodeChangesAction: (set: Parameters<typeof applyNodeChangesActionImpl>[0], get: Parameters<typeof applyNodeChangesActionImpl>[1], changes: Parameters<typeof applyNodeChangesActionImpl>[2]) => void;
32
- export declare const updateNodesAction: (set: Parameters<typeof updateNodesActionImpl>[0], get: Parameters<typeof updateNodesActionImpl>[1], updates: Parameters<typeof updateNodesActionImpl>[2]) => void;
33
- export declare const deleteNodesAction: (set: Parameters<typeof deleteNodesActionImpl>[0], get: Parameters<typeof deleteNodesActionImpl>[1], ids: AnyNodeId[]) => void;
43
+ }[], options?: DerivedWriteOptions, deferDirty?: boolean) => void;
44
+ /** The scene record a node deletion reads and rewrites. */
45
+ export type NodeDeletionScene = Pick<SceneState, 'nodes' | 'rootNodeIds' | 'collections'>;
46
+ /** What deleting `ids` does to a scene, before anything is committed. */
47
+ export type NodeDeletionPlan = NodeDeletionScene & {
48
+ /** Every removed id: the requested ids, their subtrees, kind cascades, merged-away walls. */
49
+ deletedIds: Set<AnyNodeId>;
50
+ parentsToMarkDirty: Set<AnyNodeId>;
51
+ nodesToMarkDirty: Set<AnyNodeId>;
52
+ /** Preview only: existing default gutters and downspouts the refresh may keep or replace. */
53
+ unsettledIds: Set<AnyNodeId>;
54
+ /** Preview only: roof segments whose `children` the refresh rewrites. */
55
+ regeneratedHostIds: Set<AnyNodeId>;
56
+ };
57
+ /**
58
+ * The delete store action's planner, without committing: the requested ids,
59
+ * their `children` subtrees and kind `onDeleteCascade` companions, collinear
60
+ * walls merged across a deleted junction, the separators that keep two rooms
61
+ * apart when the wall between them goes, derived-construction deletion intent,
62
+ * neighbour patches, support and unit cleanup, and the default gutter and
63
+ * downspout refresh.
64
+ *
65
+ * The refresh mints gutters, downspouts and outlets with random ids, and which
66
+ * existing defaults it keeps can depend on them. With `mintDefaults: false`
67
+ * (a preview, such as the MCP patch dry run) the refresh does not run: the
68
+ * existing defaults it would touch are listed in `unsettledIds`, and the plan
69
+ * is deterministic and equals the commit for every other existing id. The
70
+ * delete action mints.
71
+ */
72
+ export declare function planNodeDeletion(scene: NodeDeletionScene, ids: AnyNodeId[], { mintDefaults, options, wallDeletionPlan, }?: {
73
+ mintDefaults?: boolean;
74
+ options?: DerivedWriteOptions;
75
+ /** A caller-owned room-preserving plan; otherwise planned here unless detection is paused. */
76
+ wallDeletionPlan?: StructurePlan;
77
+ }): NodeDeletionPlan;
78
+ declare const deleteNodesActionImpl: (set: (fn: (state: SceneState) => Partial<SceneState>) => void, get: () => SceneState, ids: AnyNodeId[], options?: DerivedWriteOptions, wallDeletionPlan?: StructurePlan) => void;
79
+ /** Runs the same deletion hooks and update constraints for headless scene owners. */
80
+ export declare function planSceneNodeChanges(snapshot: Pick<SceneState, 'nodes' | 'rootNodeIds' | 'collections'>, changes: {
81
+ update?: NodeUpdateOp[];
82
+ delete?: AnyNodeId[];
83
+ wallDeletionPlan?: StructurePlan;
84
+ }): {
85
+ nodes: Record<`block_${string}` | `bvent_${string}` | `elevator_${string}` | `ceiling_${string}` | `item_${string}` | `procedural-item_${string}` | `column_${string}` | `construction-dimension_${string}` | `site_${string}` | `building_${string}` | `level_${string}` | `wall_${string}` | `door_${string}` | `window_${string}` | `leanto_${string}` | `roof_${string}` | `rseg_${string}` | `slab_${string}` | `separator_${string}` | `floor-opening_${string}` | `fence_${string}` | `structural-grid_${string}` | `imesh_${string}` | `zone_${string}` | `stair_${string}` | `sseg_${string}` | `scan_${string}` | `guide_${string}` | `measurement_${string}` | `spawn_${string}` | `shelf_${string}` | `duct-segment_${string}` | `duct-fitting_${string}` | `duct-terminal_${string}` | `hvac-equipment_${string}` | `lineset_${string}` | `liquid-line_${string}` | `pipe-segment_${string}` | `pipe-fitting_${string}` | `pipe-trap_${string}` | `unit_${string}` | `fence-gate_${string}` | `fence-opening_${string}` | `cabinet_${string}` | `cabinet-module_${string}` | `rvent_${string}` | `tvent_${string}` | `cupola_${string}` | `eyebrow-vent_${string}` | `gutter_${string}` | `chimney_${string}` | `solarpanel_${string}` | `skylight_${string}` | `dormer_${string}` | `downspout_${string}`, {
86
+ object: "node";
87
+ id: `site_${string}`;
88
+ parentId: string | null;
89
+ visible: boolean;
90
+ metadata: Record<string, unknown>;
91
+ polygon: {
92
+ type: "polygon";
93
+ points: [number, number][];
94
+ };
95
+ children: string[];
96
+ type: "site";
97
+ name?: string | undefined;
98
+ camera?: {
99
+ position: [number, number, number];
100
+ target: [number, number, number];
101
+ mode: "perspective" | "orthographic";
102
+ fov?: number | undefined;
103
+ zoom?: number | undefined;
104
+ } | undefined;
105
+ provenance?: {
106
+ refs: {
107
+ id: string;
108
+ ns?: string | undefined;
109
+ role?: "primary" | "piece" | "absorbed" | "alias" | "derived" | undefined;
110
+ }[];
111
+ lineage?: {
112
+ op: "import" | "split" | "merge" | "duplicate" | "convert" | "promote" | "make-independent" | "attach";
113
+ fromIds: string[];
114
+ } | undefined;
115
+ } | undefined;
116
+ terrain?: {
117
+ type: "heightfield";
118
+ origin: [number, number];
119
+ spacing: number;
120
+ cols: number;
121
+ rows: number;
122
+ step: number;
123
+ heights: string;
124
+ } | undefined;
125
+ address?: {
126
+ street?: string | undefined;
127
+ city?: string | undefined;
128
+ state?: string | undefined;
129
+ zip?: string | undefined;
130
+ } | undefined;
131
+ parcel?: {
132
+ apn?: string | undefined;
133
+ source?: string | undefined;
134
+ county?: string | undefined;
135
+ state?: string | undefined;
136
+ lotAreaSqFt?: number | undefined;
137
+ originLngLat?: [number, number] | undefined;
138
+ resolvedAt?: string | undefined;
139
+ layer?: string | undefined;
140
+ notes?: string[] | undefined;
141
+ } | undefined;
142
+ setbacks?: {
143
+ front: number;
144
+ side: number;
145
+ rear: number;
146
+ left?: number | undefined;
147
+ right?: number | undefined;
148
+ streetSide?: number | undefined;
149
+ } | undefined;
150
+ setbacksSource?: string | undefined;
151
+ zone?: string | undefined;
152
+ frontEdge?: number | undefined;
153
+ streetEdges?: number[] | undefined;
154
+ sightTriangleFt?: number | undefined;
155
+ northRotation?: number | undefined;
156
+ dossier?: {
157
+ [x: string]: unknown;
158
+ provider: string;
159
+ asOf: string;
160
+ sections: Record<string, {
161
+ [x: string]: unknown;
162
+ status: string;
163
+ summary?: string | undefined;
164
+ reason?: string | undefined;
165
+ source?: {
166
+ name?: string | undefined;
167
+ kind?: string | undefined;
168
+ vintage?: string | undefined;
169
+ attribution?: string | undefined;
170
+ } | undefined;
171
+ }>;
172
+ point?: {
173
+ lat?: number | undefined;
174
+ lng?: number | undefined;
175
+ source?: string | undefined;
176
+ } | undefined;
177
+ address?: {
178
+ formatted?: string | undefined;
179
+ precision?: string | undefined;
180
+ } | undefined;
181
+ parcel?: Record<string, unknown> | undefined;
182
+ flood?: Record<string, unknown> | undefined;
183
+ codeBasis?: Record<string, unknown> | undefined;
184
+ zoning?: Record<string, unknown> | undefined;
185
+ utilities?: Record<string, unknown> | undefined;
186
+ soils?: Record<string, unknown> | undefined;
187
+ wetlands?: Record<string, unknown> | undefined;
188
+ structures?: Record<string, unknown> | undefined;
189
+ elevation?: Record<string, unknown> | undefined;
190
+ boundaries?: Record<string, unknown> | undefined;
191
+ } | undefined;
192
+ contourIntervalIn?: number | undefined;
193
+ contours3d?: boolean | undefined;
194
+ terrainContours?: {
195
+ datum: string;
196
+ intervalFt: number;
197
+ lines: {
198
+ elevationFt: number;
199
+ points: [number, number][];
200
+ }[];
201
+ source?: string | undefined;
202
+ } | undefined;
203
+ } | {
204
+ object: "node";
205
+ position: [number, number, number];
206
+ id: `building_${string}`;
207
+ parentId: string | null;
208
+ visible: boolean;
209
+ metadata: Record<string, unknown>;
210
+ rotation: [number, number, number];
211
+ children: (`elevator_${string}` | `level_${string}` | `unit_${string}`)[];
212
+ type: "building";
213
+ name?: string | undefined;
214
+ camera?: {
215
+ position: [number, number, number];
216
+ target: [number, number, number];
217
+ mode: "perspective" | "orthographic";
218
+ fov?: number | undefined;
219
+ zoom?: number | undefined;
220
+ } | undefined;
221
+ provenance?: {
222
+ refs: {
223
+ id: string;
224
+ ns?: string | undefined;
225
+ role?: "primary" | "piece" | "absorbed" | "alias" | "derived" | undefined;
226
+ }[];
227
+ lineage?: {
228
+ op: "import" | "split" | "merge" | "duplicate" | "convert" | "promote" | "make-independent" | "attach";
229
+ fromIds: string[];
230
+ } | undefined;
231
+ } | undefined;
232
+ } | {
233
+ object: "node";
234
+ position: [number, number, number];
235
+ id: `elevator_${string}`;
236
+ parentId: string | null;
237
+ visible: boolean;
238
+ metadata: Record<string, unknown>;
239
+ depth: number;
240
+ rotation: number;
241
+ width: number;
242
+ shaftWallThickness: number;
243
+ shaftStyle: "glass" | "solid";
244
+ cabHeight: number;
245
+ doorWidth: number;
246
+ doorHeight: number;
247
+ doorStyle: "center-opening" | "single-left" | "single-right";
248
+ doorPanelStyle: "glass-frame" | "solid-panel" | "segmented-panel";
249
+ fromLevelId: string | null;
250
+ toLevelId: string | null;
251
+ disabledLevelIds: string[];
252
+ serviceOnlyLevelIds: string[];
253
+ defaultLevelId: string | null;
254
+ speed: number;
255
+ doorDurationMs: number;
256
+ dwellMs: number;
257
+ type: "elevator";
258
+ name?: string | undefined;
259
+ camera?: {
260
+ position: [number, number, number];
261
+ target: [number, number, number];
262
+ mode: "perspective" | "orthographic";
263
+ fov?: number | undefined;
264
+ zoom?: number | undefined;
265
+ } | undefined;
266
+ provenance?: {
267
+ refs: {
268
+ id: string;
269
+ ns?: string | undefined;
270
+ role?: "primary" | "piece" | "absorbed" | "alias" | "derived" | undefined;
271
+ }[];
272
+ lineage?: {
273
+ op: "import" | "split" | "merge" | "duplicate" | "convert" | "promote" | "make-independent" | "attach";
274
+ fromIds: string[];
275
+ } | undefined;
276
+ } | undefined;
277
+ slots?: Record<string, string> | undefined;
278
+ material?: {
279
+ id?: string | undefined;
280
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
281
+ properties?: {
282
+ color: string;
283
+ roughness: number;
284
+ metalness: number;
285
+ opacity: number;
286
+ transparent: boolean;
287
+ side: "front" | "back" | "double";
288
+ } | undefined;
289
+ texture?: {
290
+ url: string;
291
+ repeat?: [number, number] | undefined;
292
+ scale?: number | undefined;
293
+ } | undefined;
294
+ } | undefined;
295
+ materialPreset?: string | undefined;
296
+ shaftWidth?: number | undefined;
297
+ shaftDepth?: number | undefined;
298
+ servedLevelIds?: string[] | undefined;
299
+ } | {
300
+ object: "node";
301
+ id: `unit_${string}`;
302
+ name: string;
303
+ parentId: string | null;
304
+ visible: boolean;
305
+ metadata: Record<string, unknown>;
306
+ kind: "apartment" | "hotel-room" | "commercial" | "common";
307
+ color: string;
308
+ members: `zone_${string}`[];
309
+ type: "unit";
310
+ camera?: {
311
+ position: [number, number, number];
312
+ target: [number, number, number];
313
+ mode: "perspective" | "orthographic";
314
+ fov?: number | undefined;
315
+ zoom?: number | undefined;
316
+ } | undefined;
317
+ provenance?: {
318
+ refs: {
319
+ id: string;
320
+ ns?: string | undefined;
321
+ role?: "primary" | "piece" | "absorbed" | "alias" | "derived" | undefined;
322
+ }[];
323
+ lineage?: {
324
+ op: "import" | "split" | "merge" | "duplicate" | "convert" | "promote" | "make-independent" | "attach";
325
+ fromIds: string[];
326
+ } | undefined;
327
+ } | undefined;
328
+ } | {
329
+ object: "node";
330
+ id: `level_${string}`;
331
+ parentId: string | null;
332
+ visible: boolean;
333
+ metadata: Record<string, unknown>;
334
+ children: (`block_${string}` | `ceiling_${string}` | `item_${string}` | `procedural-item_${string}` | `column_${string}` | `construction-dimension_${string}` | `wall_${string}` | `roof_${string}` | `slab_${string}` | `separator_${string}` | `floor-opening_${string}` | `fence_${string}` | `structural-grid_${string}` | `imesh_${string}` | `zone_${string}` | `stair_${string}` | `scan_${string}` | `guide_${string}` | `measurement_${string}` | `spawn_${string}` | `shelf_${string}` | `duct-segment_${string}` | `duct-fitting_${string}` | `duct-terminal_${string}` | `hvac-equipment_${string}` | `lineset_${string}` | `liquid-line_${string}` | `pipe-segment_${string}` | `pipe-fitting_${string}` | `pipe-trap_${string}`)[];
335
+ level: number;
336
+ baseElevation: number;
337
+ type: "level";
338
+ name?: string | undefined;
339
+ camera?: {
340
+ position: [number, number, number];
341
+ target: [number, number, number];
342
+ mode: "perspective" | "orthographic";
343
+ fov?: number | undefined;
344
+ zoom?: number | undefined;
345
+ } | undefined;
346
+ provenance?: {
347
+ refs: {
348
+ id: string;
349
+ ns?: string | undefined;
350
+ role?: "primary" | "piece" | "absorbed" | "alias" | "derived" | undefined;
351
+ }[];
352
+ lineage?: {
353
+ op: "import" | "split" | "merge" | "duplicate" | "convert" | "promote" | "make-independent" | "attach";
354
+ fromIds: string[];
355
+ } | undefined;
356
+ } | undefined;
357
+ height?: number | undefined;
358
+ } | {
359
+ object: "node";
360
+ position: [number, number, number];
361
+ id: `leanto_${string}`;
362
+ parentId: string | null;
363
+ visible: boolean;
364
+ metadata: Record<string, unknown>;
365
+ rotation: [number, number, number];
366
+ children: (`column_${string}` | `roof_${string}`)[];
367
+ pitch: number;
368
+ shingleThickness: number;
369
+ canopyForm: "gable" | "mono" | "butterfly";
370
+ hostKind: "wall" | "slab-edge" | "freestanding" | "conical-roof";
371
+ hostHeightOffset: number;
372
+ span: number;
373
+ autoSpan: boolean;
374
+ projection: number;
375
+ highEdgeHeight: number;
376
+ lowEdgeHeight: number;
377
+ resizeLock: "preserve-high-edge" | "preserve-low-edge" | "preserve-pitch";
378
+ leftEndCondition: "open" | "wall-abutment" | "joined";
379
+ rightEndCondition: "open" | "wall-abutment" | "joined";
380
+ autoMiterCorners: boolean;
381
+ sideFlashing: boolean;
382
+ flashingProjection: number;
383
+ flashingHeight: number;
384
+ highSideMode: "wall-ledger" | "independent-high-beam";
385
+ ledgerVerticalOffset: number;
386
+ lowBeamInset: number;
387
+ gutterEnabled: boolean;
388
+ gutterProfile: "box" | "k-style" | "half-round";
389
+ gutterSize: number;
390
+ downspoutEnabled: boolean;
391
+ downspoutPosition: number;
392
+ connectionMode: "manual" | "auto";
393
+ connectionOffset: number;
394
+ connectionInset: number;
395
+ matchHostRoofMaterial: boolean;
396
+ matchHostRoofStructure: boolean;
397
+ roofThickness: number;
398
+ highOverhang: number;
399
+ lowOverhang: number;
400
+ leftOverhang: number;
401
+ rightOverhang: number;
402
+ coveringType: "generic" | "shingle" | "metal-panel";
403
+ beamWidth: number;
404
+ beamHeight: number;
405
+ ledgerDepth: number;
406
+ ledgerHeight: number;
407
+ rafterWidth: number;
408
+ rafterHeight: number;
409
+ rafterSpacing: number;
410
+ rafterEndInset: number;
411
+ framingStrategy: "hidden" | "rafters" | "purlins" | "covering-specific";
412
+ purlinWidth: number;
413
+ purlinHeight: number;
414
+ purlinSpacing: number;
415
+ postWidth: number;
416
+ postDepth: number;
417
+ postCount: number;
418
+ postLayoutMode: "count" | "target-spacing";
419
+ postSpacing: number;
420
+ postInset: number;
421
+ omittedPostSlots: {
422
+ side: "low" | "high";
423
+ index: number;
424
+ layoutCount: number;
425
+ }[];
426
+ postBracing: "none" | "knee";
427
+ footingStyle: "none" | "base-plate" | "concrete-pad";
428
+ type: "lean-to-extension";
429
+ name?: string | undefined;
430
+ camera?: {
431
+ position: [number, number, number];
432
+ target: [number, number, number];
433
+ mode: "perspective" | "orthographic";
434
+ fov?: number | undefined;
435
+ zoom?: number | undefined;
436
+ } | undefined;
437
+ provenance?: {
438
+ refs: {
439
+ id: string;
440
+ ns?: string | undefined;
441
+ role?: "primary" | "piece" | "absorbed" | "alias" | "derived" | undefined;
442
+ }[];
443
+ lineage?: {
444
+ op: "import" | "split" | "merge" | "duplicate" | "convert" | "promote" | "make-independent" | "attach";
445
+ fromIds: string[];
446
+ } | undefined;
447
+ } | undefined;
448
+ slots?: Record<string, string> | undefined;
449
+ hostSlabId?: `slab_${string}` | undefined;
450
+ hostSlabEdgeIndex?: number | undefined;
451
+ hostSlabEdgeT?: number | undefined;
452
+ spanArcCenterZ?: number | undefined;
453
+ spanArcRadius?: number | undefined;
454
+ hostRoofId?: `roof_${string}` | undefined;
455
+ hostRoofSegmentId?: string | undefined;
456
+ hostRoofEdge?: "+X" | "-X" | "+Z" | "-Z" | undefined;
457
+ hostRoofEdgeRange?: [number, number] | undefined;
458
+ } | {
459
+ object: "node";
460
+ position: [number, number, number];
461
+ id: `column_${string}`;
462
+ parentId: string | null;
463
+ visible: boolean;
464
+ metadata: Record<string, unknown>;
465
+ radius: number;
466
+ depth: number;
467
+ rotation: number;
468
+ children: string[];
469
+ width: number;
470
+ height: number;
471
+ baseHeight: number;
472
+ style: "plain" | "faceted" | "fluted" | "lathe-turned" | "dravidian-carved" | "cluster";
473
+ crossSection: "round" | "square" | "rectangular" | "octagonal" | "sixteen-sided";
474
+ edgeSoftness: number;
475
+ capitalHeight: number;
476
+ shaftProfile: "straight" | "tapered" | "bulged" | "baluster" | "hourglass";
477
+ shaftTaper: number;
478
+ shaftBulge: number;
479
+ shaftStartScale: number;
480
+ shaftEndScale: number;
481
+ shaftSegmentCount: number;
482
+ shaftTwistStep: number;
483
+ shaftCornerRadius: number;
484
+ shaftDetail: "fluted" | "lathe-turned" | "none" | "spiral" | "panelled";
485
+ baseStyle: "none" | "simple-square" | "round-rings" | "square-plinth" | "stepped-square" | "lotus" | "ribbed-lotus" | "panelled-pedestal";
486
+ baseWidthScale: number;
487
+ baseDepthScale: number;
488
+ baseTierCount: number;
489
+ baseStepSpread: number;
490
+ basePlinthHeightRatio: number;
491
+ baseRoundBandScale: number;
492
+ baseNeckScale: number;
493
+ baseRoundBandCount: number;
494
+ baseRibCount: number;
495
+ baseCarvingLevel: number;
496
+ basePanelInset: number;
497
+ capitalStyle: "none" | "simple" | "simple-slab" | "rounded" | "stepped" | "doric" | "volute" | "ionic-volute" | "leaf-carved" | "corinthian-leaf" | "south-indian-bracket" | "wood-bracket";
498
+ capitalWidthScale: number;
499
+ capitalDepthScale: number;
500
+ capitalTierCount: number;
501
+ capitalStepSpread: number;
502
+ capitalBandCount: number;
503
+ voluteSize: number;
504
+ voluteCount: number;
505
+ leafCount: number;
506
+ leafRows: number;
507
+ bracketDepth: number;
508
+ bracketTierCount: number;
509
+ pendantCount: number;
510
+ capitalCarvingLevel: number;
511
+ ringCount: number;
512
+ ringPlacement: "top" | "ends" | "even" | "bottom";
513
+ ringThickness: number;
514
+ ringSpread: number;
515
+ fluteCount: number;
516
+ fluteDepth: number;
517
+ fluteWidth: number;
518
+ spiralTwist: number;
519
+ spiralRibCount: number;
520
+ panelCount: number;
521
+ panelInsetDepth: number;
522
+ panelShape: "rectangle" | "arched" | "diamond";
523
+ latheRingCount: number;
524
+ latheRingSpacing: "top" | "ends" | "even" | "bottom";
525
+ carvingLevel: number;
526
+ carvingPlacement: "base" | "shaft" | "capital" | "all";
527
+ lowerBandEnabled: boolean;
528
+ lowerBandHeight: number;
529
+ lowerBandCarvingLevel: number;
530
+ dentilCount: number;
531
+ beadCount: number;
532
+ supportStyle: "vertical" | "a-frame" | "y-frame" | "v-frame" | "x-brace" | "k-brace" | "single-strut" | "tripod" | "trestle" | "portal-frame" | "box-frame";
533
+ braceWidth: number;
534
+ braceDepth: number;
535
+ braceBottomSpread: number;
536
+ braceTopSpread: number;
537
+ bracePlateEnabled: boolean;
538
+ type: "column";
539
+ name?: string | undefined;
540
+ camera?: {
541
+ position: [number, number, number];
542
+ target: [number, number, number];
543
+ mode: "perspective" | "orthographic";
544
+ fov?: number | undefined;
545
+ zoom?: number | undefined;
546
+ } | undefined;
547
+ provenance?: {
548
+ refs: {
549
+ id: string;
550
+ ns?: string | undefined;
551
+ role?: "primary" | "piece" | "absorbed" | "alias" | "derived" | undefined;
552
+ }[];
553
+ lineage?: {
554
+ op: "import" | "split" | "merge" | "duplicate" | "convert" | "promote" | "make-independent" | "attach";
555
+ fromIds: string[];
556
+ } | undefined;
557
+ } | undefined;
558
+ supportSlabId?: string | undefined;
559
+ slots?: Record<string, string> | undefined;
560
+ material?: {
561
+ id?: string | undefined;
562
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
563
+ properties?: {
564
+ color: string;
565
+ roughness: number;
566
+ metalness: number;
567
+ opacity: number;
568
+ transparent: boolean;
569
+ side: "front" | "back" | "double";
570
+ } | undefined;
571
+ texture?: {
572
+ url: string;
573
+ repeat?: [number, number] | undefined;
574
+ scale?: number | undefined;
575
+ } | undefined;
576
+ } | undefined;
577
+ materialPreset?: string | undefined;
578
+ source?: {
579
+ kind: "script";
580
+ language: "three" | "bpy";
581
+ script: string;
582
+ params: Record<string, string | number | boolean>;
583
+ artifact: string;
584
+ manifest: {
585
+ bounds: {
586
+ min: [number, number, number];
587
+ max: [number, number, number];
588
+ };
589
+ params: {
590
+ id: string;
591
+ kind: "string" | "number" | "boolean";
592
+ default: string | number | boolean;
593
+ label?: string | undefined;
594
+ min?: number | undefined;
595
+ max?: number | undefined;
596
+ step?: number | undefined;
597
+ unit?: string | undefined;
598
+ options?: string[] | undefined;
599
+ }[];
600
+ parts: {
601
+ id: string;
602
+ label?: string | undefined;
603
+ type?: string | undefined;
604
+ bounds?: {
605
+ min: [number, number, number];
606
+ max: [number, number, number];
607
+ } | undefined;
608
+ }[];
609
+ surfaces: {
610
+ y: number;
611
+ polygon: [number, number][];
612
+ part?: string | undefined;
613
+ }[];
614
+ slots: {
615
+ id: string;
616
+ label?: string | undefined;
617
+ color?: string | undefined;
618
+ roughness?: number | undefined;
619
+ metalness?: number | undefined;
620
+ transparent?: boolean | undefined;
621
+ emissive?: boolean | undefined;
622
+ }[];
623
+ anchors: {
624
+ id: string;
625
+ position: [number, number, number];
626
+ normal?: [number, number, number] | undefined;
627
+ }[];
628
+ lights: {
629
+ id: string;
630
+ position: [number, number, number];
631
+ color: string;
632
+ intensity: number;
633
+ distance?: number | undefined;
634
+ }[];
635
+ undersides: {
636
+ polygon: [number, number][];
637
+ plane: [number, number, number, number];
638
+ part?: string | undefined;
639
+ }[];
640
+ animations: {
641
+ name: string;
642
+ duration: number;
643
+ }[];
644
+ cutout: boolean;
645
+ collider: boolean;
646
+ triangles: number;
647
+ cutters?: {
648
+ host: "wall" | "slab" | "ceiling" | "mounted";
649
+ polygon: number[][];
650
+ minY: number;
651
+ maxY: number;
652
+ }[] | undefined;
653
+ };
654
+ meta?: {
655
+ description?: string | undefined;
656
+ category?: string | undefined;
657
+ tags?: string[] | undefined;
658
+ parent?: string | undefined;
659
+ } | undefined;
660
+ images?: {
661
+ artifact: string;
662
+ thumbnail: string;
663
+ floorPlan: string;
664
+ } | undefined;
665
+ } | undefined;
666
+ } | {
667
+ object: "node";
668
+ mode: "radius" | "linear" | "diameter" | "center-mark" | "chord" | "arc-length" | "angular" | "coordinate";
669
+ id: `construction-dimension_${string}`;
670
+ parentId: string | null;
671
+ visible: boolean;
672
+ metadata: Record<string, unknown>;
673
+ anchors: ([number, number, number] | {
674
+ kind: "feature";
675
+ reference: {
676
+ nodeId: string;
677
+ featureId: string;
678
+ parameters?: Record<string, string | number | boolean> | undefined;
679
+ };
680
+ fallback: [number, number, number];
681
+ })[];
682
+ baseline: {
683
+ origin: [number, number];
684
+ direction: [number, number];
685
+ };
686
+ chainMode: "point-to-point" | "continuous";
687
+ featureCount: number;
688
+ showCenterMark: boolean;
689
+ prefix: string;
690
+ suffix: string;
691
+ textOverride: string | null;
692
+ datumPolicy: "centerline" | "wall-face" | "structural-face" | "finish-face";
693
+ terminator: "architectural-tick" | "filled-arrow" | "open-arrow" | "dot";
694
+ textPosition: "above" | "centered";
695
+ imperialPrecision: "1" | "1/2" | "1/4" | "1/8" | "1/16";
696
+ metricNotation: "meters" | "millimeters";
697
+ extensionStartGap: number;
698
+ extensionOvershoot: number;
699
+ drawingType: "floor-plan" | "foundation-plan" | "reflected-ceiling-plan" | "roof-plan" | "site-plan";
700
+ drawingOverrides: {
701
+ drawingType: "floor-plan" | "foundation-plan" | "reflected-ceiling-plan" | "roof-plan" | "site-plan";
702
+ presentation: "shown" | "omit" | "controlled";
703
+ suppressedSegmentIndexes: number[];
704
+ }[];
705
+ controllingDimensionId: `construction-dimension_${string}` | null;
706
+ type: "construction-dimension";
707
+ name?: string | undefined;
708
+ camera?: {
709
+ position: [number, number, number];
710
+ target: [number, number, number];
711
+ mode: "perspective" | "orthographic";
712
+ fov?: number | undefined;
713
+ zoom?: number | undefined;
714
+ } | undefined;
715
+ provenance?: {
716
+ refs: {
717
+ id: string;
718
+ ns?: string | undefined;
719
+ role?: "primary" | "piece" | "absorbed" | "alias" | "derived" | undefined;
720
+ }[];
721
+ lineage?: {
722
+ op: "import" | "split" | "merge" | "duplicate" | "convert" | "promote" | "make-independent" | "attach";
723
+ fromIds: string[];
724
+ } | undefined;
725
+ } | undefined;
726
+ } | {
727
+ object: "node";
728
+ position: [number, number, number];
729
+ id: `block_${string}`;
730
+ parentId: string | null;
731
+ visible: boolean;
732
+ metadata: Record<string, unknown>;
733
+ rotation: number;
734
+ children: string[];
735
+ topology: {
736
+ vertices: {
737
+ id: string;
738
+ position: [number, number, number];
739
+ }[];
740
+ edges: {
741
+ id: string;
742
+ vertexIds: [string, string];
743
+ }[];
744
+ faces: {
745
+ id: string;
746
+ vertexIds: string[];
747
+ materialSlot: string;
748
+ }[];
749
+ };
750
+ slots: Record<string, string>;
751
+ slotNames: Record<string, string>;
752
+ type: "block";
753
+ name?: string | undefined;
754
+ camera?: {
755
+ position: [number, number, number];
756
+ target: [number, number, number];
757
+ mode: "perspective" | "orthographic";
758
+ fov?: number | undefined;
759
+ zoom?: number | undefined;
760
+ } | undefined;
761
+ provenance?: {
762
+ refs: {
763
+ id: string;
764
+ ns?: string | undefined;
765
+ role?: "primary" | "piece" | "absorbed" | "alias" | "derived" | undefined;
766
+ }[];
767
+ lineage?: {
768
+ op: "import" | "split" | "merge" | "duplicate" | "convert" | "promote" | "make-independent" | "attach";
769
+ fromIds: string[];
770
+ } | undefined;
771
+ } | undefined;
772
+ supportSlabId?: string | undefined;
773
+ } | {
774
+ object: "node";
775
+ id: `structural-grid_${string}`;
776
+ parentId: string | null;
777
+ visible: boolean;
778
+ metadata: Record<string, unknown>;
779
+ label: string;
780
+ start: [number, number];
781
+ end: [number, number];
782
+ showStartBubble: boolean;
783
+ showEndBubble: boolean;
784
+ type: "structural-grid";
785
+ name?: string | undefined;
786
+ camera?: {
787
+ position: [number, number, number];
788
+ target: [number, number, number];
789
+ mode: "perspective" | "orthographic";
790
+ fov?: number | undefined;
791
+ zoom?: number | undefined;
792
+ } | undefined;
793
+ provenance?: {
794
+ refs: {
795
+ id: string;
796
+ ns?: string | undefined;
797
+ role?: "primary" | "piece" | "absorbed" | "alias" | "derived" | undefined;
798
+ }[];
799
+ lineage?: {
800
+ op: "import" | "split" | "merge" | "duplicate" | "convert" | "promote" | "make-independent" | "attach";
801
+ fromIds: string[];
802
+ } | undefined;
803
+ } | undefined;
804
+ } | {
805
+ object: "node";
806
+ id: `wall_${string}`;
807
+ parentId: string | null;
808
+ visible: boolean;
809
+ metadata: Record<string, unknown>;
810
+ children: (`item_${string}` | `procedural-item_${string}` | `door_${string}` | `window_${string}` | `leanto_${string}`)[];
811
+ start: [number, number];
812
+ end: [number, number];
813
+ frontSide: "unknown" | "interior" | "exterior";
814
+ backSide: "unknown" | "interior" | "exterior";
815
+ type: "wall";
816
+ name?: string | undefined;
817
+ camera?: {
818
+ position: [number, number, number];
819
+ target: [number, number, number];
820
+ mode: "perspective" | "orthographic";
821
+ fov?: number | undefined;
822
+ zoom?: number | undefined;
823
+ } | undefined;
824
+ provenance?: {
825
+ refs: {
826
+ id: string;
827
+ ns?: string | undefined;
828
+ role?: "primary" | "piece" | "absorbed" | "alias" | "derived" | undefined;
829
+ }[];
830
+ lineage?: {
831
+ op: "import" | "split" | "merge" | "duplicate" | "convert" | "promote" | "make-independent" | "attach";
832
+ fromIds: string[];
833
+ } | undefined;
834
+ } | undefined;
835
+ supportSlabId?: string | undefined;
836
+ slots?: Record<string, string> | undefined;
837
+ material?: {
838
+ id?: string | undefined;
839
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
840
+ properties?: {
841
+ color: string;
842
+ roughness: number;
843
+ metalness: number;
844
+ opacity: number;
845
+ transparent: boolean;
846
+ side: "front" | "back" | "double";
847
+ } | undefined;
848
+ texture?: {
849
+ url: string;
850
+ repeat?: [number, number] | undefined;
851
+ scale?: number | undefined;
852
+ } | undefined;
853
+ } | undefined;
854
+ materialPreset?: string | undefined;
855
+ height?: number | undefined;
856
+ wallType?: "standard" | "curtain" | undefined;
857
+ curtainWall?: {
858
+ construction: "stick" | "unitized";
859
+ framing: "capped" | "vertical-caps" | "horizontal-caps" | "structural-glazing";
860
+ columns: {
861
+ layout: "count" | "maximum-spacing" | "fixed-spacing";
862
+ count: number;
863
+ spacing: number;
864
+ alignment: "center" | "start" | "end";
865
+ };
866
+ rows: {
867
+ layout: "count" | "maximum-spacing" | "fixed-spacing";
868
+ count: number;
869
+ spacing: number;
870
+ alignment: "center" | "start" | "end";
871
+ };
872
+ mullionWidth: number;
873
+ transomWidth: number;
874
+ perimeterWidth: number;
875
+ jointWidth: number;
876
+ glassThickness: number;
877
+ panelType: "glass" | "solid" | "empty";
878
+ spandrel: "top" | "none" | "bottom";
879
+ frameColor: string;
880
+ glassColor: string;
881
+ solidColor: string;
882
+ glassOpacity: number;
883
+ glassRoughness: number;
884
+ panels: {
885
+ column: number;
886
+ row: number;
887
+ type: "glass" | "solid" | "empty";
888
+ }[];
889
+ } | undefined;
890
+ thickness?: number | undefined;
891
+ assembly?: {
892
+ layers: {
893
+ id: string;
894
+ role: "fill" | "shell" | "finish" | "lining" | "substrate" | "sheathing" | "membrane" | "underlay" | "insulation" | "air" | "furring" | "structure" | "deck" | "covering" | "glazing";
895
+ thickness: number;
896
+ core?: true | undefined;
897
+ material?: string | undefined;
898
+ slot?: string | undefined;
899
+ returns?: boolean | undefined;
900
+ display?: "construction" | "finished" | undefined;
901
+ inset?: number | undefined;
902
+ bottom?: number | undefined;
903
+ lift?: number | undefined;
904
+ src?: string | undefined;
905
+ }[];
906
+ backing?: {
907
+ id: string;
908
+ role: "fill" | "shell" | "finish" | "lining" | "substrate" | "sheathing" | "membrane" | "underlay" | "insulation" | "air" | "furring" | "structure" | "deck" | "covering" | "glazing";
909
+ thickness: number;
910
+ core?: true | undefined;
911
+ material?: string | undefined;
912
+ slot?: string | undefined;
913
+ returns?: boolean | undefined;
914
+ display?: "construction" | "finished" | undefined;
915
+ inset?: number | undefined;
916
+ bottom?: number | undefined;
917
+ lift?: number | undefined;
918
+ src?: string | undefined;
919
+ }[] | undefined;
920
+ face?: "front" | "exterior" | undefined;
921
+ presetId?: string | undefined;
922
+ cavityInsulation?: string | undefined;
923
+ } | undefined;
924
+ fillToTerrain?: boolean | undefined;
925
+ interiorMaterial?: {
926
+ id?: string | undefined;
927
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
928
+ properties?: {
929
+ color: string;
930
+ roughness: number;
931
+ metalness: number;
932
+ opacity: number;
933
+ transparent: boolean;
934
+ side: "front" | "back" | "double";
935
+ } | undefined;
936
+ texture?: {
937
+ url: string;
938
+ repeat?: [number, number] | undefined;
939
+ scale?: number | undefined;
940
+ } | undefined;
941
+ } | undefined;
942
+ interiorMaterialPreset?: string | undefined;
943
+ exteriorMaterial?: {
944
+ id?: string | undefined;
945
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
946
+ properties?: {
947
+ color: string;
948
+ roughness: number;
949
+ metalness: number;
950
+ opacity: number;
951
+ transparent: boolean;
952
+ side: "front" | "back" | "double";
953
+ } | undefined;
954
+ texture?: {
955
+ url: string;
956
+ repeat?: [number, number] | undefined;
957
+ scale?: number | undefined;
958
+ } | undefined;
959
+ } | undefined;
960
+ exteriorMaterialPreset?: string | undefined;
961
+ legacyFaceMaterials?: {
962
+ a?: {
963
+ material?: {
964
+ id?: string | undefined;
965
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
966
+ properties?: {
967
+ color: string;
968
+ roughness: number;
969
+ metalness: number;
970
+ opacity: number;
971
+ transparent: boolean;
972
+ side: "front" | "back" | "double";
973
+ } | undefined;
974
+ texture?: {
975
+ url: string;
976
+ repeat?: [number, number] | undefined;
977
+ scale?: number | undefined;
978
+ } | undefined;
979
+ } | undefined;
980
+ materialPreset?: string | undefined;
981
+ } | undefined;
982
+ b?: {
983
+ material?: {
984
+ id?: string | undefined;
985
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
986
+ properties?: {
987
+ color: string;
988
+ roughness: number;
989
+ metalness: number;
990
+ opacity: number;
991
+ transparent: boolean;
992
+ side: "front" | "back" | "double";
993
+ } | undefined;
994
+ texture?: {
995
+ url: string;
996
+ repeat?: [number, number] | undefined;
997
+ scale?: number | undefined;
998
+ } | undefined;
999
+ } | undefined;
1000
+ materialPreset?: string | undefined;
1001
+ } | undefined;
1002
+ } | undefined;
1003
+ faceRegions?: {
1004
+ id: string;
1005
+ face: "a" | "b";
1006
+ finish: string;
1007
+ u0?: number | undefined;
1008
+ u1?: number | undefined;
1009
+ v0?: number | undefined;
1010
+ v1?: number | undefined;
1011
+ }[] | undefined;
1012
+ justification?: "a" | "b" | undefined;
1013
+ curveOffset?: number | undefined;
1014
+ supportOffset?: number | undefined;
1015
+ underpinning?: {
1016
+ rim: number;
1017
+ stem: number;
1018
+ openings?: {
1019
+ u: number;
1020
+ width: number;
1021
+ top: number;
1022
+ bottom: number;
1023
+ }[] | undefined;
1024
+ } | undefined;
1025
+ skirting?: {
1026
+ enabled: boolean;
1027
+ sides: "a" | "b" | "interior" | "exterior" | "both";
1028
+ height: number;
1029
+ proud: number;
1030
+ profile: "flat" | "bevel" | "triangle" | "cove" | "bullnose" | "base-modern" | "base-colonial" | "base-shoe" | "base-ogee" | "crown-cove" | "crown-ogee" | "crown-craftsman" | "crown-layered" | "rail-rounded" | "rail-ogee" | "rail-picture" | "rail-stepped";
1031
+ offsetY?: number | undefined;
1032
+ } | undefined;
1033
+ crown?: {
1034
+ enabled: boolean;
1035
+ sides: "a" | "b" | "interior" | "exterior" | "both";
1036
+ height: number;
1037
+ proud: number;
1038
+ profile: "flat" | "bevel" | "triangle" | "cove" | "bullnose" | "base-modern" | "base-colonial" | "base-shoe" | "base-ogee" | "crown-cove" | "crown-ogee" | "crown-craftsman" | "crown-layered" | "rail-rounded" | "rail-ogee" | "rail-picture" | "rail-stepped";
1039
+ offsetY?: number | undefined;
1040
+ } | undefined;
1041
+ chairRail?: {
1042
+ enabled: boolean;
1043
+ sides: "a" | "b" | "interior" | "exterior" | "both";
1044
+ height: number;
1045
+ proud: number;
1046
+ profile: "flat" | "bevel" | "triangle" | "cove" | "bullnose" | "base-modern" | "base-colonial" | "base-shoe" | "base-ogee" | "crown-cove" | "crown-ogee" | "crown-craftsman" | "crown-layered" | "rail-rounded" | "rail-ogee" | "rail-picture" | "rail-stepped";
1047
+ offsetY?: number | undefined;
1048
+ } | undefined;
1049
+ } | {
1050
+ object: "node";
1051
+ id: `separator_${string}`;
1052
+ parentId: string | null;
1053
+ visible: boolean;
1054
+ metadata: Record<string, unknown>;
1055
+ start: [number, number];
1056
+ end: [number, number];
1057
+ type: "separator";
1058
+ name?: string | undefined;
1059
+ camera?: {
1060
+ position: [number, number, number];
1061
+ target: [number, number, number];
1062
+ mode: "perspective" | "orthographic";
1063
+ fov?: number | undefined;
1064
+ zoom?: number | undefined;
1065
+ } | undefined;
1066
+ provenance?: {
1067
+ refs: {
1068
+ id: string;
1069
+ ns?: string | undefined;
1070
+ role?: "primary" | "piece" | "absorbed" | "alias" | "derived" | undefined;
1071
+ }[];
1072
+ lineage?: {
1073
+ op: "import" | "split" | "merge" | "duplicate" | "convert" | "promote" | "make-independent" | "attach";
1074
+ fromIds: string[];
1075
+ } | undefined;
1076
+ } | undefined;
1077
+ } | {
1078
+ object: "node";
1079
+ id: `floor-opening_${string}`;
1080
+ parentId: string | null;
1081
+ visible: boolean;
1082
+ metadata: Record<string, unknown>;
1083
+ polygon: [number, number][];
1084
+ source: string;
1085
+ drawnOn: "ceiling" | "floor";
1086
+ cutsPrimary: boolean;
1087
+ cutsAdjacent: boolean;
1088
+ type: "floor-opening";
1089
+ name?: string | undefined;
1090
+ camera?: {
1091
+ position: [number, number, number];
1092
+ target: [number, number, number];
1093
+ mode: "perspective" | "orthographic";
1094
+ fov?: number | undefined;
1095
+ zoom?: number | undefined;
1096
+ } | undefined;
1097
+ provenance?: {
1098
+ refs: {
1099
+ id: string;
1100
+ ns?: string | undefined;
1101
+ role?: "primary" | "piece" | "absorbed" | "alias" | "derived" | undefined;
1102
+ }[];
1103
+ lineage?: {
1104
+ op: "import" | "split" | "merge" | "duplicate" | "convert" | "promote" | "make-independent" | "attach";
1105
+ fromIds: string[];
1106
+ } | undefined;
1107
+ } | undefined;
1108
+ surfaceId?: string | undefined;
1109
+ hostZoneId?: string | undefined;
1110
+ legacyPlateCuts?: Record<string, [number, number][][]> | undefined;
1111
+ legacyCeilingCuts?: Record<string, [number, number][][]> | undefined;
1112
+ ownerId?: string | undefined;
1113
+ } | {
1114
+ object: "node";
1115
+ id: `fence_${string}`;
1116
+ parentId: string | null;
1117
+ visible: boolean;
1118
+ metadata: Record<string, unknown>;
1119
+ color: string;
1120
+ children: string[];
1121
+ height: number;
1122
+ baseHeight: number;
1123
+ style: "slat" | "rail" | "privacy" | "horizontal" | "guard" | "picket";
1124
+ baseStyle: "floating" | "grounded" | "raised";
1125
+ start: [number, number];
1126
+ end: [number, number];
1127
+ thickness: number;
1128
+ postSpacing: number;
1129
+ surfaceMode: "auto" | "level" | "selected";
1130
+ transitionMode: "step" | "slope" | "break";
1131
+ transitionWidth: number;
1132
+ picketSpacing: number;
1133
+ patternDistribution: "maximum-spacing" | "fixed-spacing" | "automatic" | "fixed-count" | "equal-fit";
1134
+ patternAlignment: "center" | "start" | "end";
1135
+ patternCount: number;
1136
+ patternRemainder: "leave" | "spread";
1137
+ picketWidth: number;
1138
+ picketTop: "flat" | "rounded" | "pointed" | "dog-ear";
1139
+ picketProfile: "arched" | "level" | "scalloped" | "alternating";
1140
+ picketTopClearance: number;
1141
+ picketVariation: number;
1142
+ picketRailProjection: number;
1143
+ picketRailCount: number;
1144
+ postSize: number;
1145
+ topRailHeight: number;
1146
+ groundClearance: number;
1147
+ edgeInset: number;
1148
+ slatGap: number;
1149
+ postCap: "flat" | "none" | "pyramid";
1150
+ showInfill: boolean;
1151
+ infillPlacement: "center" | "front" | "back";
1152
+ type: "fence";
1153
+ name?: string | undefined;
1154
+ camera?: {
1155
+ position: [number, number, number];
1156
+ target: [number, number, number];
1157
+ mode: "perspective" | "orthographic";
1158
+ fov?: number | undefined;
1159
+ zoom?: number | undefined;
1160
+ } | undefined;
1161
+ provenance?: {
1162
+ refs: {
1163
+ id: string;
1164
+ ns?: string | undefined;
1165
+ role?: "primary" | "piece" | "absorbed" | "alias" | "derived" | undefined;
1166
+ }[];
1167
+ lineage?: {
1168
+ op: "import" | "split" | "merge" | "duplicate" | "convert" | "promote" | "make-independent" | "attach";
1169
+ fromIds: string[];
1170
+ } | undefined;
1171
+ } | undefined;
1172
+ path?: [number, number][] | undefined;
1173
+ supportSlabId?: string | undefined;
1174
+ slots?: Record<string, string> | undefined;
1175
+ material?: {
1176
+ id?: string | undefined;
1177
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
1178
+ properties?: {
1179
+ color: string;
1180
+ roughness: number;
1181
+ metalness: number;
1182
+ opacity: number;
1183
+ transparent: boolean;
1184
+ side: "front" | "back" | "double";
1185
+ } | undefined;
1186
+ texture?: {
1187
+ url: string;
1188
+ repeat?: [number, number] | undefined;
1189
+ scale?: number | undefined;
1190
+ } | undefined;
1191
+ } | undefined;
1192
+ materialPreset?: string | undefined;
1193
+ curveOffset?: number | undefined;
1194
+ supportOffset?: number | undefined;
1195
+ spanModes?: ("straight" | "curve")[] | undefined;
1196
+ tangents?: ([number, number] | null)[] | undefined;
1197
+ supportSurfaceNodeId?: string | undefined;
1198
+ guardInfill?: "balusters" | "cable" | "boards" | undefined;
1199
+ startPost?: boolean | undefined;
1200
+ endPost?: boolean | undefined;
1201
+ postThrough?: boolean | undefined;
1202
+ } | {
1203
+ object: "node";
1204
+ id: `fence-gate_${string}`;
1205
+ parentId: string | null;
1206
+ visible: boolean;
1207
+ metadata: Record<string, unknown>;
1208
+ center: number;
1209
+ width: number;
1210
+ type: "fence-gate";
1211
+ name?: string | undefined;
1212
+ camera?: {
1213
+ position: [number, number, number];
1214
+ target: [number, number, number];
1215
+ mode: "perspective" | "orthographic";
1216
+ fov?: number | undefined;
1217
+ zoom?: number | undefined;
1218
+ } | undefined;
1219
+ provenance?: {
1220
+ refs: {
1221
+ id: string;
1222
+ ns?: string | undefined;
1223
+ role?: "primary" | "piece" | "absorbed" | "alias" | "derived" | undefined;
1224
+ }[];
1225
+ lineage?: {
1226
+ op: "import" | "split" | "merge" | "duplicate" | "convert" | "promote" | "make-independent" | "attach";
1227
+ fromIds: string[];
1228
+ } | undefined;
1229
+ } | undefined;
1230
+ height?: number | undefined;
1231
+ style?: "match" | "slat" | "rail" | "privacy" | "horizontal" | "guard" | "picket" | undefined;
1232
+ spacing?: number | undefined;
1233
+ thickness?: number | undefined;
1234
+ hinge?: "left" | "right" | undefined;
1235
+ matchFenceStyle?: boolean | undefined;
1236
+ matchFenceHeight?: boolean | undefined;
1237
+ leafType?: "double" | "single" | undefined;
1238
+ clearance?: number | undefined;
1239
+ frameWidth?: number | undefined;
1240
+ boardWidth?: number | undefined;
1241
+ swing?: "inward" | "outward" | undefined;
1242
+ openAngle?: number | undefined;
1243
+ leafSplit?: number | undefined;
1244
+ brace?: "none" | "cross" | "diagonal" | undefined;
1245
+ showHardware?: boolean | undefined;
1246
+ showPosts?: boolean | undefined;
1247
+ } | {
1248
+ object: "node";
1249
+ id: `fence-opening_${string}`;
1250
+ parentId: string | null;
1251
+ visible: boolean;
1252
+ metadata: Record<string, unknown>;
1253
+ center: number;
1254
+ width: number;
1255
+ showPosts: boolean;
1256
+ type: "fence-opening";
1257
+ name?: string | undefined;
1258
+ camera?: {
1259
+ position: [number, number, number];
1260
+ target: [number, number, number];
1261
+ mode: "perspective" | "orthographic";
1262
+ fov?: number | undefined;
1263
+ zoom?: number | undefined;
1264
+ } | undefined;
1265
+ provenance?: {
1266
+ refs: {
1267
+ id: string;
1268
+ ns?: string | undefined;
1269
+ role?: "primary" | "piece" | "absorbed" | "alias" | "derived" | undefined;
1270
+ }[];
1271
+ lineage?: {
1272
+ op: "import" | "split" | "merge" | "duplicate" | "convert" | "promote" | "make-independent" | "attach";
1273
+ fromIds: string[];
1274
+ } | undefined;
1275
+ } | undefined;
1276
+ height?: number | undefined;
1277
+ matchFenceStyle?: boolean | undefined;
1278
+ matchFenceHeight?: boolean | undefined;
1279
+ } | {
1280
+ object: "node";
1281
+ position: [number, number, number];
1282
+ id: `cabinet_${string}`;
1283
+ parentId: string | null;
1284
+ visible: boolean;
1285
+ metadata: Record<string, unknown>;
1286
+ depth: number;
1287
+ rotation: number;
1288
+ children: string[];
1289
+ width: number;
1290
+ operationState: number;
1291
+ runTier: "wall" | "base" | "tall";
1292
+ withWaterfall: boolean;
1293
+ withFinishedEnds: boolean;
1294
+ carcassHeight: number;
1295
+ plinthHeight: number;
1296
+ toeKickDepth: number;
1297
+ boardThickness: number;
1298
+ countertopThickness: number;
1299
+ countertopOverhang: number;
1300
+ countertopBackOverhang: number;
1301
+ withFinishedBack: boolean;
1302
+ frontThickness: number;
1303
+ frontGap: number;
1304
+ frontStyle: "slab" | "shaker" | "raised-arch";
1305
+ panelReady: boolean;
1306
+ handleStyle: "cutout" | "none" | "bar" | "hole" | "knob";
1307
+ handlePosition: "center" | "top" | "auto";
1308
+ frontOverlay: "inset" | "full";
1309
+ withBottomPanel: boolean;
1310
+ showPlinth: boolean;
1311
+ withCountertop: boolean;
1312
+ type: "cabinet";
1313
+ name?: string | undefined;
1314
+ camera?: {
1315
+ position: [number, number, number];
1316
+ target: [number, number, number];
1317
+ mode: "perspective" | "orthographic";
1318
+ fov?: number | undefined;
1319
+ zoom?: number | undefined;
1320
+ } | undefined;
1321
+ provenance?: {
1322
+ refs: {
1323
+ id: string;
1324
+ ns?: string | undefined;
1325
+ role?: "primary" | "piece" | "absorbed" | "alias" | "derived" | undefined;
1326
+ }[];
1327
+ lineage?: {
1328
+ op: "import" | "split" | "merge" | "duplicate" | "convert" | "promote" | "make-independent" | "attach";
1329
+ fromIds: string[];
1330
+ } | undefined;
1331
+ } | undefined;
1332
+ supportSlabId?: string | undefined;
1333
+ slots?: Record<string, string> | undefined;
1334
+ material?: {
1335
+ id?: string | undefined;
1336
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
1337
+ properties?: {
1338
+ color: string;
1339
+ roughness: number;
1340
+ metalness: number;
1341
+ opacity: number;
1342
+ transparent: boolean;
1343
+ side: "front" | "back" | "double";
1344
+ } | undefined;
1345
+ texture?: {
1346
+ url: string;
1347
+ repeat?: [number, number] | undefined;
1348
+ scale?: number | undefined;
1349
+ } | undefined;
1350
+ } | undefined;
1351
+ materialPreset?: string | undefined;
1352
+ barLedge?: {
1353
+ edge: "left" | "right" | "back";
1354
+ height: number;
1355
+ depth: number;
1356
+ } | undefined;
1357
+ stack?: ({
1358
+ type: "shelf";
1359
+ id: string;
1360
+ shelfCount?: number | undefined;
1361
+ height?: number | undefined;
1362
+ } | {
1363
+ type: "drawer";
1364
+ id: string;
1365
+ drawerCount?: number | undefined;
1366
+ height?: number | undefined;
1367
+ } | {
1368
+ type: "door";
1369
+ id: string;
1370
+ doorType?: "glass" | "double" | "single-left" | "single-right" | undefined;
1371
+ shelfCount?: number | undefined;
1372
+ height?: number | undefined;
1373
+ } | {
1374
+ type: "sink";
1375
+ id: string;
1376
+ sinkLayout?: "double" | "single" | "double-offset" | undefined;
1377
+ height?: number | undefined;
1378
+ } | {
1379
+ type: "oven";
1380
+ id: string;
1381
+ height?: number | undefined;
1382
+ } | {
1383
+ type: "microwave";
1384
+ id: string;
1385
+ height?: number | undefined;
1386
+ } | {
1387
+ type: "dishwasher";
1388
+ id: string;
1389
+ height?: number | undefined;
1390
+ } | {
1391
+ type: "cooktop-gas";
1392
+ id: string;
1393
+ cooktopLayout?: "gas-2burner" | "gas-4burner" | "gas-5burner-wok" | "gas-6burner" | undefined;
1394
+ cooktopBurnersOn?: boolean | undefined;
1395
+ cooktopActiveBurners?: number[] | undefined;
1396
+ cooktopKnobProgress?: number[] | undefined;
1397
+ cooktopShowGrate?: boolean | undefined;
1398
+ height?: number | undefined;
1399
+ } | {
1400
+ type: "cooktop-induction";
1401
+ id: string;
1402
+ cooktopLayout?: "induction-2zone" | "induction-4zone" | undefined;
1403
+ cooktopBurnersOn?: boolean | undefined;
1404
+ cooktopActiveBurners?: number[] | undefined;
1405
+ cooktopKnobProgress?: number[] | undefined;
1406
+ cooktopShowGrate?: boolean | undefined;
1407
+ height?: number | undefined;
1408
+ } | {
1409
+ type: "pull-out-pantry";
1410
+ id: string;
1411
+ shelfCount?: number | undefined;
1412
+ pantryRackStyle?: "glass" | "wire" | "tray" | undefined;
1413
+ height?: number | undefined;
1414
+ } | {
1415
+ type: "fridge-single";
1416
+ id: string;
1417
+ height?: number | undefined;
1418
+ } | {
1419
+ type: "fridge-double";
1420
+ id: string;
1421
+ height?: number | undefined;
1422
+ } | {
1423
+ type: "fridge-top-freezer";
1424
+ id: string;
1425
+ height?: number | undefined;
1426
+ } | {
1427
+ type: "fridge-bottom-freezer";
1428
+ id: string;
1429
+ height?: number | undefined;
1430
+ } | {
1431
+ type: "hood-pyramid";
1432
+ id: string;
1433
+ height?: number | undefined;
1434
+ } | {
1435
+ type: "hood-curved-glass";
1436
+ id: string;
1437
+ height?: number | undefined;
1438
+ })[] | undefined;
1439
+ } | {
1440
+ object: "node";
1441
+ position: [number, number, number];
1442
+ id: `cabinet-module_${string}`;
1443
+ parentId: string | null;
1444
+ visible: boolean;
1445
+ metadata: Record<string, unknown>;
1446
+ depth: number;
1447
+ rotation: number;
1448
+ children: string[];
1449
+ width: number;
1450
+ operationState: number;
1451
+ carcassHeight: number;
1452
+ plinthHeight: number;
1453
+ toeKickDepth: number;
1454
+ boardThickness: number;
1455
+ countertopThickness: number;
1456
+ countertopOverhang: number;
1457
+ countertopBackOverhang: number;
1458
+ withFinishedBack: boolean;
1459
+ frontThickness: number;
1460
+ frontGap: number;
1461
+ frontStyle: "slab" | "shaker" | "raised-arch";
1462
+ panelReady: boolean;
1463
+ handleStyle: "cutout" | "none" | "bar" | "hole" | "knob";
1464
+ handlePosition: "center" | "top" | "auto";
1465
+ frontOverlay: "inset" | "full";
1466
+ withBottomPanel: boolean;
1467
+ showPlinth: boolean;
1468
+ withCountertop: boolean;
1469
+ cabinetType: "base" | "tall";
1470
+ moduleKind: "standard" | "corner-filler";
1471
+ topFinish: "trim" | "none" | "top-cabinet";
1472
+ topFinishHeight: number;
1473
+ topFinishDepth: number;
1474
+ type: "cabinet-module";
1475
+ name?: string | undefined;
1476
+ camera?: {
1477
+ position: [number, number, number];
1478
+ target: [number, number, number];
1479
+ mode: "perspective" | "orthographic";
1480
+ fov?: number | undefined;
1481
+ zoom?: number | undefined;
1482
+ } | undefined;
1483
+ provenance?: {
1484
+ refs: {
1485
+ id: string;
1486
+ ns?: string | undefined;
1487
+ role?: "primary" | "piece" | "absorbed" | "alias" | "derived" | undefined;
1488
+ }[];
1489
+ lineage?: {
1490
+ op: "import" | "split" | "merge" | "duplicate" | "convert" | "promote" | "make-independent" | "attach";
1491
+ fromIds: string[];
1492
+ } | undefined;
1493
+ } | undefined;
1494
+ supportSlabId?: string | undefined;
1495
+ slots?: Record<string, string> | undefined;
1496
+ material?: {
1497
+ id?: string | undefined;
1498
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
1499
+ properties?: {
1500
+ color: string;
1501
+ roughness: number;
1502
+ metalness: number;
1503
+ opacity: number;
1504
+ transparent: boolean;
1505
+ side: "front" | "back" | "double";
1506
+ } | undefined;
1507
+ texture?: {
1508
+ url: string;
1509
+ repeat?: [number, number] | undefined;
1510
+ scale?: number | undefined;
1511
+ } | undefined;
1512
+ } | undefined;
1513
+ materialPreset?: string | undefined;
1514
+ stack?: ({
1515
+ type: "shelf";
1516
+ id: string;
1517
+ shelfCount?: number | undefined;
1518
+ height?: number | undefined;
1519
+ } | {
1520
+ type: "drawer";
1521
+ id: string;
1522
+ drawerCount?: number | undefined;
1523
+ height?: number | undefined;
1524
+ } | {
1525
+ type: "door";
1526
+ id: string;
1527
+ doorType?: "glass" | "double" | "single-left" | "single-right" | undefined;
1528
+ shelfCount?: number | undefined;
1529
+ height?: number | undefined;
1530
+ } | {
1531
+ type: "sink";
1532
+ id: string;
1533
+ sinkLayout?: "double" | "single" | "double-offset" | undefined;
1534
+ height?: number | undefined;
1535
+ } | {
1536
+ type: "oven";
1537
+ id: string;
1538
+ height?: number | undefined;
1539
+ } | {
1540
+ type: "microwave";
1541
+ id: string;
1542
+ height?: number | undefined;
1543
+ } | {
1544
+ type: "dishwasher";
1545
+ id: string;
1546
+ height?: number | undefined;
1547
+ } | {
1548
+ type: "cooktop-gas";
1549
+ id: string;
1550
+ cooktopLayout?: "gas-2burner" | "gas-4burner" | "gas-5burner-wok" | "gas-6burner" | undefined;
1551
+ cooktopBurnersOn?: boolean | undefined;
1552
+ cooktopActiveBurners?: number[] | undefined;
1553
+ cooktopKnobProgress?: number[] | undefined;
1554
+ cooktopShowGrate?: boolean | undefined;
1555
+ height?: number | undefined;
1556
+ } | {
1557
+ type: "cooktop-induction";
1558
+ id: string;
1559
+ cooktopLayout?: "induction-2zone" | "induction-4zone" | undefined;
1560
+ cooktopBurnersOn?: boolean | undefined;
1561
+ cooktopActiveBurners?: number[] | undefined;
1562
+ cooktopKnobProgress?: number[] | undefined;
1563
+ cooktopShowGrate?: boolean | undefined;
1564
+ height?: number | undefined;
1565
+ } | {
1566
+ type: "pull-out-pantry";
1567
+ id: string;
1568
+ shelfCount?: number | undefined;
1569
+ pantryRackStyle?: "glass" | "wire" | "tray" | undefined;
1570
+ height?: number | undefined;
1571
+ } | {
1572
+ type: "fridge-single";
1573
+ id: string;
1574
+ height?: number | undefined;
1575
+ } | {
1576
+ type: "fridge-double";
1577
+ id: string;
1578
+ height?: number | undefined;
1579
+ } | {
1580
+ type: "fridge-top-freezer";
1581
+ id: string;
1582
+ height?: number | undefined;
1583
+ } | {
1584
+ type: "fridge-bottom-freezer";
1585
+ id: string;
1586
+ height?: number | undefined;
1587
+ } | {
1588
+ type: "hood-pyramid";
1589
+ id: string;
1590
+ height?: number | undefined;
1591
+ } | {
1592
+ type: "hood-curved-glass";
1593
+ id: string;
1594
+ height?: number | undefined;
1595
+ })[] | undefined;
1596
+ openSide?: "left" | "right" | undefined;
1597
+ cornerShelf?: boolean | undefined;
1598
+ } | {
1599
+ object: "node";
1600
+ position: [number, number, number];
1601
+ id: `item_${string}`;
1602
+ parentId: string | null;
1603
+ visible: boolean;
1604
+ metadata: Record<string, unknown>;
1605
+ scale: [number, number, number];
1606
+ rotation: [number, number, number];
1607
+ children: string[];
1608
+ asset: {
1609
+ id: string;
1610
+ category: string;
1611
+ name: string;
1612
+ thumbnail: string;
1613
+ source: "library" | "community" | "mine";
1614
+ src: string;
1615
+ dimensions: [number, number, number];
1616
+ offset: [number, number, number];
1617
+ rotation: [number, number, number];
1618
+ scale: [number, number, number];
1619
+ floorPlanUrl?: string | undefined;
1620
+ isDraft?: boolean | undefined;
1621
+ attachTo?: "wall" | "ceiling" | "wall-side" | undefined;
1622
+ recessed?: boolean | undefined;
1623
+ tags?: string[] | undefined;
1624
+ functionTags?: string[] | undefined;
1625
+ surface?: {
1626
+ height: number;
1627
+ } | undefined;
1628
+ interactive?: {
1629
+ controls: ({
1630
+ kind: "toggle";
1631
+ label?: string | undefined;
1632
+ default?: boolean | undefined;
1633
+ } | {
1634
+ kind: "slider";
1635
+ label: string;
1636
+ min: number;
1637
+ max: number;
1638
+ step: number;
1639
+ displayMode: "slider" | "stepper" | "dial";
1640
+ unit?: string | undefined;
1641
+ default?: number | undefined;
1642
+ } | {
1643
+ kind: "temperature";
1644
+ label: string;
1645
+ min: number;
1646
+ max: number;
1647
+ unit: "C" | "F";
1648
+ default?: number | undefined;
1649
+ })[];
1650
+ effects: ({
1651
+ kind: "animation";
1652
+ clips: {
1653
+ on?: string | undefined;
1654
+ off?: string | undefined;
1655
+ loop?: string | undefined;
1656
+ };
1657
+ mode?: "ambient" | "open-close" | undefined;
1658
+ control?: number | undefined;
1659
+ } | {
1660
+ kind: "light";
1661
+ color: string;
1662
+ intensityRange: [number, number];
1663
+ offset: [number, number, number];
1664
+ distance?: number | undefined;
1665
+ })[];
1666
+ } | undefined;
1667
+ };
1668
+ type: "item";
1669
+ name?: string | undefined;
1670
+ camera?: {
1671
+ position: [number, number, number];
1672
+ target: [number, number, number];
1673
+ mode: "perspective" | "orthographic";
1674
+ fov?: number | undefined;
1675
+ zoom?: number | undefined;
1676
+ } | undefined;
1677
+ provenance?: {
1678
+ refs: {
1679
+ id: string;
1680
+ ns?: string | undefined;
1681
+ role?: "primary" | "piece" | "absorbed" | "alias" | "derived" | undefined;
1682
+ }[];
1683
+ lineage?: {
1684
+ op: "import" | "split" | "merge" | "duplicate" | "convert" | "promote" | "make-independent" | "attach";
1685
+ fromIds: string[];
1686
+ } | undefined;
1687
+ } | undefined;
1688
+ side?: "front" | "back" | undefined;
1689
+ supportSlabId?: string | undefined;
1690
+ slots?: Record<string, string> | undefined;
1691
+ roofSegmentId?: string | undefined;
1692
+ source?: {
1693
+ kind: "script";
1694
+ language: "three" | "bpy";
1695
+ script: string;
1696
+ params: Record<string, string | number | boolean>;
1697
+ artifact: string;
1698
+ manifest: {
1699
+ bounds: {
1700
+ min: [number, number, number];
1701
+ max: [number, number, number];
1702
+ };
1703
+ params: {
1704
+ id: string;
1705
+ kind: "string" | "number" | "boolean";
1706
+ default: string | number | boolean;
1707
+ label?: string | undefined;
1708
+ min?: number | undefined;
1709
+ max?: number | undefined;
1710
+ step?: number | undefined;
1711
+ unit?: string | undefined;
1712
+ options?: string[] | undefined;
1713
+ }[];
1714
+ parts: {
1715
+ id: string;
1716
+ label?: string | undefined;
1717
+ type?: string | undefined;
1718
+ bounds?: {
1719
+ min: [number, number, number];
1720
+ max: [number, number, number];
1721
+ } | undefined;
1722
+ }[];
1723
+ surfaces: {
1724
+ y: number;
1725
+ polygon: [number, number][];
1726
+ part?: string | undefined;
1727
+ }[];
1728
+ slots: {
1729
+ id: string;
1730
+ label?: string | undefined;
1731
+ color?: string | undefined;
1732
+ roughness?: number | undefined;
1733
+ metalness?: number | undefined;
1734
+ transparent?: boolean | undefined;
1735
+ emissive?: boolean | undefined;
1736
+ }[];
1737
+ anchors: {
1738
+ id: string;
1739
+ position: [number, number, number];
1740
+ normal?: [number, number, number] | undefined;
1741
+ }[];
1742
+ lights: {
1743
+ id: string;
1744
+ position: [number, number, number];
1745
+ color: string;
1746
+ intensity: number;
1747
+ distance?: number | undefined;
1748
+ }[];
1749
+ undersides: {
1750
+ polygon: [number, number][];
1751
+ plane: [number, number, number, number];
1752
+ part?: string | undefined;
1753
+ }[];
1754
+ animations: {
1755
+ name: string;
1756
+ duration: number;
1757
+ }[];
1758
+ cutout: boolean;
1759
+ collider: boolean;
1760
+ triangles: number;
1761
+ cutters?: {
1762
+ host: "wall" | "slab" | "ceiling" | "mounted";
1763
+ polygon: number[][];
1764
+ minY: number;
1765
+ maxY: number;
1766
+ }[] | undefined;
1767
+ };
1768
+ meta?: {
1769
+ description?: string | undefined;
1770
+ category?: string | undefined;
1771
+ tags?: string[] | undefined;
1772
+ parent?: string | undefined;
1773
+ } | undefined;
1774
+ images?: {
1775
+ artifact: string;
1776
+ thumbnail: string;
1777
+ floorPlan: string;
1778
+ } | undefined;
1779
+ } | undefined;
1780
+ wallId?: string | undefined;
1781
+ wallT?: number | undefined;
1782
+ roofFace?: "left" | "right" | "front" | "back" | undefined;
1783
+ blockFaceId?: string | undefined;
1784
+ collectionIds?: `collection_${string}`[] | undefined;
1785
+ } | {
1786
+ object: "node";
1787
+ position: [number, number, number];
1788
+ id: `procedural-item_${string}`;
1789
+ parentId: string | null;
1790
+ visible: boolean;
1791
+ metadata: Record<string, unknown>;
1792
+ rotation: [number, number, number];
1793
+ children: string[];
1794
+ slots: Record<string, string>;
1795
+ parameters: Record<string, number>;
1796
+ recipe: {
1797
+ version: 2 | 1;
1798
+ name: string;
1799
+ description: string;
1800
+ parameters: {
1801
+ id: string;
1802
+ label: string;
1803
+ default: number;
1804
+ min: number;
1805
+ max: number;
1806
+ step: number;
1807
+ unit: "count" | "m" | "rad" | "s" | "bool" | "choice";
1808
+ options?: string[] | undefined;
1809
+ part?: string | undefined;
1810
+ axis?: "x" | "z" | "y" | undefined;
1811
+ }[];
1812
+ slots: {
1813
+ id: string;
1814
+ label: string;
1815
+ color: string;
1816
+ finish?: "wood" | "glass" | "metal" | undefined;
1817
+ }[];
1818
+ parts: {
1819
+ id: string;
1820
+ label: string;
1821
+ count: import("../../procedural-items/index.js").Expr;
1822
+ shapes: ({
1823
+ id: string;
1824
+ primitive: "box" | "roundedBox" | "cylinder" | "ellipsoid";
1825
+ slot: string;
1826
+ size: [import("../../procedural-items/index.js").Expr, import("../../procedural-items/index.js").Expr, import("../../procedural-items/index.js").Expr];
1827
+ position: [import("../../procedural-items/index.js").Expr, import("../../procedural-items/index.js").Expr, import("../../procedural-items/index.js").Expr];
1828
+ support?: boolean | undefined;
1829
+ when?: import("../../procedural-items/index.js").Expr | undefined;
1830
+ rotation?: [import("../../procedural-items/index.js").Expr, import("../../procedural-items/index.js").Expr, import("../../procedural-items/index.js").Expr] | undefined;
1831
+ radius?: import("../../procedural-items/index.js").Expr | undefined;
1832
+ topScale?: import("../../procedural-items/index.js").Expr | undefined;
1833
+ segments?: number | undefined;
1834
+ open?: boolean | undefined;
1835
+ inner?: import("../../procedural-items/index.js").Expr | undefined;
1836
+ arc?: import("../../procedural-items/index.js").Expr | undefined;
1837
+ } | {
1838
+ id: string;
1839
+ primitive: "extrude";
1840
+ slot: string;
1841
+ section: {
1842
+ kind: "rectangle";
1843
+ width: import("../../procedural-items/index.js").Expr;
1844
+ depth: import("../../procedural-items/index.js").Expr;
1845
+ corner?: import("../../procedural-items/index.js").Expr | undefined;
1846
+ } | {
1847
+ kind: "round";
1848
+ radius: import("../../procedural-items/index.js").Expr;
1849
+ wall?: import("../../procedural-items/index.js").Expr | undefined;
1850
+ } | {
1851
+ kind: "oval";
1852
+ width: import("../../procedural-items/index.js").Expr;
1853
+ depth: import("../../procedural-items/index.js").Expr;
1854
+ } | {
1855
+ kind: "section";
1856
+ family: "C" | "I" | "L" | "T" | "Z" | "rect-tube";
1857
+ width: import("../../procedural-items/index.js").Expr;
1858
+ depth: import("../../procedural-items/index.js").Expr;
1859
+ web: import("../../procedural-items/index.js").Expr;
1860
+ flange: import("../../procedural-items/index.js").Expr;
1861
+ } | {
1862
+ kind: "polygon";
1863
+ outer: [import("../../procedural-items/index.js").Expr, import("../../procedural-items/index.js").Expr][];
1864
+ holes?: [import("../../procedural-items/index.js").Expr, import("../../procedural-items/index.js").Expr][][] | undefined;
1865
+ };
1866
+ length: import("../../procedural-items/index.js").Expr;
1867
+ position: [import("../../procedural-items/index.js").Expr, import("../../procedural-items/index.js").Expr, import("../../procedural-items/index.js").Expr];
1868
+ support?: boolean | undefined;
1869
+ when?: import("../../procedural-items/index.js").Expr | undefined;
1870
+ bevel?: import("../../procedural-items/index.js").Expr | undefined;
1871
+ rotation?: [import("../../procedural-items/index.js").Expr, import("../../procedural-items/index.js").Expr, import("../../procedural-items/index.js").Expr] | undefined;
1872
+ } | {
1873
+ id: string;
1874
+ primitive: "revolve";
1875
+ slot: string;
1876
+ profile: [import("../../procedural-items/index.js").Expr, import("../../procedural-items/index.js").Expr][];
1877
+ position: [import("../../procedural-items/index.js").Expr, import("../../procedural-items/index.js").Expr, import("../../procedural-items/index.js").Expr];
1878
+ support?: boolean | undefined;
1879
+ when?: import("../../procedural-items/index.js").Expr | undefined;
1880
+ segments?: number | undefined;
1881
+ arc?: import("../../procedural-items/index.js").Expr | undefined;
1882
+ rotation?: [import("../../procedural-items/index.js").Expr, import("../../procedural-items/index.js").Expr, import("../../procedural-items/index.js").Expr] | undefined;
1883
+ })[];
1884
+ parent?: string | undefined;
1885
+ frame?: {
1886
+ position: [import("../../procedural-items/index.js").Expr, import("../../procedural-items/index.js").Expr, import("../../procedural-items/index.js").Expr];
1887
+ rotation?: [import("../../procedural-items/index.js").Expr, import("../../procedural-items/index.js").Expr, import("../../procedural-items/index.js").Expr] | undefined;
1888
+ } | undefined;
1889
+ when?: import("../../procedural-items/index.js").Expr | undefined;
1890
+ motion?: {
1891
+ kind: "hinge";
1892
+ pivot: [import("../../procedural-items/index.js").Expr, import("../../procedural-items/index.js").Expr, import("../../procedural-items/index.js").Expr];
1893
+ axis: "x" | "z" | "y";
1894
+ angle: import("../../procedural-items/index.js").Expr;
1895
+ delay?: import("../../procedural-items/index.js").Expr | undefined;
1896
+ duration?: import("../../procedural-items/index.js").Expr | undefined;
1897
+ easing?: "linear" | "smooth" | "soft" | undefined;
1898
+ } | {
1899
+ kind: "slide";
1900
+ axis: "x" | "z" | "y";
1901
+ distance: import("../../procedural-items/index.js").Expr;
1902
+ delay?: import("../../procedural-items/index.js").Expr | undefined;
1903
+ duration?: import("../../procedural-items/index.js").Expr | undefined;
1904
+ easing?: "linear" | "smooth" | "soft" | undefined;
1905
+ } | {
1906
+ kind: "spin";
1907
+ pivot: [import("../../procedural-items/index.js").Expr, import("../../procedural-items/index.js").Expr, import("../../procedural-items/index.js").Expr];
1908
+ axis: "x" | "z" | "y";
1909
+ radiansPerSecond: import("../../procedural-items/index.js").Expr;
1910
+ } | undefined;
1911
+ light?: {
1912
+ position: [import("../../procedural-items/index.js").Expr, import("../../procedural-items/index.js").Expr, import("../../procedural-items/index.js").Expr];
1913
+ color: string;
1914
+ intensity?: number | undefined;
1915
+ distance?: number | undefined;
1916
+ emissiveSlot?: string | undefined;
1917
+ } | undefined;
1918
+ }[];
1919
+ constraints: {
1920
+ left: import("../../procedural-items/index.js").Expr;
1921
+ relation: "lte" | "gte";
1922
+ right: import("../../procedural-items/index.js").Expr;
1923
+ message: string;
1924
+ }[];
1925
+ classification?: {
1926
+ category: string;
1927
+ functionTags: string[];
1928
+ tags: string[];
1929
+ } | undefined;
1930
+ mounting?: {
1931
+ attachTo: "ceiling" | "wall-side";
1932
+ reference: string;
1933
+ } | undefined;
1934
+ base?: import("../../procedural-items/index.js").Expr | undefined;
1935
+ cuts?: ({
1936
+ shape: "rect";
1937
+ size: [import("../../procedural-items/index.js").Expr, import("../../procedural-items/index.js").Expr];
1938
+ center?: [import("../../procedural-items/index.js").Expr, import("../../procedural-items/index.js").Expr] | undefined;
1939
+ } | {
1940
+ shape: "circle";
1941
+ diameter: import("../../procedural-items/index.js").Expr;
1942
+ center?: [import("../../procedural-items/index.js").Expr, import("../../procedural-items/index.js").Expr] | undefined;
1943
+ })[] | undefined;
1944
+ surfaces?: {
1945
+ id: string;
1946
+ label: string;
1947
+ position: [import("../../procedural-items/index.js").Expr, import("../../procedural-items/index.js").Expr, import("../../procedural-items/index.js").Expr];
1948
+ size: [import("../../procedural-items/index.js").Expr, import("../../procedural-items/index.js").Expr];
1949
+ part?: string | undefined;
1950
+ rotation?: [import("../../procedural-items/index.js").Expr, import("../../procedural-items/index.js").Expr, import("../../procedural-items/index.js").Expr] | undefined;
1951
+ }[] | undefined;
1952
+ joints?: {
1953
+ child: string;
1954
+ kind: "fixed" | "continuous" | "revolute" | "prismatic";
1955
+ origin: [import("../../procedural-items/index.js").Expr, import("../../procedural-items/index.js").Expr, import("../../procedural-items/index.js").Expr];
1956
+ axis: [import("../../procedural-items/index.js").Expr, import("../../procedural-items/index.js").Expr, import("../../procedural-items/index.js").Expr];
1957
+ delay?: import("../../procedural-items/index.js").Expr | undefined;
1958
+ duration?: import("../../procedural-items/index.js").Expr | undefined;
1959
+ easing?: "linear" | "smooth" | "soft" | undefined;
1960
+ open?: import("../../procedural-items/index.js").Expr | undefined;
1961
+ rest?: import("../../procedural-items/index.js").Expr | undefined;
1962
+ range?: [import("../../procedural-items/index.js").Expr, import("../../procedural-items/index.js").Expr] | undefined;
1963
+ speed?: import("../../procedural-items/index.js").Expr | undefined;
1964
+ }[] | undefined;
1965
+ };
1966
+ attachments: Record<string, string>;
1967
+ type: "procedural-item";
1968
+ name?: string | undefined;
1969
+ camera?: {
1970
+ position: [number, number, number];
1971
+ target: [number, number, number];
1972
+ mode: "perspective" | "orthographic";
1973
+ fov?: number | undefined;
1974
+ zoom?: number | undefined;
1975
+ } | undefined;
1976
+ provenance?: {
1977
+ refs: {
1978
+ id: string;
1979
+ ns?: string | undefined;
1980
+ role?: "primary" | "piece" | "absorbed" | "alias" | "derived" | undefined;
1981
+ }[];
1982
+ lineage?: {
1983
+ op: "import" | "split" | "merge" | "duplicate" | "convert" | "promote" | "make-independent" | "attach";
1984
+ fromIds: string[];
1985
+ } | undefined;
1986
+ } | undefined;
1987
+ side?: "front" | "back" | undefined;
1988
+ supportSlabId?: string | undefined;
1989
+ wallId?: string | undefined;
1990
+ } | {
1991
+ object: "node";
1992
+ position: [number, number, number];
1993
+ id: `imesh_${string}`;
1994
+ parentId: string | null;
1995
+ visible: boolean;
1996
+ metadata: Record<string, unknown>;
1997
+ rotation: [number, number, number];
1998
+ primitives: {
1999
+ positions: number[];
2000
+ indices: number[];
2001
+ color: string;
2002
+ opacity: number;
2003
+ normals?: number[] | undefined;
2004
+ }[];
2005
+ type: "imported-mesh";
2006
+ name?: string | undefined;
2007
+ camera?: {
2008
+ position: [number, number, number];
2009
+ target: [number, number, number];
2010
+ mode: "perspective" | "orthographic";
2011
+ fov?: number | undefined;
2012
+ zoom?: number | undefined;
2013
+ } | undefined;
2014
+ provenance?: {
2015
+ refs: {
2016
+ id: string;
2017
+ ns?: string | undefined;
2018
+ role?: "primary" | "piece" | "absorbed" | "alias" | "derived" | undefined;
2019
+ }[];
2020
+ lineage?: {
2021
+ op: "import" | "split" | "merge" | "duplicate" | "convert" | "promote" | "make-independent" | "attach";
2022
+ fromIds: string[];
2023
+ } | undefined;
2024
+ } | undefined;
2025
+ } | {
2026
+ object: "node";
2027
+ holes: [number, number][][];
2028
+ id: `zone_${string}`;
2029
+ name: string;
2030
+ parentId: string | null;
2031
+ visible: boolean;
2032
+ metadata: Record<string, unknown>;
2033
+ polygon: [number, number][];
2034
+ color: string;
2035
+ autoFromWalls: boolean;
2036
+ boundaryWallIds: `wall_${string}`[];
2037
+ boundarySeparatorIds: string[];
2038
+ spaceRole: "room" | "generic";
2039
+ roomNumber: string;
2040
+ enclosureStatus: "auto" | "open" | "enclosed";
2041
+ floorFinish: string;
2042
+ wallFinish: string;
2043
+ ceilingFinish: string;
2044
+ ceilingHeight: number;
2045
+ occupancy: string;
2046
+ clearDimensionPolicy: "none" | "inside-faces" | "finish-faces";
2047
+ type: "zone";
2048
+ camera?: {
2049
+ position: [number, number, number];
2050
+ target: [number, number, number];
2051
+ mode: "perspective" | "orthographic";
2052
+ fov?: number | undefined;
2053
+ zoom?: number | undefined;
2054
+ } | undefined;
2055
+ provenance?: {
2056
+ refs: {
2057
+ id: string;
2058
+ ns?: string | undefined;
2059
+ role?: "primary" | "piece" | "absorbed" | "alias" | "derived" | undefined;
2060
+ }[];
2061
+ lineage?: {
2062
+ op: "import" | "split" | "merge" | "duplicate" | "convert" | "promote" | "make-independent" | "attach";
2063
+ fromIds: string[];
2064
+ } | undefined;
2065
+ } | undefined;
2066
+ ceiling?: {
2067
+ regions?: {
2068
+ id: string;
2069
+ polygon: [number, number][];
2070
+ finish: string | Record<string, unknown>;
2071
+ }[] | undefined;
2072
+ } | undefined;
2073
+ floor?: {
2074
+ elevation?: number | undefined;
2075
+ support?: "open" | undefined;
2076
+ footprint?: string | undefined;
2077
+ thickness?: number | undefined;
2078
+ sourceSlabId?: `slab_${string}` | undefined;
2079
+ finish?: string | Record<string, unknown> | undefined;
2080
+ regions?: {
2081
+ id: string;
2082
+ polygon: [number, number][];
2083
+ finish: string | Record<string, unknown>;
2084
+ }[] | undefined;
2085
+ } | undefined;
2086
+ wallMaterial?: string | undefined;
2087
+ hostZoneId?: string | undefined;
2088
+ seed?: [number, number] | undefined;
2089
+ floorStepFinish?: string | undefined;
2090
+ floorStepOverrides?: {
2091
+ key: string;
2092
+ finish: string;
2093
+ step?: number | undefined;
2094
+ }[] | undefined;
2095
+ floorEdgeFinish?: string | undefined;
2096
+ wallOverrides?: {
2097
+ wallId: string;
2098
+ face: "a" | "b";
2099
+ finish: string;
2100
+ }[] | undefined;
2101
+ hasFloor?: false | undefined;
2102
+ hasCeiling?: false | undefined;
2103
+ } | {
2104
+ object: "node";
2105
+ holes: [number, number][][];
2106
+ id: `slab_${string}`;
2107
+ parentId: string | null;
2108
+ visible: boolean;
2109
+ metadata: Record<string, unknown>;
2110
+ polygon: [number, number][];
2111
+ recessed: boolean;
2112
+ holeMetadata: {
2113
+ source: "stair" | "elevator" | "manual" | "room" | "floor-opening";
2114
+ openingId?: string | undefined;
2115
+ stairId?: string | undefined;
2116
+ elevatorId?: string | undefined;
2117
+ }[];
2118
+ autoFromWalls: boolean;
2119
+ elevation: number;
2120
+ thickness: number;
2121
+ type: "slab";
2122
+ name?: string | undefined;
2123
+ camera?: {
2124
+ position: [number, number, number];
2125
+ target: [number, number, number];
2126
+ mode: "perspective" | "orthographic";
2127
+ fov?: number | undefined;
2128
+ zoom?: number | undefined;
2129
+ } | undefined;
2130
+ provenance?: {
2131
+ refs: {
2132
+ id: string;
2133
+ ns?: string | undefined;
2134
+ role?: "primary" | "piece" | "absorbed" | "alias" | "derived" | undefined;
2135
+ }[];
2136
+ lineage?: {
2137
+ op: "import" | "split" | "merge" | "duplicate" | "convert" | "promote" | "make-independent" | "attach";
2138
+ fromIds: string[];
2139
+ } | undefined;
2140
+ } | undefined;
2141
+ slots?: Record<string, string> | undefined;
2142
+ material?: {
2143
+ id?: string | undefined;
2144
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
2145
+ properties?: {
2146
+ color: string;
2147
+ roughness: number;
2148
+ metalness: number;
2149
+ opacity: number;
2150
+ transparent: boolean;
2151
+ side: "front" | "back" | "double";
2152
+ } | undefined;
2153
+ texture?: {
2154
+ url: string;
2155
+ repeat?: [number, number] | undefined;
2156
+ scale?: number | undefined;
2157
+ } | undefined;
2158
+ } | undefined;
2159
+ materialPreset?: string | undefined;
2160
+ boundary?: "auto" | undefined;
2161
+ support?: "open" | undefined;
2162
+ floorHeight?: number | undefined;
2163
+ referenceFloorElevation?: number | undefined;
2164
+ foundation?: {
2165
+ type: "solid" | "none";
2166
+ material?: string | {
2167
+ id?: string | undefined;
2168
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
2169
+ properties?: {
2170
+ color: string;
2171
+ roughness: number;
2172
+ metalness: number;
2173
+ opacity: number;
2174
+ transparent: boolean;
2175
+ side: "front" | "back" | "double";
2176
+ } | undefined;
2177
+ texture?: {
2178
+ url: string;
2179
+ repeat?: [number, number] | undefined;
2180
+ scale?: number | undefined;
2181
+ } | undefined;
2182
+ } | undefined;
2183
+ } | undefined;
2184
+ recessedRimElevation?: number | undefined;
2185
+ fillToTerrain?: boolean | undefined;
2186
+ plateRole?: "base" | "platform" | "sunken" | undefined;
2187
+ railing?: {
2188
+ start: [number, number];
2189
+ end: [number, number];
2190
+ }[] | undefined;
2191
+ zoneIds?: string[] | undefined;
2192
+ associatedZoneIds?: string[] | undefined;
2193
+ } | {
2194
+ object: "node";
2195
+ holes: [number, number][][];
2196
+ id: `ceiling_${string}`;
2197
+ parentId: string | null;
2198
+ visible: boolean;
2199
+ metadata: Record<string, unknown>;
2200
+ polygon: [number, number][];
2201
+ children: (`item_${string}` | `procedural-item_${string}`)[];
2202
+ holeMetadata: {
2203
+ source: "stair" | "elevator" | "manual" | "room" | "floor-opening";
2204
+ openingId?: string | undefined;
2205
+ stairId?: string | undefined;
2206
+ elevatorId?: string | undefined;
2207
+ }[];
2208
+ autoFromWalls: boolean;
2209
+ type: "ceiling";
2210
+ name?: string | undefined;
2211
+ camera?: {
2212
+ position: [number, number, number];
2213
+ target: [number, number, number];
2214
+ mode: "perspective" | "orthographic";
2215
+ fov?: number | undefined;
2216
+ zoom?: number | undefined;
2217
+ } | undefined;
2218
+ provenance?: {
2219
+ refs: {
2220
+ id: string;
2221
+ ns?: string | undefined;
2222
+ role?: "primary" | "piece" | "absorbed" | "alias" | "derived" | undefined;
2223
+ }[];
2224
+ lineage?: {
2225
+ op: "import" | "split" | "merge" | "duplicate" | "convert" | "promote" | "make-independent" | "attach";
2226
+ fromIds: string[];
2227
+ } | undefined;
2228
+ } | undefined;
2229
+ slots?: Record<string, string> | undefined;
2230
+ material?: {
2231
+ id?: string | undefined;
2232
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
2233
+ properties?: {
2234
+ color: string;
2235
+ roughness: number;
2236
+ metalness: number;
2237
+ opacity: number;
2238
+ transparent: boolean;
2239
+ side: "front" | "back" | "double";
2240
+ } | undefined;
2241
+ texture?: {
2242
+ url: string;
2243
+ repeat?: [number, number] | undefined;
2244
+ scale?: number | undefined;
2245
+ } | undefined;
2246
+ } | undefined;
2247
+ materialPreset?: string | undefined;
2248
+ height?: number | undefined;
2249
+ openingIds?: string[] | undefined;
2250
+ regions?: {
2251
+ id: string;
2252
+ polygon: [number, number][];
2253
+ finish: string | Record<string, unknown>;
2254
+ }[] | undefined;
2255
+ boundary?: "auto" | undefined;
2256
+ zoneId?: string | undefined;
2257
+ } | {
2258
+ object: "node";
2259
+ position: [number, number, number];
2260
+ id: `roof_${string}`;
2261
+ parentId: string | null;
2262
+ visible: boolean;
2263
+ metadata: Record<string, unknown>;
2264
+ rotation: number;
2265
+ children: `rseg_${string}`[];
2266
+ support: {
2267
+ kind: "level";
2268
+ } | {
2269
+ kind: "walls";
2270
+ } | {
2271
+ kind: "roof";
2272
+ roofSegmentId: `rseg_${string}`;
2273
+ localPosition: [number, number];
2274
+ curbHeight: number;
2275
+ };
2276
+ type: "roof";
2277
+ name?: string | undefined;
2278
+ camera?: {
2279
+ position: [number, number, number];
2280
+ target: [number, number, number];
2281
+ mode: "perspective" | "orthographic";
2282
+ fov?: number | undefined;
2283
+ zoom?: number | undefined;
2284
+ } | undefined;
2285
+ provenance?: {
2286
+ refs: {
2287
+ id: string;
2288
+ ns?: string | undefined;
2289
+ role?: "primary" | "piece" | "absorbed" | "alias" | "derived" | undefined;
2290
+ }[];
2291
+ lineage?: {
2292
+ op: "import" | "split" | "merge" | "duplicate" | "convert" | "promote" | "make-independent" | "attach";
2293
+ fromIds: string[];
2294
+ } | undefined;
2295
+ } | undefined;
2296
+ slots?: Record<string, string> | undefined;
2297
+ material?: {
2298
+ id?: string | undefined;
2299
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
2300
+ properties?: {
2301
+ color: string;
2302
+ roughness: number;
2303
+ metalness: number;
2304
+ opacity: number;
2305
+ transparent: boolean;
2306
+ side: "front" | "back" | "double";
2307
+ } | undefined;
2308
+ texture?: {
2309
+ url: string;
2310
+ repeat?: [number, number] | undefined;
2311
+ scale?: number | undefined;
2312
+ } | undefined;
2313
+ } | undefined;
2314
+ materialPreset?: string | undefined;
2315
+ topMaterial?: {
2316
+ id?: string | undefined;
2317
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
2318
+ properties?: {
2319
+ color: string;
2320
+ roughness: number;
2321
+ metalness: number;
2322
+ opacity: number;
2323
+ transparent: boolean;
2324
+ side: "front" | "back" | "double";
2325
+ } | undefined;
2326
+ texture?: {
2327
+ url: string;
2328
+ repeat?: [number, number] | undefined;
2329
+ scale?: number | undefined;
2330
+ } | undefined;
2331
+ } | undefined;
2332
+ topMaterialPreset?: string | undefined;
2333
+ edgeMaterial?: {
2334
+ id?: string | undefined;
2335
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
2336
+ properties?: {
2337
+ color: string;
2338
+ roughness: number;
2339
+ metalness: number;
2340
+ opacity: number;
2341
+ transparent: boolean;
2342
+ side: "front" | "back" | "double";
2343
+ } | undefined;
2344
+ texture?: {
2345
+ url: string;
2346
+ repeat?: [number, number] | undefined;
2347
+ scale?: number | undefined;
2348
+ } | undefined;
2349
+ } | undefined;
2350
+ edgeMaterialPreset?: string | undefined;
2351
+ wallMaterial?: {
2352
+ id?: string | undefined;
2353
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
2354
+ properties?: {
2355
+ color: string;
2356
+ roughness: number;
2357
+ metalness: number;
2358
+ opacity: number;
2359
+ transparent: boolean;
2360
+ side: "front" | "back" | "double";
2361
+ } | undefined;
2362
+ texture?: {
2363
+ url: string;
2364
+ repeat?: [number, number] | undefined;
2365
+ scale?: number | undefined;
2366
+ } | undefined;
2367
+ } | undefined;
2368
+ wallMaterialPreset?: string | undefined;
2369
+ assembly?: {
2370
+ layers: {
2371
+ id: string;
2372
+ role: "fill" | "shell" | "finish" | "lining" | "substrate" | "sheathing" | "membrane" | "underlay" | "insulation" | "air" | "furring" | "structure" | "deck" | "covering" | "glazing";
2373
+ thickness: number;
2374
+ core?: true | undefined;
2375
+ material?: string | undefined;
2376
+ slot?: string | undefined;
2377
+ returns?: boolean | undefined;
2378
+ display?: "construction" | "finished" | undefined;
2379
+ inset?: number | undefined;
2380
+ bottom?: number | undefined;
2381
+ lift?: number | undefined;
2382
+ src?: string | undefined;
2383
+ }[];
2384
+ backing?: {
2385
+ id: string;
2386
+ role: "fill" | "shell" | "finish" | "lining" | "substrate" | "sheathing" | "membrane" | "underlay" | "insulation" | "air" | "furring" | "structure" | "deck" | "covering" | "glazing";
2387
+ thickness: number;
2388
+ core?: true | undefined;
2389
+ material?: string | undefined;
2390
+ slot?: string | undefined;
2391
+ returns?: boolean | undefined;
2392
+ display?: "construction" | "finished" | undefined;
2393
+ inset?: number | undefined;
2394
+ bottom?: number | undefined;
2395
+ lift?: number | undefined;
2396
+ src?: string | undefined;
2397
+ }[] | undefined;
2398
+ face?: "front" | "exterior" | undefined;
2399
+ presetId?: string | undefined;
2400
+ cavityInsulation?: string | undefined;
2401
+ } | undefined;
2402
+ } | {
2403
+ object: "node";
2404
+ position: [number, number, number];
2405
+ id: `rseg_${string}`;
2406
+ parentId: string | null;
2407
+ visible: boolean;
2408
+ metadata: Record<string, unknown>;
2409
+ depth: number;
2410
+ rotation: number;
2411
+ children: string[];
2412
+ trim: {
2413
+ left: number;
2414
+ right: number;
2415
+ front: number;
2416
+ back: number;
2417
+ frontLeft: number;
2418
+ frontRight: number;
2419
+ backLeft: number;
2420
+ backRight: number;
2421
+ frontLeftX: number;
2422
+ frontLeftZ: number;
2423
+ frontRightX: number;
2424
+ frontRightZ: number;
2425
+ backLeftX: number;
2426
+ backLeftZ: number;
2427
+ backRightX: number;
2428
+ backRightZ: number;
2429
+ };
2430
+ width: number;
2431
+ roofType: "flat" | "hip" | "gable" | "shed" | "gambrel" | "dutch" | "mansard" | "conical";
2432
+ wallHeight: number;
2433
+ pitch: number;
2434
+ wallThickness: number;
2435
+ deckThickness: number;
2436
+ overhang: number;
2437
+ shingleThickness: number;
2438
+ managedByParent: boolean;
2439
+ wallShell: "auto" | "omit" | "include";
2440
+ shedInsetEndPanels: boolean;
2441
+ gambrelLowerWidthRatio: number;
2442
+ gambrelLowerHeightRatio: number;
2443
+ mansardSteepWidthRatio: number;
2444
+ mansardSteepHeightRatio: number;
2445
+ dutchHipWidthRatio: number;
2446
+ dutchHipHeightRatio: number;
2447
+ dutchWaistLengthRatio: number;
2448
+ dutchGabletRake: number;
2449
+ dutchTopRakeThickness: number;
2450
+ type: "roof-segment";
2451
+ name?: string | undefined;
2452
+ camera?: {
2453
+ position: [number, number, number];
2454
+ target: [number, number, number];
2455
+ mode: "perspective" | "orthographic";
2456
+ fov?: number | undefined;
2457
+ zoom?: number | undefined;
2458
+ } | undefined;
2459
+ provenance?: {
2460
+ refs: {
2461
+ id: string;
2462
+ ns?: string | undefined;
2463
+ role?: "primary" | "piece" | "absorbed" | "alias" | "derived" | undefined;
2464
+ }[];
2465
+ lineage?: {
2466
+ op: "import" | "split" | "merge" | "duplicate" | "convert" | "promote" | "make-independent" | "attach";
2467
+ fromIds: string[];
2468
+ } | undefined;
2469
+ } | undefined;
2470
+ material?: {
2471
+ id?: string | undefined;
2472
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
2473
+ properties?: {
2474
+ color: string;
2475
+ roughness: number;
2476
+ metalness: number;
2477
+ opacity: number;
2478
+ transparent: boolean;
2479
+ side: "front" | "back" | "double";
2480
+ } | undefined;
2481
+ texture?: {
2482
+ url: string;
2483
+ repeat?: [number, number] | undefined;
2484
+ scale?: number | undefined;
2485
+ } | undefined;
2486
+ } | undefined;
2487
+ materialPreset?: string | undefined;
2488
+ topMaterial?: {
2489
+ id?: string | undefined;
2490
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
2491
+ properties?: {
2492
+ color: string;
2493
+ roughness: number;
2494
+ metalness: number;
2495
+ opacity: number;
2496
+ transparent: boolean;
2497
+ side: "front" | "back" | "double";
2498
+ } | undefined;
2499
+ texture?: {
2500
+ url: string;
2501
+ repeat?: [number, number] | undefined;
2502
+ scale?: number | undefined;
2503
+ } | undefined;
2504
+ } | undefined;
2505
+ topMaterialPreset?: string | undefined;
2506
+ edgeMaterial?: {
2507
+ id?: string | undefined;
2508
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
2509
+ properties?: {
2510
+ color: string;
2511
+ roughness: number;
2512
+ metalness: number;
2513
+ opacity: number;
2514
+ transparent: boolean;
2515
+ side: "front" | "back" | "double";
2516
+ } | undefined;
2517
+ texture?: {
2518
+ url: string;
2519
+ repeat?: [number, number] | undefined;
2520
+ scale?: number | undefined;
2521
+ } | undefined;
2522
+ } | undefined;
2523
+ edgeMaterialPreset?: string | undefined;
2524
+ wallMaterial?: {
2525
+ id?: string | undefined;
2526
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
2527
+ properties?: {
2528
+ color: string;
2529
+ roughness: number;
2530
+ metalness: number;
2531
+ opacity: number;
2532
+ transparent: boolean;
2533
+ side: "front" | "back" | "double";
2534
+ } | undefined;
2535
+ texture?: {
2536
+ url: string;
2537
+ repeat?: [number, number] | undefined;
2538
+ scale?: number | undefined;
2539
+ } | undefined;
2540
+ } | undefined;
2541
+ wallMaterialPreset?: string | undefined;
2542
+ conicalStartAngle?: number | undefined;
2543
+ conicalSweepAngle?: number | undefined;
2544
+ conicalFullCircle?: boolean | undefined;
2545
+ arc?: {
2546
+ centerX: number;
2547
+ centerZ: number;
2548
+ radius: number;
2549
+ } | undefined;
2550
+ shedSideInfillSpan?: number | undefined;
2551
+ shedSideInfillMinX?: number | undefined;
2552
+ shedSideInfillMaxX?: number | undefined;
2553
+ shedFootprintPieces?: [number, number][][] | undefined;
2554
+ shedOpenEndSides?: ("left" | "right")[] | undefined;
2555
+ shedJointFrame?: {
2556
+ position: [number, number, number];
2557
+ rotation: number;
2558
+ } | undefined;
2559
+ shedJointOwnerId?: string | undefined;
2560
+ shedJointNeighborIds?: string[] | undefined;
2561
+ shedJointScopeId?: string | undefined;
2562
+ fascia?: boolean | undefined;
2563
+ fasciaHighEdge?: boolean | undefined;
2564
+ } | {
2565
+ object: "node";
2566
+ position: [number, number, number];
2567
+ id: `shelf_${string}`;
2568
+ parentId: string | null;
2569
+ visible: boolean;
2570
+ metadata: Record<string, unknown>;
2571
+ depth: number;
2572
+ rotation: [number, number, number];
2573
+ children: string[];
2574
+ width: number;
2575
+ height: number;
2576
+ style: "wall-shelf" | "bookshelf" | "open-rack" | "cubby";
2577
+ rows: number;
2578
+ columns: number;
2579
+ thickness: number;
2580
+ withBack: boolean;
2581
+ withSides: boolean;
2582
+ withBottom: boolean;
2583
+ bracketStyle: "hidden" | "minimal" | "industrial";
2584
+ type: "shelf";
2585
+ name?: string | undefined;
2586
+ camera?: {
2587
+ position: [number, number, number];
2588
+ target: [number, number, number];
2589
+ mode: "perspective" | "orthographic";
2590
+ fov?: number | undefined;
2591
+ zoom?: number | undefined;
2592
+ } | undefined;
2593
+ provenance?: {
2594
+ refs: {
2595
+ id: string;
2596
+ ns?: string | undefined;
2597
+ role?: "primary" | "piece" | "absorbed" | "alias" | "derived" | undefined;
2598
+ }[];
2599
+ lineage?: {
2600
+ op: "import" | "split" | "merge" | "duplicate" | "convert" | "promote" | "make-independent" | "attach";
2601
+ fromIds: string[];
2602
+ } | undefined;
2603
+ } | undefined;
2604
+ supportSlabId?: string | undefined;
2605
+ slots?: Record<string, string> | undefined;
2606
+ material?: {
2607
+ id?: string | undefined;
2608
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
2609
+ properties?: {
2610
+ color: string;
2611
+ roughness: number;
2612
+ metalness: number;
2613
+ opacity: number;
2614
+ transparent: boolean;
2615
+ side: "front" | "back" | "double";
2616
+ } | undefined;
2617
+ texture?: {
2618
+ url: string;
2619
+ repeat?: [number, number] | undefined;
2620
+ scale?: number | undefined;
2621
+ } | undefined;
2622
+ } | undefined;
2623
+ materialPreset?: string | undefined;
2624
+ } | {
2625
+ object: "node";
2626
+ position: [number, number, number];
2627
+ id: `stair_${string}`;
2628
+ parentId: string | null;
2629
+ visible: boolean;
2630
+ metadata: Record<string, unknown>;
2631
+ rotation: number;
2632
+ children: `sseg_${string}`[];
2633
+ width: number;
2634
+ fromLevelId: string | null;
2635
+ toLevelId: string | null;
2636
+ thickness: number;
2637
+ stairType: "straight" | "spiral" | "curved";
2638
+ slabOpeningMode: "none" | "destination";
2639
+ openingOffset: number;
2640
+ stepCount: number;
2641
+ fillToFloor: boolean;
2642
+ innerRadius: number;
2643
+ sweepAngle: number;
2644
+ topLandingMode: "none" | "integrated";
2645
+ topLandingDepth: number;
2646
+ showCenterColumn: boolean;
2647
+ showStepSupports: boolean;
2648
+ railingMode: "left" | "right" | "none" | "both";
2649
+ railingHeight: number;
2650
+ type: "stair";
2651
+ name?: string | undefined;
2652
+ camera?: {
2653
+ position: [number, number, number];
2654
+ target: [number, number, number];
2655
+ mode: "perspective" | "orthographic";
2656
+ fov?: number | undefined;
2657
+ zoom?: number | undefined;
2658
+ } | undefined;
2659
+ provenance?: {
2660
+ refs: {
2661
+ id: string;
2662
+ ns?: string | undefined;
2663
+ role?: "primary" | "piece" | "absorbed" | "alias" | "derived" | undefined;
2664
+ }[];
2665
+ lineage?: {
2666
+ op: "import" | "split" | "merge" | "duplicate" | "convert" | "promote" | "make-independent" | "attach";
2667
+ fromIds: string[];
2668
+ } | undefined;
2669
+ } | undefined;
2670
+ supportSlabId?: string | undefined;
2671
+ slots?: Record<string, string> | undefined;
2672
+ material?: {
2673
+ id?: string | undefined;
2674
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
2675
+ properties?: {
2676
+ color: string;
2677
+ roughness: number;
2678
+ metalness: number;
2679
+ opacity: number;
2680
+ transparent: boolean;
2681
+ side: "front" | "back" | "double";
2682
+ } | undefined;
2683
+ texture?: {
2684
+ url: string;
2685
+ repeat?: [number, number] | undefined;
2686
+ scale?: number | undefined;
2687
+ } | undefined;
2688
+ } | undefined;
2689
+ materialPreset?: string | undefined;
2690
+ construction?: {
2691
+ mode: "solid" | "open" | "waist" | "side-stringers" | "center-stringer";
2692
+ waistThickness: number;
2693
+ treadThickness: number;
2694
+ riserThickness: number;
2695
+ nosing: number;
2696
+ finishThickness: number;
2697
+ closedRisers: boolean;
2698
+ stringerWidth: number;
2699
+ stringerDepth: number;
2700
+ } | undefined;
2701
+ railingMaterial?: {
2702
+ id?: string | undefined;
2703
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
2704
+ properties?: {
2705
+ color: string;
2706
+ roughness: number;
2707
+ metalness: number;
2708
+ opacity: number;
2709
+ transparent: boolean;
2710
+ side: "front" | "back" | "double";
2711
+ } | undefined;
2712
+ texture?: {
2713
+ url: string;
2714
+ repeat?: [number, number] | undefined;
2715
+ scale?: number | undefined;
2716
+ } | undefined;
2717
+ } | undefined;
2718
+ railingMaterialPreset?: string | undefined;
2719
+ treadMaterial?: {
2720
+ id?: string | undefined;
2721
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
2722
+ properties?: {
2723
+ color: string;
2724
+ roughness: number;
2725
+ metalness: number;
2726
+ opacity: number;
2727
+ transparent: boolean;
2728
+ side: "front" | "back" | "double";
2729
+ } | undefined;
2730
+ texture?: {
2731
+ url: string;
2732
+ repeat?: [number, number] | undefined;
2733
+ scale?: number | undefined;
2734
+ } | undefined;
2735
+ } | undefined;
2736
+ treadMaterialPreset?: string | undefined;
2737
+ sideMaterial?: {
2738
+ id?: string | undefined;
2739
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
2740
+ properties?: {
2741
+ color: string;
2742
+ roughness: number;
2743
+ metalness: number;
2744
+ opacity: number;
2745
+ transparent: boolean;
2746
+ side: "front" | "back" | "double";
2747
+ } | undefined;
2748
+ texture?: {
2749
+ url: string;
2750
+ repeat?: [number, number] | undefined;
2751
+ scale?: number | undefined;
2752
+ } | undefined;
2753
+ } | undefined;
2754
+ sideMaterialPreset?: string | undefined;
2755
+ deckSlabId?: string | undefined;
2756
+ totalRise?: number | undefined;
2757
+ designTargets?: {
2758
+ maxRiserHeight: number;
2759
+ minimumGoing: number;
2760
+ targetGoing: number;
2761
+ minimumHeadroom: number;
2762
+ } | undefined;
2763
+ uniformRisers?: boolean | undefined;
2764
+ railingStyle?: "glass" | "metal" | "balusters" | "cable" | "boards" | "post-and-rail" | undefined;
2765
+ railingPath?: "continuous" | "original" | undefined;
2766
+ handrail?: {
2767
+ mode: "left" | "right" | "none" | "both";
2768
+ height: number;
2769
+ diameter: number;
2770
+ offset: number;
2771
+ bottom?: {
2772
+ extension: number;
2773
+ return: "wall" | "floor" | "none" | "post";
2774
+ returnLength: number;
2775
+ } | undefined;
2776
+ top?: {
2777
+ extension: number;
2778
+ return: "wall" | "floor" | "none" | "post";
2779
+ returnLength: number;
2780
+ } | undefined;
2781
+ } | undefined;
2782
+ railingTopPost?: boolean | undefined;
2783
+ railingTopReach?: number | undefined;
2784
+ railingPostThrough?: boolean | undefined;
2785
+ } | {
2786
+ object: "node";
2787
+ length: number;
2788
+ position: [number, number, number];
2789
+ id: `sseg_${string}`;
2790
+ parentId: string | null;
2791
+ visible: boolean;
2792
+ metadata: Record<string, unknown>;
2793
+ rotation: number;
2794
+ width: number;
2795
+ height: number;
2796
+ thickness: number;
2797
+ stepCount: number;
2798
+ fillToFloor: boolean;
2799
+ segmentType: "stair" | "landing";
2800
+ attachmentSide: "left" | "right" | "front";
2801
+ type: "stair-segment";
2802
+ name?: string | undefined;
2803
+ camera?: {
2804
+ position: [number, number, number];
2805
+ target: [number, number, number];
2806
+ mode: "perspective" | "orthographic";
2807
+ fov?: number | undefined;
2808
+ zoom?: number | undefined;
2809
+ } | undefined;
2810
+ provenance?: {
2811
+ refs: {
2812
+ id: string;
2813
+ ns?: string | undefined;
2814
+ role?: "primary" | "piece" | "absorbed" | "alias" | "derived" | undefined;
2815
+ }[];
2816
+ lineage?: {
2817
+ op: "import" | "split" | "merge" | "duplicate" | "convert" | "promote" | "make-independent" | "attach";
2818
+ fromIds: string[];
2819
+ } | undefined;
2820
+ } | undefined;
2821
+ slots?: Record<string, string> | undefined;
2822
+ material?: {
2823
+ id?: string | undefined;
2824
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
2825
+ properties?: {
2826
+ color: string;
2827
+ roughness: number;
2828
+ metalness: number;
2829
+ opacity: number;
2830
+ transparent: boolean;
2831
+ side: "front" | "back" | "double";
2832
+ } | undefined;
2833
+ texture?: {
2834
+ url: string;
2835
+ repeat?: [number, number] | undefined;
2836
+ scale?: number | undefined;
2837
+ } | undefined;
2838
+ } | undefined;
2839
+ materialPreset?: string | undefined;
2840
+ construction?: {
2841
+ mode: "solid" | "open" | "waist" | "side-stringers" | "center-stringer";
2842
+ waistThickness: number;
2843
+ treadThickness: number;
2844
+ riserThickness: number;
2845
+ nosing: number;
2846
+ finishThickness: number;
2847
+ closedRisers: boolean;
2848
+ stringerWidth: number;
2849
+ stringerDepth: number;
2850
+ } | undefined;
2851
+ winder?: {
2852
+ turn: "left" | "right";
2853
+ innerGap: number;
2854
+ walkingLineOffset: number;
2855
+ division: "equal-going" | "equal-angle";
2856
+ } | undefined;
2857
+ } | {
2858
+ object: "node";
2859
+ position: [number, number, number];
2860
+ id: `scan_${string}`;
2861
+ parentId: string | null;
2862
+ visible: boolean;
2863
+ metadata: Record<string, unknown>;
2864
+ opacity: number;
2865
+ url: string | null;
2866
+ scale: number;
2867
+ rotation: [number, number, number];
2868
+ layers: Record<string, boolean>;
2869
+ captureSession: {
2870
+ sessionId: string;
2871
+ schemaVersion?: number | undefined;
2872
+ revisionId?: string | undefined;
2873
+ manifestUrl?: string | undefined;
2874
+ } | null;
2875
+ type: "scan";
2876
+ name?: string | undefined;
2877
+ camera?: {
2878
+ position: [number, number, number];
2879
+ target: [number, number, number];
2880
+ mode: "perspective" | "orthographic";
2881
+ fov?: number | undefined;
2882
+ zoom?: number | undefined;
2883
+ } | undefined;
2884
+ provenance?: {
2885
+ refs: {
2886
+ id: string;
2887
+ ns?: string | undefined;
2888
+ role?: "primary" | "piece" | "absorbed" | "alias" | "derived" | undefined;
2889
+ }[];
2890
+ lineage?: {
2891
+ op: "import" | "split" | "merge" | "duplicate" | "convert" | "promote" | "make-independent" | "attach";
2892
+ fromIds: string[];
2893
+ } | undefined;
2894
+ } | undefined;
2895
+ } | {
2896
+ object: "node";
2897
+ position: [number, number, number];
2898
+ id: `guide_${string}`;
2899
+ parentId: string | null;
2900
+ visible: boolean;
2901
+ metadata: Record<string, unknown>;
2902
+ opacity: number;
2903
+ url: string;
2904
+ scale: number;
2905
+ rotation: [number, number, number];
2906
+ scaleReference: {
2907
+ start: [number, number];
2908
+ end: [number, number];
2909
+ realLengthMeters: number;
2910
+ measuredLengthUnits: number;
2911
+ metersPerUnit: number;
2912
+ label: string;
2913
+ } | null;
2914
+ type: "guide";
2915
+ name?: string | undefined;
2916
+ camera?: {
2917
+ position: [number, number, number];
2918
+ target: [number, number, number];
2919
+ mode: "perspective" | "orthographic";
2920
+ fov?: number | undefined;
2921
+ zoom?: number | undefined;
2922
+ } | undefined;
2923
+ provenance?: {
2924
+ refs: {
2925
+ id: string;
2926
+ ns?: string | undefined;
2927
+ role?: "primary" | "piece" | "absorbed" | "alias" | "derived" | undefined;
2928
+ }[];
2929
+ lineage?: {
2930
+ op: "import" | "split" | "merge" | "duplicate" | "convert" | "promote" | "make-independent" | "attach";
2931
+ fromIds: string[];
2932
+ } | undefined;
2933
+ } | undefined;
2934
+ } | {
2935
+ object: "node";
2936
+ id: `measurement_${string}`;
2937
+ parentId: string | null;
2938
+ visible: boolean;
2939
+ metadata: Record<string, unknown>;
2940
+ measurement: {
2941
+ kind: "distance";
2942
+ points: [[number, number, number] | {
2943
+ kind: "feature";
2944
+ reference: {
2945
+ nodeId: string;
2946
+ featureId: string;
2947
+ parameters?: Record<string, string | number | boolean> | undefined;
2948
+ };
2949
+ fallback: [number, number, number];
2950
+ }, [number, number, number] | {
2951
+ kind: "feature";
2952
+ reference: {
2953
+ nodeId: string;
2954
+ featureId: string;
2955
+ parameters?: Record<string, string | number | boolean> | undefined;
2956
+ };
2957
+ fallback: [number, number, number];
2958
+ }];
2959
+ } | {
2960
+ kind: "angle";
2961
+ points: [[number, number, number] | {
2962
+ kind: "feature";
2963
+ reference: {
2964
+ nodeId: string;
2965
+ featureId: string;
2966
+ parameters?: Record<string, string | number | boolean> | undefined;
2967
+ };
2968
+ fallback: [number, number, number];
2969
+ }, [number, number, number] | {
2970
+ kind: "feature";
2971
+ reference: {
2972
+ nodeId: string;
2973
+ featureId: string;
2974
+ parameters?: Record<string, string | number | boolean> | undefined;
2975
+ };
2976
+ fallback: [number, number, number];
2977
+ }, [number, number, number] | {
2978
+ kind: "feature";
2979
+ reference: {
2980
+ nodeId: string;
2981
+ featureId: string;
2982
+ parameters?: Record<string, string | number | boolean> | undefined;
2983
+ };
2984
+ fallback: [number, number, number];
2985
+ }];
2986
+ } | {
2987
+ kind: "area";
2988
+ base: ([number, number, number] | {
2989
+ kind: "feature";
2990
+ reference: {
2991
+ nodeId: string;
2992
+ featureId: string;
2993
+ parameters?: Record<string, string | number | boolean> | undefined;
2994
+ };
2995
+ fallback: [number, number, number];
2996
+ })[];
2997
+ } | {
2998
+ kind: "perimeter";
2999
+ base: ([number, number, number] | {
3000
+ kind: "feature";
3001
+ reference: {
3002
+ nodeId: string;
3003
+ featureId: string;
3004
+ parameters?: Record<string, string | number | boolean> | undefined;
3005
+ };
3006
+ fallback: [number, number, number];
3007
+ })[];
3008
+ } | {
3009
+ kind: "volume";
3010
+ base: ([number, number, number] | {
3011
+ kind: "feature";
3012
+ reference: {
3013
+ nodeId: string;
3014
+ featureId: string;
3015
+ parameters?: Record<string, string | number | boolean> | undefined;
3016
+ };
3017
+ fallback: [number, number, number];
3018
+ })[];
3019
+ extrusion: [number, number, number];
3020
+ };
3021
+ type: "measurement";
3022
+ name?: string | undefined;
3023
+ camera?: {
3024
+ position: [number, number, number];
3025
+ target: [number, number, number];
3026
+ mode: "perspective" | "orthographic";
3027
+ fov?: number | undefined;
3028
+ zoom?: number | undefined;
3029
+ } | undefined;
3030
+ provenance?: {
3031
+ refs: {
3032
+ id: string;
3033
+ ns?: string | undefined;
3034
+ role?: "primary" | "piece" | "absorbed" | "alias" | "derived" | undefined;
3035
+ }[];
3036
+ lineage?: {
3037
+ op: "import" | "split" | "merge" | "duplicate" | "convert" | "promote" | "make-independent" | "attach";
3038
+ fromIds: string[];
3039
+ } | undefined;
3040
+ } | undefined;
3041
+ } | {
3042
+ object: "node";
3043
+ position: [number, number, number];
3044
+ id: `spawn_${string}`;
3045
+ parentId: string | null;
3046
+ visible: boolean;
3047
+ metadata: Record<string, unknown>;
3048
+ rotation: number;
3049
+ type: "spawn";
3050
+ name?: string | undefined;
3051
+ camera?: {
3052
+ position: [number, number, number];
3053
+ target: [number, number, number];
3054
+ mode: "perspective" | "orthographic";
3055
+ fov?: number | undefined;
3056
+ zoom?: number | undefined;
3057
+ } | undefined;
3058
+ provenance?: {
3059
+ refs: {
3060
+ id: string;
3061
+ ns?: string | undefined;
3062
+ role?: "primary" | "piece" | "absorbed" | "alias" | "derived" | undefined;
3063
+ }[];
3064
+ lineage?: {
3065
+ op: "import" | "split" | "merge" | "duplicate" | "convert" | "promote" | "make-independent" | "attach";
3066
+ fromIds: string[];
3067
+ } | undefined;
3068
+ } | undefined;
3069
+ supportSlabId?: string | undefined;
3070
+ } | {
3071
+ object: "node";
3072
+ position: [number, number, number];
3073
+ id: `window_${string}`;
3074
+ parentId: string | null;
3075
+ visible: boolean;
3076
+ metadata: Record<string, unknown>;
3077
+ rotation: [number, number, number];
3078
+ width: number;
3079
+ height: number;
3080
+ floorThresholdVersion: 0 | 1;
3081
+ constructionType: "masonry" | "framed";
3082
+ dimensionReference: "nominal" | "rough-opening" | "masonry-opening" | "finish-opening";
3083
+ operationState: number;
3084
+ openingKind: "window" | "opening";
3085
+ openingShape: "rectangle" | "rounded" | "arch";
3086
+ openingRadiusMode: "all" | "individual";
3087
+ cornerRadius: number;
3088
+ archHeight: number;
3089
+ openingRevealRadius: number;
3090
+ frameThickness: number;
3091
+ frameDepth: number;
3092
+ hingesSide: "left" | "right";
3093
+ columnRatios: number[];
3094
+ windowType: "fixed" | "sliding" | "casement" | "awning" | "hopper" | "single-hung" | "double-hung" | "bay" | "bow" | "louvered";
3095
+ awningDirection: "up" | "down";
3096
+ casementStyle: "french" | "single";
3097
+ openingCornerRadii: [number, number, number, number];
3098
+ rowRatios: number[];
3099
+ columnDividerThickness: number;
3100
+ rowDividerThickness: number;
3101
+ sill: boolean;
3102
+ sillDepth: number;
3103
+ sillThickness: number;
3104
+ type: "window";
3105
+ name?: string | undefined;
3106
+ camera?: {
3107
+ position: [number, number, number];
3108
+ target: [number, number, number];
3109
+ mode: "perspective" | "orthographic";
3110
+ fov?: number | undefined;
3111
+ zoom?: number | undefined;
3112
+ } | undefined;
3113
+ provenance?: {
3114
+ refs: {
3115
+ id: string;
3116
+ ns?: string | undefined;
3117
+ role?: "primary" | "piece" | "absorbed" | "alias" | "derived" | undefined;
3118
+ }[];
3119
+ lineage?: {
3120
+ op: "import" | "split" | "merge" | "duplicate" | "convert" | "promote" | "make-independent" | "attach";
3121
+ fromIds: string[];
3122
+ } | undefined;
3123
+ } | undefined;
3124
+ side?: "front" | "back" | undefined;
3125
+ slots?: Record<string, string> | undefined;
3126
+ material?: {
3127
+ id?: string | undefined;
3128
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
3129
+ properties?: {
3130
+ color: string;
3131
+ roughness: number;
3132
+ metalness: number;
3133
+ opacity: number;
3134
+ transparent: boolean;
3135
+ side: "front" | "back" | "double";
3136
+ } | undefined;
3137
+ texture?: {
3138
+ url: string;
3139
+ repeat?: [number, number] | undefined;
3140
+ scale?: number | undefined;
3141
+ } | undefined;
3142
+ } | undefined;
3143
+ roofSegmentId?: string | undefined;
3144
+ source?: {
3145
+ kind: "script";
3146
+ language: "three" | "bpy";
3147
+ script: string;
3148
+ params: Record<string, string | number | boolean>;
3149
+ artifact: string;
3150
+ manifest: {
3151
+ bounds: {
3152
+ min: [number, number, number];
3153
+ max: [number, number, number];
3154
+ };
3155
+ params: {
3156
+ id: string;
3157
+ kind: "string" | "number" | "boolean";
3158
+ default: string | number | boolean;
3159
+ label?: string | undefined;
3160
+ min?: number | undefined;
3161
+ max?: number | undefined;
3162
+ step?: number | undefined;
3163
+ unit?: string | undefined;
3164
+ options?: string[] | undefined;
3165
+ }[];
3166
+ parts: {
3167
+ id: string;
3168
+ label?: string | undefined;
3169
+ type?: string | undefined;
3170
+ bounds?: {
3171
+ min: [number, number, number];
3172
+ max: [number, number, number];
3173
+ } | undefined;
3174
+ }[];
3175
+ surfaces: {
3176
+ y: number;
3177
+ polygon: [number, number][];
3178
+ part?: string | undefined;
3179
+ }[];
3180
+ slots: {
3181
+ id: string;
3182
+ label?: string | undefined;
3183
+ color?: string | undefined;
3184
+ roughness?: number | undefined;
3185
+ metalness?: number | undefined;
3186
+ transparent?: boolean | undefined;
3187
+ emissive?: boolean | undefined;
3188
+ }[];
3189
+ anchors: {
3190
+ id: string;
3191
+ position: [number, number, number];
3192
+ normal?: [number, number, number] | undefined;
3193
+ }[];
3194
+ lights: {
3195
+ id: string;
3196
+ position: [number, number, number];
3197
+ color: string;
3198
+ intensity: number;
3199
+ distance?: number | undefined;
3200
+ }[];
3201
+ undersides: {
3202
+ polygon: [number, number][];
3203
+ plane: [number, number, number, number];
3204
+ part?: string | undefined;
3205
+ }[];
3206
+ animations: {
3207
+ name: string;
3208
+ duration: number;
3209
+ }[];
3210
+ cutout: boolean;
3211
+ collider: boolean;
3212
+ triangles: number;
3213
+ cutters?: {
3214
+ host: "wall" | "slab" | "ceiling" | "mounted";
3215
+ polygon: number[][];
3216
+ minY: number;
3217
+ maxY: number;
3218
+ }[] | undefined;
3219
+ };
3220
+ meta?: {
3221
+ description?: string | undefined;
3222
+ category?: string | undefined;
3223
+ tags?: string[] | undefined;
3224
+ parent?: string | undefined;
3225
+ } | undefined;
3226
+ images?: {
3227
+ artifact: string;
3228
+ thumbnail: string;
3229
+ floorPlan: string;
3230
+ } | undefined;
3231
+ } | undefined;
3232
+ wallId?: string | undefined;
3233
+ roofFace?: "left" | "right" | "front" | "back" | undefined;
3234
+ verticalAnchor?: "wall" | "floor" | undefined;
3235
+ mark?: string | undefined;
3236
+ roughOpeningWidth?: number | undefined;
3237
+ roughOpeningHeight?: number | undefined;
3238
+ masonryOpeningWidth?: number | undefined;
3239
+ masonryOpeningHeight?: number | undefined;
3240
+ finishOpeningWidth?: number | undefined;
3241
+ finishOpeningHeight?: number | undefined;
3242
+ dormerId?: string | undefined;
3243
+ dormerFace?: "left" | "right" | "front" | "back" | undefined;
3244
+ } | {
3245
+ object: "node";
3246
+ position: [number, number, number];
3247
+ id: `door_${string}`;
3248
+ parentId: string | null;
3249
+ visible: boolean;
3250
+ metadata: Record<string, unknown>;
3251
+ rotation: [number, number, number];
3252
+ width: number;
3253
+ height: number;
3254
+ leafCount: 2 | 1 | 3 | 4;
3255
+ floorThresholdVersion: 0 | 1;
3256
+ constructionType: "masonry" | "framed";
3257
+ dimensionReference: "nominal" | "rough-opening" | "masonry-opening" | "finish-opening";
3258
+ doorCategory: "interior" | "garage";
3259
+ doorType: "double" | "hinged" | "french" | "folding" | "pocket" | "barn" | "sliding" | "garage-sectional" | "garage-rollup" | "garage-tiltup";
3260
+ operationState: number;
3261
+ slideDirection: "left" | "right";
3262
+ trackStyle: "visible" | "none" | "pocket" | "overhead";
3263
+ garagePanelCount: number;
3264
+ openingKind: "door" | "opening";
3265
+ openingShape: "rectangle" | "rounded" | "arch";
3266
+ openingRadiusMode: "all" | "individual";
3267
+ openingTopRadii: [number, number];
3268
+ cornerRadius: number;
3269
+ archHeight: number;
3270
+ openingRevealRadius: number;
3271
+ frameThickness: number;
3272
+ frameDepth: number;
3273
+ threshold: boolean;
3274
+ thresholdHeight: number;
3275
+ hingesSide: "left" | "right";
3276
+ swingDirection: "inward" | "outward";
3277
+ swingAngle: number;
3278
+ segments: {
3279
+ type: "glass" | "empty" | "panel";
3280
+ heightRatio: number;
3281
+ columnRatios: number[];
3282
+ dividerThickness: number;
3283
+ panelDepth: number;
3284
+ panelInset: number;
3285
+ }[];
3286
+ handle: boolean;
3287
+ handleHeight: number;
3288
+ handleSide: "left" | "right";
3289
+ contentPadding: [number, number];
3290
+ doorCloser: boolean;
3291
+ panicBar: boolean;
3292
+ panicBarHeight: number;
3293
+ type: "door";
3294
+ name?: string | undefined;
3295
+ camera?: {
3296
+ position: [number, number, number];
3297
+ target: [number, number, number];
3298
+ mode: "perspective" | "orthographic";
3299
+ fov?: number | undefined;
3300
+ zoom?: number | undefined;
3301
+ } | undefined;
3302
+ provenance?: {
3303
+ refs: {
3304
+ id: string;
3305
+ ns?: string | undefined;
3306
+ role?: "primary" | "piece" | "absorbed" | "alias" | "derived" | undefined;
3307
+ }[];
3308
+ lineage?: {
3309
+ op: "import" | "split" | "merge" | "duplicate" | "convert" | "promote" | "make-independent" | "attach";
3310
+ fromIds: string[];
3311
+ } | undefined;
3312
+ } | undefined;
3313
+ side?: "front" | "back" | undefined;
3314
+ slots?: Record<string, string> | undefined;
3315
+ material?: {
3316
+ id?: string | undefined;
3317
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
3318
+ properties?: {
3319
+ color: string;
3320
+ roughness: number;
3321
+ metalness: number;
3322
+ opacity: number;
3323
+ transparent: boolean;
3324
+ side: "front" | "back" | "double";
3325
+ } | undefined;
3326
+ texture?: {
3327
+ url: string;
3328
+ repeat?: [number, number] | undefined;
3329
+ scale?: number | undefined;
3330
+ } | undefined;
3331
+ } | undefined;
3332
+ roofSegmentId?: string | undefined;
3333
+ source?: {
3334
+ kind: "script";
3335
+ language: "three" | "bpy";
3336
+ script: string;
3337
+ params: Record<string, string | number | boolean>;
3338
+ artifact: string;
3339
+ manifest: {
3340
+ bounds: {
3341
+ min: [number, number, number];
3342
+ max: [number, number, number];
3343
+ };
3344
+ params: {
3345
+ id: string;
3346
+ kind: "string" | "number" | "boolean";
3347
+ default: string | number | boolean;
3348
+ label?: string | undefined;
3349
+ min?: number | undefined;
3350
+ max?: number | undefined;
3351
+ step?: number | undefined;
3352
+ unit?: string | undefined;
3353
+ options?: string[] | undefined;
3354
+ }[];
3355
+ parts: {
3356
+ id: string;
3357
+ label?: string | undefined;
3358
+ type?: string | undefined;
3359
+ bounds?: {
3360
+ min: [number, number, number];
3361
+ max: [number, number, number];
3362
+ } | undefined;
3363
+ }[];
3364
+ surfaces: {
3365
+ y: number;
3366
+ polygon: [number, number][];
3367
+ part?: string | undefined;
3368
+ }[];
3369
+ slots: {
3370
+ id: string;
3371
+ label?: string | undefined;
3372
+ color?: string | undefined;
3373
+ roughness?: number | undefined;
3374
+ metalness?: number | undefined;
3375
+ transparent?: boolean | undefined;
3376
+ emissive?: boolean | undefined;
3377
+ }[];
3378
+ anchors: {
3379
+ id: string;
3380
+ position: [number, number, number];
3381
+ normal?: [number, number, number] | undefined;
3382
+ }[];
3383
+ lights: {
3384
+ id: string;
3385
+ position: [number, number, number];
3386
+ color: string;
3387
+ intensity: number;
3388
+ distance?: number | undefined;
3389
+ }[];
3390
+ undersides: {
3391
+ polygon: [number, number][];
3392
+ plane: [number, number, number, number];
3393
+ part?: string | undefined;
3394
+ }[];
3395
+ animations: {
3396
+ name: string;
3397
+ duration: number;
3398
+ }[];
3399
+ cutout: boolean;
3400
+ collider: boolean;
3401
+ triangles: number;
3402
+ cutters?: {
3403
+ host: "wall" | "slab" | "ceiling" | "mounted";
3404
+ polygon: number[][];
3405
+ minY: number;
3406
+ maxY: number;
3407
+ }[] | undefined;
3408
+ };
3409
+ meta?: {
3410
+ description?: string | undefined;
3411
+ category?: string | undefined;
3412
+ tags?: string[] | undefined;
3413
+ parent?: string | undefined;
3414
+ } | undefined;
3415
+ images?: {
3416
+ artifact: string;
3417
+ thumbnail: string;
3418
+ floorPlan: string;
3419
+ } | undefined;
3420
+ } | undefined;
3421
+ wallId?: string | undefined;
3422
+ roofFace?: "left" | "right" | "front" | "back" | undefined;
3423
+ verticalAnchor?: "wall" | "floor" | undefined;
3424
+ mark?: string | undefined;
3425
+ roughOpeningWidth?: number | undefined;
3426
+ roughOpeningHeight?: number | undefined;
3427
+ masonryOpeningWidth?: number | undefined;
3428
+ masonryOpeningHeight?: number | undefined;
3429
+ finishOpeningWidth?: number | undefined;
3430
+ finishOpeningHeight?: number | undefined;
3431
+ } | {
3432
+ object: "node";
3433
+ position: [number, number, number];
3434
+ id: `bvent_${string}`;
3435
+ parentId: string | null;
3436
+ visible: boolean;
3437
+ metadata: Record<string, unknown>;
3438
+ depth: number;
3439
+ rotation: number;
3440
+ materialPreset: string;
3441
+ width: number;
3442
+ height: number;
3443
+ hoodOverhang: number;
3444
+ topTaper: number;
3445
+ capHeight: number;
3446
+ capGap: number;
3447
+ domeCurvature: number;
3448
+ baseInset: number;
3449
+ baseHeight: number;
3450
+ cornerBevel: number;
3451
+ style: "box" | "cap" | "dome";
3452
+ type: "box-vent";
3453
+ name?: string | undefined;
3454
+ camera?: {
3455
+ position: [number, number, number];
3456
+ target: [number, number, number];
3457
+ mode: "perspective" | "orthographic";
3458
+ fov?: number | undefined;
3459
+ zoom?: number | undefined;
3460
+ } | undefined;
3461
+ provenance?: {
3462
+ refs: {
3463
+ id: string;
3464
+ ns?: string | undefined;
3465
+ role?: "primary" | "piece" | "absorbed" | "alias" | "derived" | undefined;
3466
+ }[];
3467
+ lineage?: {
3468
+ op: "import" | "split" | "merge" | "duplicate" | "convert" | "promote" | "make-independent" | "attach";
3469
+ fromIds: string[];
3470
+ } | undefined;
3471
+ } | undefined;
3472
+ slots?: Record<string, string> | undefined;
3473
+ material?: {
3474
+ id?: string | undefined;
3475
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
3476
+ properties?: {
3477
+ color: string;
3478
+ roughness: number;
3479
+ metalness: number;
3480
+ opacity: number;
3481
+ transparent: boolean;
3482
+ side: "front" | "back" | "double";
3483
+ } | undefined;
3484
+ texture?: {
3485
+ url: string;
3486
+ repeat?: [number, number] | undefined;
3487
+ scale?: number | undefined;
3488
+ } | undefined;
3489
+ } | undefined;
3490
+ roofSegmentId?: string | undefined;
3491
+ } | {
3492
+ object: "node";
3493
+ length: number;
3494
+ position: [number, number, number];
3495
+ id: `rvent_${string}`;
3496
+ parentId: string | null;
3497
+ visible: boolean;
3498
+ metadata: Record<string, unknown>;
3499
+ rotation: number;
3500
+ width: number;
3501
+ height: number;
3502
+ style: "metal" | "standard" | "shingled";
3503
+ endCaps: boolean;
3504
+ type: "ridge-vent";
3505
+ name?: string | undefined;
3506
+ camera?: {
3507
+ position: [number, number, number];
3508
+ target: [number, number, number];
3509
+ mode: "perspective" | "orthographic";
3510
+ fov?: number | undefined;
3511
+ zoom?: number | undefined;
3512
+ } | undefined;
3513
+ provenance?: {
3514
+ refs: {
3515
+ id: string;
3516
+ ns?: string | undefined;
3517
+ role?: "primary" | "piece" | "absorbed" | "alias" | "derived" | undefined;
3518
+ }[];
3519
+ lineage?: {
3520
+ op: "import" | "split" | "merge" | "duplicate" | "convert" | "promote" | "make-independent" | "attach";
3521
+ fromIds: string[];
3522
+ } | undefined;
3523
+ } | undefined;
3524
+ material?: {
3525
+ id?: string | undefined;
3526
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
3527
+ properties?: {
3528
+ color: string;
3529
+ roughness: number;
3530
+ metalness: number;
3531
+ opacity: number;
3532
+ transparent: boolean;
3533
+ side: "front" | "back" | "double";
3534
+ } | undefined;
3535
+ texture?: {
3536
+ url: string;
3537
+ repeat?: [number, number] | undefined;
3538
+ scale?: number | undefined;
3539
+ } | undefined;
3540
+ } | undefined;
3541
+ materialPreset?: string | undefined;
3542
+ roofSegmentId?: string | undefined;
3543
+ } | {
3544
+ object: "node";
3545
+ position: [number, number, number];
3546
+ id: `tvent_${string}`;
3547
+ parentId: string | null;
3548
+ visible: boolean;
3549
+ metadata: Record<string, unknown>;
3550
+ rotation: number;
3551
+ materialPreset: string;
3552
+ height: number;
3553
+ style: "cylinder" | "globe";
3554
+ diameter: number;
3555
+ neckHeight: number;
3556
+ baseOverhang: number;
3557
+ vaneCount: number;
3558
+ spinSpeed: number;
3559
+ type: "turbine-vent";
3560
+ name?: string | undefined;
3561
+ camera?: {
3562
+ position: [number, number, number];
3563
+ target: [number, number, number];
3564
+ mode: "perspective" | "orthographic";
3565
+ fov?: number | undefined;
3566
+ zoom?: number | undefined;
3567
+ } | undefined;
3568
+ provenance?: {
3569
+ refs: {
3570
+ id: string;
3571
+ ns?: string | undefined;
3572
+ role?: "primary" | "piece" | "absorbed" | "alias" | "derived" | undefined;
3573
+ }[];
3574
+ lineage?: {
3575
+ op: "import" | "split" | "merge" | "duplicate" | "convert" | "promote" | "make-independent" | "attach";
3576
+ fromIds: string[];
3577
+ } | undefined;
3578
+ } | undefined;
3579
+ slots?: Record<string, string> | undefined;
3580
+ material?: {
3581
+ id?: string | undefined;
3582
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
3583
+ properties?: {
3584
+ color: string;
3585
+ roughness: number;
3586
+ metalness: number;
3587
+ opacity: number;
3588
+ transparent: boolean;
3589
+ side: "front" | "back" | "double";
3590
+ } | undefined;
3591
+ texture?: {
3592
+ url: string;
3593
+ repeat?: [number, number] | undefined;
3594
+ scale?: number | undefined;
3595
+ } | undefined;
3596
+ } | undefined;
3597
+ roofSegmentId?: string | undefined;
3598
+ } | {
3599
+ object: "node";
3600
+ position: [number, number, number];
3601
+ id: `cupola_${string}`;
3602
+ parentId: string | null;
3603
+ visible: boolean;
3604
+ metadata: Record<string, unknown>;
3605
+ depth: number;
3606
+ rotation: number;
3607
+ materialPreset: string;
3608
+ width: number;
3609
+ height: number;
3610
+ roofStyle: "dome" | "pyramid";
3611
+ finial: boolean;
3612
+ type: "cupola";
3613
+ name?: string | undefined;
3614
+ camera?: {
3615
+ position: [number, number, number];
3616
+ target: [number, number, number];
3617
+ mode: "perspective" | "orthographic";
3618
+ fov?: number | undefined;
3619
+ zoom?: number | undefined;
3620
+ } | undefined;
3621
+ provenance?: {
3622
+ refs: {
3623
+ id: string;
3624
+ ns?: string | undefined;
3625
+ role?: "primary" | "piece" | "absorbed" | "alias" | "derived" | undefined;
3626
+ }[];
3627
+ lineage?: {
3628
+ op: "import" | "split" | "merge" | "duplicate" | "convert" | "promote" | "make-independent" | "attach";
3629
+ fromIds: string[];
3630
+ } | undefined;
3631
+ } | undefined;
3632
+ slots?: Record<string, string> | undefined;
3633
+ material?: {
3634
+ id?: string | undefined;
3635
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
3636
+ properties?: {
3637
+ color: string;
3638
+ roughness: number;
3639
+ metalness: number;
3640
+ opacity: number;
3641
+ transparent: boolean;
3642
+ side: "front" | "back" | "double";
3643
+ } | undefined;
3644
+ texture?: {
3645
+ url: string;
3646
+ repeat?: [number, number] | undefined;
3647
+ scale?: number | undefined;
3648
+ } | undefined;
3649
+ } | undefined;
3650
+ roofSegmentId?: string | undefined;
3651
+ } | {
3652
+ object: "node";
3653
+ position: [number, number, number];
3654
+ id: `eyebrow-vent_${string}`;
3655
+ parentId: string | null;
3656
+ visible: boolean;
3657
+ metadata: Record<string, unknown>;
3658
+ depth: number;
3659
+ rotation: number;
3660
+ materialPreset: string;
3661
+ width: number;
3662
+ height: number;
3663
+ style: "half-round" | "scoop" | "slant-box";
3664
+ louverCount: number;
3665
+ backRatio: number;
3666
+ type: "eyebrow-vent";
3667
+ name?: string | undefined;
3668
+ camera?: {
3669
+ position: [number, number, number];
3670
+ target: [number, number, number];
3671
+ mode: "perspective" | "orthographic";
3672
+ fov?: number | undefined;
3673
+ zoom?: number | undefined;
3674
+ } | undefined;
3675
+ provenance?: {
3676
+ refs: {
3677
+ id: string;
3678
+ ns?: string | undefined;
3679
+ role?: "primary" | "piece" | "absorbed" | "alias" | "derived" | undefined;
3680
+ }[];
3681
+ lineage?: {
3682
+ op: "import" | "split" | "merge" | "duplicate" | "convert" | "promote" | "make-independent" | "attach";
3683
+ fromIds: string[];
3684
+ } | undefined;
3685
+ } | undefined;
3686
+ slots?: Record<string, string> | undefined;
3687
+ material?: {
3688
+ id?: string | undefined;
3689
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
3690
+ properties?: {
3691
+ color: string;
3692
+ roughness: number;
3693
+ metalness: number;
3694
+ opacity: number;
3695
+ transparent: boolean;
3696
+ side: "front" | "back" | "double";
3697
+ } | undefined;
3698
+ texture?: {
3699
+ url: string;
3700
+ repeat?: [number, number] | undefined;
3701
+ scale?: number | undefined;
3702
+ } | undefined;
3703
+ } | undefined;
3704
+ roofSegmentId?: string | undefined;
3705
+ } | {
3706
+ object: "node";
3707
+ length: number;
3708
+ position: [number, number, number];
3709
+ id: `gutter_${string}`;
3710
+ parentId: string | null;
3711
+ visible: boolean;
3712
+ metadata: Record<string, unknown>;
3713
+ rotation: number;
3714
+ materialPreset: string;
3715
+ thickness: number;
3716
+ profile: "box" | "k-style" | "half-round";
3717
+ size: number;
3718
+ hangerStyle: "none" | "strap";
3719
+ hangerSpacing: number;
3720
+ endCapLeft: boolean;
3721
+ endCapRight: boolean;
3722
+ outlets: {
3723
+ id: string;
3724
+ offset: number;
3725
+ diameter: number;
3726
+ generatedBy?: "default-downspout" | undefined;
3727
+ }[];
3728
+ type: "gutter";
3729
+ name?: string | undefined;
3730
+ camera?: {
3731
+ position: [number, number, number];
3732
+ target: [number, number, number];
3733
+ mode: "perspective" | "orthographic";
3734
+ fov?: number | undefined;
3735
+ zoom?: number | undefined;
3736
+ } | undefined;
3737
+ provenance?: {
3738
+ refs: {
3739
+ id: string;
3740
+ ns?: string | undefined;
3741
+ role?: "primary" | "piece" | "absorbed" | "alias" | "derived" | undefined;
3742
+ }[];
3743
+ lineage?: {
3744
+ op: "import" | "split" | "merge" | "duplicate" | "convert" | "promote" | "make-independent" | "attach";
3745
+ fromIds: string[];
3746
+ } | undefined;
3747
+ } | undefined;
3748
+ slots?: Record<string, string> | undefined;
3749
+ material?: {
3750
+ id?: string | undefined;
3751
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
3752
+ properties?: {
3753
+ color: string;
3754
+ roughness: number;
3755
+ metalness: number;
3756
+ opacity: number;
3757
+ transparent: boolean;
3758
+ side: "front" | "back" | "double";
3759
+ } | undefined;
3760
+ texture?: {
3761
+ url: string;
3762
+ repeat?: [number, number] | undefined;
3763
+ scale?: number | undefined;
3764
+ } | undefined;
3765
+ } | undefined;
3766
+ roofSegmentId?: string | undefined;
3767
+ arc?: {
3768
+ centerX: number;
3769
+ centerZ: number;
3770
+ radius: number;
3771
+ } | undefined;
3772
+ } | {
3773
+ object: "node";
3774
+ position: [number, number, number];
3775
+ id: `chimney_${string}`;
3776
+ parentId: string | null;
3777
+ visible: boolean;
3778
+ metadata: Record<string, unknown>;
3779
+ depth: number;
3780
+ rotation: number;
3781
+ width: number;
3782
+ cornerBevel: number;
3783
+ cap: boolean;
3784
+ panelDepth: number;
3785
+ panelHeight: number;
3786
+ bodyShape: "round" | "square";
3787
+ bodyHollowDepth: number;
3788
+ bodyHollowMargin: number;
3789
+ heightAboveRidge: number;
3790
+ cutoutOffset: number;
3791
+ capShape: "flat" | "none" | "stepped" | "sloped";
3792
+ capOverhang: number;
3793
+ capThickness: number;
3794
+ flueCount: number;
3795
+ flueShape: "round" | "square";
3796
+ flueHeight: number;
3797
+ flueDiameter: number;
3798
+ flueSpacing: number;
3799
+ flueWallThickness: number;
3800
+ shoulderStyle: "tapered" | "none" | "corbeled";
3801
+ shoulderHeight: number;
3802
+ shoulderExtent: number;
3803
+ bandStyle: "double" | "none" | "single";
3804
+ bandHeight: number;
3805
+ bandExtent: number;
3806
+ bandOffset: number;
3807
+ cricketStyle: "none" | "simple";
3808
+ cricketLength: number;
3809
+ cricketHeight: number;
3810
+ cricketSide: "front" | "back";
3811
+ panelStyle: "rectangular" | "none";
3812
+ panelOffsetTop: number;
3813
+ panelMargin: number;
3814
+ type: "chimney";
3815
+ name?: string | undefined;
3816
+ camera?: {
3817
+ position: [number, number, number];
3818
+ target: [number, number, number];
3819
+ mode: "perspective" | "orthographic";
3820
+ fov?: number | undefined;
3821
+ zoom?: number | undefined;
3822
+ } | undefined;
3823
+ provenance?: {
3824
+ refs: {
3825
+ id: string;
3826
+ ns?: string | undefined;
3827
+ role?: "primary" | "piece" | "absorbed" | "alias" | "derived" | undefined;
3828
+ }[];
3829
+ lineage?: {
3830
+ op: "import" | "split" | "merge" | "duplicate" | "convert" | "promote" | "make-independent" | "attach";
3831
+ fromIds: string[];
3832
+ } | undefined;
3833
+ } | undefined;
3834
+ material?: {
3835
+ id?: string | undefined;
3836
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
3837
+ properties?: {
3838
+ color: string;
3839
+ roughness: number;
3840
+ metalness: number;
3841
+ opacity: number;
3842
+ transparent: boolean;
3843
+ side: "front" | "back" | "double";
3844
+ } | undefined;
3845
+ texture?: {
3846
+ url: string;
3847
+ repeat?: [number, number] | undefined;
3848
+ scale?: number | undefined;
3849
+ } | undefined;
3850
+ } | undefined;
3851
+ materialPreset?: string | undefined;
3852
+ roofSegmentId?: string | undefined;
3853
+ topMaterial?: {
3854
+ id?: string | undefined;
3855
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
3856
+ properties?: {
3857
+ color: string;
3858
+ roughness: number;
3859
+ metalness: number;
3860
+ opacity: number;
3861
+ transparent: boolean;
3862
+ side: "front" | "back" | "double";
3863
+ } | undefined;
3864
+ texture?: {
3865
+ url: string;
3866
+ repeat?: [number, number] | undefined;
3867
+ scale?: number | undefined;
3868
+ } | undefined;
3869
+ } | undefined;
3870
+ topMaterialPreset?: string | undefined;
3871
+ } | {
3872
+ object: "node";
3873
+ position: [number, number, number];
3874
+ id: `solarpanel_${string}`;
3875
+ parentId: string | null;
3876
+ visible: boolean;
3877
+ metadata: Record<string, unknown>;
3878
+ rotation: number;
3879
+ rows: number;
3880
+ columns: number;
3881
+ frameThickness: number;
3882
+ frameDepth: number;
3883
+ panelWidth: number;
3884
+ panelHeight: number;
3885
+ gapX: number;
3886
+ gapY: number;
3887
+ mountingType: "flush" | "tilted";
3888
+ tiltAngle: number;
3889
+ standoffHeight: number;
3890
+ type: "solar-panel";
3891
+ name?: string | undefined;
3892
+ camera?: {
3893
+ position: [number, number, number];
3894
+ target: [number, number, number];
3895
+ mode: "perspective" | "orthographic";
3896
+ fov?: number | undefined;
3897
+ zoom?: number | undefined;
3898
+ } | undefined;
3899
+ provenance?: {
3900
+ refs: {
3901
+ id: string;
3902
+ ns?: string | undefined;
3903
+ role?: "primary" | "piece" | "absorbed" | "alias" | "derived" | undefined;
3904
+ }[];
3905
+ lineage?: {
3906
+ op: "import" | "split" | "merge" | "duplicate" | "convert" | "promote" | "make-independent" | "attach";
3907
+ fromIds: string[];
3908
+ } | undefined;
3909
+ } | undefined;
3910
+ material?: {
3911
+ id?: string | undefined;
3912
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
3913
+ properties?: {
3914
+ color: string;
3915
+ roughness: number;
3916
+ metalness: number;
3917
+ opacity: number;
3918
+ transparent: boolean;
3919
+ side: "front" | "back" | "double";
3920
+ } | undefined;
3921
+ texture?: {
3922
+ url: string;
3923
+ repeat?: [number, number] | undefined;
3924
+ scale?: number | undefined;
3925
+ } | undefined;
3926
+ } | undefined;
3927
+ materialPreset?: string | undefined;
3928
+ roofSegmentId?: string | undefined;
3929
+ panelMaterial?: {
3930
+ id?: string | undefined;
3931
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
3932
+ properties?: {
3933
+ color: string;
3934
+ roughness: number;
3935
+ metalness: number;
3936
+ opacity: number;
3937
+ transparent: boolean;
3938
+ side: "front" | "back" | "double";
3939
+ } | undefined;
3940
+ texture?: {
3941
+ url: string;
3942
+ repeat?: [number, number] | undefined;
3943
+ scale?: number | undefined;
3944
+ } | undefined;
3945
+ } | undefined;
3946
+ panelMaterialPreset?: string | undefined;
3947
+ panelTypePreset?: "residential" | "residential-large" | "compact" | "frameless" | undefined;
3948
+ surfaceNormal?: [number, number, number] | undefined;
3949
+ } | {
3950
+ object: "node";
3951
+ position: [number, number, number];
3952
+ id: `skylight_${string}`;
3953
+ parentId: string | null;
3954
+ visible: boolean;
3955
+ metadata: Record<string, unknown>;
3956
+ rotation: number;
3957
+ width: number;
3958
+ height: number;
3959
+ glassThickness: number;
3960
+ operationState: number;
3961
+ slideDirection: "x" | "z";
3962
+ frameThickness: number;
3963
+ frameDepth: number;
3964
+ curbHeight: number;
3965
+ cutoutOffset: number;
3966
+ skylightType: "flat" | "sliding" | "opening" | "walk-on" | "lantern";
3967
+ lanternHeight: number;
3968
+ lanternTopScale: number;
3969
+ openingAngle: number;
3970
+ openingSide: "left" | "right" | "top" | "bottom";
3971
+ motorHousing: boolean;
3972
+ slideFraction: number;
3973
+ trackWidth: number;
3974
+ motorHousingSize: number;
3975
+ curb: boolean;
3976
+ type: "skylight";
3977
+ name?: string | undefined;
3978
+ camera?: {
3979
+ position: [number, number, number];
3980
+ target: [number, number, number];
3981
+ mode: "perspective" | "orthographic";
3982
+ fov?: number | undefined;
3983
+ zoom?: number | undefined;
3984
+ } | undefined;
3985
+ provenance?: {
3986
+ refs: {
3987
+ id: string;
3988
+ ns?: string | undefined;
3989
+ role?: "primary" | "piece" | "absorbed" | "alias" | "derived" | undefined;
3990
+ }[];
3991
+ lineage?: {
3992
+ op: "import" | "split" | "merge" | "duplicate" | "convert" | "promote" | "make-independent" | "attach";
3993
+ fromIds: string[];
3994
+ } | undefined;
3995
+ } | undefined;
3996
+ material?: {
3997
+ id?: string | undefined;
3998
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
3999
+ properties?: {
4000
+ color: string;
4001
+ roughness: number;
4002
+ metalness: number;
4003
+ opacity: number;
4004
+ transparent: boolean;
4005
+ side: "front" | "back" | "double";
4006
+ } | undefined;
4007
+ texture?: {
4008
+ url: string;
4009
+ repeat?: [number, number] | undefined;
4010
+ scale?: number | undefined;
4011
+ } | undefined;
4012
+ } | undefined;
4013
+ materialPreset?: string | undefined;
4014
+ roofSegmentId?: string | undefined;
4015
+ surfaceNormal?: [number, number, number] | undefined;
4016
+ glassMaterial?: {
4017
+ id?: string | undefined;
4018
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
4019
+ properties?: {
4020
+ color: string;
4021
+ roughness: number;
4022
+ metalness: number;
4023
+ opacity: number;
4024
+ transparent: boolean;
4025
+ side: "front" | "back" | "double";
4026
+ } | undefined;
4027
+ texture?: {
4028
+ url: string;
4029
+ repeat?: [number, number] | undefined;
4030
+ scale?: number | undefined;
4031
+ } | undefined;
4032
+ } | undefined;
4033
+ glassMaterialPreset?: string | undefined;
4034
+ } | {
4035
+ object: "node";
4036
+ position: [number, number, number];
4037
+ id: `dormer_${string}`;
4038
+ parentId: string | null;
4039
+ visible: boolean;
4040
+ metadata: Record<string, unknown>;
4041
+ depth: number;
4042
+ rotation: number;
4043
+ children: `window_${string}`[];
4044
+ width: number;
4045
+ height: number;
4046
+ roofType: "flat" | "hip" | "gable" | "shed" | "gambrel" | "dutch" | "mansard" | "conical";
4047
+ roofHeight: number;
4048
+ shedHighSide: "front" | "back";
4049
+ wallSkirtHeight: number;
4050
+ windowWidth: number;
4051
+ windowHeight: number;
4052
+ windowOffsetX: number;
4053
+ windowOffsetY: number;
4054
+ windowFrameThickness: number;
4055
+ windowFrameDepth: number;
4056
+ windowColumns: number;
4057
+ windowRows: number;
4058
+ windowDividerThickness: number;
4059
+ windowShape: "rectangle" | "rounded" | "arch";
4060
+ windowArchHeight: number;
4061
+ windowCornerRadii: [number, number, number, number];
4062
+ windowSill: boolean;
4063
+ windowSillDepth: number;
4064
+ windowSillThickness: number;
4065
+ type: "dormer";
4066
+ name?: string | undefined;
4067
+ camera?: {
4068
+ position: [number, number, number];
4069
+ target: [number, number, number];
4070
+ mode: "perspective" | "orthographic";
4071
+ fov?: number | undefined;
4072
+ zoom?: number | undefined;
4073
+ } | undefined;
4074
+ provenance?: {
4075
+ refs: {
4076
+ id: string;
4077
+ ns?: string | undefined;
4078
+ role?: "primary" | "piece" | "absorbed" | "alias" | "derived" | undefined;
4079
+ }[];
4080
+ lineage?: {
4081
+ op: "import" | "split" | "merge" | "duplicate" | "convert" | "promote" | "make-independent" | "attach";
4082
+ fromIds: string[];
4083
+ } | undefined;
4084
+ } | undefined;
4085
+ material?: {
4086
+ id?: string | undefined;
4087
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
4088
+ properties?: {
4089
+ color: string;
4090
+ roughness: number;
4091
+ metalness: number;
4092
+ opacity: number;
4093
+ transparent: boolean;
4094
+ side: "front" | "back" | "double";
4095
+ } | undefined;
4096
+ texture?: {
4097
+ url: string;
4098
+ repeat?: [number, number] | undefined;
4099
+ scale?: number | undefined;
4100
+ } | undefined;
4101
+ } | undefined;
4102
+ materialPreset?: string | undefined;
4103
+ roofSegmentId?: string | undefined;
4104
+ topMaterial?: {
4105
+ id?: string | undefined;
4106
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
4107
+ properties?: {
4108
+ color: string;
4109
+ roughness: number;
4110
+ metalness: number;
4111
+ opacity: number;
4112
+ transparent: boolean;
4113
+ side: "front" | "back" | "double";
4114
+ } | undefined;
4115
+ texture?: {
4116
+ url: string;
4117
+ repeat?: [number, number] | undefined;
4118
+ scale?: number | undefined;
4119
+ } | undefined;
4120
+ } | undefined;
4121
+ topMaterialPreset?: string | undefined;
4122
+ wallMaterial?: {
4123
+ id?: string | undefined;
4124
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
4125
+ properties?: {
4126
+ color: string;
4127
+ roughness: number;
4128
+ metalness: number;
4129
+ opacity: number;
4130
+ transparent: boolean;
4131
+ side: "front" | "back" | "double";
4132
+ } | undefined;
4133
+ texture?: {
4134
+ url: string;
4135
+ repeat?: [number, number] | undefined;
4136
+ scale?: number | undefined;
4137
+ } | undefined;
4138
+ } | undefined;
4139
+ wallMaterialPreset?: string | undefined;
4140
+ sideMaterial?: {
4141
+ id?: string | undefined;
4142
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
4143
+ properties?: {
4144
+ color: string;
4145
+ roughness: number;
4146
+ metalness: number;
4147
+ opacity: number;
4148
+ transparent: boolean;
4149
+ side: "front" | "back" | "double";
4150
+ } | undefined;
4151
+ texture?: {
4152
+ url: string;
4153
+ repeat?: [number, number] | undefined;
4154
+ scale?: number | undefined;
4155
+ } | undefined;
4156
+ } | undefined;
4157
+ sideMaterialPreset?: string | undefined;
4158
+ } | {
4159
+ object: "node";
4160
+ length: number;
4161
+ id: `downspout_${string}`;
4162
+ parentId: string | null;
4163
+ visible: boolean;
4164
+ metadata: Record<string, unknown>;
4165
+ shape: "auto" | "round" | "rect";
4166
+ materialPreset: string;
4167
+ diameter: number;
4168
+ standoff: number;
4169
+ strapStyle: "none" | "band";
4170
+ strapSpacing: number;
4171
+ terminal: "straight" | "splash" | "kickout";
4172
+ type: "downspout";
4173
+ name?: string | undefined;
4174
+ camera?: {
4175
+ position: [number, number, number];
4176
+ target: [number, number, number];
4177
+ mode: "perspective" | "orthographic";
4178
+ fov?: number | undefined;
4179
+ zoom?: number | undefined;
4180
+ } | undefined;
4181
+ provenance?: {
4182
+ refs: {
4183
+ id: string;
4184
+ ns?: string | undefined;
4185
+ role?: "primary" | "piece" | "absorbed" | "alias" | "derived" | undefined;
4186
+ }[];
4187
+ lineage?: {
4188
+ op: "import" | "split" | "merge" | "duplicate" | "convert" | "promote" | "make-independent" | "attach";
4189
+ fromIds: string[];
4190
+ } | undefined;
4191
+ } | undefined;
4192
+ slots?: Record<string, string> | undefined;
4193
+ material?: {
4194
+ id?: string | undefined;
4195
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
4196
+ properties?: {
4197
+ color: string;
4198
+ roughness: number;
4199
+ metalness: number;
4200
+ opacity: number;
4201
+ transparent: boolean;
4202
+ side: "front" | "back" | "double";
4203
+ } | undefined;
4204
+ texture?: {
4205
+ url: string;
4206
+ repeat?: [number, number] | undefined;
4207
+ scale?: number | undefined;
4208
+ } | undefined;
4209
+ } | undefined;
4210
+ gutterId?: string | undefined;
4211
+ outletId?: string | undefined;
4212
+ lengthMode?: "manual" | "to-ground" | undefined;
4213
+ } | {
4214
+ object: "node";
4215
+ id: `duct-segment_${string}`;
4216
+ parentId: string | null;
4217
+ visible: boolean;
4218
+ metadata: Record<string, unknown>;
4219
+ shape: "round" | "rect" | "oval";
4220
+ path: [number, number, number][];
4221
+ width: number;
4222
+ height: number;
4223
+ diameter: number;
4224
+ roll: number;
4225
+ ductMaterial: "spiral" | "sheet-metal" | "flex" | "duct-board";
4226
+ seamDetail: boolean;
4227
+ insulated: boolean;
4228
+ insulationR: number;
4229
+ system: "return" | "supply";
4230
+ type: "duct-segment";
4231
+ name?: string | undefined;
4232
+ camera?: {
4233
+ position: [number, number, number];
4234
+ target: [number, number, number];
4235
+ mode: "perspective" | "orthographic";
4236
+ fov?: number | undefined;
4237
+ zoom?: number | undefined;
4238
+ } | undefined;
4239
+ provenance?: {
4240
+ refs: {
4241
+ id: string;
4242
+ ns?: string | undefined;
4243
+ role?: "primary" | "piece" | "absorbed" | "alias" | "derived" | undefined;
4244
+ }[];
4245
+ lineage?: {
4246
+ op: "import" | "split" | "merge" | "duplicate" | "convert" | "promote" | "make-independent" | "attach";
4247
+ fromIds: string[];
4248
+ } | undefined;
4249
+ } | undefined;
4250
+ slots?: Record<string, string> | undefined;
4251
+ autoHangers?: boolean | undefined;
4252
+ hangerOverrides?: Record<string, {
4253
+ fraction?: number | undefined;
4254
+ skipped?: boolean | undefined;
4255
+ hostId?: string | undefined;
4256
+ }> | undefined;
4257
+ hangerStyle?: "double" | "single" | undefined;
4258
+ hangerSpacing?: number | undefined;
4259
+ hangerMaxReach?: number | undefined;
4260
+ wallAttachment?: {
4261
+ wallId: `wall_${string}`;
4262
+ side: "front" | "back";
4263
+ startUV: [number, number];
4264
+ endUV: [number, number];
4265
+ offset: number;
4266
+ } | undefined;
4267
+ } | {
4268
+ object: "node";
4269
+ position: [number, number, number];
4270
+ id: `duct-fitting_${string}`;
4271
+ parentId: string | null;
4272
+ visible: boolean;
4273
+ metadata: Record<string, unknown>;
4274
+ shape: "round" | "rect" | "oval";
4275
+ rotation: [number, number, number];
4276
+ width: number;
4277
+ height: number;
4278
+ angle: number;
4279
+ diameter: number;
4280
+ ductMaterial: "sheet-metal" | "flex" | "duct-board";
4281
+ system: "return" | "supply";
4282
+ fittingType: "elbow" | "tee" | "cross" | "reducer" | "transition" | "end-cap" | "damper" | "access-panel" | "coupling";
4283
+ shape2: "round" | "rect" | "oval";
4284
+ width2: number;
4285
+ height2: number;
4286
+ branchAngle: number;
4287
+ diameter2: number;
4288
+ damperAngle: number;
4289
+ panelWidth: number;
4290
+ panelHeight: number;
4291
+ type: "duct-fitting";
4292
+ name?: string | undefined;
4293
+ camera?: {
4294
+ position: [number, number, number];
4295
+ target: [number, number, number];
4296
+ mode: "perspective" | "orthographic";
4297
+ fov?: number | undefined;
4298
+ zoom?: number | undefined;
4299
+ } | undefined;
4300
+ provenance?: {
4301
+ refs: {
4302
+ id: string;
4303
+ ns?: string | undefined;
4304
+ role?: "primary" | "piece" | "absorbed" | "alias" | "derived" | undefined;
4305
+ }[];
4306
+ lineage?: {
4307
+ op: "import" | "split" | "merge" | "duplicate" | "convert" | "promote" | "make-independent" | "attach";
4308
+ fromIds: string[];
4309
+ } | undefined;
4310
+ } | undefined;
4311
+ slots?: Record<string, string> | undefined;
4312
+ inletShape?: "round" | "rect" | "oval" | undefined;
4313
+ outletShape?: "round" | "rect" | "oval" | undefined;
4314
+ } | {
4315
+ object: "node";
4316
+ position: [number, number, number];
4317
+ id: `duct-terminal_${string}`;
4318
+ parentId: string | null;
4319
+ visible: boolean;
4320
+ metadata: Record<string, unknown>;
4321
+ depth: number;
4322
+ rotation: number;
4323
+ width: number;
4324
+ mount: "wall" | "ceiling" | "floor";
4325
+ terminalType: "supply-register" | "diffuser" | "return-grille";
4326
+ collarShape: "round" | "rect" | "oval";
4327
+ collarDiameter: number;
4328
+ collarWidth: number;
4329
+ collarHeight: number;
4330
+ type: "duct-terminal";
4331
+ name?: string | undefined;
4332
+ camera?: {
4333
+ position: [number, number, number];
4334
+ target: [number, number, number];
4335
+ mode: "perspective" | "orthographic";
4336
+ fov?: number | undefined;
4337
+ zoom?: number | undefined;
4338
+ } | undefined;
4339
+ provenance?: {
4340
+ refs: {
4341
+ id: string;
4342
+ ns?: string | undefined;
4343
+ role?: "primary" | "piece" | "absorbed" | "alias" | "derived" | undefined;
4344
+ }[];
4345
+ lineage?: {
4346
+ op: "import" | "split" | "merge" | "duplicate" | "convert" | "promote" | "make-independent" | "attach";
4347
+ fromIds: string[];
4348
+ } | undefined;
4349
+ } | undefined;
4350
+ supportSlabId?: string | undefined;
4351
+ } | {
4352
+ object: "node";
4353
+ position: [number, number, number];
4354
+ id: `hvac-equipment_${string}`;
4355
+ parentId: string | null;
4356
+ visible: boolean;
4357
+ metadata: Record<string, unknown>;
4358
+ depth: number;
4359
+ rotation: number;
4360
+ width: number;
4361
+ height: number;
4362
+ equipmentType: "furnace" | "air-handler" | "condenser";
4363
+ supplyShape: "round" | "rect" | "oval";
4364
+ returnShape: "round" | "rect" | "oval";
4365
+ supplyDiameter: number;
4366
+ returnDiameter: number;
4367
+ supplyWidth: number;
4368
+ supplyHeight: number;
4369
+ returnWidth: number;
4370
+ returnHeight: number;
4371
+ type: "hvac-equipment";
4372
+ name?: string | undefined;
4373
+ camera?: {
4374
+ position: [number, number, number];
4375
+ target: [number, number, number];
4376
+ mode: "perspective" | "orthographic";
4377
+ fov?: number | undefined;
4378
+ zoom?: number | undefined;
4379
+ } | undefined;
4380
+ provenance?: {
4381
+ refs: {
4382
+ id: string;
4383
+ ns?: string | undefined;
4384
+ role?: "primary" | "piece" | "absorbed" | "alias" | "derived" | undefined;
4385
+ }[];
4386
+ lineage?: {
4387
+ op: "import" | "split" | "merge" | "duplicate" | "convert" | "promote" | "make-independent" | "attach";
4388
+ fromIds: string[];
4389
+ } | undefined;
4390
+ } | undefined;
4391
+ supportSlabId?: string | undefined;
4392
+ } | {
4393
+ object: "node";
4394
+ id: `lineset_${string}`;
4395
+ parentId: string | null;
4396
+ visible: boolean;
4397
+ metadata: Record<string, unknown>;
4398
+ path: [number, number, number][];
4399
+ insulated: boolean;
4400
+ suctionDiameter: number;
4401
+ liquidDiameter: number;
4402
+ type: "lineset";
4403
+ name?: string | undefined;
4404
+ camera?: {
4405
+ position: [number, number, number];
4406
+ target: [number, number, number];
4407
+ mode: "perspective" | "orthographic";
4408
+ fov?: number | undefined;
4409
+ zoom?: number | undefined;
4410
+ } | undefined;
4411
+ provenance?: {
4412
+ refs: {
4413
+ id: string;
4414
+ ns?: string | undefined;
4415
+ role?: "primary" | "piece" | "absorbed" | "alias" | "derived" | undefined;
4416
+ }[];
4417
+ lineage?: {
4418
+ op: "import" | "split" | "merge" | "duplicate" | "convert" | "promote" | "make-independent" | "attach";
4419
+ fromIds: string[];
4420
+ } | undefined;
4421
+ } | undefined;
4422
+ } | {
4423
+ object: "node";
4424
+ id: `liquid-line_${string}`;
4425
+ parentId: string | null;
4426
+ visible: boolean;
4427
+ metadata: Record<string, unknown>;
4428
+ path: [number, number, number][];
4429
+ diameter: number;
4430
+ type: "liquid-line";
4431
+ name?: string | undefined;
4432
+ camera?: {
4433
+ position: [number, number, number];
4434
+ target: [number, number, number];
4435
+ mode: "perspective" | "orthographic";
4436
+ fov?: number | undefined;
4437
+ zoom?: number | undefined;
4438
+ } | undefined;
4439
+ provenance?: {
4440
+ refs: {
4441
+ id: string;
4442
+ ns?: string | undefined;
4443
+ role?: "primary" | "piece" | "absorbed" | "alias" | "derived" | undefined;
4444
+ }[];
4445
+ lineage?: {
4446
+ op: "import" | "split" | "merge" | "duplicate" | "convert" | "promote" | "make-independent" | "attach";
4447
+ fromIds: string[];
4448
+ } | undefined;
4449
+ } | undefined;
4450
+ } | {
4451
+ object: "node";
4452
+ id: `pipe-segment_${string}`;
4453
+ parentId: string | null;
4454
+ visible: boolean;
4455
+ metadata: Record<string, unknown>;
4456
+ path: [number, number, number][];
4457
+ diameter: number;
4458
+ system: "waste" | "vent";
4459
+ pipeMaterial: "abs" | "pvc" | "cast-iron";
4460
+ type: "pipe-segment";
4461
+ name?: string | undefined;
4462
+ camera?: {
4463
+ position: [number, number, number];
4464
+ target: [number, number, number];
4465
+ mode: "perspective" | "orthographic";
4466
+ fov?: number | undefined;
4467
+ zoom?: number | undefined;
4468
+ } | undefined;
4469
+ provenance?: {
4470
+ refs: {
4471
+ id: string;
4472
+ ns?: string | undefined;
4473
+ role?: "primary" | "piece" | "absorbed" | "alias" | "derived" | undefined;
4474
+ }[];
4475
+ lineage?: {
4476
+ op: "import" | "split" | "merge" | "duplicate" | "convert" | "promote" | "make-independent" | "attach";
4477
+ fromIds: string[];
4478
+ } | undefined;
4479
+ } | undefined;
4480
+ autoHangers?: boolean | undefined;
4481
+ hangerOverrides?: Record<string, {
4482
+ fraction?: number | undefined;
4483
+ skipped?: boolean | undefined;
4484
+ hostId?: string | undefined;
4485
+ }> | undefined;
4486
+ hangerStyle?: "double" | "single" | undefined;
4487
+ hangerSpacing?: number | undefined;
4488
+ hangerMaxReach?: number | undefined;
4489
+ wallAttachment?: {
4490
+ wallId: `wall_${string}`;
4491
+ side: "front" | "back";
4492
+ startUV: [number, number];
4493
+ endUV: [number, number];
4494
+ offset: number;
4495
+ } | undefined;
4496
+ } | {
4497
+ object: "node";
4498
+ position: [number, number, number];
4499
+ id: `pipe-fitting_${string}`;
4500
+ parentId: string | null;
4501
+ visible: boolean;
4502
+ metadata: Record<string, unknown>;
4503
+ rotation: [number, number, number];
4504
+ angle: number;
4505
+ diameter: number;
4506
+ system: "waste" | "vent";
4507
+ fittingType: "elbow" | "cross" | "reducer" | "end-cap" | "coupling" | "wye" | "sanitary-tee" | "cleanout";
4508
+ diameter2: number;
4509
+ pipeMaterial: "abs" | "pvc" | "cast-iron";
4510
+ cleanoutStyle: "end" | "inline";
4511
+ type: "pipe-fitting";
4512
+ name?: string | undefined;
4513
+ camera?: {
4514
+ position: [number, number, number];
4515
+ target: [number, number, number];
4516
+ mode: "perspective" | "orthographic";
4517
+ fov?: number | undefined;
4518
+ zoom?: number | undefined;
4519
+ } | undefined;
4520
+ provenance?: {
4521
+ refs: {
4522
+ id: string;
4523
+ ns?: string | undefined;
4524
+ role?: "primary" | "piece" | "absorbed" | "alias" | "derived" | undefined;
4525
+ }[];
4526
+ lineage?: {
4527
+ op: "import" | "split" | "merge" | "duplicate" | "convert" | "promote" | "make-independent" | "attach";
4528
+ fromIds: string[];
4529
+ } | undefined;
4530
+ } | undefined;
4531
+ } | {
4532
+ object: "node";
4533
+ position: [number, number, number];
4534
+ id: `pipe-trap_${string}`;
4535
+ parentId: string | null;
4536
+ visible: boolean;
4537
+ metadata: Record<string, unknown>;
4538
+ rotation: number;
4539
+ diameter: number;
4540
+ pipeMaterial: "abs" | "pvc" | "cast-iron";
4541
+ armLengthM: number;
4542
+ type: "pipe-trap";
4543
+ name?: string | undefined;
4544
+ camera?: {
4545
+ position: [number, number, number];
4546
+ target: [number, number, number];
4547
+ mode: "perspective" | "orthographic";
4548
+ fov?: number | undefined;
4549
+ zoom?: number | undefined;
4550
+ } | undefined;
4551
+ provenance?: {
4552
+ refs: {
4553
+ id: string;
4554
+ ns?: string | undefined;
4555
+ role?: "primary" | "piece" | "absorbed" | "alias" | "derived" | undefined;
4556
+ }[];
4557
+ lineage?: {
4558
+ op: "import" | "split" | "merge" | "duplicate" | "convert" | "promote" | "make-independent" | "attach";
4559
+ fromIds: string[];
4560
+ } | undefined;
4561
+ } | undefined;
4562
+ }>;
4563
+ rootNodeIds: (`block_${string}` | `bvent_${string}` | `elevator_${string}` | `ceiling_${string}` | `item_${string}` | `procedural-item_${string}` | `column_${string}` | `construction-dimension_${string}` | `site_${string}` | `building_${string}` | `level_${string}` | `wall_${string}` | `door_${string}` | `window_${string}` | `leanto_${string}` | `roof_${string}` | `rseg_${string}` | `slab_${string}` | `separator_${string}` | `floor-opening_${string}` | `fence_${string}` | `structural-grid_${string}` | `imesh_${string}` | `zone_${string}` | `stair_${string}` | `sseg_${string}` | `scan_${string}` | `guide_${string}` | `measurement_${string}` | `spawn_${string}` | `shelf_${string}` | `duct-segment_${string}` | `duct-fitting_${string}` | `duct-terminal_${string}` | `hvac-equipment_${string}` | `lineset_${string}` | `liquid-line_${string}` | `pipe-segment_${string}` | `pipe-fitting_${string}` | `pipe-trap_${string}` | `unit_${string}` | `fence-gate_${string}` | `fence-opening_${string}` | `cabinet_${string}` | `cabinet-module_${string}` | `rvent_${string}` | `tvent_${string}` | `cupola_${string}` | `eyebrow-vent_${string}` | `gutter_${string}` | `chimney_${string}` | `solarpanel_${string}` | `skylight_${string}` | `dormer_${string}` | `downspout_${string}`)[];
4564
+ collections: Record<`collection_${string}`, Collection>;
4565
+ dirtyIds: (`block_${string}` | `bvent_${string}` | `elevator_${string}` | `ceiling_${string}` | `item_${string}` | `procedural-item_${string}` | `column_${string}` | `construction-dimension_${string}` | `site_${string}` | `building_${string}` | `level_${string}` | `wall_${string}` | `door_${string}` | `window_${string}` | `leanto_${string}` | `roof_${string}` | `rseg_${string}` | `slab_${string}` | `separator_${string}` | `floor-opening_${string}` | `fence_${string}` | `structural-grid_${string}` | `imesh_${string}` | `zone_${string}` | `stair_${string}` | `sseg_${string}` | `scan_${string}` | `guide_${string}` | `measurement_${string}` | `spawn_${string}` | `shelf_${string}` | `duct-segment_${string}` | `duct-fitting_${string}` | `duct-terminal_${string}` | `hvac-equipment_${string}` | `lineset_${string}` | `liquid-line_${string}` | `pipe-segment_${string}` | `pipe-fitting_${string}` | `pipe-trap_${string}` | `unit_${string}` | `fence-gate_${string}` | `fence-opening_${string}` | `cabinet_${string}` | `cabinet-module_${string}` | `rvent_${string}` | `tvent_${string}` | `cupola_${string}` | `eyebrow-vent_${string}` | `gutter_${string}` | `chimney_${string}` | `solarpanel_${string}` | `skylight_${string}` | `dormer_${string}` | `downspout_${string}`)[];
4566
+ };
4567
+ export declare const createNodesAction: (set: Parameters<typeof createNodesActionImpl>[0], get: Parameters<typeof createNodesActionImpl>[1], ops: NodeCreateOp[], options?: DerivedWriteOptions) => void;
4568
+ export declare const applyNodeChangesAction: (set: Parameters<typeof applyNodeChangesActionImpl>[0], get: Parameters<typeof applyNodeChangesActionImpl>[1], changes: Parameters<typeof applyNodeChangesActionImpl>[2], options?: DerivedWriteOptions) => void;
4569
+ export declare const updateNodesAction: (set: Parameters<typeof updateNodesActionImpl>[0], get: Parameters<typeof updateNodesActionImpl>[1], updates: Parameters<typeof updateNodesActionImpl>[2], options?: DerivedWriteOptions) => void;
4570
+ export declare const deleteNodesAction: (set: Parameters<typeof deleteNodesActionImpl>[0], get: Parameters<typeof deleteNodesActionImpl>[1], ids: AnyNodeId[], options?: DerivedWriteOptions) => void;
4571
+ /**
4572
+ * The sanctioned conversion from derived construction to an authored surface:
4573
+ * the boundary editors' polygon edit, a 2D reshape, a manual move. Clears the
4574
+ * derived markers (and the zone link) in the same update that carries the
4575
+ * caller's own change, so the reconciler stops owning the surface from this
4576
+ * commit on.
4577
+ */
4578
+ export declare const detachDerivedNodeAction: (set: Parameters<typeof updateNodesActionImpl>[0], get: Parameters<typeof updateNodesActionImpl>[1], id: AnyNodeId, data?: Partial<AnyNode>) => void;
4579
+ /**
4580
+ * What the default gutter refresh of `roofIds` would touch, without running
4581
+ * it: the existing default gutters and downspouts it may keep or replace, and
4582
+ * the roof segments whose `children` it rewrites. For previews of edits that
4583
+ * trigger the refresh (a roof segment update, a delete).
4584
+ */
4585
+ export declare function previewDefaultGutterRefresh(nodes: Record<AnyNodeId, AnyNode>, roofIds: Iterable<AnyNodeId>): {
4586
+ unsettledIds: Set<AnyNodeId>;
4587
+ regeneratedHostIds: Set<AnyNodeId>;
4588
+ };
34
4589
  export {};
35
4590
  //# sourceMappingURL=node-actions.d.ts.map