@snaptrude/plugin-core 0.9.16 → 0.9.18-edgesetbacks-20261021.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 (221) hide show
  1. package/AGENTS.md +231 -231
  2. package/CHANGELOG.md +408 -402
  3. package/CLAUDE.md +11 -11
  4. package/api-manifest.json +1510 -701
  5. package/dist/api/analysis/daylight.d.ts +5 -5
  6. package/dist/api/analysis/solar.d.ts +2 -2
  7. package/dist/api/core/camera/index.d.ts +29 -0
  8. package/dist/api/core/camera/index.d.ts.map +1 -1
  9. package/dist/api/core/geom/create/index.d.ts +7 -1
  10. package/dist/api/core/geom/create/index.d.ts.map +1 -1
  11. package/dist/api/core/geom/update/contour.d.ts +8 -2
  12. package/dist/api/core/geom/update/contour.d.ts.map +1 -1
  13. package/dist/api/core/storeys/index.d.ts +5 -2
  14. package/dist/api/core/storeys/index.d.ts.map +1 -1
  15. package/dist/api/core/zoom/index.d.ts +13 -0
  16. package/dist/api/core/zoom/index.d.ts.map +1 -1
  17. package/dist/api/design/bim.d.ts +299 -0
  18. package/dist/api/design/bim.d.ts.map +1 -0
  19. package/dist/api/design/boolean/index.d.ts +2 -0
  20. package/dist/api/design/boolean/index.d.ts.map +1 -1
  21. package/dist/api/design/catalog.d.ts +320 -0
  22. package/dist/api/design/catalog.d.ts.map +1 -0
  23. package/dist/api/design/create/bulk-items.d.ts +65 -25
  24. package/dist/api/design/create/bulk-items.d.ts.map +1 -1
  25. package/dist/api/design/create/index.d.ts +299 -100
  26. package/dist/api/design/create/index.d.ts.map +1 -1
  27. package/dist/api/design/create/opening-fields.d.ts +13 -12
  28. package/dist/api/design/create/opening-fields.d.ts.map +1 -1
  29. package/dist/api/design/delete/index.d.ts +1 -0
  30. package/dist/api/design/delete/index.d.ts.map +1 -1
  31. package/dist/api/design/doors/index.d.ts +18 -24
  32. package/dist/api/design/doors/index.d.ts.map +1 -1
  33. package/dist/api/design/family.d.ts +813 -35
  34. package/dist/api/design/family.d.ts.map +1 -1
  35. package/dist/api/design/index.d.ts +16 -0
  36. package/dist/api/design/index.d.ts.map +1 -1
  37. package/dist/api/design/networks.d.ts +1703 -0
  38. package/dist/api/design/networks.d.ts.map +1 -0
  39. package/dist/api/design/query/grids.d.ts +2 -2
  40. package/dist/api/design/query/index.d.ts +42 -32
  41. package/dist/api/design/query/index.d.ts.map +1 -1
  42. package/dist/api/design/selection/index.d.ts +10 -10
  43. package/dist/api/design/types/index.d.ts +40 -24
  44. package/dist/api/design/types/index.d.ts.map +1 -1
  45. package/dist/api/design/update/index.d.ts +111 -6
  46. package/dist/api/design/update/index.d.ts.map +1 -1
  47. package/dist/api/design/windows/index.d.ts +8 -8
  48. package/dist/api/design/windows/index.d.ts.map +1 -1
  49. package/dist/api/entity/buildableEnvelope.d.ts +84 -2
  50. package/dist/api/entity/buildableEnvelope.d.ts.map +1 -1
  51. package/dist/api/presentation/aiInspiration.d.ts +10 -10
  52. package/dist/api/presentation/annotate.d.ts +38 -22
  53. package/dist/api/presentation/annotate.d.ts.map +1 -1
  54. package/dist/api/presentation/drawingContract.d.ts +32 -0
  55. package/dist/api/presentation/drawingContract.d.ts.map +1 -0
  56. package/dist/api/presentation/drawings.d.ts +3523 -0
  57. package/dist/api/presentation/drawings.d.ts.map +1 -0
  58. package/dist/api/presentation/export.d.ts +23 -5
  59. package/dist/api/presentation/export.d.ts.map +1 -1
  60. package/dist/api/presentation/index.d.ts +41 -12
  61. package/dist/api/presentation/index.d.ts.map +1 -1
  62. package/dist/api/presentation/placedViews.d.ts +106 -6
  63. package/dist/api/presentation/placedViews.d.ts.map +1 -1
  64. package/dist/api/presentation/sections.d.ts +461 -0
  65. package/dist/api/presentation/sections.d.ts.map +1 -0
  66. package/dist/api/presentation/shapes.d.ts +2 -2
  67. package/dist/api/presentation/sheets.d.ts +175 -19
  68. package/dist/api/presentation/sheets.d.ts.map +1 -1
  69. package/dist/api/presentation/viewPresets.d.ts +222 -0
  70. package/dist/api/presentation/viewPresets.d.ts.map +1 -0
  71. package/dist/api/presentation/views.d.ts +141 -8
  72. package/dist/api/presentation/views.d.ts.map +1 -1
  73. package/dist/api/presentation/walkthroughs.d.ts +6 -6
  74. package/dist/errors/codes.d.ts +3 -1
  75. package/dist/errors/codes.d.ts.map +1 -1
  76. package/dist/index.cjs +3883 -2385
  77. package/dist/index.cjs.map +1 -1
  78. package/dist/index.js +3744 -2385
  79. package/dist/index.js.map +1 -1
  80. package/package.json +1 -1
  81. package/scripts/check-dist-fresh.mjs +22 -22
  82. package/scripts/generate-manifest.mjs +243 -238
  83. package/scripts/generate-manifest.test.mjs +303 -303
  84. package/src/api/analysis/daylight.ts +470 -470
  85. package/src/api/analysis/heatmaps.ts +683 -683
  86. package/src/api/analysis/illuminance.ts +155 -155
  87. package/src/api/analysis/index.ts +61 -61
  88. package/src/api/analysis/shadows.ts +183 -183
  89. package/src/api/analysis/solar.ts +237 -237
  90. package/src/api/analysis/sunlightHours.ts +211 -211
  91. package/src/api/analysis/sunpath.ts +83 -83
  92. package/src/api/analysis/weather.ts +179 -179
  93. package/src/api/core/buildings.ts +485 -485
  94. package/src/api/core/camera/index.ts +696 -667
  95. package/src/api/core/comment/index.ts +376 -376
  96. package/src/api/core/geom/create/index.ts +2139 -2133
  97. package/src/api/core/geom/delete/index.ts +84 -84
  98. package/src/api/core/geom/index.ts +35 -35
  99. package/src/api/core/geom/query/arc.ts +169 -169
  100. package/src/api/core/geom/query/brep.ts +621 -621
  101. package/src/api/core/geom/query/circle.ts +404 -404
  102. package/src/api/core/geom/query/contour.ts +540 -540
  103. package/src/api/core/geom/query/curve.ts +1102 -1102
  104. package/src/api/core/geom/query/edge.ts +130 -130
  105. package/src/api/core/geom/query/face.ts +508 -508
  106. package/src/api/core/geom/query/halfedge.ts +210 -210
  107. package/src/api/core/geom/query/index.ts +63 -63
  108. package/src/api/core/geom/query/profile.ts +473 -473
  109. package/src/api/core/geom/query/vertex.ts +205 -205
  110. package/src/api/core/geom/update/contour.ts +323 -317
  111. package/src/api/core/geom/update/curve.ts +209 -209
  112. package/src/api/core/geom/update/index.ts +29 -29
  113. package/src/api/core/geom/update/profile.ts +379 -379
  114. package/src/api/core/groups.ts +521 -521
  115. package/src/api/core/handles/index.ts +234 -234
  116. package/src/api/core/history/index.ts +84 -84
  117. package/src/api/core/index.ts +99 -99
  118. package/src/api/core/io/export/index.ts +126 -126
  119. package/src/api/core/io/import/index.ts +504 -504
  120. package/src/api/core/io/index.ts +42 -42
  121. package/src/api/core/io/job/index.ts +140 -140
  122. package/src/api/core/io/query/index.ts +71 -71
  123. package/src/api/core/io/terrain/index.ts +360 -360
  124. package/src/api/core/io/underlay/index.ts +705 -705
  125. package/src/api/core/layers.ts +540 -540
  126. package/src/api/core/math/index.ts +20 -20
  127. package/src/api/core/math/quat.ts +172 -172
  128. package/src/api/core/math/vec3.ts +179 -179
  129. package/src/api/core/mode/index.ts +108 -108
  130. package/src/api/core/project/index.ts +479 -479
  131. package/src/api/core/proposals/index.ts +570 -570
  132. package/src/api/core/storeys/index.ts +311 -308
  133. package/src/api/core/storeys/layers.ts +339 -339
  134. package/src/api/core/tags.ts +911 -911
  135. package/src/api/core/units/index.ts +164 -164
  136. package/src/api/core/user.ts +46 -46
  137. package/src/api/core/zoom/index.ts +64 -51
  138. package/src/api/design/bim.ts +210 -0
  139. package/src/api/design/boolean/index.ts +181 -179
  140. package/src/api/design/catalog.ts +203 -0
  141. package/src/api/design/create/bulk-items.ts +294 -254
  142. package/src/api/design/create/grids.ts +137 -137
  143. package/src/api/design/create/index.ts +2178 -1980
  144. package/src/api/design/create/opening-fields.ts +40 -37
  145. package/src/api/design/delete/index.ts +75 -74
  146. package/src/api/design/dimensions.ts +453 -453
  147. package/src/api/design/doors/index.ts +516 -500
  148. package/src/api/design/edit/index.ts +54 -54
  149. package/src/api/design/erase/index.ts +151 -151
  150. package/src/api/design/family.ts +1342 -704
  151. package/src/api/design/furniture/index.ts +319 -319
  152. package/src/api/design/grids.ts +237 -237
  153. package/src/api/design/index.ts +304 -274
  154. package/src/api/design/lock.ts +69 -69
  155. package/src/api/design/materials/index.ts +608 -608
  156. package/src/api/design/networks.ts +607 -0
  157. package/src/api/design/query/geometry/index.ts +319 -319
  158. package/src/api/design/query/grids.ts +197 -197
  159. package/src/api/design/query/index.ts +1236 -1226
  160. package/src/api/design/query/referenceLines.ts +52 -52
  161. package/src/api/design/query/spaces.ts +275 -275
  162. package/src/api/design/selection/index.ts +273 -273
  163. package/src/api/design/shared.ts +40 -40
  164. package/src/api/design/transform/index.ts +254 -254
  165. package/src/api/design/types/index.ts +163 -156
  166. package/src/api/design/update/index.ts +1096 -983
  167. package/src/api/design/visibility.ts +143 -143
  168. package/src/api/design/windows/index.ts +351 -333
  169. package/src/api/entity/buildableEnvelope.ts +397 -322
  170. package/src/api/entity/index.ts +30 -30
  171. package/src/api/entity/referenceLine.ts +235 -235
  172. package/src/api/entity/space.ts +612 -612
  173. package/src/api/entity/story.ts +517 -517
  174. package/src/api/index.ts +47 -47
  175. package/src/api/presentation/aiInspiration.ts +1116 -1116
  176. package/src/api/presentation/annotate.ts +417 -385
  177. package/src/api/presentation/camera.ts +289 -289
  178. package/src/api/presentation/diagrams.ts +194 -194
  179. package/src/api/presentation/drawingContract.ts +70 -0
  180. package/src/api/presentation/drawings.ts +1179 -0
  181. package/src/api/presentation/export.ts +134 -108
  182. package/src/api/presentation/import.ts +159 -159
  183. package/src/api/presentation/index.ts +160 -126
  184. package/src/api/presentation/placedViews.ts +1211 -1120
  185. package/src/api/presentation/sections.ts +420 -0
  186. package/src/api/presentation/shapes.ts +274 -274
  187. package/src/api/presentation/sheets.ts +746 -585
  188. package/src/api/presentation/slideshow.ts +134 -134
  189. package/src/api/presentation/tables.ts +84 -84
  190. package/src/api/presentation/viewPresets.ts +241 -0
  191. package/src/api/presentation/views.ts +742 -673
  192. package/src/api/presentation/walkthroughs.ts +1201 -1201
  193. package/src/api/program/adjacency.ts +164 -164
  194. package/src/api/program/areas.ts +408 -408
  195. package/src/api/program/classification.ts +138 -138
  196. package/src/api/program/cores.ts +83 -83
  197. package/src/api/program/departments.ts +517 -517
  198. package/src/api/program/index.ts +73 -73
  199. package/src/api/program/labels.ts +332 -332
  200. package/src/api/program/layout.ts +422 -422
  201. package/src/api/program/metadata.ts +364 -364
  202. package/src/api/program/metrics.ts +120 -120
  203. package/src/api/program/site.ts +748 -748
  204. package/src/api/program/spreadsheet.ts +2698 -2698
  205. package/src/api/workspace/index.ts +612 -612
  206. package/src/errors/codes.ts +143 -136
  207. package/src/errors/envelope.ts +75 -75
  208. package/src/errors/index.ts +21 -21
  209. package/src/errors/plugin-error.ts +134 -134
  210. package/src/handles.ts +297 -297
  211. package/src/host-utils.ts +67 -67
  212. package/src/index.ts +7 -7
  213. package/src/massParameters.ops.ts +246 -246
  214. package/src/massParameters.ts +427 -427
  215. package/src/types.ts +16 -16
  216. package/test/drawingContract.test.mjs +288 -0
  217. package/test/errors.test.mjs +185 -184
  218. package/test/massParameters.test.mjs +952 -952
  219. package/test/presentationViewSettings.test.mjs +85 -0
  220. package/tsconfig.json +22 -22
  221. package/tsup.config.ts +12 -12
@@ -1,612 +1,612 @@
1
- // Space value types + schemas. The `entity.space.*` API was removed and its
2
- // operations migrated to `design.create.spaces` / `design.update.*` /
3
- // `design.query.*` / `design.delete.entities`. These shared space types survive
4
- // here because `design.create` / `design.query` / `design.update` import them.
5
- import * as z from "zod"
6
- import {
7
- ProfileHandle,
8
- Vec3Handle,
9
- Vec3Components,
10
- QuatComponents,
11
- CurveHandle,
12
- } from "../../handles"
13
-
14
-
15
- /**
16
- * Arguments for `createRectangular`.
17
- *
18
- * | Property | Type | Description |
19
- * |---|---|---|
20
- * | `position` | {@linkcode Vec3Handle} | Origin position in Babylon units |
21
- * | `dimensions` | `{ width, height, depth }` | Box dimensions in Babylon units |
22
- */
23
- export const PluginSpaceCreateRectangularArgs = z.object({
24
- position: Vec3Handle,
25
- dimensions: z.object({
26
- width: z.number(),
27
- height: z.number(),
28
- depth: z.number(),
29
- }),
30
- })
31
-
32
- export type PluginSpaceCreateRectangularArgs = z.infer<
33
- typeof PluginSpaceCreateRectangularArgs
34
- >
35
-
36
- /**
37
- * Result of `createRectangular`.
38
- *
39
- * | Property | Type | Description |
40
- * |---|---|---|
41
- * | `spaceId` | `string` | Unique ID of the created space |
42
- */
43
- export const PluginSpaceCreateRectangularResult = z.object({
44
- spaceId: z.string(),
45
- })
46
-
47
- export type PluginSpaceCreateRectangularResult = z.infer<
48
- typeof PluginSpaceCreateRectangularResult
49
- >
50
-
51
- /**
52
- * Arguments for `createFromProfile`.
53
- *
54
- * | Property | Type | Description |
55
- * |---|---|---|
56
- * | `profile` | {@linkcode ProfileHandle} | Handle to a closed 2D profile (the outer floor shape) |
57
- * | `innerProfiles` | {@linkcode ProfileHandle}`[]` | Optional profile handles to subtract as holes |
58
- * | `extrudeHeight` | `number` | Extrusion height in Babylon units |
59
- * | `position` | {@linkcode Vec3Handle} | Offset position in Babylon units |
60
- */
61
- export const PluginSpaceCreateFromProfileArgs = z.object({
62
- profile: ProfileHandle,
63
- innerProfiles: z.array(ProfileHandle).optional(),
64
- extrudeHeight: z.number(),
65
- position: Vec3Handle,
66
- })
67
-
68
- export type PluginSpaceCreateFromProfileArgs = z.infer<
69
- typeof PluginSpaceCreateFromProfileArgs
70
- >
71
-
72
- /**
73
- * Result of `createFromProfile`.
74
- *
75
- * | Property | Type | Description |
76
- * |---|---|---|
77
- * | `spaceId` | `string` | Unique ID of the created space |
78
- */
79
- export const PluginSpaceCreateFromProfileResult = z.object({
80
- spaceId: z.string(),
81
- })
82
-
83
- export type PluginSpaceCreateFromProfileResult = z.infer<
84
- typeof PluginSpaceCreateFromProfileResult
85
- >
86
-
87
- /**
88
- * Arguments for `updateGeometryFromProfile`.
89
- *
90
- * | Property | Type | Description |
91
- * |---|---|---|
92
- * | `spaceId` | `string` | Space to update |
93
- * | `profile` | {@linkcode ProfileHandle} | Handle to the closed 2D profile defining the new floor shape |
94
- * | `extrudeHeight` | `number` | New extrusion height in Babylon units |
95
- */
96
- export const PluginSpaceUpdateGeometryFromProfileArgs = z.object({
97
- spaceId: z.string(),
98
- profile: ProfileHandle,
99
- extrudeHeight: z.number(),
100
- })
101
-
102
- export type PluginSpaceUpdateGeometryFromProfileArgs = z.infer<
103
- typeof PluginSpaceUpdateGeometryFromProfileArgs
104
- >
105
-
106
- /**
107
- * Result of `updateGeometryFromProfile`.
108
- *
109
- * | Property | Type | Description |
110
- * |---|---|---|
111
- * | `spaceId` | `string` | Unique ID of the updated space |
112
- */
113
- export const PluginSpaceUpdateGeometryFromProfileResult = z.object({
114
- spaceId: z.string(),
115
- })
116
-
117
- export type PluginSpaceUpdateGeometryFromProfileResult = z.infer<
118
- typeof PluginSpaceUpdateGeometryFromProfileResult
119
- >
120
-
121
- /**
122
- * Available properties that can be queried on a space.
123
- *
124
- * **Basic:**
125
- * | Value | Return Type | Description |
126
- * |---|---|---|
127
- * | `"id"` | `string` | Unique space identifier |
128
- * | `"type"` | `string` | Component type |
129
- * | `"room_type"` | `string` | Room type classification |
130
- * | `"name"` | `string` | Display name of the space |
131
- *
132
- * **Derived from parametric data:**
133
- * | Value | Return Type | Description |
134
- * |---|---|---|
135
- * | `"area"` | `number` | Bottom face area (from `areas_bottomFace`) |
136
- * | `"breadth"` | `number` | Breadth dimension |
137
- * | `"depth"` | `number` | Depth dimension |
138
- * | `"height"` | `number` | Height dimension |
139
- * | `"massType"` | `string \| null` | Mass type classification |
140
- * | `"spaceType"` | `string \| null` | Space type classification (Room, Balcony, etc.) |
141
- * | `"storey"` | `number \| null` | Story the space belongs to |
142
- * | `"departmentId"` | `string \| null` | Assigned department ID |
143
- * | `"departmentName"` | `string` | Assigned department name |
144
- * | `"departmentColor"` | `string` | Assigned department color (hex/CSS) |
145
- *
146
- * **Derived from mesh:**
147
- * | Value | Return Type | Description |
148
- * |---|---|---|
149
- * | `"position"` | {@linkcode Vec3Components} | Local position relative to parent |
150
- * | `"absolutePosition"` | {@linkcode Vec3Components} | Absolute position in the scene |
151
- * | `"rotation"` | {@linkcode Vec3Components} | Euler rotation angles (radians) |
152
- * | `"rotationQuaternion"` | {@linkcode QuatComponents} \| `null` | Quaternion rotation, or `null` if unset |
153
- *
154
- * **Derived from brep:**
155
- * | Value | Return Type | Description |
156
- * |---|---|---|
157
- * | `"planPoints"` | {@linkcode Vec3Components}`[]` | Bottom outer profile points in world space with `y = 0` (2D plan). No closing duplicate point. |
158
- * | `"profile"` | {@linkcode CurveHandle}`[]` | Bottom outer profile curves in world space, as opaque curve handles. Read coordinates via the `core.geom.curve` read API. |
159
- * | `"innerProfiles"` | {@linkcode CurveHandle}`[][]` | Inner (hole) profile curve loops in world space — one loop per hole, `[]` when the space has none. Each curve is an opaque handle. |
160
- * | `"innerPlanPoints"` | {@linkcode Vec3Components}`[][]` | Inner (hole) profile points in world space with `y = 0` — one loop per hole, no closing duplicate, `[]` when none. |
161
- *
162
- * **Derived from adjacency manager:**
163
- * | Value | Return Type | Description |
164
- * |---|---|---|
165
- * | `"adjacency"` | `{ spaceId: string; value: number }[]` | Adjacency relationships to other spaces. `value`: `2` = Direct (required), `1` = Indirect or physical contact, `-1` = Restricted; `0` (no relationship) entries are filtered out. Empty when adjacency has never been computed — see `program.adjacency.compute`. |
166
- */
167
- export const PluginSpaceGetProperty = z.enum([
168
- // Basic
169
- "id",
170
- "type",
171
- "room_type",
172
- "name",
173
- // Derived from parametric data
174
- "area",
175
- "breadth",
176
- "depth",
177
- "height",
178
- "massType",
179
- "spaceType",
180
- "areaClass",
181
- "storey",
182
- "departmentId",
183
- "departmentName",
184
- "departmentColor",
185
- // Derived from mesh
186
- "position",
187
- "absolutePosition",
188
- "rotation",
189
- "rotationQuaternion",
190
- // Derived from brep
191
- "planPoints",
192
- "profile",
193
- "innerProfiles",
194
- "innerPlanPoints",
195
- // Derived from adjacency manager
196
- "adjacency",
197
- ])
198
-
199
- /**
200
- * Arguments for `get`.
201
- *
202
- * | Property | Type | Description |
203
- * |---|---|---|
204
- * | `spaceId` | `string` | The space ID to query |
205
- * | `properties` | {@linkcode PluginSpaceGetProperty}`[]` | Properties to retrieve |
206
- */
207
- export const PluginSpaceGetArgs = z.object({
208
- spaceId: z.string(),
209
- properties: z.array(PluginSpaceGetProperty),
210
- })
211
-
212
- export type PluginSpaceGetArgs = z.infer<typeof PluginSpaceGetArgs>
213
-
214
- /**
215
- * Supported space type values.
216
- *
217
- * Mirrors the internal `SpaceType` enum from `spaceType.types.ts`.
218
- *
219
- * | Value | Description |
220
- * |---|---|
221
- * | `"Room"` | Standard room |
222
- * | `"Program Block"` | Program/department block |
223
- * | `"Balcony"` | Balcony space |
224
- * | `"Road"` | Road |
225
- * | `"Garden"` | Garden area |
226
- * | `"Deck"` | Deck |
227
- * | `"Pool"` | Pool |
228
- * | `"Walkway"` | Walkway |
229
- * | `"Envelope"` | Envelope |
230
- * | `"Parking"` | Parking area |
231
- */
232
- export const PluginSpaceType = z.enum([
233
- "Room",
234
- "Program Block",
235
- "Balcony",
236
- "Road",
237
- "Garden",
238
- "Deck",
239
- "Pool",
240
- "Walkway",
241
- "Envelope",
242
- "Parking",
243
- ])
244
- /** The space-type value union (same-name type alias for positional signatures). */
245
- export type PluginSpaceType = z.infer<typeof PluginSpaceType>
246
-
247
- /**
248
- * Area-class classification of a space (mirrors the internal `AreaClass` enum).
249
- *
250
- * | Value | Description |
251
- * |---|---|
252
- * | `"NET"` | Net (usable) area |
253
- * | `"GROSS"` | Gross area |
254
- * | `"EXCLUDED"` | Excluded from area totals |
255
- */
256
- export const PluginAreaClass = z.enum(["NET", "GROSS", "EXCLUDED"])
257
-
258
- /**
259
- * Result of `get`.
260
- *
261
- * A partial object — only the properties that were requested in
262
- * {@linkcode PluginSpaceGetArgs.properties} will be present.
263
- */
264
- export const PluginSpaceGetResult = z
265
- .object({
266
- // Basic
267
- id: z.string(),
268
- type: z.string(),
269
- room_type: z.string(),
270
- name: z.string(),
271
- // Derived from parametric data
272
- area: z.number(),
273
- breadth: z.number(),
274
- depth: z.number(),
275
- height: z.number(),
276
- massType: z.string().nullable(),
277
- spaceType: PluginSpaceType.nullable(),
278
- areaClass: PluginAreaClass,
279
- storey: z.number().nullable(),
280
- departmentId: z.string().nullable(),
281
- departmentName: z.string(),
282
- departmentColor: z.string(),
283
- // Derived from mesh
284
- position: Vec3Components,
285
- absolutePosition: Vec3Components,
286
- rotation: Vec3Components,
287
- rotationQuaternion: QuatComponents.nullable(),
288
- // Derived from brep
289
- planPoints: z.array(Vec3Components),
290
- profile: z.array(CurveHandle),
291
- innerProfiles: z.array(z.array(CurveHandle)),
292
- innerPlanPoints: z.array(z.array(Vec3Components)),
293
- // Derived from adjacency manager.
294
- // value: 2 = Direct (required), 1 = Indirect or physical contact, -1 = Restricted;
295
- // 0 (no relationship) entries are filtered out. Empty array when adjacency has
296
- // never been computed — run program.adjacency.compute() first for fresh data.
297
- adjacency: z.array(z.object({
298
- spaceId: z.string(),
299
- value: z.number(),
300
- })),
301
- })
302
- .partial()
303
-
304
- export type PluginSpaceGetResult = z.infer<typeof PluginSpaceGetResult>
305
-
306
- /**
307
- * Result of `getAll`.
308
- *
309
- * | Property | Type | Description |
310
- * |---|---|---|
311
- * | `spacesIds` | `string[]` | IDs of all spaces in the project |
312
- */
313
- export const PluginSpaceGetAllResult = z.object({
314
- spacesIds: z.array(z.string()),
315
- })
316
-
317
- export type PluginSpaceGetAllResult = z.infer<typeof PluginSpaceGetAllResult>
318
-
319
- /**
320
- * Arguments for `delete`.
321
- *
322
- * | Property | Type | Description |
323
- * |---|---|---|
324
- * | `spaceId` | `string` | The space ID to delete |
325
- */
326
- export const PluginSpaceDeleteArgs = z.object({
327
- spaceId: z.string(),
328
- })
329
-
330
- export type PluginSpaceDeleteArgs = z.infer<typeof PluginSpaceDeleteArgs>
331
-
332
- /** Result type for `delete` — returns nothing on success. */
333
- export type PluginSpaceDeleteResult = void
334
-
335
- /**
336
- * Supported mass type values for {@linkcode PluginSpaceUpdateArgs.properties.massType}.
337
- *
338
- * Mirrors the internal `MASS_TYPES` enum.
339
- *
340
- * | Value | Description |
341
- * |---|---|
342
- * | `"Plinth"` | Plinth mass |
343
- * | `"Void"` | Void/cut-out |
344
- * | `"Pergola"` | Pergola structure |
345
- * | `"Furniture"` | Furniture element |
346
- * | `"Facade element"` | Facade element |
347
- * | `"Generic mass"` | Generic mass |
348
- * | `"Room"` | Room (default for spaces) |
349
- * | `"Department"` | Department block |
350
- * | `"Building"` | Building envelope |
351
- * | `"Revit Import"` | Imported from Revit |
352
- * | `"Mass"` | Generic mass type |
353
- * | `"Site"` | Site object |
354
- */
355
- export const PluginMassType = z.enum([
356
- "Plinth",
357
- "Void",
358
- "Pergola",
359
- "Furniture",
360
- "Facade element",
361
- "Generic mass",
362
- "Room",
363
- "Department",
364
- "Building",
365
- "Revit Import",
366
- "Mass",
367
- "Site",
368
- ])
369
- /** The mass-type value union (same-name type alias for positional signatures). */
370
- export type PluginMassType = z.infer<typeof PluginMassType>
371
-
372
- /**
373
- * Well-known (built-in) department IDs.
374
- *
375
- * | Value | Department |
376
- * |---|---|
377
- * | `"DEFAULT"` | Default department |
378
- * | `"SITE"` | Site department |
379
- * | `"ENVELOPE"` | Envelope department |
380
- * | `"CORE"` | Core department |
381
- */
382
- export const PluginWellKnownDepartmentId = z.enum([
383
- "DEFAULT",
384
- "SITE",
385
- "ENVELOPE",
386
- "CORE",
387
- ])
388
-
389
- /**
390
- * Accepted department ID values — either a {@linkcode PluginWellKnownDepartmentId}
391
- * or a UUID string for custom (user-created) departments.
392
- */
393
- export const PluginDepartmentId = z.union([
394
- PluginWellKnownDepartmentId,
395
- z.uuid(),
396
- ])
397
- /** The department-id value union (same-name type alias for positional signatures). */
398
- export type PluginDepartmentId = z.infer<typeof PluginDepartmentId>
399
-
400
- /**
401
- * Arguments for `update`.
402
- *
403
- * | Property | Type | Description |
404
- * |---|---|---|
405
- * | `spaceId` | `string` | The space ID to update |
406
- * | `properties` | `object` | Key/value pairs of properties to update (all optional) |
407
- * | `properties.room_type` | `string?` | New room type label |
408
- * | `properties.massType` | {@linkcode PluginMassType}`?` | New mass type |
409
- * | `properties.departmentId` | {@linkcode PluginDepartmentId}`?` | New department ID |
410
- */
411
- export const PluginSpaceUpdateArgs = z.object({
412
- spaceId: z.string(),
413
- properties: z.object({
414
- room_type: z.string().optional(),
415
- massType: PluginMassType.optional(),
416
- spaceType: PluginSpaceType.optional(),
417
- areaClass: PluginAreaClass.optional(),
418
- departmentId: PluginDepartmentId.optional(),
419
- }),
420
- })
421
-
422
- export type PluginSpaceUpdateArgs = z.infer<typeof PluginSpaceUpdateArgs>
423
-
424
- /**
425
- * Result of `update`.
426
- *
427
- * Echoes back the `spaceId` and the values of properties that were updated.
428
- * Properties that were not included in the update request will be `undefined`.
429
- *
430
- * | Property | Type | Description |
431
- * |---|---|---|
432
- * | `spaceId` | `string` | The space ID that was updated |
433
- * | `room_type` | `string?` | Updated room type (if changed) |
434
- * | `massType` | `string?` | Updated mass type (if changed) |
435
- * | `spaceType` | `string?` | Updated space type (if changed) |
436
- * | `departmentId` | `string \| null?` | Updated department ID (if changed) |
437
- */
438
- export const PluginSpaceUpdateResult = z.object({
439
- spaceId: z.string(),
440
- room_type: z.string().optional(),
441
- massType: z.string().optional(),
442
- spaceType: z.string().optional(),
443
- areaClass: PluginAreaClass.optional(),
444
- departmentId: z.string().nullable().optional(),
445
- })
446
-
447
- export type PluginSpaceUpdateResult = z.infer<typeof PluginSpaceUpdateResult>
448
-
449
- // ---------------------------------------------------------------------------
450
- // Bulk operations
451
- // ---------------------------------------------------------------------------
452
-
453
- /**
454
- * A single item for `bulkCreate`.
455
- *
456
- * Discriminated on `kind`:
457
- * - `"rectangular"` — a box defined by `position` + `dimensions` (mirrors
458
- * {@linkcode PluginSpaceCreateRectangularArgs})
459
- * - `"profile"` — an extruded `profile` (with optional `innerProfiles`) by
460
- * `extrudeHeight` at `position` (mirrors {@linkcode PluginSpaceCreateFromProfileArgs})
461
- *
462
- * Every item may optionally set `room_type`, `spaceType`, `massType`, and
463
- * `departmentId`; these are applied within the same single undo step as the
464
- * creation.
465
- */
466
- export const PluginSpaceBulkCreateItem = z.discriminatedUnion("kind", [
467
- z.object({
468
- kind: z.literal("rectangular"),
469
- position: Vec3Handle,
470
- dimensions: z.object({
471
- width: z.number(),
472
- height: z.number(),
473
- depth: z.number(),
474
- }),
475
- room_type: z.string().optional(),
476
- spaceType: PluginSpaceType.optional(),
477
- massType: PluginMassType.optional(),
478
- departmentId: PluginDepartmentId.optional(),
479
- }),
480
- z.object({
481
- kind: z.literal("profile"),
482
- profile: ProfileHandle,
483
- innerProfiles: z.array(ProfileHandle).optional(),
484
- extrudeHeight: z.number(),
485
- position: Vec3Handle,
486
- room_type: z.string().optional(),
487
- spaceType: PluginSpaceType.optional(),
488
- massType: PluginMassType.optional(),
489
- departmentId: PluginDepartmentId.optional(),
490
- }),
491
- ])
492
-
493
- export type PluginSpaceBulkCreateItem = z.infer<typeof PluginSpaceBulkCreateItem>
494
-
495
- /**
496
- * Arguments for `bulkCreate`.
497
- *
498
- * | Property | Type | Description |
499
- * |---|---|---|
500
- * | `items` | {@linkcode PluginSpaceBulkCreateItem}`[]` | Spaces to create |
501
- */
502
- export const PluginSpaceBulkCreateArgs = z.object({
503
- items: z.array(PluginSpaceBulkCreateItem),
504
- })
505
-
506
- export type PluginSpaceBulkCreateArgs = z.infer<typeof PluginSpaceBulkCreateArgs>
507
-
508
- /**
509
- * Result of `bulkCreate`.
510
- *
511
- * | Property | Type | Description |
512
- * |---|---|---|
513
- * | `spaceIds` | `string[]` | IDs of the created spaces, in input order |
514
- */
515
- export const PluginSpaceBulkCreateResult = z.object({
516
- spaceIds: z.array(z.string()),
517
- })
518
-
519
- export type PluginSpaceBulkCreateResult = z.infer<
520
- typeof PluginSpaceBulkCreateResult
521
- >
522
-
523
- /**
524
- * A single item for `bulkUpdate`.
525
- *
526
- * Targets an existing space by `spaceId`. Geometry fields `profile` and
527
- * `extrudeHeight` must be supplied **together** (mirrors
528
- * {@linkcode PluginSpaceUpdateGeometryFromProfileArgs}). Property changes are
529
- * nested under `properties`, mirroring {@linkcode PluginSpaceUpdateArgs}.
530
- *
531
- * | Property | Type | Description |
532
- * |---|---|---|
533
- * | `spaceId` | `string` | The space to update |
534
- * | `profile` | {@linkcode ProfileHandle}`?` | New floor shape handle (requires `extrudeHeight`) |
535
- * | `extrudeHeight` | `number?` | New extrusion height (requires `profile`) |
536
- * | `properties` | `object?` | Property changes (same shape as {@linkcode PluginSpaceUpdateArgs.properties}) |
537
- */
538
- export const PluginSpaceBulkUpdateItem = z.object({
539
- spaceId: z.string(),
540
- profile: ProfileHandle.optional(),
541
- extrudeHeight: z.number().optional(),
542
- properties: z
543
- .object({
544
- room_type: z.string().optional(),
545
- massType: PluginMassType.optional(),
546
- spaceType: PluginSpaceType.optional(),
547
- areaClass: PluginAreaClass.optional(),
548
- departmentId: PluginDepartmentId.optional(),
549
- })
550
- .optional(),
551
- })
552
-
553
- export type PluginSpaceBulkUpdateItem = z.infer<typeof PluginSpaceBulkUpdateItem>
554
-
555
- /**
556
- * Arguments for `bulkUpdate`.
557
- *
558
- * | Property | Type | Description |
559
- * |---|---|---|
560
- * | `items` | {@linkcode PluginSpaceBulkUpdateItem}`[]` | Spaces to update |
561
- */
562
- export const PluginSpaceBulkUpdateArgs = z.object({
563
- items: z.array(PluginSpaceBulkUpdateItem),
564
- })
565
-
566
- export type PluginSpaceBulkUpdateArgs = z.infer<typeof PluginSpaceBulkUpdateArgs>
567
-
568
- /**
569
- * Result of `bulkUpdate`.
570
- *
571
- * Echoes one {@linkcode PluginSpaceUpdateResult} per item, in input order —
572
- * the same per-space shape returned by `update`.
573
- *
574
- * | Property | Type | Description |
575
- * |---|---|---|
576
- * | `spaces` | {@linkcode PluginSpaceUpdateResult}`[]` | Per-item updated values, in input order |
577
- */
578
- export const PluginSpaceBulkUpdateResult = z.object({
579
- spaces: z.array(PluginSpaceUpdateResult),
580
- })
581
-
582
- export type PluginSpaceBulkUpdateResult = z.infer<
583
- typeof PluginSpaceBulkUpdateResult
584
- >
585
-
586
- /**
587
- * Arguments for `bulkDelete`.
588
- *
589
- * | Property | Type | Description |
590
- * |---|---|---|
591
- * | `spaceIds` | `string[]` | The space IDs to delete |
592
- */
593
- export const PluginSpaceBulkDeleteArgs = z.object({
594
- spaceIds: z.array(z.string()),
595
- })
596
-
597
- export type PluginSpaceBulkDeleteArgs = z.infer<typeof PluginSpaceBulkDeleteArgs>
598
-
599
- /**
600
- * Result of `bulkDelete`.
601
- *
602
- * | Property | Type | Description |
603
- * |---|---|---|
604
- * | `deletedSpaceIds` | `string[]` | The space IDs that were removed |
605
- */
606
- export const PluginSpaceBulkDeleteResult = z.object({
607
- deletedSpaceIds: z.array(z.string()),
608
- })
609
-
610
- export type PluginSpaceBulkDeleteResult = z.infer<
611
- typeof PluginSpaceBulkDeleteResult
612
- >
1
+ // Space value types + schemas. The `entity.space.*` API was removed and its
2
+ // operations migrated to `design.create.spaces` / `design.update.*` /
3
+ // `design.query.*` / `design.delete.entities`. These shared space types survive
4
+ // here because `design.create` / `design.query` / `design.update` import them.
5
+ import * as z from "zod"
6
+ import {
7
+ ProfileHandle,
8
+ Vec3Handle,
9
+ Vec3Components,
10
+ QuatComponents,
11
+ CurveHandle,
12
+ } from "../../handles"
13
+
14
+
15
+ /**
16
+ * Arguments for `createRectangular`.
17
+ *
18
+ * | Property | Type | Description |
19
+ * |---|---|---|
20
+ * | `position` | {@linkcode Vec3Handle} | Origin position in Babylon units |
21
+ * | `dimensions` | `{ width, height, depth }` | Box dimensions in Babylon units |
22
+ */
23
+ export const PluginSpaceCreateRectangularArgs = z.object({
24
+ position: Vec3Handle,
25
+ dimensions: z.object({
26
+ width: z.number(),
27
+ height: z.number(),
28
+ depth: z.number(),
29
+ }),
30
+ })
31
+
32
+ export type PluginSpaceCreateRectangularArgs = z.infer<
33
+ typeof PluginSpaceCreateRectangularArgs
34
+ >
35
+
36
+ /**
37
+ * Result of `createRectangular`.
38
+ *
39
+ * | Property | Type | Description |
40
+ * |---|---|---|
41
+ * | `spaceId` | `string` | Unique ID of the created space |
42
+ */
43
+ export const PluginSpaceCreateRectangularResult = z.object({
44
+ spaceId: z.string(),
45
+ })
46
+
47
+ export type PluginSpaceCreateRectangularResult = z.infer<
48
+ typeof PluginSpaceCreateRectangularResult
49
+ >
50
+
51
+ /**
52
+ * Arguments for `createFromProfile`.
53
+ *
54
+ * | Property | Type | Description |
55
+ * |---|---|---|
56
+ * | `profile` | {@linkcode ProfileHandle} | Handle to a closed 2D profile (the outer floor shape) |
57
+ * | `innerProfiles` | {@linkcode ProfileHandle}`[]` | Optional profile handles to subtract as holes |
58
+ * | `extrudeHeight` | `number` | Extrusion height in Babylon units |
59
+ * | `position` | {@linkcode Vec3Handle} | Offset position in Babylon units |
60
+ */
61
+ export const PluginSpaceCreateFromProfileArgs = z.object({
62
+ profile: ProfileHandle,
63
+ innerProfiles: z.array(ProfileHandle).optional(),
64
+ extrudeHeight: z.number(),
65
+ position: Vec3Handle,
66
+ })
67
+
68
+ export type PluginSpaceCreateFromProfileArgs = z.infer<
69
+ typeof PluginSpaceCreateFromProfileArgs
70
+ >
71
+
72
+ /**
73
+ * Result of `createFromProfile`.
74
+ *
75
+ * | Property | Type | Description |
76
+ * |---|---|---|
77
+ * | `spaceId` | `string` | Unique ID of the created space |
78
+ */
79
+ export const PluginSpaceCreateFromProfileResult = z.object({
80
+ spaceId: z.string(),
81
+ })
82
+
83
+ export type PluginSpaceCreateFromProfileResult = z.infer<
84
+ typeof PluginSpaceCreateFromProfileResult
85
+ >
86
+
87
+ /**
88
+ * Arguments for `updateGeometryFromProfile`.
89
+ *
90
+ * | Property | Type | Description |
91
+ * |---|---|---|
92
+ * | `spaceId` | `string` | Space to update |
93
+ * | `profile` | {@linkcode ProfileHandle} | Handle to the closed 2D profile defining the new floor shape |
94
+ * | `extrudeHeight` | `number` | New extrusion height in Babylon units |
95
+ */
96
+ export const PluginSpaceUpdateGeometryFromProfileArgs = z.object({
97
+ spaceId: z.string(),
98
+ profile: ProfileHandle,
99
+ extrudeHeight: z.number(),
100
+ })
101
+
102
+ export type PluginSpaceUpdateGeometryFromProfileArgs = z.infer<
103
+ typeof PluginSpaceUpdateGeometryFromProfileArgs
104
+ >
105
+
106
+ /**
107
+ * Result of `updateGeometryFromProfile`.
108
+ *
109
+ * | Property | Type | Description |
110
+ * |---|---|---|
111
+ * | `spaceId` | `string` | Unique ID of the updated space |
112
+ */
113
+ export const PluginSpaceUpdateGeometryFromProfileResult = z.object({
114
+ spaceId: z.string(),
115
+ })
116
+
117
+ export type PluginSpaceUpdateGeometryFromProfileResult = z.infer<
118
+ typeof PluginSpaceUpdateGeometryFromProfileResult
119
+ >
120
+
121
+ /**
122
+ * Available properties that can be queried on a space.
123
+ *
124
+ * **Basic:**
125
+ * | Value | Return Type | Description |
126
+ * |---|---|---|
127
+ * | `"id"` | `string` | Unique space identifier |
128
+ * | `"type"` | `string` | Component type |
129
+ * | `"room_type"` | `string` | Room type classification |
130
+ * | `"name"` | `string` | Display name of the space |
131
+ *
132
+ * **Derived from parametric data:**
133
+ * | Value | Return Type | Description |
134
+ * |---|---|---|
135
+ * | `"area"` | `number` | Bottom face area (from `areas_bottomFace`) |
136
+ * | `"breadth"` | `number` | Breadth dimension |
137
+ * | `"depth"` | `number` | Depth dimension |
138
+ * | `"height"` | `number` | Height dimension |
139
+ * | `"massType"` | `string \| null` | Mass type classification |
140
+ * | `"spaceType"` | `string \| null` | Space type classification (Room, Balcony, etc.) |
141
+ * | `"storey"` | `number \| null` | Story the space belongs to |
142
+ * | `"departmentId"` | `string \| null` | Assigned department ID |
143
+ * | `"departmentName"` | `string` | Assigned department name |
144
+ * | `"departmentColor"` | `string` | Assigned department color (hex/CSS) |
145
+ *
146
+ * **Derived from mesh:**
147
+ * | Value | Return Type | Description |
148
+ * |---|---|---|
149
+ * | `"position"` | {@linkcode Vec3Components} | Local position relative to parent |
150
+ * | `"absolutePosition"` | {@linkcode Vec3Components} | Absolute position in the scene |
151
+ * | `"rotation"` | {@linkcode Vec3Components} | Euler rotation angles (radians) |
152
+ * | `"rotationQuaternion"` | {@linkcode QuatComponents} \| `null` | Quaternion rotation, or `null` if unset |
153
+ *
154
+ * **Derived from brep:**
155
+ * | Value | Return Type | Description |
156
+ * |---|---|---|
157
+ * | `"planPoints"` | {@linkcode Vec3Components}`[]` | Bottom outer profile points in world space with `y = 0` (2D plan). No closing duplicate point. |
158
+ * | `"profile"` | {@linkcode CurveHandle}`[]` | Bottom outer profile curves in world space, as opaque curve handles. Read coordinates via the `core.geom.curve` read API. |
159
+ * | `"innerProfiles"` | {@linkcode CurveHandle}`[][]` | Inner (hole) profile curve loops in world space — one loop per hole, `[]` when the space has none. Each curve is an opaque handle. |
160
+ * | `"innerPlanPoints"` | {@linkcode Vec3Components}`[][]` | Inner (hole) profile points in world space with `y = 0` — one loop per hole, no closing duplicate, `[]` when none. |
161
+ *
162
+ * **Derived from adjacency manager:**
163
+ * | Value | Return Type | Description |
164
+ * |---|---|---|
165
+ * | `"adjacency"` | `{ spaceId: string; value: number }[]` | Adjacency relationships to other spaces. `value`: `2` = Direct (required), `1` = Indirect or physical contact, `-1` = Restricted; `0` (no relationship) entries are filtered out. Empty when adjacency has never been computed — see `program.adjacency.compute`. |
166
+ */
167
+ export const PluginSpaceGetProperty = z.enum([
168
+ // Basic
169
+ "id",
170
+ "type",
171
+ "room_type",
172
+ "name",
173
+ // Derived from parametric data
174
+ "area",
175
+ "breadth",
176
+ "depth",
177
+ "height",
178
+ "massType",
179
+ "spaceType",
180
+ "areaClass",
181
+ "storey",
182
+ "departmentId",
183
+ "departmentName",
184
+ "departmentColor",
185
+ // Derived from mesh
186
+ "position",
187
+ "absolutePosition",
188
+ "rotation",
189
+ "rotationQuaternion",
190
+ // Derived from brep
191
+ "planPoints",
192
+ "profile",
193
+ "innerProfiles",
194
+ "innerPlanPoints",
195
+ // Derived from adjacency manager
196
+ "adjacency",
197
+ ])
198
+
199
+ /**
200
+ * Arguments for `get`.
201
+ *
202
+ * | Property | Type | Description |
203
+ * |---|---|---|
204
+ * | `spaceId` | `string` | The space ID to query |
205
+ * | `properties` | {@linkcode PluginSpaceGetProperty}`[]` | Properties to retrieve |
206
+ */
207
+ export const PluginSpaceGetArgs = z.object({
208
+ spaceId: z.string(),
209
+ properties: z.array(PluginSpaceGetProperty),
210
+ })
211
+
212
+ export type PluginSpaceGetArgs = z.infer<typeof PluginSpaceGetArgs>
213
+
214
+ /**
215
+ * Supported space type values.
216
+ *
217
+ * Mirrors the internal `SpaceType` enum from `spaceType.types.ts`.
218
+ *
219
+ * | Value | Description |
220
+ * |---|---|
221
+ * | `"Room"` | Standard room |
222
+ * | `"Program Block"` | Program/department block |
223
+ * | `"Balcony"` | Balcony space |
224
+ * | `"Road"` | Road |
225
+ * | `"Garden"` | Garden area |
226
+ * | `"Deck"` | Deck |
227
+ * | `"Pool"` | Pool |
228
+ * | `"Walkway"` | Walkway |
229
+ * | `"Envelope"` | Envelope |
230
+ * | `"Parking"` | Parking area |
231
+ */
232
+ export const PluginSpaceType = z.enum([
233
+ "Room",
234
+ "Program Block",
235
+ "Balcony",
236
+ "Road",
237
+ "Garden",
238
+ "Deck",
239
+ "Pool",
240
+ "Walkway",
241
+ "Envelope",
242
+ "Parking",
243
+ ])
244
+ /** The space-type value union (same-name type alias for positional signatures). */
245
+ export type PluginSpaceType = z.infer<typeof PluginSpaceType>
246
+
247
+ /**
248
+ * Area-class classification of a space (mirrors the internal `AreaClass` enum).
249
+ *
250
+ * | Value | Description |
251
+ * |---|---|
252
+ * | `"NET"` | Net (usable) area |
253
+ * | `"GROSS"` | Gross area |
254
+ * | `"EXCLUDED"` | Excluded from area totals |
255
+ */
256
+ export const PluginAreaClass = z.enum(["NET", "GROSS", "EXCLUDED"])
257
+
258
+ /**
259
+ * Result of `get`.
260
+ *
261
+ * A partial object — only the properties that were requested in
262
+ * {@linkcode PluginSpaceGetArgs.properties} will be present.
263
+ */
264
+ export const PluginSpaceGetResult = z
265
+ .object({
266
+ // Basic
267
+ id: z.string(),
268
+ type: z.string(),
269
+ room_type: z.string(),
270
+ name: z.string(),
271
+ // Derived from parametric data
272
+ area: z.number(),
273
+ breadth: z.number(),
274
+ depth: z.number(),
275
+ height: z.number(),
276
+ massType: z.string().nullable(),
277
+ spaceType: PluginSpaceType.nullable(),
278
+ areaClass: PluginAreaClass,
279
+ storey: z.number().nullable(),
280
+ departmentId: z.string().nullable(),
281
+ departmentName: z.string(),
282
+ departmentColor: z.string(),
283
+ // Derived from mesh
284
+ position: Vec3Components,
285
+ absolutePosition: Vec3Components,
286
+ rotation: Vec3Components,
287
+ rotationQuaternion: QuatComponents.nullable(),
288
+ // Derived from brep
289
+ planPoints: z.array(Vec3Components),
290
+ profile: z.array(CurveHandle),
291
+ innerProfiles: z.array(z.array(CurveHandle)),
292
+ innerPlanPoints: z.array(z.array(Vec3Components)),
293
+ // Derived from adjacency manager.
294
+ // value: 2 = Direct (required), 1 = Indirect or physical contact, -1 = Restricted;
295
+ // 0 (no relationship) entries are filtered out. Empty array when adjacency has
296
+ // never been computed — run program.adjacency.compute() first for fresh data.
297
+ adjacency: z.array(z.object({
298
+ spaceId: z.string(),
299
+ value: z.number(),
300
+ })),
301
+ })
302
+ .partial()
303
+
304
+ export type PluginSpaceGetResult = z.infer<typeof PluginSpaceGetResult>
305
+
306
+ /**
307
+ * Result of `getAll`.
308
+ *
309
+ * | Property | Type | Description |
310
+ * |---|---|---|
311
+ * | `spacesIds` | `string[]` | IDs of all spaces in the project |
312
+ */
313
+ export const PluginSpaceGetAllResult = z.object({
314
+ spacesIds: z.array(z.string()),
315
+ })
316
+
317
+ export type PluginSpaceGetAllResult = z.infer<typeof PluginSpaceGetAllResult>
318
+
319
+ /**
320
+ * Arguments for `delete`.
321
+ *
322
+ * | Property | Type | Description |
323
+ * |---|---|---|
324
+ * | `spaceId` | `string` | The space ID to delete |
325
+ */
326
+ export const PluginSpaceDeleteArgs = z.object({
327
+ spaceId: z.string(),
328
+ })
329
+
330
+ export type PluginSpaceDeleteArgs = z.infer<typeof PluginSpaceDeleteArgs>
331
+
332
+ /** Result type for `delete` — returns nothing on success. */
333
+ export type PluginSpaceDeleteResult = void
334
+
335
+ /**
336
+ * Supported mass type values for {@linkcode PluginSpaceUpdateArgs.properties.massType}.
337
+ *
338
+ * Mirrors the internal `MASS_TYPES` enum.
339
+ *
340
+ * | Value | Description |
341
+ * |---|---|
342
+ * | `"Plinth"` | Plinth mass |
343
+ * | `"Void"` | Void/cut-out |
344
+ * | `"Pergola"` | Pergola structure |
345
+ * | `"Furniture"` | Furniture element |
346
+ * | `"Facade element"` | Facade element |
347
+ * | `"Generic mass"` | Generic mass |
348
+ * | `"Room"` | Room (default for spaces) |
349
+ * | `"Department"` | Department block |
350
+ * | `"Building"` | Building envelope |
351
+ * | `"Revit Import"` | Imported from Revit |
352
+ * | `"Mass"` | Generic mass type |
353
+ * | `"Site"` | Site object |
354
+ */
355
+ export const PluginMassType = z.enum([
356
+ "Plinth",
357
+ "Void",
358
+ "Pergola",
359
+ "Furniture",
360
+ "Facade element",
361
+ "Generic mass",
362
+ "Room",
363
+ "Department",
364
+ "Building",
365
+ "Revit Import",
366
+ "Mass",
367
+ "Site",
368
+ ])
369
+ /** The mass-type value union (same-name type alias for positional signatures). */
370
+ export type PluginMassType = z.infer<typeof PluginMassType>
371
+
372
+ /**
373
+ * Well-known (built-in) department IDs.
374
+ *
375
+ * | Value | Department |
376
+ * |---|---|
377
+ * | `"DEFAULT"` | Default department |
378
+ * | `"SITE"` | Site department |
379
+ * | `"ENVELOPE"` | Envelope department |
380
+ * | `"CORE"` | Core department |
381
+ */
382
+ export const PluginWellKnownDepartmentId = z.enum([
383
+ "DEFAULT",
384
+ "SITE",
385
+ "ENVELOPE",
386
+ "CORE",
387
+ ])
388
+
389
+ /**
390
+ * Accepted department ID values — either a {@linkcode PluginWellKnownDepartmentId}
391
+ * or a UUID string for custom (user-created) departments.
392
+ */
393
+ export const PluginDepartmentId = z.union([
394
+ PluginWellKnownDepartmentId,
395
+ z.uuid(),
396
+ ])
397
+ /** The department-id value union (same-name type alias for positional signatures). */
398
+ export type PluginDepartmentId = z.infer<typeof PluginDepartmentId>
399
+
400
+ /**
401
+ * Arguments for `update`.
402
+ *
403
+ * | Property | Type | Description |
404
+ * |---|---|---|
405
+ * | `spaceId` | `string` | The space ID to update |
406
+ * | `properties` | `object` | Key/value pairs of properties to update (all optional) |
407
+ * | `properties.room_type` | `string?` | New room type label |
408
+ * | `properties.massType` | {@linkcode PluginMassType}`?` | New mass type |
409
+ * | `properties.departmentId` | {@linkcode PluginDepartmentId}`?` | New department ID |
410
+ */
411
+ export const PluginSpaceUpdateArgs = z.object({
412
+ spaceId: z.string(),
413
+ properties: z.object({
414
+ room_type: z.string().optional(),
415
+ massType: PluginMassType.optional(),
416
+ spaceType: PluginSpaceType.optional(),
417
+ areaClass: PluginAreaClass.optional(),
418
+ departmentId: PluginDepartmentId.optional(),
419
+ }),
420
+ })
421
+
422
+ export type PluginSpaceUpdateArgs = z.infer<typeof PluginSpaceUpdateArgs>
423
+
424
+ /**
425
+ * Result of `update`.
426
+ *
427
+ * Echoes back the `spaceId` and the values of properties that were updated.
428
+ * Properties that were not included in the update request will be `undefined`.
429
+ *
430
+ * | Property | Type | Description |
431
+ * |---|---|---|
432
+ * | `spaceId` | `string` | The space ID that was updated |
433
+ * | `room_type` | `string?` | Updated room type (if changed) |
434
+ * | `massType` | `string?` | Updated mass type (if changed) |
435
+ * | `spaceType` | `string?` | Updated space type (if changed) |
436
+ * | `departmentId` | `string \| null?` | Updated department ID (if changed) |
437
+ */
438
+ export const PluginSpaceUpdateResult = z.object({
439
+ spaceId: z.string(),
440
+ room_type: z.string().optional(),
441
+ massType: z.string().optional(),
442
+ spaceType: z.string().optional(),
443
+ areaClass: PluginAreaClass.optional(),
444
+ departmentId: z.string().nullable().optional(),
445
+ })
446
+
447
+ export type PluginSpaceUpdateResult = z.infer<typeof PluginSpaceUpdateResult>
448
+
449
+ // ---------------------------------------------------------------------------
450
+ // Bulk operations
451
+ // ---------------------------------------------------------------------------
452
+
453
+ /**
454
+ * A single item for `bulkCreate`.
455
+ *
456
+ * Discriminated on `kind`:
457
+ * - `"rectangular"` — a box defined by `position` + `dimensions` (mirrors
458
+ * {@linkcode PluginSpaceCreateRectangularArgs})
459
+ * - `"profile"` — an extruded `profile` (with optional `innerProfiles`) by
460
+ * `extrudeHeight` at `position` (mirrors {@linkcode PluginSpaceCreateFromProfileArgs})
461
+ *
462
+ * Every item may optionally set `room_type`, `spaceType`, `massType`, and
463
+ * `departmentId`; these are applied within the same single undo step as the
464
+ * creation.
465
+ */
466
+ export const PluginSpaceBulkCreateItem = z.discriminatedUnion("kind", [
467
+ z.object({
468
+ kind: z.literal("rectangular"),
469
+ position: Vec3Handle,
470
+ dimensions: z.object({
471
+ width: z.number(),
472
+ height: z.number(),
473
+ depth: z.number(),
474
+ }),
475
+ room_type: z.string().optional(),
476
+ spaceType: PluginSpaceType.optional(),
477
+ massType: PluginMassType.optional(),
478
+ departmentId: PluginDepartmentId.optional(),
479
+ }),
480
+ z.object({
481
+ kind: z.literal("profile"),
482
+ profile: ProfileHandle,
483
+ innerProfiles: z.array(ProfileHandle).optional(),
484
+ extrudeHeight: z.number(),
485
+ position: Vec3Handle,
486
+ room_type: z.string().optional(),
487
+ spaceType: PluginSpaceType.optional(),
488
+ massType: PluginMassType.optional(),
489
+ departmentId: PluginDepartmentId.optional(),
490
+ }),
491
+ ])
492
+
493
+ export type PluginSpaceBulkCreateItem = z.infer<typeof PluginSpaceBulkCreateItem>
494
+
495
+ /**
496
+ * Arguments for `bulkCreate`.
497
+ *
498
+ * | Property | Type | Description |
499
+ * |---|---|---|
500
+ * | `items` | {@linkcode PluginSpaceBulkCreateItem}`[]` | Spaces to create |
501
+ */
502
+ export const PluginSpaceBulkCreateArgs = z.object({
503
+ items: z.array(PluginSpaceBulkCreateItem),
504
+ })
505
+
506
+ export type PluginSpaceBulkCreateArgs = z.infer<typeof PluginSpaceBulkCreateArgs>
507
+
508
+ /**
509
+ * Result of `bulkCreate`.
510
+ *
511
+ * | Property | Type | Description |
512
+ * |---|---|---|
513
+ * | `spaceIds` | `string[]` | IDs of the created spaces, in input order |
514
+ */
515
+ export const PluginSpaceBulkCreateResult = z.object({
516
+ spaceIds: z.array(z.string()),
517
+ })
518
+
519
+ export type PluginSpaceBulkCreateResult = z.infer<
520
+ typeof PluginSpaceBulkCreateResult
521
+ >
522
+
523
+ /**
524
+ * A single item for `bulkUpdate`.
525
+ *
526
+ * Targets an existing space by `spaceId`. Geometry fields `profile` and
527
+ * `extrudeHeight` must be supplied **together** (mirrors
528
+ * {@linkcode PluginSpaceUpdateGeometryFromProfileArgs}). Property changes are
529
+ * nested under `properties`, mirroring {@linkcode PluginSpaceUpdateArgs}.
530
+ *
531
+ * | Property | Type | Description |
532
+ * |---|---|---|
533
+ * | `spaceId` | `string` | The space to update |
534
+ * | `profile` | {@linkcode ProfileHandle}`?` | New floor shape handle (requires `extrudeHeight`) |
535
+ * | `extrudeHeight` | `number?` | New extrusion height (requires `profile`) |
536
+ * | `properties` | `object?` | Property changes (same shape as {@linkcode PluginSpaceUpdateArgs.properties}) |
537
+ */
538
+ export const PluginSpaceBulkUpdateItem = z.object({
539
+ spaceId: z.string(),
540
+ profile: ProfileHandle.optional(),
541
+ extrudeHeight: z.number().optional(),
542
+ properties: z
543
+ .object({
544
+ room_type: z.string().optional(),
545
+ massType: PluginMassType.optional(),
546
+ spaceType: PluginSpaceType.optional(),
547
+ areaClass: PluginAreaClass.optional(),
548
+ departmentId: PluginDepartmentId.optional(),
549
+ })
550
+ .optional(),
551
+ })
552
+
553
+ export type PluginSpaceBulkUpdateItem = z.infer<typeof PluginSpaceBulkUpdateItem>
554
+
555
+ /**
556
+ * Arguments for `bulkUpdate`.
557
+ *
558
+ * | Property | Type | Description |
559
+ * |---|---|---|
560
+ * | `items` | {@linkcode PluginSpaceBulkUpdateItem}`[]` | Spaces to update |
561
+ */
562
+ export const PluginSpaceBulkUpdateArgs = z.object({
563
+ items: z.array(PluginSpaceBulkUpdateItem),
564
+ })
565
+
566
+ export type PluginSpaceBulkUpdateArgs = z.infer<typeof PluginSpaceBulkUpdateArgs>
567
+
568
+ /**
569
+ * Result of `bulkUpdate`.
570
+ *
571
+ * Echoes one {@linkcode PluginSpaceUpdateResult} per item, in input order —
572
+ * the same per-space shape returned by `update`.
573
+ *
574
+ * | Property | Type | Description |
575
+ * |---|---|---|
576
+ * | `spaces` | {@linkcode PluginSpaceUpdateResult}`[]` | Per-item updated values, in input order |
577
+ */
578
+ export const PluginSpaceBulkUpdateResult = z.object({
579
+ spaces: z.array(PluginSpaceUpdateResult),
580
+ })
581
+
582
+ export type PluginSpaceBulkUpdateResult = z.infer<
583
+ typeof PluginSpaceBulkUpdateResult
584
+ >
585
+
586
+ /**
587
+ * Arguments for `bulkDelete`.
588
+ *
589
+ * | Property | Type | Description |
590
+ * |---|---|---|
591
+ * | `spaceIds` | `string[]` | The space IDs to delete |
592
+ */
593
+ export const PluginSpaceBulkDeleteArgs = z.object({
594
+ spaceIds: z.array(z.string()),
595
+ })
596
+
597
+ export type PluginSpaceBulkDeleteArgs = z.infer<typeof PluginSpaceBulkDeleteArgs>
598
+
599
+ /**
600
+ * Result of `bulkDelete`.
601
+ *
602
+ * | Property | Type | Description |
603
+ * |---|---|---|
604
+ * | `deletedSpaceIds` | `string[]` | The space IDs that were removed |
605
+ */
606
+ export const PluginSpaceBulkDeleteResult = z.object({
607
+ deletedSpaceIds: z.array(z.string()),
608
+ })
609
+
610
+ export type PluginSpaceBulkDeleteResult = z.infer<
611
+ typeof PluginSpaceBulkDeleteResult
612
+ >