@pascal-app/core 1.0.7 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (176) hide show
  1. package/dist/agent-operations/__fixtures__/native-materials.d.ts +4 -0
  2. package/dist/agent-operations/__fixtures__/native-materials.d.ts.map +1 -1
  3. package/dist/agent-operations/__fixtures__/roof-bearing-cases.d.ts +11283 -11279
  4. package/dist/agent-operations/__fixtures__/roof-bearing-cases.d.ts.map +1 -1
  5. package/dist/agent-operations/__fixtures__/verify-scene-cases.d.ts +77 -77
  6. package/dist/agent-operations/author-scene.d.ts.map +1 -1
  7. package/dist/agent-operations/author-scene.js +2 -3
  8. package/dist/agent-operations/circulation-spaces.d.ts +3181 -3180
  9. package/dist/agent-operations/circulation-spaces.d.ts.map +1 -1
  10. package/dist/agent-operations/level-reads.js +1 -1
  11. package/dist/agent-operations/move-plan.d.ts.map +1 -1
  12. package/dist/agent-operations/move-plan.js +11 -9
  13. package/dist/agent-operations/scene-queries.d.ts +2328 -2327
  14. package/dist/agent-operations/scene-queries.d.ts.map +1 -1
  15. package/dist/agent-operations/verify-scene.d.ts.map +1 -1
  16. package/dist/agent-operations/verify-scene.js +4 -2
  17. package/dist/agent-operations/wall-object-observations.d.ts.map +1 -1
  18. package/dist/agent-operations/wall-object-observations.js +1 -1
  19. package/dist/agent-tools/wall-openings.js +2 -2
  20. package/dist/building/__fixtures__/wall-opening-cases.d.ts +229 -228
  21. package/dist/building/__fixtures__/wall-opening-cases.d.ts.map +1 -1
  22. package/dist/building/level-duplication.d.ts +3681 -3679
  23. package/dist/building/level-duplication.d.ts.map +1 -1
  24. package/dist/building/merge-windows.d.ts.map +1 -1
  25. package/dist/building/merge-windows.js +4 -3
  26. package/dist/building/wall-openings.d.ts +20 -6
  27. package/dist/building/wall-openings.d.ts.map +1 -1
  28. package/dist/building/wall-openings.js +74 -25
  29. package/dist/commands/structure/shared.d.ts +1 -0
  30. package/dist/commands/structure/shared.d.ts.map +1 -1
  31. package/dist/commands/structure/zone-wall-merge.d.ts +2351 -2348
  32. package/dist/commands/structure/zone-wall-merge.d.ts.map +1 -1
  33. package/dist/contracts/reference-inventory.d.ts.map +1 -1
  34. package/dist/contracts/reference-inventory.js +0 -1
  35. package/dist/hooks/spatial-grid/spatial-grid-manager.d.ts +6 -1
  36. package/dist/hooks/spatial-grid/spatial-grid-manager.d.ts.map +1 -1
  37. package/dist/hooks/spatial-grid/spatial-grid-manager.js +30 -9
  38. package/dist/hooks/spatial-grid/spatial-grid-sync.d.ts +3181 -3180
  39. package/dist/hooks/spatial-grid/spatial-grid-sync.d.ts.map +1 -1
  40. package/dist/hooks/spatial-grid/spatial-grid-sync.js +8 -4
  41. package/dist/index.d.ts +11 -4
  42. package/dist/index.d.ts.map +1 -1
  43. package/dist/index.js +11 -4
  44. package/dist/lib/__fixtures__/mezzanine.d.ts +8595 -8591
  45. package/dist/lib/__fixtures__/mezzanine.d.ts.map +1 -1
  46. package/dist/lib/absorb-wall-separators.d.ts +1664 -1663
  47. package/dist/lib/absorb-wall-separators.d.ts.map +1 -1
  48. package/dist/lib/build-mode.d.ts +11 -0
  49. package/dist/lib/build-mode.d.ts.map +1 -0
  50. package/dist/lib/build-mode.js +24 -0
  51. package/dist/lib/corner-pair.d.ts +2 -0
  52. package/dist/lib/corner-pair.d.ts.map +1 -1
  53. package/dist/lib/door-interaction.d.ts +14 -0
  54. package/dist/lib/door-interaction.d.ts.map +1 -0
  55. package/dist/lib/door-interaction.js +62 -0
  56. package/dist/lib/elevator-support.d.ts +15 -0
  57. package/dist/lib/elevator-support.d.ts.map +1 -0
  58. package/dist/lib/elevator-support.js +40 -0
  59. package/dist/lib/floor-intent-changes.d.ts.map +1 -1
  60. package/dist/lib/floor-intent-changes.js +6 -4
  61. package/dist/lib/hierarchy.d.ts +19 -0
  62. package/dist/lib/hierarchy.d.ts.map +1 -0
  63. package/dist/lib/hierarchy.js +53 -0
  64. package/dist/lib/opening-floor-datum.d.ts +1 -1
  65. package/dist/lib/opening-floor-datum.d.ts.map +1 -1
  66. package/dist/lib/opening-floor-datum.js +2 -2
  67. package/dist/lib/own-floor-intent.d.ts.map +1 -1
  68. package/dist/lib/own-floor-intent.js +2 -2
  69. package/dist/lib/polygon-boolean.d.ts.map +1 -1
  70. package/dist/lib/polygon-boolean.js +2 -1
  71. package/dist/lib/room-floor-elevation.d.ts +12 -0
  72. package/dist/lib/room-floor-elevation.d.ts.map +1 -0
  73. package/dist/lib/room-floor-elevation.js +41 -0
  74. package/dist/lib/room-floor-feasibility.d.ts.map +1 -1
  75. package/dist/lib/room-floor-feasibility.js +1 -1
  76. package/dist/lib/space-detection.d.ts.map +1 -1
  77. package/dist/lib/space-detection.js +1 -0
  78. package/dist/lib/wall-face-script.d.ts.map +1 -1
  79. package/dist/lib/wall-face-script.js +3 -3
  80. package/dist/lib/window-interaction.d.ts +16 -0
  81. package/dist/lib/window-interaction.d.ts.map +1 -0
  82. package/dist/lib/window-interaction.js +82 -0
  83. package/dist/lib/zone-quantities.js +1 -1
  84. package/dist/node-slots/column.d.ts +5 -0
  85. package/dist/node-slots/column.d.ts.map +1 -1
  86. package/dist/node-slots/column.js +10 -0
  87. package/dist/registry/index.d.ts +1 -1
  88. package/dist/registry/index.d.ts.map +1 -1
  89. package/dist/registry/index.js +1 -1
  90. package/dist/registry/registry.d.ts +5 -0
  91. package/dist/registry/registry.d.ts.map +1 -1
  92. package/dist/registry/registry.js +10 -0
  93. package/dist/registry/types.d.ts +24 -0
  94. package/dist/registry/types.d.ts.map +1 -1
  95. package/dist/schema/index.d.ts +1 -1
  96. package/dist/schema/index.d.ts.map +1 -1
  97. package/dist/schema/index.js +1 -1
  98. package/dist/schema/nodes/roof-segment-resize.d.ts.map +1 -1
  99. package/dist/schema/nodes/roof-segment-resize.js +2 -2
  100. package/dist/schema/nodes/roof-segment.d.ts +2 -0
  101. package/dist/schema/nodes/roof-segment.d.ts.map +1 -1
  102. package/dist/schema/nodes/roof-segment.js +40 -2
  103. package/dist/schema/nodes/wall.d.ts +1 -0
  104. package/dist/schema/nodes/wall.d.ts.map +1 -1
  105. package/dist/schema/nodes/wall.js +6 -0
  106. package/dist/schema/types.d.ts +1 -0
  107. package/dist/schema/types.d.ts.map +1 -1
  108. package/dist/services/index.d.ts +1 -1
  109. package/dist/services/index.d.ts.map +1 -1
  110. package/dist/services/index.js +1 -1
  111. package/dist/services/movement.d.ts +7 -0
  112. package/dist/services/movement.d.ts.map +1 -1
  113. package/dist/services/movement.js +13 -0
  114. package/dist/services/port-connectivity.d.ts +15 -6
  115. package/dist/services/port-connectivity.d.ts.map +1 -1
  116. package/dist/services/port-connectivity.js +83 -17
  117. package/dist/services/roof-bearing.js +2 -1
  118. package/dist/services/storey.d.ts +6 -1
  119. package/dist/services/storey.d.ts.map +1 -1
  120. package/dist/services/storey.js +11 -2
  121. package/dist/spatial/usage-field/swings.d.ts +1 -0
  122. package/dist/spatial/usage-field/swings.d.ts.map +1 -1
  123. package/dist/spatial/usage-field/walls.d.ts +2 -0
  124. package/dist/spatial/usage-field/walls.d.ts.map +1 -1
  125. package/dist/spatial/usage-field/walls.js +18 -4
  126. package/dist/store/actions/node-actions.d.ts +1614 -1613
  127. package/dist/store/actions/node-actions.d.ts.map +1 -1
  128. package/dist/store/actions/node-actions.js +23 -5
  129. package/dist/store/derived-node-guard.d.ts.map +1 -1
  130. package/dist/store/derived-node-guard.js +2 -1
  131. package/dist/store/scene-annotations.d.ts +5033 -5031
  132. package/dist/store/scene-annotations.d.ts.map +1 -1
  133. package/dist/systems/elevator/elevator-geometry.d.ts +25 -0
  134. package/dist/systems/elevator/elevator-geometry.d.ts.map +1 -1
  135. package/dist/systems/elevator/elevator-geometry.js +40 -8
  136. package/dist/systems/elevator/elevator-opening-sync.d.ts.map +1 -1
  137. package/dist/systems/elevator/elevator-opening-sync.js +4 -35
  138. package/dist/systems/elevator/elevator-runtime.d.ts.map +1 -1
  139. package/dist/systems/elevator/elevator-runtime.js +95 -18
  140. package/dist/systems/elevator/elevator-service.d.ts.map +1 -1
  141. package/dist/systems/elevator/elevator-service.js +24 -4
  142. package/dist/systems/roof/roof-elevation.d.ts.map +1 -1
  143. package/dist/systems/roof/roof-elevation.js +2 -1
  144. package/dist/systems/slab/__fixtures__/floor-step.d.ts +1614 -1610
  145. package/dist/systems/slab/__fixtures__/floor-step.d.ts.map +1 -1
  146. package/dist/systems/slab/__fixtures__/raised-room.d.ts +2924 -2920
  147. package/dist/systems/slab/__fixtures__/raised-room.d.ts.map +1 -1
  148. package/dist/systems/stair/stair-opening-preview.d.ts +1147 -1146
  149. package/dist/systems/stair/stair-opening-preview.d.ts.map +1 -1
  150. package/dist/systems/wall/wall-curve.d.ts +10 -0
  151. package/dist/systems/wall/wall-curve.d.ts.map +1 -1
  152. package/dist/systems/wall/wall-curve.js +38 -0
  153. package/dist/systems/wall/wall-frame.d.ts.map +1 -1
  154. package/dist/systems/wall/wall-frame.js +8 -0
  155. package/dist/systems/wall/wall-merge.d.ts +9 -1
  156. package/dist/systems/wall/wall-merge.d.ts.map +1 -1
  157. package/dist/systems/wall/wall-merge.js +38 -6
  158. package/dist/systems/wall/wall-top.d.ts +10 -3
  159. package/dist/systems/wall/wall-top.d.ts.map +1 -1
  160. package/dist/systems/wall/wall-top.js +24 -8
  161. package/dist/systems/wall/wall-topology.d.ts.map +1 -1
  162. package/dist/systems/wall/wall-topology.js +19 -1
  163. package/dist/utils/ensure-scene-openings.d.ts +4354 -4352
  164. package/dist/utils/ensure-scene-openings.d.ts.map +1 -1
  165. package/dist/utils/floor-plate-migration.d.ts +1664 -1663
  166. package/dist/utils/floor-plate-migration.d.ts.map +1 -1
  167. package/dist/utils/measurement-format.d.ts +27 -0
  168. package/dist/utils/measurement-format.d.ts.map +1 -0
  169. package/dist/utils/measurement-format.js +143 -0
  170. package/dist/utils/owned-floor-opening-migration.d.ts +1147 -1146
  171. package/dist/utils/owned-floor-opening-migration.d.ts.map +1 -1
  172. package/dist/utils/reconcile-structure-on-load.d.ts +439 -438
  173. package/dist/utils/reconcile-structure-on-load.d.ts.map +1 -1
  174. package/dist/validation/validate-build-json.d.ts.map +1 -1
  175. package/dist/validation/validate-build-json.js +3 -1
  176. package/package.json +1 -1
@@ -318,7 +318,45 @@ export declare function absorbWallSeparators(nodes: SceneNodes, levelId: string,
318
318
  fromIds: string[];
319
319
  } | undefined;
320
320
  } | undefined;
321
- id: `rseg_${string}`;
321
+ id: `scan_${string}`;
322
+ url: string | null;
323
+ captureSession: {
324
+ sessionId: string;
325
+ schemaVersion?: number | undefined;
326
+ revisionId?: string | undefined;
327
+ manifestUrl?: string | undefined;
328
+ } | null;
329
+ layers: Record<string, boolean>;
330
+ position: [number, number, number];
331
+ rotation: [number, number, number];
332
+ scale: number;
333
+ opacity: number;
334
+ type: "scan";
335
+ } | {
336
+ object: "node";
337
+ name?: string | undefined;
338
+ parentId: string | null;
339
+ visible: boolean;
340
+ camera?: {
341
+ position: [number, number, number];
342
+ target: [number, number, number];
343
+ mode: "orthographic" | "perspective";
344
+ fov?: number | undefined;
345
+ zoom?: number | undefined;
346
+ } | undefined;
347
+ metadata: Record<string, unknown>;
348
+ provenance?: {
349
+ refs: {
350
+ ns?: string | undefined;
351
+ id: string;
352
+ role?: "absorbed" | "alias" | "derived" | "piece" | "primary" | undefined;
353
+ }[];
354
+ lineage?: {
355
+ op: "attach" | "convert" | "duplicate" | "import" | "make-independent" | "merge" | "promote" | "split";
356
+ fromIds: string[];
357
+ } | undefined;
358
+ } | undefined;
359
+ id: `slab_${string}`;
322
360
  material?: {
323
361
  id?: string | undefined;
324
362
  preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
@@ -342,302 +380,173 @@ export declare function absorbWallSeparators(nodes: SceneNodes, levelId: string,
342
380
  } | undefined;
343
381
  } | undefined;
344
382
  materialPreset?: string | undefined;
345
- topMaterial?: {
346
- id?: string | undefined;
347
- preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
348
- properties?: {
349
- color: string;
350
- roughness: number;
351
- metalness: number;
352
- opacity: number;
353
- transparent: boolean;
354
- side: "back" | "double" | "front";
355
- } | undefined;
356
- texture?: {
357
- url: string;
358
- repeat?: [number, number] | undefined;
359
- scale?: number | undefined;
360
- offset?: [number, number] | undefined;
361
- normalMap?: string | undefined;
362
- normalScale?: number | undefined;
363
- bumpMap?: string | undefined;
364
- bumpScale?: number | undefined;
383
+ slots?: Record<string, string> | undefined;
384
+ polygon: [number, number][];
385
+ holes: [number, number][][];
386
+ holeMetadata: {
387
+ source: "elevator" | "floor-opening" | "manual" | "room" | "stair";
388
+ openingId?: string | undefined;
389
+ stairId?: string | undefined;
390
+ elevatorId?: string | undefined;
391
+ }[];
392
+ elevation: number;
393
+ floorHeight?: number | undefined;
394
+ referenceFloorElevation?: number | undefined;
395
+ foundation?: {
396
+ type: "none" | "solid";
397
+ material?: string | {
398
+ id?: string | undefined;
399
+ preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
400
+ properties?: {
401
+ color: string;
402
+ roughness: number;
403
+ metalness: number;
404
+ opacity: number;
405
+ transparent: boolean;
406
+ side: "back" | "double" | "front";
407
+ } | undefined;
408
+ texture?: {
409
+ url: string;
410
+ repeat?: [number, number] | undefined;
411
+ scale?: number | undefined;
412
+ offset?: [number, number] | undefined;
413
+ normalMap?: string | undefined;
414
+ normalScale?: number | undefined;
415
+ bumpMap?: string | undefined;
416
+ bumpScale?: number | undefined;
417
+ } | undefined;
365
418
  } | undefined;
366
419
  } | undefined;
367
- topMaterialPreset?: string | undefined;
368
- edgeMaterial?: {
369
- id?: string | undefined;
370
- preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
371
- properties?: {
372
- color: string;
373
- roughness: number;
374
- metalness: number;
375
- opacity: number;
376
- transparent: boolean;
377
- side: "back" | "double" | "front";
420
+ thickness: number;
421
+ recessed: boolean;
422
+ recessedRimElevation?: number | undefined;
423
+ fillToTerrain?: boolean | undefined;
424
+ boundary?: "auto" | undefined;
425
+ support?: "open" | undefined;
426
+ plateRole?: "base" | "platform" | "sunken" | undefined;
427
+ railing?: {
428
+ start: [number, number];
429
+ end: [number, number];
430
+ }[] | undefined;
431
+ zoneIds?: string[] | undefined;
432
+ associatedZoneIds?: string[] | undefined;
433
+ autoFromWalls: boolean;
434
+ surfaceScript?: {
435
+ kind: "script";
436
+ meta?: {
437
+ description?: string | undefined;
438
+ category?: string | undefined;
439
+ tags?: string[] | undefined;
440
+ parent?: string | undefined;
378
441
  } | undefined;
379
- texture?: {
380
- url: string;
381
- repeat?: [number, number] | undefined;
382
- scale?: number | undefined;
383
- offset?: [number, number] | undefined;
384
- normalMap?: string | undefined;
385
- normalScale?: number | undefined;
386
- bumpMap?: string | undefined;
387
- bumpScale?: number | undefined;
442
+ language: "bpy" | "three";
443
+ script: string;
444
+ params: Record<string, string | number | boolean>;
445
+ artifact: string;
446
+ manifest: {
447
+ bounds: {
448
+ min: [number, number, number];
449
+ max: [number, number, number];
450
+ };
451
+ params: {
452
+ id: string;
453
+ label?: string | undefined;
454
+ kind: "boolean" | "number" | "string";
455
+ default: string | number | boolean;
456
+ min?: number | undefined;
457
+ max?: number | undefined;
458
+ step?: number | undefined;
459
+ unit?: string | undefined;
460
+ options?: string[] | undefined;
461
+ }[];
462
+ parts: {
463
+ id: string;
464
+ label?: string | undefined;
465
+ type?: string | undefined;
466
+ bounds?: {
467
+ min: [number, number, number];
468
+ max: [number, number, number];
469
+ } | undefined;
470
+ }[];
471
+ surfaces: {
472
+ part?: string | undefined;
473
+ y: number;
474
+ polygon: [number, number][];
475
+ }[];
476
+ slots: {
477
+ id: string;
478
+ label?: string | undefined;
479
+ color?: string | undefined;
480
+ roughness?: number | undefined;
481
+ metalness?: number | undefined;
482
+ transparent?: boolean | undefined;
483
+ emissive?: boolean | undefined;
484
+ }[];
485
+ anchors: {
486
+ id: string;
487
+ position: [number, number, number];
488
+ normal?: [number, number, number] | undefined;
489
+ }[];
490
+ lights: {
491
+ id: string;
492
+ position: [number, number, number];
493
+ color: string;
494
+ intensity: number;
495
+ distance?: number | undefined;
496
+ spot?: {
497
+ direction: [number, number, number];
498
+ angle: number;
499
+ softness: number;
500
+ } | undefined;
501
+ shadows?: boolean | undefined;
502
+ glow?: {
503
+ size: number;
504
+ strength: number;
505
+ } | undefined;
506
+ }[];
507
+ undersides: {
508
+ part?: string | undefined;
509
+ polygon: [number, number][];
510
+ plane: [number, number, number, number];
511
+ }[];
512
+ animations: {
513
+ name: string;
514
+ duration: number;
515
+ }[];
516
+ cutters?: {
517
+ host: "ceiling" | "mounted" | "slab" | "wall";
518
+ polygon: number[][];
519
+ minY: number;
520
+ maxY: number;
521
+ }[] | undefined;
522
+ cutout: boolean;
523
+ collider: boolean;
524
+ shape?: {
525
+ tolerance: number;
526
+ bands: {
527
+ y0: number;
528
+ y1: number;
529
+ polygons: {
530
+ outer: [number, number][];
531
+ holes?: [number, number][][] | undefined;
532
+ }[];
533
+ }[];
534
+ } | undefined;
535
+ triangles: number;
536
+ coverage?: number | undefined;
537
+ uncovered?: {
538
+ min: [number, number];
539
+ max: [number, number];
540
+ }[] | undefined;
541
+ };
542
+ images?: {
543
+ artifact: string;
544
+ thumbnail: string;
545
+ floorPlan: string;
388
546
  } | undefined;
547
+ inputs: string;
389
548
  } | undefined;
390
- edgeMaterialPreset?: string | undefined;
391
- wallMaterial?: {
392
- id?: string | undefined;
393
- preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
394
- properties?: {
395
- color: string;
396
- roughness: number;
397
- metalness: number;
398
- opacity: number;
399
- transparent: boolean;
400
- side: "back" | "double" | "front";
401
- } | undefined;
402
- texture?: {
403
- url: string;
404
- repeat?: [number, number] | undefined;
405
- scale?: number | undefined;
406
- offset?: [number, number] | undefined;
407
- normalMap?: string | undefined;
408
- normalScale?: number | undefined;
409
- bumpMap?: string | undefined;
410
- bumpScale?: number | undefined;
411
- } | undefined;
412
- } | undefined;
413
- wallMaterialPreset?: string | undefined;
414
- position: [number, number, number];
415
- rotation: number;
416
- roofType: "barrel" | "conical" | "dutch" | "flat" | "gable" | "gambrel" | "hip" | "mansard" | "shed";
417
- barrelRise?: number | undefined;
418
- barrelSegments?: number | undefined;
419
- roofSystem?: "glazed" | "standard" | undefined;
420
- glazing?: {
421
- across: {
422
- layout: "count" | "fixed-spacing" | "maximum-spacing";
423
- count: number;
424
- spacing: number;
425
- alignment: "center" | "end" | "start";
426
- };
427
- along: {
428
- layout: "count" | "fixed-spacing" | "maximum-spacing";
429
- count: number;
430
- spacing: number;
431
- alignment: "center" | "end" | "start";
432
- };
433
- frameWidth: number;
434
- frameDepth: number;
435
- glassThickness: number;
436
- frameColor: string;
437
- glassColor: string;
438
- glassOpacity: number;
439
- glassRoughness: number;
440
- glazedEnds: boolean;
441
- panelType: "empty" | "glass" | "solid";
442
- panels: {
443
- face: string;
444
- column: number;
445
- row: number;
446
- type: "empty" | "glass" | "solid";
447
- }[];
448
- } | undefined;
449
- slots?: Record<string, string> | undefined;
450
- width: number;
451
- depth: number;
452
- conicalStartAngle?: number | undefined;
453
- conicalSweepAngle?: number | undefined;
454
- conicalFullCircle?: boolean | undefined;
455
- trim: {
456
- left: number;
457
- right: number;
458
- front: number;
459
- back: number;
460
- frontLeft: number;
461
- frontRight: number;
462
- backLeft: number;
463
- backRight: number;
464
- frontLeftX: number;
465
- frontLeftZ: number;
466
- frontRightX: number;
467
- frontRightZ: number;
468
- backLeftX: number;
469
- backLeftZ: number;
470
- backRightX: number;
471
- backRightZ: number;
472
- };
473
- wallHeight: number;
474
- pitch: number;
475
- wallThickness: number;
476
- deckThickness: number;
477
- overhang: number;
478
- gableOverhang?: number | undefined;
479
- shingleThickness: number;
480
- buildUp?: {
481
- presetId?: string | undefined;
482
- roofing: {
483
- kind: "architectural-shingle" | "asphalt-3-tab" | "clay-tile" | "concrete-tile" | "slate" | "standing-seam-metal" | "wood-shake";
484
- thickness: number;
485
- name?: string | undefined;
486
- };
487
- underlayment?: {
488
- kind: "felt-15" | "felt-30" | "ice-and-water" | "synthetic";
489
- thickness: number;
490
- name?: string | undefined;
491
- } | undefined;
492
- sheathing: {
493
- kind: "osb" | "plywood";
494
- thickness: number;
495
- name?: string | undefined;
496
- };
497
- structure: {
498
- system: "rafters" | "trusses";
499
- size: "2x10" | "2x12" | "2x4" | "2x6" | "2x8";
500
- spacing: number;
501
- };
502
- insulation?: {
503
- kind: "batt" | "blown" | "rigid";
504
- thickness: number;
505
- name?: string | undefined;
506
- } | undefined;
507
- finish?: {
508
- kind: "drywall" | "plaster" | "wood-plank";
509
- thickness: number;
510
- name?: string | undefined;
511
- } | undefined;
512
- } | undefined;
513
- arc?: {
514
- centerX: number;
515
- centerZ: number;
516
- radius: number;
517
- } | undefined;
518
- shedSideInfillSpan?: number | undefined;
519
- shedSideInfillMinX?: number | undefined;
520
- shedSideInfillMaxX?: number | undefined;
521
- shedFootprintPieces?: [number, number][][] | undefined;
522
- shedOpenEndSides?: ("left" | "right")[] | undefined;
523
- shedJointFrame?: {
524
- position: [number, number, number];
525
- rotation: number;
526
- } | undefined;
527
- shedJointOwnerId?: string | undefined;
528
- shedJointNeighborIds?: string[] | undefined;
529
- shedJointScopeId?: string | undefined;
530
- managedByParent: boolean;
531
- wallShell: "auto" | "include" | "omit";
532
- shedInsetEndPanels: boolean;
533
- fascia?: boolean | undefined;
534
- eaveCut?: "plumb" | "plumb-level" | "square" | undefined;
535
- fasciaHighEdge?: boolean | undefined;
536
- fasciaHeight?: number | undefined;
537
- fasciaDepth?: number | undefined;
538
- fasciaMaterial?: {
539
- id?: string | undefined;
540
- preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
541
- properties?: {
542
- color: string;
543
- roughness: number;
544
- metalness: number;
545
- opacity: number;
546
- transparent: boolean;
547
- side: "back" | "double" | "front";
548
- } | undefined;
549
- texture?: {
550
- url: string;
551
- repeat?: [number, number] | undefined;
552
- scale?: number | undefined;
553
- offset?: [number, number] | undefined;
554
- normalMap?: string | undefined;
555
- normalScale?: number | undefined;
556
- bumpMap?: string | undefined;
557
- bumpScale?: number | undefined;
558
- } | undefined;
559
- } | undefined;
560
- fasciaMaterialPreset?: string | undefined;
561
- heelMaterial?: {
562
- id?: string | undefined;
563
- preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
564
- properties?: {
565
- color: string;
566
- roughness: number;
567
- metalness: number;
568
- opacity: number;
569
- transparent: boolean;
570
- side: "back" | "double" | "front";
571
- } | undefined;
572
- texture?: {
573
- url: string;
574
- repeat?: [number, number] | undefined;
575
- scale?: number | undefined;
576
- offset?: [number, number] | undefined;
577
- normalMap?: string | undefined;
578
- normalScale?: number | undefined;
579
- bumpMap?: string | undefined;
580
- bumpScale?: number | undefined;
581
- } | undefined;
582
- } | undefined;
583
- heelMaterialPreset?: string | undefined;
584
- gableLeftMaterial?: {
585
- id?: string | undefined;
586
- preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
587
- properties?: {
588
- color: string;
589
- roughness: number;
590
- metalness: number;
591
- opacity: number;
592
- transparent: boolean;
593
- side: "back" | "double" | "front";
594
- } | undefined;
595
- texture?: {
596
- url: string;
597
- repeat?: [number, number] | undefined;
598
- scale?: number | undefined;
599
- offset?: [number, number] | undefined;
600
- normalMap?: string | undefined;
601
- normalScale?: number | undefined;
602
- bumpMap?: string | undefined;
603
- bumpScale?: number | undefined;
604
- } | undefined;
605
- } | undefined;
606
- gableLeftMaterialPreset?: string | undefined;
607
- gableRightMaterial?: {
608
- id?: string | undefined;
609
- preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
610
- properties?: {
611
- color: string;
612
- roughness: number;
613
- metalness: number;
614
- opacity: number;
615
- transparent: boolean;
616
- side: "back" | "double" | "front";
617
- } | undefined;
618
- texture?: {
619
- url: string;
620
- repeat?: [number, number] | undefined;
621
- scale?: number | undefined;
622
- offset?: [number, number] | undefined;
623
- normalMap?: string | undefined;
624
- normalScale?: number | undefined;
625
- bumpMap?: string | undefined;
626
- bumpScale?: number | undefined;
627
- } | undefined;
628
- } | undefined;
629
- gableRightMaterialPreset?: string | undefined;
630
- gambrelLowerWidthRatio: number;
631
- gambrelLowerHeightRatio: number;
632
- mansardSteepWidthRatio: number;
633
- mansardSteepHeightRatio: number;
634
- dutchHipWidthRatio: number;
635
- dutchHipHeightRatio: number;
636
- dutchWaistLengthRatio: number;
637
- dutchGabletRake: number;
638
- dutchTopRakeThickness: number;
639
- children: string[];
640
- type: "roof-segment";
549
+ type: "slab";
641
550
  } | {
642
551
  object: "node";
643
552
  name?: string | undefined;
@@ -662,13 +571,15 @@ export declare function absorbWallSeparators(nodes: SceneNodes, levelId: string,
662
571
  fromIds: string[];
663
572
  } | undefined;
664
573
  } | undefined;
665
- id: `separator_${string}`;
574
+ id: `structural-grid_${string}`;
666
575
  start: [number, number];
667
576
  end: [number, number];
668
- type: "separator";
577
+ label: string;
578
+ showStartBubble: boolean;
579
+ showEndBubble: boolean;
580
+ type: "structural-grid";
669
581
  } | {
670
582
  object: "node";
671
- name?: string | undefined;
672
583
  parentId: string | null;
673
584
  visible: boolean;
674
585
  camera?: {
@@ -678,7 +589,6 @@ export declare function absorbWallSeparators(nodes: SceneNodes, levelId: string,
678
589
  fov?: number | undefined;
679
590
  zoom?: number | undefined;
680
591
  } | undefined;
681
- metadata: Record<string, unknown>;
682
592
  provenance?: {
683
593
  refs: {
684
594
  ns?: string | undefined;
@@ -690,16 +600,18 @@ export declare function absorbWallSeparators(nodes: SceneNodes, levelId: string,
690
600
  fromIds: string[];
691
601
  } | undefined;
692
602
  } | undefined;
693
- id: `spawn_${string}`;
694
- position: [number, number, number];
695
- rotation: number;
696
- supportSlabId?: string | undefined;
697
- type: "spawn";
698
- } | {
699
- object: "node";
700
- name?: string | undefined;
701
- parentId: string | null;
702
- visible: boolean;
603
+ id: `unit_${string}`;
604
+ name: string;
605
+ kind: "apartment" | "commercial" | "common" | "hotel-room";
606
+ members: `zone_${string}`[];
607
+ color: string;
608
+ metadata: Record<string, unknown>;
609
+ type: "unit";
610
+ } | {
611
+ object: "node";
612
+ name?: string | undefined;
613
+ parentId: string | null;
614
+ visible: boolean;
703
615
  camera?: {
704
616
  position: [number, number, number];
705
617
  target: [number, number, number];
@@ -719,7 +631,7 @@ export declare function absorbWallSeparators(nodes: SceneNodes, levelId: string,
719
631
  fromIds: string[];
720
632
  } | undefined;
721
633
  } | undefined;
722
- id: `sseg_${string}`;
634
+ id: `cupola_${string}`;
723
635
  material?: {
724
636
  id?: string | undefined;
725
637
  preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
@@ -742,36 +654,62 @@ export declare function absorbWallSeparators(nodes: SceneNodes, levelId: string,
742
654
  bumpScale?: number | undefined;
743
655
  } | undefined;
744
656
  } | undefined;
745
- materialPreset?: string | undefined;
746
657
  slots?: Record<string, string> | undefined;
658
+ materialPreset: string;
659
+ roofSegmentId?: string | undefined;
747
660
  position: [number, number, number];
748
661
  rotation: number;
749
- segmentType: "landing" | "stair";
750
662
  width: number;
751
- length: number;
663
+ depth: number;
752
664
  height: number;
753
- stepCount: number;
754
- attachmentSide: "front" | "left" | "right";
755
- fillToFloor: boolean;
756
- construction?: {
757
- mode: "center-stringer" | "open" | "side-stringers" | "solid" | "waist";
758
- waistThickness: number;
759
- treadThickness: number;
760
- riserThickness: number;
761
- nosing: number;
762
- finishThickness: number;
763
- closedRisers: boolean;
764
- stringerWidth: number;
765
- stringerDepth: number;
665
+ roofStyle: "dome" | "pyramid";
666
+ finial: boolean;
667
+ type: "cupola";
668
+ } | {
669
+ object: "node";
670
+ name?: string | undefined;
671
+ parentId: string | null;
672
+ visible: boolean;
673
+ camera?: {
674
+ position: [number, number, number];
675
+ target: [number, number, number];
676
+ mode: "orthographic" | "perspective";
677
+ fov?: number | undefined;
678
+ zoom?: number | undefined;
766
679
  } | undefined;
767
- winder?: {
768
- turn: "left" | "right";
769
- innerGap: number;
770
- walkingLineOffset: number;
771
- division: "equal-angle" | "equal-going";
680
+ metadata: Record<string, unknown>;
681
+ provenance?: {
682
+ refs: {
683
+ ns?: string | undefined;
684
+ id: string;
685
+ role?: "absorbed" | "alias" | "derived" | "piece" | "primary" | undefined;
686
+ }[];
687
+ lineage?: {
688
+ op: "attach" | "convert" | "duplicate" | "import" | "make-independent" | "merge" | "promote" | "split";
689
+ fromIds: string[];
690
+ } | undefined;
772
691
  } | undefined;
773
- thickness: number;
774
- type: "stair-segment";
692
+ matchFenceStyle?: boolean | undefined;
693
+ matchFenceHeight?: boolean | undefined;
694
+ leafType?: "double" | "single" | undefined;
695
+ style?: "guard" | "horizontal" | "match" | "picket" | "privacy" | "rail" | "slat" | undefined;
696
+ height?: number | undefined;
697
+ clearance?: number | undefined;
698
+ thickness?: number | undefined;
699
+ frameWidth?: number | undefined;
700
+ spacing?: number | undefined;
701
+ boardWidth?: number | undefined;
702
+ hinge?: "left" | "right" | undefined;
703
+ swing?: "inward" | "outward" | undefined;
704
+ openAngle?: number | undefined;
705
+ leafSplit?: number | undefined;
706
+ brace?: "cross" | "diagonal" | "none" | undefined;
707
+ showHardware?: boolean | undefined;
708
+ showPosts?: boolean | undefined;
709
+ id: `fence-gate_${string}`;
710
+ center: number;
711
+ width: number;
712
+ type: "fence-gate";
775
713
  } | {
776
714
  object: "node";
777
715
  name?: string | undefined;
@@ -796,7 +734,39 @@ export declare function absorbWallSeparators(nodes: SceneNodes, levelId: string,
796
734
  fromIds: string[];
797
735
  } | undefined;
798
736
  } | undefined;
799
- id: `window_${string}`;
737
+ center: number;
738
+ width: number;
739
+ matchFenceStyle?: boolean | undefined;
740
+ matchFenceHeight?: boolean | undefined;
741
+ height?: number | undefined;
742
+ showPosts: boolean;
743
+ id: `fence-opening_${string}`;
744
+ type: "fence-opening";
745
+ } | {
746
+ object: "node";
747
+ name?: string | undefined;
748
+ parentId: string | null;
749
+ visible: boolean;
750
+ camera?: {
751
+ position: [number, number, number];
752
+ target: [number, number, number];
753
+ mode: "orthographic" | "perspective";
754
+ fov?: number | undefined;
755
+ zoom?: number | undefined;
756
+ } | undefined;
757
+ metadata: Record<string, unknown>;
758
+ provenance?: {
759
+ refs: {
760
+ ns?: string | undefined;
761
+ id: string;
762
+ role?: "absorbed" | "alias" | "derived" | "piece" | "primary" | undefined;
763
+ }[];
764
+ lineage?: {
765
+ op: "attach" | "convert" | "duplicate" | "import" | "make-independent" | "merge" | "promote" | "split";
766
+ fromIds: string[];
767
+ } | undefined;
768
+ } | undefined;
769
+ id: `skylight_${string}`;
800
770
  material?: {
801
771
  id?: string | undefined;
802
772
  preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
@@ -819,188 +789,270 @@ export declare function absorbWallSeparators(nodes: SceneNodes, levelId: string,
819
789
  bumpScale?: number | undefined;
820
790
  } | undefined;
821
791
  } | undefined;
822
- slots?: Record<string, string> | undefined;
823
- source?: {
824
- kind: "script";
825
- meta?: {
826
- description?: string | undefined;
827
- category?: string | undefined;
828
- tags?: string[] | undefined;
829
- parent?: string | undefined;
792
+ materialPreset?: string | undefined;
793
+ glassMaterial?: {
794
+ id?: string | undefined;
795
+ preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
796
+ properties?: {
797
+ color: string;
798
+ roughness: number;
799
+ metalness: number;
800
+ opacity: number;
801
+ transparent: boolean;
802
+ side: "back" | "double" | "front";
830
803
  } | undefined;
831
- language: "bpy" | "three";
832
- script: string;
833
- params: Record<string, string | number | boolean>;
834
- artifact: string;
835
- manifest: {
836
- bounds: {
837
- min: [number, number, number];
838
- max: [number, number, number];
839
- };
840
- params: {
841
- id: string;
842
- label?: string | undefined;
843
- kind: "boolean" | "number" | "string";
844
- default: string | number | boolean;
845
- min?: number | undefined;
846
- max?: number | undefined;
847
- step?: number | undefined;
848
- unit?: string | undefined;
849
- options?: string[] | undefined;
850
- }[];
851
- parts: {
852
- id: string;
853
- label?: string | undefined;
854
- type?: string | undefined;
855
- bounds?: {
856
- min: [number, number, number];
857
- max: [number, number, number];
858
- } | undefined;
859
- }[];
860
- surfaces: {
861
- part?: string | undefined;
862
- y: number;
863
- polygon: [number, number][];
864
- }[];
865
- slots: {
866
- id: string;
867
- label?: string | undefined;
868
- color?: string | undefined;
869
- roughness?: number | undefined;
870
- metalness?: number | undefined;
871
- transparent?: boolean | undefined;
872
- emissive?: boolean | undefined;
873
- }[];
874
- anchors: {
875
- id: string;
876
- position: [number, number, number];
877
- normal?: [number, number, number] | undefined;
878
- }[];
879
- lights: {
880
- id: string;
881
- position: [number, number, number];
804
+ texture?: {
805
+ url: string;
806
+ repeat?: [number, number] | undefined;
807
+ scale?: number | undefined;
808
+ offset?: [number, number] | undefined;
809
+ normalMap?: string | undefined;
810
+ normalScale?: number | undefined;
811
+ bumpMap?: string | undefined;
812
+ bumpScale?: number | undefined;
813
+ } | undefined;
814
+ } | undefined;
815
+ glassMaterialPreset?: string | undefined;
816
+ roofSegmentId?: string | undefined;
817
+ position: [number, number, number];
818
+ rotation: number;
819
+ width: number;
820
+ height: number;
821
+ frameThickness: number;
822
+ frameDepth: number;
823
+ skylightType: "flat" | "lantern" | "opening" | "sliding" | "walk-on";
824
+ glassThickness: number;
825
+ lanternHeight: number;
826
+ lanternTopScale: number;
827
+ openingAngle: number;
828
+ openingSide: "bottom" | "left" | "right" | "top";
829
+ operationState: number;
830
+ motorHousing: boolean;
831
+ slideFraction: number;
832
+ slideDirection: "x" | "z";
833
+ trackWidth: number;
834
+ motorHousingSize: number;
835
+ curb: boolean;
836
+ curbHeight: number;
837
+ cutoutOffset: number;
838
+ surfaceNormal?: [number, number, number] | undefined;
839
+ type: "skylight";
840
+ } | {
841
+ object: "node";
842
+ name?: string | undefined;
843
+ parentId: string | null;
844
+ visible: boolean;
845
+ camera?: {
846
+ position: [number, number, number];
847
+ target: [number, number, number];
848
+ mode: "orthographic" | "perspective";
849
+ fov?: number | undefined;
850
+ zoom?: number | undefined;
851
+ } | undefined;
852
+ metadata: Record<string, unknown>;
853
+ provenance?: {
854
+ refs: {
855
+ ns?: string | undefined;
856
+ id: string;
857
+ role?: "absorbed" | "alias" | "derived" | "piece" | "primary" | undefined;
858
+ }[];
859
+ lineage?: {
860
+ op: "attach" | "convert" | "duplicate" | "import" | "make-independent" | "merge" | "promote" | "split";
861
+ fromIds: string[];
862
+ } | undefined;
863
+ } | undefined;
864
+ id: `site_${string}`;
865
+ polygon: {
866
+ type: "polygon";
867
+ points: [number, number][];
868
+ };
869
+ terrain?: {
870
+ type: "heightfield";
871
+ origin: [number, number];
872
+ spacing: number;
873
+ cols: number;
874
+ rows: number;
875
+ step: number;
876
+ heights: string;
877
+ } | undefined;
878
+ showGround?: boolean | undefined;
879
+ presentation?: {
880
+ theme?: string | undefined;
881
+ exposure?: number | undefined;
882
+ shading?: "rendered" | "solid" | undefined;
883
+ edges?: "off" | "soft" | "strong" | undefined;
884
+ shadows?: boolean | undefined;
885
+ lighting?: {
886
+ background?: string | undefined;
887
+ backgroundSky?: string | null | undefined;
888
+ ground?: string | undefined;
889
+ ambient?: {
882
890
  color: string;
883
891
  intensity: number;
884
- distance?: number | undefined;
885
- spot?: {
886
- direction: [number, number, number];
887
- angle: number;
888
- softness: number;
889
- } | undefined;
890
- shadows?: boolean | undefined;
891
- glow?: {
892
- size: number;
893
- strength: number;
892
+ } | undefined;
893
+ hemi?: {
894
+ sky: string;
895
+ ground: string;
896
+ intensity: number;
897
+ } | undefined;
898
+ lights?: {
899
+ color: string;
900
+ intensity: number;
901
+ position: [number, number, number];
902
+ target?: [number, number, number] | undefined;
903
+ castShadow?: boolean | undefined;
904
+ shadow?: {
905
+ intensity?: number | undefined;
906
+ bias?: number | undefined;
907
+ normalBias?: number | undefined;
908
+ radius?: number | undefined;
909
+ mapSize?: 512 | 1024 | 2048 | 4096 | undefined;
910
+ camera?: {
911
+ left: number;
912
+ right: number;
913
+ top: number;
914
+ bottom: number;
915
+ near: number;
916
+ far: number;
917
+ } | undefined;
894
918
  } | undefined;
895
- }[];
896
- undersides: {
897
- part?: string | undefined;
898
- polygon: [number, number][];
899
- plane: [number, number, number, number];
900
- }[];
901
- animations: {
902
- name: string;
903
- duration: number;
904
- }[];
905
- cutters?: {
906
- host: "ceiling" | "mounted" | "slab" | "wall";
907
- polygon: number[][];
908
- minY: number;
909
- maxY: number;
910
919
  }[] | undefined;
911
- cutout: boolean;
912
- collider: boolean;
913
- shape?: {
914
- tolerance: number;
915
- bands: {
916
- y0: number;
917
- y1: number;
918
- polygons: {
919
- outer: [number, number][];
920
- holes?: [number, number][][] | undefined;
921
- }[];
922
- }[];
920
+ environment?: {
921
+ source: "gradient" | "none" | "room";
922
+ intensity: number;
923
923
  } | undefined;
924
- triangles: number;
925
- coverage?: number | undefined;
926
- uncovered?: {
927
- min: [number, number];
928
- max: [number, number];
929
- }[] | undefined;
930
- };
931
- images?: {
932
- artifact: string;
933
- thumbnail: string;
934
- floorPlan: string;
924
+ } | undefined;
925
+ postprocessing?: {
926
+ ambientOcclusion?: boolean | undefined;
927
+ colorGrading?: boolean | undefined;
928
+ } | undefined;
929
+ display?: {
930
+ mode?: "construction" | "finished" | "systems" | undefined;
931
+ families?: Partial<Record<"device" | "exposed-structure" | "fill" | "finish" | "foundation" | "framing" | "inspection" | "insulation" | "masonry" | "membrane" | "run" | "service-space" | "sheathing", boolean>> | undefined;
932
+ disciplines?: Partial<Record<"electrical" | "fire" | "low-voltage" | "mechanical" | "plumbing", boolean>> | undefined;
933
+ xray?: boolean | undefined;
934
+ colorBy?: "material" | "service" | undefined;
935
935
  } | undefined;
936
936
  } | undefined;
937
- position: [number, number, number];
938
- rotation: [number, number, number];
939
- side?: "back" | "front" | undefined;
940
- verticalAnchor?: "floor" | "wall" | undefined;
941
- floorThresholdVersion: 0 | 1;
942
- wallId?: string | undefined;
943
- dormerId?: string | undefined;
944
- dormerFace?: "back" | "front" | "left" | "right" | undefined;
945
- roofSegmentId?: string | undefined;
946
- roofFace?: "back" | "front" | "left" | "right" | undefined;
947
- width: number;
948
- height: number;
949
- mark?: string | undefined;
950
- constructionType: "framed" | "masonry";
951
- dimensionReference: "finish-opening" | "masonry-opening" | "nominal" | "rough-opening";
952
- roughOpeningWidth?: number | undefined;
953
- roughOpeningHeight?: number | undefined;
954
- masonryOpeningWidth?: number | undefined;
955
- masonryOpeningHeight?: number | undefined;
956
- finishOpeningWidth?: number | undefined;
957
- finishOpeningHeight?: number | undefined;
958
- openingKind: "opening" | "window";
959
- windowType: "awning" | "bay" | "bow" | "casement" | "double-hung" | "fixed" | "hopper" | "louvered" | "single-hung" | "sliding" | "tilt-turn";
960
- operationState: number;
961
- openingDirection?: "inward" | "outward" | undefined;
962
- tiltTurnMode?: "tilt" | "turn" | undefined;
963
- awningDirection: "down" | "up";
964
- casementStyle: "french" | "single";
965
- hingesSide: "left" | "right";
966
- openingShape: "arch" | "rectangle" | "rounded";
967
- openingRadiusMode: "all" | "individual";
968
- openingCornerRadii: [number, number, number, number];
969
- cornerRadius: number;
970
- archHeight: number;
971
- openingRevealRadius: number;
972
- frameThickness: number;
973
- frameDepth?: number | undefined;
974
- windowHandle?: boolean | undefined;
975
- sashGrid?: boolean | undefined;
976
- columnRatios: number[];
977
- rowRatios: number[];
978
- columnDividerThickness: number;
979
- rowDividerThickness: number;
980
- corner?: {
981
- end: "end" | "start";
982
- partnerId: string;
983
- post: "none" | "post";
937
+ address?: {
938
+ street?: string | undefined;
939
+ city?: string | undefined;
940
+ state?: string | undefined;
941
+ zip?: string | undefined;
984
942
  } | undefined;
985
- sill: boolean;
986
- sillDepth: number;
987
- sillThickness: number;
988
- sillOverhang?: number | undefined;
989
- sillInterior?: boolean | undefined;
990
- sillInteriorDepth?: number | undefined;
991
- sillInteriorThickness?: number | undefined;
992
- sillInteriorOverhang?: number | undefined;
993
- shutters?: "board-batten" | "louvered" | "none" | "panel" | undefined;
994
- shutterWidth?: number | undefined;
995
- shutterOpen?: number | undefined;
996
- shutterSides?: "both" | "left" | "right" | undefined;
997
- rollerShutter?: "box" | "concealed" | "none" | undefined;
998
- rollerShutterBoxHeight?: number | undefined;
999
- rollerShutterOpen?: number | undefined;
1000
- casingFaceA?: boolean | undefined;
1001
- casingFaceB?: boolean | undefined;
1002
- casingWidth?: number | undefined;
1003
- type: "window";
943
+ parcel?: {
944
+ apn?: string | undefined;
945
+ source?: string | undefined;
946
+ county?: string | undefined;
947
+ state?: string | undefined;
948
+ lotAreaSqFt?: number | undefined;
949
+ originLngLat?: [number, number] | undefined;
950
+ resolvedAt?: string | undefined;
951
+ layer?: string | undefined;
952
+ notes?: string[] | undefined;
953
+ } | undefined;
954
+ setbacks?: {
955
+ front: number;
956
+ side: number;
957
+ rear: number;
958
+ left?: number | undefined;
959
+ right?: number | undefined;
960
+ streetSide?: number | undefined;
961
+ } | undefined;
962
+ setbacksSource?: string | undefined;
963
+ zone?: string | undefined;
964
+ frontEdge?: number | undefined;
965
+ streetEdges?: number[] | undefined;
966
+ sightTriangleFt?: number | undefined;
967
+ northRotation?: number | undefined;
968
+ dossier?: {
969
+ [x: string]: unknown;
970
+ provider: string;
971
+ asOf: string;
972
+ point?: {
973
+ lat?: number | undefined;
974
+ lng?: number | undefined;
975
+ source?: string | undefined;
976
+ } | undefined;
977
+ address?: {
978
+ formatted?: string | undefined;
979
+ precision?: string | undefined;
980
+ } | undefined;
981
+ sections: Record<string, {
982
+ [x: string]: unknown;
983
+ status: string;
984
+ summary?: string | undefined;
985
+ reason?: string | undefined;
986
+ source?: {
987
+ name?: string | undefined;
988
+ kind?: string | undefined;
989
+ vintage?: string | undefined;
990
+ attribution?: string | undefined;
991
+ } | undefined;
992
+ }>;
993
+ parcel?: Record<string, unknown> | undefined;
994
+ flood?: Record<string, unknown> | undefined;
995
+ codeBasis?: Record<string, unknown> | undefined;
996
+ zoning?: Record<string, unknown> | undefined;
997
+ utilities?: Record<string, unknown> | undefined;
998
+ soils?: Record<string, unknown> | undefined;
999
+ wetlands?: Record<string, unknown> | undefined;
1000
+ structures?: Record<string, unknown> | undefined;
1001
+ elevation?: Record<string, unknown> | undefined;
1002
+ boundaries?: Record<string, unknown> | undefined;
1003
+ } | undefined;
1004
+ contourIntervalIn?: number | undefined;
1005
+ contours3d?: boolean | undefined;
1006
+ terrainContours?: {
1007
+ datum: string;
1008
+ intervalFt: number;
1009
+ source?: string | undefined;
1010
+ lines: {
1011
+ elevationFt: number;
1012
+ points: [number, number][];
1013
+ }[];
1014
+ } | undefined;
1015
+ wallTypes?: {
1016
+ id: string;
1017
+ label: string;
1018
+ assembly: {
1019
+ layers: {
1020
+ id: string;
1021
+ role: "air" | "covering" | "deck" | "fill" | "finish" | "furring" | "glazing" | "insulation" | "lining" | "membrane" | "sheathing" | "shell" | "structure" | "substrate" | "underlay";
1022
+ thickness: number;
1023
+ core?: true | undefined;
1024
+ spacing?: number | undefined;
1025
+ material?: string | undefined;
1026
+ slot?: string | undefined;
1027
+ returns?: boolean | undefined;
1028
+ display?: "construction" | "finished" | undefined;
1029
+ inset?: number | undefined;
1030
+ bottom?: number | undefined;
1031
+ lift?: number | undefined;
1032
+ src?: string | undefined;
1033
+ }[];
1034
+ backing?: {
1035
+ id: string;
1036
+ role: "air" | "covering" | "deck" | "fill" | "finish" | "furring" | "glazing" | "insulation" | "lining" | "membrane" | "sheathing" | "shell" | "structure" | "substrate" | "underlay";
1037
+ thickness: number;
1038
+ core?: true | undefined;
1039
+ spacing?: number | undefined;
1040
+ material?: string | undefined;
1041
+ slot?: string | undefined;
1042
+ returns?: boolean | undefined;
1043
+ display?: "construction" | "finished" | undefined;
1044
+ inset?: number | undefined;
1045
+ bottom?: number | undefined;
1046
+ lift?: number | undefined;
1047
+ src?: string | undefined;
1048
+ }[] | undefined;
1049
+ face?: "exterior" | "front" | undefined;
1050
+ presetId?: string | undefined;
1051
+ cavityInsulation?: string | undefined;
1052
+ };
1053
+ }[] | undefined;
1054
+ children: string[];
1055
+ type: "site";
1004
1056
  } | {
1005
1057
  object: "node";
1006
1058
  name?: string | undefined;
@@ -1419,39 +1471,268 @@ export declare function absorbWallSeparators(nodes: SceneNodes, levelId: string,
1419
1471
  openingKind: "door" | "opening";
1420
1472
  openingShape: "arch" | "rectangle" | "rounded";
1421
1473
  openingRadiusMode: "all" | "individual";
1422
- openingTopRadii: [number, number];
1474
+ openingTopRadii: [number, number];
1475
+ cornerRadius: number;
1476
+ archHeight: number;
1477
+ openingRevealRadius: number;
1478
+ frameThickness: number;
1479
+ frameDepth?: number | undefined;
1480
+ threshold: boolean;
1481
+ thresholdHeight: number;
1482
+ casingFaceA?: boolean | undefined;
1483
+ casingFaceB?: boolean | undefined;
1484
+ casingWidth?: number | undefined;
1485
+ hingesSide: "left" | "right";
1486
+ swingDirection: "inward" | "outward";
1487
+ swingAngle: number;
1488
+ segments: {
1489
+ type: "empty" | "glass" | "panel";
1490
+ heightRatio: number;
1491
+ columnRatios: number[];
1492
+ dividerThickness: number;
1493
+ panelDepth: number;
1494
+ panelInset: number;
1495
+ }[];
1496
+ handle: boolean;
1497
+ handleStyle?: "bar" | "knob" | "lever" | "lever-curved" | "plate" | undefined;
1498
+ handleHeight: number;
1499
+ handleSide: "left" | "right";
1500
+ contentPadding: [number, number];
1501
+ doorCloser: boolean;
1502
+ panicBar: boolean;
1503
+ panicBarStyle: "crossbar" | "touchbar";
1504
+ panicBarRods: boolean;
1505
+ panicBarHeight: number;
1506
+ type: "door";
1507
+ } | {
1508
+ object: "node";
1509
+ name?: string | undefined;
1510
+ parentId: string | null;
1511
+ visible: boolean;
1512
+ camera?: {
1513
+ position: [number, number, number];
1514
+ target: [number, number, number];
1515
+ mode: "orthographic" | "perspective";
1516
+ fov?: number | undefined;
1517
+ zoom?: number | undefined;
1518
+ } | undefined;
1519
+ metadata: Record<string, unknown>;
1520
+ provenance?: {
1521
+ refs: {
1522
+ ns?: string | undefined;
1523
+ id: string;
1524
+ role?: "absorbed" | "alias" | "derived" | "piece" | "primary" | undefined;
1525
+ }[];
1526
+ lineage?: {
1527
+ op: "attach" | "convert" | "duplicate" | "import" | "make-independent" | "merge" | "promote" | "split";
1528
+ fromIds: string[];
1529
+ } | undefined;
1530
+ } | undefined;
1531
+ id: `window_${string}`;
1532
+ material?: {
1533
+ id?: string | undefined;
1534
+ preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
1535
+ properties?: {
1536
+ color: string;
1537
+ roughness: number;
1538
+ metalness: number;
1539
+ opacity: number;
1540
+ transparent: boolean;
1541
+ side: "back" | "double" | "front";
1542
+ } | undefined;
1543
+ texture?: {
1544
+ url: string;
1545
+ repeat?: [number, number] | undefined;
1546
+ scale?: number | undefined;
1547
+ offset?: [number, number] | undefined;
1548
+ normalMap?: string | undefined;
1549
+ normalScale?: number | undefined;
1550
+ bumpMap?: string | undefined;
1551
+ bumpScale?: number | undefined;
1552
+ } | undefined;
1553
+ } | undefined;
1554
+ slots?: Record<string, string> | undefined;
1555
+ source?: {
1556
+ kind: "script";
1557
+ meta?: {
1558
+ description?: string | undefined;
1559
+ category?: string | undefined;
1560
+ tags?: string[] | undefined;
1561
+ parent?: string | undefined;
1562
+ } | undefined;
1563
+ language: "bpy" | "three";
1564
+ script: string;
1565
+ params: Record<string, string | number | boolean>;
1566
+ artifact: string;
1567
+ manifest: {
1568
+ bounds: {
1569
+ min: [number, number, number];
1570
+ max: [number, number, number];
1571
+ };
1572
+ params: {
1573
+ id: string;
1574
+ label?: string | undefined;
1575
+ kind: "boolean" | "number" | "string";
1576
+ default: string | number | boolean;
1577
+ min?: number | undefined;
1578
+ max?: number | undefined;
1579
+ step?: number | undefined;
1580
+ unit?: string | undefined;
1581
+ options?: string[] | undefined;
1582
+ }[];
1583
+ parts: {
1584
+ id: string;
1585
+ label?: string | undefined;
1586
+ type?: string | undefined;
1587
+ bounds?: {
1588
+ min: [number, number, number];
1589
+ max: [number, number, number];
1590
+ } | undefined;
1591
+ }[];
1592
+ surfaces: {
1593
+ part?: string | undefined;
1594
+ y: number;
1595
+ polygon: [number, number][];
1596
+ }[];
1597
+ slots: {
1598
+ id: string;
1599
+ label?: string | undefined;
1600
+ color?: string | undefined;
1601
+ roughness?: number | undefined;
1602
+ metalness?: number | undefined;
1603
+ transparent?: boolean | undefined;
1604
+ emissive?: boolean | undefined;
1605
+ }[];
1606
+ anchors: {
1607
+ id: string;
1608
+ position: [number, number, number];
1609
+ normal?: [number, number, number] | undefined;
1610
+ }[];
1611
+ lights: {
1612
+ id: string;
1613
+ position: [number, number, number];
1614
+ color: string;
1615
+ intensity: number;
1616
+ distance?: number | undefined;
1617
+ spot?: {
1618
+ direction: [number, number, number];
1619
+ angle: number;
1620
+ softness: number;
1621
+ } | undefined;
1622
+ shadows?: boolean | undefined;
1623
+ glow?: {
1624
+ size: number;
1625
+ strength: number;
1626
+ } | undefined;
1627
+ }[];
1628
+ undersides: {
1629
+ part?: string | undefined;
1630
+ polygon: [number, number][];
1631
+ plane: [number, number, number, number];
1632
+ }[];
1633
+ animations: {
1634
+ name: string;
1635
+ duration: number;
1636
+ }[];
1637
+ cutters?: {
1638
+ host: "ceiling" | "mounted" | "slab" | "wall";
1639
+ polygon: number[][];
1640
+ minY: number;
1641
+ maxY: number;
1642
+ }[] | undefined;
1643
+ cutout: boolean;
1644
+ collider: boolean;
1645
+ shape?: {
1646
+ tolerance: number;
1647
+ bands: {
1648
+ y0: number;
1649
+ y1: number;
1650
+ polygons: {
1651
+ outer: [number, number][];
1652
+ holes?: [number, number][][] | undefined;
1653
+ }[];
1654
+ }[];
1655
+ } | undefined;
1656
+ triangles: number;
1657
+ coverage?: number | undefined;
1658
+ uncovered?: {
1659
+ min: [number, number];
1660
+ max: [number, number];
1661
+ }[] | undefined;
1662
+ };
1663
+ images?: {
1664
+ artifact: string;
1665
+ thumbnail: string;
1666
+ floorPlan: string;
1667
+ } | undefined;
1668
+ } | undefined;
1669
+ position: [number, number, number];
1670
+ rotation: [number, number, number];
1671
+ side?: "back" | "front" | undefined;
1672
+ verticalAnchor?: "floor" | "wall" | undefined;
1673
+ floorThresholdVersion: 0 | 1;
1674
+ wallId?: string | undefined;
1675
+ dormerId?: string | undefined;
1676
+ dormerFace?: "back" | "front" | "left" | "right" | undefined;
1677
+ roofSegmentId?: string | undefined;
1678
+ roofFace?: "back" | "front" | "left" | "right" | undefined;
1679
+ width: number;
1680
+ height: number;
1681
+ mark?: string | undefined;
1682
+ constructionType: "framed" | "masonry";
1683
+ dimensionReference: "finish-opening" | "masonry-opening" | "nominal" | "rough-opening";
1684
+ roughOpeningWidth?: number | undefined;
1685
+ roughOpeningHeight?: number | undefined;
1686
+ masonryOpeningWidth?: number | undefined;
1687
+ masonryOpeningHeight?: number | undefined;
1688
+ finishOpeningWidth?: number | undefined;
1689
+ finishOpeningHeight?: number | undefined;
1690
+ openingKind: "opening" | "window";
1691
+ windowType: "awning" | "bay" | "bow" | "casement" | "double-hung" | "fixed" | "hopper" | "louvered" | "single-hung" | "sliding" | "tilt-turn";
1692
+ operationState: number;
1693
+ openingDirection?: "inward" | "outward" | undefined;
1694
+ tiltTurnMode?: "tilt" | "turn" | undefined;
1695
+ awningDirection: "down" | "up";
1696
+ casementStyle: "french" | "single";
1697
+ hingesSide: "left" | "right";
1698
+ openingShape: "arch" | "rectangle" | "rounded";
1699
+ openingRadiusMode: "all" | "individual";
1700
+ openingCornerRadii: [number, number, number, number];
1423
1701
  cornerRadius: number;
1424
1702
  archHeight: number;
1425
1703
  openingRevealRadius: number;
1426
1704
  frameThickness: number;
1427
1705
  frameDepth?: number | undefined;
1428
- threshold: boolean;
1429
- thresholdHeight: number;
1706
+ windowHandle?: boolean | undefined;
1707
+ sashGrid?: boolean | undefined;
1708
+ columnRatios: number[];
1709
+ rowRatios: number[];
1710
+ columnDividerThickness: number;
1711
+ rowDividerThickness: number;
1712
+ corner?: {
1713
+ end: "end" | "start";
1714
+ partnerId: string;
1715
+ post: "none" | "post";
1716
+ } | undefined;
1717
+ sill: boolean;
1718
+ sillDepth: number;
1719
+ sillThickness: number;
1720
+ sillOverhang?: number | undefined;
1721
+ sillInterior?: boolean | undefined;
1722
+ sillInteriorDepth?: number | undefined;
1723
+ sillInteriorThickness?: number | undefined;
1724
+ sillInteriorOverhang?: number | undefined;
1725
+ shutters?: "board-batten" | "louvered" | "none" | "panel" | undefined;
1726
+ shutterWidth?: number | undefined;
1727
+ shutterOpen?: number | undefined;
1728
+ shutterSides?: "both" | "left" | "right" | undefined;
1729
+ rollerShutter?: "box" | "concealed" | "none" | undefined;
1730
+ rollerShutterBoxHeight?: number | undefined;
1731
+ rollerShutterOpen?: number | undefined;
1430
1732
  casingFaceA?: boolean | undefined;
1431
1733
  casingFaceB?: boolean | undefined;
1432
1734
  casingWidth?: number | undefined;
1433
- hingesSide: "left" | "right";
1434
- swingDirection: "inward" | "outward";
1435
- swingAngle: number;
1436
- segments: {
1437
- type: "empty" | "glass" | "panel";
1438
- heightRatio: number;
1439
- columnRatios: number[];
1440
- dividerThickness: number;
1441
- panelDepth: number;
1442
- panelInset: number;
1443
- }[];
1444
- handle: boolean;
1445
- handleStyle?: "bar" | "knob" | "lever" | "lever-curved" | "plate" | undefined;
1446
- handleHeight: number;
1447
- handleSide: "left" | "right";
1448
- contentPadding: [number, number];
1449
- doorCloser: boolean;
1450
- panicBar: boolean;
1451
- panicBarStyle: "crossbar" | "touchbar";
1452
- panicBarRods: boolean;
1453
- panicBarHeight: number;
1454
- type: "door";
1735
+ type: "window";
1455
1736
  } | {
1456
1737
  object: "node";
1457
1738
  name?: string | undefined;
@@ -1717,7 +1998,7 @@ export declare function absorbWallSeparators(nodes: SceneNodes, levelId: string,
1717
1998
  fromIds: string[];
1718
1999
  } | undefined;
1719
2000
  } | undefined;
1720
- id: `roof_${string}`;
2001
+ id: `rseg_${string}`;
1721
2002
  material?: {
1722
2003
  id?: string | undefined;
1723
2004
  preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
@@ -1763,8 +2044,201 @@ export declare function absorbWallSeparators(nodes: SceneNodes, levelId: string,
1763
2044
  bumpScale?: number | undefined;
1764
2045
  } | undefined;
1765
2046
  } | undefined;
1766
- topMaterialPreset?: string | undefined;
1767
- edgeMaterial?: {
2047
+ topMaterialPreset?: string | undefined;
2048
+ edgeMaterial?: {
2049
+ id?: string | undefined;
2050
+ preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
2051
+ properties?: {
2052
+ color: string;
2053
+ roughness: number;
2054
+ metalness: number;
2055
+ opacity: number;
2056
+ transparent: boolean;
2057
+ side: "back" | "double" | "front";
2058
+ } | undefined;
2059
+ texture?: {
2060
+ url: string;
2061
+ repeat?: [number, number] | undefined;
2062
+ scale?: number | undefined;
2063
+ offset?: [number, number] | undefined;
2064
+ normalMap?: string | undefined;
2065
+ normalScale?: number | undefined;
2066
+ bumpMap?: string | undefined;
2067
+ bumpScale?: number | undefined;
2068
+ } | undefined;
2069
+ } | undefined;
2070
+ edgeMaterialPreset?: string | undefined;
2071
+ wallMaterial?: {
2072
+ id?: string | undefined;
2073
+ preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
2074
+ properties?: {
2075
+ color: string;
2076
+ roughness: number;
2077
+ metalness: number;
2078
+ opacity: number;
2079
+ transparent: boolean;
2080
+ side: "back" | "double" | "front";
2081
+ } | undefined;
2082
+ texture?: {
2083
+ url: string;
2084
+ repeat?: [number, number] | undefined;
2085
+ scale?: number | undefined;
2086
+ offset?: [number, number] | undefined;
2087
+ normalMap?: string | undefined;
2088
+ normalScale?: number | undefined;
2089
+ bumpMap?: string | undefined;
2090
+ bumpScale?: number | undefined;
2091
+ } | undefined;
2092
+ } | undefined;
2093
+ wallMaterialPreset?: string | undefined;
2094
+ position: [number, number, number];
2095
+ rotation: number;
2096
+ roofType: "barrel" | "conical" | "dutch" | "flat" | "gable" | "gambrel" | "hip" | "mansard" | "shed";
2097
+ barrelRise?: number | undefined;
2098
+ barrelSegments?: number | undefined;
2099
+ roofSystem?: "glazed" | "standard" | undefined;
2100
+ glazing?: {
2101
+ across: {
2102
+ layout: "count" | "fixed-spacing" | "maximum-spacing";
2103
+ count: number;
2104
+ spacing: number;
2105
+ alignment: "center" | "end" | "start";
2106
+ };
2107
+ along: {
2108
+ layout: "count" | "fixed-spacing" | "maximum-spacing";
2109
+ count: number;
2110
+ spacing: number;
2111
+ alignment: "center" | "end" | "start";
2112
+ };
2113
+ frameWidth: number;
2114
+ frameDepth: number;
2115
+ glassThickness: number;
2116
+ frameColor: string;
2117
+ glassColor: string;
2118
+ glassOpacity: number;
2119
+ glassRoughness: number;
2120
+ glazedEnds: boolean;
2121
+ panelType: "empty" | "glass" | "solid";
2122
+ panels: {
2123
+ face: string;
2124
+ column: number;
2125
+ row: number;
2126
+ type: "empty" | "glass" | "solid";
2127
+ }[];
2128
+ } | undefined;
2129
+ slots?: Record<string, string> | undefined;
2130
+ width: number;
2131
+ depth: number;
2132
+ conicalStartAngle?: number | undefined;
2133
+ conicalSweepAngle?: number | undefined;
2134
+ conicalFullCircle?: boolean | undefined;
2135
+ trim: {
2136
+ left: number;
2137
+ right: number;
2138
+ front: number;
2139
+ back: number;
2140
+ frontLeft: number;
2141
+ frontRight: number;
2142
+ backLeft: number;
2143
+ backRight: number;
2144
+ frontLeftX: number;
2145
+ frontLeftZ: number;
2146
+ frontRightX: number;
2147
+ frontRightZ: number;
2148
+ backLeftX: number;
2149
+ backLeftZ: number;
2150
+ backRightX: number;
2151
+ backRightZ: number;
2152
+ };
2153
+ wallHeight: number;
2154
+ pitch: number;
2155
+ wallThickness: number;
2156
+ deckThickness: number;
2157
+ overhang: number;
2158
+ gableOverhang?: number | undefined;
2159
+ shingleThickness: number;
2160
+ buildUp?: {
2161
+ presetId?: string | undefined;
2162
+ roofing: {
2163
+ kind: "architectural-shingle" | "asphalt-3-tab" | "clay-tile" | "concrete-tile" | "slate" | "standing-seam-metal" | "wood-shake";
2164
+ thickness: number;
2165
+ name?: string | undefined;
2166
+ };
2167
+ underlayment?: {
2168
+ kind: "felt-15" | "felt-30" | "ice-and-water" | "synthetic";
2169
+ thickness: number;
2170
+ name?: string | undefined;
2171
+ } | undefined;
2172
+ sheathing: {
2173
+ kind: "osb" | "plywood";
2174
+ thickness: number;
2175
+ name?: string | undefined;
2176
+ };
2177
+ structure: {
2178
+ system: "rafters" | "trusses";
2179
+ size: "2x10" | "2x12" | "2x4" | "2x6" | "2x8";
2180
+ spacing: number;
2181
+ };
2182
+ insulation?: {
2183
+ kind: "batt" | "blown" | "rigid";
2184
+ thickness: number;
2185
+ name?: string | undefined;
2186
+ } | undefined;
2187
+ finish?: {
2188
+ kind: "drywall" | "plaster" | "wood-plank";
2189
+ thickness: number;
2190
+ name?: string | undefined;
2191
+ } | undefined;
2192
+ } | undefined;
2193
+ arc?: {
2194
+ centerX: number;
2195
+ centerZ: number;
2196
+ radius: number;
2197
+ } | undefined;
2198
+ shedSideInfillSpan?: number | undefined;
2199
+ shedSideInfillMinX?: number | undefined;
2200
+ shedSideInfillMaxX?: number | undefined;
2201
+ shedFootprintPieces?: [number, number][][] | undefined;
2202
+ shedOpenEndSides?: ("left" | "right")[] | undefined;
2203
+ shedJointFrame?: {
2204
+ position: [number, number, number];
2205
+ rotation: number;
2206
+ } | undefined;
2207
+ shedJointOwnerId?: string | undefined;
2208
+ shedJointNeighborIds?: string[] | undefined;
2209
+ shedJointScopeId?: string | undefined;
2210
+ managedByParent: boolean;
2211
+ wallShell: "auto" | "include" | "omit";
2212
+ shedInsetEndPanels: boolean;
2213
+ fascia?: boolean | undefined;
2214
+ eaveCut?: "plumb" | "plumb-level" | "square" | undefined;
2215
+ fasciaHighEdge?: boolean | undefined;
2216
+ fasciaHeight?: number | undefined;
2217
+ fasciaDepth?: number | undefined;
2218
+ fasciaMaterial?: {
2219
+ id?: string | undefined;
2220
+ preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
2221
+ properties?: {
2222
+ color: string;
2223
+ roughness: number;
2224
+ metalness: number;
2225
+ opacity: number;
2226
+ transparent: boolean;
2227
+ side: "back" | "double" | "front";
2228
+ } | undefined;
2229
+ texture?: {
2230
+ url: string;
2231
+ repeat?: [number, number] | undefined;
2232
+ scale?: number | undefined;
2233
+ offset?: [number, number] | undefined;
2234
+ normalMap?: string | undefined;
2235
+ normalScale?: number | undefined;
2236
+ bumpMap?: string | undefined;
2237
+ bumpScale?: number | undefined;
2238
+ } | undefined;
2239
+ } | undefined;
2240
+ fasciaMaterialPreset?: string | undefined;
2241
+ heelMaterial?: {
1768
2242
  id?: string | undefined;
1769
2243
  preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
1770
2244
  properties?: {
@@ -1786,8 +2260,8 @@ export declare function absorbWallSeparators(nodes: SceneNodes, levelId: string,
1786
2260
  bumpScale?: number | undefined;
1787
2261
  } | undefined;
1788
2262
  } | undefined;
1789
- edgeMaterialPreset?: string | undefined;
1790
- wallMaterial?: {
2263
+ heelMaterialPreset?: string | undefined;
2264
+ gableLeftMaterial?: {
1791
2265
  id?: string | undefined;
1792
2266
  preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
1793
2267
  properties?: {
@@ -1809,8 +2283,8 @@ export declare function absorbWallSeparators(nodes: SceneNodes, levelId: string,
1809
2283
  bumpScale?: number | undefined;
1810
2284
  } | undefined;
1811
2285
  } | undefined;
1812
- wallMaterialPreset?: string | undefined;
1813
- heelMaterial?: {
2286
+ gableLeftMaterialPreset?: string | undefined;
2287
+ gableRightMaterial?: {
1814
2288
  id?: string | undefined;
1815
2289
  preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
1816
2290
  properties?: {
@@ -1832,57 +2306,18 @@ export declare function absorbWallSeparators(nodes: SceneNodes, levelId: string,
1832
2306
  bumpScale?: number | undefined;
1833
2307
  } | undefined;
1834
2308
  } | undefined;
1835
- heelMaterialPreset?: string | undefined;
1836
- position: [number, number, number];
1837
- rotation: number;
1838
- support: {
1839
- kind: "level";
1840
- } | {
1841
- kind: "walls";
1842
- } | {
1843
- kind: "roof";
1844
- roofSegmentId: `rseg_${string}`;
1845
- localPosition: [number, number];
1846
- curbHeight: number;
1847
- };
1848
- assembly?: {
1849
- layers: {
1850
- id: string;
1851
- role: "air" | "covering" | "deck" | "fill" | "finish" | "furring" | "glazing" | "insulation" | "lining" | "membrane" | "sheathing" | "shell" | "structure" | "substrate" | "underlay";
1852
- thickness: number;
1853
- core?: true | undefined;
1854
- spacing?: number | undefined;
1855
- material?: string | undefined;
1856
- slot?: string | undefined;
1857
- returns?: boolean | undefined;
1858
- display?: "construction" | "finished" | undefined;
1859
- inset?: number | undefined;
1860
- bottom?: number | undefined;
1861
- lift?: number | undefined;
1862
- src?: string | undefined;
1863
- }[];
1864
- backing?: {
1865
- id: string;
1866
- role: "air" | "covering" | "deck" | "fill" | "finish" | "furring" | "glazing" | "insulation" | "lining" | "membrane" | "sheathing" | "shell" | "structure" | "substrate" | "underlay";
1867
- thickness: number;
1868
- core?: true | undefined;
1869
- spacing?: number | undefined;
1870
- material?: string | undefined;
1871
- slot?: string | undefined;
1872
- returns?: boolean | undefined;
1873
- display?: "construction" | "finished" | undefined;
1874
- inset?: number | undefined;
1875
- bottom?: number | undefined;
1876
- lift?: number | undefined;
1877
- src?: string | undefined;
1878
- }[] | undefined;
1879
- face?: "exterior" | "front" | undefined;
1880
- presetId?: string | undefined;
1881
- cavityInsulation?: string | undefined;
1882
- } | undefined;
1883
- slots?: Record<string, string> | undefined;
1884
- children: `rseg_${string}`[];
1885
- type: "roof";
2309
+ gableRightMaterialPreset?: string | undefined;
2310
+ gambrelLowerWidthRatio: number;
2311
+ gambrelLowerHeightRatio: number;
2312
+ mansardSteepWidthRatio: number;
2313
+ mansardSteepHeightRatio: number;
2314
+ dutchHipWidthRatio: number;
2315
+ dutchHipHeightRatio: number;
2316
+ dutchWaistLengthRatio: number;
2317
+ dutchGabletRake: number;
2318
+ dutchTopRakeThickness: number;
2319
+ children: string[];
2320
+ type: "roof-segment";
1886
2321
  } | {
1887
2322
  object: "node";
1888
2323
  name?: string | undefined;
@@ -1907,7 +2342,7 @@ export declare function absorbWallSeparators(nodes: SceneNodes, levelId: string,
1907
2342
  fromIds: string[];
1908
2343
  } | undefined;
1909
2344
  } | undefined;
1910
- id: `slab_${string}`;
2345
+ id: `roof_${string}`;
1911
2346
  material?: {
1912
2347
  id?: string | undefined;
1913
2348
  preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
@@ -1915,189 +2350,164 @@ export declare function absorbWallSeparators(nodes: SceneNodes, levelId: string,
1915
2350
  color: string;
1916
2351
  roughness: number;
1917
2352
  metalness: number;
1918
- opacity: number;
1919
- transparent: boolean;
1920
- side: "back" | "double" | "front";
1921
- } | undefined;
1922
- texture?: {
1923
- url: string;
1924
- repeat?: [number, number] | undefined;
1925
- scale?: number | undefined;
1926
- offset?: [number, number] | undefined;
1927
- normalMap?: string | undefined;
1928
- normalScale?: number | undefined;
1929
- bumpMap?: string | undefined;
1930
- bumpScale?: number | undefined;
1931
- } | undefined;
1932
- } | undefined;
1933
- materialPreset?: string | undefined;
1934
- slots?: Record<string, string> | undefined;
1935
- polygon: [number, number][];
1936
- holes: [number, number][][];
1937
- holeMetadata: {
1938
- source: "elevator" | "floor-opening" | "manual" | "room" | "stair";
1939
- openingId?: string | undefined;
1940
- stairId?: string | undefined;
1941
- elevatorId?: string | undefined;
1942
- }[];
1943
- elevation: number;
1944
- floorHeight?: number | undefined;
1945
- referenceFloorElevation?: number | undefined;
1946
- foundation?: {
1947
- type: "none" | "solid";
1948
- material?: string | {
1949
- id?: string | undefined;
1950
- preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
1951
- properties?: {
1952
- color: string;
1953
- roughness: number;
1954
- metalness: number;
1955
- opacity: number;
1956
- transparent: boolean;
1957
- side: "back" | "double" | "front";
1958
- } | undefined;
1959
- texture?: {
1960
- url: string;
1961
- repeat?: [number, number] | undefined;
1962
- scale?: number | undefined;
1963
- offset?: [number, number] | undefined;
1964
- normalMap?: string | undefined;
1965
- normalScale?: number | undefined;
1966
- bumpMap?: string | undefined;
1967
- bumpScale?: number | undefined;
1968
- } | undefined;
1969
- } | undefined;
1970
- } | undefined;
1971
- thickness: number;
1972
- recessed: boolean;
1973
- recessedRimElevation?: number | undefined;
1974
- fillToTerrain?: boolean | undefined;
1975
- boundary?: "auto" | undefined;
1976
- support?: "open" | undefined;
1977
- plateRole?: "base" | "platform" | "sunken" | undefined;
1978
- railing?: {
1979
- start: [number, number];
1980
- end: [number, number];
1981
- }[] | undefined;
1982
- zoneIds?: string[] | undefined;
1983
- associatedZoneIds?: string[] | undefined;
1984
- autoFromWalls: boolean;
1985
- surfaceScript?: {
1986
- kind: "script";
1987
- meta?: {
1988
- description?: string | undefined;
1989
- category?: string | undefined;
1990
- tags?: string[] | undefined;
1991
- parent?: string | undefined;
1992
- } | undefined;
1993
- language: "bpy" | "three";
1994
- script: string;
1995
- params: Record<string, string | number | boolean>;
1996
- artifact: string;
1997
- manifest: {
1998
- bounds: {
1999
- min: [number, number, number];
2000
- max: [number, number, number];
2001
- };
2002
- params: {
2003
- id: string;
2004
- label?: string | undefined;
2005
- kind: "boolean" | "number" | "string";
2006
- default: string | number | boolean;
2007
- min?: number | undefined;
2008
- max?: number | undefined;
2009
- step?: number | undefined;
2010
- unit?: string | undefined;
2011
- options?: string[] | undefined;
2012
- }[];
2013
- parts: {
2014
- id: string;
2015
- label?: string | undefined;
2016
- type?: string | undefined;
2017
- bounds?: {
2018
- min: [number, number, number];
2019
- max: [number, number, number];
2020
- } | undefined;
2021
- }[];
2022
- surfaces: {
2023
- part?: string | undefined;
2024
- y: number;
2025
- polygon: [number, number][];
2026
- }[];
2027
- slots: {
2028
- id: string;
2029
- label?: string | undefined;
2030
- color?: string | undefined;
2031
- roughness?: number | undefined;
2032
- metalness?: number | undefined;
2033
- transparent?: boolean | undefined;
2034
- emissive?: boolean | undefined;
2035
- }[];
2036
- anchors: {
2037
- id: string;
2038
- position: [number, number, number];
2039
- normal?: [number, number, number] | undefined;
2040
- }[];
2041
- lights: {
2042
- id: string;
2043
- position: [number, number, number];
2044
- color: string;
2045
- intensity: number;
2046
- distance?: number | undefined;
2047
- spot?: {
2048
- direction: [number, number, number];
2049
- angle: number;
2050
- softness: number;
2051
- } | undefined;
2052
- shadows?: boolean | undefined;
2053
- glow?: {
2054
- size: number;
2055
- strength: number;
2056
- } | undefined;
2057
- }[];
2058
- undersides: {
2059
- part?: string | undefined;
2060
- polygon: [number, number][];
2061
- plane: [number, number, number, number];
2062
- }[];
2063
- animations: {
2064
- name: string;
2065
- duration: number;
2066
- }[];
2067
- cutters?: {
2068
- host: "ceiling" | "mounted" | "slab" | "wall";
2069
- polygon: number[][];
2070
- minY: number;
2071
- maxY: number;
2072
- }[] | undefined;
2073
- cutout: boolean;
2074
- collider: boolean;
2075
- shape?: {
2076
- tolerance: number;
2077
- bands: {
2078
- y0: number;
2079
- y1: number;
2080
- polygons: {
2081
- outer: [number, number][];
2082
- holes?: [number, number][][] | undefined;
2083
- }[];
2084
- }[];
2085
- } | undefined;
2086
- triangles: number;
2087
- coverage?: number | undefined;
2088
- uncovered?: {
2089
- min: [number, number];
2090
- max: [number, number];
2091
- }[] | undefined;
2092
- };
2093
- images?: {
2094
- artifact: string;
2095
- thumbnail: string;
2096
- floorPlan: string;
2353
+ opacity: number;
2354
+ transparent: boolean;
2355
+ side: "back" | "double" | "front";
2356
+ } | undefined;
2357
+ texture?: {
2358
+ url: string;
2359
+ repeat?: [number, number] | undefined;
2360
+ scale?: number | undefined;
2361
+ offset?: [number, number] | undefined;
2362
+ normalMap?: string | undefined;
2363
+ normalScale?: number | undefined;
2364
+ bumpMap?: string | undefined;
2365
+ bumpScale?: number | undefined;
2097
2366
  } | undefined;
2098
- inputs: string;
2099
2367
  } | undefined;
2100
- type: "slab";
2368
+ materialPreset?: string | undefined;
2369
+ topMaterial?: {
2370
+ id?: string | undefined;
2371
+ preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
2372
+ properties?: {
2373
+ color: string;
2374
+ roughness: number;
2375
+ metalness: number;
2376
+ opacity: number;
2377
+ transparent: boolean;
2378
+ side: "back" | "double" | "front";
2379
+ } | undefined;
2380
+ texture?: {
2381
+ url: string;
2382
+ repeat?: [number, number] | undefined;
2383
+ scale?: number | undefined;
2384
+ offset?: [number, number] | undefined;
2385
+ normalMap?: string | undefined;
2386
+ normalScale?: number | undefined;
2387
+ bumpMap?: string | undefined;
2388
+ bumpScale?: number | undefined;
2389
+ } | undefined;
2390
+ } | undefined;
2391
+ topMaterialPreset?: string | undefined;
2392
+ edgeMaterial?: {
2393
+ id?: string | undefined;
2394
+ preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
2395
+ properties?: {
2396
+ color: string;
2397
+ roughness: number;
2398
+ metalness: number;
2399
+ opacity: number;
2400
+ transparent: boolean;
2401
+ side: "back" | "double" | "front";
2402
+ } | undefined;
2403
+ texture?: {
2404
+ url: string;
2405
+ repeat?: [number, number] | undefined;
2406
+ scale?: number | undefined;
2407
+ offset?: [number, number] | undefined;
2408
+ normalMap?: string | undefined;
2409
+ normalScale?: number | undefined;
2410
+ bumpMap?: string | undefined;
2411
+ bumpScale?: number | undefined;
2412
+ } | undefined;
2413
+ } | undefined;
2414
+ edgeMaterialPreset?: string | undefined;
2415
+ wallMaterial?: {
2416
+ id?: string | undefined;
2417
+ preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
2418
+ properties?: {
2419
+ color: string;
2420
+ roughness: number;
2421
+ metalness: number;
2422
+ opacity: number;
2423
+ transparent: boolean;
2424
+ side: "back" | "double" | "front";
2425
+ } | undefined;
2426
+ texture?: {
2427
+ url: string;
2428
+ repeat?: [number, number] | undefined;
2429
+ scale?: number | undefined;
2430
+ offset?: [number, number] | undefined;
2431
+ normalMap?: string | undefined;
2432
+ normalScale?: number | undefined;
2433
+ bumpMap?: string | undefined;
2434
+ bumpScale?: number | undefined;
2435
+ } | undefined;
2436
+ } | undefined;
2437
+ wallMaterialPreset?: string | undefined;
2438
+ heelMaterial?: {
2439
+ id?: string | undefined;
2440
+ preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
2441
+ properties?: {
2442
+ color: string;
2443
+ roughness: number;
2444
+ metalness: number;
2445
+ opacity: number;
2446
+ transparent: boolean;
2447
+ side: "back" | "double" | "front";
2448
+ } | undefined;
2449
+ texture?: {
2450
+ url: string;
2451
+ repeat?: [number, number] | undefined;
2452
+ scale?: number | undefined;
2453
+ offset?: [number, number] | undefined;
2454
+ normalMap?: string | undefined;
2455
+ normalScale?: number | undefined;
2456
+ bumpMap?: string | undefined;
2457
+ bumpScale?: number | undefined;
2458
+ } | undefined;
2459
+ } | undefined;
2460
+ heelMaterialPreset?: string | undefined;
2461
+ position: [number, number, number];
2462
+ rotation: number;
2463
+ support: {
2464
+ kind: "level";
2465
+ } | {
2466
+ kind: "walls";
2467
+ } | {
2468
+ kind: "roof";
2469
+ roofSegmentId: `rseg_${string}`;
2470
+ localPosition: [number, number];
2471
+ curbHeight: number;
2472
+ };
2473
+ assembly?: {
2474
+ layers: {
2475
+ id: string;
2476
+ role: "air" | "covering" | "deck" | "fill" | "finish" | "furring" | "glazing" | "insulation" | "lining" | "membrane" | "sheathing" | "shell" | "structure" | "substrate" | "underlay";
2477
+ thickness: number;
2478
+ core?: true | undefined;
2479
+ spacing?: number | undefined;
2480
+ material?: string | undefined;
2481
+ slot?: string | undefined;
2482
+ returns?: boolean | undefined;
2483
+ display?: "construction" | "finished" | undefined;
2484
+ inset?: number | undefined;
2485
+ bottom?: number | undefined;
2486
+ lift?: number | undefined;
2487
+ src?: string | undefined;
2488
+ }[];
2489
+ backing?: {
2490
+ id: string;
2491
+ role: "air" | "covering" | "deck" | "fill" | "finish" | "furring" | "glazing" | "insulation" | "lining" | "membrane" | "sheathing" | "shell" | "structure" | "substrate" | "underlay";
2492
+ thickness: number;
2493
+ core?: true | undefined;
2494
+ spacing?: number | undefined;
2495
+ material?: string | undefined;
2496
+ slot?: string | undefined;
2497
+ returns?: boolean | undefined;
2498
+ display?: "construction" | "finished" | undefined;
2499
+ inset?: number | undefined;
2500
+ bottom?: number | undefined;
2501
+ lift?: number | undefined;
2502
+ src?: string | undefined;
2503
+ }[] | undefined;
2504
+ face?: "exterior" | "front" | undefined;
2505
+ presetId?: string | undefined;
2506
+ cavityInsulation?: string | undefined;
2507
+ } | undefined;
2508
+ slots?: Record<string, string> | undefined;
2509
+ children: `rseg_${string}`[];
2510
+ type: "roof";
2101
2511
  } | {
2102
2512
  object: "node";
2103
2513
  name?: string | undefined;
@@ -2436,6 +2846,7 @@ export declare function absorbWallSeparators(nodes: SceneNodes, levelId: string,
2436
2846
  } | undefined;
2437
2847
  justification?: "a" | "b" | undefined;
2438
2848
  height?: number | undefined;
2849
+ endHeightOffset?: number | undefined;
2439
2850
  curveOffset?: number | undefined;
2440
2851
  supportSlabId?: string | undefined;
2441
2852
  supportOffset?: number | undefined;
@@ -2714,6 +3125,34 @@ export declare function absorbWallSeparators(nodes: SceneNodes, levelId: string,
2714
3125
  frontSide: "exterior" | "interior" | "unknown";
2715
3126
  backSide: "exterior" | "interior" | "unknown";
2716
3127
  type: "wall";
3128
+ } | {
3129
+ object: "node";
3130
+ name?: string | undefined;
3131
+ parentId: string | null;
3132
+ visible: boolean;
3133
+ camera?: {
3134
+ position: [number, number, number];
3135
+ target: [number, number, number];
3136
+ mode: "orthographic" | "perspective";
3137
+ fov?: number | undefined;
3138
+ zoom?: number | undefined;
3139
+ } | undefined;
3140
+ metadata: Record<string, unknown>;
3141
+ provenance?: {
3142
+ refs: {
3143
+ ns?: string | undefined;
3144
+ id: string;
3145
+ role?: "absorbed" | "alias" | "derived" | "piece" | "primary" | undefined;
3146
+ }[];
3147
+ lineage?: {
3148
+ op: "attach" | "convert" | "duplicate" | "import" | "make-independent" | "merge" | "promote" | "split";
3149
+ fromIds: string[];
3150
+ } | undefined;
3151
+ } | undefined;
3152
+ id: `separator_${string}`;
3153
+ start: [number, number];
3154
+ end: [number, number];
3155
+ type: "separator";
2717
3156
  } | {
2718
3157
  object: "node";
2719
3158
  name?: string | undefined;
@@ -2915,37 +3354,6 @@ export declare function absorbWallSeparators(nodes: SceneNodes, levelId: string,
2915
3354
  slots: Record<string, string>;
2916
3355
  slotNames: Record<string, string>;
2917
3356
  type: "block";
2918
- } | {
2919
- object: "node";
2920
- name?: string | undefined;
2921
- parentId: string | null;
2922
- visible: boolean;
2923
- camera?: {
2924
- position: [number, number, number];
2925
- target: [number, number, number];
2926
- mode: "orthographic" | "perspective";
2927
- fov?: number | undefined;
2928
- zoom?: number | undefined;
2929
- } | undefined;
2930
- metadata: Record<string, unknown>;
2931
- provenance?: {
2932
- refs: {
2933
- ns?: string | undefined;
2934
- id: string;
2935
- role?: "absorbed" | "alias" | "derived" | "piece" | "primary" | undefined;
2936
- }[];
2937
- lineage?: {
2938
- op: "attach" | "convert" | "duplicate" | "import" | "make-independent" | "merge" | "promote" | "split";
2939
- fromIds: string[];
2940
- } | undefined;
2941
- } | undefined;
2942
- id: `structural-grid_${string}`;
2943
- start: [number, number];
2944
- end: [number, number];
2945
- label: string;
2946
- showStartBubble: boolean;
2947
- showEndBubble: boolean;
2948
- type: "structural-grid";
2949
3357
  } | {
2950
3358
  object: "node";
2951
3359
  name?: string | undefined;
@@ -3469,21 +3877,98 @@ export declare function absorbWallSeparators(nodes: SceneNodes, levelId: string,
3469
3877
  thickness: number;
3470
3878
  name?: string | undefined;
3471
3879
  } | undefined;
3472
- insulation?: {
3473
- kind: "batt" | "blown" | "rigid";
3474
- thickness: number;
3475
- name?: string | undefined;
3880
+ insulation?: {
3881
+ kind: "batt" | "blown" | "rigid";
3882
+ thickness: number;
3883
+ name?: string | undefined;
3884
+ } | undefined;
3885
+ } | undefined;
3886
+ regions?: {
3887
+ id: string;
3888
+ polygon: [number, number][];
3889
+ finish: string | Record<string, unknown>;
3890
+ }[] | undefined;
3891
+ boundary?: "auto" | undefined;
3892
+ zoneId?: string | undefined;
3893
+ autoFromWalls: boolean;
3894
+ type: "ceiling";
3895
+ } | {
3896
+ object: "node";
3897
+ name?: string | undefined;
3898
+ parentId: string | null;
3899
+ visible: boolean;
3900
+ camera?: {
3901
+ position: [number, number, number];
3902
+ target: [number, number, number];
3903
+ mode: "orthographic" | "perspective";
3904
+ fov?: number | undefined;
3905
+ zoom?: number | undefined;
3906
+ } | undefined;
3907
+ metadata: Record<string, unknown>;
3908
+ provenance?: {
3909
+ refs: {
3910
+ ns?: string | undefined;
3911
+ id: string;
3912
+ role?: "absorbed" | "alias" | "derived" | "piece" | "primary" | undefined;
3913
+ }[];
3914
+ lineage?: {
3915
+ op: "attach" | "convert" | "duplicate" | "import" | "make-independent" | "merge" | "promote" | "split";
3916
+ fromIds: string[];
3917
+ } | undefined;
3918
+ } | undefined;
3919
+ id: `sseg_${string}`;
3920
+ material?: {
3921
+ id?: string | undefined;
3922
+ preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
3923
+ properties?: {
3924
+ color: string;
3925
+ roughness: number;
3926
+ metalness: number;
3927
+ opacity: number;
3928
+ transparent: boolean;
3929
+ side: "back" | "double" | "front";
3930
+ } | undefined;
3931
+ texture?: {
3932
+ url: string;
3933
+ repeat?: [number, number] | undefined;
3934
+ scale?: number | undefined;
3935
+ offset?: [number, number] | undefined;
3936
+ normalMap?: string | undefined;
3937
+ normalScale?: number | undefined;
3938
+ bumpMap?: string | undefined;
3939
+ bumpScale?: number | undefined;
3476
3940
  } | undefined;
3477
3941
  } | undefined;
3478
- regions?: {
3479
- id: string;
3480
- polygon: [number, number][];
3481
- finish: string | Record<string, unknown>;
3482
- }[] | undefined;
3483
- boundary?: "auto" | undefined;
3484
- zoneId?: string | undefined;
3485
- autoFromWalls: boolean;
3486
- type: "ceiling";
3942
+ materialPreset?: string | undefined;
3943
+ slots?: Record<string, string> | undefined;
3944
+ position: [number, number, number];
3945
+ rotation: number;
3946
+ segmentType: "landing" | "stair";
3947
+ width: number;
3948
+ length: number;
3949
+ height: number;
3950
+ stepCount: number;
3951
+ attachmentSide: "front" | "left" | "right";
3952
+ fillToFloor: boolean;
3953
+ construction?: {
3954
+ mode: "center-stringer" | "open" | "side-stringers" | "solid" | "waist";
3955
+ waistThickness: number;
3956
+ treadThickness: number;
3957
+ riserThickness: number;
3958
+ nosing: number;
3959
+ finishThickness: number;
3960
+ closedRisers: boolean;
3961
+ stringerWidth: number;
3962
+ stringerDepth: number;
3963
+ } | undefined;
3964
+ winder?: {
3965
+ turn: "left" | "right";
3966
+ innerGap: number;
3967
+ walkingLineOffset: number;
3968
+ division: "equal-angle" | "equal-going";
3969
+ } | undefined;
3970
+ thickness: number;
3971
+ type: "stair-segment";
3487
3972
  } | {
3488
3973
  object: "node";
3489
3974
  name?: string | undefined;
@@ -3677,198 +4162,7 @@ export declare function absorbWallSeparators(nodes: SceneNodes, levelId: string,
3677
4162
  railingTopReach?: number | undefined;
3678
4163
  railingPostThrough?: boolean | undefined;
3679
4164
  children: `sseg_${string}`[];
3680
- type: "stair";
3681
- } | {
3682
- object: "node";
3683
- name?: string | undefined;
3684
- parentId: string | null;
3685
- visible: boolean;
3686
- camera?: {
3687
- position: [number, number, number];
3688
- target: [number, number, number];
3689
- mode: "orthographic" | "perspective";
3690
- fov?: number | undefined;
3691
- zoom?: number | undefined;
3692
- } | undefined;
3693
- metadata: Record<string, unknown>;
3694
- provenance?: {
3695
- refs: {
3696
- ns?: string | undefined;
3697
- id: string;
3698
- role?: "absorbed" | "alias" | "derived" | "piece" | "primary" | undefined;
3699
- }[];
3700
- lineage?: {
3701
- op: "attach" | "convert" | "duplicate" | "import" | "make-independent" | "merge" | "promote" | "split";
3702
- fromIds: string[];
3703
- } | undefined;
3704
- } | undefined;
3705
- id: `scan_${string}`;
3706
- url: string | null;
3707
- captureSession: {
3708
- sessionId: string;
3709
- schemaVersion?: number | undefined;
3710
- revisionId?: string | undefined;
3711
- manifestUrl?: string | undefined;
3712
- } | null;
3713
- layers: Record<string, boolean>;
3714
- position: [number, number, number];
3715
- rotation: [number, number, number];
3716
- scale: number;
3717
- opacity: number;
3718
- type: "scan";
3719
- } | {
3720
- object: "node";
3721
- name?: string | undefined;
3722
- parentId: string | null;
3723
- visible: boolean;
3724
- camera?: {
3725
- position: [number, number, number];
3726
- target: [number, number, number];
3727
- mode: "orthographic" | "perspective";
3728
- fov?: number | undefined;
3729
- zoom?: number | undefined;
3730
- } | undefined;
3731
- metadata: Record<string, unknown>;
3732
- provenance?: {
3733
- refs: {
3734
- ns?: string | undefined;
3735
- id: string;
3736
- role?: "absorbed" | "alias" | "derived" | "piece" | "primary" | undefined;
3737
- }[];
3738
- lineage?: {
3739
- op: "attach" | "convert" | "duplicate" | "import" | "make-independent" | "merge" | "promote" | "split";
3740
- fromIds: string[];
3741
- } | undefined;
3742
- } | undefined;
3743
- id: `guide_${string}`;
3744
- url: string;
3745
- position: [number, number, number];
3746
- rotation: [number, number, number];
3747
- scale: number;
3748
- opacity: number;
3749
- scaleReference: {
3750
- start: [number, number];
3751
- end: [number, number];
3752
- realLengthMeters: number;
3753
- measuredLengthUnits: number;
3754
- metersPerUnit: number;
3755
- displayLength?: number | undefined;
3756
- displayUnit?: "centimeters" | "feet" | "inches" | "meters" | undefined;
3757
- label: string;
3758
- } | null;
3759
- type: "guide";
3760
- } | {
3761
- object: "node";
3762
- name?: string | undefined;
3763
- parentId: string | null;
3764
- visible: boolean;
3765
- camera?: {
3766
- position: [number, number, number];
3767
- target: [number, number, number];
3768
- mode: "orthographic" | "perspective";
3769
- fov?: number | undefined;
3770
- zoom?: number | undefined;
3771
- } | undefined;
3772
- metadata: Record<string, unknown>;
3773
- provenance?: {
3774
- refs: {
3775
- ns?: string | undefined;
3776
- id: string;
3777
- role?: "absorbed" | "alias" | "derived" | "piece" | "primary" | undefined;
3778
- }[];
3779
- lineage?: {
3780
- op: "attach" | "convert" | "duplicate" | "import" | "make-independent" | "merge" | "promote" | "split";
3781
- fromIds: string[];
3782
- } | undefined;
3783
- } | undefined;
3784
- id: `shelf_${string}`;
3785
- children: string[];
3786
- position: [number, number, number];
3787
- rotation: [number, number, number];
3788
- supportSlabId?: string | undefined;
3789
- width: number;
3790
- depth: number;
3791
- thickness: number;
3792
- height: number;
3793
- style: "bookshelf" | "cubby" | "open-rack" | "wall-shelf";
3794
- rows: number;
3795
- columns: number;
3796
- withBack: boolean;
3797
- withSides: boolean;
3798
- withBottom: boolean;
3799
- bracketStyle: "hidden" | "industrial" | "minimal";
3800
- material?: {
3801
- id?: string | undefined;
3802
- preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
3803
- properties?: {
3804
- color: string;
3805
- roughness: number;
3806
- metalness: number;
3807
- opacity: number;
3808
- transparent: boolean;
3809
- side: "back" | "double" | "front";
3810
- } | undefined;
3811
- texture?: {
3812
- url: string;
3813
- repeat?: [number, number] | undefined;
3814
- scale?: number | undefined;
3815
- offset?: [number, number] | undefined;
3816
- normalMap?: string | undefined;
3817
- normalScale?: number | undefined;
3818
- bumpMap?: string | undefined;
3819
- bumpScale?: number | undefined;
3820
- } | undefined;
3821
- } | undefined;
3822
- materialPreset?: string | undefined;
3823
- slots?: Record<string, string> | undefined;
3824
- type: "shelf";
3825
- } | {
3826
- object: "node";
3827
- name?: string | undefined;
3828
- parentId: string | null;
3829
- visible: boolean;
3830
- camera?: {
3831
- position: [number, number, number];
3832
- target: [number, number, number];
3833
- mode: "orthographic" | "perspective";
3834
- fov?: number | undefined;
3835
- zoom?: number | undefined;
3836
- } | undefined;
3837
- metadata: Record<string, unknown>;
3838
- provenance?: {
3839
- refs: {
3840
- ns?: string | undefined;
3841
- id: string;
3842
- role?: "absorbed" | "alias" | "derived" | "piece" | "primary" | undefined;
3843
- }[];
3844
- lineage?: {
3845
- op: "attach" | "convert" | "duplicate" | "import" | "make-independent" | "merge" | "promote" | "split";
3846
- fromIds: string[];
3847
- } | undefined;
3848
- } | undefined;
3849
- id: `duct-fitting_${string}`;
3850
- position: [number, number, number];
3851
- rotation: [number, number, number];
3852
- fittingType: "access-panel" | "coupling" | "cross" | "damper" | "elbow" | "end-cap" | "reducer" | "tee" | "transition";
3853
- shape: "oval" | "rect" | "round";
3854
- inletShape?: "oval" | "rect" | "round" | undefined;
3855
- outletShape?: "oval" | "rect" | "round" | undefined;
3856
- width: number;
3857
- height: number;
3858
- shape2: "oval" | "rect" | "round";
3859
- width2: number;
3860
- height2: number;
3861
- angle: number;
3862
- branchAngle: number;
3863
- diameter: number;
3864
- diameter2: number;
3865
- ductMaterial: "duct-board" | "flex" | "sheet-metal";
3866
- system: "return" | "supply";
3867
- damperAngle: number;
3868
- panelWidth: number;
3869
- panelHeight: number;
3870
- slots?: Record<string, string> | undefined;
3871
- type: "duct-fitting";
4165
+ type: "stair";
3872
4166
  } | {
3873
4167
  object: "node";
3874
4168
  name?: string | undefined;
@@ -3893,19 +4187,23 @@ export declare function absorbWallSeparators(nodes: SceneNodes, levelId: string,
3893
4187
  fromIds: string[];
3894
4188
  } | undefined;
3895
4189
  } | undefined;
3896
- id: `duct-terminal_${string}`;
4190
+ id: `guide_${string}`;
4191
+ url: string;
3897
4192
  position: [number, number, number];
3898
- rotation: number;
3899
- supportSlabId?: string | undefined;
3900
- terminalType: "diffuser" | "return-grille" | "supply-register";
3901
- mount: "ceiling" | "floor" | "wall";
3902
- width: number;
3903
- depth: number;
3904
- collarShape: "oval" | "rect" | "round";
3905
- collarDiameter: number;
3906
- collarWidth: number;
3907
- collarHeight: number;
3908
- type: "duct-terminal";
4193
+ rotation: [number, number, number];
4194
+ scale: number;
4195
+ opacity: number;
4196
+ scaleReference: {
4197
+ start: [number, number];
4198
+ end: [number, number];
4199
+ realLengthMeters: number;
4200
+ measuredLengthUnits: number;
4201
+ metersPerUnit: number;
4202
+ displayLength?: number | undefined;
4203
+ displayUnit?: "centimeters" | "feet" | "inches" | "meters" | undefined;
4204
+ label: string;
4205
+ } | null;
4206
+ type: "guide";
3909
4207
  } | {
3910
4208
  object: "node";
3911
4209
  name?: string | undefined;
@@ -3930,23 +4228,11 @@ export declare function absorbWallSeparators(nodes: SceneNodes, levelId: string,
3930
4228
  fromIds: string[];
3931
4229
  } | undefined;
3932
4230
  } | undefined;
3933
- id: `hvac-equipment_${string}`;
4231
+ id: `spawn_${string}`;
3934
4232
  position: [number, number, number];
3935
4233
  rotation: number;
3936
4234
  supportSlabId?: string | undefined;
3937
- equipmentType: "air-handler" | "condenser" | "furnace";
3938
- width: number;
3939
- depth: number;
3940
- height: number;
3941
- supplyShape: "oval" | "rect" | "round";
3942
- returnShape: "oval" | "rect" | "round";
3943
- supplyDiameter: number;
3944
- returnDiameter: number;
3945
- supplyWidth: number;
3946
- supplyHeight: number;
3947
- returnWidth: number;
3948
- returnHeight: number;
3949
- type: "hvac-equipment";
4235
+ type: "spawn";
3950
4236
  } | {
3951
4237
  object: "node";
3952
4238
  name?: string | undefined;
@@ -3971,56 +4257,47 @@ export declare function absorbWallSeparators(nodes: SceneNodes, levelId: string,
3971
4257
  fromIds: string[];
3972
4258
  } | undefined;
3973
4259
  } | undefined;
3974
- id: `liquid-line_${string}`;
3975
- path: [number, number, number][];
3976
- diameter: number;
3977
- type: "liquid-line";
3978
- } | {
3979
- object: "node";
3980
- name?: string | undefined;
3981
- parentId: string | null;
3982
- visible: boolean;
3983
- camera?: {
3984
- position: [number, number, number];
3985
- target: [number, number, number];
3986
- mode: "orthographic" | "perspective";
3987
- fov?: number | undefined;
3988
- zoom?: number | undefined;
3989
- } | undefined;
3990
- metadata: Record<string, unknown>;
3991
- provenance?: {
3992
- refs: {
3993
- ns?: string | undefined;
3994
- id: string;
3995
- role?: "absorbed" | "alias" | "derived" | "piece" | "primary" | undefined;
3996
- }[];
3997
- lineage?: {
3998
- op: "attach" | "convert" | "duplicate" | "import" | "make-independent" | "merge" | "promote" | "split";
3999
- fromIds: string[];
4260
+ id: `shelf_${string}`;
4261
+ children: string[];
4262
+ position: [number, number, number];
4263
+ rotation: [number, number, number];
4264
+ supportSlabId?: string | undefined;
4265
+ width: number;
4266
+ depth: number;
4267
+ thickness: number;
4268
+ height: number;
4269
+ style: "bookshelf" | "cubby" | "open-rack" | "wall-shelf";
4270
+ rows: number;
4271
+ columns: number;
4272
+ withBack: boolean;
4273
+ withSides: boolean;
4274
+ withBottom: boolean;
4275
+ bracketStyle: "hidden" | "industrial" | "minimal";
4276
+ material?: {
4277
+ id?: string | undefined;
4278
+ preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
4279
+ properties?: {
4280
+ color: string;
4281
+ roughness: number;
4282
+ metalness: number;
4283
+ opacity: number;
4284
+ transparent: boolean;
4285
+ side: "back" | "double" | "front";
4286
+ } | undefined;
4287
+ texture?: {
4288
+ url: string;
4289
+ repeat?: [number, number] | undefined;
4290
+ scale?: number | undefined;
4291
+ offset?: [number, number] | undefined;
4292
+ normalMap?: string | undefined;
4293
+ normalScale?: number | undefined;
4294
+ bumpMap?: string | undefined;
4295
+ bumpScale?: number | undefined;
4000
4296
  } | undefined;
4001
4297
  } | undefined;
4002
- id: `pipe-segment_${string}`;
4003
- path: [number, number, number][];
4004
- autoHangers?: boolean | undefined;
4005
- hangerOverrides?: Record<string, {
4006
- fraction?: number | undefined;
4007
- skipped?: boolean | undefined;
4008
- hostId?: string | undefined;
4009
- }> | undefined;
4010
- hangerStyle?: "double" | "single" | undefined;
4011
- hangerSpacing?: number | undefined;
4012
- hangerMaxReach?: number | undefined;
4013
- wallAttachment?: {
4014
- wallId: `wall_${string}`;
4015
- side: "back" | "front";
4016
- startUV: [number, number];
4017
- endUV: [number, number];
4018
- offset: number;
4019
- } | undefined;
4020
- diameter: number;
4021
- pipeMaterial: "abs" | "cast-iron" | "pvc";
4022
- system: "vent" | "waste";
4023
- type: "pipe-segment";
4298
+ materialPreset?: string | undefined;
4299
+ slots?: Record<string, string> | undefined;
4300
+ type: "shelf";
4024
4301
  } | {
4025
4302
  object: "node";
4026
4303
  name?: string | undefined;
@@ -4045,121 +4322,32 @@ export declare function absorbWallSeparators(nodes: SceneNodes, levelId: string,
4045
4322
  fromIds: string[];
4046
4323
  } | undefined;
4047
4324
  } | undefined;
4048
- id: `pipe-fitting_${string}`;
4325
+ id: `duct-fitting_${string}`;
4049
4326
  position: [number, number, number];
4050
4327
  rotation: [number, number, number];
4051
- fittingType: "cleanout" | "coupling" | "cross" | "elbow" | "end-cap" | "reducer" | "sanitary-tee" | "wye";
4328
+ fittingType: "access-panel" | "coupling" | "cross" | "damper" | "elbow" | "end-cap" | "reducer" | "tee" | "transition";
4329
+ shape: "oval" | "rect" | "round";
4330
+ inletShape?: "oval" | "rect" | "round" | undefined;
4331
+ outletShape?: "oval" | "rect" | "round" | undefined;
4332
+ width: number;
4333
+ height: number;
4334
+ shape2: "oval" | "rect" | "round";
4335
+ width2: number;
4336
+ height2: number;
4052
4337
  angle: number;
4338
+ branchAngle: number;
4053
4339
  diameter: number;
4054
4340
  diameter2: number;
4055
- cleanoutStyle: "end" | "inline";
4056
- pipeMaterial: "abs" | "cast-iron" | "pvc";
4057
- system: "vent" | "waste";
4058
- type: "pipe-fitting";
4059
- } | {
4060
- object: "node";
4061
- name?: string | undefined;
4062
- parentId: string | null;
4063
- visible: boolean;
4064
- camera?: {
4065
- position: [number, number, number];
4066
- target: [number, number, number];
4067
- mode: "orthographic" | "perspective";
4068
- fov?: number | undefined;
4069
- zoom?: number | undefined;
4070
- } | undefined;
4071
- metadata: Record<string, unknown>;
4072
- provenance?: {
4073
- refs: {
4074
- ns?: string | undefined;
4075
- id: string;
4076
- role?: "absorbed" | "alias" | "derived" | "piece" | "primary" | undefined;
4077
- }[];
4078
- lineage?: {
4079
- op: "attach" | "convert" | "duplicate" | "import" | "make-independent" | "merge" | "promote" | "split";
4080
- fromIds: string[];
4081
- } | undefined;
4082
- } | undefined;
4083
- id: `level_${string}`;
4084
- 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}`)[];
4085
- level: number;
4086
- baseElevation: number;
4087
- height?: number | undefined;
4088
- type: "level";
4089
- } | {
4090
- object: "node";
4091
- name?: string | undefined;
4092
- parentId: string | null;
4093
- visible: boolean;
4094
- camera?: {
4095
- position: [number, number, number];
4096
- target: [number, number, number];
4097
- mode: "orthographic" | "perspective";
4098
- fov?: number | undefined;
4099
- zoom?: number | undefined;
4100
- } | undefined;
4101
- metadata: Record<string, unknown>;
4102
- provenance?: {
4103
- refs: {
4104
- ns?: string | undefined;
4105
- id: string;
4106
- role?: "absorbed" | "alias" | "derived" | "piece" | "primary" | undefined;
4107
- }[];
4108
- lineage?: {
4109
- op: "attach" | "convert" | "duplicate" | "import" | "make-independent" | "merge" | "promote" | "split";
4110
- fromIds: string[];
4111
- } | undefined;
4112
- } | undefined;
4113
- id: `elevator_${string}`;
4114
- material?: {
4115
- id?: string | undefined;
4116
- preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
4117
- properties?: {
4118
- color: string;
4119
- roughness: number;
4120
- metalness: number;
4121
- opacity: number;
4122
- transparent: boolean;
4123
- side: "back" | "double" | "front";
4124
- } | undefined;
4125
- texture?: {
4126
- url: string;
4127
- repeat?: [number, number] | undefined;
4128
- scale?: number | undefined;
4129
- offset?: [number, number] | undefined;
4130
- normalMap?: string | undefined;
4131
- normalScale?: number | undefined;
4132
- bumpMap?: string | undefined;
4133
- bumpScale?: number | undefined;
4134
- } | undefined;
4135
- } | undefined;
4136
- materialPreset?: string | undefined;
4341
+ ductMaterial: "duct-board" | "flex" | "sheet-metal";
4342
+ system: "return" | "supply";
4343
+ damperAngle: number;
4344
+ panelWidth: number;
4345
+ panelHeight: number;
4137
4346
  slots?: Record<string, string> | undefined;
4138
- position: [number, number, number];
4139
- rotation: number;
4140
- width: number;
4141
- depth: number;
4142
- shaftWidth?: number | undefined;
4143
- shaftDepth?: number | undefined;
4144
- shaftWallThickness: number;
4145
- shaftStyle: "glass" | "solid";
4146
- cabHeight: number;
4147
- doorWidth: number;
4148
- doorHeight: number;
4149
- doorStyle: "center-opening" | "single-left" | "single-right";
4150
- doorPanelStyle: "glass-frame" | "segmented-panel" | "solid-panel";
4151
- fromLevelId: string | null;
4152
- toLevelId: string | null;
4153
- servedLevelIds?: string[] | undefined;
4154
- disabledLevelIds: string[];
4155
- serviceOnlyLevelIds: string[];
4156
- defaultLevelId: string | null;
4157
- speed: number;
4158
- doorDurationMs: number;
4159
- dwellMs: number;
4160
- type: "elevator";
4347
+ type: "duct-fitting";
4161
4348
  } | {
4162
4349
  object: "node";
4350
+ name?: string | undefined;
4163
4351
  parentId: string | null;
4164
4352
  visible: boolean;
4165
4353
  camera?: {
@@ -4169,6 +4357,7 @@ export declare function absorbWallSeparators(nodes: SceneNodes, levelId: string,
4169
4357
  fov?: number | undefined;
4170
4358
  zoom?: number | undefined;
4171
4359
  } | undefined;
4360
+ metadata: Record<string, unknown>;
4172
4361
  provenance?: {
4173
4362
  refs: {
4174
4363
  ns?: string | undefined;
@@ -4180,13 +4369,19 @@ export declare function absorbWallSeparators(nodes: SceneNodes, levelId: string,
4180
4369
  fromIds: string[];
4181
4370
  } | undefined;
4182
4371
  } | undefined;
4183
- id: `unit_${string}`;
4184
- name: string;
4185
- kind: "apartment" | "commercial" | "common" | "hotel-room";
4186
- members: `zone_${string}`[];
4187
- color: string;
4188
- metadata: Record<string, unknown>;
4189
- type: "unit";
4372
+ id: `duct-terminal_${string}`;
4373
+ position: [number, number, number];
4374
+ rotation: number;
4375
+ supportSlabId?: string | undefined;
4376
+ terminalType: "diffuser" | "return-grille" | "supply-register";
4377
+ mount: "ceiling" | "floor" | "wall";
4378
+ width: number;
4379
+ depth: number;
4380
+ collarShape: "oval" | "rect" | "round";
4381
+ collarDiameter: number;
4382
+ collarWidth: number;
4383
+ collarHeight: number;
4384
+ type: "duct-terminal";
4190
4385
  } | {
4191
4386
  object: "node";
4192
4387
  name?: string | undefined;
@@ -4211,12 +4406,23 @@ export declare function absorbWallSeparators(nodes: SceneNodes, levelId: string,
4211
4406
  fromIds: string[];
4212
4407
  } | undefined;
4213
4408
  } | undefined;
4214
- id: `building_${string}`;
4215
- children: (`elevator_${string}` | `level_${string}` | `unit_${string}`)[];
4409
+ id: `hvac-equipment_${string}`;
4216
4410
  position: [number, number, number];
4217
- rotation: [number, number, number];
4218
- groundLevelId?: `level_${string}` | undefined;
4219
- type: "building";
4411
+ rotation: number;
4412
+ supportSlabId?: string | undefined;
4413
+ equipmentType: "air-handler" | "condenser" | "furnace";
4414
+ width: number;
4415
+ depth: number;
4416
+ height: number;
4417
+ supplyShape: "oval" | "rect" | "round";
4418
+ returnShape: "oval" | "rect" | "round";
4419
+ supplyDiameter: number;
4420
+ returnDiameter: number;
4421
+ supplyWidth: number;
4422
+ supplyHeight: number;
4423
+ returnWidth: number;
4424
+ returnHeight: number;
4425
+ type: "hvac-equipment";
4220
4426
  } | {
4221
4427
  object: "node";
4222
4428
  name?: string | undefined;
@@ -4241,126 +4447,10 @@ export declare function absorbWallSeparators(nodes: SceneNodes, levelId: string,
4241
4447
  fromIds: string[];
4242
4448
  } | undefined;
4243
4449
  } | undefined;
4244
- id: `dormer_${string}`;
4245
- material?: {
4246
- id?: string | undefined;
4247
- preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
4248
- properties?: {
4249
- color: string;
4250
- roughness: number;
4251
- metalness: number;
4252
- opacity: number;
4253
- transparent: boolean;
4254
- side: "back" | "double" | "front";
4255
- } | undefined;
4256
- texture?: {
4257
- url: string;
4258
- repeat?: [number, number] | undefined;
4259
- scale?: number | undefined;
4260
- offset?: [number, number] | undefined;
4261
- normalMap?: string | undefined;
4262
- normalScale?: number | undefined;
4263
- bumpMap?: string | undefined;
4264
- bumpScale?: number | undefined;
4265
- } | undefined;
4266
- } | undefined;
4267
- materialPreset?: string | undefined;
4268
- topMaterial?: {
4269
- id?: string | undefined;
4270
- preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
4271
- properties?: {
4272
- color: string;
4273
- roughness: number;
4274
- metalness: number;
4275
- opacity: number;
4276
- transparent: boolean;
4277
- side: "back" | "double" | "front";
4278
- } | undefined;
4279
- texture?: {
4280
- url: string;
4281
- repeat?: [number, number] | undefined;
4282
- scale?: number | undefined;
4283
- offset?: [number, number] | undefined;
4284
- normalMap?: string | undefined;
4285
- normalScale?: number | undefined;
4286
- bumpMap?: string | undefined;
4287
- bumpScale?: number | undefined;
4288
- } | undefined;
4289
- } | undefined;
4290
- topMaterialPreset?: string | undefined;
4291
- sideMaterial?: {
4292
- id?: string | undefined;
4293
- preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
4294
- properties?: {
4295
- color: string;
4296
- roughness: number;
4297
- metalness: number;
4298
- opacity: number;
4299
- transparent: boolean;
4300
- side: "back" | "double" | "front";
4301
- } | undefined;
4302
- texture?: {
4303
- url: string;
4304
- repeat?: [number, number] | undefined;
4305
- scale?: number | undefined;
4306
- offset?: [number, number] | undefined;
4307
- normalMap?: string | undefined;
4308
- normalScale?: number | undefined;
4309
- bumpMap?: string | undefined;
4310
- bumpScale?: number | undefined;
4311
- } | undefined;
4312
- } | undefined;
4313
- sideMaterialPreset?: string | undefined;
4314
- wallMaterial?: {
4315
- id?: string | undefined;
4316
- preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
4317
- properties?: {
4318
- color: string;
4319
- roughness: number;
4320
- metalness: number;
4321
- opacity: number;
4322
- transparent: boolean;
4323
- side: "back" | "double" | "front";
4324
- } | undefined;
4325
- texture?: {
4326
- url: string;
4327
- repeat?: [number, number] | undefined;
4328
- scale?: number | undefined;
4329
- offset?: [number, number] | undefined;
4330
- normalMap?: string | undefined;
4331
- normalScale?: number | undefined;
4332
- bumpMap?: string | undefined;
4333
- bumpScale?: number | undefined;
4334
- } | undefined;
4335
- } | undefined;
4336
- wallMaterialPreset?: string | undefined;
4337
- roofSegmentId?: string | undefined;
4338
- position: [number, number, number];
4339
- rotation: number;
4340
- width: number;
4341
- depth: number;
4342
- height: number;
4343
- roofType: "barrel" | "conical" | "dutch" | "flat" | "gable" | "gambrel" | "hip" | "mansard" | "shed";
4344
- roofHeight: number;
4345
- shedHighSide: "back" | "front";
4346
- wallSkirtHeight: number;
4347
- windowWidth: number;
4348
- windowHeight: number;
4349
- windowOffsetX: number;
4350
- windowOffsetY: number;
4351
- windowFrameThickness: number;
4352
- windowFrameDepth: number;
4353
- windowColumns: number;
4354
- windowRows: number;
4355
- windowDividerThickness: number;
4356
- windowShape: "arch" | "rectangle" | "rounded";
4357
- windowArchHeight: number;
4358
- windowCornerRadii: [number, number, number, number];
4359
- windowSill: boolean;
4360
- windowSillDepth: number;
4361
- windowSillThickness: number;
4362
- children: `window_${string}`[];
4363
- type: "dormer";
4450
+ id: `liquid-line_${string}`;
4451
+ path: [number, number, number][];
4452
+ diameter: number;
4453
+ type: "liquid-line";
4364
4454
  } | {
4365
4455
  object: "node";
4366
4456
  name?: string | undefined;
@@ -4385,77 +4475,28 @@ export declare function absorbWallSeparators(nodes: SceneNodes, levelId: string,
4385
4475
  fromIds: string[];
4386
4476
  } | undefined;
4387
4477
  } | undefined;
4388
- id: `skylight_${string}`;
4389
- material?: {
4390
- id?: string | undefined;
4391
- preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
4392
- properties?: {
4393
- color: string;
4394
- roughness: number;
4395
- metalness: number;
4396
- opacity: number;
4397
- transparent: boolean;
4398
- side: "back" | "double" | "front";
4399
- } | undefined;
4400
- texture?: {
4401
- url: string;
4402
- repeat?: [number, number] | undefined;
4403
- scale?: number | undefined;
4404
- offset?: [number, number] | undefined;
4405
- normalMap?: string | undefined;
4406
- normalScale?: number | undefined;
4407
- bumpMap?: string | undefined;
4408
- bumpScale?: number | undefined;
4409
- } | undefined;
4410
- } | undefined;
4411
- materialPreset?: string | undefined;
4412
- glassMaterial?: {
4413
- id?: string | undefined;
4414
- preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
4415
- properties?: {
4416
- color: string;
4417
- roughness: number;
4418
- metalness: number;
4419
- opacity: number;
4420
- transparent: boolean;
4421
- side: "back" | "double" | "front";
4422
- } | undefined;
4423
- texture?: {
4424
- url: string;
4425
- repeat?: [number, number] | undefined;
4426
- scale?: number | undefined;
4427
- offset?: [number, number] | undefined;
4428
- normalMap?: string | undefined;
4429
- normalScale?: number | undefined;
4430
- bumpMap?: string | undefined;
4431
- bumpScale?: number | undefined;
4432
- } | undefined;
4478
+ id: `pipe-segment_${string}`;
4479
+ path: [number, number, number][];
4480
+ autoHangers?: boolean | undefined;
4481
+ hangerOverrides?: Record<string, {
4482
+ fraction?: number | undefined;
4483
+ skipped?: boolean | undefined;
4484
+ hostId?: string | undefined;
4485
+ }> | undefined;
4486
+ hangerStyle?: "double" | "single" | undefined;
4487
+ hangerSpacing?: number | undefined;
4488
+ hangerMaxReach?: number | undefined;
4489
+ wallAttachment?: {
4490
+ wallId: `wall_${string}`;
4491
+ side: "back" | "front";
4492
+ startUV: [number, number];
4493
+ endUV: [number, number];
4494
+ offset: number;
4433
4495
  } | undefined;
4434
- glassMaterialPreset?: string | undefined;
4435
- roofSegmentId?: string | undefined;
4436
- position: [number, number, number];
4437
- rotation: number;
4438
- width: number;
4439
- height: number;
4440
- frameThickness: number;
4441
- frameDepth: number;
4442
- skylightType: "flat" | "lantern" | "opening" | "sliding" | "walk-on";
4443
- glassThickness: number;
4444
- lanternHeight: number;
4445
- lanternTopScale: number;
4446
- openingAngle: number;
4447
- openingSide: "bottom" | "left" | "right" | "top";
4448
- operationState: number;
4449
- motorHousing: boolean;
4450
- slideFraction: number;
4451
- slideDirection: "x" | "z";
4452
- trackWidth: number;
4453
- motorHousingSize: number;
4454
- curb: boolean;
4455
- curbHeight: number;
4456
- cutoutOffset: number;
4457
- surfaceNormal?: [number, number, number] | undefined;
4458
- type: "skylight";
4496
+ diameter: number;
4497
+ pipeMaterial: "abs" | "cast-iron" | "pvc";
4498
+ system: "vent" | "waste";
4499
+ type: "pipe-segment";
4459
4500
  } | {
4460
4501
  object: "node";
4461
4502
  name?: string | undefined;
@@ -4480,198 +4521,47 @@ export declare function absorbWallSeparators(nodes: SceneNodes, levelId: string,
4480
4521
  fromIds: string[];
4481
4522
  } | undefined;
4482
4523
  } | undefined;
4483
- id: `site_${string}`;
4484
- polygon: {
4485
- type: "polygon";
4486
- points: [number, number][];
4487
- };
4488
- terrain?: {
4489
- type: "heightfield";
4490
- origin: [number, number];
4491
- spacing: number;
4492
- cols: number;
4493
- rows: number;
4494
- step: number;
4495
- heights: string;
4496
- } | undefined;
4497
- showGround?: boolean | undefined;
4498
- presentation?: {
4499
- theme?: string | undefined;
4500
- exposure?: number | undefined;
4501
- shading?: "rendered" | "solid" | undefined;
4502
- edges?: "off" | "soft" | "strong" | undefined;
4503
- shadows?: boolean | undefined;
4504
- lighting?: {
4505
- background?: string | undefined;
4506
- backgroundSky?: string | null | undefined;
4507
- ground?: string | undefined;
4508
- ambient?: {
4509
- color: string;
4510
- intensity: number;
4511
- } | undefined;
4512
- hemi?: {
4513
- sky: string;
4514
- ground: string;
4515
- intensity: number;
4516
- } | undefined;
4517
- lights?: {
4518
- color: string;
4519
- intensity: number;
4520
- position: [number, number, number];
4521
- target?: [number, number, number] | undefined;
4522
- castShadow?: boolean | undefined;
4523
- shadow?: {
4524
- intensity?: number | undefined;
4525
- bias?: number | undefined;
4526
- normalBias?: number | undefined;
4527
- radius?: number | undefined;
4528
- mapSize?: 512 | 1024 | 2048 | 4096 | undefined;
4529
- camera?: {
4530
- left: number;
4531
- right: number;
4532
- top: number;
4533
- bottom: number;
4534
- near: number;
4535
- far: number;
4536
- } | undefined;
4537
- } | undefined;
4538
- }[] | undefined;
4539
- environment?: {
4540
- source: "gradient" | "none" | "room";
4541
- intensity: number;
4542
- } | undefined;
4543
- } | undefined;
4544
- postprocessing?: {
4545
- ambientOcclusion?: boolean | undefined;
4546
- colorGrading?: boolean | undefined;
4547
- } | undefined;
4548
- display?: {
4549
- mode?: "construction" | "finished" | "systems" | undefined;
4550
- families?: Partial<Record<"device" | "exposed-structure" | "fill" | "finish" | "foundation" | "framing" | "inspection" | "insulation" | "masonry" | "membrane" | "run" | "service-space" | "sheathing", boolean>> | undefined;
4551
- disciplines?: Partial<Record<"electrical" | "fire" | "low-voltage" | "mechanical" | "plumbing", boolean>> | undefined;
4552
- xray?: boolean | undefined;
4553
- colorBy?: "material" | "service" | undefined;
4554
- } | undefined;
4555
- } | undefined;
4556
- address?: {
4557
- street?: string | undefined;
4558
- city?: string | undefined;
4559
- state?: string | undefined;
4560
- zip?: string | undefined;
4561
- } | undefined;
4562
- parcel?: {
4563
- apn?: string | undefined;
4564
- source?: string | undefined;
4565
- county?: string | undefined;
4566
- state?: string | undefined;
4567
- lotAreaSqFt?: number | undefined;
4568
- originLngLat?: [number, number] | undefined;
4569
- resolvedAt?: string | undefined;
4570
- layer?: string | undefined;
4571
- notes?: string[] | undefined;
4572
- } | undefined;
4573
- setbacks?: {
4574
- front: number;
4575
- side: number;
4576
- rear: number;
4577
- left?: number | undefined;
4578
- right?: number | undefined;
4579
- streetSide?: number | undefined;
4580
- } | undefined;
4581
- setbacksSource?: string | undefined;
4582
- zone?: string | undefined;
4583
- frontEdge?: number | undefined;
4584
- streetEdges?: number[] | undefined;
4585
- sightTriangleFt?: number | undefined;
4586
- northRotation?: number | undefined;
4587
- dossier?: {
4588
- [x: string]: unknown;
4589
- provider: string;
4590
- asOf: string;
4591
- point?: {
4592
- lat?: number | undefined;
4593
- lng?: number | undefined;
4594
- source?: string | undefined;
4595
- } | undefined;
4596
- address?: {
4597
- formatted?: string | undefined;
4598
- precision?: string | undefined;
4599
- } | undefined;
4600
- sections: Record<string, {
4601
- [x: string]: unknown;
4602
- status: string;
4603
- summary?: string | undefined;
4604
- reason?: string | undefined;
4605
- source?: {
4606
- name?: string | undefined;
4607
- kind?: string | undefined;
4608
- vintage?: string | undefined;
4609
- attribution?: string | undefined;
4610
- } | undefined;
4611
- }>;
4612
- parcel?: Record<string, unknown> | undefined;
4613
- flood?: Record<string, unknown> | undefined;
4614
- codeBasis?: Record<string, unknown> | undefined;
4615
- zoning?: Record<string, unknown> | undefined;
4616
- utilities?: Record<string, unknown> | undefined;
4617
- soils?: Record<string, unknown> | undefined;
4618
- wetlands?: Record<string, unknown> | undefined;
4619
- structures?: Record<string, unknown> | undefined;
4620
- elevation?: Record<string, unknown> | undefined;
4621
- boundaries?: Record<string, unknown> | undefined;
4524
+ id: `pipe-fitting_${string}`;
4525
+ position: [number, number, number];
4526
+ rotation: [number, number, number];
4527
+ fittingType: "cleanout" | "coupling" | "cross" | "elbow" | "end-cap" | "reducer" | "sanitary-tee" | "wye";
4528
+ angle: number;
4529
+ diameter: number;
4530
+ diameter2: number;
4531
+ cleanoutStyle: "end" | "inline";
4532
+ pipeMaterial: "abs" | "cast-iron" | "pvc";
4533
+ system: "vent" | "waste";
4534
+ type: "pipe-fitting";
4535
+ } | {
4536
+ object: "node";
4537
+ name?: string | undefined;
4538
+ parentId: string | null;
4539
+ visible: boolean;
4540
+ camera?: {
4541
+ position: [number, number, number];
4542
+ target: [number, number, number];
4543
+ mode: "orthographic" | "perspective";
4544
+ fov?: number | undefined;
4545
+ zoom?: number | undefined;
4622
4546
  } | undefined;
4623
- contourIntervalIn?: number | undefined;
4624
- contours3d?: boolean | undefined;
4625
- terrainContours?: {
4626
- datum: string;
4627
- intervalFt: number;
4628
- source?: string | undefined;
4629
- lines: {
4630
- elevationFt: number;
4631
- points: [number, number][];
4547
+ metadata: Record<string, unknown>;
4548
+ provenance?: {
4549
+ refs: {
4550
+ ns?: string | undefined;
4551
+ id: string;
4552
+ role?: "absorbed" | "alias" | "derived" | "piece" | "primary" | undefined;
4632
4553
  }[];
4554
+ lineage?: {
4555
+ op: "attach" | "convert" | "duplicate" | "import" | "make-independent" | "merge" | "promote" | "split";
4556
+ fromIds: string[];
4557
+ } | undefined;
4633
4558
  } | undefined;
4634
- wallTypes?: {
4635
- id: string;
4636
- label: string;
4637
- assembly: {
4638
- layers: {
4639
- id: string;
4640
- role: "air" | "covering" | "deck" | "fill" | "finish" | "furring" | "glazing" | "insulation" | "lining" | "membrane" | "sheathing" | "shell" | "structure" | "substrate" | "underlay";
4641
- thickness: number;
4642
- core?: true | undefined;
4643
- spacing?: number | undefined;
4644
- material?: string | undefined;
4645
- slot?: string | undefined;
4646
- returns?: boolean | undefined;
4647
- display?: "construction" | "finished" | undefined;
4648
- inset?: number | undefined;
4649
- bottom?: number | undefined;
4650
- lift?: number | undefined;
4651
- src?: string | undefined;
4652
- }[];
4653
- backing?: {
4654
- id: string;
4655
- role: "air" | "covering" | "deck" | "fill" | "finish" | "furring" | "glazing" | "insulation" | "lining" | "membrane" | "sheathing" | "shell" | "structure" | "substrate" | "underlay";
4656
- thickness: number;
4657
- core?: true | undefined;
4658
- spacing?: number | undefined;
4659
- material?: string | undefined;
4660
- slot?: string | undefined;
4661
- returns?: boolean | undefined;
4662
- display?: "construction" | "finished" | undefined;
4663
- inset?: number | undefined;
4664
- bottom?: number | undefined;
4665
- lift?: number | undefined;
4666
- src?: string | undefined;
4667
- }[] | undefined;
4668
- face?: "exterior" | "front" | undefined;
4669
- presetId?: string | undefined;
4670
- cavityInsulation?: string | undefined;
4671
- };
4672
- }[] | undefined;
4673
- children: string[];
4674
- type: "site";
4559
+ id: `level_${string}`;
4560
+ 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}`)[];
4561
+ level: number;
4562
+ baseElevation: number;
4563
+ height?: number | undefined;
4564
+ type: "level";
4675
4565
  } | {
4676
4566
  object: "node";
4677
4567
  name?: string | undefined;
@@ -4696,27 +4586,54 @@ export declare function absorbWallSeparators(nodes: SceneNodes, levelId: string,
4696
4586
  fromIds: string[];
4697
4587
  } | undefined;
4698
4588
  } | undefined;
4699
- matchFenceStyle?: boolean | undefined;
4700
- matchFenceHeight?: boolean | undefined;
4701
- leafType?: "double" | "single" | undefined;
4702
- style?: "guard" | "horizontal" | "match" | "picket" | "privacy" | "rail" | "slat" | undefined;
4703
- height?: number | undefined;
4704
- clearance?: number | undefined;
4705
- thickness?: number | undefined;
4706
- frameWidth?: number | undefined;
4707
- spacing?: number | undefined;
4708
- boardWidth?: number | undefined;
4709
- hinge?: "left" | "right" | undefined;
4710
- swing?: "inward" | "outward" | undefined;
4711
- openAngle?: number | undefined;
4712
- leafSplit?: number | undefined;
4713
- brace?: "cross" | "diagonal" | "none" | undefined;
4714
- showHardware?: boolean | undefined;
4715
- showPosts?: boolean | undefined;
4716
- id: `fence-gate_${string}`;
4717
- center: number;
4589
+ id: `elevator_${string}`;
4590
+ material?: {
4591
+ id?: string | undefined;
4592
+ preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
4593
+ properties?: {
4594
+ color: string;
4595
+ roughness: number;
4596
+ metalness: number;
4597
+ opacity: number;
4598
+ transparent: boolean;
4599
+ side: "back" | "double" | "front";
4600
+ } | undefined;
4601
+ texture?: {
4602
+ url: string;
4603
+ repeat?: [number, number] | undefined;
4604
+ scale?: number | undefined;
4605
+ offset?: [number, number] | undefined;
4606
+ normalMap?: string | undefined;
4607
+ normalScale?: number | undefined;
4608
+ bumpMap?: string | undefined;
4609
+ bumpScale?: number | undefined;
4610
+ } | undefined;
4611
+ } | undefined;
4612
+ materialPreset?: string | undefined;
4613
+ slots?: Record<string, string> | undefined;
4614
+ position: [number, number, number];
4615
+ rotation: number;
4718
4616
  width: number;
4719
- type: "fence-gate";
4617
+ depth: number;
4618
+ shaftWidth?: number | undefined;
4619
+ shaftDepth?: number | undefined;
4620
+ shaftWallThickness: number;
4621
+ shaftStyle: "glass" | "solid";
4622
+ cabHeight: number;
4623
+ doorWidth: number;
4624
+ doorHeight: number;
4625
+ doorStyle: "center-opening" | "single-left" | "single-right";
4626
+ doorPanelStyle: "glass-frame" | "segmented-panel" | "solid-panel";
4627
+ fromLevelId: string | null;
4628
+ toLevelId: string | null;
4629
+ servedLevelIds?: string[] | undefined;
4630
+ disabledLevelIds: string[];
4631
+ serviceOnlyLevelIds: string[];
4632
+ defaultLevelId: string | null;
4633
+ speed: number;
4634
+ doorDurationMs: number;
4635
+ dwellMs: number;
4636
+ type: "elevator";
4720
4637
  } | {
4721
4638
  object: "node";
4722
4639
  name?: string | undefined;
@@ -4741,14 +4658,12 @@ export declare function absorbWallSeparators(nodes: SceneNodes, levelId: string,
4741
4658
  fromIds: string[];
4742
4659
  } | undefined;
4743
4660
  } | undefined;
4744
- center: number;
4745
- width: number;
4746
- matchFenceStyle?: boolean | undefined;
4747
- matchFenceHeight?: boolean | undefined;
4748
- height?: number | undefined;
4749
- showPosts: boolean;
4750
- id: `fence-opening_${string}`;
4751
- type: "fence-opening";
4661
+ id: `building_${string}`;
4662
+ children: (`elevator_${string}` | `level_${string}` | `unit_${string}`)[];
4663
+ position: [number, number, number];
4664
+ rotation: [number, number, number];
4665
+ groundLevelId?: `level_${string}` | undefined;
4666
+ type: "building";
4752
4667
  } | {
4753
4668
  object: "node";
4754
4669
  name?: string | undefined;
@@ -5260,64 +5175,6 @@ export declare function absorbWallSeparators(nodes: SceneNodes, levelId: string,
5260
5175
  spinSpeed: number;
5261
5176
  style: "cylinder" | "globe";
5262
5177
  type: "turbine-vent";
5263
- } | {
5264
- object: "node";
5265
- name?: string | undefined;
5266
- parentId: string | null;
5267
- visible: boolean;
5268
- camera?: {
5269
- position: [number, number, number];
5270
- target: [number, number, number];
5271
- mode: "orthographic" | "perspective";
5272
- fov?: number | undefined;
5273
- zoom?: number | undefined;
5274
- } | undefined;
5275
- metadata: Record<string, unknown>;
5276
- provenance?: {
5277
- refs: {
5278
- ns?: string | undefined;
5279
- id: string;
5280
- role?: "absorbed" | "alias" | "derived" | "piece" | "primary" | undefined;
5281
- }[];
5282
- lineage?: {
5283
- op: "attach" | "convert" | "duplicate" | "import" | "make-independent" | "merge" | "promote" | "split";
5284
- fromIds: string[];
5285
- } | undefined;
5286
- } | undefined;
5287
- id: `cupola_${string}`;
5288
- material?: {
5289
- id?: string | undefined;
5290
- preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
5291
- properties?: {
5292
- color: string;
5293
- roughness: number;
5294
- metalness: number;
5295
- opacity: number;
5296
- transparent: boolean;
5297
- side: "back" | "double" | "front";
5298
- } | undefined;
5299
- texture?: {
5300
- url: string;
5301
- repeat?: [number, number] | undefined;
5302
- scale?: number | undefined;
5303
- offset?: [number, number] | undefined;
5304
- normalMap?: string | undefined;
5305
- normalScale?: number | undefined;
5306
- bumpMap?: string | undefined;
5307
- bumpScale?: number | undefined;
5308
- } | undefined;
5309
- } | undefined;
5310
- slots?: Record<string, string> | undefined;
5311
- materialPreset: string;
5312
- roofSegmentId?: string | undefined;
5313
- position: [number, number, number];
5314
- rotation: number;
5315
- width: number;
5316
- depth: number;
5317
- height: number;
5318
- roofStyle: "dome" | "pyramid";
5319
- finial: boolean;
5320
- type: "cupola";
5321
5178
  } | {
5322
5179
  object: "node";
5323
5180
  name?: string | undefined;
@@ -5646,6 +5503,150 @@ export declare function absorbWallSeparators(nodes: SceneNodes, levelId: string,
5646
5503
  frameDepth: number;
5647
5504
  surfaceNormal?: [number, number, number] | undefined;
5648
5505
  type: "solar-panel";
5506
+ } | {
5507
+ object: "node";
5508
+ name?: string | undefined;
5509
+ parentId: string | null;
5510
+ visible: boolean;
5511
+ camera?: {
5512
+ position: [number, number, number];
5513
+ target: [number, number, number];
5514
+ mode: "orthographic" | "perspective";
5515
+ fov?: number | undefined;
5516
+ zoom?: number | undefined;
5517
+ } | undefined;
5518
+ metadata: Record<string, unknown>;
5519
+ provenance?: {
5520
+ refs: {
5521
+ ns?: string | undefined;
5522
+ id: string;
5523
+ role?: "absorbed" | "alias" | "derived" | "piece" | "primary" | undefined;
5524
+ }[];
5525
+ lineage?: {
5526
+ op: "attach" | "convert" | "duplicate" | "import" | "make-independent" | "merge" | "promote" | "split";
5527
+ fromIds: string[];
5528
+ } | undefined;
5529
+ } | undefined;
5530
+ id: `dormer_${string}`;
5531
+ material?: {
5532
+ id?: string | undefined;
5533
+ preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
5534
+ properties?: {
5535
+ color: string;
5536
+ roughness: number;
5537
+ metalness: number;
5538
+ opacity: number;
5539
+ transparent: boolean;
5540
+ side: "back" | "double" | "front";
5541
+ } | undefined;
5542
+ texture?: {
5543
+ url: string;
5544
+ repeat?: [number, number] | undefined;
5545
+ scale?: number | undefined;
5546
+ offset?: [number, number] | undefined;
5547
+ normalMap?: string | undefined;
5548
+ normalScale?: number | undefined;
5549
+ bumpMap?: string | undefined;
5550
+ bumpScale?: number | undefined;
5551
+ } | undefined;
5552
+ } | undefined;
5553
+ materialPreset?: string | undefined;
5554
+ topMaterial?: {
5555
+ id?: string | undefined;
5556
+ preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
5557
+ properties?: {
5558
+ color: string;
5559
+ roughness: number;
5560
+ metalness: number;
5561
+ opacity: number;
5562
+ transparent: boolean;
5563
+ side: "back" | "double" | "front";
5564
+ } | undefined;
5565
+ texture?: {
5566
+ url: string;
5567
+ repeat?: [number, number] | undefined;
5568
+ scale?: number | undefined;
5569
+ offset?: [number, number] | undefined;
5570
+ normalMap?: string | undefined;
5571
+ normalScale?: number | undefined;
5572
+ bumpMap?: string | undefined;
5573
+ bumpScale?: number | undefined;
5574
+ } | undefined;
5575
+ } | undefined;
5576
+ topMaterialPreset?: string | undefined;
5577
+ sideMaterial?: {
5578
+ id?: string | undefined;
5579
+ preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
5580
+ properties?: {
5581
+ color: string;
5582
+ roughness: number;
5583
+ metalness: number;
5584
+ opacity: number;
5585
+ transparent: boolean;
5586
+ side: "back" | "double" | "front";
5587
+ } | undefined;
5588
+ texture?: {
5589
+ url: string;
5590
+ repeat?: [number, number] | undefined;
5591
+ scale?: number | undefined;
5592
+ offset?: [number, number] | undefined;
5593
+ normalMap?: string | undefined;
5594
+ normalScale?: number | undefined;
5595
+ bumpMap?: string | undefined;
5596
+ bumpScale?: number | undefined;
5597
+ } | undefined;
5598
+ } | undefined;
5599
+ sideMaterialPreset?: string | undefined;
5600
+ wallMaterial?: {
5601
+ id?: string | undefined;
5602
+ preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
5603
+ properties?: {
5604
+ color: string;
5605
+ roughness: number;
5606
+ metalness: number;
5607
+ opacity: number;
5608
+ transparent: boolean;
5609
+ side: "back" | "double" | "front";
5610
+ } | undefined;
5611
+ texture?: {
5612
+ url: string;
5613
+ repeat?: [number, number] | undefined;
5614
+ scale?: number | undefined;
5615
+ offset?: [number, number] | undefined;
5616
+ normalMap?: string | undefined;
5617
+ normalScale?: number | undefined;
5618
+ bumpMap?: string | undefined;
5619
+ bumpScale?: number | undefined;
5620
+ } | undefined;
5621
+ } | undefined;
5622
+ wallMaterialPreset?: string | undefined;
5623
+ roofSegmentId?: string | undefined;
5624
+ position: [number, number, number];
5625
+ rotation: number;
5626
+ width: number;
5627
+ depth: number;
5628
+ height: number;
5629
+ roofType: "barrel" | "conical" | "dutch" | "flat" | "gable" | "gambrel" | "hip" | "mansard" | "shed";
5630
+ roofHeight: number;
5631
+ shedHighSide: "back" | "front";
5632
+ wallSkirtHeight: number;
5633
+ windowWidth: number;
5634
+ windowHeight: number;
5635
+ windowOffsetX: number;
5636
+ windowOffsetY: number;
5637
+ windowFrameThickness: number;
5638
+ windowFrameDepth: number;
5639
+ windowColumns: number;
5640
+ windowRows: number;
5641
+ windowDividerThickness: number;
5642
+ windowShape: "arch" | "rectangle" | "rounded";
5643
+ windowArchHeight: number;
5644
+ windowCornerRadii: [number, number, number, number];
5645
+ windowSill: boolean;
5646
+ windowSillDepth: number;
5647
+ windowSillThickness: number;
5648
+ children: `window_${string}`[];
5649
+ type: "dormer";
5649
5650
  } | {
5650
5651
  object: "node";
5651
5652
  name?: string | undefined;