@pascal-app/core 1.0.7 → 1.1.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 (176) hide show
  1. package/dist/agent-operations/__fixtures__/native-materials.d.ts +4 -0
  2. package/dist/agent-operations/__fixtures__/native-materials.d.ts.map +1 -1
  3. package/dist/agent-operations/__fixtures__/roof-bearing-cases.d.ts +11283 -11279
  4. package/dist/agent-operations/__fixtures__/roof-bearing-cases.d.ts.map +1 -1
  5. package/dist/agent-operations/__fixtures__/verify-scene-cases.d.ts +77 -77
  6. package/dist/agent-operations/author-scene.d.ts.map +1 -1
  7. package/dist/agent-operations/author-scene.js +2 -3
  8. package/dist/agent-operations/circulation-spaces.d.ts +3181 -3180
  9. package/dist/agent-operations/circulation-spaces.d.ts.map +1 -1
  10. package/dist/agent-operations/level-reads.js +1 -1
  11. package/dist/agent-operations/move-plan.d.ts.map +1 -1
  12. package/dist/agent-operations/move-plan.js +11 -9
  13. package/dist/agent-operations/scene-queries.d.ts +2328 -2327
  14. package/dist/agent-operations/scene-queries.d.ts.map +1 -1
  15. package/dist/agent-operations/verify-scene.d.ts.map +1 -1
  16. package/dist/agent-operations/verify-scene.js +4 -2
  17. package/dist/agent-operations/wall-object-observations.d.ts.map +1 -1
  18. package/dist/agent-operations/wall-object-observations.js +1 -1
  19. package/dist/agent-tools/wall-openings.js +2 -2
  20. package/dist/building/__fixtures__/wall-opening-cases.d.ts +229 -228
  21. package/dist/building/__fixtures__/wall-opening-cases.d.ts.map +1 -1
  22. package/dist/building/level-duplication.d.ts +3681 -3679
  23. package/dist/building/level-duplication.d.ts.map +1 -1
  24. package/dist/building/merge-windows.d.ts.map +1 -1
  25. package/dist/building/merge-windows.js +4 -3
  26. package/dist/building/wall-openings.d.ts +20 -6
  27. package/dist/building/wall-openings.d.ts.map +1 -1
  28. package/dist/building/wall-openings.js +74 -25
  29. package/dist/commands/structure/shared.d.ts +1 -0
  30. package/dist/commands/structure/shared.d.ts.map +1 -1
  31. package/dist/commands/structure/zone-wall-merge.d.ts +2351 -2348
  32. package/dist/commands/structure/zone-wall-merge.d.ts.map +1 -1
  33. package/dist/contracts/reference-inventory.d.ts.map +1 -1
  34. package/dist/contracts/reference-inventory.js +0 -1
  35. package/dist/hooks/spatial-grid/spatial-grid-manager.d.ts +6 -1
  36. package/dist/hooks/spatial-grid/spatial-grid-manager.d.ts.map +1 -1
  37. package/dist/hooks/spatial-grid/spatial-grid-manager.js +30 -9
  38. package/dist/hooks/spatial-grid/spatial-grid-sync.d.ts +3181 -3180
  39. package/dist/hooks/spatial-grid/spatial-grid-sync.d.ts.map +1 -1
  40. package/dist/hooks/spatial-grid/spatial-grid-sync.js +8 -4
  41. package/dist/index.d.ts +11 -4
  42. package/dist/index.d.ts.map +1 -1
  43. package/dist/index.js +11 -4
  44. package/dist/lib/__fixtures__/mezzanine.d.ts +8595 -8591
  45. package/dist/lib/__fixtures__/mezzanine.d.ts.map +1 -1
  46. package/dist/lib/absorb-wall-separators.d.ts +1664 -1663
  47. package/dist/lib/absorb-wall-separators.d.ts.map +1 -1
  48. package/dist/lib/build-mode.d.ts +11 -0
  49. package/dist/lib/build-mode.d.ts.map +1 -0
  50. package/dist/lib/build-mode.js +24 -0
  51. package/dist/lib/corner-pair.d.ts +2 -0
  52. package/dist/lib/corner-pair.d.ts.map +1 -1
  53. package/dist/lib/door-interaction.d.ts +14 -0
  54. package/dist/lib/door-interaction.d.ts.map +1 -0
  55. package/dist/lib/door-interaction.js +62 -0
  56. package/dist/lib/elevator-support.d.ts +15 -0
  57. package/dist/lib/elevator-support.d.ts.map +1 -0
  58. package/dist/lib/elevator-support.js +40 -0
  59. package/dist/lib/floor-intent-changes.d.ts.map +1 -1
  60. package/dist/lib/floor-intent-changes.js +6 -4
  61. package/dist/lib/hierarchy.d.ts +19 -0
  62. package/dist/lib/hierarchy.d.ts.map +1 -0
  63. package/dist/lib/hierarchy.js +53 -0
  64. package/dist/lib/opening-floor-datum.d.ts +1 -1
  65. package/dist/lib/opening-floor-datum.d.ts.map +1 -1
  66. package/dist/lib/opening-floor-datum.js +2 -2
  67. package/dist/lib/own-floor-intent.d.ts.map +1 -1
  68. package/dist/lib/own-floor-intent.js +2 -2
  69. package/dist/lib/polygon-boolean.d.ts.map +1 -1
  70. package/dist/lib/polygon-boolean.js +2 -1
  71. package/dist/lib/room-floor-elevation.d.ts +12 -0
  72. package/dist/lib/room-floor-elevation.d.ts.map +1 -0
  73. package/dist/lib/room-floor-elevation.js +41 -0
  74. package/dist/lib/room-floor-feasibility.d.ts.map +1 -1
  75. package/dist/lib/room-floor-feasibility.js +1 -1
  76. package/dist/lib/space-detection.d.ts.map +1 -1
  77. package/dist/lib/space-detection.js +1 -0
  78. package/dist/lib/wall-face-script.d.ts.map +1 -1
  79. package/dist/lib/wall-face-script.js +3 -3
  80. package/dist/lib/window-interaction.d.ts +16 -0
  81. package/dist/lib/window-interaction.d.ts.map +1 -0
  82. package/dist/lib/window-interaction.js +82 -0
  83. package/dist/lib/zone-quantities.js +1 -1
  84. package/dist/node-slots/column.d.ts +5 -0
  85. package/dist/node-slots/column.d.ts.map +1 -1
  86. package/dist/node-slots/column.js +10 -0
  87. package/dist/registry/index.d.ts +1 -1
  88. package/dist/registry/index.d.ts.map +1 -1
  89. package/dist/registry/index.js +1 -1
  90. package/dist/registry/registry.d.ts +5 -0
  91. package/dist/registry/registry.d.ts.map +1 -1
  92. package/dist/registry/registry.js +10 -0
  93. package/dist/registry/types.d.ts +24 -0
  94. package/dist/registry/types.d.ts.map +1 -1
  95. package/dist/schema/index.d.ts +1 -1
  96. package/dist/schema/index.d.ts.map +1 -1
  97. package/dist/schema/index.js +1 -1
  98. package/dist/schema/nodes/roof-segment-resize.d.ts.map +1 -1
  99. package/dist/schema/nodes/roof-segment-resize.js +2 -2
  100. package/dist/schema/nodes/roof-segment.d.ts +2 -0
  101. package/dist/schema/nodes/roof-segment.d.ts.map +1 -1
  102. package/dist/schema/nodes/roof-segment.js +40 -2
  103. package/dist/schema/nodes/wall.d.ts +1 -0
  104. package/dist/schema/nodes/wall.d.ts.map +1 -1
  105. package/dist/schema/nodes/wall.js +6 -0
  106. package/dist/schema/types.d.ts +1 -0
  107. package/dist/schema/types.d.ts.map +1 -1
  108. package/dist/services/index.d.ts +1 -1
  109. package/dist/services/index.d.ts.map +1 -1
  110. package/dist/services/index.js +1 -1
  111. package/dist/services/movement.d.ts +7 -0
  112. package/dist/services/movement.d.ts.map +1 -1
  113. package/dist/services/movement.js +13 -0
  114. package/dist/services/port-connectivity.d.ts +15 -6
  115. package/dist/services/port-connectivity.d.ts.map +1 -1
  116. package/dist/services/port-connectivity.js +83 -17
  117. package/dist/services/roof-bearing.js +2 -1
  118. package/dist/services/storey.d.ts +6 -1
  119. package/dist/services/storey.d.ts.map +1 -1
  120. package/dist/services/storey.js +11 -2
  121. package/dist/spatial/usage-field/swings.d.ts +1 -0
  122. package/dist/spatial/usage-field/swings.d.ts.map +1 -1
  123. package/dist/spatial/usage-field/walls.d.ts +2 -0
  124. package/dist/spatial/usage-field/walls.d.ts.map +1 -1
  125. package/dist/spatial/usage-field/walls.js +18 -4
  126. package/dist/store/actions/node-actions.d.ts +1614 -1613
  127. package/dist/store/actions/node-actions.d.ts.map +1 -1
  128. package/dist/store/actions/node-actions.js +23 -5
  129. package/dist/store/derived-node-guard.d.ts.map +1 -1
  130. package/dist/store/derived-node-guard.js +2 -1
  131. package/dist/store/scene-annotations.d.ts +5033 -5031
  132. package/dist/store/scene-annotations.d.ts.map +1 -1
  133. package/dist/systems/elevator/elevator-geometry.d.ts +25 -0
  134. package/dist/systems/elevator/elevator-geometry.d.ts.map +1 -1
  135. package/dist/systems/elevator/elevator-geometry.js +40 -8
  136. package/dist/systems/elevator/elevator-opening-sync.d.ts.map +1 -1
  137. package/dist/systems/elevator/elevator-opening-sync.js +4 -35
  138. package/dist/systems/elevator/elevator-runtime.d.ts.map +1 -1
  139. package/dist/systems/elevator/elevator-runtime.js +95 -18
  140. package/dist/systems/elevator/elevator-service.d.ts.map +1 -1
  141. package/dist/systems/elevator/elevator-service.js +24 -4
  142. package/dist/systems/roof/roof-elevation.d.ts.map +1 -1
  143. package/dist/systems/roof/roof-elevation.js +2 -1
  144. package/dist/systems/slab/__fixtures__/floor-step.d.ts +1614 -1610
  145. package/dist/systems/slab/__fixtures__/floor-step.d.ts.map +1 -1
  146. package/dist/systems/slab/__fixtures__/raised-room.d.ts +2924 -2920
  147. package/dist/systems/slab/__fixtures__/raised-room.d.ts.map +1 -1
  148. package/dist/systems/stair/stair-opening-preview.d.ts +1147 -1146
  149. package/dist/systems/stair/stair-opening-preview.d.ts.map +1 -1
  150. package/dist/systems/wall/wall-curve.d.ts +10 -0
  151. package/dist/systems/wall/wall-curve.d.ts.map +1 -1
  152. package/dist/systems/wall/wall-curve.js +38 -0
  153. package/dist/systems/wall/wall-frame.d.ts.map +1 -1
  154. package/dist/systems/wall/wall-frame.js +8 -0
  155. package/dist/systems/wall/wall-merge.d.ts +9 -1
  156. package/dist/systems/wall/wall-merge.d.ts.map +1 -1
  157. package/dist/systems/wall/wall-merge.js +38 -6
  158. package/dist/systems/wall/wall-top.d.ts +10 -3
  159. package/dist/systems/wall/wall-top.d.ts.map +1 -1
  160. package/dist/systems/wall/wall-top.js +24 -8
  161. package/dist/systems/wall/wall-topology.d.ts.map +1 -1
  162. package/dist/systems/wall/wall-topology.js +19 -1
  163. package/dist/utils/ensure-scene-openings.d.ts +4354 -4352
  164. package/dist/utils/ensure-scene-openings.d.ts.map +1 -1
  165. package/dist/utils/floor-plate-migration.d.ts +1664 -1663
  166. package/dist/utils/floor-plate-migration.d.ts.map +1 -1
  167. package/dist/utils/measurement-format.d.ts +27 -0
  168. package/dist/utils/measurement-format.d.ts.map +1 -0
  169. package/dist/utils/measurement-format.js +143 -0
  170. package/dist/utils/owned-floor-opening-migration.d.ts +1147 -1146
  171. package/dist/utils/owned-floor-opening-migration.d.ts.map +1 -1
  172. package/dist/utils/reconcile-structure-on-load.d.ts +439 -438
  173. package/dist/utils/reconcile-structure-on-load.d.ts.map +1 -1
  174. package/dist/validation/validate-build-json.d.ts.map +1 -1
  175. package/dist/validation/validate-build-json.js +3 -1
  176. package/package.json +1 -1
@@ -110,54 +110,126 @@ export declare function planSceneNodeChanges(snapshot: Pick<SceneState, 'nodes'
110
110
  fromIds: string[];
111
111
  } | undefined;
112
112
  } | undefined;
113
- id: `elevator_${string}`;
114
- material?: {
115
- id?: string | undefined;
116
- preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
117
- properties?: {
118
- color: string;
119
- roughness: number;
120
- metalness: number;
121
- opacity: number;
122
- transparent: boolean;
123
- side: "back" | "double" | "front";
113
+ id: `block_${string}`;
114
+ children: string[];
115
+ position: [number, number, number];
116
+ rotation: number;
117
+ supportSlabId?: string | undefined;
118
+ topology: {
119
+ vertices: {
120
+ id: string;
121
+ position: [number, number, number];
122
+ }[];
123
+ edges: {
124
+ id: string;
125
+ vertexIds: [string, string];
126
+ }[];
127
+ faces: {
128
+ id: string;
129
+ vertexIds: string[];
130
+ materialSlot: string;
131
+ }[];
132
+ };
133
+ slots: Record<string, string>;
134
+ slotNames: Record<string, string>;
135
+ type: "block";
136
+ } | {
137
+ object: "node";
138
+ name?: string | undefined;
139
+ parentId: string | null;
140
+ visible: boolean;
141
+ camera?: {
142
+ position: [number, number, number];
143
+ target: [number, number, number];
144
+ mode: "orthographic" | "perspective";
145
+ fov?: number | undefined;
146
+ zoom?: number | undefined;
147
+ } | undefined;
148
+ metadata: Record<string, unknown>;
149
+ provenance?: {
150
+ refs: {
151
+ ns?: string | undefined;
152
+ id: string;
153
+ role?: "absorbed" | "alias" | "derived" | "piece" | "primary" | undefined;
154
+ }[];
155
+ lineage?: {
156
+ op: "attach" | "convert" | "duplicate" | "import" | "make-independent" | "merge" | "promote" | "split";
157
+ fromIds: string[];
124
158
  } | undefined;
125
- texture?: {
126
- url: string;
127
- repeat?: [number, number] | undefined;
128
- scale?: number | undefined;
129
- offset?: [number, number] | undefined;
130
- normalMap?: string | undefined;
131
- normalScale?: number | undefined;
132
- bumpMap?: string | undefined;
133
- bumpScale?: number | undefined;
159
+ } | undefined;
160
+ id: `construction-dimension_${string}`;
161
+ anchors: ({
162
+ kind: "feature";
163
+ reference: {
164
+ nodeId: string;
165
+ featureId: string;
166
+ parameters?: Record<string, string | number | boolean> | undefined;
167
+ };
168
+ fallback: [number, number, number];
169
+ } | [number, number, number])[];
170
+ baseline: {
171
+ origin: [number, number];
172
+ direction: [number, number];
173
+ };
174
+ chainMode: "continuous" | "point-to-point";
175
+ mode: "angular" | "arc-length" | "center-mark" | "chord" | "coordinate" | "diameter" | "linear" | "radius";
176
+ featureCount: number;
177
+ showCenterMark: boolean;
178
+ prefix: string;
179
+ suffix: string;
180
+ textOverride: string | null;
181
+ datumPolicy: "centerline" | "finish-face" | "structural-face" | "wall-face";
182
+ terminator: "architectural-tick" | "dot" | "filled-arrow" | "open-arrow";
183
+ textPosition: "above" | "centered";
184
+ imperialPrecision: "1" | "1/16" | "1/2" | "1/4" | "1/8";
185
+ metricNotation: "meters" | "millimeters";
186
+ extensionStartGap: number;
187
+ extensionOvershoot: number;
188
+ drawingType: "floor-plan" | "foundation-plan" | "reflected-ceiling-plan" | "roof-plan" | "site-plan";
189
+ drawingOverrides: {
190
+ drawingType: "floor-plan" | "foundation-plan" | "reflected-ceiling-plan" | "roof-plan" | "site-plan";
191
+ presentation: "controlled" | "omit" | "shown";
192
+ suppressedSegmentIndexes: number[];
193
+ }[];
194
+ controllingDimensionId: `construction-dimension_${string}` | null;
195
+ type: "construction-dimension";
196
+ } | {
197
+ object: "node";
198
+ name?: string | undefined;
199
+ parentId: string | null;
200
+ visible: boolean;
201
+ camera?: {
202
+ position: [number, number, number];
203
+ target: [number, number, number];
204
+ mode: "orthographic" | "perspective";
205
+ fov?: number | undefined;
206
+ zoom?: number | undefined;
207
+ } | undefined;
208
+ metadata: Record<string, unknown>;
209
+ provenance?: {
210
+ refs: {
211
+ ns?: string | undefined;
212
+ id: string;
213
+ role?: "absorbed" | "alias" | "derived" | "piece" | "primary" | undefined;
214
+ }[];
215
+ lineage?: {
216
+ op: "attach" | "convert" | "duplicate" | "import" | "make-independent" | "merge" | "promote" | "split";
217
+ fromIds: string[];
134
218
  } | undefined;
135
219
  } | undefined;
136
- materialPreset?: string | undefined;
137
- slots?: Record<string, string> | undefined;
220
+ id: `duct-terminal_${string}`;
138
221
  position: [number, number, number];
139
222
  rotation: number;
223
+ supportSlabId?: string | undefined;
224
+ terminalType: "diffuser" | "return-grille" | "supply-register";
225
+ mount: "ceiling" | "floor" | "wall";
140
226
  width: number;
141
227
  depth: number;
142
- shaftWidth?: number | undefined;
143
- shaftDepth?: number | undefined;
144
- shaftWallThickness: number;
145
- shaftStyle: "glass" | "solid";
146
- cabHeight: number;
147
- doorWidth: number;
148
- doorHeight: number;
149
- doorStyle: "center-opening" | "single-left" | "single-right";
150
- doorPanelStyle: "glass-frame" | "segmented-panel" | "solid-panel";
151
- fromLevelId: string | null;
152
- toLevelId: string | null;
153
- servedLevelIds?: string[] | undefined;
154
- disabledLevelIds: string[];
155
- serviceOnlyLevelIds: string[];
156
- defaultLevelId: string | null;
157
- speed: number;
158
- doorDurationMs: number;
159
- dwellMs: number;
160
- type: "elevator";
228
+ collarShape: "oval" | "rect" | "round";
229
+ collarDiameter: number;
230
+ collarWidth: number;
231
+ collarHeight: number;
232
+ type: "duct-terminal";
161
233
  } | {
162
234
  object: "node";
163
235
  name?: string | undefined;
@@ -182,205 +254,51 @@ export declare function planSceneNodeChanges(snapshot: Pick<SceneState, 'nodes'
182
254
  fromIds: string[];
183
255
  } | undefined;
184
256
  } | undefined;
185
- type: "item";
186
- id: `item_${string}`;
257
+ id: `guide_${string}`;
258
+ url: string;
187
259
  position: [number, number, number];
188
260
  rotation: [number, number, number];
189
- scale: [number, number, number];
190
- side?: "back" | "front" | undefined;
191
- children: string[];
192
- wallId?: string | undefined;
193
- wallT?: number | undefined;
194
- roofSegmentId?: string | undefined;
195
- roofFace?: "back" | "front" | "left" | "right" | undefined;
196
- blockFaceId?: string | undefined;
197
- supportSlabId?: string | undefined;
198
- collectionIds?: `collection_${string}`[] | undefined;
199
- slots?: Record<string, string> | undefined;
200
- source?: {
201
- kind: "script";
202
- meta?: {
203
- description?: string | undefined;
204
- category?: string | undefined;
205
- tags?: string[] | undefined;
206
- parent?: string | undefined;
207
- } | undefined;
208
- language: "bpy" | "three";
209
- script: string;
210
- params: Record<string, string | number | boolean>;
211
- artifact: string;
212
- manifest: {
213
- bounds: {
214
- min: [number, number, number];
215
- max: [number, number, number];
216
- };
217
- params: {
218
- id: string;
219
- label?: string | undefined;
220
- kind: "boolean" | "number" | "string";
221
- default: string | number | boolean;
222
- min?: number | undefined;
223
- max?: number | undefined;
224
- step?: number | undefined;
225
- unit?: string | undefined;
226
- options?: string[] | undefined;
227
- }[];
228
- parts: {
229
- id: string;
230
- label?: string | undefined;
231
- type?: string | undefined;
232
- bounds?: {
233
- min: [number, number, number];
234
- max: [number, number, number];
235
- } | undefined;
236
- }[];
237
- surfaces: {
238
- part?: string | undefined;
239
- y: number;
240
- polygon: [number, number][];
241
- }[];
242
- slots: {
243
- id: string;
244
- label?: string | undefined;
245
- color?: string | undefined;
246
- roughness?: number | undefined;
247
- metalness?: number | undefined;
248
- transparent?: boolean | undefined;
249
- emissive?: boolean | undefined;
250
- }[];
251
- anchors: {
252
- id: string;
253
- position: [number, number, number];
254
- normal?: [number, number, number] | undefined;
255
- }[];
256
- lights: {
257
- id: string;
258
- position: [number, number, number];
259
- color: string;
260
- intensity: number;
261
- distance?: number | undefined;
262
- spot?: {
263
- direction: [number, number, number];
264
- angle: number;
265
- softness: number;
266
- } | undefined;
267
- shadows?: boolean | undefined;
268
- glow?: {
269
- size: number;
270
- strength: number;
271
- } | undefined;
272
- }[];
273
- undersides: {
274
- part?: string | undefined;
275
- polygon: [number, number][];
276
- plane: [number, number, number, number];
277
- }[];
278
- animations: {
279
- name: string;
280
- duration: number;
281
- }[];
282
- cutters?: {
283
- host: "ceiling" | "mounted" | "slab" | "wall";
284
- polygon: number[][];
285
- minY: number;
286
- maxY: number;
287
- }[] | undefined;
288
- cutout: boolean;
289
- collider: boolean;
290
- shape?: {
291
- tolerance: number;
292
- bands: {
293
- y0: number;
294
- y1: number;
295
- polygons: {
296
- outer: [number, number][];
297
- holes?: [number, number][][] | undefined;
298
- }[];
299
- }[];
300
- } | undefined;
301
- triangles: number;
302
- coverage?: number | undefined;
303
- uncovered?: {
304
- min: [number, number];
305
- max: [number, number];
306
- }[] | undefined;
307
- };
308
- images?: {
309
- artifact: string;
310
- thumbnail: string;
311
- floorPlan: string;
261
+ scale: number;
262
+ opacity: number;
263
+ scaleReference: {
264
+ start: [number, number];
265
+ end: [number, number];
266
+ realLengthMeters: number;
267
+ measuredLengthUnits: number;
268
+ metersPerUnit: number;
269
+ displayLength?: number | undefined;
270
+ displayUnit?: "centimeters" | "feet" | "inches" | "meters" | undefined;
271
+ label: string;
272
+ } | null;
273
+ type: "guide";
274
+ } | {
275
+ object: "node";
276
+ name?: string | undefined;
277
+ parentId: string | null;
278
+ visible: boolean;
279
+ camera?: {
280
+ position: [number, number, number];
281
+ target: [number, number, number];
282
+ mode: "orthographic" | "perspective";
283
+ fov?: number | undefined;
284
+ zoom?: number | undefined;
285
+ } | undefined;
286
+ metadata: Record<string, unknown>;
287
+ provenance?: {
288
+ refs: {
289
+ ns?: string | undefined;
290
+ id: string;
291
+ role?: "absorbed" | "alias" | "derived" | "piece" | "primary" | undefined;
292
+ }[];
293
+ lineage?: {
294
+ op: "attach" | "convert" | "duplicate" | "import" | "make-independent" | "merge" | "promote" | "split";
295
+ fromIds: string[];
312
296
  } | undefined;
313
297
  } | undefined;
314
- asset: {
315
- id: string;
316
- category: string;
317
- name: string;
318
- thumbnail: string;
319
- floorPlanUrl?: string | undefined;
320
- source: "community" | "library" | "mine";
321
- isDraft?: boolean | undefined;
322
- src: string;
323
- dimensions: [number, number, number];
324
- attachTo?: "ceiling" | "wall" | "wall-side" | undefined;
325
- recessed?: boolean | undefined;
326
- tags?: string[] | undefined;
327
- functionTags?: string[] | undefined;
328
- offset: [number, number, number];
329
- rotation: [number, number, number];
330
- scale: [number, number, number];
331
- surface?: {
332
- height: number;
333
- } | undefined;
334
- interactive?: {
335
- controls: ({
336
- kind: "toggle";
337
- label?: string | undefined;
338
- default?: boolean | undefined;
339
- } | {
340
- kind: "slider";
341
- label: string;
342
- min: number;
343
- max: number;
344
- step: number;
345
- unit?: string | undefined;
346
- displayMode: "dial" | "slider" | "stepper";
347
- default?: number | undefined;
348
- } | {
349
- kind: "temperature";
350
- label: string;
351
- min: number;
352
- max: number;
353
- unit: "C" | "F";
354
- default?: number | undefined;
355
- })[];
356
- effects: ({
357
- kind: "animation";
358
- mode?: "ambient" | "open-close" | undefined;
359
- control?: number | undefined;
360
- clips: {
361
- on?: string | undefined;
362
- off?: string | undefined;
363
- loop?: string | undefined;
364
- };
365
- } | {
366
- kind: "light";
367
- color: string;
368
- intensityRange: [number, number];
369
- distance?: number | undefined;
370
- offset: [number, number, number];
371
- spot?: {
372
- direction: [number, number, number];
373
- angle: number;
374
- softness: number;
375
- } | undefined;
376
- shadows?: boolean | undefined;
377
- glow?: {
378
- size: number;
379
- strength: number;
380
- } | undefined;
381
- })[];
382
- } | undefined;
383
- };
298
+ id: `liquid-line_${string}`;
299
+ path: [number, number, number][];
300
+ diameter: number;
301
+ type: "liquid-line";
384
302
  } | {
385
303
  object: "node";
386
304
  name?: string | undefined;
@@ -405,8 +323,7 @@ export declare function planSceneNodeChanges(snapshot: Pick<SceneState, 'nodes'
405
323
  fromIds: string[];
406
324
  } | undefined;
407
325
  } | undefined;
408
- id: `ceiling_${string}`;
409
- children: (`item_${string}` | `procedural-item_${string}`)[];
326
+ id: `rseg_${string}`;
410
327
  material?: {
411
328
  id?: string | undefined;
412
329
  preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
@@ -430,325 +347,302 @@ export declare function planSceneNodeChanges(snapshot: Pick<SceneState, 'nodes'
430
347
  } | undefined;
431
348
  } | undefined;
432
349
  materialPreset?: string | undefined;
433
- slots?: Record<string, string> | undefined;
434
- polygon: [number, number][];
435
- holes: [number, number][][];
436
- holeMetadata: {
437
- source: "elevator" | "floor-opening" | "manual" | "room" | "stair";
438
- openingId?: string | undefined;
439
- stairId?: string | undefined;
440
- elevatorId?: string | undefined;
441
- }[];
442
- openingIds?: string[] | undefined;
443
- height?: number | undefined;
444
- buildUp?: {
445
- presetId?: string | undefined;
446
- finish?: {
447
- kind: "drywall" | "plaster" | "wood-plank";
448
- thickness: number;
449
- name?: string | undefined;
350
+ topMaterial?: {
351
+ id?: string | undefined;
352
+ preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
353
+ properties?: {
354
+ color: string;
355
+ roughness: number;
356
+ metalness: number;
357
+ opacity: number;
358
+ transparent: boolean;
359
+ side: "back" | "double" | "front";
450
360
  } | undefined;
451
- framing?: {
452
- system: "joists" | "truss-chords";
453
- size: "2x10" | "2x12" | "2x4" | "2x6" | "2x8";
454
- spacing: number;
361
+ texture?: {
362
+ url: string;
363
+ repeat?: [number, number] | undefined;
364
+ scale?: number | undefined;
365
+ offset?: [number, number] | undefined;
366
+ normalMap?: string | undefined;
367
+ normalScale?: number | undefined;
368
+ bumpMap?: string | undefined;
369
+ bumpScale?: number | undefined;
455
370
  } | undefined;
456
- decking?: {
457
- kind: "osb" | "plywood";
458
- thickness: number;
459
- name?: string | undefined;
371
+ } | undefined;
372
+ topMaterialPreset?: string | undefined;
373
+ edgeMaterial?: {
374
+ id?: string | undefined;
375
+ preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
376
+ properties?: {
377
+ color: string;
378
+ roughness: number;
379
+ metalness: number;
380
+ opacity: number;
381
+ transparent: boolean;
382
+ side: "back" | "double" | "front";
460
383
  } | undefined;
461
- insulation?: {
462
- kind: "batt" | "blown" | "rigid";
463
- thickness: number;
464
- name?: string | undefined;
384
+ texture?: {
385
+ url: string;
386
+ repeat?: [number, number] | undefined;
387
+ scale?: number | undefined;
388
+ offset?: [number, number] | undefined;
389
+ normalMap?: string | undefined;
390
+ normalScale?: number | undefined;
391
+ bumpMap?: string | undefined;
392
+ bumpScale?: number | undefined;
465
393
  } | undefined;
466
394
  } | undefined;
467
- regions?: {
468
- id: string;
469
- polygon: [number, number][];
470
- finish: string | Record<string, unknown>;
471
- }[] | undefined;
472
- boundary?: "auto" | undefined;
473
- zoneId?: string | undefined;
474
- autoFromWalls: boolean;
475
- type: "ceiling";
476
- } | {
477
- object: "node";
478
- name?: string | undefined;
479
- parentId: string | null;
480
- visible: boolean;
481
- camera?: {
482
- position: [number, number, number];
483
- target: [number, number, number];
484
- mode: "orthographic" | "perspective";
485
- fov?: number | undefined;
486
- zoom?: number | undefined;
487
- } | undefined;
488
- metadata: Record<string, unknown>;
489
- provenance?: {
490
- refs: {
491
- ns?: string | undefined;
492
- id: string;
493
- role?: "absorbed" | "alias" | "derived" | "piece" | "primary" | undefined;
494
- }[];
495
- lineage?: {
496
- op: "attach" | "convert" | "duplicate" | "import" | "make-independent" | "merge" | "promote" | "split";
497
- fromIds: string[];
395
+ edgeMaterialPreset?: string | undefined;
396
+ wallMaterial?: {
397
+ id?: string | undefined;
398
+ preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
399
+ properties?: {
400
+ color: string;
401
+ roughness: number;
402
+ metalness: number;
403
+ opacity: number;
404
+ transparent: boolean;
405
+ side: "back" | "double" | "front";
406
+ } | undefined;
407
+ texture?: {
408
+ url: string;
409
+ repeat?: [number, number] | undefined;
410
+ scale?: number | undefined;
411
+ offset?: [number, number] | undefined;
412
+ normalMap?: string | undefined;
413
+ normalScale?: number | undefined;
414
+ bumpMap?: string | undefined;
415
+ bumpScale?: number | undefined;
498
416
  } | undefined;
499
417
  } | undefined;
500
- id: `construction-dimension_${string}`;
501
- anchors: ({
502
- kind: "feature";
503
- reference: {
504
- nodeId: string;
505
- featureId: string;
506
- parameters?: Record<string, string | number | boolean> | undefined;
507
- };
508
- fallback: [number, number, number];
509
- } | [number, number, number])[];
510
- baseline: {
511
- origin: [number, number];
512
- direction: [number, number];
513
- };
514
- chainMode: "continuous" | "point-to-point";
515
- mode: "angular" | "arc-length" | "center-mark" | "chord" | "coordinate" | "diameter" | "linear" | "radius";
516
- featureCount: number;
517
- showCenterMark: boolean;
518
- prefix: string;
519
- suffix: string;
520
- textOverride: string | null;
521
- datumPolicy: "centerline" | "finish-face" | "structural-face" | "wall-face";
522
- terminator: "architectural-tick" | "dot" | "filled-arrow" | "open-arrow";
523
- textPosition: "above" | "centered";
524
- imperialPrecision: "1" | "1/16" | "1/2" | "1/4" | "1/8";
525
- metricNotation: "meters" | "millimeters";
526
- extensionStartGap: number;
527
- extensionOvershoot: number;
528
- drawingType: "floor-plan" | "foundation-plan" | "reflected-ceiling-plan" | "roof-plan" | "site-plan";
529
- drawingOverrides: {
530
- drawingType: "floor-plan" | "foundation-plan" | "reflected-ceiling-plan" | "roof-plan" | "site-plan";
531
- presentation: "controlled" | "omit" | "shown";
532
- suppressedSegmentIndexes: number[];
533
- }[];
534
- controllingDimensionId: `construction-dimension_${string}` | null;
535
- type: "construction-dimension";
536
- } | {
537
- object: "node";
538
- name?: string | undefined;
539
- parentId: string | null;
540
- visible: boolean;
541
- camera?: {
542
- position: [number, number, number];
543
- target: [number, number, number];
544
- mode: "orthographic" | "perspective";
545
- fov?: number | undefined;
546
- zoom?: number | undefined;
547
- } | undefined;
548
- metadata: Record<string, unknown>;
549
- provenance?: {
550
- refs: {
551
- ns?: string | undefined;
552
- id: string;
553
- role?: "absorbed" | "alias" | "derived" | "piece" | "primary" | undefined;
418
+ wallMaterialPreset?: string | undefined;
419
+ position: [number, number, number];
420
+ rotation: number;
421
+ roofType: "barrel" | "conical" | "dutch" | "flat" | "gable" | "gambrel" | "hip" | "mansard" | "shed";
422
+ barrelRise?: number | undefined;
423
+ barrelSegments?: number | undefined;
424
+ roofSystem?: "glazed" | "standard" | undefined;
425
+ glazing?: {
426
+ across: {
427
+ layout: "count" | "fixed-spacing" | "maximum-spacing";
428
+ count: number;
429
+ spacing: number;
430
+ alignment: "center" | "end" | "start";
431
+ };
432
+ along: {
433
+ layout: "count" | "fixed-spacing" | "maximum-spacing";
434
+ count: number;
435
+ spacing: number;
436
+ alignment: "center" | "end" | "start";
437
+ };
438
+ frameWidth: number;
439
+ frameDepth: number;
440
+ glassThickness: number;
441
+ frameColor: string;
442
+ glassColor: string;
443
+ glassOpacity: number;
444
+ glassRoughness: number;
445
+ glazedEnds: boolean;
446
+ panelType: "empty" | "glass" | "solid";
447
+ panels: {
448
+ face: string;
449
+ column: number;
450
+ row: number;
451
+ type: "empty" | "glass" | "solid";
554
452
  }[];
555
- lineage?: {
556
- op: "attach" | "convert" | "duplicate" | "import" | "make-independent" | "merge" | "promote" | "split";
557
- fromIds: string[];
558
- } | undefined;
559
453
  } | undefined;
560
- id: `site_${string}`;
561
- polygon: {
562
- type: "polygon";
563
- points: [number, number][];
454
+ slots?: Record<string, string> | undefined;
455
+ width: number;
456
+ depth: number;
457
+ conicalStartAngle?: number | undefined;
458
+ conicalSweepAngle?: number | undefined;
459
+ conicalFullCircle?: boolean | undefined;
460
+ trim: {
461
+ left: number;
462
+ right: number;
463
+ front: number;
464
+ back: number;
465
+ frontLeft: number;
466
+ frontRight: number;
467
+ backLeft: number;
468
+ backRight: number;
469
+ frontLeftX: number;
470
+ frontLeftZ: number;
471
+ frontRightX: number;
472
+ frontRightZ: number;
473
+ backLeftX: number;
474
+ backLeftZ: number;
475
+ backRightX: number;
476
+ backRightZ: number;
564
477
  };
565
- terrain?: {
566
- type: "heightfield";
567
- origin: [number, number];
568
- spacing: number;
569
- cols: number;
570
- rows: number;
571
- step: number;
572
- heights: string;
573
- } | undefined;
574
- showGround?: boolean | undefined;
575
- presentation?: {
576
- theme?: string | undefined;
577
- exposure?: number | undefined;
578
- shading?: "rendered" | "solid" | undefined;
579
- edges?: "off" | "soft" | "strong" | undefined;
580
- shadows?: boolean | undefined;
581
- lighting?: {
582
- background?: string | undefined;
583
- backgroundSky?: string | null | undefined;
584
- ground?: string | undefined;
585
- ambient?: {
586
- color: string;
587
- intensity: number;
588
- } | undefined;
589
- hemi?: {
590
- sky: string;
591
- ground: string;
592
- intensity: number;
593
- } | undefined;
594
- lights?: {
595
- color: string;
596
- intensity: number;
597
- position: [number, number, number];
598
- target?: [number, number, number] | undefined;
599
- castShadow?: boolean | undefined;
600
- shadow?: {
601
- intensity?: number | undefined;
602
- bias?: number | undefined;
603
- normalBias?: number | undefined;
604
- radius?: number | undefined;
605
- mapSize?: 512 | 1024 | 2048 | 4096 | undefined;
606
- camera?: {
607
- left: number;
608
- right: number;
609
- top: number;
610
- bottom: number;
611
- near: number;
612
- far: number;
613
- } | undefined;
614
- } | undefined;
615
- }[] | undefined;
616
- environment?: {
617
- source: "gradient" | "none" | "room";
618
- intensity: number;
619
- } | undefined;
478
+ wallHeight: number;
479
+ pitch: number;
480
+ wallThickness: number;
481
+ deckThickness: number;
482
+ overhang: number;
483
+ gableOverhang?: number | undefined;
484
+ shingleThickness: number;
485
+ buildUp?: {
486
+ presetId?: string | undefined;
487
+ roofing: {
488
+ kind: "architectural-shingle" | "asphalt-3-tab" | "clay-tile" | "concrete-tile" | "slate" | "standing-seam-metal" | "wood-shake";
489
+ thickness: number;
490
+ name?: string | undefined;
491
+ };
492
+ underlayment?: {
493
+ kind: "felt-15" | "felt-30" | "ice-and-water" | "synthetic";
494
+ thickness: number;
495
+ name?: string | undefined;
620
496
  } | undefined;
621
- postprocessing?: {
622
- ambientOcclusion?: boolean | undefined;
623
- colorGrading?: boolean | undefined;
497
+ sheathing: {
498
+ kind: "osb" | "plywood";
499
+ thickness: number;
500
+ name?: string | undefined;
501
+ };
502
+ structure: {
503
+ system: "rafters" | "trusses";
504
+ size: "2x10" | "2x12" | "2x4" | "2x6" | "2x8";
505
+ spacing: number;
506
+ };
507
+ insulation?: {
508
+ kind: "batt" | "blown" | "rigid";
509
+ thickness: number;
510
+ name?: string | undefined;
624
511
  } | undefined;
625
- display?: {
626
- mode?: "construction" | "finished" | "systems" | undefined;
627
- families?: Partial<Record<"device" | "exposed-structure" | "fill" | "finish" | "foundation" | "framing" | "inspection" | "insulation" | "masonry" | "membrane" | "run" | "service-space" | "sheathing", boolean>> | undefined;
628
- disciplines?: Partial<Record<"electrical" | "fire" | "low-voltage" | "mechanical" | "plumbing", boolean>> | undefined;
629
- xray?: boolean | undefined;
630
- colorBy?: "material" | "service" | undefined;
512
+ finish?: {
513
+ kind: "drywall" | "plaster" | "wood-plank";
514
+ thickness: number;
515
+ name?: string | undefined;
631
516
  } | undefined;
632
517
  } | undefined;
633
- address?: {
634
- street?: string | undefined;
635
- city?: string | undefined;
636
- state?: string | undefined;
637
- zip?: string | undefined;
638
- } | undefined;
639
- parcel?: {
640
- apn?: string | undefined;
641
- source?: string | undefined;
642
- county?: string | undefined;
643
- state?: string | undefined;
644
- lotAreaSqFt?: number | undefined;
645
- originLngLat?: [number, number] | undefined;
646
- resolvedAt?: string | undefined;
647
- layer?: string | undefined;
648
- notes?: string[] | undefined;
518
+ arc?: {
519
+ centerX: number;
520
+ centerZ: number;
521
+ radius: number;
649
522
  } | undefined;
650
- setbacks?: {
651
- front: number;
652
- side: number;
653
- rear: number;
654
- left?: number | undefined;
655
- right?: number | undefined;
656
- streetSide?: number | undefined;
523
+ shedSideInfillSpan?: number | undefined;
524
+ shedSideInfillMinX?: number | undefined;
525
+ shedSideInfillMaxX?: number | undefined;
526
+ shedFootprintPieces?: [number, number][][] | undefined;
527
+ shedOpenEndSides?: ("left" | "right")[] | undefined;
528
+ shedJointFrame?: {
529
+ position: [number, number, number];
530
+ rotation: number;
657
531
  } | undefined;
658
- setbacksSource?: string | undefined;
659
- zone?: string | undefined;
660
- frontEdge?: number | undefined;
661
- streetEdges?: number[] | undefined;
662
- sightTriangleFt?: number | undefined;
663
- northRotation?: number | undefined;
664
- dossier?: {
665
- [x: string]: unknown;
666
- provider: string;
667
- asOf: string;
668
- point?: {
669
- lat?: number | undefined;
670
- lng?: number | undefined;
671
- source?: string | undefined;
532
+ shedJointOwnerId?: string | undefined;
533
+ shedJointNeighborIds?: string[] | undefined;
534
+ shedJointScopeId?: string | undefined;
535
+ managedByParent: boolean;
536
+ wallShell: "auto" | "include" | "omit";
537
+ shedInsetEndPanels: boolean;
538
+ fascia?: boolean | undefined;
539
+ eaveCut?: "plumb" | "plumb-level" | "square" | undefined;
540
+ fasciaHighEdge?: boolean | undefined;
541
+ fasciaHeight?: number | undefined;
542
+ fasciaDepth?: number | undefined;
543
+ fasciaMaterial?: {
544
+ id?: string | undefined;
545
+ preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
546
+ properties?: {
547
+ color: string;
548
+ roughness: number;
549
+ metalness: number;
550
+ opacity: number;
551
+ transparent: boolean;
552
+ side: "back" | "double" | "front";
672
553
  } | undefined;
673
- address?: {
674
- formatted?: string | undefined;
675
- precision?: string | undefined;
554
+ texture?: {
555
+ url: string;
556
+ repeat?: [number, number] | undefined;
557
+ scale?: number | undefined;
558
+ offset?: [number, number] | undefined;
559
+ normalMap?: string | undefined;
560
+ normalScale?: number | undefined;
561
+ bumpMap?: string | undefined;
562
+ bumpScale?: number | undefined;
676
563
  } | undefined;
677
- sections: Record<string, {
678
- [x: string]: unknown;
679
- status: string;
680
- summary?: string | undefined;
681
- reason?: string | undefined;
682
- source?: {
683
- name?: string | undefined;
684
- kind?: string | undefined;
685
- vintage?: string | undefined;
686
- attribution?: string | undefined;
687
- } | undefined;
688
- }>;
689
- parcel?: Record<string, unknown> | undefined;
690
- flood?: Record<string, unknown> | undefined;
691
- codeBasis?: Record<string, unknown> | undefined;
692
- zoning?: Record<string, unknown> | undefined;
693
- utilities?: Record<string, unknown> | undefined;
694
- soils?: Record<string, unknown> | undefined;
695
- wetlands?: Record<string, unknown> | undefined;
696
- structures?: Record<string, unknown> | undefined;
697
- elevation?: Record<string, unknown> | undefined;
698
- boundaries?: Record<string, unknown> | undefined;
699
564
  } | undefined;
700
- contourIntervalIn?: number | undefined;
701
- contours3d?: boolean | undefined;
702
- terrainContours?: {
703
- datum: string;
704
- intervalFt: number;
705
- source?: string | undefined;
706
- lines: {
707
- elevationFt: number;
708
- points: [number, number][];
709
- }[];
565
+ fasciaMaterialPreset?: string | undefined;
566
+ heelMaterial?: {
567
+ id?: string | undefined;
568
+ preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
569
+ properties?: {
570
+ color: string;
571
+ roughness: number;
572
+ metalness: number;
573
+ opacity: number;
574
+ transparent: boolean;
575
+ side: "back" | "double" | "front";
576
+ } | undefined;
577
+ texture?: {
578
+ url: string;
579
+ repeat?: [number, number] | undefined;
580
+ scale?: number | undefined;
581
+ offset?: [number, number] | undefined;
582
+ normalMap?: string | undefined;
583
+ normalScale?: number | undefined;
584
+ bumpMap?: string | undefined;
585
+ bumpScale?: number | undefined;
586
+ } | undefined;
710
587
  } | undefined;
711
- wallTypes?: {
712
- id: string;
713
- label: string;
714
- assembly: {
715
- layers: {
716
- id: string;
717
- role: "air" | "covering" | "deck" | "fill" | "finish" | "furring" | "glazing" | "insulation" | "lining" | "membrane" | "sheathing" | "shell" | "structure" | "substrate" | "underlay";
718
- thickness: number;
719
- core?: true | undefined;
720
- spacing?: number | undefined;
721
- material?: string | undefined;
722
- slot?: string | undefined;
723
- returns?: boolean | undefined;
724
- display?: "construction" | "finished" | undefined;
725
- inset?: number | undefined;
726
- bottom?: number | undefined;
727
- lift?: number | undefined;
728
- src?: string | undefined;
729
- }[];
730
- backing?: {
731
- id: string;
732
- role: "air" | "covering" | "deck" | "fill" | "finish" | "furring" | "glazing" | "insulation" | "lining" | "membrane" | "sheathing" | "shell" | "structure" | "substrate" | "underlay";
733
- thickness: number;
734
- core?: true | undefined;
735
- spacing?: number | undefined;
736
- material?: string | undefined;
737
- slot?: string | undefined;
738
- returns?: boolean | undefined;
739
- display?: "construction" | "finished" | undefined;
740
- inset?: number | undefined;
741
- bottom?: number | undefined;
742
- lift?: number | undefined;
743
- src?: string | undefined;
744
- }[] | undefined;
745
- face?: "exterior" | "front" | undefined;
746
- presetId?: string | undefined;
747
- cavityInsulation?: string | undefined;
748
- };
749
- }[] | undefined;
588
+ heelMaterialPreset?: string | undefined;
589
+ gableLeftMaterial?: {
590
+ id?: string | undefined;
591
+ preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
592
+ properties?: {
593
+ color: string;
594
+ roughness: number;
595
+ metalness: number;
596
+ opacity: number;
597
+ transparent: boolean;
598
+ side: "back" | "double" | "front";
599
+ } | undefined;
600
+ texture?: {
601
+ url: string;
602
+ repeat?: [number, number] | undefined;
603
+ scale?: number | undefined;
604
+ offset?: [number, number] | undefined;
605
+ normalMap?: string | undefined;
606
+ normalScale?: number | undefined;
607
+ bumpMap?: string | undefined;
608
+ bumpScale?: number | undefined;
609
+ } | undefined;
610
+ } | undefined;
611
+ gableLeftMaterialPreset?: string | undefined;
612
+ gableRightMaterial?: {
613
+ id?: string | undefined;
614
+ preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
615
+ properties?: {
616
+ color: string;
617
+ roughness: number;
618
+ metalness: number;
619
+ opacity: number;
620
+ transparent: boolean;
621
+ side: "back" | "double" | "front";
622
+ } | undefined;
623
+ texture?: {
624
+ url: string;
625
+ repeat?: [number, number] | undefined;
626
+ scale?: number | undefined;
627
+ offset?: [number, number] | undefined;
628
+ normalMap?: string | undefined;
629
+ normalScale?: number | undefined;
630
+ bumpMap?: string | undefined;
631
+ bumpScale?: number | undefined;
632
+ } | undefined;
633
+ } | undefined;
634
+ gableRightMaterialPreset?: string | undefined;
635
+ gambrelLowerWidthRatio: number;
636
+ gambrelLowerHeightRatio: number;
637
+ mansardSteepWidthRatio: number;
638
+ mansardSteepHeightRatio: number;
639
+ dutchHipWidthRatio: number;
640
+ dutchHipHeightRatio: number;
641
+ dutchWaistLengthRatio: number;
642
+ dutchGabletRake: number;
643
+ dutchTopRakeThickness: number;
750
644
  children: string[];
751
- type: "site";
645
+ type: "roof-segment";
752
646
  } | {
753
647
  object: "node";
754
648
  name?: string | undefined;
@@ -773,41 +667,175 @@ export declare function planSceneNodeChanges(snapshot: Pick<SceneState, 'nodes'
773
667
  fromIds: string[];
774
668
  } | undefined;
775
669
  } | undefined;
776
- id: `door_${string}`;
777
- material?: {
778
- id?: string | undefined;
779
- preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
780
- properties?: {
781
- color: string;
782
- roughness: number;
783
- metalness: number;
784
- opacity: number;
785
- transparent: boolean;
786
- side: "back" | "double" | "front";
787
- } | undefined;
788
- texture?: {
789
- url: string;
790
- repeat?: [number, number] | undefined;
791
- scale?: number | undefined;
792
- offset?: [number, number] | undefined;
793
- normalMap?: string | undefined;
794
- normalScale?: number | undefined;
795
- bumpMap?: string | undefined;
796
- bumpScale?: number | undefined;
797
- } | undefined;
670
+ id: `separator_${string}`;
671
+ start: [number, number];
672
+ end: [number, number];
673
+ type: "separator";
674
+ } | {
675
+ object: "node";
676
+ name?: string | undefined;
677
+ parentId: string | null;
678
+ visible: boolean;
679
+ camera?: {
680
+ position: [number, number, number];
681
+ target: [number, number, number];
682
+ mode: "orthographic" | "perspective";
683
+ fov?: number | undefined;
684
+ zoom?: number | undefined;
798
685
  } | undefined;
799
- slots?: Record<string, string> | undefined;
800
- source?: {
801
- kind: "script";
802
- meta?: {
803
- description?: string | undefined;
804
- category?: string | undefined;
805
- tags?: string[] | undefined;
806
- parent?: string | undefined;
686
+ metadata: Record<string, unknown>;
687
+ provenance?: {
688
+ refs: {
689
+ ns?: string | undefined;
690
+ id: string;
691
+ role?: "absorbed" | "alias" | "derived" | "piece" | "primary" | undefined;
692
+ }[];
693
+ lineage?: {
694
+ op: "attach" | "convert" | "duplicate" | "import" | "make-independent" | "merge" | "promote" | "split";
695
+ fromIds: string[];
807
696
  } | undefined;
808
- language: "bpy" | "three";
809
- script: string;
810
- params: Record<string, string | number | boolean>;
697
+ } | undefined;
698
+ id: `spawn_${string}`;
699
+ position: [number, number, number];
700
+ rotation: number;
701
+ supportSlabId?: string | undefined;
702
+ type: "spawn";
703
+ } | {
704
+ object: "node";
705
+ name?: string | undefined;
706
+ parentId: string | null;
707
+ visible: boolean;
708
+ camera?: {
709
+ position: [number, number, number];
710
+ target: [number, number, number];
711
+ mode: "orthographic" | "perspective";
712
+ fov?: number | undefined;
713
+ zoom?: number | undefined;
714
+ } | undefined;
715
+ metadata: Record<string, unknown>;
716
+ provenance?: {
717
+ refs: {
718
+ ns?: string | undefined;
719
+ id: string;
720
+ role?: "absorbed" | "alias" | "derived" | "piece" | "primary" | undefined;
721
+ }[];
722
+ lineage?: {
723
+ op: "attach" | "convert" | "duplicate" | "import" | "make-independent" | "merge" | "promote" | "split";
724
+ fromIds: string[];
725
+ } | undefined;
726
+ } | undefined;
727
+ id: `sseg_${string}`;
728
+ material?: {
729
+ id?: string | undefined;
730
+ preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
731
+ properties?: {
732
+ color: string;
733
+ roughness: number;
734
+ metalness: number;
735
+ opacity: number;
736
+ transparent: boolean;
737
+ side: "back" | "double" | "front";
738
+ } | undefined;
739
+ texture?: {
740
+ url: string;
741
+ repeat?: [number, number] | undefined;
742
+ scale?: number | undefined;
743
+ offset?: [number, number] | undefined;
744
+ normalMap?: string | undefined;
745
+ normalScale?: number | undefined;
746
+ bumpMap?: string | undefined;
747
+ bumpScale?: number | undefined;
748
+ } | undefined;
749
+ } | undefined;
750
+ materialPreset?: string | undefined;
751
+ slots?: Record<string, string> | undefined;
752
+ position: [number, number, number];
753
+ rotation: number;
754
+ segmentType: "landing" | "stair";
755
+ width: number;
756
+ length: number;
757
+ height: number;
758
+ stepCount: number;
759
+ attachmentSide: "front" | "left" | "right";
760
+ fillToFloor: boolean;
761
+ construction?: {
762
+ mode: "center-stringer" | "open" | "side-stringers" | "solid" | "waist";
763
+ waistThickness: number;
764
+ treadThickness: number;
765
+ riserThickness: number;
766
+ nosing: number;
767
+ finishThickness: number;
768
+ closedRisers: boolean;
769
+ stringerWidth: number;
770
+ stringerDepth: number;
771
+ } | undefined;
772
+ winder?: {
773
+ turn: "left" | "right";
774
+ innerGap: number;
775
+ walkingLineOffset: number;
776
+ division: "equal-angle" | "equal-going";
777
+ } | undefined;
778
+ thickness: number;
779
+ type: "stair-segment";
780
+ } | {
781
+ object: "node";
782
+ name?: string | undefined;
783
+ parentId: string | null;
784
+ visible: boolean;
785
+ camera?: {
786
+ position: [number, number, number];
787
+ target: [number, number, number];
788
+ mode: "orthographic" | "perspective";
789
+ fov?: number | undefined;
790
+ zoom?: number | undefined;
791
+ } | undefined;
792
+ metadata: Record<string, unknown>;
793
+ provenance?: {
794
+ refs: {
795
+ ns?: string | undefined;
796
+ id: string;
797
+ role?: "absorbed" | "alias" | "derived" | "piece" | "primary" | undefined;
798
+ }[];
799
+ lineage?: {
800
+ op: "attach" | "convert" | "duplicate" | "import" | "make-independent" | "merge" | "promote" | "split";
801
+ fromIds: string[];
802
+ } | undefined;
803
+ } | undefined;
804
+ id: `window_${string}`;
805
+ material?: {
806
+ id?: string | undefined;
807
+ preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
808
+ properties?: {
809
+ color: string;
810
+ roughness: number;
811
+ metalness: number;
812
+ opacity: number;
813
+ transparent: boolean;
814
+ side: "back" | "double" | "front";
815
+ } | undefined;
816
+ texture?: {
817
+ url: string;
818
+ repeat?: [number, number] | undefined;
819
+ scale?: number | undefined;
820
+ offset?: [number, number] | undefined;
821
+ normalMap?: string | undefined;
822
+ normalScale?: number | undefined;
823
+ bumpMap?: string | undefined;
824
+ bumpScale?: number | undefined;
825
+ } | undefined;
826
+ } | undefined;
827
+ slots?: Record<string, string> | undefined;
828
+ source?: {
829
+ kind: "script";
830
+ meta?: {
831
+ description?: string | undefined;
832
+ category?: string | undefined;
833
+ tags?: string[] | undefined;
834
+ parent?: string | undefined;
835
+ } | undefined;
836
+ language: "bpy" | "three";
837
+ script: string;
838
+ params: Record<string, string | number | boolean>;
811
839
  artifact: string;
812
840
  manifest: {
813
841
  bounds: {
@@ -917,14 +945,12 @@ export declare function planSceneNodeChanges(snapshot: Pick<SceneState, 'nodes'
917
945
  verticalAnchor?: "floor" | "wall" | undefined;
918
946
  floorThresholdVersion: 0 | 1;
919
947
  wallId?: string | undefined;
948
+ dormerId?: string | undefined;
949
+ dormerFace?: "back" | "front" | "left" | "right" | undefined;
920
950
  roofSegmentId?: string | undefined;
921
951
  roofFace?: "back" | "front" | "left" | "right" | undefined;
922
952
  width: number;
923
953
  height: number;
924
- sidelightLeft?: number | undefined;
925
- sidelightRight?: number | undefined;
926
- transomHeight?: number | undefined;
927
- slidingStyle?: "bypass" | "patio" | undefined;
928
954
  mark?: string | undefined;
929
955
  constructionType: "framed" | "masonry";
930
956
  dimensionReference: "finish-opening" | "masonry-opening" | "nominal" | "rough-opening";
@@ -934,49 +960,52 @@ export declare function planSceneNodeChanges(snapshot: Pick<SceneState, 'nodes'
934
960
  masonryOpeningHeight?: number | undefined;
935
961
  finishOpeningWidth?: number | undefined;
936
962
  finishOpeningHeight?: number | undefined;
937
- doorCategory: "garage" | "interior";
938
- doorType: "barn" | "double" | "folding" | "french" | "garage-rollup" | "garage-sectional" | "garage-tiltup" | "hinged" | "pocket" | "sliding";
939
- leafCount: 1 | 2 | 3 | 4 | 6 | 8;
963
+ openingKind: "opening" | "window";
964
+ windowType: "awning" | "bay" | "bow" | "casement" | "double-hung" | "fixed" | "hopper" | "louvered" | "single-hung" | "sliding" | "tilt-turn";
940
965
  operationState: number;
941
- slideDirection: "left" | "right";
942
- trackStyle: "none" | "overhead" | "pocket" | "visible";
943
- garagePanelCount: number;
944
- openingKind: "door" | "opening";
966
+ openingDirection?: "inward" | "outward" | undefined;
967
+ tiltTurnMode?: "tilt" | "turn" | undefined;
968
+ awningDirection: "down" | "up";
969
+ casementStyle: "french" | "single";
970
+ hingesSide: "left" | "right";
945
971
  openingShape: "arch" | "rectangle" | "rounded";
946
972
  openingRadiusMode: "all" | "individual";
947
- openingTopRadii: [number, number];
973
+ openingCornerRadii: [number, number, number, number];
948
974
  cornerRadius: number;
949
975
  archHeight: number;
950
976
  openingRevealRadius: number;
951
977
  frameThickness: number;
952
978
  frameDepth?: number | undefined;
953
- threshold: boolean;
954
- thresholdHeight: number;
979
+ windowHandle?: boolean | undefined;
980
+ sashGrid?: boolean | undefined;
981
+ columnRatios: number[];
982
+ rowRatios: number[];
983
+ columnDividerThickness: number;
984
+ rowDividerThickness: number;
985
+ corner?: {
986
+ end: "end" | "start";
987
+ partnerId: string;
988
+ post: "none" | "post";
989
+ } | undefined;
990
+ sill: boolean;
991
+ sillDepth: number;
992
+ sillThickness: number;
993
+ sillOverhang?: number | undefined;
994
+ sillInterior?: boolean | undefined;
995
+ sillInteriorDepth?: number | undefined;
996
+ sillInteriorThickness?: number | undefined;
997
+ sillInteriorOverhang?: number | undefined;
998
+ shutters?: "board-batten" | "louvered" | "none" | "panel" | undefined;
999
+ shutterWidth?: number | undefined;
1000
+ shutterOpen?: number | undefined;
1001
+ shutterSides?: "both" | "left" | "right" | undefined;
1002
+ rollerShutter?: "box" | "concealed" | "none" | undefined;
1003
+ rollerShutterBoxHeight?: number | undefined;
1004
+ rollerShutterOpen?: number | undefined;
955
1005
  casingFaceA?: boolean | undefined;
956
1006
  casingFaceB?: boolean | undefined;
957
1007
  casingWidth?: number | undefined;
958
- hingesSide: "left" | "right";
959
- swingDirection: "inward" | "outward";
960
- swingAngle: number;
961
- segments: {
962
- type: "empty" | "glass" | "panel";
963
- heightRatio: number;
964
- columnRatios: number[];
965
- dividerThickness: number;
966
- panelDepth: number;
967
- panelInset: number;
968
- }[];
969
- handle: boolean;
970
- handleStyle?: "bar" | "knob" | "lever" | "lever-curved" | "plate" | undefined;
971
- handleHeight: number;
972
- handleSide: "left" | "right";
973
- contentPadding: [number, number];
974
- doorCloser: boolean;
975
- panicBar: boolean;
976
- panicBarStyle: "crossbar" | "touchbar";
977
- panicBarRods: boolean;
978
- panicBarHeight: number;
979
- type: "door";
1008
+ type: "window";
980
1009
  } | {
981
1010
  object: "node";
982
1011
  name?: string | undefined;
@@ -1001,29 +1030,20 @@ export declare function planSceneNodeChanges(snapshot: Pick<SceneState, 'nodes'
1001
1030
  fromIds: string[];
1002
1031
  } | undefined;
1003
1032
  } | undefined;
1004
- id: `window_${string}`;
1005
- material?: {
1006
- id?: string | undefined;
1007
- preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
1008
- properties?: {
1009
- color: string;
1010
- roughness: number;
1011
- metalness: number;
1012
- opacity: number;
1013
- transparent: boolean;
1014
- side: "back" | "double" | "front";
1015
- } | undefined;
1016
- texture?: {
1017
- url: string;
1018
- repeat?: [number, number] | undefined;
1019
- scale?: number | undefined;
1020
- offset?: [number, number] | undefined;
1021
- normalMap?: string | undefined;
1022
- normalScale?: number | undefined;
1023
- bumpMap?: string | undefined;
1024
- bumpScale?: number | undefined;
1025
- } | undefined;
1026
- } | undefined;
1033
+ type: "item";
1034
+ id: `item_${string}`;
1035
+ position: [number, number, number];
1036
+ rotation: [number, number, number];
1037
+ scale: [number, number, number];
1038
+ side?: "back" | "front" | undefined;
1039
+ children: string[];
1040
+ wallId?: string | undefined;
1041
+ wallT?: number | undefined;
1042
+ roofSegmentId?: string | undefined;
1043
+ roofFace?: "back" | "front" | "left" | "right" | undefined;
1044
+ blockFaceId?: string | undefined;
1045
+ supportSlabId?: string | undefined;
1046
+ collectionIds?: `collection_${string}`[] | undefined;
1027
1047
  slots?: Record<string, string> | undefined;
1028
1048
  source?: {
1029
1049
  kind: "script";
@@ -1139,73 +1159,76 @@ export declare function planSceneNodeChanges(snapshot: Pick<SceneState, 'nodes'
1139
1159
  floorPlan: string;
1140
1160
  } | undefined;
1141
1161
  } | undefined;
1142
- position: [number, number, number];
1143
- rotation: [number, number, number];
1144
- side?: "back" | "front" | undefined;
1145
- verticalAnchor?: "floor" | "wall" | undefined;
1146
- floorThresholdVersion: 0 | 1;
1147
- wallId?: string | undefined;
1148
- dormerId?: string | undefined;
1149
- dormerFace?: "back" | "front" | "left" | "right" | undefined;
1150
- roofSegmentId?: string | undefined;
1151
- roofFace?: "back" | "front" | "left" | "right" | undefined;
1152
- width: number;
1153
- height: number;
1154
- mark?: string | undefined;
1155
- constructionType: "framed" | "masonry";
1156
- dimensionReference: "finish-opening" | "masonry-opening" | "nominal" | "rough-opening";
1157
- roughOpeningWidth?: number | undefined;
1158
- roughOpeningHeight?: number | undefined;
1159
- masonryOpeningWidth?: number | undefined;
1160
- masonryOpeningHeight?: number | undefined;
1161
- finishOpeningWidth?: number | undefined;
1162
- finishOpeningHeight?: number | undefined;
1163
- openingKind: "opening" | "window";
1164
- windowType: "awning" | "bay" | "bow" | "casement" | "double-hung" | "fixed" | "hopper" | "louvered" | "single-hung" | "sliding" | "tilt-turn";
1165
- operationState: number;
1166
- openingDirection?: "inward" | "outward" | undefined;
1167
- tiltTurnMode?: "tilt" | "turn" | undefined;
1168
- awningDirection: "down" | "up";
1169
- casementStyle: "french" | "single";
1170
- hingesSide: "left" | "right";
1171
- openingShape: "arch" | "rectangle" | "rounded";
1172
- openingRadiusMode: "all" | "individual";
1173
- openingCornerRadii: [number, number, number, number];
1174
- cornerRadius: number;
1175
- archHeight: number;
1176
- openingRevealRadius: number;
1177
- frameThickness: number;
1178
- frameDepth?: number | undefined;
1179
- windowHandle?: boolean | undefined;
1180
- sashGrid?: boolean | undefined;
1181
- columnRatios: number[];
1182
- rowRatios: number[];
1183
- columnDividerThickness: number;
1184
- rowDividerThickness: number;
1185
- corner?: {
1186
- end: "end" | "start";
1187
- partnerId: string;
1188
- post: "none" | "post";
1189
- } | undefined;
1190
- sill: boolean;
1191
- sillDepth: number;
1192
- sillThickness: number;
1193
- sillOverhang?: number | undefined;
1194
- sillInterior?: boolean | undefined;
1195
- sillInteriorDepth?: number | undefined;
1196
- sillInteriorThickness?: number | undefined;
1197
- sillInteriorOverhang?: number | undefined;
1198
- shutters?: "board-batten" | "louvered" | "none" | "panel" | undefined;
1199
- shutterWidth?: number | undefined;
1200
- shutterOpen?: number | undefined;
1201
- shutterSides?: "both" | "left" | "right" | undefined;
1202
- rollerShutter?: "box" | "concealed" | "none" | undefined;
1203
- rollerShutterBoxHeight?: number | undefined;
1204
- rollerShutterOpen?: number | undefined;
1205
- casingFaceA?: boolean | undefined;
1206
- casingFaceB?: boolean | undefined;
1207
- casingWidth?: number | undefined;
1208
- type: "window";
1162
+ asset: {
1163
+ id: string;
1164
+ category: string;
1165
+ name: string;
1166
+ thumbnail: string;
1167
+ floorPlanUrl?: string | undefined;
1168
+ source: "community" | "library" | "mine";
1169
+ isDraft?: boolean | undefined;
1170
+ src: string;
1171
+ dimensions: [number, number, number];
1172
+ attachTo?: "ceiling" | "wall" | "wall-side" | undefined;
1173
+ recessed?: boolean | undefined;
1174
+ tags?: string[] | undefined;
1175
+ functionTags?: string[] | undefined;
1176
+ offset: [number, number, number];
1177
+ rotation: [number, number, number];
1178
+ scale: [number, number, number];
1179
+ surface?: {
1180
+ height: number;
1181
+ } | undefined;
1182
+ interactive?: {
1183
+ controls: ({
1184
+ kind: "toggle";
1185
+ label?: string | undefined;
1186
+ default?: boolean | undefined;
1187
+ } | {
1188
+ kind: "slider";
1189
+ label: string;
1190
+ min: number;
1191
+ max: number;
1192
+ step: number;
1193
+ unit?: string | undefined;
1194
+ displayMode: "dial" | "slider" | "stepper";
1195
+ default?: number | undefined;
1196
+ } | {
1197
+ kind: "temperature";
1198
+ label: string;
1199
+ min: number;
1200
+ max: number;
1201
+ unit: "C" | "F";
1202
+ default?: number | undefined;
1203
+ })[];
1204
+ effects: ({
1205
+ kind: "animation";
1206
+ mode?: "ambient" | "open-close" | undefined;
1207
+ control?: number | undefined;
1208
+ clips: {
1209
+ on?: string | undefined;
1210
+ off?: string | undefined;
1211
+ loop?: string | undefined;
1212
+ };
1213
+ } | {
1214
+ kind: "light";
1215
+ color: string;
1216
+ intensityRange: [number, number];
1217
+ distance?: number | undefined;
1218
+ offset: [number, number, number];
1219
+ spot?: {
1220
+ direction: [number, number, number];
1221
+ angle: number;
1222
+ softness: number;
1223
+ } | undefined;
1224
+ shadows?: boolean | undefined;
1225
+ glow?: {
1226
+ size: number;
1227
+ strength: number;
1228
+ } | undefined;
1229
+ })[];
1230
+ } | undefined;
1231
+ };
1209
1232
  } | {
1210
1233
  object: "node";
1211
1234
  name?: string | undefined;
@@ -1230,11 +1253,30 @@ export declare function planSceneNodeChanges(snapshot: Pick<SceneState, 'nodes'
1230
1253
  fromIds: string[];
1231
1254
  } | undefined;
1232
1255
  } | undefined;
1233
- id: `column_${string}`;
1234
- children: string[];
1235
- position: [number, number, number];
1236
- rotation: number;
1237
- supportSlabId?: string | undefined;
1256
+ id: `door_${string}`;
1257
+ material?: {
1258
+ id?: string | undefined;
1259
+ preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
1260
+ properties?: {
1261
+ color: string;
1262
+ roughness: number;
1263
+ metalness: number;
1264
+ opacity: number;
1265
+ transparent: boolean;
1266
+ side: "back" | "double" | "front";
1267
+ } | undefined;
1268
+ texture?: {
1269
+ url: string;
1270
+ repeat?: [number, number] | undefined;
1271
+ scale?: number | undefined;
1272
+ offset?: [number, number] | undefined;
1273
+ normalMap?: string | undefined;
1274
+ normalScale?: number | undefined;
1275
+ bumpMap?: string | undefined;
1276
+ bumpScale?: number | undefined;
1277
+ } | undefined;
1278
+ } | undefined;
1279
+ slots?: Record<string, string> | undefined;
1238
1280
  source?: {
1239
1281
  kind: "script";
1240
1282
  meta?: {
@@ -1349,104 +1391,72 @@ export declare function planSceneNodeChanges(snapshot: Pick<SceneState, 'nodes'
1349
1391
  floorPlan: string;
1350
1392
  } | undefined;
1351
1393
  } | undefined;
1352
- style: "cluster" | "dravidian-carved" | "faceted" | "fluted" | "lathe-turned" | "plain";
1353
- crossSection: "octagonal" | "rectangular" | "round" | "sixteen-sided" | "square";
1354
- height: number;
1355
- radius: number;
1394
+ position: [number, number, number];
1395
+ rotation: [number, number, number];
1396
+ side?: "back" | "front" | undefined;
1397
+ verticalAnchor?: "floor" | "wall" | undefined;
1398
+ floorThresholdVersion: 0 | 1;
1399
+ wallId?: string | undefined;
1400
+ roofSegmentId?: string | undefined;
1401
+ roofFace?: "back" | "front" | "left" | "right" | undefined;
1356
1402
  width: number;
1357
- depth: number;
1358
- edgeSoftness: number;
1359
- baseHeight: number;
1360
- capitalHeight: number;
1361
- shaftProfile: "baluster" | "bulged" | "hourglass" | "straight" | "tapered";
1362
- shaftTaper: number;
1363
- shaftBulge: number;
1364
- shaftStartScale: number;
1365
- shaftEndScale: number;
1366
- shaftSegmentCount: number;
1367
- shaftTwistStep: number;
1368
- shaftCornerRadius: number;
1369
- shaftDetail: "fluted" | "lathe-turned" | "none" | "panelled" | "spiral";
1370
- baseStyle: "lotus" | "none" | "panelled-pedestal" | "ribbed-lotus" | "round-rings" | "simple-square" | "square-plinth" | "stepped-square";
1371
- baseWidthScale: number;
1372
- baseDepthScale: number;
1373
- baseTierCount: number;
1374
- baseStepSpread: number;
1375
- basePlinthHeightRatio: number;
1376
- baseRoundBandScale: number;
1377
- baseNeckScale: number;
1378
- baseRoundBandCount: number;
1379
- baseRibCount: number;
1380
- baseCarvingLevel: number;
1381
- basePanelInset: number;
1382
- capitalStyle: "corinthian-leaf" | "doric" | "ionic-volute" | "leaf-carved" | "none" | "rounded" | "simple" | "simple-slab" | "south-indian-bracket" | "stepped" | "volute" | "wood-bracket";
1383
- capitalWidthScale: number;
1384
- capitalDepthScale: number;
1385
- capitalTierCount: number;
1386
- capitalStepSpread: number;
1387
- capitalBandCount: number;
1388
- voluteSize: number;
1389
- voluteCount: number;
1390
- leafCount: number;
1391
- leafRows: number;
1392
- bracketDepth: number;
1393
- bracketTierCount: number;
1394
- pendantCount: number;
1395
- capitalCarvingLevel: number;
1396
- ringCount: number;
1397
- ringPlacement: "bottom" | "ends" | "even" | "top";
1398
- ringThickness: number;
1399
- ringSpread: number;
1400
- fluteCount: number;
1401
- fluteDepth: number;
1402
- fluteWidth: number;
1403
- spiralTwist: number;
1404
- spiralRibCount: number;
1405
- panelCount: number;
1406
- panelInsetDepth: number;
1407
- panelShape: "arched" | "diamond" | "rectangle";
1408
- latheRingCount: number;
1409
- latheRingSpacing: "bottom" | "ends" | "even" | "top";
1410
- carvingLevel: number;
1411
- carvingPlacement: "all" | "base" | "capital" | "shaft";
1412
- lowerBandEnabled: boolean;
1413
- lowerBandHeight: number;
1414
- lowerBandCarvingLevel: number;
1415
- dentilCount: number;
1416
- beadCount: number;
1417
- supportStyle: "a-frame" | "box-frame" | "k-brace" | "portal-frame" | "single-strut" | "trestle" | "tripod" | "v-frame" | "vertical" | "x-brace" | "y-frame";
1418
- braceWidth: number;
1419
- braceDepth: number;
1420
- braceBottomSpread: number;
1421
- braceTopSpread: number;
1422
- bracePlateEnabled: boolean;
1423
- role?: "ornament" | "post" | undefined;
1424
- postBase?: "none" | "pier" | "post-base" | undefined;
1425
- material?: {
1426
- id?: string | undefined;
1427
- preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
1428
- properties?: {
1429
- color: string;
1430
- roughness: number;
1431
- metalness: number;
1432
- opacity: number;
1433
- transparent: boolean;
1434
- side: "back" | "double" | "front";
1435
- } | undefined;
1436
- texture?: {
1437
- url: string;
1438
- repeat?: [number, number] | undefined;
1439
- scale?: number | undefined;
1440
- offset?: [number, number] | undefined;
1441
- normalMap?: string | undefined;
1442
- normalScale?: number | undefined;
1443
- bumpMap?: string | undefined;
1444
- bumpScale?: number | undefined;
1445
- } | undefined;
1446
- } | undefined;
1447
- materialPreset?: string | undefined;
1448
- slots?: Record<string, string> | undefined;
1449
- type: "column";
1403
+ height: number;
1404
+ sidelightLeft?: number | undefined;
1405
+ sidelightRight?: number | undefined;
1406
+ transomHeight?: number | undefined;
1407
+ slidingStyle?: "bypass" | "patio" | undefined;
1408
+ mark?: string | undefined;
1409
+ constructionType: "framed" | "masonry";
1410
+ dimensionReference: "finish-opening" | "masonry-opening" | "nominal" | "rough-opening";
1411
+ roughOpeningWidth?: number | undefined;
1412
+ roughOpeningHeight?: number | undefined;
1413
+ masonryOpeningWidth?: number | undefined;
1414
+ masonryOpeningHeight?: number | undefined;
1415
+ finishOpeningWidth?: number | undefined;
1416
+ finishOpeningHeight?: number | undefined;
1417
+ doorCategory: "garage" | "interior";
1418
+ doorType: "barn" | "double" | "folding" | "french" | "garage-rollup" | "garage-sectional" | "garage-tiltup" | "hinged" | "pocket" | "sliding";
1419
+ leafCount: 1 | 2 | 3 | 4 | 6 | 8;
1420
+ operationState: number;
1421
+ slideDirection: "left" | "right";
1422
+ trackStyle: "none" | "overhead" | "pocket" | "visible";
1423
+ garagePanelCount: number;
1424
+ openingKind: "door" | "opening";
1425
+ openingShape: "arch" | "rectangle" | "rounded";
1426
+ openingRadiusMode: "all" | "individual";
1427
+ openingTopRadii: [number, number];
1428
+ cornerRadius: number;
1429
+ archHeight: number;
1430
+ openingRevealRadius: number;
1431
+ frameThickness: number;
1432
+ frameDepth?: number | undefined;
1433
+ threshold: boolean;
1434
+ thresholdHeight: number;
1435
+ casingFaceA?: boolean | undefined;
1436
+ casingFaceB?: boolean | undefined;
1437
+ casingWidth?: number | undefined;
1438
+ hingesSide: "left" | "right";
1439
+ swingDirection: "inward" | "outward";
1440
+ swingAngle: number;
1441
+ segments: {
1442
+ type: "empty" | "glass" | "panel";
1443
+ heightRatio: number;
1444
+ columnRatios: number[];
1445
+ dividerThickness: number;
1446
+ panelDepth: number;
1447
+ panelInset: number;
1448
+ }[];
1449
+ handle: boolean;
1450
+ handleStyle?: "bar" | "knob" | "lever" | "lever-curved" | "plate" | undefined;
1451
+ handleHeight: number;
1452
+ handleSide: "left" | "right";
1453
+ contentPadding: [number, number];
1454
+ doorCloser: boolean;
1455
+ panicBar: boolean;
1456
+ panicBarStyle: "crossbar" | "touchbar";
1457
+ panicBarRods: boolean;
1458
+ panicBarHeight: number;
1459
+ type: "door";
1450
1460
  } | {
1451
1461
  object: "node";
1452
1462
  name?: string | undefined;
@@ -1471,293 +1481,199 @@ export declare function planSceneNodeChanges(snapshot: Pick<SceneState, 'nodes'
1471
1481
  fromIds: string[];
1472
1482
  } | undefined;
1473
1483
  } | undefined;
1474
- id: `rseg_${string}`;
1475
- material?: {
1476
- id?: string | undefined;
1477
- preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
1478
- properties?: {
1479
- color: string;
1480
- roughness: number;
1481
- metalness: number;
1482
- opacity: number;
1483
- transparent: boolean;
1484
- side: "back" | "double" | "front";
1485
- } | undefined;
1486
- texture?: {
1487
- url: string;
1488
- repeat?: [number, number] | undefined;
1489
- scale?: number | undefined;
1490
- offset?: [number, number] | undefined;
1491
- normalMap?: string | undefined;
1492
- normalScale?: number | undefined;
1493
- bumpMap?: string | undefined;
1494
- bumpScale?: number | undefined;
1495
- } | undefined;
1496
- } | undefined;
1497
- materialPreset?: string | undefined;
1498
- topMaterial?: {
1499
- id?: string | undefined;
1500
- preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
1501
- properties?: {
1502
- color: string;
1503
- roughness: number;
1504
- metalness: number;
1505
- opacity: number;
1506
- transparent: boolean;
1507
- side: "back" | "double" | "front";
1508
- } | undefined;
1509
- texture?: {
1510
- url: string;
1511
- repeat?: [number, number] | undefined;
1512
- scale?: number | undefined;
1513
- offset?: [number, number] | undefined;
1514
- normalMap?: string | undefined;
1515
- normalScale?: number | undefined;
1516
- bumpMap?: string | undefined;
1517
- bumpScale?: number | undefined;
1518
- } | undefined;
1519
- } | undefined;
1520
- topMaterialPreset?: string | undefined;
1521
- edgeMaterial?: {
1522
- id?: string | undefined;
1523
- preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
1524
- properties?: {
1525
- color: string;
1526
- roughness: number;
1527
- metalness: number;
1528
- opacity: number;
1529
- transparent: boolean;
1530
- side: "back" | "double" | "front";
1531
- } | undefined;
1532
- texture?: {
1533
- url: string;
1534
- repeat?: [number, number] | undefined;
1535
- scale?: number | undefined;
1536
- offset?: [number, number] | undefined;
1537
- normalMap?: string | undefined;
1538
- normalScale?: number | undefined;
1539
- bumpMap?: string | undefined;
1540
- bumpScale?: number | undefined;
1541
- } | undefined;
1542
- } | undefined;
1543
- edgeMaterialPreset?: string | undefined;
1544
- wallMaterial?: {
1545
- id?: string | undefined;
1546
- preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
1547
- properties?: {
1548
- color: string;
1549
- roughness: number;
1550
- metalness: number;
1551
- opacity: number;
1552
- transparent: boolean;
1553
- side: "back" | "double" | "front";
1554
- } | undefined;
1555
- texture?: {
1556
- url: string;
1557
- repeat?: [number, number] | undefined;
1558
- scale?: number | undefined;
1559
- offset?: [number, number] | undefined;
1560
- normalMap?: string | undefined;
1561
- normalScale?: number | undefined;
1562
- bumpMap?: string | undefined;
1563
- bumpScale?: number | undefined;
1564
- } | undefined;
1565
- } | undefined;
1566
- wallMaterialPreset?: string | undefined;
1484
+ id: `column_${string}`;
1485
+ children: string[];
1567
1486
  position: [number, number, number];
1568
1487
  rotation: number;
1569
- roofType: "barrel" | "conical" | "dutch" | "flat" | "gable" | "gambrel" | "hip" | "mansard" | "shed";
1570
- barrelRise?: number | undefined;
1571
- barrelSegments?: number | undefined;
1572
- roofSystem?: "glazed" | "standard" | undefined;
1573
- glazing?: {
1574
- across: {
1575
- layout: "count" | "fixed-spacing" | "maximum-spacing";
1576
- count: number;
1577
- spacing: number;
1578
- alignment: "center" | "end" | "start";
1579
- };
1580
- along: {
1581
- layout: "count" | "fixed-spacing" | "maximum-spacing";
1582
- count: number;
1583
- spacing: number;
1584
- alignment: "center" | "end" | "start";
1585
- };
1586
- frameWidth: number;
1587
- frameDepth: number;
1588
- glassThickness: number;
1589
- frameColor: string;
1590
- glassColor: string;
1591
- glassOpacity: number;
1592
- glassRoughness: number;
1593
- glazedEnds: boolean;
1594
- panelType: "empty" | "glass" | "solid";
1595
- panels: {
1596
- face: string;
1597
- column: number;
1598
- row: number;
1599
- type: "empty" | "glass" | "solid";
1600
- }[];
1601
- } | undefined;
1602
- slots?: Record<string, string> | undefined;
1603
- width: number;
1604
- depth: number;
1605
- conicalStartAngle?: number | undefined;
1606
- conicalSweepAngle?: number | undefined;
1607
- conicalFullCircle?: boolean | undefined;
1608
- trim: {
1609
- left: number;
1610
- right: number;
1611
- front: number;
1612
- back: number;
1613
- frontLeft: number;
1614
- frontRight: number;
1615
- backLeft: number;
1616
- backRight: number;
1617
- frontLeftX: number;
1618
- frontLeftZ: number;
1619
- frontRightX: number;
1620
- frontRightZ: number;
1621
- backLeftX: number;
1622
- backLeftZ: number;
1623
- backRightX: number;
1624
- backRightZ: number;
1625
- };
1626
- wallHeight: number;
1627
- pitch: number;
1628
- wallThickness: number;
1629
- deckThickness: number;
1630
- overhang: number;
1631
- gableOverhang?: number | undefined;
1632
- shingleThickness: number;
1633
- buildUp?: {
1634
- presetId?: string | undefined;
1635
- roofing: {
1636
- kind: "architectural-shingle" | "asphalt-3-tab" | "clay-tile" | "concrete-tile" | "slate" | "standing-seam-metal" | "wood-shake";
1637
- thickness: number;
1638
- name?: string | undefined;
1639
- };
1640
- underlayment?: {
1641
- kind: "felt-15" | "felt-30" | "ice-and-water" | "synthetic";
1642
- thickness: number;
1643
- name?: string | undefined;
1644
- } | undefined;
1645
- sheathing: {
1646
- kind: "osb" | "plywood";
1647
- thickness: number;
1648
- name?: string | undefined;
1649
- };
1650
- structure: {
1651
- system: "rafters" | "trusses";
1652
- size: "2x10" | "2x12" | "2x4" | "2x6" | "2x8";
1653
- spacing: number;
1654
- };
1655
- insulation?: {
1656
- kind: "batt" | "blown" | "rigid";
1657
- thickness: number;
1658
- name?: string | undefined;
1659
- } | undefined;
1660
- finish?: {
1661
- kind: "drywall" | "plaster" | "wood-plank";
1662
- thickness: number;
1663
- name?: string | undefined;
1664
- } | undefined;
1665
- } | undefined;
1666
- arc?: {
1667
- centerX: number;
1668
- centerZ: number;
1669
- radius: number;
1670
- } | undefined;
1671
- shedSideInfillSpan?: number | undefined;
1672
- shedSideInfillMinX?: number | undefined;
1673
- shedSideInfillMaxX?: number | undefined;
1674
- shedFootprintPieces?: [number, number][][] | undefined;
1675
- shedOpenEndSides?: ("left" | "right")[] | undefined;
1676
- shedJointFrame?: {
1677
- position: [number, number, number];
1678
- rotation: number;
1679
- } | undefined;
1680
- shedJointOwnerId?: string | undefined;
1681
- shedJointNeighborIds?: string[] | undefined;
1682
- shedJointScopeId?: string | undefined;
1683
- managedByParent: boolean;
1684
- wallShell: "auto" | "include" | "omit";
1685
- shedInsetEndPanels: boolean;
1686
- fascia?: boolean | undefined;
1687
- eaveCut?: "plumb" | "plumb-level" | "square" | undefined;
1688
- fasciaHighEdge?: boolean | undefined;
1689
- fasciaHeight?: number | undefined;
1690
- fasciaDepth?: number | undefined;
1691
- fasciaMaterial?: {
1692
- id?: string | undefined;
1693
- preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
1694
- properties?: {
1695
- color: string;
1696
- roughness: number;
1697
- metalness: number;
1698
- opacity: number;
1699
- transparent: boolean;
1700
- side: "back" | "double" | "front";
1701
- } | undefined;
1702
- texture?: {
1703
- url: string;
1704
- repeat?: [number, number] | undefined;
1705
- scale?: number | undefined;
1706
- offset?: [number, number] | undefined;
1707
- normalMap?: string | undefined;
1708
- normalScale?: number | undefined;
1709
- bumpMap?: string | undefined;
1710
- bumpScale?: number | undefined;
1711
- } | undefined;
1712
- } | undefined;
1713
- fasciaMaterialPreset?: string | undefined;
1714
- heelMaterial?: {
1715
- id?: string | undefined;
1716
- preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
1717
- properties?: {
1718
- color: string;
1719
- roughness: number;
1720
- metalness: number;
1721
- opacity: number;
1722
- transparent: boolean;
1723
- side: "back" | "double" | "front";
1724
- } | undefined;
1725
- texture?: {
1726
- url: string;
1727
- repeat?: [number, number] | undefined;
1728
- scale?: number | undefined;
1729
- offset?: [number, number] | undefined;
1730
- normalMap?: string | undefined;
1731
- normalScale?: number | undefined;
1732
- bumpMap?: string | undefined;
1733
- bumpScale?: number | undefined;
1734
- } | undefined;
1735
- } | undefined;
1736
- heelMaterialPreset?: string | undefined;
1737
- gableLeftMaterial?: {
1738
- id?: string | undefined;
1739
- preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
1740
- properties?: {
1741
- color: string;
1742
- roughness: number;
1743
- metalness: number;
1744
- opacity: number;
1745
- transparent: boolean;
1746
- side: "back" | "double" | "front";
1488
+ supportSlabId?: string | undefined;
1489
+ source?: {
1490
+ kind: "script";
1491
+ meta?: {
1492
+ description?: string | undefined;
1493
+ category?: string | undefined;
1494
+ tags?: string[] | undefined;
1495
+ parent?: string | undefined;
1747
1496
  } | undefined;
1748
- texture?: {
1749
- url: string;
1750
- repeat?: [number, number] | undefined;
1751
- scale?: number | undefined;
1752
- offset?: [number, number] | undefined;
1753
- normalMap?: string | undefined;
1754
- normalScale?: number | undefined;
1755
- bumpMap?: string | undefined;
1756
- bumpScale?: number | undefined;
1497
+ language: "bpy" | "three";
1498
+ script: string;
1499
+ params: Record<string, string | number | boolean>;
1500
+ artifact: string;
1501
+ manifest: {
1502
+ bounds: {
1503
+ min: [number, number, number];
1504
+ max: [number, number, number];
1505
+ };
1506
+ params: {
1507
+ id: string;
1508
+ label?: string | undefined;
1509
+ kind: "boolean" | "number" | "string";
1510
+ default: string | number | boolean;
1511
+ min?: number | undefined;
1512
+ max?: number | undefined;
1513
+ step?: number | undefined;
1514
+ unit?: string | undefined;
1515
+ options?: string[] | undefined;
1516
+ }[];
1517
+ parts: {
1518
+ id: string;
1519
+ label?: string | undefined;
1520
+ type?: string | undefined;
1521
+ bounds?: {
1522
+ min: [number, number, number];
1523
+ max: [number, number, number];
1524
+ } | undefined;
1525
+ }[];
1526
+ surfaces: {
1527
+ part?: string | undefined;
1528
+ y: number;
1529
+ polygon: [number, number][];
1530
+ }[];
1531
+ slots: {
1532
+ id: string;
1533
+ label?: string | undefined;
1534
+ color?: string | undefined;
1535
+ roughness?: number | undefined;
1536
+ metalness?: number | undefined;
1537
+ transparent?: boolean | undefined;
1538
+ emissive?: boolean | undefined;
1539
+ }[];
1540
+ anchors: {
1541
+ id: string;
1542
+ position: [number, number, number];
1543
+ normal?: [number, number, number] | undefined;
1544
+ }[];
1545
+ lights: {
1546
+ id: string;
1547
+ position: [number, number, number];
1548
+ color: string;
1549
+ intensity: number;
1550
+ distance?: number | undefined;
1551
+ spot?: {
1552
+ direction: [number, number, number];
1553
+ angle: number;
1554
+ softness: number;
1555
+ } | undefined;
1556
+ shadows?: boolean | undefined;
1557
+ glow?: {
1558
+ size: number;
1559
+ strength: number;
1560
+ } | undefined;
1561
+ }[];
1562
+ undersides: {
1563
+ part?: string | undefined;
1564
+ polygon: [number, number][];
1565
+ plane: [number, number, number, number];
1566
+ }[];
1567
+ animations: {
1568
+ name: string;
1569
+ duration: number;
1570
+ }[];
1571
+ cutters?: {
1572
+ host: "ceiling" | "mounted" | "slab" | "wall";
1573
+ polygon: number[][];
1574
+ minY: number;
1575
+ maxY: number;
1576
+ }[] | undefined;
1577
+ cutout: boolean;
1578
+ collider: boolean;
1579
+ shape?: {
1580
+ tolerance: number;
1581
+ bands: {
1582
+ y0: number;
1583
+ y1: number;
1584
+ polygons: {
1585
+ outer: [number, number][];
1586
+ holes?: [number, number][][] | undefined;
1587
+ }[];
1588
+ }[];
1589
+ } | undefined;
1590
+ triangles: number;
1591
+ coverage?: number | undefined;
1592
+ uncovered?: {
1593
+ min: [number, number];
1594
+ max: [number, number];
1595
+ }[] | undefined;
1596
+ };
1597
+ images?: {
1598
+ artifact: string;
1599
+ thumbnail: string;
1600
+ floorPlan: string;
1757
1601
  } | undefined;
1758
1602
  } | undefined;
1759
- gableLeftMaterialPreset?: string | undefined;
1760
- gableRightMaterial?: {
1603
+ style: "cluster" | "dravidian-carved" | "faceted" | "fluted" | "lathe-turned" | "plain";
1604
+ crossSection: "octagonal" | "rectangular" | "round" | "sixteen-sided" | "square";
1605
+ height: number;
1606
+ radius: number;
1607
+ width: number;
1608
+ depth: number;
1609
+ edgeSoftness: number;
1610
+ baseHeight: number;
1611
+ capitalHeight: number;
1612
+ shaftProfile: "baluster" | "bulged" | "hourglass" | "straight" | "tapered";
1613
+ shaftTaper: number;
1614
+ shaftBulge: number;
1615
+ shaftStartScale: number;
1616
+ shaftEndScale: number;
1617
+ shaftSegmentCount: number;
1618
+ shaftTwistStep: number;
1619
+ shaftCornerRadius: number;
1620
+ shaftDetail: "fluted" | "lathe-turned" | "none" | "panelled" | "spiral";
1621
+ baseStyle: "lotus" | "none" | "panelled-pedestal" | "ribbed-lotus" | "round-rings" | "simple-square" | "square-plinth" | "stepped-square";
1622
+ baseWidthScale: number;
1623
+ baseDepthScale: number;
1624
+ baseTierCount: number;
1625
+ baseStepSpread: number;
1626
+ basePlinthHeightRatio: number;
1627
+ baseRoundBandScale: number;
1628
+ baseNeckScale: number;
1629
+ baseRoundBandCount: number;
1630
+ baseRibCount: number;
1631
+ baseCarvingLevel: number;
1632
+ basePanelInset: number;
1633
+ capitalStyle: "corinthian-leaf" | "doric" | "ionic-volute" | "leaf-carved" | "none" | "rounded" | "simple" | "simple-slab" | "south-indian-bracket" | "stepped" | "volute" | "wood-bracket";
1634
+ capitalWidthScale: number;
1635
+ capitalDepthScale: number;
1636
+ capitalTierCount: number;
1637
+ capitalStepSpread: number;
1638
+ capitalBandCount: number;
1639
+ voluteSize: number;
1640
+ voluteCount: number;
1641
+ leafCount: number;
1642
+ leafRows: number;
1643
+ bracketDepth: number;
1644
+ bracketTierCount: number;
1645
+ pendantCount: number;
1646
+ capitalCarvingLevel: number;
1647
+ ringCount: number;
1648
+ ringPlacement: "bottom" | "ends" | "even" | "top";
1649
+ ringThickness: number;
1650
+ ringSpread: number;
1651
+ fluteCount: number;
1652
+ fluteDepth: number;
1653
+ fluteWidth: number;
1654
+ spiralTwist: number;
1655
+ spiralRibCount: number;
1656
+ panelCount: number;
1657
+ panelInsetDepth: number;
1658
+ panelShape: "arched" | "diamond" | "rectangle";
1659
+ latheRingCount: number;
1660
+ latheRingSpacing: "bottom" | "ends" | "even" | "top";
1661
+ carvingLevel: number;
1662
+ carvingPlacement: "all" | "base" | "capital" | "shaft";
1663
+ lowerBandEnabled: boolean;
1664
+ lowerBandHeight: number;
1665
+ lowerBandCarvingLevel: number;
1666
+ dentilCount: number;
1667
+ beadCount: number;
1668
+ supportStyle: "a-frame" | "box-frame" | "k-brace" | "portal-frame" | "single-strut" | "trestle" | "tripod" | "v-frame" | "vertical" | "x-brace" | "y-frame";
1669
+ braceWidth: number;
1670
+ braceDepth: number;
1671
+ braceBottomSpread: number;
1672
+ braceTopSpread: number;
1673
+ bracePlateEnabled: boolean;
1674
+ role?: "ornament" | "post" | undefined;
1675
+ postBase?: "none" | "pier" | "post-base" | undefined;
1676
+ material?: {
1761
1677
  id?: string | undefined;
1762
1678
  preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
1763
1679
  properties?: {
@@ -1779,18 +1695,9 @@ export declare function planSceneNodeChanges(snapshot: Pick<SceneState, 'nodes'
1779
1695
  bumpScale?: number | undefined;
1780
1696
  } | undefined;
1781
1697
  } | undefined;
1782
- gableRightMaterialPreset?: string | undefined;
1783
- gambrelLowerWidthRatio: number;
1784
- gambrelLowerHeightRatio: number;
1785
- mansardSteepWidthRatio: number;
1786
- mansardSteepHeightRatio: number;
1787
- dutchHipWidthRatio: number;
1788
- dutchHipHeightRatio: number;
1789
- dutchWaistLengthRatio: number;
1790
- dutchGabletRake: number;
1791
- dutchTopRakeThickness: number;
1792
- children: string[];
1793
- type: "roof-segment";
1698
+ materialPreset?: string | undefined;
1699
+ slots?: Record<string, string> | undefined;
1700
+ type: "column";
1794
1701
  } | {
1795
1702
  object: "node";
1796
1703
  name?: string | undefined;
@@ -2534,6 +2441,7 @@ export declare function planSceneNodeChanges(snapshot: Pick<SceneState, 'nodes'
2534
2441
  } | undefined;
2535
2442
  justification?: "a" | "b" | undefined;
2536
2443
  height?: number | undefined;
2444
+ endHeightOffset?: number | undefined;
2537
2445
  curveOffset?: number | undefined;
2538
2446
  supportSlabId?: string | undefined;
2539
2447
  supportOffset?: number | undefined;
@@ -2812,34 +2720,6 @@ export declare function planSceneNodeChanges(snapshot: Pick<SceneState, 'nodes'
2812
2720
  frontSide: "exterior" | "interior" | "unknown";
2813
2721
  backSide: "exterior" | "interior" | "unknown";
2814
2722
  type: "wall";
2815
- } | {
2816
- object: "node";
2817
- name?: string | undefined;
2818
- parentId: string | null;
2819
- visible: boolean;
2820
- camera?: {
2821
- position: [number, number, number];
2822
- target: [number, number, number];
2823
- mode: "orthographic" | "perspective";
2824
- fov?: number | undefined;
2825
- zoom?: number | undefined;
2826
- } | undefined;
2827
- metadata: Record<string, unknown>;
2828
- provenance?: {
2829
- refs: {
2830
- ns?: string | undefined;
2831
- id: string;
2832
- role?: "absorbed" | "alias" | "derived" | "piece" | "primary" | undefined;
2833
- }[];
2834
- lineage?: {
2835
- op: "attach" | "convert" | "duplicate" | "import" | "make-independent" | "merge" | "promote" | "split";
2836
- fromIds: string[];
2837
- } | undefined;
2838
- } | undefined;
2839
- id: `separator_${string}`;
2840
- start: [number, number];
2841
- end: [number, number];
2842
- type: "separator";
2843
2723
  } | {
2844
2724
  object: "node";
2845
2725
  name?: string | undefined;
@@ -3006,53 +2886,6 @@ export declare function planSceneNodeChanges(snapshot: Pick<SceneState, 'nodes'
3006
2886
  topElevation?: number | undefined;
3007
2887
  supportSlabId?: string | undefined;
3008
2888
  type: "beam";
3009
- } | {
3010
- object: "node";
3011
- name?: string | undefined;
3012
- parentId: string | null;
3013
- visible: boolean;
3014
- camera?: {
3015
- position: [number, number, number];
3016
- target: [number, number, number];
3017
- mode: "orthographic" | "perspective";
3018
- fov?: number | undefined;
3019
- zoom?: number | undefined;
3020
- } | undefined;
3021
- metadata: Record<string, unknown>;
3022
- provenance?: {
3023
- refs: {
3024
- ns?: string | undefined;
3025
- id: string;
3026
- role?: "absorbed" | "alias" | "derived" | "piece" | "primary" | undefined;
3027
- }[];
3028
- lineage?: {
3029
- op: "attach" | "convert" | "duplicate" | "import" | "make-independent" | "merge" | "promote" | "split";
3030
- fromIds: string[];
3031
- } | undefined;
3032
- } | undefined;
3033
- id: `block_${string}`;
3034
- children: string[];
3035
- position: [number, number, number];
3036
- rotation: number;
3037
- supportSlabId?: string | undefined;
3038
- topology: {
3039
- vertices: {
3040
- id: string;
3041
- position: [number, number, number];
3042
- }[];
3043
- edges: {
3044
- id: string;
3045
- vertexIds: [string, string];
3046
- }[];
3047
- faces: {
3048
- id: string;
3049
- vertexIds: string[];
3050
- materialSlot: string;
3051
- }[];
3052
- };
3053
- slots: Record<string, string>;
3054
- slotNames: Record<string, string>;
3055
- type: "block";
3056
2889
  } | {
3057
2890
  object: "node";
3058
2891
  name?: string | undefined;
@@ -3554,7 +3387,8 @@ export declare function planSceneNodeChanges(snapshot: Pick<SceneState, 'nodes'
3554
3387
  fromIds: string[];
3555
3388
  } | undefined;
3556
3389
  } | undefined;
3557
- id: `sseg_${string}`;
3390
+ id: `ceiling_${string}`;
3391
+ children: (`item_${string}` | `procedural-item_${string}`)[];
3558
3392
  material?: {
3559
3393
  id?: string | undefined;
3560
3394
  preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
@@ -3579,34 +3413,48 @@ export declare function planSceneNodeChanges(snapshot: Pick<SceneState, 'nodes'
3579
3413
  } | undefined;
3580
3414
  materialPreset?: string | undefined;
3581
3415
  slots?: Record<string, string> | undefined;
3582
- position: [number, number, number];
3583
- rotation: number;
3584
- segmentType: "landing" | "stair";
3585
- width: number;
3586
- length: number;
3587
- height: number;
3588
- stepCount: number;
3589
- attachmentSide: "front" | "left" | "right";
3590
- fillToFloor: boolean;
3591
- construction?: {
3592
- mode: "center-stringer" | "open" | "side-stringers" | "solid" | "waist";
3593
- waistThickness: number;
3594
- treadThickness: number;
3595
- riserThickness: number;
3596
- nosing: number;
3597
- finishThickness: number;
3598
- closedRisers: boolean;
3599
- stringerWidth: number;
3600
- stringerDepth: number;
3601
- } | undefined;
3602
- winder?: {
3603
- turn: "left" | "right";
3604
- innerGap: number;
3605
- walkingLineOffset: number;
3606
- division: "equal-angle" | "equal-going";
3416
+ polygon: [number, number][];
3417
+ holes: [number, number][][];
3418
+ holeMetadata: {
3419
+ source: "elevator" | "floor-opening" | "manual" | "room" | "stair";
3420
+ openingId?: string | undefined;
3421
+ stairId?: string | undefined;
3422
+ elevatorId?: string | undefined;
3423
+ }[];
3424
+ openingIds?: string[] | undefined;
3425
+ height?: number | undefined;
3426
+ buildUp?: {
3427
+ presetId?: string | undefined;
3428
+ finish?: {
3429
+ kind: "drywall" | "plaster" | "wood-plank";
3430
+ thickness: number;
3431
+ name?: string | undefined;
3432
+ } | undefined;
3433
+ framing?: {
3434
+ system: "joists" | "truss-chords";
3435
+ size: "2x10" | "2x12" | "2x4" | "2x6" | "2x8";
3436
+ spacing: number;
3437
+ } | undefined;
3438
+ decking?: {
3439
+ kind: "osb" | "plywood";
3440
+ thickness: number;
3441
+ name?: string | undefined;
3442
+ } | undefined;
3443
+ insulation?: {
3444
+ kind: "batt" | "blown" | "rigid";
3445
+ thickness: number;
3446
+ name?: string | undefined;
3447
+ } | undefined;
3607
3448
  } | undefined;
3608
- thickness: number;
3609
- type: "stair-segment";
3449
+ regions?: {
3450
+ id: string;
3451
+ polygon: [number, number][];
3452
+ finish: string | Record<string, unknown>;
3453
+ }[] | undefined;
3454
+ boundary?: "auto" | undefined;
3455
+ zoneId?: string | undefined;
3456
+ autoFromWalls: boolean;
3457
+ type: "ceiling";
3610
3458
  } | {
3611
3459
  object: "node";
3612
3460
  name?: string | undefined;
@@ -3839,47 +3687,6 @@ export declare function planSceneNodeChanges(snapshot: Pick<SceneState, 'nodes'
3839
3687
  scale: number;
3840
3688
  opacity: number;
3841
3689
  type: "scan";
3842
- } | {
3843
- object: "node";
3844
- name?: string | undefined;
3845
- parentId: string | null;
3846
- visible: boolean;
3847
- camera?: {
3848
- position: [number, number, number];
3849
- target: [number, number, number];
3850
- mode: "orthographic" | "perspective";
3851
- fov?: number | undefined;
3852
- zoom?: number | undefined;
3853
- } | undefined;
3854
- metadata: Record<string, unknown>;
3855
- provenance?: {
3856
- refs: {
3857
- ns?: string | undefined;
3858
- id: string;
3859
- role?: "absorbed" | "alias" | "derived" | "piece" | "primary" | undefined;
3860
- }[];
3861
- lineage?: {
3862
- op: "attach" | "convert" | "duplicate" | "import" | "make-independent" | "merge" | "promote" | "split";
3863
- fromIds: string[];
3864
- } | undefined;
3865
- } | undefined;
3866
- id: `guide_${string}`;
3867
- url: string;
3868
- position: [number, number, number];
3869
- rotation: [number, number, number];
3870
- scale: number;
3871
- opacity: number;
3872
- scaleReference: {
3873
- start: [number, number];
3874
- end: [number, number];
3875
- realLengthMeters: number;
3876
- measuredLengthUnits: number;
3877
- metersPerUnit: number;
3878
- displayLength?: number | undefined;
3879
- displayUnit?: "centimeters" | "feet" | "inches" | "meters" | undefined;
3880
- label: string;
3881
- } | null;
3882
- type: "guide";
3883
3690
  } | {
3884
3691
  object: "node";
3885
3692
  name?: string | undefined;
@@ -3987,35 +3794,6 @@ export declare function planSceneNodeChanges(snapshot: Pick<SceneState, 'nodes'
3987
3794
  extrusion: [number, number, number];
3988
3795
  };
3989
3796
  type: "measurement";
3990
- } | {
3991
- object: "node";
3992
- name?: string | undefined;
3993
- parentId: string | null;
3994
- visible: boolean;
3995
- camera?: {
3996
- position: [number, number, number];
3997
- target: [number, number, number];
3998
- mode: "orthographic" | "perspective";
3999
- fov?: number | undefined;
4000
- zoom?: number | undefined;
4001
- } | undefined;
4002
- metadata: Record<string, unknown>;
4003
- provenance?: {
4004
- refs: {
4005
- ns?: string | undefined;
4006
- id: string;
4007
- role?: "absorbed" | "alias" | "derived" | "piece" | "primary" | undefined;
4008
- }[];
4009
- lineage?: {
4010
- op: "attach" | "convert" | "duplicate" | "import" | "make-independent" | "merge" | "promote" | "split";
4011
- fromIds: string[];
4012
- } | undefined;
4013
- } | undefined;
4014
- id: `spawn_${string}`;
4015
- position: [number, number, number];
4016
- rotation: number;
4017
- supportSlabId?: string | undefined;
4018
- type: "spawn";
4019
3797
  } | {
4020
3798
  object: "node";
4021
3799
  name?: string | undefined;
@@ -4206,19 +3984,165 @@ export declare function planSceneNodeChanges(snapshot: Pick<SceneState, 'nodes'
4206
3984
  fromIds: string[];
4207
3985
  } | undefined;
4208
3986
  } | undefined;
4209
- id: `duct-terminal_${string}`;
3987
+ id: `hvac-equipment_${string}`;
4210
3988
  position: [number, number, number];
4211
3989
  rotation: number;
4212
3990
  supportSlabId?: string | undefined;
4213
- terminalType: "diffuser" | "return-grille" | "supply-register";
4214
- mount: "ceiling" | "floor" | "wall";
3991
+ equipmentType: "air-handler" | "condenser" | "furnace";
4215
3992
  width: number;
4216
3993
  depth: number;
4217
- collarShape: "oval" | "rect" | "round";
4218
- collarDiameter: number;
4219
- collarWidth: number;
4220
- collarHeight: number;
4221
- type: "duct-terminal";
3994
+ height: number;
3995
+ supplyShape: "oval" | "rect" | "round";
3996
+ returnShape: "oval" | "rect" | "round";
3997
+ supplyDiameter: number;
3998
+ returnDiameter: number;
3999
+ supplyWidth: number;
4000
+ supplyHeight: number;
4001
+ returnWidth: number;
4002
+ returnHeight: number;
4003
+ type: "hvac-equipment";
4004
+ } | {
4005
+ object: "node";
4006
+ name?: string | undefined;
4007
+ parentId: string | null;
4008
+ visible: boolean;
4009
+ camera?: {
4010
+ position: [number, number, number];
4011
+ target: [number, number, number];
4012
+ mode: "orthographic" | "perspective";
4013
+ fov?: number | undefined;
4014
+ zoom?: number | undefined;
4015
+ } | undefined;
4016
+ metadata: Record<string, unknown>;
4017
+ provenance?: {
4018
+ refs: {
4019
+ ns?: string | undefined;
4020
+ id: string;
4021
+ role?: "absorbed" | "alias" | "derived" | "piece" | "primary" | undefined;
4022
+ }[];
4023
+ lineage?: {
4024
+ op: "attach" | "convert" | "duplicate" | "import" | "make-independent" | "merge" | "promote" | "split";
4025
+ fromIds: string[];
4026
+ } | undefined;
4027
+ } | undefined;
4028
+ id: `lineset_${string}`;
4029
+ path: [number, number, number][];
4030
+ suctionDiameter: number;
4031
+ liquidDiameter: number;
4032
+ insulated: boolean;
4033
+ type: "lineset";
4034
+ } | {
4035
+ object: "node";
4036
+ name?: string | undefined;
4037
+ parentId: string | null;
4038
+ visible: boolean;
4039
+ camera?: {
4040
+ position: [number, number, number];
4041
+ target: [number, number, number];
4042
+ mode: "orthographic" | "perspective";
4043
+ fov?: number | undefined;
4044
+ zoom?: number | undefined;
4045
+ } | undefined;
4046
+ metadata: Record<string, unknown>;
4047
+ provenance?: {
4048
+ refs: {
4049
+ ns?: string | undefined;
4050
+ id: string;
4051
+ role?: "absorbed" | "alias" | "derived" | "piece" | "primary" | undefined;
4052
+ }[];
4053
+ lineage?: {
4054
+ op: "attach" | "convert" | "duplicate" | "import" | "make-independent" | "merge" | "promote" | "split";
4055
+ fromIds: string[];
4056
+ } | undefined;
4057
+ } | undefined;
4058
+ id: `pipe-segment_${string}`;
4059
+ path: [number, number, number][];
4060
+ autoHangers?: boolean | undefined;
4061
+ hangerOverrides?: Record<string, {
4062
+ fraction?: number | undefined;
4063
+ skipped?: boolean | undefined;
4064
+ hostId?: string | undefined;
4065
+ }> | undefined;
4066
+ hangerStyle?: "double" | "single" | undefined;
4067
+ hangerSpacing?: number | undefined;
4068
+ hangerMaxReach?: number | undefined;
4069
+ wallAttachment?: {
4070
+ wallId: `wall_${string}`;
4071
+ side: "back" | "front";
4072
+ startUV: [number, number];
4073
+ endUV: [number, number];
4074
+ offset: number;
4075
+ } | undefined;
4076
+ diameter: number;
4077
+ pipeMaterial: "abs" | "cast-iron" | "pvc";
4078
+ system: "vent" | "waste";
4079
+ type: "pipe-segment";
4080
+ } | {
4081
+ object: "node";
4082
+ name?: string | undefined;
4083
+ parentId: string | null;
4084
+ visible: boolean;
4085
+ camera?: {
4086
+ position: [number, number, number];
4087
+ target: [number, number, number];
4088
+ mode: "orthographic" | "perspective";
4089
+ fov?: number | undefined;
4090
+ zoom?: number | undefined;
4091
+ } | undefined;
4092
+ metadata: Record<string, unknown>;
4093
+ provenance?: {
4094
+ refs: {
4095
+ ns?: string | undefined;
4096
+ id: string;
4097
+ role?: "absorbed" | "alias" | "derived" | "piece" | "primary" | undefined;
4098
+ }[];
4099
+ lineage?: {
4100
+ op: "attach" | "convert" | "duplicate" | "import" | "make-independent" | "merge" | "promote" | "split";
4101
+ fromIds: string[];
4102
+ } | undefined;
4103
+ } | undefined;
4104
+ id: `pipe-fitting_${string}`;
4105
+ position: [number, number, number];
4106
+ rotation: [number, number, number];
4107
+ fittingType: "cleanout" | "coupling" | "cross" | "elbow" | "end-cap" | "reducer" | "sanitary-tee" | "wye";
4108
+ angle: number;
4109
+ diameter: number;
4110
+ diameter2: number;
4111
+ cleanoutStyle: "end" | "inline";
4112
+ pipeMaterial: "abs" | "cast-iron" | "pvc";
4113
+ system: "vent" | "waste";
4114
+ type: "pipe-fitting";
4115
+ } | {
4116
+ object: "node";
4117
+ name?: string | undefined;
4118
+ parentId: string | null;
4119
+ visible: boolean;
4120
+ camera?: {
4121
+ position: [number, number, number];
4122
+ target: [number, number, number];
4123
+ mode: "orthographic" | "perspective";
4124
+ fov?: number | undefined;
4125
+ zoom?: number | undefined;
4126
+ } | undefined;
4127
+ metadata: Record<string, unknown>;
4128
+ provenance?: {
4129
+ refs: {
4130
+ ns?: string | undefined;
4131
+ id: string;
4132
+ role?: "absorbed" | "alias" | "derived" | "piece" | "primary" | undefined;
4133
+ }[];
4134
+ lineage?: {
4135
+ op: "attach" | "convert" | "duplicate" | "import" | "make-independent" | "merge" | "promote" | "split";
4136
+ fromIds: string[];
4137
+ } | undefined;
4138
+ } | undefined;
4139
+ id: `pipe-trap_${string}`;
4140
+ position: [number, number, number];
4141
+ rotation: number;
4142
+ diameter: number;
4143
+ pipeMaterial: "abs" | "cast-iron" | "pvc";
4144
+ armLengthM: number;
4145
+ type: "pipe-trap";
4222
4146
  } | {
4223
4147
  object: "node";
4224
4148
  name?: string | undefined;
@@ -4243,23 +4167,12 @@ export declare function planSceneNodeChanges(snapshot: Pick<SceneState, 'nodes'
4243
4167
  fromIds: string[];
4244
4168
  } | undefined;
4245
4169
  } | undefined;
4246
- id: `hvac-equipment_${string}`;
4247
- position: [number, number, number];
4248
- rotation: number;
4249
- supportSlabId?: string | undefined;
4250
- equipmentType: "air-handler" | "condenser" | "furnace";
4251
- width: number;
4252
- depth: number;
4253
- height: number;
4254
- supplyShape: "oval" | "rect" | "round";
4255
- returnShape: "oval" | "rect" | "round";
4256
- supplyDiameter: number;
4257
- returnDiameter: number;
4258
- supplyWidth: number;
4259
- supplyHeight: number;
4260
- returnWidth: number;
4261
- returnHeight: number;
4262
- type: "hvac-equipment";
4170
+ id: `level_${string}`;
4171
+ children: (`beam_${string}` | `block_${string}` | `ceiling_${string}` | `column_${string}` | `construction-dimension_${string}` | `duct-fitting_${string}` | `duct-segment_${string}` | `duct-terminal_${string}` | `fence_${string}` | `floor-opening_${string}` | `guide_${string}` | `hvac-equipment_${string}` | `imesh_${string}` | `item_${string}` | `lineset_${string}` | `liquid-line_${string}` | `measurement_${string}` | `pipe-fitting_${string}` | `pipe-segment_${string}` | `pipe-trap_${string}` | `procedural-item_${string}` | `roof_${string}` | `scan_${string}` | `separator_${string}` | `shelf_${string}` | `slab_${string}` | `spawn_${string}` | `stair_${string}` | `structural-grid_${string}` | `wall_${string}` | `zone_${string}`)[];
4172
+ level: number;
4173
+ baseElevation: number;
4174
+ height?: number | undefined;
4175
+ type: "level";
4263
4176
  } | {
4264
4177
  object: "node";
4265
4178
  name?: string | undefined;
@@ -4284,15 +4197,56 @@ export declare function planSceneNodeChanges(snapshot: Pick<SceneState, 'nodes'
4284
4197
  fromIds: string[];
4285
4198
  } | undefined;
4286
4199
  } | undefined;
4287
- id: `lineset_${string}`;
4288
- path: [number, number, number][];
4289
- suctionDiameter: number;
4290
- liquidDiameter: number;
4291
- insulated: boolean;
4292
- type: "lineset";
4200
+ id: `elevator_${string}`;
4201
+ material?: {
4202
+ id?: string | undefined;
4203
+ preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
4204
+ properties?: {
4205
+ color: string;
4206
+ roughness: number;
4207
+ metalness: number;
4208
+ opacity: number;
4209
+ transparent: boolean;
4210
+ side: "back" | "double" | "front";
4211
+ } | undefined;
4212
+ texture?: {
4213
+ url: string;
4214
+ repeat?: [number, number] | undefined;
4215
+ scale?: number | undefined;
4216
+ offset?: [number, number] | undefined;
4217
+ normalMap?: string | undefined;
4218
+ normalScale?: number | undefined;
4219
+ bumpMap?: string | undefined;
4220
+ bumpScale?: number | undefined;
4221
+ } | undefined;
4222
+ } | undefined;
4223
+ materialPreset?: string | undefined;
4224
+ slots?: Record<string, string> | undefined;
4225
+ position: [number, number, number];
4226
+ rotation: number;
4227
+ width: number;
4228
+ depth: number;
4229
+ shaftWidth?: number | undefined;
4230
+ shaftDepth?: number | undefined;
4231
+ shaftWallThickness: number;
4232
+ shaftStyle: "glass" | "solid";
4233
+ cabHeight: number;
4234
+ doorWidth: number;
4235
+ doorHeight: number;
4236
+ doorStyle: "center-opening" | "single-left" | "single-right";
4237
+ doorPanelStyle: "glass-frame" | "segmented-panel" | "solid-panel";
4238
+ fromLevelId: string | null;
4239
+ toLevelId: string | null;
4240
+ servedLevelIds?: string[] | undefined;
4241
+ disabledLevelIds: string[];
4242
+ serviceOnlyLevelIds: string[];
4243
+ defaultLevelId: string | null;
4244
+ speed: number;
4245
+ doorDurationMs: number;
4246
+ dwellMs: number;
4247
+ type: "elevator";
4293
4248
  } | {
4294
4249
  object: "node";
4295
- name?: string | undefined;
4296
4250
  parentId: string | null;
4297
4251
  visible: boolean;
4298
4252
  camera?: {
@@ -4302,7 +4256,6 @@ export declare function planSceneNodeChanges(snapshot: Pick<SceneState, 'nodes'
4302
4256
  fov?: number | undefined;
4303
4257
  zoom?: number | undefined;
4304
4258
  } | undefined;
4305
- metadata: Record<string, unknown>;
4306
4259
  provenance?: {
4307
4260
  refs: {
4308
4261
  ns?: string | undefined;
@@ -4314,10 +4267,13 @@ export declare function planSceneNodeChanges(snapshot: Pick<SceneState, 'nodes'
4314
4267
  fromIds: string[];
4315
4268
  } | undefined;
4316
4269
  } | undefined;
4317
- id: `liquid-line_${string}`;
4318
- path: [number, number, number][];
4319
- diameter: number;
4320
- type: "liquid-line";
4270
+ id: `unit_${string}`;
4271
+ name: string;
4272
+ kind: "apartment" | "commercial" | "common" | "hotel-room";
4273
+ members: `zone_${string}`[];
4274
+ color: string;
4275
+ metadata: Record<string, unknown>;
4276
+ type: "unit";
4321
4277
  } | {
4322
4278
  object: "node";
4323
4279
  name?: string | undefined;
@@ -4342,28 +4298,12 @@ export declare function planSceneNodeChanges(snapshot: Pick<SceneState, 'nodes'
4342
4298
  fromIds: string[];
4343
4299
  } | undefined;
4344
4300
  } | undefined;
4345
- id: `pipe-segment_${string}`;
4346
- path: [number, number, number][];
4347
- autoHangers?: boolean | undefined;
4348
- hangerOverrides?: Record<string, {
4349
- fraction?: number | undefined;
4350
- skipped?: boolean | undefined;
4351
- hostId?: string | undefined;
4352
- }> | undefined;
4353
- hangerStyle?: "double" | "single" | undefined;
4354
- hangerSpacing?: number | undefined;
4355
- hangerMaxReach?: number | undefined;
4356
- wallAttachment?: {
4357
- wallId: `wall_${string}`;
4358
- side: "back" | "front";
4359
- startUV: [number, number];
4360
- endUV: [number, number];
4361
- offset: number;
4362
- } | undefined;
4363
- diameter: number;
4364
- pipeMaterial: "abs" | "cast-iron" | "pvc";
4365
- system: "vent" | "waste";
4366
- type: "pipe-segment";
4301
+ id: `building_${string}`;
4302
+ children: (`elevator_${string}` | `level_${string}` | `unit_${string}`)[];
4303
+ position: [number, number, number];
4304
+ rotation: [number, number, number];
4305
+ groundLevelId?: `level_${string}` | undefined;
4306
+ type: "building";
4367
4307
  } | {
4368
4308
  object: "node";
4369
4309
  name?: string | undefined;
@@ -4388,17 +4328,126 @@ export declare function planSceneNodeChanges(snapshot: Pick<SceneState, 'nodes'
4388
4328
  fromIds: string[];
4389
4329
  } | undefined;
4390
4330
  } | undefined;
4391
- id: `pipe-fitting_${string}`;
4331
+ id: `dormer_${string}`;
4332
+ material?: {
4333
+ id?: string | undefined;
4334
+ preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
4335
+ properties?: {
4336
+ color: string;
4337
+ roughness: number;
4338
+ metalness: number;
4339
+ opacity: number;
4340
+ transparent: boolean;
4341
+ side: "back" | "double" | "front";
4342
+ } | undefined;
4343
+ texture?: {
4344
+ url: string;
4345
+ repeat?: [number, number] | undefined;
4346
+ scale?: number | undefined;
4347
+ offset?: [number, number] | undefined;
4348
+ normalMap?: string | undefined;
4349
+ normalScale?: number | undefined;
4350
+ bumpMap?: string | undefined;
4351
+ bumpScale?: number | undefined;
4352
+ } | undefined;
4353
+ } | undefined;
4354
+ materialPreset?: string | undefined;
4355
+ topMaterial?: {
4356
+ id?: string | undefined;
4357
+ preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
4358
+ properties?: {
4359
+ color: string;
4360
+ roughness: number;
4361
+ metalness: number;
4362
+ opacity: number;
4363
+ transparent: boolean;
4364
+ side: "back" | "double" | "front";
4365
+ } | undefined;
4366
+ texture?: {
4367
+ url: string;
4368
+ repeat?: [number, number] | undefined;
4369
+ scale?: number | undefined;
4370
+ offset?: [number, number] | undefined;
4371
+ normalMap?: string | undefined;
4372
+ normalScale?: number | undefined;
4373
+ bumpMap?: string | undefined;
4374
+ bumpScale?: number | undefined;
4375
+ } | undefined;
4376
+ } | undefined;
4377
+ topMaterialPreset?: string | undefined;
4378
+ sideMaterial?: {
4379
+ id?: string | undefined;
4380
+ preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
4381
+ properties?: {
4382
+ color: string;
4383
+ roughness: number;
4384
+ metalness: number;
4385
+ opacity: number;
4386
+ transparent: boolean;
4387
+ side: "back" | "double" | "front";
4388
+ } | undefined;
4389
+ texture?: {
4390
+ url: string;
4391
+ repeat?: [number, number] | undefined;
4392
+ scale?: number | undefined;
4393
+ offset?: [number, number] | undefined;
4394
+ normalMap?: string | undefined;
4395
+ normalScale?: number | undefined;
4396
+ bumpMap?: string | undefined;
4397
+ bumpScale?: number | undefined;
4398
+ } | undefined;
4399
+ } | undefined;
4400
+ sideMaterialPreset?: string | undefined;
4401
+ wallMaterial?: {
4402
+ id?: string | undefined;
4403
+ preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
4404
+ properties?: {
4405
+ color: string;
4406
+ roughness: number;
4407
+ metalness: number;
4408
+ opacity: number;
4409
+ transparent: boolean;
4410
+ side: "back" | "double" | "front";
4411
+ } | undefined;
4412
+ texture?: {
4413
+ url: string;
4414
+ repeat?: [number, number] | undefined;
4415
+ scale?: number | undefined;
4416
+ offset?: [number, number] | undefined;
4417
+ normalMap?: string | undefined;
4418
+ normalScale?: number | undefined;
4419
+ bumpMap?: string | undefined;
4420
+ bumpScale?: number | undefined;
4421
+ } | undefined;
4422
+ } | undefined;
4423
+ wallMaterialPreset?: string | undefined;
4424
+ roofSegmentId?: string | undefined;
4392
4425
  position: [number, number, number];
4393
- rotation: [number, number, number];
4394
- fittingType: "cleanout" | "coupling" | "cross" | "elbow" | "end-cap" | "reducer" | "sanitary-tee" | "wye";
4395
- angle: number;
4396
- diameter: number;
4397
- diameter2: number;
4398
- cleanoutStyle: "end" | "inline";
4399
- pipeMaterial: "abs" | "cast-iron" | "pvc";
4400
- system: "vent" | "waste";
4401
- type: "pipe-fitting";
4426
+ rotation: number;
4427
+ width: number;
4428
+ depth: number;
4429
+ height: number;
4430
+ roofType: "barrel" | "conical" | "dutch" | "flat" | "gable" | "gambrel" | "hip" | "mansard" | "shed";
4431
+ roofHeight: number;
4432
+ shedHighSide: "back" | "front";
4433
+ wallSkirtHeight: number;
4434
+ windowWidth: number;
4435
+ windowHeight: number;
4436
+ windowOffsetX: number;
4437
+ windowOffsetY: number;
4438
+ windowFrameThickness: number;
4439
+ windowFrameDepth: number;
4440
+ windowColumns: number;
4441
+ windowRows: number;
4442
+ windowDividerThickness: number;
4443
+ windowShape: "arch" | "rectangle" | "rounded";
4444
+ windowArchHeight: number;
4445
+ windowCornerRadii: [number, number, number, number];
4446
+ windowSill: boolean;
4447
+ windowSillDepth: number;
4448
+ windowSillThickness: number;
4449
+ children: `window_${string}`[];
4450
+ type: "dormer";
4402
4451
  } | {
4403
4452
  object: "node";
4404
4453
  name?: string | undefined;
@@ -4423,13 +4472,54 @@ export declare function planSceneNodeChanges(snapshot: Pick<SceneState, 'nodes'
4423
4472
  fromIds: string[];
4424
4473
  } | undefined;
4425
4474
  } | undefined;
4426
- id: `pipe-trap_${string}`;
4475
+ id: `gutter_${string}`;
4476
+ material?: {
4477
+ id?: string | undefined;
4478
+ preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
4479
+ properties?: {
4480
+ color: string;
4481
+ roughness: number;
4482
+ metalness: number;
4483
+ opacity: number;
4484
+ transparent: boolean;
4485
+ side: "back" | "double" | "front";
4486
+ } | undefined;
4487
+ texture?: {
4488
+ url: string;
4489
+ repeat?: [number, number] | undefined;
4490
+ scale?: number | undefined;
4491
+ offset?: [number, number] | undefined;
4492
+ normalMap?: string | undefined;
4493
+ normalScale?: number | undefined;
4494
+ bumpMap?: string | undefined;
4495
+ bumpScale?: number | undefined;
4496
+ } | undefined;
4497
+ } | undefined;
4498
+ slots?: Record<string, string> | undefined;
4499
+ materialPreset: string;
4500
+ roofSegmentId?: string | undefined;
4427
4501
  position: [number, number, number];
4428
4502
  rotation: number;
4429
- diameter: number;
4430
- pipeMaterial: "abs" | "cast-iron" | "pvc";
4431
- armLengthM: number;
4432
- type: "pipe-trap";
4503
+ length: number;
4504
+ arc?: {
4505
+ centerX: number;
4506
+ centerZ: number;
4507
+ radius: number;
4508
+ } | undefined;
4509
+ size: number;
4510
+ thickness: number;
4511
+ profile: "box" | "half-round" | "k-style";
4512
+ endCapLeft: boolean;
4513
+ endCapRight: boolean;
4514
+ hangerStyle: "none" | "strap";
4515
+ hangerSpacing: number;
4516
+ outlets: {
4517
+ id: string;
4518
+ offset: number;
4519
+ diameter: number;
4520
+ generatedBy?: "default-downspout" | undefined;
4521
+ }[];
4522
+ type: "gutter";
4433
4523
  } | {
4434
4524
  object: "node";
4435
4525
  name?: string | undefined;
@@ -4454,71 +4544,198 @@ export declare function planSceneNodeChanges(snapshot: Pick<SceneState, 'nodes'
4454
4544
  fromIds: string[];
4455
4545
  } | undefined;
4456
4546
  } | undefined;
4457
- id: `level_${string}`;
4458
- children: (`beam_${string}` | `block_${string}` | `ceiling_${string}` | `column_${string}` | `construction-dimension_${string}` | `duct-fitting_${string}` | `duct-segment_${string}` | `duct-terminal_${string}` | `fence_${string}` | `floor-opening_${string}` | `guide_${string}` | `hvac-equipment_${string}` | `imesh_${string}` | `item_${string}` | `lineset_${string}` | `liquid-line_${string}` | `measurement_${string}` | `pipe-fitting_${string}` | `pipe-segment_${string}` | `pipe-trap_${string}` | `procedural-item_${string}` | `roof_${string}` | `scan_${string}` | `separator_${string}` | `shelf_${string}` | `slab_${string}` | `spawn_${string}` | `stair_${string}` | `structural-grid_${string}` | `wall_${string}` | `zone_${string}`)[];
4459
- level: number;
4460
- baseElevation: number;
4461
- height?: number | undefined;
4462
- type: "level";
4463
- } | {
4464
- object: "node";
4465
- parentId: string | null;
4466
- visible: boolean;
4467
- camera?: {
4468
- position: [number, number, number];
4469
- target: [number, number, number];
4470
- mode: "orthographic" | "perspective";
4471
- fov?: number | undefined;
4472
- zoom?: number | undefined;
4547
+ id: `site_${string}`;
4548
+ polygon: {
4549
+ type: "polygon";
4550
+ points: [number, number][];
4551
+ };
4552
+ terrain?: {
4553
+ type: "heightfield";
4554
+ origin: [number, number];
4555
+ spacing: number;
4556
+ cols: number;
4557
+ rows: number;
4558
+ step: number;
4559
+ heights: string;
4473
4560
  } | undefined;
4474
- provenance?: {
4475
- refs: {
4476
- ns?: string | undefined;
4477
- id: string;
4478
- role?: "absorbed" | "alias" | "derived" | "piece" | "primary" | undefined;
4479
- }[];
4480
- lineage?: {
4481
- op: "attach" | "convert" | "duplicate" | "import" | "make-independent" | "merge" | "promote" | "split";
4482
- fromIds: string[];
4561
+ showGround?: boolean | undefined;
4562
+ presentation?: {
4563
+ theme?: string | undefined;
4564
+ exposure?: number | undefined;
4565
+ shading?: "rendered" | "solid" | undefined;
4566
+ edges?: "off" | "soft" | "strong" | undefined;
4567
+ shadows?: boolean | undefined;
4568
+ lighting?: {
4569
+ background?: string | undefined;
4570
+ backgroundSky?: string | null | undefined;
4571
+ ground?: string | undefined;
4572
+ ambient?: {
4573
+ color: string;
4574
+ intensity: number;
4575
+ } | undefined;
4576
+ hemi?: {
4577
+ sky: string;
4578
+ ground: string;
4579
+ intensity: number;
4580
+ } | undefined;
4581
+ lights?: {
4582
+ color: string;
4583
+ intensity: number;
4584
+ position: [number, number, number];
4585
+ target?: [number, number, number] | undefined;
4586
+ castShadow?: boolean | undefined;
4587
+ shadow?: {
4588
+ intensity?: number | undefined;
4589
+ bias?: number | undefined;
4590
+ normalBias?: number | undefined;
4591
+ radius?: number | undefined;
4592
+ mapSize?: 512 | 1024 | 2048 | 4096 | undefined;
4593
+ camera?: {
4594
+ left: number;
4595
+ right: number;
4596
+ top: number;
4597
+ bottom: number;
4598
+ near: number;
4599
+ far: number;
4600
+ } | undefined;
4601
+ } | undefined;
4602
+ }[] | undefined;
4603
+ environment?: {
4604
+ source: "gradient" | "none" | "room";
4605
+ intensity: number;
4606
+ } | undefined;
4607
+ } | undefined;
4608
+ postprocessing?: {
4609
+ ambientOcclusion?: boolean | undefined;
4610
+ colorGrading?: boolean | undefined;
4611
+ } | undefined;
4612
+ display?: {
4613
+ mode?: "construction" | "finished" | "systems" | undefined;
4614
+ families?: Partial<Record<"device" | "exposed-structure" | "fill" | "finish" | "foundation" | "framing" | "inspection" | "insulation" | "masonry" | "membrane" | "run" | "service-space" | "sheathing", boolean>> | undefined;
4615
+ disciplines?: Partial<Record<"electrical" | "fire" | "low-voltage" | "mechanical" | "plumbing", boolean>> | undefined;
4616
+ xray?: boolean | undefined;
4617
+ colorBy?: "material" | "service" | undefined;
4483
4618
  } | undefined;
4484
4619
  } | undefined;
4485
- id: `unit_${string}`;
4486
- name: string;
4487
- kind: "apartment" | "commercial" | "common" | "hotel-room";
4488
- members: `zone_${string}`[];
4489
- color: string;
4490
- metadata: Record<string, unknown>;
4491
- type: "unit";
4492
- } | {
4493
- object: "node";
4494
- name?: string | undefined;
4495
- parentId: string | null;
4496
- visible: boolean;
4497
- camera?: {
4498
- position: [number, number, number];
4499
- target: [number, number, number];
4500
- mode: "orthographic" | "perspective";
4501
- fov?: number | undefined;
4502
- zoom?: number | undefined;
4620
+ address?: {
4621
+ street?: string | undefined;
4622
+ city?: string | undefined;
4623
+ state?: string | undefined;
4624
+ zip?: string | undefined;
4503
4625
  } | undefined;
4504
- metadata: Record<string, unknown>;
4505
- provenance?: {
4506
- refs: {
4507
- ns?: string | undefined;
4508
- id: string;
4509
- role?: "absorbed" | "alias" | "derived" | "piece" | "primary" | undefined;
4510
- }[];
4511
- lineage?: {
4512
- op: "attach" | "convert" | "duplicate" | "import" | "make-independent" | "merge" | "promote" | "split";
4513
- fromIds: string[];
4626
+ parcel?: {
4627
+ apn?: string | undefined;
4628
+ source?: string | undefined;
4629
+ county?: string | undefined;
4630
+ state?: string | undefined;
4631
+ lotAreaSqFt?: number | undefined;
4632
+ originLngLat?: [number, number] | undefined;
4633
+ resolvedAt?: string | undefined;
4634
+ layer?: string | undefined;
4635
+ notes?: string[] | undefined;
4636
+ } | undefined;
4637
+ setbacks?: {
4638
+ front: number;
4639
+ side: number;
4640
+ rear: number;
4641
+ left?: number | undefined;
4642
+ right?: number | undefined;
4643
+ streetSide?: number | undefined;
4644
+ } | undefined;
4645
+ setbacksSource?: string | undefined;
4646
+ zone?: string | undefined;
4647
+ frontEdge?: number | undefined;
4648
+ streetEdges?: number[] | undefined;
4649
+ sightTriangleFt?: number | undefined;
4650
+ northRotation?: number | undefined;
4651
+ dossier?: {
4652
+ [x: string]: unknown;
4653
+ provider: string;
4654
+ asOf: string;
4655
+ point?: {
4656
+ lat?: number | undefined;
4657
+ lng?: number | undefined;
4658
+ source?: string | undefined;
4659
+ } | undefined;
4660
+ address?: {
4661
+ formatted?: string | undefined;
4662
+ precision?: string | undefined;
4514
4663
  } | undefined;
4664
+ sections: Record<string, {
4665
+ [x: string]: unknown;
4666
+ status: string;
4667
+ summary?: string | undefined;
4668
+ reason?: string | undefined;
4669
+ source?: {
4670
+ name?: string | undefined;
4671
+ kind?: string | undefined;
4672
+ vintage?: string | undefined;
4673
+ attribution?: string | undefined;
4674
+ } | undefined;
4675
+ }>;
4676
+ parcel?: Record<string, unknown> | undefined;
4677
+ flood?: Record<string, unknown> | undefined;
4678
+ codeBasis?: Record<string, unknown> | undefined;
4679
+ zoning?: Record<string, unknown> | undefined;
4680
+ utilities?: Record<string, unknown> | undefined;
4681
+ soils?: Record<string, unknown> | undefined;
4682
+ wetlands?: Record<string, unknown> | undefined;
4683
+ structures?: Record<string, unknown> | undefined;
4684
+ elevation?: Record<string, unknown> | undefined;
4685
+ boundaries?: Record<string, unknown> | undefined;
4515
4686
  } | undefined;
4516
- id: `building_${string}`;
4517
- children: (`elevator_${string}` | `level_${string}` | `unit_${string}`)[];
4518
- position: [number, number, number];
4519
- rotation: [number, number, number];
4520
- groundLevelId?: `level_${string}` | undefined;
4521
- type: "building";
4687
+ contourIntervalIn?: number | undefined;
4688
+ contours3d?: boolean | undefined;
4689
+ terrainContours?: {
4690
+ datum: string;
4691
+ intervalFt: number;
4692
+ source?: string | undefined;
4693
+ lines: {
4694
+ elevationFt: number;
4695
+ points: [number, number][];
4696
+ }[];
4697
+ } | undefined;
4698
+ wallTypes?: {
4699
+ id: string;
4700
+ label: string;
4701
+ assembly: {
4702
+ layers: {
4703
+ id: string;
4704
+ role: "air" | "covering" | "deck" | "fill" | "finish" | "furring" | "glazing" | "insulation" | "lining" | "membrane" | "sheathing" | "shell" | "structure" | "substrate" | "underlay";
4705
+ thickness: number;
4706
+ core?: true | undefined;
4707
+ spacing?: number | undefined;
4708
+ material?: string | undefined;
4709
+ slot?: string | undefined;
4710
+ returns?: boolean | undefined;
4711
+ display?: "construction" | "finished" | undefined;
4712
+ inset?: number | undefined;
4713
+ bottom?: number | undefined;
4714
+ lift?: number | undefined;
4715
+ src?: string | undefined;
4716
+ }[];
4717
+ backing?: {
4718
+ id: string;
4719
+ role: "air" | "covering" | "deck" | "fill" | "finish" | "furring" | "glazing" | "insulation" | "lining" | "membrane" | "sheathing" | "shell" | "structure" | "substrate" | "underlay";
4720
+ thickness: number;
4721
+ core?: true | undefined;
4722
+ spacing?: number | undefined;
4723
+ material?: string | undefined;
4724
+ slot?: string | undefined;
4725
+ returns?: boolean | undefined;
4726
+ display?: "construction" | "finished" | undefined;
4727
+ inset?: number | undefined;
4728
+ bottom?: number | undefined;
4729
+ lift?: number | undefined;
4730
+ src?: string | undefined;
4731
+ }[] | undefined;
4732
+ face?: "exterior" | "front" | undefined;
4733
+ presetId?: string | undefined;
4734
+ cavityInsulation?: string | undefined;
4735
+ };
4736
+ }[] | undefined;
4737
+ children: string[];
4738
+ type: "site";
4522
4739
  } | {
4523
4740
  object: "node";
4524
4741
  name?: string | undefined;
@@ -5224,78 +5441,6 @@ export declare function planSceneNodeChanges(snapshot: Pick<SceneState, 'nodes'
5224
5441
  louverCount: number;
5225
5442
  backRatio: number;
5226
5443
  type: "eyebrow-vent";
5227
- } | {
5228
- object: "node";
5229
- name?: string | undefined;
5230
- parentId: string | null;
5231
- visible: boolean;
5232
- camera?: {
5233
- position: [number, number, number];
5234
- target: [number, number, number];
5235
- mode: "orthographic" | "perspective";
5236
- fov?: number | undefined;
5237
- zoom?: number | undefined;
5238
- } | undefined;
5239
- metadata: Record<string, unknown>;
5240
- provenance?: {
5241
- refs: {
5242
- ns?: string | undefined;
5243
- id: string;
5244
- role?: "absorbed" | "alias" | "derived" | "piece" | "primary" | undefined;
5245
- }[];
5246
- lineage?: {
5247
- op: "attach" | "convert" | "duplicate" | "import" | "make-independent" | "merge" | "promote" | "split";
5248
- fromIds: string[];
5249
- } | undefined;
5250
- } | undefined;
5251
- id: `gutter_${string}`;
5252
- material?: {
5253
- id?: string | undefined;
5254
- preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
5255
- properties?: {
5256
- color: string;
5257
- roughness: number;
5258
- metalness: number;
5259
- opacity: number;
5260
- transparent: boolean;
5261
- side: "back" | "double" | "front";
5262
- } | undefined;
5263
- texture?: {
5264
- url: string;
5265
- repeat?: [number, number] | undefined;
5266
- scale?: number | undefined;
5267
- offset?: [number, number] | undefined;
5268
- normalMap?: string | undefined;
5269
- normalScale?: number | undefined;
5270
- bumpMap?: string | undefined;
5271
- bumpScale?: number | undefined;
5272
- } | undefined;
5273
- } | undefined;
5274
- slots?: Record<string, string> | undefined;
5275
- materialPreset: string;
5276
- roofSegmentId?: string | undefined;
5277
- position: [number, number, number];
5278
- rotation: number;
5279
- length: number;
5280
- arc?: {
5281
- centerX: number;
5282
- centerZ: number;
5283
- radius: number;
5284
- } | undefined;
5285
- size: number;
5286
- thickness: number;
5287
- profile: "box" | "half-round" | "k-style";
5288
- endCapLeft: boolean;
5289
- endCapRight: boolean;
5290
- hangerStyle: "none" | "strap";
5291
- hangerSpacing: number;
5292
- outlets: {
5293
- id: string;
5294
- offset: number;
5295
- diameter: number;
5296
- generatedBy?: "default-downspout" | undefined;
5297
- }[];
5298
- type: "gutter";
5299
5444
  } | {
5300
5445
  object: "node";
5301
5446
  name?: string | undefined;
@@ -5588,150 +5733,6 @@ export declare function planSceneNodeChanges(snapshot: Pick<SceneState, 'nodes'
5588
5733
  cutoutOffset: number;
5589
5734
  surfaceNormal?: [number, number, number] | undefined;
5590
5735
  type: "skylight";
5591
- } | {
5592
- object: "node";
5593
- name?: string | undefined;
5594
- parentId: string | null;
5595
- visible: boolean;
5596
- camera?: {
5597
- position: [number, number, number];
5598
- target: [number, number, number];
5599
- mode: "orthographic" | "perspective";
5600
- fov?: number | undefined;
5601
- zoom?: number | undefined;
5602
- } | undefined;
5603
- metadata: Record<string, unknown>;
5604
- provenance?: {
5605
- refs: {
5606
- ns?: string | undefined;
5607
- id: string;
5608
- role?: "absorbed" | "alias" | "derived" | "piece" | "primary" | undefined;
5609
- }[];
5610
- lineage?: {
5611
- op: "attach" | "convert" | "duplicate" | "import" | "make-independent" | "merge" | "promote" | "split";
5612
- fromIds: string[];
5613
- } | undefined;
5614
- } | undefined;
5615
- id: `dormer_${string}`;
5616
- material?: {
5617
- id?: string | undefined;
5618
- preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
5619
- properties?: {
5620
- color: string;
5621
- roughness: number;
5622
- metalness: number;
5623
- opacity: number;
5624
- transparent: boolean;
5625
- side: "back" | "double" | "front";
5626
- } | undefined;
5627
- texture?: {
5628
- url: string;
5629
- repeat?: [number, number] | undefined;
5630
- scale?: number | undefined;
5631
- offset?: [number, number] | undefined;
5632
- normalMap?: string | undefined;
5633
- normalScale?: number | undefined;
5634
- bumpMap?: string | undefined;
5635
- bumpScale?: number | undefined;
5636
- } | undefined;
5637
- } | undefined;
5638
- materialPreset?: string | undefined;
5639
- topMaterial?: {
5640
- id?: string | undefined;
5641
- preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
5642
- properties?: {
5643
- color: string;
5644
- roughness: number;
5645
- metalness: number;
5646
- opacity: number;
5647
- transparent: boolean;
5648
- side: "back" | "double" | "front";
5649
- } | undefined;
5650
- texture?: {
5651
- url: string;
5652
- repeat?: [number, number] | undefined;
5653
- scale?: number | undefined;
5654
- offset?: [number, number] | undefined;
5655
- normalMap?: string | undefined;
5656
- normalScale?: number | undefined;
5657
- bumpMap?: string | undefined;
5658
- bumpScale?: number | undefined;
5659
- } | undefined;
5660
- } | undefined;
5661
- topMaterialPreset?: string | undefined;
5662
- sideMaterial?: {
5663
- id?: string | undefined;
5664
- preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
5665
- properties?: {
5666
- color: string;
5667
- roughness: number;
5668
- metalness: number;
5669
- opacity: number;
5670
- transparent: boolean;
5671
- side: "back" | "double" | "front";
5672
- } | undefined;
5673
- texture?: {
5674
- url: string;
5675
- repeat?: [number, number] | undefined;
5676
- scale?: number | undefined;
5677
- offset?: [number, number] | undefined;
5678
- normalMap?: string | undefined;
5679
- normalScale?: number | undefined;
5680
- bumpMap?: string | undefined;
5681
- bumpScale?: number | undefined;
5682
- } | undefined;
5683
- } | undefined;
5684
- sideMaterialPreset?: string | undefined;
5685
- wallMaterial?: {
5686
- id?: string | undefined;
5687
- preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
5688
- properties?: {
5689
- color: string;
5690
- roughness: number;
5691
- metalness: number;
5692
- opacity: number;
5693
- transparent: boolean;
5694
- side: "back" | "double" | "front";
5695
- } | undefined;
5696
- texture?: {
5697
- url: string;
5698
- repeat?: [number, number] | undefined;
5699
- scale?: number | undefined;
5700
- offset?: [number, number] | undefined;
5701
- normalMap?: string | undefined;
5702
- normalScale?: number | undefined;
5703
- bumpMap?: string | undefined;
5704
- bumpScale?: number | undefined;
5705
- } | undefined;
5706
- } | undefined;
5707
- wallMaterialPreset?: string | undefined;
5708
- roofSegmentId?: string | undefined;
5709
- position: [number, number, number];
5710
- rotation: number;
5711
- width: number;
5712
- depth: number;
5713
- height: number;
5714
- roofType: "barrel" | "conical" | "dutch" | "flat" | "gable" | "gambrel" | "hip" | "mansard" | "shed";
5715
- roofHeight: number;
5716
- shedHighSide: "back" | "front";
5717
- wallSkirtHeight: number;
5718
- windowWidth: number;
5719
- windowHeight: number;
5720
- windowOffsetX: number;
5721
- windowOffsetY: number;
5722
- windowFrameThickness: number;
5723
- windowFrameDepth: number;
5724
- windowColumns: number;
5725
- windowRows: number;
5726
- windowDividerThickness: number;
5727
- windowShape: "arch" | "rectangle" | "rounded";
5728
- windowArchHeight: number;
5729
- windowCornerRadii: [number, number, number, number];
5730
- windowSill: boolean;
5731
- windowSillDepth: number;
5732
- windowSillThickness: number;
5733
- children: `window_${string}`[];
5734
- type: "dormer";
5735
5736
  } | {
5736
5737
  object: "node";
5737
5738
  name?: string | undefined;