@pascal-app/core 1.0.7 → 1.1.1

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 (266) hide show
  1. package/dist/agent-operations/__fixtures__/cases.d.ts +3 -2
  2. package/dist/agent-operations/__fixtures__/cases.d.ts.map +1 -1
  3. package/dist/agent-operations/__fixtures__/native-materials.d.ts +4 -0
  4. package/dist/agent-operations/__fixtures__/native-materials.d.ts.map +1 -1
  5. package/dist/agent-operations/__fixtures__/place-items-cases.d.ts.map +1 -1
  6. package/dist/agent-operations/__fixtures__/place-items-cases.js +28 -0
  7. package/dist/agent-operations/__fixtures__/roof-bearing-cases.d.ts +9567 -9563
  8. package/dist/agent-operations/__fixtures__/roof-bearing-cases.d.ts.map +1 -1
  9. package/dist/agent-operations/__fixtures__/verify-scene-cases.d.ts +77 -77
  10. package/dist/agent-operations/asset-catalog.d.ts +21 -11
  11. package/dist/agent-operations/asset-catalog.d.ts.map +1 -1
  12. package/dist/agent-operations/asset-catalog.js +28 -10
  13. package/dist/agent-operations/asset-views.d.ts +8 -3
  14. package/dist/agent-operations/asset-views.d.ts.map +1 -1
  15. package/dist/agent-operations/asset-views.js +19 -3
  16. package/dist/agent-operations/author-scene.d.ts.map +1 -1
  17. package/dist/agent-operations/author-scene.js +2 -3
  18. package/dist/agent-operations/batch.d.ts +7 -1
  19. package/dist/agent-operations/batch.d.ts.map +1 -1
  20. package/dist/agent-operations/batch.js +17 -2
  21. package/dist/agent-operations/catalog-asset.d.ts +15 -0
  22. package/dist/agent-operations/catalog-asset.d.ts.map +1 -0
  23. package/dist/agent-operations/catalog-asset.js +4 -0
  24. package/dist/agent-operations/circulation-spaces.d.ts +1724 -1723
  25. package/dist/agent-operations/circulation-spaces.d.ts.map +1 -1
  26. package/dist/agent-operations/design-brief.d.ts.map +1 -1
  27. package/dist/agent-operations/design-brief.js +2 -0
  28. package/dist/agent-operations/furnish-room.d.ts.map +1 -1
  29. package/dist/agent-operations/furnish-room.js +2 -1
  30. package/dist/agent-operations/index.d.ts +3 -0
  31. package/dist/agent-operations/index.d.ts.map +1 -1
  32. package/dist/agent-operations/index.js +4 -1
  33. package/dist/agent-operations/level-reads.d.ts.map +1 -1
  34. package/dist/agent-operations/level-reads.js +5 -2
  35. package/dist/agent-operations/move-plan.d.ts.map +1 -1
  36. package/dist/agent-operations/move-plan.js +11 -9
  37. package/dist/agent-operations/place-in-room.d.ts.map +1 -1
  38. package/dist/agent-operations/place-in-room.js +2 -1
  39. package/dist/agent-operations/place-items.d.ts.map +1 -1
  40. package/dist/agent-operations/place-items.js +2 -1
  41. package/dist/agent-operations/scene-queries.d.ts +2944 -2943
  42. package/dist/agent-operations/scene-queries.d.ts.map +1 -1
  43. package/dist/agent-operations/scene-view.d.ts.map +1 -1
  44. package/dist/agent-operations/scene-view.js +38 -13
  45. package/dist/agent-operations/search-assets.d.ts.map +1 -1
  46. package/dist/agent-operations/search-assets.js +6 -0
  47. package/dist/agent-operations/types.d.ts +3 -2
  48. package/dist/agent-operations/types.d.ts.map +1 -1
  49. package/dist/agent-operations/usage-checks.js +18 -3
  50. package/dist/agent-operations/verify-scene.d.ts.map +1 -1
  51. package/dist/agent-operations/verify-scene.js +4 -2
  52. package/dist/agent-operations/wall-object-observations.d.ts.map +1 -1
  53. package/dist/agent-operations/wall-object-observations.js +1 -1
  54. package/dist/agent-tools/assets.js +1 -1
  55. package/dist/agent-tools/wall-openings.js +2 -2
  56. package/dist/building/__fixtures__/wall-opening-cases.d.ts +13 -12
  57. package/dist/building/__fixtures__/wall-opening-cases.d.ts.map +1 -1
  58. package/dist/building/level-duplication.d.ts +1281 -1279
  59. package/dist/building/level-duplication.d.ts.map +1 -1
  60. package/dist/building/level-duplication.js +3 -1
  61. package/dist/building/merge-windows.d.ts.map +1 -1
  62. package/dist/building/merge-windows.js +4 -3
  63. package/dist/building/wall-openings.d.ts +95 -81
  64. package/dist/building/wall-openings.d.ts.map +1 -1
  65. package/dist/building/wall-openings.js +74 -25
  66. package/dist/commands/structure/shared.d.ts +3203 -3202
  67. package/dist/commands/structure/shared.d.ts.map +1 -1
  68. package/dist/commands/structure/zone-wall-merge.d.ts +2028 -2025
  69. package/dist/commands/structure/zone-wall-merge.d.ts.map +1 -1
  70. package/dist/contracts/reference-inventory.d.ts.map +1 -1
  71. package/dist/contracts/reference-inventory.js +0 -1
  72. package/dist/hooks/spatial-grid/spatial-grid-manager.d.ts +6 -1
  73. package/dist/hooks/spatial-grid/spatial-grid-manager.d.ts.map +1 -1
  74. package/dist/hooks/spatial-grid/spatial-grid-manager.js +30 -9
  75. package/dist/hooks/spatial-grid/spatial-grid-sync.d.ts +2101 -2100
  76. package/dist/hooks/spatial-grid/spatial-grid-sync.d.ts.map +1 -1
  77. package/dist/hooks/spatial-grid/spatial-grid-sync.js +8 -4
  78. package/dist/index.d.ts +13 -4
  79. package/dist/index.d.ts.map +1 -1
  80. package/dist/index.js +13 -4
  81. package/dist/lib/__fixtures__/mezzanine.d.ts +6428 -6424
  82. package/dist/lib/__fixtures__/mezzanine.d.ts.map +1 -1
  83. package/dist/lib/absorb-wall-separators.d.ts +2267 -2266
  84. package/dist/lib/absorb-wall-separators.d.ts.map +1 -1
  85. package/dist/lib/asset-storage.d.ts.map +1 -1
  86. package/dist/lib/asset-storage.js +3 -0
  87. package/dist/lib/build-mode.d.ts +11 -0
  88. package/dist/lib/build-mode.d.ts.map +1 -0
  89. package/dist/lib/build-mode.js +24 -0
  90. package/dist/lib/corner-pair.d.ts +2 -0
  91. package/dist/lib/corner-pair.d.ts.map +1 -1
  92. package/dist/lib/door-interaction.d.ts +14 -0
  93. package/dist/lib/door-interaction.d.ts.map +1 -0
  94. package/dist/lib/door-interaction.js +62 -0
  95. package/dist/lib/elevator-support.d.ts +15 -0
  96. package/dist/lib/elevator-support.d.ts.map +1 -0
  97. package/dist/lib/elevator-support.js +40 -0
  98. package/dist/lib/floor-foundation-datum.d.ts.map +1 -1
  99. package/dist/lib/floor-foundation-datum.js +5 -1
  100. package/dist/lib/floor-intent-changes.d.ts.map +1 -1
  101. package/dist/lib/floor-intent-changes.js +6 -4
  102. package/dist/lib/floorplan/context.d.ts +95 -0
  103. package/dist/lib/floorplan/context.d.ts.map +1 -0
  104. package/dist/lib/floorplan/context.js +155 -0
  105. package/dist/lib/floorplan/index.d.ts +6 -0
  106. package/dist/lib/floorplan/index.d.ts.map +1 -0
  107. package/dist/lib/floorplan/index.js +5 -0
  108. package/dist/lib/floorplan/marks.d.ts +71 -0
  109. package/dist/lib/floorplan/marks.d.ts.map +1 -0
  110. package/dist/lib/floorplan/marks.js +157 -0
  111. package/dist/lib/floorplan/plan-math.d.ts +18 -0
  112. package/dist/lib/floorplan/plan-math.d.ts.map +1 -0
  113. package/dist/lib/floorplan/plan-math.js +82 -0
  114. package/dist/lib/floorplan/svg-paths.d.ts +17 -0
  115. package/dist/lib/floorplan/svg-paths.d.ts.map +1 -0
  116. package/dist/lib/floorplan/svg-paths.js +92 -0
  117. package/dist/lib/floorplan/wall-affordances.d.ts +31 -0
  118. package/dist/lib/floorplan/wall-affordances.d.ts.map +1 -0
  119. package/dist/lib/floorplan/wall-affordances.js +24 -0
  120. package/dist/lib/hierarchy.d.ts +19 -0
  121. package/dist/lib/hierarchy.d.ts.map +1 -0
  122. package/dist/lib/hierarchy.js +53 -0
  123. package/dist/lib/opening-floor-datum.d.ts +1 -1
  124. package/dist/lib/opening-floor-datum.d.ts.map +1 -1
  125. package/dist/lib/opening-floor-datum.js +2 -2
  126. package/dist/lib/own-floor-intent.d.ts.map +1 -1
  127. package/dist/lib/own-floor-intent.js +2 -2
  128. package/dist/lib/polygon-boolean.d.ts.map +1 -1
  129. package/dist/lib/polygon-boolean.js +2 -1
  130. package/dist/lib/room-floor-elevation.d.ts +12 -0
  131. package/dist/lib/room-floor-elevation.d.ts.map +1 -0
  132. package/dist/lib/room-floor-elevation.js +41 -0
  133. package/dist/lib/room-floor-feasibility.d.ts.map +1 -1
  134. package/dist/lib/room-floor-feasibility.js +1 -1
  135. package/dist/lib/space-detection.d.ts.map +1 -1
  136. package/dist/lib/space-detection.js +1 -0
  137. package/dist/lib/wall-face-script.d.ts.map +1 -1
  138. package/dist/lib/wall-face-script.js +3 -3
  139. package/dist/lib/window-interaction.d.ts +16 -0
  140. package/dist/lib/window-interaction.d.ts.map +1 -0
  141. package/dist/lib/window-interaction.js +82 -0
  142. package/dist/lib/zone-quantities.js +1 -1
  143. package/dist/node-slots/column.d.ts +5 -0
  144. package/dist/node-slots/column.d.ts.map +1 -1
  145. package/dist/node-slots/column.js +10 -0
  146. package/dist/registry/__fixtures__/roof-planes.d.ts +69 -0
  147. package/dist/registry/__fixtures__/roof-planes.d.ts.map +1 -0
  148. package/dist/registry/__fixtures__/roof-planes.js +59 -0
  149. package/dist/registry/index.d.ts +3 -2
  150. package/dist/registry/index.d.ts.map +1 -1
  151. package/dist/registry/index.js +2 -1
  152. package/dist/registry/registry.d.ts +5 -0
  153. package/dist/registry/registry.d.ts.map +1 -1
  154. package/dist/registry/registry.js +10 -0
  155. package/dist/registry/roofs.d.ts +34 -0
  156. package/dist/registry/roofs.d.ts.map +1 -0
  157. package/dist/registry/roofs.js +61 -0
  158. package/dist/registry/types.d.ts +54 -0
  159. package/dist/registry/types.d.ts.map +1 -1
  160. package/dist/registry/validate-relations.d.ts +5 -1
  161. package/dist/registry/validate-relations.d.ts.map +1 -1
  162. package/dist/registry/validate-relations.js +6 -2
  163. package/dist/schema/asset-url.d.ts +8 -0
  164. package/dist/schema/asset-url.d.ts.map +1 -1
  165. package/dist/schema/asset-url.js +17 -0
  166. package/dist/schema/index.d.ts +1 -1
  167. package/dist/schema/index.d.ts.map +1 -1
  168. package/dist/schema/index.js +1 -1
  169. package/dist/schema/nodes/roof-segment-resize.d.ts.map +1 -1
  170. package/dist/schema/nodes/roof-segment-resize.js +2 -2
  171. package/dist/schema/nodes/roof-segment.d.ts +2 -0
  172. package/dist/schema/nodes/roof-segment.d.ts.map +1 -1
  173. package/dist/schema/nodes/roof-segment.js +40 -2
  174. package/dist/schema/nodes/roof.d.ts +1 -1
  175. package/dist/schema/nodes/roof.d.ts.map +1 -1
  176. package/dist/schema/nodes/roof.js +13 -8
  177. package/dist/schema/nodes/wall.d.ts +1 -0
  178. package/dist/schema/nodes/wall.d.ts.map +1 -1
  179. package/dist/schema/nodes/wall.js +6 -0
  180. package/dist/schema/types.d.ts +2 -1
  181. package/dist/schema/types.d.ts.map +1 -1
  182. package/dist/services/index.d.ts +1 -1
  183. package/dist/services/index.d.ts.map +1 -1
  184. package/dist/services/index.js +1 -1
  185. package/dist/services/movement.d.ts +7 -0
  186. package/dist/services/movement.d.ts.map +1 -1
  187. package/dist/services/movement.js +13 -0
  188. package/dist/services/port-connectivity.d.ts +15 -6
  189. package/dist/services/port-connectivity.d.ts.map +1 -1
  190. package/dist/services/port-connectivity.js +83 -17
  191. package/dist/services/roof-bearing.js +2 -1
  192. package/dist/services/roof-level.d.ts.map +1 -1
  193. package/dist/services/roof-level.js +12 -2
  194. package/dist/services/roof-move.d.ts +4 -2
  195. package/dist/services/roof-move.d.ts.map +1 -1
  196. package/dist/services/roof-move.js +21 -9
  197. package/dist/services/storey.d.ts +6 -1
  198. package/dist/services/storey.d.ts.map +1 -1
  199. package/dist/services/storey.js +11 -2
  200. package/dist/spatial/usage-field/findings.d.ts +7 -1
  201. package/dist/spatial/usage-field/findings.d.ts.map +1 -1
  202. package/dist/spatial/usage-field/findings.js +42 -10
  203. package/dist/spatial/usage-field/path.d.ts.map +1 -1
  204. package/dist/spatial/usage-field/path.js +28 -18
  205. package/dist/spatial/usage-field/swings.d.ts +1 -0
  206. package/dist/spatial/usage-field/swings.d.ts.map +1 -1
  207. package/dist/spatial/usage-field/walls.d.ts +2 -0
  208. package/dist/spatial/usage-field/walls.d.ts.map +1 -1
  209. package/dist/spatial/usage-field/walls.js +18 -4
  210. package/dist/store/actions/node-actions.d.ts +2 -1
  211. package/dist/store/actions/node-actions.d.ts.map +1 -1
  212. package/dist/store/actions/node-actions.js +23 -5
  213. package/dist/store/derived-node-guard.d.ts.map +1 -1
  214. package/dist/store/derived-node-guard.js +2 -1
  215. package/dist/store/scene-annotations.d.ts +4634 -4632
  216. package/dist/store/scene-annotations.d.ts.map +1 -1
  217. package/dist/systems/document-reconcile.d.ts.map +1 -1
  218. package/dist/systems/document-reconcile.js +1 -2
  219. package/dist/systems/elevator/elevator-geometry.d.ts +25 -0
  220. package/dist/systems/elevator/elevator-geometry.d.ts.map +1 -1
  221. package/dist/systems/elevator/elevator-geometry.js +40 -8
  222. package/dist/systems/elevator/elevator-opening-sync.d.ts.map +1 -1
  223. package/dist/systems/elevator/elevator-opening-sync.js +4 -35
  224. package/dist/systems/elevator/elevator-runtime.d.ts.map +1 -1
  225. package/dist/systems/elevator/elevator-runtime.js +95 -18
  226. package/dist/systems/elevator/elevator-service.d.ts.map +1 -1
  227. package/dist/systems/elevator/elevator-service.js +24 -4
  228. package/dist/systems/roof/roof-elevation.d.ts +11 -6
  229. package/dist/systems/roof/roof-elevation.d.ts.map +1 -1
  230. package/dist/systems/roof/roof-elevation.js +26 -12
  231. package/dist/systems/slab/__fixtures__/floor-step.d.ts +5 -1
  232. package/dist/systems/slab/__fixtures__/floor-step.d.ts.map +1 -1
  233. package/dist/systems/slab/__fixtures__/raised-room.d.ts +2218 -2214
  234. package/dist/systems/slab/__fixtures__/raised-room.d.ts.map +1 -1
  235. package/dist/systems/stair/stair-opening-preview.d.ts +3203 -3202
  236. package/dist/systems/stair/stair-opening-preview.d.ts.map +1 -1
  237. package/dist/systems/wall/wall-curve.d.ts +10 -0
  238. package/dist/systems/wall/wall-curve.d.ts.map +1 -1
  239. package/dist/systems/wall/wall-curve.js +38 -0
  240. package/dist/systems/wall/wall-frame.d.ts.map +1 -1
  241. package/dist/systems/wall/wall-frame.js +8 -0
  242. package/dist/systems/wall/wall-merge.d.ts +9 -1
  243. package/dist/systems/wall/wall-merge.d.ts.map +1 -1
  244. package/dist/systems/wall/wall-merge.js +38 -6
  245. package/dist/systems/wall/wall-top.d.ts +10 -3
  246. package/dist/systems/wall/wall-top.d.ts.map +1 -1
  247. package/dist/systems/wall/wall-top.js +24 -8
  248. package/dist/systems/wall/wall-topology.d.ts.map +1 -1
  249. package/dist/systems/wall/wall-topology.js +19 -1
  250. package/dist/utils/ensure-scene-openings.d.ts +5595 -5593
  251. package/dist/utils/ensure-scene-openings.d.ts.map +1 -1
  252. package/dist/utils/floor-plate-migration.d.ts +2267 -2266
  253. package/dist/utils/floor-plate-migration.d.ts.map +1 -1
  254. package/dist/utils/measurement-format.d.ts +27 -0
  255. package/dist/utils/measurement-format.d.ts.map +1 -0
  256. package/dist/utils/measurement-format.js +143 -0
  257. package/dist/utils/owned-floor-opening-migration.d.ts +653 -652
  258. package/dist/utils/owned-floor-opening-migration.d.ts.map +1 -1
  259. package/dist/utils/reconcile-structure-on-load.d.ts +1724 -1723
  260. package/dist/utils/reconcile-structure-on-load.d.ts.map +1 -1
  261. package/dist/utils/scene-bounds.d.ts +32 -0
  262. package/dist/utils/scene-bounds.d.ts.map +1 -0
  263. package/dist/utils/scene-bounds.js +201 -0
  264. package/dist/validation/validate-build-json.d.ts.map +1 -1
  265. package/dist/validation/validate-build-json.js +3 -1
  266. package/package.json +1 -1
@@ -698,39 +698,172 @@ export declare function markSlabChangeDependents(previous: SlabNode, next: SlabN
698
698
  fromIds: string[];
699
699
  } | undefined;
700
700
  } | undefined;
701
- id: `separator_${string}`;
702
- start: [number, number];
703
- end: [number, number];
704
- type: "separator";
705
- } | {
706
- object: "node";
707
- name?: string | undefined;
708
- parentId: string | null;
709
- visible: boolean;
710
- camera?: {
711
- position: [number, number, number];
712
- target: [number, number, number];
713
- mode: "orthographic" | "perspective";
714
- fov?: number | undefined;
715
- zoom?: number | undefined;
701
+ id: `roof_${string}`;
702
+ material?: {
703
+ id?: string | undefined;
704
+ preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
705
+ properties?: {
706
+ color: string;
707
+ roughness: number;
708
+ metalness: number;
709
+ opacity: number;
710
+ transparent: boolean;
711
+ side: "back" | "double" | "front";
712
+ } | undefined;
713
+ texture?: {
714
+ url: string;
715
+ repeat?: [number, number] | undefined;
716
+ scale?: number | undefined;
717
+ offset?: [number, number] | undefined;
718
+ normalMap?: string | undefined;
719
+ normalScale?: number | undefined;
720
+ bumpMap?: string | undefined;
721
+ bumpScale?: number | undefined;
722
+ } | undefined;
716
723
  } | undefined;
717
- metadata: Record<string, unknown>;
718
- provenance?: {
719
- refs: {
720
- ns?: string | undefined;
721
- id: string;
722
- role?: "absorbed" | "alias" | "derived" | "piece" | "primary" | undefined;
723
- }[];
724
- lineage?: {
725
- op: "attach" | "convert" | "duplicate" | "import" | "make-independent" | "merge" | "promote" | "split";
726
- fromIds: string[];
724
+ materialPreset?: string | undefined;
725
+ topMaterial?: {
726
+ id?: string | undefined;
727
+ preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
728
+ properties?: {
729
+ color: string;
730
+ roughness: number;
731
+ metalness: number;
732
+ opacity: number;
733
+ transparent: boolean;
734
+ side: "back" | "double" | "front";
735
+ } | undefined;
736
+ texture?: {
737
+ url: string;
738
+ repeat?: [number, number] | undefined;
739
+ scale?: number | undefined;
740
+ offset?: [number, number] | undefined;
741
+ normalMap?: string | undefined;
742
+ normalScale?: number | undefined;
743
+ bumpMap?: string | undefined;
744
+ bumpScale?: number | undefined;
727
745
  } | undefined;
728
746
  } | undefined;
729
- id: `spawn_${string}`;
747
+ topMaterialPreset?: string | undefined;
748
+ edgeMaterial?: {
749
+ id?: string | undefined;
750
+ preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
751
+ properties?: {
752
+ color: string;
753
+ roughness: number;
754
+ metalness: number;
755
+ opacity: number;
756
+ transparent: boolean;
757
+ side: "back" | "double" | "front";
758
+ } | undefined;
759
+ texture?: {
760
+ url: string;
761
+ repeat?: [number, number] | undefined;
762
+ scale?: number | undefined;
763
+ offset?: [number, number] | undefined;
764
+ normalMap?: string | undefined;
765
+ normalScale?: number | undefined;
766
+ bumpMap?: string | undefined;
767
+ bumpScale?: number | undefined;
768
+ } | undefined;
769
+ } | undefined;
770
+ edgeMaterialPreset?: string | undefined;
771
+ wallMaterial?: {
772
+ id?: string | undefined;
773
+ preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
774
+ properties?: {
775
+ color: string;
776
+ roughness: number;
777
+ metalness: number;
778
+ opacity: number;
779
+ transparent: boolean;
780
+ side: "back" | "double" | "front";
781
+ } | undefined;
782
+ texture?: {
783
+ url: string;
784
+ repeat?: [number, number] | undefined;
785
+ scale?: number | undefined;
786
+ offset?: [number, number] | undefined;
787
+ normalMap?: string | undefined;
788
+ normalScale?: number | undefined;
789
+ bumpMap?: string | undefined;
790
+ bumpScale?: number | undefined;
791
+ } | undefined;
792
+ } | undefined;
793
+ wallMaterialPreset?: string | undefined;
794
+ heelMaterial?: {
795
+ id?: string | undefined;
796
+ preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
797
+ properties?: {
798
+ color: string;
799
+ roughness: number;
800
+ metalness: number;
801
+ opacity: number;
802
+ transparent: boolean;
803
+ side: "back" | "double" | "front";
804
+ } | undefined;
805
+ texture?: {
806
+ url: string;
807
+ repeat?: [number, number] | undefined;
808
+ scale?: number | undefined;
809
+ offset?: [number, number] | undefined;
810
+ normalMap?: string | undefined;
811
+ normalScale?: number | undefined;
812
+ bumpMap?: string | undefined;
813
+ bumpScale?: number | undefined;
814
+ } | undefined;
815
+ } | undefined;
816
+ heelMaterialPreset?: string | undefined;
730
817
  position: [number, number, number];
731
818
  rotation: number;
732
- supportSlabId?: string | undefined;
733
- type: "spawn";
819
+ support: {
820
+ kind: "level";
821
+ } | {
822
+ kind: "walls";
823
+ } | {
824
+ kind: "roof";
825
+ roofSegmentId: `rseg_${string}`;
826
+ localPosition: [number, number];
827
+ curbHeight: number;
828
+ };
829
+ assembly?: {
830
+ layers: {
831
+ id: string;
832
+ role: "air" | "covering" | "deck" | "fill" | "finish" | "furring" | "glazing" | "insulation" | "lining" | "membrane" | "sheathing" | "shell" | "structure" | "substrate" | "underlay";
833
+ thickness: number;
834
+ core?: true | undefined;
835
+ spacing?: number | undefined;
836
+ material?: string | undefined;
837
+ slot?: string | undefined;
838
+ returns?: boolean | undefined;
839
+ display?: "construction" | "finished" | undefined;
840
+ inset?: number | undefined;
841
+ bottom?: number | undefined;
842
+ lift?: number | undefined;
843
+ src?: string | undefined;
844
+ }[];
845
+ backing?: {
846
+ id: string;
847
+ role: "air" | "covering" | "deck" | "fill" | "finish" | "furring" | "glazing" | "insulation" | "lining" | "membrane" | "sheathing" | "shell" | "structure" | "substrate" | "underlay";
848
+ thickness: number;
849
+ core?: true | undefined;
850
+ spacing?: number | undefined;
851
+ material?: string | undefined;
852
+ slot?: string | undefined;
853
+ returns?: boolean | undefined;
854
+ display?: "construction" | "finished" | undefined;
855
+ inset?: number | undefined;
856
+ bottom?: number | undefined;
857
+ lift?: number | undefined;
858
+ src?: string | undefined;
859
+ }[] | undefined;
860
+ face?: "exterior" | "front" | undefined;
861
+ presetId?: string | undefined;
862
+ cavityInsulation?: string | undefined;
863
+ } | undefined;
864
+ slots?: Record<string, string> | undefined;
865
+ children: string[];
866
+ type: "roof";
734
867
  } | {
735
868
  object: "node";
736
869
  name?: string | undefined;
@@ -755,7 +888,22 @@ export declare function markSlabChangeDependents(previous: SlabNode, next: SlabN
755
888
  fromIds: string[];
756
889
  } | undefined;
757
890
  } | undefined;
758
- id: `sseg_${string}`;
891
+ id: `shelf_${string}`;
892
+ children: string[];
893
+ position: [number, number, number];
894
+ rotation: [number, number, number];
895
+ supportSlabId?: string | undefined;
896
+ width: number;
897
+ depth: number;
898
+ thickness: number;
899
+ height: number;
900
+ style: "bookshelf" | "cubby" | "open-rack" | "wall-shelf";
901
+ rows: number;
902
+ columns: number;
903
+ withBack: boolean;
904
+ withSides: boolean;
905
+ withBottom: boolean;
906
+ bracketStyle: "hidden" | "industrial" | "minimal";
759
907
  material?: {
760
908
  id?: string | undefined;
761
909
  preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
@@ -780,34 +928,7 @@ export declare function markSlabChangeDependents(previous: SlabNode, next: SlabN
780
928
  } | undefined;
781
929
  materialPreset?: string | undefined;
782
930
  slots?: Record<string, string> | undefined;
783
- position: [number, number, number];
784
- rotation: number;
785
- segmentType: "landing" | "stair";
786
- width: number;
787
- length: number;
788
- height: number;
789
- stepCount: number;
790
- attachmentSide: "front" | "left" | "right";
791
- fillToFloor: boolean;
792
- construction?: {
793
- mode: "center-stringer" | "open" | "side-stringers" | "solid" | "waist";
794
- waistThickness: number;
795
- treadThickness: number;
796
- riserThickness: number;
797
- nosing: number;
798
- finishThickness: number;
799
- closedRisers: boolean;
800
- stringerWidth: number;
801
- stringerDepth: number;
802
- } | undefined;
803
- winder?: {
804
- turn: "left" | "right";
805
- innerGap: number;
806
- walkingLineOffset: number;
807
- division: "equal-angle" | "equal-going";
808
- } | undefined;
809
- thickness: number;
810
- type: "stair-segment";
931
+ type: "shelf";
811
932
  } | {
812
933
  object: "node";
813
934
  name?: string | undefined;
@@ -832,7 +953,7 @@ export declare function markSlabChangeDependents(previous: SlabNode, next: SlabN
832
953
  fromIds: string[];
833
954
  } | undefined;
834
955
  } | undefined;
835
- id: `window_${string}`;
956
+ id: `door_${string}`;
836
957
  material?: {
837
958
  id?: string | undefined;
838
959
  preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
@@ -976,12 +1097,14 @@ export declare function markSlabChangeDependents(previous: SlabNode, next: SlabN
976
1097
  verticalAnchor?: "floor" | "wall" | undefined;
977
1098
  floorThresholdVersion: 0 | 1;
978
1099
  wallId?: string | undefined;
979
- dormerId?: string | undefined;
980
- dormerFace?: "back" | "front" | "left" | "right" | undefined;
981
1100
  roofSegmentId?: string | undefined;
982
1101
  roofFace?: "back" | "front" | "left" | "right" | undefined;
983
1102
  width: number;
984
1103
  height: number;
1104
+ sidelightLeft?: number | undefined;
1105
+ sidelightRight?: number | undefined;
1106
+ transomHeight?: number | undefined;
1107
+ slidingStyle?: "bypass" | "patio" | undefined;
985
1108
  mark?: string | undefined;
986
1109
  constructionType: "framed" | "masonry";
987
1110
  dimensionReference: "finish-opening" | "masonry-opening" | "nominal" | "rough-opening";
@@ -991,52 +1114,49 @@ export declare function markSlabChangeDependents(previous: SlabNode, next: SlabN
991
1114
  masonryOpeningHeight?: number | undefined;
992
1115
  finishOpeningWidth?: number | undefined;
993
1116
  finishOpeningHeight?: number | undefined;
994
- openingKind: "opening" | "window";
995
- windowType: "awning" | "bay" | "bow" | "casement" | "double-hung" | "fixed" | "hopper" | "louvered" | "single-hung" | "sliding" | "tilt-turn";
1117
+ doorCategory: "garage" | "interior";
1118
+ doorType: "barn" | "double" | "folding" | "french" | "garage-rollup" | "garage-sectional" | "garage-tiltup" | "hinged" | "pocket" | "sliding";
1119
+ leafCount: 1 | 2 | 3 | 4 | 6 | 8;
996
1120
  operationState: number;
997
- openingDirection?: "inward" | "outward" | undefined;
998
- tiltTurnMode?: "tilt" | "turn" | undefined;
999
- awningDirection: "down" | "up";
1000
- casementStyle: "french" | "single";
1001
- hingesSide: "left" | "right";
1002
- openingShape: "arch" | "rectangle" | "rounded";
1003
- openingRadiusMode: "all" | "individual";
1004
- openingCornerRadii: [number, number, number, number];
1121
+ slideDirection: "left" | "right";
1122
+ trackStyle: "none" | "overhead" | "pocket" | "visible";
1123
+ garagePanelCount: number;
1124
+ openingKind: "door" | "opening";
1125
+ openingShape: "arch" | "rectangle" | "rounded";
1126
+ openingRadiusMode: "all" | "individual";
1127
+ openingTopRadii: [number, number];
1005
1128
  cornerRadius: number;
1006
1129
  archHeight: number;
1007
1130
  openingRevealRadius: number;
1008
1131
  frameThickness: number;
1009
1132
  frameDepth?: number | undefined;
1010
- windowHandle?: boolean | undefined;
1011
- sashGrid?: boolean | undefined;
1012
- columnRatios: number[];
1013
- rowRatios: number[];
1014
- columnDividerThickness: number;
1015
- rowDividerThickness: number;
1016
- corner?: {
1017
- end: "end" | "start";
1018
- partnerId: string;
1019
- post: "none" | "post";
1020
- } | undefined;
1021
- sill: boolean;
1022
- sillDepth: number;
1023
- sillThickness: number;
1024
- sillOverhang?: number | undefined;
1025
- sillInterior?: boolean | undefined;
1026
- sillInteriorDepth?: number | undefined;
1027
- sillInteriorThickness?: number | undefined;
1028
- sillInteriorOverhang?: number | undefined;
1029
- shutters?: "board-batten" | "louvered" | "none" | "panel" | undefined;
1030
- shutterWidth?: number | undefined;
1031
- shutterOpen?: number | undefined;
1032
- shutterSides?: "both" | "left" | "right" | undefined;
1033
- rollerShutter?: "box" | "concealed" | "none" | undefined;
1034
- rollerShutterBoxHeight?: number | undefined;
1035
- rollerShutterOpen?: number | undefined;
1133
+ threshold: boolean;
1134
+ thresholdHeight: number;
1036
1135
  casingFaceA?: boolean | undefined;
1037
1136
  casingFaceB?: boolean | undefined;
1038
1137
  casingWidth?: number | undefined;
1039
- type: "window";
1138
+ hingesSide: "left" | "right";
1139
+ swingDirection: "inward" | "outward";
1140
+ swingAngle: number;
1141
+ segments: {
1142
+ type: "empty" | "glass" | "panel";
1143
+ heightRatio: number;
1144
+ columnRatios: number[];
1145
+ dividerThickness: number;
1146
+ panelDepth: number;
1147
+ panelInset: number;
1148
+ }[];
1149
+ handle: boolean;
1150
+ handleStyle?: "bar" | "knob" | "lever" | "lever-curved" | "plate" | undefined;
1151
+ handleHeight: number;
1152
+ handleSide: "left" | "right";
1153
+ contentPadding: [number, number];
1154
+ doorCloser: boolean;
1155
+ panicBar: boolean;
1156
+ panicBarStyle: "crossbar" | "touchbar";
1157
+ panicBarRods: boolean;
1158
+ panicBarHeight: number;
1159
+ type: "door";
1040
1160
  } | {
1041
1161
  object: "node";
1042
1162
  name?: string | undefined;
@@ -1284,7 +1404,7 @@ export declare function markSlabChangeDependents(previous: SlabNode, next: SlabN
1284
1404
  fromIds: string[];
1285
1405
  } | undefined;
1286
1406
  } | undefined;
1287
- id: `door_${string}`;
1407
+ id: `window_${string}`;
1288
1408
  material?: {
1289
1409
  id?: string | undefined;
1290
1410
  preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
@@ -1428,14 +1548,12 @@ export declare function markSlabChangeDependents(previous: SlabNode, next: SlabN
1428
1548
  verticalAnchor?: "floor" | "wall" | undefined;
1429
1549
  floorThresholdVersion: 0 | 1;
1430
1550
  wallId?: string | undefined;
1551
+ dormerId?: string | undefined;
1552
+ dormerFace?: "back" | "front" | "left" | "right" | undefined;
1431
1553
  roofSegmentId?: string | undefined;
1432
1554
  roofFace?: "back" | "front" | "left" | "right" | undefined;
1433
1555
  width: number;
1434
1556
  height: number;
1435
- sidelightLeft?: number | undefined;
1436
- sidelightRight?: number | undefined;
1437
- transomHeight?: number | undefined;
1438
- slidingStyle?: "bypass" | "patio" | undefined;
1439
1557
  mark?: string | undefined;
1440
1558
  constructionType: "framed" | "masonry";
1441
1559
  dimensionReference: "finish-opening" | "masonry-opening" | "nominal" | "rough-opening";
@@ -1445,49 +1563,52 @@ export declare function markSlabChangeDependents(previous: SlabNode, next: SlabN
1445
1563
  masonryOpeningHeight?: number | undefined;
1446
1564
  finishOpeningWidth?: number | undefined;
1447
1565
  finishOpeningHeight?: number | undefined;
1448
- doorCategory: "garage" | "interior";
1449
- doorType: "barn" | "double" | "folding" | "french" | "garage-rollup" | "garage-sectional" | "garage-tiltup" | "hinged" | "pocket" | "sliding";
1450
- leafCount: 1 | 2 | 3 | 4 | 6 | 8;
1566
+ openingKind: "opening" | "window";
1567
+ windowType: "awning" | "bay" | "bow" | "casement" | "double-hung" | "fixed" | "hopper" | "louvered" | "single-hung" | "sliding" | "tilt-turn";
1451
1568
  operationState: number;
1452
- slideDirection: "left" | "right";
1453
- trackStyle: "none" | "overhead" | "pocket" | "visible";
1454
- garagePanelCount: number;
1455
- openingKind: "door" | "opening";
1569
+ openingDirection?: "inward" | "outward" | undefined;
1570
+ tiltTurnMode?: "tilt" | "turn" | undefined;
1571
+ awningDirection: "down" | "up";
1572
+ casementStyle: "french" | "single";
1573
+ hingesSide: "left" | "right";
1456
1574
  openingShape: "arch" | "rectangle" | "rounded";
1457
1575
  openingRadiusMode: "all" | "individual";
1458
- openingTopRadii: [number, number];
1576
+ openingCornerRadii: [number, number, number, number];
1459
1577
  cornerRadius: number;
1460
1578
  archHeight: number;
1461
1579
  openingRevealRadius: number;
1462
1580
  frameThickness: number;
1463
1581
  frameDepth?: number | undefined;
1464
- threshold: boolean;
1465
- thresholdHeight: number;
1582
+ windowHandle?: boolean | undefined;
1583
+ sashGrid?: boolean | undefined;
1584
+ columnRatios: number[];
1585
+ rowRatios: number[];
1586
+ columnDividerThickness: number;
1587
+ rowDividerThickness: number;
1588
+ corner?: {
1589
+ end: "end" | "start";
1590
+ partnerId: string;
1591
+ post: "none" | "post";
1592
+ } | undefined;
1593
+ sill: boolean;
1594
+ sillDepth: number;
1595
+ sillThickness: number;
1596
+ sillOverhang?: number | undefined;
1597
+ sillInterior?: boolean | undefined;
1598
+ sillInteriorDepth?: number | undefined;
1599
+ sillInteriorThickness?: number | undefined;
1600
+ sillInteriorOverhang?: number | undefined;
1601
+ shutters?: "board-batten" | "louvered" | "none" | "panel" | undefined;
1602
+ shutterWidth?: number | undefined;
1603
+ shutterOpen?: number | undefined;
1604
+ shutterSides?: "both" | "left" | "right" | undefined;
1605
+ rollerShutter?: "box" | "concealed" | "none" | undefined;
1606
+ rollerShutterBoxHeight?: number | undefined;
1607
+ rollerShutterOpen?: number | undefined;
1466
1608
  casingFaceA?: boolean | undefined;
1467
1609
  casingFaceB?: boolean | undefined;
1468
1610
  casingWidth?: number | undefined;
1469
- hingesSide: "left" | "right";
1470
- swingDirection: "inward" | "outward";
1471
- swingAngle: number;
1472
- segments: {
1473
- type: "empty" | "glass" | "panel";
1474
- heightRatio: number;
1475
- columnRatios: number[];
1476
- dividerThickness: number;
1477
- panelDepth: number;
1478
- panelInset: number;
1479
- }[];
1480
- handle: boolean;
1481
- handleStyle?: "bar" | "knob" | "lever" | "lever-curved" | "plate" | undefined;
1482
- handleHeight: number;
1483
- handleSide: "left" | "right";
1484
- contentPadding: [number, number];
1485
- doorCloser: boolean;
1486
- panicBar: boolean;
1487
- panicBarStyle: "crossbar" | "touchbar";
1488
- panicBarRods: boolean;
1489
- panicBarHeight: number;
1490
- type: "door";
1611
+ type: "window";
1491
1612
  } | {
1492
1613
  object: "node";
1493
1614
  name?: string | undefined;
@@ -1753,7 +1874,7 @@ export declare function markSlabChangeDependents(previous: SlabNode, next: SlabN
1753
1874
  fromIds: string[];
1754
1875
  } | undefined;
1755
1876
  } | undefined;
1756
- id: `roof_${string}`;
1877
+ id: `slab_${string}`;
1757
1878
  material?: {
1758
1879
  id?: string | undefined;
1759
1880
  preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
@@ -1777,254 +1898,64 @@ export declare function markSlabChangeDependents(previous: SlabNode, next: SlabN
1777
1898
  } | undefined;
1778
1899
  } | undefined;
1779
1900
  materialPreset?: string | undefined;
1780
- topMaterial?: {
1781
- id?: string | undefined;
1782
- preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
1783
- properties?: {
1784
- color: string;
1785
- roughness: number;
1786
- metalness: number;
1787
- opacity: number;
1788
- transparent: boolean;
1789
- side: "back" | "double" | "front";
1790
- } | undefined;
1791
- texture?: {
1792
- url: string;
1793
- repeat?: [number, number] | undefined;
1794
- scale?: number | undefined;
1795
- offset?: [number, number] | undefined;
1796
- normalMap?: string | undefined;
1797
- normalScale?: number | undefined;
1798
- bumpMap?: string | undefined;
1799
- bumpScale?: number | undefined;
1800
- } | undefined;
1801
- } | undefined;
1802
- topMaterialPreset?: string | undefined;
1803
- edgeMaterial?: {
1804
- id?: string | undefined;
1805
- preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
1806
- properties?: {
1807
- color: string;
1808
- roughness: number;
1809
- metalness: number;
1810
- opacity: number;
1811
- transparent: boolean;
1812
- side: "back" | "double" | "front";
1813
- } | undefined;
1814
- texture?: {
1815
- url: string;
1816
- repeat?: [number, number] | undefined;
1817
- scale?: number | undefined;
1818
- offset?: [number, number] | undefined;
1819
- normalMap?: string | undefined;
1820
- normalScale?: number | undefined;
1821
- bumpMap?: string | undefined;
1822
- bumpScale?: number | undefined;
1901
+ slots?: Record<string, string> | undefined;
1902
+ polygon: [number, number][];
1903
+ holes: [number, number][][];
1904
+ holeMetadata: {
1905
+ source: "elevator" | "floor-opening" | "manual" | "room" | "stair";
1906
+ openingId?: string | undefined;
1907
+ stairId?: string | undefined;
1908
+ elevatorId?: string | undefined;
1909
+ }[];
1910
+ elevation: number;
1911
+ floorHeight?: number | undefined;
1912
+ referenceFloorElevation?: number | undefined;
1913
+ foundation?: {
1914
+ type: "none" | "solid";
1915
+ material?: string | {
1916
+ id?: string | undefined;
1917
+ preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
1918
+ properties?: {
1919
+ color: string;
1920
+ roughness: number;
1921
+ metalness: number;
1922
+ opacity: number;
1923
+ transparent: boolean;
1924
+ side: "back" | "double" | "front";
1925
+ } | undefined;
1926
+ texture?: {
1927
+ url: string;
1928
+ repeat?: [number, number] | undefined;
1929
+ scale?: number | undefined;
1930
+ offset?: [number, number] | undefined;
1931
+ normalMap?: string | undefined;
1932
+ normalScale?: number | undefined;
1933
+ bumpMap?: string | undefined;
1934
+ bumpScale?: number | undefined;
1935
+ } | undefined;
1823
1936
  } | undefined;
1824
1937
  } | undefined;
1825
- edgeMaterialPreset?: string | undefined;
1826
- wallMaterial?: {
1827
- id?: string | undefined;
1828
- preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
1829
- properties?: {
1830
- color: string;
1831
- roughness: number;
1832
- metalness: number;
1833
- opacity: number;
1834
- transparent: boolean;
1835
- side: "back" | "double" | "front";
1836
- } | undefined;
1837
- texture?: {
1838
- url: string;
1839
- repeat?: [number, number] | undefined;
1840
- scale?: number | undefined;
1841
- offset?: [number, number] | undefined;
1842
- normalMap?: string | undefined;
1843
- normalScale?: number | undefined;
1844
- bumpMap?: string | undefined;
1845
- bumpScale?: number | undefined;
1846
- } | undefined;
1847
- } | undefined;
1848
- wallMaterialPreset?: string | undefined;
1849
- heelMaterial?: {
1850
- id?: string | undefined;
1851
- preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
1852
- properties?: {
1853
- color: string;
1854
- roughness: number;
1855
- metalness: number;
1856
- opacity: number;
1857
- transparent: boolean;
1858
- side: "back" | "double" | "front";
1859
- } | undefined;
1860
- texture?: {
1861
- url: string;
1862
- repeat?: [number, number] | undefined;
1863
- scale?: number | undefined;
1864
- offset?: [number, number] | undefined;
1865
- normalMap?: string | undefined;
1866
- normalScale?: number | undefined;
1867
- bumpMap?: string | undefined;
1868
- bumpScale?: number | undefined;
1869
- } | undefined;
1870
- } | undefined;
1871
- heelMaterialPreset?: string | undefined;
1872
- position: [number, number, number];
1873
- rotation: number;
1874
- support: {
1875
- kind: "level";
1876
- } | {
1877
- kind: "walls";
1878
- } | {
1879
- kind: "roof";
1880
- roofSegmentId: `rseg_${string}`;
1881
- localPosition: [number, number];
1882
- curbHeight: number;
1883
- };
1884
- assembly?: {
1885
- layers: {
1886
- id: string;
1887
- role: "air" | "covering" | "deck" | "fill" | "finish" | "furring" | "glazing" | "insulation" | "lining" | "membrane" | "sheathing" | "shell" | "structure" | "substrate" | "underlay";
1888
- thickness: number;
1889
- core?: true | undefined;
1890
- spacing?: number | undefined;
1891
- material?: string | undefined;
1892
- slot?: string | undefined;
1893
- returns?: boolean | undefined;
1894
- display?: "construction" | "finished" | undefined;
1895
- inset?: number | undefined;
1896
- bottom?: number | undefined;
1897
- lift?: number | undefined;
1898
- src?: string | undefined;
1899
- }[];
1900
- backing?: {
1901
- id: string;
1902
- role: "air" | "covering" | "deck" | "fill" | "finish" | "furring" | "glazing" | "insulation" | "lining" | "membrane" | "sheathing" | "shell" | "structure" | "substrate" | "underlay";
1903
- thickness: number;
1904
- core?: true | undefined;
1905
- spacing?: number | undefined;
1906
- material?: string | undefined;
1907
- slot?: string | undefined;
1908
- returns?: boolean | undefined;
1909
- display?: "construction" | "finished" | undefined;
1910
- inset?: number | undefined;
1911
- bottom?: number | undefined;
1912
- lift?: number | undefined;
1913
- src?: string | undefined;
1914
- }[] | undefined;
1915
- face?: "exterior" | "front" | undefined;
1916
- presetId?: string | undefined;
1917
- cavityInsulation?: string | undefined;
1918
- } | undefined;
1919
- slots?: Record<string, string> | undefined;
1920
- children: `rseg_${string}`[];
1921
- type: "roof";
1922
- } | {
1923
- object: "node";
1924
- name?: string | undefined;
1925
- parentId: string | null;
1926
- visible: boolean;
1927
- camera?: {
1928
- position: [number, number, number];
1929
- target: [number, number, number];
1930
- mode: "orthographic" | "perspective";
1931
- fov?: number | undefined;
1932
- zoom?: number | undefined;
1933
- } | undefined;
1934
- metadata: Record<string, unknown>;
1935
- provenance?: {
1936
- refs: {
1937
- ns?: string | undefined;
1938
- id: string;
1939
- role?: "absorbed" | "alias" | "derived" | "piece" | "primary" | undefined;
1940
- }[];
1941
- lineage?: {
1942
- op: "attach" | "convert" | "duplicate" | "import" | "make-independent" | "merge" | "promote" | "split";
1943
- fromIds: string[];
1944
- } | undefined;
1945
- } | undefined;
1946
- id: `slab_${string}`;
1947
- material?: {
1948
- id?: string | undefined;
1949
- preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
1950
- properties?: {
1951
- color: string;
1952
- roughness: number;
1953
- metalness: number;
1954
- opacity: number;
1955
- transparent: boolean;
1956
- side: "back" | "double" | "front";
1957
- } | undefined;
1958
- texture?: {
1959
- url: string;
1960
- repeat?: [number, number] | undefined;
1961
- scale?: number | undefined;
1962
- offset?: [number, number] | undefined;
1963
- normalMap?: string | undefined;
1964
- normalScale?: number | undefined;
1965
- bumpMap?: string | undefined;
1966
- bumpScale?: number | undefined;
1967
- } | undefined;
1968
- } | undefined;
1969
- materialPreset?: string | undefined;
1970
- slots?: Record<string, string> | undefined;
1971
- polygon: [number, number][];
1972
- holes: [number, number][][];
1973
- holeMetadata: {
1974
- source: "elevator" | "floor-opening" | "manual" | "room" | "stair";
1975
- openingId?: string | undefined;
1976
- stairId?: string | undefined;
1977
- elevatorId?: string | undefined;
1978
- }[];
1979
- elevation: number;
1980
- floorHeight?: number | undefined;
1981
- referenceFloorElevation?: number | undefined;
1982
- foundation?: {
1983
- type: "none" | "solid";
1984
- material?: string | {
1985
- id?: string | undefined;
1986
- preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
1987
- properties?: {
1988
- color: string;
1989
- roughness: number;
1990
- metalness: number;
1991
- opacity: number;
1992
- transparent: boolean;
1993
- side: "back" | "double" | "front";
1994
- } | undefined;
1995
- texture?: {
1996
- url: string;
1997
- repeat?: [number, number] | undefined;
1998
- scale?: number | undefined;
1999
- offset?: [number, number] | undefined;
2000
- normalMap?: string | undefined;
2001
- normalScale?: number | undefined;
2002
- bumpMap?: string | undefined;
2003
- bumpScale?: number | undefined;
2004
- } | undefined;
2005
- } | undefined;
2006
- } | undefined;
2007
- thickness: number;
2008
- recessed: boolean;
2009
- recessedRimElevation?: number | undefined;
2010
- fillToTerrain?: boolean | undefined;
2011
- boundary?: "auto" | undefined;
2012
- support?: "open" | undefined;
2013
- plateRole?: "base" | "platform" | "sunken" | undefined;
2014
- railing?: {
2015
- start: [number, number];
2016
- end: [number, number];
2017
- }[] | undefined;
2018
- zoneIds?: string[] | undefined;
2019
- associatedZoneIds?: string[] | undefined;
2020
- autoFromWalls: boolean;
2021
- surfaceScript?: {
2022
- kind: "script";
2023
- meta?: {
2024
- description?: string | undefined;
2025
- category?: string | undefined;
2026
- tags?: string[] | undefined;
2027
- parent?: string | undefined;
1938
+ thickness: number;
1939
+ recessed: boolean;
1940
+ recessedRimElevation?: number | undefined;
1941
+ fillToTerrain?: boolean | undefined;
1942
+ boundary?: "auto" | undefined;
1943
+ support?: "open" | undefined;
1944
+ plateRole?: "base" | "platform" | "sunken" | undefined;
1945
+ railing?: {
1946
+ start: [number, number];
1947
+ end: [number, number];
1948
+ }[] | undefined;
1949
+ zoneIds?: string[] | undefined;
1950
+ associatedZoneIds?: string[] | undefined;
1951
+ autoFromWalls: boolean;
1952
+ surfaceScript?: {
1953
+ kind: "script";
1954
+ meta?: {
1955
+ description?: string | undefined;
1956
+ category?: string | undefined;
1957
+ tags?: string[] | undefined;
1958
+ parent?: string | undefined;
2028
1959
  } | undefined;
2029
1960
  language: "bpy" | "three";
2030
1961
  script: string;
@@ -2472,6 +2403,7 @@ export declare function markSlabChangeDependents(previous: SlabNode, next: SlabN
2472
2403
  } | undefined;
2473
2404
  justification?: "a" | "b" | undefined;
2474
2405
  height?: number | undefined;
2406
+ endHeightOffset?: number | undefined;
2475
2407
  curveOffset?: number | undefined;
2476
2408
  supportSlabId?: string | undefined;
2477
2409
  supportOffset?: number | undefined;
@@ -2774,8 +2706,30 @@ export declare function markSlabChangeDependents(previous: SlabNode, next: SlabN
2774
2706
  fromIds: string[];
2775
2707
  } | undefined;
2776
2708
  } | undefined;
2777
- id: `fence_${string}`;
2778
- children: string[];
2709
+ position: [number, number, number];
2710
+ rotation: number;
2711
+ supportSlabId?: string | undefined;
2712
+ width: number;
2713
+ depth: number;
2714
+ carcassHeight: number;
2715
+ operationState: number;
2716
+ plinthHeight: number;
2717
+ toeKickDepth: number;
2718
+ boardThickness: number;
2719
+ countertopThickness: number;
2720
+ countertopOverhang: number;
2721
+ countertopBackOverhang: number;
2722
+ withFinishedBack: boolean;
2723
+ frontThickness: number;
2724
+ frontGap: number;
2725
+ frontStyle: "raised-arch" | "shaker" | "slab";
2726
+ panelReady: boolean;
2727
+ handleStyle: "bar" | "cutout" | "hole" | "knob" | "none";
2728
+ handlePosition: "auto" | "center" | "top";
2729
+ frontOverlay: "full" | "inset";
2730
+ withBottomPanel: boolean;
2731
+ showPlinth: boolean;
2732
+ withCountertop: boolean;
2779
2733
  material?: {
2780
2734
  id?: string | undefined;
2781
2735
  preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
@@ -2800,110 +2754,99 @@ export declare function markSlabChangeDependents(previous: SlabNode, next: SlabN
2800
2754
  } | undefined;
2801
2755
  materialPreset?: string | undefined;
2802
2756
  slots?: Record<string, string> | undefined;
2803
- start: [number, number];
2804
- end: [number, number];
2805
- path?: [number, number][] | undefined;
2806
- spanModes?: ("curve" | "straight")[] | undefined;
2807
- tangents?: ([number, number] | null)[] | undefined;
2808
- height: number;
2809
- thickness: number;
2810
- supportSlabId?: string | undefined;
2811
- supportSurfaceNodeId?: string | undefined;
2812
- supportOffset?: number | undefined;
2813
- surfaceMode: "auto" | "level" | "selected";
2814
- transitionMode: "break" | "slope" | "step";
2815
- transitionWidth: number;
2816
- curveOffset?: number | undefined;
2817
- baseHeight: number;
2818
- postSpacing: number;
2819
- picketSpacing: number;
2820
- patternDistribution: "automatic" | "equal-fit" | "fixed-count" | "fixed-spacing" | "maximum-spacing";
2821
- patternAlignment: "center" | "end" | "start";
2822
- patternCount: number;
2823
- patternRemainder: "leave" | "spread";
2824
- picketWidth: number;
2825
- picketTop: "dog-ear" | "flat" | "pointed" | "rounded";
2826
- picketProfile: "alternating" | "arched" | "level" | "scalloped";
2827
- picketTopClearance: number;
2828
- picketVariation: number;
2829
- picketRailProjection: number;
2830
- picketRailCount: number;
2831
- postSize: number;
2832
- topRailHeight: number;
2833
- groundClearance: number;
2834
- edgeInset: number;
2835
- slatGap: number;
2836
- postCap: "flat" | "none" | "pyramid";
2837
- baseStyle: "floating" | "grounded" | "raised";
2838
- showInfill: boolean;
2839
- guardInfill?: "balusters" | "boards" | "cable" | undefined;
2840
- startPost?: boolean | undefined;
2841
- endPost?: boolean | undefined;
2842
- postThrough?: boolean | undefined;
2843
- infillPlacement: "back" | "center" | "front";
2844
- color: string;
2845
- style: "guard" | "horizontal" | "picket" | "privacy" | "rail" | "slat";
2846
- type: "fence";
2847
- } | {
2848
- object: "node";
2849
- name?: string | undefined;
2850
- parentId: string | null;
2851
- visible: boolean;
2852
- camera?: {
2853
- position: [number, number, number];
2854
- target: [number, number, number];
2855
- mode: "orthographic" | "perspective";
2856
- fov?: number | undefined;
2857
- zoom?: number | undefined;
2858
- } | undefined;
2859
- metadata: Record<string, unknown>;
2860
- provenance?: {
2861
- refs: {
2862
- ns?: string | undefined;
2863
- id: string;
2864
- role?: "absorbed" | "alias" | "derived" | "piece" | "primary" | undefined;
2865
- }[];
2866
- lineage?: {
2867
- op: "attach" | "convert" | "duplicate" | "import" | "make-independent" | "merge" | "promote" | "split";
2868
- fromIds: string[];
2869
- } | undefined;
2757
+ stack?: ({
2758
+ id: string;
2759
+ height?: number | undefined;
2760
+ type: "shelf";
2761
+ shelfCount?: number | undefined;
2762
+ } | {
2763
+ id: string;
2764
+ height?: number | undefined;
2765
+ type: "drawer";
2766
+ drawerCount?: number | undefined;
2767
+ } | {
2768
+ id: string;
2769
+ height?: number | undefined;
2770
+ type: "door";
2771
+ doorType?: "double" | "glass" | "single-left" | "single-right" | undefined;
2772
+ shelfCount?: number | undefined;
2773
+ } | {
2774
+ id: string;
2775
+ height?: number | undefined;
2776
+ type: "sink";
2777
+ sinkLayout?: "double" | "double-offset" | "single" | undefined;
2778
+ } | {
2779
+ id: string;
2780
+ height?: number | undefined;
2781
+ type: "oven";
2782
+ } | {
2783
+ id: string;
2784
+ height?: number | undefined;
2785
+ type: "microwave";
2786
+ } | {
2787
+ id: string;
2788
+ height?: number | undefined;
2789
+ type: "dishwasher";
2790
+ } | {
2791
+ id: string;
2792
+ height?: number | undefined;
2793
+ cooktopBurnersOn?: boolean | undefined;
2794
+ cooktopActiveBurners?: number[] | undefined;
2795
+ cooktopKnobProgress?: number[] | undefined;
2796
+ cooktopShowGrate?: boolean | undefined;
2797
+ type: "cooktop-gas";
2798
+ cooktopLayout?: "gas-2burner" | "gas-4burner" | "gas-5burner-wok" | "gas-6burner" | undefined;
2799
+ } | {
2800
+ id: string;
2801
+ height?: number | undefined;
2802
+ cooktopBurnersOn?: boolean | undefined;
2803
+ cooktopActiveBurners?: number[] | undefined;
2804
+ cooktopKnobProgress?: number[] | undefined;
2805
+ cooktopShowGrate?: boolean | undefined;
2806
+ type: "cooktop-induction";
2807
+ cooktopLayout?: "induction-2zone" | "induction-4zone" | undefined;
2808
+ } | {
2809
+ id: string;
2810
+ height?: number | undefined;
2811
+ type: "pull-out-pantry";
2812
+ shelfCount?: number | undefined;
2813
+ pantryRackStyle?: "glass" | "tray" | "wire" | undefined;
2814
+ } | {
2815
+ id: string;
2816
+ height?: number | undefined;
2817
+ type: "fridge-single";
2818
+ } | {
2819
+ id: string;
2820
+ height?: number | undefined;
2821
+ type: "fridge-double";
2822
+ } | {
2823
+ id: string;
2824
+ height?: number | undefined;
2825
+ type: "fridge-top-freezer";
2826
+ } | {
2827
+ id: string;
2828
+ height?: number | undefined;
2829
+ type: "fridge-bottom-freezer";
2830
+ } | {
2831
+ id: string;
2832
+ height?: number | undefined;
2833
+ type: "hood-pyramid";
2834
+ } | {
2835
+ id: string;
2836
+ height?: number | undefined;
2837
+ type: "hood-curved-glass";
2838
+ })[] | undefined;
2839
+ id: `cabinet_${string}`;
2840
+ runTier: "base" | "tall" | "wall";
2841
+ children: string[];
2842
+ barLedge?: {
2843
+ edge: "back" | "left" | "right";
2844
+ height: number;
2845
+ depth: number;
2870
2846
  } | undefined;
2871
- id: `construction-dimension_${string}`;
2872
- anchors: ({
2873
- kind: "feature";
2874
- reference: {
2875
- nodeId: string;
2876
- featureId: string;
2877
- parameters?: Record<string, string | number | boolean> | undefined;
2878
- };
2879
- fallback: [number, number, number];
2880
- } | [number, number, number])[];
2881
- baseline: {
2882
- origin: [number, number];
2883
- direction: [number, number];
2884
- };
2885
- chainMode: "continuous" | "point-to-point";
2886
- mode: "angular" | "arc-length" | "center-mark" | "chord" | "coordinate" | "diameter" | "linear" | "radius";
2887
- featureCount: number;
2888
- showCenterMark: boolean;
2889
- prefix: string;
2890
- suffix: string;
2891
- textOverride: string | null;
2892
- datumPolicy: "centerline" | "finish-face" | "structural-face" | "wall-face";
2893
- terminator: "architectural-tick" | "dot" | "filled-arrow" | "open-arrow";
2894
- textPosition: "above" | "centered";
2895
- imperialPrecision: "1" | "1/16" | "1/2" | "1/4" | "1/8";
2896
- metricNotation: "meters" | "millimeters";
2897
- extensionStartGap: number;
2898
- extensionOvershoot: number;
2899
- drawingType: "floor-plan" | "foundation-plan" | "reflected-ceiling-plan" | "roof-plan" | "site-plan";
2900
- drawingOverrides: {
2901
- drawingType: "floor-plan" | "foundation-plan" | "reflected-ceiling-plan" | "roof-plan" | "site-plan";
2902
- presentation: "controlled" | "omit" | "shown";
2903
- suppressedSegmentIndexes: number[];
2904
- }[];
2905
- controllingDimensionId: `construction-dimension_${string}` | null;
2906
- type: "construction-dimension";
2847
+ withWaterfall: boolean;
2848
+ withFinishedEnds: boolean;
2849
+ type: "cabinet";
2907
2850
  } | {
2908
2851
  object: "node";
2909
2852
  name?: string | undefined;
@@ -2928,265 +2871,206 @@ export declare function markSlabChangeDependents(previous: SlabNode, next: SlabN
2928
2871
  fromIds: string[];
2929
2872
  } | undefined;
2930
2873
  } | undefined;
2931
- id: `block_${string}`;
2932
- children: string[];
2933
2874
  position: [number, number, number];
2934
2875
  rotation: number;
2935
2876
  supportSlabId?: string | undefined;
2936
- topology: {
2937
- vertices: {
2938
- id: string;
2939
- position: [number, number, number];
2940
- }[];
2941
- edges: {
2942
- id: string;
2943
- vertexIds: [string, string];
2944
- }[];
2945
- faces: {
2946
- id: string;
2947
- vertexIds: string[];
2948
- materialSlot: string;
2949
- }[];
2950
- };
2951
- slots: Record<string, string>;
2952
- slotNames: Record<string, string>;
2953
- type: "block";
2954
- } | {
2955
- object: "node";
2956
- name?: string | undefined;
2957
- parentId: string | null;
2958
- visible: boolean;
2959
- camera?: {
2960
- position: [number, number, number];
2961
- target: [number, number, number];
2962
- mode: "orthographic" | "perspective";
2963
- fov?: number | undefined;
2964
- zoom?: number | undefined;
2965
- } | undefined;
2966
- metadata: Record<string, unknown>;
2967
- provenance?: {
2968
- refs: {
2969
- ns?: string | undefined;
2970
- id: string;
2971
- role?: "absorbed" | "alias" | "derived" | "piece" | "primary" | undefined;
2972
- }[];
2973
- lineage?: {
2974
- op: "attach" | "convert" | "duplicate" | "import" | "make-independent" | "merge" | "promote" | "split";
2975
- fromIds: string[];
2877
+ width: number;
2878
+ depth: number;
2879
+ carcassHeight: number;
2880
+ operationState: number;
2881
+ plinthHeight: number;
2882
+ toeKickDepth: number;
2883
+ boardThickness: number;
2884
+ countertopThickness: number;
2885
+ countertopOverhang: number;
2886
+ countertopBackOverhang: number;
2887
+ withFinishedBack: boolean;
2888
+ frontThickness: number;
2889
+ frontGap: number;
2890
+ frontStyle: "raised-arch" | "shaker" | "slab";
2891
+ panelReady: boolean;
2892
+ handleStyle: "bar" | "cutout" | "hole" | "knob" | "none";
2893
+ handlePosition: "auto" | "center" | "top";
2894
+ frontOverlay: "full" | "inset";
2895
+ withBottomPanel: boolean;
2896
+ showPlinth: boolean;
2897
+ withCountertop: boolean;
2898
+ material?: {
2899
+ id?: string | undefined;
2900
+ preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
2901
+ properties?: {
2902
+ color: string;
2903
+ roughness: number;
2904
+ metalness: number;
2905
+ opacity: number;
2906
+ transparent: boolean;
2907
+ side: "back" | "double" | "front";
2908
+ } | undefined;
2909
+ texture?: {
2910
+ url: string;
2911
+ repeat?: [number, number] | undefined;
2912
+ scale?: number | undefined;
2913
+ offset?: [number, number] | undefined;
2914
+ normalMap?: string | undefined;
2915
+ normalScale?: number | undefined;
2916
+ bumpMap?: string | undefined;
2917
+ bumpScale?: number | undefined;
2976
2918
  } | undefined;
2977
2919
  } | undefined;
2978
- id: `structural-grid_${string}`;
2979
- start: [number, number];
2980
- end: [number, number];
2981
- label: string;
2982
- showStartBubble: boolean;
2983
- showEndBubble: boolean;
2984
- type: "structural-grid";
2985
- } | {
2986
- object: "node";
2987
- name?: string | undefined;
2988
- parentId: string | null;
2989
- visible: boolean;
2990
- camera?: {
2991
- position: [number, number, number];
2992
- target: [number, number, number];
2993
- mode: "orthographic" | "perspective";
2994
- fov?: number | undefined;
2995
- zoom?: number | undefined;
2996
- } | undefined;
2997
- metadata: Record<string, unknown>;
2998
- provenance?: {
2999
- refs: {
3000
- ns?: string | undefined;
3001
- id: string;
3002
- role?: "absorbed" | "alias" | "derived" | "piece" | "primary" | undefined;
3003
- }[];
3004
- lineage?: {
3005
- op: "attach" | "convert" | "duplicate" | "import" | "make-independent" | "merge" | "promote" | "split";
2920
+ materialPreset?: string | undefined;
2921
+ slots?: Record<string, string> | undefined;
2922
+ stack?: ({
2923
+ id: string;
2924
+ height?: number | undefined;
2925
+ type: "shelf";
2926
+ shelfCount?: number | undefined;
2927
+ } | {
2928
+ id: string;
2929
+ height?: number | undefined;
2930
+ type: "drawer";
2931
+ drawerCount?: number | undefined;
2932
+ } | {
2933
+ id: string;
2934
+ height?: number | undefined;
2935
+ type: "door";
2936
+ doorType?: "double" | "glass" | "single-left" | "single-right" | undefined;
2937
+ shelfCount?: number | undefined;
2938
+ } | {
2939
+ id: string;
2940
+ height?: number | undefined;
2941
+ type: "sink";
2942
+ sinkLayout?: "double" | "double-offset" | "single" | undefined;
2943
+ } | {
2944
+ id: string;
2945
+ height?: number | undefined;
2946
+ type: "oven";
2947
+ } | {
2948
+ id: string;
2949
+ height?: number | undefined;
2950
+ type: "microwave";
2951
+ } | {
2952
+ id: string;
2953
+ height?: number | undefined;
2954
+ type: "dishwasher";
2955
+ } | {
2956
+ id: string;
2957
+ height?: number | undefined;
2958
+ cooktopBurnersOn?: boolean | undefined;
2959
+ cooktopActiveBurners?: number[] | undefined;
2960
+ cooktopKnobProgress?: number[] | undefined;
2961
+ cooktopShowGrate?: boolean | undefined;
2962
+ type: "cooktop-gas";
2963
+ cooktopLayout?: "gas-2burner" | "gas-4burner" | "gas-5burner-wok" | "gas-6burner" | undefined;
2964
+ } | {
2965
+ id: string;
2966
+ height?: number | undefined;
2967
+ cooktopBurnersOn?: boolean | undefined;
2968
+ cooktopActiveBurners?: number[] | undefined;
2969
+ cooktopKnobProgress?: number[] | undefined;
2970
+ cooktopShowGrate?: boolean | undefined;
2971
+ type: "cooktop-induction";
2972
+ cooktopLayout?: "induction-2zone" | "induction-4zone" | undefined;
2973
+ } | {
2974
+ id: string;
2975
+ height?: number | undefined;
2976
+ type: "pull-out-pantry";
2977
+ shelfCount?: number | undefined;
2978
+ pantryRackStyle?: "glass" | "tray" | "wire" | undefined;
2979
+ } | {
2980
+ id: string;
2981
+ height?: number | undefined;
2982
+ type: "fridge-single";
2983
+ } | {
2984
+ id: string;
2985
+ height?: number | undefined;
2986
+ type: "fridge-double";
2987
+ } | {
2988
+ id: string;
2989
+ height?: number | undefined;
2990
+ type: "fridge-top-freezer";
2991
+ } | {
2992
+ id: string;
2993
+ height?: number | undefined;
2994
+ type: "fridge-bottom-freezer";
2995
+ } | {
2996
+ id: string;
2997
+ height?: number | undefined;
2998
+ type: "hood-pyramid";
2999
+ } | {
3000
+ id: string;
3001
+ height?: number | undefined;
3002
+ type: "hood-curved-glass";
3003
+ })[] | undefined;
3004
+ id: `cabinet-module_${string}`;
3005
+ children: string[];
3006
+ cabinetType: "base" | "tall";
3007
+ moduleKind: "corner-filler" | "standard" | "wall-filler";
3008
+ openSide?: "left" | "right" | undefined;
3009
+ cornerShelf?: boolean | undefined;
3010
+ topFinish: "none" | "top-cabinet" | "trim";
3011
+ topFinishHeight: number;
3012
+ topFinishDepth: number;
3013
+ type: "cabinet-module";
3014
+ } | {
3015
+ object: "node";
3016
+ name?: string | undefined;
3017
+ parentId: string | null;
3018
+ visible: boolean;
3019
+ camera?: {
3020
+ position: [number, number, number];
3021
+ target: [number, number, number];
3022
+ mode: "orthographic" | "perspective";
3023
+ fov?: number | undefined;
3024
+ zoom?: number | undefined;
3025
+ } | undefined;
3026
+ metadata: Record<string, unknown>;
3027
+ provenance?: {
3028
+ refs: {
3029
+ ns?: string | undefined;
3030
+ id: string;
3031
+ role?: "absorbed" | "alias" | "derived" | "piece" | "primary" | undefined;
3032
+ }[];
3033
+ lineage?: {
3034
+ op: "attach" | "convert" | "duplicate" | "import" | "make-independent" | "merge" | "promote" | "split";
3006
3035
  fromIds: string[];
3007
3036
  } | undefined;
3008
3037
  } | undefined;
3009
- type: "procedural-item";
3010
- id: `procedural-item_${string}`;
3011
- recipe: {
3012
- version: 1 | 2;
3013
- name: string;
3014
- description: string;
3015
- classification?: {
3016
- category: string;
3017
- functionTags: string[];
3018
- tags: string[];
3038
+ id: `downspout_${string}`;
3039
+ material?: {
3040
+ id?: string | undefined;
3041
+ preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
3042
+ properties?: {
3043
+ color: string;
3044
+ roughness: number;
3045
+ metalness: number;
3046
+ opacity: number;
3047
+ transparent: boolean;
3048
+ side: "back" | "double" | "front";
3019
3049
  } | undefined;
3020
- mounting?: {
3021
- attachTo: "ceiling" | "wall-side";
3022
- reference: string;
3050
+ texture?: {
3051
+ url: string;
3052
+ repeat?: [number, number] | undefined;
3053
+ scale?: number | undefined;
3054
+ offset?: [number, number] | undefined;
3055
+ normalMap?: string | undefined;
3056
+ normalScale?: number | undefined;
3057
+ bumpMap?: string | undefined;
3058
+ bumpScale?: number | undefined;
3023
3059
  } | undefined;
3024
- base?: import("../../procedural-items/index.js").Expr | undefined;
3025
- cuts?: ({
3026
- shape: "rect";
3027
- size: [import("../../procedural-items/index.js").Expr, import("../../procedural-items/index.js").Expr];
3028
- center?: [import("../../procedural-items/index.js").Expr, import("../../procedural-items/index.js").Expr] | undefined;
3029
- } | {
3030
- shape: "circle";
3031
- diameter: import("../../procedural-items/index.js").Expr;
3032
- center?: [import("../../procedural-items/index.js").Expr, import("../../procedural-items/index.js").Expr] | undefined;
3033
- })[] | undefined;
3034
- surfaces?: {
3035
- id: string;
3036
- label: string;
3037
- part?: string | undefined;
3038
- position: [import("../../procedural-items/index.js").Expr, import("../../procedural-items/index.js").Expr, import("../../procedural-items/index.js").Expr];
3039
- rotation?: [import("../../procedural-items/index.js").Expr, import("../../procedural-items/index.js").Expr, import("../../procedural-items/index.js").Expr] | undefined;
3040
- size: [import("../../procedural-items/index.js").Expr, import("../../procedural-items/index.js").Expr];
3041
- }[] | undefined;
3042
- parameters: {
3043
- id: string;
3044
- label: string;
3045
- default: number;
3046
- min: number;
3047
- max: number;
3048
- step: number;
3049
- unit: "bool" | "choice" | "count" | "m" | "rad" | "s";
3050
- options?: string[] | undefined;
3051
- part?: string | undefined;
3052
- axis?: "x" | "y" | "z" | undefined;
3053
- }[];
3054
- slots: {
3055
- id: string;
3056
- label: string;
3057
- color: string;
3058
- finish?: "glass" | "metal" | "wood" | undefined;
3059
- }[];
3060
- parts: {
3061
- id: string;
3062
- label: string;
3063
- count: import("../../procedural-items/index.js").Expr;
3064
- parent?: string | undefined;
3065
- frame?: {
3066
- position: [import("../../procedural-items/index.js").Expr, import("../../procedural-items/index.js").Expr, import("../../procedural-items/index.js").Expr];
3067
- rotation?: [import("../../procedural-items/index.js").Expr, import("../../procedural-items/index.js").Expr, import("../../procedural-items/index.js").Expr] | undefined;
3068
- } | undefined;
3069
- when?: import("../../procedural-items/index.js").Expr | undefined;
3070
- motion?: {
3071
- delay?: import("../../procedural-items/index.js").Expr | undefined;
3072
- duration?: import("../../procedural-items/index.js").Expr | undefined;
3073
- easing?: "linear" | "smooth" | "soft" | undefined;
3074
- kind: "hinge";
3075
- pivot: [import("../../procedural-items/index.js").Expr, import("../../procedural-items/index.js").Expr, import("../../procedural-items/index.js").Expr];
3076
- axis: "x" | "y" | "z";
3077
- angle: import("../../procedural-items/index.js").Expr;
3078
- } | {
3079
- delay?: import("../../procedural-items/index.js").Expr | undefined;
3080
- duration?: import("../../procedural-items/index.js").Expr | undefined;
3081
- easing?: "linear" | "smooth" | "soft" | undefined;
3082
- kind: "slide";
3083
- axis: "x" | "y" | "z";
3084
- distance: import("../../procedural-items/index.js").Expr;
3085
- } | {
3086
- kind: "spin";
3087
- pivot: [import("../../procedural-items/index.js").Expr, import("../../procedural-items/index.js").Expr, import("../../procedural-items/index.js").Expr];
3088
- axis: "x" | "y" | "z";
3089
- radiansPerSecond: import("../../procedural-items/index.js").Expr;
3090
- } | undefined;
3091
- light?: {
3092
- position: [import("../../procedural-items/index.js").Expr, import("../../procedural-items/index.js").Expr, import("../../procedural-items/index.js").Expr];
3093
- color: string;
3094
- intensity?: number | undefined;
3095
- distance?: number | undefined;
3096
- emissiveSlot?: string | undefined;
3097
- } | undefined;
3098
- shapes: ({
3099
- support?: boolean | undefined;
3100
- when?: import("../../procedural-items/index.js").Expr | undefined;
3101
- id: string;
3102
- primitive: "box" | "cylinder" | "ellipsoid" | "roundedBox";
3103
- slot: string;
3104
- size: [import("../../procedural-items/index.js").Expr, import("../../procedural-items/index.js").Expr, import("../../procedural-items/index.js").Expr];
3105
- position: [import("../../procedural-items/index.js").Expr, import("../../procedural-items/index.js").Expr, import("../../procedural-items/index.js").Expr];
3106
- rotation?: [import("../../procedural-items/index.js").Expr, import("../../procedural-items/index.js").Expr, import("../../procedural-items/index.js").Expr] | undefined;
3107
- radius?: import("../../procedural-items/index.js").Expr | undefined;
3108
- topScale?: import("../../procedural-items/index.js").Expr | undefined;
3109
- segments?: number | undefined;
3110
- open?: boolean | undefined;
3111
- inner?: import("../../procedural-items/index.js").Expr | undefined;
3112
- arc?: import("../../procedural-items/index.js").Expr | undefined;
3113
- } | {
3114
- support?: boolean | undefined;
3115
- when?: import("../../procedural-items/index.js").Expr | undefined;
3116
- id: string;
3117
- primitive: "extrude";
3118
- slot: string;
3119
- section: {
3120
- kind: "rectangle";
3121
- width: import("../../procedural-items/index.js").Expr;
3122
- depth: import("../../procedural-items/index.js").Expr;
3123
- corner?: import("../../procedural-items/index.js").Expr | undefined;
3124
- } | {
3125
- kind: "round";
3126
- radius: import("../../procedural-items/index.js").Expr;
3127
- wall?: import("../../procedural-items/index.js").Expr | undefined;
3128
- } | {
3129
- kind: "oval";
3130
- width: import("../../procedural-items/index.js").Expr;
3131
- depth: import("../../procedural-items/index.js").Expr;
3132
- } | {
3133
- kind: "section";
3134
- family: "C" | "I" | "L" | "T" | "Z" | "rect-tube";
3135
- width: import("../../procedural-items/index.js").Expr;
3136
- depth: import("../../procedural-items/index.js").Expr;
3137
- web: import("../../procedural-items/index.js").Expr;
3138
- flange: import("../../procedural-items/index.js").Expr;
3139
- } | {
3140
- kind: "polygon";
3141
- outer: [import("../../procedural-items/index.js").Expr, import("../../procedural-items/index.js").Expr][];
3142
- holes?: [import("../../procedural-items/index.js").Expr, import("../../procedural-items/index.js").Expr][][] | undefined;
3143
- };
3144
- length: import("../../procedural-items/index.js").Expr;
3145
- bevel?: import("../../procedural-items/index.js").Expr | undefined;
3146
- position: [import("../../procedural-items/index.js").Expr, import("../../procedural-items/index.js").Expr, import("../../procedural-items/index.js").Expr];
3147
- rotation?: [import("../../procedural-items/index.js").Expr, import("../../procedural-items/index.js").Expr, import("../../procedural-items/index.js").Expr] | undefined;
3148
- } | {
3149
- support?: boolean | undefined;
3150
- when?: import("../../procedural-items/index.js").Expr | undefined;
3151
- id: string;
3152
- primitive: "revolve";
3153
- slot: string;
3154
- profile: [import("../../procedural-items/index.js").Expr, import("../../procedural-items/index.js").Expr][];
3155
- segments?: number | undefined;
3156
- arc?: import("../../procedural-items/index.js").Expr | undefined;
3157
- position: [import("../../procedural-items/index.js").Expr, import("../../procedural-items/index.js").Expr, import("../../procedural-items/index.js").Expr];
3158
- rotation?: [import("../../procedural-items/index.js").Expr, import("../../procedural-items/index.js").Expr, import("../../procedural-items/index.js").Expr] | undefined;
3159
- })[];
3160
- }[];
3161
- joints?: {
3162
- delay?: import("../../procedural-items/index.js").Expr | undefined;
3163
- duration?: import("../../procedural-items/index.js").Expr | undefined;
3164
- easing?: "linear" | "smooth" | "soft" | undefined;
3165
- child: string;
3166
- kind: "continuous" | "fixed" | "prismatic" | "revolute";
3167
- origin: [import("../../procedural-items/index.js").Expr, import("../../procedural-items/index.js").Expr, import("../../procedural-items/index.js").Expr];
3168
- axis: [import("../../procedural-items/index.js").Expr, import("../../procedural-items/index.js").Expr, import("../../procedural-items/index.js").Expr];
3169
- open?: import("../../procedural-items/index.js").Expr | undefined;
3170
- rest?: import("../../procedural-items/index.js").Expr | undefined;
3171
- range?: [import("../../procedural-items/index.js").Expr, import("../../procedural-items/index.js").Expr] | undefined;
3172
- speed?: import("../../procedural-items/index.js").Expr | undefined;
3173
- }[] | undefined;
3174
- constraints: {
3175
- left: import("../../procedural-items/index.js").Expr;
3176
- relation: "gte" | "lte";
3177
- right: import("../../procedural-items/index.js").Expr;
3178
- message: string;
3179
- }[];
3180
- };
3181
- parameters: Record<string, number>;
3182
- slots: Record<string, string>;
3183
- position: [number, number, number];
3184
- rotation: [number, number, number];
3185
- wallId?: string | undefined;
3186
- side?: "back" | "front" | undefined;
3187
- supportSlabId?: string | undefined;
3188
- children: string[];
3189
- attachments: Record<string, string>;
3060
+ } | undefined;
3061
+ slots?: Record<string, string> | undefined;
3062
+ materialPreset: string;
3063
+ gutterId?: string | undefined;
3064
+ outletId?: string | undefined;
3065
+ length: number;
3066
+ lengthMode?: "manual" | "to-ground" | undefined;
3067
+ diameter: number;
3068
+ standoff: number;
3069
+ shape: "auto" | "rect" | "round";
3070
+ strapStyle: "band" | "none";
3071
+ strapSpacing: number;
3072
+ terminal: "kickout" | "splash" | "straight";
3073
+ type: "downspout";
3190
3074
  } | {
3191
3075
  object: "node";
3192
3076
  name?: string | undefined;
@@ -3211,19 +3095,42 @@ export declare function markSlabChangeDependents(previous: SlabNode, next: SlabN
3211
3095
  fromIds: string[];
3212
3096
  } | undefined;
3213
3097
  } | undefined;
3214
- id: `imesh_${string}`;
3215
- position: [number, number, number];
3216
- rotation: [number, number, number];
3217
- primitives: {
3218
- positions: number[];
3219
- normals?: number[] | undefined;
3220
- indices: number[];
3221
- color: string;
3222
- opacity: number;
3223
- }[];
3224
- type: "imported-mesh";
3098
+ id: `rvent_${string}`;
3099
+ material?: {
3100
+ id?: string | undefined;
3101
+ preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
3102
+ properties?: {
3103
+ color: string;
3104
+ roughness: number;
3105
+ metalness: number;
3106
+ opacity: number;
3107
+ transparent: boolean;
3108
+ side: "back" | "double" | "front";
3109
+ } | undefined;
3110
+ texture?: {
3111
+ url: string;
3112
+ repeat?: [number, number] | undefined;
3113
+ scale?: number | undefined;
3114
+ offset?: [number, number] | undefined;
3115
+ normalMap?: string | undefined;
3116
+ normalScale?: number | undefined;
3117
+ bumpMap?: string | undefined;
3118
+ bumpScale?: number | undefined;
3119
+ } | undefined;
3120
+ } | undefined;
3121
+ materialPreset?: string | undefined;
3122
+ roofSegmentId?: string | undefined;
3123
+ position: [number, number, number];
3124
+ rotation: number;
3125
+ length: number;
3126
+ width: number;
3127
+ height: number;
3128
+ style: "metal" | "shingled" | "standard";
3129
+ endCaps: boolean;
3130
+ type: "ridge-vent";
3225
3131
  } | {
3226
3132
  object: "node";
3133
+ name?: string | undefined;
3227
3134
  parentId: string | null;
3228
3135
  visible: boolean;
3229
3136
  camera?: {
@@ -3233,6 +3140,7 @@ export declare function markSlabChangeDependents(previous: SlabNode, next: SlabN
3233
3140
  fov?: number | undefined;
3234
3141
  zoom?: number | undefined;
3235
3142
  } | undefined;
3143
+ metadata: Record<string, unknown>;
3236
3144
  provenance?: {
3237
3145
  refs: {
3238
3146
  ns?: string | undefined;
@@ -3244,190 +3152,70 @@ export declare function markSlabChangeDependents(previous: SlabNode, next: SlabN
3244
3152
  fromIds: string[];
3245
3153
  } | undefined;
3246
3154
  } | undefined;
3247
- id: `zone_${string}`;
3248
- name: string;
3249
- polygon: [number, number][];
3250
- holes: [number, number][][];
3251
- autoFromWalls: boolean;
3252
- boundaryWallIds: `wall_${string}`[];
3253
- boundarySeparatorIds: string[];
3254
- hostZoneId?: string | undefined;
3255
- seed?: [number, number] | undefined;
3256
- floor?: {
3257
- elevation?: number | undefined;
3258
- support?: "open" | undefined;
3259
- footprint?: string | undefined;
3260
- thickness?: number | undefined;
3261
- sourceSlabId?: `slab_${string}` | undefined;
3262
- finish?: string | Record<string, unknown> | undefined;
3263
- regions?: {
3264
- id: string;
3265
- polygon: [number, number][];
3266
- finish: string | Record<string, unknown>;
3267
- }[] | undefined;
3268
- script?: {
3269
- kind: "script";
3270
- meta?: {
3271
- description?: string | undefined;
3272
- category?: string | undefined;
3273
- tags?: string[] | undefined;
3274
- parent?: string | undefined;
3275
- } | undefined;
3276
- language: "bpy" | "three";
3277
- script: string;
3278
- params: Record<string, string | number | boolean>;
3279
- artifact: string;
3280
- manifest: {
3281
- bounds: {
3282
- min: [number, number, number];
3283
- max: [number, number, number];
3284
- };
3285
- params: {
3286
- id: string;
3287
- label?: string | undefined;
3288
- kind: "boolean" | "number" | "string";
3289
- default: string | number | boolean;
3290
- min?: number | undefined;
3291
- max?: number | undefined;
3292
- step?: number | undefined;
3293
- unit?: string | undefined;
3294
- options?: string[] | undefined;
3295
- }[];
3296
- parts: {
3297
- id: string;
3298
- label?: string | undefined;
3299
- type?: string | undefined;
3300
- bounds?: {
3301
- min: [number, number, number];
3302
- max: [number, number, number];
3303
- } | undefined;
3304
- }[];
3305
- surfaces: {
3306
- part?: string | undefined;
3307
- y: number;
3308
- polygon: [number, number][];
3309
- }[];
3310
- slots: {
3311
- id: string;
3312
- label?: string | undefined;
3313
- color?: string | undefined;
3314
- roughness?: number | undefined;
3315
- metalness?: number | undefined;
3316
- transparent?: boolean | undefined;
3317
- emissive?: boolean | undefined;
3318
- }[];
3319
- anchors: {
3320
- id: string;
3321
- position: [number, number, number];
3322
- normal?: [number, number, number] | undefined;
3323
- }[];
3324
- lights: {
3325
- id: string;
3326
- position: [number, number, number];
3327
- color: string;
3328
- intensity: number;
3329
- distance?: number | undefined;
3330
- spot?: {
3331
- direction: [number, number, number];
3332
- angle: number;
3333
- softness: number;
3334
- } | undefined;
3335
- shadows?: boolean | undefined;
3336
- glow?: {
3337
- size: number;
3338
- strength: number;
3339
- } | undefined;
3340
- }[];
3341
- undersides: {
3342
- part?: string | undefined;
3343
- polygon: [number, number][];
3344
- plane: [number, number, number, number];
3345
- }[];
3346
- animations: {
3347
- name: string;
3348
- duration: number;
3349
- }[];
3350
- cutters?: {
3351
- host: "ceiling" | "mounted" | "slab" | "wall";
3352
- polygon: number[][];
3353
- minY: number;
3354
- maxY: number;
3355
- }[] | undefined;
3356
- cutout: boolean;
3357
- collider: boolean;
3358
- shape?: {
3359
- tolerance: number;
3360
- bands: {
3361
- y0: number;
3362
- y1: number;
3363
- polygons: {
3364
- outer: [number, number][];
3365
- holes?: [number, number][][] | undefined;
3366
- }[];
3367
- }[];
3368
- } | undefined;
3369
- triangles: number;
3370
- coverage?: number | undefined;
3371
- uncovered?: {
3372
- min: [number, number];
3373
- max: [number, number];
3374
- }[] | undefined;
3375
- };
3376
- images?: {
3377
- artifact: string;
3378
- thumbnail: string;
3379
- floorPlan: string;
3380
- } | undefined;
3381
- inputs: string;
3155
+ id: `solarpanel_${string}`;
3156
+ material?: {
3157
+ id?: string | undefined;
3158
+ preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
3159
+ properties?: {
3160
+ color: string;
3161
+ roughness: number;
3162
+ metalness: number;
3163
+ opacity: number;
3164
+ transparent: boolean;
3165
+ side: "back" | "double" | "front";
3166
+ } | undefined;
3167
+ texture?: {
3168
+ url: string;
3169
+ repeat?: [number, number] | undefined;
3170
+ scale?: number | undefined;
3171
+ offset?: [number, number] | undefined;
3172
+ normalMap?: string | undefined;
3173
+ normalScale?: number | undefined;
3174
+ bumpMap?: string | undefined;
3175
+ bumpScale?: number | undefined;
3382
3176
  } | undefined;
3383
- drop?: number | undefined;
3384
- } | undefined;
3385
- roomType?: "deck" | "patio" | "porch" | undefined;
3386
- porchFraming?: {
3387
- auto?: boolean | undefined;
3388
- postSize?: string | undefined;
3389
- postSpacing?: number | undefined;
3390
- beamSize?: string | undefined;
3391
- } | undefined;
3392
- decking?: {
3393
- boardSize?: "2x4" | "2x6" | "5/4x6" | "composite" | undefined;
3394
- gap?: number | undefined;
3395
- direction?: "diagonal" | "parallel" | "perpendicular" | undefined;
3396
3177
  } | undefined;
3397
- ceiling?: {
3398
- regions?: {
3399
- id: string;
3400
- polygon: [number, number][];
3401
- finish: string | Record<string, unknown>;
3402
- }[] | undefined;
3178
+ materialPreset?: string | undefined;
3179
+ panelMaterial?: {
3180
+ id?: string | undefined;
3181
+ preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
3182
+ properties?: {
3183
+ color: string;
3184
+ roughness: number;
3185
+ metalness: number;
3186
+ opacity: number;
3187
+ transparent: boolean;
3188
+ side: "back" | "double" | "front";
3189
+ } | undefined;
3190
+ texture?: {
3191
+ url: string;
3192
+ repeat?: [number, number] | undefined;
3193
+ scale?: number | undefined;
3194
+ offset?: [number, number] | undefined;
3195
+ normalMap?: string | undefined;
3196
+ normalScale?: number | undefined;
3197
+ bumpMap?: string | undefined;
3198
+ bumpScale?: number | undefined;
3199
+ } | undefined;
3403
3200
  } | undefined;
3404
- floorStepFinish?: string | undefined;
3405
- floorStepOverrides?: {
3406
- key: string;
3407
- step?: number | undefined;
3408
- finish: string;
3409
- }[] | undefined;
3410
- floorEdgeFinish?: string | undefined;
3411
- wallMaterial?: string | undefined;
3412
- wallOverrides?: {
3413
- wallId: string;
3414
- face: "a" | "b";
3415
- finish: string;
3416
- }[] | undefined;
3417
- hasFloor?: false | undefined;
3418
- hasCeiling?: false | undefined;
3419
- spaceRole: "generic" | "room";
3420
- roomNumber: string;
3421
- enclosureStatus: "auto" | "enclosed" | "open";
3422
- floorFinish: string;
3423
- wallFinish: string;
3424
- ceilingFinish: string;
3425
- ceilingHeight: number;
3426
- occupancy: string;
3427
- clearDimensionPolicy: "finish-faces" | "inside-faces" | "none";
3428
- color: string;
3429
- metadata: Record<string, unknown>;
3430
- type: "zone";
3201
+ panelMaterialPreset?: string | undefined;
3202
+ panelTypePreset?: "compact" | "frameless" | "residential" | "residential-large" | undefined;
3203
+ roofSegmentId?: string | undefined;
3204
+ position: [number, number, number];
3205
+ rotation: number;
3206
+ rows: number;
3207
+ columns: number;
3208
+ panelWidth: number;
3209
+ panelHeight: number;
3210
+ gapX: number;
3211
+ gapY: number;
3212
+ mountingType: "flush" | "tilted";
3213
+ tiltAngle: number;
3214
+ standoffHeight: number;
3215
+ frameThickness: number;
3216
+ frameDepth: number;
3217
+ surfaceNormal?: [number, number, number] | undefined;
3218
+ type: "solar-panel";
3431
3219
  } | {
3432
3220
  object: "node";
3433
3221
  name?: string | undefined;
@@ -3452,74 +3240,226 @@ export declare function markSlabChangeDependents(previous: SlabNode, next: SlabN
3452
3240
  fromIds: string[];
3453
3241
  } | undefined;
3454
3242
  } | undefined;
3455
- id: `ceiling_${string}`;
3456
- children: (`item_${string}` | `procedural-item_${string}`)[];
3457
- material?: {
3458
- id?: string | undefined;
3459
- preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
3460
- properties?: {
3461
- color: string;
3462
- roughness: number;
3463
- metalness: number;
3464
- opacity: number;
3465
- transparent: boolean;
3466
- side: "back" | "double" | "front";
3243
+ id: `site_${string}`;
3244
+ polygon: {
3245
+ type: "polygon";
3246
+ points: [number, number][];
3247
+ };
3248
+ terrain?: {
3249
+ type: "heightfield";
3250
+ origin: [number, number];
3251
+ spacing: number;
3252
+ cols: number;
3253
+ rows: number;
3254
+ step: number;
3255
+ heights: string;
3256
+ } | undefined;
3257
+ showGround?: boolean | undefined;
3258
+ presentation?: {
3259
+ theme?: string | undefined;
3260
+ exposure?: number | undefined;
3261
+ shading?: "rendered" | "solid" | undefined;
3262
+ edges?: "off" | "soft" | "strong" | undefined;
3263
+ shadows?: boolean | undefined;
3264
+ lighting?: {
3265
+ background?: string | undefined;
3266
+ backgroundSky?: string | null | undefined;
3267
+ ground?: string | undefined;
3268
+ ambient?: {
3269
+ color: string;
3270
+ intensity: number;
3271
+ } | undefined;
3272
+ hemi?: {
3273
+ sky: string;
3274
+ ground: string;
3275
+ intensity: number;
3276
+ } | undefined;
3277
+ lights?: {
3278
+ color: string;
3279
+ intensity: number;
3280
+ position: [number, number, number];
3281
+ target?: [number, number, number] | undefined;
3282
+ castShadow?: boolean | undefined;
3283
+ shadow?: {
3284
+ intensity?: number | undefined;
3285
+ bias?: number | undefined;
3286
+ normalBias?: number | undefined;
3287
+ radius?: number | undefined;
3288
+ mapSize?: 512 | 1024 | 2048 | 4096 | undefined;
3289
+ camera?: {
3290
+ left: number;
3291
+ right: number;
3292
+ top: number;
3293
+ bottom: number;
3294
+ near: number;
3295
+ far: number;
3296
+ } | undefined;
3297
+ } | undefined;
3298
+ }[] | undefined;
3299
+ environment?: {
3300
+ source: "gradient" | "none" | "room";
3301
+ intensity: number;
3302
+ } | undefined;
3467
3303
  } | undefined;
3468
- texture?: {
3469
- url: string;
3470
- repeat?: [number, number] | undefined;
3471
- scale?: number | undefined;
3472
- offset?: [number, number] | undefined;
3473
- normalMap?: string | undefined;
3474
- normalScale?: number | undefined;
3475
- bumpMap?: string | undefined;
3476
- bumpScale?: number | undefined;
3304
+ postprocessing?: {
3305
+ ambientOcclusion?: boolean | undefined;
3306
+ colorGrading?: boolean | undefined;
3477
3307
  } | undefined;
3478
- } | undefined;
3479
- materialPreset?: string | undefined;
3480
- slots?: Record<string, string> | undefined;
3481
- polygon: [number, number][];
3482
- holes: [number, number][][];
3483
- holeMetadata: {
3484
- source: "elevator" | "floor-opening" | "manual" | "room" | "stair";
3485
- openingId?: string | undefined;
3486
- stairId?: string | undefined;
3487
- elevatorId?: string | undefined;
3488
- }[];
3489
- openingIds?: string[] | undefined;
3490
- height?: number | undefined;
3491
- buildUp?: {
3492
- presetId?: string | undefined;
3493
- finish?: {
3494
- kind: "drywall" | "plaster" | "wood-plank";
3495
- thickness: number;
3496
- name?: string | undefined;
3308
+ display?: {
3309
+ mode?: "construction" | "finished" | "systems" | undefined;
3310
+ families?: Partial<Record<"device" | "exposed-structure" | "fill" | "finish" | "foundation" | "framing" | "inspection" | "insulation" | "masonry" | "membrane" | "run" | "service-space" | "sheathing", boolean>> | undefined;
3311
+ disciplines?: Partial<Record<"electrical" | "fire" | "low-voltage" | "mechanical" | "plumbing", boolean>> | undefined;
3312
+ xray?: boolean | undefined;
3313
+ colorBy?: "material" | "service" | undefined;
3497
3314
  } | undefined;
3498
- framing?: {
3499
- system: "joists" | "truss-chords";
3500
- size: "2x10" | "2x12" | "2x4" | "2x6" | "2x8";
3501
- spacing: number;
3315
+ } | undefined;
3316
+ address?: {
3317
+ street?: string | undefined;
3318
+ city?: string | undefined;
3319
+ state?: string | undefined;
3320
+ zip?: string | undefined;
3321
+ } | undefined;
3322
+ parcel?: {
3323
+ apn?: string | undefined;
3324
+ source?: string | undefined;
3325
+ county?: string | undefined;
3326
+ state?: string | undefined;
3327
+ lotAreaSqFt?: number | undefined;
3328
+ originLngLat?: [number, number] | undefined;
3329
+ resolvedAt?: string | undefined;
3330
+ layer?: string | undefined;
3331
+ notes?: string[] | undefined;
3332
+ } | undefined;
3333
+ setbacks?: {
3334
+ front: number;
3335
+ side: number;
3336
+ rear: number;
3337
+ left?: number | undefined;
3338
+ right?: number | undefined;
3339
+ streetSide?: number | undefined;
3340
+ } | undefined;
3341
+ setbacksSource?: string | undefined;
3342
+ zone?: string | undefined;
3343
+ frontEdge?: number | undefined;
3344
+ streetEdges?: number[] | undefined;
3345
+ sightTriangleFt?: number | undefined;
3346
+ northRotation?: number | undefined;
3347
+ dossier?: {
3348
+ [x: string]: unknown;
3349
+ provider: string;
3350
+ asOf: string;
3351
+ point?: {
3352
+ lat?: number | undefined;
3353
+ lng?: number | undefined;
3354
+ source?: string | undefined;
3502
3355
  } | undefined;
3503
- decking?: {
3504
- kind: "osb" | "plywood";
3505
- thickness: number;
3506
- name?: string | undefined;
3356
+ address?: {
3357
+ formatted?: string | undefined;
3358
+ precision?: string | undefined;
3507
3359
  } | undefined;
3508
- insulation?: {
3509
- kind: "batt" | "blown" | "rigid";
3510
- thickness: number;
3511
- name?: string | undefined;
3360
+ sections: Record<string, {
3361
+ [x: string]: unknown;
3362
+ status: string;
3363
+ summary?: string | undefined;
3364
+ reason?: string | undefined;
3365
+ source?: {
3366
+ name?: string | undefined;
3367
+ kind?: string | undefined;
3368
+ vintage?: string | undefined;
3369
+ attribution?: string | undefined;
3370
+ } | undefined;
3371
+ }>;
3372
+ parcel?: Record<string, unknown> | undefined;
3373
+ flood?: Record<string, unknown> | undefined;
3374
+ codeBasis?: Record<string, unknown> | undefined;
3375
+ zoning?: Record<string, unknown> | undefined;
3376
+ utilities?: Record<string, unknown> | undefined;
3377
+ soils?: Record<string, unknown> | undefined;
3378
+ wetlands?: Record<string, unknown> | undefined;
3379
+ structures?: Record<string, unknown> | undefined;
3380
+ elevation?: Record<string, unknown> | undefined;
3381
+ boundaries?: Record<string, unknown> | undefined;
3382
+ } | undefined;
3383
+ contourIntervalIn?: number | undefined;
3384
+ contours3d?: boolean | undefined;
3385
+ terrainContours?: {
3386
+ datum: string;
3387
+ intervalFt: number;
3388
+ source?: string | undefined;
3389
+ lines: {
3390
+ elevationFt: number;
3391
+ points: [number, number][];
3392
+ }[];
3393
+ } | undefined;
3394
+ wallTypes?: {
3395
+ id: string;
3396
+ label: string;
3397
+ assembly: {
3398
+ layers: {
3399
+ id: string;
3400
+ role: "air" | "covering" | "deck" | "fill" | "finish" | "furring" | "glazing" | "insulation" | "lining" | "membrane" | "sheathing" | "shell" | "structure" | "substrate" | "underlay";
3401
+ thickness: number;
3402
+ core?: true | undefined;
3403
+ spacing?: number | undefined;
3404
+ material?: string | undefined;
3405
+ slot?: string | undefined;
3406
+ returns?: boolean | undefined;
3407
+ display?: "construction" | "finished" | undefined;
3408
+ inset?: number | undefined;
3409
+ bottom?: number | undefined;
3410
+ lift?: number | undefined;
3411
+ src?: string | undefined;
3412
+ }[];
3413
+ backing?: {
3414
+ id: string;
3415
+ role: "air" | "covering" | "deck" | "fill" | "finish" | "furring" | "glazing" | "insulation" | "lining" | "membrane" | "sheathing" | "shell" | "structure" | "substrate" | "underlay";
3416
+ thickness: number;
3417
+ core?: true | undefined;
3418
+ spacing?: number | undefined;
3419
+ material?: string | undefined;
3420
+ slot?: string | undefined;
3421
+ returns?: boolean | undefined;
3422
+ display?: "construction" | "finished" | undefined;
3423
+ inset?: number | undefined;
3424
+ bottom?: number | undefined;
3425
+ lift?: number | undefined;
3426
+ src?: string | undefined;
3427
+ }[] | undefined;
3428
+ face?: "exterior" | "front" | undefined;
3429
+ presetId?: string | undefined;
3430
+ cavityInsulation?: string | undefined;
3431
+ };
3432
+ }[] | undefined;
3433
+ children: string[];
3434
+ type: "site";
3435
+ } | {
3436
+ object: "node";
3437
+ name?: string | undefined;
3438
+ parentId: string | null;
3439
+ visible: boolean;
3440
+ camera?: {
3441
+ position: [number, number, number];
3442
+ target: [number, number, number];
3443
+ mode: "orthographic" | "perspective";
3444
+ fov?: number | undefined;
3445
+ zoom?: number | undefined;
3446
+ } | undefined;
3447
+ metadata: Record<string, unknown>;
3448
+ provenance?: {
3449
+ refs: {
3450
+ ns?: string | undefined;
3451
+ id: string;
3452
+ role?: "absorbed" | "alias" | "derived" | "piece" | "primary" | undefined;
3453
+ }[];
3454
+ lineage?: {
3455
+ op: "attach" | "convert" | "duplicate" | "import" | "make-independent" | "merge" | "promote" | "split";
3456
+ fromIds: string[];
3512
3457
  } | undefined;
3513
3458
  } | undefined;
3514
- regions?: {
3515
- id: string;
3516
- polygon: [number, number][];
3517
- finish: string | Record<string, unknown>;
3518
- }[] | undefined;
3519
- boundary?: "auto" | undefined;
3520
- zoneId?: string | undefined;
3521
- autoFromWalls: boolean;
3522
- type: "ceiling";
3459
+ id: `separator_${string}`;
3460
+ start: [number, number];
3461
+ end: [number, number];
3462
+ type: "separator";
3523
3463
  } | {
3524
3464
  object: "node";
3525
3465
  name?: string | undefined;
@@ -3544,7 +3484,8 @@ export declare function markSlabChangeDependents(previous: SlabNode, next: SlabN
3544
3484
  fromIds: string[];
3545
3485
  } | undefined;
3546
3486
  } | undefined;
3547
- id: `stair_${string}`;
3487
+ id: `fence_${string}`;
3488
+ children: string[];
3548
3489
  material?: {
3549
3490
  id?: string | undefined;
3550
3491
  preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
@@ -3568,152 +3509,111 @@ export declare function markSlabChangeDependents(previous: SlabNode, next: SlabN
3568
3509
  } | undefined;
3569
3510
  } | undefined;
3570
3511
  materialPreset?: string | undefined;
3571
- railingMaterial?: {
3572
- id?: string | undefined;
3573
- preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
3574
- properties?: {
3575
- color: string;
3576
- roughness: number;
3577
- metalness: number;
3578
- opacity: number;
3579
- transparent: boolean;
3580
- side: "back" | "double" | "front";
3581
- } | undefined;
3582
- texture?: {
3583
- url: string;
3584
- repeat?: [number, number] | undefined;
3585
- scale?: number | undefined;
3586
- offset?: [number, number] | undefined;
3587
- normalMap?: string | undefined;
3588
- normalScale?: number | undefined;
3589
- bumpMap?: string | undefined;
3590
- bumpScale?: number | undefined;
3591
- } | undefined;
3592
- } | undefined;
3593
- railingMaterialPreset?: string | undefined;
3594
- treadMaterial?: {
3595
- id?: string | undefined;
3596
- preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
3597
- properties?: {
3598
- color: string;
3599
- roughness: number;
3600
- metalness: number;
3601
- opacity: number;
3602
- transparent: boolean;
3603
- side: "back" | "double" | "front";
3604
- } | undefined;
3605
- texture?: {
3606
- url: string;
3607
- repeat?: [number, number] | undefined;
3608
- scale?: number | undefined;
3609
- offset?: [number, number] | undefined;
3610
- normalMap?: string | undefined;
3611
- normalScale?: number | undefined;
3612
- bumpMap?: string | undefined;
3613
- bumpScale?: number | undefined;
3614
- } | undefined;
3615
- } | undefined;
3616
- treadMaterialPreset?: string | undefined;
3617
- sideMaterial?: {
3618
- id?: string | undefined;
3619
- preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
3620
- properties?: {
3621
- color: string;
3622
- roughness: number;
3623
- metalness: number;
3624
- opacity: number;
3625
- transparent: boolean;
3626
- side: "back" | "double" | "front";
3627
- } | undefined;
3628
- texture?: {
3629
- url: string;
3630
- repeat?: [number, number] | undefined;
3631
- scale?: number | undefined;
3632
- offset?: [number, number] | undefined;
3633
- normalMap?: string | undefined;
3634
- normalScale?: number | undefined;
3635
- bumpMap?: string | undefined;
3636
- bumpScale?: number | undefined;
3637
- } | undefined;
3638
- } | undefined;
3639
- sideMaterialPreset?: string | undefined;
3640
3512
  slots?: Record<string, string> | undefined;
3641
- position: [number, number, number];
3642
- rotation: number;
3643
- supportSlabId?: string | undefined;
3644
- stairType: "curved" | "spiral" | "straight";
3645
- fromLevelId: string | null;
3646
- toLevelId: string | null;
3647
- deckSlabId?: string | undefined;
3648
- slabOpeningMode: "destination" | "none";
3649
- openingOffset: number;
3650
- width: number;
3651
- totalRise?: number | undefined;
3652
- designTargets?: {
3653
- maxRiserHeight: number;
3654
- minimumGoing: number;
3655
- targetGoing: number;
3656
- minimumHeadroom: number;
3657
- } | undefined;
3658
- uniformRisers?: boolean | undefined;
3659
- stepCount: number;
3660
- autoSurfaceSnap?: boolean | undefined;
3661
- destinationSurfaceId?: string | undefined;
3513
+ start: [number, number];
3514
+ end: [number, number];
3515
+ path?: [number, number][] | undefined;
3516
+ spanModes?: ("curve" | "straight")[] | undefined;
3517
+ tangents?: ([number, number] | null)[] | undefined;
3518
+ height: number;
3662
3519
  thickness: number;
3663
- fillToFloor: boolean;
3664
- construction?: {
3665
- mode: "center-stringer" | "open" | "side-stringers" | "solid" | "waist";
3666
- waistThickness: number;
3667
- treadThickness: number;
3668
- riserThickness: number;
3669
- nosing: number;
3670
- finishThickness: number;
3671
- closedRisers: boolean;
3672
- stringerWidth: number;
3673
- stringerDepth: number;
3674
- } | undefined;
3675
- structure?: {
3676
- type: "concrete" | "steel-stringers" | "wood-stringers";
3677
- stringerStock: "2x10" | "2x12";
3678
- stringerType: "cut" | "housed";
3679
- stringerSpacing: number;
3680
- stringerCount?: number | undefined;
3681
- treadStock?: "2x12" | "2x6-pair" | "5/4x6-pair" | "plywood-finish" | undefined;
3682
- closedRisers?: boolean | undefined;
3683
- treated?: boolean | undefined;
3684
- nosing?: number | undefined;
3520
+ supportSlabId?: string | undefined;
3521
+ supportSurfaceNodeId?: string | undefined;
3522
+ supportOffset?: number | undefined;
3523
+ surfaceMode: "auto" | "level" | "selected";
3524
+ transitionMode: "break" | "slope" | "step";
3525
+ transitionWidth: number;
3526
+ curveOffset?: number | undefined;
3527
+ baseHeight: number;
3528
+ postSpacing: number;
3529
+ picketSpacing: number;
3530
+ patternDistribution: "automatic" | "equal-fit" | "fixed-count" | "fixed-spacing" | "maximum-spacing";
3531
+ patternAlignment: "center" | "end" | "start";
3532
+ patternCount: number;
3533
+ patternRemainder: "leave" | "spread";
3534
+ picketWidth: number;
3535
+ picketTop: "dog-ear" | "flat" | "pointed" | "rounded";
3536
+ picketProfile: "alternating" | "arched" | "level" | "scalloped";
3537
+ picketTopClearance: number;
3538
+ picketVariation: number;
3539
+ picketRailProjection: number;
3540
+ picketRailCount: number;
3541
+ postSize: number;
3542
+ topRailHeight: number;
3543
+ groundClearance: number;
3544
+ edgeInset: number;
3545
+ slatGap: number;
3546
+ postCap: "flat" | "none" | "pyramid";
3547
+ baseStyle: "floating" | "grounded" | "raised";
3548
+ showInfill: boolean;
3549
+ guardInfill?: "balusters" | "boards" | "cable" | undefined;
3550
+ startPost?: boolean | undefined;
3551
+ endPost?: boolean | undefined;
3552
+ postThrough?: boolean | undefined;
3553
+ infillPlacement: "back" | "center" | "front";
3554
+ color: string;
3555
+ style: "guard" | "horizontal" | "picket" | "privacy" | "rail" | "slat";
3556
+ type: "fence";
3557
+ } | {
3558
+ object: "node";
3559
+ name?: string | undefined;
3560
+ parentId: string | null;
3561
+ visible: boolean;
3562
+ camera?: {
3563
+ position: [number, number, number];
3564
+ target: [number, number, number];
3565
+ mode: "orthographic" | "perspective";
3566
+ fov?: number | undefined;
3567
+ zoom?: number | undefined;
3685
3568
  } | undefined;
3686
- innerRadius: number;
3687
- sweepAngle: number;
3688
- topLandingMode: "integrated" | "none";
3689
- topLandingDepth: number;
3690
- showCenterColumn: boolean;
3691
- showStepSupports: boolean;
3692
- railingMode: "both" | "left" | "none" | "right";
3693
- railingHeight: number;
3694
- railingStyle?: "balusters" | "boards" | "cable" | "glass" | "metal" | "post-and-rail" | undefined;
3695
- railingPath?: "continuous" | "original" | undefined;
3696
- handrail?: {
3697
- mode: "both" | "left" | "none" | "right";
3698
- height: number;
3699
- diameter: number;
3700
- offset: number;
3701
- bottom?: {
3702
- extension: number;
3703
- return: "floor" | "none" | "post" | "wall";
3704
- returnLength: number;
3705
- } | undefined;
3706
- top?: {
3707
- extension: number;
3708
- return: "floor" | "none" | "post" | "wall";
3709
- returnLength: number;
3569
+ metadata: Record<string, unknown>;
3570
+ provenance?: {
3571
+ refs: {
3572
+ ns?: string | undefined;
3573
+ id: string;
3574
+ role?: "absorbed" | "alias" | "derived" | "piece" | "primary" | undefined;
3575
+ }[];
3576
+ lineage?: {
3577
+ op: "attach" | "convert" | "duplicate" | "import" | "make-independent" | "merge" | "promote" | "split";
3578
+ fromIds: string[];
3710
3579
  } | undefined;
3711
3580
  } | undefined;
3712
- railingTopPost?: boolean | undefined;
3713
- railingTopReach?: number | undefined;
3714
- railingPostThrough?: boolean | undefined;
3715
- children: `sseg_${string}`[];
3716
- type: "stair";
3581
+ id: `construction-dimension_${string}`;
3582
+ anchors: ({
3583
+ kind: "feature";
3584
+ reference: {
3585
+ nodeId: string;
3586
+ featureId: string;
3587
+ parameters?: Record<string, string | number | boolean> | undefined;
3588
+ };
3589
+ fallback: [number, number, number];
3590
+ } | [number, number, number])[];
3591
+ baseline: {
3592
+ origin: [number, number];
3593
+ direction: [number, number];
3594
+ };
3595
+ chainMode: "continuous" | "point-to-point";
3596
+ mode: "angular" | "arc-length" | "center-mark" | "chord" | "coordinate" | "diameter" | "linear" | "radius";
3597
+ featureCount: number;
3598
+ showCenterMark: boolean;
3599
+ prefix: string;
3600
+ suffix: string;
3601
+ textOverride: string | null;
3602
+ datumPolicy: "centerline" | "finish-face" | "structural-face" | "wall-face";
3603
+ terminator: "architectural-tick" | "dot" | "filled-arrow" | "open-arrow";
3604
+ textPosition: "above" | "centered";
3605
+ imperialPrecision: "1" | "1/16" | "1/2" | "1/4" | "1/8";
3606
+ metricNotation: "meters" | "millimeters";
3607
+ extensionStartGap: number;
3608
+ extensionOvershoot: number;
3609
+ drawingType: "floor-plan" | "foundation-plan" | "reflected-ceiling-plan" | "roof-plan" | "site-plan";
3610
+ drawingOverrides: {
3611
+ drawingType: "floor-plan" | "foundation-plan" | "reflected-ceiling-plan" | "roof-plan" | "site-plan";
3612
+ presentation: "controlled" | "omit" | "shown";
3613
+ suppressedSegmentIndexes: number[];
3614
+ }[];
3615
+ controllingDimensionId: `construction-dimension_${string}` | null;
3616
+ type: "construction-dimension";
3717
3617
  } | {
3718
3618
  object: "node";
3719
3619
  name?: string | undefined;
@@ -3738,20 +3638,29 @@ export declare function markSlabChangeDependents(previous: SlabNode, next: SlabN
3738
3638
  fromIds: string[];
3739
3639
  } | undefined;
3740
3640
  } | undefined;
3741
- id: `scan_${string}`;
3742
- url: string | null;
3743
- captureSession: {
3744
- sessionId: string;
3745
- schemaVersion?: number | undefined;
3746
- revisionId?: string | undefined;
3747
- manifestUrl?: string | undefined;
3748
- } | null;
3749
- layers: Record<string, boolean>;
3641
+ id: `block_${string}`;
3642
+ children: string[];
3750
3643
  position: [number, number, number];
3751
- rotation: [number, number, number];
3752
- scale: number;
3753
- opacity: number;
3754
- type: "scan";
3644
+ rotation: number;
3645
+ supportSlabId?: string | undefined;
3646
+ topology: {
3647
+ vertices: {
3648
+ id: string;
3649
+ position: [number, number, number];
3650
+ }[];
3651
+ edges: {
3652
+ id: string;
3653
+ vertexIds: [string, string];
3654
+ }[];
3655
+ faces: {
3656
+ id: string;
3657
+ vertexIds: string[];
3658
+ materialSlot: string;
3659
+ }[];
3660
+ };
3661
+ slots: Record<string, string>;
3662
+ slotNames: Record<string, string>;
3663
+ type: "block";
3755
3664
  } | {
3756
3665
  object: "node";
3757
3666
  name?: string | undefined;
@@ -3776,23 +3685,13 @@ export declare function markSlabChangeDependents(previous: SlabNode, next: SlabN
3776
3685
  fromIds: string[];
3777
3686
  } | undefined;
3778
3687
  } | undefined;
3779
- id: `guide_${string}`;
3780
- url: string;
3781
- position: [number, number, number];
3782
- rotation: [number, number, number];
3783
- scale: number;
3784
- opacity: number;
3785
- scaleReference: {
3786
- start: [number, number];
3787
- end: [number, number];
3788
- realLengthMeters: number;
3789
- measuredLengthUnits: number;
3790
- metersPerUnit: number;
3791
- displayLength?: number | undefined;
3792
- displayUnit?: "centimeters" | "feet" | "inches" | "meters" | undefined;
3793
- label: string;
3794
- } | null;
3795
- type: "guide";
3688
+ id: `structural-grid_${string}`;
3689
+ start: [number, number];
3690
+ end: [number, number];
3691
+ label: string;
3692
+ showStartBubble: boolean;
3693
+ showEndBubble: boolean;
3694
+ type: "structural-grid";
3796
3695
  } | {
3797
3696
  object: "node";
3798
3697
  name?: string | undefined;
@@ -3817,131 +3716,187 @@ export declare function markSlabChangeDependents(previous: SlabNode, next: SlabN
3817
3716
  fromIds: string[];
3818
3717
  } | undefined;
3819
3718
  } | undefined;
3820
- id: `shelf_${string}`;
3821
- children: string[];
3822
- position: [number, number, number];
3823
- rotation: [number, number, number];
3824
- supportSlabId?: string | undefined;
3825
- width: number;
3826
- depth: number;
3827
- thickness: number;
3828
- height: number;
3829
- style: "bookshelf" | "cubby" | "open-rack" | "wall-shelf";
3830
- rows: number;
3831
- columns: number;
3832
- withBack: boolean;
3833
- withSides: boolean;
3834
- withBottom: boolean;
3835
- bracketStyle: "hidden" | "industrial" | "minimal";
3836
- material?: {
3837
- id?: string | undefined;
3838
- preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
3839
- properties?: {
3840
- color: string;
3841
- roughness: number;
3842
- metalness: number;
3843
- opacity: number;
3844
- transparent: boolean;
3845
- side: "back" | "double" | "front";
3719
+ type: "procedural-item";
3720
+ id: `procedural-item_${string}`;
3721
+ recipe: {
3722
+ version: 1 | 2;
3723
+ name: string;
3724
+ description: string;
3725
+ classification?: {
3726
+ category: string;
3727
+ functionTags: string[];
3728
+ tags: string[];
3846
3729
  } | undefined;
3847
- texture?: {
3848
- url: string;
3849
- repeat?: [number, number] | undefined;
3850
- scale?: number | undefined;
3851
- offset?: [number, number] | undefined;
3852
- normalMap?: string | undefined;
3853
- normalScale?: number | undefined;
3854
- bumpMap?: string | undefined;
3855
- bumpScale?: number | undefined;
3730
+ mounting?: {
3731
+ attachTo: "ceiling" | "wall-side";
3732
+ reference: string;
3856
3733
  } | undefined;
3857
- } | undefined;
3858
- materialPreset?: string | undefined;
3859
- slots?: Record<string, string> | undefined;
3860
- type: "shelf";
3861
- } | {
3862
- object: "node";
3863
- name?: string | undefined;
3864
- parentId: string | null;
3865
- visible: boolean;
3866
- camera?: {
3867
- position: [number, number, number];
3868
- target: [number, number, number];
3869
- mode: "orthographic" | "perspective";
3870
- fov?: number | undefined;
3871
- zoom?: number | undefined;
3872
- } | undefined;
3873
- metadata: Record<string, unknown>;
3874
- provenance?: {
3875
- refs: {
3876
- ns?: string | undefined;
3734
+ base?: import("../../procedural-items/index.js").Expr | undefined;
3735
+ cuts?: ({
3736
+ shape: "rect";
3737
+ size: [import("../../procedural-items/index.js").Expr, import("../../procedural-items/index.js").Expr];
3738
+ center?: [import("../../procedural-items/index.js").Expr, import("../../procedural-items/index.js").Expr] | undefined;
3739
+ } | {
3740
+ shape: "circle";
3741
+ diameter: import("../../procedural-items/index.js").Expr;
3742
+ center?: [import("../../procedural-items/index.js").Expr, import("../../procedural-items/index.js").Expr] | undefined;
3743
+ })[] | undefined;
3744
+ surfaces?: {
3877
3745
  id: string;
3878
- role?: "absorbed" | "alias" | "derived" | "piece" | "primary" | undefined;
3746
+ label: string;
3747
+ part?: string | undefined;
3748
+ position: [import("../../procedural-items/index.js").Expr, import("../../procedural-items/index.js").Expr, import("../../procedural-items/index.js").Expr];
3749
+ rotation?: [import("../../procedural-items/index.js").Expr, import("../../procedural-items/index.js").Expr, import("../../procedural-items/index.js").Expr] | undefined;
3750
+ size: [import("../../procedural-items/index.js").Expr, import("../../procedural-items/index.js").Expr];
3751
+ }[] | undefined;
3752
+ parameters: {
3753
+ id: string;
3754
+ label: string;
3755
+ default: number;
3756
+ min: number;
3757
+ max: number;
3758
+ step: number;
3759
+ unit: "bool" | "choice" | "count" | "m" | "rad" | "s";
3760
+ options?: string[] | undefined;
3761
+ part?: string | undefined;
3762
+ axis?: "x" | "y" | "z" | undefined;
3763
+ }[];
3764
+ slots: {
3765
+ id: string;
3766
+ label: string;
3767
+ color: string;
3768
+ finish?: "glass" | "metal" | "wood" | undefined;
3769
+ }[];
3770
+ parts: {
3771
+ id: string;
3772
+ label: string;
3773
+ count: import("../../procedural-items/index.js").Expr;
3774
+ parent?: string | undefined;
3775
+ frame?: {
3776
+ position: [import("../../procedural-items/index.js").Expr, import("../../procedural-items/index.js").Expr, import("../../procedural-items/index.js").Expr];
3777
+ rotation?: [import("../../procedural-items/index.js").Expr, import("../../procedural-items/index.js").Expr, import("../../procedural-items/index.js").Expr] | undefined;
3778
+ } | undefined;
3779
+ when?: import("../../procedural-items/index.js").Expr | undefined;
3780
+ motion?: {
3781
+ delay?: import("../../procedural-items/index.js").Expr | undefined;
3782
+ duration?: import("../../procedural-items/index.js").Expr | undefined;
3783
+ easing?: "linear" | "smooth" | "soft" | undefined;
3784
+ kind: "hinge";
3785
+ pivot: [import("../../procedural-items/index.js").Expr, import("../../procedural-items/index.js").Expr, import("../../procedural-items/index.js").Expr];
3786
+ axis: "x" | "y" | "z";
3787
+ angle: import("../../procedural-items/index.js").Expr;
3788
+ } | {
3789
+ delay?: import("../../procedural-items/index.js").Expr | undefined;
3790
+ duration?: import("../../procedural-items/index.js").Expr | undefined;
3791
+ easing?: "linear" | "smooth" | "soft" | undefined;
3792
+ kind: "slide";
3793
+ axis: "x" | "y" | "z";
3794
+ distance: import("../../procedural-items/index.js").Expr;
3795
+ } | {
3796
+ kind: "spin";
3797
+ pivot: [import("../../procedural-items/index.js").Expr, import("../../procedural-items/index.js").Expr, import("../../procedural-items/index.js").Expr];
3798
+ axis: "x" | "y" | "z";
3799
+ radiansPerSecond: import("../../procedural-items/index.js").Expr;
3800
+ } | undefined;
3801
+ light?: {
3802
+ position: [import("../../procedural-items/index.js").Expr, import("../../procedural-items/index.js").Expr, import("../../procedural-items/index.js").Expr];
3803
+ color: string;
3804
+ intensity?: number | undefined;
3805
+ distance?: number | undefined;
3806
+ emissiveSlot?: string | undefined;
3807
+ } | undefined;
3808
+ shapes: ({
3809
+ support?: boolean | undefined;
3810
+ when?: import("../../procedural-items/index.js").Expr | undefined;
3811
+ id: string;
3812
+ primitive: "box" | "cylinder" | "ellipsoid" | "roundedBox";
3813
+ slot: string;
3814
+ size: [import("../../procedural-items/index.js").Expr, import("../../procedural-items/index.js").Expr, import("../../procedural-items/index.js").Expr];
3815
+ position: [import("../../procedural-items/index.js").Expr, import("../../procedural-items/index.js").Expr, import("../../procedural-items/index.js").Expr];
3816
+ rotation?: [import("../../procedural-items/index.js").Expr, import("../../procedural-items/index.js").Expr, import("../../procedural-items/index.js").Expr] | undefined;
3817
+ radius?: import("../../procedural-items/index.js").Expr | undefined;
3818
+ topScale?: import("../../procedural-items/index.js").Expr | undefined;
3819
+ segments?: number | undefined;
3820
+ open?: boolean | undefined;
3821
+ inner?: import("../../procedural-items/index.js").Expr | undefined;
3822
+ arc?: import("../../procedural-items/index.js").Expr | undefined;
3823
+ } | {
3824
+ support?: boolean | undefined;
3825
+ when?: import("../../procedural-items/index.js").Expr | undefined;
3826
+ id: string;
3827
+ primitive: "extrude";
3828
+ slot: string;
3829
+ section: {
3830
+ kind: "rectangle";
3831
+ width: import("../../procedural-items/index.js").Expr;
3832
+ depth: import("../../procedural-items/index.js").Expr;
3833
+ corner?: import("../../procedural-items/index.js").Expr | undefined;
3834
+ } | {
3835
+ kind: "round";
3836
+ radius: import("../../procedural-items/index.js").Expr;
3837
+ wall?: import("../../procedural-items/index.js").Expr | undefined;
3838
+ } | {
3839
+ kind: "oval";
3840
+ width: import("../../procedural-items/index.js").Expr;
3841
+ depth: import("../../procedural-items/index.js").Expr;
3842
+ } | {
3843
+ kind: "section";
3844
+ family: "C" | "I" | "L" | "T" | "Z" | "rect-tube";
3845
+ width: import("../../procedural-items/index.js").Expr;
3846
+ depth: import("../../procedural-items/index.js").Expr;
3847
+ web: import("../../procedural-items/index.js").Expr;
3848
+ flange: import("../../procedural-items/index.js").Expr;
3849
+ } | {
3850
+ kind: "polygon";
3851
+ outer: [import("../../procedural-items/index.js").Expr, import("../../procedural-items/index.js").Expr][];
3852
+ holes?: [import("../../procedural-items/index.js").Expr, import("../../procedural-items/index.js").Expr][][] | undefined;
3853
+ };
3854
+ length: import("../../procedural-items/index.js").Expr;
3855
+ bevel?: import("../../procedural-items/index.js").Expr | undefined;
3856
+ position: [import("../../procedural-items/index.js").Expr, import("../../procedural-items/index.js").Expr, import("../../procedural-items/index.js").Expr];
3857
+ rotation?: [import("../../procedural-items/index.js").Expr, import("../../procedural-items/index.js").Expr, import("../../procedural-items/index.js").Expr] | undefined;
3858
+ } | {
3859
+ support?: boolean | undefined;
3860
+ when?: import("../../procedural-items/index.js").Expr | undefined;
3861
+ id: string;
3862
+ primitive: "revolve";
3863
+ slot: string;
3864
+ profile: [import("../../procedural-items/index.js").Expr, import("../../procedural-items/index.js").Expr][];
3865
+ segments?: number | undefined;
3866
+ arc?: import("../../procedural-items/index.js").Expr | undefined;
3867
+ position: [import("../../procedural-items/index.js").Expr, import("../../procedural-items/index.js").Expr, import("../../procedural-items/index.js").Expr];
3868
+ rotation?: [import("../../procedural-items/index.js").Expr, import("../../procedural-items/index.js").Expr, import("../../procedural-items/index.js").Expr] | undefined;
3869
+ })[];
3879
3870
  }[];
3880
- lineage?: {
3881
- op: "attach" | "convert" | "duplicate" | "import" | "make-independent" | "merge" | "promote" | "split";
3882
- fromIds: string[];
3883
- } | undefined;
3884
- } | undefined;
3885
- id: `duct-fitting_${string}`;
3886
- position: [number, number, number];
3887
- rotation: [number, number, number];
3888
- fittingType: "access-panel" | "coupling" | "cross" | "damper" | "elbow" | "end-cap" | "reducer" | "tee" | "transition";
3889
- shape: "oval" | "rect" | "round";
3890
- inletShape?: "oval" | "rect" | "round" | undefined;
3891
- outletShape?: "oval" | "rect" | "round" | undefined;
3892
- width: number;
3893
- height: number;
3894
- shape2: "oval" | "rect" | "round";
3895
- width2: number;
3896
- height2: number;
3897
- angle: number;
3898
- branchAngle: number;
3899
- diameter: number;
3900
- diameter2: number;
3901
- ductMaterial: "duct-board" | "flex" | "sheet-metal";
3902
- system: "return" | "supply";
3903
- damperAngle: number;
3904
- panelWidth: number;
3905
- panelHeight: number;
3906
- slots?: Record<string, string> | undefined;
3907
- type: "duct-fitting";
3908
- } | {
3909
- object: "node";
3910
- name?: string | undefined;
3911
- parentId: string | null;
3912
- visible: boolean;
3913
- camera?: {
3914
- position: [number, number, number];
3915
- target: [number, number, number];
3916
- mode: "orthographic" | "perspective";
3917
- fov?: number | undefined;
3918
- zoom?: number | undefined;
3919
- } | undefined;
3920
- metadata: Record<string, unknown>;
3921
- provenance?: {
3922
- refs: {
3923
- ns?: string | undefined;
3924
- id: string;
3925
- role?: "absorbed" | "alias" | "derived" | "piece" | "primary" | undefined;
3871
+ joints?: {
3872
+ delay?: import("../../procedural-items/index.js").Expr | undefined;
3873
+ duration?: import("../../procedural-items/index.js").Expr | undefined;
3874
+ easing?: "linear" | "smooth" | "soft" | undefined;
3875
+ child: string;
3876
+ kind: "continuous" | "fixed" | "prismatic" | "revolute";
3877
+ origin: [import("../../procedural-items/index.js").Expr, import("../../procedural-items/index.js").Expr, import("../../procedural-items/index.js").Expr];
3878
+ axis: [import("../../procedural-items/index.js").Expr, import("../../procedural-items/index.js").Expr, import("../../procedural-items/index.js").Expr];
3879
+ open?: import("../../procedural-items/index.js").Expr | undefined;
3880
+ rest?: import("../../procedural-items/index.js").Expr | undefined;
3881
+ range?: [import("../../procedural-items/index.js").Expr, import("../../procedural-items/index.js").Expr] | undefined;
3882
+ speed?: import("../../procedural-items/index.js").Expr | undefined;
3883
+ }[] | undefined;
3884
+ constraints: {
3885
+ left: import("../../procedural-items/index.js").Expr;
3886
+ relation: "gte" | "lte";
3887
+ right: import("../../procedural-items/index.js").Expr;
3888
+ message: string;
3926
3889
  }[];
3927
- lineage?: {
3928
- op: "attach" | "convert" | "duplicate" | "import" | "make-independent" | "merge" | "promote" | "split";
3929
- fromIds: string[];
3930
- } | undefined;
3931
- } | undefined;
3932
- id: `duct-terminal_${string}`;
3890
+ };
3891
+ parameters: Record<string, number>;
3892
+ slots: Record<string, string>;
3933
3893
  position: [number, number, number];
3934
- rotation: number;
3894
+ rotation: [number, number, number];
3895
+ wallId?: string | undefined;
3896
+ side?: "back" | "front" | undefined;
3935
3897
  supportSlabId?: string | undefined;
3936
- terminalType: "diffuser" | "return-grille" | "supply-register";
3937
- mount: "ceiling" | "floor" | "wall";
3938
- width: number;
3939
- depth: number;
3940
- collarShape: "oval" | "rect" | "round";
3941
- collarDiameter: number;
3942
- collarWidth: number;
3943
- collarHeight: number;
3944
- type: "duct-terminal";
3898
+ children: string[];
3899
+ attachments: Record<string, string>;
3945
3900
  } | {
3946
3901
  object: "node";
3947
3902
  name?: string | undefined;
@@ -3966,26 +3921,19 @@ export declare function markSlabChangeDependents(previous: SlabNode, next: SlabN
3966
3921
  fromIds: string[];
3967
3922
  } | undefined;
3968
3923
  } | undefined;
3969
- id: `hvac-equipment_${string}`;
3924
+ id: `imesh_${string}`;
3970
3925
  position: [number, number, number];
3971
- rotation: number;
3972
- supportSlabId?: string | undefined;
3973
- equipmentType: "air-handler" | "condenser" | "furnace";
3974
- width: number;
3975
- depth: number;
3976
- height: number;
3977
- supplyShape: "oval" | "rect" | "round";
3978
- returnShape: "oval" | "rect" | "round";
3979
- supplyDiameter: number;
3980
- returnDiameter: number;
3981
- supplyWidth: number;
3982
- supplyHeight: number;
3983
- returnWidth: number;
3984
- returnHeight: number;
3985
- type: "hvac-equipment";
3926
+ rotation: [number, number, number];
3927
+ primitives: {
3928
+ positions: number[];
3929
+ normals?: number[] | undefined;
3930
+ indices: number[];
3931
+ color: string;
3932
+ opacity: number;
3933
+ }[];
3934
+ type: "imported-mesh";
3986
3935
  } | {
3987
3936
  object: "node";
3988
- name?: string | undefined;
3989
3937
  parentId: string | null;
3990
3938
  visible: boolean;
3991
3939
  camera?: {
@@ -3995,7 +3943,6 @@ export declare function markSlabChangeDependents(previous: SlabNode, next: SlabN
3995
3943
  fov?: number | undefined;
3996
3944
  zoom?: number | undefined;
3997
3945
  } | undefined;
3998
- metadata: Record<string, unknown>;
3999
3946
  provenance?: {
4000
3947
  refs: {
4001
3948
  ns?: string | undefined;
@@ -4007,121 +3954,190 @@ export declare function markSlabChangeDependents(previous: SlabNode, next: SlabN
4007
3954
  fromIds: string[];
4008
3955
  } | undefined;
4009
3956
  } | undefined;
4010
- id: `liquid-line_${string}`;
4011
- path: [number, number, number][];
4012
- diameter: number;
4013
- type: "liquid-line";
4014
- } | {
4015
- object: "node";
4016
- name?: string | undefined;
4017
- parentId: string | null;
4018
- visible: boolean;
4019
- camera?: {
4020
- position: [number, number, number];
4021
- target: [number, number, number];
4022
- mode: "orthographic" | "perspective";
4023
- fov?: number | undefined;
4024
- zoom?: number | undefined;
4025
- } | undefined;
4026
- metadata: Record<string, unknown>;
4027
- provenance?: {
4028
- refs: {
4029
- ns?: string | undefined;
3957
+ id: `zone_${string}`;
3958
+ name: string;
3959
+ polygon: [number, number][];
3960
+ holes: [number, number][][];
3961
+ autoFromWalls: boolean;
3962
+ boundaryWallIds: `wall_${string}`[];
3963
+ boundarySeparatorIds: string[];
3964
+ hostZoneId?: string | undefined;
3965
+ seed?: [number, number] | undefined;
3966
+ floor?: {
3967
+ elevation?: number | undefined;
3968
+ support?: "open" | undefined;
3969
+ footprint?: string | undefined;
3970
+ thickness?: number | undefined;
3971
+ sourceSlabId?: `slab_${string}` | undefined;
3972
+ finish?: string | Record<string, unknown> | undefined;
3973
+ regions?: {
4030
3974
  id: string;
4031
- role?: "absorbed" | "alias" | "derived" | "piece" | "primary" | undefined;
4032
- }[];
4033
- lineage?: {
4034
- op: "attach" | "convert" | "duplicate" | "import" | "make-independent" | "merge" | "promote" | "split";
4035
- fromIds: string[];
3975
+ polygon: [number, number][];
3976
+ finish: string | Record<string, unknown>;
3977
+ }[] | undefined;
3978
+ script?: {
3979
+ kind: "script";
3980
+ meta?: {
3981
+ description?: string | undefined;
3982
+ category?: string | undefined;
3983
+ tags?: string[] | undefined;
3984
+ parent?: string | undefined;
3985
+ } | undefined;
3986
+ language: "bpy" | "three";
3987
+ script: string;
3988
+ params: Record<string, string | number | boolean>;
3989
+ artifact: string;
3990
+ manifest: {
3991
+ bounds: {
3992
+ min: [number, number, number];
3993
+ max: [number, number, number];
3994
+ };
3995
+ params: {
3996
+ id: string;
3997
+ label?: string | undefined;
3998
+ kind: "boolean" | "number" | "string";
3999
+ default: string | number | boolean;
4000
+ min?: number | undefined;
4001
+ max?: number | undefined;
4002
+ step?: number | undefined;
4003
+ unit?: string | undefined;
4004
+ options?: string[] | undefined;
4005
+ }[];
4006
+ parts: {
4007
+ id: string;
4008
+ label?: string | undefined;
4009
+ type?: string | undefined;
4010
+ bounds?: {
4011
+ min: [number, number, number];
4012
+ max: [number, number, number];
4013
+ } | undefined;
4014
+ }[];
4015
+ surfaces: {
4016
+ part?: string | undefined;
4017
+ y: number;
4018
+ polygon: [number, number][];
4019
+ }[];
4020
+ slots: {
4021
+ id: string;
4022
+ label?: string | undefined;
4023
+ color?: string | undefined;
4024
+ roughness?: number | undefined;
4025
+ metalness?: number | undefined;
4026
+ transparent?: boolean | undefined;
4027
+ emissive?: boolean | undefined;
4028
+ }[];
4029
+ anchors: {
4030
+ id: string;
4031
+ position: [number, number, number];
4032
+ normal?: [number, number, number] | undefined;
4033
+ }[];
4034
+ lights: {
4035
+ id: string;
4036
+ position: [number, number, number];
4037
+ color: string;
4038
+ intensity: number;
4039
+ distance?: number | undefined;
4040
+ spot?: {
4041
+ direction: [number, number, number];
4042
+ angle: number;
4043
+ softness: number;
4044
+ } | undefined;
4045
+ shadows?: boolean | undefined;
4046
+ glow?: {
4047
+ size: number;
4048
+ strength: number;
4049
+ } | undefined;
4050
+ }[];
4051
+ undersides: {
4052
+ part?: string | undefined;
4053
+ polygon: [number, number][];
4054
+ plane: [number, number, number, number];
4055
+ }[];
4056
+ animations: {
4057
+ name: string;
4058
+ duration: number;
4059
+ }[];
4060
+ cutters?: {
4061
+ host: "ceiling" | "mounted" | "slab" | "wall";
4062
+ polygon: number[][];
4063
+ minY: number;
4064
+ maxY: number;
4065
+ }[] | undefined;
4066
+ cutout: boolean;
4067
+ collider: boolean;
4068
+ shape?: {
4069
+ tolerance: number;
4070
+ bands: {
4071
+ y0: number;
4072
+ y1: number;
4073
+ polygons: {
4074
+ outer: [number, number][];
4075
+ holes?: [number, number][][] | undefined;
4076
+ }[];
4077
+ }[];
4078
+ } | undefined;
4079
+ triangles: number;
4080
+ coverage?: number | undefined;
4081
+ uncovered?: {
4082
+ min: [number, number];
4083
+ max: [number, number];
4084
+ }[] | undefined;
4085
+ };
4086
+ images?: {
4087
+ artifact: string;
4088
+ thumbnail: string;
4089
+ floorPlan: string;
4090
+ } | undefined;
4091
+ inputs: string;
4036
4092
  } | undefined;
4093
+ drop?: number | undefined;
4037
4094
  } | undefined;
4038
- id: `pipe-segment_${string}`;
4039
- path: [number, number, number][];
4040
- autoHangers?: boolean | undefined;
4041
- hangerOverrides?: Record<string, {
4042
- fraction?: number | undefined;
4043
- skipped?: boolean | undefined;
4044
- hostId?: string | undefined;
4045
- }> | undefined;
4046
- hangerStyle?: "double" | "single" | undefined;
4047
- hangerSpacing?: number | undefined;
4048
- hangerMaxReach?: number | undefined;
4049
- wallAttachment?: {
4050
- wallId: `wall_${string}`;
4051
- side: "back" | "front";
4052
- startUV: [number, number];
4053
- endUV: [number, number];
4054
- offset: number;
4095
+ roomType?: "deck" | "patio" | "porch" | undefined;
4096
+ porchFraming?: {
4097
+ auto?: boolean | undefined;
4098
+ postSize?: string | undefined;
4099
+ postSpacing?: number | undefined;
4100
+ beamSize?: string | undefined;
4055
4101
  } | undefined;
4056
- diameter: number;
4057
- pipeMaterial: "abs" | "cast-iron" | "pvc";
4058
- system: "vent" | "waste";
4059
- type: "pipe-segment";
4060
- } | {
4061
- object: "node";
4062
- name?: string | undefined;
4063
- parentId: string | null;
4064
- visible: boolean;
4065
- camera?: {
4066
- position: [number, number, number];
4067
- target: [number, number, number];
4068
- mode: "orthographic" | "perspective";
4069
- fov?: number | undefined;
4070
- zoom?: number | undefined;
4102
+ decking?: {
4103
+ boardSize?: "2x4" | "2x6" | "5/4x6" | "composite" | undefined;
4104
+ gap?: number | undefined;
4105
+ direction?: "diagonal" | "parallel" | "perpendicular" | undefined;
4071
4106
  } | undefined;
4072
- metadata: Record<string, unknown>;
4073
- provenance?: {
4074
- refs: {
4075
- ns?: string | undefined;
4107
+ ceiling?: {
4108
+ regions?: {
4076
4109
  id: string;
4077
- role?: "absorbed" | "alias" | "derived" | "piece" | "primary" | undefined;
4078
- }[];
4079
- lineage?: {
4080
- op: "attach" | "convert" | "duplicate" | "import" | "make-independent" | "merge" | "promote" | "split";
4081
- fromIds: string[];
4082
- } | undefined;
4083
- } | undefined;
4084
- id: `pipe-fitting_${string}`;
4085
- position: [number, number, number];
4086
- rotation: [number, number, number];
4087
- fittingType: "cleanout" | "coupling" | "cross" | "elbow" | "end-cap" | "reducer" | "sanitary-tee" | "wye";
4088
- angle: number;
4089
- diameter: number;
4090
- diameter2: number;
4091
- cleanoutStyle: "end" | "inline";
4092
- pipeMaterial: "abs" | "cast-iron" | "pvc";
4093
- system: "vent" | "waste";
4094
- type: "pipe-fitting";
4095
- } | {
4096
- object: "node";
4097
- name?: string | undefined;
4098
- parentId: string | null;
4099
- visible: boolean;
4100
- camera?: {
4101
- position: [number, number, number];
4102
- target: [number, number, number];
4103
- mode: "orthographic" | "perspective";
4104
- fov?: number | undefined;
4105
- zoom?: number | undefined;
4110
+ polygon: [number, number][];
4111
+ finish: string | Record<string, unknown>;
4112
+ }[] | undefined;
4106
4113
  } | undefined;
4114
+ floorStepFinish?: string | undefined;
4115
+ floorStepOverrides?: {
4116
+ key: string;
4117
+ step?: number | undefined;
4118
+ finish: string;
4119
+ }[] | undefined;
4120
+ floorEdgeFinish?: string | undefined;
4121
+ wallMaterial?: string | undefined;
4122
+ wallOverrides?: {
4123
+ wallId: string;
4124
+ face: "a" | "b";
4125
+ finish: string;
4126
+ }[] | undefined;
4127
+ hasFloor?: false | undefined;
4128
+ hasCeiling?: false | undefined;
4129
+ spaceRole: "generic" | "room";
4130
+ roomNumber: string;
4131
+ enclosureStatus: "auto" | "enclosed" | "open";
4132
+ floorFinish: string;
4133
+ wallFinish: string;
4134
+ ceilingFinish: string;
4135
+ ceilingHeight: number;
4136
+ occupancy: string;
4137
+ clearDimensionPolicy: "finish-faces" | "inside-faces" | "none";
4138
+ color: string;
4107
4139
  metadata: Record<string, unknown>;
4108
- provenance?: {
4109
- refs: {
4110
- ns?: string | undefined;
4111
- id: string;
4112
- role?: "absorbed" | "alias" | "derived" | "piece" | "primary" | undefined;
4113
- }[];
4114
- lineage?: {
4115
- op: "attach" | "convert" | "duplicate" | "import" | "make-independent" | "merge" | "promote" | "split";
4116
- fromIds: string[];
4117
- } | undefined;
4118
- } | undefined;
4119
- id: `level_${string}`;
4120
- children: (`beam_${string}` | `block_${string}` | `ceiling_${string}` | `column_${string}` | `construction-dimension_${string}` | `duct-fitting_${string}` | `duct-segment_${string}` | `duct-terminal_${string}` | `fence_${string}` | `floor-opening_${string}` | `guide_${string}` | `hvac-equipment_${string}` | `imesh_${string}` | `item_${string}` | `lineset_${string}` | `liquid-line_${string}` | `measurement_${string}` | `pipe-fitting_${string}` | `pipe-segment_${string}` | `pipe-trap_${string}` | `procedural-item_${string}` | `roof_${string}` | `scan_${string}` | `separator_${string}` | `shelf_${string}` | `slab_${string}` | `spawn_${string}` | `stair_${string}` | `structural-grid_${string}` | `wall_${string}` | `zone_${string}`)[];
4121
- level: number;
4122
- baseElevation: number;
4123
- height?: number | undefined;
4124
- type: "level";
4140
+ type: "zone";
4125
4141
  } | {
4126
4142
  object: "node";
4127
4143
  name?: string | undefined;
@@ -4146,7 +4162,8 @@ export declare function markSlabChangeDependents(previous: SlabNode, next: SlabN
4146
4162
  fromIds: string[];
4147
4163
  } | undefined;
4148
4164
  } | undefined;
4149
- id: `elevator_${string}`;
4165
+ id: `ceiling_${string}`;
4166
+ children: (`item_${string}` | `procedural-item_${string}`)[];
4150
4167
  material?: {
4151
4168
  id?: string | undefined;
4152
4169
  preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
@@ -4171,58 +4188,48 @@ export declare function markSlabChangeDependents(previous: SlabNode, next: SlabN
4171
4188
  } | undefined;
4172
4189
  materialPreset?: string | undefined;
4173
4190
  slots?: Record<string, string> | undefined;
4174
- position: [number, number, number];
4175
- rotation: number;
4176
- width: number;
4177
- depth: number;
4178
- shaftWidth?: number | undefined;
4179
- shaftDepth?: number | undefined;
4180
- shaftWallThickness: number;
4181
- shaftStyle: "glass" | "solid";
4182
- cabHeight: number;
4183
- doorWidth: number;
4184
- doorHeight: number;
4185
- doorStyle: "center-opening" | "single-left" | "single-right";
4186
- doorPanelStyle: "glass-frame" | "segmented-panel" | "solid-panel";
4187
- fromLevelId: string | null;
4188
- toLevelId: string | null;
4189
- servedLevelIds?: string[] | undefined;
4190
- disabledLevelIds: string[];
4191
- serviceOnlyLevelIds: string[];
4192
- defaultLevelId: string | null;
4193
- speed: number;
4194
- doorDurationMs: number;
4195
- dwellMs: number;
4196
- type: "elevator";
4197
- } | {
4198
- object: "node";
4199
- parentId: string | null;
4200
- visible: boolean;
4201
- camera?: {
4202
- position: [number, number, number];
4203
- target: [number, number, number];
4204
- mode: "orthographic" | "perspective";
4205
- fov?: number | undefined;
4206
- zoom?: number | undefined;
4207
- } | undefined;
4208
- provenance?: {
4209
- refs: {
4210
- ns?: string | undefined;
4211
- id: string;
4212
- role?: "absorbed" | "alias" | "derived" | "piece" | "primary" | undefined;
4213
- }[];
4214
- lineage?: {
4215
- op: "attach" | "convert" | "duplicate" | "import" | "make-independent" | "merge" | "promote" | "split";
4216
- fromIds: string[];
4191
+ polygon: [number, number][];
4192
+ holes: [number, number][][];
4193
+ holeMetadata: {
4194
+ source: "elevator" | "floor-opening" | "manual" | "room" | "stair";
4195
+ openingId?: string | undefined;
4196
+ stairId?: string | undefined;
4197
+ elevatorId?: string | undefined;
4198
+ }[];
4199
+ openingIds?: string[] | undefined;
4200
+ height?: number | undefined;
4201
+ buildUp?: {
4202
+ presetId?: string | undefined;
4203
+ finish?: {
4204
+ kind: "drywall" | "plaster" | "wood-plank";
4205
+ thickness: number;
4206
+ name?: string | undefined;
4207
+ } | undefined;
4208
+ framing?: {
4209
+ system: "joists" | "truss-chords";
4210
+ size: "2x10" | "2x12" | "2x4" | "2x6" | "2x8";
4211
+ spacing: number;
4212
+ } | undefined;
4213
+ decking?: {
4214
+ kind: "osb" | "plywood";
4215
+ thickness: number;
4216
+ name?: string | undefined;
4217
+ } | undefined;
4218
+ insulation?: {
4219
+ kind: "batt" | "blown" | "rigid";
4220
+ thickness: number;
4221
+ name?: string | undefined;
4217
4222
  } | undefined;
4218
4223
  } | undefined;
4219
- id: `unit_${string}`;
4220
- name: string;
4221
- kind: "apartment" | "commercial" | "common" | "hotel-room";
4222
- members: `zone_${string}`[];
4223
- color: string;
4224
- metadata: Record<string, unknown>;
4225
- type: "unit";
4224
+ regions?: {
4225
+ id: string;
4226
+ polygon: [number, number][];
4227
+ finish: string | Record<string, unknown>;
4228
+ }[] | undefined;
4229
+ boundary?: "auto" | undefined;
4230
+ zoneId?: string | undefined;
4231
+ autoFromWalls: boolean;
4232
+ type: "ceiling";
4226
4233
  } | {
4227
4234
  object: "node";
4228
4235
  name?: string | undefined;
@@ -4247,12 +4254,59 @@ export declare function markSlabChangeDependents(previous: SlabNode, next: SlabN
4247
4254
  fromIds: string[];
4248
4255
  } | undefined;
4249
4256
  } | undefined;
4250
- id: `building_${string}`;
4251
- children: (`elevator_${string}` | `level_${string}` | `unit_${string}`)[];
4257
+ id: `sseg_${string}`;
4258
+ material?: {
4259
+ id?: string | undefined;
4260
+ preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
4261
+ properties?: {
4262
+ color: string;
4263
+ roughness: number;
4264
+ metalness: number;
4265
+ opacity: number;
4266
+ transparent: boolean;
4267
+ side: "back" | "double" | "front";
4268
+ } | undefined;
4269
+ texture?: {
4270
+ url: string;
4271
+ repeat?: [number, number] | undefined;
4272
+ scale?: number | undefined;
4273
+ offset?: [number, number] | undefined;
4274
+ normalMap?: string | undefined;
4275
+ normalScale?: number | undefined;
4276
+ bumpMap?: string | undefined;
4277
+ bumpScale?: number | undefined;
4278
+ } | undefined;
4279
+ } | undefined;
4280
+ materialPreset?: string | undefined;
4281
+ slots?: Record<string, string> | undefined;
4252
4282
  position: [number, number, number];
4253
- rotation: [number, number, number];
4254
- groundLevelId?: `level_${string}` | undefined;
4255
- type: "building";
4283
+ rotation: number;
4284
+ segmentType: "landing" | "stair";
4285
+ width: number;
4286
+ length: number;
4287
+ height: number;
4288
+ stepCount: number;
4289
+ attachmentSide: "front" | "left" | "right";
4290
+ fillToFloor: boolean;
4291
+ construction?: {
4292
+ mode: "center-stringer" | "open" | "side-stringers" | "solid" | "waist";
4293
+ waistThickness: number;
4294
+ treadThickness: number;
4295
+ riserThickness: number;
4296
+ nosing: number;
4297
+ finishThickness: number;
4298
+ closedRisers: boolean;
4299
+ stringerWidth: number;
4300
+ stringerDepth: number;
4301
+ } | undefined;
4302
+ winder?: {
4303
+ turn: "left" | "right";
4304
+ innerGap: number;
4305
+ walkingLineOffset: number;
4306
+ division: "equal-angle" | "equal-going";
4307
+ } | undefined;
4308
+ thickness: number;
4309
+ type: "stair-segment";
4256
4310
  } | {
4257
4311
  object: "node";
4258
4312
  name?: string | undefined;
@@ -4277,7 +4331,7 @@ export declare function markSlabChangeDependents(previous: SlabNode, next: SlabN
4277
4331
  fromIds: string[];
4278
4332
  } | undefined;
4279
4333
  } | undefined;
4280
- id: `dormer_${string}`;
4334
+ id: `stair_${string}`;
4281
4335
  material?: {
4282
4336
  id?: string | undefined;
4283
4337
  preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
@@ -4301,7 +4355,7 @@ export declare function markSlabChangeDependents(previous: SlabNode, next: SlabN
4301
4355
  } | undefined;
4302
4356
  } | undefined;
4303
4357
  materialPreset?: string | undefined;
4304
- topMaterial?: {
4358
+ railingMaterial?: {
4305
4359
  id?: string | undefined;
4306
4360
  preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
4307
4361
  properties?: {
@@ -4323,8 +4377,8 @@ export declare function markSlabChangeDependents(previous: SlabNode, next: SlabN
4323
4377
  bumpScale?: number | undefined;
4324
4378
  } | undefined;
4325
4379
  } | undefined;
4326
- topMaterialPreset?: string | undefined;
4327
- sideMaterial?: {
4380
+ railingMaterialPreset?: string | undefined;
4381
+ treadMaterial?: {
4328
4382
  id?: string | undefined;
4329
4383
  preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
4330
4384
  properties?: {
@@ -4346,8 +4400,8 @@ export declare function markSlabChangeDependents(previous: SlabNode, next: SlabN
4346
4400
  bumpScale?: number | undefined;
4347
4401
  } | undefined;
4348
4402
  } | undefined;
4349
- sideMaterialPreset?: string | undefined;
4350
- wallMaterial?: {
4403
+ treadMaterialPreset?: string | undefined;
4404
+ sideMaterial?: {
4351
4405
  id?: string | undefined;
4352
4406
  preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
4353
4407
  properties?: {
@@ -4369,34 +4423,84 @@ export declare function markSlabChangeDependents(previous: SlabNode, next: SlabN
4369
4423
  bumpScale?: number | undefined;
4370
4424
  } | undefined;
4371
4425
  } | undefined;
4372
- wallMaterialPreset?: string | undefined;
4373
- roofSegmentId?: string | undefined;
4426
+ sideMaterialPreset?: string | undefined;
4427
+ slots?: Record<string, string> | undefined;
4374
4428
  position: [number, number, number];
4375
4429
  rotation: number;
4430
+ supportSlabId?: string | undefined;
4431
+ stairType: "curved" | "spiral" | "straight";
4432
+ fromLevelId: string | null;
4433
+ toLevelId: string | null;
4434
+ deckSlabId?: string | undefined;
4435
+ slabOpeningMode: "destination" | "none";
4436
+ openingOffset: number;
4376
4437
  width: number;
4377
- depth: number;
4378
- height: number;
4379
- roofType: "barrel" | "conical" | "dutch" | "flat" | "gable" | "gambrel" | "hip" | "mansard" | "shed";
4380
- roofHeight: number;
4381
- shedHighSide: "back" | "front";
4382
- wallSkirtHeight: number;
4383
- windowWidth: number;
4384
- windowHeight: number;
4385
- windowOffsetX: number;
4386
- windowOffsetY: number;
4387
- windowFrameThickness: number;
4388
- windowFrameDepth: number;
4389
- windowColumns: number;
4390
- windowRows: number;
4391
- windowDividerThickness: number;
4392
- windowShape: "arch" | "rectangle" | "rounded";
4393
- windowArchHeight: number;
4394
- windowCornerRadii: [number, number, number, number];
4395
- windowSill: boolean;
4396
- windowSillDepth: number;
4397
- windowSillThickness: number;
4398
- children: `window_${string}`[];
4399
- type: "dormer";
4438
+ totalRise?: number | undefined;
4439
+ designTargets?: {
4440
+ maxRiserHeight: number;
4441
+ minimumGoing: number;
4442
+ targetGoing: number;
4443
+ minimumHeadroom: number;
4444
+ } | undefined;
4445
+ uniformRisers?: boolean | undefined;
4446
+ stepCount: number;
4447
+ autoSurfaceSnap?: boolean | undefined;
4448
+ destinationSurfaceId?: string | undefined;
4449
+ thickness: number;
4450
+ fillToFloor: boolean;
4451
+ construction?: {
4452
+ mode: "center-stringer" | "open" | "side-stringers" | "solid" | "waist";
4453
+ waistThickness: number;
4454
+ treadThickness: number;
4455
+ riserThickness: number;
4456
+ nosing: number;
4457
+ finishThickness: number;
4458
+ closedRisers: boolean;
4459
+ stringerWidth: number;
4460
+ stringerDepth: number;
4461
+ } | undefined;
4462
+ structure?: {
4463
+ type: "concrete" | "steel-stringers" | "wood-stringers";
4464
+ stringerStock: "2x10" | "2x12";
4465
+ stringerType: "cut" | "housed";
4466
+ stringerSpacing: number;
4467
+ stringerCount?: number | undefined;
4468
+ treadStock?: "2x12" | "2x6-pair" | "5/4x6-pair" | "plywood-finish" | undefined;
4469
+ closedRisers?: boolean | undefined;
4470
+ treated?: boolean | undefined;
4471
+ nosing?: number | undefined;
4472
+ } | undefined;
4473
+ innerRadius: number;
4474
+ sweepAngle: number;
4475
+ topLandingMode: "integrated" | "none";
4476
+ topLandingDepth: number;
4477
+ showCenterColumn: boolean;
4478
+ showStepSupports: boolean;
4479
+ railingMode: "both" | "left" | "none" | "right";
4480
+ railingHeight: number;
4481
+ railingStyle?: "balusters" | "boards" | "cable" | "glass" | "metal" | "post-and-rail" | undefined;
4482
+ railingPath?: "continuous" | "original" | undefined;
4483
+ handrail?: {
4484
+ mode: "both" | "left" | "none" | "right";
4485
+ height: number;
4486
+ diameter: number;
4487
+ offset: number;
4488
+ bottom?: {
4489
+ extension: number;
4490
+ return: "floor" | "none" | "post" | "wall";
4491
+ returnLength: number;
4492
+ } | undefined;
4493
+ top?: {
4494
+ extension: number;
4495
+ return: "floor" | "none" | "post" | "wall";
4496
+ returnLength: number;
4497
+ } | undefined;
4498
+ } | undefined;
4499
+ railingTopPost?: boolean | undefined;
4500
+ railingTopReach?: number | undefined;
4501
+ railingPostThrough?: boolean | undefined;
4502
+ children: `sseg_${string}`[];
4503
+ type: "stair";
4400
4504
  } | {
4401
4505
  object: "node";
4402
4506
  name?: string | undefined;
@@ -4421,77 +4525,90 @@ export declare function markSlabChangeDependents(previous: SlabNode, next: SlabN
4421
4525
  fromIds: string[];
4422
4526
  } | undefined;
4423
4527
  } | undefined;
4424
- id: `skylight_${string}`;
4425
- material?: {
4426
- id?: string | undefined;
4427
- preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
4428
- properties?: {
4429
- color: string;
4430
- roughness: number;
4431
- metalness: number;
4432
- opacity: number;
4433
- transparent: boolean;
4434
- side: "back" | "double" | "front";
4435
- } | undefined;
4436
- texture?: {
4437
- url: string;
4438
- repeat?: [number, number] | undefined;
4439
- scale?: number | undefined;
4440
- offset?: [number, number] | undefined;
4441
- normalMap?: string | undefined;
4442
- normalScale?: number | undefined;
4443
- bumpMap?: string | undefined;
4444
- bumpScale?: number | undefined;
4445
- } | undefined;
4528
+ id: `scan_${string}`;
4529
+ url: string | null;
4530
+ captureSession: {
4531
+ sessionId: string;
4532
+ schemaVersion?: number | undefined;
4533
+ revisionId?: string | undefined;
4534
+ manifestUrl?: string | undefined;
4535
+ } | null;
4536
+ layers: Record<string, boolean>;
4537
+ position: [number, number, number];
4538
+ rotation: [number, number, number];
4539
+ scale: number;
4540
+ opacity: number;
4541
+ type: "scan";
4542
+ } | {
4543
+ object: "node";
4544
+ name?: string | undefined;
4545
+ parentId: string | null;
4546
+ visible: boolean;
4547
+ camera?: {
4548
+ position: [number, number, number];
4549
+ target: [number, number, number];
4550
+ mode: "orthographic" | "perspective";
4551
+ fov?: number | undefined;
4552
+ zoom?: number | undefined;
4446
4553
  } | undefined;
4447
- materialPreset?: string | undefined;
4448
- glassMaterial?: {
4449
- id?: string | undefined;
4450
- preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
4451
- properties?: {
4452
- color: string;
4453
- roughness: number;
4454
- metalness: number;
4455
- opacity: number;
4456
- transparent: boolean;
4457
- side: "back" | "double" | "front";
4554
+ metadata: Record<string, unknown>;
4555
+ provenance?: {
4556
+ refs: {
4557
+ ns?: string | undefined;
4558
+ id: string;
4559
+ role?: "absorbed" | "alias" | "derived" | "piece" | "primary" | undefined;
4560
+ }[];
4561
+ lineage?: {
4562
+ op: "attach" | "convert" | "duplicate" | "import" | "make-independent" | "merge" | "promote" | "split";
4563
+ fromIds: string[];
4458
4564
  } | undefined;
4459
- texture?: {
4460
- url: string;
4461
- repeat?: [number, number] | undefined;
4462
- scale?: number | undefined;
4463
- offset?: [number, number] | undefined;
4464
- normalMap?: string | undefined;
4465
- normalScale?: number | undefined;
4466
- bumpMap?: string | undefined;
4467
- bumpScale?: number | undefined;
4565
+ } | undefined;
4566
+ id: `guide_${string}`;
4567
+ url: string;
4568
+ position: [number, number, number];
4569
+ rotation: [number, number, number];
4570
+ scale: number;
4571
+ opacity: number;
4572
+ scaleReference: {
4573
+ start: [number, number];
4574
+ end: [number, number];
4575
+ realLengthMeters: number;
4576
+ measuredLengthUnits: number;
4577
+ metersPerUnit: number;
4578
+ displayLength?: number | undefined;
4579
+ displayUnit?: "centimeters" | "feet" | "inches" | "meters" | undefined;
4580
+ label: string;
4581
+ } | null;
4582
+ type: "guide";
4583
+ } | {
4584
+ object: "node";
4585
+ name?: string | undefined;
4586
+ parentId: string | null;
4587
+ visible: boolean;
4588
+ camera?: {
4589
+ position: [number, number, number];
4590
+ target: [number, number, number];
4591
+ mode: "orthographic" | "perspective";
4592
+ fov?: number | undefined;
4593
+ zoom?: number | undefined;
4594
+ } | undefined;
4595
+ metadata: Record<string, unknown>;
4596
+ provenance?: {
4597
+ refs: {
4598
+ ns?: string | undefined;
4599
+ id: string;
4600
+ role?: "absorbed" | "alias" | "derived" | "piece" | "primary" | undefined;
4601
+ }[];
4602
+ lineage?: {
4603
+ op: "attach" | "convert" | "duplicate" | "import" | "make-independent" | "merge" | "promote" | "split";
4604
+ fromIds: string[];
4468
4605
  } | undefined;
4469
4606
  } | undefined;
4470
- glassMaterialPreset?: string | undefined;
4471
- roofSegmentId?: string | undefined;
4607
+ id: `spawn_${string}`;
4472
4608
  position: [number, number, number];
4473
4609
  rotation: number;
4474
- width: number;
4475
- height: number;
4476
- frameThickness: number;
4477
- frameDepth: number;
4478
- skylightType: "flat" | "lantern" | "opening" | "sliding" | "walk-on";
4479
- glassThickness: number;
4480
- lanternHeight: number;
4481
- lanternTopScale: number;
4482
- openingAngle: number;
4483
- openingSide: "bottom" | "left" | "right" | "top";
4484
- operationState: number;
4485
- motorHousing: boolean;
4486
- slideFraction: number;
4487
- slideDirection: "x" | "z";
4488
- trackWidth: number;
4489
- motorHousingSize: number;
4490
- curb: boolean;
4491
- curbHeight: number;
4492
- cutoutOffset: number;
4493
- surfaceNormal?: [number, number, number] | undefined;
4494
- type: "skylight";
4610
+ supportSlabId?: string | undefined;
4611
+ type: "spawn";
4495
4612
  } | {
4496
4613
  object: "node";
4497
4614
  name?: string | undefined;
@@ -4516,198 +4633,29 @@ export declare function markSlabChangeDependents(previous: SlabNode, next: SlabN
4516
4633
  fromIds: string[];
4517
4634
  } | undefined;
4518
4635
  } | undefined;
4519
- id: `site_${string}`;
4520
- polygon: {
4521
- type: "polygon";
4522
- points: [number, number][];
4523
- };
4524
- terrain?: {
4525
- type: "heightfield";
4526
- origin: [number, number];
4527
- spacing: number;
4528
- cols: number;
4529
- rows: number;
4530
- step: number;
4531
- heights: string;
4532
- } | undefined;
4533
- showGround?: boolean | undefined;
4534
- presentation?: {
4535
- theme?: string | undefined;
4536
- exposure?: number | undefined;
4537
- shading?: "rendered" | "solid" | undefined;
4538
- edges?: "off" | "soft" | "strong" | undefined;
4539
- shadows?: boolean | undefined;
4540
- lighting?: {
4541
- background?: string | undefined;
4542
- backgroundSky?: string | null | undefined;
4543
- ground?: string | undefined;
4544
- ambient?: {
4545
- color: string;
4546
- intensity: number;
4547
- } | undefined;
4548
- hemi?: {
4549
- sky: string;
4550
- ground: string;
4551
- intensity: number;
4552
- } | undefined;
4553
- lights?: {
4554
- color: string;
4555
- intensity: number;
4556
- position: [number, number, number];
4557
- target?: [number, number, number] | undefined;
4558
- castShadow?: boolean | undefined;
4559
- shadow?: {
4560
- intensity?: number | undefined;
4561
- bias?: number | undefined;
4562
- normalBias?: number | undefined;
4563
- radius?: number | undefined;
4564
- mapSize?: 512 | 1024 | 2048 | 4096 | undefined;
4565
- camera?: {
4566
- left: number;
4567
- right: number;
4568
- top: number;
4569
- bottom: number;
4570
- near: number;
4571
- far: number;
4572
- } | undefined;
4573
- } | undefined;
4574
- }[] | undefined;
4575
- environment?: {
4576
- source: "gradient" | "none" | "room";
4577
- intensity: number;
4578
- } | undefined;
4579
- } | undefined;
4580
- postprocessing?: {
4581
- ambientOcclusion?: boolean | undefined;
4582
- colorGrading?: boolean | undefined;
4583
- } | undefined;
4584
- display?: {
4585
- mode?: "construction" | "finished" | "systems" | undefined;
4586
- families?: Partial<Record<"device" | "exposed-structure" | "fill" | "finish" | "foundation" | "framing" | "inspection" | "insulation" | "masonry" | "membrane" | "run" | "service-space" | "sheathing", boolean>> | undefined;
4587
- disciplines?: Partial<Record<"electrical" | "fire" | "low-voltage" | "mechanical" | "plumbing", boolean>> | undefined;
4588
- xray?: boolean | undefined;
4589
- colorBy?: "material" | "service" | undefined;
4590
- } | undefined;
4591
- } | undefined;
4592
- address?: {
4593
- street?: string | undefined;
4594
- city?: string | undefined;
4595
- state?: string | undefined;
4596
- zip?: string | undefined;
4597
- } | undefined;
4598
- parcel?: {
4599
- apn?: string | undefined;
4600
- source?: string | undefined;
4601
- county?: string | undefined;
4602
- state?: string | undefined;
4603
- lotAreaSqFt?: number | undefined;
4604
- originLngLat?: [number, number] | undefined;
4605
- resolvedAt?: string | undefined;
4606
- layer?: string | undefined;
4607
- notes?: string[] | undefined;
4608
- } | undefined;
4609
- setbacks?: {
4610
- front: number;
4611
- side: number;
4612
- rear: number;
4613
- left?: number | undefined;
4614
- right?: number | undefined;
4615
- streetSide?: number | undefined;
4616
- } | undefined;
4617
- setbacksSource?: string | undefined;
4618
- zone?: string | undefined;
4619
- frontEdge?: number | undefined;
4620
- streetEdges?: number[] | undefined;
4621
- sightTriangleFt?: number | undefined;
4622
- northRotation?: number | undefined;
4623
- dossier?: {
4624
- [x: string]: unknown;
4625
- provider: string;
4626
- asOf: string;
4627
- point?: {
4628
- lat?: number | undefined;
4629
- lng?: number | undefined;
4630
- source?: string | undefined;
4631
- } | undefined;
4632
- address?: {
4633
- formatted?: string | undefined;
4634
- precision?: string | undefined;
4635
- } | undefined;
4636
- sections: Record<string, {
4637
- [x: string]: unknown;
4638
- status: string;
4639
- summary?: string | undefined;
4640
- reason?: string | undefined;
4641
- source?: {
4642
- name?: string | undefined;
4643
- kind?: string | undefined;
4644
- vintage?: string | undefined;
4645
- attribution?: string | undefined;
4646
- } | undefined;
4647
- }>;
4648
- parcel?: Record<string, unknown> | undefined;
4649
- flood?: Record<string, unknown> | undefined;
4650
- codeBasis?: Record<string, unknown> | undefined;
4651
- zoning?: Record<string, unknown> | undefined;
4652
- utilities?: Record<string, unknown> | undefined;
4653
- soils?: Record<string, unknown> | undefined;
4654
- wetlands?: Record<string, unknown> | undefined;
4655
- structures?: Record<string, unknown> | undefined;
4656
- elevation?: Record<string, unknown> | undefined;
4657
- boundaries?: Record<string, unknown> | undefined;
4658
- } | undefined;
4659
- contourIntervalIn?: number | undefined;
4660
- contours3d?: boolean | undefined;
4661
- terrainContours?: {
4662
- datum: string;
4663
- intervalFt: number;
4664
- source?: string | undefined;
4665
- lines: {
4666
- elevationFt: number;
4667
- points: [number, number][];
4668
- }[];
4669
- } | undefined;
4670
- wallTypes?: {
4671
- id: string;
4672
- label: string;
4673
- assembly: {
4674
- layers: {
4675
- id: string;
4676
- role: "air" | "covering" | "deck" | "fill" | "finish" | "furring" | "glazing" | "insulation" | "lining" | "membrane" | "sheathing" | "shell" | "structure" | "substrate" | "underlay";
4677
- thickness: number;
4678
- core?: true | undefined;
4679
- spacing?: number | undefined;
4680
- material?: string | undefined;
4681
- slot?: string | undefined;
4682
- returns?: boolean | undefined;
4683
- display?: "construction" | "finished" | undefined;
4684
- inset?: number | undefined;
4685
- bottom?: number | undefined;
4686
- lift?: number | undefined;
4687
- src?: string | undefined;
4688
- }[];
4689
- backing?: {
4690
- id: string;
4691
- role: "air" | "covering" | "deck" | "fill" | "finish" | "furring" | "glazing" | "insulation" | "lining" | "membrane" | "sheathing" | "shell" | "structure" | "substrate" | "underlay";
4692
- thickness: number;
4693
- core?: true | undefined;
4694
- spacing?: number | undefined;
4695
- material?: string | undefined;
4696
- slot?: string | undefined;
4697
- returns?: boolean | undefined;
4698
- display?: "construction" | "finished" | undefined;
4699
- inset?: number | undefined;
4700
- bottom?: number | undefined;
4701
- lift?: number | undefined;
4702
- src?: string | undefined;
4703
- }[] | undefined;
4704
- face?: "exterior" | "front" | undefined;
4705
- presetId?: string | undefined;
4706
- cavityInsulation?: string | undefined;
4707
- };
4708
- }[] | undefined;
4709
- children: string[];
4710
- type: "site";
4636
+ id: `duct-fitting_${string}`;
4637
+ position: [number, number, number];
4638
+ rotation: [number, number, number];
4639
+ fittingType: "access-panel" | "coupling" | "cross" | "damper" | "elbow" | "end-cap" | "reducer" | "tee" | "transition";
4640
+ shape: "oval" | "rect" | "round";
4641
+ inletShape?: "oval" | "rect" | "round" | undefined;
4642
+ outletShape?: "oval" | "rect" | "round" | undefined;
4643
+ width: number;
4644
+ height: number;
4645
+ shape2: "oval" | "rect" | "round";
4646
+ width2: number;
4647
+ height2: number;
4648
+ angle: number;
4649
+ branchAngle: number;
4650
+ diameter: number;
4651
+ diameter2: number;
4652
+ ductMaterial: "duct-board" | "flex" | "sheet-metal";
4653
+ system: "return" | "supply";
4654
+ damperAngle: number;
4655
+ panelWidth: number;
4656
+ panelHeight: number;
4657
+ slots?: Record<string, string> | undefined;
4658
+ type: "duct-fitting";
4711
4659
  } | {
4712
4660
  object: "node";
4713
4661
  name?: string | undefined;
@@ -4732,27 +4680,19 @@ export declare function markSlabChangeDependents(previous: SlabNode, next: SlabN
4732
4680
  fromIds: string[];
4733
4681
  } | undefined;
4734
4682
  } | undefined;
4735
- matchFenceStyle?: boolean | undefined;
4736
- matchFenceHeight?: boolean | undefined;
4737
- leafType?: "double" | "single" | undefined;
4738
- style?: "guard" | "horizontal" | "match" | "picket" | "privacy" | "rail" | "slat" | undefined;
4739
- height?: number | undefined;
4740
- clearance?: number | undefined;
4741
- thickness?: number | undefined;
4742
- frameWidth?: number | undefined;
4743
- spacing?: number | undefined;
4744
- boardWidth?: number | undefined;
4745
- hinge?: "left" | "right" | undefined;
4746
- swing?: "inward" | "outward" | undefined;
4747
- openAngle?: number | undefined;
4748
- leafSplit?: number | undefined;
4749
- brace?: "cross" | "diagonal" | "none" | undefined;
4750
- showHardware?: boolean | undefined;
4751
- showPosts?: boolean | undefined;
4752
- id: `fence-gate_${string}`;
4753
- center: number;
4683
+ id: `duct-terminal_${string}`;
4684
+ position: [number, number, number];
4685
+ rotation: number;
4686
+ supportSlabId?: string | undefined;
4687
+ terminalType: "diffuser" | "return-grille" | "supply-register";
4688
+ mount: "ceiling" | "floor" | "wall";
4754
4689
  width: number;
4755
- type: "fence-gate";
4690
+ depth: number;
4691
+ collarShape: "oval" | "rect" | "round";
4692
+ collarDiameter: number;
4693
+ collarWidth: number;
4694
+ collarHeight: number;
4695
+ type: "duct-terminal";
4756
4696
  } | {
4757
4697
  object: "node";
4758
4698
  name?: string | undefined;
@@ -4777,14 +4717,23 @@ export declare function markSlabChangeDependents(previous: SlabNode, next: SlabN
4777
4717
  fromIds: string[];
4778
4718
  } | undefined;
4779
4719
  } | undefined;
4780
- center: number;
4720
+ id: `hvac-equipment_${string}`;
4721
+ position: [number, number, number];
4722
+ rotation: number;
4723
+ supportSlabId?: string | undefined;
4724
+ equipmentType: "air-handler" | "condenser" | "furnace";
4781
4725
  width: number;
4782
- matchFenceStyle?: boolean | undefined;
4783
- matchFenceHeight?: boolean | undefined;
4784
- height?: number | undefined;
4785
- showPosts: boolean;
4786
- id: `fence-opening_${string}`;
4787
- type: "fence-opening";
4726
+ depth: number;
4727
+ height: number;
4728
+ supplyShape: "oval" | "rect" | "round";
4729
+ returnShape: "oval" | "rect" | "round";
4730
+ supplyDiameter: number;
4731
+ returnDiameter: number;
4732
+ supplyWidth: number;
4733
+ supplyHeight: number;
4734
+ returnWidth: number;
4735
+ returnHeight: number;
4736
+ type: "hvac-equipment";
4788
4737
  } | {
4789
4738
  object: "node";
4790
4739
  name?: string | undefined;
@@ -4809,147 +4758,91 @@ export declare function markSlabChangeDependents(previous: SlabNode, next: SlabN
4809
4758
  fromIds: string[];
4810
4759
  } | undefined;
4811
4760
  } | undefined;
4812
- position: [number, number, number];
4813
- rotation: number;
4814
- supportSlabId?: string | undefined;
4815
- width: number;
4816
- depth: number;
4817
- carcassHeight: number;
4818
- operationState: number;
4819
- plinthHeight: number;
4820
- toeKickDepth: number;
4821
- boardThickness: number;
4822
- countertopThickness: number;
4823
- countertopOverhang: number;
4824
- countertopBackOverhang: number;
4825
- withFinishedBack: boolean;
4826
- frontThickness: number;
4827
- frontGap: number;
4828
- frontStyle: "raised-arch" | "shaker" | "slab";
4829
- panelReady: boolean;
4830
- handleStyle: "bar" | "cutout" | "hole" | "knob" | "none";
4831
- handlePosition: "auto" | "center" | "top";
4832
- frontOverlay: "full" | "inset";
4833
- withBottomPanel: boolean;
4834
- showPlinth: boolean;
4835
- withCountertop: boolean;
4836
- material?: {
4837
- id?: string | undefined;
4838
- preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
4839
- properties?: {
4840
- color: string;
4841
- roughness: number;
4842
- metalness: number;
4843
- opacity: number;
4844
- transparent: boolean;
4845
- side: "back" | "double" | "front";
4846
- } | undefined;
4847
- texture?: {
4848
- url: string;
4849
- repeat?: [number, number] | undefined;
4850
- scale?: number | undefined;
4851
- offset?: [number, number] | undefined;
4852
- normalMap?: string | undefined;
4853
- normalScale?: number | undefined;
4854
- bumpMap?: string | undefined;
4855
- bumpScale?: number | undefined;
4761
+ id: `liquid-line_${string}`;
4762
+ path: [number, number, number][];
4763
+ diameter: number;
4764
+ type: "liquid-line";
4765
+ } | {
4766
+ object: "node";
4767
+ name?: string | undefined;
4768
+ parentId: string | null;
4769
+ visible: boolean;
4770
+ camera?: {
4771
+ position: [number, number, number];
4772
+ target: [number, number, number];
4773
+ mode: "orthographic" | "perspective";
4774
+ fov?: number | undefined;
4775
+ zoom?: number | undefined;
4776
+ } | undefined;
4777
+ metadata: Record<string, unknown>;
4778
+ provenance?: {
4779
+ refs: {
4780
+ ns?: string | undefined;
4781
+ id: string;
4782
+ role?: "absorbed" | "alias" | "derived" | "piece" | "primary" | undefined;
4783
+ }[];
4784
+ lineage?: {
4785
+ op: "attach" | "convert" | "duplicate" | "import" | "make-independent" | "merge" | "promote" | "split";
4786
+ fromIds: string[];
4856
4787
  } | undefined;
4857
4788
  } | undefined;
4858
- materialPreset?: string | undefined;
4859
- slots?: Record<string, string> | undefined;
4860
- stack?: ({
4861
- id: string;
4862
- height?: number | undefined;
4863
- type: "shelf";
4864
- shelfCount?: number | undefined;
4865
- } | {
4866
- id: string;
4867
- height?: number | undefined;
4868
- type: "drawer";
4869
- drawerCount?: number | undefined;
4870
- } | {
4871
- id: string;
4872
- height?: number | undefined;
4873
- type: "door";
4874
- doorType?: "double" | "glass" | "single-left" | "single-right" | undefined;
4875
- shelfCount?: number | undefined;
4876
- } | {
4877
- id: string;
4878
- height?: number | undefined;
4879
- type: "sink";
4880
- sinkLayout?: "double" | "double-offset" | "single" | undefined;
4881
- } | {
4882
- id: string;
4883
- height?: number | undefined;
4884
- type: "oven";
4885
- } | {
4886
- id: string;
4887
- height?: number | undefined;
4888
- type: "microwave";
4889
- } | {
4890
- id: string;
4891
- height?: number | undefined;
4892
- type: "dishwasher";
4893
- } | {
4894
- id: string;
4895
- height?: number | undefined;
4896
- cooktopBurnersOn?: boolean | undefined;
4897
- cooktopActiveBurners?: number[] | undefined;
4898
- cooktopKnobProgress?: number[] | undefined;
4899
- cooktopShowGrate?: boolean | undefined;
4900
- type: "cooktop-gas";
4901
- cooktopLayout?: "gas-2burner" | "gas-4burner" | "gas-5burner-wok" | "gas-6burner" | undefined;
4902
- } | {
4903
- id: string;
4904
- height?: number | undefined;
4905
- cooktopBurnersOn?: boolean | undefined;
4906
- cooktopActiveBurners?: number[] | undefined;
4907
- cooktopKnobProgress?: number[] | undefined;
4908
- cooktopShowGrate?: boolean | undefined;
4909
- type: "cooktop-induction";
4910
- cooktopLayout?: "induction-2zone" | "induction-4zone" | undefined;
4911
- } | {
4912
- id: string;
4913
- height?: number | undefined;
4914
- type: "pull-out-pantry";
4915
- shelfCount?: number | undefined;
4916
- pantryRackStyle?: "glass" | "tray" | "wire" | undefined;
4917
- } | {
4918
- id: string;
4919
- height?: number | undefined;
4920
- type: "fridge-single";
4921
- } | {
4922
- id: string;
4923
- height?: number | undefined;
4924
- type: "fridge-double";
4925
- } | {
4926
- id: string;
4927
- height?: number | undefined;
4928
- type: "fridge-top-freezer";
4929
- } | {
4930
- id: string;
4931
- height?: number | undefined;
4932
- type: "fridge-bottom-freezer";
4933
- } | {
4934
- id: string;
4935
- height?: number | undefined;
4936
- type: "hood-pyramid";
4937
- } | {
4938
- id: string;
4939
- height?: number | undefined;
4940
- type: "hood-curved-glass";
4941
- })[] | undefined;
4942
- id: `cabinet_${string}`;
4943
- runTier: "base" | "tall" | "wall";
4944
- children: string[];
4945
- barLedge?: {
4946
- edge: "back" | "left" | "right";
4947
- height: number;
4948
- depth: number;
4789
+ id: `pipe-segment_${string}`;
4790
+ path: [number, number, number][];
4791
+ autoHangers?: boolean | undefined;
4792
+ hangerOverrides?: Record<string, {
4793
+ fraction?: number | undefined;
4794
+ skipped?: boolean | undefined;
4795
+ hostId?: string | undefined;
4796
+ }> | undefined;
4797
+ hangerStyle?: "double" | "single" | undefined;
4798
+ hangerSpacing?: number | undefined;
4799
+ hangerMaxReach?: number | undefined;
4800
+ wallAttachment?: {
4801
+ wallId: `wall_${string}`;
4802
+ side: "back" | "front";
4803
+ startUV: [number, number];
4804
+ endUV: [number, number];
4805
+ offset: number;
4806
+ } | undefined;
4807
+ diameter: number;
4808
+ pipeMaterial: "abs" | "cast-iron" | "pvc";
4809
+ system: "vent" | "waste";
4810
+ type: "pipe-segment";
4811
+ } | {
4812
+ object: "node";
4813
+ name?: string | undefined;
4814
+ parentId: string | null;
4815
+ visible: boolean;
4816
+ camera?: {
4817
+ position: [number, number, number];
4818
+ target: [number, number, number];
4819
+ mode: "orthographic" | "perspective";
4820
+ fov?: number | undefined;
4821
+ zoom?: number | undefined;
4949
4822
  } | undefined;
4950
- withWaterfall: boolean;
4951
- withFinishedEnds: boolean;
4952
- type: "cabinet";
4823
+ metadata: Record<string, unknown>;
4824
+ provenance?: {
4825
+ refs: {
4826
+ ns?: string | undefined;
4827
+ id: string;
4828
+ role?: "absorbed" | "alias" | "derived" | "piece" | "primary" | undefined;
4829
+ }[];
4830
+ lineage?: {
4831
+ op: "attach" | "convert" | "duplicate" | "import" | "make-independent" | "merge" | "promote" | "split";
4832
+ fromIds: string[];
4833
+ } | undefined;
4834
+ } | undefined;
4835
+ id: `pipe-fitting_${string}`;
4836
+ position: [number, number, number];
4837
+ rotation: [number, number, number];
4838
+ fittingType: "cleanout" | "coupling" | "cross" | "elbow" | "end-cap" | "reducer" | "sanitary-tee" | "wye";
4839
+ angle: number;
4840
+ diameter: number;
4841
+ diameter2: number;
4842
+ cleanoutStyle: "end" | "inline";
4843
+ pipeMaterial: "abs" | "cast-iron" | "pvc";
4844
+ system: "vent" | "waste";
4845
+ type: "pipe-fitting";
4953
4846
  } | {
4954
4847
  object: "node";
4955
4848
  name?: string | undefined;
@@ -4974,30 +4867,37 @@ export declare function markSlabChangeDependents(previous: SlabNode, next: SlabN
4974
4867
  fromIds: string[];
4975
4868
  } | undefined;
4976
4869
  } | undefined;
4977
- position: [number, number, number];
4978
- rotation: number;
4979
- supportSlabId?: string | undefined;
4980
- width: number;
4981
- depth: number;
4982
- carcassHeight: number;
4983
- operationState: number;
4984
- plinthHeight: number;
4985
- toeKickDepth: number;
4986
- boardThickness: number;
4987
- countertopThickness: number;
4988
- countertopOverhang: number;
4989
- countertopBackOverhang: number;
4990
- withFinishedBack: boolean;
4991
- frontThickness: number;
4992
- frontGap: number;
4993
- frontStyle: "raised-arch" | "shaker" | "slab";
4994
- panelReady: boolean;
4995
- handleStyle: "bar" | "cutout" | "hole" | "knob" | "none";
4996
- handlePosition: "auto" | "center" | "top";
4997
- frontOverlay: "full" | "inset";
4998
- withBottomPanel: boolean;
4999
- showPlinth: boolean;
5000
- withCountertop: boolean;
4870
+ id: `level_${string}`;
4871
+ children: (`beam_${string}` | `block_${string}` | `ceiling_${string}` | `column_${string}` | `construction-dimension_${string}` | `duct-fitting_${string}` | `duct-segment_${string}` | `duct-terminal_${string}` | `fence_${string}` | `floor-opening_${string}` | `guide_${string}` | `hvac-equipment_${string}` | `imesh_${string}` | `item_${string}` | `lineset_${string}` | `liquid-line_${string}` | `measurement_${string}` | `pipe-fitting_${string}` | `pipe-segment_${string}` | `pipe-trap_${string}` | `procedural-item_${string}` | `roof_${string}` | `scan_${string}` | `separator_${string}` | `shelf_${string}` | `slab_${string}` | `spawn_${string}` | `stair_${string}` | `structural-grid_${string}` | `wall_${string}` | `zone_${string}`)[];
4872
+ level: number;
4873
+ baseElevation: number;
4874
+ height?: number | undefined;
4875
+ type: "level";
4876
+ } | {
4877
+ object: "node";
4878
+ name?: string | undefined;
4879
+ parentId: string | null;
4880
+ visible: boolean;
4881
+ camera?: {
4882
+ position: [number, number, number];
4883
+ target: [number, number, number];
4884
+ mode: "orthographic" | "perspective";
4885
+ fov?: number | undefined;
4886
+ zoom?: number | undefined;
4887
+ } | undefined;
4888
+ metadata: Record<string, unknown>;
4889
+ provenance?: {
4890
+ refs: {
4891
+ ns?: string | undefined;
4892
+ id: string;
4893
+ role?: "absorbed" | "alias" | "derived" | "piece" | "primary" | undefined;
4894
+ }[];
4895
+ lineage?: {
4896
+ op: "attach" | "convert" | "duplicate" | "import" | "make-independent" | "merge" | "promote" | "split";
4897
+ fromIds: string[];
4898
+ } | undefined;
4899
+ } | undefined;
4900
+ id: `elevator_${string}`;
5001
4901
  material?: {
5002
4902
  id?: string | undefined;
5003
4903
  preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
@@ -5022,98 +4922,88 @@ export declare function markSlabChangeDependents(previous: SlabNode, next: SlabN
5022
4922
  } | undefined;
5023
4923
  materialPreset?: string | undefined;
5024
4924
  slots?: Record<string, string> | undefined;
5025
- stack?: ({
5026
- id: string;
5027
- height?: number | undefined;
5028
- type: "shelf";
5029
- shelfCount?: number | undefined;
5030
- } | {
5031
- id: string;
5032
- height?: number | undefined;
5033
- type: "drawer";
5034
- drawerCount?: number | undefined;
5035
- } | {
5036
- id: string;
5037
- height?: number | undefined;
5038
- type: "door";
5039
- doorType?: "double" | "glass" | "single-left" | "single-right" | undefined;
5040
- shelfCount?: number | undefined;
5041
- } | {
5042
- id: string;
5043
- height?: number | undefined;
5044
- type: "sink";
5045
- sinkLayout?: "double" | "double-offset" | "single" | undefined;
5046
- } | {
5047
- id: string;
5048
- height?: number | undefined;
5049
- type: "oven";
5050
- } | {
5051
- id: string;
5052
- height?: number | undefined;
5053
- type: "microwave";
5054
- } | {
5055
- id: string;
5056
- height?: number | undefined;
5057
- type: "dishwasher";
5058
- } | {
5059
- id: string;
5060
- height?: number | undefined;
5061
- cooktopBurnersOn?: boolean | undefined;
5062
- cooktopActiveBurners?: number[] | undefined;
5063
- cooktopKnobProgress?: number[] | undefined;
5064
- cooktopShowGrate?: boolean | undefined;
5065
- type: "cooktop-gas";
5066
- cooktopLayout?: "gas-2burner" | "gas-4burner" | "gas-5burner-wok" | "gas-6burner" | undefined;
5067
- } | {
5068
- id: string;
5069
- height?: number | undefined;
5070
- cooktopBurnersOn?: boolean | undefined;
5071
- cooktopActiveBurners?: number[] | undefined;
5072
- cooktopKnobProgress?: number[] | undefined;
5073
- cooktopShowGrate?: boolean | undefined;
5074
- type: "cooktop-induction";
5075
- cooktopLayout?: "induction-2zone" | "induction-4zone" | undefined;
5076
- } | {
5077
- id: string;
5078
- height?: number | undefined;
5079
- type: "pull-out-pantry";
5080
- shelfCount?: number | undefined;
5081
- pantryRackStyle?: "glass" | "tray" | "wire" | undefined;
5082
- } | {
5083
- id: string;
5084
- height?: number | undefined;
5085
- type: "fridge-single";
5086
- } | {
5087
- id: string;
5088
- height?: number | undefined;
5089
- type: "fridge-double";
5090
- } | {
5091
- id: string;
5092
- height?: number | undefined;
5093
- type: "fridge-top-freezer";
5094
- } | {
5095
- id: string;
5096
- height?: number | undefined;
5097
- type: "fridge-bottom-freezer";
5098
- } | {
5099
- id: string;
5100
- height?: number | undefined;
5101
- type: "hood-pyramid";
5102
- } | {
5103
- id: string;
5104
- height?: number | undefined;
5105
- type: "hood-curved-glass";
5106
- })[] | undefined;
5107
- id: `cabinet-module_${string}`;
5108
- children: string[];
5109
- cabinetType: "base" | "tall";
5110
- moduleKind: "corner-filler" | "standard" | "wall-filler";
5111
- openSide?: "left" | "right" | undefined;
5112
- cornerShelf?: boolean | undefined;
5113
- topFinish: "none" | "top-cabinet" | "trim";
5114
- topFinishHeight: number;
5115
- topFinishDepth: number;
5116
- type: "cabinet-module";
4925
+ position: [number, number, number];
4926
+ rotation: number;
4927
+ width: number;
4928
+ depth: number;
4929
+ shaftWidth?: number | undefined;
4930
+ shaftDepth?: number | undefined;
4931
+ shaftWallThickness: number;
4932
+ shaftStyle: "glass" | "solid";
4933
+ cabHeight: number;
4934
+ doorWidth: number;
4935
+ doorHeight: number;
4936
+ doorStyle: "center-opening" | "single-left" | "single-right";
4937
+ doorPanelStyle: "glass-frame" | "segmented-panel" | "solid-panel";
4938
+ fromLevelId: string | null;
4939
+ toLevelId: string | null;
4940
+ servedLevelIds?: string[] | undefined;
4941
+ disabledLevelIds: string[];
4942
+ serviceOnlyLevelIds: string[];
4943
+ defaultLevelId: string | null;
4944
+ speed: number;
4945
+ doorDurationMs: number;
4946
+ dwellMs: number;
4947
+ type: "elevator";
4948
+ } | {
4949
+ object: "node";
4950
+ parentId: string | null;
4951
+ visible: boolean;
4952
+ camera?: {
4953
+ position: [number, number, number];
4954
+ target: [number, number, number];
4955
+ mode: "orthographic" | "perspective";
4956
+ fov?: number | undefined;
4957
+ zoom?: number | undefined;
4958
+ } | undefined;
4959
+ provenance?: {
4960
+ refs: {
4961
+ ns?: string | undefined;
4962
+ id: string;
4963
+ role?: "absorbed" | "alias" | "derived" | "piece" | "primary" | undefined;
4964
+ }[];
4965
+ lineage?: {
4966
+ op: "attach" | "convert" | "duplicate" | "import" | "make-independent" | "merge" | "promote" | "split";
4967
+ fromIds: string[];
4968
+ } | undefined;
4969
+ } | undefined;
4970
+ id: `unit_${string}`;
4971
+ name: string;
4972
+ kind: "apartment" | "commercial" | "common" | "hotel-room";
4973
+ members: `zone_${string}`[];
4974
+ color: string;
4975
+ metadata: Record<string, unknown>;
4976
+ type: "unit";
4977
+ } | {
4978
+ object: "node";
4979
+ name?: string | undefined;
4980
+ parentId: string | null;
4981
+ visible: boolean;
4982
+ camera?: {
4983
+ position: [number, number, number];
4984
+ target: [number, number, number];
4985
+ mode: "orthographic" | "perspective";
4986
+ fov?: number | undefined;
4987
+ zoom?: number | undefined;
4988
+ } | undefined;
4989
+ metadata: Record<string, unknown>;
4990
+ provenance?: {
4991
+ refs: {
4992
+ ns?: string | undefined;
4993
+ id: string;
4994
+ role?: "absorbed" | "alias" | "derived" | "piece" | "primary" | undefined;
4995
+ }[];
4996
+ lineage?: {
4997
+ op: "attach" | "convert" | "duplicate" | "import" | "make-independent" | "merge" | "promote" | "split";
4998
+ fromIds: string[];
4999
+ } | undefined;
5000
+ } | undefined;
5001
+ id: `building_${string}`;
5002
+ children: (`elevator_${string}` | `level_${string}` | `unit_${string}`)[];
5003
+ position: [number, number, number];
5004
+ rotation: [number, number, number];
5005
+ groundLevelId?: `level_${string}` | undefined;
5006
+ type: "building";
5117
5007
  } | {
5118
5008
  object: "node";
5119
5009
  name?: string | undefined;
@@ -5138,47 +5028,59 @@ export declare function markSlabChangeDependents(previous: SlabNode, next: SlabN
5138
5028
  fromIds: string[];
5139
5029
  } | undefined;
5140
5030
  } | undefined;
5141
- id: `bvent_${string}`;
5142
- material?: {
5143
- id?: string | undefined;
5144
- preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
5145
- properties?: {
5146
- color: string;
5147
- roughness: number;
5148
- metalness: number;
5149
- opacity: number;
5150
- transparent: boolean;
5151
- side: "back" | "double" | "front";
5152
- } | undefined;
5153
- texture?: {
5154
- url: string;
5155
- repeat?: [number, number] | undefined;
5156
- scale?: number | undefined;
5157
- offset?: [number, number] | undefined;
5158
- normalMap?: string | undefined;
5159
- normalScale?: number | undefined;
5160
- bumpMap?: string | undefined;
5161
- bumpScale?: number | undefined;
5031
+ matchFenceStyle?: boolean | undefined;
5032
+ matchFenceHeight?: boolean | undefined;
5033
+ leafType?: "double" | "single" | undefined;
5034
+ style?: "guard" | "horizontal" | "match" | "picket" | "privacy" | "rail" | "slat" | undefined;
5035
+ height?: number | undefined;
5036
+ clearance?: number | undefined;
5037
+ thickness?: number | undefined;
5038
+ frameWidth?: number | undefined;
5039
+ spacing?: number | undefined;
5040
+ boardWidth?: number | undefined;
5041
+ hinge?: "left" | "right" | undefined;
5042
+ swing?: "inward" | "outward" | undefined;
5043
+ openAngle?: number | undefined;
5044
+ leafSplit?: number | undefined;
5045
+ brace?: "cross" | "diagonal" | "none" | undefined;
5046
+ showHardware?: boolean | undefined;
5047
+ showPosts?: boolean | undefined;
5048
+ id: `fence-gate_${string}`;
5049
+ center: number;
5050
+ width: number;
5051
+ type: "fence-gate";
5052
+ } | {
5053
+ object: "node";
5054
+ name?: string | undefined;
5055
+ parentId: string | null;
5056
+ visible: boolean;
5057
+ camera?: {
5058
+ position: [number, number, number];
5059
+ target: [number, number, number];
5060
+ mode: "orthographic" | "perspective";
5061
+ fov?: number | undefined;
5062
+ zoom?: number | undefined;
5063
+ } | undefined;
5064
+ metadata: Record<string, unknown>;
5065
+ provenance?: {
5066
+ refs: {
5067
+ ns?: string | undefined;
5068
+ id: string;
5069
+ role?: "absorbed" | "alias" | "derived" | "piece" | "primary" | undefined;
5070
+ }[];
5071
+ lineage?: {
5072
+ op: "attach" | "convert" | "duplicate" | "import" | "make-independent" | "merge" | "promote" | "split";
5073
+ fromIds: string[];
5162
5074
  } | undefined;
5163
5075
  } | undefined;
5164
- slots?: Record<string, string> | undefined;
5165
- materialPreset: string;
5166
- roofSegmentId?: string | undefined;
5167
- position: [number, number, number];
5168
- rotation: number;
5076
+ center: number;
5169
5077
  width: number;
5170
- depth: number;
5171
- height: number;
5172
- hoodOverhang: number;
5173
- topTaper: number;
5174
- capHeight: number;
5175
- capGap: number;
5176
- domeCurvature: number;
5177
- baseInset: number;
5178
- baseHeight: number;
5179
- cornerBevel: number;
5180
- style: "box" | "cap" | "dome";
5181
- type: "box-vent";
5078
+ matchFenceStyle?: boolean | undefined;
5079
+ matchFenceHeight?: boolean | undefined;
5080
+ height?: number | undefined;
5081
+ showPosts: boolean;
5082
+ id: `fence-opening_${string}`;
5083
+ type: "fence-opening";
5182
5084
  } | {
5183
5085
  object: "node";
5184
5086
  name?: string | undefined;
@@ -5203,7 +5105,7 @@ export declare function markSlabChangeDependents(previous: SlabNode, next: SlabN
5203
5105
  fromIds: string[];
5204
5106
  } | undefined;
5205
5107
  } | undefined;
5206
- id: `rvent_${string}`;
5108
+ id: `bvent_${string}`;
5207
5109
  material?: {
5208
5110
  id?: string | undefined;
5209
5111
  preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
@@ -5226,16 +5128,24 @@ export declare function markSlabChangeDependents(previous: SlabNode, next: SlabN
5226
5128
  bumpScale?: number | undefined;
5227
5129
  } | undefined;
5228
5130
  } | undefined;
5229
- materialPreset?: string | undefined;
5131
+ slots?: Record<string, string> | undefined;
5132
+ materialPreset: string;
5230
5133
  roofSegmentId?: string | undefined;
5231
5134
  position: [number, number, number];
5232
5135
  rotation: number;
5233
- length: number;
5234
5136
  width: number;
5137
+ depth: number;
5235
5138
  height: number;
5236
- style: "metal" | "shingled" | "standard";
5237
- endCaps: boolean;
5238
- type: "ridge-vent";
5139
+ hoodOverhang: number;
5140
+ topTaper: number;
5141
+ capHeight: number;
5142
+ capGap: number;
5143
+ domeCurvature: number;
5144
+ baseInset: number;
5145
+ baseHeight: number;
5146
+ cornerBevel: number;
5147
+ style: "box" | "cap" | "dome";
5148
+ type: "box-vent";
5239
5149
  } | {
5240
5150
  object: "node";
5241
5151
  name?: string | undefined;
@@ -5618,7 +5528,7 @@ export declare function markSlabChangeDependents(previous: SlabNode, next: SlabN
5618
5528
  fromIds: string[];
5619
5529
  } | undefined;
5620
5530
  } | undefined;
5621
- id: `solarpanel_${string}`;
5531
+ id: `skylight_${string}`;
5622
5532
  material?: {
5623
5533
  id?: string | undefined;
5624
5534
  preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
@@ -5642,7 +5552,7 @@ export declare function markSlabChangeDependents(previous: SlabNode, next: SlabN
5642
5552
  } | undefined;
5643
5553
  } | undefined;
5644
5554
  materialPreset?: string | undefined;
5645
- panelMaterial?: {
5555
+ glassMaterial?: {
5646
5556
  id?: string | undefined;
5647
5557
  preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
5648
5558
  properties?: {
@@ -5664,24 +5574,31 @@ export declare function markSlabChangeDependents(previous: SlabNode, next: SlabN
5664
5574
  bumpScale?: number | undefined;
5665
5575
  } | undefined;
5666
5576
  } | undefined;
5667
- panelMaterialPreset?: string | undefined;
5668
- panelTypePreset?: "compact" | "frameless" | "residential" | "residential-large" | undefined;
5577
+ glassMaterialPreset?: string | undefined;
5669
5578
  roofSegmentId?: string | undefined;
5670
5579
  position: [number, number, number];
5671
5580
  rotation: number;
5672
- rows: number;
5673
- columns: number;
5674
- panelWidth: number;
5675
- panelHeight: number;
5676
- gapX: number;
5677
- gapY: number;
5678
- mountingType: "flush" | "tilted";
5679
- tiltAngle: number;
5680
- standoffHeight: number;
5581
+ width: number;
5582
+ height: number;
5681
5583
  frameThickness: number;
5682
5584
  frameDepth: number;
5585
+ skylightType: "flat" | "lantern" | "opening" | "sliding" | "walk-on";
5586
+ glassThickness: number;
5587
+ lanternHeight: number;
5588
+ lanternTopScale: number;
5589
+ openingAngle: number;
5590
+ openingSide: "bottom" | "left" | "right" | "top";
5591
+ operationState: number;
5592
+ motorHousing: boolean;
5593
+ slideFraction: number;
5594
+ slideDirection: "x" | "z";
5595
+ trackWidth: number;
5596
+ motorHousingSize: number;
5597
+ curb: boolean;
5598
+ curbHeight: number;
5599
+ cutoutOffset: number;
5683
5600
  surfaceNormal?: [number, number, number] | undefined;
5684
- type: "solar-panel";
5601
+ type: "skylight";
5685
5602
  } | {
5686
5603
  object: "node";
5687
5604
  name?: string | undefined;
@@ -5706,7 +5623,7 @@ export declare function markSlabChangeDependents(previous: SlabNode, next: SlabN
5706
5623
  fromIds: string[];
5707
5624
  } | undefined;
5708
5625
  } | undefined;
5709
- id: `downspout_${string}`;
5626
+ id: `dormer_${string}`;
5710
5627
  material?: {
5711
5628
  id?: string | undefined;
5712
5629
  preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
@@ -5729,19 +5646,103 @@ export declare function markSlabChangeDependents(previous: SlabNode, next: SlabN
5729
5646
  bumpScale?: number | undefined;
5730
5647
  } | undefined;
5731
5648
  } | undefined;
5732
- slots?: Record<string, string> | undefined;
5733
- materialPreset: string;
5734
- gutterId?: string | undefined;
5735
- outletId?: string | undefined;
5736
- length: number;
5737
- lengthMode?: "manual" | "to-ground" | undefined;
5738
- diameter: number;
5739
- standoff: number;
5740
- shape: "auto" | "rect" | "round";
5741
- strapStyle: "band" | "none";
5742
- strapSpacing: number;
5743
- terminal: "kickout" | "splash" | "straight";
5744
- type: "downspout";
5649
+ materialPreset?: string | undefined;
5650
+ topMaterial?: {
5651
+ id?: string | undefined;
5652
+ preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
5653
+ properties?: {
5654
+ color: string;
5655
+ roughness: number;
5656
+ metalness: number;
5657
+ opacity: number;
5658
+ transparent: boolean;
5659
+ side: "back" | "double" | "front";
5660
+ } | undefined;
5661
+ texture?: {
5662
+ url: string;
5663
+ repeat?: [number, number] | undefined;
5664
+ scale?: number | undefined;
5665
+ offset?: [number, number] | undefined;
5666
+ normalMap?: string | undefined;
5667
+ normalScale?: number | undefined;
5668
+ bumpMap?: string | undefined;
5669
+ bumpScale?: number | undefined;
5670
+ } | undefined;
5671
+ } | undefined;
5672
+ topMaterialPreset?: string | undefined;
5673
+ sideMaterial?: {
5674
+ id?: string | undefined;
5675
+ preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
5676
+ properties?: {
5677
+ color: string;
5678
+ roughness: number;
5679
+ metalness: number;
5680
+ opacity: number;
5681
+ transparent: boolean;
5682
+ side: "back" | "double" | "front";
5683
+ } | undefined;
5684
+ texture?: {
5685
+ url: string;
5686
+ repeat?: [number, number] | undefined;
5687
+ scale?: number | undefined;
5688
+ offset?: [number, number] | undefined;
5689
+ normalMap?: string | undefined;
5690
+ normalScale?: number | undefined;
5691
+ bumpMap?: string | undefined;
5692
+ bumpScale?: number | undefined;
5693
+ } | undefined;
5694
+ } | undefined;
5695
+ sideMaterialPreset?: string | undefined;
5696
+ wallMaterial?: {
5697
+ id?: string | undefined;
5698
+ preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
5699
+ properties?: {
5700
+ color: string;
5701
+ roughness: number;
5702
+ metalness: number;
5703
+ opacity: number;
5704
+ transparent: boolean;
5705
+ side: "back" | "double" | "front";
5706
+ } | undefined;
5707
+ texture?: {
5708
+ url: string;
5709
+ repeat?: [number, number] | undefined;
5710
+ scale?: number | undefined;
5711
+ offset?: [number, number] | undefined;
5712
+ normalMap?: string | undefined;
5713
+ normalScale?: number | undefined;
5714
+ bumpMap?: string | undefined;
5715
+ bumpScale?: number | undefined;
5716
+ } | undefined;
5717
+ } | undefined;
5718
+ wallMaterialPreset?: string | undefined;
5719
+ roofSegmentId?: string | undefined;
5720
+ position: [number, number, number];
5721
+ rotation: number;
5722
+ width: number;
5723
+ depth: number;
5724
+ height: number;
5725
+ roofType: "barrel" | "conical" | "dutch" | "flat" | "gable" | "gambrel" | "hip" | "mansard" | "shed";
5726
+ roofHeight: number;
5727
+ shedHighSide: "back" | "front";
5728
+ wallSkirtHeight: number;
5729
+ windowWidth: number;
5730
+ windowHeight: number;
5731
+ windowOffsetX: number;
5732
+ windowOffsetY: number;
5733
+ windowFrameThickness: number;
5734
+ windowFrameDepth: number;
5735
+ windowColumns: number;
5736
+ windowRows: number;
5737
+ windowDividerThickness: number;
5738
+ windowShape: "arch" | "rectangle" | "rounded";
5739
+ windowArchHeight: number;
5740
+ windowCornerRadii: [number, number, number, number];
5741
+ windowSill: boolean;
5742
+ windowSillDepth: number;
5743
+ windowSillThickness: number;
5744
+ children: `window_${string}`[];
5745
+ type: "dormer";
5745
5746
  }>): void;
5746
5747
  export declare function markTerrainSupportDependents(nodes: Record<string, AnyNode>, markDirty: (id: AnyNodeId) => void): void;
5747
5748
  /**