@pascal-app/core 1.1.0 → 1.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (124) hide show
  1. package/dist/agent-operations/__fixtures__/cases.d.ts +3 -2
  2. package/dist/agent-operations/__fixtures__/cases.d.ts.map +1 -1
  3. package/dist/agent-operations/__fixtures__/place-items-cases.d.ts.map +1 -1
  4. package/dist/agent-operations/__fixtures__/place-items-cases.js +28 -0
  5. package/dist/agent-operations/__fixtures__/roof-bearing-cases.d.ts +12209 -12209
  6. package/dist/agent-operations/asset-catalog.d.ts +21 -11
  7. package/dist/agent-operations/asset-catalog.d.ts.map +1 -1
  8. package/dist/agent-operations/asset-catalog.js +28 -10
  9. package/dist/agent-operations/asset-views.d.ts +8 -3
  10. package/dist/agent-operations/asset-views.d.ts.map +1 -1
  11. package/dist/agent-operations/asset-views.js +19 -3
  12. package/dist/agent-operations/batch.d.ts +7 -1
  13. package/dist/agent-operations/batch.d.ts.map +1 -1
  14. package/dist/agent-operations/batch.js +17 -2
  15. package/dist/agent-operations/catalog-asset.d.ts +15 -0
  16. package/dist/agent-operations/catalog-asset.d.ts.map +1 -0
  17. package/dist/agent-operations/catalog-asset.js +4 -0
  18. package/dist/agent-operations/circulation-spaces.d.ts +2963 -2963
  19. package/dist/agent-operations/design-brief.d.ts.map +1 -1
  20. package/dist/agent-operations/design-brief.js +2 -0
  21. package/dist/agent-operations/furnish-room.d.ts.map +1 -1
  22. package/dist/agent-operations/furnish-room.js +2 -1
  23. package/dist/agent-operations/index.d.ts +3 -0
  24. package/dist/agent-operations/index.d.ts.map +1 -1
  25. package/dist/agent-operations/index.js +4 -1
  26. package/dist/agent-operations/level-reads.d.ts.map +1 -1
  27. package/dist/agent-operations/level-reads.js +4 -1
  28. package/dist/agent-operations/place-in-room.d.ts.map +1 -1
  29. package/dist/agent-operations/place-in-room.js +2 -1
  30. package/dist/agent-operations/place-items.d.ts.map +1 -1
  31. package/dist/agent-operations/place-items.js +2 -1
  32. package/dist/agent-operations/scene-queries.d.ts +585 -585
  33. package/dist/agent-operations/scene-view.d.ts.map +1 -1
  34. package/dist/agent-operations/scene-view.js +38 -13
  35. package/dist/agent-operations/search-assets.d.ts.map +1 -1
  36. package/dist/agent-operations/search-assets.js +6 -0
  37. package/dist/agent-operations/types.d.ts +3 -2
  38. package/dist/agent-operations/types.d.ts.map +1 -1
  39. package/dist/agent-operations/usage-checks.js +18 -3
  40. package/dist/agent-tools/assets.js +1 -1
  41. package/dist/building/__fixtures__/wall-opening-cases.d.ts +234 -234
  42. package/dist/building/level-duplication.d.ts +3516 -3516
  43. package/dist/building/level-duplication.d.ts.map +1 -1
  44. package/dist/building/level-duplication.js +3 -1
  45. package/dist/building/wall-openings.d.ts +75 -75
  46. package/dist/commands/structure/shared.d.ts +3407 -3407
  47. package/dist/commands/structure/zone-wall-merge.d.ts +566 -566
  48. package/dist/hooks/spatial-grid/spatial-grid-sync.d.ts +585 -585
  49. package/dist/index.d.ts +2 -0
  50. package/dist/index.d.ts.map +1 -1
  51. package/dist/index.js +2 -0
  52. package/dist/lib/__fixtures__/mezzanine.d.ts +9262 -9262
  53. package/dist/lib/absorb-wall-separators.d.ts +1344 -1344
  54. package/dist/lib/asset-storage.d.ts.map +1 -1
  55. package/dist/lib/asset-storage.js +3 -0
  56. package/dist/lib/floor-foundation-datum.d.ts.map +1 -1
  57. package/dist/lib/floor-foundation-datum.js +5 -1
  58. package/dist/lib/floorplan/context.d.ts +95 -0
  59. package/dist/lib/floorplan/context.d.ts.map +1 -0
  60. package/dist/lib/floorplan/context.js +155 -0
  61. package/dist/lib/floorplan/index.d.ts +6 -0
  62. package/dist/lib/floorplan/index.d.ts.map +1 -0
  63. package/dist/lib/floorplan/index.js +5 -0
  64. package/dist/lib/floorplan/marks.d.ts +71 -0
  65. package/dist/lib/floorplan/marks.d.ts.map +1 -0
  66. package/dist/lib/floorplan/marks.js +157 -0
  67. package/dist/lib/floorplan/plan-math.d.ts +18 -0
  68. package/dist/lib/floorplan/plan-math.d.ts.map +1 -0
  69. package/dist/lib/floorplan/plan-math.js +82 -0
  70. package/dist/lib/floorplan/svg-paths.d.ts +17 -0
  71. package/dist/lib/floorplan/svg-paths.d.ts.map +1 -0
  72. package/dist/lib/floorplan/svg-paths.js +92 -0
  73. package/dist/lib/floorplan/wall-affordances.d.ts +31 -0
  74. package/dist/lib/floorplan/wall-affordances.d.ts.map +1 -0
  75. package/dist/lib/floorplan/wall-affordances.js +24 -0
  76. package/dist/registry/__fixtures__/roof-planes.d.ts +69 -0
  77. package/dist/registry/__fixtures__/roof-planes.d.ts.map +1 -0
  78. package/dist/registry/__fixtures__/roof-planes.js +59 -0
  79. package/dist/registry/index.d.ts +2 -1
  80. package/dist/registry/index.d.ts.map +1 -1
  81. package/dist/registry/index.js +1 -0
  82. package/dist/registry/roofs.d.ts +34 -0
  83. package/dist/registry/roofs.d.ts.map +1 -0
  84. package/dist/registry/roofs.js +61 -0
  85. package/dist/registry/types.d.ts +30 -0
  86. package/dist/registry/types.d.ts.map +1 -1
  87. package/dist/registry/validate-relations.d.ts +5 -1
  88. package/dist/registry/validate-relations.d.ts.map +1 -1
  89. package/dist/registry/validate-relations.js +6 -2
  90. package/dist/schema/asset-url.d.ts +8 -0
  91. package/dist/schema/asset-url.d.ts.map +1 -1
  92. package/dist/schema/asset-url.js +17 -0
  93. package/dist/schema/nodes/roof.d.ts +1 -1
  94. package/dist/schema/nodes/roof.d.ts.map +1 -1
  95. package/dist/schema/nodes/roof.js +13 -8
  96. package/dist/schema/types.d.ts +1 -1
  97. package/dist/services/roof-level.d.ts.map +1 -1
  98. package/dist/services/roof-level.js +12 -2
  99. package/dist/services/roof-move.d.ts +4 -2
  100. package/dist/services/roof-move.d.ts.map +1 -1
  101. package/dist/services/roof-move.js +21 -9
  102. package/dist/spatial/usage-field/findings.d.ts +7 -1
  103. package/dist/spatial/usage-field/findings.d.ts.map +1 -1
  104. package/dist/spatial/usage-field/findings.js +42 -10
  105. package/dist/spatial/usage-field/path.d.ts.map +1 -1
  106. package/dist/spatial/usage-field/path.js +28 -18
  107. package/dist/store/actions/node-actions.d.ts +1641 -1641
  108. package/dist/store/scene-annotations.d.ts +1778 -1778
  109. package/dist/systems/document-reconcile.d.ts.map +1 -1
  110. package/dist/systems/document-reconcile.js +1 -2
  111. package/dist/systems/roof/roof-elevation.d.ts +11 -6
  112. package/dist/systems/roof/roof-elevation.d.ts.map +1 -1
  113. package/dist/systems/roof/roof-elevation.js +24 -11
  114. package/dist/systems/slab/__fixtures__/floor-step.d.ts +1622 -1622
  115. package/dist/systems/slab/__fixtures__/raised-room.d.ts +585 -585
  116. package/dist/systems/stair/stair-opening-preview.d.ts +1919 -1919
  117. package/dist/utils/ensure-scene-openings.d.ts +3409 -3409
  118. package/dist/utils/floor-plate-migration.d.ts +1344 -1344
  119. package/dist/utils/owned-floor-opening-migration.d.ts +1344 -1344
  120. package/dist/utils/reconcile-structure-on-load.d.ts +1641 -1641
  121. package/dist/utils/scene-bounds.d.ts +32 -0
  122. package/dist/utils/scene-bounds.d.ts.map +1 -0
  123. package/dist/utils/scene-bounds.js +201 -0
  124. package/package.json +1 -1
@@ -110,126 +110,54 @@ export declare function planSceneNodeChanges(snapshot: Pick<SceneState, 'nodes'
110
110
  fromIds: string[];
111
111
  } | undefined;
112
112
  } | undefined;
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[];
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";
158
124
  } | 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[];
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;
218
134
  } | undefined;
219
135
  } | undefined;
220
- id: `duct-terminal_${string}`;
136
+ materialPreset?: string | undefined;
137
+ slots?: Record<string, string> | undefined;
221
138
  position: [number, number, number];
222
139
  rotation: number;
223
- supportSlabId?: string | undefined;
224
- terminalType: "diffuser" | "return-grille" | "supply-register";
225
- mount: "ceiling" | "floor" | "wall";
226
140
  width: number;
227
141
  depth: number;
228
- collarShape: "oval" | "rect" | "round";
229
- collarDiameter: number;
230
- collarWidth: number;
231
- collarHeight: number;
232
- type: "duct-terminal";
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";
233
161
  } | {
234
162
  object: "node";
235
163
  name?: string | undefined;
@@ -254,146 +182,232 @@ export declare function planSceneNodeChanges(snapshot: Pick<SceneState, 'nodes'
254
182
  fromIds: string[];
255
183
  } | undefined;
256
184
  } | undefined;
257
- id: `guide_${string}`;
258
- url: string;
185
+ type: "item";
186
+ id: `item_${string}`;
259
187
  position: [number, number, number];
260
188
  rotation: [number, number, number];
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[];
296
- } | undefined;
297
- } | undefined;
298
- id: `liquid-line_${string}`;
299
- path: [number, number, number][];
300
- diameter: number;
301
- type: "liquid-line";
302
- } | {
303
- object: "node";
304
- name?: string | undefined;
305
- parentId: string | null;
306
- visible: boolean;
307
- camera?: {
308
- position: [number, number, number];
309
- target: [number, number, number];
310
- mode: "orthographic" | "perspective";
311
- fov?: number | undefined;
312
- zoom?: number | undefined;
313
- } | undefined;
314
- metadata: Record<string, unknown>;
315
- provenance?: {
316
- refs: {
317
- ns?: string | undefined;
318
- id: string;
319
- role?: "absorbed" | "alias" | "derived" | "piece" | "primary" | undefined;
320
- }[];
321
- lineage?: {
322
- op: "attach" | "convert" | "duplicate" | "import" | "make-independent" | "merge" | "promote" | "split";
323
- fromIds: string[];
324
- } | undefined;
325
- } | undefined;
326
- id: `rseg_${string}`;
327
- material?: {
328
- id?: string | undefined;
329
- preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
330
- properties?: {
331
- color: string;
332
- roughness: number;
333
- metalness: number;
334
- opacity: number;
335
- transparent: boolean;
336
- side: "back" | "double" | "front";
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;
337
207
  } | undefined;
338
- texture?: {
339
- url: string;
340
- repeat?: [number, number] | undefined;
341
- scale?: number | undefined;
342
- offset?: [number, number] | undefined;
343
- normalMap?: string | undefined;
344
- normalScale?: number | undefined;
345
- bumpMap?: string | undefined;
346
- bumpScale?: number | 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;
347
312
  } | undefined;
348
313
  } | undefined;
349
- materialPreset?: 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";
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;
360
333
  } | undefined;
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;
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
+ })[];
370
382
  } | undefined;
383
+ };
384
+ } | {
385
+ object: "node";
386
+ name?: string | undefined;
387
+ parentId: string | null;
388
+ visible: boolean;
389
+ camera?: {
390
+ position: [number, number, number];
391
+ target: [number, number, number];
392
+ mode: "orthographic" | "perspective";
393
+ fov?: number | undefined;
394
+ zoom?: number | undefined;
371
395
  } | 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";
383
- } | 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;
396
+ metadata: Record<string, unknown>;
397
+ provenance?: {
398
+ refs: {
399
+ ns?: string | undefined;
400
+ id: string;
401
+ role?: "absorbed" | "alias" | "derived" | "piece" | "primary" | undefined;
402
+ }[];
403
+ lineage?: {
404
+ op: "attach" | "convert" | "duplicate" | "import" | "make-independent" | "merge" | "promote" | "split";
405
+ fromIds: string[];
393
406
  } | undefined;
394
407
  } | undefined;
395
- edgeMaterialPreset?: string | undefined;
396
- wallMaterial?: {
408
+ id: `ceiling_${string}`;
409
+ children: (`item_${string}` | `procedural-item_${string}`)[];
410
+ material?: {
397
411
  id?: string | undefined;
398
412
  preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
399
413
  properties?: {
@@ -415,234 +429,50 @@ export declare function planSceneNodeChanges(snapshot: Pick<SceneState, 'nodes'
415
429
  bumpScale?: number | undefined;
416
430
  } | undefined;
417
431
  } | 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";
452
- }[];
453
- } | undefined;
432
+ materialPreset?: string | undefined;
454
433
  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;
477
- };
478
- wallHeight: number;
479
- pitch: number;
480
- wallThickness: number;
481
- deckThickness: number;
482
- overhang: number;
483
- gableOverhang?: number | undefined;
484
- shingleThickness: number;
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;
485
444
  buildUp?: {
486
445
  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";
446
+ finish?: {
447
+ kind: "drywall" | "plaster" | "wood-plank";
494
448
  thickness: number;
495
449
  name?: string | undefined;
496
450
  } | undefined;
497
- sheathing: {
498
- kind: "osb" | "plywood";
499
- thickness: number;
500
- name?: string | undefined;
501
- };
502
- structure: {
503
- system: "rafters" | "trusses";
451
+ framing?: {
452
+ system: "joists" | "truss-chords";
504
453
  size: "2x10" | "2x12" | "2x4" | "2x6" | "2x8";
505
454
  spacing: number;
506
- };
507
- insulation?: {
508
- kind: "batt" | "blown" | "rigid";
455
+ } | undefined;
456
+ decking?: {
457
+ kind: "osb" | "plywood";
509
458
  thickness: number;
510
459
  name?: string | undefined;
511
460
  } | undefined;
512
- finish?: {
513
- kind: "drywall" | "plaster" | "wood-plank";
461
+ insulation?: {
462
+ kind: "batt" | "blown" | "rigid";
514
463
  thickness: number;
515
464
  name?: string | undefined;
516
465
  } | undefined;
517
466
  } | undefined;
518
- arc?: {
519
- centerX: number;
520
- centerZ: number;
521
- radius: number;
522
- } | 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;
531
- } | 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";
553
- } | 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;
563
- } | undefined;
564
- } | undefined;
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;
587
- } | 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;
644
- children: string[];
645
- type: "roof-segment";
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";
646
476
  } | {
647
477
  object: "node";
648
478
  name?: string | undefined;
@@ -667,39 +497,42 @@ export declare function planSceneNodeChanges(snapshot: Pick<SceneState, 'nodes'
667
497
  fromIds: string[];
668
498
  } | undefined;
669
499
  } | 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;
685
- } | 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[];
696
- } | undefined;
697
- } | undefined;
698
- id: `spawn_${string}`;
699
- position: [number, number, number];
700
- rotation: number;
701
- supportSlabId?: string | undefined;
702
- type: "spawn";
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";
703
536
  } | {
704
537
  object: "node";
705
538
  name?: string | undefined;
@@ -724,118 +557,257 @@ export declare function planSceneNodeChanges(snapshot: Pick<SceneState, 'nodes'
724
557
  fromIds: string[];
725
558
  } | undefined;
726
559
  } | 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";
560
+ id: `site_${string}`;
561
+ polygon: {
562
+ type: "polygon";
563
+ points: [number, number][];
564
+ };
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;
738
620
  } | 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;
621
+ postprocessing?: {
622
+ ambientOcclusion?: boolean | undefined;
623
+ colorGrading?: boolean | undefined;
624
+ } | 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;
748
631
  } | undefined;
749
632
  } | 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";
633
+ address?: {
634
+ street?: string | undefined;
635
+ city?: string | undefined;
636
+ state?: string | undefined;
637
+ zip?: string | undefined;
777
638
  } | 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;
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;
791
649
  } | 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;
650
+ setbacks?: {
651
+ front: number;
652
+ side: number;
653
+ rear: number;
654
+ left?: number | undefined;
655
+ right?: number | undefined;
656
+ streetSide?: number | undefined;
803
657
  } | 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;
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;
825
672
  } | 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;
673
+ address?: {
674
+ formatted?: string | undefined;
675
+ precision?: string | undefined;
835
676
  } | undefined;
836
- language: "bpy" | "three";
837
- script: string;
838
- params: Record<string, string | number | boolean>;
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
+ } | 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
+ }[];
710
+ } | 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;
750
+ children: string[];
751
+ type: "site";
752
+ } | {
753
+ object: "node";
754
+ name?: string | undefined;
755
+ parentId: string | null;
756
+ visible: boolean;
757
+ camera?: {
758
+ position: [number, number, number];
759
+ target: [number, number, number];
760
+ mode: "orthographic" | "perspective";
761
+ fov?: number | undefined;
762
+ zoom?: number | undefined;
763
+ } | undefined;
764
+ metadata: Record<string, unknown>;
765
+ provenance?: {
766
+ refs: {
767
+ ns?: string | undefined;
768
+ id: string;
769
+ role?: "absorbed" | "alias" | "derived" | "piece" | "primary" | undefined;
770
+ }[];
771
+ lineage?: {
772
+ op: "attach" | "convert" | "duplicate" | "import" | "make-independent" | "merge" | "promote" | "split";
773
+ fromIds: string[];
774
+ } | undefined;
775
+ } | 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;
798
+ } | 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;
807
+ } | undefined;
808
+ language: "bpy" | "three";
809
+ script: string;
810
+ params: Record<string, string | number | boolean>;
839
811
  artifact: string;
840
812
  manifest: {
841
813
  bounds: {
@@ -945,12 +917,14 @@ export declare function planSceneNodeChanges(snapshot: Pick<SceneState, 'nodes'
945
917
  verticalAnchor?: "floor" | "wall" | undefined;
946
918
  floorThresholdVersion: 0 | 1;
947
919
  wallId?: string | undefined;
948
- dormerId?: string | undefined;
949
- dormerFace?: "back" | "front" | "left" | "right" | undefined;
950
920
  roofSegmentId?: string | undefined;
951
921
  roofFace?: "back" | "front" | "left" | "right" | undefined;
952
922
  width: number;
953
923
  height: number;
924
+ sidelightLeft?: number | undefined;
925
+ sidelightRight?: number | undefined;
926
+ transomHeight?: number | undefined;
927
+ slidingStyle?: "bypass" | "patio" | undefined;
954
928
  mark?: string | undefined;
955
929
  constructionType: "framed" | "masonry";
956
930
  dimensionReference: "finish-opening" | "masonry-opening" | "nominal" | "rough-opening";
@@ -960,52 +934,49 @@ export declare function planSceneNodeChanges(snapshot: Pick<SceneState, 'nodes'
960
934
  masonryOpeningHeight?: number | undefined;
961
935
  finishOpeningWidth?: number | undefined;
962
936
  finishOpeningHeight?: number | undefined;
963
- openingKind: "opening" | "window";
964
- windowType: "awning" | "bay" | "bow" | "casement" | "double-hung" | "fixed" | "hopper" | "louvered" | "single-hung" | "sliding" | "tilt-turn";
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;
965
940
  operationState: number;
966
- openingDirection?: "inward" | "outward" | undefined;
967
- tiltTurnMode?: "tilt" | "turn" | undefined;
968
- awningDirection: "down" | "up";
969
- casementStyle: "french" | "single";
970
- hingesSide: "left" | "right";
941
+ slideDirection: "left" | "right";
942
+ trackStyle: "none" | "overhead" | "pocket" | "visible";
943
+ garagePanelCount: number;
944
+ openingKind: "door" | "opening";
971
945
  openingShape: "arch" | "rectangle" | "rounded";
972
946
  openingRadiusMode: "all" | "individual";
973
- openingCornerRadii: [number, number, number, number];
947
+ openingTopRadii: [number, number];
974
948
  cornerRadius: number;
975
949
  archHeight: number;
976
950
  openingRevealRadius: number;
977
951
  frameThickness: number;
978
952
  frameDepth?: number | undefined;
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;
953
+ threshold: boolean;
954
+ thresholdHeight: number;
1005
955
  casingFaceA?: boolean | undefined;
1006
956
  casingFaceB?: boolean | undefined;
1007
957
  casingWidth?: number | undefined;
1008
- type: "window";
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";
1009
980
  } | {
1010
981
  object: "node";
1011
982
  name?: string | undefined;
@@ -1030,20 +1001,29 @@ export declare function planSceneNodeChanges(snapshot: Pick<SceneState, 'nodes'
1030
1001
  fromIds: string[];
1031
1002
  } | undefined;
1032
1003
  } | 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;
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;
1047
1027
  slots?: Record<string, string> | undefined;
1048
1028
  source?: {
1049
1029
  kind: "script";
@@ -1159,76 +1139,73 @@ export declare function planSceneNodeChanges(snapshot: Pick<SceneState, 'nodes'
1159
1139
  floorPlan: string;
1160
1140
  } | undefined;
1161
1141
  } | undefined;
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
- };
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";
1232
1209
  } | {
1233
1210
  object: "node";
1234
1211
  name?: string | undefined;
@@ -1253,30 +1230,11 @@ export declare function planSceneNodeChanges(snapshot: Pick<SceneState, 'nodes'
1253
1230
  fromIds: string[];
1254
1231
  } | undefined;
1255
1232
  } | 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;
1233
+ id: `column_${string}`;
1234
+ children: string[];
1235
+ position: [number, number, number];
1236
+ rotation: number;
1237
+ supportSlabId?: string | undefined;
1280
1238
  source?: {
1281
1239
  kind: "script";
1282
1240
  meta?: {
@@ -1391,289 +1349,392 @@ export declare function planSceneNodeChanges(snapshot: Pick<SceneState, 'nodes'
1391
1349
  floorPlan: string;
1392
1350
  } | undefined;
1393
1351
  } | undefined;
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;
1402
- width: number;
1352
+ style: "cluster" | "dravidian-carved" | "faceted" | "fluted" | "lathe-turned" | "plain";
1353
+ crossSection: "octagonal" | "rectangular" | "round" | "sixteen-sided" | "square";
1403
1354
  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";
1460
- } | {
1461
- object: "node";
1462
- name?: string | undefined;
1463
- parentId: string | null;
1464
- visible: boolean;
1465
- camera?: {
1466
- position: [number, number, number];
1467
- target: [number, number, number];
1468
- mode: "orthographic" | "perspective";
1469
- fov?: number | undefined;
1470
- zoom?: number | undefined;
1471
- } | undefined;
1472
- metadata: Record<string, unknown>;
1473
- provenance?: {
1474
- refs: {
1475
- ns?: string | undefined;
1476
- id: string;
1477
- role?: "absorbed" | "alias" | "derived" | "piece" | "primary" | undefined;
1478
- }[];
1479
- lineage?: {
1480
- op: "attach" | "convert" | "duplicate" | "import" | "make-independent" | "merge" | "promote" | "split";
1481
- fromIds: string[];
1482
- } | undefined;
1483
- } | undefined;
1484
- id: `column_${string}`;
1485
- children: string[];
1486
- position: [number, number, number];
1487
- rotation: number;
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;
1355
+ radius: number;
1356
+ 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";
1496
1435
  } | 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;
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";
1450
+ } | {
1451
+ object: "node";
1452
+ name?: string | undefined;
1453
+ parentId: string | null;
1454
+ visible: boolean;
1455
+ camera?: {
1456
+ position: [number, number, number];
1457
+ target: [number, number, number];
1458
+ mode: "orthographic" | "perspective";
1459
+ fov?: number | undefined;
1460
+ zoom?: number | undefined;
1461
+ } | undefined;
1462
+ metadata: Record<string, unknown>;
1463
+ provenance?: {
1464
+ refs: {
1465
+ ns?: string | undefined;
1466
+ id: string;
1467
+ role?: "absorbed" | "alias" | "derived" | "piece" | "primary" | undefined;
1468
+ }[];
1469
+ lineage?: {
1470
+ op: "attach" | "convert" | "duplicate" | "import" | "make-independent" | "merge" | "promote" | "split";
1471
+ fromIds: string[];
1472
+ } | undefined;
1473
+ } | 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;
1567
+ position: [number, number, number];
1568
+ 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";
1596
1579
  };
1597
- images?: {
1598
- artifact: string;
1599
- thumbnail: string;
1600
- floorPlan: string;
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;
1601
1734
  } | undefined;
1602
1735
  } | undefined;
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?: {
1736
+ heelMaterialPreset?: string | undefined;
1737
+ gableLeftMaterial?: {
1677
1738
  id?: string | undefined;
1678
1739
  preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
1679
1740
  properties?: {
@@ -1695,9 +1756,41 @@ export declare function planSceneNodeChanges(snapshot: Pick<SceneState, 'nodes'
1695
1756
  bumpScale?: number | undefined;
1696
1757
  } | undefined;
1697
1758
  } | undefined;
1698
- materialPreset?: string | undefined;
1699
- slots?: Record<string, string> | undefined;
1700
- type: "column";
1759
+ gableLeftMaterialPreset?: string | undefined;
1760
+ gableRightMaterial?: {
1761
+ id?: string | undefined;
1762
+ preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
1763
+ properties?: {
1764
+ color: string;
1765
+ roughness: number;
1766
+ metalness: number;
1767
+ opacity: number;
1768
+ transparent: boolean;
1769
+ side: "back" | "double" | "front";
1770
+ } | undefined;
1771
+ texture?: {
1772
+ url: string;
1773
+ repeat?: [number, number] | undefined;
1774
+ scale?: number | undefined;
1775
+ offset?: [number, number] | undefined;
1776
+ normalMap?: string | undefined;
1777
+ normalScale?: number | undefined;
1778
+ bumpMap?: string | undefined;
1779
+ bumpScale?: number | undefined;
1780
+ } | undefined;
1781
+ } | 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";
1701
1794
  } | {
1702
1795
  object: "node";
1703
1796
  name?: string | undefined;
@@ -1886,7 +1979,7 @@ export declare function planSceneNodeChanges(snapshot: Pick<SceneState, 'nodes'
1886
1979
  cavityInsulation?: string | undefined;
1887
1980
  } | undefined;
1888
1981
  slots?: Record<string, string> | undefined;
1889
- children: `rseg_${string}`[];
1982
+ children: string[];
1890
1983
  type: "roof";
1891
1984
  } | {
1892
1985
  object: "node";
@@ -2720,6 +2813,34 @@ export declare function planSceneNodeChanges(snapshot: Pick<SceneState, 'nodes'
2720
2813
  frontSide: "exterior" | "interior" | "unknown";
2721
2814
  backSide: "exterior" | "interior" | "unknown";
2722
2815
  type: "wall";
2816
+ } | {
2817
+ object: "node";
2818
+ name?: string | undefined;
2819
+ parentId: string | null;
2820
+ visible: boolean;
2821
+ camera?: {
2822
+ position: [number, number, number];
2823
+ target: [number, number, number];
2824
+ mode: "orthographic" | "perspective";
2825
+ fov?: number | undefined;
2826
+ zoom?: number | undefined;
2827
+ } | undefined;
2828
+ metadata: Record<string, unknown>;
2829
+ provenance?: {
2830
+ refs: {
2831
+ ns?: string | undefined;
2832
+ id: string;
2833
+ role?: "absorbed" | "alias" | "derived" | "piece" | "primary" | undefined;
2834
+ }[];
2835
+ lineage?: {
2836
+ op: "attach" | "convert" | "duplicate" | "import" | "make-independent" | "merge" | "promote" | "split";
2837
+ fromIds: string[];
2838
+ } | undefined;
2839
+ } | undefined;
2840
+ id: `separator_${string}`;
2841
+ start: [number, number];
2842
+ end: [number, number];
2843
+ type: "separator";
2723
2844
  } | {
2724
2845
  object: "node";
2725
2846
  name?: string | undefined;
@@ -2886,6 +3007,53 @@ export declare function planSceneNodeChanges(snapshot: Pick<SceneState, 'nodes'
2886
3007
  topElevation?: number | undefined;
2887
3008
  supportSlabId?: string | undefined;
2888
3009
  type: "beam";
3010
+ } | {
3011
+ object: "node";
3012
+ name?: string | undefined;
3013
+ parentId: string | null;
3014
+ visible: boolean;
3015
+ camera?: {
3016
+ position: [number, number, number];
3017
+ target: [number, number, number];
3018
+ mode: "orthographic" | "perspective";
3019
+ fov?: number | undefined;
3020
+ zoom?: number | undefined;
3021
+ } | undefined;
3022
+ metadata: Record<string, unknown>;
3023
+ provenance?: {
3024
+ refs: {
3025
+ ns?: string | undefined;
3026
+ id: string;
3027
+ role?: "absorbed" | "alias" | "derived" | "piece" | "primary" | undefined;
3028
+ }[];
3029
+ lineage?: {
3030
+ op: "attach" | "convert" | "duplicate" | "import" | "make-independent" | "merge" | "promote" | "split";
3031
+ fromIds: string[];
3032
+ } | undefined;
3033
+ } | undefined;
3034
+ id: `block_${string}`;
3035
+ children: string[];
3036
+ position: [number, number, number];
3037
+ rotation: number;
3038
+ supportSlabId?: string | undefined;
3039
+ topology: {
3040
+ vertices: {
3041
+ id: string;
3042
+ position: [number, number, number];
3043
+ }[];
3044
+ edges: {
3045
+ id: string;
3046
+ vertexIds: [string, string];
3047
+ }[];
3048
+ faces: {
3049
+ id: string;
3050
+ vertexIds: string[];
3051
+ materialSlot: string;
3052
+ }[];
3053
+ };
3054
+ slots: Record<string, string>;
3055
+ slotNames: Record<string, string>;
3056
+ type: "block";
2889
3057
  } | {
2890
3058
  object: "node";
2891
3059
  name?: string | undefined;
@@ -3387,74 +3555,59 @@ export declare function planSceneNodeChanges(snapshot: Pick<SceneState, 'nodes'
3387
3555
  fromIds: string[];
3388
3556
  } | undefined;
3389
3557
  } | undefined;
3390
- id: `ceiling_${string}`;
3391
- children: (`item_${string}` | `procedural-item_${string}`)[];
3558
+ id: `sseg_${string}`;
3392
3559
  material?: {
3393
3560
  id?: string | undefined;
3394
3561
  preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
3395
- properties?: {
3396
- color: string;
3397
- roughness: number;
3398
- metalness: number;
3399
- opacity: number;
3400
- transparent: boolean;
3401
- side: "back" | "double" | "front";
3402
- } | undefined;
3403
- texture?: {
3404
- url: string;
3405
- repeat?: [number, number] | undefined;
3406
- scale?: number | undefined;
3407
- offset?: [number, number] | undefined;
3408
- normalMap?: string | undefined;
3409
- normalScale?: number | undefined;
3410
- bumpMap?: string | undefined;
3411
- bumpScale?: number | undefined;
3412
- } | undefined;
3413
- } | undefined;
3414
- materialPreset?: string | undefined;
3415
- slots?: Record<string, string> | undefined;
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;
3562
+ properties?: {
3563
+ color: string;
3564
+ roughness: number;
3565
+ metalness: number;
3566
+ opacity: number;
3567
+ transparent: boolean;
3568
+ side: "back" | "double" | "front";
3442
3569
  } | undefined;
3443
- insulation?: {
3444
- kind: "batt" | "blown" | "rigid";
3445
- thickness: number;
3446
- name?: string | undefined;
3570
+ texture?: {
3571
+ url: string;
3572
+ repeat?: [number, number] | undefined;
3573
+ scale?: number | undefined;
3574
+ offset?: [number, number] | undefined;
3575
+ normalMap?: string | undefined;
3576
+ normalScale?: number | undefined;
3577
+ bumpMap?: string | undefined;
3578
+ bumpScale?: number | undefined;
3447
3579
  } | undefined;
3448
3580
  } | undefined;
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";
3581
+ materialPreset?: string | undefined;
3582
+ slots?: Record<string, string> | undefined;
3583
+ position: [number, number, number];
3584
+ rotation: number;
3585
+ segmentType: "landing" | "stair";
3586
+ width: number;
3587
+ length: number;
3588
+ height: number;
3589
+ stepCount: number;
3590
+ attachmentSide: "front" | "left" | "right";
3591
+ fillToFloor: boolean;
3592
+ construction?: {
3593
+ mode: "center-stringer" | "open" | "side-stringers" | "solid" | "waist";
3594
+ waistThickness: number;
3595
+ treadThickness: number;
3596
+ riserThickness: number;
3597
+ nosing: number;
3598
+ finishThickness: number;
3599
+ closedRisers: boolean;
3600
+ stringerWidth: number;
3601
+ stringerDepth: number;
3602
+ } | undefined;
3603
+ winder?: {
3604
+ turn: "left" | "right";
3605
+ innerGap: number;
3606
+ walkingLineOffset: number;
3607
+ division: "equal-angle" | "equal-going";
3608
+ } | undefined;
3609
+ thickness: number;
3610
+ type: "stair-segment";
3458
3611
  } | {
3459
3612
  object: "node";
3460
3613
  name?: string | undefined;
@@ -3687,6 +3840,47 @@ export declare function planSceneNodeChanges(snapshot: Pick<SceneState, 'nodes'
3687
3840
  scale: number;
3688
3841
  opacity: number;
3689
3842
  type: "scan";
3843
+ } | {
3844
+ object: "node";
3845
+ name?: string | undefined;
3846
+ parentId: string | null;
3847
+ visible: boolean;
3848
+ camera?: {
3849
+ position: [number, number, number];
3850
+ target: [number, number, number];
3851
+ mode: "orthographic" | "perspective";
3852
+ fov?: number | undefined;
3853
+ zoom?: number | undefined;
3854
+ } | undefined;
3855
+ metadata: Record<string, unknown>;
3856
+ provenance?: {
3857
+ refs: {
3858
+ ns?: string | undefined;
3859
+ id: string;
3860
+ role?: "absorbed" | "alias" | "derived" | "piece" | "primary" | undefined;
3861
+ }[];
3862
+ lineage?: {
3863
+ op: "attach" | "convert" | "duplicate" | "import" | "make-independent" | "merge" | "promote" | "split";
3864
+ fromIds: string[];
3865
+ } | undefined;
3866
+ } | undefined;
3867
+ id: `guide_${string}`;
3868
+ url: string;
3869
+ position: [number, number, number];
3870
+ rotation: [number, number, number];
3871
+ scale: number;
3872
+ opacity: number;
3873
+ scaleReference: {
3874
+ start: [number, number];
3875
+ end: [number, number];
3876
+ realLengthMeters: number;
3877
+ measuredLengthUnits: number;
3878
+ metersPerUnit: number;
3879
+ displayLength?: number | undefined;
3880
+ displayUnit?: "centimeters" | "feet" | "inches" | "meters" | undefined;
3881
+ label: string;
3882
+ } | null;
3883
+ type: "guide";
3690
3884
  } | {
3691
3885
  object: "node";
3692
3886
  name?: string | undefined;
@@ -3794,6 +3988,35 @@ export declare function planSceneNodeChanges(snapshot: Pick<SceneState, 'nodes'
3794
3988
  extrusion: [number, number, number];
3795
3989
  };
3796
3990
  type: "measurement";
3991
+ } | {
3992
+ object: "node";
3993
+ name?: string | undefined;
3994
+ parentId: string | null;
3995
+ visible: boolean;
3996
+ camera?: {
3997
+ position: [number, number, number];
3998
+ target: [number, number, number];
3999
+ mode: "orthographic" | "perspective";
4000
+ fov?: number | undefined;
4001
+ zoom?: number | undefined;
4002
+ } | undefined;
4003
+ metadata: Record<string, unknown>;
4004
+ provenance?: {
4005
+ refs: {
4006
+ ns?: string | undefined;
4007
+ id: string;
4008
+ role?: "absorbed" | "alias" | "derived" | "piece" | "primary" | undefined;
4009
+ }[];
4010
+ lineage?: {
4011
+ op: "attach" | "convert" | "duplicate" | "import" | "make-independent" | "merge" | "promote" | "split";
4012
+ fromIds: string[];
4013
+ } | undefined;
4014
+ } | undefined;
4015
+ id: `spawn_${string}`;
4016
+ position: [number, number, number];
4017
+ rotation: number;
4018
+ supportSlabId?: string | undefined;
4019
+ type: "spawn";
3797
4020
  } | {
3798
4021
  object: "node";
3799
4022
  name?: string | undefined;
@@ -3984,134 +4207,19 @@ export declare function planSceneNodeChanges(snapshot: Pick<SceneState, 'nodes'
3984
4207
  fromIds: string[];
3985
4208
  } | undefined;
3986
4209
  } | undefined;
3987
- id: `hvac-equipment_${string}`;
4210
+ id: `duct-terminal_${string}`;
3988
4211
  position: [number, number, number];
3989
4212
  rotation: number;
3990
4213
  supportSlabId?: string | undefined;
3991
- equipmentType: "air-handler" | "condenser" | "furnace";
3992
- width: number;
3993
- depth: number;
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";
4214
+ terminalType: "diffuser" | "return-grille" | "supply-register";
4215
+ mount: "ceiling" | "floor" | "wall";
4216
+ width: number;
4217
+ depth: number;
4218
+ collarShape: "oval" | "rect" | "round";
4219
+ collarDiameter: number;
4220
+ collarWidth: number;
4221
+ collarHeight: number;
4222
+ type: "duct-terminal";
4115
4223
  } | {
4116
4224
  object: "node";
4117
4225
  name?: string | undefined;
@@ -4136,13 +4244,23 @@ export declare function planSceneNodeChanges(snapshot: Pick<SceneState, 'nodes'
4136
4244
  fromIds: string[];
4137
4245
  } | undefined;
4138
4246
  } | undefined;
4139
- id: `pipe-trap_${string}`;
4247
+ id: `hvac-equipment_${string}`;
4140
4248
  position: [number, number, number];
4141
4249
  rotation: number;
4142
- diameter: number;
4143
- pipeMaterial: "abs" | "cast-iron" | "pvc";
4144
- armLengthM: number;
4145
- type: "pipe-trap";
4250
+ supportSlabId?: string | undefined;
4251
+ equipmentType: "air-handler" | "condenser" | "furnace";
4252
+ width: number;
4253
+ depth: number;
4254
+ height: number;
4255
+ supplyShape: "oval" | "rect" | "round";
4256
+ returnShape: "oval" | "rect" | "round";
4257
+ supplyDiameter: number;
4258
+ returnDiameter: number;
4259
+ supplyWidth: number;
4260
+ supplyHeight: number;
4261
+ returnWidth: number;
4262
+ returnHeight: number;
4263
+ type: "hvac-equipment";
4146
4264
  } | {
4147
4265
  object: "node";
4148
4266
  name?: string | undefined;
@@ -4167,12 +4285,12 @@ export declare function planSceneNodeChanges(snapshot: Pick<SceneState, 'nodes'
4167
4285
  fromIds: string[];
4168
4286
  } | undefined;
4169
4287
  } | undefined;
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";
4288
+ id: `lineset_${string}`;
4289
+ path: [number, number, number][];
4290
+ suctionDiameter: number;
4291
+ liquidDiameter: number;
4292
+ insulated: boolean;
4293
+ type: "lineset";
4176
4294
  } | {
4177
4295
  object: "node";
4178
4296
  name?: string | undefined;
@@ -4197,56 +4315,13 @@ export declare function planSceneNodeChanges(snapshot: Pick<SceneState, 'nodes'
4197
4315
  fromIds: string[];
4198
4316
  } | undefined;
4199
4317
  } | undefined;
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";
4318
+ id: `liquid-line_${string}`;
4319
+ path: [number, number, number][];
4320
+ diameter: number;
4321
+ type: "liquid-line";
4248
4322
  } | {
4249
4323
  object: "node";
4324
+ name?: string | undefined;
4250
4325
  parentId: string | null;
4251
4326
  visible: boolean;
4252
4327
  camera?: {
@@ -4256,6 +4331,7 @@ export declare function planSceneNodeChanges(snapshot: Pick<SceneState, 'nodes'
4256
4331
  fov?: number | undefined;
4257
4332
  zoom?: number | undefined;
4258
4333
  } | undefined;
4334
+ metadata: Record<string, unknown>;
4259
4335
  provenance?: {
4260
4336
  refs: {
4261
4337
  ns?: string | undefined;
@@ -4267,13 +4343,28 @@ export declare function planSceneNodeChanges(snapshot: Pick<SceneState, 'nodes'
4267
4343
  fromIds: string[];
4268
4344
  } | undefined;
4269
4345
  } | undefined;
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";
4346
+ id: `pipe-segment_${string}`;
4347
+ path: [number, number, number][];
4348
+ autoHangers?: boolean | undefined;
4349
+ hangerOverrides?: Record<string, {
4350
+ fraction?: number | undefined;
4351
+ skipped?: boolean | undefined;
4352
+ hostId?: string | undefined;
4353
+ }> | undefined;
4354
+ hangerStyle?: "double" | "single" | undefined;
4355
+ hangerSpacing?: number | undefined;
4356
+ hangerMaxReach?: number | undefined;
4357
+ wallAttachment?: {
4358
+ wallId: `wall_${string}`;
4359
+ side: "back" | "front";
4360
+ startUV: [number, number];
4361
+ endUV: [number, number];
4362
+ offset: number;
4363
+ } | undefined;
4364
+ diameter: number;
4365
+ pipeMaterial: "abs" | "cast-iron" | "pvc";
4366
+ system: "vent" | "waste";
4367
+ type: "pipe-segment";
4277
4368
  } | {
4278
4369
  object: "node";
4279
4370
  name?: string | undefined;
@@ -4298,12 +4389,17 @@ export declare function planSceneNodeChanges(snapshot: Pick<SceneState, 'nodes'
4298
4389
  fromIds: string[];
4299
4390
  } | undefined;
4300
4391
  } | undefined;
4301
- id: `building_${string}`;
4302
- children: (`elevator_${string}` | `level_${string}` | `unit_${string}`)[];
4392
+ id: `pipe-fitting_${string}`;
4303
4393
  position: [number, number, number];
4304
4394
  rotation: [number, number, number];
4305
- groundLevelId?: `level_${string}` | undefined;
4306
- type: "building";
4395
+ fittingType: "cleanout" | "coupling" | "cross" | "elbow" | "end-cap" | "reducer" | "sanitary-tee" | "wye";
4396
+ angle: number;
4397
+ diameter: number;
4398
+ diameter2: number;
4399
+ cleanoutStyle: "end" | "inline";
4400
+ pipeMaterial: "abs" | "cast-iron" | "pvc";
4401
+ system: "vent" | "waste";
4402
+ type: "pipe-fitting";
4307
4403
  } | {
4308
4404
  object: "node";
4309
4405
  name?: string | undefined;
@@ -4328,126 +4424,13 @@ export declare function planSceneNodeChanges(snapshot: Pick<SceneState, 'nodes'
4328
4424
  fromIds: string[];
4329
4425
  } | undefined;
4330
4426
  } | undefined;
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;
4427
+ id: `pipe-trap_${string}`;
4425
4428
  position: [number, number, number];
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";
4429
+ rotation: number;
4430
+ diameter: number;
4431
+ pipeMaterial: "abs" | "cast-iron" | "pvc";
4432
+ armLengthM: number;
4433
+ type: "pipe-trap";
4451
4434
  } | {
4452
4435
  object: "node";
4453
4436
  name?: string | undefined;
@@ -4472,57 +4455,14 @@ export declare function planSceneNodeChanges(snapshot: Pick<SceneState, 'nodes'
4472
4455
  fromIds: string[];
4473
4456
  } | undefined;
4474
4457
  } | undefined;
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;
4501
- position: [number, number, number];
4502
- rotation: number;
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";
4458
+ id: `level_${string}`;
4459
+ 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}`)[];
4460
+ level: number;
4461
+ baseElevation: number;
4462
+ height?: number | undefined;
4463
+ type: "level";
4523
4464
  } | {
4524
4465
  object: "node";
4525
- name?: string | undefined;
4526
4466
  parentId: string | null;
4527
4467
  visible: boolean;
4528
4468
  camera?: {
@@ -4532,7 +4472,6 @@ export declare function planSceneNodeChanges(snapshot: Pick<SceneState, 'nodes'
4532
4472
  fov?: number | undefined;
4533
4473
  zoom?: number | undefined;
4534
4474
  } | undefined;
4535
- metadata: Record<string, unknown>;
4536
4475
  provenance?: {
4537
4476
  refs: {
4538
4477
  ns?: string | undefined;
@@ -4541,201 +4480,46 @@ export declare function planSceneNodeChanges(snapshot: Pick<SceneState, 'nodes'
4541
4480
  }[];
4542
4481
  lineage?: {
4543
4482
  op: "attach" | "convert" | "duplicate" | "import" | "make-independent" | "merge" | "promote" | "split";
4544
- fromIds: string[];
4545
- } | undefined;
4546
- } | 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;
4560
- } | undefined;
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;
4618
- } | undefined;
4619
- } | undefined;
4620
- address?: {
4621
- street?: string | undefined;
4622
- city?: string | undefined;
4623
- state?: string | undefined;
4624
- zip?: string | undefined;
4625
- } | undefined;
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;
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;
4686
- } | undefined;
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";
4483
+ fromIds: string[];
4484
+ } | undefined;
4485
+ } | undefined;
4486
+ id: `unit_${string}`;
4487
+ name: string;
4488
+ kind: "apartment" | "commercial" | "common" | "hotel-room";
4489
+ members: `zone_${string}`[];
4490
+ color: string;
4491
+ metadata: Record<string, unknown>;
4492
+ type: "unit";
4493
+ } | {
4494
+ object: "node";
4495
+ name?: string | undefined;
4496
+ parentId: string | null;
4497
+ visible: boolean;
4498
+ camera?: {
4499
+ position: [number, number, number];
4500
+ target: [number, number, number];
4501
+ mode: "orthographic" | "perspective";
4502
+ fov?: number | undefined;
4503
+ zoom?: number | undefined;
4504
+ } | undefined;
4505
+ metadata: Record<string, unknown>;
4506
+ provenance?: {
4507
+ refs: {
4508
+ ns?: string | undefined;
4509
+ id: string;
4510
+ role?: "absorbed" | "alias" | "derived" | "piece" | "primary" | undefined;
4511
+ }[];
4512
+ lineage?: {
4513
+ op: "attach" | "convert" | "duplicate" | "import" | "make-independent" | "merge" | "promote" | "split";
4514
+ fromIds: string[];
4515
+ } | undefined;
4516
+ } | undefined;
4517
+ id: `building_${string}`;
4518
+ children: (`elevator_${string}` | `level_${string}` | `unit_${string}`)[];
4519
+ position: [number, number, number];
4520
+ rotation: [number, number, number];
4521
+ groundLevelId?: `level_${string}` | undefined;
4522
+ type: "building";
4739
4523
  } | {
4740
4524
  object: "node";
4741
4525
  name?: string | undefined;
@@ -5441,6 +5225,78 @@ export declare function planSceneNodeChanges(snapshot: Pick<SceneState, 'nodes'
5441
5225
  louverCount: number;
5442
5226
  backRatio: number;
5443
5227
  type: "eyebrow-vent";
5228
+ } | {
5229
+ object: "node";
5230
+ name?: string | undefined;
5231
+ parentId: string | null;
5232
+ visible: boolean;
5233
+ camera?: {
5234
+ position: [number, number, number];
5235
+ target: [number, number, number];
5236
+ mode: "orthographic" | "perspective";
5237
+ fov?: number | undefined;
5238
+ zoom?: number | undefined;
5239
+ } | undefined;
5240
+ metadata: Record<string, unknown>;
5241
+ provenance?: {
5242
+ refs: {
5243
+ ns?: string | undefined;
5244
+ id: string;
5245
+ role?: "absorbed" | "alias" | "derived" | "piece" | "primary" | undefined;
5246
+ }[];
5247
+ lineage?: {
5248
+ op: "attach" | "convert" | "duplicate" | "import" | "make-independent" | "merge" | "promote" | "split";
5249
+ fromIds: string[];
5250
+ } | undefined;
5251
+ } | undefined;
5252
+ id: `gutter_${string}`;
5253
+ material?: {
5254
+ id?: string | undefined;
5255
+ preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
5256
+ properties?: {
5257
+ color: string;
5258
+ roughness: number;
5259
+ metalness: number;
5260
+ opacity: number;
5261
+ transparent: boolean;
5262
+ side: "back" | "double" | "front";
5263
+ } | undefined;
5264
+ texture?: {
5265
+ url: string;
5266
+ repeat?: [number, number] | undefined;
5267
+ scale?: number | undefined;
5268
+ offset?: [number, number] | undefined;
5269
+ normalMap?: string | undefined;
5270
+ normalScale?: number | undefined;
5271
+ bumpMap?: string | undefined;
5272
+ bumpScale?: number | undefined;
5273
+ } | undefined;
5274
+ } | undefined;
5275
+ slots?: Record<string, string> | undefined;
5276
+ materialPreset: string;
5277
+ roofSegmentId?: string | undefined;
5278
+ position: [number, number, number];
5279
+ rotation: number;
5280
+ length: number;
5281
+ arc?: {
5282
+ centerX: number;
5283
+ centerZ: number;
5284
+ radius: number;
5285
+ } | undefined;
5286
+ size: number;
5287
+ thickness: number;
5288
+ profile: "box" | "half-round" | "k-style";
5289
+ endCapLeft: boolean;
5290
+ endCapRight: boolean;
5291
+ hangerStyle: "none" | "strap";
5292
+ hangerSpacing: number;
5293
+ outlets: {
5294
+ id: string;
5295
+ offset: number;
5296
+ diameter: number;
5297
+ generatedBy?: "default-downspout" | undefined;
5298
+ }[];
5299
+ type: "gutter";
5444
5300
  } | {
5445
5301
  object: "node";
5446
5302
  name?: string | undefined;
@@ -5733,6 +5589,150 @@ export declare function planSceneNodeChanges(snapshot: Pick<SceneState, 'nodes'
5733
5589
  cutoutOffset: number;
5734
5590
  surfaceNormal?: [number, number, number] | undefined;
5735
5591
  type: "skylight";
5592
+ } | {
5593
+ object: "node";
5594
+ name?: string | undefined;
5595
+ parentId: string | null;
5596
+ visible: boolean;
5597
+ camera?: {
5598
+ position: [number, number, number];
5599
+ target: [number, number, number];
5600
+ mode: "orthographic" | "perspective";
5601
+ fov?: number | undefined;
5602
+ zoom?: number | undefined;
5603
+ } | undefined;
5604
+ metadata: Record<string, unknown>;
5605
+ provenance?: {
5606
+ refs: {
5607
+ ns?: string | undefined;
5608
+ id: string;
5609
+ role?: "absorbed" | "alias" | "derived" | "piece" | "primary" | undefined;
5610
+ }[];
5611
+ lineage?: {
5612
+ op: "attach" | "convert" | "duplicate" | "import" | "make-independent" | "merge" | "promote" | "split";
5613
+ fromIds: string[];
5614
+ } | undefined;
5615
+ } | undefined;
5616
+ id: `dormer_${string}`;
5617
+ material?: {
5618
+ id?: string | undefined;
5619
+ preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
5620
+ properties?: {
5621
+ color: string;
5622
+ roughness: number;
5623
+ metalness: number;
5624
+ opacity: number;
5625
+ transparent: boolean;
5626
+ side: "back" | "double" | "front";
5627
+ } | undefined;
5628
+ texture?: {
5629
+ url: string;
5630
+ repeat?: [number, number] | undefined;
5631
+ scale?: number | undefined;
5632
+ offset?: [number, number] | undefined;
5633
+ normalMap?: string | undefined;
5634
+ normalScale?: number | undefined;
5635
+ bumpMap?: string | undefined;
5636
+ bumpScale?: number | undefined;
5637
+ } | undefined;
5638
+ } | undefined;
5639
+ materialPreset?: string | undefined;
5640
+ topMaterial?: {
5641
+ id?: string | undefined;
5642
+ preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
5643
+ properties?: {
5644
+ color: string;
5645
+ roughness: number;
5646
+ metalness: number;
5647
+ opacity: number;
5648
+ transparent: boolean;
5649
+ side: "back" | "double" | "front";
5650
+ } | undefined;
5651
+ texture?: {
5652
+ url: string;
5653
+ repeat?: [number, number] | undefined;
5654
+ scale?: number | undefined;
5655
+ offset?: [number, number] | undefined;
5656
+ normalMap?: string | undefined;
5657
+ normalScale?: number | undefined;
5658
+ bumpMap?: string | undefined;
5659
+ bumpScale?: number | undefined;
5660
+ } | undefined;
5661
+ } | undefined;
5662
+ topMaterialPreset?: string | undefined;
5663
+ sideMaterial?: {
5664
+ id?: string | undefined;
5665
+ preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
5666
+ properties?: {
5667
+ color: string;
5668
+ roughness: number;
5669
+ metalness: number;
5670
+ opacity: number;
5671
+ transparent: boolean;
5672
+ side: "back" | "double" | "front";
5673
+ } | undefined;
5674
+ texture?: {
5675
+ url: string;
5676
+ repeat?: [number, number] | undefined;
5677
+ scale?: number | undefined;
5678
+ offset?: [number, number] | undefined;
5679
+ normalMap?: string | undefined;
5680
+ normalScale?: number | undefined;
5681
+ bumpMap?: string | undefined;
5682
+ bumpScale?: number | undefined;
5683
+ } | undefined;
5684
+ } | undefined;
5685
+ sideMaterialPreset?: string | undefined;
5686
+ wallMaterial?: {
5687
+ id?: string | undefined;
5688
+ preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
5689
+ properties?: {
5690
+ color: string;
5691
+ roughness: number;
5692
+ metalness: number;
5693
+ opacity: number;
5694
+ transparent: boolean;
5695
+ side: "back" | "double" | "front";
5696
+ } | undefined;
5697
+ texture?: {
5698
+ url: string;
5699
+ repeat?: [number, number] | undefined;
5700
+ scale?: number | undefined;
5701
+ offset?: [number, number] | undefined;
5702
+ normalMap?: string | undefined;
5703
+ normalScale?: number | undefined;
5704
+ bumpMap?: string | undefined;
5705
+ bumpScale?: number | undefined;
5706
+ } | undefined;
5707
+ } | undefined;
5708
+ wallMaterialPreset?: string | undefined;
5709
+ roofSegmentId?: string | undefined;
5710
+ position: [number, number, number];
5711
+ rotation: number;
5712
+ width: number;
5713
+ depth: number;
5714
+ height: number;
5715
+ roofType: "barrel" | "conical" | "dutch" | "flat" | "gable" | "gambrel" | "hip" | "mansard" | "shed";
5716
+ roofHeight: number;
5717
+ shedHighSide: "back" | "front";
5718
+ wallSkirtHeight: number;
5719
+ windowWidth: number;
5720
+ windowHeight: number;
5721
+ windowOffsetX: number;
5722
+ windowOffsetY: number;
5723
+ windowFrameThickness: number;
5724
+ windowFrameDepth: number;
5725
+ windowColumns: number;
5726
+ windowRows: number;
5727
+ windowDividerThickness: number;
5728
+ windowShape: "arch" | "rectangle" | "rounded";
5729
+ windowArchHeight: number;
5730
+ windowCornerRadii: [number, number, number, number];
5731
+ windowSill: boolean;
5732
+ windowSillDepth: number;
5733
+ windowSillThickness: number;
5734
+ children: `window_${string}`[];
5735
+ type: "dormer";
5736
5736
  } | {
5737
5737
  object: "node";
5738
5738
  name?: string | undefined;