@pascal-app/core 1.0.7 → 1.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (266) hide show
  1. package/dist/agent-operations/__fixtures__/cases.d.ts +3 -2
  2. package/dist/agent-operations/__fixtures__/cases.d.ts.map +1 -1
  3. package/dist/agent-operations/__fixtures__/native-materials.d.ts +4 -0
  4. package/dist/agent-operations/__fixtures__/native-materials.d.ts.map +1 -1
  5. package/dist/agent-operations/__fixtures__/place-items-cases.d.ts.map +1 -1
  6. package/dist/agent-operations/__fixtures__/place-items-cases.js +28 -0
  7. package/dist/agent-operations/__fixtures__/roof-bearing-cases.d.ts +9567 -9563
  8. package/dist/agent-operations/__fixtures__/roof-bearing-cases.d.ts.map +1 -1
  9. package/dist/agent-operations/__fixtures__/verify-scene-cases.d.ts +77 -77
  10. package/dist/agent-operations/asset-catalog.d.ts +21 -11
  11. package/dist/agent-operations/asset-catalog.d.ts.map +1 -1
  12. package/dist/agent-operations/asset-catalog.js +28 -10
  13. package/dist/agent-operations/asset-views.d.ts +8 -3
  14. package/dist/agent-operations/asset-views.d.ts.map +1 -1
  15. package/dist/agent-operations/asset-views.js +19 -3
  16. package/dist/agent-operations/author-scene.d.ts.map +1 -1
  17. package/dist/agent-operations/author-scene.js +2 -3
  18. package/dist/agent-operations/batch.d.ts +7 -1
  19. package/dist/agent-operations/batch.d.ts.map +1 -1
  20. package/dist/agent-operations/batch.js +17 -2
  21. package/dist/agent-operations/catalog-asset.d.ts +15 -0
  22. package/dist/agent-operations/catalog-asset.d.ts.map +1 -0
  23. package/dist/agent-operations/catalog-asset.js +4 -0
  24. package/dist/agent-operations/circulation-spaces.d.ts +1724 -1723
  25. package/dist/agent-operations/circulation-spaces.d.ts.map +1 -1
  26. package/dist/agent-operations/design-brief.d.ts.map +1 -1
  27. package/dist/agent-operations/design-brief.js +2 -0
  28. package/dist/agent-operations/furnish-room.d.ts.map +1 -1
  29. package/dist/agent-operations/furnish-room.js +2 -1
  30. package/dist/agent-operations/index.d.ts +3 -0
  31. package/dist/agent-operations/index.d.ts.map +1 -1
  32. package/dist/agent-operations/index.js +4 -1
  33. package/dist/agent-operations/level-reads.d.ts.map +1 -1
  34. package/dist/agent-operations/level-reads.js +5 -2
  35. package/dist/agent-operations/move-plan.d.ts.map +1 -1
  36. package/dist/agent-operations/move-plan.js +11 -9
  37. package/dist/agent-operations/place-in-room.d.ts.map +1 -1
  38. package/dist/agent-operations/place-in-room.js +2 -1
  39. package/dist/agent-operations/place-items.d.ts.map +1 -1
  40. package/dist/agent-operations/place-items.js +2 -1
  41. package/dist/agent-operations/scene-queries.d.ts +2944 -2943
  42. package/dist/agent-operations/scene-queries.d.ts.map +1 -1
  43. package/dist/agent-operations/scene-view.d.ts.map +1 -1
  44. package/dist/agent-operations/scene-view.js +38 -13
  45. package/dist/agent-operations/search-assets.d.ts.map +1 -1
  46. package/dist/agent-operations/search-assets.js +6 -0
  47. package/dist/agent-operations/types.d.ts +3 -2
  48. package/dist/agent-operations/types.d.ts.map +1 -1
  49. package/dist/agent-operations/usage-checks.js +18 -3
  50. package/dist/agent-operations/verify-scene.d.ts.map +1 -1
  51. package/dist/agent-operations/verify-scene.js +4 -2
  52. package/dist/agent-operations/wall-object-observations.d.ts.map +1 -1
  53. package/dist/agent-operations/wall-object-observations.js +1 -1
  54. package/dist/agent-tools/assets.js +1 -1
  55. package/dist/agent-tools/wall-openings.js +2 -2
  56. package/dist/building/__fixtures__/wall-opening-cases.d.ts +13 -12
  57. package/dist/building/__fixtures__/wall-opening-cases.d.ts.map +1 -1
  58. package/dist/building/level-duplication.d.ts +1281 -1279
  59. package/dist/building/level-duplication.d.ts.map +1 -1
  60. package/dist/building/level-duplication.js +3 -1
  61. package/dist/building/merge-windows.d.ts.map +1 -1
  62. package/dist/building/merge-windows.js +4 -3
  63. package/dist/building/wall-openings.d.ts +95 -81
  64. package/dist/building/wall-openings.d.ts.map +1 -1
  65. package/dist/building/wall-openings.js +74 -25
  66. package/dist/commands/structure/shared.d.ts +3203 -3202
  67. package/dist/commands/structure/shared.d.ts.map +1 -1
  68. package/dist/commands/structure/zone-wall-merge.d.ts +2028 -2025
  69. package/dist/commands/structure/zone-wall-merge.d.ts.map +1 -1
  70. package/dist/contracts/reference-inventory.d.ts.map +1 -1
  71. package/dist/contracts/reference-inventory.js +0 -1
  72. package/dist/hooks/spatial-grid/spatial-grid-manager.d.ts +6 -1
  73. package/dist/hooks/spatial-grid/spatial-grid-manager.d.ts.map +1 -1
  74. package/dist/hooks/spatial-grid/spatial-grid-manager.js +30 -9
  75. package/dist/hooks/spatial-grid/spatial-grid-sync.d.ts +2101 -2100
  76. package/dist/hooks/spatial-grid/spatial-grid-sync.d.ts.map +1 -1
  77. package/dist/hooks/spatial-grid/spatial-grid-sync.js +8 -4
  78. package/dist/index.d.ts +13 -4
  79. package/dist/index.d.ts.map +1 -1
  80. package/dist/index.js +13 -4
  81. package/dist/lib/__fixtures__/mezzanine.d.ts +6428 -6424
  82. package/dist/lib/__fixtures__/mezzanine.d.ts.map +1 -1
  83. package/dist/lib/absorb-wall-separators.d.ts +2267 -2266
  84. package/dist/lib/absorb-wall-separators.d.ts.map +1 -1
  85. package/dist/lib/asset-storage.d.ts.map +1 -1
  86. package/dist/lib/asset-storage.js +3 -0
  87. package/dist/lib/build-mode.d.ts +11 -0
  88. package/dist/lib/build-mode.d.ts.map +1 -0
  89. package/dist/lib/build-mode.js +24 -0
  90. package/dist/lib/corner-pair.d.ts +2 -0
  91. package/dist/lib/corner-pair.d.ts.map +1 -1
  92. package/dist/lib/door-interaction.d.ts +14 -0
  93. package/dist/lib/door-interaction.d.ts.map +1 -0
  94. package/dist/lib/door-interaction.js +62 -0
  95. package/dist/lib/elevator-support.d.ts +15 -0
  96. package/dist/lib/elevator-support.d.ts.map +1 -0
  97. package/dist/lib/elevator-support.js +40 -0
  98. package/dist/lib/floor-foundation-datum.d.ts.map +1 -1
  99. package/dist/lib/floor-foundation-datum.js +5 -1
  100. package/dist/lib/floor-intent-changes.d.ts.map +1 -1
  101. package/dist/lib/floor-intent-changes.js +6 -4
  102. package/dist/lib/floorplan/context.d.ts +95 -0
  103. package/dist/lib/floorplan/context.d.ts.map +1 -0
  104. package/dist/lib/floorplan/context.js +155 -0
  105. package/dist/lib/floorplan/index.d.ts +6 -0
  106. package/dist/lib/floorplan/index.d.ts.map +1 -0
  107. package/dist/lib/floorplan/index.js +5 -0
  108. package/dist/lib/floorplan/marks.d.ts +71 -0
  109. package/dist/lib/floorplan/marks.d.ts.map +1 -0
  110. package/dist/lib/floorplan/marks.js +157 -0
  111. package/dist/lib/floorplan/plan-math.d.ts +18 -0
  112. package/dist/lib/floorplan/plan-math.d.ts.map +1 -0
  113. package/dist/lib/floorplan/plan-math.js +82 -0
  114. package/dist/lib/floorplan/svg-paths.d.ts +17 -0
  115. package/dist/lib/floorplan/svg-paths.d.ts.map +1 -0
  116. package/dist/lib/floorplan/svg-paths.js +92 -0
  117. package/dist/lib/floorplan/wall-affordances.d.ts +31 -0
  118. package/dist/lib/floorplan/wall-affordances.d.ts.map +1 -0
  119. package/dist/lib/floorplan/wall-affordances.js +24 -0
  120. package/dist/lib/hierarchy.d.ts +19 -0
  121. package/dist/lib/hierarchy.d.ts.map +1 -0
  122. package/dist/lib/hierarchy.js +53 -0
  123. package/dist/lib/opening-floor-datum.d.ts +1 -1
  124. package/dist/lib/opening-floor-datum.d.ts.map +1 -1
  125. package/dist/lib/opening-floor-datum.js +2 -2
  126. package/dist/lib/own-floor-intent.d.ts.map +1 -1
  127. package/dist/lib/own-floor-intent.js +2 -2
  128. package/dist/lib/polygon-boolean.d.ts.map +1 -1
  129. package/dist/lib/polygon-boolean.js +2 -1
  130. package/dist/lib/room-floor-elevation.d.ts +12 -0
  131. package/dist/lib/room-floor-elevation.d.ts.map +1 -0
  132. package/dist/lib/room-floor-elevation.js +41 -0
  133. package/dist/lib/room-floor-feasibility.d.ts.map +1 -1
  134. package/dist/lib/room-floor-feasibility.js +1 -1
  135. package/dist/lib/space-detection.d.ts.map +1 -1
  136. package/dist/lib/space-detection.js +1 -0
  137. package/dist/lib/wall-face-script.d.ts.map +1 -1
  138. package/dist/lib/wall-face-script.js +3 -3
  139. package/dist/lib/window-interaction.d.ts +16 -0
  140. package/dist/lib/window-interaction.d.ts.map +1 -0
  141. package/dist/lib/window-interaction.js +82 -0
  142. package/dist/lib/zone-quantities.js +1 -1
  143. package/dist/node-slots/column.d.ts +5 -0
  144. package/dist/node-slots/column.d.ts.map +1 -1
  145. package/dist/node-slots/column.js +10 -0
  146. package/dist/registry/__fixtures__/roof-planes.d.ts +69 -0
  147. package/dist/registry/__fixtures__/roof-planes.d.ts.map +1 -0
  148. package/dist/registry/__fixtures__/roof-planes.js +59 -0
  149. package/dist/registry/index.d.ts +3 -2
  150. package/dist/registry/index.d.ts.map +1 -1
  151. package/dist/registry/index.js +2 -1
  152. package/dist/registry/registry.d.ts +5 -0
  153. package/dist/registry/registry.d.ts.map +1 -1
  154. package/dist/registry/registry.js +10 -0
  155. package/dist/registry/roofs.d.ts +34 -0
  156. package/dist/registry/roofs.d.ts.map +1 -0
  157. package/dist/registry/roofs.js +61 -0
  158. package/dist/registry/types.d.ts +54 -0
  159. package/dist/registry/types.d.ts.map +1 -1
  160. package/dist/registry/validate-relations.d.ts +5 -1
  161. package/dist/registry/validate-relations.d.ts.map +1 -1
  162. package/dist/registry/validate-relations.js +6 -2
  163. package/dist/schema/asset-url.d.ts +8 -0
  164. package/dist/schema/asset-url.d.ts.map +1 -1
  165. package/dist/schema/asset-url.js +17 -0
  166. package/dist/schema/index.d.ts +1 -1
  167. package/dist/schema/index.d.ts.map +1 -1
  168. package/dist/schema/index.js +1 -1
  169. package/dist/schema/nodes/roof-segment-resize.d.ts.map +1 -1
  170. package/dist/schema/nodes/roof-segment-resize.js +2 -2
  171. package/dist/schema/nodes/roof-segment.d.ts +2 -0
  172. package/dist/schema/nodes/roof-segment.d.ts.map +1 -1
  173. package/dist/schema/nodes/roof-segment.js +40 -2
  174. package/dist/schema/nodes/roof.d.ts +1 -1
  175. package/dist/schema/nodes/roof.d.ts.map +1 -1
  176. package/dist/schema/nodes/roof.js +13 -8
  177. package/dist/schema/nodes/wall.d.ts +1 -0
  178. package/dist/schema/nodes/wall.d.ts.map +1 -1
  179. package/dist/schema/nodes/wall.js +6 -0
  180. package/dist/schema/types.d.ts +2 -1
  181. package/dist/schema/types.d.ts.map +1 -1
  182. package/dist/services/index.d.ts +1 -1
  183. package/dist/services/index.d.ts.map +1 -1
  184. package/dist/services/index.js +1 -1
  185. package/dist/services/movement.d.ts +7 -0
  186. package/dist/services/movement.d.ts.map +1 -1
  187. package/dist/services/movement.js +13 -0
  188. package/dist/services/port-connectivity.d.ts +15 -6
  189. package/dist/services/port-connectivity.d.ts.map +1 -1
  190. package/dist/services/port-connectivity.js +83 -17
  191. package/dist/services/roof-bearing.js +2 -1
  192. package/dist/services/roof-level.d.ts.map +1 -1
  193. package/dist/services/roof-level.js +12 -2
  194. package/dist/services/roof-move.d.ts +4 -2
  195. package/dist/services/roof-move.d.ts.map +1 -1
  196. package/dist/services/roof-move.js +21 -9
  197. package/dist/services/storey.d.ts +6 -1
  198. package/dist/services/storey.d.ts.map +1 -1
  199. package/dist/services/storey.js +11 -2
  200. package/dist/spatial/usage-field/findings.d.ts +7 -1
  201. package/dist/spatial/usage-field/findings.d.ts.map +1 -1
  202. package/dist/spatial/usage-field/findings.js +42 -10
  203. package/dist/spatial/usage-field/path.d.ts.map +1 -1
  204. package/dist/spatial/usage-field/path.js +28 -18
  205. package/dist/spatial/usage-field/swings.d.ts +1 -0
  206. package/dist/spatial/usage-field/swings.d.ts.map +1 -1
  207. package/dist/spatial/usage-field/walls.d.ts +2 -0
  208. package/dist/spatial/usage-field/walls.d.ts.map +1 -1
  209. package/dist/spatial/usage-field/walls.js +18 -4
  210. package/dist/store/actions/node-actions.d.ts +2 -1
  211. package/dist/store/actions/node-actions.d.ts.map +1 -1
  212. package/dist/store/actions/node-actions.js +23 -5
  213. package/dist/store/derived-node-guard.d.ts.map +1 -1
  214. package/dist/store/derived-node-guard.js +2 -1
  215. package/dist/store/scene-annotations.d.ts +4634 -4632
  216. package/dist/store/scene-annotations.d.ts.map +1 -1
  217. package/dist/systems/document-reconcile.d.ts.map +1 -1
  218. package/dist/systems/document-reconcile.js +1 -2
  219. package/dist/systems/elevator/elevator-geometry.d.ts +25 -0
  220. package/dist/systems/elevator/elevator-geometry.d.ts.map +1 -1
  221. package/dist/systems/elevator/elevator-geometry.js +40 -8
  222. package/dist/systems/elevator/elevator-opening-sync.d.ts.map +1 -1
  223. package/dist/systems/elevator/elevator-opening-sync.js +4 -35
  224. package/dist/systems/elevator/elevator-runtime.d.ts.map +1 -1
  225. package/dist/systems/elevator/elevator-runtime.js +95 -18
  226. package/dist/systems/elevator/elevator-service.d.ts.map +1 -1
  227. package/dist/systems/elevator/elevator-service.js +24 -4
  228. package/dist/systems/roof/roof-elevation.d.ts +11 -6
  229. package/dist/systems/roof/roof-elevation.d.ts.map +1 -1
  230. package/dist/systems/roof/roof-elevation.js +26 -12
  231. package/dist/systems/slab/__fixtures__/floor-step.d.ts +5 -1
  232. package/dist/systems/slab/__fixtures__/floor-step.d.ts.map +1 -1
  233. package/dist/systems/slab/__fixtures__/raised-room.d.ts +2218 -2214
  234. package/dist/systems/slab/__fixtures__/raised-room.d.ts.map +1 -1
  235. package/dist/systems/stair/stair-opening-preview.d.ts +3203 -3202
  236. package/dist/systems/stair/stair-opening-preview.d.ts.map +1 -1
  237. package/dist/systems/wall/wall-curve.d.ts +10 -0
  238. package/dist/systems/wall/wall-curve.d.ts.map +1 -1
  239. package/dist/systems/wall/wall-curve.js +38 -0
  240. package/dist/systems/wall/wall-frame.d.ts.map +1 -1
  241. package/dist/systems/wall/wall-frame.js +8 -0
  242. package/dist/systems/wall/wall-merge.d.ts +9 -1
  243. package/dist/systems/wall/wall-merge.d.ts.map +1 -1
  244. package/dist/systems/wall/wall-merge.js +38 -6
  245. package/dist/systems/wall/wall-top.d.ts +10 -3
  246. package/dist/systems/wall/wall-top.d.ts.map +1 -1
  247. package/dist/systems/wall/wall-top.js +24 -8
  248. package/dist/systems/wall/wall-topology.d.ts.map +1 -1
  249. package/dist/systems/wall/wall-topology.js +19 -1
  250. package/dist/utils/ensure-scene-openings.d.ts +5595 -5593
  251. package/dist/utils/ensure-scene-openings.d.ts.map +1 -1
  252. package/dist/utils/floor-plate-migration.d.ts +2267 -2266
  253. package/dist/utils/floor-plate-migration.d.ts.map +1 -1
  254. package/dist/utils/measurement-format.d.ts +27 -0
  255. package/dist/utils/measurement-format.d.ts.map +1 -0
  256. package/dist/utils/measurement-format.js +143 -0
  257. package/dist/utils/owned-floor-opening-migration.d.ts +653 -652
  258. package/dist/utils/owned-floor-opening-migration.d.ts.map +1 -1
  259. package/dist/utils/reconcile-structure-on-load.d.ts +1724 -1723
  260. package/dist/utils/reconcile-structure-on-load.d.ts.map +1 -1
  261. package/dist/utils/scene-bounds.d.ts +32 -0
  262. package/dist/utils/scene-bounds.d.ts.map +1 -0
  263. package/dist/utils/scene-bounds.js +201 -0
  264. package/dist/validation/validate-build-json.d.ts.map +1 -1
  265. package/dist/validation/validate-build-json.js +3 -1
  266. package/package.json +1 -1
@@ -24,179 +24,47 @@ export declare function absorbWallSeparators(nodes: SceneNodes, levelId: string,
24
24
  fromIds: string[];
25
25
  } | undefined;
26
26
  } | undefined;
27
- id: `beam_${string}`;
28
- start: [number, number];
29
- end: [number, number];
30
- width: number;
31
- depth: number;
32
- size?: string | undefined;
33
- plies: number;
34
- material: "glulam" | "lvl" | "pressure-treated" | "sawn" | "steel";
35
- placement: "dropped" | "flush";
36
- topElevation?: number | undefined;
37
- supportSlabId?: string | undefined;
38
- type: "beam";
39
- } | {
40
- object: "node";
41
- name?: string | undefined;
42
- parentId: string | null;
43
- visible: boolean;
44
- camera?: {
45
- position: [number, number, number];
46
- target: [number, number, number];
47
- mode: "orthographic" | "perspective";
48
- fov?: number | undefined;
49
- zoom?: number | undefined;
50
- } | undefined;
51
- metadata: Record<string, unknown>;
52
- provenance?: {
53
- refs: {
54
- ns?: string | undefined;
55
- id: string;
56
- role?: "absorbed" | "alias" | "derived" | "piece" | "primary" | undefined;
57
- }[];
58
- lineage?: {
59
- op: "attach" | "convert" | "duplicate" | "import" | "make-independent" | "merge" | "promote" | "split";
60
- fromIds: string[];
27
+ id: `bvent_${string}`;
28
+ material?: {
29
+ id?: string | undefined;
30
+ preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
31
+ properties?: {
32
+ color: string;
33
+ roughness: number;
34
+ metalness: number;
35
+ opacity: number;
36
+ transparent: boolean;
37
+ side: "back" | "double" | "front";
61
38
  } | undefined;
62
- } | undefined;
63
- id: `measurement_${string}`;
64
- measurement: {
65
- kind: "volume";
66
- base: ({
67
- kind: "feature";
68
- reference: {
69
- nodeId: string;
70
- featureId: string;
71
- parameters?: Record<string, string | number | boolean> | undefined;
72
- };
73
- fallback: [number, number, number];
74
- } | [number, number, number])[];
75
- extrusion: [number, number, number];
76
- } | {
77
- kind: "distance";
78
- points: [{
79
- kind: "feature";
80
- reference: {
81
- nodeId: string;
82
- featureId: string;
83
- parameters?: Record<string, string | number | boolean> | undefined;
84
- };
85
- fallback: [number, number, number];
86
- } | [number, number, number], {
87
- kind: "feature";
88
- reference: {
89
- nodeId: string;
90
- featureId: string;
91
- parameters?: Record<string, string | number | boolean> | undefined;
92
- };
93
- fallback: [number, number, number];
94
- } | [number, number, number]];
95
- } | {
96
- kind: "angle";
97
- points: [{
98
- kind: "feature";
99
- reference: {
100
- nodeId: string;
101
- featureId: string;
102
- parameters?: Record<string, string | number | boolean> | undefined;
103
- };
104
- fallback: [number, number, number];
105
- } | [number, number, number], {
106
- kind: "feature";
107
- reference: {
108
- nodeId: string;
109
- featureId: string;
110
- parameters?: Record<string, string | number | boolean> | undefined;
111
- };
112
- fallback: [number, number, number];
113
- } | [number, number, number], {
114
- kind: "feature";
115
- reference: {
116
- nodeId: string;
117
- featureId: string;
118
- parameters?: Record<string, string | number | boolean> | undefined;
119
- };
120
- fallback: [number, number, number];
121
- } | [number, number, number]];
122
- } | {
123
- kind: "area";
124
- base: ({
125
- kind: "feature";
126
- reference: {
127
- nodeId: string;
128
- featureId: string;
129
- parameters?: Record<string, string | number | boolean> | undefined;
130
- };
131
- fallback: [number, number, number];
132
- } | [number, number, number])[];
133
- } | {
134
- kind: "perimeter";
135
- base: ({
136
- kind: "feature";
137
- reference: {
138
- nodeId: string;
139
- featureId: string;
140
- parameters?: Record<string, string | number | boolean> | undefined;
141
- };
142
- fallback: [number, number, number];
143
- } | [number, number, number])[];
144
- };
145
- type: "measurement";
146
- } | {
147
- object: "node";
148
- name?: string | undefined;
149
- parentId: string | null;
150
- visible: boolean;
151
- camera?: {
152
- position: [number, number, number];
153
- target: [number, number, number];
154
- mode: "orthographic" | "perspective";
155
- fov?: number | undefined;
156
- zoom?: number | undefined;
157
- } | undefined;
158
- metadata: Record<string, unknown>;
159
- provenance?: {
160
- refs: {
161
- ns?: string | undefined;
162
- id: string;
163
- role?: "absorbed" | "alias" | "derived" | "piece" | "primary" | undefined;
164
- }[];
165
- lineage?: {
166
- op: "attach" | "convert" | "duplicate" | "import" | "make-independent" | "merge" | "promote" | "split";
167
- fromIds: string[];
39
+ texture?: {
40
+ url: string;
41
+ repeat?: [number, number] | undefined;
42
+ scale?: number | undefined;
43
+ offset?: [number, number] | undefined;
44
+ normalMap?: string | undefined;
45
+ normalScale?: number | undefined;
46
+ bumpMap?: string | undefined;
47
+ bumpScale?: number | undefined;
168
48
  } | undefined;
169
49
  } | undefined;
170
- id: `duct-segment_${string}`;
171
- path: [number, number, number][];
172
- autoHangers?: boolean | undefined;
173
- hangerOverrides?: Record<string, {
174
- fraction?: number | undefined;
175
- skipped?: boolean | undefined;
176
- hostId?: string | undefined;
177
- }> | undefined;
178
- hangerStyle?: "double" | "single" | undefined;
179
- hangerSpacing?: number | undefined;
180
- hangerMaxReach?: number | undefined;
181
- wallAttachment?: {
182
- wallId: `wall_${string}`;
183
- side: "back" | "front";
184
- startUV: [number, number];
185
- endUV: [number, number];
186
- offset: number;
187
- } | undefined;
188
- shape: "oval" | "rect" | "round";
189
- diameter: number;
50
+ slots?: Record<string, string> | undefined;
51
+ materialPreset: string;
52
+ roofSegmentId?: string | undefined;
53
+ position: [number, number, number];
54
+ rotation: number;
190
55
  width: number;
56
+ depth: number;
191
57
  height: number;
192
- roll: number;
193
- ductMaterial: "duct-board" | "flex" | "sheet-metal" | "spiral";
194
- seamDetail: boolean;
195
- insulated: boolean;
196
- insulationR: number;
197
- system: "return" | "supply";
198
- slots?: Record<string, string> | undefined;
199
- type: "duct-segment";
58
+ hoodOverhang: number;
59
+ topTaper: number;
60
+ capHeight: number;
61
+ capGap: number;
62
+ domeCurvature: number;
63
+ baseInset: number;
64
+ baseHeight: number;
65
+ cornerBevel: number;
66
+ style: "box" | "cap" | "dome";
67
+ type: "box-vent";
200
68
  } | {
201
69
  object: "node";
202
70
  name?: string | undefined;
@@ -221,48 +89,223 @@ export declare function absorbWallSeparators(nodes: SceneNodes, levelId: string,
221
89
  fromIds: string[];
222
90
  } | undefined;
223
91
  } | undefined;
224
- id: `floor-opening_${string}`;
225
- polygon: [number, number][];
226
- hostZoneId?: string | undefined;
227
- legacyPlateCuts?: Record<string, [number, number][][]> | undefined;
228
- legacyCeilingCuts?: Record<string, [number, number][][]> | undefined;
229
- source: string;
230
- ownerId?: string | undefined;
231
- surfaceId?: string | undefined;
232
- drawnOn: "ceiling" | "floor";
233
- cutsPrimary: boolean;
234
- cutsAdjacent: boolean;
235
- type: "floor-opening";
236
- } | {
237
- object: "node";
238
- name?: string | undefined;
239
- parentId: string | null;
240
- visible: boolean;
241
- camera?: {
242
- position: [number, number, number];
243
- target: [number, number, number];
244
- mode: "orthographic" | "perspective";
245
- fov?: number | undefined;
246
- zoom?: number | undefined;
247
- } | undefined;
248
- metadata: Record<string, unknown>;
249
- provenance?: {
250
- refs: {
251
- ns?: string | undefined;
252
- id: string;
253
- role?: "absorbed" | "alias" | "derived" | "piece" | "primary" | undefined;
254
- }[];
255
- lineage?: {
256
- op: "attach" | "convert" | "duplicate" | "import" | "make-independent" | "merge" | "promote" | "split";
257
- fromIds: string[];
92
+ id: `column_${string}`;
93
+ children: string[];
94
+ position: [number, number, number];
95
+ rotation: number;
96
+ supportSlabId?: string | undefined;
97
+ source?: {
98
+ kind: "script";
99
+ meta?: {
100
+ description?: string | undefined;
101
+ category?: string | undefined;
102
+ tags?: string[] | undefined;
103
+ parent?: string | undefined;
258
104
  } | undefined;
259
- } | undefined;
260
- id: `lineset_${string}`;
261
- path: [number, number, number][];
262
- suctionDiameter: number;
263
- liquidDiameter: number;
264
- insulated: boolean;
265
- type: "lineset";
105
+ language: "bpy" | "three";
106
+ script: string;
107
+ params: Record<string, string | number | boolean>;
108
+ artifact: string;
109
+ manifest: {
110
+ bounds: {
111
+ min: [number, number, number];
112
+ max: [number, number, number];
113
+ };
114
+ params: {
115
+ id: string;
116
+ label?: string | undefined;
117
+ kind: "boolean" | "number" | "string";
118
+ default: string | number | boolean;
119
+ min?: number | undefined;
120
+ max?: number | undefined;
121
+ step?: number | undefined;
122
+ unit?: string | undefined;
123
+ options?: string[] | undefined;
124
+ }[];
125
+ parts: {
126
+ id: string;
127
+ label?: string | undefined;
128
+ type?: string | undefined;
129
+ bounds?: {
130
+ min: [number, number, number];
131
+ max: [number, number, number];
132
+ } | undefined;
133
+ }[];
134
+ surfaces: {
135
+ part?: string | undefined;
136
+ y: number;
137
+ polygon: [number, number][];
138
+ }[];
139
+ slots: {
140
+ id: string;
141
+ label?: string | undefined;
142
+ color?: string | undefined;
143
+ roughness?: number | undefined;
144
+ metalness?: number | undefined;
145
+ transparent?: boolean | undefined;
146
+ emissive?: boolean | undefined;
147
+ }[];
148
+ anchors: {
149
+ id: string;
150
+ position: [number, number, number];
151
+ normal?: [number, number, number] | undefined;
152
+ }[];
153
+ lights: {
154
+ id: string;
155
+ position: [number, number, number];
156
+ color: string;
157
+ intensity: number;
158
+ distance?: number | undefined;
159
+ spot?: {
160
+ direction: [number, number, number];
161
+ angle: number;
162
+ softness: number;
163
+ } | undefined;
164
+ shadows?: boolean | undefined;
165
+ glow?: {
166
+ size: number;
167
+ strength: number;
168
+ } | undefined;
169
+ }[];
170
+ undersides: {
171
+ part?: string | undefined;
172
+ polygon: [number, number][];
173
+ plane: [number, number, number, number];
174
+ }[];
175
+ animations: {
176
+ name: string;
177
+ duration: number;
178
+ }[];
179
+ cutters?: {
180
+ host: "ceiling" | "mounted" | "slab" | "wall";
181
+ polygon: number[][];
182
+ minY: number;
183
+ maxY: number;
184
+ }[] | undefined;
185
+ cutout: boolean;
186
+ collider: boolean;
187
+ shape?: {
188
+ tolerance: number;
189
+ bands: {
190
+ y0: number;
191
+ y1: number;
192
+ polygons: {
193
+ outer: [number, number][];
194
+ holes?: [number, number][][] | undefined;
195
+ }[];
196
+ }[];
197
+ } | undefined;
198
+ triangles: number;
199
+ coverage?: number | undefined;
200
+ uncovered?: {
201
+ min: [number, number];
202
+ max: [number, number];
203
+ }[] | undefined;
204
+ };
205
+ images?: {
206
+ artifact: string;
207
+ thumbnail: string;
208
+ floorPlan: string;
209
+ } | undefined;
210
+ } | undefined;
211
+ style: "cluster" | "dravidian-carved" | "faceted" | "fluted" | "lathe-turned" | "plain";
212
+ crossSection: "octagonal" | "rectangular" | "round" | "sixteen-sided" | "square";
213
+ height: number;
214
+ radius: number;
215
+ width: number;
216
+ depth: number;
217
+ edgeSoftness: number;
218
+ baseHeight: number;
219
+ capitalHeight: number;
220
+ shaftProfile: "baluster" | "bulged" | "hourglass" | "straight" | "tapered";
221
+ shaftTaper: number;
222
+ shaftBulge: number;
223
+ shaftStartScale: number;
224
+ shaftEndScale: number;
225
+ shaftSegmentCount: number;
226
+ shaftTwistStep: number;
227
+ shaftCornerRadius: number;
228
+ shaftDetail: "fluted" | "lathe-turned" | "none" | "panelled" | "spiral";
229
+ baseStyle: "lotus" | "none" | "panelled-pedestal" | "ribbed-lotus" | "round-rings" | "simple-square" | "square-plinth" | "stepped-square";
230
+ baseWidthScale: number;
231
+ baseDepthScale: number;
232
+ baseTierCount: number;
233
+ baseStepSpread: number;
234
+ basePlinthHeightRatio: number;
235
+ baseRoundBandScale: number;
236
+ baseNeckScale: number;
237
+ baseRoundBandCount: number;
238
+ baseRibCount: number;
239
+ baseCarvingLevel: number;
240
+ basePanelInset: number;
241
+ capitalStyle: "corinthian-leaf" | "doric" | "ionic-volute" | "leaf-carved" | "none" | "rounded" | "simple" | "simple-slab" | "south-indian-bracket" | "stepped" | "volute" | "wood-bracket";
242
+ capitalWidthScale: number;
243
+ capitalDepthScale: number;
244
+ capitalTierCount: number;
245
+ capitalStepSpread: number;
246
+ capitalBandCount: number;
247
+ voluteSize: number;
248
+ voluteCount: number;
249
+ leafCount: number;
250
+ leafRows: number;
251
+ bracketDepth: number;
252
+ bracketTierCount: number;
253
+ pendantCount: number;
254
+ capitalCarvingLevel: number;
255
+ ringCount: number;
256
+ ringPlacement: "bottom" | "ends" | "even" | "top";
257
+ ringThickness: number;
258
+ ringSpread: number;
259
+ fluteCount: number;
260
+ fluteDepth: number;
261
+ fluteWidth: number;
262
+ spiralTwist: number;
263
+ spiralRibCount: number;
264
+ panelCount: number;
265
+ panelInsetDepth: number;
266
+ panelShape: "arched" | "diamond" | "rectangle";
267
+ latheRingCount: number;
268
+ latheRingSpacing: "bottom" | "ends" | "even" | "top";
269
+ carvingLevel: number;
270
+ carvingPlacement: "all" | "base" | "capital" | "shaft";
271
+ lowerBandEnabled: boolean;
272
+ lowerBandHeight: number;
273
+ lowerBandCarvingLevel: number;
274
+ dentilCount: number;
275
+ beadCount: number;
276
+ supportStyle: "a-frame" | "box-frame" | "k-brace" | "portal-frame" | "single-strut" | "trestle" | "tripod" | "v-frame" | "vertical" | "x-brace" | "y-frame";
277
+ braceWidth: number;
278
+ braceDepth: number;
279
+ braceBottomSpread: number;
280
+ braceTopSpread: number;
281
+ bracePlateEnabled: boolean;
282
+ role?: "ornament" | "post" | undefined;
283
+ postBase?: "none" | "pier" | "post-base" | undefined;
284
+ material?: {
285
+ id?: string | undefined;
286
+ preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
287
+ properties?: {
288
+ color: string;
289
+ roughness: number;
290
+ metalness: number;
291
+ opacity: number;
292
+ transparent: boolean;
293
+ side: "back" | "double" | "front";
294
+ } | undefined;
295
+ texture?: {
296
+ url: string;
297
+ repeat?: [number, number] | undefined;
298
+ scale?: number | undefined;
299
+ offset?: [number, number] | undefined;
300
+ normalMap?: string | undefined;
301
+ normalScale?: number | undefined;
302
+ bumpMap?: string | undefined;
303
+ bumpScale?: number | undefined;
304
+ } | undefined;
305
+ } | undefined;
306
+ materialPreset?: string | undefined;
307
+ slots?: Record<string, string> | undefined;
308
+ type: "column";
266
309
  } | {
267
310
  object: "node";
268
311
  name?: string | undefined;
@@ -287,13 +330,29 @@ export declare function absorbWallSeparators(nodes: SceneNodes, levelId: string,
287
330
  fromIds: string[];
288
331
  } | undefined;
289
332
  } | undefined;
290
- id: `pipe-trap_${string}`;
333
+ id: `duct-fitting_${string}`;
291
334
  position: [number, number, number];
292
- rotation: number;
335
+ rotation: [number, number, number];
336
+ fittingType: "access-panel" | "coupling" | "cross" | "damper" | "elbow" | "end-cap" | "reducer" | "tee" | "transition";
337
+ shape: "oval" | "rect" | "round";
338
+ inletShape?: "oval" | "rect" | "round" | undefined;
339
+ outletShape?: "oval" | "rect" | "round" | undefined;
340
+ width: number;
341
+ height: number;
342
+ shape2: "oval" | "rect" | "round";
343
+ width2: number;
344
+ height2: number;
345
+ angle: number;
346
+ branchAngle: number;
293
347
  diameter: number;
294
- pipeMaterial: "abs" | "cast-iron" | "pvc";
295
- armLengthM: number;
296
- type: "pipe-trap";
348
+ diameter2: number;
349
+ ductMaterial: "duct-board" | "flex" | "sheet-metal";
350
+ system: "return" | "supply";
351
+ damperAngle: number;
352
+ panelWidth: number;
353
+ panelHeight: number;
354
+ slots?: Record<string, string> | undefined;
355
+ type: "duct-fitting";
297
356
  } | {
298
357
  object: "node";
299
358
  name?: string | undefined;
@@ -318,354 +377,58 @@ export declare function absorbWallSeparators(nodes: SceneNodes, levelId: string,
318
377
  fromIds: string[];
319
378
  } | undefined;
320
379
  } | undefined;
321
- id: `rseg_${string}`;
322
- material?: {
323
- id?: string | undefined;
324
- preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
325
- properties?: {
326
- color: string;
327
- roughness: number;
328
- metalness: number;
329
- opacity: number;
330
- transparent: boolean;
331
- side: "back" | "double" | "front";
332
- } | undefined;
333
- texture?: {
334
- url: string;
335
- repeat?: [number, number] | undefined;
336
- scale?: number | undefined;
337
- offset?: [number, number] | undefined;
338
- normalMap?: string | undefined;
339
- normalScale?: number | undefined;
340
- bumpMap?: string | undefined;
341
- bumpScale?: number | undefined;
342
- } | undefined;
343
- } | undefined;
344
- 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;
365
- } | undefined;
366
- } | 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";
378
- } | 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;
388
- } | undefined;
389
- } | 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;
380
+ id: `hvac-equipment_${string}`;
414
381
  position: [number, number, number];
415
382
  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;
383
+ supportSlabId?: string | undefined;
384
+ equipmentType: "air-handler" | "condenser" | "furnace";
450
385
  width: number;
451
386
  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?: {
387
+ height: number;
388
+ supplyShape: "oval" | "rect" | "round";
389
+ returnShape: "oval" | "rect" | "round";
390
+ supplyDiameter: number;
391
+ returnDiameter: number;
392
+ supplyWidth: number;
393
+ supplyHeight: number;
394
+ returnWidth: number;
395
+ returnHeight: number;
396
+ type: "hvac-equipment";
397
+ } | {
398
+ object: "node";
399
+ name?: string | undefined;
400
+ parentId: string | null;
401
+ visible: boolean;
402
+ camera?: {
524
403
  position: [number, number, number];
525
- rotation: number;
404
+ target: [number, number, number];
405
+ mode: "orthographic" | "perspective";
406
+ fov?: number | undefined;
407
+ zoom?: number | undefined;
526
408
  } | 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;
409
+ metadata: Record<string, unknown>;
410
+ provenance?: {
411
+ refs: {
412
+ ns?: string | undefined;
413
+ id: string;
414
+ role?: "absorbed" | "alias" | "derived" | "piece" | "primary" | undefined;
415
+ }[];
416
+ lineage?: {
417
+ op: "attach" | "convert" | "duplicate" | "import" | "make-independent" | "merge" | "promote" | "split";
418
+ fromIds: string[];
558
419
  } | undefined;
559
420
  } | 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";
641
- } | {
642
- object: "node";
643
- name?: string | undefined;
644
- parentId: string | null;
645
- visible: boolean;
646
- camera?: {
647
- position: [number, number, number];
648
- target: [number, number, number];
649
- mode: "orthographic" | "perspective";
650
- fov?: number | undefined;
651
- zoom?: number | undefined;
652
- } | undefined;
653
- metadata: Record<string, unknown>;
654
- provenance?: {
655
- refs: {
656
- ns?: string | undefined;
657
- id: string;
658
- role?: "absorbed" | "alias" | "derived" | "piece" | "primary" | undefined;
659
- }[];
660
- lineage?: {
661
- op: "attach" | "convert" | "duplicate" | "import" | "make-independent" | "merge" | "promote" | "split";
662
- fromIds: string[];
663
- } | undefined;
664
- } | undefined;
665
- id: `separator_${string}`;
666
- start: [number, number];
667
- end: [number, number];
668
- type: "separator";
421
+ id: `pipe-fitting_${string}`;
422
+ position: [number, number, number];
423
+ rotation: [number, number, number];
424
+ fittingType: "cleanout" | "coupling" | "cross" | "elbow" | "end-cap" | "reducer" | "sanitary-tee" | "wye";
425
+ angle: number;
426
+ diameter: number;
427
+ diameter2: number;
428
+ cleanoutStyle: "end" | "inline";
429
+ pipeMaterial: "abs" | "cast-iron" | "pvc";
430
+ system: "vent" | "waste";
431
+ type: "pipe-fitting";
669
432
  } | {
670
433
  object: "node";
671
434
  name?: string | undefined;
@@ -690,92 +453,202 @@ export declare function absorbWallSeparators(nodes: SceneNodes, levelId: string,
690
453
  fromIds: string[];
691
454
  } | undefined;
692
455
  } | 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;
703
- camera?: {
704
- position: [number, number, number];
705
- target: [number, number, number];
706
- mode: "orthographic" | "perspective";
707
- fov?: number | undefined;
708
- zoom?: number | undefined;
456
+ id: `site_${string}`;
457
+ polygon: {
458
+ type: "polygon";
459
+ points: [number, number][];
460
+ };
461
+ terrain?: {
462
+ type: "heightfield";
463
+ origin: [number, number];
464
+ spacing: number;
465
+ cols: number;
466
+ rows: number;
467
+ step: number;
468
+ heights: string;
709
469
  } | undefined;
710
- metadata: Record<string, unknown>;
711
- provenance?: {
712
- refs: {
713
- ns?: string | undefined;
714
- id: string;
715
- role?: "absorbed" | "alias" | "derived" | "piece" | "primary" | undefined;
716
- }[];
717
- lineage?: {
718
- op: "attach" | "convert" | "duplicate" | "import" | "make-independent" | "merge" | "promote" | "split";
719
- fromIds: string[];
470
+ showGround?: boolean | undefined;
471
+ presentation?: {
472
+ theme?: string | undefined;
473
+ exposure?: number | undefined;
474
+ shading?: "rendered" | "solid" | undefined;
475
+ edges?: "off" | "soft" | "strong" | undefined;
476
+ shadows?: boolean | undefined;
477
+ lighting?: {
478
+ background?: string | undefined;
479
+ backgroundSky?: string | null | undefined;
480
+ ground?: string | undefined;
481
+ ambient?: {
482
+ color: string;
483
+ intensity: number;
484
+ } | undefined;
485
+ hemi?: {
486
+ sky: string;
487
+ ground: string;
488
+ intensity: number;
489
+ } | undefined;
490
+ lights?: {
491
+ color: string;
492
+ intensity: number;
493
+ position: [number, number, number];
494
+ target?: [number, number, number] | undefined;
495
+ castShadow?: boolean | undefined;
496
+ shadow?: {
497
+ intensity?: number | undefined;
498
+ bias?: number | undefined;
499
+ normalBias?: number | undefined;
500
+ radius?: number | undefined;
501
+ mapSize?: 512 | 1024 | 2048 | 4096 | undefined;
502
+ camera?: {
503
+ left: number;
504
+ right: number;
505
+ top: number;
506
+ bottom: number;
507
+ near: number;
508
+ far: number;
509
+ } | undefined;
510
+ } | undefined;
511
+ }[] | undefined;
512
+ environment?: {
513
+ source: "gradient" | "none" | "room";
514
+ intensity: number;
515
+ } | undefined;
720
516
  } | undefined;
721
- } | undefined;
722
- id: `sseg_${string}`;
723
- material?: {
724
- id?: string | undefined;
725
- preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
726
- properties?: {
727
- color: string;
728
- roughness: number;
729
- metalness: number;
730
- opacity: number;
731
- transparent: boolean;
732
- side: "back" | "double" | "front";
517
+ postprocessing?: {
518
+ ambientOcclusion?: boolean | undefined;
519
+ colorGrading?: boolean | undefined;
733
520
  } | undefined;
734
- texture?: {
735
- url: string;
736
- repeat?: [number, number] | undefined;
737
- scale?: number | undefined;
738
- offset?: [number, number] | undefined;
739
- normalMap?: string | undefined;
740
- normalScale?: number | undefined;
741
- bumpMap?: string | undefined;
742
- bumpScale?: number | undefined;
521
+ display?: {
522
+ mode?: "construction" | "finished" | "systems" | undefined;
523
+ families?: Partial<Record<"device" | "exposed-structure" | "fill" | "finish" | "foundation" | "framing" | "inspection" | "insulation" | "masonry" | "membrane" | "run" | "service-space" | "sheathing", boolean>> | undefined;
524
+ disciplines?: Partial<Record<"electrical" | "fire" | "low-voltage" | "mechanical" | "plumbing", boolean>> | undefined;
525
+ xray?: boolean | undefined;
526
+ colorBy?: "material" | "service" | undefined;
743
527
  } | undefined;
744
528
  } | undefined;
745
- materialPreset?: string | undefined;
746
- slots?: Record<string, string> | undefined;
747
- position: [number, number, number];
748
- rotation: number;
749
- segmentType: "landing" | "stair";
750
- width: number;
751
- length: number;
752
- 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;
766
- } | undefined;
767
- winder?: {
768
- turn: "left" | "right";
769
- innerGap: number;
770
- walkingLineOffset: number;
771
- division: "equal-angle" | "equal-going";
529
+ address?: {
530
+ street?: string | undefined;
531
+ city?: string | undefined;
532
+ state?: string | undefined;
533
+ zip?: string | undefined;
772
534
  } | undefined;
773
- thickness: number;
774
- type: "stair-segment";
775
- } | {
776
- object: "node";
777
- name?: string | undefined;
778
- parentId: string | null;
535
+ parcel?: {
536
+ apn?: string | undefined;
537
+ source?: string | undefined;
538
+ county?: string | undefined;
539
+ state?: string | undefined;
540
+ lotAreaSqFt?: number | undefined;
541
+ originLngLat?: [number, number] | undefined;
542
+ resolvedAt?: string | undefined;
543
+ layer?: string | undefined;
544
+ notes?: string[] | undefined;
545
+ } | undefined;
546
+ setbacks?: {
547
+ front: number;
548
+ side: number;
549
+ rear: number;
550
+ left?: number | undefined;
551
+ right?: number | undefined;
552
+ streetSide?: number | undefined;
553
+ } | undefined;
554
+ setbacksSource?: string | undefined;
555
+ zone?: string | undefined;
556
+ frontEdge?: number | undefined;
557
+ streetEdges?: number[] | undefined;
558
+ sightTriangleFt?: number | undefined;
559
+ northRotation?: number | undefined;
560
+ dossier?: {
561
+ [x: string]: unknown;
562
+ provider: string;
563
+ asOf: string;
564
+ point?: {
565
+ lat?: number | undefined;
566
+ lng?: number | undefined;
567
+ source?: string | undefined;
568
+ } | undefined;
569
+ address?: {
570
+ formatted?: string | undefined;
571
+ precision?: string | undefined;
572
+ } | undefined;
573
+ sections: Record<string, {
574
+ [x: string]: unknown;
575
+ status: string;
576
+ summary?: string | undefined;
577
+ reason?: string | undefined;
578
+ source?: {
579
+ name?: string | undefined;
580
+ kind?: string | undefined;
581
+ vintage?: string | undefined;
582
+ attribution?: string | undefined;
583
+ } | undefined;
584
+ }>;
585
+ parcel?: Record<string, unknown> | undefined;
586
+ flood?: Record<string, unknown> | undefined;
587
+ codeBasis?: Record<string, unknown> | undefined;
588
+ zoning?: Record<string, unknown> | undefined;
589
+ utilities?: Record<string, unknown> | undefined;
590
+ soils?: Record<string, unknown> | undefined;
591
+ wetlands?: Record<string, unknown> | undefined;
592
+ structures?: Record<string, unknown> | undefined;
593
+ elevation?: Record<string, unknown> | undefined;
594
+ boundaries?: Record<string, unknown> | undefined;
595
+ } | undefined;
596
+ contourIntervalIn?: number | undefined;
597
+ contours3d?: boolean | undefined;
598
+ terrainContours?: {
599
+ datum: string;
600
+ intervalFt: number;
601
+ source?: string | undefined;
602
+ lines: {
603
+ elevationFt: number;
604
+ points: [number, number][];
605
+ }[];
606
+ } | undefined;
607
+ wallTypes?: {
608
+ id: string;
609
+ label: string;
610
+ assembly: {
611
+ layers: {
612
+ id: string;
613
+ role: "air" | "covering" | "deck" | "fill" | "finish" | "furring" | "glazing" | "insulation" | "lining" | "membrane" | "sheathing" | "shell" | "structure" | "substrate" | "underlay";
614
+ thickness: number;
615
+ core?: true | undefined;
616
+ spacing?: number | undefined;
617
+ material?: string | undefined;
618
+ slot?: string | undefined;
619
+ returns?: boolean | undefined;
620
+ display?: "construction" | "finished" | undefined;
621
+ inset?: number | undefined;
622
+ bottom?: number | undefined;
623
+ lift?: number | undefined;
624
+ src?: string | undefined;
625
+ }[];
626
+ backing?: {
627
+ id: string;
628
+ role: "air" | "covering" | "deck" | "fill" | "finish" | "furring" | "glazing" | "insulation" | "lining" | "membrane" | "sheathing" | "shell" | "structure" | "substrate" | "underlay";
629
+ thickness: number;
630
+ core?: true | undefined;
631
+ spacing?: number | undefined;
632
+ material?: string | undefined;
633
+ slot?: string | undefined;
634
+ returns?: boolean | undefined;
635
+ display?: "construction" | "finished" | undefined;
636
+ inset?: number | undefined;
637
+ bottom?: number | undefined;
638
+ lift?: number | undefined;
639
+ src?: string | undefined;
640
+ }[] | undefined;
641
+ face?: "exterior" | "front" | undefined;
642
+ presetId?: string | undefined;
643
+ cavityInsulation?: string | undefined;
644
+ };
645
+ }[] | undefined;
646
+ children: string[];
647
+ type: "site";
648
+ } | {
649
+ object: "node";
650
+ name?: string | undefined;
651
+ parentId: string | null;
779
652
  visible: boolean;
780
653
  camera?: {
781
654
  position: [number, number, number];
@@ -796,249 +669,20 @@ export declare function absorbWallSeparators(nodes: SceneNodes, levelId: string,
796
669
  fromIds: string[];
797
670
  } | undefined;
798
671
  } | undefined;
799
- id: `window_${string}`;
800
- material?: {
801
- id?: string | undefined;
802
- preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
803
- properties?: {
804
- color: string;
805
- roughness: number;
806
- metalness: number;
807
- opacity: number;
808
- transparent: boolean;
809
- side: "back" | "double" | "front";
810
- } | undefined;
811
- texture?: {
812
- url: string;
813
- repeat?: [number, number] | undefined;
814
- scale?: number | undefined;
815
- offset?: [number, number] | undefined;
816
- normalMap?: string | undefined;
817
- normalScale?: number | undefined;
818
- bumpMap?: string | undefined;
819
- bumpScale?: number | undefined;
820
- } | undefined;
821
- } | 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;
830
- } | 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];
882
- color: string;
883
- 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;
894
- } | 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
- }[] | 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
- }[];
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;
935
- } | undefined;
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";
984
- } | 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";
1004
- } | {
1005
- object: "node";
1006
- name?: string | undefined;
1007
- parentId: string | null;
1008
- visible: boolean;
1009
- camera?: {
1010
- position: [number, number, number];
1011
- target: [number, number, number];
1012
- mode: "orthographic" | "perspective";
1013
- fov?: number | undefined;
1014
- zoom?: number | undefined;
1015
- } | undefined;
1016
- metadata: Record<string, unknown>;
1017
- provenance?: {
1018
- refs: {
1019
- ns?: string | undefined;
1020
- id: string;
1021
- role?: "absorbed" | "alias" | "derived" | "piece" | "primary" | undefined;
1022
- }[];
1023
- lineage?: {
1024
- op: "attach" | "convert" | "duplicate" | "import" | "make-independent" | "merge" | "promote" | "split";
1025
- fromIds: string[];
1026
- } | undefined;
1027
- } | undefined;
1028
- type: "item";
1029
- id: `item_${string}`;
1030
- position: [number, number, number];
1031
- rotation: [number, number, number];
1032
- scale: [number, number, number];
1033
- side?: "back" | "front" | undefined;
1034
- children: string[];
1035
- wallId?: string | undefined;
1036
- wallT?: number | undefined;
1037
- roofSegmentId?: string | undefined;
1038
- roofFace?: "back" | "front" | "left" | "right" | undefined;
1039
- blockFaceId?: string | undefined;
1040
- supportSlabId?: string | undefined;
1041
- collectionIds?: `collection_${string}`[] | undefined;
672
+ type: "item";
673
+ id: `item_${string}`;
674
+ position: [number, number, number];
675
+ rotation: [number, number, number];
676
+ scale: [number, number, number];
677
+ side?: "back" | "front" | undefined;
678
+ children: string[];
679
+ wallId?: string | undefined;
680
+ wallT?: number | undefined;
681
+ roofSegmentId?: string | undefined;
682
+ roofFace?: "back" | "front" | "left" | "right" | undefined;
683
+ blockFaceId?: string | undefined;
684
+ supportSlabId?: string | undefined;
685
+ collectionIds?: `collection_${string}`[] | undefined;
1042
686
  slots?: Record<string, string> | undefined;
1043
687
  source?: {
1044
688
  kind: "script";
@@ -1476,11 +1120,30 @@ export declare function absorbWallSeparators(nodes: SceneNodes, levelId: string,
1476
1120
  fromIds: string[];
1477
1121
  } | undefined;
1478
1122
  } | undefined;
1479
- id: `column_${string}`;
1480
- children: string[];
1481
- position: [number, number, number];
1482
- rotation: number;
1483
- supportSlabId?: string | undefined;
1123
+ id: `window_${string}`;
1124
+ material?: {
1125
+ id?: string | undefined;
1126
+ preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
1127
+ properties?: {
1128
+ color: string;
1129
+ roughness: number;
1130
+ metalness: number;
1131
+ opacity: number;
1132
+ transparent: boolean;
1133
+ side: "back" | "double" | "front";
1134
+ } | undefined;
1135
+ texture?: {
1136
+ url: string;
1137
+ repeat?: [number, number] | undefined;
1138
+ scale?: number | undefined;
1139
+ offset?: [number, number] | undefined;
1140
+ normalMap?: string | undefined;
1141
+ normalScale?: number | undefined;
1142
+ bumpMap?: string | undefined;
1143
+ bumpScale?: number | undefined;
1144
+ } | undefined;
1145
+ } | undefined;
1146
+ slots?: Record<string, string> | undefined;
1484
1147
  source?: {
1485
1148
  kind: "script";
1486
1149
  meta?: {
@@ -1595,106 +1258,75 @@ export declare function absorbWallSeparators(nodes: SceneNodes, levelId: string,
1595
1258
  floorPlan: string;
1596
1259
  } | undefined;
1597
1260
  } | undefined;
1598
- style: "cluster" | "dravidian-carved" | "faceted" | "fluted" | "lathe-turned" | "plain";
1599
- crossSection: "octagonal" | "rectangular" | "round" | "sixteen-sided" | "square";
1600
- height: number;
1601
- radius: number;
1261
+ position: [number, number, number];
1262
+ rotation: [number, number, number];
1263
+ side?: "back" | "front" | undefined;
1264
+ verticalAnchor?: "floor" | "wall" | undefined;
1265
+ floorThresholdVersion: 0 | 1;
1266
+ wallId?: string | undefined;
1267
+ dormerId?: string | undefined;
1268
+ dormerFace?: "back" | "front" | "left" | "right" | undefined;
1269
+ roofSegmentId?: string | undefined;
1270
+ roofFace?: "back" | "front" | "left" | "right" | undefined;
1602
1271
  width: number;
1603
- depth: number;
1604
- edgeSoftness: number;
1605
- baseHeight: number;
1606
- capitalHeight: number;
1607
- shaftProfile: "baluster" | "bulged" | "hourglass" | "straight" | "tapered";
1608
- shaftTaper: number;
1609
- shaftBulge: number;
1610
- shaftStartScale: number;
1611
- shaftEndScale: number;
1612
- shaftSegmentCount: number;
1613
- shaftTwistStep: number;
1614
- shaftCornerRadius: number;
1615
- shaftDetail: "fluted" | "lathe-turned" | "none" | "panelled" | "spiral";
1616
- baseStyle: "lotus" | "none" | "panelled-pedestal" | "ribbed-lotus" | "round-rings" | "simple-square" | "square-plinth" | "stepped-square";
1617
- baseWidthScale: number;
1618
- baseDepthScale: number;
1619
- baseTierCount: number;
1620
- baseStepSpread: number;
1621
- basePlinthHeightRatio: number;
1622
- baseRoundBandScale: number;
1623
- baseNeckScale: number;
1624
- baseRoundBandCount: number;
1625
- baseRibCount: number;
1626
- baseCarvingLevel: number;
1627
- basePanelInset: number;
1628
- capitalStyle: "corinthian-leaf" | "doric" | "ionic-volute" | "leaf-carved" | "none" | "rounded" | "simple" | "simple-slab" | "south-indian-bracket" | "stepped" | "volute" | "wood-bracket";
1629
- capitalWidthScale: number;
1630
- capitalDepthScale: number;
1631
- capitalTierCount: number;
1632
- capitalStepSpread: number;
1633
- capitalBandCount: number;
1634
- voluteSize: number;
1635
- voluteCount: number;
1636
- leafCount: number;
1637
- leafRows: number;
1638
- bracketDepth: number;
1639
- bracketTierCount: number;
1640
- pendantCount: number;
1641
- capitalCarvingLevel: number;
1642
- ringCount: number;
1643
- ringPlacement: "bottom" | "ends" | "even" | "top";
1644
- ringThickness: number;
1645
- ringSpread: number;
1646
- fluteCount: number;
1647
- fluteDepth: number;
1648
- fluteWidth: number;
1649
- spiralTwist: number;
1650
- spiralRibCount: number;
1651
- panelCount: number;
1652
- panelInsetDepth: number;
1653
- panelShape: "arched" | "diamond" | "rectangle";
1654
- latheRingCount: number;
1655
- latheRingSpacing: "bottom" | "ends" | "even" | "top";
1656
- carvingLevel: number;
1657
- carvingPlacement: "all" | "base" | "capital" | "shaft";
1658
- lowerBandEnabled: boolean;
1659
- lowerBandHeight: number;
1660
- lowerBandCarvingLevel: number;
1661
- dentilCount: number;
1662
- beadCount: number;
1663
- supportStyle: "a-frame" | "box-frame" | "k-brace" | "portal-frame" | "single-strut" | "trestle" | "tripod" | "v-frame" | "vertical" | "x-brace" | "y-frame";
1664
- braceWidth: number;
1665
- braceDepth: number;
1666
- braceBottomSpread: number;
1667
- braceTopSpread: number;
1668
- bracePlateEnabled: boolean;
1669
- role?: "ornament" | "post" | undefined;
1670
- postBase?: "none" | "pier" | "post-base" | undefined;
1671
- material?: {
1672
- id?: string | undefined;
1673
- preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
1674
- properties?: {
1675
- color: string;
1676
- roughness: number;
1677
- metalness: number;
1678
- opacity: number;
1679
- transparent: boolean;
1680
- side: "back" | "double" | "front";
1681
- } | undefined;
1682
- texture?: {
1683
- url: string;
1684
- repeat?: [number, number] | undefined;
1685
- scale?: number | undefined;
1686
- offset?: [number, number] | undefined;
1687
- normalMap?: string | undefined;
1688
- normalScale?: number | undefined;
1689
- bumpMap?: string | undefined;
1690
- bumpScale?: number | undefined;
1691
- } | undefined;
1692
- } | undefined;
1693
- materialPreset?: string | undefined;
1694
- slots?: Record<string, string> | undefined;
1695
- type: "column";
1696
- } | {
1697
- object: "node";
1272
+ height: number;
1273
+ mark?: string | undefined;
1274
+ constructionType: "framed" | "masonry";
1275
+ dimensionReference: "finish-opening" | "masonry-opening" | "nominal" | "rough-opening";
1276
+ roughOpeningWidth?: number | undefined;
1277
+ roughOpeningHeight?: number | undefined;
1278
+ masonryOpeningWidth?: number | undefined;
1279
+ masonryOpeningHeight?: number | undefined;
1280
+ finishOpeningWidth?: number | undefined;
1281
+ finishOpeningHeight?: number | undefined;
1282
+ openingKind: "opening" | "window";
1283
+ windowType: "awning" | "bay" | "bow" | "casement" | "double-hung" | "fixed" | "hopper" | "louvered" | "single-hung" | "sliding" | "tilt-turn";
1284
+ operationState: number;
1285
+ openingDirection?: "inward" | "outward" | undefined;
1286
+ tiltTurnMode?: "tilt" | "turn" | undefined;
1287
+ awningDirection: "down" | "up";
1288
+ casementStyle: "french" | "single";
1289
+ hingesSide: "left" | "right";
1290
+ openingShape: "arch" | "rectangle" | "rounded";
1291
+ openingRadiusMode: "all" | "individual";
1292
+ openingCornerRadii: [number, number, number, number];
1293
+ cornerRadius: number;
1294
+ archHeight: number;
1295
+ openingRevealRadius: number;
1296
+ frameThickness: number;
1297
+ frameDepth?: number | undefined;
1298
+ windowHandle?: boolean | undefined;
1299
+ sashGrid?: boolean | undefined;
1300
+ columnRatios: number[];
1301
+ rowRatios: number[];
1302
+ columnDividerThickness: number;
1303
+ rowDividerThickness: number;
1304
+ corner?: {
1305
+ end: "end" | "start";
1306
+ partnerId: string;
1307
+ post: "none" | "post";
1308
+ } | undefined;
1309
+ sill: boolean;
1310
+ sillDepth: number;
1311
+ sillThickness: number;
1312
+ sillOverhang?: number | undefined;
1313
+ sillInterior?: boolean | undefined;
1314
+ sillInteriorDepth?: number | undefined;
1315
+ sillInteriorThickness?: number | undefined;
1316
+ sillInteriorOverhang?: number | undefined;
1317
+ shutters?: "board-batten" | "louvered" | "none" | "panel" | undefined;
1318
+ shutterWidth?: number | undefined;
1319
+ shutterOpen?: number | undefined;
1320
+ shutterSides?: "both" | "left" | "right" | undefined;
1321
+ rollerShutter?: "box" | "concealed" | "none" | undefined;
1322
+ rollerShutterBoxHeight?: number | undefined;
1323
+ rollerShutterOpen?: number | undefined;
1324
+ casingFaceA?: boolean | undefined;
1325
+ casingFaceB?: boolean | undefined;
1326
+ casingWidth?: number | undefined;
1327
+ type: "window";
1328
+ } | {
1329
+ object: "node";
1698
1330
  name?: string | undefined;
1699
1331
  parentId: string | null;
1700
1332
  visible: boolean;
@@ -1717,7 +1349,7 @@ export declare function absorbWallSeparators(nodes: SceneNodes, levelId: string,
1717
1349
  fromIds: string[];
1718
1350
  } | undefined;
1719
1351
  } | undefined;
1720
- id: `roof_${string}`;
1352
+ id: `rseg_${string}`;
1721
1353
  material?: {
1722
1354
  id?: string | undefined;
1723
1355
  preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
@@ -1810,6 +1442,153 @@ export declare function absorbWallSeparators(nodes: SceneNodes, levelId: string,
1810
1442
  } | undefined;
1811
1443
  } | undefined;
1812
1444
  wallMaterialPreset?: string | undefined;
1445
+ position: [number, number, number];
1446
+ rotation: number;
1447
+ roofType: "barrel" | "conical" | "dutch" | "flat" | "gable" | "gambrel" | "hip" | "mansard" | "shed";
1448
+ barrelRise?: number | undefined;
1449
+ barrelSegments?: number | undefined;
1450
+ roofSystem?: "glazed" | "standard" | undefined;
1451
+ glazing?: {
1452
+ across: {
1453
+ layout: "count" | "fixed-spacing" | "maximum-spacing";
1454
+ count: number;
1455
+ spacing: number;
1456
+ alignment: "center" | "end" | "start";
1457
+ };
1458
+ along: {
1459
+ layout: "count" | "fixed-spacing" | "maximum-spacing";
1460
+ count: number;
1461
+ spacing: number;
1462
+ alignment: "center" | "end" | "start";
1463
+ };
1464
+ frameWidth: number;
1465
+ frameDepth: number;
1466
+ glassThickness: number;
1467
+ frameColor: string;
1468
+ glassColor: string;
1469
+ glassOpacity: number;
1470
+ glassRoughness: number;
1471
+ glazedEnds: boolean;
1472
+ panelType: "empty" | "glass" | "solid";
1473
+ panels: {
1474
+ face: string;
1475
+ column: number;
1476
+ row: number;
1477
+ type: "empty" | "glass" | "solid";
1478
+ }[];
1479
+ } | undefined;
1480
+ slots?: Record<string, string> | undefined;
1481
+ width: number;
1482
+ depth: number;
1483
+ conicalStartAngle?: number | undefined;
1484
+ conicalSweepAngle?: number | undefined;
1485
+ conicalFullCircle?: boolean | undefined;
1486
+ trim: {
1487
+ left: number;
1488
+ right: number;
1489
+ front: number;
1490
+ back: number;
1491
+ frontLeft: number;
1492
+ frontRight: number;
1493
+ backLeft: number;
1494
+ backRight: number;
1495
+ frontLeftX: number;
1496
+ frontLeftZ: number;
1497
+ frontRightX: number;
1498
+ frontRightZ: number;
1499
+ backLeftX: number;
1500
+ backLeftZ: number;
1501
+ backRightX: number;
1502
+ backRightZ: number;
1503
+ };
1504
+ wallHeight: number;
1505
+ pitch: number;
1506
+ wallThickness: number;
1507
+ deckThickness: number;
1508
+ overhang: number;
1509
+ gableOverhang?: number | undefined;
1510
+ shingleThickness: number;
1511
+ buildUp?: {
1512
+ presetId?: string | undefined;
1513
+ roofing: {
1514
+ kind: "architectural-shingle" | "asphalt-3-tab" | "clay-tile" | "concrete-tile" | "slate" | "standing-seam-metal" | "wood-shake";
1515
+ thickness: number;
1516
+ name?: string | undefined;
1517
+ };
1518
+ underlayment?: {
1519
+ kind: "felt-15" | "felt-30" | "ice-and-water" | "synthetic";
1520
+ thickness: number;
1521
+ name?: string | undefined;
1522
+ } | undefined;
1523
+ sheathing: {
1524
+ kind: "osb" | "plywood";
1525
+ thickness: number;
1526
+ name?: string | undefined;
1527
+ };
1528
+ structure: {
1529
+ system: "rafters" | "trusses";
1530
+ size: "2x10" | "2x12" | "2x4" | "2x6" | "2x8";
1531
+ spacing: number;
1532
+ };
1533
+ insulation?: {
1534
+ kind: "batt" | "blown" | "rigid";
1535
+ thickness: number;
1536
+ name?: string | undefined;
1537
+ } | undefined;
1538
+ finish?: {
1539
+ kind: "drywall" | "plaster" | "wood-plank";
1540
+ thickness: number;
1541
+ name?: string | undefined;
1542
+ } | undefined;
1543
+ } | undefined;
1544
+ arc?: {
1545
+ centerX: number;
1546
+ centerZ: number;
1547
+ radius: number;
1548
+ } | undefined;
1549
+ shedSideInfillSpan?: number | undefined;
1550
+ shedSideInfillMinX?: number | undefined;
1551
+ shedSideInfillMaxX?: number | undefined;
1552
+ shedFootprintPieces?: [number, number][][] | undefined;
1553
+ shedOpenEndSides?: ("left" | "right")[] | undefined;
1554
+ shedJointFrame?: {
1555
+ position: [number, number, number];
1556
+ rotation: number;
1557
+ } | undefined;
1558
+ shedJointOwnerId?: string | undefined;
1559
+ shedJointNeighborIds?: string[] | undefined;
1560
+ shedJointScopeId?: string | undefined;
1561
+ managedByParent: boolean;
1562
+ wallShell: "auto" | "include" | "omit";
1563
+ shedInsetEndPanels: boolean;
1564
+ fascia?: boolean | undefined;
1565
+ eaveCut?: "plumb" | "plumb-level" | "square" | undefined;
1566
+ fasciaHighEdge?: boolean | undefined;
1567
+ fasciaHeight?: number | undefined;
1568
+ fasciaDepth?: number | undefined;
1569
+ fasciaMaterial?: {
1570
+ id?: string | undefined;
1571
+ preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
1572
+ properties?: {
1573
+ color: string;
1574
+ roughness: number;
1575
+ metalness: number;
1576
+ opacity: number;
1577
+ transparent: boolean;
1578
+ side: "back" | "double" | "front";
1579
+ } | undefined;
1580
+ texture?: {
1581
+ url: string;
1582
+ repeat?: [number, number] | undefined;
1583
+ scale?: number | undefined;
1584
+ offset?: [number, number] | undefined;
1585
+ normalMap?: string | undefined;
1586
+ normalScale?: number | undefined;
1587
+ bumpMap?: string | undefined;
1588
+ bumpScale?: number | undefined;
1589
+ } | undefined;
1590
+ } | undefined;
1591
+ fasciaMaterialPreset?: string | undefined;
1813
1592
  heelMaterial?: {
1814
1593
  id?: string | undefined;
1815
1594
  preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
@@ -1833,56 +1612,253 @@ export declare function absorbWallSeparators(nodes: SceneNodes, levelId: string,
1833
1612
  } | undefined;
1834
1613
  } | undefined;
1835
1614
  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";
1615
+ gableLeftMaterial?: {
1616
+ id?: string | undefined;
1617
+ preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
1618
+ properties?: {
1619
+ color: string;
1620
+ roughness: number;
1621
+ metalness: number;
1622
+ opacity: number;
1623
+ transparent: boolean;
1624
+ side: "back" | "double" | "front";
1625
+ } | undefined;
1626
+ texture?: {
1627
+ url: string;
1628
+ repeat?: [number, number] | undefined;
1629
+ scale?: number | undefined;
1630
+ offset?: [number, number] | undefined;
1631
+ normalMap?: string | undefined;
1632
+ normalScale?: number | undefined;
1633
+ bumpMap?: string | undefined;
1634
+ bumpScale?: number | undefined;
1635
+ } | undefined;
1636
+ } | undefined;
1637
+ gableLeftMaterialPreset?: string | undefined;
1638
+ gableRightMaterial?: {
1639
+ id?: string | undefined;
1640
+ preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
1641
+ properties?: {
1642
+ color: string;
1643
+ roughness: number;
1644
+ metalness: number;
1645
+ opacity: number;
1646
+ transparent: boolean;
1647
+ side: "back" | "double" | "front";
1648
+ } | undefined;
1649
+ texture?: {
1650
+ url: string;
1651
+ repeat?: [number, number] | undefined;
1652
+ scale?: number | undefined;
1653
+ offset?: [number, number] | undefined;
1654
+ normalMap?: string | undefined;
1655
+ normalScale?: number | undefined;
1656
+ bumpMap?: string | undefined;
1657
+ bumpScale?: number | undefined;
1658
+ } | undefined;
1659
+ } | undefined;
1660
+ gableRightMaterialPreset?: string | undefined;
1661
+ gambrelLowerWidthRatio: number;
1662
+ gambrelLowerHeightRatio: number;
1663
+ mansardSteepWidthRatio: number;
1664
+ mansardSteepHeightRatio: number;
1665
+ dutchHipWidthRatio: number;
1666
+ dutchHipHeightRatio: number;
1667
+ dutchWaistLengthRatio: number;
1668
+ dutchGabletRake: number;
1669
+ dutchTopRakeThickness: number;
1670
+ children: string[];
1671
+ type: "roof-segment";
1672
+ } | {
1673
+ object: "node";
1674
+ name?: string | undefined;
1675
+ parentId: string | null;
1676
+ visible: boolean;
1677
+ camera?: {
1678
+ position: [number, number, number];
1679
+ target: [number, number, number];
1680
+ mode: "orthographic" | "perspective";
1681
+ fov?: number | undefined;
1682
+ zoom?: number | undefined;
1683
+ } | undefined;
1684
+ metadata: Record<string, unknown>;
1685
+ provenance?: {
1686
+ refs: {
1687
+ ns?: string | undefined;
1688
+ id: string;
1689
+ role?: "absorbed" | "alias" | "derived" | "piece" | "primary" | undefined;
1690
+ }[];
1691
+ lineage?: {
1692
+ op: "attach" | "convert" | "duplicate" | "import" | "make-independent" | "merge" | "promote" | "split";
1693
+ fromIds: string[];
1694
+ } | undefined;
1695
+ } | undefined;
1696
+ id: `roof_${string}`;
1697
+ material?: {
1698
+ id?: string | undefined;
1699
+ preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
1700
+ properties?: {
1701
+ color: string;
1702
+ roughness: number;
1703
+ metalness: number;
1704
+ opacity: number;
1705
+ transparent: boolean;
1706
+ side: "back" | "double" | "front";
1707
+ } | undefined;
1708
+ texture?: {
1709
+ url: string;
1710
+ repeat?: [number, number] | undefined;
1711
+ scale?: number | undefined;
1712
+ offset?: [number, number] | undefined;
1713
+ normalMap?: string | undefined;
1714
+ normalScale?: number | undefined;
1715
+ bumpMap?: string | undefined;
1716
+ bumpScale?: number | undefined;
1717
+ } | undefined;
1718
+ } | undefined;
1719
+ materialPreset?: string | undefined;
1720
+ topMaterial?: {
1721
+ id?: string | undefined;
1722
+ preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
1723
+ properties?: {
1724
+ color: string;
1725
+ roughness: number;
1726
+ metalness: number;
1727
+ opacity: number;
1728
+ transparent: boolean;
1729
+ side: "back" | "double" | "front";
1730
+ } | undefined;
1731
+ texture?: {
1732
+ url: string;
1733
+ repeat?: [number, number] | undefined;
1734
+ scale?: number | undefined;
1735
+ offset?: [number, number] | undefined;
1736
+ normalMap?: string | undefined;
1737
+ normalScale?: number | undefined;
1738
+ bumpMap?: string | undefined;
1739
+ bumpScale?: number | undefined;
1740
+ } | undefined;
1741
+ } | undefined;
1742
+ topMaterialPreset?: string | undefined;
1743
+ edgeMaterial?: {
1744
+ id?: string | undefined;
1745
+ preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
1746
+ properties?: {
1747
+ color: string;
1748
+ roughness: number;
1749
+ metalness: number;
1750
+ opacity: number;
1751
+ transparent: boolean;
1752
+ side: "back" | "double" | "front";
1753
+ } | undefined;
1754
+ texture?: {
1755
+ url: string;
1756
+ repeat?: [number, number] | undefined;
1757
+ scale?: number | undefined;
1758
+ offset?: [number, number] | undefined;
1759
+ normalMap?: string | undefined;
1760
+ normalScale?: number | undefined;
1761
+ bumpMap?: string | undefined;
1762
+ bumpScale?: number | undefined;
1763
+ } | undefined;
1764
+ } | undefined;
1765
+ edgeMaterialPreset?: string | undefined;
1766
+ wallMaterial?: {
1767
+ id?: string | undefined;
1768
+ preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
1769
+ properties?: {
1770
+ color: string;
1771
+ roughness: number;
1772
+ metalness: number;
1773
+ opacity: number;
1774
+ transparent: boolean;
1775
+ side: "back" | "double" | "front";
1776
+ } | undefined;
1777
+ texture?: {
1778
+ url: string;
1779
+ repeat?: [number, number] | undefined;
1780
+ scale?: number | undefined;
1781
+ offset?: [number, number] | undefined;
1782
+ normalMap?: string | undefined;
1783
+ normalScale?: number | undefined;
1784
+ bumpMap?: string | undefined;
1785
+ bumpScale?: number | undefined;
1786
+ } | undefined;
1787
+ } | undefined;
1788
+ wallMaterialPreset?: string | undefined;
1789
+ heelMaterial?: {
1790
+ id?: string | undefined;
1791
+ preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
1792
+ properties?: {
1793
+ color: string;
1794
+ roughness: number;
1795
+ metalness: number;
1796
+ opacity: number;
1797
+ transparent: boolean;
1798
+ side: "back" | "double" | "front";
1799
+ } | undefined;
1800
+ texture?: {
1801
+ url: string;
1802
+ repeat?: [number, number] | undefined;
1803
+ scale?: number | undefined;
1804
+ offset?: [number, number] | undefined;
1805
+ normalMap?: string | undefined;
1806
+ normalScale?: number | undefined;
1807
+ bumpMap?: string | undefined;
1808
+ bumpScale?: number | undefined;
1809
+ } | undefined;
1810
+ } | undefined;
1811
+ heelMaterialPreset?: string | undefined;
1812
+ position: [number, number, number];
1813
+ rotation: number;
1814
+ support: {
1815
+ kind: "level";
1816
+ } | {
1817
+ kind: "walls";
1818
+ } | {
1819
+ kind: "roof";
1820
+ roofSegmentId: `rseg_${string}`;
1821
+ localPosition: [number, number];
1822
+ curbHeight: number;
1823
+ };
1824
+ assembly?: {
1825
+ layers: {
1826
+ id: string;
1827
+ role: "air" | "covering" | "deck" | "fill" | "finish" | "furring" | "glazing" | "insulation" | "lining" | "membrane" | "sheathing" | "shell" | "structure" | "substrate" | "underlay";
1828
+ thickness: number;
1829
+ core?: true | undefined;
1830
+ spacing?: number | undefined;
1831
+ material?: string | undefined;
1832
+ slot?: string | undefined;
1833
+ returns?: boolean | undefined;
1834
+ display?: "construction" | "finished" | undefined;
1835
+ inset?: number | undefined;
1836
+ bottom?: number | undefined;
1837
+ lift?: number | undefined;
1838
+ src?: string | undefined;
1839
+ }[];
1840
+ backing?: {
1841
+ id: string;
1842
+ role: "air" | "covering" | "deck" | "fill" | "finish" | "furring" | "glazing" | "insulation" | "lining" | "membrane" | "sheathing" | "shell" | "structure" | "substrate" | "underlay";
1843
+ thickness: number;
1844
+ core?: true | undefined;
1845
+ spacing?: number | undefined;
1846
+ material?: string | undefined;
1847
+ slot?: string | undefined;
1848
+ returns?: boolean | undefined;
1849
+ display?: "construction" | "finished" | undefined;
1850
+ inset?: number | undefined;
1851
+ bottom?: number | undefined;
1852
+ lift?: number | undefined;
1853
+ src?: string | undefined;
1854
+ }[] | undefined;
1855
+ face?: "exterior" | "front" | undefined;
1856
+ presetId?: string | undefined;
1857
+ cavityInsulation?: string | undefined;
1858
+ } | undefined;
1859
+ slots?: Record<string, string> | undefined;
1860
+ children: string[];
1861
+ type: "roof";
1886
1862
  } | {
1887
1863
  object: "node";
1888
1864
  name?: string | undefined;
@@ -2436,6 +2412,7 @@ export declare function absorbWallSeparators(nodes: SceneNodes, levelId: string,
2436
2412
  } | undefined;
2437
2413
  justification?: "a" | "b" | undefined;
2438
2414
  height?: number | undefined;
2415
+ endHeightOffset?: number | undefined;
2439
2416
  curveOffset?: number | undefined;
2440
2417
  supportSlabId?: string | undefined;
2441
2418
  supportOffset?: number | undefined;
@@ -2738,15 +2715,79 @@ export declare function absorbWallSeparators(nodes: SceneNodes, levelId: string,
2738
2715
  fromIds: string[];
2739
2716
  } | undefined;
2740
2717
  } | undefined;
2741
- id: `fence_${string}`;
2742
- children: string[];
2743
- material?: {
2744
- id?: string | undefined;
2745
- preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
2746
- properties?: {
2747
- color: string;
2748
- roughness: number;
2749
- metalness: number;
2718
+ id: `separator_${string}`;
2719
+ start: [number, number];
2720
+ end: [number, number];
2721
+ type: "separator";
2722
+ } | {
2723
+ object: "node";
2724
+ name?: string | undefined;
2725
+ parentId: string | null;
2726
+ visible: boolean;
2727
+ camera?: {
2728
+ position: [number, number, number];
2729
+ target: [number, number, number];
2730
+ mode: "orthographic" | "perspective";
2731
+ fov?: number | undefined;
2732
+ zoom?: number | undefined;
2733
+ } | undefined;
2734
+ metadata: Record<string, unknown>;
2735
+ provenance?: {
2736
+ refs: {
2737
+ ns?: string | undefined;
2738
+ id: string;
2739
+ role?: "absorbed" | "alias" | "derived" | "piece" | "primary" | undefined;
2740
+ }[];
2741
+ lineage?: {
2742
+ op: "attach" | "convert" | "duplicate" | "import" | "make-independent" | "merge" | "promote" | "split";
2743
+ fromIds: string[];
2744
+ } | undefined;
2745
+ } | undefined;
2746
+ id: `floor-opening_${string}`;
2747
+ polygon: [number, number][];
2748
+ hostZoneId?: string | undefined;
2749
+ legacyPlateCuts?: Record<string, [number, number][][]> | undefined;
2750
+ legacyCeilingCuts?: Record<string, [number, number][][]> | undefined;
2751
+ source: string;
2752
+ ownerId?: string | undefined;
2753
+ surfaceId?: string | undefined;
2754
+ drawnOn: "ceiling" | "floor";
2755
+ cutsPrimary: boolean;
2756
+ cutsAdjacent: boolean;
2757
+ type: "floor-opening";
2758
+ } | {
2759
+ object: "node";
2760
+ name?: string | undefined;
2761
+ parentId: string | null;
2762
+ visible: boolean;
2763
+ camera?: {
2764
+ position: [number, number, number];
2765
+ target: [number, number, number];
2766
+ mode: "orthographic" | "perspective";
2767
+ fov?: number | undefined;
2768
+ zoom?: number | undefined;
2769
+ } | undefined;
2770
+ metadata: Record<string, unknown>;
2771
+ provenance?: {
2772
+ refs: {
2773
+ ns?: string | undefined;
2774
+ id: string;
2775
+ role?: "absorbed" | "alias" | "derived" | "piece" | "primary" | undefined;
2776
+ }[];
2777
+ lineage?: {
2778
+ op: "attach" | "convert" | "duplicate" | "import" | "make-independent" | "merge" | "promote" | "split";
2779
+ fromIds: string[];
2780
+ } | undefined;
2781
+ } | undefined;
2782
+ id: `fence_${string}`;
2783
+ children: string[];
2784
+ material?: {
2785
+ id?: string | undefined;
2786
+ preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
2787
+ properties?: {
2788
+ color: string;
2789
+ roughness: number;
2790
+ metalness: number;
2750
2791
  opacity: number;
2751
2792
  transparent: boolean;
2752
2793
  side: "back" | "double" | "front";
@@ -2808,6 +2849,42 @@ export declare function absorbWallSeparators(nodes: SceneNodes, levelId: string,
2808
2849
  color: string;
2809
2850
  style: "guard" | "horizontal" | "picket" | "privacy" | "rail" | "slat";
2810
2851
  type: "fence";
2852
+ } | {
2853
+ object: "node";
2854
+ name?: string | undefined;
2855
+ parentId: string | null;
2856
+ visible: boolean;
2857
+ camera?: {
2858
+ position: [number, number, number];
2859
+ target: [number, number, number];
2860
+ mode: "orthographic" | "perspective";
2861
+ fov?: number | undefined;
2862
+ zoom?: number | undefined;
2863
+ } | undefined;
2864
+ metadata: Record<string, unknown>;
2865
+ provenance?: {
2866
+ refs: {
2867
+ ns?: string | undefined;
2868
+ id: string;
2869
+ role?: "absorbed" | "alias" | "derived" | "piece" | "primary" | undefined;
2870
+ }[];
2871
+ lineage?: {
2872
+ op: "attach" | "convert" | "duplicate" | "import" | "make-independent" | "merge" | "promote" | "split";
2873
+ fromIds: string[];
2874
+ } | undefined;
2875
+ } | undefined;
2876
+ id: `beam_${string}`;
2877
+ start: [number, number];
2878
+ end: [number, number];
2879
+ width: number;
2880
+ depth: number;
2881
+ size?: string | undefined;
2882
+ plies: number;
2883
+ material: "glulam" | "lvl" | "pressure-treated" | "sawn" | "steel";
2884
+ placement: "dropped" | "flush";
2885
+ topElevation?: number | undefined;
2886
+ supportSlabId?: string | undefined;
2887
+ type: "beam";
2811
2888
  } | {
2812
2889
  object: "node";
2813
2890
  name?: string | undefined;
@@ -3096,588 +3173,61 @@ export declare function absorbWallSeparators(nodes: SceneNodes, levelId: string,
3096
3173
  } | {
3097
3174
  kind: "section";
3098
3175
  family: "C" | "I" | "L" | "T" | "Z" | "rect-tube";
3099
- width: import("../procedural-items/index.js").Expr;
3100
- depth: import("../procedural-items/index.js").Expr;
3101
- web: import("../procedural-items/index.js").Expr;
3102
- flange: import("../procedural-items/index.js").Expr;
3103
- } | {
3104
- kind: "polygon";
3105
- outer: [import("../procedural-items/index.js").Expr, import("../procedural-items/index.js").Expr][];
3106
- holes?: [import("../procedural-items/index.js").Expr, import("../procedural-items/index.js").Expr][][] | undefined;
3107
- };
3108
- length: import("../procedural-items/index.js").Expr;
3109
- bevel?: import("../procedural-items/index.js").Expr | undefined;
3110
- position: [import("../procedural-items/index.js").Expr, import("../procedural-items/index.js").Expr, import("../procedural-items/index.js").Expr];
3111
- rotation?: [import("../procedural-items/index.js").Expr, import("../procedural-items/index.js").Expr, import("../procedural-items/index.js").Expr] | undefined;
3112
- } | {
3113
- support?: boolean | undefined;
3114
- when?: import("../procedural-items/index.js").Expr | undefined;
3115
- id: string;
3116
- primitive: "revolve";
3117
- slot: string;
3118
- profile: [import("../procedural-items/index.js").Expr, import("../procedural-items/index.js").Expr][];
3119
- segments?: number | undefined;
3120
- arc?: import("../procedural-items/index.js").Expr | undefined;
3121
- position: [import("../procedural-items/index.js").Expr, import("../procedural-items/index.js").Expr, import("../procedural-items/index.js").Expr];
3122
- rotation?: [import("../procedural-items/index.js").Expr, import("../procedural-items/index.js").Expr, import("../procedural-items/index.js").Expr] | undefined;
3123
- })[];
3124
- }[];
3125
- joints?: {
3126
- delay?: import("../procedural-items/index.js").Expr | undefined;
3127
- duration?: import("../procedural-items/index.js").Expr | undefined;
3128
- easing?: "linear" | "smooth" | "soft" | undefined;
3129
- child: string;
3130
- kind: "continuous" | "fixed" | "prismatic" | "revolute";
3131
- origin: [import("../procedural-items/index.js").Expr, import("../procedural-items/index.js").Expr, import("../procedural-items/index.js").Expr];
3132
- axis: [import("../procedural-items/index.js").Expr, import("../procedural-items/index.js").Expr, import("../procedural-items/index.js").Expr];
3133
- open?: import("../procedural-items/index.js").Expr | undefined;
3134
- rest?: import("../procedural-items/index.js").Expr | undefined;
3135
- range?: [import("../procedural-items/index.js").Expr, import("../procedural-items/index.js").Expr] | undefined;
3136
- speed?: import("../procedural-items/index.js").Expr | undefined;
3137
- }[] | undefined;
3138
- constraints: {
3139
- left: import("../procedural-items/index.js").Expr;
3140
- relation: "gte" | "lte";
3141
- right: import("../procedural-items/index.js").Expr;
3142
- message: string;
3143
- }[];
3144
- };
3145
- parameters: Record<string, number>;
3146
- slots: Record<string, string>;
3147
- position: [number, number, number];
3148
- rotation: [number, number, number];
3149
- wallId?: string | undefined;
3150
- side?: "back" | "front" | undefined;
3151
- supportSlabId?: string | undefined;
3152
- children: string[];
3153
- attachments: Record<string, string>;
3154
- } | {
3155
- object: "node";
3156
- name?: string | undefined;
3157
- parentId: string | null;
3158
- visible: boolean;
3159
- camera?: {
3160
- position: [number, number, number];
3161
- target: [number, number, number];
3162
- mode: "orthographic" | "perspective";
3163
- fov?: number | undefined;
3164
- zoom?: number | undefined;
3165
- } | undefined;
3166
- metadata: Record<string, unknown>;
3167
- provenance?: {
3168
- refs: {
3169
- ns?: string | undefined;
3170
- id: string;
3171
- role?: "absorbed" | "alias" | "derived" | "piece" | "primary" | undefined;
3172
- }[];
3173
- lineage?: {
3174
- op: "attach" | "convert" | "duplicate" | "import" | "make-independent" | "merge" | "promote" | "split";
3175
- fromIds: string[];
3176
- } | undefined;
3177
- } | undefined;
3178
- id: `imesh_${string}`;
3179
- position: [number, number, number];
3180
- rotation: [number, number, number];
3181
- primitives: {
3182
- positions: number[];
3183
- normals?: number[] | undefined;
3184
- indices: number[];
3185
- color: string;
3186
- opacity: number;
3187
- }[];
3188
- type: "imported-mesh";
3189
- } | {
3190
- object: "node";
3191
- parentId: string | null;
3192
- visible: boolean;
3193
- camera?: {
3194
- position: [number, number, number];
3195
- target: [number, number, number];
3196
- mode: "orthographic" | "perspective";
3197
- fov?: number | undefined;
3198
- zoom?: number | undefined;
3199
- } | undefined;
3200
- provenance?: {
3201
- refs: {
3202
- ns?: string | undefined;
3203
- id: string;
3204
- role?: "absorbed" | "alias" | "derived" | "piece" | "primary" | undefined;
3205
- }[];
3206
- lineage?: {
3207
- op: "attach" | "convert" | "duplicate" | "import" | "make-independent" | "merge" | "promote" | "split";
3208
- fromIds: string[];
3209
- } | undefined;
3210
- } | undefined;
3211
- id: `zone_${string}`;
3212
- name: string;
3213
- polygon: [number, number][];
3214
- holes: [number, number][][];
3215
- autoFromWalls: boolean;
3216
- boundaryWallIds: `wall_${string}`[];
3217
- boundarySeparatorIds: string[];
3218
- hostZoneId?: string | undefined;
3219
- seed?: [number, number] | undefined;
3220
- floor?: {
3221
- elevation?: number | undefined;
3222
- support?: "open" | undefined;
3223
- footprint?: string | undefined;
3224
- thickness?: number | undefined;
3225
- sourceSlabId?: `slab_${string}` | undefined;
3226
- finish?: string | Record<string, unknown> | undefined;
3227
- regions?: {
3228
- id: string;
3229
- polygon: [number, number][];
3230
- finish: string | Record<string, unknown>;
3231
- }[] | undefined;
3232
- script?: {
3233
- kind: "script";
3234
- meta?: {
3235
- description?: string | undefined;
3236
- category?: string | undefined;
3237
- tags?: string[] | undefined;
3238
- parent?: string | undefined;
3239
- } | undefined;
3240
- language: "bpy" | "three";
3241
- script: string;
3242
- params: Record<string, string | number | boolean>;
3243
- artifact: string;
3244
- manifest: {
3245
- bounds: {
3246
- min: [number, number, number];
3247
- max: [number, number, number];
3248
- };
3249
- params: {
3250
- id: string;
3251
- label?: string | undefined;
3252
- kind: "boolean" | "number" | "string";
3253
- default: string | number | boolean;
3254
- min?: number | undefined;
3255
- max?: number | undefined;
3256
- step?: number | undefined;
3257
- unit?: string | undefined;
3258
- options?: string[] | undefined;
3259
- }[];
3260
- parts: {
3261
- id: string;
3262
- label?: string | undefined;
3263
- type?: string | undefined;
3264
- bounds?: {
3265
- min: [number, number, number];
3266
- max: [number, number, number];
3267
- } | undefined;
3268
- }[];
3269
- surfaces: {
3270
- part?: string | undefined;
3271
- y: number;
3272
- polygon: [number, number][];
3273
- }[];
3274
- slots: {
3275
- id: string;
3276
- label?: string | undefined;
3277
- color?: string | undefined;
3278
- roughness?: number | undefined;
3279
- metalness?: number | undefined;
3280
- transparent?: boolean | undefined;
3281
- emissive?: boolean | undefined;
3282
- }[];
3283
- anchors: {
3284
- id: string;
3285
- position: [number, number, number];
3286
- normal?: [number, number, number] | undefined;
3287
- }[];
3288
- lights: {
3289
- id: string;
3290
- position: [number, number, number];
3291
- color: string;
3292
- intensity: number;
3293
- distance?: number | undefined;
3294
- spot?: {
3295
- direction: [number, number, number];
3296
- angle: number;
3297
- softness: number;
3298
- } | undefined;
3299
- shadows?: boolean | undefined;
3300
- glow?: {
3301
- size: number;
3302
- strength: number;
3303
- } | undefined;
3304
- }[];
3305
- undersides: {
3306
- part?: string | undefined;
3307
- polygon: [number, number][];
3308
- plane: [number, number, number, number];
3309
- }[];
3310
- animations: {
3311
- name: string;
3312
- duration: number;
3313
- }[];
3314
- cutters?: {
3315
- host: "ceiling" | "mounted" | "slab" | "wall";
3316
- polygon: number[][];
3317
- minY: number;
3318
- maxY: number;
3319
- }[] | undefined;
3320
- cutout: boolean;
3321
- collider: boolean;
3322
- shape?: {
3323
- tolerance: number;
3324
- bands: {
3325
- y0: number;
3326
- y1: number;
3327
- polygons: {
3328
- outer: [number, number][];
3329
- holes?: [number, number][][] | undefined;
3330
- }[];
3331
- }[];
3332
- } | undefined;
3333
- triangles: number;
3334
- coverage?: number | undefined;
3335
- uncovered?: {
3336
- min: [number, number];
3337
- max: [number, number];
3338
- }[] | undefined;
3339
- };
3340
- images?: {
3341
- artifact: string;
3342
- thumbnail: string;
3343
- floorPlan: string;
3344
- } | undefined;
3345
- inputs: string;
3346
- } | undefined;
3347
- drop?: number | undefined;
3348
- } | undefined;
3349
- roomType?: "deck" | "patio" | "porch" | undefined;
3350
- porchFraming?: {
3351
- auto?: boolean | undefined;
3352
- postSize?: string | undefined;
3353
- postSpacing?: number | undefined;
3354
- beamSize?: string | undefined;
3355
- } | undefined;
3356
- decking?: {
3357
- boardSize?: "2x4" | "2x6" | "5/4x6" | "composite" | undefined;
3358
- gap?: number | undefined;
3359
- direction?: "diagonal" | "parallel" | "perpendicular" | undefined;
3360
- } | undefined;
3361
- ceiling?: {
3362
- regions?: {
3363
- id: string;
3364
- polygon: [number, number][];
3365
- finish: string | Record<string, unknown>;
3366
- }[] | undefined;
3367
- } | undefined;
3368
- floorStepFinish?: string | undefined;
3369
- floorStepOverrides?: {
3370
- key: string;
3371
- step?: number | undefined;
3372
- finish: string;
3373
- }[] | undefined;
3374
- floorEdgeFinish?: string | undefined;
3375
- wallMaterial?: string | undefined;
3376
- wallOverrides?: {
3377
- wallId: string;
3378
- face: "a" | "b";
3379
- finish: string;
3380
- }[] | undefined;
3381
- hasFloor?: false | undefined;
3382
- hasCeiling?: false | undefined;
3383
- spaceRole: "generic" | "room";
3384
- roomNumber: string;
3385
- enclosureStatus: "auto" | "enclosed" | "open";
3386
- floorFinish: string;
3387
- wallFinish: string;
3388
- ceilingFinish: string;
3389
- ceilingHeight: number;
3390
- occupancy: string;
3391
- clearDimensionPolicy: "finish-faces" | "inside-faces" | "none";
3392
- color: string;
3393
- metadata: Record<string, unknown>;
3394
- type: "zone";
3395
- } | {
3396
- object: "node";
3397
- name?: string | undefined;
3398
- parentId: string | null;
3399
- visible: boolean;
3400
- camera?: {
3401
- position: [number, number, number];
3402
- target: [number, number, number];
3403
- mode: "orthographic" | "perspective";
3404
- fov?: number | undefined;
3405
- zoom?: number | undefined;
3406
- } | undefined;
3407
- metadata: Record<string, unknown>;
3408
- provenance?: {
3409
- refs: {
3410
- ns?: string | undefined;
3411
- id: string;
3412
- role?: "absorbed" | "alias" | "derived" | "piece" | "primary" | undefined;
3413
- }[];
3414
- lineage?: {
3415
- op: "attach" | "convert" | "duplicate" | "import" | "make-independent" | "merge" | "promote" | "split";
3416
- fromIds: string[];
3417
- } | undefined;
3418
- } | undefined;
3419
- id: `ceiling_${string}`;
3420
- children: (`item_${string}` | `procedural-item_${string}`)[];
3421
- material?: {
3422
- id?: string | undefined;
3423
- preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
3424
- properties?: {
3425
- color: string;
3426
- roughness: number;
3427
- metalness: number;
3428
- opacity: number;
3429
- transparent: boolean;
3430
- side: "back" | "double" | "front";
3431
- } | undefined;
3432
- texture?: {
3433
- url: string;
3434
- repeat?: [number, number] | undefined;
3435
- scale?: number | undefined;
3436
- offset?: [number, number] | undefined;
3437
- normalMap?: string | undefined;
3438
- normalScale?: number | undefined;
3439
- bumpMap?: string | undefined;
3440
- bumpScale?: number | undefined;
3441
- } | undefined;
3442
- } | undefined;
3443
- materialPreset?: string | undefined;
3444
- slots?: Record<string, string> | undefined;
3445
- polygon: [number, number][];
3446
- holes: [number, number][][];
3447
- holeMetadata: {
3448
- source: "elevator" | "floor-opening" | "manual" | "room" | "stair";
3449
- openingId?: string | undefined;
3450
- stairId?: string | undefined;
3451
- elevatorId?: string | undefined;
3452
- }[];
3453
- openingIds?: string[] | undefined;
3454
- height?: number | undefined;
3455
- buildUp?: {
3456
- presetId?: string | undefined;
3457
- finish?: {
3458
- kind: "drywall" | "plaster" | "wood-plank";
3459
- thickness: number;
3460
- name?: string | undefined;
3461
- } | undefined;
3462
- framing?: {
3463
- system: "joists" | "truss-chords";
3464
- size: "2x10" | "2x12" | "2x4" | "2x6" | "2x8";
3465
- spacing: number;
3466
- } | undefined;
3467
- decking?: {
3468
- kind: "osb" | "plywood";
3469
- thickness: number;
3470
- name?: string | undefined;
3471
- } | undefined;
3472
- insulation?: {
3473
- kind: "batt" | "blown" | "rigid";
3474
- thickness: number;
3475
- name?: string | undefined;
3476
- } | undefined;
3477
- } | 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";
3487
- } | {
3488
- object: "node";
3489
- name?: string | undefined;
3490
- parentId: string | null;
3491
- visible: boolean;
3492
- camera?: {
3493
- position: [number, number, number];
3494
- target: [number, number, number];
3495
- mode: "orthographic" | "perspective";
3496
- fov?: number | undefined;
3497
- zoom?: number | undefined;
3498
- } | undefined;
3499
- metadata: Record<string, unknown>;
3500
- provenance?: {
3501
- refs: {
3502
- ns?: string | undefined;
3503
- id: string;
3504
- role?: "absorbed" | "alias" | "derived" | "piece" | "primary" | undefined;
3505
- }[];
3506
- lineage?: {
3507
- op: "attach" | "convert" | "duplicate" | "import" | "make-independent" | "merge" | "promote" | "split";
3508
- fromIds: string[];
3509
- } | undefined;
3510
- } | undefined;
3511
- id: `stair_${string}`;
3512
- material?: {
3513
- id?: string | undefined;
3514
- preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
3515
- properties?: {
3516
- color: string;
3517
- roughness: number;
3518
- metalness: number;
3519
- opacity: number;
3520
- transparent: boolean;
3521
- side: "back" | "double" | "front";
3522
- } | undefined;
3523
- texture?: {
3524
- url: string;
3525
- repeat?: [number, number] | undefined;
3526
- scale?: number | undefined;
3527
- offset?: [number, number] | undefined;
3528
- normalMap?: string | undefined;
3529
- normalScale?: number | undefined;
3530
- bumpMap?: string | undefined;
3531
- bumpScale?: number | undefined;
3532
- } | undefined;
3533
- } | undefined;
3534
- materialPreset?: string | undefined;
3535
- railingMaterial?: {
3536
- id?: string | undefined;
3537
- preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
3538
- properties?: {
3539
- color: string;
3540
- roughness: number;
3541
- metalness: number;
3542
- opacity: number;
3543
- transparent: boolean;
3544
- side: "back" | "double" | "front";
3545
- } | undefined;
3546
- texture?: {
3547
- url: string;
3548
- repeat?: [number, number] | undefined;
3549
- scale?: number | undefined;
3550
- offset?: [number, number] | undefined;
3551
- normalMap?: string | undefined;
3552
- normalScale?: number | undefined;
3553
- bumpMap?: string | undefined;
3554
- bumpScale?: number | undefined;
3555
- } | undefined;
3556
- } | undefined;
3557
- railingMaterialPreset?: string | undefined;
3558
- treadMaterial?: {
3559
- id?: string | undefined;
3560
- preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
3561
- properties?: {
3562
- color: string;
3563
- roughness: number;
3564
- metalness: number;
3565
- opacity: number;
3566
- transparent: boolean;
3567
- side: "back" | "double" | "front";
3568
- } | undefined;
3569
- texture?: {
3570
- url: string;
3571
- repeat?: [number, number] | undefined;
3572
- scale?: number | undefined;
3573
- offset?: [number, number] | undefined;
3574
- normalMap?: string | undefined;
3575
- normalScale?: number | undefined;
3576
- bumpMap?: string | undefined;
3577
- bumpScale?: number | undefined;
3578
- } | undefined;
3579
- } | undefined;
3580
- treadMaterialPreset?: string | undefined;
3581
- sideMaterial?: {
3582
- id?: string | undefined;
3583
- preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
3584
- properties?: {
3585
- color: string;
3586
- roughness: number;
3587
- metalness: number;
3588
- opacity: number;
3589
- transparent: boolean;
3590
- side: "back" | "double" | "front";
3591
- } | undefined;
3592
- texture?: {
3593
- url: string;
3594
- repeat?: [number, number] | undefined;
3595
- scale?: number | undefined;
3596
- offset?: [number, number] | undefined;
3597
- normalMap?: string | undefined;
3598
- normalScale?: number | undefined;
3599
- bumpMap?: string | undefined;
3600
- bumpScale?: number | undefined;
3601
- } | undefined;
3602
- } | undefined;
3603
- sideMaterialPreset?: string | undefined;
3604
- slots?: Record<string, string> | undefined;
3605
- position: [number, number, number];
3606
- rotation: number;
3607
- supportSlabId?: string | undefined;
3608
- stairType: "curved" | "spiral" | "straight";
3609
- fromLevelId: string | null;
3610
- toLevelId: string | null;
3611
- deckSlabId?: string | undefined;
3612
- slabOpeningMode: "destination" | "none";
3613
- openingOffset: number;
3614
- width: number;
3615
- totalRise?: number | undefined;
3616
- designTargets?: {
3617
- maxRiserHeight: number;
3618
- minimumGoing: number;
3619
- targetGoing: number;
3620
- minimumHeadroom: number;
3621
- } | undefined;
3622
- uniformRisers?: boolean | undefined;
3623
- stepCount: number;
3624
- autoSurfaceSnap?: boolean | undefined;
3625
- destinationSurfaceId?: string | undefined;
3626
- thickness: number;
3627
- fillToFloor: boolean;
3628
- construction?: {
3629
- mode: "center-stringer" | "open" | "side-stringers" | "solid" | "waist";
3630
- waistThickness: number;
3631
- treadThickness: number;
3632
- riserThickness: number;
3633
- nosing: number;
3634
- finishThickness: number;
3635
- closedRisers: boolean;
3636
- stringerWidth: number;
3637
- stringerDepth: number;
3638
- } | undefined;
3639
- structure?: {
3640
- type: "concrete" | "steel-stringers" | "wood-stringers";
3641
- stringerStock: "2x10" | "2x12";
3642
- stringerType: "cut" | "housed";
3643
- stringerSpacing: number;
3644
- stringerCount?: number | undefined;
3645
- treadStock?: "2x12" | "2x6-pair" | "5/4x6-pair" | "plywood-finish" | undefined;
3646
- closedRisers?: boolean | undefined;
3647
- treated?: boolean | undefined;
3648
- nosing?: number | undefined;
3649
- } | undefined;
3650
- innerRadius: number;
3651
- sweepAngle: number;
3652
- topLandingMode: "integrated" | "none";
3653
- topLandingDepth: number;
3654
- showCenterColumn: boolean;
3655
- showStepSupports: boolean;
3656
- railingMode: "both" | "left" | "none" | "right";
3657
- railingHeight: number;
3658
- railingStyle?: "balusters" | "boards" | "cable" | "glass" | "metal" | "post-and-rail" | undefined;
3659
- railingPath?: "continuous" | "original" | undefined;
3660
- handrail?: {
3661
- mode: "both" | "left" | "none" | "right";
3662
- height: number;
3663
- diameter: number;
3664
- offset: number;
3665
- bottom?: {
3666
- extension: number;
3667
- return: "floor" | "none" | "post" | "wall";
3668
- returnLength: number;
3669
- } | undefined;
3670
- top?: {
3671
- extension: number;
3672
- return: "floor" | "none" | "post" | "wall";
3673
- returnLength: number;
3674
- } | undefined;
3675
- } | undefined;
3676
- railingTopPost?: boolean | undefined;
3677
- railingTopReach?: number | undefined;
3678
- railingPostThrough?: boolean | undefined;
3679
- children: `sseg_${string}`[];
3680
- type: "stair";
3176
+ width: import("../procedural-items/index.js").Expr;
3177
+ depth: import("../procedural-items/index.js").Expr;
3178
+ web: import("../procedural-items/index.js").Expr;
3179
+ flange: import("../procedural-items/index.js").Expr;
3180
+ } | {
3181
+ kind: "polygon";
3182
+ outer: [import("../procedural-items/index.js").Expr, import("../procedural-items/index.js").Expr][];
3183
+ holes?: [import("../procedural-items/index.js").Expr, import("../procedural-items/index.js").Expr][][] | undefined;
3184
+ };
3185
+ length: import("../procedural-items/index.js").Expr;
3186
+ bevel?: import("../procedural-items/index.js").Expr | undefined;
3187
+ position: [import("../procedural-items/index.js").Expr, import("../procedural-items/index.js").Expr, import("../procedural-items/index.js").Expr];
3188
+ rotation?: [import("../procedural-items/index.js").Expr, import("../procedural-items/index.js").Expr, import("../procedural-items/index.js").Expr] | undefined;
3189
+ } | {
3190
+ support?: boolean | undefined;
3191
+ when?: import("../procedural-items/index.js").Expr | undefined;
3192
+ id: string;
3193
+ primitive: "revolve";
3194
+ slot: string;
3195
+ profile: [import("../procedural-items/index.js").Expr, import("../procedural-items/index.js").Expr][];
3196
+ segments?: number | undefined;
3197
+ arc?: import("../procedural-items/index.js").Expr | undefined;
3198
+ position: [import("../procedural-items/index.js").Expr, import("../procedural-items/index.js").Expr, import("../procedural-items/index.js").Expr];
3199
+ rotation?: [import("../procedural-items/index.js").Expr, import("../procedural-items/index.js").Expr, import("../procedural-items/index.js").Expr] | undefined;
3200
+ })[];
3201
+ }[];
3202
+ joints?: {
3203
+ delay?: import("../procedural-items/index.js").Expr | undefined;
3204
+ duration?: import("../procedural-items/index.js").Expr | undefined;
3205
+ easing?: "linear" | "smooth" | "soft" | undefined;
3206
+ child: string;
3207
+ kind: "continuous" | "fixed" | "prismatic" | "revolute";
3208
+ origin: [import("../procedural-items/index.js").Expr, import("../procedural-items/index.js").Expr, import("../procedural-items/index.js").Expr];
3209
+ axis: [import("../procedural-items/index.js").Expr, import("../procedural-items/index.js").Expr, import("../procedural-items/index.js").Expr];
3210
+ open?: import("../procedural-items/index.js").Expr | undefined;
3211
+ rest?: import("../procedural-items/index.js").Expr | undefined;
3212
+ range?: [import("../procedural-items/index.js").Expr, import("../procedural-items/index.js").Expr] | undefined;
3213
+ speed?: import("../procedural-items/index.js").Expr | undefined;
3214
+ }[] | undefined;
3215
+ constraints: {
3216
+ left: import("../procedural-items/index.js").Expr;
3217
+ relation: "gte" | "lte";
3218
+ right: import("../procedural-items/index.js").Expr;
3219
+ message: string;
3220
+ }[];
3221
+ };
3222
+ parameters: Record<string, number>;
3223
+ slots: Record<string, string>;
3224
+ position: [number, number, number];
3225
+ rotation: [number, number, number];
3226
+ wallId?: string | undefined;
3227
+ side?: "back" | "front" | undefined;
3228
+ supportSlabId?: string | undefined;
3229
+ children: string[];
3230
+ attachments: Record<string, string>;
3681
3231
  } | {
3682
3232
  object: "node";
3683
3233
  name?: string | undefined;
@@ -3702,23 +3252,19 @@ export declare function absorbWallSeparators(nodes: SceneNodes, levelId: string,
3702
3252
  fromIds: string[];
3703
3253
  } | undefined;
3704
3254
  } | 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>;
3255
+ id: `imesh_${string}`;
3714
3256
  position: [number, number, number];
3715
3257
  rotation: [number, number, number];
3716
- scale: number;
3717
- opacity: number;
3718
- type: "scan";
3258
+ primitives: {
3259
+ positions: number[];
3260
+ normals?: number[] | undefined;
3261
+ indices: number[];
3262
+ color: string;
3263
+ opacity: number;
3264
+ }[];
3265
+ type: "imported-mesh";
3719
3266
  } | {
3720
3267
  object: "node";
3721
- name?: string | undefined;
3722
3268
  parentId: string | null;
3723
3269
  visible: boolean;
3724
3270
  camera?: {
@@ -3728,7 +3274,6 @@ export declare function absorbWallSeparators(nodes: SceneNodes, levelId: string,
3728
3274
  fov?: number | undefined;
3729
3275
  zoom?: number | undefined;
3730
3276
  } | undefined;
3731
- metadata: Record<string, unknown>;
3732
3277
  provenance?: {
3733
3278
  refs: {
3734
3279
  ns?: string | undefined;
@@ -3740,23 +3285,190 @@ export declare function absorbWallSeparators(nodes: SceneNodes, levelId: string,
3740
3285
  fromIds: string[];
3741
3286
  } | undefined;
3742
3287
  } | 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";
3288
+ id: `zone_${string}`;
3289
+ name: string;
3290
+ polygon: [number, number][];
3291
+ holes: [number, number][][];
3292
+ autoFromWalls: boolean;
3293
+ boundaryWallIds: `wall_${string}`[];
3294
+ boundarySeparatorIds: string[];
3295
+ hostZoneId?: string | undefined;
3296
+ seed?: [number, number] | undefined;
3297
+ floor?: {
3298
+ elevation?: number | undefined;
3299
+ support?: "open" | undefined;
3300
+ footprint?: string | undefined;
3301
+ thickness?: number | undefined;
3302
+ sourceSlabId?: `slab_${string}` | undefined;
3303
+ finish?: string | Record<string, unknown> | undefined;
3304
+ regions?: {
3305
+ id: string;
3306
+ polygon: [number, number][];
3307
+ finish: string | Record<string, unknown>;
3308
+ }[] | undefined;
3309
+ script?: {
3310
+ kind: "script";
3311
+ meta?: {
3312
+ description?: string | undefined;
3313
+ category?: string | undefined;
3314
+ tags?: string[] | undefined;
3315
+ parent?: string | undefined;
3316
+ } | undefined;
3317
+ language: "bpy" | "three";
3318
+ script: string;
3319
+ params: Record<string, string | number | boolean>;
3320
+ artifact: string;
3321
+ manifest: {
3322
+ bounds: {
3323
+ min: [number, number, number];
3324
+ max: [number, number, number];
3325
+ };
3326
+ params: {
3327
+ id: string;
3328
+ label?: string | undefined;
3329
+ kind: "boolean" | "number" | "string";
3330
+ default: string | number | boolean;
3331
+ min?: number | undefined;
3332
+ max?: number | undefined;
3333
+ step?: number | undefined;
3334
+ unit?: string | undefined;
3335
+ options?: string[] | undefined;
3336
+ }[];
3337
+ parts: {
3338
+ id: string;
3339
+ label?: string | undefined;
3340
+ type?: string | undefined;
3341
+ bounds?: {
3342
+ min: [number, number, number];
3343
+ max: [number, number, number];
3344
+ } | undefined;
3345
+ }[];
3346
+ surfaces: {
3347
+ part?: string | undefined;
3348
+ y: number;
3349
+ polygon: [number, number][];
3350
+ }[];
3351
+ slots: {
3352
+ id: string;
3353
+ label?: string | undefined;
3354
+ color?: string | undefined;
3355
+ roughness?: number | undefined;
3356
+ metalness?: number | undefined;
3357
+ transparent?: boolean | undefined;
3358
+ emissive?: boolean | undefined;
3359
+ }[];
3360
+ anchors: {
3361
+ id: string;
3362
+ position: [number, number, number];
3363
+ normal?: [number, number, number] | undefined;
3364
+ }[];
3365
+ lights: {
3366
+ id: string;
3367
+ position: [number, number, number];
3368
+ color: string;
3369
+ intensity: number;
3370
+ distance?: number | undefined;
3371
+ spot?: {
3372
+ direction: [number, number, number];
3373
+ angle: number;
3374
+ softness: number;
3375
+ } | undefined;
3376
+ shadows?: boolean | undefined;
3377
+ glow?: {
3378
+ size: number;
3379
+ strength: number;
3380
+ } | undefined;
3381
+ }[];
3382
+ undersides: {
3383
+ part?: string | undefined;
3384
+ polygon: [number, number][];
3385
+ plane: [number, number, number, number];
3386
+ }[];
3387
+ animations: {
3388
+ name: string;
3389
+ duration: number;
3390
+ }[];
3391
+ cutters?: {
3392
+ host: "ceiling" | "mounted" | "slab" | "wall";
3393
+ polygon: number[][];
3394
+ minY: number;
3395
+ maxY: number;
3396
+ }[] | undefined;
3397
+ cutout: boolean;
3398
+ collider: boolean;
3399
+ shape?: {
3400
+ tolerance: number;
3401
+ bands: {
3402
+ y0: number;
3403
+ y1: number;
3404
+ polygons: {
3405
+ outer: [number, number][];
3406
+ holes?: [number, number][][] | undefined;
3407
+ }[];
3408
+ }[];
3409
+ } | undefined;
3410
+ triangles: number;
3411
+ coverage?: number | undefined;
3412
+ uncovered?: {
3413
+ min: [number, number];
3414
+ max: [number, number];
3415
+ }[] | undefined;
3416
+ };
3417
+ images?: {
3418
+ artifact: string;
3419
+ thumbnail: string;
3420
+ floorPlan: string;
3421
+ } | undefined;
3422
+ inputs: string;
3423
+ } | undefined;
3424
+ drop?: number | undefined;
3425
+ } | undefined;
3426
+ roomType?: "deck" | "patio" | "porch" | undefined;
3427
+ porchFraming?: {
3428
+ auto?: boolean | undefined;
3429
+ postSize?: string | undefined;
3430
+ postSpacing?: number | undefined;
3431
+ beamSize?: string | undefined;
3432
+ } | undefined;
3433
+ decking?: {
3434
+ boardSize?: "2x4" | "2x6" | "5/4x6" | "composite" | undefined;
3435
+ gap?: number | undefined;
3436
+ direction?: "diagonal" | "parallel" | "perpendicular" | undefined;
3437
+ } | undefined;
3438
+ ceiling?: {
3439
+ regions?: {
3440
+ id: string;
3441
+ polygon: [number, number][];
3442
+ finish: string | Record<string, unknown>;
3443
+ }[] | undefined;
3444
+ } | undefined;
3445
+ floorStepFinish?: string | undefined;
3446
+ floorStepOverrides?: {
3447
+ key: string;
3448
+ step?: number | undefined;
3449
+ finish: string;
3450
+ }[] | undefined;
3451
+ floorEdgeFinish?: string | undefined;
3452
+ wallMaterial?: string | undefined;
3453
+ wallOverrides?: {
3454
+ wallId: string;
3455
+ face: "a" | "b";
3456
+ finish: string;
3457
+ }[] | undefined;
3458
+ hasFloor?: false | undefined;
3459
+ hasCeiling?: false | undefined;
3460
+ spaceRole: "generic" | "room";
3461
+ roomNumber: string;
3462
+ enclosureStatus: "auto" | "enclosed" | "open";
3463
+ floorFinish: string;
3464
+ wallFinish: string;
3465
+ ceilingFinish: string;
3466
+ ceilingHeight: number;
3467
+ occupancy: string;
3468
+ clearDimensionPolicy: "finish-faces" | "inside-faces" | "none";
3469
+ color: string;
3470
+ metadata: Record<string, unknown>;
3471
+ type: "zone";
3760
3472
  } | {
3761
3473
  object: "node";
3762
3474
  name?: string | undefined;
@@ -3781,22 +3493,8 @@ export declare function absorbWallSeparators(nodes: SceneNodes, levelId: string,
3781
3493
  fromIds: string[];
3782
3494
  } | undefined;
3783
3495
  } | 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";
3496
+ id: `ceiling_${string}`;
3497
+ children: (`item_${string}` | `procedural-item_${string}`)[];
3800
3498
  material?: {
3801
3499
  id?: string | undefined;
3802
3500
  preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
@@ -3821,7 +3519,48 @@ export declare function absorbWallSeparators(nodes: SceneNodes, levelId: string,
3821
3519
  } | undefined;
3822
3520
  materialPreset?: string | undefined;
3823
3521
  slots?: Record<string, string> | undefined;
3824
- type: "shelf";
3522
+ polygon: [number, number][];
3523
+ holes: [number, number][][];
3524
+ holeMetadata: {
3525
+ source: "elevator" | "floor-opening" | "manual" | "room" | "stair";
3526
+ openingId?: string | undefined;
3527
+ stairId?: string | undefined;
3528
+ elevatorId?: string | undefined;
3529
+ }[];
3530
+ openingIds?: string[] | undefined;
3531
+ height?: number | undefined;
3532
+ buildUp?: {
3533
+ presetId?: string | undefined;
3534
+ finish?: {
3535
+ kind: "drywall" | "plaster" | "wood-plank";
3536
+ thickness: number;
3537
+ name?: string | undefined;
3538
+ } | undefined;
3539
+ framing?: {
3540
+ system: "joists" | "truss-chords";
3541
+ size: "2x10" | "2x12" | "2x4" | "2x6" | "2x8";
3542
+ spacing: number;
3543
+ } | undefined;
3544
+ decking?: {
3545
+ kind: "osb" | "plywood";
3546
+ thickness: number;
3547
+ name?: string | undefined;
3548
+ } | undefined;
3549
+ insulation?: {
3550
+ kind: "batt" | "blown" | "rigid";
3551
+ thickness: number;
3552
+ name?: string | undefined;
3553
+ } | undefined;
3554
+ } | undefined;
3555
+ regions?: {
3556
+ id: string;
3557
+ polygon: [number, number][];
3558
+ finish: string | Record<string, unknown>;
3559
+ }[] | undefined;
3560
+ boundary?: "auto" | undefined;
3561
+ zoneId?: string | undefined;
3562
+ autoFromWalls: boolean;
3563
+ type: "ceiling";
3825
3564
  } | {
3826
3565
  object: "node";
3827
3566
  name?: string | undefined;
@@ -3846,29 +3585,59 @@ export declare function absorbWallSeparators(nodes: SceneNodes, levelId: string,
3846
3585
  fromIds: string[];
3847
3586
  } | undefined;
3848
3587
  } | undefined;
3849
- id: `duct-fitting_${string}`;
3588
+ id: `sseg_${string}`;
3589
+ material?: {
3590
+ id?: string | undefined;
3591
+ preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
3592
+ properties?: {
3593
+ color: string;
3594
+ roughness: number;
3595
+ metalness: number;
3596
+ opacity: number;
3597
+ transparent: boolean;
3598
+ side: "back" | "double" | "front";
3599
+ } | undefined;
3600
+ texture?: {
3601
+ url: string;
3602
+ repeat?: [number, number] | undefined;
3603
+ scale?: number | undefined;
3604
+ offset?: [number, number] | undefined;
3605
+ normalMap?: string | undefined;
3606
+ normalScale?: number | undefined;
3607
+ bumpMap?: string | undefined;
3608
+ bumpScale?: number | undefined;
3609
+ } | undefined;
3610
+ } | undefined;
3611
+ materialPreset?: string | undefined;
3612
+ slots?: Record<string, string> | undefined;
3850
3613
  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;
3614
+ rotation: number;
3615
+ segmentType: "landing" | "stair";
3856
3616
  width: number;
3617
+ length: number;
3857
3618
  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";
3619
+ stepCount: number;
3620
+ attachmentSide: "front" | "left" | "right";
3621
+ fillToFloor: boolean;
3622
+ construction?: {
3623
+ mode: "center-stringer" | "open" | "side-stringers" | "solid" | "waist";
3624
+ waistThickness: number;
3625
+ treadThickness: number;
3626
+ riserThickness: number;
3627
+ nosing: number;
3628
+ finishThickness: number;
3629
+ closedRisers: boolean;
3630
+ stringerWidth: number;
3631
+ stringerDepth: number;
3632
+ } | undefined;
3633
+ winder?: {
3634
+ turn: "left" | "right";
3635
+ innerGap: number;
3636
+ walkingLineOffset: number;
3637
+ division: "equal-angle" | "equal-going";
3638
+ } | undefined;
3639
+ thickness: number;
3640
+ type: "stair-segment";
3872
3641
  } | {
3873
3642
  object: "node";
3874
3643
  name?: string | undefined;
@@ -3893,60 +3662,176 @@ export declare function absorbWallSeparators(nodes: SceneNodes, levelId: string,
3893
3662
  fromIds: string[];
3894
3663
  } | undefined;
3895
3664
  } | undefined;
3896
- id: `duct-terminal_${string}`;
3897
- 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";
3909
- } | {
3910
- object: "node";
3911
- name?: string | undefined;
3912
- parentId: string | null;
3913
- visible: boolean;
3914
- camera?: {
3915
- position: [number, number, number];
3916
- target: [number, number, number];
3917
- mode: "orthographic" | "perspective";
3918
- fov?: number | undefined;
3919
- zoom?: number | undefined;
3665
+ id: `stair_${string}`;
3666
+ material?: {
3667
+ id?: string | undefined;
3668
+ preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
3669
+ properties?: {
3670
+ color: string;
3671
+ roughness: number;
3672
+ metalness: number;
3673
+ opacity: number;
3674
+ transparent: boolean;
3675
+ side: "back" | "double" | "front";
3676
+ } | undefined;
3677
+ texture?: {
3678
+ url: string;
3679
+ repeat?: [number, number] | undefined;
3680
+ scale?: number | undefined;
3681
+ offset?: [number, number] | undefined;
3682
+ normalMap?: string | undefined;
3683
+ normalScale?: number | undefined;
3684
+ bumpMap?: string | undefined;
3685
+ bumpScale?: number | undefined;
3686
+ } | undefined;
3920
3687
  } | undefined;
3921
- metadata: Record<string, unknown>;
3922
- provenance?: {
3923
- refs: {
3924
- ns?: string | undefined;
3925
- id: string;
3926
- role?: "absorbed" | "alias" | "derived" | "piece" | "primary" | undefined;
3927
- }[];
3928
- lineage?: {
3929
- op: "attach" | "convert" | "duplicate" | "import" | "make-independent" | "merge" | "promote" | "split";
3930
- fromIds: string[];
3688
+ materialPreset?: string | undefined;
3689
+ railingMaterial?: {
3690
+ id?: string | undefined;
3691
+ preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
3692
+ properties?: {
3693
+ color: string;
3694
+ roughness: number;
3695
+ metalness: number;
3696
+ opacity: number;
3697
+ transparent: boolean;
3698
+ side: "back" | "double" | "front";
3699
+ } | undefined;
3700
+ texture?: {
3701
+ url: string;
3702
+ repeat?: [number, number] | undefined;
3703
+ scale?: number | undefined;
3704
+ offset?: [number, number] | undefined;
3705
+ normalMap?: string | undefined;
3706
+ normalScale?: number | undefined;
3707
+ bumpMap?: string | undefined;
3708
+ bumpScale?: number | undefined;
3709
+ } | undefined;
3710
+ } | undefined;
3711
+ railingMaterialPreset?: string | undefined;
3712
+ treadMaterial?: {
3713
+ id?: string | undefined;
3714
+ preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
3715
+ properties?: {
3716
+ color: string;
3717
+ roughness: number;
3718
+ metalness: number;
3719
+ opacity: number;
3720
+ transparent: boolean;
3721
+ side: "back" | "double" | "front";
3722
+ } | undefined;
3723
+ texture?: {
3724
+ url: string;
3725
+ repeat?: [number, number] | undefined;
3726
+ scale?: number | undefined;
3727
+ offset?: [number, number] | undefined;
3728
+ normalMap?: string | undefined;
3729
+ normalScale?: number | undefined;
3730
+ bumpMap?: string | undefined;
3731
+ bumpScale?: number | undefined;
3732
+ } | undefined;
3733
+ } | undefined;
3734
+ treadMaterialPreset?: string | undefined;
3735
+ sideMaterial?: {
3736
+ id?: string | undefined;
3737
+ preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
3738
+ properties?: {
3739
+ color: string;
3740
+ roughness: number;
3741
+ metalness: number;
3742
+ opacity: number;
3743
+ transparent: boolean;
3744
+ side: "back" | "double" | "front";
3745
+ } | undefined;
3746
+ texture?: {
3747
+ url: string;
3748
+ repeat?: [number, number] | undefined;
3749
+ scale?: number | undefined;
3750
+ offset?: [number, number] | undefined;
3751
+ normalMap?: string | undefined;
3752
+ normalScale?: number | undefined;
3753
+ bumpMap?: string | undefined;
3754
+ bumpScale?: number | undefined;
3931
3755
  } | undefined;
3932
3756
  } | undefined;
3933
- id: `hvac-equipment_${string}`;
3757
+ sideMaterialPreset?: string | undefined;
3758
+ slots?: Record<string, string> | undefined;
3934
3759
  position: [number, number, number];
3935
3760
  rotation: number;
3936
3761
  supportSlabId?: string | undefined;
3937
- equipmentType: "air-handler" | "condenser" | "furnace";
3762
+ stairType: "curved" | "spiral" | "straight";
3763
+ fromLevelId: string | null;
3764
+ toLevelId: string | null;
3765
+ deckSlabId?: string | undefined;
3766
+ slabOpeningMode: "destination" | "none";
3767
+ openingOffset: number;
3938
3768
  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";
3769
+ totalRise?: number | undefined;
3770
+ designTargets?: {
3771
+ maxRiserHeight: number;
3772
+ minimumGoing: number;
3773
+ targetGoing: number;
3774
+ minimumHeadroom: number;
3775
+ } | undefined;
3776
+ uniformRisers?: boolean | undefined;
3777
+ stepCount: number;
3778
+ autoSurfaceSnap?: boolean | undefined;
3779
+ destinationSurfaceId?: string | undefined;
3780
+ thickness: number;
3781
+ fillToFloor: boolean;
3782
+ construction?: {
3783
+ mode: "center-stringer" | "open" | "side-stringers" | "solid" | "waist";
3784
+ waistThickness: number;
3785
+ treadThickness: number;
3786
+ riserThickness: number;
3787
+ nosing: number;
3788
+ finishThickness: number;
3789
+ closedRisers: boolean;
3790
+ stringerWidth: number;
3791
+ stringerDepth: number;
3792
+ } | undefined;
3793
+ structure?: {
3794
+ type: "concrete" | "steel-stringers" | "wood-stringers";
3795
+ stringerStock: "2x10" | "2x12";
3796
+ stringerType: "cut" | "housed";
3797
+ stringerSpacing: number;
3798
+ stringerCount?: number | undefined;
3799
+ treadStock?: "2x12" | "2x6-pair" | "5/4x6-pair" | "plywood-finish" | undefined;
3800
+ closedRisers?: boolean | undefined;
3801
+ treated?: boolean | undefined;
3802
+ nosing?: number | undefined;
3803
+ } | undefined;
3804
+ innerRadius: number;
3805
+ sweepAngle: number;
3806
+ topLandingMode: "integrated" | "none";
3807
+ topLandingDepth: number;
3808
+ showCenterColumn: boolean;
3809
+ showStepSupports: boolean;
3810
+ railingMode: "both" | "left" | "none" | "right";
3811
+ railingHeight: number;
3812
+ railingStyle?: "balusters" | "boards" | "cable" | "glass" | "metal" | "post-and-rail" | undefined;
3813
+ railingPath?: "continuous" | "original" | undefined;
3814
+ handrail?: {
3815
+ mode: "both" | "left" | "none" | "right";
3816
+ height: number;
3817
+ diameter: number;
3818
+ offset: number;
3819
+ bottom?: {
3820
+ extension: number;
3821
+ return: "floor" | "none" | "post" | "wall";
3822
+ returnLength: number;
3823
+ } | undefined;
3824
+ top?: {
3825
+ extension: number;
3826
+ return: "floor" | "none" | "post" | "wall";
3827
+ returnLength: number;
3828
+ } | undefined;
3829
+ } | undefined;
3830
+ railingTopPost?: boolean | undefined;
3831
+ railingTopReach?: number | undefined;
3832
+ railingPostThrough?: boolean | undefined;
3833
+ children: `sseg_${string}`[];
3834
+ type: "stair";
3950
3835
  } | {
3951
3836
  object: "node";
3952
3837
  name?: string | undefined;
@@ -3971,10 +3856,20 @@ export declare function absorbWallSeparators(nodes: SceneNodes, levelId: string,
3971
3856
  fromIds: string[];
3972
3857
  } | undefined;
3973
3858
  } | undefined;
3974
- id: `liquid-line_${string}`;
3975
- path: [number, number, number][];
3976
- diameter: number;
3977
- type: "liquid-line";
3859
+ id: `scan_${string}`;
3860
+ url: string | null;
3861
+ captureSession: {
3862
+ sessionId: string;
3863
+ schemaVersion?: number | undefined;
3864
+ revisionId?: string | undefined;
3865
+ manifestUrl?: string | undefined;
3866
+ } | null;
3867
+ layers: Record<string, boolean>;
3868
+ position: [number, number, number];
3869
+ rotation: [number, number, number];
3870
+ scale: number;
3871
+ opacity: number;
3872
+ type: "scan";
3978
3873
  } | {
3979
3874
  object: "node";
3980
3875
  name?: string | undefined;
@@ -3999,28 +3894,23 @@ export declare function absorbWallSeparators(nodes: SceneNodes, levelId: string,
3999
3894
  fromIds: string[];
4000
3895
  } | undefined;
4001
3896
  } | 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";
3897
+ id: `guide_${string}`;
3898
+ url: string;
3899
+ position: [number, number, number];
3900
+ rotation: [number, number, number];
3901
+ scale: number;
3902
+ opacity: number;
3903
+ scaleReference: {
3904
+ start: [number, number];
3905
+ end: [number, number];
3906
+ realLengthMeters: number;
3907
+ measuredLengthUnits: number;
3908
+ metersPerUnit: number;
3909
+ displayLength?: number | undefined;
3910
+ displayUnit?: "centimeters" | "feet" | "inches" | "meters" | undefined;
3911
+ label: string;
3912
+ } | null;
3913
+ type: "guide";
4024
3914
  } | {
4025
3915
  object: "node";
4026
3916
  name?: string | undefined;
@@ -4045,17 +3935,89 @@ export declare function absorbWallSeparators(nodes: SceneNodes, levelId: string,
4045
3935
  fromIds: string[];
4046
3936
  } | undefined;
4047
3937
  } | undefined;
4048
- id: `pipe-fitting_${string}`;
4049
- position: [number, number, number];
4050
- rotation: [number, number, number];
4051
- fittingType: "cleanout" | "coupling" | "cross" | "elbow" | "end-cap" | "reducer" | "sanitary-tee" | "wye";
4052
- angle: number;
4053
- diameter: number;
4054
- diameter2: number;
4055
- cleanoutStyle: "end" | "inline";
4056
- pipeMaterial: "abs" | "cast-iron" | "pvc";
4057
- system: "vent" | "waste";
4058
- type: "pipe-fitting";
3938
+ id: `measurement_${string}`;
3939
+ measurement: {
3940
+ kind: "distance";
3941
+ points: [{
3942
+ kind: "feature";
3943
+ reference: {
3944
+ nodeId: string;
3945
+ featureId: string;
3946
+ parameters?: Record<string, string | number | boolean> | undefined;
3947
+ };
3948
+ fallback: [number, number, number];
3949
+ } | [number, number, number], {
3950
+ kind: "feature";
3951
+ reference: {
3952
+ nodeId: string;
3953
+ featureId: string;
3954
+ parameters?: Record<string, string | number | boolean> | undefined;
3955
+ };
3956
+ fallback: [number, number, number];
3957
+ } | [number, number, number]];
3958
+ } | {
3959
+ kind: "angle";
3960
+ points: [{
3961
+ kind: "feature";
3962
+ reference: {
3963
+ nodeId: string;
3964
+ featureId: string;
3965
+ parameters?: Record<string, string | number | boolean> | undefined;
3966
+ };
3967
+ fallback: [number, number, number];
3968
+ } | [number, number, number], {
3969
+ kind: "feature";
3970
+ reference: {
3971
+ nodeId: string;
3972
+ featureId: string;
3973
+ parameters?: Record<string, string | number | boolean> | undefined;
3974
+ };
3975
+ fallback: [number, number, number];
3976
+ } | [number, number, number], {
3977
+ kind: "feature";
3978
+ reference: {
3979
+ nodeId: string;
3980
+ featureId: string;
3981
+ parameters?: Record<string, string | number | boolean> | undefined;
3982
+ };
3983
+ fallback: [number, number, number];
3984
+ } | [number, number, number]];
3985
+ } | {
3986
+ kind: "area";
3987
+ base: ({
3988
+ kind: "feature";
3989
+ reference: {
3990
+ nodeId: string;
3991
+ featureId: string;
3992
+ parameters?: Record<string, string | number | boolean> | undefined;
3993
+ };
3994
+ fallback: [number, number, number];
3995
+ } | [number, number, number])[];
3996
+ } | {
3997
+ kind: "perimeter";
3998
+ base: ({
3999
+ kind: "feature";
4000
+ reference: {
4001
+ nodeId: string;
4002
+ featureId: string;
4003
+ parameters?: Record<string, string | number | boolean> | undefined;
4004
+ };
4005
+ fallback: [number, number, number];
4006
+ } | [number, number, number])[];
4007
+ } | {
4008
+ kind: "volume";
4009
+ base: ({
4010
+ kind: "feature";
4011
+ reference: {
4012
+ nodeId: string;
4013
+ featureId: string;
4014
+ parameters?: Record<string, string | number | boolean> | undefined;
4015
+ };
4016
+ fallback: [number, number, number];
4017
+ } | [number, number, number])[];
4018
+ extrusion: [number, number, number];
4019
+ };
4020
+ type: "measurement";
4059
4021
  } | {
4060
4022
  object: "node";
4061
4023
  name?: string | undefined;
@@ -4080,12 +4042,11 @@ export declare function absorbWallSeparators(nodes: SceneNodes, levelId: string,
4080
4042
  fromIds: string[];
4081
4043
  } | undefined;
4082
4044
  } | 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";
4045
+ id: `spawn_${string}`;
4046
+ position: [number, number, number];
4047
+ rotation: number;
4048
+ supportSlabId?: string | undefined;
4049
+ type: "spawn";
4089
4050
  } | {
4090
4051
  object: "node";
4091
4052
  name?: string | undefined;
@@ -4110,7 +4071,22 @@ export declare function absorbWallSeparators(nodes: SceneNodes, levelId: string,
4110
4071
  fromIds: string[];
4111
4072
  } | undefined;
4112
4073
  } | undefined;
4113
- id: `elevator_${string}`;
4074
+ id: `shelf_${string}`;
4075
+ children: string[];
4076
+ position: [number, number, number];
4077
+ rotation: [number, number, number];
4078
+ supportSlabId?: string | undefined;
4079
+ width: number;
4080
+ depth: number;
4081
+ thickness: number;
4082
+ height: number;
4083
+ style: "bookshelf" | "cubby" | "open-rack" | "wall-shelf";
4084
+ rows: number;
4085
+ columns: number;
4086
+ withBack: boolean;
4087
+ withSides: boolean;
4088
+ withBottom: boolean;
4089
+ bracketStyle: "hidden" | "industrial" | "minimal";
4114
4090
  material?: {
4115
4091
  id?: string | undefined;
4116
4092
  preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
@@ -4135,31 +4111,10 @@ export declare function absorbWallSeparators(nodes: SceneNodes, levelId: string,
4135
4111
  } | undefined;
4136
4112
  materialPreset?: string | undefined;
4137
4113
  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";
4114
+ type: "shelf";
4161
4115
  } | {
4162
4116
  object: "node";
4117
+ name?: string | undefined;
4163
4118
  parentId: string | null;
4164
4119
  visible: boolean;
4165
4120
  camera?: {
@@ -4169,6 +4124,7 @@ export declare function absorbWallSeparators(nodes: SceneNodes, levelId: string,
4169
4124
  fov?: number | undefined;
4170
4125
  zoom?: number | undefined;
4171
4126
  } | undefined;
4127
+ metadata: Record<string, unknown>;
4172
4128
  provenance?: {
4173
4129
  refs: {
4174
4130
  ns?: string | undefined;
@@ -4180,13 +4136,36 @@ export declare function absorbWallSeparators(nodes: SceneNodes, levelId: string,
4180
4136
  fromIds: string[];
4181
4137
  } | undefined;
4182
4138
  } | 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";
4139
+ id: `duct-segment_${string}`;
4140
+ path: [number, number, number][];
4141
+ autoHangers?: boolean | undefined;
4142
+ hangerOverrides?: Record<string, {
4143
+ fraction?: number | undefined;
4144
+ skipped?: boolean | undefined;
4145
+ hostId?: string | undefined;
4146
+ }> | undefined;
4147
+ hangerStyle?: "double" | "single" | undefined;
4148
+ hangerSpacing?: number | undefined;
4149
+ hangerMaxReach?: number | undefined;
4150
+ wallAttachment?: {
4151
+ wallId: `wall_${string}`;
4152
+ side: "back" | "front";
4153
+ startUV: [number, number];
4154
+ endUV: [number, number];
4155
+ offset: number;
4156
+ } | undefined;
4157
+ shape: "oval" | "rect" | "round";
4158
+ diameter: number;
4159
+ width: number;
4160
+ height: number;
4161
+ roll: number;
4162
+ ductMaterial: "duct-board" | "flex" | "sheet-metal" | "spiral";
4163
+ seamDetail: boolean;
4164
+ insulated: boolean;
4165
+ insulationR: number;
4166
+ system: "return" | "supply";
4167
+ slots?: Record<string, string> | undefined;
4168
+ type: "duct-segment";
4190
4169
  } | {
4191
4170
  object: "node";
4192
4171
  name?: string | undefined;
@@ -4211,12 +4190,19 @@ export declare function absorbWallSeparators(nodes: SceneNodes, levelId: string,
4211
4190
  fromIds: string[];
4212
4191
  } | undefined;
4213
4192
  } | undefined;
4214
- id: `building_${string}`;
4215
- children: (`elevator_${string}` | `level_${string}` | `unit_${string}`)[];
4193
+ id: `duct-terminal_${string}`;
4216
4194
  position: [number, number, number];
4217
- rotation: [number, number, number];
4218
- groundLevelId?: `level_${string}` | undefined;
4219
- type: "building";
4195
+ rotation: number;
4196
+ supportSlabId?: string | undefined;
4197
+ terminalType: "diffuser" | "return-grille" | "supply-register";
4198
+ mount: "ceiling" | "floor" | "wall";
4199
+ width: number;
4200
+ depth: number;
4201
+ collarShape: "oval" | "rect" | "round";
4202
+ collarDiameter: number;
4203
+ collarWidth: number;
4204
+ collarHeight: number;
4205
+ type: "duct-terminal";
4220
4206
  } | {
4221
4207
  object: "node";
4222
4208
  name?: string | undefined;
@@ -4241,126 +4227,40 @@ export declare function absorbWallSeparators(nodes: SceneNodes, levelId: string,
4241
4227
  fromIds: string[];
4242
4228
  } | undefined;
4243
4229
  } | 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;
4230
+ id: `lineset_${string}`;
4231
+ path: [number, number, number][];
4232
+ suctionDiameter: number;
4233
+ liquidDiameter: number;
4234
+ insulated: boolean;
4235
+ type: "lineset";
4236
+ } | {
4237
+ object: "node";
4238
+ name?: string | undefined;
4239
+ parentId: string | null;
4240
+ visible: boolean;
4241
+ camera?: {
4242
+ position: [number, number, number];
4243
+ target: [number, number, number];
4244
+ mode: "orthographic" | "perspective";
4245
+ fov?: number | undefined;
4246
+ zoom?: number | undefined;
4312
4247
  } | 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;
4248
+ metadata: Record<string, unknown>;
4249
+ provenance?: {
4250
+ refs: {
4251
+ ns?: string | undefined;
4252
+ id: string;
4253
+ role?: "absorbed" | "alias" | "derived" | "piece" | "primary" | undefined;
4254
+ }[];
4255
+ lineage?: {
4256
+ op: "attach" | "convert" | "duplicate" | "import" | "make-independent" | "merge" | "promote" | "split";
4257
+ fromIds: string[];
4334
4258
  } | undefined;
4335
4259
  } | 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";
4260
+ id: `liquid-line_${string}`;
4261
+ path: [number, number, number][];
4262
+ diameter: number;
4263
+ type: "liquid-line";
4364
4264
  } | {
4365
4265
  object: "node";
4366
4266
  name?: string | undefined;
@@ -4385,77 +4285,59 @@ export declare function absorbWallSeparators(nodes: SceneNodes, levelId: string,
4385
4285
  fromIds: string[];
4386
4286
  } | undefined;
4387
4287
  } | 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;
4288
+ id: `pipe-segment_${string}`;
4289
+ path: [number, number, number][];
4290
+ autoHangers?: boolean | undefined;
4291
+ hangerOverrides?: Record<string, {
4292
+ fraction?: number | undefined;
4293
+ skipped?: boolean | undefined;
4294
+ hostId?: string | undefined;
4295
+ }> | undefined;
4296
+ hangerStyle?: "double" | "single" | undefined;
4297
+ hangerSpacing?: number | undefined;
4298
+ hangerMaxReach?: number | undefined;
4299
+ wallAttachment?: {
4300
+ wallId: `wall_${string}`;
4301
+ side: "back" | "front";
4302
+ startUV: [number, number];
4303
+ endUV: [number, number];
4304
+ offset: number;
4410
4305
  } | 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;
4306
+ diameter: number;
4307
+ pipeMaterial: "abs" | "cast-iron" | "pvc";
4308
+ system: "vent" | "waste";
4309
+ type: "pipe-segment";
4310
+ } | {
4311
+ object: "node";
4312
+ name?: string | undefined;
4313
+ parentId: string | null;
4314
+ visible: boolean;
4315
+ camera?: {
4316
+ position: [number, number, number];
4317
+ target: [number, number, number];
4318
+ mode: "orthographic" | "perspective";
4319
+ fov?: number | undefined;
4320
+ zoom?: number | undefined;
4321
+ } | undefined;
4322
+ metadata: Record<string, unknown>;
4323
+ provenance?: {
4324
+ refs: {
4325
+ ns?: string | undefined;
4326
+ id: string;
4327
+ role?: "absorbed" | "alias" | "derived" | "piece" | "primary" | undefined;
4328
+ }[];
4329
+ lineage?: {
4330
+ op: "attach" | "convert" | "duplicate" | "import" | "make-independent" | "merge" | "promote" | "split";
4331
+ fromIds: string[];
4432
4332
  } | undefined;
4433
4333
  } | undefined;
4434
- glassMaterialPreset?: string | undefined;
4435
- roofSegmentId?: string | undefined;
4334
+ id: `pipe-trap_${string}`;
4436
4335
  position: [number, number, number];
4437
4336
  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";
4337
+ diameter: number;
4338
+ pipeMaterial: "abs" | "cast-iron" | "pvc";
4339
+ armLengthM: number;
4340
+ type: "pipe-trap";
4459
4341
  } | {
4460
4342
  object: "node";
4461
4343
  name?: string | undefined;
@@ -4480,198 +4362,143 @@ export declare function absorbWallSeparators(nodes: SceneNodes, levelId: string,
4480
4362
  fromIds: string[];
4481
4363
  } | undefined;
4482
4364
  } | 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;
4365
+ id: `level_${string}`;
4366
+ 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}`)[];
4367
+ level: number;
4368
+ baseElevation: number;
4369
+ height?: number | undefined;
4370
+ type: "level";
4371
+ } | {
4372
+ object: "node";
4373
+ name?: string | undefined;
4374
+ parentId: string | null;
4375
+ visible: boolean;
4376
+ camera?: {
4377
+ position: [number, number, number];
4378
+ target: [number, number, number];
4379
+ mode: "orthographic" | "perspective";
4380
+ fov?: number | undefined;
4381
+ zoom?: number | undefined;
4496
4382
  } | 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;
4383
+ metadata: Record<string, unknown>;
4384
+ provenance?: {
4385
+ refs: {
4386
+ ns?: string | undefined;
4387
+ id: string;
4388
+ role?: "absorbed" | "alias" | "derived" | "piece" | "primary" | undefined;
4389
+ }[];
4390
+ lineage?: {
4391
+ op: "attach" | "convert" | "duplicate" | "import" | "make-independent" | "merge" | "promote" | "split";
4392
+ fromIds: string[];
4554
4393
  } | undefined;
4555
4394
  } | 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;
4395
+ id: `elevator_${string}`;
4396
+ material?: {
4397
+ id?: string | undefined;
4398
+ preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
4399
+ properties?: {
4400
+ color: string;
4401
+ roughness: number;
4402
+ metalness: number;
4403
+ opacity: number;
4404
+ transparent: boolean;
4405
+ side: "back" | "double" | "front";
4595
4406
  } | undefined;
4596
- address?: {
4597
- formatted?: string | undefined;
4598
- precision?: string | undefined;
4407
+ texture?: {
4408
+ url: string;
4409
+ repeat?: [number, number] | undefined;
4410
+ scale?: number | undefined;
4411
+ offset?: [number, number] | undefined;
4412
+ normalMap?: string | undefined;
4413
+ normalScale?: number | undefined;
4414
+ bumpMap?: string | undefined;
4415
+ bumpScale?: number | undefined;
4599
4416
  } | 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;
4622
4417
  } | 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][];
4418
+ materialPreset?: string | undefined;
4419
+ slots?: Record<string, string> | undefined;
4420
+ position: [number, number, number];
4421
+ rotation: number;
4422
+ width: number;
4423
+ depth: number;
4424
+ shaftWidth?: number | undefined;
4425
+ shaftDepth?: number | undefined;
4426
+ shaftWallThickness: number;
4427
+ shaftStyle: "glass" | "solid";
4428
+ cabHeight: number;
4429
+ doorWidth: number;
4430
+ doorHeight: number;
4431
+ doorStyle: "center-opening" | "single-left" | "single-right";
4432
+ doorPanelStyle: "glass-frame" | "segmented-panel" | "solid-panel";
4433
+ fromLevelId: string | null;
4434
+ toLevelId: string | null;
4435
+ servedLevelIds?: string[] | undefined;
4436
+ disabledLevelIds: string[];
4437
+ serviceOnlyLevelIds: string[];
4438
+ defaultLevelId: string | null;
4439
+ speed: number;
4440
+ doorDurationMs: number;
4441
+ dwellMs: number;
4442
+ type: "elevator";
4443
+ } | {
4444
+ object: "node";
4445
+ parentId: string | null;
4446
+ visible: boolean;
4447
+ camera?: {
4448
+ position: [number, number, number];
4449
+ target: [number, number, number];
4450
+ mode: "orthographic" | "perspective";
4451
+ fov?: number | undefined;
4452
+ zoom?: number | undefined;
4453
+ } | undefined;
4454
+ provenance?: {
4455
+ refs: {
4456
+ ns?: string | undefined;
4457
+ id: string;
4458
+ role?: "absorbed" | "alias" | "derived" | "piece" | "primary" | undefined;
4632
4459
  }[];
4460
+ lineage?: {
4461
+ op: "attach" | "convert" | "duplicate" | "import" | "make-independent" | "merge" | "promote" | "split";
4462
+ fromIds: string[];
4463
+ } | undefined;
4633
4464
  } | 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";
4465
+ id: `unit_${string}`;
4466
+ name: string;
4467
+ kind: "apartment" | "commercial" | "common" | "hotel-room";
4468
+ members: `zone_${string}`[];
4469
+ color: string;
4470
+ metadata: Record<string, unknown>;
4471
+ type: "unit";
4472
+ } | {
4473
+ object: "node";
4474
+ name?: string | undefined;
4475
+ parentId: string | null;
4476
+ visible: boolean;
4477
+ camera?: {
4478
+ position: [number, number, number];
4479
+ target: [number, number, number];
4480
+ mode: "orthographic" | "perspective";
4481
+ fov?: number | undefined;
4482
+ zoom?: number | undefined;
4483
+ } | undefined;
4484
+ metadata: Record<string, unknown>;
4485
+ provenance?: {
4486
+ refs: {
4487
+ ns?: string | undefined;
4488
+ id: string;
4489
+ role?: "absorbed" | "alias" | "derived" | "piece" | "primary" | undefined;
4490
+ }[];
4491
+ lineage?: {
4492
+ op: "attach" | "convert" | "duplicate" | "import" | "make-independent" | "merge" | "promote" | "split";
4493
+ fromIds: string[];
4494
+ } | undefined;
4495
+ } | undefined;
4496
+ id: `building_${string}`;
4497
+ children: (`elevator_${string}` | `level_${string}` | `unit_${string}`)[];
4498
+ position: [number, number, number];
4499
+ rotation: [number, number, number];
4500
+ groundLevelId?: `level_${string}` | undefined;
4501
+ type: "building";
4675
4502
  } | {
4676
4503
  object: "node";
4677
4504
  name?: string | undefined;
@@ -5061,88 +4888,23 @@ export declare function absorbWallSeparators(nodes: SceneNodes, levelId: string,
5061
4888
  type: "fridge-bottom-freezer";
5062
4889
  } | {
5063
4890
  id: string;
5064
- height?: number | undefined;
5065
- type: "hood-pyramid";
5066
- } | {
5067
- id: string;
5068
- height?: number | undefined;
5069
- type: "hood-curved-glass";
5070
- })[] | undefined;
5071
- id: `cabinet-module_${string}`;
5072
- children: string[];
5073
- cabinetType: "base" | "tall";
5074
- moduleKind: "corner-filler" | "standard" | "wall-filler";
5075
- openSide?: "left" | "right" | undefined;
5076
- cornerShelf?: boolean | undefined;
5077
- topFinish: "none" | "top-cabinet" | "trim";
5078
- topFinishHeight: number;
5079
- topFinishDepth: number;
5080
- type: "cabinet-module";
5081
- } | {
5082
- object: "node";
5083
- name?: string | undefined;
5084
- parentId: string | null;
5085
- visible: boolean;
5086
- camera?: {
5087
- position: [number, number, number];
5088
- target: [number, number, number];
5089
- mode: "orthographic" | "perspective";
5090
- fov?: number | undefined;
5091
- zoom?: number | undefined;
5092
- } | undefined;
5093
- metadata: Record<string, unknown>;
5094
- provenance?: {
5095
- refs: {
5096
- ns?: string | undefined;
5097
- id: string;
5098
- role?: "absorbed" | "alias" | "derived" | "piece" | "primary" | undefined;
5099
- }[];
5100
- lineage?: {
5101
- op: "attach" | "convert" | "duplicate" | "import" | "make-independent" | "merge" | "promote" | "split";
5102
- fromIds: string[];
5103
- } | undefined;
5104
- } | undefined;
5105
- id: `bvent_${string}`;
5106
- material?: {
5107
- id?: string | undefined;
5108
- preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
5109
- properties?: {
5110
- color: string;
5111
- roughness: number;
5112
- metalness: number;
5113
- opacity: number;
5114
- transparent: boolean;
5115
- side: "back" | "double" | "front";
5116
- } | undefined;
5117
- texture?: {
5118
- url: string;
5119
- repeat?: [number, number] | undefined;
5120
- scale?: number | undefined;
5121
- offset?: [number, number] | undefined;
5122
- normalMap?: string | undefined;
5123
- normalScale?: number | undefined;
5124
- bumpMap?: string | undefined;
5125
- bumpScale?: number | undefined;
5126
- } | undefined;
5127
- } | undefined;
5128
- slots?: Record<string, string> | undefined;
5129
- materialPreset: string;
5130
- roofSegmentId?: string | undefined;
5131
- position: [number, number, number];
5132
- rotation: number;
5133
- width: number;
5134
- depth: number;
5135
- height: number;
5136
- hoodOverhang: number;
5137
- topTaper: number;
5138
- capHeight: number;
5139
- capGap: number;
5140
- domeCurvature: number;
5141
- baseInset: number;
5142
- baseHeight: number;
5143
- cornerBevel: number;
5144
- style: "box" | "cap" | "dome";
5145
- type: "box-vent";
4891
+ height?: number | undefined;
4892
+ type: "hood-pyramid";
4893
+ } | {
4894
+ id: string;
4895
+ height?: number | undefined;
4896
+ type: "hood-curved-glass";
4897
+ })[] | undefined;
4898
+ id: `cabinet-module_${string}`;
4899
+ children: string[];
4900
+ cabinetType: "base" | "tall";
4901
+ moduleKind: "corner-filler" | "standard" | "wall-filler";
4902
+ openSide?: "left" | "right" | undefined;
4903
+ cornerShelf?: boolean | undefined;
4904
+ topFinish: "none" | "top-cabinet" | "trim";
4905
+ topFinishHeight: number;
4906
+ topFinishDepth: number;
4907
+ type: "cabinet-module";
5146
4908
  } | {
5147
4909
  object: "node";
5148
4910
  name?: string | undefined;
@@ -5646,6 +5408,245 @@ export declare function absorbWallSeparators(nodes: SceneNodes, levelId: string,
5646
5408
  frameDepth: number;
5647
5409
  surfaceNormal?: [number, number, number] | undefined;
5648
5410
  type: "solar-panel";
5411
+ } | {
5412
+ object: "node";
5413
+ name?: string | undefined;
5414
+ parentId: string | null;
5415
+ visible: boolean;
5416
+ camera?: {
5417
+ position: [number, number, number];
5418
+ target: [number, number, number];
5419
+ mode: "orthographic" | "perspective";
5420
+ fov?: number | undefined;
5421
+ zoom?: number | undefined;
5422
+ } | undefined;
5423
+ metadata: Record<string, unknown>;
5424
+ provenance?: {
5425
+ refs: {
5426
+ ns?: string | undefined;
5427
+ id: string;
5428
+ role?: "absorbed" | "alias" | "derived" | "piece" | "primary" | undefined;
5429
+ }[];
5430
+ lineage?: {
5431
+ op: "attach" | "convert" | "duplicate" | "import" | "make-independent" | "merge" | "promote" | "split";
5432
+ fromIds: string[];
5433
+ } | undefined;
5434
+ } | undefined;
5435
+ id: `skylight_${string}`;
5436
+ material?: {
5437
+ id?: string | undefined;
5438
+ preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
5439
+ properties?: {
5440
+ color: string;
5441
+ roughness: number;
5442
+ metalness: number;
5443
+ opacity: number;
5444
+ transparent: boolean;
5445
+ side: "back" | "double" | "front";
5446
+ } | undefined;
5447
+ texture?: {
5448
+ url: string;
5449
+ repeat?: [number, number] | undefined;
5450
+ scale?: number | undefined;
5451
+ offset?: [number, number] | undefined;
5452
+ normalMap?: string | undefined;
5453
+ normalScale?: number | undefined;
5454
+ bumpMap?: string | undefined;
5455
+ bumpScale?: number | undefined;
5456
+ } | undefined;
5457
+ } | undefined;
5458
+ materialPreset?: string | undefined;
5459
+ glassMaterial?: {
5460
+ id?: string | undefined;
5461
+ preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
5462
+ properties?: {
5463
+ color: string;
5464
+ roughness: number;
5465
+ metalness: number;
5466
+ opacity: number;
5467
+ transparent: boolean;
5468
+ side: "back" | "double" | "front";
5469
+ } | undefined;
5470
+ texture?: {
5471
+ url: string;
5472
+ repeat?: [number, number] | undefined;
5473
+ scale?: number | undefined;
5474
+ offset?: [number, number] | undefined;
5475
+ normalMap?: string | undefined;
5476
+ normalScale?: number | undefined;
5477
+ bumpMap?: string | undefined;
5478
+ bumpScale?: number | undefined;
5479
+ } | undefined;
5480
+ } | undefined;
5481
+ glassMaterialPreset?: string | undefined;
5482
+ roofSegmentId?: string | undefined;
5483
+ position: [number, number, number];
5484
+ rotation: number;
5485
+ width: number;
5486
+ height: number;
5487
+ frameThickness: number;
5488
+ frameDepth: number;
5489
+ skylightType: "flat" | "lantern" | "opening" | "sliding" | "walk-on";
5490
+ glassThickness: number;
5491
+ lanternHeight: number;
5492
+ lanternTopScale: number;
5493
+ openingAngle: number;
5494
+ openingSide: "bottom" | "left" | "right" | "top";
5495
+ operationState: number;
5496
+ motorHousing: boolean;
5497
+ slideFraction: number;
5498
+ slideDirection: "x" | "z";
5499
+ trackWidth: number;
5500
+ motorHousingSize: number;
5501
+ curb: boolean;
5502
+ curbHeight: number;
5503
+ cutoutOffset: number;
5504
+ surfaceNormal?: [number, number, number] | undefined;
5505
+ type: "skylight";
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;