@pascal-app/core 1.1.0 → 1.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (124) hide show
  1. package/dist/agent-operations/__fixtures__/cases.d.ts +3 -2
  2. package/dist/agent-operations/__fixtures__/cases.d.ts.map +1 -1
  3. package/dist/agent-operations/__fixtures__/place-items-cases.d.ts.map +1 -1
  4. package/dist/agent-operations/__fixtures__/place-items-cases.js +28 -0
  5. package/dist/agent-operations/__fixtures__/roof-bearing-cases.d.ts +12209 -12209
  6. package/dist/agent-operations/asset-catalog.d.ts +21 -11
  7. package/dist/agent-operations/asset-catalog.d.ts.map +1 -1
  8. package/dist/agent-operations/asset-catalog.js +28 -10
  9. package/dist/agent-operations/asset-views.d.ts +8 -3
  10. package/dist/agent-operations/asset-views.d.ts.map +1 -1
  11. package/dist/agent-operations/asset-views.js +19 -3
  12. package/dist/agent-operations/batch.d.ts +7 -1
  13. package/dist/agent-operations/batch.d.ts.map +1 -1
  14. package/dist/agent-operations/batch.js +17 -2
  15. package/dist/agent-operations/catalog-asset.d.ts +15 -0
  16. package/dist/agent-operations/catalog-asset.d.ts.map +1 -0
  17. package/dist/agent-operations/catalog-asset.js +4 -0
  18. package/dist/agent-operations/circulation-spaces.d.ts +2963 -2963
  19. package/dist/agent-operations/design-brief.d.ts.map +1 -1
  20. package/dist/agent-operations/design-brief.js +2 -0
  21. package/dist/agent-operations/furnish-room.d.ts.map +1 -1
  22. package/dist/agent-operations/furnish-room.js +2 -1
  23. package/dist/agent-operations/index.d.ts +3 -0
  24. package/dist/agent-operations/index.d.ts.map +1 -1
  25. package/dist/agent-operations/index.js +4 -1
  26. package/dist/agent-operations/level-reads.d.ts.map +1 -1
  27. package/dist/agent-operations/level-reads.js +4 -1
  28. package/dist/agent-operations/place-in-room.d.ts.map +1 -1
  29. package/dist/agent-operations/place-in-room.js +2 -1
  30. package/dist/agent-operations/place-items.d.ts.map +1 -1
  31. package/dist/agent-operations/place-items.js +2 -1
  32. package/dist/agent-operations/scene-queries.d.ts +585 -585
  33. package/dist/agent-operations/scene-view.d.ts.map +1 -1
  34. package/dist/agent-operations/scene-view.js +38 -13
  35. package/dist/agent-operations/search-assets.d.ts.map +1 -1
  36. package/dist/agent-operations/search-assets.js +6 -0
  37. package/dist/agent-operations/types.d.ts +3 -2
  38. package/dist/agent-operations/types.d.ts.map +1 -1
  39. package/dist/agent-operations/usage-checks.js +18 -3
  40. package/dist/agent-tools/assets.js +1 -1
  41. package/dist/building/__fixtures__/wall-opening-cases.d.ts +234 -234
  42. package/dist/building/level-duplication.d.ts +3516 -3516
  43. package/dist/building/level-duplication.d.ts.map +1 -1
  44. package/dist/building/level-duplication.js +3 -1
  45. package/dist/building/wall-openings.d.ts +75 -75
  46. package/dist/commands/structure/shared.d.ts +3407 -3407
  47. package/dist/commands/structure/zone-wall-merge.d.ts +566 -566
  48. package/dist/hooks/spatial-grid/spatial-grid-sync.d.ts +585 -585
  49. package/dist/index.d.ts +2 -0
  50. package/dist/index.d.ts.map +1 -1
  51. package/dist/index.js +2 -0
  52. package/dist/lib/__fixtures__/mezzanine.d.ts +9262 -9262
  53. package/dist/lib/absorb-wall-separators.d.ts +1344 -1344
  54. package/dist/lib/asset-storage.d.ts.map +1 -1
  55. package/dist/lib/asset-storage.js +3 -0
  56. package/dist/lib/floor-foundation-datum.d.ts.map +1 -1
  57. package/dist/lib/floor-foundation-datum.js +5 -1
  58. package/dist/lib/floorplan/context.d.ts +95 -0
  59. package/dist/lib/floorplan/context.d.ts.map +1 -0
  60. package/dist/lib/floorplan/context.js +155 -0
  61. package/dist/lib/floorplan/index.d.ts +6 -0
  62. package/dist/lib/floorplan/index.d.ts.map +1 -0
  63. package/dist/lib/floorplan/index.js +5 -0
  64. package/dist/lib/floorplan/marks.d.ts +71 -0
  65. package/dist/lib/floorplan/marks.d.ts.map +1 -0
  66. package/dist/lib/floorplan/marks.js +157 -0
  67. package/dist/lib/floorplan/plan-math.d.ts +18 -0
  68. package/dist/lib/floorplan/plan-math.d.ts.map +1 -0
  69. package/dist/lib/floorplan/plan-math.js +82 -0
  70. package/dist/lib/floorplan/svg-paths.d.ts +17 -0
  71. package/dist/lib/floorplan/svg-paths.d.ts.map +1 -0
  72. package/dist/lib/floorplan/svg-paths.js +92 -0
  73. package/dist/lib/floorplan/wall-affordances.d.ts +31 -0
  74. package/dist/lib/floorplan/wall-affordances.d.ts.map +1 -0
  75. package/dist/lib/floorplan/wall-affordances.js +24 -0
  76. package/dist/registry/__fixtures__/roof-planes.d.ts +69 -0
  77. package/dist/registry/__fixtures__/roof-planes.d.ts.map +1 -0
  78. package/dist/registry/__fixtures__/roof-planes.js +59 -0
  79. package/dist/registry/index.d.ts +2 -1
  80. package/dist/registry/index.d.ts.map +1 -1
  81. package/dist/registry/index.js +1 -0
  82. package/dist/registry/roofs.d.ts +34 -0
  83. package/dist/registry/roofs.d.ts.map +1 -0
  84. package/dist/registry/roofs.js +61 -0
  85. package/dist/registry/types.d.ts +30 -0
  86. package/dist/registry/types.d.ts.map +1 -1
  87. package/dist/registry/validate-relations.d.ts +5 -1
  88. package/dist/registry/validate-relations.d.ts.map +1 -1
  89. package/dist/registry/validate-relations.js +6 -2
  90. package/dist/schema/asset-url.d.ts +8 -0
  91. package/dist/schema/asset-url.d.ts.map +1 -1
  92. package/dist/schema/asset-url.js +17 -0
  93. package/dist/schema/nodes/roof.d.ts +1 -1
  94. package/dist/schema/nodes/roof.d.ts.map +1 -1
  95. package/dist/schema/nodes/roof.js +13 -8
  96. package/dist/schema/types.d.ts +1 -1
  97. package/dist/services/roof-level.d.ts.map +1 -1
  98. package/dist/services/roof-level.js +12 -2
  99. package/dist/services/roof-move.d.ts +4 -2
  100. package/dist/services/roof-move.d.ts.map +1 -1
  101. package/dist/services/roof-move.js +21 -9
  102. package/dist/spatial/usage-field/findings.d.ts +7 -1
  103. package/dist/spatial/usage-field/findings.d.ts.map +1 -1
  104. package/dist/spatial/usage-field/findings.js +42 -10
  105. package/dist/spatial/usage-field/path.d.ts.map +1 -1
  106. package/dist/spatial/usage-field/path.js +28 -18
  107. package/dist/store/actions/node-actions.d.ts +1641 -1641
  108. package/dist/store/scene-annotations.d.ts +1778 -1778
  109. package/dist/systems/document-reconcile.d.ts.map +1 -1
  110. package/dist/systems/document-reconcile.js +1 -2
  111. package/dist/systems/roof/roof-elevation.d.ts +11 -6
  112. package/dist/systems/roof/roof-elevation.d.ts.map +1 -1
  113. package/dist/systems/roof/roof-elevation.js +24 -11
  114. package/dist/systems/slab/__fixtures__/floor-step.d.ts +1622 -1622
  115. package/dist/systems/slab/__fixtures__/raised-room.d.ts +585 -585
  116. package/dist/systems/stair/stair-opening-preview.d.ts +1919 -1919
  117. package/dist/utils/ensure-scene-openings.d.ts +3409 -3409
  118. package/dist/utils/floor-plate-migration.d.ts +1344 -1344
  119. package/dist/utils/owned-floor-opening-migration.d.ts +1344 -1344
  120. package/dist/utils/reconcile-structure-on-load.d.ts +1641 -1641
  121. package/dist/utils/scene-bounds.d.ts +32 -0
  122. package/dist/utils/scene-bounds.d.ts.map +1 -0
  123. package/dist/utils/scene-bounds.js +201 -0
  124. package/package.json +1 -1
@@ -46,47 +46,18 @@ export declare const nodesOnLevel: (nodes: SceneNodes, levelId: string) => ({
46
46
  fromIds: string[];
47
47
  } | undefined;
48
48
  } | undefined;
49
- id: `bvent_${string}`;
50
- material?: {
51
- id?: string | undefined;
52
- preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
53
- properties?: {
54
- color: string;
55
- roughness: number;
56
- metalness: number;
57
- opacity: number;
58
- transparent: boolean;
59
- side: "back" | "double" | "front";
60
- } | undefined;
61
- texture?: {
62
- url: string;
63
- repeat?: [number, number] | undefined;
64
- scale?: number | undefined;
65
- offset?: [number, number] | undefined;
66
- normalMap?: string | undefined;
67
- normalScale?: number | undefined;
68
- bumpMap?: string | undefined;
69
- bumpScale?: number | undefined;
70
- } | undefined;
71
- } | undefined;
72
- slots?: Record<string, string> | undefined;
73
- materialPreset: string;
74
- roofSegmentId?: string | undefined;
75
- position: [number, number, number];
76
- rotation: number;
49
+ id: `beam_${string}`;
50
+ start: [number, number];
51
+ end: [number, number];
77
52
  width: number;
78
53
  depth: number;
79
- height: number;
80
- hoodOverhang: number;
81
- topTaper: number;
82
- capHeight: number;
83
- capGap: number;
84
- domeCurvature: number;
85
- baseInset: number;
86
- baseHeight: number;
87
- cornerBevel: number;
88
- style: "box" | "cap" | "dome";
89
- type: "box-vent";
54
+ size?: string | undefined;
55
+ plies: number;
56
+ material: "glulam" | "lvl" | "pressure-treated" | "sawn" | "steel";
57
+ placement: "dropped" | "flush";
58
+ topElevation?: number | undefined;
59
+ supportSlabId?: string | undefined;
60
+ type: "beam";
90
61
  } | {
91
62
  object: "node";
92
63
  name?: string | undefined;
@@ -111,223 +82,89 @@ export declare const nodesOnLevel: (nodes: SceneNodes, levelId: string) => ({
111
82
  fromIds: string[];
112
83
  } | undefined;
113
84
  } | undefined;
114
- id: `column_${string}`;
115
- children: string[];
116
- position: [number, number, number];
117
- rotation: number;
118
- supportSlabId?: string | undefined;
119
- source?: {
120
- kind: "script";
121
- meta?: {
122
- description?: string | undefined;
123
- category?: string | undefined;
124
- tags?: string[] | undefined;
125
- parent?: string | undefined;
126
- } | undefined;
127
- language: "bpy" | "three";
128
- script: string;
129
- params: Record<string, string | number | boolean>;
130
- artifact: string;
131
- manifest: {
132
- bounds: {
133
- min: [number, number, number];
134
- max: [number, number, number];
85
+ id: `measurement_${string}`;
86
+ measurement: {
87
+ kind: "volume";
88
+ base: ({
89
+ kind: "feature";
90
+ reference: {
91
+ nodeId: string;
92
+ featureId: string;
93
+ parameters?: Record<string, string | number | boolean> | undefined;
135
94
  };
136
- params: {
137
- id: string;
138
- label?: string | undefined;
139
- kind: "boolean" | "number" | "string";
140
- default: string | number | boolean;
141
- min?: number | undefined;
142
- max?: number | undefined;
143
- step?: number | undefined;
144
- unit?: string | undefined;
145
- options?: string[] | undefined;
146
- }[];
147
- parts: {
148
- id: string;
149
- label?: string | undefined;
150
- type?: string | undefined;
151
- bounds?: {
152
- min: [number, number, number];
153
- max: [number, number, number];
154
- } | undefined;
155
- }[];
156
- surfaces: {
157
- part?: string | undefined;
158
- y: number;
159
- polygon: [number, number][];
160
- }[];
161
- slots: {
162
- id: string;
163
- label?: string | undefined;
164
- color?: string | undefined;
165
- roughness?: number | undefined;
166
- metalness?: number | undefined;
167
- transparent?: boolean | undefined;
168
- emissive?: boolean | undefined;
169
- }[];
170
- anchors: {
171
- id: string;
172
- position: [number, number, number];
173
- normal?: [number, number, number] | undefined;
174
- }[];
175
- lights: {
176
- id: string;
177
- position: [number, number, number];
178
- color: string;
179
- intensity: number;
180
- distance?: number | undefined;
181
- spot?: {
182
- direction: [number, number, number];
183
- angle: number;
184
- softness: number;
185
- } | undefined;
186
- shadows?: boolean | undefined;
187
- glow?: {
188
- size: number;
189
- strength: number;
190
- } | undefined;
191
- }[];
192
- undersides: {
193
- part?: string | undefined;
194
- polygon: [number, number][];
195
- plane: [number, number, number, number];
196
- }[];
197
- animations: {
198
- name: string;
199
- duration: number;
200
- }[];
201
- cutters?: {
202
- host: "ceiling" | "mounted" | "slab" | "wall";
203
- polygon: number[][];
204
- minY: number;
205
- maxY: number;
206
- }[] | undefined;
207
- cutout: boolean;
208
- collider: boolean;
209
- shape?: {
210
- tolerance: number;
211
- bands: {
212
- y0: number;
213
- y1: number;
214
- polygons: {
215
- outer: [number, number][];
216
- holes?: [number, number][][] | undefined;
217
- }[];
218
- }[];
219
- } | undefined;
220
- triangles: number;
221
- coverage?: number | undefined;
222
- uncovered?: {
223
- min: [number, number];
224
- max: [number, number];
225
- }[] | undefined;
226
- };
227
- images?: {
228
- artifact: string;
229
- thumbnail: string;
230
- floorPlan: string;
231
- } | undefined;
232
- } | undefined;
233
- style: "cluster" | "dravidian-carved" | "faceted" | "fluted" | "lathe-turned" | "plain";
234
- crossSection: "octagonal" | "rectangular" | "round" | "sixteen-sided" | "square";
235
- height: number;
236
- radius: number;
237
- width: number;
238
- depth: number;
239
- edgeSoftness: number;
240
- baseHeight: number;
241
- capitalHeight: number;
242
- shaftProfile: "baluster" | "bulged" | "hourglass" | "straight" | "tapered";
243
- shaftTaper: number;
244
- shaftBulge: number;
245
- shaftStartScale: number;
246
- shaftEndScale: number;
247
- shaftSegmentCount: number;
248
- shaftTwistStep: number;
249
- shaftCornerRadius: number;
250
- shaftDetail: "fluted" | "lathe-turned" | "none" | "panelled" | "spiral";
251
- baseStyle: "lotus" | "none" | "panelled-pedestal" | "ribbed-lotus" | "round-rings" | "simple-square" | "square-plinth" | "stepped-square";
252
- baseWidthScale: number;
253
- baseDepthScale: number;
254
- baseTierCount: number;
255
- baseStepSpread: number;
256
- basePlinthHeightRatio: number;
257
- baseRoundBandScale: number;
258
- baseNeckScale: number;
259
- baseRoundBandCount: number;
260
- baseRibCount: number;
261
- baseCarvingLevel: number;
262
- basePanelInset: number;
263
- capitalStyle: "corinthian-leaf" | "doric" | "ionic-volute" | "leaf-carved" | "none" | "rounded" | "simple" | "simple-slab" | "south-indian-bracket" | "stepped" | "volute" | "wood-bracket";
264
- capitalWidthScale: number;
265
- capitalDepthScale: number;
266
- capitalTierCount: number;
267
- capitalStepSpread: number;
268
- capitalBandCount: number;
269
- voluteSize: number;
270
- voluteCount: number;
271
- leafCount: number;
272
- leafRows: number;
273
- bracketDepth: number;
274
- bracketTierCount: number;
275
- pendantCount: number;
276
- capitalCarvingLevel: number;
277
- ringCount: number;
278
- ringPlacement: "bottom" | "ends" | "even" | "top";
279
- ringThickness: number;
280
- ringSpread: number;
281
- fluteCount: number;
282
- fluteDepth: number;
283
- fluteWidth: number;
284
- spiralTwist: number;
285
- spiralRibCount: number;
286
- panelCount: number;
287
- panelInsetDepth: number;
288
- panelShape: "arched" | "diamond" | "rectangle";
289
- latheRingCount: number;
290
- latheRingSpacing: "bottom" | "ends" | "even" | "top";
291
- carvingLevel: number;
292
- carvingPlacement: "all" | "base" | "capital" | "shaft";
293
- lowerBandEnabled: boolean;
294
- lowerBandHeight: number;
295
- lowerBandCarvingLevel: number;
296
- dentilCount: number;
297
- beadCount: number;
298
- supportStyle: "a-frame" | "box-frame" | "k-brace" | "portal-frame" | "single-strut" | "trestle" | "tripod" | "v-frame" | "vertical" | "x-brace" | "y-frame";
299
- braceWidth: number;
300
- braceDepth: number;
301
- braceBottomSpread: number;
302
- braceTopSpread: number;
303
- bracePlateEnabled: boolean;
304
- role?: "ornament" | "post" | undefined;
305
- postBase?: "none" | "pier" | "post-base" | undefined;
306
- material?: {
307
- id?: string | undefined;
308
- preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
309
- properties?: {
310
- color: string;
311
- roughness: number;
312
- metalness: number;
313
- opacity: number;
314
- transparent: boolean;
315
- side: "back" | "double" | "front";
316
- } | undefined;
317
- texture?: {
318
- url: string;
319
- repeat?: [number, number] | undefined;
320
- scale?: number | undefined;
321
- offset?: [number, number] | undefined;
322
- normalMap?: string | undefined;
323
- normalScale?: number | undefined;
324
- bumpMap?: string | undefined;
325
- bumpScale?: number | undefined;
326
- } | undefined;
327
- } | undefined;
328
- materialPreset?: string | undefined;
329
- slots?: Record<string, string> | undefined;
330
- type: "column";
95
+ fallback: [number, number, number];
96
+ } | [number, number, number])[];
97
+ extrusion: [number, number, number];
98
+ } | {
99
+ kind: "distance";
100
+ points: [{
101
+ kind: "feature";
102
+ reference: {
103
+ nodeId: string;
104
+ featureId: string;
105
+ parameters?: Record<string, string | number | boolean> | undefined;
106
+ };
107
+ fallback: [number, number, number];
108
+ } | [number, number, number], {
109
+ kind: "feature";
110
+ reference: {
111
+ nodeId: string;
112
+ featureId: string;
113
+ parameters?: Record<string, string | number | boolean> | undefined;
114
+ };
115
+ fallback: [number, number, number];
116
+ } | [number, number, number]];
117
+ } | {
118
+ kind: "angle";
119
+ points: [{
120
+ kind: "feature";
121
+ reference: {
122
+ nodeId: string;
123
+ featureId: string;
124
+ parameters?: Record<string, string | number | boolean> | undefined;
125
+ };
126
+ fallback: [number, number, number];
127
+ } | [number, number, number], {
128
+ kind: "feature";
129
+ reference: {
130
+ nodeId: string;
131
+ featureId: string;
132
+ parameters?: Record<string, string | number | boolean> | undefined;
133
+ };
134
+ fallback: [number, number, number];
135
+ } | [number, number, number], {
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
+ kind: "area";
146
+ base: ({
147
+ kind: "feature";
148
+ reference: {
149
+ nodeId: string;
150
+ featureId: string;
151
+ parameters?: Record<string, string | number | boolean> | undefined;
152
+ };
153
+ fallback: [number, number, number];
154
+ } | [number, number, number])[];
155
+ } | {
156
+ kind: "perimeter";
157
+ base: ({
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
+ };
167
+ type: "measurement";
331
168
  } | {
332
169
  object: "node";
333
170
  name?: string | undefined;
@@ -352,29 +189,72 @@ export declare const nodesOnLevel: (nodes: SceneNodes, levelId: string) => ({
352
189
  fromIds: string[];
353
190
  } | undefined;
354
191
  } | undefined;
355
- id: `duct-fitting_${string}`;
356
- position: [number, number, number];
357
- rotation: [number, number, number];
358
- fittingType: "access-panel" | "coupling" | "cross" | "damper" | "elbow" | "end-cap" | "reducer" | "tee" | "transition";
192
+ id: `duct-segment_${string}`;
193
+ path: [number, number, number][];
194
+ autoHangers?: boolean | undefined;
195
+ hangerOverrides?: Record<string, {
196
+ fraction?: number | undefined;
197
+ skipped?: boolean | undefined;
198
+ hostId?: string | undefined;
199
+ }> | undefined;
200
+ hangerStyle?: "double" | "single" | undefined;
201
+ hangerSpacing?: number | undefined;
202
+ hangerMaxReach?: number | undefined;
203
+ wallAttachment?: {
204
+ wallId: `wall_${string}`;
205
+ side: "back" | "front";
206
+ startUV: [number, number];
207
+ endUV: [number, number];
208
+ offset: number;
209
+ } | undefined;
359
210
  shape: "oval" | "rect" | "round";
360
- inletShape?: "oval" | "rect" | "round" | undefined;
361
- outletShape?: "oval" | "rect" | "round" | undefined;
211
+ diameter: number;
362
212
  width: number;
363
213
  height: number;
364
- shape2: "oval" | "rect" | "round";
365
- width2: number;
366
- height2: number;
367
- angle: number;
368
- branchAngle: number;
369
- diameter: number;
370
- diameter2: number;
371
- ductMaterial: "duct-board" | "flex" | "sheet-metal";
214
+ roll: number;
215
+ ductMaterial: "duct-board" | "flex" | "sheet-metal" | "spiral";
216
+ seamDetail: boolean;
217
+ insulated: boolean;
218
+ insulationR: number;
372
219
  system: "return" | "supply";
373
- damperAngle: number;
374
- panelWidth: number;
375
- panelHeight: number;
376
220
  slots?: Record<string, string> | undefined;
377
- type: "duct-fitting";
221
+ type: "duct-segment";
222
+ } | {
223
+ object: "node";
224
+ name?: string | undefined;
225
+ parentId: string | null;
226
+ visible: boolean;
227
+ camera?: {
228
+ position: [number, number, number];
229
+ target: [number, number, number];
230
+ mode: "orthographic" | "perspective";
231
+ fov?: number | undefined;
232
+ zoom?: number | undefined;
233
+ } | undefined;
234
+ metadata: Record<string, unknown>;
235
+ provenance?: {
236
+ refs: {
237
+ ns?: string | undefined;
238
+ id: string;
239
+ role?: "absorbed" | "alias" | "derived" | "piece" | "primary" | undefined;
240
+ }[];
241
+ lineage?: {
242
+ op: "attach" | "convert" | "duplicate" | "import" | "make-independent" | "merge" | "promote" | "split";
243
+ fromIds: string[];
244
+ } | undefined;
245
+ } | undefined;
246
+ id: `floor-opening_${string}`;
247
+ polygon: [number, number][];
248
+ hostZoneId?: string | undefined;
249
+ legacyPlateCuts?: Record<string, [number, number][][]> | undefined;
250
+ legacyCeilingCuts?: Record<string, [number, number][][]> | undefined;
251
+ source: string;
252
+ ownerId?: string | undefined;
253
+ surfaceId?: string | undefined;
254
+ drawnOn: "ceiling" | "floor";
255
+ cutsPrimary: boolean;
256
+ cutsAdjacent: boolean;
257
+ type: "floor-opening";
378
258
  } | {
379
259
  object: "node";
380
260
  name?: string | undefined;
@@ -399,23 +279,12 @@ export declare const nodesOnLevel: (nodes: SceneNodes, levelId: string) => ({
399
279
  fromIds: string[];
400
280
  } | undefined;
401
281
  } | undefined;
402
- id: `hvac-equipment_${string}`;
403
- position: [number, number, number];
404
- rotation: number;
405
- supportSlabId?: string | undefined;
406
- equipmentType: "air-handler" | "condenser" | "furnace";
407
- width: number;
408
- depth: number;
409
- height: number;
410
- supplyShape: "oval" | "rect" | "round";
411
- returnShape: "oval" | "rect" | "round";
412
- supplyDiameter: number;
413
- returnDiameter: number;
414
- supplyWidth: number;
415
- supplyHeight: number;
416
- returnWidth: number;
417
- returnHeight: number;
418
- type: "hvac-equipment";
282
+ id: `lineset_${string}`;
283
+ path: [number, number, number][];
284
+ suctionDiameter: number;
285
+ liquidDiameter: number;
286
+ insulated: boolean;
287
+ type: "lineset";
419
288
  } | {
420
289
  object: "node";
421
290
  name?: string | undefined;
@@ -440,17 +309,13 @@ export declare const nodesOnLevel: (nodes: SceneNodes, levelId: string) => ({
440
309
  fromIds: string[];
441
310
  } | undefined;
442
311
  } | undefined;
443
- id: `pipe-fitting_${string}`;
312
+ id: `pipe-trap_${string}`;
444
313
  position: [number, number, number];
445
- rotation: [number, number, number];
446
- fittingType: "cleanout" | "coupling" | "cross" | "elbow" | "end-cap" | "reducer" | "sanitary-tee" | "wye";
447
- angle: number;
314
+ rotation: number;
448
315
  diameter: number;
449
- diameter2: number;
450
- cleanoutStyle: "end" | "inline";
451
316
  pipeMaterial: "abs" | "cast-iron" | "pvc";
452
- system: "vent" | "waste";
453
- type: "pipe-fitting";
317
+ armLengthM: number;
318
+ type: "pipe-trap";
454
319
  } | {
455
320
  object: "node";
456
321
  name?: string | undefined;
@@ -983,7 +848,7 @@ export declare const nodesOnLevel: (nodes: SceneNodes, levelId: string) => ({
983
848
  cavityInsulation?: string | undefined;
984
849
  } | undefined;
985
850
  slots?: Record<string, string> | undefined;
986
- children: `rseg_${string}`[];
851
+ children: string[];
987
852
  type: "roof";
988
853
  } | {
989
854
  object: "node";
@@ -1548,7 +1413,217 @@ export declare const nodesOnLevel: (nodes: SceneNodes, levelId: string) => ({
1548
1413
  bumpScale?: number | undefined;
1549
1414
  } | undefined;
1550
1415
  } | undefined;
1551
- slots?: Record<string, string> | undefined;
1416
+ slots?: Record<string, string> | undefined;
1417
+ source?: {
1418
+ kind: "script";
1419
+ meta?: {
1420
+ description?: string | undefined;
1421
+ category?: string | undefined;
1422
+ tags?: string[] | undefined;
1423
+ parent?: string | undefined;
1424
+ } | undefined;
1425
+ language: "bpy" | "three";
1426
+ script: string;
1427
+ params: Record<string, string | number | boolean>;
1428
+ artifact: string;
1429
+ manifest: {
1430
+ bounds: {
1431
+ min: [number, number, number];
1432
+ max: [number, number, number];
1433
+ };
1434
+ params: {
1435
+ id: string;
1436
+ label?: string | undefined;
1437
+ kind: "boolean" | "number" | "string";
1438
+ default: string | number | boolean;
1439
+ min?: number | undefined;
1440
+ max?: number | undefined;
1441
+ step?: number | undefined;
1442
+ unit?: string | undefined;
1443
+ options?: string[] | undefined;
1444
+ }[];
1445
+ parts: {
1446
+ id: string;
1447
+ label?: string | undefined;
1448
+ type?: string | undefined;
1449
+ bounds?: {
1450
+ min: [number, number, number];
1451
+ max: [number, number, number];
1452
+ } | undefined;
1453
+ }[];
1454
+ surfaces: {
1455
+ part?: string | undefined;
1456
+ y: number;
1457
+ polygon: [number, number][];
1458
+ }[];
1459
+ slots: {
1460
+ id: string;
1461
+ label?: string | undefined;
1462
+ color?: string | undefined;
1463
+ roughness?: number | undefined;
1464
+ metalness?: number | undefined;
1465
+ transparent?: boolean | undefined;
1466
+ emissive?: boolean | undefined;
1467
+ }[];
1468
+ anchors: {
1469
+ id: string;
1470
+ position: [number, number, number];
1471
+ normal?: [number, number, number] | undefined;
1472
+ }[];
1473
+ lights: {
1474
+ id: string;
1475
+ position: [number, number, number];
1476
+ color: string;
1477
+ intensity: number;
1478
+ distance?: number | undefined;
1479
+ spot?: {
1480
+ direction: [number, number, number];
1481
+ angle: number;
1482
+ softness: number;
1483
+ } | undefined;
1484
+ shadows?: boolean | undefined;
1485
+ glow?: {
1486
+ size: number;
1487
+ strength: number;
1488
+ } | undefined;
1489
+ }[];
1490
+ undersides: {
1491
+ part?: string | undefined;
1492
+ polygon: [number, number][];
1493
+ plane: [number, number, number, number];
1494
+ }[];
1495
+ animations: {
1496
+ name: string;
1497
+ duration: number;
1498
+ }[];
1499
+ cutters?: {
1500
+ host: "ceiling" | "mounted" | "slab" | "wall";
1501
+ polygon: number[][];
1502
+ minY: number;
1503
+ maxY: number;
1504
+ }[] | undefined;
1505
+ cutout: boolean;
1506
+ collider: boolean;
1507
+ shape?: {
1508
+ tolerance: number;
1509
+ bands: {
1510
+ y0: number;
1511
+ y1: number;
1512
+ polygons: {
1513
+ outer: [number, number][];
1514
+ holes?: [number, number][][] | undefined;
1515
+ }[];
1516
+ }[];
1517
+ } | undefined;
1518
+ triangles: number;
1519
+ coverage?: number | undefined;
1520
+ uncovered?: {
1521
+ min: [number, number];
1522
+ max: [number, number];
1523
+ }[] | undefined;
1524
+ };
1525
+ images?: {
1526
+ artifact: string;
1527
+ thumbnail: string;
1528
+ floorPlan: string;
1529
+ } | undefined;
1530
+ } | undefined;
1531
+ position: [number, number, number];
1532
+ rotation: [number, number, number];
1533
+ side?: "back" | "front" | undefined;
1534
+ verticalAnchor?: "floor" | "wall" | undefined;
1535
+ floorThresholdVersion: 0 | 1;
1536
+ wallId?: string | undefined;
1537
+ dormerId?: string | undefined;
1538
+ dormerFace?: "back" | "front" | "left" | "right" | undefined;
1539
+ roofSegmentId?: string | undefined;
1540
+ roofFace?: "back" | "front" | "left" | "right" | undefined;
1541
+ width: number;
1542
+ height: number;
1543
+ mark?: string | undefined;
1544
+ constructionType: "framed" | "masonry";
1545
+ dimensionReference: "finish-opening" | "masonry-opening" | "nominal" | "rough-opening";
1546
+ roughOpeningWidth?: number | undefined;
1547
+ roughOpeningHeight?: number | undefined;
1548
+ masonryOpeningWidth?: number | undefined;
1549
+ masonryOpeningHeight?: number | undefined;
1550
+ finishOpeningWidth?: number | undefined;
1551
+ finishOpeningHeight?: number | undefined;
1552
+ openingKind: "opening" | "window";
1553
+ windowType: "awning" | "bay" | "bow" | "casement" | "double-hung" | "fixed" | "hopper" | "louvered" | "single-hung" | "sliding" | "tilt-turn";
1554
+ operationState: number;
1555
+ openingDirection?: "inward" | "outward" | undefined;
1556
+ tiltTurnMode?: "tilt" | "turn" | undefined;
1557
+ awningDirection: "down" | "up";
1558
+ casementStyle: "french" | "single";
1559
+ hingesSide: "left" | "right";
1560
+ openingShape: "arch" | "rectangle" | "rounded";
1561
+ openingRadiusMode: "all" | "individual";
1562
+ openingCornerRadii: [number, number, number, number];
1563
+ cornerRadius: number;
1564
+ archHeight: number;
1565
+ openingRevealRadius: number;
1566
+ frameThickness: number;
1567
+ frameDepth?: number | undefined;
1568
+ windowHandle?: boolean | undefined;
1569
+ sashGrid?: boolean | undefined;
1570
+ columnRatios: number[];
1571
+ rowRatios: number[];
1572
+ columnDividerThickness: number;
1573
+ rowDividerThickness: number;
1574
+ corner?: {
1575
+ end: "end" | "start";
1576
+ partnerId: string;
1577
+ post: "none" | "post";
1578
+ } | undefined;
1579
+ sill: boolean;
1580
+ sillDepth: number;
1581
+ sillThickness: number;
1582
+ sillOverhang?: number | undefined;
1583
+ sillInterior?: boolean | undefined;
1584
+ sillInteriorDepth?: number | undefined;
1585
+ sillInteriorThickness?: number | undefined;
1586
+ sillInteriorOverhang?: number | undefined;
1587
+ shutters?: "board-batten" | "louvered" | "none" | "panel" | undefined;
1588
+ shutterWidth?: number | undefined;
1589
+ shutterOpen?: number | undefined;
1590
+ shutterSides?: "both" | "left" | "right" | undefined;
1591
+ rollerShutter?: "box" | "concealed" | "none" | undefined;
1592
+ rollerShutterBoxHeight?: number | undefined;
1593
+ rollerShutterOpen?: number | undefined;
1594
+ casingFaceA?: boolean | undefined;
1595
+ casingFaceB?: boolean | undefined;
1596
+ casingWidth?: number | undefined;
1597
+ type: "window";
1598
+ } | {
1599
+ object: "node";
1600
+ name?: string | undefined;
1601
+ parentId: string | null;
1602
+ visible: boolean;
1603
+ camera?: {
1604
+ position: [number, number, number];
1605
+ target: [number, number, number];
1606
+ mode: "orthographic" | "perspective";
1607
+ fov?: number | undefined;
1608
+ zoom?: number | undefined;
1609
+ } | undefined;
1610
+ metadata: Record<string, unknown>;
1611
+ provenance?: {
1612
+ refs: {
1613
+ ns?: string | undefined;
1614
+ id: string;
1615
+ role?: "absorbed" | "alias" | "derived" | "piece" | "primary" | undefined;
1616
+ }[];
1617
+ lineage?: {
1618
+ op: "attach" | "convert" | "duplicate" | "import" | "make-independent" | "merge" | "promote" | "split";
1619
+ fromIds: string[];
1620
+ } | undefined;
1621
+ } | undefined;
1622
+ id: `column_${string}`;
1623
+ children: string[];
1624
+ position: [number, number, number];
1625
+ rotation: number;
1626
+ supportSlabId?: string | undefined;
1552
1627
  source?: {
1553
1628
  kind: "script";
1554
1629
  meta?: {
@@ -1663,73 +1738,104 @@ export declare const nodesOnLevel: (nodes: SceneNodes, levelId: string) => ({
1663
1738
  floorPlan: string;
1664
1739
  } | undefined;
1665
1740
  } | undefined;
1666
- position: [number, number, number];
1667
- rotation: [number, number, number];
1668
- side?: "back" | "front" | undefined;
1669
- verticalAnchor?: "floor" | "wall" | undefined;
1670
- floorThresholdVersion: 0 | 1;
1671
- wallId?: string | undefined;
1672
- dormerId?: string | undefined;
1673
- dormerFace?: "back" | "front" | "left" | "right" | undefined;
1674
- roofSegmentId?: string | undefined;
1675
- roofFace?: "back" | "front" | "left" | "right" | undefined;
1676
- width: number;
1741
+ style: "cluster" | "dravidian-carved" | "faceted" | "fluted" | "lathe-turned" | "plain";
1742
+ crossSection: "octagonal" | "rectangular" | "round" | "sixteen-sided" | "square";
1677
1743
  height: number;
1678
- mark?: string | undefined;
1679
- constructionType: "framed" | "masonry";
1680
- dimensionReference: "finish-opening" | "masonry-opening" | "nominal" | "rough-opening";
1681
- roughOpeningWidth?: number | undefined;
1682
- roughOpeningHeight?: number | undefined;
1683
- masonryOpeningWidth?: number | undefined;
1684
- masonryOpeningHeight?: number | undefined;
1685
- finishOpeningWidth?: number | undefined;
1686
- finishOpeningHeight?: number | undefined;
1687
- openingKind: "opening" | "window";
1688
- windowType: "awning" | "bay" | "bow" | "casement" | "double-hung" | "fixed" | "hopper" | "louvered" | "single-hung" | "sliding" | "tilt-turn";
1689
- operationState: number;
1690
- openingDirection?: "inward" | "outward" | undefined;
1691
- tiltTurnMode?: "tilt" | "turn" | undefined;
1692
- awningDirection: "down" | "up";
1693
- casementStyle: "french" | "single";
1694
- hingesSide: "left" | "right";
1695
- openingShape: "arch" | "rectangle" | "rounded";
1696
- openingRadiusMode: "all" | "individual";
1697
- openingCornerRadii: [number, number, number, number];
1698
- cornerRadius: number;
1699
- archHeight: number;
1700
- openingRevealRadius: number;
1701
- frameThickness: number;
1702
- frameDepth?: number | undefined;
1703
- windowHandle?: boolean | undefined;
1704
- sashGrid?: boolean | undefined;
1705
- columnRatios: number[];
1706
- rowRatios: number[];
1707
- columnDividerThickness: number;
1708
- rowDividerThickness: number;
1709
- corner?: {
1710
- end: "end" | "start";
1711
- partnerId: string;
1712
- post: "none" | "post";
1744
+ radius: number;
1745
+ width: number;
1746
+ depth: number;
1747
+ edgeSoftness: number;
1748
+ baseHeight: number;
1749
+ capitalHeight: number;
1750
+ shaftProfile: "baluster" | "bulged" | "hourglass" | "straight" | "tapered";
1751
+ shaftTaper: number;
1752
+ shaftBulge: number;
1753
+ shaftStartScale: number;
1754
+ shaftEndScale: number;
1755
+ shaftSegmentCount: number;
1756
+ shaftTwistStep: number;
1757
+ shaftCornerRadius: number;
1758
+ shaftDetail: "fluted" | "lathe-turned" | "none" | "panelled" | "spiral";
1759
+ baseStyle: "lotus" | "none" | "panelled-pedestal" | "ribbed-lotus" | "round-rings" | "simple-square" | "square-plinth" | "stepped-square";
1760
+ baseWidthScale: number;
1761
+ baseDepthScale: number;
1762
+ baseTierCount: number;
1763
+ baseStepSpread: number;
1764
+ basePlinthHeightRatio: number;
1765
+ baseRoundBandScale: number;
1766
+ baseNeckScale: number;
1767
+ baseRoundBandCount: number;
1768
+ baseRibCount: number;
1769
+ baseCarvingLevel: number;
1770
+ basePanelInset: number;
1771
+ capitalStyle: "corinthian-leaf" | "doric" | "ionic-volute" | "leaf-carved" | "none" | "rounded" | "simple" | "simple-slab" | "south-indian-bracket" | "stepped" | "volute" | "wood-bracket";
1772
+ capitalWidthScale: number;
1773
+ capitalDepthScale: number;
1774
+ capitalTierCount: number;
1775
+ capitalStepSpread: number;
1776
+ capitalBandCount: number;
1777
+ voluteSize: number;
1778
+ voluteCount: number;
1779
+ leafCount: number;
1780
+ leafRows: number;
1781
+ bracketDepth: number;
1782
+ bracketTierCount: number;
1783
+ pendantCount: number;
1784
+ capitalCarvingLevel: number;
1785
+ ringCount: number;
1786
+ ringPlacement: "bottom" | "ends" | "even" | "top";
1787
+ ringThickness: number;
1788
+ ringSpread: number;
1789
+ fluteCount: number;
1790
+ fluteDepth: number;
1791
+ fluteWidth: number;
1792
+ spiralTwist: number;
1793
+ spiralRibCount: number;
1794
+ panelCount: number;
1795
+ panelInsetDepth: number;
1796
+ panelShape: "arched" | "diamond" | "rectangle";
1797
+ latheRingCount: number;
1798
+ latheRingSpacing: "bottom" | "ends" | "even" | "top";
1799
+ carvingLevel: number;
1800
+ carvingPlacement: "all" | "base" | "capital" | "shaft";
1801
+ lowerBandEnabled: boolean;
1802
+ lowerBandHeight: number;
1803
+ lowerBandCarvingLevel: number;
1804
+ dentilCount: number;
1805
+ beadCount: number;
1806
+ supportStyle: "a-frame" | "box-frame" | "k-brace" | "portal-frame" | "single-strut" | "trestle" | "tripod" | "v-frame" | "vertical" | "x-brace" | "y-frame";
1807
+ braceWidth: number;
1808
+ braceDepth: number;
1809
+ braceBottomSpread: number;
1810
+ braceTopSpread: number;
1811
+ bracePlateEnabled: boolean;
1812
+ role?: "ornament" | "post" | undefined;
1813
+ postBase?: "none" | "pier" | "post-base" | undefined;
1814
+ material?: {
1815
+ id?: string | undefined;
1816
+ preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
1817
+ properties?: {
1818
+ color: string;
1819
+ roughness: number;
1820
+ metalness: number;
1821
+ opacity: number;
1822
+ transparent: boolean;
1823
+ side: "back" | "double" | "front";
1824
+ } | undefined;
1825
+ texture?: {
1826
+ url: string;
1827
+ repeat?: [number, number] | undefined;
1828
+ scale?: number | undefined;
1829
+ offset?: [number, number] | undefined;
1830
+ normalMap?: string | undefined;
1831
+ normalScale?: number | undefined;
1832
+ bumpMap?: string | undefined;
1833
+ bumpScale?: number | undefined;
1834
+ } | undefined;
1713
1835
  } | undefined;
1714
- sill: boolean;
1715
- sillDepth: number;
1716
- sillThickness: number;
1717
- sillOverhang?: number | undefined;
1718
- sillInterior?: boolean | undefined;
1719
- sillInteriorDepth?: number | undefined;
1720
- sillInteriorThickness?: number | undefined;
1721
- sillInteriorOverhang?: number | undefined;
1722
- shutters?: "board-batten" | "louvered" | "none" | "panel" | undefined;
1723
- shutterWidth?: number | undefined;
1724
- shutterOpen?: number | undefined;
1725
- shutterSides?: "both" | "left" | "right" | undefined;
1726
- rollerShutter?: "box" | "concealed" | "none" | undefined;
1727
- rollerShutterBoxHeight?: number | undefined;
1728
- rollerShutterOpen?: number | undefined;
1729
- casingFaceA?: boolean | undefined;
1730
- casingFaceB?: boolean | undefined;
1731
- casingWidth?: number | undefined;
1732
- type: "window";
1836
+ materialPreset?: string | undefined;
1837
+ slots?: Record<string, string> | undefined;
1838
+ type: "column";
1733
1839
  } | {
1734
1840
  object: "node";
1735
1841
  name?: string | undefined;
@@ -3340,42 +3446,6 @@ export declare const nodesOnLevel: (nodes: SceneNodes, levelId: string) => ({
3340
3446
  start: [number, number];
3341
3447
  end: [number, number];
3342
3448
  type: "separator";
3343
- } | {
3344
- object: "node";
3345
- name?: string | undefined;
3346
- parentId: string | null;
3347
- visible: boolean;
3348
- camera?: {
3349
- position: [number, number, number];
3350
- target: [number, number, number];
3351
- mode: "orthographic" | "perspective";
3352
- fov?: number | undefined;
3353
- zoom?: number | undefined;
3354
- } | undefined;
3355
- metadata: Record<string, unknown>;
3356
- provenance?: {
3357
- refs: {
3358
- ns?: string | undefined;
3359
- id: string;
3360
- role?: "absorbed" | "alias" | "derived" | "piece" | "primary" | undefined;
3361
- }[];
3362
- lineage?: {
3363
- op: "attach" | "convert" | "duplicate" | "import" | "make-independent" | "merge" | "promote" | "split";
3364
- fromIds: string[];
3365
- } | undefined;
3366
- } | undefined;
3367
- id: `floor-opening_${string}`;
3368
- polygon: [number, number][];
3369
- hostZoneId?: string | undefined;
3370
- legacyPlateCuts?: Record<string, [number, number][][]> | undefined;
3371
- legacyCeilingCuts?: Record<string, [number, number][][]> | undefined;
3372
- source: string;
3373
- ownerId?: string | undefined;
3374
- surfaceId?: string | undefined;
3375
- drawnOn: "ceiling" | "floor";
3376
- cutsPrimary: boolean;
3377
- cutsAdjacent: boolean;
3378
- type: "floor-opening";
3379
3449
  } | {
3380
3450
  object: "node";
3381
3451
  name?: string | undefined;
@@ -3464,48 +3534,12 @@ export declare const nodesOnLevel: (nodes: SceneNodes, levelId: string) => ({
3464
3534
  showInfill: boolean;
3465
3535
  guardInfill?: "balusters" | "boards" | "cable" | undefined;
3466
3536
  startPost?: boolean | undefined;
3467
- endPost?: boolean | undefined;
3468
- postThrough?: boolean | undefined;
3469
- infillPlacement: "back" | "center" | "front";
3470
- color: string;
3471
- style: "guard" | "horizontal" | "picket" | "privacy" | "rail" | "slat";
3472
- type: "fence";
3473
- } | {
3474
- object: "node";
3475
- name?: string | undefined;
3476
- parentId: string | null;
3477
- visible: boolean;
3478
- camera?: {
3479
- position: [number, number, number];
3480
- target: [number, number, number];
3481
- mode: "orthographic" | "perspective";
3482
- fov?: number | undefined;
3483
- zoom?: number | undefined;
3484
- } | undefined;
3485
- metadata: Record<string, unknown>;
3486
- provenance?: {
3487
- refs: {
3488
- ns?: string | undefined;
3489
- id: string;
3490
- role?: "absorbed" | "alias" | "derived" | "piece" | "primary" | undefined;
3491
- }[];
3492
- lineage?: {
3493
- op: "attach" | "convert" | "duplicate" | "import" | "make-independent" | "merge" | "promote" | "split";
3494
- fromIds: string[];
3495
- } | undefined;
3496
- } | undefined;
3497
- id: `beam_${string}`;
3498
- start: [number, number];
3499
- end: [number, number];
3500
- width: number;
3501
- depth: number;
3502
- size?: string | undefined;
3503
- plies: number;
3504
- material: "glulam" | "lvl" | "pressure-treated" | "sawn" | "steel";
3505
- placement: "dropped" | "flush";
3506
- topElevation?: number | undefined;
3507
- supportSlabId?: string | undefined;
3508
- type: "beam";
3537
+ endPost?: boolean | undefined;
3538
+ postThrough?: boolean | undefined;
3539
+ infillPlacement: "back" | "center" | "front";
3540
+ color: string;
3541
+ style: "guard" | "horizontal" | "picket" | "privacy" | "rail" | "slat";
3542
+ type: "fence";
3509
3543
  } | {
3510
3544
  object: "node";
3511
3545
  name?: string | undefined;
@@ -4532,113 +4566,6 @@ export declare const nodesOnLevel: (nodes: SceneNodes, levelId: string) => ({
4532
4566
  label: string;
4533
4567
  } | null;
4534
4568
  type: "guide";
4535
- } | {
4536
- object: "node";
4537
- name?: string | undefined;
4538
- parentId: string | null;
4539
- visible: boolean;
4540
- camera?: {
4541
- position: [number, number, number];
4542
- target: [number, number, number];
4543
- mode: "orthographic" | "perspective";
4544
- fov?: number | undefined;
4545
- zoom?: number | undefined;
4546
- } | undefined;
4547
- metadata: Record<string, unknown>;
4548
- provenance?: {
4549
- refs: {
4550
- ns?: string | undefined;
4551
- id: string;
4552
- role?: "absorbed" | "alias" | "derived" | "piece" | "primary" | undefined;
4553
- }[];
4554
- lineage?: {
4555
- op: "attach" | "convert" | "duplicate" | "import" | "make-independent" | "merge" | "promote" | "split";
4556
- fromIds: string[];
4557
- } | undefined;
4558
- } | undefined;
4559
- id: `measurement_${string}`;
4560
- measurement: {
4561
- kind: "distance";
4562
- points: [{
4563
- kind: "feature";
4564
- reference: {
4565
- nodeId: string;
4566
- featureId: string;
4567
- parameters?: Record<string, string | number | boolean> | undefined;
4568
- };
4569
- fallback: [number, number, number];
4570
- } | [number, number, number], {
4571
- kind: "feature";
4572
- reference: {
4573
- nodeId: string;
4574
- featureId: string;
4575
- parameters?: Record<string, string | number | boolean> | undefined;
4576
- };
4577
- fallback: [number, number, number];
4578
- } | [number, number, number]];
4579
- } | {
4580
- kind: "angle";
4581
- points: [{
4582
- kind: "feature";
4583
- reference: {
4584
- nodeId: string;
4585
- featureId: string;
4586
- parameters?: Record<string, string | number | boolean> | undefined;
4587
- };
4588
- fallback: [number, number, number];
4589
- } | [number, number, number], {
4590
- kind: "feature";
4591
- reference: {
4592
- nodeId: string;
4593
- featureId: string;
4594
- parameters?: Record<string, string | number | boolean> | undefined;
4595
- };
4596
- fallback: [number, number, number];
4597
- } | [number, number, number], {
4598
- kind: "feature";
4599
- reference: {
4600
- nodeId: string;
4601
- featureId: string;
4602
- parameters?: Record<string, string | number | boolean> | undefined;
4603
- };
4604
- fallback: [number, number, number];
4605
- } | [number, number, number]];
4606
- } | {
4607
- kind: "area";
4608
- base: ({
4609
- kind: "feature";
4610
- reference: {
4611
- nodeId: string;
4612
- featureId: string;
4613
- parameters?: Record<string, string | number | boolean> | undefined;
4614
- };
4615
- fallback: [number, number, number];
4616
- } | [number, number, number])[];
4617
- } | {
4618
- kind: "perimeter";
4619
- base: ({
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
- } | {
4629
- kind: "volume";
4630
- base: ({
4631
- kind: "feature";
4632
- reference: {
4633
- nodeId: string;
4634
- featureId: string;
4635
- parameters?: Record<string, string | number | boolean> | undefined;
4636
- };
4637
- fallback: [number, number, number];
4638
- } | [number, number, number])[];
4639
- extrusion: [number, number, number];
4640
- };
4641
- type: "measurement";
4642
4569
  } | {
4643
4570
  object: "node";
4644
4571
  name?: string | undefined;
@@ -4692,36 +4619,29 @@ export declare const nodesOnLevel: (nodes: SceneNodes, levelId: string) => ({
4692
4619
  fromIds: string[];
4693
4620
  } | undefined;
4694
4621
  } | undefined;
4695
- id: `duct-segment_${string}`;
4696
- path: [number, number, number][];
4697
- autoHangers?: boolean | undefined;
4698
- hangerOverrides?: Record<string, {
4699
- fraction?: number | undefined;
4700
- skipped?: boolean | undefined;
4701
- hostId?: string | undefined;
4702
- }> | undefined;
4703
- hangerStyle?: "double" | "single" | undefined;
4704
- hangerSpacing?: number | undefined;
4705
- hangerMaxReach?: number | undefined;
4706
- wallAttachment?: {
4707
- wallId: `wall_${string}`;
4708
- side: "back" | "front";
4709
- startUV: [number, number];
4710
- endUV: [number, number];
4711
- offset: number;
4712
- } | undefined;
4622
+ id: `duct-fitting_${string}`;
4623
+ position: [number, number, number];
4624
+ rotation: [number, number, number];
4625
+ fittingType: "access-panel" | "coupling" | "cross" | "damper" | "elbow" | "end-cap" | "reducer" | "tee" | "transition";
4713
4626
  shape: "oval" | "rect" | "round";
4714
- diameter: number;
4627
+ inletShape?: "oval" | "rect" | "round" | undefined;
4628
+ outletShape?: "oval" | "rect" | "round" | undefined;
4715
4629
  width: number;
4716
4630
  height: number;
4717
- roll: number;
4718
- ductMaterial: "duct-board" | "flex" | "sheet-metal" | "spiral";
4719
- seamDetail: boolean;
4720
- insulated: boolean;
4721
- insulationR: number;
4631
+ shape2: "oval" | "rect" | "round";
4632
+ width2: number;
4633
+ height2: number;
4634
+ angle: number;
4635
+ branchAngle: number;
4636
+ diameter: number;
4637
+ diameter2: number;
4638
+ ductMaterial: "duct-board" | "flex" | "sheet-metal";
4722
4639
  system: "return" | "supply";
4640
+ damperAngle: number;
4641
+ panelWidth: number;
4642
+ panelHeight: number;
4723
4643
  slots?: Record<string, string> | undefined;
4724
- type: "duct-segment";
4644
+ type: "duct-fitting";
4725
4645
  } | {
4726
4646
  object: "node";
4727
4647
  name?: string | undefined;
@@ -4783,12 +4703,23 @@ export declare const nodesOnLevel: (nodes: SceneNodes, levelId: string) => ({
4783
4703
  fromIds: string[];
4784
4704
  } | undefined;
4785
4705
  } | undefined;
4786
- id: `lineset_${string}`;
4787
- path: [number, number, number][];
4788
- suctionDiameter: number;
4789
- liquidDiameter: number;
4790
- insulated: boolean;
4791
- type: "lineset";
4706
+ id: `hvac-equipment_${string}`;
4707
+ position: [number, number, number];
4708
+ rotation: number;
4709
+ supportSlabId?: string | undefined;
4710
+ equipmentType: "air-handler" | "condenser" | "furnace";
4711
+ width: number;
4712
+ depth: number;
4713
+ height: number;
4714
+ supplyShape: "oval" | "rect" | "round";
4715
+ returnShape: "oval" | "rect" | "round";
4716
+ supplyDiameter: number;
4717
+ returnDiameter: number;
4718
+ supplyWidth: number;
4719
+ supplyHeight: number;
4720
+ returnWidth: number;
4721
+ returnHeight: number;
4722
+ type: "hvac-equipment";
4792
4723
  } | {
4793
4724
  object: "node";
4794
4725
  name?: string | undefined;
@@ -4887,13 +4818,17 @@ export declare const nodesOnLevel: (nodes: SceneNodes, levelId: string) => ({
4887
4818
  fromIds: string[];
4888
4819
  } | undefined;
4889
4820
  } | undefined;
4890
- id: `pipe-trap_${string}`;
4821
+ id: `pipe-fitting_${string}`;
4891
4822
  position: [number, number, number];
4892
- rotation: number;
4823
+ rotation: [number, number, number];
4824
+ fittingType: "cleanout" | "coupling" | "cross" | "elbow" | "end-cap" | "reducer" | "sanitary-tee" | "wye";
4825
+ angle: number;
4893
4826
  diameter: number;
4827
+ diameter2: number;
4828
+ cleanoutStyle: "end" | "inline";
4894
4829
  pipeMaterial: "abs" | "cast-iron" | "pvc";
4895
- armLengthM: number;
4896
- type: "pipe-trap";
4830
+ system: "vent" | "waste";
4831
+ type: "pipe-fitting";
4897
4832
  } | {
4898
4833
  object: "node";
4899
4834
  name?: string | undefined;
@@ -5132,6 +5067,71 @@ export declare const nodesOnLevel: (nodes: SceneNodes, levelId: string) => ({
5132
5067
  showPosts: boolean;
5133
5068
  id: `fence-opening_${string}`;
5134
5069
  type: "fence-opening";
5070
+ } | {
5071
+ object: "node";
5072
+ name?: string | undefined;
5073
+ parentId: string | null;
5074
+ visible: boolean;
5075
+ camera?: {
5076
+ position: [number, number, number];
5077
+ target: [number, number, number];
5078
+ mode: "orthographic" | "perspective";
5079
+ fov?: number | undefined;
5080
+ zoom?: number | undefined;
5081
+ } | undefined;
5082
+ metadata: Record<string, unknown>;
5083
+ provenance?: {
5084
+ refs: {
5085
+ ns?: string | undefined;
5086
+ id: string;
5087
+ role?: "absorbed" | "alias" | "derived" | "piece" | "primary" | undefined;
5088
+ }[];
5089
+ lineage?: {
5090
+ op: "attach" | "convert" | "duplicate" | "import" | "make-independent" | "merge" | "promote" | "split";
5091
+ fromIds: string[];
5092
+ } | undefined;
5093
+ } | undefined;
5094
+ id: `bvent_${string}`;
5095
+ material?: {
5096
+ id?: string | undefined;
5097
+ preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
5098
+ properties?: {
5099
+ color: string;
5100
+ roughness: number;
5101
+ metalness: number;
5102
+ opacity: number;
5103
+ transparent: boolean;
5104
+ side: "back" | "double" | "front";
5105
+ } | undefined;
5106
+ texture?: {
5107
+ url: string;
5108
+ repeat?: [number, number] | undefined;
5109
+ scale?: number | undefined;
5110
+ offset?: [number, number] | undefined;
5111
+ normalMap?: string | undefined;
5112
+ normalScale?: number | undefined;
5113
+ bumpMap?: string | undefined;
5114
+ bumpScale?: number | undefined;
5115
+ } | undefined;
5116
+ } | undefined;
5117
+ slots?: Record<string, string> | undefined;
5118
+ materialPreset: string;
5119
+ roofSegmentId?: string | undefined;
5120
+ position: [number, number, number];
5121
+ rotation: number;
5122
+ width: number;
5123
+ depth: number;
5124
+ height: number;
5125
+ hoodOverhang: number;
5126
+ topTaper: number;
5127
+ capHeight: number;
5128
+ capGap: number;
5129
+ domeCurvature: number;
5130
+ baseInset: number;
5131
+ baseHeight: number;
5132
+ cornerBevel: number;
5133
+ style: "box" | "cap" | "dome";
5134
+ type: "box-vent";
5135
5135
  } | {
5136
5136
  object: "node";
5137
5137
  name?: string | undefined;