@pascal-app/core 1.0.0-beta.4 → 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 (263) 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-manager.d.ts +12 -0
  18. package/dist/hooks/spatial-grid/spatial-grid-manager.d.ts.map +1 -1
  19. package/dist/hooks/spatial-grid/spatial-grid-manager.js +39 -1
  20. package/dist/hooks/spatial-grid/spatial-grid-sync.d.ts +2785 -1
  21. package/dist/hooks/spatial-grid/spatial-grid-sync.d.ts.map +1 -1
  22. package/dist/hooks/spatial-grid/spatial-grid-sync.js +132 -19
  23. package/dist/hooks/spatial-grid/support-host-patch.d.ts +45 -1
  24. package/dist/hooks/spatial-grid/support-host-patch.d.ts.map +1 -1
  25. package/dist/hooks/spatial-grid/support-host-patch.js +171 -6
  26. package/dist/index.d.ts +15 -6
  27. package/dist/index.d.ts.map +1 -1
  28. package/dist/index.js +17 -5
  29. package/dist/lib/asset-storage.d.ts.map +1 -1
  30. package/dist/lib/asset-storage.js +4 -1
  31. package/dist/lib/polygon-union.d.ts +4 -0
  32. package/dist/lib/polygon-union.d.ts.map +1 -0
  33. package/dist/lib/polygon-union.js +306 -0
  34. package/dist/lib/roof-overlap.d.ts +32 -0
  35. package/dist/lib/roof-overlap.d.ts.map +1 -0
  36. package/dist/lib/roof-overlap.js +72 -0
  37. package/dist/lib/room-topology-index.d.ts +50 -0
  38. package/dist/lib/room-topology-index.d.ts.map +1 -0
  39. package/dist/lib/room-topology-index.js +237 -0
  40. package/dist/lib/slab-polygon.d.ts +35 -2
  41. package/dist/lib/slab-polygon.d.ts.map +1 -1
  42. package/dist/lib/slab-polygon.js +133 -27
  43. package/dist/lib/space-detection.d.ts +40 -3
  44. package/dist/lib/space-detection.d.ts.map +1 -1
  45. package/dist/lib/space-detection.js +890 -246
  46. package/dist/registry/handles.d.ts +24 -3
  47. package/dist/registry/handles.d.ts.map +1 -1
  48. package/dist/registry/index.d.ts +3 -3
  49. package/dist/registry/index.d.ts.map +1 -1
  50. package/dist/registry/index.js +1 -1
  51. package/dist/registry/registry.d.ts +29 -6
  52. package/dist/registry/registry.d.ts.map +1 -1
  53. package/dist/registry/registry.js +111 -4
  54. package/dist/registry/scene-api.d.ts +16 -0
  55. package/dist/registry/scene-api.d.ts.map +1 -1
  56. package/dist/registry/scene-api.js +49 -1
  57. package/dist/registry/types.d.ts +261 -13
  58. package/dist/registry/types.d.ts.map +1 -1
  59. package/dist/registry/use-registry-version.d.ts +11 -0
  60. package/dist/registry/use-registry-version.d.ts.map +1 -0
  61. package/dist/registry/use-registry-version.js +15 -0
  62. package/dist/schema/__bench__/node-parsers.bench.d.ts +24 -0
  63. package/dist/schema/__bench__/node-parsers.bench.d.ts.map +1 -0
  64. package/dist/schema/__bench__/node-parsers.bench.js +314 -0
  65. package/dist/schema/__fixtures__/node-fixtures.d.ts +28 -0
  66. package/dist/schema/__fixtures__/node-fixtures.d.ts.map +1 -0
  67. package/dist/schema/__fixtures__/node-fixtures.js +125 -0
  68. package/dist/schema/base.d.ts +1 -1
  69. package/dist/schema/base.d.ts.map +1 -1
  70. package/dist/schema/base.js +8 -1
  71. package/dist/schema/compiled-node-parsers.d.ts +40 -0
  72. package/dist/schema/compiled-node-parsers.d.ts.map +1 -0
  73. package/dist/schema/compiled-node-parsers.js +95 -0
  74. package/dist/schema/index.d.ts +20 -15
  75. package/dist/schema/index.d.ts.map +1 -1
  76. package/dist/schema/index.js +19 -12
  77. package/dist/schema/material.d.ts +2 -1
  78. package/dist/schema/material.d.ts.map +1 -1
  79. package/dist/schema/material.js +1 -0
  80. package/dist/schema/nodes/automatic-downspout.d.ts +17 -0
  81. package/dist/schema/nodes/automatic-downspout.d.ts.map +1 -0
  82. package/dist/schema/nodes/automatic-downspout.js +237 -0
  83. package/dist/schema/nodes/block.d.ts +107 -0
  84. package/dist/schema/nodes/block.d.ts.map +1 -0
  85. package/dist/schema/nodes/block.js +207 -0
  86. package/dist/schema/nodes/box-vent.d.ts +8 -2
  87. package/dist/schema/nodes/box-vent.d.ts.map +1 -1
  88. package/dist/schema/nodes/box-vent.js +2 -0
  89. package/dist/schema/nodes/building.d.ts +1 -1
  90. package/dist/schema/nodes/cabinet.d.ts +25 -3
  91. package/dist/schema/nodes/cabinet.d.ts.map +1 -1
  92. package/dist/schema/nodes/cabinet.js +26 -5
  93. package/dist/schema/nodes/ceiling.d.ts +1 -1
  94. package/dist/schema/nodes/chimney.d.ts +2 -2
  95. package/dist/schema/nodes/column.d.ts +6 -6
  96. package/dist/schema/nodes/construction-dimension.d.ts +4 -4
  97. package/dist/schema/nodes/cupola.d.ts +9 -1
  98. package/dist/schema/nodes/cupola.d.ts.map +1 -1
  99. package/dist/schema/nodes/cupola.js +2 -0
  100. package/dist/schema/nodes/door.d.ts +1 -1
  101. package/dist/schema/nodes/dormer.d.ts +44 -1
  102. package/dist/schema/nodes/dormer.d.ts.map +1 -1
  103. package/dist/schema/nodes/dormer.js +131 -7
  104. package/dist/schema/nodes/downspout.d.ts +11 -1
  105. package/dist/schema/nodes/downspout.d.ts.map +1 -1
  106. package/dist/schema/nodes/downspout.js +24 -0
  107. package/dist/schema/nodes/duct-fitting.d.ts +18 -1
  108. package/dist/schema/nodes/duct-fitting.d.ts.map +1 -1
  109. package/dist/schema/nodes/duct-fitting.js +25 -4
  110. package/dist/schema/nodes/duct-segment.d.ts +23 -1
  111. package/dist/schema/nodes/duct-segment.d.ts.map +1 -1
  112. package/dist/schema/nodes/duct-segment.js +20 -0
  113. package/dist/schema/nodes/duct-terminal.d.ts +1 -1
  114. package/dist/schema/nodes/elevator.d.ts +1 -1
  115. package/dist/schema/nodes/eyebrow-vent.d.ts +8 -2
  116. package/dist/schema/nodes/eyebrow-vent.d.ts.map +1 -1
  117. package/dist/schema/nodes/eyebrow-vent.js +2 -0
  118. package/dist/schema/nodes/fence.d.ts +1 -1
  119. package/dist/schema/nodes/guide.d.ts +1 -1
  120. package/dist/schema/nodes/gutter.d.ts +36 -2
  121. package/dist/schema/nodes/gutter.d.ts.map +1 -1
  122. package/dist/schema/nodes/gutter.js +308 -1
  123. package/dist/schema/nodes/hanger-overrides.d.ts +7 -0
  124. package/dist/schema/nodes/hanger-overrides.d.ts.map +1 -0
  125. package/dist/schema/nodes/hanger-overrides.js +6 -0
  126. package/dist/schema/nodes/hvac-equipment.d.ts +1 -1
  127. package/dist/schema/nodes/item.d.ts +4 -3
  128. package/dist/schema/nodes/item.d.ts.map +1 -1
  129. package/dist/schema/nodes/item.js +5 -0
  130. package/dist/schema/nodes/lean-to-extension.d.ts +212 -0
  131. package/dist/schema/nodes/lean-to-extension.d.ts.map +1 -0
  132. package/dist/schema/nodes/lean-to-extension.js +114 -0
  133. package/dist/schema/nodes/level.d.ts +5 -2
  134. package/dist/schema/nodes/level.d.ts.map +1 -1
  135. package/dist/schema/nodes/level.js +9 -0
  136. package/dist/schema/nodes/lineset.d.ts +1 -1
  137. package/dist/schema/nodes/liquid-line.d.ts +1 -1
  138. package/dist/schema/nodes/measurement.d.ts +1 -1
  139. package/dist/schema/nodes/pipe-fitting.d.ts +9 -1
  140. package/dist/schema/nodes/pipe-fitting.d.ts.map +1 -1
  141. package/dist/schema/nodes/pipe-fitting.js +6 -2
  142. package/dist/schema/nodes/pipe-segment.d.ts +23 -1
  143. package/dist/schema/nodes/pipe-segment.d.ts.map +1 -1
  144. package/dist/schema/nodes/pipe-segment.js +20 -0
  145. package/dist/schema/nodes/pipe-trap.d.ts +1 -1
  146. package/dist/schema/nodes/ridge-vent.d.ts +1 -1
  147. package/dist/schema/nodes/ridge-vent.d.ts.map +1 -1
  148. package/dist/schema/nodes/ridge-vent.js +4 -1
  149. package/dist/schema/nodes/roof-segment-shape.d.ts +4 -0
  150. package/dist/schema/nodes/roof-segment-shape.d.ts.map +1 -1
  151. package/dist/schema/nodes/roof-segment-shape.js +64 -1
  152. package/dist/schema/nodes/roof-segment-walls.d.ts +3 -1
  153. package/dist/schema/nodes/roof-segment-walls.d.ts.map +1 -1
  154. package/dist/schema/nodes/roof-segment-walls.js +1 -1
  155. package/dist/schema/nodes/roof-segment.d.ts +41 -1
  156. package/dist/schema/nodes/roof-segment.d.ts.map +1 -1
  157. package/dist/schema/nodes/roof-segment.js +79 -2
  158. package/dist/schema/nodes/roof.d.ts +22 -1
  159. package/dist/schema/nodes/roof.d.ts.map +1 -1
  160. package/dist/schema/nodes/roof.js +14 -0
  161. package/dist/schema/nodes/scan.d.ts +19 -2
  162. package/dist/schema/nodes/scan.d.ts.map +1 -1
  163. package/dist/schema/nodes/scan.js +11 -1
  164. package/dist/schema/nodes/shelf.d.ts +2 -2
  165. package/dist/schema/nodes/site.d.ts +1 -1
  166. package/dist/schema/nodes/skylight.d.ts +1 -1
  167. package/dist/schema/nodes/slab.d.ts +1 -1
  168. package/dist/schema/nodes/solar-panel.d.ts +1 -1
  169. package/dist/schema/nodes/spawn.d.ts +1 -1
  170. package/dist/schema/nodes/stair-segment.d.ts +1 -1
  171. package/dist/schema/nodes/stair.d.ts +1 -1
  172. package/dist/schema/nodes/structural-grid.d.ts +1 -1
  173. package/dist/schema/nodes/turbine-vent.d.ts +7 -1
  174. package/dist/schema/nodes/turbine-vent.d.ts.map +1 -1
  175. package/dist/schema/nodes/turbine-vent.js +2 -0
  176. package/dist/schema/nodes/wall.d.ts +4 -4
  177. package/dist/schema/nodes/wall.d.ts.map +1 -1
  178. package/dist/schema/nodes/wall.js +7 -1
  179. package/dist/schema/nodes/window.d.ts +10 -3
  180. package/dist/schema/nodes/window.d.ts.map +1 -1
  181. package/dist/schema/nodes/window.js +4 -0
  182. package/dist/schema/nodes/zone.d.ts +2 -2
  183. package/dist/schema/nodes/zone.js +1 -1
  184. package/dist/schema/types.d.ts +485 -109
  185. package/dist/schema/types.d.ts.map +1 -1
  186. package/dist/schema/types.js +27 -1
  187. package/dist/services/hosting.d.ts +2 -2
  188. package/dist/services/hosting.d.ts.map +1 -1
  189. package/dist/services/hosting.js +4 -4
  190. package/dist/services/index.d.ts +2 -2
  191. package/dist/services/index.d.ts.map +1 -1
  192. package/dist/services/index.js +2 -2
  193. package/dist/services/storey.d.ts +3 -10
  194. package/dist/services/storey.d.ts.map +1 -1
  195. package/dist/services/storey.js +45 -15
  196. package/dist/services/system-graph.d.ts +11 -0
  197. package/dist/services/system-graph.d.ts.map +1 -1
  198. package/dist/services/system-graph.js +35 -5
  199. package/dist/store/actions/node-actions.d.ts +15 -4
  200. package/dist/store/actions/node-actions.d.ts.map +1 -1
  201. package/dist/store/actions/node-actions.js +458 -19
  202. package/dist/store/history-control.d.ts +5 -0
  203. package/dist/store/history-control.d.ts.map +1 -1
  204. package/dist/store/history-control.js +68 -6
  205. package/dist/store/history-invalidation.d.ts +3 -0
  206. package/dist/store/history-invalidation.d.ts.map +1 -0
  207. package/dist/store/history-invalidation.js +72 -0
  208. package/dist/store/scene-hydration.d.ts +5 -0
  209. package/dist/store/scene-hydration.d.ts.map +1 -0
  210. package/dist/store/scene-hydration.js +57 -0
  211. package/dist/store/use-scene.d.ts +3 -0
  212. package/dist/store/use-scene.d.ts.map +1 -1
  213. package/dist/store/use-scene.js +407 -227
  214. package/dist/systems/elevator/elevator-service.d.ts.map +1 -1
  215. package/dist/systems/elevator/elevator-service.js +16 -11
  216. package/dist/systems/roof/roof-elevation-system.d.ts +3 -0
  217. package/dist/systems/roof/roof-elevation-system.d.ts.map +1 -0
  218. package/dist/systems/roof/roof-elevation-system.js +94 -0
  219. package/dist/systems/roof/roof-elevation.d.ts +4 -0
  220. package/dist/systems/roof/roof-elevation.d.ts.map +1 -0
  221. package/dist/systems/roof/roof-elevation.js +95 -0
  222. package/dist/systems/roof/roof-footprint.d.ts +17 -0
  223. package/dist/systems/roof/roof-footprint.d.ts.map +1 -0
  224. package/dist/systems/roof/roof-footprint.js +83 -0
  225. package/dist/systems/slab/slab-support.d.ts +0 -31
  226. package/dist/systems/slab/slab-support.d.ts.map +1 -1
  227. package/dist/systems/slab/slab-support.js +26 -4
  228. package/dist/systems/stair/stair-flight.d.ts +17 -0
  229. package/dist/systems/stair/stair-flight.d.ts.map +1 -0
  230. package/dist/systems/stair/stair-flight.js +27 -0
  231. package/dist/systems/stair/stair-opening-preview.d.ts +1556 -1328
  232. package/dist/systems/stair/stair-opening-preview.d.ts.map +1 -1
  233. package/dist/systems/stair/stair-opening-system.d.ts +1 -0
  234. package/dist/systems/stair/stair-opening-system.d.ts.map +1 -1
  235. package/dist/systems/stair/stair-opening-system.js +93 -96
  236. package/dist/systems/stair/stair-rise.js +21 -20
  237. package/dist/systems/wall/wall-curve.d.ts +1 -0
  238. package/dist/systems/wall/wall-curve.d.ts.map +1 -1
  239. package/dist/systems/wall/wall-curve.js +73 -0
  240. package/dist/systems/wall/wall-footprint.d.ts +1 -0
  241. package/dist/systems/wall/wall-footprint.d.ts.map +1 -1
  242. package/dist/systems/wall/wall-footprint.js +1 -0
  243. package/dist/systems/wall/wall-mitering.d.ts.map +1 -1
  244. package/dist/systems/wall/wall-mitering.js +88 -9
  245. package/dist/systems/wall/wall-topology.d.ts +53 -0
  246. package/dist/systems/wall/wall-topology.d.ts.map +1 -0
  247. package/dist/systems/wall/wall-topology.js +414 -0
  248. package/dist/utils/clone-scene-graph.d.ts +2 -0
  249. package/dist/utils/clone-scene-graph.d.ts.map +1 -1
  250. package/dist/utils/clone-scene-graph.js +39 -2
  251. package/dist/utils/scene-migrations.d.ts +1 -0
  252. package/dist/utils/scene-migrations.d.ts.map +1 -1
  253. package/dist/utils/scene-migrations.js +1 -0
  254. package/dist/utils/vertical-scene-migration.d.ts +13 -0
  255. package/dist/utils/vertical-scene-migration.d.ts.map +1 -0
  256. package/dist/utils/vertical-scene-migration.js +179 -0
  257. package/dist/validation/validate-build-json.d.ts +3 -0
  258. package/dist/validation/validate-build-json.d.ts.map +1 -1
  259. package/dist/validation/validate-build-json.js +49 -2
  260. package/package.json +10 -3
  261. package/dist/systems/elevator/elevator-runtime-system.d.ts +0 -2
  262. package/dist/systems/elevator/elevator-runtime-system.d.ts.map +0 -1
  263. 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;
387
- materialPreset?: string | 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;
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,15 +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;
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";
1341
1074
  name?: string | undefined;
1342
1075
  camera?: {
1343
1076
  position: [number, number, number];
@@ -1347,38 +1080,45 @@ export declare function getNodesWithLiveStairOpeningInputs(nodes: Record<string,
1347
1080
  zoom?: number | undefined;
1348
1081
  } | undefined;
1349
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;
1350
1102
  } | {
1351
1103
  object: "node";
1104
+ position: [number, number, number];
1105
+ id: `roof_${string}`;
1352
1106
  parentId: string | null;
1353
1107
  visible: boolean;
1354
- metadata: import("zod").JSONType;
1355
- position: [number, number, number];
1108
+ metadata: Record<string, unknown>;
1356
1109
  rotation: number;
1357
- width: number;
1358
- depth: number;
1359
- carcassHeight: number;
1360
- operationState: number;
1361
- plinthHeight: number;
1362
- toeKickDepth: number;
1363
- boardThickness: number;
1364
- countertopThickness: number;
1365
- countertopOverhang: number;
1366
- countertopBackOverhang: number;
1367
- withFinishedBack: boolean;
1368
- frontThickness: number;
1369
- frontGap: number;
1370
- frontStyle: "slab" | "shaker" | "raised-arch";
1371
- handleStyle: "none" | "bar" | "cutout" | "hole" | "knob";
1372
- handlePosition: "top" | "auto" | "center";
1373
- frontOverlay: "full" | "inset";
1374
- withBottomPanel: boolean;
1375
- showPlinth: boolean;
1376
- withCountertop: boolean;
1377
- id: `cabinet_${string}`;
1378
- type: "cabinet";
1379
- runTier: "wall" | "base" | "tall";
1380
- children: `cabinet-module_${string}`[];
1381
- 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";
1382
1122
  name?: string | undefined;
1383
1123
  camera?: {
1384
1124
  position: [number, number, number];
@@ -1387,7 +1127,6 @@ export declare function getNodesWithLiveStairOpeningInputs(nodes: Record<string,
1387
1127
  fov?: number | undefined;
1388
1128
  zoom?: number | undefined;
1389
1129
  } | undefined;
1390
- supportSlabId?: string | undefined;
1391
1130
  material?: {
1392
1131
  id?: string | undefined;
1393
1132
  preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
@@ -1406,126 +1145,109 @@ export declare function getNodesWithLiveStairOpeningInputs(nodes: Record<string,
1406
1145
  } | undefined;
1407
1146
  } | undefined;
1408
1147
  materialPreset?: string | undefined;
1409
- slots?: Record<string, string> | undefined;
1410
- stack?: ({
1411
- type: "shelf";
1412
- id: string;
1413
- shelfCount?: number | undefined;
1414
- height?: number | undefined;
1415
- } | {
1416
- type: "drawer";
1417
- id: string;
1418
- drawerCount?: number | undefined;
1419
- height?: number | undefined;
1420
- } | {
1421
- type: "door";
1422
- id: string;
1423
- doorType?: "glass" | "double" | "single-left" | "single-right" | undefined;
1424
- shelfCount?: number | undefined;
1425
- height?: number | undefined;
1426
- } | {
1427
- type: "sink";
1428
- id: string;
1429
- sinkLayout?: "double" | "single" | "double-offset" | undefined;
1430
- height?: number | undefined;
1431
- } | {
1432
- type: "oven";
1433
- id: string;
1434
- height?: number | undefined;
1435
- } | {
1436
- type: "microwave";
1437
- id: string;
1438
- height?: number | undefined;
1439
- } | {
1440
- type: "dishwasher";
1441
- id: string;
1442
- height?: number | undefined;
1443
- } | {
1444
- type: "cooktop-gas";
1445
- id: string;
1446
- cooktopLayout?: "gas-2burner" | "gas-4burner" | "gas-5burner-wok" | "gas-6burner" | undefined;
1447
- cooktopBurnersOn?: boolean | undefined;
1448
- cooktopActiveBurners?: number[] | undefined;
1449
- cooktopKnobProgress?: number[] | undefined;
1450
- cooktopShowGrate?: boolean | undefined;
1451
- height?: number | undefined;
1452
- } | {
1453
- type: "cooktop-induction";
1454
- id: string;
1455
- cooktopLayout?: "induction-2zone" | "induction-4zone" | undefined;
1456
- cooktopBurnersOn?: boolean | undefined;
1457
- cooktopActiveBurners?: number[] | undefined;
1458
- cooktopKnobProgress?: number[] | undefined;
1459
- cooktopShowGrate?: boolean | undefined;
1460
- height?: number | undefined;
1461
- } | {
1462
- type: "pull-out-pantry";
1463
- id: string;
1464
- shelfCount?: number | undefined;
1465
- pantryRackStyle?: "glass" | "wire" | "tray" | undefined;
1466
- height?: number | undefined;
1467
- } | {
1468
- type: "fridge-single";
1469
- id: string;
1470
- height?: number | undefined;
1471
- } | {
1472
- type: "fridge-double";
1473
- id: string;
1474
- height?: number | undefined;
1475
- } | {
1476
- type: "fridge-top-freezer";
1477
- id: string;
1478
- height?: number | undefined;
1479
- } | {
1480
- type: "fridge-bottom-freezer";
1481
- id: string;
1482
- height?: number | undefined;
1483
- } | {
1484
- type: "hood-pyramid";
1485
- id: string;
1486
- height?: number | undefined;
1487
- } | {
1488
- type: "hood-curved-glass";
1489
- id: string;
1490
- height?: number | undefined;
1491
- })[] | undefined;
1492
- barLedge?: {
1493
- edge: "back" | "right" | "left";
1494
- height: number;
1495
- 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;
1496
1200
  } | undefined;
1201
+ wallMaterialPreset?: string | undefined;
1497
1202
  } | {
1498
1203
  object: "node";
1204
+ position: [number, number, number];
1205
+ id: `rseg_${string}`;
1499
1206
  parentId: string | null;
1500
1207
  visible: boolean;
1501
- metadata: import("zod").JSONType;
1502
- position: [number, number, number];
1208
+ metadata: Record<string, unknown>;
1503
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
+ };
1504
1229
  width: number;
1505
1230
  depth: number;
1506
- carcassHeight: number;
1507
- operationState: number;
1508
- plinthHeight: number;
1509
- toeKickDepth: number;
1510
- boardThickness: number;
1511
- countertopThickness: number;
1512
- countertopOverhang: number;
1513
- countertopBackOverhang: number;
1514
- withFinishedBack: boolean;
1515
- frontThickness: number;
1516
- frontGap: number;
1517
- frontStyle: "slab" | "shaker" | "raised-arch";
1518
- handleStyle: "none" | "bar" | "cutout" | "hole" | "knob";
1519
- handlePosition: "top" | "auto" | "center";
1520
- frontOverlay: "full" | "inset";
1521
- withBottomPanel: boolean;
1522
- showPlinth: boolean;
1523
- withCountertop: boolean;
1524
- id: `cabinet-module_${string}`;
1525
- type: "cabinet-module";
1526
- children: (`cabinet_${string}` | `cabinet-module_${string}`)[];
1527
- cabinetType: "base" | "tall";
1528
- 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";
1529
1251
  name?: string | undefined;
1530
1252
  camera?: {
1531
1253
  position: [number, number, number];
@@ -1534,7 +1256,6 @@ export declare function getNodesWithLiveStairOpeningInputs(nodes: Record<string,
1534
1256
  fov?: number | undefined;
1535
1257
  zoom?: number | undefined;
1536
1258
  } | undefined;
1537
- supportSlabId?: string | undefined;
1538
1259
  material?: {
1539
1260
  id?: string | undefined;
1540
1261
  preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
@@ -1553,137 +1274,156 @@ export declare function getNodesWithLiveStairOpeningInputs(nodes: Record<string,
1553
1274
  } | undefined;
1554
1275
  } | undefined;
1555
1276
  materialPreset?: string | undefined;
1556
- slots?: Record<string, string> | undefined;
1557
- stack?: ({
1558
- type: "shelf";
1559
- id: string;
1560
- shelfCount?: number | undefined;
1561
- height?: number | undefined;
1562
- } | {
1563
- type: "drawer";
1564
- id: string;
1565
- drawerCount?: number | undefined;
1566
- height?: number | undefined;
1567
- } | {
1568
- type: "door";
1569
- id: string;
1570
- doorType?: "glass" | "double" | "single-left" | "single-right" | undefined;
1571
- shelfCount?: number | undefined;
1572
- height?: number | undefined;
1573
- } | {
1574
- type: "sink";
1575
- id: string;
1576
- sinkLayout?: "double" | "single" | "double-offset" | undefined;
1577
- height?: number | undefined;
1578
- } | {
1579
- type: "oven";
1580
- id: string;
1581
- height?: number | undefined;
1582
- } | {
1583
- type: "microwave";
1584
- id: string;
1585
- height?: number | undefined;
1586
- } | {
1587
- type: "dishwasher";
1588
- id: string;
1589
- height?: number | undefined;
1590
- } | {
1591
- type: "cooktop-gas";
1592
- id: string;
1593
- cooktopLayout?: "gas-2burner" | "gas-4burner" | "gas-5burner-wok" | "gas-6burner" | undefined;
1594
- cooktopBurnersOn?: boolean | undefined;
1595
- cooktopActiveBurners?: number[] | undefined;
1596
- cooktopKnobProgress?: number[] | undefined;
1597
- cooktopShowGrate?: boolean | undefined;
1598
- height?: number | undefined;
1599
- } | {
1600
- type: "cooktop-induction";
1601
- id: string;
1602
- cooktopLayout?: "induction-2zone" | "induction-4zone" | undefined;
1603
- cooktopBurnersOn?: boolean | undefined;
1604
- cooktopActiveBurners?: number[] | undefined;
1605
- cooktopKnobProgress?: number[] | undefined;
1606
- cooktopShowGrate?: boolean | undefined;
1607
- height?: number | undefined;
1608
- } | {
1609
- type: "pull-out-pantry";
1610
- id: string;
1611
- shelfCount?: number | undefined;
1612
- pantryRackStyle?: "glass" | "wire" | "tray" | undefined;
1613
- height?: number | undefined;
1614
- } | {
1615
- type: "fridge-single";
1616
- id: string;
1617
- height?: number | undefined;
1618
- } | {
1619
- type: "fridge-double";
1620
- id: string;
1621
- height?: number | undefined;
1622
- } | {
1623
- type: "fridge-top-freezer";
1624
- id: string;
1625
- height?: number | undefined;
1626
- } | {
1627
- type: "fridge-bottom-freezer";
1628
- id: string;
1629
- height?: number | undefined;
1630
- } | {
1631
- type: "hood-pyramid";
1632
- id: string;
1633
- height?: number | undefined;
1634
- } | {
1635
- type: "hood-curved-glass";
1636
- id: string;
1637
- height?: number | undefined;
1638
- })[] | undefined;
1639
- openSide?: "right" | "left" | undefined;
1640
- 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;
1641
1400
  } | {
1642
1401
  object: "node";
1402
+ position: [number, number, number];
1403
+ id: `stair_${string}`;
1643
1404
  parentId: string | null;
1644
1405
  visible: boolean;
1645
- metadata: import("zod").JSONType;
1646
- id: `rseg_${string}`;
1647
- type: "roof-segment";
1648
- position: [number, number, number];
1406
+ metadata: Record<string, unknown>;
1649
1407
  rotation: number;
1650
- roofType: "flat" | "hip" | "gable" | "shed" | "gambrel" | "dutch" | "mansard";
1408
+ children: `sseg_${string}`[];
1651
1409
  width: number;
1652
- depth: number;
1653
- trim: {
1654
- left: number;
1655
- right: number;
1656
- front: number;
1657
- back: number;
1658
- frontLeft: number;
1659
- frontRight: number;
1660
- backLeft: number;
1661
- backRight: number;
1662
- frontLeftX: number;
1663
- frontLeftZ: number;
1664
- frontRightX: number;
1665
- frontRightZ: number;
1666
- backLeftX: number;
1667
- backLeftZ: number;
1668
- backRightX: number;
1669
- backRightZ: number;
1670
- };
1671
- wallHeight: number;
1672
- pitch: number;
1673
- wallThickness: number;
1674
- deckThickness: number;
1675
- overhang: number;
1676
- shingleThickness: number;
1677
- gambrelLowerWidthRatio: number;
1678
- gambrelLowerHeightRatio: number;
1679
- mansardSteepWidthRatio: number;
1680
- mansardSteepHeightRatio: number;
1681
- dutchHipWidthRatio: number;
1682
- dutchHipHeightRatio: number;
1683
- dutchWaistLengthRatio: number;
1684
- dutchGabletRake: number;
1685
- dutchTopRakeThickness: number;
1686
- 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";
1687
1427
  name?: string | undefined;
1688
1428
  camera?: {
1689
1429
  position: [number, number, number];
@@ -1692,6 +1432,8 @@ export declare function getNodesWithLiveStairOpeningInputs(nodes: Record<string,
1692
1432
  fov?: number | undefined;
1693
1433
  zoom?: number | undefined;
1694
1434
  } | undefined;
1435
+ supportSlabId?: string | undefined;
1436
+ slots?: Record<string, string> | undefined;
1695
1437
  material?: {
1696
1438
  id?: string | undefined;
1697
1439
  preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
@@ -1710,7 +1452,7 @@ export declare function getNodesWithLiveStairOpeningInputs(nodes: Record<string,
1710
1452
  } | undefined;
1711
1453
  } | undefined;
1712
1454
  materialPreset?: string | undefined;
1713
- topMaterial?: {
1455
+ railingMaterial?: {
1714
1456
  id?: string | undefined;
1715
1457
  preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
1716
1458
  properties?: {
@@ -1727,8 +1469,8 @@ export declare function getNodesWithLiveStairOpeningInputs(nodes: Record<string,
1727
1469
  scale?: number | undefined;
1728
1470
  } | undefined;
1729
1471
  } | undefined;
1730
- topMaterialPreset?: string | undefined;
1731
- edgeMaterial?: {
1472
+ railingMaterialPreset?: string | undefined;
1473
+ treadMaterial?: {
1732
1474
  id?: string | undefined;
1733
1475
  preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
1734
1476
  properties?: {
@@ -1745,8 +1487,53 @@ export declare function getNodesWithLiveStairOpeningInputs(nodes: Record<string,
1745
1487
  scale?: number | undefined;
1746
1488
  } | undefined;
1747
1489
  } | undefined;
1748
- edgeMaterialPreset?: string | undefined;
1749
- 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?: {
1750
1537
  id?: string | undefined;
1751
1538
  preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
1752
1539
  properties?: {
@@ -1763,24 +1550,167 @@ export declare function getNodesWithLiveStairOpeningInputs(nodes: Record<string,
1763
1550
  scale?: number | undefined;
1764
1551
  } | undefined;
1765
1552
  } | undefined;
1766
- 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;
1767
1705
  } | {
1768
1706
  object: "node";
1707
+ position: [number, number, number];
1708
+ id: `spawn_${string}`;
1769
1709
  parentId: string | null;
1770
1710
  visible: boolean;
1771
- metadata: import("zod").JSONType;
1772
- id: `sseg_${string}`;
1773
- type: "stair-segment";
1774
- position: [number, number, number];
1711
+ metadata: Record<string, unknown>;
1775
1712
  rotation: number;
1776
- segmentType: "stair" | "landing";
1777
- width: number;
1778
- length: number;
1779
- height: number;
1780
- stepCount: number;
1781
- attachmentSide: "front" | "right" | "left";
1782
- fillToFloor: boolean;
1783
- thickness: number;
1713
+ type: "spawn";
1784
1714
  name?: string | undefined;
1785
1715
  camera?: {
1786
1716
  position: [number, number, number];
@@ -1789,58 +1719,41 @@ export declare function getNodesWithLiveStairOpeningInputs(nodes: Record<string,
1789
1719
  fov?: number | undefined;
1790
1720
  zoom?: number | undefined;
1791
1721
  } | undefined;
1792
- material?: {
1793
- id?: string | undefined;
1794
- preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
1795
- properties?: {
1796
- color: string;
1797
- roughness: number;
1798
- metalness: number;
1799
- opacity: number;
1800
- transparent: boolean;
1801
- side: "front" | "back" | "double";
1802
- } | undefined;
1803
- texture?: {
1804
- url: string;
1805
- repeat?: [number, number] | undefined;
1806
- scale?: number | undefined;
1807
- } | undefined;
1808
- } | undefined;
1809
- materialPreset?: string | undefined;
1722
+ supportSlabId?: string | undefined;
1810
1723
  } | {
1811
1724
  object: "node";
1725
+ position: [number, number, number];
1726
+ id: `window_${string}`;
1812
1727
  parentId: string | null;
1813
1728
  visible: boolean;
1814
- metadata: import("zod").JSONType;
1815
- id: `window_${string}`;
1816
- type: "window";
1817
- position: [number, number, number];
1729
+ metadata: Record<string, unknown>;
1818
1730
  rotation: [number, number, number];
1819
- width: number;
1820
1731
  height: number;
1732
+ width: number;
1821
1733
  constructionType: "framed" | "masonry";
1822
1734
  dimensionReference: "nominal" | "rough-opening" | "masonry-opening" | "finish-opening";
1823
- openingKind: "window" | "opening";
1824
- windowType: "sliding" | "fixed" | "casement" | "awning" | "hopper" | "single-hung" | "double-hung" | "bay" | "bow" | "louvered";
1825
1735
  operationState: number;
1826
- awningDirection: "up" | "down";
1827
- casementStyle: "french" | "single";
1828
- hingesSide: "right" | "left";
1736
+ openingKind: "window" | "opening";
1829
1737
  openingShape: "rectangle" | "rounded" | "arch";
1830
1738
  openingRadiusMode: "all" | "individual";
1831
- openingCornerRadii: [number, number, number, number];
1832
1739
  cornerRadius: number;
1833
1740
  archHeight: number;
1834
1741
  openingRevealRadius: number;
1835
1742
  frameThickness: number;
1836
1743
  frameDepth: number;
1744
+ hingesSide: "right" | "left";
1837
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];
1838
1750
  rowRatios: number[];
1839
1751
  columnDividerThickness: number;
1840
1752
  rowDividerThickness: number;
1841
1753
  sill: boolean;
1842
1754
  sillDepth: number;
1843
1755
  sillThickness: number;
1756
+ type: "window";
1844
1757
  name?: string | undefined;
1845
1758
  camera?: {
1846
1759
  position: [number, number, number];
@@ -1849,6 +1762,11 @@ export declare function getNodesWithLiveStairOpeningInputs(nodes: Record<string,
1849
1762
  fov?: number | undefined;
1850
1763
  zoom?: number | undefined;
1851
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;
1852
1770
  material?: {
1853
1771
  id?: string | undefined;
1854
1772
  preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
@@ -1866,11 +1784,6 @@ export declare function getNodesWithLiveStairOpeningInputs(nodes: Record<string,
1866
1784
  scale?: number | undefined;
1867
1785
  } | undefined;
1868
1786
  } | undefined;
1869
- slots?: Record<string, string> | undefined;
1870
- side?: "front" | "back" | undefined;
1871
- wallId?: string | undefined;
1872
- roofSegmentId?: string | undefined;
1873
- roofFace?: "front" | "back" | "right" | "left" | undefined;
1874
1787
  mark?: string | undefined;
1875
1788
  roughOpeningWidth?: number | undefined;
1876
1789
  roughOpeningHeight?: number | undefined;
@@ -1878,22 +1791,23 @@ export declare function getNodesWithLiveStairOpeningInputs(nodes: Record<string,
1878
1791
  masonryOpeningHeight?: number | undefined;
1879
1792
  finishOpeningWidth?: number | undefined;
1880
1793
  finishOpeningHeight?: number | undefined;
1794
+ dormerId?: string | undefined;
1795
+ dormerFace?: "front" | "back" | "right" | "left" | undefined;
1881
1796
  } | {
1882
1797
  object: "node";
1798
+ position: [number, number, number];
1799
+ id: `door_${string}`;
1883
1800
  parentId: string | null;
1884
1801
  visible: boolean;
1885
- metadata: import("zod").JSONType;
1886
- id: `door_${string}`;
1887
- type: "door";
1888
- position: [number, number, number];
1802
+ metadata: Record<string, unknown>;
1889
1803
  rotation: [number, number, number];
1890
- width: number;
1891
1804
  height: number;
1805
+ width: number;
1806
+ leafCount: 4 | 1 | 2 | 3;
1892
1807
  constructionType: "framed" | "masonry";
1893
1808
  dimensionReference: "nominal" | "rough-opening" | "masonry-opening" | "finish-opening";
1894
1809
  doorCategory: "interior" | "garage";
1895
1810
  doorType: "double" | "hinged" | "french" | "folding" | "pocket" | "barn" | "sliding" | "garage-sectional" | "garage-rollup" | "garage-tiltup";
1896
- leafCount: 4 | 1 | 2 | 3;
1897
1811
  operationState: number;
1898
1812
  slideDirection: "right" | "left";
1899
1813
  trackStyle: "visible" | "none" | "pocket" | "overhead";
@@ -1927,6 +1841,7 @@ export declare function getNodesWithLiveStairOpeningInputs(nodes: Record<string,
1927
1841
  doorCloser: boolean;
1928
1842
  panicBar: boolean;
1929
1843
  panicBarHeight: number;
1844
+ type: "door";
1930
1845
  name?: string | undefined;
1931
1846
  camera?: {
1932
1847
  position: [number, number, number];
@@ -1935,6 +1850,11 @@ export declare function getNodesWithLiveStairOpeningInputs(nodes: Record<string,
1935
1850
  fov?: number | undefined;
1936
1851
  zoom?: number | undefined;
1937
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;
1938
1858
  material?: {
1939
1859
  id?: string | undefined;
1940
1860
  preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
@@ -1952,11 +1872,6 @@ export declare function getNodesWithLiveStairOpeningInputs(nodes: Record<string,
1952
1872
  scale?: number | undefined;
1953
1873
  } | undefined;
1954
1874
  } | undefined;
1955
- slots?: Record<string, string> | undefined;
1956
- side?: "front" | "back" | undefined;
1957
- wallId?: string | undefined;
1958
- roofSegmentId?: string | undefined;
1959
- roofFace?: "front" | "back" | "right" | "left" | undefined;
1960
1875
  mark?: string | undefined;
1961
1876
  roughOpeningWidth?: number | undefined;
1962
1877
  roughOpeningHeight?: number | undefined;
@@ -1966,18 +1881,67 @@ export declare function getNodesWithLiveStairOpeningInputs(nodes: Record<string,
1966
1881
  finishOpeningHeight?: number | undefined;
1967
1882
  } | {
1968
1883
  object: "node";
1884
+ position: [number, number, number];
1885
+ id: `bvent_${string}`;
1969
1886
  parentId: string | null;
1970
1887
  visible: boolean;
1971
- metadata: import("zod").JSONType;
1972
- id: `rvent_${string}`;
1973
- type: "ridge-vent";
1974
- position: [number, number, number];
1888
+ metadata: Record<string, unknown>;
1975
1889
  rotation: number;
1976
- length: number;
1890
+ height: number;
1891
+ materialPreset: string;
1977
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;
1978
1940
  height: number;
1941
+ width: number;
1979
1942
  style: "metal" | "standard" | "shingled";
1980
1943
  endCaps: boolean;
1944
+ type: "ridge-vent";
1981
1945
  name?: string | undefined;
1982
1946
  camera?: {
1983
1947
  position: [number, number, number];
@@ -1986,6 +1950,7 @@ export declare function getNodesWithLiveStairOpeningInputs(nodes: Record<string,
1986
1950
  fov?: number | undefined;
1987
1951
  zoom?: number | undefined;
1988
1952
  } | undefined;
1953
+ roofSegmentId?: string | undefined;
1989
1954
  material?: {
1990
1955
  id?: string | undefined;
1991
1956
  preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
@@ -2004,24 +1969,23 @@ export declare function getNodesWithLiveStairOpeningInputs(nodes: Record<string,
2004
1969
  } | undefined;
2005
1970
  } | undefined;
2006
1971
  materialPreset?: string | undefined;
2007
- roofSegmentId?: string | undefined;
2008
1972
  } | {
2009
1973
  object: "node";
1974
+ position: [number, number, number];
1975
+ id: `tvent_${string}`;
2010
1976
  parentId: string | null;
2011
1977
  visible: boolean;
2012
- metadata: import("zod").JSONType;
2013
- id: `tvent_${string}`;
2014
- type: "turbine-vent";
2015
- materialPreset: string;
2016
- position: [number, number, number];
1978
+ metadata: Record<string, unknown>;
2017
1979
  rotation: number;
2018
- diameter: number;
2019
1980
  height: number;
1981
+ materialPreset: string;
1982
+ style: "globe" | "cylinder";
1983
+ diameter: number;
2020
1984
  neckHeight: number;
2021
1985
  baseOverhang: number;
2022
1986
  vaneCount: number;
2023
1987
  spinSpeed: number;
2024
- style: "globe" | "cylinder";
1988
+ type: "turbine-vent";
2025
1989
  name?: string | undefined;
2026
1990
  camera?: {
2027
1991
  position: [number, number, number];
@@ -2030,6 +1994,8 @@ export declare function getNodesWithLiveStairOpeningInputs(nodes: Record<string,
2030
1994
  fov?: number | undefined;
2031
1995
  zoom?: number | undefined;
2032
1996
  } | undefined;
1997
+ roofSegmentId?: string | undefined;
1998
+ slots?: Record<string, string> | undefined;
2033
1999
  material?: {
2034
2000
  id?: string | undefined;
2035
2001
  preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
@@ -2047,22 +2013,21 @@ export declare function getNodesWithLiveStairOpeningInputs(nodes: Record<string,
2047
2013
  scale?: number | undefined;
2048
2014
  } | undefined;
2049
2015
  } | undefined;
2050
- roofSegmentId?: string | undefined;
2051
2016
  } | {
2052
2017
  object: "node";
2018
+ position: [number, number, number];
2019
+ id: `cupola_${string}`;
2053
2020
  parentId: string | null;
2054
2021
  visible: boolean;
2055
- metadata: import("zod").JSONType;
2056
- id: `cupola_${string}`;
2057
- type: "cupola";
2058
- materialPreset: string;
2059
- position: [number, number, number];
2022
+ metadata: Record<string, unknown>;
2060
2023
  rotation: number;
2024
+ height: number;
2025
+ materialPreset: string;
2061
2026
  width: number;
2062
2027
  depth: number;
2063
- height: number;
2064
2028
  roofStyle: "dome" | "pyramid";
2065
2029
  finial: boolean;
2030
+ type: "cupola";
2066
2031
  name?: string | undefined;
2067
2032
  camera?: {
2068
2033
  position: [number, number, number];
@@ -2071,6 +2036,8 @@ export declare function getNodesWithLiveStairOpeningInputs(nodes: Record<string,
2071
2036
  fov?: number | undefined;
2072
2037
  zoom?: number | undefined;
2073
2038
  } | undefined;
2039
+ roofSegmentId?: string | undefined;
2040
+ slots?: Record<string, string> | undefined;
2074
2041
  material?: {
2075
2042
  id?: string | undefined;
2076
2043
  preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
@@ -2088,23 +2055,22 @@ export declare function getNodesWithLiveStairOpeningInputs(nodes: Record<string,
2088
2055
  scale?: number | undefined;
2089
2056
  } | undefined;
2090
2057
  } | undefined;
2091
- roofSegmentId?: string | undefined;
2092
2058
  } | {
2093
2059
  object: "node";
2060
+ position: [number, number, number];
2061
+ id: `eyebrow-vent_${string}`;
2094
2062
  parentId: string | null;
2095
2063
  visible: boolean;
2096
- metadata: import("zod").JSONType;
2097
- id: `eyebrow-vent_${string}`;
2098
- type: "eyebrow-vent";
2099
- materialPreset: string;
2100
- position: [number, number, number];
2064
+ metadata: Record<string, unknown>;
2101
2065
  rotation: number;
2066
+ height: number;
2067
+ materialPreset: string;
2102
2068
  width: number;
2103
2069
  depth: number;
2104
- height: number;
2105
- style: "scoop" | "half-round" | "slant-box";
2070
+ style: "half-round" | "scoop" | "slant-box";
2106
2071
  louverCount: number;
2107
2072
  backRatio: number;
2073
+ type: "eyebrow-vent";
2108
2074
  name?: string | undefined;
2109
2075
  camera?: {
2110
2076
  position: [number, number, number];
@@ -2113,6 +2079,8 @@ export declare function getNodesWithLiveStairOpeningInputs(nodes: Record<string,
2113
2079
  fov?: number | undefined;
2114
2080
  zoom?: number | undefined;
2115
2081
  } | undefined;
2082
+ roofSegmentId?: string | undefined;
2083
+ slots?: Record<string, string> | undefined;
2116
2084
  material?: {
2117
2085
  id?: string | undefined;
2118
2086
  preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
@@ -2130,30 +2098,30 @@ export declare function getNodesWithLiveStairOpeningInputs(nodes: Record<string,
2130
2098
  scale?: number | undefined;
2131
2099
  } | undefined;
2132
2100
  } | undefined;
2133
- roofSegmentId?: string | undefined;
2134
2101
  } | {
2135
2102
  object: "node";
2103
+ length: number;
2104
+ position: [number, number, number];
2105
+ id: `gutter_${string}`;
2136
2106
  parentId: string | null;
2137
2107
  visible: boolean;
2138
- metadata: import("zod").JSONType;
2139
- id: `gutter_${string}`;
2140
- type: "gutter";
2141
- materialPreset: string;
2142
- position: [number, number, number];
2108
+ metadata: Record<string, unknown>;
2143
2109
  rotation: number;
2144
- length: number;
2145
- size: number;
2110
+ materialPreset: string;
2146
2111
  thickness: number;
2147
- profile: "box" | "half-round" | "k-style";
2148
- endCapLeft: boolean;
2149
- endCapRight: boolean;
2112
+ profile: "box" | "k-style" | "half-round";
2150
2113
  hangerStyle: "none" | "strap";
2151
2114
  hangerSpacing: number;
2115
+ size: number;
2116
+ endCapLeft: boolean;
2117
+ endCapRight: boolean;
2152
2118
  outlets: {
2153
2119
  id: string;
2154
2120
  offset: number;
2155
2121
  diameter: number;
2122
+ generatedBy?: "default-downspout" | undefined;
2156
2123
  }[];
2124
+ type: "gutter";
2157
2125
  name?: string | undefined;
2158
2126
  camera?: {
2159
2127
  position: [number, number, number];
@@ -2162,6 +2130,8 @@ export declare function getNodesWithLiveStairOpeningInputs(nodes: Record<string,
2162
2130
  fov?: number | undefined;
2163
2131
  zoom?: number | undefined;
2164
2132
  } | undefined;
2133
+ roofSegmentId?: string | undefined;
2134
+ slots?: Record<string, string> | undefined;
2165
2135
  material?: {
2166
2136
  id?: string | undefined;
2167
2137
  preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
@@ -2179,25 +2149,30 @@ export declare function getNodesWithLiveStairOpeningInputs(nodes: Record<string,
2179
2149
  scale?: number | undefined;
2180
2150
  } | undefined;
2181
2151
  } | undefined;
2182
- roofSegmentId?: string | undefined;
2152
+ arc?: {
2153
+ centerX: number;
2154
+ centerZ: number;
2155
+ radius: number;
2156
+ } | undefined;
2183
2157
  } | {
2184
2158
  object: "node";
2159
+ position: [number, number, number];
2160
+ id: `chimney_${string}`;
2185
2161
  parentId: string | null;
2186
2162
  visible: boolean;
2187
- metadata: import("zod").JSONType;
2188
- id: `chimney_${string}`;
2189
- type: "chimney";
2190
- position: [number, number, number];
2163
+ metadata: Record<string, unknown>;
2191
2164
  rotation: number;
2165
+ width: number;
2166
+ depth: number;
2167
+ cornerBevel: number;
2168
+ cap: boolean;
2169
+ panelDepth: number;
2170
+ panelHeight: number;
2192
2171
  bodyShape: "round" | "square";
2193
2172
  bodyHollowDepth: number;
2194
2173
  bodyHollowMargin: number;
2195
- width: number;
2196
- depth: number;
2197
2174
  heightAboveRidge: number;
2198
2175
  cutoutOffset: number;
2199
- cornerBevel: number;
2200
- cap: boolean;
2201
2176
  capShape: "flat" | "none" | "stepped" | "sloped";
2202
2177
  capOverhang: number;
2203
2178
  capThickness: number;
@@ -2219,10 +2194,9 @@ export declare function getNodesWithLiveStairOpeningInputs(nodes: Record<string,
2219
2194
  cricketHeight: number;
2220
2195
  cricketSide: "front" | "back";
2221
2196
  panelStyle: "rectangular" | "none";
2222
- panelDepth: number;
2223
- panelHeight: number;
2224
2197
  panelOffsetTop: number;
2225
2198
  panelMargin: number;
2199
+ type: "chimney";
2226
2200
  name?: string | undefined;
2227
2201
  camera?: {
2228
2202
  position: [number, number, number];
@@ -2231,6 +2205,7 @@ export declare function getNodesWithLiveStairOpeningInputs(nodes: Record<string,
2231
2205
  fov?: number | undefined;
2232
2206
  zoom?: number | undefined;
2233
2207
  } | undefined;
2208
+ roofSegmentId?: string | undefined;
2234
2209
  material?: {
2235
2210
  id?: string | undefined;
2236
2211
  preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
@@ -2267,17 +2242,17 @@ export declare function getNodesWithLiveStairOpeningInputs(nodes: Record<string,
2267
2242
  } | undefined;
2268
2243
  } | undefined;
2269
2244
  topMaterialPreset?: string | undefined;
2270
- roofSegmentId?: string | undefined;
2271
2245
  } | {
2272
2246
  object: "node";
2247
+ position: [number, number, number];
2248
+ id: `solarpanel_${string}`;
2273
2249
  parentId: string | null;
2274
2250
  visible: boolean;
2275
- metadata: import("zod").JSONType;
2276
- id: `solarpanel_${string}`;
2277
- type: "solar-panel";
2278
- position: [number, number, number];
2251
+ metadata: Record<string, unknown>;
2279
2252
  rotation: number;
2280
2253
  rows: number;
2254
+ frameThickness: number;
2255
+ frameDepth: number;
2281
2256
  columns: number;
2282
2257
  panelWidth: number;
2283
2258
  panelHeight: number;
@@ -2286,8 +2261,7 @@ export declare function getNodesWithLiveStairOpeningInputs(nodes: Record<string,
2286
2261
  mountingType: "flush" | "tilted";
2287
2262
  tiltAngle: number;
2288
2263
  standoffHeight: number;
2289
- frameThickness: number;
2290
- frameDepth: number;
2264
+ type: "solar-panel";
2291
2265
  name?: string | undefined;
2292
2266
  camera?: {
2293
2267
  position: [number, number, number];
@@ -2296,6 +2270,7 @@ export declare function getNodesWithLiveStairOpeningInputs(nodes: Record<string,
2296
2270
  fov?: number | undefined;
2297
2271
  zoom?: number | undefined;
2298
2272
  } | undefined;
2273
+ roofSegmentId?: string | undefined;
2299
2274
  material?: {
2300
2275
  id?: string | undefined;
2301
2276
  preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
@@ -2333,36 +2308,35 @@ export declare function getNodesWithLiveStairOpeningInputs(nodes: Record<string,
2333
2308
  } | undefined;
2334
2309
  panelMaterialPreset?: string | undefined;
2335
2310
  panelTypePreset?: "residential" | "residential-large" | "compact" | "frameless" | undefined;
2336
- roofSegmentId?: string | undefined;
2337
2311
  surfaceNormal?: [number, number, number] | undefined;
2338
2312
  } | {
2339
2313
  object: "node";
2314
+ position: [number, number, number];
2315
+ id: `skylight_${string}`;
2340
2316
  parentId: string | null;
2341
2317
  visible: boolean;
2342
- metadata: import("zod").JSONType;
2343
- id: `skylight_${string}`;
2344
- type: "skylight";
2345
- position: [number, number, number];
2318
+ metadata: Record<string, unknown>;
2346
2319
  rotation: number;
2347
- width: number;
2348
2320
  height: number;
2321
+ width: number;
2322
+ operationState: number;
2323
+ slideDirection: "z" | "x";
2349
2324
  frameThickness: number;
2350
2325
  frameDepth: number;
2326
+ curbHeight: number;
2327
+ cutoutOffset: number;
2351
2328
  skylightType: "flat" | "sliding" | "opening" | "walk-on" | "lantern";
2352
2329
  glassThickness: number;
2353
2330
  lanternHeight: number;
2354
2331
  lanternTopScale: number;
2355
2332
  openingAngle: number;
2356
2333
  openingSide: "right" | "left" | "top" | "bottom";
2357
- operationState: number;
2358
2334
  motorHousing: boolean;
2359
2335
  slideFraction: number;
2360
- slideDirection: "z" | "x";
2361
2336
  trackWidth: number;
2362
2337
  motorHousingSize: number;
2363
2338
  curb: boolean;
2364
- curbHeight: number;
2365
- cutoutOffset: number;
2339
+ type: "skylight";
2366
2340
  name?: string | undefined;
2367
2341
  camera?: {
2368
2342
  position: [number, number, number];
@@ -2371,6 +2345,7 @@ export declare function getNodesWithLiveStairOpeningInputs(nodes: Record<string,
2371
2345
  fov?: number | undefined;
2372
2346
  zoom?: number | undefined;
2373
2347
  } | undefined;
2348
+ roofSegmentId?: string | undefined;
2374
2349
  material?: {
2375
2350
  id?: string | undefined;
2376
2351
  preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
@@ -2389,6 +2364,7 @@ export declare function getNodesWithLiveStairOpeningInputs(nodes: Record<string,
2389
2364
  } | undefined;
2390
2365
  } | undefined;
2391
2366
  materialPreset?: string | undefined;
2367
+ surfaceNormal?: [number, number, number] | undefined;
2392
2368
  glassMaterial?: {
2393
2369
  id?: string | undefined;
2394
2370
  preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
@@ -2407,22 +2383,21 @@ export declare function getNodesWithLiveStairOpeningInputs(nodes: Record<string,
2407
2383
  } | undefined;
2408
2384
  } | undefined;
2409
2385
  glassMaterialPreset?: string | undefined;
2410
- roofSegmentId?: string | undefined;
2411
- surfaceNormal?: [number, number, number] | undefined;
2412
2386
  } | {
2413
2387
  object: "node";
2388
+ position: [number, number, number];
2389
+ id: `dormer_${string}`;
2414
2390
  parentId: string | null;
2415
2391
  visible: boolean;
2416
- metadata: import("zod").JSONType;
2417
- id: `dormer_${string}`;
2418
- type: "dormer";
2419
- position: [number, number, number];
2392
+ metadata: Record<string, unknown>;
2420
2393
  rotation: number;
2394
+ height: number;
2395
+ children: `window_${string}`[];
2421
2396
  width: number;
2422
2397
  depth: number;
2423
- height: number;
2424
- roofType: "flat" | "hip" | "gable" | "shed" | "gambrel" | "dutch" | "mansard";
2398
+ roofType: "flat" | "hip" | "gable" | "shed" | "gambrel" | "dutch" | "mansard" | "conical";
2425
2399
  roofHeight: number;
2400
+ shedHighSide: "front" | "back";
2426
2401
  wallSkirtHeight: number;
2427
2402
  windowWidth: number;
2428
2403
  windowHeight: number;
@@ -2439,6 +2414,7 @@ export declare function getNodesWithLiveStairOpeningInputs(nodes: Record<string,
2439
2414
  windowSill: boolean;
2440
2415
  windowSillDepth: number;
2441
2416
  windowSillThickness: number;
2417
+ type: "dormer";
2442
2418
  name?: string | undefined;
2443
2419
  camera?: {
2444
2420
  position: [number, number, number];
@@ -2447,6 +2423,7 @@ export declare function getNodesWithLiveStairOpeningInputs(nodes: Record<string,
2447
2423
  fov?: number | undefined;
2448
2424
  zoom?: number | undefined;
2449
2425
  } | undefined;
2426
+ roofSegmentId?: string | undefined;
2450
2427
  material?: {
2451
2428
  id?: string | undefined;
2452
2429
  preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
@@ -2483,7 +2460,7 @@ export declare function getNodesWithLiveStairOpeningInputs(nodes: Record<string,
2483
2460
  } | undefined;
2484
2461
  } | undefined;
2485
2462
  topMaterialPreset?: string | undefined;
2486
- sideMaterial?: {
2463
+ wallMaterial?: {
2487
2464
  id?: string | undefined;
2488
2465
  preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
2489
2466
  properties?: {
@@ -2500,8 +2477,8 @@ export declare function getNodesWithLiveStairOpeningInputs(nodes: Record<string,
2500
2477
  scale?: number | undefined;
2501
2478
  } | undefined;
2502
2479
  } | undefined;
2503
- sideMaterialPreset?: string | undefined;
2504
- wallMaterial?: {
2480
+ wallMaterialPreset?: string | undefined;
2481
+ sideMaterial?: {
2505
2482
  id?: string | undefined;
2506
2483
  preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
2507
2484
  properties?: {
@@ -2518,23 +2495,22 @@ export declare function getNodesWithLiveStairOpeningInputs(nodes: Record<string,
2518
2495
  scale?: number | undefined;
2519
2496
  } | undefined;
2520
2497
  } | undefined;
2521
- wallMaterialPreset?: string | undefined;
2522
- roofSegmentId?: string | undefined;
2498
+ sideMaterialPreset?: string | undefined;
2523
2499
  } | {
2524
2500
  object: "node";
2501
+ length: number;
2502
+ id: `downspout_${string}`;
2525
2503
  parentId: string | null;
2526
2504
  visible: boolean;
2527
- metadata: import("zod").JSONType;
2528
- id: `downspout_${string}`;
2529
- type: "downspout";
2505
+ metadata: Record<string, unknown>;
2530
2506
  materialPreset: string;
2531
- length: number;
2532
2507
  diameter: number;
2533
- standoff: number;
2534
2508
  shape: "round" | "auto" | "rect";
2509
+ standoff: number;
2535
2510
  strapStyle: "none" | "band";
2536
2511
  strapSpacing: number;
2537
2512
  terminal: "straight" | "splash" | "kickout";
2513
+ type: "downspout";
2538
2514
  name?: string | undefined;
2539
2515
  camera?: {
2540
2516
  position: [number, number, number];
@@ -2543,6 +2519,7 @@ export declare function getNodesWithLiveStairOpeningInputs(nodes: Record<string,
2543
2519
  fov?: number | undefined;
2544
2520
  zoom?: number | undefined;
2545
2521
  } | undefined;
2522
+ slots?: Record<string, string> | undefined;
2546
2523
  material?: {
2547
2524
  id?: string | undefined;
2548
2525
  preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
@@ -2562,9 +2539,260 @@ export declare function getNodesWithLiveStairOpeningInputs(nodes: Record<string,
2562
2539
  } | undefined;
2563
2540
  gutterId?: string | undefined;
2564
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;
2565
2793
  }>;
2566
2794
  export declare function createSurfaceOpeningPreviewController(): {
2567
- 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}`>;
2568
2796
  apply(updates: SurfaceOpeningUpdate[]): void;
2569
2797
  clear(): void;
2570
2798
  };