@pascal-app/core 1.0.0-beta.5 → 1.0.0

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 (231) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +23 -0
  3. package/dist/capture/index.d.ts +3 -0
  4. package/dist/capture/index.d.ts.map +1 -0
  5. package/dist/capture/index.js +2 -0
  6. package/dist/capture/schema.d.ts +417 -0
  7. package/dist/capture/schema.d.ts.map +1 -0
  8. package/dist/capture/schema.js +348 -0
  9. package/dist/capture/source.d.ts +60 -0
  10. package/dist/capture/source.d.ts.map +1 -0
  11. package/dist/capture/source.js +254 -0
  12. package/dist/events/bus.d.ts +55 -7
  13. package/dist/events/bus.d.ts.map +1 -1
  14. package/dist/events/hidden-wall-pointer-hold.d.ts +28 -0
  15. package/dist/events/hidden-wall-pointer-hold.d.ts.map +1 -0
  16. package/dist/events/hidden-wall-pointer-hold.js +37 -0
  17. package/dist/hooks/spatial-grid/spatial-grid-sync.d.ts +2785 -1
  18. package/dist/hooks/spatial-grid/spatial-grid-sync.d.ts.map +1 -1
  19. package/dist/hooks/spatial-grid/spatial-grid-sync.js +132 -19
  20. package/dist/hooks/spatial-grid/support-host-patch.d.ts +45 -1
  21. package/dist/hooks/spatial-grid/support-host-patch.d.ts.map +1 -1
  22. package/dist/hooks/spatial-grid/support-host-patch.js +171 -6
  23. package/dist/index.d.ts +14 -6
  24. package/dist/index.d.ts.map +1 -1
  25. package/dist/index.js +16 -5
  26. package/dist/lib/asset-storage.d.ts.map +1 -1
  27. package/dist/lib/asset-storage.js +4 -1
  28. package/dist/lib/polygon-union.d.ts +4 -0
  29. package/dist/lib/polygon-union.d.ts.map +1 -0
  30. package/dist/lib/polygon-union.js +306 -0
  31. package/dist/lib/roof-overlap.d.ts +32 -0
  32. package/dist/lib/roof-overlap.d.ts.map +1 -0
  33. package/dist/lib/roof-overlap.js +72 -0
  34. package/dist/lib/slab-polygon.d.ts +35 -2
  35. package/dist/lib/slab-polygon.d.ts.map +1 -1
  36. package/dist/lib/slab-polygon.js +133 -27
  37. package/dist/lib/space-detection.d.ts +11 -0
  38. package/dist/lib/space-detection.d.ts.map +1 -1
  39. package/dist/lib/space-detection.js +42 -14
  40. package/dist/registry/handles.d.ts +24 -3
  41. package/dist/registry/handles.d.ts.map +1 -1
  42. package/dist/registry/index.d.ts +3 -4
  43. package/dist/registry/index.d.ts.map +1 -1
  44. package/dist/registry/index.js +1 -2
  45. package/dist/registry/registry.d.ts +13 -6
  46. package/dist/registry/registry.d.ts.map +1 -1
  47. package/dist/registry/registry.js +37 -4
  48. package/dist/registry/scene-api.d.ts +16 -0
  49. package/dist/registry/scene-api.d.ts.map +1 -1
  50. package/dist/registry/scene-api.js +49 -1
  51. package/dist/registry/types.d.ts +226 -13
  52. package/dist/registry/types.d.ts.map +1 -1
  53. package/dist/schema/__bench__/node-parsers.bench.d.ts +24 -0
  54. package/dist/schema/__bench__/node-parsers.bench.d.ts.map +1 -0
  55. package/dist/schema/__bench__/node-parsers.bench.js +314 -0
  56. package/dist/schema/__fixtures__/node-fixtures.d.ts +28 -0
  57. package/dist/schema/__fixtures__/node-fixtures.d.ts.map +1 -0
  58. package/dist/schema/__fixtures__/node-fixtures.js +125 -0
  59. package/dist/schema/base.d.ts +1 -1
  60. package/dist/schema/base.d.ts.map +1 -1
  61. package/dist/schema/base.js +8 -1
  62. package/dist/schema/compiled-node-parsers.d.ts +40 -0
  63. package/dist/schema/compiled-node-parsers.d.ts.map +1 -0
  64. package/dist/schema/compiled-node-parsers.js +95 -0
  65. package/dist/schema/index.d.ts +19 -15
  66. package/dist/schema/index.d.ts.map +1 -1
  67. package/dist/schema/index.js +17 -12
  68. package/dist/schema/material.d.ts +2 -1
  69. package/dist/schema/material.d.ts.map +1 -1
  70. package/dist/schema/material.js +1 -0
  71. package/dist/schema/nodes/automatic-downspout.d.ts +17 -0
  72. package/dist/schema/nodes/automatic-downspout.d.ts.map +1 -0
  73. package/dist/schema/nodes/automatic-downspout.js +237 -0
  74. package/dist/schema/nodes/block.d.ts +107 -0
  75. package/dist/schema/nodes/block.d.ts.map +1 -0
  76. package/dist/schema/nodes/block.js +207 -0
  77. package/dist/schema/nodes/box-vent.d.ts +8 -2
  78. package/dist/schema/nodes/box-vent.d.ts.map +1 -1
  79. package/dist/schema/nodes/box-vent.js +2 -0
  80. package/dist/schema/nodes/building.d.ts +1 -1
  81. package/dist/schema/nodes/cabinet.d.ts +25 -3
  82. package/dist/schema/nodes/cabinet.d.ts.map +1 -1
  83. package/dist/schema/nodes/cabinet.js +26 -5
  84. package/dist/schema/nodes/ceiling.d.ts +1 -1
  85. package/dist/schema/nodes/chimney.d.ts +2 -2
  86. package/dist/schema/nodes/column.d.ts +6 -6
  87. package/dist/schema/nodes/construction-dimension.d.ts +4 -4
  88. package/dist/schema/nodes/cupola.d.ts +9 -1
  89. package/dist/schema/nodes/cupola.d.ts.map +1 -1
  90. package/dist/schema/nodes/cupola.js +2 -0
  91. package/dist/schema/nodes/door.d.ts +1 -1
  92. package/dist/schema/nodes/dormer.d.ts +44 -1
  93. package/dist/schema/nodes/dormer.d.ts.map +1 -1
  94. package/dist/schema/nodes/dormer.js +131 -7
  95. package/dist/schema/nodes/downspout.d.ts +11 -1
  96. package/dist/schema/nodes/downspout.d.ts.map +1 -1
  97. package/dist/schema/nodes/downspout.js +24 -0
  98. package/dist/schema/nodes/duct-fitting.d.ts +18 -1
  99. package/dist/schema/nodes/duct-fitting.d.ts.map +1 -1
  100. package/dist/schema/nodes/duct-fitting.js +25 -4
  101. package/dist/schema/nodes/duct-segment.d.ts +23 -1
  102. package/dist/schema/nodes/duct-segment.d.ts.map +1 -1
  103. package/dist/schema/nodes/duct-segment.js +20 -0
  104. package/dist/schema/nodes/duct-terminal.d.ts +1 -1
  105. package/dist/schema/nodes/elevator.d.ts +1 -1
  106. package/dist/schema/nodes/eyebrow-vent.d.ts +8 -2
  107. package/dist/schema/nodes/eyebrow-vent.d.ts.map +1 -1
  108. package/dist/schema/nodes/eyebrow-vent.js +2 -0
  109. package/dist/schema/nodes/fence.d.ts +1 -1
  110. package/dist/schema/nodes/guide.d.ts +1 -1
  111. package/dist/schema/nodes/gutter.d.ts +36 -2
  112. package/dist/schema/nodes/gutter.d.ts.map +1 -1
  113. package/dist/schema/nodes/gutter.js +308 -1
  114. package/dist/schema/nodes/hanger-overrides.d.ts +7 -0
  115. package/dist/schema/nodes/hanger-overrides.d.ts.map +1 -0
  116. package/dist/schema/nodes/hanger-overrides.js +6 -0
  117. package/dist/schema/nodes/hvac-equipment.d.ts +1 -1
  118. package/dist/schema/nodes/item.d.ts +4 -3
  119. package/dist/schema/nodes/item.d.ts.map +1 -1
  120. package/dist/schema/nodes/item.js +5 -0
  121. package/dist/schema/nodes/lean-to-extension.d.ts +212 -0
  122. package/dist/schema/nodes/lean-to-extension.d.ts.map +1 -0
  123. package/dist/schema/nodes/lean-to-extension.js +114 -0
  124. package/dist/schema/nodes/level.d.ts +2 -2
  125. package/dist/schema/nodes/level.d.ts.map +1 -1
  126. package/dist/schema/nodes/lineset.d.ts +1 -1
  127. package/dist/schema/nodes/liquid-line.d.ts +1 -1
  128. package/dist/schema/nodes/measurement.d.ts +1 -1
  129. package/dist/schema/nodes/pipe-fitting.d.ts +9 -1
  130. package/dist/schema/nodes/pipe-fitting.d.ts.map +1 -1
  131. package/dist/schema/nodes/pipe-fitting.js +6 -2
  132. package/dist/schema/nodes/pipe-segment.d.ts +23 -1
  133. package/dist/schema/nodes/pipe-segment.d.ts.map +1 -1
  134. package/dist/schema/nodes/pipe-segment.js +20 -0
  135. package/dist/schema/nodes/pipe-trap.d.ts +1 -1
  136. package/dist/schema/nodes/ridge-vent.d.ts +1 -1
  137. package/dist/schema/nodes/ridge-vent.d.ts.map +1 -1
  138. package/dist/schema/nodes/ridge-vent.js +4 -1
  139. package/dist/schema/nodes/roof-segment-shape.d.ts +4 -0
  140. package/dist/schema/nodes/roof-segment-shape.d.ts.map +1 -1
  141. package/dist/schema/nodes/roof-segment-shape.js +64 -1
  142. package/dist/schema/nodes/roof-segment-walls.d.ts +3 -1
  143. package/dist/schema/nodes/roof-segment-walls.d.ts.map +1 -1
  144. package/dist/schema/nodes/roof-segment-walls.js +1 -1
  145. package/dist/schema/nodes/roof-segment.d.ts +41 -1
  146. package/dist/schema/nodes/roof-segment.d.ts.map +1 -1
  147. package/dist/schema/nodes/roof-segment.js +79 -2
  148. package/dist/schema/nodes/roof.d.ts +22 -1
  149. package/dist/schema/nodes/roof.d.ts.map +1 -1
  150. package/dist/schema/nodes/roof.js +14 -0
  151. package/dist/schema/nodes/scan.d.ts +19 -2
  152. package/dist/schema/nodes/scan.d.ts.map +1 -1
  153. package/dist/schema/nodes/scan.js +11 -1
  154. package/dist/schema/nodes/shelf.d.ts +2 -2
  155. package/dist/schema/nodes/site.d.ts +1 -1
  156. package/dist/schema/nodes/skylight.d.ts +1 -1
  157. package/dist/schema/nodes/slab.d.ts +1 -1
  158. package/dist/schema/nodes/solar-panel.d.ts +1 -1
  159. package/dist/schema/nodes/spawn.d.ts +1 -1
  160. package/dist/schema/nodes/stair-segment.d.ts +1 -1
  161. package/dist/schema/nodes/stair.d.ts +1 -1
  162. package/dist/schema/nodes/structural-grid.d.ts +1 -1
  163. package/dist/schema/nodes/turbine-vent.d.ts +7 -1
  164. package/dist/schema/nodes/turbine-vent.d.ts.map +1 -1
  165. package/dist/schema/nodes/turbine-vent.js +2 -0
  166. package/dist/schema/nodes/wall.d.ts +4 -4
  167. package/dist/schema/nodes/wall.d.ts.map +1 -1
  168. package/dist/schema/nodes/wall.js +7 -1
  169. package/dist/schema/nodes/window.d.ts +10 -3
  170. package/dist/schema/nodes/window.d.ts.map +1 -1
  171. package/dist/schema/nodes/window.js +4 -0
  172. package/dist/schema/nodes/zone.d.ts +2 -2
  173. package/dist/schema/nodes/zone.js +1 -1
  174. package/dist/schema/types.d.ts +484 -109
  175. package/dist/schema/types.d.ts.map +1 -1
  176. package/dist/schema/types.js +27 -1
  177. package/dist/services/hosting.d.ts +2 -2
  178. package/dist/services/hosting.d.ts.map +1 -1
  179. package/dist/services/hosting.js +4 -4
  180. package/dist/services/index.d.ts +1 -1
  181. package/dist/services/index.d.ts.map +1 -1
  182. package/dist/services/index.js +1 -1
  183. package/dist/services/system-graph.d.ts +11 -0
  184. package/dist/services/system-graph.d.ts.map +1 -1
  185. package/dist/services/system-graph.js +35 -5
  186. package/dist/store/actions/node-actions.d.ts +7 -0
  187. package/dist/store/actions/node-actions.d.ts.map +1 -1
  188. package/dist/store/actions/node-actions.js +429 -17
  189. package/dist/store/history-invalidation.d.ts +3 -0
  190. package/dist/store/history-invalidation.d.ts.map +1 -0
  191. package/dist/store/history-invalidation.js +72 -0
  192. package/dist/store/scene-hydration.d.ts +5 -0
  193. package/dist/store/scene-hydration.d.ts.map +1 -0
  194. package/dist/store/scene-hydration.js +57 -0
  195. package/dist/store/use-scene.d.ts +3 -0
  196. package/dist/store/use-scene.d.ts.map +1 -1
  197. package/dist/store/use-scene.js +332 -64
  198. package/dist/systems/roof/roof-elevation-system.d.ts +3 -0
  199. package/dist/systems/roof/roof-elevation-system.d.ts.map +1 -0
  200. package/dist/systems/roof/roof-elevation-system.js +94 -0
  201. package/dist/systems/roof/roof-elevation.d.ts +4 -0
  202. package/dist/systems/roof/roof-elevation.d.ts.map +1 -0
  203. package/dist/systems/roof/roof-elevation.js +95 -0
  204. package/dist/systems/roof/roof-footprint.d.ts +17 -0
  205. package/dist/systems/roof/roof-footprint.d.ts.map +1 -0
  206. package/dist/systems/roof/roof-footprint.js +83 -0
  207. package/dist/systems/stair/stair-flight.d.ts +17 -0
  208. package/dist/systems/stair/stair-flight.d.ts.map +1 -0
  209. package/dist/systems/stair/stair-flight.js +27 -0
  210. package/dist/systems/stair/stair-opening-preview.d.ts +1555 -1328
  211. package/dist/systems/stair/stair-opening-preview.d.ts.map +1 -1
  212. package/dist/systems/stair/stair-opening-system.d.ts +1 -0
  213. package/dist/systems/stair/stair-opening-system.d.ts.map +1 -1
  214. package/dist/systems/stair/stair-opening-system.js +93 -96
  215. package/dist/systems/stair/stair-rise.d.ts.map +1 -1
  216. package/dist/systems/stair/stair-rise.js +20 -21
  217. package/dist/systems/wall/wall-curve.d.ts +1 -0
  218. package/dist/systems/wall/wall-curve.d.ts.map +1 -1
  219. package/dist/systems/wall/wall-curve.js +73 -0
  220. package/dist/systems/wall/wall-footprint.d.ts +1 -0
  221. package/dist/systems/wall/wall-footprint.d.ts.map +1 -1
  222. package/dist/systems/wall/wall-footprint.js +1 -0
  223. package/dist/utils/clone-scene-graph.d.ts.map +1 -1
  224. package/dist/utils/clone-scene-graph.js +26 -0
  225. package/dist/validation/validate-build-json.d.ts +3 -0
  226. package/dist/validation/validate-build-json.d.ts.map +1 -1
  227. package/dist/validation/validate-build-json.js +49 -2
  228. package/package.json +10 -3
  229. package/dist/systems/elevator/elevator-runtime-system.d.ts +0 -2
  230. package/dist/systems/elevator/elevator-runtime-system.d.ts.map +0 -1
  231. package/dist/systems/elevator/elevator-runtime-system.js +0 -8
@@ -8,26 +8,16 @@ type SurfaceOpeningUpdate = {
8
8
  export declare function hasLiveStairOpeningInputs(nodes: Record<string, AnyNode>, liveTransforms: ReadonlyMap<string, LiveTransform>, liveOverrides: ReadonlyMap<string, LiveNodeOverrides>, previewSurfaceIds: ReadonlySet<string>): boolean;
9
9
  export declare function getNodesWithLiveStairOpeningInputs(nodes: Record<string, AnyNode>, liveTransforms: ReadonlyMap<string, LiveTransform>, liveOverrides: ReadonlyMap<string, LiveNodeOverrides>, previewSurfaceIds: ReadonlySet<string>): Record<string, {
10
10
  object: "node";
11
+ id: `site_${string}`;
11
12
  parentId: string | null;
12
13
  visible: boolean;
13
- metadata: import("zod").JSONType;
14
- id: `bvent_${string}`;
15
- type: "box-vent";
16
- materialPreset: string;
17
- position: [number, number, number];
18
- rotation: number;
19
- width: number;
20
- depth: number;
21
- height: number;
22
- hoodOverhang: number;
23
- topTaper: number;
24
- capHeight: number;
25
- capGap: number;
26
- domeCurvature: number;
27
- baseInset: number;
28
- baseHeight: number;
29
- cornerBevel: number;
30
- style: "box" | "cap" | "dome";
14
+ metadata: Record<string, unknown>;
15
+ children: string[];
16
+ polygon: {
17
+ type: "polygon";
18
+ points: [number, number][];
19
+ };
20
+ type: "site";
31
21
  name?: string | undefined;
32
22
  camera?: {
33
23
  position: [number, number, number];
@@ -36,32 +26,40 @@ export declare function getNodesWithLiveStairOpeningInputs(nodes: Record<string,
36
26
  fov?: number | undefined;
37
27
  zoom?: number | undefined;
38
28
  } | undefined;
39
- material?: {
40
- id?: string | undefined;
41
- preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
42
- properties?: {
43
- color: string;
44
- roughness: number;
45
- metalness: number;
46
- opacity: number;
47
- transparent: boolean;
48
- side: "front" | "back" | "double";
49
- } | undefined;
50
- texture?: {
51
- url: string;
52
- repeat?: [number, number] | undefined;
53
- scale?: number | undefined;
54
- } | undefined;
29
+ terrain?: {
30
+ type: "heightfield";
31
+ origin: [number, number];
32
+ spacing: number;
33
+ cols: number;
34
+ rows: number;
35
+ step: number;
36
+ heights: string;
55
37
  } | undefined;
56
- roofSegmentId?: string | undefined;
57
38
  } | {
58
39
  object: "node";
40
+ position: [number, number, number];
41
+ id: `building_${string}`;
59
42
  parentId: string | null;
60
43
  visible: boolean;
61
- metadata: import("zod").JSONType;
62
- id: `elevator_${string}`;
63
- type: "elevator";
44
+ metadata: Record<string, unknown>;
45
+ rotation: [number, number, number];
46
+ children: (`elevator_${string}` | `level_${string}`)[];
47
+ type: "building";
48
+ name?: string | undefined;
49
+ camera?: {
50
+ position: [number, number, number];
51
+ target: [number, number, number];
52
+ mode: "perspective" | "orthographic";
53
+ fov?: number | undefined;
54
+ zoom?: number | undefined;
55
+ } | undefined;
56
+ } | {
57
+ object: "node";
64
58
  position: [number, number, number];
59
+ id: `elevator_${string}`;
60
+ parentId: string | null;
61
+ visible: boolean;
62
+ metadata: Record<string, unknown>;
65
63
  rotation: number;
66
64
  width: number;
67
65
  depth: number;
@@ -80,6 +78,7 @@ export declare function getNodesWithLiveStairOpeningInputs(nodes: Record<string,
80
78
  speed: number;
81
79
  doorDurationMs: number;
82
80
  dwellMs: number;
81
+ type: "elevator";
83
82
  name?: string | undefined;
84
83
  camera?: {
85
84
  position: [number, number, number];
@@ -88,6 +87,7 @@ export declare function getNodesWithLiveStairOpeningInputs(nodes: Record<string,
88
87
  fov?: number | undefined;
89
88
  zoom?: number | undefined;
90
89
  } | undefined;
90
+ slots?: Record<string, string> | undefined;
91
91
  material?: {
92
92
  id?: string | undefined;
93
93
  preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
@@ -106,79 +106,19 @@ export declare function getNodesWithLiveStairOpeningInputs(nodes: Record<string,
106
106
  } | undefined;
107
107
  } | undefined;
108
108
  materialPreset?: string | undefined;
109
- slots?: Record<string, string> | undefined;
110
109
  shaftWidth?: number | undefined;
111
110
  shaftDepth?: number | undefined;
112
111
  servedLevelIds?: string[] | undefined;
113
112
  } | {
114
113
  object: "node";
114
+ id: `level_${string}`;
115
115
  parentId: string | null;
116
116
  visible: boolean;
117
- metadata: import("zod").JSONType;
118
- id: `item_${string}`;
119
- type: "item";
120
- position: [number, number, number];
121
- rotation: [number, number, number];
122
- scale: [number, number, number];
123
- children: `item_${string}`[];
124
- asset: {
125
- id: string;
126
- category: string;
127
- name: string;
128
- thumbnail: string;
129
- source: "library" | "community" | "mine";
130
- src: string;
131
- dimensions: [number, number, number];
132
- offset: [number, number, number];
133
- rotation: [number, number, number];
134
- scale: [number, number, number];
135
- floorPlanUrl?: string | undefined;
136
- isDraft?: boolean | undefined;
137
- attachTo?: "wall" | "ceiling" | "wall-side" | undefined;
138
- recessed?: boolean | undefined;
139
- tags?: string[] | undefined;
140
- functionTags?: string[] | undefined;
141
- surface?: {
142
- height: number;
143
- } | undefined;
144
- interactive?: {
145
- controls: ({
146
- kind: "toggle";
147
- label?: string | undefined;
148
- default?: boolean | undefined;
149
- } | {
150
- kind: "slider";
151
- label: string;
152
- min: number;
153
- max: number;
154
- step: number;
155
- displayMode: "slider" | "stepper" | "dial";
156
- unit?: string | undefined;
157
- default?: number | undefined;
158
- } | {
159
- kind: "temperature";
160
- label: string;
161
- min: number;
162
- max: number;
163
- unit: "C" | "F";
164
- default?: number | undefined;
165
- })[];
166
- effects: ({
167
- kind: "animation";
168
- clips: {
169
- on?: string | undefined;
170
- off?: string | undefined;
171
- loop?: string | undefined;
172
- };
173
- } | {
174
- kind: "light";
175
- color: string;
176
- intensityRange: [number, number];
177
- offset: [number, number, number];
178
- distance?: number | undefined;
179
- })[];
180
- } | undefined;
181
- };
117
+ metadata: Record<string, unknown>;
118
+ children: (`item_${string}` | `block_${string}` | `ceiling_${string}` | `column_${string}` | `wall_${string}` | `roof_${string}` | `slab_${string}` | `fence_${string}` | `construction-dimension_${string}` | `structural-grid_${string}` | `zone_${string}` | `stair_${string}` | `scan_${string}` | `guide_${string}` | `measurement_${string}` | `spawn_${string}` | `shelf_${string}` | `duct-segment_${string}` | `duct-fitting_${string}` | `duct-terminal_${string}` | `hvac-equipment_${string}` | `lineset_${string}` | `liquid-line_${string}` | `pipe-segment_${string}` | `pipe-fitting_${string}` | `pipe-trap_${string}`)[];
119
+ level: number;
120
+ baseElevation: number;
121
+ type: "level";
182
122
  name?: string | undefined;
183
123
  camera?: {
184
124
  position: [number, number, number];
@@ -187,30 +127,78 @@ export declare function getNodesWithLiveStairOpeningInputs(nodes: Record<string,
187
127
  fov?: number | undefined;
188
128
  zoom?: number | undefined;
189
129
  } | undefined;
190
- side?: "front" | "back" | undefined;
191
- wallId?: string | undefined;
192
- wallT?: number | undefined;
193
- roofSegmentId?: string | undefined;
194
- roofFace?: "front" | "back" | "right" | "left" | undefined;
195
- supportSlabId?: string | undefined;
196
- collectionIds?: `collection_${string}`[] | undefined;
197
- slots?: Record<string, string> | undefined;
130
+ height?: number | undefined;
198
131
  } | {
199
132
  object: "node";
133
+ position: [number, number, number];
134
+ id: `leanto_${string}`;
200
135
  parentId: string | null;
201
136
  visible: boolean;
202
- metadata: import("zod").JSONType;
203
- id: `ceiling_${string}`;
204
- type: "ceiling";
205
- children: `item_${string}`[];
206
- polygon: [number, number][];
207
- holes: [number, number][][];
208
- holeMetadata: {
209
- source: "stair" | "elevator" | "manual";
210
- stairId?: string | undefined;
211
- elevatorId?: string | undefined;
137
+ metadata: Record<string, unknown>;
138
+ rotation: [number, number, number];
139
+ children: (`column_${string}` | `roof_${string}`)[];
140
+ pitch: number;
141
+ shingleThickness: number;
142
+ canopyForm: "gable" | "mono" | "butterfly";
143
+ hostKind: "wall" | "slab-edge" | "freestanding" | "conical-roof";
144
+ hostHeightOffset: number;
145
+ span: number;
146
+ autoSpan: boolean;
147
+ projection: number;
148
+ highEdgeHeight: number;
149
+ lowEdgeHeight: number;
150
+ resizeLock: "preserve-high-edge" | "preserve-low-edge" | "preserve-pitch";
151
+ leftEndCondition: "open" | "wall-abutment" | "joined";
152
+ rightEndCondition: "open" | "wall-abutment" | "joined";
153
+ autoMiterCorners: boolean;
154
+ sideFlashing: boolean;
155
+ flashingProjection: number;
156
+ flashingHeight: number;
157
+ highSideMode: "wall-ledger" | "independent-high-beam";
158
+ ledgerVerticalOffset: number;
159
+ lowBeamInset: number;
160
+ gutterEnabled: boolean;
161
+ gutterProfile: "box" | "k-style" | "half-round";
162
+ gutterSize: number;
163
+ downspoutEnabled: boolean;
164
+ downspoutPosition: number;
165
+ connectionMode: "manual" | "auto";
166
+ connectionOffset: number;
167
+ connectionInset: number;
168
+ matchHostRoofMaterial: boolean;
169
+ matchHostRoofStructure: boolean;
170
+ roofThickness: number;
171
+ highOverhang: number;
172
+ lowOverhang: number;
173
+ leftOverhang: number;
174
+ rightOverhang: number;
175
+ coveringType: "generic" | "shingle" | "metal-panel";
176
+ beamWidth: number;
177
+ beamHeight: number;
178
+ ledgerDepth: number;
179
+ ledgerHeight: number;
180
+ rafterWidth: number;
181
+ rafterHeight: number;
182
+ rafterSpacing: number;
183
+ rafterEndInset: number;
184
+ framingStrategy: "hidden" | "rafters" | "purlins" | "covering-specific";
185
+ purlinWidth: number;
186
+ purlinHeight: number;
187
+ purlinSpacing: number;
188
+ postWidth: number;
189
+ postDepth: number;
190
+ postCount: number;
191
+ postLayoutMode: "count" | "target-spacing";
192
+ postSpacing: number;
193
+ postInset: number;
194
+ omittedPostSlots: {
195
+ side: "low" | "high";
196
+ index: number;
197
+ layoutCount: number;
212
198
  }[];
213
- autoFromWalls: boolean;
199
+ postBracing: "none" | "knee";
200
+ footingStyle: "none" | "base-plate" | "concrete-pad";
201
+ type: "lean-to-extension";
214
202
  name?: string | undefined;
215
203
  camera?: {
216
204
  position: [number, number, number];
@@ -219,43 +207,32 @@ export declare function getNodesWithLiveStairOpeningInputs(nodes: Record<string,
219
207
  fov?: number | undefined;
220
208
  zoom?: number | undefined;
221
209
  } | undefined;
222
- material?: {
223
- id?: string | undefined;
224
- preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
225
- properties?: {
226
- color: string;
227
- roughness: number;
228
- metalness: number;
229
- opacity: number;
230
- transparent: boolean;
231
- side: "front" | "back" | "double";
232
- } | undefined;
233
- texture?: {
234
- url: string;
235
- repeat?: [number, number] | undefined;
236
- scale?: number | undefined;
237
- } | undefined;
238
- } | undefined;
239
- materialPreset?: string | undefined;
240
210
  slots?: Record<string, string> | undefined;
241
- height?: number | undefined;
211
+ hostSlabId?: `slab_${string}` | undefined;
212
+ hostSlabEdgeIndex?: number | undefined;
213
+ hostSlabEdgeT?: number | undefined;
214
+ spanArcCenterZ?: number | undefined;
215
+ spanArcRadius?: number | undefined;
216
+ hostRoofId?: `roof_${string}` | undefined;
217
+ hostRoofSegmentId?: string | undefined;
218
+ hostRoofEdge?: "+X" | "-X" | "+Z" | "-Z" | undefined;
219
+ hostRoofEdgeRange?: [number, number] | undefined;
242
220
  } | {
243
221
  object: "node";
222
+ position: [number, number, number];
223
+ id: `column_${string}`;
244
224
  parentId: string | null;
245
225
  visible: boolean;
246
- metadata: import("zod").JSONType;
247
- id: `column_${string}`;
248
- type: "column";
249
- position: [number, number, number];
226
+ metadata: Record<string, unknown>;
250
227
  rotation: number;
251
- style: "plain" | "faceted" | "fluted" | "lathe-turned" | "dravidian-carved" | "cluster";
252
- crossSection: "round" | "square" | "rectangular" | "octagonal" | "sixteen-sided";
253
228
  height: number;
254
- radius: number;
255
229
  width: number;
256
230
  depth: number;
257
- edgeSoftness: number;
258
231
  baseHeight: number;
232
+ style: "plain" | "faceted" | "fluted" | "lathe-turned" | "dravidian-carved" | "cluster";
233
+ crossSection: "round" | "square" | "rectangular" | "octagonal" | "sixteen-sided";
234
+ radius: number;
235
+ edgeSoftness: number;
259
236
  capitalHeight: number;
260
237
  shaftProfile: "straight" | "tapered" | "bulged" | "baluster" | "hourglass";
261
238
  shaftTaper: number;
@@ -293,7 +270,7 @@ export declare function getNodesWithLiveStairOpeningInputs(nodes: Record<string,
293
270
  pendantCount: number;
294
271
  capitalCarvingLevel: number;
295
272
  ringCount: number;
296
- ringPlacement: "ends" | "even" | "top" | "bottom";
273
+ ringPlacement: "top" | "ends" | "even" | "bottom";
297
274
  ringThickness: number;
298
275
  ringSpread: number;
299
276
  fluteCount: number;
@@ -305,9 +282,9 @@ export declare function getNodesWithLiveStairOpeningInputs(nodes: Record<string,
305
282
  panelInsetDepth: number;
306
283
  panelShape: "rectangle" | "arched" | "diamond";
307
284
  latheRingCount: number;
308
- latheRingSpacing: "ends" | "even" | "top" | "bottom";
285
+ latheRingSpacing: "top" | "ends" | "even" | "bottom";
309
286
  carvingLevel: number;
310
- carvingPlacement: "shaft" | "base" | "capital" | "all";
287
+ carvingPlacement: "base" | "shaft" | "capital" | "all";
311
288
  lowerBandEnabled: boolean;
312
289
  lowerBandHeight: number;
313
290
  lowerBandCarvingLevel: number;
@@ -319,6 +296,7 @@ export declare function getNodesWithLiveStairOpeningInputs(nodes: Record<string,
319
296
  braceBottomSpread: number;
320
297
  braceTopSpread: number;
321
298
  bracePlateEnabled: boolean;
299
+ type: "column";
322
300
  name?: string | undefined;
323
301
  camera?: {
324
302
  position: [number, number, number];
@@ -328,6 +306,7 @@ export declare function getNodesWithLiveStairOpeningInputs(nodes: Record<string,
328
306
  zoom?: number | undefined;
329
307
  } | undefined;
330
308
  supportSlabId?: string | undefined;
309
+ slots?: Record<string, string> | undefined;
331
310
  material?: {
332
311
  id?: string | undefined;
333
312
  preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
@@ -346,19 +325,47 @@ export declare function getNodesWithLiveStairOpeningInputs(nodes: Record<string,
346
325
  } | undefined;
347
326
  } | undefined;
348
327
  materialPreset?: string | undefined;
349
- slots?: Record<string, string> | undefined;
350
328
  } | {
351
329
  object: "node";
330
+ mode: "radius" | "linear" | "diameter" | "center-mark" | "chord" | "arc-length" | "angular" | "coordinate";
331
+ id: `construction-dimension_${string}`;
352
332
  parentId: string | null;
353
333
  visible: boolean;
354
- metadata: import("zod").JSONType;
355
- id: `wall_${string}`;
356
- type: "wall";
357
- children: (`item_${string}` | `door_${string}` | `window_${string}`)[];
358
- start: [number, number];
359
- end: [number, number];
360
- frontSide: "unknown" | "interior" | "exterior";
361
- backSide: "unknown" | "interior" | "exterior";
334
+ metadata: Record<string, unknown>;
335
+ anchors: ([number, number, number] | {
336
+ kind: "feature";
337
+ reference: {
338
+ nodeId: string;
339
+ featureId: string;
340
+ parameters?: Record<string, string | number | boolean> | undefined;
341
+ };
342
+ fallback: [number, number, number];
343
+ })[];
344
+ baseline: {
345
+ origin: [number, number];
346
+ direction: [number, number];
347
+ };
348
+ chainMode: "point-to-point" | "continuous";
349
+ featureCount: number;
350
+ showCenterMark: boolean;
351
+ prefix: string;
352
+ suffix: string;
353
+ textOverride: string | null;
354
+ datumPolicy: "centerline" | "wall-face" | "structural-face" | "finish-face";
355
+ terminator: "architectural-tick" | "filled-arrow" | "open-arrow" | "dot";
356
+ textPosition: "above" | "centered";
357
+ imperialPrecision: "1" | "1/2" | "1/4" | "1/8" | "1/16";
358
+ metricNotation: "meters" | "millimeters";
359
+ extensionStartGap: number;
360
+ extensionOvershoot: number;
361
+ drawingType: "floor-plan" | "foundation-plan" | "reflected-ceiling-plan" | "roof-plan" | "site-plan";
362
+ drawingOverrides: {
363
+ drawingType: "floor-plan" | "foundation-plan" | "reflected-ceiling-plan" | "roof-plan" | "site-plan";
364
+ presentation: "omit" | "shown" | "controlled";
365
+ suppressedSegmentIndexes: number[];
366
+ }[];
367
+ controllingDimensionId: `construction-dimension_${string}` | null;
368
+ type: "construction-dimension";
362
369
  name?: string | undefined;
363
370
  camera?: {
364
371
  position: [number, number, number];
@@ -367,24 +374,105 @@ export declare function getNodesWithLiveStairOpeningInputs(nodes: Record<string,
367
374
  fov?: number | undefined;
368
375
  zoom?: number | undefined;
369
376
  } | undefined;
370
- material?: {
371
- id?: string | undefined;
372
- preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
373
- properties?: {
374
- color: string;
375
- roughness: number;
376
- metalness: number;
377
- opacity: number;
378
- transparent: boolean;
379
- side: "front" | "back" | "double";
380
- } | undefined;
381
- texture?: {
382
- url: string;
383
- repeat?: [number, number] | undefined;
384
- scale?: number | undefined;
385
- } | undefined;
386
- } | undefined;
377
+ } | {
378
+ object: "node";
379
+ position: [number, number, number];
380
+ id: `block_${string}`;
381
+ parentId: string | null;
382
+ visible: boolean;
383
+ metadata: Record<string, unknown>;
384
+ rotation: number;
385
+ children: `item_${string}`[];
386
+ slots: Record<string, string>;
387
+ topology: {
388
+ vertices: {
389
+ id: string;
390
+ position: [number, number, number];
391
+ }[];
392
+ edges: {
393
+ id: string;
394
+ vertexIds: [string, string];
395
+ }[];
396
+ faces: {
397
+ id: string;
398
+ vertexIds: string[];
399
+ materialSlot: string;
400
+ }[];
401
+ };
402
+ slotNames: Record<string, string>;
403
+ type: "block";
404
+ name?: string | undefined;
405
+ camera?: {
406
+ position: [number, number, number];
407
+ target: [number, number, number];
408
+ mode: "perspective" | "orthographic";
409
+ fov?: number | undefined;
410
+ zoom?: number | undefined;
411
+ } | undefined;
412
+ supportSlabId?: string | undefined;
413
+ } | {
414
+ object: "node";
415
+ id: `structural-grid_${string}`;
416
+ parentId: string | null;
417
+ visible: boolean;
418
+ metadata: Record<string, unknown>;
419
+ label: string;
420
+ start: [number, number];
421
+ end: [number, number];
422
+ showStartBubble: boolean;
423
+ showEndBubble: boolean;
424
+ type: "structural-grid";
425
+ name?: string | undefined;
426
+ camera?: {
427
+ position: [number, number, number];
428
+ target: [number, number, number];
429
+ mode: "perspective" | "orthographic";
430
+ fov?: number | undefined;
431
+ zoom?: number | undefined;
432
+ } | undefined;
433
+ } | {
434
+ object: "node";
435
+ id: `wall_${string}`;
436
+ parentId: string | null;
437
+ visible: boolean;
438
+ metadata: Record<string, unknown>;
439
+ children: (`item_${string}` | `door_${string}` | `window_${string}` | `leanto_${string}`)[];
440
+ start: [number, number];
441
+ end: [number, number];
442
+ frontSide: "unknown" | "interior" | "exterior";
443
+ backSide: "unknown" | "interior" | "exterior";
444
+ type: "wall";
445
+ name?: string | undefined;
446
+ camera?: {
447
+ position: [number, number, number];
448
+ target: [number, number, number];
449
+ mode: "perspective" | "orthographic";
450
+ fov?: number | undefined;
451
+ zoom?: number | undefined;
452
+ } | undefined;
453
+ height?: number | undefined;
454
+ supportSlabId?: string | undefined;
455
+ slots?: Record<string, string> | undefined;
456
+ material?: {
457
+ id?: string | undefined;
458
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
459
+ properties?: {
460
+ color: string;
461
+ roughness: number;
462
+ metalness: number;
463
+ opacity: number;
464
+ transparent: boolean;
465
+ side: "front" | "back" | "double";
466
+ } | undefined;
467
+ texture?: {
468
+ url: string;
469
+ repeat?: [number, number] | undefined;
470
+ scale?: number | undefined;
471
+ } | undefined;
472
+ } | undefined;
387
473
  materialPreset?: string | undefined;
474
+ thickness?: number | undefined;
475
+ fillToTerrain?: boolean | undefined;
388
476
  interiorMaterial?: {
389
477
  id?: string | undefined;
390
478
  preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
@@ -421,13 +509,8 @@ export declare function getNodesWithLiveStairOpeningInputs(nodes: Record<string,
421
509
  } | undefined;
422
510
  } | undefined;
423
511
  exteriorMaterialPreset?: string | undefined;
424
- slots?: Record<string, string> | undefined;
425
- thickness?: number | undefined;
426
- height?: number | undefined;
427
512
  curveOffset?: number | undefined;
428
- supportSlabId?: string | undefined;
429
513
  supportOffset?: number | undefined;
430
- fillToTerrain?: boolean | undefined;
431
514
  faceBands?: {
432
515
  enabled: boolean;
433
516
  count: number;
@@ -461,27 +544,28 @@ export declare function getNodesWithLiveStairOpeningInputs(nodes: Record<string,
461
544
  } | undefined;
462
545
  } | {
463
546
  object: "node";
547
+ id: `fence_${string}`;
464
548
  parentId: string | null;
465
549
  visible: boolean;
466
- metadata: import("zod").JSONType;
467
- id: `fence_${string}`;
468
- type: "fence";
469
- start: [number, number];
470
- end: [number, number];
550
+ metadata: Record<string, unknown>;
551
+ color: string;
471
552
  height: number;
472
- thickness: number;
473
553
  baseHeight: number;
554
+ style: "slat" | "rail" | "privacy" | "horizontal";
555
+ baseStyle: "floating" | "grounded";
556
+ thickness: number;
474
557
  postSpacing: number;
558
+ start: [number, number];
559
+ end: [number, number];
475
560
  postSize: number;
476
561
  topRailHeight: number;
477
562
  groundClearance: number;
478
563
  edgeInset: number;
479
564
  slatGap: number;
480
565
  postCap: "flat" | "none" | "pyramid";
481
- baseStyle: "floating" | "grounded";
482
566
  showInfill: boolean;
483
- color: string;
484
- style: "slat" | "rail" | "privacy" | "horizontal";
567
+ type: "fence";
568
+ path?: [number, number][] | undefined;
485
569
  name?: string | undefined;
486
570
  camera?: {
487
571
  position: [number, number, number];
@@ -490,6 +574,8 @@ export declare function getNodesWithLiveStairOpeningInputs(nodes: Record<string,
490
574
  fov?: number | undefined;
491
575
  zoom?: number | undefined;
492
576
  } | undefined;
577
+ supportSlabId?: string | undefined;
578
+ slots?: Record<string, string> | undefined;
493
579
  material?: {
494
580
  id?: string | undefined;
495
581
  preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
@@ -508,127 +594,43 @@ export declare function getNodesWithLiveStairOpeningInputs(nodes: Record<string,
508
594
  } | undefined;
509
595
  } | undefined;
510
596
  materialPreset?: string | undefined;
511
- slots?: Record<string, string> | undefined;
512
- path?: [number, number][] | undefined;
513
- tangents?: ([number, number] | null)[] | undefined;
514
- supportSlabId?: string | undefined;
515
- supportOffset?: number | undefined;
516
597
  curveOffset?: number | undefined;
598
+ supportOffset?: number | undefined;
599
+ tangents?: ([number, number] | null)[] | undefined;
517
600
  } | {
518
601
  object: "node";
602
+ position: [number, number, number];
603
+ id: `cabinet_${string}`;
519
604
  parentId: string | null;
520
605
  visible: boolean;
521
- metadata: import("zod").JSONType;
522
- id: `construction-dimension_${string}`;
523
- type: "construction-dimension";
524
- anchors: ([number, number, number] | {
525
- kind: "feature";
526
- reference: {
527
- nodeId: string;
528
- featureId: string;
529
- parameters?: Record<string, string | number | boolean> | undefined;
530
- };
531
- fallback: [number, number, number];
532
- })[];
533
- baseline: {
534
- origin: [number, number];
535
- direction: [number, number];
536
- };
537
- chainMode: "point-to-point" | "continuous";
538
- mode: "radius" | "linear" | "diameter" | "center-mark" | "chord" | "arc-length" | "angular" | "coordinate";
539
- featureCount: number;
540
- showCenterMark: boolean;
541
- prefix: string;
542
- suffix: string;
543
- textOverride: string | null;
544
- datumPolicy: "centerline" | "wall-face" | "structural-face" | "finish-face";
545
- terminator: "architectural-tick" | "filled-arrow" | "open-arrow" | "dot";
546
- textPosition: "above" | "centered";
547
- imperialPrecision: "1" | "1/2" | "1/4" | "1/8" | "1/16";
548
- metricNotation: "meters" | "millimeters";
549
- extensionStartGap: number;
550
- extensionOvershoot: number;
551
- drawingType: "floor-plan" | "foundation-plan" | "reflected-ceiling-plan" | "roof-plan" | "site-plan";
552
- drawingOverrides: {
553
- drawingType: "floor-plan" | "foundation-plan" | "reflected-ceiling-plan" | "roof-plan" | "site-plan";
554
- presentation: "shown" | "omit" | "controlled";
555
- suppressedSegmentIndexes: number[];
556
- }[];
557
- controllingDimensionId: `construction-dimension_${string}` | null;
558
- name?: string | undefined;
559
- camera?: {
560
- position: [number, number, number];
561
- target: [number, number, number];
562
- mode: "perspective" | "orthographic";
563
- fov?: number | undefined;
564
- zoom?: number | undefined;
565
- } | undefined;
566
- } | {
567
- object: "node";
568
- parentId: string | null;
569
- visible: boolean;
570
- metadata: import("zod").JSONType;
571
- id: `structural-grid_${string}`;
572
- type: "structural-grid";
573
- start: [number, number];
574
- end: [number, number];
575
- label: string;
576
- showStartBubble: boolean;
577
- showEndBubble: boolean;
578
- name?: string | undefined;
579
- camera?: {
580
- position: [number, number, number];
581
- target: [number, number, number];
582
- mode: "perspective" | "orthographic";
583
- fov?: number | undefined;
584
- zoom?: number | undefined;
585
- } | undefined;
586
- } | {
587
- object: "node";
588
- parentId: string | null;
589
- visible: boolean;
590
- id: `zone_${string}`;
591
- type: "zone";
592
- name: string;
593
- polygon: [number, number][];
594
- autoFromWalls: boolean;
595
- boundaryWallIds: `wall_${string}`[];
596
- spaceRole: "generic" | "room";
597
- roomNumber: string;
598
- enclosureStatus: "auto" | "enclosed" | "open";
599
- floorFinish: string;
600
- wallFinish: string;
601
- ceilingFinish: string;
602
- ceilingHeight: number;
603
- occupancy: string;
604
- clearDimensionPolicy: "none" | "inside-faces" | "finish-faces";
605
- color: string;
606
- metadata: import("zod").JSONType;
607
- camera?: {
608
- position: [number, number, number];
609
- target: [number, number, number];
610
- mode: "perspective" | "orthographic";
611
- fov?: number | undefined;
612
- zoom?: number | undefined;
613
- } | undefined;
614
- } | {
615
- object: "node";
616
- parentId: string | null;
617
- visible: boolean;
618
- metadata: import("zod").JSONType;
619
- id: `slab_${string}`;
620
- type: "slab";
621
- polygon: [number, number][];
622
- holes: [number, number][][];
623
- holeMetadata: {
624
- source: "stair" | "elevator" | "manual";
625
- stairId?: string | undefined;
626
- elevatorId?: string | undefined;
627
- }[];
628
- elevation: number;
629
- thickness: number;
630
- recessed: boolean;
631
- autoFromWalls: boolean;
606
+ metadata: Record<string, unknown>;
607
+ rotation: number;
608
+ children: (`cabinet_${string}` | `cabinet-module_${string}`)[];
609
+ width: number;
610
+ depth: number;
611
+ operationState: number;
612
+ runTier: "wall" | "base" | "tall";
613
+ withWaterfall: boolean;
614
+ withFinishedEnds: boolean;
615
+ carcassHeight: number;
616
+ plinthHeight: number;
617
+ toeKickDepth: number;
618
+ boardThickness: number;
619
+ countertopThickness: number;
620
+ countertopOverhang: number;
621
+ countertopBackOverhang: number;
622
+ withFinishedBack: boolean;
623
+ frontThickness: number;
624
+ frontGap: number;
625
+ frontStyle: "slab" | "shaker" | "raised-arch";
626
+ panelReady: boolean;
627
+ handleStyle: "none" | "bar" | "cutout" | "hole" | "knob";
628
+ handlePosition: "top" | "auto" | "center";
629
+ frontOverlay: "full" | "inset";
630
+ withBottomPanel: boolean;
631
+ showPlinth: boolean;
632
+ withCountertop: boolean;
633
+ type: "cabinet";
632
634
  name?: string | undefined;
633
635
  camera?: {
634
636
  position: [number, number, number];
@@ -637,6 +639,8 @@ export declare function getNodesWithLiveStairOpeningInputs(nodes: Record<string,
637
639
  fov?: number | undefined;
638
640
  zoom?: number | undefined;
639
641
  } | undefined;
642
+ supportSlabId?: string | undefined;
643
+ slots?: Record<string, string> | undefined;
640
644
  material?: {
641
645
  id?: string | undefined;
642
646
  preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
@@ -655,126 +659,129 @@ export declare function getNodesWithLiveStairOpeningInputs(nodes: Record<string,
655
659
  } | undefined;
656
660
  } | undefined;
657
661
  materialPreset?: string | undefined;
658
- slots?: Record<string, string> | undefined;
659
- recessedRimElevation?: number | undefined;
660
- fillToTerrain?: boolean | undefined;
661
- } | {
662
- object: "node";
663
- parentId: string | null;
664
- visible: boolean;
665
- metadata: import("zod").JSONType;
666
- id: `roof_${string}`;
667
- type: "roof";
668
- position: [number, number, number];
669
- rotation: number;
670
- children: `rseg_${string}`[];
671
- name?: string | undefined;
672
- camera?: {
673
- position: [number, number, number];
674
- target: [number, number, number];
675
- mode: "perspective" | "orthographic";
676
- fov?: number | undefined;
677
- zoom?: number | undefined;
678
- } | undefined;
679
- material?: {
680
- id?: string | undefined;
681
- preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
682
- properties?: {
683
- color: string;
684
- roughness: number;
685
- metalness: number;
686
- opacity: number;
687
- transparent: boolean;
688
- side: "front" | "back" | "double";
689
- } | undefined;
690
- texture?: {
691
- url: string;
692
- repeat?: [number, number] | undefined;
693
- scale?: number | undefined;
694
- } | undefined;
695
- } | undefined;
696
- materialPreset?: string | undefined;
697
- topMaterial?: {
698
- id?: string | undefined;
699
- preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
700
- properties?: {
701
- color: string;
702
- roughness: number;
703
- metalness: number;
704
- opacity: number;
705
- transparent: boolean;
706
- side: "front" | "back" | "double";
707
- } | undefined;
708
- texture?: {
709
- url: string;
710
- repeat?: [number, number] | undefined;
711
- scale?: number | undefined;
712
- } | undefined;
713
- } | undefined;
714
- topMaterialPreset?: string | undefined;
715
- edgeMaterial?: {
716
- id?: string | undefined;
717
- preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
718
- properties?: {
719
- color: string;
720
- roughness: number;
721
- metalness: number;
722
- opacity: number;
723
- transparent: boolean;
724
- side: "front" | "back" | "double";
725
- } | undefined;
726
- texture?: {
727
- url: string;
728
- repeat?: [number, number] | undefined;
729
- scale?: number | undefined;
730
- } | undefined;
731
- } | undefined;
732
- edgeMaterialPreset?: string | undefined;
733
- wallMaterial?: {
734
- id?: string | undefined;
735
- preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
736
- properties?: {
737
- color: string;
738
- roughness: number;
739
- metalness: number;
740
- opacity: number;
741
- transparent: boolean;
742
- side: "front" | "back" | "double";
743
- } | undefined;
744
- texture?: {
745
- url: string;
746
- repeat?: [number, number] | undefined;
747
- scale?: number | undefined;
748
- } | undefined;
662
+ barLedge?: {
663
+ edge: "back" | "right" | "left";
664
+ height: number;
665
+ depth: number;
749
666
  } | undefined;
750
- wallMaterialPreset?: string | undefined;
667
+ stack?: ({
668
+ type: "shelf";
669
+ id: string;
670
+ shelfCount?: number | undefined;
671
+ height?: number | undefined;
672
+ } | {
673
+ type: "drawer";
674
+ id: string;
675
+ drawerCount?: number | undefined;
676
+ height?: number | undefined;
677
+ } | {
678
+ type: "door";
679
+ id: string;
680
+ doorType?: "glass" | "double" | "single-left" | "single-right" | undefined;
681
+ shelfCount?: number | undefined;
682
+ height?: number | undefined;
683
+ } | {
684
+ type: "sink";
685
+ id: string;
686
+ sinkLayout?: "double" | "single" | "double-offset" | undefined;
687
+ height?: number | undefined;
688
+ } | {
689
+ type: "oven";
690
+ id: string;
691
+ height?: number | undefined;
692
+ } | {
693
+ type: "microwave";
694
+ id: string;
695
+ height?: number | undefined;
696
+ } | {
697
+ type: "dishwasher";
698
+ id: string;
699
+ height?: number | undefined;
700
+ } | {
701
+ type: "cooktop-gas";
702
+ id: string;
703
+ cooktopLayout?: "gas-2burner" | "gas-4burner" | "gas-5burner-wok" | "gas-6burner" | undefined;
704
+ cooktopBurnersOn?: boolean | undefined;
705
+ cooktopActiveBurners?: number[] | undefined;
706
+ cooktopKnobProgress?: number[] | undefined;
707
+ cooktopShowGrate?: boolean | undefined;
708
+ height?: number | undefined;
709
+ } | {
710
+ type: "cooktop-induction";
711
+ id: string;
712
+ cooktopLayout?: "induction-2zone" | "induction-4zone" | undefined;
713
+ cooktopBurnersOn?: boolean | undefined;
714
+ cooktopActiveBurners?: number[] | undefined;
715
+ cooktopKnobProgress?: number[] | undefined;
716
+ cooktopShowGrate?: boolean | undefined;
717
+ height?: number | undefined;
718
+ } | {
719
+ type: "pull-out-pantry";
720
+ id: string;
721
+ shelfCount?: number | undefined;
722
+ pantryRackStyle?: "glass" | "wire" | "tray" | undefined;
723
+ height?: number | undefined;
724
+ } | {
725
+ type: "fridge-single";
726
+ id: string;
727
+ height?: number | undefined;
728
+ } | {
729
+ type: "fridge-double";
730
+ id: string;
731
+ height?: number | undefined;
732
+ } | {
733
+ type: "fridge-top-freezer";
734
+ id: string;
735
+ height?: number | undefined;
736
+ } | {
737
+ type: "fridge-bottom-freezer";
738
+ id: string;
739
+ height?: number | undefined;
740
+ } | {
741
+ type: "hood-pyramid";
742
+ id: string;
743
+ height?: number | undefined;
744
+ } | {
745
+ type: "hood-curved-glass";
746
+ id: string;
747
+ height?: number | undefined;
748
+ })[] | undefined;
751
749
  } | {
752
750
  object: "node";
751
+ position: [number, number, number];
752
+ id: `cabinet-module_${string}`;
753
753
  parentId: string | null;
754
754
  visible: boolean;
755
- metadata: import("zod").JSONType;
756
- id: `stair_${string}`;
757
- type: "stair";
758
- position: [number, number, number];
755
+ metadata: Record<string, unknown>;
759
756
  rotation: number;
760
- stairType: "straight" | "spiral" | "curved";
761
- fromLevelId: string | null;
762
- toLevelId: string | null;
763
- slabOpeningMode: "none" | "destination";
764
- openingOffset: number;
757
+ children: (`cabinet_${string}` | `cabinet-module_${string}`)[];
765
758
  width: number;
766
- stepCount: number;
767
- thickness: number;
768
- fillToFloor: boolean;
769
- innerRadius: number;
770
- sweepAngle: number;
771
- topLandingMode: "none" | "integrated";
772
- topLandingDepth: number;
773
- showCenterColumn: boolean;
774
- showStepSupports: boolean;
775
- railingMode: "right" | "left" | "none" | "both";
776
- railingHeight: number;
777
- children: `sseg_${string}`[];
759
+ depth: number;
760
+ operationState: number;
761
+ carcassHeight: number;
762
+ plinthHeight: number;
763
+ toeKickDepth: number;
764
+ boardThickness: number;
765
+ countertopThickness: number;
766
+ countertopOverhang: number;
767
+ countertopBackOverhang: number;
768
+ withFinishedBack: boolean;
769
+ frontThickness: number;
770
+ frontGap: number;
771
+ frontStyle: "slab" | "shaker" | "raised-arch";
772
+ panelReady: boolean;
773
+ handleStyle: "none" | "bar" | "cutout" | "hole" | "knob";
774
+ handlePosition: "top" | "auto" | "center";
775
+ frontOverlay: "full" | "inset";
776
+ withBottomPanel: boolean;
777
+ showPlinth: boolean;
778
+ withCountertop: boolean;
779
+ cabinetType: "base" | "tall";
780
+ moduleKind: "standard" | "corner-filler";
781
+ topFinish: "trim" | "none" | "top-cabinet";
782
+ topFinishHeight: number;
783
+ topFinishDepth: number;
784
+ type: "cabinet-module";
778
785
  name?: string | undefined;
779
786
  camera?: {
780
787
  position: [number, number, number];
@@ -783,6 +790,8 @@ export declare function getNodesWithLiveStairOpeningInputs(nodes: Record<string,
783
790
  fov?: number | undefined;
784
791
  zoom?: number | undefined;
785
792
  } | undefined;
793
+ supportSlabId?: string | undefined;
794
+ slots?: Record<string, string> | undefined;
786
795
  material?: {
787
796
  id?: string | undefined;
788
797
  preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
@@ -801,479 +810,159 @@ export declare function getNodesWithLiveStairOpeningInputs(nodes: Record<string,
801
810
  } | undefined;
802
811
  } | undefined;
803
812
  materialPreset?: string | undefined;
804
- railingMaterial?: {
805
- id?: string | undefined;
806
- preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
807
- properties?: {
808
- color: string;
809
- roughness: number;
810
- metalness: number;
811
- opacity: number;
812
- transparent: boolean;
813
- side: "front" | "back" | "double";
814
- } | undefined;
815
- texture?: {
816
- url: string;
817
- repeat?: [number, number] | undefined;
818
- scale?: number | undefined;
819
- } | undefined;
820
- } | undefined;
821
- railingMaterialPreset?: string | undefined;
822
- treadMaterial?: {
823
- id?: string | undefined;
824
- preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
825
- properties?: {
826
- color: string;
827
- roughness: number;
828
- metalness: number;
829
- opacity: number;
830
- transparent: boolean;
831
- side: "front" | "back" | "double";
832
- } | undefined;
833
- texture?: {
834
- url: string;
835
- repeat?: [number, number] | undefined;
836
- scale?: number | undefined;
837
- } | undefined;
838
- } | undefined;
839
- treadMaterialPreset?: string | undefined;
840
- sideMaterial?: {
841
- id?: string | undefined;
842
- preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
843
- properties?: {
844
- color: string;
845
- roughness: number;
846
- metalness: number;
847
- opacity: number;
848
- transparent: boolean;
849
- side: "front" | "back" | "double";
850
- } | undefined;
851
- texture?: {
852
- url: string;
853
- repeat?: [number, number] | undefined;
854
- scale?: number | undefined;
855
- } | undefined;
856
- } | undefined;
857
- sideMaterialPreset?: string | undefined;
858
- slots?: Record<string, string> | undefined;
859
- supportSlabId?: string | undefined;
860
- deckSlabId?: string | undefined;
861
- totalRise?: number | undefined;
862
- } | {
863
- object: "node";
864
- parentId: string | null;
865
- visible: boolean;
866
- metadata: import("zod").JSONType;
867
- id: `scan_${string}`;
868
- type: "scan";
869
- url: string;
870
- position: [number, number, number];
871
- rotation: [number, number, number];
872
- scale: number;
873
- opacity: number;
874
- name?: string | undefined;
875
- camera?: {
876
- position: [number, number, number];
877
- target: [number, number, number];
878
- mode: "perspective" | "orthographic";
879
- fov?: number | undefined;
880
- zoom?: number | undefined;
881
- } | undefined;
882
- } | {
883
- object: "node";
884
- parentId: string | null;
885
- visible: boolean;
886
- metadata: import("zod").JSONType;
887
- id: `guide_${string}`;
888
- type: "guide";
889
- url: string;
890
- position: [number, number, number];
891
- rotation: [number, number, number];
892
- scale: number;
893
- opacity: number;
894
- scaleReference: {
895
- start: [number, number];
896
- end: [number, number];
897
- realLengthMeters: number;
898
- measuredLengthUnits: number;
899
- metersPerUnit: number;
900
- label: string;
901
- } | null;
902
- name?: string | undefined;
903
- camera?: {
904
- position: [number, number, number];
905
- target: [number, number, number];
906
- mode: "perspective" | "orthographic";
907
- fov?: number | undefined;
908
- zoom?: number | undefined;
909
- } | undefined;
910
- } | {
911
- object: "node";
912
- parentId: string | null;
913
- visible: boolean;
914
- metadata: import("zod").JSONType;
915
- id: `measurement_${string}`;
916
- type: "measurement";
917
- measurement: {
918
- kind: "distance";
919
- points: [[number, number, number] | {
920
- kind: "feature";
921
- reference: {
922
- nodeId: string;
923
- featureId: string;
924
- parameters?: Record<string, string | number | boolean> | undefined;
925
- };
926
- fallback: [number, number, number];
927
- }, [number, number, number] | {
928
- kind: "feature";
929
- reference: {
930
- nodeId: string;
931
- featureId: string;
932
- parameters?: Record<string, string | number | boolean> | undefined;
933
- };
934
- fallback: [number, number, number];
935
- }];
813
+ stack?: ({
814
+ type: "shelf";
815
+ id: string;
816
+ shelfCount?: number | undefined;
817
+ height?: number | undefined;
936
818
  } | {
937
- kind: "angle";
938
- points: [[number, number, number] | {
939
- kind: "feature";
940
- reference: {
941
- nodeId: string;
942
- featureId: string;
943
- parameters?: Record<string, string | number | boolean> | undefined;
944
- };
945
- fallback: [number, number, number];
946
- }, [number, number, number] | {
947
- kind: "feature";
948
- reference: {
949
- nodeId: string;
950
- featureId: string;
951
- parameters?: Record<string, string | number | boolean> | undefined;
952
- };
953
- fallback: [number, number, number];
954
- }, [number, number, number] | {
955
- kind: "feature";
956
- reference: {
957
- nodeId: string;
958
- featureId: string;
959
- parameters?: Record<string, string | number | boolean> | undefined;
960
- };
961
- fallback: [number, number, number];
962
- }];
819
+ type: "drawer";
820
+ id: string;
821
+ drawerCount?: number | undefined;
822
+ height?: number | undefined;
963
823
  } | {
964
- kind: "area";
965
- base: ([number, number, number] | {
966
- kind: "feature";
967
- reference: {
968
- nodeId: string;
969
- featureId: string;
970
- parameters?: Record<string, string | number | boolean> | undefined;
971
- };
972
- fallback: [number, number, number];
973
- })[];
824
+ type: "door";
825
+ id: string;
826
+ doorType?: "glass" | "double" | "single-left" | "single-right" | undefined;
827
+ shelfCount?: number | undefined;
828
+ height?: number | undefined;
974
829
  } | {
975
- kind: "perimeter";
976
- base: ([number, number, number] | {
977
- kind: "feature";
978
- reference: {
979
- nodeId: string;
980
- featureId: string;
981
- parameters?: Record<string, string | number | boolean> | undefined;
982
- };
983
- fallback: [number, number, number];
984
- })[];
830
+ type: "sink";
831
+ id: string;
832
+ sinkLayout?: "double" | "single" | "double-offset" | undefined;
833
+ height?: number | undefined;
985
834
  } | {
986
- kind: "volume";
987
- base: ([number, number, number] | {
988
- kind: "feature";
989
- reference: {
990
- nodeId: string;
991
- featureId: string;
992
- parameters?: Record<string, string | number | boolean> | undefined;
993
- };
994
- fallback: [number, number, number];
995
- })[];
996
- extrusion: [number, number, number];
997
- };
998
- name?: string | undefined;
999
- camera?: {
1000
- position: [number, number, number];
1001
- target: [number, number, number];
1002
- mode: "perspective" | "orthographic";
1003
- fov?: number | undefined;
1004
- zoom?: number | undefined;
1005
- } | undefined;
835
+ type: "oven";
836
+ id: string;
837
+ height?: number | undefined;
838
+ } | {
839
+ type: "microwave";
840
+ id: string;
841
+ height?: number | undefined;
842
+ } | {
843
+ type: "dishwasher";
844
+ id: string;
845
+ height?: number | undefined;
846
+ } | {
847
+ type: "cooktop-gas";
848
+ id: string;
849
+ cooktopLayout?: "gas-2burner" | "gas-4burner" | "gas-5burner-wok" | "gas-6burner" | undefined;
850
+ cooktopBurnersOn?: boolean | undefined;
851
+ cooktopActiveBurners?: number[] | undefined;
852
+ cooktopKnobProgress?: number[] | undefined;
853
+ cooktopShowGrate?: boolean | undefined;
854
+ height?: number | undefined;
855
+ } | {
856
+ type: "cooktop-induction";
857
+ id: string;
858
+ cooktopLayout?: "induction-2zone" | "induction-4zone" | undefined;
859
+ cooktopBurnersOn?: boolean | undefined;
860
+ cooktopActiveBurners?: number[] | undefined;
861
+ cooktopKnobProgress?: number[] | undefined;
862
+ cooktopShowGrate?: boolean | undefined;
863
+ height?: number | undefined;
864
+ } | {
865
+ type: "pull-out-pantry";
866
+ id: string;
867
+ shelfCount?: number | undefined;
868
+ pantryRackStyle?: "glass" | "wire" | "tray" | undefined;
869
+ height?: number | undefined;
870
+ } | {
871
+ type: "fridge-single";
872
+ id: string;
873
+ height?: number | undefined;
874
+ } | {
875
+ type: "fridge-double";
876
+ id: string;
877
+ height?: number | undefined;
878
+ } | {
879
+ type: "fridge-top-freezer";
880
+ id: string;
881
+ height?: number | undefined;
882
+ } | {
883
+ type: "fridge-bottom-freezer";
884
+ id: string;
885
+ height?: number | undefined;
886
+ } | {
887
+ type: "hood-pyramid";
888
+ id: string;
889
+ height?: number | undefined;
890
+ } | {
891
+ type: "hood-curved-glass";
892
+ id: string;
893
+ height?: number | undefined;
894
+ })[] | undefined;
895
+ openSide?: "right" | "left" | undefined;
896
+ cornerShelf?: boolean | undefined;
1006
897
  } | {
1007
898
  object: "node";
1008
- parentId: string | null;
1009
- visible: boolean;
1010
- metadata: import("zod").JSONType;
1011
- id: `spawn_${string}`;
1012
- type: "spawn";
1013
899
  position: [number, number, number];
1014
- rotation: number;
1015
- name?: string | undefined;
1016
- camera?: {
1017
- position: [number, number, number];
1018
- target: [number, number, number];
1019
- mode: "perspective" | "orthographic";
1020
- fov?: number | undefined;
1021
- zoom?: number | undefined;
1022
- } | undefined;
1023
- supportSlabId?: string | undefined;
1024
- } | {
1025
- object: "node";
900
+ id: `item_${string}`;
1026
901
  parentId: string | null;
1027
902
  visible: boolean;
1028
- metadata: import("zod").JSONType;
1029
- id: `shelf_${string}`;
1030
- type: "shelf";
1031
- children: `item_${string}`[];
1032
- position: [number, number, number];
903
+ metadata: Record<string, unknown>;
1033
904
  rotation: [number, number, number];
1034
- width: number;
1035
- depth: number;
1036
- thickness: number;
1037
- height: number;
1038
- style: "wall-shelf" | "bookshelf" | "open-rack" | "cubby";
1039
- rows: number;
1040
- columns: number;
1041
- withBack: boolean;
1042
- withSides: boolean;
1043
- withBottom: boolean;
1044
- bracketStyle: "minimal" | "industrial" | "hidden";
1045
- name?: string | undefined;
1046
- camera?: {
1047
- position: [number, number, number];
1048
- target: [number, number, number];
1049
- mode: "perspective" | "orthographic";
1050
- fov?: number | undefined;
1051
- zoom?: number | undefined;
1052
- } | undefined;
1053
- supportSlabId?: string | undefined;
1054
- material?: {
1055
- id?: string | undefined;
1056
- preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
1057
- properties?: {
1058
- color: string;
1059
- roughness: number;
1060
- metalness: number;
1061
- opacity: number;
1062
- transparent: boolean;
1063
- side: "front" | "back" | "double";
905
+ scale: [number, number, number];
906
+ children: `item_${string}`[];
907
+ asset: {
908
+ id: string;
909
+ category: string;
910
+ name: string;
911
+ thumbnail: string;
912
+ source: "library" | "community" | "mine";
913
+ src: string;
914
+ dimensions: [number, number, number];
915
+ offset: [number, number, number];
916
+ rotation: [number, number, number];
917
+ scale: [number, number, number];
918
+ floorPlanUrl?: string | undefined;
919
+ isDraft?: boolean | undefined;
920
+ attachTo?: "wall" | "wall-side" | "ceiling" | undefined;
921
+ recessed?: boolean | undefined;
922
+ tags?: string[] | undefined;
923
+ functionTags?: string[] | undefined;
924
+ surface?: {
925
+ height: number;
1064
926
  } | undefined;
1065
- texture?: {
1066
- url: string;
1067
- repeat?: [number, number] | undefined;
1068
- scale?: number | undefined;
927
+ interactive?: {
928
+ controls: ({
929
+ kind: "toggle";
930
+ label?: string | undefined;
931
+ default?: boolean | undefined;
932
+ } | {
933
+ kind: "slider";
934
+ label: string;
935
+ min: number;
936
+ max: number;
937
+ step: number;
938
+ displayMode: "slider" | "stepper" | "dial";
939
+ unit?: string | undefined;
940
+ default?: number | undefined;
941
+ } | {
942
+ kind: "temperature";
943
+ label: string;
944
+ min: number;
945
+ max: number;
946
+ unit: "C" | "F";
947
+ default?: number | undefined;
948
+ })[];
949
+ effects: ({
950
+ kind: "animation";
951
+ clips: {
952
+ on?: string | undefined;
953
+ off?: string | undefined;
954
+ loop?: string | undefined;
955
+ };
956
+ } | {
957
+ kind: "light";
958
+ color: string;
959
+ intensityRange: [number, number];
960
+ offset: [number, number, number];
961
+ distance?: number | undefined;
962
+ })[];
1069
963
  } | undefined;
1070
- } | undefined;
1071
- materialPreset?: string | undefined;
1072
- slots?: Record<string, string> | undefined;
1073
- } | {
1074
- object: "node";
1075
- parentId: string | null;
1076
- visible: boolean;
1077
- metadata: import("zod").JSONType;
1078
- id: `duct-segment_${string}`;
1079
- type: "duct-segment";
1080
- path: [number, number, number][];
1081
- shape: "round" | "rect" | "oval";
1082
- diameter: number;
1083
- width: number;
1084
- height: number;
1085
- roll: number;
1086
- ductMaterial: "spiral" | "sheet-metal" | "flex" | "duct-board";
1087
- seamDetail: boolean;
1088
- insulated: boolean;
1089
- insulationR: number;
1090
- system: "supply" | "return";
1091
- name?: string | undefined;
1092
- camera?: {
1093
- position: [number, number, number];
1094
- target: [number, number, number];
1095
- mode: "perspective" | "orthographic";
1096
- fov?: number | undefined;
1097
- zoom?: number | undefined;
1098
- } | undefined;
1099
- slots?: Record<string, string> | undefined;
1100
- } | {
1101
- object: "node";
1102
- parentId: string | null;
1103
- visible: boolean;
1104
- metadata: import("zod").JSONType;
1105
- id: `duct-fitting_${string}`;
1106
- type: "duct-fitting";
1107
- position: [number, number, number];
1108
- rotation: [number, number, number];
1109
- fittingType: "elbow" | "tee" | "cross" | "reducer" | "transition";
1110
- shape: "round" | "rect" | "oval";
1111
- width: number;
1112
- height: number;
1113
- shape2: "round" | "rect" | "oval";
1114
- width2: number;
1115
- height2: number;
1116
- angle: number;
1117
- branchAngle: number;
1118
- diameter: number;
1119
- diameter2: number;
1120
- ductMaterial: "sheet-metal" | "flex" | "duct-board";
1121
- system: "supply" | "return";
1122
- name?: string | undefined;
1123
- camera?: {
1124
- position: [number, number, number];
1125
- target: [number, number, number];
1126
- mode: "perspective" | "orthographic";
1127
- fov?: number | undefined;
1128
- zoom?: number | undefined;
1129
- } | undefined;
1130
- slots?: Record<string, string> | undefined;
1131
- } | {
1132
- object: "node";
1133
- parentId: string | null;
1134
- visible: boolean;
1135
- metadata: import("zod").JSONType;
1136
- id: `duct-terminal_${string}`;
1137
- type: "duct-terminal";
1138
- position: [number, number, number];
1139
- rotation: number;
1140
- terminalType: "supply-register" | "diffuser" | "return-grille";
1141
- mount: "wall" | "ceiling" | "floor";
1142
- width: number;
1143
- depth: number;
1144
- collarShape: "round" | "rect" | "oval";
1145
- collarDiameter: number;
1146
- collarWidth: number;
1147
- collarHeight: number;
1148
- name?: string | undefined;
1149
- camera?: {
1150
- position: [number, number, number];
1151
- target: [number, number, number];
1152
- mode: "perspective" | "orthographic";
1153
- fov?: number | undefined;
1154
- zoom?: number | undefined;
1155
- } | undefined;
1156
- supportSlabId?: string | undefined;
1157
- } | {
1158
- object: "node";
1159
- parentId: string | null;
1160
- visible: boolean;
1161
- metadata: import("zod").JSONType;
1162
- id: `hvac-equipment_${string}`;
1163
- type: "hvac-equipment";
1164
- position: [number, number, number];
1165
- rotation: number;
1166
- equipmentType: "furnace" | "air-handler" | "condenser";
1167
- width: number;
1168
- depth: number;
1169
- height: number;
1170
- supplyShape: "round" | "rect" | "oval";
1171
- returnShape: "round" | "rect" | "oval";
1172
- supplyDiameter: number;
1173
- returnDiameter: number;
1174
- supplyWidth: number;
1175
- supplyHeight: number;
1176
- returnWidth: number;
1177
- returnHeight: number;
1178
- name?: string | undefined;
1179
- camera?: {
1180
- position: [number, number, number];
1181
- target: [number, number, number];
1182
- mode: "perspective" | "orthographic";
1183
- fov?: number | undefined;
1184
- zoom?: number | undefined;
1185
- } | undefined;
1186
- supportSlabId?: string | undefined;
1187
- } | {
1188
- object: "node";
1189
- parentId: string | null;
1190
- visible: boolean;
1191
- metadata: import("zod").JSONType;
1192
- id: `lineset_${string}`;
1193
- type: "lineset";
1194
- path: [number, number, number][];
1195
- suctionDiameter: number;
1196
- liquidDiameter: number;
1197
- insulated: boolean;
1198
- name?: string | undefined;
1199
- camera?: {
1200
- position: [number, number, number];
1201
- target: [number, number, number];
1202
- mode: "perspective" | "orthographic";
1203
- fov?: number | undefined;
1204
- zoom?: number | undefined;
1205
- } | undefined;
1206
- } | {
1207
- object: "node";
1208
- parentId: string | null;
1209
- visible: boolean;
1210
- metadata: import("zod").JSONType;
1211
- id: `liquid-line_${string}`;
1212
- type: "liquid-line";
1213
- path: [number, number, number][];
1214
- diameter: number;
1215
- name?: string | undefined;
1216
- camera?: {
1217
- position: [number, number, number];
1218
- target: [number, number, number];
1219
- mode: "perspective" | "orthographic";
1220
- fov?: number | undefined;
1221
- zoom?: number | undefined;
1222
- } | undefined;
1223
- } | {
1224
- object: "node";
1225
- parentId: string | null;
1226
- visible: boolean;
1227
- metadata: import("zod").JSONType;
1228
- id: `pipe-segment_${string}`;
1229
- type: "pipe-segment";
1230
- path: [number, number, number][];
1231
- diameter: number;
1232
- pipeMaterial: "pvc" | "abs" | "cast-iron";
1233
- system: "waste" | "vent";
1234
- name?: string | undefined;
1235
- camera?: {
1236
- position: [number, number, number];
1237
- target: [number, number, number];
1238
- mode: "perspective" | "orthographic";
1239
- fov?: number | undefined;
1240
- zoom?: number | undefined;
1241
- } | undefined;
1242
- } | {
1243
- object: "node";
1244
- parentId: string | null;
1245
- visible: boolean;
1246
- metadata: import("zod").JSONType;
1247
- id: `pipe-fitting_${string}`;
1248
- type: "pipe-fitting";
1249
- position: [number, number, number];
1250
- rotation: [number, number, number];
1251
- fittingType: "elbow" | "cross" | "wye" | "sanitary-tee";
1252
- angle: number;
1253
- diameter: number;
1254
- diameter2: number;
1255
- pipeMaterial: "pvc" | "abs" | "cast-iron";
1256
- system: "waste" | "vent";
1257
- name?: string | undefined;
1258
- camera?: {
1259
- position: [number, number, number];
1260
- target: [number, number, number];
1261
- mode: "perspective" | "orthographic";
1262
- fov?: number | undefined;
1263
- zoom?: number | undefined;
1264
- } | undefined;
1265
- } | {
1266
- object: "node";
1267
- parentId: string | null;
1268
- visible: boolean;
1269
- metadata: import("zod").JSONType;
1270
- id: `pipe-trap_${string}`;
1271
- type: "pipe-trap";
1272
- position: [number, number, number];
1273
- rotation: number;
1274
- diameter: number;
1275
- pipeMaterial: "pvc" | "abs" | "cast-iron";
1276
- armLengthM: number;
964
+ };
965
+ type: "item";
1277
966
  name?: string | undefined;
1278
967
  camera?: {
1279
968
  position: [number, number, number];
@@ -1282,19 +971,36 @@ export declare function getNodesWithLiveStairOpeningInputs(nodes: Record<string,
1282
971
  fov?: number | undefined;
1283
972
  zoom?: number | undefined;
1284
973
  } | undefined;
974
+ side?: "front" | "back" | undefined;
975
+ wallId?: string | undefined;
976
+ wallT?: number | undefined;
977
+ roofSegmentId?: string | undefined;
978
+ roofFace?: "front" | "back" | "right" | "left" | undefined;
979
+ blockFaceId?: string | undefined;
980
+ supportSlabId?: string | undefined;
981
+ collectionIds?: `collection_${string}`[] | undefined;
982
+ slots?: Record<string, string> | undefined;
1285
983
  } | {
1286
984
  object: "node";
985
+ id: `zone_${string}`;
986
+ name: string;
1287
987
  parentId: string | null;
1288
988
  visible: boolean;
1289
- metadata: import("zod").JSONType;
1290
- id: `site_${string}`;
1291
- type: "site";
1292
- polygon: {
1293
- type: "polygon";
1294
- points: [number, number][];
1295
- };
1296
- children: string[];
1297
- name?: string | undefined;
989
+ metadata: Record<string, unknown>;
990
+ color: string;
991
+ polygon: [number, number][];
992
+ autoFromWalls: boolean;
993
+ boundaryWallIds: `wall_${string}`[];
994
+ spaceRole: "generic" | "room";
995
+ roomNumber: string;
996
+ enclosureStatus: "auto" | "open" | "enclosed";
997
+ floorFinish: string;
998
+ wallFinish: string;
999
+ ceilingFinish: string;
1000
+ ceilingHeight: number;
1001
+ occupancy: string;
1002
+ clearDimensionPolicy: "none" | "inside-faces" | "finish-faces";
1003
+ type: "zone";
1298
1004
  camera?: {
1299
1005
  position: [number, number, number];
1300
1006
  target: [number, number, number];
@@ -1302,25 +1008,24 @@ export declare function getNodesWithLiveStairOpeningInputs(nodes: Record<string,
1302
1008
  fov?: number | undefined;
1303
1009
  zoom?: number | undefined;
1304
1010
  } | undefined;
1305
- terrain?: {
1306
- type: "heightfield";
1307
- origin: [number, number];
1308
- spacing: number;
1309
- cols: number;
1310
- rows: number;
1311
- step: number;
1312
- heights: string;
1313
- } | undefined;
1314
1011
  } | {
1315
1012
  object: "node";
1013
+ id: `slab_${string}`;
1316
1014
  parentId: string | null;
1317
1015
  visible: boolean;
1318
- metadata: import("zod").JSONType;
1319
- id: `building_${string}`;
1320
- type: "building";
1321
- children: (`elevator_${string}` | `level_${string}`)[];
1322
- position: [number, number, number];
1323
- rotation: [number, number, number];
1016
+ metadata: Record<string, unknown>;
1017
+ recessed: boolean;
1018
+ polygon: [number, number][];
1019
+ holes: [number, number][][];
1020
+ holeMetadata: {
1021
+ source: "stair" | "elevator" | "manual";
1022
+ stairId?: string | undefined;
1023
+ elevatorId?: string | undefined;
1024
+ }[];
1025
+ autoFromWalls: boolean;
1026
+ elevation: number;
1027
+ thickness: number;
1028
+ type: "slab";
1324
1029
  name?: string | undefined;
1325
1030
  camera?: {
1326
1031
  position: [number, number, number];
@@ -1329,16 +1034,43 @@ export declare function getNodesWithLiveStairOpeningInputs(nodes: Record<string,
1329
1034
  fov?: number | undefined;
1330
1035
  zoom?: number | undefined;
1331
1036
  } | undefined;
1037
+ slots?: Record<string, string> | undefined;
1038
+ material?: {
1039
+ id?: string | undefined;
1040
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
1041
+ properties?: {
1042
+ color: string;
1043
+ roughness: number;
1044
+ metalness: number;
1045
+ opacity: number;
1046
+ transparent: boolean;
1047
+ side: "front" | "back" | "double";
1048
+ } | undefined;
1049
+ texture?: {
1050
+ url: string;
1051
+ repeat?: [number, number] | undefined;
1052
+ scale?: number | undefined;
1053
+ } | undefined;
1054
+ } | undefined;
1055
+ materialPreset?: string | undefined;
1056
+ recessedRimElevation?: number | undefined;
1057
+ fillToTerrain?: boolean | undefined;
1332
1058
  } | {
1333
1059
  object: "node";
1060
+ id: `ceiling_${string}`;
1334
1061
  parentId: string | null;
1335
1062
  visible: boolean;
1336
- metadata: import("zod").JSONType;
1337
- id: `level_${string}`;
1338
- type: "level";
1339
- children: (`item_${string}` | `ceiling_${string}` | `column_${string}` | `wall_${string}` | `fence_${string}` | `construction-dimension_${string}` | `structural-grid_${string}` | `zone_${string}` | `slab_${string}` | `roof_${string}` | `stair_${string}` | `scan_${string}` | `guide_${string}` | `measurement_${string}` | `spawn_${string}` | `shelf_${string}` | `duct-segment_${string}` | `duct-fitting_${string}` | `duct-terminal_${string}` | `hvac-equipment_${string}` | `lineset_${string}` | `liquid-line_${string}` | `pipe-segment_${string}` | `pipe-fitting_${string}` | `pipe-trap_${string}`)[];
1340
- level: number;
1341
- baseElevation: number;
1063
+ metadata: Record<string, unknown>;
1064
+ children: `item_${string}`[];
1065
+ polygon: [number, number][];
1066
+ holes: [number, number][][];
1067
+ holeMetadata: {
1068
+ source: "stair" | "elevator" | "manual";
1069
+ stairId?: string | undefined;
1070
+ elevatorId?: string | undefined;
1071
+ }[];
1072
+ autoFromWalls: boolean;
1073
+ type: "ceiling";
1342
1074
  name?: string | undefined;
1343
1075
  camera?: {
1344
1076
  position: [number, number, number];
@@ -1348,38 +1080,45 @@ export declare function getNodesWithLiveStairOpeningInputs(nodes: Record<string,
1348
1080
  zoom?: number | undefined;
1349
1081
  } | undefined;
1350
1082
  height?: number | undefined;
1083
+ slots?: Record<string, string> | undefined;
1084
+ material?: {
1085
+ id?: string | undefined;
1086
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
1087
+ properties?: {
1088
+ color: string;
1089
+ roughness: number;
1090
+ metalness: number;
1091
+ opacity: number;
1092
+ transparent: boolean;
1093
+ side: "front" | "back" | "double";
1094
+ } | undefined;
1095
+ texture?: {
1096
+ url: string;
1097
+ repeat?: [number, number] | undefined;
1098
+ scale?: number | undefined;
1099
+ } | undefined;
1100
+ } | undefined;
1101
+ materialPreset?: string | undefined;
1351
1102
  } | {
1352
1103
  object: "node";
1104
+ position: [number, number, number];
1105
+ id: `roof_${string}`;
1353
1106
  parentId: string | null;
1354
1107
  visible: boolean;
1355
- metadata: import("zod").JSONType;
1356
- position: [number, number, number];
1108
+ metadata: Record<string, unknown>;
1357
1109
  rotation: number;
1358
- width: number;
1359
- depth: number;
1360
- carcassHeight: number;
1361
- operationState: number;
1362
- plinthHeight: number;
1363
- toeKickDepth: number;
1364
- boardThickness: number;
1365
- countertopThickness: number;
1366
- countertopOverhang: number;
1367
- countertopBackOverhang: number;
1368
- withFinishedBack: boolean;
1369
- frontThickness: number;
1370
- frontGap: number;
1371
- frontStyle: "slab" | "shaker" | "raised-arch";
1372
- handleStyle: "none" | "bar" | "cutout" | "hole" | "knob";
1373
- handlePosition: "top" | "auto" | "center";
1374
- frontOverlay: "full" | "inset";
1375
- withBottomPanel: boolean;
1376
- showPlinth: boolean;
1377
- withCountertop: boolean;
1378
- id: `cabinet_${string}`;
1379
- type: "cabinet";
1380
- runTier: "wall" | "base" | "tall";
1381
- children: `cabinet-module_${string}`[];
1382
- withWaterfall: boolean;
1110
+ children: `rseg_${string}`[];
1111
+ support: {
1112
+ kind: "level";
1113
+ } | {
1114
+ kind: "walls";
1115
+ } | {
1116
+ kind: "roof";
1117
+ roofSegmentId: `rseg_${string}`;
1118
+ localPosition: [number, number];
1119
+ curbHeight: number;
1120
+ };
1121
+ type: "roof";
1383
1122
  name?: string | undefined;
1384
1123
  camera?: {
1385
1124
  position: [number, number, number];
@@ -1388,7 +1127,6 @@ export declare function getNodesWithLiveStairOpeningInputs(nodes: Record<string,
1388
1127
  fov?: number | undefined;
1389
1128
  zoom?: number | undefined;
1390
1129
  } | undefined;
1391
- supportSlabId?: string | undefined;
1392
1130
  material?: {
1393
1131
  id?: string | undefined;
1394
1132
  preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
@@ -1407,126 +1145,109 @@ export declare function getNodesWithLiveStairOpeningInputs(nodes: Record<string,
1407
1145
  } | undefined;
1408
1146
  } | undefined;
1409
1147
  materialPreset?: string | undefined;
1410
- slots?: Record<string, string> | undefined;
1411
- stack?: ({
1412
- type: "shelf";
1413
- id: string;
1414
- shelfCount?: number | undefined;
1415
- height?: number | undefined;
1416
- } | {
1417
- type: "drawer";
1418
- id: string;
1419
- drawerCount?: number | undefined;
1420
- height?: number | undefined;
1421
- } | {
1422
- type: "door";
1423
- id: string;
1424
- doorType?: "glass" | "double" | "single-left" | "single-right" | undefined;
1425
- shelfCount?: number | undefined;
1426
- height?: number | undefined;
1427
- } | {
1428
- type: "sink";
1429
- id: string;
1430
- sinkLayout?: "double" | "single" | "double-offset" | undefined;
1431
- height?: number | undefined;
1432
- } | {
1433
- type: "oven";
1434
- id: string;
1435
- height?: number | undefined;
1436
- } | {
1437
- type: "microwave";
1438
- id: string;
1439
- height?: number | undefined;
1440
- } | {
1441
- type: "dishwasher";
1442
- id: string;
1443
- height?: number | undefined;
1444
- } | {
1445
- type: "cooktop-gas";
1446
- id: string;
1447
- cooktopLayout?: "gas-2burner" | "gas-4burner" | "gas-5burner-wok" | "gas-6burner" | undefined;
1448
- cooktopBurnersOn?: boolean | undefined;
1449
- cooktopActiveBurners?: number[] | undefined;
1450
- cooktopKnobProgress?: number[] | undefined;
1451
- cooktopShowGrate?: boolean | undefined;
1452
- height?: number | undefined;
1453
- } | {
1454
- type: "cooktop-induction";
1455
- id: string;
1456
- cooktopLayout?: "induction-2zone" | "induction-4zone" | undefined;
1457
- cooktopBurnersOn?: boolean | undefined;
1458
- cooktopActiveBurners?: number[] | undefined;
1459
- cooktopKnobProgress?: number[] | undefined;
1460
- cooktopShowGrate?: boolean | undefined;
1461
- height?: number | undefined;
1462
- } | {
1463
- type: "pull-out-pantry";
1464
- id: string;
1465
- shelfCount?: number | undefined;
1466
- pantryRackStyle?: "glass" | "wire" | "tray" | undefined;
1467
- height?: number | undefined;
1468
- } | {
1469
- type: "fridge-single";
1470
- id: string;
1471
- height?: number | undefined;
1472
- } | {
1473
- type: "fridge-double";
1474
- id: string;
1475
- height?: number | undefined;
1476
- } | {
1477
- type: "fridge-top-freezer";
1478
- id: string;
1479
- height?: number | undefined;
1480
- } | {
1481
- type: "fridge-bottom-freezer";
1482
- id: string;
1483
- height?: number | undefined;
1484
- } | {
1485
- type: "hood-pyramid";
1486
- id: string;
1487
- height?: number | undefined;
1488
- } | {
1489
- type: "hood-curved-glass";
1490
- id: string;
1491
- height?: number | undefined;
1492
- })[] | undefined;
1493
- barLedge?: {
1494
- edge: "back" | "right" | "left";
1495
- height: number;
1496
- depth: number;
1148
+ topMaterial?: {
1149
+ id?: string | undefined;
1150
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
1151
+ properties?: {
1152
+ color: string;
1153
+ roughness: number;
1154
+ metalness: number;
1155
+ opacity: number;
1156
+ transparent: boolean;
1157
+ side: "front" | "back" | "double";
1158
+ } | undefined;
1159
+ texture?: {
1160
+ url: string;
1161
+ repeat?: [number, number] | undefined;
1162
+ scale?: number | undefined;
1163
+ } | undefined;
1164
+ } | undefined;
1165
+ topMaterialPreset?: string | undefined;
1166
+ edgeMaterial?: {
1167
+ id?: string | undefined;
1168
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
1169
+ properties?: {
1170
+ color: string;
1171
+ roughness: number;
1172
+ metalness: number;
1173
+ opacity: number;
1174
+ transparent: boolean;
1175
+ side: "front" | "back" | "double";
1176
+ } | undefined;
1177
+ texture?: {
1178
+ url: string;
1179
+ repeat?: [number, number] | undefined;
1180
+ scale?: number | undefined;
1181
+ } | undefined;
1182
+ } | undefined;
1183
+ edgeMaterialPreset?: string | undefined;
1184
+ wallMaterial?: {
1185
+ id?: string | undefined;
1186
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
1187
+ properties?: {
1188
+ color: string;
1189
+ roughness: number;
1190
+ metalness: number;
1191
+ opacity: number;
1192
+ transparent: boolean;
1193
+ side: "front" | "back" | "double";
1194
+ } | undefined;
1195
+ texture?: {
1196
+ url: string;
1197
+ repeat?: [number, number] | undefined;
1198
+ scale?: number | undefined;
1199
+ } | undefined;
1497
1200
  } | undefined;
1201
+ wallMaterialPreset?: string | undefined;
1498
1202
  } | {
1499
1203
  object: "node";
1204
+ position: [number, number, number];
1205
+ id: `rseg_${string}`;
1500
1206
  parentId: string | null;
1501
1207
  visible: boolean;
1502
- metadata: import("zod").JSONType;
1503
- position: [number, number, number];
1208
+ metadata: Record<string, unknown>;
1504
1209
  rotation: number;
1210
+ children: string[];
1211
+ trim: {
1212
+ left: number;
1213
+ right: number;
1214
+ front: number;
1215
+ back: number;
1216
+ frontLeft: number;
1217
+ frontRight: number;
1218
+ backLeft: number;
1219
+ backRight: number;
1220
+ frontLeftX: number;
1221
+ frontLeftZ: number;
1222
+ frontRightX: number;
1223
+ frontRightZ: number;
1224
+ backLeftX: number;
1225
+ backLeftZ: number;
1226
+ backRightX: number;
1227
+ backRightZ: number;
1228
+ };
1505
1229
  width: number;
1506
1230
  depth: number;
1507
- carcassHeight: number;
1508
- operationState: number;
1509
- plinthHeight: number;
1510
- toeKickDepth: number;
1511
- boardThickness: number;
1512
- countertopThickness: number;
1513
- countertopOverhang: number;
1514
- countertopBackOverhang: number;
1515
- withFinishedBack: boolean;
1516
- frontThickness: number;
1517
- frontGap: number;
1518
- frontStyle: "slab" | "shaker" | "raised-arch";
1519
- handleStyle: "none" | "bar" | "cutout" | "hole" | "knob";
1520
- handlePosition: "top" | "auto" | "center";
1521
- frontOverlay: "full" | "inset";
1522
- withBottomPanel: boolean;
1523
- showPlinth: boolean;
1524
- withCountertop: boolean;
1525
- id: `cabinet-module_${string}`;
1526
- type: "cabinet-module";
1527
- children: (`cabinet_${string}` | `cabinet-module_${string}`)[];
1528
- cabinetType: "base" | "tall";
1529
- moduleKind: "standard" | "corner-filler";
1231
+ roofType: "flat" | "hip" | "gable" | "shed" | "gambrel" | "dutch" | "mansard" | "conical";
1232
+ wallHeight: number;
1233
+ pitch: number;
1234
+ wallThickness: number;
1235
+ deckThickness: number;
1236
+ overhang: number;
1237
+ shingleThickness: number;
1238
+ managedByParent: boolean;
1239
+ wallShell: "auto" | "include" | "omit";
1240
+ shedInsetEndPanels: boolean;
1241
+ gambrelLowerWidthRatio: number;
1242
+ gambrelLowerHeightRatio: number;
1243
+ mansardSteepWidthRatio: number;
1244
+ mansardSteepHeightRatio: number;
1245
+ dutchHipWidthRatio: number;
1246
+ dutchHipHeightRatio: number;
1247
+ dutchWaistLengthRatio: number;
1248
+ dutchGabletRake: number;
1249
+ dutchTopRakeThickness: number;
1250
+ type: "roof-segment";
1530
1251
  name?: string | undefined;
1531
1252
  camera?: {
1532
1253
  position: [number, number, number];
@@ -1535,7 +1256,6 @@ export declare function getNodesWithLiveStairOpeningInputs(nodes: Record<string,
1535
1256
  fov?: number | undefined;
1536
1257
  zoom?: number | undefined;
1537
1258
  } | undefined;
1538
- supportSlabId?: string | undefined;
1539
1259
  material?: {
1540
1260
  id?: string | undefined;
1541
1261
  preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
@@ -1554,137 +1274,156 @@ export declare function getNodesWithLiveStairOpeningInputs(nodes: Record<string,
1554
1274
  } | undefined;
1555
1275
  } | undefined;
1556
1276
  materialPreset?: string | undefined;
1557
- slots?: Record<string, string> | undefined;
1558
- stack?: ({
1559
- type: "shelf";
1560
- id: string;
1561
- shelfCount?: number | undefined;
1562
- height?: number | undefined;
1563
- } | {
1564
- type: "drawer";
1565
- id: string;
1566
- drawerCount?: number | undefined;
1567
- height?: number | undefined;
1568
- } | {
1569
- type: "door";
1570
- id: string;
1571
- doorType?: "glass" | "double" | "single-left" | "single-right" | undefined;
1572
- shelfCount?: number | undefined;
1573
- height?: number | undefined;
1574
- } | {
1575
- type: "sink";
1576
- id: string;
1577
- sinkLayout?: "double" | "single" | "double-offset" | undefined;
1578
- height?: number | undefined;
1579
- } | {
1580
- type: "oven";
1581
- id: string;
1582
- height?: number | undefined;
1583
- } | {
1584
- type: "microwave";
1585
- id: string;
1586
- height?: number | undefined;
1587
- } | {
1588
- type: "dishwasher";
1589
- id: string;
1590
- height?: number | undefined;
1591
- } | {
1592
- type: "cooktop-gas";
1593
- id: string;
1594
- cooktopLayout?: "gas-2burner" | "gas-4burner" | "gas-5burner-wok" | "gas-6burner" | undefined;
1595
- cooktopBurnersOn?: boolean | undefined;
1596
- cooktopActiveBurners?: number[] | undefined;
1597
- cooktopKnobProgress?: number[] | undefined;
1598
- cooktopShowGrate?: boolean | undefined;
1599
- height?: number | undefined;
1600
- } | {
1601
- type: "cooktop-induction";
1602
- id: string;
1603
- cooktopLayout?: "induction-2zone" | "induction-4zone" | undefined;
1604
- cooktopBurnersOn?: boolean | undefined;
1605
- cooktopActiveBurners?: number[] | undefined;
1606
- cooktopKnobProgress?: number[] | undefined;
1607
- cooktopShowGrate?: boolean | undefined;
1608
- height?: number | undefined;
1609
- } | {
1610
- type: "pull-out-pantry";
1611
- id: string;
1612
- shelfCount?: number | undefined;
1613
- pantryRackStyle?: "glass" | "wire" | "tray" | undefined;
1614
- height?: number | undefined;
1615
- } | {
1616
- type: "fridge-single";
1617
- id: string;
1618
- height?: number | undefined;
1619
- } | {
1620
- type: "fridge-double";
1621
- id: string;
1622
- height?: number | undefined;
1623
- } | {
1624
- type: "fridge-top-freezer";
1625
- id: string;
1626
- height?: number | undefined;
1627
- } | {
1628
- type: "fridge-bottom-freezer";
1629
- id: string;
1630
- height?: number | undefined;
1631
- } | {
1632
- type: "hood-pyramid";
1633
- id: string;
1634
- height?: number | undefined;
1635
- } | {
1636
- type: "hood-curved-glass";
1637
- id: string;
1638
- height?: number | undefined;
1639
- })[] | undefined;
1640
- openSide?: "right" | "left" | undefined;
1641
- cornerShelf?: boolean | undefined;
1277
+ topMaterial?: {
1278
+ id?: string | undefined;
1279
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
1280
+ properties?: {
1281
+ color: string;
1282
+ roughness: number;
1283
+ metalness: number;
1284
+ opacity: number;
1285
+ transparent: boolean;
1286
+ side: "front" | "back" | "double";
1287
+ } | undefined;
1288
+ texture?: {
1289
+ url: string;
1290
+ repeat?: [number, number] | undefined;
1291
+ scale?: number | undefined;
1292
+ } | undefined;
1293
+ } | undefined;
1294
+ topMaterialPreset?: string | undefined;
1295
+ edgeMaterial?: {
1296
+ id?: string | undefined;
1297
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
1298
+ properties?: {
1299
+ color: string;
1300
+ roughness: number;
1301
+ metalness: number;
1302
+ opacity: number;
1303
+ transparent: boolean;
1304
+ side: "front" | "back" | "double";
1305
+ } | undefined;
1306
+ texture?: {
1307
+ url: string;
1308
+ repeat?: [number, number] | undefined;
1309
+ scale?: number | undefined;
1310
+ } | undefined;
1311
+ } | undefined;
1312
+ edgeMaterialPreset?: string | undefined;
1313
+ wallMaterial?: {
1314
+ id?: string | undefined;
1315
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
1316
+ properties?: {
1317
+ color: string;
1318
+ roughness: number;
1319
+ metalness: number;
1320
+ opacity: number;
1321
+ transparent: boolean;
1322
+ side: "front" | "back" | "double";
1323
+ } | undefined;
1324
+ texture?: {
1325
+ url: string;
1326
+ repeat?: [number, number] | undefined;
1327
+ scale?: number | undefined;
1328
+ } | undefined;
1329
+ } | undefined;
1330
+ wallMaterialPreset?: string | undefined;
1331
+ conicalStartAngle?: number | undefined;
1332
+ conicalSweepAngle?: number | undefined;
1333
+ conicalFullCircle?: boolean | undefined;
1334
+ arc?: {
1335
+ centerX: number;
1336
+ centerZ: number;
1337
+ radius: number;
1338
+ } | undefined;
1339
+ shedSideInfillSpan?: number | undefined;
1340
+ shedSideInfillMinX?: number | undefined;
1341
+ shedSideInfillMaxX?: number | undefined;
1342
+ shedFootprintPieces?: [number, number][][] | undefined;
1343
+ shedOpenEndSides?: ("right" | "left")[] | undefined;
1344
+ shedJointFrame?: {
1345
+ position: [number, number, number];
1346
+ rotation: number;
1347
+ } | undefined;
1348
+ shedJointOwnerId?: string | undefined;
1349
+ shedJointNeighborIds?: string[] | undefined;
1350
+ shedJointScopeId?: string | undefined;
1351
+ } | {
1352
+ object: "node";
1353
+ position: [number, number, number];
1354
+ id: `shelf_${string}`;
1355
+ parentId: string | null;
1356
+ visible: boolean;
1357
+ metadata: Record<string, unknown>;
1358
+ rotation: [number, number, number];
1359
+ height: number;
1360
+ children: `item_${string}`[];
1361
+ width: number;
1362
+ depth: number;
1363
+ style: "wall-shelf" | "bookshelf" | "open-rack" | "cubby";
1364
+ rows: number;
1365
+ thickness: number;
1366
+ columns: number;
1367
+ withBack: boolean;
1368
+ withSides: boolean;
1369
+ withBottom: boolean;
1370
+ bracketStyle: "hidden" | "minimal" | "industrial";
1371
+ type: "shelf";
1372
+ name?: string | undefined;
1373
+ camera?: {
1374
+ position: [number, number, number];
1375
+ target: [number, number, number];
1376
+ mode: "perspective" | "orthographic";
1377
+ fov?: number | undefined;
1378
+ zoom?: number | undefined;
1379
+ } | undefined;
1380
+ supportSlabId?: string | undefined;
1381
+ slots?: Record<string, string> | undefined;
1382
+ material?: {
1383
+ id?: string | undefined;
1384
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
1385
+ properties?: {
1386
+ color: string;
1387
+ roughness: number;
1388
+ metalness: number;
1389
+ opacity: number;
1390
+ transparent: boolean;
1391
+ side: "front" | "back" | "double";
1392
+ } | undefined;
1393
+ texture?: {
1394
+ url: string;
1395
+ repeat?: [number, number] | undefined;
1396
+ scale?: number | undefined;
1397
+ } | undefined;
1398
+ } | undefined;
1399
+ materialPreset?: string | undefined;
1642
1400
  } | {
1643
1401
  object: "node";
1402
+ position: [number, number, number];
1403
+ id: `stair_${string}`;
1644
1404
  parentId: string | null;
1645
1405
  visible: boolean;
1646
- metadata: import("zod").JSONType;
1647
- id: `rseg_${string}`;
1648
- type: "roof-segment";
1649
- position: [number, number, number];
1406
+ metadata: Record<string, unknown>;
1650
1407
  rotation: number;
1651
- roofType: "flat" | "hip" | "gable" | "shed" | "gambrel" | "dutch" | "mansard";
1408
+ children: `sseg_${string}`[];
1652
1409
  width: number;
1653
- depth: number;
1654
- trim: {
1655
- left: number;
1656
- right: number;
1657
- front: number;
1658
- back: number;
1659
- frontLeft: number;
1660
- frontRight: number;
1661
- backLeft: number;
1662
- backRight: number;
1663
- frontLeftX: number;
1664
- frontLeftZ: number;
1665
- frontRightX: number;
1666
- frontRightZ: number;
1667
- backLeftX: number;
1668
- backLeftZ: number;
1669
- backRightX: number;
1670
- backRightZ: number;
1671
- };
1672
- wallHeight: number;
1673
- pitch: number;
1674
- wallThickness: number;
1675
- deckThickness: number;
1676
- overhang: number;
1677
- shingleThickness: number;
1678
- gambrelLowerWidthRatio: number;
1679
- gambrelLowerHeightRatio: number;
1680
- mansardSteepWidthRatio: number;
1681
- mansardSteepHeightRatio: number;
1682
- dutchHipWidthRatio: number;
1683
- dutchHipHeightRatio: number;
1684
- dutchWaistLengthRatio: number;
1685
- dutchGabletRake: number;
1686
- dutchTopRakeThickness: number;
1687
- children: string[];
1410
+ fromLevelId: string | null;
1411
+ toLevelId: string | null;
1412
+ thickness: number;
1413
+ stairType: "straight" | "spiral" | "curved";
1414
+ slabOpeningMode: "none" | "destination";
1415
+ openingOffset: number;
1416
+ stepCount: number;
1417
+ fillToFloor: boolean;
1418
+ innerRadius: number;
1419
+ sweepAngle: number;
1420
+ topLandingMode: "none" | "integrated";
1421
+ topLandingDepth: number;
1422
+ showCenterColumn: boolean;
1423
+ showStepSupports: boolean;
1424
+ railingMode: "right" | "left" | "none" | "both";
1425
+ railingHeight: number;
1426
+ type: "stair";
1688
1427
  name?: string | undefined;
1689
1428
  camera?: {
1690
1429
  position: [number, number, number];
@@ -1693,6 +1432,8 @@ export declare function getNodesWithLiveStairOpeningInputs(nodes: Record<string,
1693
1432
  fov?: number | undefined;
1694
1433
  zoom?: number | undefined;
1695
1434
  } | undefined;
1435
+ supportSlabId?: string | undefined;
1436
+ slots?: Record<string, string> | undefined;
1696
1437
  material?: {
1697
1438
  id?: string | undefined;
1698
1439
  preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
@@ -1711,7 +1452,7 @@ export declare function getNodesWithLiveStairOpeningInputs(nodes: Record<string,
1711
1452
  } | undefined;
1712
1453
  } | undefined;
1713
1454
  materialPreset?: string | undefined;
1714
- topMaterial?: {
1455
+ railingMaterial?: {
1715
1456
  id?: string | undefined;
1716
1457
  preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
1717
1458
  properties?: {
@@ -1728,8 +1469,8 @@ export declare function getNodesWithLiveStairOpeningInputs(nodes: Record<string,
1728
1469
  scale?: number | undefined;
1729
1470
  } | undefined;
1730
1471
  } | undefined;
1731
- topMaterialPreset?: string | undefined;
1732
- edgeMaterial?: {
1472
+ railingMaterialPreset?: string | undefined;
1473
+ treadMaterial?: {
1733
1474
  id?: string | undefined;
1734
1475
  preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
1735
1476
  properties?: {
@@ -1746,8 +1487,53 @@ export declare function getNodesWithLiveStairOpeningInputs(nodes: Record<string,
1746
1487
  scale?: number | undefined;
1747
1488
  } | undefined;
1748
1489
  } | undefined;
1749
- edgeMaterialPreset?: string | undefined;
1750
- wallMaterial?: {
1490
+ treadMaterialPreset?: string | undefined;
1491
+ sideMaterial?: {
1492
+ id?: string | undefined;
1493
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
1494
+ properties?: {
1495
+ color: string;
1496
+ roughness: number;
1497
+ metalness: number;
1498
+ opacity: number;
1499
+ transparent: boolean;
1500
+ side: "front" | "back" | "double";
1501
+ } | undefined;
1502
+ texture?: {
1503
+ url: string;
1504
+ repeat?: [number, number] | undefined;
1505
+ scale?: number | undefined;
1506
+ } | undefined;
1507
+ } | undefined;
1508
+ sideMaterialPreset?: string | undefined;
1509
+ deckSlabId?: string | undefined;
1510
+ totalRise?: number | undefined;
1511
+ } | {
1512
+ object: "node";
1513
+ length: number;
1514
+ position: [number, number, number];
1515
+ id: `sseg_${string}`;
1516
+ parentId: string | null;
1517
+ visible: boolean;
1518
+ metadata: Record<string, unknown>;
1519
+ rotation: number;
1520
+ height: number;
1521
+ width: number;
1522
+ thickness: number;
1523
+ stepCount: number;
1524
+ fillToFloor: boolean;
1525
+ segmentType: "stair" | "landing";
1526
+ attachmentSide: "front" | "right" | "left";
1527
+ type: "stair-segment";
1528
+ name?: string | undefined;
1529
+ camera?: {
1530
+ position: [number, number, number];
1531
+ target: [number, number, number];
1532
+ mode: "perspective" | "orthographic";
1533
+ fov?: number | undefined;
1534
+ zoom?: number | undefined;
1535
+ } | undefined;
1536
+ material?: {
1751
1537
  id?: string | undefined;
1752
1538
  preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
1753
1539
  properties?: {
@@ -1764,24 +1550,167 @@ export declare function getNodesWithLiveStairOpeningInputs(nodes: Record<string,
1764
1550
  scale?: number | undefined;
1765
1551
  } | undefined;
1766
1552
  } | undefined;
1767
- wallMaterialPreset?: string | undefined;
1553
+ materialPreset?: string | undefined;
1554
+ } | {
1555
+ object: "node";
1556
+ position: [number, number, number];
1557
+ id: `scan_${string}`;
1558
+ parentId: string | null;
1559
+ visible: boolean;
1560
+ metadata: Record<string, unknown>;
1561
+ rotation: [number, number, number];
1562
+ scale: number;
1563
+ url: string | null;
1564
+ opacity: number;
1565
+ captureSession: {
1566
+ sessionId: string;
1567
+ schemaVersion?: number | undefined;
1568
+ revisionId?: string | undefined;
1569
+ manifestUrl?: string | undefined;
1570
+ } | null;
1571
+ layers: Record<string, boolean>;
1572
+ type: "scan";
1573
+ name?: string | undefined;
1574
+ camera?: {
1575
+ position: [number, number, number];
1576
+ target: [number, number, number];
1577
+ mode: "perspective" | "orthographic";
1578
+ fov?: number | undefined;
1579
+ zoom?: number | undefined;
1580
+ } | undefined;
1581
+ } | {
1582
+ object: "node";
1583
+ position: [number, number, number];
1584
+ id: `guide_${string}`;
1585
+ parentId: string | null;
1586
+ visible: boolean;
1587
+ metadata: Record<string, unknown>;
1588
+ rotation: [number, number, number];
1589
+ scale: number;
1590
+ url: string;
1591
+ opacity: number;
1592
+ scaleReference: {
1593
+ start: [number, number];
1594
+ end: [number, number];
1595
+ realLengthMeters: number;
1596
+ measuredLengthUnits: number;
1597
+ metersPerUnit: number;
1598
+ label: string;
1599
+ } | null;
1600
+ type: "guide";
1601
+ name?: string | undefined;
1602
+ camera?: {
1603
+ position: [number, number, number];
1604
+ target: [number, number, number];
1605
+ mode: "perspective" | "orthographic";
1606
+ fov?: number | undefined;
1607
+ zoom?: number | undefined;
1608
+ } | undefined;
1609
+ } | {
1610
+ object: "node";
1611
+ id: `measurement_${string}`;
1612
+ parentId: string | null;
1613
+ visible: boolean;
1614
+ metadata: Record<string, unknown>;
1615
+ measurement: {
1616
+ kind: "distance";
1617
+ points: [[number, number, number] | {
1618
+ kind: "feature";
1619
+ reference: {
1620
+ nodeId: string;
1621
+ featureId: string;
1622
+ parameters?: Record<string, string | number | boolean> | undefined;
1623
+ };
1624
+ fallback: [number, number, number];
1625
+ }, [number, number, number] | {
1626
+ kind: "feature";
1627
+ reference: {
1628
+ nodeId: string;
1629
+ featureId: string;
1630
+ parameters?: Record<string, string | number | boolean> | undefined;
1631
+ };
1632
+ fallback: [number, number, number];
1633
+ }];
1634
+ } | {
1635
+ kind: "angle";
1636
+ points: [[number, number, number] | {
1637
+ kind: "feature";
1638
+ reference: {
1639
+ nodeId: string;
1640
+ featureId: string;
1641
+ parameters?: Record<string, string | number | boolean> | undefined;
1642
+ };
1643
+ fallback: [number, number, number];
1644
+ }, [number, number, number] | {
1645
+ kind: "feature";
1646
+ reference: {
1647
+ nodeId: string;
1648
+ featureId: string;
1649
+ parameters?: Record<string, string | number | boolean> | undefined;
1650
+ };
1651
+ fallback: [number, number, number];
1652
+ }, [number, number, number] | {
1653
+ kind: "feature";
1654
+ reference: {
1655
+ nodeId: string;
1656
+ featureId: string;
1657
+ parameters?: Record<string, string | number | boolean> | undefined;
1658
+ };
1659
+ fallback: [number, number, number];
1660
+ }];
1661
+ } | {
1662
+ kind: "area";
1663
+ base: ([number, number, number] | {
1664
+ kind: "feature";
1665
+ reference: {
1666
+ nodeId: string;
1667
+ featureId: string;
1668
+ parameters?: Record<string, string | number | boolean> | undefined;
1669
+ };
1670
+ fallback: [number, number, number];
1671
+ })[];
1672
+ } | {
1673
+ kind: "perimeter";
1674
+ base: ([number, number, number] | {
1675
+ kind: "feature";
1676
+ reference: {
1677
+ nodeId: string;
1678
+ featureId: string;
1679
+ parameters?: Record<string, string | number | boolean> | undefined;
1680
+ };
1681
+ fallback: [number, number, number];
1682
+ })[];
1683
+ } | {
1684
+ kind: "volume";
1685
+ base: ([number, number, number] | {
1686
+ kind: "feature";
1687
+ reference: {
1688
+ nodeId: string;
1689
+ featureId: string;
1690
+ parameters?: Record<string, string | number | boolean> | undefined;
1691
+ };
1692
+ fallback: [number, number, number];
1693
+ })[];
1694
+ extrusion: [number, number, number];
1695
+ };
1696
+ type: "measurement";
1697
+ name?: string | undefined;
1698
+ camera?: {
1699
+ position: [number, number, number];
1700
+ target: [number, number, number];
1701
+ mode: "perspective" | "orthographic";
1702
+ fov?: number | undefined;
1703
+ zoom?: number | undefined;
1704
+ } | undefined;
1768
1705
  } | {
1769
1706
  object: "node";
1707
+ position: [number, number, number];
1708
+ id: `spawn_${string}`;
1770
1709
  parentId: string | null;
1771
1710
  visible: boolean;
1772
- metadata: import("zod").JSONType;
1773
- id: `sseg_${string}`;
1774
- type: "stair-segment";
1775
- position: [number, number, number];
1711
+ metadata: Record<string, unknown>;
1776
1712
  rotation: number;
1777
- segmentType: "stair" | "landing";
1778
- width: number;
1779
- length: number;
1780
- height: number;
1781
- stepCount: number;
1782
- attachmentSide: "front" | "right" | "left";
1783
- fillToFloor: boolean;
1784
- thickness: number;
1713
+ type: "spawn";
1785
1714
  name?: string | undefined;
1786
1715
  camera?: {
1787
1716
  position: [number, number, number];
@@ -1790,58 +1719,41 @@ export declare function getNodesWithLiveStairOpeningInputs(nodes: Record<string,
1790
1719
  fov?: number | undefined;
1791
1720
  zoom?: number | undefined;
1792
1721
  } | undefined;
1793
- material?: {
1794
- id?: string | undefined;
1795
- preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
1796
- properties?: {
1797
- color: string;
1798
- roughness: number;
1799
- metalness: number;
1800
- opacity: number;
1801
- transparent: boolean;
1802
- side: "front" | "back" | "double";
1803
- } | undefined;
1804
- texture?: {
1805
- url: string;
1806
- repeat?: [number, number] | undefined;
1807
- scale?: number | undefined;
1808
- } | undefined;
1809
- } | undefined;
1810
- materialPreset?: string | undefined;
1722
+ supportSlabId?: string | undefined;
1811
1723
  } | {
1812
1724
  object: "node";
1725
+ position: [number, number, number];
1726
+ id: `window_${string}`;
1813
1727
  parentId: string | null;
1814
1728
  visible: boolean;
1815
- metadata: import("zod").JSONType;
1816
- id: `window_${string}`;
1817
- type: "window";
1818
- position: [number, number, number];
1729
+ metadata: Record<string, unknown>;
1819
1730
  rotation: [number, number, number];
1820
- width: number;
1821
1731
  height: number;
1732
+ width: number;
1822
1733
  constructionType: "framed" | "masonry";
1823
1734
  dimensionReference: "nominal" | "rough-opening" | "masonry-opening" | "finish-opening";
1824
- openingKind: "window" | "opening";
1825
- windowType: "sliding" | "fixed" | "casement" | "awning" | "hopper" | "single-hung" | "double-hung" | "bay" | "bow" | "louvered";
1826
1735
  operationState: number;
1827
- awningDirection: "up" | "down";
1828
- casementStyle: "french" | "single";
1829
- hingesSide: "right" | "left";
1736
+ openingKind: "window" | "opening";
1830
1737
  openingShape: "rectangle" | "rounded" | "arch";
1831
1738
  openingRadiusMode: "all" | "individual";
1832
- openingCornerRadii: [number, number, number, number];
1833
1739
  cornerRadius: number;
1834
1740
  archHeight: number;
1835
1741
  openingRevealRadius: number;
1836
1742
  frameThickness: number;
1837
1743
  frameDepth: number;
1744
+ hingesSide: "right" | "left";
1838
1745
  columnRatios: number[];
1746
+ windowType: "fixed" | "sliding" | "casement" | "awning" | "hopper" | "single-hung" | "double-hung" | "bay" | "bow" | "louvered";
1747
+ awningDirection: "up" | "down";
1748
+ casementStyle: "french" | "single";
1749
+ openingCornerRadii: [number, number, number, number];
1839
1750
  rowRatios: number[];
1840
1751
  columnDividerThickness: number;
1841
1752
  rowDividerThickness: number;
1842
1753
  sill: boolean;
1843
1754
  sillDepth: number;
1844
1755
  sillThickness: number;
1756
+ type: "window";
1845
1757
  name?: string | undefined;
1846
1758
  camera?: {
1847
1759
  position: [number, number, number];
@@ -1850,6 +1762,11 @@ export declare function getNodesWithLiveStairOpeningInputs(nodes: Record<string,
1850
1762
  fov?: number | undefined;
1851
1763
  zoom?: number | undefined;
1852
1764
  } | undefined;
1765
+ side?: "front" | "back" | undefined;
1766
+ wallId?: string | undefined;
1767
+ roofSegmentId?: string | undefined;
1768
+ roofFace?: "front" | "back" | "right" | "left" | undefined;
1769
+ slots?: Record<string, string> | undefined;
1853
1770
  material?: {
1854
1771
  id?: string | undefined;
1855
1772
  preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
@@ -1867,11 +1784,6 @@ export declare function getNodesWithLiveStairOpeningInputs(nodes: Record<string,
1867
1784
  scale?: number | undefined;
1868
1785
  } | undefined;
1869
1786
  } | undefined;
1870
- slots?: Record<string, string> | undefined;
1871
- side?: "front" | "back" | undefined;
1872
- wallId?: string | undefined;
1873
- roofSegmentId?: string | undefined;
1874
- roofFace?: "front" | "back" | "right" | "left" | undefined;
1875
1787
  mark?: string | undefined;
1876
1788
  roughOpeningWidth?: number | undefined;
1877
1789
  roughOpeningHeight?: number | undefined;
@@ -1879,22 +1791,23 @@ export declare function getNodesWithLiveStairOpeningInputs(nodes: Record<string,
1879
1791
  masonryOpeningHeight?: number | undefined;
1880
1792
  finishOpeningWidth?: number | undefined;
1881
1793
  finishOpeningHeight?: number | undefined;
1794
+ dormerId?: string | undefined;
1795
+ dormerFace?: "front" | "back" | "right" | "left" | undefined;
1882
1796
  } | {
1883
1797
  object: "node";
1798
+ position: [number, number, number];
1799
+ id: `door_${string}`;
1884
1800
  parentId: string | null;
1885
1801
  visible: boolean;
1886
- metadata: import("zod").JSONType;
1887
- id: `door_${string}`;
1888
- type: "door";
1889
- position: [number, number, number];
1802
+ metadata: Record<string, unknown>;
1890
1803
  rotation: [number, number, number];
1891
- width: number;
1892
1804
  height: number;
1805
+ width: number;
1806
+ leafCount: 4 | 1 | 2 | 3;
1893
1807
  constructionType: "framed" | "masonry";
1894
1808
  dimensionReference: "nominal" | "rough-opening" | "masonry-opening" | "finish-opening";
1895
1809
  doorCategory: "interior" | "garage";
1896
1810
  doorType: "double" | "hinged" | "french" | "folding" | "pocket" | "barn" | "sliding" | "garage-sectional" | "garage-rollup" | "garage-tiltup";
1897
- leafCount: 4 | 1 | 2 | 3;
1898
1811
  operationState: number;
1899
1812
  slideDirection: "right" | "left";
1900
1813
  trackStyle: "visible" | "none" | "pocket" | "overhead";
@@ -1928,6 +1841,7 @@ export declare function getNodesWithLiveStairOpeningInputs(nodes: Record<string,
1928
1841
  doorCloser: boolean;
1929
1842
  panicBar: boolean;
1930
1843
  panicBarHeight: number;
1844
+ type: "door";
1931
1845
  name?: string | undefined;
1932
1846
  camera?: {
1933
1847
  position: [number, number, number];
@@ -1936,6 +1850,11 @@ export declare function getNodesWithLiveStairOpeningInputs(nodes: Record<string,
1936
1850
  fov?: number | undefined;
1937
1851
  zoom?: number | undefined;
1938
1852
  } | undefined;
1853
+ side?: "front" | "back" | undefined;
1854
+ wallId?: string | undefined;
1855
+ roofSegmentId?: string | undefined;
1856
+ roofFace?: "front" | "back" | "right" | "left" | undefined;
1857
+ slots?: Record<string, string> | undefined;
1939
1858
  material?: {
1940
1859
  id?: string | undefined;
1941
1860
  preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
@@ -1953,11 +1872,6 @@ export declare function getNodesWithLiveStairOpeningInputs(nodes: Record<string,
1953
1872
  scale?: number | undefined;
1954
1873
  } | undefined;
1955
1874
  } | undefined;
1956
- slots?: Record<string, string> | undefined;
1957
- side?: "front" | "back" | undefined;
1958
- wallId?: string | undefined;
1959
- roofSegmentId?: string | undefined;
1960
- roofFace?: "front" | "back" | "right" | "left" | undefined;
1961
1875
  mark?: string | undefined;
1962
1876
  roughOpeningWidth?: number | undefined;
1963
1877
  roughOpeningHeight?: number | undefined;
@@ -1967,18 +1881,67 @@ export declare function getNodesWithLiveStairOpeningInputs(nodes: Record<string,
1967
1881
  finishOpeningHeight?: number | undefined;
1968
1882
  } | {
1969
1883
  object: "node";
1884
+ position: [number, number, number];
1885
+ id: `bvent_${string}`;
1970
1886
  parentId: string | null;
1971
1887
  visible: boolean;
1972
- metadata: import("zod").JSONType;
1973
- id: `rvent_${string}`;
1974
- type: "ridge-vent";
1975
- position: [number, number, number];
1888
+ metadata: Record<string, unknown>;
1976
1889
  rotation: number;
1977
- length: number;
1890
+ height: number;
1891
+ materialPreset: string;
1978
1892
  width: number;
1893
+ depth: number;
1894
+ hoodOverhang: number;
1895
+ topTaper: number;
1896
+ capHeight: number;
1897
+ capGap: number;
1898
+ domeCurvature: number;
1899
+ baseInset: number;
1900
+ baseHeight: number;
1901
+ cornerBevel: number;
1902
+ style: "box" | "cap" | "dome";
1903
+ type: "box-vent";
1904
+ name?: string | undefined;
1905
+ camera?: {
1906
+ position: [number, number, number];
1907
+ target: [number, number, number];
1908
+ mode: "perspective" | "orthographic";
1909
+ fov?: number | undefined;
1910
+ zoom?: number | undefined;
1911
+ } | undefined;
1912
+ roofSegmentId?: string | undefined;
1913
+ slots?: Record<string, string> | undefined;
1914
+ material?: {
1915
+ id?: string | undefined;
1916
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
1917
+ properties?: {
1918
+ color: string;
1919
+ roughness: number;
1920
+ metalness: number;
1921
+ opacity: number;
1922
+ transparent: boolean;
1923
+ side: "front" | "back" | "double";
1924
+ } | undefined;
1925
+ texture?: {
1926
+ url: string;
1927
+ repeat?: [number, number] | undefined;
1928
+ scale?: number | undefined;
1929
+ } | undefined;
1930
+ } | undefined;
1931
+ } | {
1932
+ object: "node";
1933
+ length: number;
1934
+ position: [number, number, number];
1935
+ id: `rvent_${string}`;
1936
+ parentId: string | null;
1937
+ visible: boolean;
1938
+ metadata: Record<string, unknown>;
1939
+ rotation: number;
1979
1940
  height: number;
1941
+ width: number;
1980
1942
  style: "metal" | "standard" | "shingled";
1981
1943
  endCaps: boolean;
1944
+ type: "ridge-vent";
1982
1945
  name?: string | undefined;
1983
1946
  camera?: {
1984
1947
  position: [number, number, number];
@@ -1987,6 +1950,7 @@ export declare function getNodesWithLiveStairOpeningInputs(nodes: Record<string,
1987
1950
  fov?: number | undefined;
1988
1951
  zoom?: number | undefined;
1989
1952
  } | undefined;
1953
+ roofSegmentId?: string | undefined;
1990
1954
  material?: {
1991
1955
  id?: string | undefined;
1992
1956
  preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
@@ -2005,24 +1969,23 @@ export declare function getNodesWithLiveStairOpeningInputs(nodes: Record<string,
2005
1969
  } | undefined;
2006
1970
  } | undefined;
2007
1971
  materialPreset?: string | undefined;
2008
- roofSegmentId?: string | undefined;
2009
1972
  } | {
2010
1973
  object: "node";
1974
+ position: [number, number, number];
1975
+ id: `tvent_${string}`;
2011
1976
  parentId: string | null;
2012
1977
  visible: boolean;
2013
- metadata: import("zod").JSONType;
2014
- id: `tvent_${string}`;
2015
- type: "turbine-vent";
2016
- materialPreset: string;
2017
- position: [number, number, number];
1978
+ metadata: Record<string, unknown>;
2018
1979
  rotation: number;
2019
- diameter: number;
2020
1980
  height: number;
1981
+ materialPreset: string;
1982
+ style: "globe" | "cylinder";
1983
+ diameter: number;
2021
1984
  neckHeight: number;
2022
1985
  baseOverhang: number;
2023
1986
  vaneCount: number;
2024
1987
  spinSpeed: number;
2025
- style: "globe" | "cylinder";
1988
+ type: "turbine-vent";
2026
1989
  name?: string | undefined;
2027
1990
  camera?: {
2028
1991
  position: [number, number, number];
@@ -2031,6 +1994,8 @@ export declare function getNodesWithLiveStairOpeningInputs(nodes: Record<string,
2031
1994
  fov?: number | undefined;
2032
1995
  zoom?: number | undefined;
2033
1996
  } | undefined;
1997
+ roofSegmentId?: string | undefined;
1998
+ slots?: Record<string, string> | undefined;
2034
1999
  material?: {
2035
2000
  id?: string | undefined;
2036
2001
  preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
@@ -2048,22 +2013,21 @@ export declare function getNodesWithLiveStairOpeningInputs(nodes: Record<string,
2048
2013
  scale?: number | undefined;
2049
2014
  } | undefined;
2050
2015
  } | undefined;
2051
- roofSegmentId?: string | undefined;
2052
2016
  } | {
2053
2017
  object: "node";
2018
+ position: [number, number, number];
2019
+ id: `cupola_${string}`;
2054
2020
  parentId: string | null;
2055
2021
  visible: boolean;
2056
- metadata: import("zod").JSONType;
2057
- id: `cupola_${string}`;
2058
- type: "cupola";
2059
- materialPreset: string;
2060
- position: [number, number, number];
2022
+ metadata: Record<string, unknown>;
2061
2023
  rotation: number;
2024
+ height: number;
2025
+ materialPreset: string;
2062
2026
  width: number;
2063
2027
  depth: number;
2064
- height: number;
2065
2028
  roofStyle: "dome" | "pyramid";
2066
2029
  finial: boolean;
2030
+ type: "cupola";
2067
2031
  name?: string | undefined;
2068
2032
  camera?: {
2069
2033
  position: [number, number, number];
@@ -2072,6 +2036,8 @@ export declare function getNodesWithLiveStairOpeningInputs(nodes: Record<string,
2072
2036
  fov?: number | undefined;
2073
2037
  zoom?: number | undefined;
2074
2038
  } | undefined;
2039
+ roofSegmentId?: string | undefined;
2040
+ slots?: Record<string, string> | undefined;
2075
2041
  material?: {
2076
2042
  id?: string | undefined;
2077
2043
  preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
@@ -2089,23 +2055,22 @@ export declare function getNodesWithLiveStairOpeningInputs(nodes: Record<string,
2089
2055
  scale?: number | undefined;
2090
2056
  } | undefined;
2091
2057
  } | undefined;
2092
- roofSegmentId?: string | undefined;
2093
2058
  } | {
2094
2059
  object: "node";
2060
+ position: [number, number, number];
2061
+ id: `eyebrow-vent_${string}`;
2095
2062
  parentId: string | null;
2096
2063
  visible: boolean;
2097
- metadata: import("zod").JSONType;
2098
- id: `eyebrow-vent_${string}`;
2099
- type: "eyebrow-vent";
2100
- materialPreset: string;
2101
- position: [number, number, number];
2064
+ metadata: Record<string, unknown>;
2102
2065
  rotation: number;
2066
+ height: number;
2067
+ materialPreset: string;
2103
2068
  width: number;
2104
2069
  depth: number;
2105
- height: number;
2106
- style: "scoop" | "half-round" | "slant-box";
2070
+ style: "half-round" | "scoop" | "slant-box";
2107
2071
  louverCount: number;
2108
2072
  backRatio: number;
2073
+ type: "eyebrow-vent";
2109
2074
  name?: string | undefined;
2110
2075
  camera?: {
2111
2076
  position: [number, number, number];
@@ -2114,6 +2079,8 @@ export declare function getNodesWithLiveStairOpeningInputs(nodes: Record<string,
2114
2079
  fov?: number | undefined;
2115
2080
  zoom?: number | undefined;
2116
2081
  } | undefined;
2082
+ roofSegmentId?: string | undefined;
2083
+ slots?: Record<string, string> | undefined;
2117
2084
  material?: {
2118
2085
  id?: string | undefined;
2119
2086
  preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
@@ -2131,30 +2098,30 @@ export declare function getNodesWithLiveStairOpeningInputs(nodes: Record<string,
2131
2098
  scale?: number | undefined;
2132
2099
  } | undefined;
2133
2100
  } | undefined;
2134
- roofSegmentId?: string | undefined;
2135
2101
  } | {
2136
2102
  object: "node";
2103
+ length: number;
2104
+ position: [number, number, number];
2105
+ id: `gutter_${string}`;
2137
2106
  parentId: string | null;
2138
2107
  visible: boolean;
2139
- metadata: import("zod").JSONType;
2140
- id: `gutter_${string}`;
2141
- type: "gutter";
2142
- materialPreset: string;
2143
- position: [number, number, number];
2108
+ metadata: Record<string, unknown>;
2144
2109
  rotation: number;
2145
- length: number;
2146
- size: number;
2110
+ materialPreset: string;
2147
2111
  thickness: number;
2148
- profile: "box" | "half-round" | "k-style";
2149
- endCapLeft: boolean;
2150
- endCapRight: boolean;
2112
+ profile: "box" | "k-style" | "half-round";
2151
2113
  hangerStyle: "none" | "strap";
2152
2114
  hangerSpacing: number;
2115
+ size: number;
2116
+ endCapLeft: boolean;
2117
+ endCapRight: boolean;
2153
2118
  outlets: {
2154
2119
  id: string;
2155
2120
  offset: number;
2156
2121
  diameter: number;
2122
+ generatedBy?: "default-downspout" | undefined;
2157
2123
  }[];
2124
+ type: "gutter";
2158
2125
  name?: string | undefined;
2159
2126
  camera?: {
2160
2127
  position: [number, number, number];
@@ -2163,6 +2130,8 @@ export declare function getNodesWithLiveStairOpeningInputs(nodes: Record<string,
2163
2130
  fov?: number | undefined;
2164
2131
  zoom?: number | undefined;
2165
2132
  } | undefined;
2133
+ roofSegmentId?: string | undefined;
2134
+ slots?: Record<string, string> | undefined;
2166
2135
  material?: {
2167
2136
  id?: string | undefined;
2168
2137
  preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
@@ -2180,25 +2149,30 @@ export declare function getNodesWithLiveStairOpeningInputs(nodes: Record<string,
2180
2149
  scale?: number | undefined;
2181
2150
  } | undefined;
2182
2151
  } | undefined;
2183
- roofSegmentId?: string | undefined;
2152
+ arc?: {
2153
+ centerX: number;
2154
+ centerZ: number;
2155
+ radius: number;
2156
+ } | undefined;
2184
2157
  } | {
2185
2158
  object: "node";
2159
+ position: [number, number, number];
2160
+ id: `chimney_${string}`;
2186
2161
  parentId: string | null;
2187
2162
  visible: boolean;
2188
- metadata: import("zod").JSONType;
2189
- id: `chimney_${string}`;
2190
- type: "chimney";
2191
- position: [number, number, number];
2163
+ metadata: Record<string, unknown>;
2192
2164
  rotation: number;
2165
+ width: number;
2166
+ depth: number;
2167
+ cornerBevel: number;
2168
+ cap: boolean;
2169
+ panelDepth: number;
2170
+ panelHeight: number;
2193
2171
  bodyShape: "round" | "square";
2194
2172
  bodyHollowDepth: number;
2195
2173
  bodyHollowMargin: number;
2196
- width: number;
2197
- depth: number;
2198
2174
  heightAboveRidge: number;
2199
2175
  cutoutOffset: number;
2200
- cornerBevel: number;
2201
- cap: boolean;
2202
2176
  capShape: "flat" | "none" | "stepped" | "sloped";
2203
2177
  capOverhang: number;
2204
2178
  capThickness: number;
@@ -2220,10 +2194,9 @@ export declare function getNodesWithLiveStairOpeningInputs(nodes: Record<string,
2220
2194
  cricketHeight: number;
2221
2195
  cricketSide: "front" | "back";
2222
2196
  panelStyle: "rectangular" | "none";
2223
- panelDepth: number;
2224
- panelHeight: number;
2225
2197
  panelOffsetTop: number;
2226
2198
  panelMargin: number;
2199
+ type: "chimney";
2227
2200
  name?: string | undefined;
2228
2201
  camera?: {
2229
2202
  position: [number, number, number];
@@ -2232,6 +2205,7 @@ export declare function getNodesWithLiveStairOpeningInputs(nodes: Record<string,
2232
2205
  fov?: number | undefined;
2233
2206
  zoom?: number | undefined;
2234
2207
  } | undefined;
2208
+ roofSegmentId?: string | undefined;
2235
2209
  material?: {
2236
2210
  id?: string | undefined;
2237
2211
  preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
@@ -2268,17 +2242,17 @@ export declare function getNodesWithLiveStairOpeningInputs(nodes: Record<string,
2268
2242
  } | undefined;
2269
2243
  } | undefined;
2270
2244
  topMaterialPreset?: string | undefined;
2271
- roofSegmentId?: string | undefined;
2272
2245
  } | {
2273
2246
  object: "node";
2247
+ position: [number, number, number];
2248
+ id: `solarpanel_${string}`;
2274
2249
  parentId: string | null;
2275
2250
  visible: boolean;
2276
- metadata: import("zod").JSONType;
2277
- id: `solarpanel_${string}`;
2278
- type: "solar-panel";
2279
- position: [number, number, number];
2251
+ metadata: Record<string, unknown>;
2280
2252
  rotation: number;
2281
2253
  rows: number;
2254
+ frameThickness: number;
2255
+ frameDepth: number;
2282
2256
  columns: number;
2283
2257
  panelWidth: number;
2284
2258
  panelHeight: number;
@@ -2287,8 +2261,7 @@ export declare function getNodesWithLiveStairOpeningInputs(nodes: Record<string,
2287
2261
  mountingType: "flush" | "tilted";
2288
2262
  tiltAngle: number;
2289
2263
  standoffHeight: number;
2290
- frameThickness: number;
2291
- frameDepth: number;
2264
+ type: "solar-panel";
2292
2265
  name?: string | undefined;
2293
2266
  camera?: {
2294
2267
  position: [number, number, number];
@@ -2297,6 +2270,7 @@ export declare function getNodesWithLiveStairOpeningInputs(nodes: Record<string,
2297
2270
  fov?: number | undefined;
2298
2271
  zoom?: number | undefined;
2299
2272
  } | undefined;
2273
+ roofSegmentId?: string | undefined;
2300
2274
  material?: {
2301
2275
  id?: string | undefined;
2302
2276
  preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
@@ -2334,36 +2308,35 @@ export declare function getNodesWithLiveStairOpeningInputs(nodes: Record<string,
2334
2308
  } | undefined;
2335
2309
  panelMaterialPreset?: string | undefined;
2336
2310
  panelTypePreset?: "residential" | "residential-large" | "compact" | "frameless" | undefined;
2337
- roofSegmentId?: string | undefined;
2338
2311
  surfaceNormal?: [number, number, number] | undefined;
2339
2312
  } | {
2340
2313
  object: "node";
2314
+ position: [number, number, number];
2315
+ id: `skylight_${string}`;
2341
2316
  parentId: string | null;
2342
2317
  visible: boolean;
2343
- metadata: import("zod").JSONType;
2344
- id: `skylight_${string}`;
2345
- type: "skylight";
2346
- position: [number, number, number];
2318
+ metadata: Record<string, unknown>;
2347
2319
  rotation: number;
2348
- width: number;
2349
2320
  height: number;
2321
+ width: number;
2322
+ operationState: number;
2323
+ slideDirection: "z" | "x";
2350
2324
  frameThickness: number;
2351
2325
  frameDepth: number;
2326
+ curbHeight: number;
2327
+ cutoutOffset: number;
2352
2328
  skylightType: "flat" | "sliding" | "opening" | "walk-on" | "lantern";
2353
2329
  glassThickness: number;
2354
2330
  lanternHeight: number;
2355
2331
  lanternTopScale: number;
2356
2332
  openingAngle: number;
2357
2333
  openingSide: "right" | "left" | "top" | "bottom";
2358
- operationState: number;
2359
2334
  motorHousing: boolean;
2360
2335
  slideFraction: number;
2361
- slideDirection: "z" | "x";
2362
2336
  trackWidth: number;
2363
2337
  motorHousingSize: number;
2364
2338
  curb: boolean;
2365
- curbHeight: number;
2366
- cutoutOffset: number;
2339
+ type: "skylight";
2367
2340
  name?: string | undefined;
2368
2341
  camera?: {
2369
2342
  position: [number, number, number];
@@ -2372,6 +2345,7 @@ export declare function getNodesWithLiveStairOpeningInputs(nodes: Record<string,
2372
2345
  fov?: number | undefined;
2373
2346
  zoom?: number | undefined;
2374
2347
  } | undefined;
2348
+ roofSegmentId?: string | undefined;
2375
2349
  material?: {
2376
2350
  id?: string | undefined;
2377
2351
  preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
@@ -2390,6 +2364,7 @@ export declare function getNodesWithLiveStairOpeningInputs(nodes: Record<string,
2390
2364
  } | undefined;
2391
2365
  } | undefined;
2392
2366
  materialPreset?: string | undefined;
2367
+ surfaceNormal?: [number, number, number] | undefined;
2393
2368
  glassMaterial?: {
2394
2369
  id?: string | undefined;
2395
2370
  preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
@@ -2408,22 +2383,21 @@ export declare function getNodesWithLiveStairOpeningInputs(nodes: Record<string,
2408
2383
  } | undefined;
2409
2384
  } | undefined;
2410
2385
  glassMaterialPreset?: string | undefined;
2411
- roofSegmentId?: string | undefined;
2412
- surfaceNormal?: [number, number, number] | undefined;
2413
2386
  } | {
2414
2387
  object: "node";
2388
+ position: [number, number, number];
2389
+ id: `dormer_${string}`;
2415
2390
  parentId: string | null;
2416
2391
  visible: boolean;
2417
- metadata: import("zod").JSONType;
2418
- id: `dormer_${string}`;
2419
- type: "dormer";
2420
- position: [number, number, number];
2392
+ metadata: Record<string, unknown>;
2421
2393
  rotation: number;
2394
+ height: number;
2395
+ children: `window_${string}`[];
2422
2396
  width: number;
2423
2397
  depth: number;
2424
- height: number;
2425
- roofType: "flat" | "hip" | "gable" | "shed" | "gambrel" | "dutch" | "mansard";
2398
+ roofType: "flat" | "hip" | "gable" | "shed" | "gambrel" | "dutch" | "mansard" | "conical";
2426
2399
  roofHeight: number;
2400
+ shedHighSide: "front" | "back";
2427
2401
  wallSkirtHeight: number;
2428
2402
  windowWidth: number;
2429
2403
  windowHeight: number;
@@ -2440,6 +2414,7 @@ export declare function getNodesWithLiveStairOpeningInputs(nodes: Record<string,
2440
2414
  windowSill: boolean;
2441
2415
  windowSillDepth: number;
2442
2416
  windowSillThickness: number;
2417
+ type: "dormer";
2443
2418
  name?: string | undefined;
2444
2419
  camera?: {
2445
2420
  position: [number, number, number];
@@ -2448,6 +2423,7 @@ export declare function getNodesWithLiveStairOpeningInputs(nodes: Record<string,
2448
2423
  fov?: number | undefined;
2449
2424
  zoom?: number | undefined;
2450
2425
  } | undefined;
2426
+ roofSegmentId?: string | undefined;
2451
2427
  material?: {
2452
2428
  id?: string | undefined;
2453
2429
  preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
@@ -2484,7 +2460,7 @@ export declare function getNodesWithLiveStairOpeningInputs(nodes: Record<string,
2484
2460
  } | undefined;
2485
2461
  } | undefined;
2486
2462
  topMaterialPreset?: string | undefined;
2487
- sideMaterial?: {
2463
+ wallMaterial?: {
2488
2464
  id?: string | undefined;
2489
2465
  preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
2490
2466
  properties?: {
@@ -2501,8 +2477,8 @@ export declare function getNodesWithLiveStairOpeningInputs(nodes: Record<string,
2501
2477
  scale?: number | undefined;
2502
2478
  } | undefined;
2503
2479
  } | undefined;
2504
- sideMaterialPreset?: string | undefined;
2505
- wallMaterial?: {
2480
+ wallMaterialPreset?: string | undefined;
2481
+ sideMaterial?: {
2506
2482
  id?: string | undefined;
2507
2483
  preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
2508
2484
  properties?: {
@@ -2519,23 +2495,22 @@ export declare function getNodesWithLiveStairOpeningInputs(nodes: Record<string,
2519
2495
  scale?: number | undefined;
2520
2496
  } | undefined;
2521
2497
  } | undefined;
2522
- wallMaterialPreset?: string | undefined;
2523
- roofSegmentId?: string | undefined;
2498
+ sideMaterialPreset?: string | undefined;
2524
2499
  } | {
2525
2500
  object: "node";
2501
+ length: number;
2502
+ id: `downspout_${string}`;
2526
2503
  parentId: string | null;
2527
2504
  visible: boolean;
2528
- metadata: import("zod").JSONType;
2529
- id: `downspout_${string}`;
2530
- type: "downspout";
2505
+ metadata: Record<string, unknown>;
2531
2506
  materialPreset: string;
2532
- length: number;
2533
2507
  diameter: number;
2534
- standoff: number;
2535
2508
  shape: "round" | "auto" | "rect";
2509
+ standoff: number;
2536
2510
  strapStyle: "none" | "band";
2537
2511
  strapSpacing: number;
2538
2512
  terminal: "straight" | "splash" | "kickout";
2513
+ type: "downspout";
2539
2514
  name?: string | undefined;
2540
2515
  camera?: {
2541
2516
  position: [number, number, number];
@@ -2544,6 +2519,7 @@ export declare function getNodesWithLiveStairOpeningInputs(nodes: Record<string,
2544
2519
  fov?: number | undefined;
2545
2520
  zoom?: number | undefined;
2546
2521
  } | undefined;
2522
+ slots?: Record<string, string> | undefined;
2547
2523
  material?: {
2548
2524
  id?: string | undefined;
2549
2525
  preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
@@ -2563,9 +2539,260 @@ export declare function getNodesWithLiveStairOpeningInputs(nodes: Record<string,
2563
2539
  } | undefined;
2564
2540
  gutterId?: string | undefined;
2565
2541
  outletId?: string | undefined;
2542
+ lengthMode?: "manual" | "to-ground" | undefined;
2543
+ } | {
2544
+ object: "node";
2545
+ path: [number, number, number][];
2546
+ id: `duct-segment_${string}`;
2547
+ parentId: string | null;
2548
+ visible: boolean;
2549
+ metadata: Record<string, unknown>;
2550
+ height: number;
2551
+ width: number;
2552
+ diameter: number;
2553
+ shape: "round" | "rect" | "oval";
2554
+ roll: number;
2555
+ ductMaterial: "spiral" | "sheet-metal" | "flex" | "duct-board";
2556
+ seamDetail: boolean;
2557
+ insulated: boolean;
2558
+ insulationR: number;
2559
+ system: "supply" | "return";
2560
+ type: "duct-segment";
2561
+ name?: string | undefined;
2562
+ camera?: {
2563
+ position: [number, number, number];
2564
+ target: [number, number, number];
2565
+ mode: "perspective" | "orthographic";
2566
+ fov?: number | undefined;
2567
+ zoom?: number | undefined;
2568
+ } | undefined;
2569
+ slots?: Record<string, string> | undefined;
2570
+ autoHangers?: boolean | undefined;
2571
+ hangerOverrides?: Record<string, {
2572
+ fraction?: number | undefined;
2573
+ skipped?: boolean | undefined;
2574
+ hostId?: string | undefined;
2575
+ }> | undefined;
2576
+ hangerStyle?: "double" | "single" | undefined;
2577
+ hangerSpacing?: number | undefined;
2578
+ hangerMaxReach?: number | undefined;
2579
+ wallAttachment?: {
2580
+ wallId: `wall_${string}`;
2581
+ side: "front" | "back";
2582
+ startUV: [number, number];
2583
+ endUV: [number, number];
2584
+ offset: number;
2585
+ } | undefined;
2586
+ } | {
2587
+ object: "node";
2588
+ position: [number, number, number];
2589
+ id: `duct-fitting_${string}`;
2590
+ parentId: string | null;
2591
+ visible: boolean;
2592
+ metadata: Record<string, unknown>;
2593
+ rotation: [number, number, number];
2594
+ height: number;
2595
+ width: number;
2596
+ diameter: number;
2597
+ angle: number;
2598
+ shape: "round" | "rect" | "oval";
2599
+ ductMaterial: "sheet-metal" | "flex" | "duct-board";
2600
+ system: "supply" | "return";
2601
+ fittingType: "elbow" | "tee" | "cross" | "reducer" | "transition" | "end-cap" | "damper" | "access-panel" | "coupling";
2602
+ shape2: "round" | "rect" | "oval";
2603
+ width2: number;
2604
+ height2: number;
2605
+ branchAngle: number;
2606
+ diameter2: number;
2607
+ damperAngle: number;
2608
+ panelWidth: number;
2609
+ panelHeight: number;
2610
+ type: "duct-fitting";
2611
+ name?: string | undefined;
2612
+ camera?: {
2613
+ position: [number, number, number];
2614
+ target: [number, number, number];
2615
+ mode: "perspective" | "orthographic";
2616
+ fov?: number | undefined;
2617
+ zoom?: number | undefined;
2618
+ } | undefined;
2619
+ slots?: Record<string, string> | undefined;
2620
+ inletShape?: "round" | "rect" | "oval" | undefined;
2621
+ outletShape?: "round" | "rect" | "oval" | undefined;
2622
+ } | {
2623
+ object: "node";
2624
+ position: [number, number, number];
2625
+ id: `duct-terminal_${string}`;
2626
+ parentId: string | null;
2627
+ visible: boolean;
2628
+ metadata: Record<string, unknown>;
2629
+ rotation: number;
2630
+ width: number;
2631
+ depth: number;
2632
+ terminalType: "supply-register" | "diffuser" | "return-grille";
2633
+ mount: "wall" | "ceiling" | "floor";
2634
+ collarShape: "round" | "rect" | "oval";
2635
+ collarDiameter: number;
2636
+ collarWidth: number;
2637
+ collarHeight: number;
2638
+ type: "duct-terminal";
2639
+ name?: string | undefined;
2640
+ camera?: {
2641
+ position: [number, number, number];
2642
+ target: [number, number, number];
2643
+ mode: "perspective" | "orthographic";
2644
+ fov?: number | undefined;
2645
+ zoom?: number | undefined;
2646
+ } | undefined;
2647
+ supportSlabId?: string | undefined;
2648
+ } | {
2649
+ object: "node";
2650
+ position: [number, number, number];
2651
+ id: `hvac-equipment_${string}`;
2652
+ parentId: string | null;
2653
+ visible: boolean;
2654
+ metadata: Record<string, unknown>;
2655
+ rotation: number;
2656
+ height: number;
2657
+ width: number;
2658
+ depth: number;
2659
+ equipmentType: "furnace" | "air-handler" | "condenser";
2660
+ supplyShape: "round" | "rect" | "oval";
2661
+ returnShape: "round" | "rect" | "oval";
2662
+ supplyDiameter: number;
2663
+ returnDiameter: number;
2664
+ supplyWidth: number;
2665
+ supplyHeight: number;
2666
+ returnWidth: number;
2667
+ returnHeight: number;
2668
+ type: "hvac-equipment";
2669
+ name?: string | undefined;
2670
+ camera?: {
2671
+ position: [number, number, number];
2672
+ target: [number, number, number];
2673
+ mode: "perspective" | "orthographic";
2674
+ fov?: number | undefined;
2675
+ zoom?: number | undefined;
2676
+ } | undefined;
2677
+ supportSlabId?: string | undefined;
2678
+ } | {
2679
+ object: "node";
2680
+ path: [number, number, number][];
2681
+ id: `lineset_${string}`;
2682
+ parentId: string | null;
2683
+ visible: boolean;
2684
+ metadata: Record<string, unknown>;
2685
+ insulated: boolean;
2686
+ suctionDiameter: number;
2687
+ liquidDiameter: number;
2688
+ type: "lineset";
2689
+ name?: string | undefined;
2690
+ camera?: {
2691
+ position: [number, number, number];
2692
+ target: [number, number, number];
2693
+ mode: "perspective" | "orthographic";
2694
+ fov?: number | undefined;
2695
+ zoom?: number | undefined;
2696
+ } | undefined;
2697
+ } | {
2698
+ object: "node";
2699
+ path: [number, number, number][];
2700
+ id: `liquid-line_${string}`;
2701
+ parentId: string | null;
2702
+ visible: boolean;
2703
+ metadata: Record<string, unknown>;
2704
+ diameter: number;
2705
+ type: "liquid-line";
2706
+ name?: string | undefined;
2707
+ camera?: {
2708
+ position: [number, number, number];
2709
+ target: [number, number, number];
2710
+ mode: "perspective" | "orthographic";
2711
+ fov?: number | undefined;
2712
+ zoom?: number | undefined;
2713
+ } | undefined;
2714
+ } | {
2715
+ object: "node";
2716
+ path: [number, number, number][];
2717
+ id: `pipe-segment_${string}`;
2718
+ parentId: string | null;
2719
+ visible: boolean;
2720
+ metadata: Record<string, unknown>;
2721
+ diameter: number;
2722
+ system: "waste" | "vent";
2723
+ pipeMaterial: "pvc" | "abs" | "cast-iron";
2724
+ type: "pipe-segment";
2725
+ name?: string | undefined;
2726
+ camera?: {
2727
+ position: [number, number, number];
2728
+ target: [number, number, number];
2729
+ mode: "perspective" | "orthographic";
2730
+ fov?: number | undefined;
2731
+ zoom?: number | undefined;
2732
+ } | undefined;
2733
+ autoHangers?: boolean | undefined;
2734
+ hangerOverrides?: Record<string, {
2735
+ fraction?: number | undefined;
2736
+ skipped?: boolean | undefined;
2737
+ hostId?: string | undefined;
2738
+ }> | undefined;
2739
+ hangerStyle?: "double" | "single" | undefined;
2740
+ hangerSpacing?: number | undefined;
2741
+ hangerMaxReach?: number | undefined;
2742
+ wallAttachment?: {
2743
+ wallId: `wall_${string}`;
2744
+ side: "front" | "back";
2745
+ startUV: [number, number];
2746
+ endUV: [number, number];
2747
+ offset: number;
2748
+ } | undefined;
2749
+ } | {
2750
+ object: "node";
2751
+ position: [number, number, number];
2752
+ id: `pipe-fitting_${string}`;
2753
+ parentId: string | null;
2754
+ visible: boolean;
2755
+ metadata: Record<string, unknown>;
2756
+ rotation: [number, number, number];
2757
+ diameter: number;
2758
+ angle: number;
2759
+ system: "waste" | "vent";
2760
+ fittingType: "elbow" | "cross" | "reducer" | "end-cap" | "coupling" | "wye" | "sanitary-tee" | "cleanout";
2761
+ diameter2: number;
2762
+ pipeMaterial: "pvc" | "abs" | "cast-iron";
2763
+ cleanoutStyle: "end" | "inline";
2764
+ type: "pipe-fitting";
2765
+ name?: string | undefined;
2766
+ camera?: {
2767
+ position: [number, number, number];
2768
+ target: [number, number, number];
2769
+ mode: "perspective" | "orthographic";
2770
+ fov?: number | undefined;
2771
+ zoom?: number | undefined;
2772
+ } | undefined;
2773
+ } | {
2774
+ object: "node";
2775
+ position: [number, number, number];
2776
+ id: `pipe-trap_${string}`;
2777
+ parentId: string | null;
2778
+ visible: boolean;
2779
+ metadata: Record<string, unknown>;
2780
+ rotation: number;
2781
+ diameter: number;
2782
+ pipeMaterial: "pvc" | "abs" | "cast-iron";
2783
+ armLengthM: number;
2784
+ type: "pipe-trap";
2785
+ name?: string | undefined;
2786
+ camera?: {
2787
+ position: [number, number, number];
2788
+ target: [number, number, number];
2789
+ mode: "perspective" | "orthographic";
2790
+ fov?: number | undefined;
2791
+ zoom?: number | undefined;
2792
+ } | undefined;
2566
2793
  }>;
2567
2794
  export declare function createSurfaceOpeningPreviewController(): {
2568
- previewSurfaceIds: Set<`bvent_${string}` | `elevator_${string}` | `item_${string}` | `ceiling_${string}` | `column_${string}` | `site_${string}` | `building_${string}` | `level_${string}` | `wall_${string}` | `door_${string}` | `window_${string}` | `fence_${string}` | `construction-dimension_${string}` | `structural-grid_${string}` | `zone_${string}` | `slab_${string}` | `roof_${string}` | `rseg_${string}` | `stair_${string}` | `sseg_${string}` | `scan_${string}` | `guide_${string}` | `measurement_${string}` | `spawn_${string}` | `shelf_${string}` | `duct-segment_${string}` | `duct-fitting_${string}` | `duct-terminal_${string}` | `hvac-equipment_${string}` | `lineset_${string}` | `liquid-line_${string}` | `pipe-segment_${string}` | `pipe-fitting_${string}` | `pipe-trap_${string}` | `cabinet_${string}` | `cabinet-module_${string}` | `rvent_${string}` | `tvent_${string}` | `cupola_${string}` | `eyebrow-vent_${string}` | `gutter_${string}` | `chimney_${string}` | `solarpanel_${string}` | `skylight_${string}` | `dormer_${string}` | `downspout_${string}`>;
2795
+ previewSurfaceIds: Set<`item_${string}` | `block_${string}` | `bvent_${string}` | `elevator_${string}` | `ceiling_${string}` | `column_${string}` | `site_${string}` | `building_${string}` | `level_${string}` | `wall_${string}` | `door_${string}` | `window_${string}` | `leanto_${string}` | `roof_${string}` | `rseg_${string}` | `slab_${string}` | `fence_${string}` | `construction-dimension_${string}` | `structural-grid_${string}` | `zone_${string}` | `stair_${string}` | `sseg_${string}` | `scan_${string}` | `guide_${string}` | `measurement_${string}` | `spawn_${string}` | `shelf_${string}` | `duct-segment_${string}` | `duct-fitting_${string}` | `duct-terminal_${string}` | `hvac-equipment_${string}` | `lineset_${string}` | `liquid-line_${string}` | `pipe-segment_${string}` | `pipe-fitting_${string}` | `pipe-trap_${string}` | `cabinet_${string}` | `cabinet-module_${string}` | `rvent_${string}` | `tvent_${string}` | `cupola_${string}` | `eyebrow-vent_${string}` | `gutter_${string}` | `chimney_${string}` | `solarpanel_${string}` | `skylight_${string}` | `dormer_${string}` | `downspout_${string}`>;
2569
2796
  apply(updates: SurfaceOpeningUpdate[]): void;
2570
2797
  clear(): void;
2571
2798
  };