@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
@@ -60,47 +60,18 @@ export declare function markSlabChangeDependents(previous: SlabNode, next: SlabN
60
60
  fromIds: string[];
61
61
  } | undefined;
62
62
  } | undefined;
63
- id: `bvent_${string}`;
64
- material?: {
65
- id?: string | undefined;
66
- preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
67
- properties?: {
68
- color: string;
69
- roughness: number;
70
- metalness: number;
71
- opacity: number;
72
- transparent: boolean;
73
- side: "back" | "double" | "front";
74
- } | undefined;
75
- texture?: {
76
- url: string;
77
- repeat?: [number, number] | undefined;
78
- scale?: number | undefined;
79
- offset?: [number, number] | undefined;
80
- normalMap?: string | undefined;
81
- normalScale?: number | undefined;
82
- bumpMap?: string | undefined;
83
- bumpScale?: number | undefined;
84
- } | undefined;
85
- } | undefined;
86
- slots?: Record<string, string> | undefined;
87
- materialPreset: string;
88
- roofSegmentId?: string | undefined;
89
- position: [number, number, number];
90
- rotation: number;
63
+ id: `beam_${string}`;
64
+ start: [number, number];
65
+ end: [number, number];
91
66
  width: number;
92
67
  depth: number;
93
- height: number;
94
- hoodOverhang: number;
95
- topTaper: number;
96
- capHeight: number;
97
- capGap: number;
98
- domeCurvature: number;
99
- baseInset: number;
100
- baseHeight: number;
101
- cornerBevel: number;
102
- style: "box" | "cap" | "dome";
103
- type: "box-vent";
68
+ size?: string | undefined;
69
+ plies: number;
70
+ material: "glulam" | "lvl" | "pressure-treated" | "sawn" | "steel";
71
+ placement: "dropped" | "flush";
72
+ topElevation?: number | undefined;
73
+ supportSlabId?: string | undefined;
74
+ type: "beam";
104
75
  } | {
105
76
  object: "node";
106
77
  name?: string | undefined;
@@ -125,223 +96,89 @@ export declare function markSlabChangeDependents(previous: SlabNode, next: SlabN
125
96
  fromIds: string[];
126
97
  } | undefined;
127
98
  } | undefined;
128
- id: `column_${string}`;
129
- children: string[];
130
- position: [number, number, number];
131
- rotation: number;
132
- supportSlabId?: string | undefined;
133
- source?: {
134
- kind: "script";
135
- meta?: {
136
- description?: string | undefined;
137
- category?: string | undefined;
138
- tags?: string[] | undefined;
139
- parent?: string | undefined;
140
- } | undefined;
141
- language: "bpy" | "three";
142
- script: string;
143
- params: Record<string, string | number | boolean>;
144
- artifact: string;
145
- manifest: {
146
- bounds: {
147
- min: [number, number, number];
148
- max: [number, number, number];
99
+ id: `measurement_${string}`;
100
+ measurement: {
101
+ kind: "volume";
102
+ base: ({
103
+ kind: "feature";
104
+ reference: {
105
+ nodeId: string;
106
+ featureId: string;
107
+ parameters?: Record<string, string | number | boolean> | undefined;
149
108
  };
150
- params: {
151
- id: string;
152
- label?: string | undefined;
153
- kind: "boolean" | "number" | "string";
154
- default: string | number | boolean;
155
- min?: number | undefined;
156
- max?: number | undefined;
157
- step?: number | undefined;
158
- unit?: string | undefined;
159
- options?: string[] | undefined;
160
- }[];
161
- parts: {
162
- id: string;
163
- label?: string | undefined;
164
- type?: string | undefined;
165
- bounds?: {
166
- min: [number, number, number];
167
- max: [number, number, number];
168
- } | undefined;
169
- }[];
170
- surfaces: {
171
- part?: string | undefined;
172
- y: number;
173
- polygon: [number, number][];
174
- }[];
175
- slots: {
176
- id: string;
177
- label?: string | undefined;
178
- color?: string | undefined;
179
- roughness?: number | undefined;
180
- metalness?: number | undefined;
181
- transparent?: boolean | undefined;
182
- emissive?: boolean | undefined;
183
- }[];
184
- anchors: {
185
- id: string;
186
- position: [number, number, number];
187
- normal?: [number, number, number] | undefined;
188
- }[];
189
- lights: {
190
- id: string;
191
- position: [number, number, number];
192
- color: string;
193
- intensity: number;
194
- distance?: number | undefined;
195
- spot?: {
196
- direction: [number, number, number];
197
- angle: number;
198
- softness: number;
199
- } | undefined;
200
- shadows?: boolean | undefined;
201
- glow?: {
202
- size: number;
203
- strength: number;
204
- } | undefined;
205
- }[];
206
- undersides: {
207
- part?: string | undefined;
208
- polygon: [number, number][];
209
- plane: [number, number, number, number];
210
- }[];
211
- animations: {
212
- name: string;
213
- duration: number;
214
- }[];
215
- cutters?: {
216
- host: "ceiling" | "mounted" | "slab" | "wall";
217
- polygon: number[][];
218
- minY: number;
219
- maxY: number;
220
- }[] | undefined;
221
- cutout: boolean;
222
- collider: boolean;
223
- shape?: {
224
- tolerance: number;
225
- bands: {
226
- y0: number;
227
- y1: number;
228
- polygons: {
229
- outer: [number, number][];
230
- holes?: [number, number][][] | undefined;
231
- }[];
232
- }[];
233
- } | undefined;
234
- triangles: number;
235
- coverage?: number | undefined;
236
- uncovered?: {
237
- min: [number, number];
238
- max: [number, number];
239
- }[] | undefined;
240
- };
241
- images?: {
242
- artifact: string;
243
- thumbnail: string;
244
- floorPlan: string;
245
- } | undefined;
246
- } | undefined;
247
- style: "cluster" | "dravidian-carved" | "faceted" | "fluted" | "lathe-turned" | "plain";
248
- crossSection: "octagonal" | "rectangular" | "round" | "sixteen-sided" | "square";
249
- height: number;
250
- radius: number;
251
- width: number;
252
- depth: number;
253
- edgeSoftness: number;
254
- baseHeight: number;
255
- capitalHeight: number;
256
- shaftProfile: "baluster" | "bulged" | "hourglass" | "straight" | "tapered";
257
- shaftTaper: number;
258
- shaftBulge: number;
259
- shaftStartScale: number;
260
- shaftEndScale: number;
261
- shaftSegmentCount: number;
262
- shaftTwistStep: number;
263
- shaftCornerRadius: number;
264
- shaftDetail: "fluted" | "lathe-turned" | "none" | "panelled" | "spiral";
265
- baseStyle: "lotus" | "none" | "panelled-pedestal" | "ribbed-lotus" | "round-rings" | "simple-square" | "square-plinth" | "stepped-square";
266
- baseWidthScale: number;
267
- baseDepthScale: number;
268
- baseTierCount: number;
269
- baseStepSpread: number;
270
- basePlinthHeightRatio: number;
271
- baseRoundBandScale: number;
272
- baseNeckScale: number;
273
- baseRoundBandCount: number;
274
- baseRibCount: number;
275
- baseCarvingLevel: number;
276
- basePanelInset: number;
277
- capitalStyle: "corinthian-leaf" | "doric" | "ionic-volute" | "leaf-carved" | "none" | "rounded" | "simple" | "simple-slab" | "south-indian-bracket" | "stepped" | "volute" | "wood-bracket";
278
- capitalWidthScale: number;
279
- capitalDepthScale: number;
280
- capitalTierCount: number;
281
- capitalStepSpread: number;
282
- capitalBandCount: number;
283
- voluteSize: number;
284
- voluteCount: number;
285
- leafCount: number;
286
- leafRows: number;
287
- bracketDepth: number;
288
- bracketTierCount: number;
289
- pendantCount: number;
290
- capitalCarvingLevel: number;
291
- ringCount: number;
292
- ringPlacement: "bottom" | "ends" | "even" | "top";
293
- ringThickness: number;
294
- ringSpread: number;
295
- fluteCount: number;
296
- fluteDepth: number;
297
- fluteWidth: number;
298
- spiralTwist: number;
299
- spiralRibCount: number;
300
- panelCount: number;
301
- panelInsetDepth: number;
302
- panelShape: "arched" | "diamond" | "rectangle";
303
- latheRingCount: number;
304
- latheRingSpacing: "bottom" | "ends" | "even" | "top";
305
- carvingLevel: number;
306
- carvingPlacement: "all" | "base" | "capital" | "shaft";
307
- lowerBandEnabled: boolean;
308
- lowerBandHeight: number;
309
- lowerBandCarvingLevel: number;
310
- dentilCount: number;
311
- beadCount: number;
312
- supportStyle: "a-frame" | "box-frame" | "k-brace" | "portal-frame" | "single-strut" | "trestle" | "tripod" | "v-frame" | "vertical" | "x-brace" | "y-frame";
313
- braceWidth: number;
314
- braceDepth: number;
315
- braceBottomSpread: number;
316
- braceTopSpread: number;
317
- bracePlateEnabled: boolean;
318
- role?: "ornament" | "post" | undefined;
319
- postBase?: "none" | "pier" | "post-base" | undefined;
320
- material?: {
321
- id?: string | undefined;
322
- preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
323
- properties?: {
324
- color: string;
325
- roughness: number;
326
- metalness: number;
327
- opacity: number;
328
- transparent: boolean;
329
- side: "back" | "double" | "front";
330
- } | undefined;
331
- texture?: {
332
- url: string;
333
- repeat?: [number, number] | undefined;
334
- scale?: number | undefined;
335
- offset?: [number, number] | undefined;
336
- normalMap?: string | undefined;
337
- normalScale?: number | undefined;
338
- bumpMap?: string | undefined;
339
- bumpScale?: number | undefined;
340
- } | undefined;
341
- } | undefined;
342
- materialPreset?: string | undefined;
343
- slots?: Record<string, string> | undefined;
344
- type: "column";
109
+ fallback: [number, number, number];
110
+ } | [number, number, number])[];
111
+ extrusion: [number, number, number];
112
+ } | {
113
+ kind: "distance";
114
+ points: [{
115
+ kind: "feature";
116
+ reference: {
117
+ nodeId: string;
118
+ featureId: string;
119
+ parameters?: Record<string, string | number | boolean> | undefined;
120
+ };
121
+ fallback: [number, number, number];
122
+ } | [number, number, number], {
123
+ kind: "feature";
124
+ reference: {
125
+ nodeId: string;
126
+ featureId: string;
127
+ parameters?: Record<string, string | number | boolean> | undefined;
128
+ };
129
+ fallback: [number, number, number];
130
+ } | [number, number, number]];
131
+ } | {
132
+ kind: "angle";
133
+ points: [{
134
+ kind: "feature";
135
+ reference: {
136
+ nodeId: string;
137
+ featureId: string;
138
+ parameters?: Record<string, string | number | boolean> | undefined;
139
+ };
140
+ fallback: [number, number, number];
141
+ } | [number, number, number], {
142
+ kind: "feature";
143
+ reference: {
144
+ nodeId: string;
145
+ featureId: string;
146
+ parameters?: Record<string, string | number | boolean> | undefined;
147
+ };
148
+ fallback: [number, number, number];
149
+ } | [number, number, number], {
150
+ kind: "feature";
151
+ reference: {
152
+ nodeId: string;
153
+ featureId: string;
154
+ parameters?: Record<string, string | number | boolean> | undefined;
155
+ };
156
+ fallback: [number, number, number];
157
+ } | [number, number, number]];
158
+ } | {
159
+ kind: "area";
160
+ base: ({
161
+ kind: "feature";
162
+ reference: {
163
+ nodeId: string;
164
+ featureId: string;
165
+ parameters?: Record<string, string | number | boolean> | undefined;
166
+ };
167
+ fallback: [number, number, number];
168
+ } | [number, number, number])[];
169
+ } | {
170
+ kind: "perimeter";
171
+ base: ({
172
+ kind: "feature";
173
+ reference: {
174
+ nodeId: string;
175
+ featureId: string;
176
+ parameters?: Record<string, string | number | boolean> | undefined;
177
+ };
178
+ fallback: [number, number, number];
179
+ } | [number, number, number])[];
180
+ };
181
+ type: "measurement";
345
182
  } | {
346
183
  object: "node";
347
184
  name?: string | undefined;
@@ -366,29 +203,72 @@ export declare function markSlabChangeDependents(previous: SlabNode, next: SlabN
366
203
  fromIds: string[];
367
204
  } | undefined;
368
205
  } | undefined;
369
- id: `duct-fitting_${string}`;
370
- position: [number, number, number];
371
- rotation: [number, number, number];
372
- fittingType: "access-panel" | "coupling" | "cross" | "damper" | "elbow" | "end-cap" | "reducer" | "tee" | "transition";
206
+ id: `duct-segment_${string}`;
207
+ path: [number, number, number][];
208
+ autoHangers?: boolean | undefined;
209
+ hangerOverrides?: Record<string, {
210
+ fraction?: number | undefined;
211
+ skipped?: boolean | undefined;
212
+ hostId?: string | undefined;
213
+ }> | undefined;
214
+ hangerStyle?: "double" | "single" | undefined;
215
+ hangerSpacing?: number | undefined;
216
+ hangerMaxReach?: number | undefined;
217
+ wallAttachment?: {
218
+ wallId: `wall_${string}`;
219
+ side: "back" | "front";
220
+ startUV: [number, number];
221
+ endUV: [number, number];
222
+ offset: number;
223
+ } | undefined;
373
224
  shape: "oval" | "rect" | "round";
374
- inletShape?: "oval" | "rect" | "round" | undefined;
375
- outletShape?: "oval" | "rect" | "round" | undefined;
225
+ diameter: number;
376
226
  width: number;
377
227
  height: number;
378
- shape2: "oval" | "rect" | "round";
379
- width2: number;
380
- height2: number;
381
- angle: number;
382
- branchAngle: number;
383
- diameter: number;
384
- diameter2: number;
385
- ductMaterial: "duct-board" | "flex" | "sheet-metal";
228
+ roll: number;
229
+ ductMaterial: "duct-board" | "flex" | "sheet-metal" | "spiral";
230
+ seamDetail: boolean;
231
+ insulated: boolean;
232
+ insulationR: number;
386
233
  system: "return" | "supply";
387
- damperAngle: number;
388
- panelWidth: number;
389
- panelHeight: number;
390
234
  slots?: Record<string, string> | undefined;
391
- type: "duct-fitting";
235
+ type: "duct-segment";
236
+ } | {
237
+ object: "node";
238
+ name?: string | undefined;
239
+ parentId: string | null;
240
+ visible: boolean;
241
+ camera?: {
242
+ position: [number, number, number];
243
+ target: [number, number, number];
244
+ mode: "orthographic" | "perspective";
245
+ fov?: number | undefined;
246
+ zoom?: number | undefined;
247
+ } | undefined;
248
+ metadata: Record<string, unknown>;
249
+ provenance?: {
250
+ refs: {
251
+ ns?: string | undefined;
252
+ id: string;
253
+ role?: "absorbed" | "alias" | "derived" | "piece" | "primary" | undefined;
254
+ }[];
255
+ lineage?: {
256
+ op: "attach" | "convert" | "duplicate" | "import" | "make-independent" | "merge" | "promote" | "split";
257
+ fromIds: string[];
258
+ } | undefined;
259
+ } | undefined;
260
+ id: `floor-opening_${string}`;
261
+ polygon: [number, number][];
262
+ hostZoneId?: string | undefined;
263
+ legacyPlateCuts?: Record<string, [number, number][][]> | undefined;
264
+ legacyCeilingCuts?: Record<string, [number, number][][]> | undefined;
265
+ source: string;
266
+ ownerId?: string | undefined;
267
+ surfaceId?: string | undefined;
268
+ drawnOn: "ceiling" | "floor";
269
+ cutsPrimary: boolean;
270
+ cutsAdjacent: boolean;
271
+ type: "floor-opening";
392
272
  } | {
393
273
  object: "node";
394
274
  name?: string | undefined;
@@ -413,23 +293,12 @@ export declare function markSlabChangeDependents(previous: SlabNode, next: SlabN
413
293
  fromIds: string[];
414
294
  } | undefined;
415
295
  } | undefined;
416
- id: `hvac-equipment_${string}`;
417
- position: [number, number, number];
418
- rotation: number;
419
- supportSlabId?: string | undefined;
420
- equipmentType: "air-handler" | "condenser" | "furnace";
421
- width: number;
422
- depth: number;
423
- height: number;
424
- supplyShape: "oval" | "rect" | "round";
425
- returnShape: "oval" | "rect" | "round";
426
- supplyDiameter: number;
427
- returnDiameter: number;
428
- supplyWidth: number;
429
- supplyHeight: number;
430
- returnWidth: number;
431
- returnHeight: number;
432
- type: "hvac-equipment";
296
+ id: `lineset_${string}`;
297
+ path: [number, number, number][];
298
+ suctionDiameter: number;
299
+ liquidDiameter: number;
300
+ insulated: boolean;
301
+ type: "lineset";
433
302
  } | {
434
303
  object: "node";
435
304
  name?: string | undefined;
@@ -454,17 +323,13 @@ export declare function markSlabChangeDependents(previous: SlabNode, next: SlabN
454
323
  fromIds: string[];
455
324
  } | undefined;
456
325
  } | undefined;
457
- id: `pipe-fitting_${string}`;
326
+ id: `pipe-trap_${string}`;
458
327
  position: [number, number, number];
459
- rotation: [number, number, number];
460
- fittingType: "cleanout" | "coupling" | "cross" | "elbow" | "end-cap" | "reducer" | "sanitary-tee" | "wye";
461
- angle: number;
328
+ rotation: number;
462
329
  diameter: number;
463
- diameter2: number;
464
- cleanoutStyle: "end" | "inline";
465
330
  pipeMaterial: "abs" | "cast-iron" | "pvc";
466
- system: "vent" | "waste";
467
- type: "pipe-fitting";
331
+ armLengthM: number;
332
+ type: "pipe-trap";
468
333
  } | {
469
334
  object: "node";
470
335
  name?: string | undefined;
@@ -997,7 +862,7 @@ export declare function markSlabChangeDependents(previous: SlabNode, next: SlabN
997
862
  cavityInsulation?: string | undefined;
998
863
  } | undefined;
999
864
  slots?: Record<string, string> | undefined;
1000
- children: `rseg_${string}`[];
865
+ children: string[];
1001
866
  type: "roof";
1002
867
  } | {
1003
868
  object: "node";
@@ -1562,7 +1427,217 @@ export declare function markSlabChangeDependents(previous: SlabNode, next: SlabN
1562
1427
  bumpScale?: number | undefined;
1563
1428
  } | undefined;
1564
1429
  } | undefined;
1565
- slots?: Record<string, string> | undefined;
1430
+ slots?: Record<string, string> | undefined;
1431
+ source?: {
1432
+ kind: "script";
1433
+ meta?: {
1434
+ description?: string | undefined;
1435
+ category?: string | undefined;
1436
+ tags?: string[] | undefined;
1437
+ parent?: string | undefined;
1438
+ } | undefined;
1439
+ language: "bpy" | "three";
1440
+ script: string;
1441
+ params: Record<string, string | number | boolean>;
1442
+ artifact: string;
1443
+ manifest: {
1444
+ bounds: {
1445
+ min: [number, number, number];
1446
+ max: [number, number, number];
1447
+ };
1448
+ params: {
1449
+ id: string;
1450
+ label?: string | undefined;
1451
+ kind: "boolean" | "number" | "string";
1452
+ default: string | number | boolean;
1453
+ min?: number | undefined;
1454
+ max?: number | undefined;
1455
+ step?: number | undefined;
1456
+ unit?: string | undefined;
1457
+ options?: string[] | undefined;
1458
+ }[];
1459
+ parts: {
1460
+ id: string;
1461
+ label?: string | undefined;
1462
+ type?: string | undefined;
1463
+ bounds?: {
1464
+ min: [number, number, number];
1465
+ max: [number, number, number];
1466
+ } | undefined;
1467
+ }[];
1468
+ surfaces: {
1469
+ part?: string | undefined;
1470
+ y: number;
1471
+ polygon: [number, number][];
1472
+ }[];
1473
+ slots: {
1474
+ id: string;
1475
+ label?: string | undefined;
1476
+ color?: string | undefined;
1477
+ roughness?: number | undefined;
1478
+ metalness?: number | undefined;
1479
+ transparent?: boolean | undefined;
1480
+ emissive?: boolean | undefined;
1481
+ }[];
1482
+ anchors: {
1483
+ id: string;
1484
+ position: [number, number, number];
1485
+ normal?: [number, number, number] | undefined;
1486
+ }[];
1487
+ lights: {
1488
+ id: string;
1489
+ position: [number, number, number];
1490
+ color: string;
1491
+ intensity: number;
1492
+ distance?: number | undefined;
1493
+ spot?: {
1494
+ direction: [number, number, number];
1495
+ angle: number;
1496
+ softness: number;
1497
+ } | undefined;
1498
+ shadows?: boolean | undefined;
1499
+ glow?: {
1500
+ size: number;
1501
+ strength: number;
1502
+ } | undefined;
1503
+ }[];
1504
+ undersides: {
1505
+ part?: string | undefined;
1506
+ polygon: [number, number][];
1507
+ plane: [number, number, number, number];
1508
+ }[];
1509
+ animations: {
1510
+ name: string;
1511
+ duration: number;
1512
+ }[];
1513
+ cutters?: {
1514
+ host: "ceiling" | "mounted" | "slab" | "wall";
1515
+ polygon: number[][];
1516
+ minY: number;
1517
+ maxY: number;
1518
+ }[] | undefined;
1519
+ cutout: boolean;
1520
+ collider: boolean;
1521
+ shape?: {
1522
+ tolerance: number;
1523
+ bands: {
1524
+ y0: number;
1525
+ y1: number;
1526
+ polygons: {
1527
+ outer: [number, number][];
1528
+ holes?: [number, number][][] | undefined;
1529
+ }[];
1530
+ }[];
1531
+ } | undefined;
1532
+ triangles: number;
1533
+ coverage?: number | undefined;
1534
+ uncovered?: {
1535
+ min: [number, number];
1536
+ max: [number, number];
1537
+ }[] | undefined;
1538
+ };
1539
+ images?: {
1540
+ artifact: string;
1541
+ thumbnail: string;
1542
+ floorPlan: string;
1543
+ } | undefined;
1544
+ } | undefined;
1545
+ position: [number, number, number];
1546
+ rotation: [number, number, number];
1547
+ side?: "back" | "front" | undefined;
1548
+ verticalAnchor?: "floor" | "wall" | undefined;
1549
+ floorThresholdVersion: 0 | 1;
1550
+ wallId?: string | undefined;
1551
+ dormerId?: string | undefined;
1552
+ dormerFace?: "back" | "front" | "left" | "right" | undefined;
1553
+ roofSegmentId?: string | undefined;
1554
+ roofFace?: "back" | "front" | "left" | "right" | undefined;
1555
+ width: number;
1556
+ height: number;
1557
+ mark?: string | undefined;
1558
+ constructionType: "framed" | "masonry";
1559
+ dimensionReference: "finish-opening" | "masonry-opening" | "nominal" | "rough-opening";
1560
+ roughOpeningWidth?: number | undefined;
1561
+ roughOpeningHeight?: number | undefined;
1562
+ masonryOpeningWidth?: number | undefined;
1563
+ masonryOpeningHeight?: number | undefined;
1564
+ finishOpeningWidth?: number | undefined;
1565
+ finishOpeningHeight?: number | undefined;
1566
+ openingKind: "opening" | "window";
1567
+ windowType: "awning" | "bay" | "bow" | "casement" | "double-hung" | "fixed" | "hopper" | "louvered" | "single-hung" | "sliding" | "tilt-turn";
1568
+ operationState: number;
1569
+ openingDirection?: "inward" | "outward" | undefined;
1570
+ tiltTurnMode?: "tilt" | "turn" | undefined;
1571
+ awningDirection: "down" | "up";
1572
+ casementStyle: "french" | "single";
1573
+ hingesSide: "left" | "right";
1574
+ openingShape: "arch" | "rectangle" | "rounded";
1575
+ openingRadiusMode: "all" | "individual";
1576
+ openingCornerRadii: [number, number, number, number];
1577
+ cornerRadius: number;
1578
+ archHeight: number;
1579
+ openingRevealRadius: number;
1580
+ frameThickness: number;
1581
+ frameDepth?: number | undefined;
1582
+ windowHandle?: boolean | undefined;
1583
+ sashGrid?: boolean | undefined;
1584
+ columnRatios: number[];
1585
+ rowRatios: number[];
1586
+ columnDividerThickness: number;
1587
+ rowDividerThickness: number;
1588
+ corner?: {
1589
+ end: "end" | "start";
1590
+ partnerId: string;
1591
+ post: "none" | "post";
1592
+ } | undefined;
1593
+ sill: boolean;
1594
+ sillDepth: number;
1595
+ sillThickness: number;
1596
+ sillOverhang?: number | undefined;
1597
+ sillInterior?: boolean | undefined;
1598
+ sillInteriorDepth?: number | undefined;
1599
+ sillInteriorThickness?: number | undefined;
1600
+ sillInteriorOverhang?: number | undefined;
1601
+ shutters?: "board-batten" | "louvered" | "none" | "panel" | undefined;
1602
+ shutterWidth?: number | undefined;
1603
+ shutterOpen?: number | undefined;
1604
+ shutterSides?: "both" | "left" | "right" | undefined;
1605
+ rollerShutter?: "box" | "concealed" | "none" | undefined;
1606
+ rollerShutterBoxHeight?: number | undefined;
1607
+ rollerShutterOpen?: number | undefined;
1608
+ casingFaceA?: boolean | undefined;
1609
+ casingFaceB?: boolean | undefined;
1610
+ casingWidth?: number | undefined;
1611
+ type: "window";
1612
+ } | {
1613
+ object: "node";
1614
+ name?: string | undefined;
1615
+ parentId: string | null;
1616
+ visible: boolean;
1617
+ camera?: {
1618
+ position: [number, number, number];
1619
+ target: [number, number, number];
1620
+ mode: "orthographic" | "perspective";
1621
+ fov?: number | undefined;
1622
+ zoom?: number | undefined;
1623
+ } | undefined;
1624
+ metadata: Record<string, unknown>;
1625
+ provenance?: {
1626
+ refs: {
1627
+ ns?: string | undefined;
1628
+ id: string;
1629
+ role?: "absorbed" | "alias" | "derived" | "piece" | "primary" | undefined;
1630
+ }[];
1631
+ lineage?: {
1632
+ op: "attach" | "convert" | "duplicate" | "import" | "make-independent" | "merge" | "promote" | "split";
1633
+ fromIds: string[];
1634
+ } | undefined;
1635
+ } | undefined;
1636
+ id: `column_${string}`;
1637
+ children: string[];
1638
+ position: [number, number, number];
1639
+ rotation: number;
1640
+ supportSlabId?: string | undefined;
1566
1641
  source?: {
1567
1642
  kind: "script";
1568
1643
  meta?: {
@@ -1677,73 +1752,104 @@ export declare function markSlabChangeDependents(previous: SlabNode, next: SlabN
1677
1752
  floorPlan: string;
1678
1753
  } | undefined;
1679
1754
  } | undefined;
1680
- position: [number, number, number];
1681
- rotation: [number, number, number];
1682
- side?: "back" | "front" | undefined;
1683
- verticalAnchor?: "floor" | "wall" | undefined;
1684
- floorThresholdVersion: 0 | 1;
1685
- wallId?: string | undefined;
1686
- dormerId?: string | undefined;
1687
- dormerFace?: "back" | "front" | "left" | "right" | undefined;
1688
- roofSegmentId?: string | undefined;
1689
- roofFace?: "back" | "front" | "left" | "right" | undefined;
1690
- width: number;
1755
+ style: "cluster" | "dravidian-carved" | "faceted" | "fluted" | "lathe-turned" | "plain";
1756
+ crossSection: "octagonal" | "rectangular" | "round" | "sixteen-sided" | "square";
1691
1757
  height: number;
1692
- mark?: string | undefined;
1693
- constructionType: "framed" | "masonry";
1694
- dimensionReference: "finish-opening" | "masonry-opening" | "nominal" | "rough-opening";
1695
- roughOpeningWidth?: number | undefined;
1696
- roughOpeningHeight?: number | undefined;
1697
- masonryOpeningWidth?: number | undefined;
1698
- masonryOpeningHeight?: number | undefined;
1699
- finishOpeningWidth?: number | undefined;
1700
- finishOpeningHeight?: number | undefined;
1701
- openingKind: "opening" | "window";
1702
- windowType: "awning" | "bay" | "bow" | "casement" | "double-hung" | "fixed" | "hopper" | "louvered" | "single-hung" | "sliding" | "tilt-turn";
1703
- operationState: number;
1704
- openingDirection?: "inward" | "outward" | undefined;
1705
- tiltTurnMode?: "tilt" | "turn" | undefined;
1706
- awningDirection: "down" | "up";
1707
- casementStyle: "french" | "single";
1708
- hingesSide: "left" | "right";
1709
- openingShape: "arch" | "rectangle" | "rounded";
1710
- openingRadiusMode: "all" | "individual";
1711
- openingCornerRadii: [number, number, number, number];
1712
- cornerRadius: number;
1713
- archHeight: number;
1714
- openingRevealRadius: number;
1715
- frameThickness: number;
1716
- frameDepth?: number | undefined;
1717
- windowHandle?: boolean | undefined;
1718
- sashGrid?: boolean | undefined;
1719
- columnRatios: number[];
1720
- rowRatios: number[];
1721
- columnDividerThickness: number;
1722
- rowDividerThickness: number;
1723
- corner?: {
1724
- end: "end" | "start";
1725
- partnerId: string;
1726
- post: "none" | "post";
1758
+ radius: number;
1759
+ width: number;
1760
+ depth: number;
1761
+ edgeSoftness: number;
1762
+ baseHeight: number;
1763
+ capitalHeight: number;
1764
+ shaftProfile: "baluster" | "bulged" | "hourglass" | "straight" | "tapered";
1765
+ shaftTaper: number;
1766
+ shaftBulge: number;
1767
+ shaftStartScale: number;
1768
+ shaftEndScale: number;
1769
+ shaftSegmentCount: number;
1770
+ shaftTwistStep: number;
1771
+ shaftCornerRadius: number;
1772
+ shaftDetail: "fluted" | "lathe-turned" | "none" | "panelled" | "spiral";
1773
+ baseStyle: "lotus" | "none" | "panelled-pedestal" | "ribbed-lotus" | "round-rings" | "simple-square" | "square-plinth" | "stepped-square";
1774
+ baseWidthScale: number;
1775
+ baseDepthScale: number;
1776
+ baseTierCount: number;
1777
+ baseStepSpread: number;
1778
+ basePlinthHeightRatio: number;
1779
+ baseRoundBandScale: number;
1780
+ baseNeckScale: number;
1781
+ baseRoundBandCount: number;
1782
+ baseRibCount: number;
1783
+ baseCarvingLevel: number;
1784
+ basePanelInset: number;
1785
+ capitalStyle: "corinthian-leaf" | "doric" | "ionic-volute" | "leaf-carved" | "none" | "rounded" | "simple" | "simple-slab" | "south-indian-bracket" | "stepped" | "volute" | "wood-bracket";
1786
+ capitalWidthScale: number;
1787
+ capitalDepthScale: number;
1788
+ capitalTierCount: number;
1789
+ capitalStepSpread: number;
1790
+ capitalBandCount: number;
1791
+ voluteSize: number;
1792
+ voluteCount: number;
1793
+ leafCount: number;
1794
+ leafRows: number;
1795
+ bracketDepth: number;
1796
+ bracketTierCount: number;
1797
+ pendantCount: number;
1798
+ capitalCarvingLevel: number;
1799
+ ringCount: number;
1800
+ ringPlacement: "bottom" | "ends" | "even" | "top";
1801
+ ringThickness: number;
1802
+ ringSpread: number;
1803
+ fluteCount: number;
1804
+ fluteDepth: number;
1805
+ fluteWidth: number;
1806
+ spiralTwist: number;
1807
+ spiralRibCount: number;
1808
+ panelCount: number;
1809
+ panelInsetDepth: number;
1810
+ panelShape: "arched" | "diamond" | "rectangle";
1811
+ latheRingCount: number;
1812
+ latheRingSpacing: "bottom" | "ends" | "even" | "top";
1813
+ carvingLevel: number;
1814
+ carvingPlacement: "all" | "base" | "capital" | "shaft";
1815
+ lowerBandEnabled: boolean;
1816
+ lowerBandHeight: number;
1817
+ lowerBandCarvingLevel: number;
1818
+ dentilCount: number;
1819
+ beadCount: number;
1820
+ supportStyle: "a-frame" | "box-frame" | "k-brace" | "portal-frame" | "single-strut" | "trestle" | "tripod" | "v-frame" | "vertical" | "x-brace" | "y-frame";
1821
+ braceWidth: number;
1822
+ braceDepth: number;
1823
+ braceBottomSpread: number;
1824
+ braceTopSpread: number;
1825
+ bracePlateEnabled: boolean;
1826
+ role?: "ornament" | "post" | undefined;
1827
+ postBase?: "none" | "pier" | "post-base" | undefined;
1828
+ material?: {
1829
+ id?: string | undefined;
1830
+ preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
1831
+ properties?: {
1832
+ color: string;
1833
+ roughness: number;
1834
+ metalness: number;
1835
+ opacity: number;
1836
+ transparent: boolean;
1837
+ side: "back" | "double" | "front";
1838
+ } | undefined;
1839
+ texture?: {
1840
+ url: string;
1841
+ repeat?: [number, number] | undefined;
1842
+ scale?: number | undefined;
1843
+ offset?: [number, number] | undefined;
1844
+ normalMap?: string | undefined;
1845
+ normalScale?: number | undefined;
1846
+ bumpMap?: string | undefined;
1847
+ bumpScale?: number | undefined;
1848
+ } | undefined;
1727
1849
  } | undefined;
1728
- sill: boolean;
1729
- sillDepth: number;
1730
- sillThickness: number;
1731
- sillOverhang?: number | undefined;
1732
- sillInterior?: boolean | undefined;
1733
- sillInteriorDepth?: number | undefined;
1734
- sillInteriorThickness?: number | undefined;
1735
- sillInteriorOverhang?: number | undefined;
1736
- shutters?: "board-batten" | "louvered" | "none" | "panel" | undefined;
1737
- shutterWidth?: number | undefined;
1738
- shutterOpen?: number | undefined;
1739
- shutterSides?: "both" | "left" | "right" | undefined;
1740
- rollerShutter?: "box" | "concealed" | "none" | undefined;
1741
- rollerShutterBoxHeight?: number | undefined;
1742
- rollerShutterOpen?: number | undefined;
1743
- casingFaceA?: boolean | undefined;
1744
- casingFaceB?: boolean | undefined;
1745
- casingWidth?: number | undefined;
1746
- type: "window";
1850
+ materialPreset?: string | undefined;
1851
+ slots?: Record<string, string> | undefined;
1852
+ type: "column";
1747
1853
  } | {
1748
1854
  object: "node";
1749
1855
  name?: string | undefined;
@@ -3354,42 +3460,6 @@ export declare function markSlabChangeDependents(previous: SlabNode, next: SlabN
3354
3460
  start: [number, number];
3355
3461
  end: [number, number];
3356
3462
  type: "separator";
3357
- } | {
3358
- object: "node";
3359
- name?: string | undefined;
3360
- parentId: string | null;
3361
- visible: boolean;
3362
- camera?: {
3363
- position: [number, number, number];
3364
- target: [number, number, number];
3365
- mode: "orthographic" | "perspective";
3366
- fov?: number | undefined;
3367
- zoom?: number | undefined;
3368
- } | undefined;
3369
- metadata: Record<string, unknown>;
3370
- provenance?: {
3371
- refs: {
3372
- ns?: string | undefined;
3373
- id: string;
3374
- role?: "absorbed" | "alias" | "derived" | "piece" | "primary" | undefined;
3375
- }[];
3376
- lineage?: {
3377
- op: "attach" | "convert" | "duplicate" | "import" | "make-independent" | "merge" | "promote" | "split";
3378
- fromIds: string[];
3379
- } | undefined;
3380
- } | undefined;
3381
- id: `floor-opening_${string}`;
3382
- polygon: [number, number][];
3383
- hostZoneId?: string | undefined;
3384
- legacyPlateCuts?: Record<string, [number, number][][]> | undefined;
3385
- legacyCeilingCuts?: Record<string, [number, number][][]> | undefined;
3386
- source: string;
3387
- ownerId?: string | undefined;
3388
- surfaceId?: string | undefined;
3389
- drawnOn: "ceiling" | "floor";
3390
- cutsPrimary: boolean;
3391
- cutsAdjacent: boolean;
3392
- type: "floor-opening";
3393
3463
  } | {
3394
3464
  object: "node";
3395
3465
  name?: string | undefined;
@@ -3478,48 +3548,12 @@ export declare function markSlabChangeDependents(previous: SlabNode, next: SlabN
3478
3548
  showInfill: boolean;
3479
3549
  guardInfill?: "balusters" | "boards" | "cable" | undefined;
3480
3550
  startPost?: boolean | undefined;
3481
- endPost?: boolean | undefined;
3482
- postThrough?: boolean | undefined;
3483
- infillPlacement: "back" | "center" | "front";
3484
- color: string;
3485
- style: "guard" | "horizontal" | "picket" | "privacy" | "rail" | "slat";
3486
- type: "fence";
3487
- } | {
3488
- object: "node";
3489
- name?: string | undefined;
3490
- parentId: string | null;
3491
- visible: boolean;
3492
- camera?: {
3493
- position: [number, number, number];
3494
- target: [number, number, number];
3495
- mode: "orthographic" | "perspective";
3496
- fov?: number | undefined;
3497
- zoom?: number | undefined;
3498
- } | undefined;
3499
- metadata: Record<string, unknown>;
3500
- provenance?: {
3501
- refs: {
3502
- ns?: string | undefined;
3503
- id: string;
3504
- role?: "absorbed" | "alias" | "derived" | "piece" | "primary" | undefined;
3505
- }[];
3506
- lineage?: {
3507
- op: "attach" | "convert" | "duplicate" | "import" | "make-independent" | "merge" | "promote" | "split";
3508
- fromIds: string[];
3509
- } | undefined;
3510
- } | undefined;
3511
- id: `beam_${string}`;
3512
- start: [number, number];
3513
- end: [number, number];
3514
- width: number;
3515
- depth: number;
3516
- size?: string | undefined;
3517
- plies: number;
3518
- material: "glulam" | "lvl" | "pressure-treated" | "sawn" | "steel";
3519
- placement: "dropped" | "flush";
3520
- topElevation?: number | undefined;
3521
- supportSlabId?: string | undefined;
3522
- type: "beam";
3551
+ endPost?: boolean | undefined;
3552
+ postThrough?: boolean | undefined;
3553
+ infillPlacement: "back" | "center" | "front";
3554
+ color: string;
3555
+ style: "guard" | "horizontal" | "picket" | "privacy" | "rail" | "slat";
3556
+ type: "fence";
3523
3557
  } | {
3524
3558
  object: "node";
3525
3559
  name?: string | undefined;
@@ -4546,113 +4580,6 @@ export declare function markSlabChangeDependents(previous: SlabNode, next: SlabN
4546
4580
  label: string;
4547
4581
  } | null;
4548
4582
  type: "guide";
4549
- } | {
4550
- object: "node";
4551
- name?: string | undefined;
4552
- parentId: string | null;
4553
- visible: boolean;
4554
- camera?: {
4555
- position: [number, number, number];
4556
- target: [number, number, number];
4557
- mode: "orthographic" | "perspective";
4558
- fov?: number | undefined;
4559
- zoom?: number | undefined;
4560
- } | undefined;
4561
- metadata: Record<string, unknown>;
4562
- provenance?: {
4563
- refs: {
4564
- ns?: string | undefined;
4565
- id: string;
4566
- role?: "absorbed" | "alias" | "derived" | "piece" | "primary" | undefined;
4567
- }[];
4568
- lineage?: {
4569
- op: "attach" | "convert" | "duplicate" | "import" | "make-independent" | "merge" | "promote" | "split";
4570
- fromIds: string[];
4571
- } | undefined;
4572
- } | undefined;
4573
- id: `measurement_${string}`;
4574
- measurement: {
4575
- kind: "distance";
4576
- points: [{
4577
- kind: "feature";
4578
- reference: {
4579
- nodeId: string;
4580
- featureId: string;
4581
- parameters?: Record<string, string | number | boolean> | undefined;
4582
- };
4583
- fallback: [number, number, number];
4584
- } | [number, number, number], {
4585
- kind: "feature";
4586
- reference: {
4587
- nodeId: string;
4588
- featureId: string;
4589
- parameters?: Record<string, string | number | boolean> | undefined;
4590
- };
4591
- fallback: [number, number, number];
4592
- } | [number, number, number]];
4593
- } | {
4594
- kind: "angle";
4595
- points: [{
4596
- kind: "feature";
4597
- reference: {
4598
- nodeId: string;
4599
- featureId: string;
4600
- parameters?: Record<string, string | number | boolean> | undefined;
4601
- };
4602
- fallback: [number, number, number];
4603
- } | [number, number, number], {
4604
- kind: "feature";
4605
- reference: {
4606
- nodeId: string;
4607
- featureId: string;
4608
- parameters?: Record<string, string | number | boolean> | undefined;
4609
- };
4610
- fallback: [number, number, number];
4611
- } | [number, number, number], {
4612
- kind: "feature";
4613
- reference: {
4614
- nodeId: string;
4615
- featureId: string;
4616
- parameters?: Record<string, string | number | boolean> | undefined;
4617
- };
4618
- fallback: [number, number, number];
4619
- } | [number, number, number]];
4620
- } | {
4621
- kind: "area";
4622
- base: ({
4623
- kind: "feature";
4624
- reference: {
4625
- nodeId: string;
4626
- featureId: string;
4627
- parameters?: Record<string, string | number | boolean> | undefined;
4628
- };
4629
- fallback: [number, number, number];
4630
- } | [number, number, number])[];
4631
- } | {
4632
- kind: "perimeter";
4633
- base: ({
4634
- kind: "feature";
4635
- reference: {
4636
- nodeId: string;
4637
- featureId: string;
4638
- parameters?: Record<string, string | number | boolean> | undefined;
4639
- };
4640
- fallback: [number, number, number];
4641
- } | [number, number, number])[];
4642
- } | {
4643
- kind: "volume";
4644
- base: ({
4645
- kind: "feature";
4646
- reference: {
4647
- nodeId: string;
4648
- featureId: string;
4649
- parameters?: Record<string, string | number | boolean> | undefined;
4650
- };
4651
- fallback: [number, number, number];
4652
- } | [number, number, number])[];
4653
- extrusion: [number, number, number];
4654
- };
4655
- type: "measurement";
4656
4583
  } | {
4657
4584
  object: "node";
4658
4585
  name?: string | undefined;
@@ -4706,36 +4633,29 @@ export declare function markSlabChangeDependents(previous: SlabNode, next: SlabN
4706
4633
  fromIds: string[];
4707
4634
  } | undefined;
4708
4635
  } | undefined;
4709
- id: `duct-segment_${string}`;
4710
- path: [number, number, number][];
4711
- autoHangers?: boolean | undefined;
4712
- hangerOverrides?: Record<string, {
4713
- fraction?: number | undefined;
4714
- skipped?: boolean | undefined;
4715
- hostId?: string | undefined;
4716
- }> | undefined;
4717
- hangerStyle?: "double" | "single" | undefined;
4718
- hangerSpacing?: number | undefined;
4719
- hangerMaxReach?: number | undefined;
4720
- wallAttachment?: {
4721
- wallId: `wall_${string}`;
4722
- side: "back" | "front";
4723
- startUV: [number, number];
4724
- endUV: [number, number];
4725
- offset: number;
4726
- } | undefined;
4636
+ id: `duct-fitting_${string}`;
4637
+ position: [number, number, number];
4638
+ rotation: [number, number, number];
4639
+ fittingType: "access-panel" | "coupling" | "cross" | "damper" | "elbow" | "end-cap" | "reducer" | "tee" | "transition";
4727
4640
  shape: "oval" | "rect" | "round";
4728
- diameter: number;
4641
+ inletShape?: "oval" | "rect" | "round" | undefined;
4642
+ outletShape?: "oval" | "rect" | "round" | undefined;
4729
4643
  width: number;
4730
4644
  height: number;
4731
- roll: number;
4732
- ductMaterial: "duct-board" | "flex" | "sheet-metal" | "spiral";
4733
- seamDetail: boolean;
4734
- insulated: boolean;
4735
- insulationR: number;
4645
+ shape2: "oval" | "rect" | "round";
4646
+ width2: number;
4647
+ height2: number;
4648
+ angle: number;
4649
+ branchAngle: number;
4650
+ diameter: number;
4651
+ diameter2: number;
4652
+ ductMaterial: "duct-board" | "flex" | "sheet-metal";
4736
4653
  system: "return" | "supply";
4654
+ damperAngle: number;
4655
+ panelWidth: number;
4656
+ panelHeight: number;
4737
4657
  slots?: Record<string, string> | undefined;
4738
- type: "duct-segment";
4658
+ type: "duct-fitting";
4739
4659
  } | {
4740
4660
  object: "node";
4741
4661
  name?: string | undefined;
@@ -4797,12 +4717,23 @@ export declare function markSlabChangeDependents(previous: SlabNode, next: SlabN
4797
4717
  fromIds: string[];
4798
4718
  } | undefined;
4799
4719
  } | undefined;
4800
- id: `lineset_${string}`;
4801
- path: [number, number, number][];
4802
- suctionDiameter: number;
4803
- liquidDiameter: number;
4804
- insulated: boolean;
4805
- type: "lineset";
4720
+ id: `hvac-equipment_${string}`;
4721
+ position: [number, number, number];
4722
+ rotation: number;
4723
+ supportSlabId?: string | undefined;
4724
+ equipmentType: "air-handler" | "condenser" | "furnace";
4725
+ width: number;
4726
+ depth: number;
4727
+ height: number;
4728
+ supplyShape: "oval" | "rect" | "round";
4729
+ returnShape: "oval" | "rect" | "round";
4730
+ supplyDiameter: number;
4731
+ returnDiameter: number;
4732
+ supplyWidth: number;
4733
+ supplyHeight: number;
4734
+ returnWidth: number;
4735
+ returnHeight: number;
4736
+ type: "hvac-equipment";
4806
4737
  } | {
4807
4738
  object: "node";
4808
4739
  name?: string | undefined;
@@ -4901,13 +4832,17 @@ export declare function markSlabChangeDependents(previous: SlabNode, next: SlabN
4901
4832
  fromIds: string[];
4902
4833
  } | undefined;
4903
4834
  } | undefined;
4904
- id: `pipe-trap_${string}`;
4835
+ id: `pipe-fitting_${string}`;
4905
4836
  position: [number, number, number];
4906
- rotation: number;
4837
+ rotation: [number, number, number];
4838
+ fittingType: "cleanout" | "coupling" | "cross" | "elbow" | "end-cap" | "reducer" | "sanitary-tee" | "wye";
4839
+ angle: number;
4907
4840
  diameter: number;
4841
+ diameter2: number;
4842
+ cleanoutStyle: "end" | "inline";
4908
4843
  pipeMaterial: "abs" | "cast-iron" | "pvc";
4909
- armLengthM: number;
4910
- type: "pipe-trap";
4844
+ system: "vent" | "waste";
4845
+ type: "pipe-fitting";
4911
4846
  } | {
4912
4847
  object: "node";
4913
4848
  name?: string | undefined;
@@ -5146,6 +5081,71 @@ export declare function markSlabChangeDependents(previous: SlabNode, next: SlabN
5146
5081
  showPosts: boolean;
5147
5082
  id: `fence-opening_${string}`;
5148
5083
  type: "fence-opening";
5084
+ } | {
5085
+ object: "node";
5086
+ name?: string | undefined;
5087
+ parentId: string | null;
5088
+ visible: boolean;
5089
+ camera?: {
5090
+ position: [number, number, number];
5091
+ target: [number, number, number];
5092
+ mode: "orthographic" | "perspective";
5093
+ fov?: number | undefined;
5094
+ zoom?: number | undefined;
5095
+ } | undefined;
5096
+ metadata: Record<string, unknown>;
5097
+ provenance?: {
5098
+ refs: {
5099
+ ns?: string | undefined;
5100
+ id: string;
5101
+ role?: "absorbed" | "alias" | "derived" | "piece" | "primary" | undefined;
5102
+ }[];
5103
+ lineage?: {
5104
+ op: "attach" | "convert" | "duplicate" | "import" | "make-independent" | "merge" | "promote" | "split";
5105
+ fromIds: string[];
5106
+ } | undefined;
5107
+ } | undefined;
5108
+ id: `bvent_${string}`;
5109
+ material?: {
5110
+ id?: string | undefined;
5111
+ preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
5112
+ properties?: {
5113
+ color: string;
5114
+ roughness: number;
5115
+ metalness: number;
5116
+ opacity: number;
5117
+ transparent: boolean;
5118
+ side: "back" | "double" | "front";
5119
+ } | undefined;
5120
+ texture?: {
5121
+ url: string;
5122
+ repeat?: [number, number] | undefined;
5123
+ scale?: number | undefined;
5124
+ offset?: [number, number] | undefined;
5125
+ normalMap?: string | undefined;
5126
+ normalScale?: number | undefined;
5127
+ bumpMap?: string | undefined;
5128
+ bumpScale?: number | undefined;
5129
+ } | undefined;
5130
+ } | undefined;
5131
+ slots?: Record<string, string> | undefined;
5132
+ materialPreset: string;
5133
+ roofSegmentId?: string | undefined;
5134
+ position: [number, number, number];
5135
+ rotation: number;
5136
+ width: number;
5137
+ depth: number;
5138
+ height: number;
5139
+ hoodOverhang: number;
5140
+ topTaper: number;
5141
+ capHeight: number;
5142
+ capGap: number;
5143
+ domeCurvature: number;
5144
+ baseInset: number;
5145
+ baseHeight: number;
5146
+ cornerBevel: number;
5147
+ style: "box" | "cap" | "dome";
5148
+ type: "box-vent";
5149
5149
  } | {
5150
5150
  object: "node";
5151
5151
  name?: string | undefined;