@pascal-app/core 1.1.0 → 1.1.2

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 (133) hide show
  1. package/dist/agent-operations/__fixtures__/cases.d.ts +3 -2
  2. package/dist/agent-operations/__fixtures__/cases.d.ts.map +1 -1
  3. package/dist/agent-operations/__fixtures__/place-items-cases.d.ts.map +1 -1
  4. package/dist/agent-operations/__fixtures__/place-items-cases.js +28 -0
  5. package/dist/agent-operations/__fixtures__/roof-bearing-cases.d.ts +2618 -2618
  6. package/dist/agent-operations/asset-catalog.d.ts +21 -11
  7. package/dist/agent-operations/asset-catalog.d.ts.map +1 -1
  8. package/dist/agent-operations/asset-catalog.js +28 -10
  9. package/dist/agent-operations/asset-views.d.ts +8 -3
  10. package/dist/agent-operations/asset-views.d.ts.map +1 -1
  11. package/dist/agent-operations/asset-views.js +19 -3
  12. package/dist/agent-operations/batch.d.ts +4 -2
  13. package/dist/agent-operations/batch.d.ts.map +1 -1
  14. package/dist/agent-operations/batch.js +9 -6
  15. package/dist/agent-operations/catalog-asset.d.ts +15 -0
  16. package/dist/agent-operations/catalog-asset.d.ts.map +1 -0
  17. package/dist/agent-operations/catalog-asset.js +4 -0
  18. package/dist/agent-operations/circulation-spaces.d.ts +585 -585
  19. package/dist/agent-operations/design-brief.d.ts.map +1 -1
  20. package/dist/agent-operations/design-brief.js +2 -0
  21. package/dist/agent-operations/furnish-room.d.ts.map +1 -1
  22. package/dist/agent-operations/furnish-room.js +2 -1
  23. package/dist/agent-operations/index.d.ts +5716 -7
  24. package/dist/agent-operations/index.d.ts.map +1 -1
  25. package/dist/agent-operations/index.js +17 -3
  26. package/dist/agent-operations/level-reads.d.ts.map +1 -1
  27. package/dist/agent-operations/level-reads.js +4 -1
  28. package/dist/agent-operations/place-in-room.d.ts.map +1 -1
  29. package/dist/agent-operations/place-in-room.js +2 -1
  30. package/dist/agent-operations/place-items.d.ts.map +1 -1
  31. package/dist/agent-operations/place-items.js +2 -1
  32. package/dist/agent-operations/scene-queries.d.ts +3818 -3818
  33. package/dist/agent-operations/scene-view.d.ts.map +1 -1
  34. package/dist/agent-operations/scene-view.js +38 -13
  35. package/dist/agent-operations/search-assets.d.ts.map +1 -1
  36. package/dist/agent-operations/search-assets.js +6 -0
  37. package/dist/agent-operations/types.d.ts +10 -2
  38. package/dist/agent-operations/types.d.ts.map +1 -1
  39. package/dist/agent-operations/usage-checks.js +18 -3
  40. package/dist/agent-operations/verify-scene.d.ts +7 -3
  41. package/dist/agent-operations/verify-scene.d.ts.map +1 -1
  42. package/dist/agent-operations/verify-scene.js +15 -7
  43. package/dist/agent-tools/assets.js +1 -1
  44. package/dist/building/__fixtures__/wall-opening-cases.d.ts +30 -30
  45. package/dist/building/level-duplication.d.ts +3409 -3409
  46. package/dist/building/level-duplication.d.ts.map +1 -1
  47. package/dist/building/level-duplication.js +3 -1
  48. package/dist/building/wall-openings.d.ts +75 -75
  49. package/dist/commands/structure/shared.d.ts +3407 -3407
  50. package/dist/commands/structure/zone-wall-merge.d.ts +652 -652
  51. package/dist/hooks/spatial-grid/spatial-grid-sync.d.ts +3818 -3818
  52. package/dist/index.d.ts +2 -0
  53. package/dist/index.d.ts.map +1 -1
  54. package/dist/index.js +2 -0
  55. package/dist/lib/__fixtures__/mezzanine.d.ts +2003 -2003
  56. package/dist/lib/absorb-wall-separators.d.ts +1032 -1032
  57. package/dist/lib/asset-storage.d.ts.map +1 -1
  58. package/dist/lib/asset-storage.js +3 -0
  59. package/dist/lib/floor-foundation-datum.d.ts.map +1 -1
  60. package/dist/lib/floor-foundation-datum.js +5 -1
  61. package/dist/lib/floorplan/context.d.ts +95 -0
  62. package/dist/lib/floorplan/context.d.ts.map +1 -0
  63. package/dist/lib/floorplan/context.js +155 -0
  64. package/dist/lib/floorplan/index.d.ts +6 -0
  65. package/dist/lib/floorplan/index.d.ts.map +1 -0
  66. package/dist/lib/floorplan/index.js +5 -0
  67. package/dist/lib/floorplan/marks.d.ts +71 -0
  68. package/dist/lib/floorplan/marks.d.ts.map +1 -0
  69. package/dist/lib/floorplan/marks.js +157 -0
  70. package/dist/lib/floorplan/plan-math.d.ts +18 -0
  71. package/dist/lib/floorplan/plan-math.d.ts.map +1 -0
  72. package/dist/lib/floorplan/plan-math.js +82 -0
  73. package/dist/lib/floorplan/svg-paths.d.ts +17 -0
  74. package/dist/lib/floorplan/svg-paths.d.ts.map +1 -0
  75. package/dist/lib/floorplan/svg-paths.js +92 -0
  76. package/dist/lib/floorplan/wall-affordances.d.ts +31 -0
  77. package/dist/lib/floorplan/wall-affordances.d.ts.map +1 -0
  78. package/dist/lib/floorplan/wall-affordances.js +24 -0
  79. package/dist/lib/steps.d.ts +8 -0
  80. package/dist/lib/steps.d.ts.map +1 -0
  81. package/dist/lib/steps.js +7 -0
  82. package/dist/registry/__fixtures__/roof-planes.d.ts +69 -0
  83. package/dist/registry/__fixtures__/roof-planes.d.ts.map +1 -0
  84. package/dist/registry/__fixtures__/roof-planes.js +59 -0
  85. package/dist/registry/index.d.ts +2 -1
  86. package/dist/registry/index.d.ts.map +1 -1
  87. package/dist/registry/index.js +1 -0
  88. package/dist/registry/roofs.d.ts +34 -0
  89. package/dist/registry/roofs.d.ts.map +1 -0
  90. package/dist/registry/roofs.js +61 -0
  91. package/dist/registry/types.d.ts +30 -0
  92. package/dist/registry/types.d.ts.map +1 -1
  93. package/dist/registry/validate-relations.d.ts +5 -1
  94. package/dist/registry/validate-relations.d.ts.map +1 -1
  95. package/dist/registry/validate-relations.js +6 -2
  96. package/dist/schema/asset-url.d.ts +8 -0
  97. package/dist/schema/asset-url.d.ts.map +1 -1
  98. package/dist/schema/asset-url.js +17 -0
  99. package/dist/schema/nodes/roof.d.ts +1 -1
  100. package/dist/schema/nodes/roof.d.ts.map +1 -1
  101. package/dist/schema/nodes/roof.js +13 -8
  102. package/dist/schema/types.d.ts +1 -1
  103. package/dist/services/roof-level.d.ts.map +1 -1
  104. package/dist/services/roof-level.js +12 -2
  105. package/dist/services/roof-move.d.ts +4 -2
  106. package/dist/services/roof-move.d.ts.map +1 -1
  107. package/dist/services/roof-move.js +21 -9
  108. package/dist/spatial/usage-field/findings.d.ts +10 -1
  109. package/dist/spatial/usage-field/findings.d.ts.map +1 -1
  110. package/dist/spatial/usage-field/findings.js +56 -12
  111. package/dist/spatial/usage-field/measure.d.ts +3 -1
  112. package/dist/spatial/usage-field/measure.d.ts.map +1 -1
  113. package/dist/spatial/usage-field/measure.js +7 -2
  114. package/dist/spatial/usage-field/path.d.ts.map +1 -1
  115. package/dist/spatial/usage-field/path.js +28 -18
  116. package/dist/store/actions/node-actions.d.ts +2380 -2380
  117. package/dist/store/scene-annotations.d.ts +1279 -1279
  118. package/dist/systems/document-reconcile.d.ts.map +1 -1
  119. package/dist/systems/document-reconcile.js +1 -2
  120. package/dist/systems/roof/roof-elevation.d.ts +11 -6
  121. package/dist/systems/roof/roof-elevation.d.ts.map +1 -1
  122. package/dist/systems/roof/roof-elevation.js +24 -11
  123. package/dist/systems/slab/__fixtures__/floor-step.d.ts +2381 -2381
  124. package/dist/systems/slab/__fixtures__/raised-room.d.ts +3818 -3818
  125. package/dist/systems/stair/stair-opening-preview.d.ts +900 -900
  126. package/dist/utils/ensure-scene-openings.d.ts +4815 -4815
  127. package/dist/utils/floor-plate-migration.d.ts +1032 -1032
  128. package/dist/utils/owned-floor-opening-migration.d.ts +1032 -1032
  129. package/dist/utils/reconcile-structure-on-load.d.ts +2380 -2380
  130. package/dist/utils/scene-bounds.d.ts +32 -0
  131. package/dist/utils/scene-bounds.d.ts.map +1 -0
  132. package/dist/utils/scene-bounds.js +201 -0
  133. package/package.json +1 -1
@@ -103,47 +103,18 @@ export declare function floorsOf(nodes: SceneNodes): {
103
103
  fromIds: string[];
104
104
  } | undefined;
105
105
  } | undefined;
106
- id: `bvent_${string}`;
107
- material?: {
108
- id?: string | undefined;
109
- preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
110
- properties?: {
111
- color: string;
112
- roughness: number;
113
- metalness: number;
114
- opacity: number;
115
- transparent: boolean;
116
- side: "back" | "double" | "front";
117
- } | undefined;
118
- texture?: {
119
- url: string;
120
- repeat?: [number, number] | undefined;
121
- scale?: number | undefined;
122
- offset?: [number, number] | undefined;
123
- normalMap?: string | undefined;
124
- normalScale?: number | undefined;
125
- bumpMap?: string | undefined;
126
- bumpScale?: number | undefined;
127
- } | undefined;
128
- } | undefined;
129
- slots?: Record<string, string> | undefined;
130
- materialPreset: string;
131
- roofSegmentId?: string | undefined;
132
- position: [number, number, number];
133
- rotation: number;
106
+ id: `beam_${string}`;
107
+ start: [number, number];
108
+ end: [number, number];
134
109
  width: number;
135
110
  depth: number;
136
- height: number;
137
- hoodOverhang: number;
138
- topTaper: number;
139
- capHeight: number;
140
- capGap: number;
141
- domeCurvature: number;
142
- baseInset: number;
143
- baseHeight: number;
144
- cornerBevel: number;
145
- style: "box" | "cap" | "dome";
146
- type: "box-vent";
111
+ size?: string | undefined;
112
+ plies: number;
113
+ material: "glulam" | "lvl" | "pressure-treated" | "sawn" | "steel";
114
+ placement: "dropped" | "flush";
115
+ topElevation?: number | undefined;
116
+ supportSlabId?: string | undefined;
117
+ type: "beam";
147
118
  } | {
148
119
  object: "node";
149
120
  name?: string | undefined;
@@ -168,223 +139,89 @@ export declare function floorsOf(nodes: SceneNodes): {
168
139
  fromIds: string[];
169
140
  } | undefined;
170
141
  } | undefined;
171
- id: `column_${string}`;
172
- children: string[];
173
- position: [number, number, number];
174
- rotation: number;
175
- supportSlabId?: string | undefined;
176
- source?: {
177
- kind: "script";
178
- meta?: {
179
- description?: string | undefined;
180
- category?: string | undefined;
181
- tags?: string[] | undefined;
182
- parent?: string | undefined;
183
- } | undefined;
184
- language: "bpy" | "three";
185
- script: string;
186
- params: Record<string, string | number | boolean>;
187
- artifact: string;
188
- manifest: {
189
- bounds: {
190
- min: [number, number, number];
191
- max: [number, number, number];
142
+ id: `measurement_${string}`;
143
+ measurement: {
144
+ kind: "volume";
145
+ base: ({
146
+ kind: "feature";
147
+ reference: {
148
+ nodeId: string;
149
+ featureId: string;
150
+ parameters?: Record<string, string | number | boolean> | undefined;
192
151
  };
193
- params: {
194
- id: string;
195
- label?: string | undefined;
196
- kind: "boolean" | "number" | "string";
197
- default: string | number | boolean;
198
- min?: number | undefined;
199
- max?: number | undefined;
200
- step?: number | undefined;
201
- unit?: string | undefined;
202
- options?: string[] | undefined;
203
- }[];
204
- parts: {
205
- id: string;
206
- label?: string | undefined;
207
- type?: string | undefined;
208
- bounds?: {
209
- min: [number, number, number];
210
- max: [number, number, number];
211
- } | undefined;
212
- }[];
213
- surfaces: {
214
- part?: string | undefined;
215
- y: number;
216
- polygon: [number, number][];
217
- }[];
218
- slots: {
219
- id: string;
220
- label?: string | undefined;
221
- color?: string | undefined;
222
- roughness?: number | undefined;
223
- metalness?: number | undefined;
224
- transparent?: boolean | undefined;
225
- emissive?: boolean | undefined;
226
- }[];
227
- anchors: {
228
- id: string;
229
- position: [number, number, number];
230
- normal?: [number, number, number] | undefined;
231
- }[];
232
- lights: {
233
- id: string;
234
- position: [number, number, number];
235
- color: string;
236
- intensity: number;
237
- distance?: number | undefined;
238
- spot?: {
239
- direction: [number, number, number];
240
- angle: number;
241
- softness: number;
242
- } | undefined;
243
- shadows?: boolean | undefined;
244
- glow?: {
245
- size: number;
246
- strength: number;
247
- } | undefined;
248
- }[];
249
- undersides: {
250
- part?: string | undefined;
251
- polygon: [number, number][];
252
- plane: [number, number, number, number];
253
- }[];
254
- animations: {
255
- name: string;
256
- duration: number;
257
- }[];
258
- cutters?: {
259
- host: "ceiling" | "mounted" | "slab" | "wall";
260
- polygon: number[][];
261
- minY: number;
262
- maxY: number;
263
- }[] | undefined;
264
- cutout: boolean;
265
- collider: boolean;
266
- shape?: {
267
- tolerance: number;
268
- bands: {
269
- y0: number;
270
- y1: number;
271
- polygons: {
272
- outer: [number, number][];
273
- holes?: [number, number][][] | undefined;
274
- }[];
275
- }[];
276
- } | undefined;
277
- triangles: number;
278
- coverage?: number | undefined;
279
- uncovered?: {
280
- min: [number, number];
281
- max: [number, number];
282
- }[] | undefined;
283
- };
284
- images?: {
285
- artifact: string;
286
- thumbnail: string;
287
- floorPlan: string;
288
- } | undefined;
289
- } | undefined;
290
- style: "cluster" | "dravidian-carved" | "faceted" | "fluted" | "lathe-turned" | "plain";
291
- crossSection: "octagonal" | "rectangular" | "round" | "sixteen-sided" | "square";
292
- height: number;
293
- radius: number;
294
- width: number;
295
- depth: number;
296
- edgeSoftness: number;
297
- baseHeight: number;
298
- capitalHeight: number;
299
- shaftProfile: "baluster" | "bulged" | "hourglass" | "straight" | "tapered";
300
- shaftTaper: number;
301
- shaftBulge: number;
302
- shaftStartScale: number;
303
- shaftEndScale: number;
304
- shaftSegmentCount: number;
305
- shaftTwistStep: number;
306
- shaftCornerRadius: number;
307
- shaftDetail: "fluted" | "lathe-turned" | "none" | "panelled" | "spiral";
308
- baseStyle: "lotus" | "none" | "panelled-pedestal" | "ribbed-lotus" | "round-rings" | "simple-square" | "square-plinth" | "stepped-square";
309
- baseWidthScale: number;
310
- baseDepthScale: number;
311
- baseTierCount: number;
312
- baseStepSpread: number;
313
- basePlinthHeightRatio: number;
314
- baseRoundBandScale: number;
315
- baseNeckScale: number;
316
- baseRoundBandCount: number;
317
- baseRibCount: number;
318
- baseCarvingLevel: number;
319
- basePanelInset: number;
320
- capitalStyle: "corinthian-leaf" | "doric" | "ionic-volute" | "leaf-carved" | "none" | "rounded" | "simple" | "simple-slab" | "south-indian-bracket" | "stepped" | "volute" | "wood-bracket";
321
- capitalWidthScale: number;
322
- capitalDepthScale: number;
323
- capitalTierCount: number;
324
- capitalStepSpread: number;
325
- capitalBandCount: number;
326
- voluteSize: number;
327
- voluteCount: number;
328
- leafCount: number;
329
- leafRows: number;
330
- bracketDepth: number;
331
- bracketTierCount: number;
332
- pendantCount: number;
333
- capitalCarvingLevel: number;
334
- ringCount: number;
335
- ringPlacement: "bottom" | "ends" | "even" | "top";
336
- ringThickness: number;
337
- ringSpread: number;
338
- fluteCount: number;
339
- fluteDepth: number;
340
- fluteWidth: number;
341
- spiralTwist: number;
342
- spiralRibCount: number;
343
- panelCount: number;
344
- panelInsetDepth: number;
345
- panelShape: "arched" | "diamond" | "rectangle";
346
- latheRingCount: number;
347
- latheRingSpacing: "bottom" | "ends" | "even" | "top";
348
- carvingLevel: number;
349
- carvingPlacement: "all" | "base" | "capital" | "shaft";
350
- lowerBandEnabled: boolean;
351
- lowerBandHeight: number;
352
- lowerBandCarvingLevel: number;
353
- dentilCount: number;
354
- beadCount: number;
355
- supportStyle: "a-frame" | "box-frame" | "k-brace" | "portal-frame" | "single-strut" | "trestle" | "tripod" | "v-frame" | "vertical" | "x-brace" | "y-frame";
356
- braceWidth: number;
357
- braceDepth: number;
358
- braceBottomSpread: number;
359
- braceTopSpread: number;
360
- bracePlateEnabled: boolean;
361
- role?: "ornament" | "post" | undefined;
362
- postBase?: "none" | "pier" | "post-base" | undefined;
363
- material?: {
364
- id?: string | undefined;
365
- preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
366
- properties?: {
367
- color: string;
368
- roughness: number;
369
- metalness: number;
370
- opacity: number;
371
- transparent: boolean;
372
- side: "back" | "double" | "front";
373
- } | undefined;
374
- texture?: {
375
- url: string;
376
- repeat?: [number, number] | undefined;
377
- scale?: number | undefined;
378
- offset?: [number, number] | undefined;
379
- normalMap?: string | undefined;
380
- normalScale?: number | undefined;
381
- bumpMap?: string | undefined;
382
- bumpScale?: number | undefined;
383
- } | undefined;
384
- } | undefined;
385
- materialPreset?: string | undefined;
386
- slots?: Record<string, string> | undefined;
387
- type: "column";
152
+ fallback: [number, number, number];
153
+ } | [number, number, number])[];
154
+ extrusion: [number, number, number];
155
+ } | {
156
+ kind: "distance";
157
+ points: [{
158
+ kind: "feature";
159
+ reference: {
160
+ nodeId: string;
161
+ featureId: string;
162
+ parameters?: Record<string, string | number | boolean> | undefined;
163
+ };
164
+ fallback: [number, number, number];
165
+ } | [number, number, number], {
166
+ kind: "feature";
167
+ reference: {
168
+ nodeId: string;
169
+ featureId: string;
170
+ parameters?: Record<string, string | number | boolean> | undefined;
171
+ };
172
+ fallback: [number, number, number];
173
+ } | [number, number, number]];
174
+ } | {
175
+ kind: "angle";
176
+ points: [{
177
+ kind: "feature";
178
+ reference: {
179
+ nodeId: string;
180
+ featureId: string;
181
+ parameters?: Record<string, string | number | boolean> | undefined;
182
+ };
183
+ fallback: [number, number, number];
184
+ } | [number, number, number], {
185
+ kind: "feature";
186
+ reference: {
187
+ nodeId: string;
188
+ featureId: string;
189
+ parameters?: Record<string, string | number | boolean> | undefined;
190
+ };
191
+ fallback: [number, number, number];
192
+ } | [number, number, number], {
193
+ kind: "feature";
194
+ reference: {
195
+ nodeId: string;
196
+ featureId: string;
197
+ parameters?: Record<string, string | number | boolean> | undefined;
198
+ };
199
+ fallback: [number, number, number];
200
+ } | [number, number, number]];
201
+ } | {
202
+ kind: "area";
203
+ base: ({
204
+ kind: "feature";
205
+ reference: {
206
+ nodeId: string;
207
+ featureId: string;
208
+ parameters?: Record<string, string | number | boolean> | undefined;
209
+ };
210
+ fallback: [number, number, number];
211
+ } | [number, number, number])[];
212
+ } | {
213
+ kind: "perimeter";
214
+ base: ({
215
+ kind: "feature";
216
+ reference: {
217
+ nodeId: string;
218
+ featureId: string;
219
+ parameters?: Record<string, string | number | boolean> | undefined;
220
+ };
221
+ fallback: [number, number, number];
222
+ } | [number, number, number])[];
223
+ };
224
+ type: "measurement";
388
225
  } | {
389
226
  object: "node";
390
227
  name?: string | undefined;
@@ -409,29 +246,72 @@ export declare function floorsOf(nodes: SceneNodes): {
409
246
  fromIds: string[];
410
247
  } | undefined;
411
248
  } | undefined;
412
- id: `duct-fitting_${string}`;
413
- position: [number, number, number];
414
- rotation: [number, number, number];
415
- fittingType: "access-panel" | "coupling" | "cross" | "damper" | "elbow" | "end-cap" | "reducer" | "tee" | "transition";
249
+ id: `duct-segment_${string}`;
250
+ path: [number, number, number][];
251
+ autoHangers?: boolean | undefined;
252
+ hangerOverrides?: Record<string, {
253
+ fraction?: number | undefined;
254
+ skipped?: boolean | undefined;
255
+ hostId?: string | undefined;
256
+ }> | undefined;
257
+ hangerStyle?: "double" | "single" | undefined;
258
+ hangerSpacing?: number | undefined;
259
+ hangerMaxReach?: number | undefined;
260
+ wallAttachment?: {
261
+ wallId: `wall_${string}`;
262
+ side: "back" | "front";
263
+ startUV: [number, number];
264
+ endUV: [number, number];
265
+ offset: number;
266
+ } | undefined;
416
267
  shape: "oval" | "rect" | "round";
417
- inletShape?: "oval" | "rect" | "round" | undefined;
418
- outletShape?: "oval" | "rect" | "round" | undefined;
268
+ diameter: number;
419
269
  width: number;
420
270
  height: number;
421
- shape2: "oval" | "rect" | "round";
422
- width2: number;
423
- height2: number;
424
- angle: number;
425
- branchAngle: number;
426
- diameter: number;
427
- diameter2: number;
428
- ductMaterial: "duct-board" | "flex" | "sheet-metal";
271
+ roll: number;
272
+ ductMaterial: "duct-board" | "flex" | "sheet-metal" | "spiral";
273
+ seamDetail: boolean;
274
+ insulated: boolean;
275
+ insulationR: number;
429
276
  system: "return" | "supply";
430
- damperAngle: number;
431
- panelWidth: number;
432
- panelHeight: number;
433
277
  slots?: Record<string, string> | undefined;
434
- type: "duct-fitting";
278
+ type: "duct-segment";
279
+ } | {
280
+ object: "node";
281
+ name?: string | undefined;
282
+ parentId: string | null;
283
+ visible: boolean;
284
+ camera?: {
285
+ position: [number, number, number];
286
+ target: [number, number, number];
287
+ mode: "orthographic" | "perspective";
288
+ fov?: number | undefined;
289
+ zoom?: number | undefined;
290
+ } | undefined;
291
+ metadata: Record<string, unknown>;
292
+ provenance?: {
293
+ refs: {
294
+ ns?: string | undefined;
295
+ id: string;
296
+ role?: "absorbed" | "alias" | "derived" | "piece" | "primary" | undefined;
297
+ }[];
298
+ lineage?: {
299
+ op: "attach" | "convert" | "duplicate" | "import" | "make-independent" | "merge" | "promote" | "split";
300
+ fromIds: string[];
301
+ } | undefined;
302
+ } | undefined;
303
+ id: `floor-opening_${string}`;
304
+ polygon: [number, number][];
305
+ hostZoneId?: string | undefined;
306
+ legacyPlateCuts?: Record<string, [number, number][][]> | undefined;
307
+ legacyCeilingCuts?: Record<string, [number, number][][]> | undefined;
308
+ source: string;
309
+ ownerId?: string | undefined;
310
+ surfaceId?: string | undefined;
311
+ drawnOn: "ceiling" | "floor";
312
+ cutsPrimary: boolean;
313
+ cutsAdjacent: boolean;
314
+ type: "floor-opening";
435
315
  } | {
436
316
  object: "node";
437
317
  name?: string | undefined;
@@ -456,23 +336,12 @@ export declare function floorsOf(nodes: SceneNodes): {
456
336
  fromIds: string[];
457
337
  } | undefined;
458
338
  } | undefined;
459
- id: `hvac-equipment_${string}`;
460
- position: [number, number, number];
461
- rotation: number;
462
- supportSlabId?: string | undefined;
463
- equipmentType: "air-handler" | "condenser" | "furnace";
464
- width: number;
465
- depth: number;
466
- height: number;
467
- supplyShape: "oval" | "rect" | "round";
468
- returnShape: "oval" | "rect" | "round";
469
- supplyDiameter: number;
470
- returnDiameter: number;
471
- supplyWidth: number;
472
- supplyHeight: number;
473
- returnWidth: number;
474
- returnHeight: number;
475
- type: "hvac-equipment";
339
+ id: `lineset_${string}`;
340
+ path: [number, number, number][];
341
+ suctionDiameter: number;
342
+ liquidDiameter: number;
343
+ insulated: boolean;
344
+ type: "lineset";
476
345
  } | {
477
346
  object: "node";
478
347
  name?: string | undefined;
@@ -497,17 +366,13 @@ export declare function floorsOf(nodes: SceneNodes): {
497
366
  fromIds: string[];
498
367
  } | undefined;
499
368
  } | undefined;
500
- id: `pipe-fitting_${string}`;
369
+ id: `pipe-trap_${string}`;
501
370
  position: [number, number, number];
502
- rotation: [number, number, number];
503
- fittingType: "cleanout" | "coupling" | "cross" | "elbow" | "end-cap" | "reducer" | "sanitary-tee" | "wye";
504
- angle: number;
371
+ rotation: number;
505
372
  diameter: number;
506
- diameter2: number;
507
- cleanoutStyle: "end" | "inline";
508
373
  pipeMaterial: "abs" | "cast-iron" | "pvc";
509
- system: "vent" | "waste";
510
- type: "pipe-fitting";
374
+ armLengthM: number;
375
+ type: "pipe-trap";
511
376
  } | {
512
377
  object: "node";
513
378
  name?: string | undefined;
@@ -1040,7 +905,7 @@ export declare function floorsOf(nodes: SceneNodes): {
1040
905
  cavityInsulation?: string | undefined;
1041
906
  } | undefined;
1042
907
  slots?: Record<string, string> | undefined;
1043
- children: `rseg_${string}`[];
908
+ children: string[];
1044
909
  type: "roof";
1045
910
  } | {
1046
911
  object: "node";
@@ -1605,7 +1470,217 @@ export declare function floorsOf(nodes: SceneNodes): {
1605
1470
  bumpScale?: number | undefined;
1606
1471
  } | undefined;
1607
1472
  } | undefined;
1608
- slots?: Record<string, string> | undefined;
1473
+ slots?: Record<string, string> | undefined;
1474
+ source?: {
1475
+ kind: "script";
1476
+ meta?: {
1477
+ description?: string | undefined;
1478
+ category?: string | undefined;
1479
+ tags?: string[] | undefined;
1480
+ parent?: string | undefined;
1481
+ } | undefined;
1482
+ language: "bpy" | "three";
1483
+ script: string;
1484
+ params: Record<string, string | number | boolean>;
1485
+ artifact: string;
1486
+ manifest: {
1487
+ bounds: {
1488
+ min: [number, number, number];
1489
+ max: [number, number, number];
1490
+ };
1491
+ params: {
1492
+ id: string;
1493
+ label?: string | undefined;
1494
+ kind: "boolean" | "number" | "string";
1495
+ default: string | number | boolean;
1496
+ min?: number | undefined;
1497
+ max?: number | undefined;
1498
+ step?: number | undefined;
1499
+ unit?: string | undefined;
1500
+ options?: string[] | undefined;
1501
+ }[];
1502
+ parts: {
1503
+ id: string;
1504
+ label?: string | undefined;
1505
+ type?: string | undefined;
1506
+ bounds?: {
1507
+ min: [number, number, number];
1508
+ max: [number, number, number];
1509
+ } | undefined;
1510
+ }[];
1511
+ surfaces: {
1512
+ part?: string | undefined;
1513
+ y: number;
1514
+ polygon: [number, number][];
1515
+ }[];
1516
+ slots: {
1517
+ id: string;
1518
+ label?: string | undefined;
1519
+ color?: string | undefined;
1520
+ roughness?: number | undefined;
1521
+ metalness?: number | undefined;
1522
+ transparent?: boolean | undefined;
1523
+ emissive?: boolean | undefined;
1524
+ }[];
1525
+ anchors: {
1526
+ id: string;
1527
+ position: [number, number, number];
1528
+ normal?: [number, number, number] | undefined;
1529
+ }[];
1530
+ lights: {
1531
+ id: string;
1532
+ position: [number, number, number];
1533
+ color: string;
1534
+ intensity: number;
1535
+ distance?: number | undefined;
1536
+ spot?: {
1537
+ direction: [number, number, number];
1538
+ angle: number;
1539
+ softness: number;
1540
+ } | undefined;
1541
+ shadows?: boolean | undefined;
1542
+ glow?: {
1543
+ size: number;
1544
+ strength: number;
1545
+ } | undefined;
1546
+ }[];
1547
+ undersides: {
1548
+ part?: string | undefined;
1549
+ polygon: [number, number][];
1550
+ plane: [number, number, number, number];
1551
+ }[];
1552
+ animations: {
1553
+ name: string;
1554
+ duration: number;
1555
+ }[];
1556
+ cutters?: {
1557
+ host: "ceiling" | "mounted" | "slab" | "wall";
1558
+ polygon: number[][];
1559
+ minY: number;
1560
+ maxY: number;
1561
+ }[] | undefined;
1562
+ cutout: boolean;
1563
+ collider: boolean;
1564
+ shape?: {
1565
+ tolerance: number;
1566
+ bands: {
1567
+ y0: number;
1568
+ y1: number;
1569
+ polygons: {
1570
+ outer: [number, number][];
1571
+ holes?: [number, number][][] | undefined;
1572
+ }[];
1573
+ }[];
1574
+ } | undefined;
1575
+ triangles: number;
1576
+ coverage?: number | undefined;
1577
+ uncovered?: {
1578
+ min: [number, number];
1579
+ max: [number, number];
1580
+ }[] | undefined;
1581
+ };
1582
+ images?: {
1583
+ artifact: string;
1584
+ thumbnail: string;
1585
+ floorPlan: string;
1586
+ } | undefined;
1587
+ } | undefined;
1588
+ position: [number, number, number];
1589
+ rotation: [number, number, number];
1590
+ side?: "back" | "front" | undefined;
1591
+ verticalAnchor?: "floor" | "wall" | undefined;
1592
+ floorThresholdVersion: 0 | 1;
1593
+ wallId?: string | undefined;
1594
+ dormerId?: string | undefined;
1595
+ dormerFace?: "back" | "front" | "left" | "right" | undefined;
1596
+ roofSegmentId?: string | undefined;
1597
+ roofFace?: "back" | "front" | "left" | "right" | undefined;
1598
+ width: number;
1599
+ height: number;
1600
+ mark?: string | undefined;
1601
+ constructionType: "framed" | "masonry";
1602
+ dimensionReference: "finish-opening" | "masonry-opening" | "nominal" | "rough-opening";
1603
+ roughOpeningWidth?: number | undefined;
1604
+ roughOpeningHeight?: number | undefined;
1605
+ masonryOpeningWidth?: number | undefined;
1606
+ masonryOpeningHeight?: number | undefined;
1607
+ finishOpeningWidth?: number | undefined;
1608
+ finishOpeningHeight?: number | undefined;
1609
+ openingKind: "opening" | "window";
1610
+ windowType: "awning" | "bay" | "bow" | "casement" | "double-hung" | "fixed" | "hopper" | "louvered" | "single-hung" | "sliding" | "tilt-turn";
1611
+ operationState: number;
1612
+ openingDirection?: "inward" | "outward" | undefined;
1613
+ tiltTurnMode?: "tilt" | "turn" | undefined;
1614
+ awningDirection: "down" | "up";
1615
+ casementStyle: "french" | "single";
1616
+ hingesSide: "left" | "right";
1617
+ openingShape: "arch" | "rectangle" | "rounded";
1618
+ openingRadiusMode: "all" | "individual";
1619
+ openingCornerRadii: [number, number, number, number];
1620
+ cornerRadius: number;
1621
+ archHeight: number;
1622
+ openingRevealRadius: number;
1623
+ frameThickness: number;
1624
+ frameDepth?: number | undefined;
1625
+ windowHandle?: boolean | undefined;
1626
+ sashGrid?: boolean | undefined;
1627
+ columnRatios: number[];
1628
+ rowRatios: number[];
1629
+ columnDividerThickness: number;
1630
+ rowDividerThickness: number;
1631
+ corner?: {
1632
+ end: "end" | "start";
1633
+ partnerId: string;
1634
+ post: "none" | "post";
1635
+ } | undefined;
1636
+ sill: boolean;
1637
+ sillDepth: number;
1638
+ sillThickness: number;
1639
+ sillOverhang?: number | undefined;
1640
+ sillInterior?: boolean | undefined;
1641
+ sillInteriorDepth?: number | undefined;
1642
+ sillInteriorThickness?: number | undefined;
1643
+ sillInteriorOverhang?: number | undefined;
1644
+ shutters?: "board-batten" | "louvered" | "none" | "panel" | undefined;
1645
+ shutterWidth?: number | undefined;
1646
+ shutterOpen?: number | undefined;
1647
+ shutterSides?: "both" | "left" | "right" | undefined;
1648
+ rollerShutter?: "box" | "concealed" | "none" | undefined;
1649
+ rollerShutterBoxHeight?: number | undefined;
1650
+ rollerShutterOpen?: number | undefined;
1651
+ casingFaceA?: boolean | undefined;
1652
+ casingFaceB?: boolean | undefined;
1653
+ casingWidth?: number | undefined;
1654
+ type: "window";
1655
+ } | {
1656
+ object: "node";
1657
+ name?: string | undefined;
1658
+ parentId: string | null;
1659
+ visible: boolean;
1660
+ camera?: {
1661
+ position: [number, number, number];
1662
+ target: [number, number, number];
1663
+ mode: "orthographic" | "perspective";
1664
+ fov?: number | undefined;
1665
+ zoom?: number | undefined;
1666
+ } | undefined;
1667
+ metadata: Record<string, unknown>;
1668
+ provenance?: {
1669
+ refs: {
1670
+ ns?: string | undefined;
1671
+ id: string;
1672
+ role?: "absorbed" | "alias" | "derived" | "piece" | "primary" | undefined;
1673
+ }[];
1674
+ lineage?: {
1675
+ op: "attach" | "convert" | "duplicate" | "import" | "make-independent" | "merge" | "promote" | "split";
1676
+ fromIds: string[];
1677
+ } | undefined;
1678
+ } | undefined;
1679
+ id: `column_${string}`;
1680
+ children: string[];
1681
+ position: [number, number, number];
1682
+ rotation: number;
1683
+ supportSlabId?: string | undefined;
1609
1684
  source?: {
1610
1685
  kind: "script";
1611
1686
  meta?: {
@@ -1720,73 +1795,104 @@ export declare function floorsOf(nodes: SceneNodes): {
1720
1795
  floorPlan: string;
1721
1796
  } | undefined;
1722
1797
  } | undefined;
1723
- position: [number, number, number];
1724
- rotation: [number, number, number];
1725
- side?: "back" | "front" | undefined;
1726
- verticalAnchor?: "floor" | "wall" | undefined;
1727
- floorThresholdVersion: 0 | 1;
1728
- wallId?: string | undefined;
1729
- dormerId?: string | undefined;
1730
- dormerFace?: "back" | "front" | "left" | "right" | undefined;
1731
- roofSegmentId?: string | undefined;
1732
- roofFace?: "back" | "front" | "left" | "right" | undefined;
1733
- width: number;
1798
+ style: "cluster" | "dravidian-carved" | "faceted" | "fluted" | "lathe-turned" | "plain";
1799
+ crossSection: "octagonal" | "rectangular" | "round" | "sixteen-sided" | "square";
1734
1800
  height: number;
1735
- mark?: string | undefined;
1736
- constructionType: "framed" | "masonry";
1737
- dimensionReference: "finish-opening" | "masonry-opening" | "nominal" | "rough-opening";
1738
- roughOpeningWidth?: number | undefined;
1739
- roughOpeningHeight?: number | undefined;
1740
- masonryOpeningWidth?: number | undefined;
1741
- masonryOpeningHeight?: number | undefined;
1742
- finishOpeningWidth?: number | undefined;
1743
- finishOpeningHeight?: number | undefined;
1744
- openingKind: "opening" | "window";
1745
- windowType: "awning" | "bay" | "bow" | "casement" | "double-hung" | "fixed" | "hopper" | "louvered" | "single-hung" | "sliding" | "tilt-turn";
1746
- operationState: number;
1747
- openingDirection?: "inward" | "outward" | undefined;
1748
- tiltTurnMode?: "tilt" | "turn" | undefined;
1749
- awningDirection: "down" | "up";
1750
- casementStyle: "french" | "single";
1751
- hingesSide: "left" | "right";
1752
- openingShape: "arch" | "rectangle" | "rounded";
1753
- openingRadiusMode: "all" | "individual";
1754
- openingCornerRadii: [number, number, number, number];
1755
- cornerRadius: number;
1756
- archHeight: number;
1757
- openingRevealRadius: number;
1758
- frameThickness: number;
1759
- frameDepth?: number | undefined;
1760
- windowHandle?: boolean | undefined;
1761
- sashGrid?: boolean | undefined;
1762
- columnRatios: number[];
1763
- rowRatios: number[];
1764
- columnDividerThickness: number;
1765
- rowDividerThickness: number;
1766
- corner?: {
1767
- end: "end" | "start";
1768
- partnerId: string;
1769
- post: "none" | "post";
1801
+ radius: number;
1802
+ width: number;
1803
+ depth: number;
1804
+ edgeSoftness: number;
1805
+ baseHeight: number;
1806
+ capitalHeight: number;
1807
+ shaftProfile: "baluster" | "bulged" | "hourglass" | "straight" | "tapered";
1808
+ shaftTaper: number;
1809
+ shaftBulge: number;
1810
+ shaftStartScale: number;
1811
+ shaftEndScale: number;
1812
+ shaftSegmentCount: number;
1813
+ shaftTwistStep: number;
1814
+ shaftCornerRadius: number;
1815
+ shaftDetail: "fluted" | "lathe-turned" | "none" | "panelled" | "spiral";
1816
+ baseStyle: "lotus" | "none" | "panelled-pedestal" | "ribbed-lotus" | "round-rings" | "simple-square" | "square-plinth" | "stepped-square";
1817
+ baseWidthScale: number;
1818
+ baseDepthScale: number;
1819
+ baseTierCount: number;
1820
+ baseStepSpread: number;
1821
+ basePlinthHeightRatio: number;
1822
+ baseRoundBandScale: number;
1823
+ baseNeckScale: number;
1824
+ baseRoundBandCount: number;
1825
+ baseRibCount: number;
1826
+ baseCarvingLevel: number;
1827
+ basePanelInset: number;
1828
+ capitalStyle: "corinthian-leaf" | "doric" | "ionic-volute" | "leaf-carved" | "none" | "rounded" | "simple" | "simple-slab" | "south-indian-bracket" | "stepped" | "volute" | "wood-bracket";
1829
+ capitalWidthScale: number;
1830
+ capitalDepthScale: number;
1831
+ capitalTierCount: number;
1832
+ capitalStepSpread: number;
1833
+ capitalBandCount: number;
1834
+ voluteSize: number;
1835
+ voluteCount: number;
1836
+ leafCount: number;
1837
+ leafRows: number;
1838
+ bracketDepth: number;
1839
+ bracketTierCount: number;
1840
+ pendantCount: number;
1841
+ capitalCarvingLevel: number;
1842
+ ringCount: number;
1843
+ ringPlacement: "bottom" | "ends" | "even" | "top";
1844
+ ringThickness: number;
1845
+ ringSpread: number;
1846
+ fluteCount: number;
1847
+ fluteDepth: number;
1848
+ fluteWidth: number;
1849
+ spiralTwist: number;
1850
+ spiralRibCount: number;
1851
+ panelCount: number;
1852
+ panelInsetDepth: number;
1853
+ panelShape: "arched" | "diamond" | "rectangle";
1854
+ latheRingCount: number;
1855
+ latheRingSpacing: "bottom" | "ends" | "even" | "top";
1856
+ carvingLevel: number;
1857
+ carvingPlacement: "all" | "base" | "capital" | "shaft";
1858
+ lowerBandEnabled: boolean;
1859
+ lowerBandHeight: number;
1860
+ lowerBandCarvingLevel: number;
1861
+ dentilCount: number;
1862
+ beadCount: number;
1863
+ supportStyle: "a-frame" | "box-frame" | "k-brace" | "portal-frame" | "single-strut" | "trestle" | "tripod" | "v-frame" | "vertical" | "x-brace" | "y-frame";
1864
+ braceWidth: number;
1865
+ braceDepth: number;
1866
+ braceBottomSpread: number;
1867
+ braceTopSpread: number;
1868
+ bracePlateEnabled: boolean;
1869
+ role?: "ornament" | "post" | undefined;
1870
+ postBase?: "none" | "pier" | "post-base" | undefined;
1871
+ material?: {
1872
+ id?: string | undefined;
1873
+ preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
1874
+ properties?: {
1875
+ color: string;
1876
+ roughness: number;
1877
+ metalness: number;
1878
+ opacity: number;
1879
+ transparent: boolean;
1880
+ side: "back" | "double" | "front";
1881
+ } | undefined;
1882
+ texture?: {
1883
+ url: string;
1884
+ repeat?: [number, number] | undefined;
1885
+ scale?: number | undefined;
1886
+ offset?: [number, number] | undefined;
1887
+ normalMap?: string | undefined;
1888
+ normalScale?: number | undefined;
1889
+ bumpMap?: string | undefined;
1890
+ bumpScale?: number | undefined;
1891
+ } | undefined;
1770
1892
  } | undefined;
1771
- sill: boolean;
1772
- sillDepth: number;
1773
- sillThickness: number;
1774
- sillOverhang?: number | undefined;
1775
- sillInterior?: boolean | undefined;
1776
- sillInteriorDepth?: number | undefined;
1777
- sillInteriorThickness?: number | undefined;
1778
- sillInteriorOverhang?: number | undefined;
1779
- shutters?: "board-batten" | "louvered" | "none" | "panel" | undefined;
1780
- shutterWidth?: number | undefined;
1781
- shutterOpen?: number | undefined;
1782
- shutterSides?: "both" | "left" | "right" | undefined;
1783
- rollerShutter?: "box" | "concealed" | "none" | undefined;
1784
- rollerShutterBoxHeight?: number | undefined;
1785
- rollerShutterOpen?: number | undefined;
1786
- casingFaceA?: boolean | undefined;
1787
- casingFaceB?: boolean | undefined;
1788
- casingWidth?: number | undefined;
1789
- type: "window";
1893
+ materialPreset?: string | undefined;
1894
+ slots?: Record<string, string> | undefined;
1895
+ type: "column";
1790
1896
  } | {
1791
1897
  object: "node";
1792
1898
  name?: string | undefined;
@@ -3397,42 +3503,6 @@ export declare function floorsOf(nodes: SceneNodes): {
3397
3503
  start: [number, number];
3398
3504
  end: [number, number];
3399
3505
  type: "separator";
3400
- } | {
3401
- object: "node";
3402
- name?: string | undefined;
3403
- parentId: string | null;
3404
- visible: boolean;
3405
- camera?: {
3406
- position: [number, number, number];
3407
- target: [number, number, number];
3408
- mode: "orthographic" | "perspective";
3409
- fov?: number | undefined;
3410
- zoom?: number | undefined;
3411
- } | undefined;
3412
- metadata: Record<string, unknown>;
3413
- provenance?: {
3414
- refs: {
3415
- ns?: string | undefined;
3416
- id: string;
3417
- role?: "absorbed" | "alias" | "derived" | "piece" | "primary" | undefined;
3418
- }[];
3419
- lineage?: {
3420
- op: "attach" | "convert" | "duplicate" | "import" | "make-independent" | "merge" | "promote" | "split";
3421
- fromIds: string[];
3422
- } | undefined;
3423
- } | undefined;
3424
- id: `floor-opening_${string}`;
3425
- polygon: [number, number][];
3426
- hostZoneId?: string | undefined;
3427
- legacyPlateCuts?: Record<string, [number, number][][]> | undefined;
3428
- legacyCeilingCuts?: Record<string, [number, number][][]> | undefined;
3429
- source: string;
3430
- ownerId?: string | undefined;
3431
- surfaceId?: string | undefined;
3432
- drawnOn: "ceiling" | "floor";
3433
- cutsPrimary: boolean;
3434
- cutsAdjacent: boolean;
3435
- type: "floor-opening";
3436
3506
  } | {
3437
3507
  object: "node";
3438
3508
  name?: string | undefined;
@@ -3521,48 +3591,12 @@ export declare function floorsOf(nodes: SceneNodes): {
3521
3591
  showInfill: boolean;
3522
3592
  guardInfill?: "balusters" | "boards" | "cable" | undefined;
3523
3593
  startPost?: boolean | undefined;
3524
- endPost?: boolean | undefined;
3525
- postThrough?: boolean | undefined;
3526
- infillPlacement: "back" | "center" | "front";
3527
- color: string;
3528
- style: "guard" | "horizontal" | "picket" | "privacy" | "rail" | "slat";
3529
- type: "fence";
3530
- } | {
3531
- object: "node";
3532
- name?: string | undefined;
3533
- parentId: string | null;
3534
- visible: boolean;
3535
- camera?: {
3536
- position: [number, number, number];
3537
- target: [number, number, number];
3538
- mode: "orthographic" | "perspective";
3539
- fov?: number | undefined;
3540
- zoom?: number | undefined;
3541
- } | undefined;
3542
- metadata: Record<string, unknown>;
3543
- provenance?: {
3544
- refs: {
3545
- ns?: string | undefined;
3546
- id: string;
3547
- role?: "absorbed" | "alias" | "derived" | "piece" | "primary" | undefined;
3548
- }[];
3549
- lineage?: {
3550
- op: "attach" | "convert" | "duplicate" | "import" | "make-independent" | "merge" | "promote" | "split";
3551
- fromIds: string[];
3552
- } | undefined;
3553
- } | undefined;
3554
- id: `beam_${string}`;
3555
- start: [number, number];
3556
- end: [number, number];
3557
- width: number;
3558
- depth: number;
3559
- size?: string | undefined;
3560
- plies: number;
3561
- material: "glulam" | "lvl" | "pressure-treated" | "sawn" | "steel";
3562
- placement: "dropped" | "flush";
3563
- topElevation?: number | undefined;
3564
- supportSlabId?: string | undefined;
3565
- type: "beam";
3594
+ endPost?: boolean | undefined;
3595
+ postThrough?: boolean | undefined;
3596
+ infillPlacement: "back" | "center" | "front";
3597
+ color: string;
3598
+ style: "guard" | "horizontal" | "picket" | "privacy" | "rail" | "slat";
3599
+ type: "fence";
3566
3600
  } | {
3567
3601
  object: "node";
3568
3602
  name?: string | undefined;
@@ -4589,113 +4623,6 @@ export declare function floorsOf(nodes: SceneNodes): {
4589
4623
  label: string;
4590
4624
  } | null;
4591
4625
  type: "guide";
4592
- } | {
4593
- object: "node";
4594
- name?: string | undefined;
4595
- parentId: string | null;
4596
- visible: boolean;
4597
- camera?: {
4598
- position: [number, number, number];
4599
- target: [number, number, number];
4600
- mode: "orthographic" | "perspective";
4601
- fov?: number | undefined;
4602
- zoom?: number | undefined;
4603
- } | undefined;
4604
- metadata: Record<string, unknown>;
4605
- provenance?: {
4606
- refs: {
4607
- ns?: string | undefined;
4608
- id: string;
4609
- role?: "absorbed" | "alias" | "derived" | "piece" | "primary" | undefined;
4610
- }[];
4611
- lineage?: {
4612
- op: "attach" | "convert" | "duplicate" | "import" | "make-independent" | "merge" | "promote" | "split";
4613
- fromIds: string[];
4614
- } | undefined;
4615
- } | undefined;
4616
- id: `measurement_${string}`;
4617
- measurement: {
4618
- kind: "distance";
4619
- points: [{
4620
- kind: "feature";
4621
- reference: {
4622
- nodeId: string;
4623
- featureId: string;
4624
- parameters?: Record<string, string | number | boolean> | undefined;
4625
- };
4626
- fallback: [number, number, number];
4627
- } | [number, number, number], {
4628
- kind: "feature";
4629
- reference: {
4630
- nodeId: string;
4631
- featureId: string;
4632
- parameters?: Record<string, string | number | boolean> | undefined;
4633
- };
4634
- fallback: [number, number, number];
4635
- } | [number, number, number]];
4636
- } | {
4637
- kind: "angle";
4638
- points: [{
4639
- kind: "feature";
4640
- reference: {
4641
- nodeId: string;
4642
- featureId: string;
4643
- parameters?: Record<string, string | number | boolean> | undefined;
4644
- };
4645
- fallback: [number, number, number];
4646
- } | [number, number, number], {
4647
- kind: "feature";
4648
- reference: {
4649
- nodeId: string;
4650
- featureId: string;
4651
- parameters?: Record<string, string | number | boolean> | undefined;
4652
- };
4653
- fallback: [number, number, number];
4654
- } | [number, number, number], {
4655
- kind: "feature";
4656
- reference: {
4657
- nodeId: string;
4658
- featureId: string;
4659
- parameters?: Record<string, string | number | boolean> | undefined;
4660
- };
4661
- fallback: [number, number, number];
4662
- } | [number, number, number]];
4663
- } | {
4664
- kind: "area";
4665
- base: ({
4666
- kind: "feature";
4667
- reference: {
4668
- nodeId: string;
4669
- featureId: string;
4670
- parameters?: Record<string, string | number | boolean> | undefined;
4671
- };
4672
- fallback: [number, number, number];
4673
- } | [number, number, number])[];
4674
- } | {
4675
- kind: "perimeter";
4676
- base: ({
4677
- kind: "feature";
4678
- reference: {
4679
- nodeId: string;
4680
- featureId: string;
4681
- parameters?: Record<string, string | number | boolean> | undefined;
4682
- };
4683
- fallback: [number, number, number];
4684
- } | [number, number, number])[];
4685
- } | {
4686
- kind: "volume";
4687
- base: ({
4688
- kind: "feature";
4689
- reference: {
4690
- nodeId: string;
4691
- featureId: string;
4692
- parameters?: Record<string, string | number | boolean> | undefined;
4693
- };
4694
- fallback: [number, number, number];
4695
- } | [number, number, number])[];
4696
- extrusion: [number, number, number];
4697
- };
4698
- type: "measurement";
4699
4626
  } | {
4700
4627
  object: "node";
4701
4628
  name?: string | undefined;
@@ -4749,36 +4676,29 @@ export declare function floorsOf(nodes: SceneNodes): {
4749
4676
  fromIds: string[];
4750
4677
  } | undefined;
4751
4678
  } | undefined;
4752
- id: `duct-segment_${string}`;
4753
- path: [number, number, number][];
4754
- autoHangers?: boolean | undefined;
4755
- hangerOverrides?: Record<string, {
4756
- fraction?: number | undefined;
4757
- skipped?: boolean | undefined;
4758
- hostId?: string | undefined;
4759
- }> | undefined;
4760
- hangerStyle?: "double" | "single" | undefined;
4761
- hangerSpacing?: number | undefined;
4762
- hangerMaxReach?: number | undefined;
4763
- wallAttachment?: {
4764
- wallId: `wall_${string}`;
4765
- side: "back" | "front";
4766
- startUV: [number, number];
4767
- endUV: [number, number];
4768
- offset: number;
4769
- } | undefined;
4679
+ id: `duct-fitting_${string}`;
4680
+ position: [number, number, number];
4681
+ rotation: [number, number, number];
4682
+ fittingType: "access-panel" | "coupling" | "cross" | "damper" | "elbow" | "end-cap" | "reducer" | "tee" | "transition";
4770
4683
  shape: "oval" | "rect" | "round";
4771
- diameter: number;
4684
+ inletShape?: "oval" | "rect" | "round" | undefined;
4685
+ outletShape?: "oval" | "rect" | "round" | undefined;
4772
4686
  width: number;
4773
4687
  height: number;
4774
- roll: number;
4775
- ductMaterial: "duct-board" | "flex" | "sheet-metal" | "spiral";
4776
- seamDetail: boolean;
4777
- insulated: boolean;
4778
- insulationR: number;
4688
+ shape2: "oval" | "rect" | "round";
4689
+ width2: number;
4690
+ height2: number;
4691
+ angle: number;
4692
+ branchAngle: number;
4693
+ diameter: number;
4694
+ diameter2: number;
4695
+ ductMaterial: "duct-board" | "flex" | "sheet-metal";
4779
4696
  system: "return" | "supply";
4697
+ damperAngle: number;
4698
+ panelWidth: number;
4699
+ panelHeight: number;
4780
4700
  slots?: Record<string, string> | undefined;
4781
- type: "duct-segment";
4701
+ type: "duct-fitting";
4782
4702
  } | {
4783
4703
  object: "node";
4784
4704
  name?: string | undefined;
@@ -4840,12 +4760,23 @@ export declare function floorsOf(nodes: SceneNodes): {
4840
4760
  fromIds: string[];
4841
4761
  } | undefined;
4842
4762
  } | undefined;
4843
- id: `lineset_${string}`;
4844
- path: [number, number, number][];
4845
- suctionDiameter: number;
4846
- liquidDiameter: number;
4847
- insulated: boolean;
4848
- type: "lineset";
4763
+ id: `hvac-equipment_${string}`;
4764
+ position: [number, number, number];
4765
+ rotation: number;
4766
+ supportSlabId?: string | undefined;
4767
+ equipmentType: "air-handler" | "condenser" | "furnace";
4768
+ width: number;
4769
+ depth: number;
4770
+ height: number;
4771
+ supplyShape: "oval" | "rect" | "round";
4772
+ returnShape: "oval" | "rect" | "round";
4773
+ supplyDiameter: number;
4774
+ returnDiameter: number;
4775
+ supplyWidth: number;
4776
+ supplyHeight: number;
4777
+ returnWidth: number;
4778
+ returnHeight: number;
4779
+ type: "hvac-equipment";
4849
4780
  } | {
4850
4781
  object: "node";
4851
4782
  name?: string | undefined;
@@ -4944,13 +4875,17 @@ export declare function floorsOf(nodes: SceneNodes): {
4944
4875
  fromIds: string[];
4945
4876
  } | undefined;
4946
4877
  } | undefined;
4947
- id: `pipe-trap_${string}`;
4878
+ id: `pipe-fitting_${string}`;
4948
4879
  position: [number, number, number];
4949
- rotation: number;
4880
+ rotation: [number, number, number];
4881
+ fittingType: "cleanout" | "coupling" | "cross" | "elbow" | "end-cap" | "reducer" | "sanitary-tee" | "wye";
4882
+ angle: number;
4950
4883
  diameter: number;
4884
+ diameter2: number;
4885
+ cleanoutStyle: "end" | "inline";
4951
4886
  pipeMaterial: "abs" | "cast-iron" | "pvc";
4952
- armLengthM: number;
4953
- type: "pipe-trap";
4887
+ system: "vent" | "waste";
4888
+ type: "pipe-fitting";
4954
4889
  } | {
4955
4890
  object: "node";
4956
4891
  name?: string | undefined;
@@ -5189,6 +5124,71 @@ export declare function floorsOf(nodes: SceneNodes): {
5189
5124
  showPosts: boolean;
5190
5125
  id: `fence-opening_${string}`;
5191
5126
  type: "fence-opening";
5127
+ } | {
5128
+ object: "node";
5129
+ name?: string | undefined;
5130
+ parentId: string | null;
5131
+ visible: boolean;
5132
+ camera?: {
5133
+ position: [number, number, number];
5134
+ target: [number, number, number];
5135
+ mode: "orthographic" | "perspective";
5136
+ fov?: number | undefined;
5137
+ zoom?: number | undefined;
5138
+ } | undefined;
5139
+ metadata: Record<string, unknown>;
5140
+ provenance?: {
5141
+ refs: {
5142
+ ns?: string | undefined;
5143
+ id: string;
5144
+ role?: "absorbed" | "alias" | "derived" | "piece" | "primary" | undefined;
5145
+ }[];
5146
+ lineage?: {
5147
+ op: "attach" | "convert" | "duplicate" | "import" | "make-independent" | "merge" | "promote" | "split";
5148
+ fromIds: string[];
5149
+ } | undefined;
5150
+ } | undefined;
5151
+ id: `bvent_${string}`;
5152
+ material?: {
5153
+ id?: string | undefined;
5154
+ preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
5155
+ properties?: {
5156
+ color: string;
5157
+ roughness: number;
5158
+ metalness: number;
5159
+ opacity: number;
5160
+ transparent: boolean;
5161
+ side: "back" | "double" | "front";
5162
+ } | undefined;
5163
+ texture?: {
5164
+ url: string;
5165
+ repeat?: [number, number] | undefined;
5166
+ scale?: number | undefined;
5167
+ offset?: [number, number] | undefined;
5168
+ normalMap?: string | undefined;
5169
+ normalScale?: number | undefined;
5170
+ bumpMap?: string | undefined;
5171
+ bumpScale?: number | undefined;
5172
+ } | undefined;
5173
+ } | undefined;
5174
+ slots?: Record<string, string> | undefined;
5175
+ materialPreset: string;
5176
+ roofSegmentId?: string | undefined;
5177
+ position: [number, number, number];
5178
+ rotation: number;
5179
+ width: number;
5180
+ depth: number;
5181
+ height: number;
5182
+ hoodOverhang: number;
5183
+ topTaper: number;
5184
+ capHeight: number;
5185
+ capGap: number;
5186
+ domeCurvature: number;
5187
+ baseInset: number;
5188
+ baseHeight: number;
5189
+ cornerBevel: number;
5190
+ style: "box" | "cap" | "dome";
5191
+ type: "box-vent";
5192
5192
  } | {
5193
5193
  object: "node";
5194
5194
  name?: string | undefined;