@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
@@ -26,369 +26,29 @@ export declare function wallAttachments(nodes: StructureNodes, wall: WallNode):
26
26
  fromIds: string[];
27
27
  } | undefined;
28
28
  } | undefined;
29
- id: `elevator_${string}`;
30
- material?: {
31
- id?: string | undefined;
32
- preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
33
- properties?: {
34
- color: string;
35
- roughness: number;
36
- metalness: number;
37
- opacity: number;
38
- transparent: boolean;
39
- side: "back" | "double" | "front";
40
- } | undefined;
41
- texture?: {
42
- url: string;
43
- repeat?: [number, number] | undefined;
44
- scale?: number | undefined;
45
- offset?: [number, number] | undefined;
46
- normalMap?: string | undefined;
47
- normalScale?: number | undefined;
48
- bumpMap?: string | undefined;
49
- bumpScale?: number | undefined;
50
- } | undefined;
51
- } | undefined;
52
- materialPreset?: string | undefined;
53
- slots?: Record<string, string> | undefined;
29
+ id: `block_${string}`;
30
+ children: string[];
54
31
  position: [number, number, number];
55
32
  rotation: number;
56
- width: number;
57
- depth: number;
58
- shaftWidth?: number | undefined;
59
- shaftDepth?: number | undefined;
60
- shaftWallThickness: number;
61
- shaftStyle: "glass" | "solid";
62
- cabHeight: number;
63
- doorWidth: number;
64
- doorHeight: number;
65
- doorStyle: "center-opening" | "single-left" | "single-right";
66
- doorPanelStyle: "glass-frame" | "segmented-panel" | "solid-panel";
67
- fromLevelId: string | null;
68
- toLevelId: string | null;
69
- servedLevelIds?: string[] | undefined;
70
- disabledLevelIds: string[];
71
- serviceOnlyLevelIds: string[];
72
- defaultLevelId: string | null;
73
- speed: number;
74
- doorDurationMs: number;
75
- dwellMs: number;
76
- type: "elevator";
77
- } | {
78
- object: "node";
79
- name?: string | undefined;
80
- parentId: string | null;
81
- visible: boolean;
82
- camera?: {
83
- position: [number, number, number];
84
- target: [number, number, number];
85
- mode: "orthographic" | "perspective";
86
- fov?: number | undefined;
87
- zoom?: number | undefined;
88
- } | undefined;
89
- metadata: Record<string, unknown>;
90
- provenance?: {
91
- refs: {
92
- ns?: string | undefined;
93
- id: string;
94
- role?: "absorbed" | "alias" | "derived" | "piece" | "primary" | undefined;
95
- }[];
96
- lineage?: {
97
- op: "attach" | "convert" | "duplicate" | "import" | "make-independent" | "merge" | "promote" | "split";
98
- fromIds: string[];
99
- } | undefined;
100
- } | undefined;
101
- type: "item";
102
- id: `item_${string}`;
103
- position: [number, number, number];
104
- rotation: [number, number, number];
105
- scale: [number, number, number];
106
- side?: "back" | "front" | undefined;
107
- children: string[];
108
- wallId?: string | undefined;
109
- wallT?: number | undefined;
110
- roofSegmentId?: string | undefined;
111
- roofFace?: "back" | "front" | "left" | "right" | undefined;
112
- blockFaceId?: string | undefined;
113
33
  supportSlabId?: string | undefined;
114
- collectionIds?: `collection_${string}`[] | undefined;
115
- slots?: Record<string, string> | undefined;
116
- source?: {
117
- kind: "script";
118
- meta?: {
119
- description?: string | undefined;
120
- category?: string | undefined;
121
- tags?: string[] | undefined;
122
- parent?: string | undefined;
123
- } | undefined;
124
- language: "bpy" | "three";
125
- script: string;
126
- params: Record<string, string | number | boolean>;
127
- artifact: string;
128
- manifest: {
129
- bounds: {
130
- min: [number, number, number];
131
- max: [number, number, number];
132
- };
133
- params: {
134
- id: string;
135
- label?: string | undefined;
136
- kind: "boolean" | "number" | "string";
137
- default: string | number | boolean;
138
- min?: number | undefined;
139
- max?: number | undefined;
140
- step?: number | undefined;
141
- unit?: string | undefined;
142
- options?: string[] | undefined;
143
- }[];
144
- parts: {
145
- id: string;
146
- label?: string | undefined;
147
- type?: string | undefined;
148
- bounds?: {
149
- min: [number, number, number];
150
- max: [number, number, number];
151
- } | undefined;
152
- }[];
153
- surfaces: {
154
- part?: string | undefined;
155
- y: number;
156
- polygon: [number, number][];
157
- }[];
158
- slots: {
159
- id: string;
160
- label?: string | undefined;
161
- color?: string | undefined;
162
- roughness?: number | undefined;
163
- metalness?: number | undefined;
164
- transparent?: boolean | undefined;
165
- emissive?: boolean | undefined;
166
- }[];
167
- anchors: {
168
- id: string;
169
- position: [number, number, number];
170
- normal?: [number, number, number] | undefined;
171
- }[];
172
- lights: {
173
- id: string;
174
- position: [number, number, number];
175
- color: string;
176
- intensity: number;
177
- distance?: number | undefined;
178
- spot?: {
179
- direction: [number, number, number];
180
- angle: number;
181
- softness: number;
182
- } | undefined;
183
- shadows?: boolean | undefined;
184
- glow?: {
185
- size: number;
186
- strength: number;
187
- } | undefined;
188
- }[];
189
- undersides: {
190
- part?: string | undefined;
191
- polygon: [number, number][];
192
- plane: [number, number, number, number];
193
- }[];
194
- animations: {
195
- name: string;
196
- duration: number;
197
- }[];
198
- cutters?: {
199
- host: "ceiling" | "mounted" | "slab" | "wall";
200
- polygon: number[][];
201
- minY: number;
202
- maxY: number;
203
- }[] | undefined;
204
- cutout: boolean;
205
- collider: boolean;
206
- shape?: {
207
- tolerance: number;
208
- bands: {
209
- y0: number;
210
- y1: number;
211
- polygons: {
212
- outer: [number, number][];
213
- holes?: [number, number][][] | undefined;
214
- }[];
215
- }[];
216
- } | undefined;
217
- triangles: number;
218
- coverage?: number | undefined;
219
- uncovered?: {
220
- min: [number, number];
221
- max: [number, number];
222
- }[] | undefined;
223
- };
224
- images?: {
225
- artifact: string;
226
- thumbnail: string;
227
- floorPlan: string;
228
- } | undefined;
229
- } | undefined;
230
- asset: {
231
- id: string;
232
- category: string;
233
- name: string;
234
- thumbnail: string;
235
- floorPlanUrl?: string | undefined;
236
- source: "community" | "library" | "mine";
237
- isDraft?: boolean | undefined;
238
- src: string;
239
- dimensions: [number, number, number];
240
- attachTo?: "ceiling" | "wall" | "wall-side" | undefined;
241
- recessed?: boolean | undefined;
242
- tags?: string[] | undefined;
243
- functionTags?: string[] | undefined;
244
- offset: [number, number, number];
245
- rotation: [number, number, number];
246
- scale: [number, number, number];
247
- surface?: {
248
- height: number;
249
- } | undefined;
250
- interactive?: {
251
- controls: ({
252
- kind: "toggle";
253
- label?: string | undefined;
254
- default?: boolean | undefined;
255
- } | {
256
- kind: "slider";
257
- label: string;
258
- min: number;
259
- max: number;
260
- step: number;
261
- unit?: string | undefined;
262
- displayMode: "dial" | "slider" | "stepper";
263
- default?: number | undefined;
264
- } | {
265
- kind: "temperature";
266
- label: string;
267
- min: number;
268
- max: number;
269
- unit: "C" | "F";
270
- default?: number | undefined;
271
- })[];
272
- effects: ({
273
- kind: "animation";
274
- mode?: "ambient" | "open-close" | undefined;
275
- control?: number | undefined;
276
- clips: {
277
- on?: string | undefined;
278
- off?: string | undefined;
279
- loop?: string | undefined;
280
- };
281
- } | {
282
- kind: "light";
283
- color: string;
284
- intensityRange: [number, number];
285
- distance?: number | undefined;
286
- offset: [number, number, number];
287
- spot?: {
288
- direction: [number, number, number];
289
- angle: number;
290
- softness: number;
291
- } | undefined;
292
- shadows?: boolean | undefined;
293
- glow?: {
294
- size: number;
295
- strength: number;
296
- } | undefined;
297
- })[];
298
- } | undefined;
299
- };
300
- } | {
301
- object: "node";
302
- name?: string | undefined;
303
- parentId: string | null;
304
- visible: boolean;
305
- camera?: {
306
- position: [number, number, number];
307
- target: [number, number, number];
308
- mode: "orthographic" | "perspective";
309
- fov?: number | undefined;
310
- zoom?: number | undefined;
311
- } | undefined;
312
- metadata: Record<string, unknown>;
313
- provenance?: {
314
- refs: {
315
- ns?: string | undefined;
316
- id: string;
317
- role?: "absorbed" | "alias" | "derived" | "piece" | "primary" | undefined;
318
- }[];
319
- lineage?: {
320
- op: "attach" | "convert" | "duplicate" | "import" | "make-independent" | "merge" | "promote" | "split";
321
- fromIds: string[];
322
- } | undefined;
323
- } | undefined;
324
- id: `ceiling_${string}`;
325
- children: (`item_${string}` | `procedural-item_${string}`)[];
326
- material?: {
327
- id?: string | undefined;
328
- preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
329
- properties?: {
330
- color: string;
331
- roughness: number;
332
- metalness: number;
333
- opacity: number;
334
- transparent: boolean;
335
- side: "back" | "double" | "front";
336
- } | undefined;
337
- texture?: {
338
- url: string;
339
- repeat?: [number, number] | undefined;
340
- scale?: number | undefined;
341
- offset?: [number, number] | undefined;
342
- normalMap?: string | undefined;
343
- normalScale?: number | undefined;
344
- bumpMap?: string | undefined;
345
- bumpScale?: number | undefined;
346
- } | undefined;
347
- } | undefined;
348
- materialPreset?: string | undefined;
349
- slots?: Record<string, string> | undefined;
350
- polygon: [number, number][];
351
- holes: [number, number][][];
352
- holeMetadata: {
353
- source: "elevator" | "floor-opening" | "manual" | "room" | "stair";
354
- openingId?: string | undefined;
355
- stairId?: string | undefined;
356
- elevatorId?: string | undefined;
357
- }[];
358
- openingIds?: string[] | undefined;
359
- height?: number | undefined;
360
- buildUp?: {
361
- presetId?: string | undefined;
362
- finish?: {
363
- kind: "drywall" | "plaster" | "wood-plank";
364
- thickness: number;
365
- name?: string | undefined;
366
- } | undefined;
367
- framing?: {
368
- system: "joists" | "truss-chords";
369
- size: "2x10" | "2x12" | "2x4" | "2x6" | "2x8";
370
- spacing: number;
371
- } | undefined;
372
- decking?: {
373
- kind: "osb" | "plywood";
374
- thickness: number;
375
- name?: string | undefined;
376
- } | undefined;
377
- insulation?: {
378
- kind: "batt" | "blown" | "rigid";
379
- thickness: number;
380
- name?: string | undefined;
381
- } | undefined;
382
- } | undefined;
383
- regions?: {
384
- id: string;
385
- polygon: [number, number][];
386
- finish: string | Record<string, unknown>;
387
- }[] | undefined;
388
- boundary?: "auto" | undefined;
389
- zoneId?: string | undefined;
390
- autoFromWalls: boolean;
391
- type: "ceiling";
34
+ topology: {
35
+ vertices: {
36
+ id: string;
37
+ position: [number, number, number];
38
+ }[];
39
+ edges: {
40
+ id: string;
41
+ vertexIds: [string, string];
42
+ }[];
43
+ faces: {
44
+ id: string;
45
+ vertexIds: string[];
46
+ materialSlot: string;
47
+ }[];
48
+ };
49
+ slots: Record<string, string>;
50
+ slotNames: Record<string, string>;
51
+ type: "block";
392
52
  } | {
393
53
  object: "node";
394
54
  name?: string | undefined;
@@ -449,6 +109,112 @@ export declare function wallAttachments(nodes: StructureNodes, wall: WallNode):
449
109
  }[];
450
110
  controllingDimensionId: `construction-dimension_${string}` | null;
451
111
  type: "construction-dimension";
112
+ } | {
113
+ object: "node";
114
+ name?: string | undefined;
115
+ parentId: string | null;
116
+ visible: boolean;
117
+ camera?: {
118
+ position: [number, number, number];
119
+ target: [number, number, number];
120
+ mode: "orthographic" | "perspective";
121
+ fov?: number | undefined;
122
+ zoom?: number | undefined;
123
+ } | undefined;
124
+ metadata: Record<string, unknown>;
125
+ provenance?: {
126
+ refs: {
127
+ ns?: string | undefined;
128
+ id: string;
129
+ role?: "absorbed" | "alias" | "derived" | "piece" | "primary" | undefined;
130
+ }[];
131
+ lineage?: {
132
+ op: "attach" | "convert" | "duplicate" | "import" | "make-independent" | "merge" | "promote" | "split";
133
+ fromIds: string[];
134
+ } | undefined;
135
+ } | undefined;
136
+ id: `duct-terminal_${string}`;
137
+ position: [number, number, number];
138
+ rotation: number;
139
+ supportSlabId?: string | undefined;
140
+ terminalType: "diffuser" | "return-grille" | "supply-register";
141
+ mount: "ceiling" | "floor" | "wall";
142
+ width: number;
143
+ depth: number;
144
+ collarShape: "oval" | "rect" | "round";
145
+ collarDiameter: number;
146
+ collarWidth: number;
147
+ collarHeight: number;
148
+ type: "duct-terminal";
149
+ } | {
150
+ object: "node";
151
+ name?: string | undefined;
152
+ parentId: string | null;
153
+ visible: boolean;
154
+ camera?: {
155
+ position: [number, number, number];
156
+ target: [number, number, number];
157
+ mode: "orthographic" | "perspective";
158
+ fov?: number | undefined;
159
+ zoom?: number | undefined;
160
+ } | undefined;
161
+ metadata: Record<string, unknown>;
162
+ provenance?: {
163
+ refs: {
164
+ ns?: string | undefined;
165
+ id: string;
166
+ role?: "absorbed" | "alias" | "derived" | "piece" | "primary" | undefined;
167
+ }[];
168
+ lineage?: {
169
+ op: "attach" | "convert" | "duplicate" | "import" | "make-independent" | "merge" | "promote" | "split";
170
+ fromIds: string[];
171
+ } | undefined;
172
+ } | undefined;
173
+ id: `guide_${string}`;
174
+ url: string;
175
+ position: [number, number, number];
176
+ rotation: [number, number, number];
177
+ scale: number;
178
+ opacity: number;
179
+ scaleReference: {
180
+ start: [number, number];
181
+ end: [number, number];
182
+ realLengthMeters: number;
183
+ measuredLengthUnits: number;
184
+ metersPerUnit: number;
185
+ displayLength?: number | undefined;
186
+ displayUnit?: "centimeters" | "feet" | "inches" | "meters" | undefined;
187
+ label: string;
188
+ } | null;
189
+ type: "guide";
190
+ } | {
191
+ object: "node";
192
+ name?: string | undefined;
193
+ parentId: string | null;
194
+ visible: boolean;
195
+ camera?: {
196
+ position: [number, number, number];
197
+ target: [number, number, number];
198
+ mode: "orthographic" | "perspective";
199
+ fov?: number | undefined;
200
+ zoom?: number | undefined;
201
+ } | undefined;
202
+ metadata: Record<string, unknown>;
203
+ provenance?: {
204
+ refs: {
205
+ ns?: string | undefined;
206
+ id: string;
207
+ role?: "absorbed" | "alias" | "derived" | "piece" | "primary" | undefined;
208
+ }[];
209
+ lineage?: {
210
+ op: "attach" | "convert" | "duplicate" | "import" | "make-independent" | "merge" | "promote" | "split";
211
+ fromIds: string[];
212
+ } | undefined;
213
+ } | undefined;
214
+ id: `liquid-line_${string}`;
215
+ path: [number, number, number][];
216
+ diameter: number;
217
+ type: "liquid-line";
452
218
  } | {
453
219
  object: "node";
454
220
  name?: string | undefined;
@@ -643,28 +409,251 @@ export declare function wallAttachments(nodes: StructureNodes, wall: WallNode):
643
409
  lift?: number | undefined;
644
410
  src?: string | undefined;
645
411
  }[];
646
- backing?: {
647
- id: string;
648
- role: "air" | "covering" | "deck" | "fill" | "finish" | "furring" | "glazing" | "insulation" | "lining" | "membrane" | "sheathing" | "shell" | "structure" | "substrate" | "underlay";
649
- thickness: number;
650
- core?: true | undefined;
651
- spacing?: number | undefined;
652
- material?: string | undefined;
653
- slot?: string | undefined;
654
- returns?: boolean | undefined;
655
- display?: "construction" | "finished" | undefined;
656
- inset?: number | undefined;
657
- bottom?: number | undefined;
658
- lift?: number | undefined;
659
- src?: string | undefined;
412
+ backing?: {
413
+ id: string;
414
+ role: "air" | "covering" | "deck" | "fill" | "finish" | "furring" | "glazing" | "insulation" | "lining" | "membrane" | "sheathing" | "shell" | "structure" | "substrate" | "underlay";
415
+ thickness: number;
416
+ core?: true | undefined;
417
+ spacing?: number | undefined;
418
+ material?: string | undefined;
419
+ slot?: string | undefined;
420
+ returns?: boolean | undefined;
421
+ display?: "construction" | "finished" | undefined;
422
+ inset?: number | undefined;
423
+ bottom?: number | undefined;
424
+ lift?: number | undefined;
425
+ src?: string | undefined;
426
+ }[] | undefined;
427
+ face?: "exterior" | "front" | undefined;
428
+ presetId?: string | undefined;
429
+ cavityInsulation?: string | undefined;
430
+ };
431
+ }[] | undefined;
432
+ children: string[];
433
+ type: "site";
434
+ } | {
435
+ object: "node";
436
+ name?: string | undefined;
437
+ parentId: string | null;
438
+ visible: boolean;
439
+ camera?: {
440
+ position: [number, number, number];
441
+ target: [number, number, number];
442
+ mode: "orthographic" | "perspective";
443
+ fov?: number | undefined;
444
+ zoom?: number | undefined;
445
+ } | undefined;
446
+ metadata: Record<string, unknown>;
447
+ provenance?: {
448
+ refs: {
449
+ ns?: string | undefined;
450
+ id: string;
451
+ role?: "absorbed" | "alias" | "derived" | "piece" | "primary" | undefined;
452
+ }[];
453
+ lineage?: {
454
+ op: "attach" | "convert" | "duplicate" | "import" | "make-independent" | "merge" | "promote" | "split";
455
+ fromIds: string[];
456
+ } | undefined;
457
+ } | undefined;
458
+ type: "item";
459
+ id: `item_${string}`;
460
+ position: [number, number, number];
461
+ rotation: [number, number, number];
462
+ scale: [number, number, number];
463
+ side?: "back" | "front" | undefined;
464
+ children: string[];
465
+ wallId?: string | undefined;
466
+ wallT?: number | undefined;
467
+ roofSegmentId?: string | undefined;
468
+ roofFace?: "back" | "front" | "left" | "right" | undefined;
469
+ blockFaceId?: string | undefined;
470
+ supportSlabId?: string | undefined;
471
+ collectionIds?: `collection_${string}`[] | undefined;
472
+ slots?: Record<string, string> | undefined;
473
+ source?: {
474
+ kind: "script";
475
+ meta?: {
476
+ description?: string | undefined;
477
+ category?: string | undefined;
478
+ tags?: string[] | undefined;
479
+ parent?: string | undefined;
480
+ } | undefined;
481
+ language: "bpy" | "three";
482
+ script: string;
483
+ params: Record<string, string | number | boolean>;
484
+ artifact: string;
485
+ manifest: {
486
+ bounds: {
487
+ min: [number, number, number];
488
+ max: [number, number, number];
489
+ };
490
+ params: {
491
+ id: string;
492
+ label?: string | undefined;
493
+ kind: "boolean" | "number" | "string";
494
+ default: string | number | boolean;
495
+ min?: number | undefined;
496
+ max?: number | undefined;
497
+ step?: number | undefined;
498
+ unit?: string | undefined;
499
+ options?: string[] | undefined;
500
+ }[];
501
+ parts: {
502
+ id: string;
503
+ label?: string | undefined;
504
+ type?: string | undefined;
505
+ bounds?: {
506
+ min: [number, number, number];
507
+ max: [number, number, number];
508
+ } | undefined;
509
+ }[];
510
+ surfaces: {
511
+ part?: string | undefined;
512
+ y: number;
513
+ polygon: [number, number][];
514
+ }[];
515
+ slots: {
516
+ id: string;
517
+ label?: string | undefined;
518
+ color?: string | undefined;
519
+ roughness?: number | undefined;
520
+ metalness?: number | undefined;
521
+ transparent?: boolean | undefined;
522
+ emissive?: boolean | undefined;
523
+ }[];
524
+ anchors: {
525
+ id: string;
526
+ position: [number, number, number];
527
+ normal?: [number, number, number] | undefined;
528
+ }[];
529
+ lights: {
530
+ id: string;
531
+ position: [number, number, number];
532
+ color: string;
533
+ intensity: number;
534
+ distance?: number | undefined;
535
+ spot?: {
536
+ direction: [number, number, number];
537
+ angle: number;
538
+ softness: number;
539
+ } | undefined;
540
+ shadows?: boolean | undefined;
541
+ glow?: {
542
+ size: number;
543
+ strength: number;
544
+ } | undefined;
545
+ }[];
546
+ undersides: {
547
+ part?: string | undefined;
548
+ polygon: [number, number][];
549
+ plane: [number, number, number, number];
550
+ }[];
551
+ animations: {
552
+ name: string;
553
+ duration: number;
554
+ }[];
555
+ cutters?: {
556
+ host: "ceiling" | "mounted" | "slab" | "wall";
557
+ polygon: number[][];
558
+ minY: number;
559
+ maxY: number;
560
+ }[] | undefined;
561
+ cutout: boolean;
562
+ collider: boolean;
563
+ shape?: {
564
+ tolerance: number;
565
+ bands: {
566
+ y0: number;
567
+ y1: number;
568
+ polygons: {
569
+ outer: [number, number][];
570
+ holes?: [number, number][][] | undefined;
571
+ }[];
572
+ }[];
573
+ } | undefined;
574
+ triangles: number;
575
+ coverage?: number | undefined;
576
+ uncovered?: {
577
+ min: [number, number];
578
+ max: [number, number];
660
579
  }[] | undefined;
661
- face?: "exterior" | "front" | undefined;
662
- presetId?: string | undefined;
663
- cavityInsulation?: string | undefined;
664
580
  };
665
- }[] | undefined;
666
- children: string[];
667
- type: "site";
581
+ images?: {
582
+ artifact: string;
583
+ thumbnail: string;
584
+ floorPlan: string;
585
+ } | undefined;
586
+ } | undefined;
587
+ asset: {
588
+ id: string;
589
+ category: string;
590
+ name: string;
591
+ thumbnail: string;
592
+ floorPlanUrl?: string | undefined;
593
+ source: "community" | "library" | "mine";
594
+ isDraft?: boolean | undefined;
595
+ src: string;
596
+ dimensions: [number, number, number];
597
+ attachTo?: "ceiling" | "wall" | "wall-side" | undefined;
598
+ recessed?: boolean | undefined;
599
+ tags?: string[] | undefined;
600
+ functionTags?: string[] | undefined;
601
+ offset: [number, number, number];
602
+ rotation: [number, number, number];
603
+ scale: [number, number, number];
604
+ surface?: {
605
+ height: number;
606
+ } | undefined;
607
+ interactive?: {
608
+ controls: ({
609
+ kind: "toggle";
610
+ label?: string | undefined;
611
+ default?: boolean | undefined;
612
+ } | {
613
+ kind: "slider";
614
+ label: string;
615
+ min: number;
616
+ max: number;
617
+ step: number;
618
+ unit?: string | undefined;
619
+ displayMode: "dial" | "slider" | "stepper";
620
+ default?: number | undefined;
621
+ } | {
622
+ kind: "temperature";
623
+ label: string;
624
+ min: number;
625
+ max: number;
626
+ unit: "C" | "F";
627
+ default?: number | undefined;
628
+ })[];
629
+ effects: ({
630
+ kind: "animation";
631
+ mode?: "ambient" | "open-close" | undefined;
632
+ control?: number | undefined;
633
+ clips: {
634
+ on?: string | undefined;
635
+ off?: string | undefined;
636
+ loop?: string | undefined;
637
+ };
638
+ } | {
639
+ kind: "light";
640
+ color: string;
641
+ intensityRange: [number, number];
642
+ distance?: number | undefined;
643
+ offset: [number, number, number];
644
+ spot?: {
645
+ direction: [number, number, number];
646
+ angle: number;
647
+ softness: number;
648
+ } | undefined;
649
+ shadows?: boolean | undefined;
650
+ glow?: {
651
+ size: number;
652
+ strength: number;
653
+ } | undefined;
654
+ })[];
655
+ } | undefined;
656
+ };
668
657
  } | {
669
658
  object: "node";
670
659
  name?: string | undefined;
@@ -1895,7 +1884,7 @@ export declare function wallAttachments(nodes: StructureNodes, wall: WallNode):
1895
1884
  cavityInsulation?: string | undefined;
1896
1885
  } | undefined;
1897
1886
  slots?: Record<string, string> | undefined;
1898
- children: `rseg_${string}`[];
1887
+ children: string[];
1899
1888
  type: "roof";
1900
1889
  } | {
1901
1890
  object: "node";
@@ -2923,53 +2912,6 @@ export declare function wallAttachments(nodes: StructureNodes, wall: WallNode):
2923
2912
  topElevation?: number | undefined;
2924
2913
  supportSlabId?: string | undefined;
2925
2914
  type: "beam";
2926
- } | {
2927
- object: "node";
2928
- name?: string | undefined;
2929
- parentId: string | null;
2930
- visible: boolean;
2931
- camera?: {
2932
- position: [number, number, number];
2933
- target: [number, number, number];
2934
- mode: "orthographic" | "perspective";
2935
- fov?: number | undefined;
2936
- zoom?: number | undefined;
2937
- } | undefined;
2938
- metadata: Record<string, unknown>;
2939
- provenance?: {
2940
- refs: {
2941
- ns?: string | undefined;
2942
- id: string;
2943
- role?: "absorbed" | "alias" | "derived" | "piece" | "primary" | undefined;
2944
- }[];
2945
- lineage?: {
2946
- op: "attach" | "convert" | "duplicate" | "import" | "make-independent" | "merge" | "promote" | "split";
2947
- fromIds: string[];
2948
- } | undefined;
2949
- } | undefined;
2950
- id: `block_${string}`;
2951
- children: string[];
2952
- position: [number, number, number];
2953
- rotation: number;
2954
- supportSlabId?: string | undefined;
2955
- topology: {
2956
- vertices: {
2957
- id: string;
2958
- position: [number, number, number];
2959
- }[];
2960
- edges: {
2961
- id: string;
2962
- vertexIds: [string, string];
2963
- }[];
2964
- faces: {
2965
- id: string;
2966
- vertexIds: string[];
2967
- materialSlot: string;
2968
- }[];
2969
- };
2970
- slots: Record<string, string>;
2971
- slotNames: Record<string, string>;
2972
- type: "block";
2973
2915
  } | {
2974
2916
  object: "node";
2975
2917
  name?: string | undefined;
@@ -3413,40 +3355,132 @@ export declare function wallAttachments(nodes: StructureNodes, wall: WallNode):
3413
3355
  gap?: number | undefined;
3414
3356
  direction?: "diagonal" | "parallel" | "perpendicular" | undefined;
3415
3357
  } | undefined;
3416
- ceiling?: {
3417
- regions?: {
3418
- id: string;
3419
- polygon: [number, number][];
3420
- finish: string | Record<string, unknown>;
3421
- }[] | undefined;
3358
+ ceiling?: {
3359
+ regions?: {
3360
+ id: string;
3361
+ polygon: [number, number][];
3362
+ finish: string | Record<string, unknown>;
3363
+ }[] | undefined;
3364
+ } | undefined;
3365
+ floorStepFinish?: string | undefined;
3366
+ floorStepOverrides?: {
3367
+ key: string;
3368
+ step?: number | undefined;
3369
+ finish: string;
3370
+ }[] | undefined;
3371
+ floorEdgeFinish?: string | undefined;
3372
+ wallMaterial?: string | undefined;
3373
+ wallOverrides?: {
3374
+ wallId: string;
3375
+ face: "a" | "b";
3376
+ finish: string;
3377
+ }[] | undefined;
3378
+ hasFloor?: false | undefined;
3379
+ hasCeiling?: false | undefined;
3380
+ spaceRole: "generic" | "room";
3381
+ roomNumber: string;
3382
+ enclosureStatus: "auto" | "enclosed" | "open";
3383
+ floorFinish: string;
3384
+ wallFinish: string;
3385
+ ceilingFinish: string;
3386
+ ceilingHeight: number;
3387
+ occupancy: string;
3388
+ clearDimensionPolicy: "finish-faces" | "inside-faces" | "none";
3389
+ color: string;
3390
+ metadata: Record<string, unknown>;
3391
+ type: "zone";
3392
+ } | {
3393
+ object: "node";
3394
+ name?: string | undefined;
3395
+ parentId: string | null;
3396
+ visible: boolean;
3397
+ camera?: {
3398
+ position: [number, number, number];
3399
+ target: [number, number, number];
3400
+ mode: "orthographic" | "perspective";
3401
+ fov?: number | undefined;
3402
+ zoom?: number | undefined;
3403
+ } | undefined;
3404
+ metadata: Record<string, unknown>;
3405
+ provenance?: {
3406
+ refs: {
3407
+ ns?: string | undefined;
3408
+ id: string;
3409
+ role?: "absorbed" | "alias" | "derived" | "piece" | "primary" | undefined;
3410
+ }[];
3411
+ lineage?: {
3412
+ op: "attach" | "convert" | "duplicate" | "import" | "make-independent" | "merge" | "promote" | "split";
3413
+ fromIds: string[];
3414
+ } | undefined;
3415
+ } | undefined;
3416
+ id: `ceiling_${string}`;
3417
+ children: (`item_${string}` | `procedural-item_${string}`)[];
3418
+ material?: {
3419
+ id?: string | undefined;
3420
+ preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
3421
+ properties?: {
3422
+ color: string;
3423
+ roughness: number;
3424
+ metalness: number;
3425
+ opacity: number;
3426
+ transparent: boolean;
3427
+ side: "back" | "double" | "front";
3428
+ } | undefined;
3429
+ texture?: {
3430
+ url: string;
3431
+ repeat?: [number, number] | undefined;
3432
+ scale?: number | undefined;
3433
+ offset?: [number, number] | undefined;
3434
+ normalMap?: string | undefined;
3435
+ normalScale?: number | undefined;
3436
+ bumpMap?: string | undefined;
3437
+ bumpScale?: number | undefined;
3438
+ } | undefined;
3439
+ } | undefined;
3440
+ materialPreset?: string | undefined;
3441
+ slots?: Record<string, string> | undefined;
3442
+ polygon: [number, number][];
3443
+ holes: [number, number][][];
3444
+ holeMetadata: {
3445
+ source: "elevator" | "floor-opening" | "manual" | "room" | "stair";
3446
+ openingId?: string | undefined;
3447
+ stairId?: string | undefined;
3448
+ elevatorId?: string | undefined;
3449
+ }[];
3450
+ openingIds?: string[] | undefined;
3451
+ height?: number | undefined;
3452
+ buildUp?: {
3453
+ presetId?: string | undefined;
3454
+ finish?: {
3455
+ kind: "drywall" | "plaster" | "wood-plank";
3456
+ thickness: number;
3457
+ name?: string | undefined;
3458
+ } | undefined;
3459
+ framing?: {
3460
+ system: "joists" | "truss-chords";
3461
+ size: "2x10" | "2x12" | "2x4" | "2x6" | "2x8";
3462
+ spacing: number;
3463
+ } | undefined;
3464
+ decking?: {
3465
+ kind: "osb" | "plywood";
3466
+ thickness: number;
3467
+ name?: string | undefined;
3468
+ } | undefined;
3469
+ insulation?: {
3470
+ kind: "batt" | "blown" | "rigid";
3471
+ thickness: number;
3472
+ name?: string | undefined;
3473
+ } | undefined;
3422
3474
  } | undefined;
3423
- floorStepFinish?: string | undefined;
3424
- floorStepOverrides?: {
3425
- key: string;
3426
- step?: number | undefined;
3427
- finish: string;
3428
- }[] | undefined;
3429
- floorEdgeFinish?: string | undefined;
3430
- wallMaterial?: string | undefined;
3431
- wallOverrides?: {
3432
- wallId: string;
3433
- face: "a" | "b";
3434
- finish: string;
3475
+ regions?: {
3476
+ id: string;
3477
+ polygon: [number, number][];
3478
+ finish: string | Record<string, unknown>;
3435
3479
  }[] | undefined;
3436
- hasFloor?: false | undefined;
3437
- hasCeiling?: false | undefined;
3438
- spaceRole: "generic" | "room";
3439
- roomNumber: string;
3440
- enclosureStatus: "auto" | "enclosed" | "open";
3441
- floorFinish: string;
3442
- wallFinish: string;
3443
- ceilingFinish: string;
3444
- ceilingHeight: number;
3445
- occupancy: string;
3446
- clearDimensionPolicy: "finish-faces" | "inside-faces" | "none";
3447
- color: string;
3448
- metadata: Record<string, unknown>;
3449
- type: "zone";
3480
+ boundary?: "auto" | undefined;
3481
+ zoneId?: string | undefined;
3482
+ autoFromWalls: boolean;
3483
+ type: "ceiling";
3450
3484
  } | {
3451
3485
  object: "node";
3452
3486
  name?: string | undefined;
@@ -3756,47 +3790,6 @@ export declare function wallAttachments(nodes: StructureNodes, wall: WallNode):
3756
3790
  scale: number;
3757
3791
  opacity: number;
3758
3792
  type: "scan";
3759
- } | {
3760
- object: "node";
3761
- name?: string | undefined;
3762
- parentId: string | null;
3763
- visible: boolean;
3764
- camera?: {
3765
- position: [number, number, number];
3766
- target: [number, number, number];
3767
- mode: "orthographic" | "perspective";
3768
- fov?: number | undefined;
3769
- zoom?: number | undefined;
3770
- } | undefined;
3771
- metadata: Record<string, unknown>;
3772
- provenance?: {
3773
- refs: {
3774
- ns?: string | undefined;
3775
- id: string;
3776
- role?: "absorbed" | "alias" | "derived" | "piece" | "primary" | undefined;
3777
- }[];
3778
- lineage?: {
3779
- op: "attach" | "convert" | "duplicate" | "import" | "make-independent" | "merge" | "promote" | "split";
3780
- fromIds: string[];
3781
- } | undefined;
3782
- } | undefined;
3783
- id: `guide_${string}`;
3784
- url: string;
3785
- position: [number, number, number];
3786
- rotation: [number, number, number];
3787
- scale: number;
3788
- opacity: number;
3789
- scaleReference: {
3790
- start: [number, number];
3791
- end: [number, number];
3792
- realLengthMeters: number;
3793
- measuredLengthUnits: number;
3794
- metersPerUnit: number;
3795
- displayLength?: number | undefined;
3796
- displayUnit?: "centimeters" | "feet" | "inches" | "meters" | undefined;
3797
- label: string;
3798
- } | null;
3799
- type: "guide";
3800
3793
  } | {
3801
3794
  object: "node";
3802
3795
  name?: string | undefined;
@@ -4099,43 +4092,6 @@ export declare function wallAttachments(nodes: StructureNodes, wall: WallNode):
4099
4092
  panelHeight: number;
4100
4093
  slots?: Record<string, string> | undefined;
4101
4094
  type: "duct-fitting";
4102
- } | {
4103
- object: "node";
4104
- name?: string | undefined;
4105
- parentId: string | null;
4106
- visible: boolean;
4107
- camera?: {
4108
- position: [number, number, number];
4109
- target: [number, number, number];
4110
- mode: "orthographic" | "perspective";
4111
- fov?: number | undefined;
4112
- zoom?: number | undefined;
4113
- } | undefined;
4114
- metadata: Record<string, unknown>;
4115
- provenance?: {
4116
- refs: {
4117
- ns?: string | undefined;
4118
- id: string;
4119
- role?: "absorbed" | "alias" | "derived" | "piece" | "primary" | undefined;
4120
- }[];
4121
- lineage?: {
4122
- op: "attach" | "convert" | "duplicate" | "import" | "make-independent" | "merge" | "promote" | "split";
4123
- fromIds: string[];
4124
- } | undefined;
4125
- } | undefined;
4126
- id: `duct-terminal_${string}`;
4127
- position: [number, number, number];
4128
- rotation: number;
4129
- supportSlabId?: string | undefined;
4130
- terminalType: "diffuser" | "return-grille" | "supply-register";
4131
- mount: "ceiling" | "floor" | "wall";
4132
- width: number;
4133
- depth: number;
4134
- collarShape: "oval" | "rect" | "round";
4135
- collarDiameter: number;
4136
- collarWidth: number;
4137
- collarHeight: number;
4138
- type: "duct-terminal";
4139
4095
  } | {
4140
4096
  object: "node";
4141
4097
  name?: string | undefined;
@@ -4207,34 +4163,6 @@ export declare function wallAttachments(nodes: StructureNodes, wall: WallNode):
4207
4163
  liquidDiameter: number;
4208
4164
  insulated: boolean;
4209
4165
  type: "lineset";
4210
- } | {
4211
- object: "node";
4212
- name?: string | undefined;
4213
- parentId: string | null;
4214
- visible: boolean;
4215
- camera?: {
4216
- position: [number, number, number];
4217
- target: [number, number, number];
4218
- mode: "orthographic" | "perspective";
4219
- fov?: number | undefined;
4220
- zoom?: number | undefined;
4221
- } | undefined;
4222
- metadata: Record<string, unknown>;
4223
- provenance?: {
4224
- refs: {
4225
- ns?: string | undefined;
4226
- id: string;
4227
- role?: "absorbed" | "alias" | "derived" | "piece" | "primary" | undefined;
4228
- }[];
4229
- lineage?: {
4230
- op: "attach" | "convert" | "duplicate" | "import" | "make-independent" | "merge" | "promote" | "split";
4231
- fromIds: string[];
4232
- } | undefined;
4233
- } | undefined;
4234
- id: `liquid-line_${string}`;
4235
- path: [number, number, number][];
4236
- diameter: number;
4237
- type: "liquid-line";
4238
4166
  } | {
4239
4167
  object: "node";
4240
4168
  name?: string | undefined;
@@ -4377,6 +4305,78 @@ export declare function wallAttachments(nodes: StructureNodes, wall: WallNode):
4377
4305
  baseElevation: number;
4378
4306
  height?: number | undefined;
4379
4307
  type: "level";
4308
+ } | {
4309
+ object: "node";
4310
+ name?: string | undefined;
4311
+ parentId: string | null;
4312
+ visible: boolean;
4313
+ camera?: {
4314
+ position: [number, number, number];
4315
+ target: [number, number, number];
4316
+ mode: "orthographic" | "perspective";
4317
+ fov?: number | undefined;
4318
+ zoom?: number | undefined;
4319
+ } | undefined;
4320
+ metadata: Record<string, unknown>;
4321
+ provenance?: {
4322
+ refs: {
4323
+ ns?: string | undefined;
4324
+ id: string;
4325
+ role?: "absorbed" | "alias" | "derived" | "piece" | "primary" | undefined;
4326
+ }[];
4327
+ lineage?: {
4328
+ op: "attach" | "convert" | "duplicate" | "import" | "make-independent" | "merge" | "promote" | "split";
4329
+ fromIds: string[];
4330
+ } | undefined;
4331
+ } | undefined;
4332
+ id: `elevator_${string}`;
4333
+ material?: {
4334
+ id?: string | undefined;
4335
+ preset?: "brick" | "concrete" | "custom" | "glass" | "marble" | "metal" | "plaster" | "tile" | "white" | "wood" | undefined;
4336
+ properties?: {
4337
+ color: string;
4338
+ roughness: number;
4339
+ metalness: number;
4340
+ opacity: number;
4341
+ transparent: boolean;
4342
+ side: "back" | "double" | "front";
4343
+ } | undefined;
4344
+ texture?: {
4345
+ url: string;
4346
+ repeat?: [number, number] | undefined;
4347
+ scale?: number | undefined;
4348
+ offset?: [number, number] | undefined;
4349
+ normalMap?: string | undefined;
4350
+ normalScale?: number | undefined;
4351
+ bumpMap?: string | undefined;
4352
+ bumpScale?: number | undefined;
4353
+ } | undefined;
4354
+ } | undefined;
4355
+ materialPreset?: string | undefined;
4356
+ slots?: Record<string, string> | undefined;
4357
+ position: [number, number, number];
4358
+ rotation: number;
4359
+ width: number;
4360
+ depth: number;
4361
+ shaftWidth?: number | undefined;
4362
+ shaftDepth?: number | undefined;
4363
+ shaftWallThickness: number;
4364
+ shaftStyle: "glass" | "solid";
4365
+ cabHeight: number;
4366
+ doorWidth: number;
4367
+ doorHeight: number;
4368
+ doorStyle: "center-opening" | "single-left" | "single-right";
4369
+ doorPanelStyle: "glass-frame" | "segmented-panel" | "solid-panel";
4370
+ fromLevelId: string | null;
4371
+ toLevelId: string | null;
4372
+ servedLevelIds?: string[] | undefined;
4373
+ disabledLevelIds: string[];
4374
+ serviceOnlyLevelIds: string[];
4375
+ defaultLevelId: string | null;
4376
+ speed: number;
4377
+ doorDurationMs: number;
4378
+ dwellMs: number;
4379
+ type: "elevator";
4380
4380
  } | {
4381
4381
  object: "node";
4382
4382
  parentId: string | null;