@snaptrude/plugin-core 0.9.17 → 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 (219) hide show
  1. package/AGENTS.md +231 -231
  2. package/CHANGELOG.md +408 -408
  3. package/CLAUDE.md +11 -11
  4. package/api-manifest.json +1428 -712
  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 +32 -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/shapes.d.ts +2 -2
  65. package/dist/api/presentation/sheets.d.ts +175 -19
  66. package/dist/api/presentation/sheets.d.ts.map +1 -1
  67. package/dist/api/presentation/viewPresets.d.ts +222 -0
  68. package/dist/api/presentation/viewPresets.d.ts.map +1 -0
  69. package/dist/api/presentation/views.d.ts +141 -8
  70. package/dist/api/presentation/views.d.ts.map +1 -1
  71. package/dist/api/presentation/walkthroughs.d.ts +6 -6
  72. package/dist/errors/codes.d.ts +3 -1
  73. package/dist/errors/codes.d.ts.map +1 -1
  74. package/dist/index.cjs +3831 -2444
  75. package/dist/index.cjs.map +1 -1
  76. package/dist/index.js +3705 -2444
  77. package/dist/index.js.map +1 -1
  78. package/package.json +1 -1
  79. package/scripts/check-dist-fresh.mjs +22 -22
  80. package/scripts/generate-manifest.mjs +243 -238
  81. package/scripts/generate-manifest.test.mjs +303 -303
  82. package/src/api/analysis/daylight.ts +470 -470
  83. package/src/api/analysis/heatmaps.ts +683 -683
  84. package/src/api/analysis/illuminance.ts +155 -155
  85. package/src/api/analysis/index.ts +61 -61
  86. package/src/api/analysis/shadows.ts +183 -183
  87. package/src/api/analysis/solar.ts +237 -237
  88. package/src/api/analysis/sunlightHours.ts +211 -211
  89. package/src/api/analysis/sunpath.ts +83 -83
  90. package/src/api/analysis/weather.ts +179 -179
  91. package/src/api/core/buildings.ts +485 -485
  92. package/src/api/core/camera/index.ts +696 -667
  93. package/src/api/core/comment/index.ts +376 -376
  94. package/src/api/core/geom/create/index.ts +2139 -2133
  95. package/src/api/core/geom/delete/index.ts +84 -84
  96. package/src/api/core/geom/index.ts +35 -35
  97. package/src/api/core/geom/query/arc.ts +169 -169
  98. package/src/api/core/geom/query/brep.ts +621 -621
  99. package/src/api/core/geom/query/circle.ts +404 -404
  100. package/src/api/core/geom/query/contour.ts +540 -540
  101. package/src/api/core/geom/query/curve.ts +1102 -1102
  102. package/src/api/core/geom/query/edge.ts +130 -130
  103. package/src/api/core/geom/query/face.ts +508 -508
  104. package/src/api/core/geom/query/halfedge.ts +210 -210
  105. package/src/api/core/geom/query/index.ts +63 -63
  106. package/src/api/core/geom/query/profile.ts +473 -473
  107. package/src/api/core/geom/query/vertex.ts +205 -205
  108. package/src/api/core/geom/update/contour.ts +323 -317
  109. package/src/api/core/geom/update/curve.ts +209 -209
  110. package/src/api/core/geom/update/index.ts +29 -29
  111. package/src/api/core/geom/update/profile.ts +379 -379
  112. package/src/api/core/groups.ts +521 -521
  113. package/src/api/core/handles/index.ts +234 -234
  114. package/src/api/core/history/index.ts +84 -84
  115. package/src/api/core/index.ts +99 -99
  116. package/src/api/core/io/export/index.ts +126 -126
  117. package/src/api/core/io/import/index.ts +504 -504
  118. package/src/api/core/io/index.ts +42 -42
  119. package/src/api/core/io/job/index.ts +140 -140
  120. package/src/api/core/io/query/index.ts +71 -71
  121. package/src/api/core/io/terrain/index.ts +360 -360
  122. package/src/api/core/io/underlay/index.ts +705 -705
  123. package/src/api/core/layers.ts +540 -540
  124. package/src/api/core/math/index.ts +20 -20
  125. package/src/api/core/math/quat.ts +172 -172
  126. package/src/api/core/math/vec3.ts +179 -179
  127. package/src/api/core/mode/index.ts +108 -108
  128. package/src/api/core/project/index.ts +479 -479
  129. package/src/api/core/proposals/index.ts +570 -570
  130. package/src/api/core/storeys/index.ts +311 -308
  131. package/src/api/core/storeys/layers.ts +339 -339
  132. package/src/api/core/tags.ts +911 -911
  133. package/src/api/core/units/index.ts +164 -164
  134. package/src/api/core/user.ts +46 -46
  135. package/src/api/core/zoom/index.ts +64 -51
  136. package/src/api/design/bim.ts +210 -0
  137. package/src/api/design/boolean/index.ts +181 -179
  138. package/src/api/design/catalog.ts +203 -0
  139. package/src/api/design/create/bulk-items.ts +294 -254
  140. package/src/api/design/create/grids.ts +137 -137
  141. package/src/api/design/create/index.ts +2178 -1980
  142. package/src/api/design/create/opening-fields.ts +40 -37
  143. package/src/api/design/delete/index.ts +75 -74
  144. package/src/api/design/dimensions.ts +453 -453
  145. package/src/api/design/doors/index.ts +516 -500
  146. package/src/api/design/edit/index.ts +54 -54
  147. package/src/api/design/erase/index.ts +151 -151
  148. package/src/api/design/family.ts +1342 -704
  149. package/src/api/design/furniture/index.ts +319 -319
  150. package/src/api/design/grids.ts +237 -237
  151. package/src/api/design/index.ts +304 -274
  152. package/src/api/design/lock.ts +69 -69
  153. package/src/api/design/materials/index.ts +608 -608
  154. package/src/api/design/networks.ts +607 -0
  155. package/src/api/design/query/geometry/index.ts +319 -319
  156. package/src/api/design/query/grids.ts +197 -197
  157. package/src/api/design/query/index.ts +1236 -1226
  158. package/src/api/design/query/referenceLines.ts +52 -52
  159. package/src/api/design/query/spaces.ts +275 -275
  160. package/src/api/design/selection/index.ts +273 -273
  161. package/src/api/design/shared.ts +40 -40
  162. package/src/api/design/transform/index.ts +254 -254
  163. package/src/api/design/types/index.ts +163 -156
  164. package/src/api/design/update/index.ts +1096 -983
  165. package/src/api/design/visibility.ts +143 -143
  166. package/src/api/design/windows/index.ts +351 -333
  167. package/src/api/entity/buildableEnvelope.ts +397 -322
  168. package/src/api/entity/index.ts +30 -30
  169. package/src/api/entity/referenceLine.ts +235 -235
  170. package/src/api/entity/space.ts +612 -612
  171. package/src/api/entity/story.ts +517 -517
  172. package/src/api/index.ts +47 -47
  173. package/src/api/presentation/aiInspiration.ts +1116 -1116
  174. package/src/api/presentation/annotate.ts +417 -385
  175. package/src/api/presentation/camera.ts +289 -289
  176. package/src/api/presentation/diagrams.ts +194 -194
  177. package/src/api/presentation/drawingContract.ts +70 -0
  178. package/src/api/presentation/drawings.ts +1179 -0
  179. package/src/api/presentation/export.ts +134 -108
  180. package/src/api/presentation/import.ts +159 -159
  181. package/src/api/presentation/index.ts +160 -135
  182. package/src/api/presentation/placedViews.ts +1211 -1120
  183. package/src/api/presentation/sections.ts +420 -420
  184. package/src/api/presentation/shapes.ts +274 -274
  185. package/src/api/presentation/sheets.ts +746 -585
  186. package/src/api/presentation/slideshow.ts +134 -134
  187. package/src/api/presentation/tables.ts +84 -84
  188. package/src/api/presentation/viewPresets.ts +241 -0
  189. package/src/api/presentation/views.ts +742 -673
  190. package/src/api/presentation/walkthroughs.ts +1201 -1201
  191. package/src/api/program/adjacency.ts +164 -164
  192. package/src/api/program/areas.ts +408 -408
  193. package/src/api/program/classification.ts +138 -138
  194. package/src/api/program/cores.ts +83 -83
  195. package/src/api/program/departments.ts +517 -517
  196. package/src/api/program/index.ts +73 -73
  197. package/src/api/program/labels.ts +332 -332
  198. package/src/api/program/layout.ts +422 -422
  199. package/src/api/program/metadata.ts +364 -364
  200. package/src/api/program/metrics.ts +120 -120
  201. package/src/api/program/site.ts +748 -748
  202. package/src/api/program/spreadsheet.ts +2698 -2698
  203. package/src/api/workspace/index.ts +612 -612
  204. package/src/errors/codes.ts +143 -136
  205. package/src/errors/envelope.ts +75 -75
  206. package/src/errors/index.ts +21 -21
  207. package/src/errors/plugin-error.ts +134 -134
  208. package/src/handles.ts +297 -297
  209. package/src/host-utils.ts +67 -67
  210. package/src/index.ts +7 -7
  211. package/src/massParameters.ops.ts +246 -246
  212. package/src/massParameters.ts +427 -427
  213. package/src/types.ts +16 -16
  214. package/test/drawingContract.test.mjs +288 -0
  215. package/test/errors.test.mjs +185 -184
  216. package/test/massParameters.test.mjs +952 -952
  217. package/test/presentationViewSettings.test.mjs +85 -0
  218. package/tsconfig.json +22 -22
  219. package/tsup.config.ts +12 -12
@@ -1,517 +1,517 @@
1
- import * as z from "zod"
2
- import { PluginApiReturn } from "../../types"
3
- import { PluginAreaUnit } from "./metrics"
4
- import { ComponentHandle } from "../../handles"
5
-
6
- /**
7
- * Program departments — read the department groupings of the active program.
8
- *
9
- * In program mode a **department** is a named, colored grouping of spaces with an
10
- * optional gross area **target** and a unit **count** target. This is the program-planning view of departments
11
- * (their identity, color, and target area); the underlying space geometry is read
12
- * and edited through the geometry namespaces, not here.
13
- *
14
- * All methods are reads: they return plain records and never throw for a missing
15
- * department (`get` returns `null`, `list` returns `[]`).
16
- *
17
- * Accessed via `snaptrude.program.departments`.
18
- */
19
- export abstract class PluginProgramDepartmentsApi {
20
- constructor() {}
21
-
22
- /**
23
- * List the departments in the active program.
24
- *
25
- * Returns every department — well-known (Default, Site, …) and user-created —
26
- * with its identity, color, and area target (when one has been set).
27
- *
28
- * @returns A {@linkcode PluginProgramDepartmentsListResult} with a `departments`
29
- * array (empty when the project has none).
30
- *
31
- * @examplePrompt List all the departments in my program
32
- * @examplePrompt What program groups do I have and what are their target areas?
33
- * @examplePrompt Show every department with its colour
34
- * @examplePrompt Get the area target for each department
35
- * @examplePrompt How many departments are in this project?
36
- *
37
- * # Example
38
- * ```ts
39
- * const { units, departments } = await snaptrude.program.departments.list()
40
- * for (const d of departments) console.log(d.name, d.color, d.targetArea, units)
41
- * ```
42
- */
43
- public abstract list(): PluginApiReturn<PluginProgramDepartmentsListResult>
44
-
45
- /**
46
- * Get a single department by id.
47
- *
48
- * @param departmentId - The id of the department to read.
49
- * @returns The matching {@linkcode PluginProgramDepartment}, or `null` if no
50
- * department has that id.
51
- *
52
- * @examplePrompt Get the department with id dep_123
53
- * @examplePrompt Look up a single department by its id
54
- * @examplePrompt What is the target area of this department id?
55
- *
56
- * # Example
57
- * ```ts
58
- * const dept = await snaptrude.program.departments.get("dep_123")
59
- * if (dept) console.log(dept.name, dept.targetArea)
60
- * ```
61
- */
62
- public abstract get(
63
- departmentId: string,
64
- ): PluginApiReturn<PluginProgramDepartmentsGetResult>
65
-
66
- /**
67
- * Create a new department in the active program.
68
- *
69
- * Adds a named, colored program grouping. The new department starts empty —
70
- * put spaces in it with {@linkcode PluginProgramDepartmentsApi.assign}, and set
71
- * its area goal with {@linkcode PluginProgramDepartmentsApi.setTargetArea}.
72
- *
73
- * @param name - Display name of the new department.
74
- * @param color - CSS hex color string (e.g. `"#b5e1dc"`).
75
- * @returns The new department's id (read the full record back with
76
- * {@linkcode PluginProgramDepartmentsApi.get}).
77
- * @throws If the department could not be created.
78
- *
79
- * @examplePrompt Create a department called Bedrooms in light blue
80
- * @examplePrompt Add a new program group named Circulation with color #cccccc
81
- * @examplePrompt Make a Classrooms department
82
- * @examplePrompt Set up a Lobby department in the program
83
- *
84
- * # Example
85
- * ```ts
86
- * const { departmentId } = await snaptrude.program.departments.create("Bedrooms", "#b5e1dc")
87
- * ```
88
- */
89
- public abstract create(
90
- name: string,
91
- color: string,
92
- ): PluginApiReturn<PluginProgramDepartmentsCreateResult>
93
-
94
- /**
95
- * Update a department's name and/or color.
96
- *
97
- * A **sparse** update: omitted fields are left unchanged. Use
98
- * {@linkcode PluginProgramDepartmentsApi.setTargetArea} to change the area
99
- * target (not this method).
100
- *
101
- * @param departmentId - The id of the department to update.
102
- * @param options - Any of `name`, `color`; omitted fields are left unchanged.
103
- * @returns The updated {@linkcode PluginProgramDepartment} (with the response
104
- * `units` for its `targetArea`).
105
- * @throws If no department has the given id.
106
- *
107
- * @examplePrompt Rename the Bedrooms department to Suites
108
- * @examplePrompt Change the Circulation department colour to #ff8800
109
- * @examplePrompt Recolour department dep_123
110
- * @examplePrompt Update the Lobby department's display name
111
- *
112
- * # Example
113
- * ```ts
114
- * const dept = await snaptrude.program.departments.update("dep_123", { name: "Suites" })
115
- * ```
116
- */
117
- public abstract update(
118
- departmentId: string,
119
- options?: { name?: string; color?: string },
120
- ): PluginApiReturn<PluginProgramDepartmentsUpdateResult>
121
-
122
- /**
123
- * Assign one or more spaces to a department.
124
- *
125
- * Moves each space into the given department — an undoable membership change.
126
- * A space belongs to exactly one department, so assigning re-homes it from any
127
- * previous one. Paired with {@linkcode PluginProgramDepartmentsApi.unassign}.
128
- *
129
- * @param departmentId - The department to assign the spaces to.
130
- * @param spaceIds - The ids of the spaces to move into the department (at
131
- * least one).
132
- * @returns The department and the space ids that were assigned.
133
- * @throws If the department does not exist or a space id is invalid.
134
- *
135
- * @examplePrompt Assign the selected rooms to the Bedrooms department
136
- * @examplePrompt Put spaces 12 and 13 in the Circulation department
137
- * @examplePrompt Move this space into the Lobby department
138
- * @examplePrompt Add the kitchen spaces to the Service department
139
- *
140
- * # Example
141
- * ```ts
142
- * await snaptrude.program.departments.assign("dep_123", ["sp_1", "sp_2"])
143
- * ```
144
- */
145
- public abstract assign(
146
- departmentId: string,
147
- spaceIds: ComponentHandle[],
148
- ): PluginApiReturn<PluginProgramDepartmentsAssignResult>
149
-
150
- /**
151
- * Remove one or more spaces from their department.
152
- *
153
- * Returns each space to the **Default** department — there is no "no
154
- * department" state, so unassigning means reassigning to Default. Paired with
155
- * {@linkcode PluginProgramDepartmentsApi.assign}.
156
- *
157
- * @param spaceIds - The ids of the spaces to remove from their current
158
- * department (at least one).
159
- * @returns The space ids that were returned to Default.
160
- * @throws If a space id is invalid.
161
- *
162
- * @examplePrompt Remove the selected rooms from their department
163
- * @examplePrompt Unassign space sp_1 from any department
164
- * @examplePrompt Clear the department on these spaces
165
- * @examplePrompt Take the kitchen out of the Service department
166
- *
167
- * # Example
168
- * ```ts
169
- * await snaptrude.program.departments.unassign(["sp_1"])
170
- * ```
171
- */
172
- public abstract unassign(
173
- spaceIds: ComponentHandle[],
174
- ): PluginApiReturn<PluginProgramDepartmentsUnassignResult>
175
-
176
- /**
177
- * Set a department's target area.
178
- *
179
- * The goal the program metrics compare allocated area against (see
180
- * {@linkcode PluginProgramMetricsApi}). Pass `units` to say what unit
181
- * `targetArea` is in; it defaults to the project's area units. Read the target
182
- * back from {@linkcode PluginProgramDepartmentsApi.get} (`targetArea`).
183
- *
184
- * @param departmentId - The id of the department whose target to set.
185
- * @param targetArea - The target area, in `units`.
186
- * @param units - Unit of `targetArea` (defaults to the project's area units).
187
- * @returns The updated {@linkcode PluginProgramDepartment} with its `units`.
188
- * @throws If no department has the given id.
189
- *
190
- * @examplePrompt Set the Bedrooms department target area to 2000 sqft
191
- * @examplePrompt Give the Circulation department a 500 sqm area target
192
- * @examplePrompt Target 1500 square feet for the Classrooms department
193
- * @examplePrompt Update the area goal for department dep_123
194
- *
195
- * # Example
196
- * ```ts
197
- * await snaptrude.program.departments.setTargetArea("dep_123", 2000, "ft2")
198
- * ```
199
- */
200
- public abstract setTargetArea(
201
- departmentId: string,
202
- targetArea: number,
203
- units?: PluginAreaUnit,
204
- ): PluginApiReturn<PluginProgramDepartmentsSetTargetAreaResult>
205
-
206
- /**
207
- * Set a department's target unit count.
208
- *
209
- * The number of units (program blocks) the department is planned for — the
210
- * count twin of {@linkcode PluginProgramDepartmentsApi.setTargetArea}, stored
211
- * beside the gross area target on the department. Read it back from
212
- * {@linkcode PluginProgramDepartmentsApi.get} (`targetCount`).
213
- *
214
- * @param departmentId - The id of the department whose count to set.
215
- * @param targetCount - The target number of units (a non-negative integer).
216
- * @returns The updated {@linkcode PluginProgramDepartment} with its `units`.
217
- * @throws If no department has the given id.
218
- *
219
- * @examplePrompt Set the Bedrooms department unit count to 12
220
- * @examplePrompt The program needs 4 clinic blocks — update the department count
221
- * @examplePrompt Update the target count for department dep_123
222
- *
223
- * # Example
224
- * ```ts
225
- * await snaptrude.program.departments.setTargetCount("dep_123", 12)
226
- * ```
227
- */
228
- public abstract setTargetCount(
229
- departmentId: string,
230
- targetCount: number,
231
- ): PluginApiReturn<PluginProgramDepartmentsSetTargetCountResult>
232
-
233
- /**
234
- * Delete a department.
235
- *
236
- * Any spaces still assigned to it are returned to the **Default** department
237
- * (no space is left orphaned). The reserved departments (Default, Site,
238
- * Envelope, Core) cannot be deleted.
239
- *
240
- * @param departmentId - The id of the department to delete.
241
- * @returns The id of the deleted department and the spaces that were reassigned
242
- * to Default.
243
- * @throws If no department has the given id, or it is a reserved department.
244
- *
245
- * @examplePrompt Delete the Bedrooms department
246
- * @examplePrompt Remove the empty Circulation department
247
- * @examplePrompt Delete department dep_123 and move its rooms to Default
248
- *
249
- * # Example
250
- * ```ts
251
- * await snaptrude.program.departments.delete("dep_123")
252
- * ```
253
- */
254
- public delete?: (
255
- departmentId: string,
256
- ) => PluginApiReturn<PluginProgramDepartmentsDeleteResult>
257
- }
258
-
259
- /**
260
- * A department in the active program. Its `targetArea` is in the enclosing
261
- * response's `units` (see the area-units convention in
262
- * {@linkcode PluginAreaUnit}).
263
- *
264
- * | Property | Type | Description |
265
- * |---|---|---|
266
- * | `id` | `string` | Unique department id |
267
- * | `name` | `string` | Display name |
268
- * | `color` | `string` | CSS hex color string (e.g. `"#b5e1dc"`) |
269
- * | `targetArea` | `number \| null` | Gross target area in the response's `units`, or `null` if no target is set |
270
- * | `targetCount` | `number` | Target number of units / program blocks (`0` when unset) |
271
- */
272
- export const PluginProgramDepartment = z.object({
273
- id: z.string(),
274
- name: z.string(),
275
- color: z.string(),
276
- targetArea: z.number().nullable(),
277
- targetCount: z.number(),
278
- })
279
- export type PluginProgramDepartment = z.infer<typeof PluginProgramDepartment>
280
-
281
- /**
282
- * Result of {@linkcode PluginProgramDepartmentsApi.list}. Per the area-units
283
- * convention, `units` sits on this response envelope (not on each record).
284
- *
285
- * | Property | Type | Description |
286
- * |---|---|---|
287
- * | `units` | `"ft2" \| "m2"` | The unit every `targetArea` below is reported in |
288
- * | `departments` | {@linkcode PluginProgramDepartment}`[]` | All departments in the active program |
289
- */
290
- export const PluginProgramDepartmentsListResult = z.object({
291
- units: PluginAreaUnit,
292
- departments: z.array(PluginProgramDepartment),
293
- })
294
- export type PluginProgramDepartmentsListResult = z.infer<
295
- typeof PluginProgramDepartmentsListResult
296
- >
297
-
298
- /**
299
- * Arguments for {@linkcode PluginProgramDepartmentsApi.get}.
300
- *
301
- * | Property | Type | Description |
302
- * |---|---|---|
303
- * | `departmentId` | `string` | The id of the department to read |
304
- */
305
- export const PluginProgramDepartmentsGetArgs = z.object({
306
- departmentId: z.string(),
307
- })
308
- export type PluginProgramDepartmentsGetArgs = z.infer<
309
- typeof PluginProgramDepartmentsGetArgs
310
- >
311
-
312
- /**
313
- * Result of {@linkcode PluginProgramDepartmentsApi.get} — the department, or
314
- * `null` when no department has the given id. This is a bare `.get` record, so
315
- * per the area-units convention `units` is carried on the record itself.
316
- */
317
- export const PluginProgramDepartmentsGetResult = PluginProgramDepartment.extend(
318
- {
319
- units: PluginAreaUnit,
320
- },
321
- ).nullable()
322
- export type PluginProgramDepartmentsGetResult = z.infer<
323
- typeof PluginProgramDepartmentsGetResult
324
- >
325
-
326
- /**
327
- * A department record with its area `units` — the shape returned by the
328
- * single-record department writes (`update`, `setTargetArea`). Per the
329
- * area-units convention, a bare record carries `units` on itself.
330
- */
331
- export const PluginProgramDepartmentRecord = PluginProgramDepartment.extend({
332
- units: PluginAreaUnit,
333
- })
334
- export type PluginProgramDepartmentRecord = z.infer<
335
- typeof PluginProgramDepartmentRecord
336
- >
337
-
338
- /**
339
- * Arguments for {@linkcode PluginProgramDepartmentsApi.create}.
340
- *
341
- * | Property | Type | Description |
342
- * |---|---|---|
343
- * | `name` | `string` | Display name of the new department |
344
- * | `color` | `string` | CSS hex color string (e.g. `"#b5e1dc"`) |
345
- */
346
- export const PluginProgramDepartmentsCreateArgs = z.object({
347
- name: z.string(),
348
- color: z.string(),
349
- })
350
- export type PluginProgramDepartmentsCreateArgs = z.infer<
351
- typeof PluginProgramDepartmentsCreateArgs
352
- >
353
-
354
- /**
355
- * Result of {@linkcode PluginProgramDepartmentsApi.create} — the id of the
356
- * newly created department.
357
- */
358
- export const PluginProgramDepartmentsCreateResult = z.object({
359
- departmentId: z.string(),
360
- })
361
- export type PluginProgramDepartmentsCreateResult = z.infer<
362
- typeof PluginProgramDepartmentsCreateResult
363
- >
364
-
365
- /**
366
- * Arguments for {@linkcode PluginProgramDepartmentsApi.update}. Sparse — only
367
- * the provided fields are changed.
368
- *
369
- * | Property | Type | Description |
370
- * |---|---|---|
371
- * | `departmentId` | `string` | The id of the department to update |
372
- * | `name` | `string \| undefined` | New display name (unchanged if omitted) |
373
- * | `color` | `string \| undefined` | New CSS hex color (unchanged if omitted) |
374
- */
375
- export const PluginProgramDepartmentsUpdateArgs = z.object({
376
- departmentId: z.string(),
377
- name: z.string().optional(),
378
- color: z.string().optional(),
379
- })
380
- export type PluginProgramDepartmentsUpdateArgs = z.infer<
381
- typeof PluginProgramDepartmentsUpdateArgs
382
- >
383
-
384
- /** Result of {@linkcode PluginProgramDepartmentsApi.update} — the updated record. */
385
- export const PluginProgramDepartmentsUpdateResult =
386
- PluginProgramDepartmentRecord
387
- export type PluginProgramDepartmentsUpdateResult = z.infer<
388
- typeof PluginProgramDepartmentsUpdateResult
389
- >
390
-
391
- /**
392
- * Arguments for {@linkcode PluginProgramDepartmentsApi.assign}.
393
- *
394
- * | Property | Type | Description |
395
- * |---|---|---|
396
- * | `departmentId` | `string` | The department to assign the spaces to |
397
- * | `spaceIds` | `ComponentHandle[]` | The ids of the spaces to move into the department |
398
- */
399
- export const PluginProgramDepartmentsAssignArgs = z.object({
400
- departmentId: z.string(),
401
- spaceIds: z.array(ComponentHandle).min(1),
402
- })
403
- export type PluginProgramDepartmentsAssignArgs = z.infer<
404
- typeof PluginProgramDepartmentsAssignArgs
405
- >
406
-
407
- /** Result of {@linkcode PluginProgramDepartmentsApi.assign}. */
408
- export const PluginProgramDepartmentsAssignResult = z.object({
409
- departmentId: z.string(),
410
- spaceIds: z.array(ComponentHandle),
411
- })
412
- export type PluginProgramDepartmentsAssignResult = z.infer<
413
- typeof PluginProgramDepartmentsAssignResult
414
- >
415
-
416
- /**
417
- * Arguments for {@linkcode PluginProgramDepartmentsApi.unassign}.
418
- *
419
- * | Property | Type | Description |
420
- * |---|---|---|
421
- * | `spaceIds` | `ComponentHandle[]` | The ids of the spaces to return to the Default department |
422
- */
423
- export const PluginProgramDepartmentsUnassignArgs = z.object({
424
- spaceIds: z.array(ComponentHandle).min(1),
425
- })
426
- export type PluginProgramDepartmentsUnassignArgs = z.infer<
427
- typeof PluginProgramDepartmentsUnassignArgs
428
- >
429
-
430
- /** Result of {@linkcode PluginProgramDepartmentsApi.unassign}. */
431
- export const PluginProgramDepartmentsUnassignResult = z.object({
432
- spaceIds: z.array(ComponentHandle),
433
- })
434
- export type PluginProgramDepartmentsUnassignResult = z.infer<
435
- typeof PluginProgramDepartmentsUnassignResult
436
- >
437
-
438
- /**
439
- * Arguments for {@linkcode PluginProgramDepartmentsApi.setTargetArea}.
440
- *
441
- * | Property | Type | Description |
442
- * |---|---|---|
443
- * | `departmentId` | `string` | The id of the department whose target to set |
444
- * | `targetArea` | `number` | The target area, in `units` |
445
- * | `units` | `"ft2" \| "m2" \| undefined` | Unit of `targetArea` (defaults to the project's area units) |
446
- */
447
- export const PluginProgramDepartmentsSetTargetAreaArgs = z.object({
448
- departmentId: z.string(),
449
- targetArea: z.number(),
450
- units: PluginAreaUnit.optional(),
451
- })
452
- export type PluginProgramDepartmentsSetTargetAreaArgs = z.infer<
453
- typeof PluginProgramDepartmentsSetTargetAreaArgs
454
- >
455
-
456
- /**
457
- * Result of {@linkcode PluginProgramDepartmentsApi.setTargetArea} — the updated
458
- * department record with its `units`.
459
- */
460
- export const PluginProgramDepartmentsSetTargetAreaResult =
461
- PluginProgramDepartmentRecord
462
- export type PluginProgramDepartmentsSetTargetAreaResult = z.infer<
463
- typeof PluginProgramDepartmentsSetTargetAreaResult
464
- >
465
-
466
- /**
467
- * Arguments for {@linkcode PluginProgramDepartmentsApi.setTargetCount}.
468
- *
469
- * | Property | Type | Description |
470
- * |---|---|---|
471
- * | `departmentId` | `string` | The id of the department whose count to set |
472
- * | `targetCount` | `number` | Target number of units (non-negative integer) |
473
- */
474
- export const PluginProgramDepartmentsSetTargetCountArgs = z.object({
475
- departmentId: z.string(),
476
- targetCount: z.number().int().nonnegative(),
477
- })
478
- export type PluginProgramDepartmentsSetTargetCountArgs = z.infer<
479
- typeof PluginProgramDepartmentsSetTargetCountArgs
480
- >
481
-
482
- /** Result of {@linkcode PluginProgramDepartmentsApi.setTargetCount} — the updated record with `units`. */
483
- export const PluginProgramDepartmentsSetTargetCountResult =
484
- PluginProgramDepartmentRecord
485
- export type PluginProgramDepartmentsSetTargetCountResult = z.infer<
486
- typeof PluginProgramDepartmentsSetTargetCountResult
487
- >
488
-
489
- /**
490
- * Arguments for {@linkcode PluginProgramDepartmentsApi.delete}.
491
- *
492
- * | Property | Type | Description |
493
- * |---|---|---|
494
- * | `departmentId` | `string` | The id of the department to delete |
495
- */
496
- export const PluginProgramDepartmentsDeleteArgs = z.object({
497
- departmentId: z.string(),
498
- })
499
- export type PluginProgramDepartmentsDeleteArgs = z.infer<
500
- typeof PluginProgramDepartmentsDeleteArgs
501
- >
502
-
503
- /**
504
- * Result of {@linkcode PluginProgramDepartmentsApi.delete}.
505
- *
506
- * | Property | Type | Description |
507
- * |---|---|---|
508
- * | `departmentId` | `string` | The id of the deleted department |
509
- * | `reassignedSpaceIds` | `ComponentHandle[]` | Spaces that were returned to the Default department |
510
- */
511
- export const PluginProgramDepartmentsDeleteResult = z.object({
512
- departmentId: z.string(),
513
- reassignedSpaceIds: z.array(ComponentHandle),
514
- })
515
- export type PluginProgramDepartmentsDeleteResult = z.infer<
516
- typeof PluginProgramDepartmentsDeleteResult
517
- >
1
+ import * as z from "zod"
2
+ import { PluginApiReturn } from "../../types"
3
+ import { PluginAreaUnit } from "./metrics"
4
+ import { ComponentHandle } from "../../handles"
5
+
6
+ /**
7
+ * Program departments — read the department groupings of the active program.
8
+ *
9
+ * In program mode a **department** is a named, colored grouping of spaces with an
10
+ * optional gross area **target** and a unit **count** target. This is the program-planning view of departments
11
+ * (their identity, color, and target area); the underlying space geometry is read
12
+ * and edited through the geometry namespaces, not here.
13
+ *
14
+ * All methods are reads: they return plain records and never throw for a missing
15
+ * department (`get` returns `null`, `list` returns `[]`).
16
+ *
17
+ * Accessed via `snaptrude.program.departments`.
18
+ */
19
+ export abstract class PluginProgramDepartmentsApi {
20
+ constructor() {}
21
+
22
+ /**
23
+ * List the departments in the active program.
24
+ *
25
+ * Returns every department — well-known (Default, Site, …) and user-created —
26
+ * with its identity, color, and area target (when one has been set).
27
+ *
28
+ * @returns A {@linkcode PluginProgramDepartmentsListResult} with a `departments`
29
+ * array (empty when the project has none).
30
+ *
31
+ * @examplePrompt List all the departments in my program
32
+ * @examplePrompt What program groups do I have and what are their target areas?
33
+ * @examplePrompt Show every department with its colour
34
+ * @examplePrompt Get the area target for each department
35
+ * @examplePrompt How many departments are in this project?
36
+ *
37
+ * # Example
38
+ * ```ts
39
+ * const { units, departments } = await snaptrude.program.departments.list()
40
+ * for (const d of departments) console.log(d.name, d.color, d.targetArea, units)
41
+ * ```
42
+ */
43
+ public abstract list(): PluginApiReturn<PluginProgramDepartmentsListResult>
44
+
45
+ /**
46
+ * Get a single department by id.
47
+ *
48
+ * @param departmentId - The id of the department to read.
49
+ * @returns The matching {@linkcode PluginProgramDepartment}, or `null` if no
50
+ * department has that id.
51
+ *
52
+ * @examplePrompt Get the department with id dep_123
53
+ * @examplePrompt Look up a single department by its id
54
+ * @examplePrompt What is the target area of this department id?
55
+ *
56
+ * # Example
57
+ * ```ts
58
+ * const dept = await snaptrude.program.departments.get("dep_123")
59
+ * if (dept) console.log(dept.name, dept.targetArea)
60
+ * ```
61
+ */
62
+ public abstract get(
63
+ departmentId: string,
64
+ ): PluginApiReturn<PluginProgramDepartmentsGetResult>
65
+
66
+ /**
67
+ * Create a new department in the active program.
68
+ *
69
+ * Adds a named, colored program grouping. The new department starts empty —
70
+ * put spaces in it with {@linkcode PluginProgramDepartmentsApi.assign}, and set
71
+ * its area goal with {@linkcode PluginProgramDepartmentsApi.setTargetArea}.
72
+ *
73
+ * @param name - Display name of the new department.
74
+ * @param color - CSS hex color string (e.g. `"#b5e1dc"`).
75
+ * @returns The new department's id (read the full record back with
76
+ * {@linkcode PluginProgramDepartmentsApi.get}).
77
+ * @throws If the department could not be created.
78
+ *
79
+ * @examplePrompt Create a department called Bedrooms in light blue
80
+ * @examplePrompt Add a new program group named Circulation with color #cccccc
81
+ * @examplePrompt Make a Classrooms department
82
+ * @examplePrompt Set up a Lobby department in the program
83
+ *
84
+ * # Example
85
+ * ```ts
86
+ * const { departmentId } = await snaptrude.program.departments.create("Bedrooms", "#b5e1dc")
87
+ * ```
88
+ */
89
+ public abstract create(
90
+ name: string,
91
+ color: string,
92
+ ): PluginApiReturn<PluginProgramDepartmentsCreateResult>
93
+
94
+ /**
95
+ * Update a department's name and/or color.
96
+ *
97
+ * A **sparse** update: omitted fields are left unchanged. Use
98
+ * {@linkcode PluginProgramDepartmentsApi.setTargetArea} to change the area
99
+ * target (not this method).
100
+ *
101
+ * @param departmentId - The id of the department to update.
102
+ * @param options - Any of `name`, `color`; omitted fields are left unchanged.
103
+ * @returns The updated {@linkcode PluginProgramDepartment} (with the response
104
+ * `units` for its `targetArea`).
105
+ * @throws If no department has the given id.
106
+ *
107
+ * @examplePrompt Rename the Bedrooms department to Suites
108
+ * @examplePrompt Change the Circulation department colour to #ff8800
109
+ * @examplePrompt Recolour department dep_123
110
+ * @examplePrompt Update the Lobby department's display name
111
+ *
112
+ * # Example
113
+ * ```ts
114
+ * const dept = await snaptrude.program.departments.update("dep_123", { name: "Suites" })
115
+ * ```
116
+ */
117
+ public abstract update(
118
+ departmentId: string,
119
+ options?: { name?: string; color?: string },
120
+ ): PluginApiReturn<PluginProgramDepartmentsUpdateResult>
121
+
122
+ /**
123
+ * Assign one or more spaces to a department.
124
+ *
125
+ * Moves each space into the given department — an undoable membership change.
126
+ * A space belongs to exactly one department, so assigning re-homes it from any
127
+ * previous one. Paired with {@linkcode PluginProgramDepartmentsApi.unassign}.
128
+ *
129
+ * @param departmentId - The department to assign the spaces to.
130
+ * @param spaceIds - The ids of the spaces to move into the department (at
131
+ * least one).
132
+ * @returns The department and the space ids that were assigned.
133
+ * @throws If the department does not exist or a space id is invalid.
134
+ *
135
+ * @examplePrompt Assign the selected rooms to the Bedrooms department
136
+ * @examplePrompt Put spaces 12 and 13 in the Circulation department
137
+ * @examplePrompt Move this space into the Lobby department
138
+ * @examplePrompt Add the kitchen spaces to the Service department
139
+ *
140
+ * # Example
141
+ * ```ts
142
+ * await snaptrude.program.departments.assign("dep_123", ["sp_1", "sp_2"])
143
+ * ```
144
+ */
145
+ public abstract assign(
146
+ departmentId: string,
147
+ spaceIds: ComponentHandle[],
148
+ ): PluginApiReturn<PluginProgramDepartmentsAssignResult>
149
+
150
+ /**
151
+ * Remove one or more spaces from their department.
152
+ *
153
+ * Returns each space to the **Default** department — there is no "no
154
+ * department" state, so unassigning means reassigning to Default. Paired with
155
+ * {@linkcode PluginProgramDepartmentsApi.assign}.
156
+ *
157
+ * @param spaceIds - The ids of the spaces to remove from their current
158
+ * department (at least one).
159
+ * @returns The space ids that were returned to Default.
160
+ * @throws If a space id is invalid.
161
+ *
162
+ * @examplePrompt Remove the selected rooms from their department
163
+ * @examplePrompt Unassign space sp_1 from any department
164
+ * @examplePrompt Clear the department on these spaces
165
+ * @examplePrompt Take the kitchen out of the Service department
166
+ *
167
+ * # Example
168
+ * ```ts
169
+ * await snaptrude.program.departments.unassign(["sp_1"])
170
+ * ```
171
+ */
172
+ public abstract unassign(
173
+ spaceIds: ComponentHandle[],
174
+ ): PluginApiReturn<PluginProgramDepartmentsUnassignResult>
175
+
176
+ /**
177
+ * Set a department's target area.
178
+ *
179
+ * The goal the program metrics compare allocated area against (see
180
+ * {@linkcode PluginProgramMetricsApi}). Pass `units` to say what unit
181
+ * `targetArea` is in; it defaults to the project's area units. Read the target
182
+ * back from {@linkcode PluginProgramDepartmentsApi.get} (`targetArea`).
183
+ *
184
+ * @param departmentId - The id of the department whose target to set.
185
+ * @param targetArea - The target area, in `units`.
186
+ * @param units - Unit of `targetArea` (defaults to the project's area units).
187
+ * @returns The updated {@linkcode PluginProgramDepartment} with its `units`.
188
+ * @throws If no department has the given id.
189
+ *
190
+ * @examplePrompt Set the Bedrooms department target area to 2000 sqft
191
+ * @examplePrompt Give the Circulation department a 500 sqm area target
192
+ * @examplePrompt Target 1500 square feet for the Classrooms department
193
+ * @examplePrompt Update the area goal for department dep_123
194
+ *
195
+ * # Example
196
+ * ```ts
197
+ * await snaptrude.program.departments.setTargetArea("dep_123", 2000, "ft2")
198
+ * ```
199
+ */
200
+ public abstract setTargetArea(
201
+ departmentId: string,
202
+ targetArea: number,
203
+ units?: PluginAreaUnit,
204
+ ): PluginApiReturn<PluginProgramDepartmentsSetTargetAreaResult>
205
+
206
+ /**
207
+ * Set a department's target unit count.
208
+ *
209
+ * The number of units (program blocks) the department is planned for — the
210
+ * count twin of {@linkcode PluginProgramDepartmentsApi.setTargetArea}, stored
211
+ * beside the gross area target on the department. Read it back from
212
+ * {@linkcode PluginProgramDepartmentsApi.get} (`targetCount`).
213
+ *
214
+ * @param departmentId - The id of the department whose count to set.
215
+ * @param targetCount - The target number of units (a non-negative integer).
216
+ * @returns The updated {@linkcode PluginProgramDepartment} with its `units`.
217
+ * @throws If no department has the given id.
218
+ *
219
+ * @examplePrompt Set the Bedrooms department unit count to 12
220
+ * @examplePrompt The program needs 4 clinic blocks — update the department count
221
+ * @examplePrompt Update the target count for department dep_123
222
+ *
223
+ * # Example
224
+ * ```ts
225
+ * await snaptrude.program.departments.setTargetCount("dep_123", 12)
226
+ * ```
227
+ */
228
+ public abstract setTargetCount(
229
+ departmentId: string,
230
+ targetCount: number,
231
+ ): PluginApiReturn<PluginProgramDepartmentsSetTargetCountResult>
232
+
233
+ /**
234
+ * Delete a department.
235
+ *
236
+ * Any spaces still assigned to it are returned to the **Default** department
237
+ * (no space is left orphaned). The reserved departments (Default, Site,
238
+ * Envelope, Core) cannot be deleted.
239
+ *
240
+ * @param departmentId - The id of the department to delete.
241
+ * @returns The id of the deleted department and the spaces that were reassigned
242
+ * to Default.
243
+ * @throws If no department has the given id, or it is a reserved department.
244
+ *
245
+ * @examplePrompt Delete the Bedrooms department
246
+ * @examplePrompt Remove the empty Circulation department
247
+ * @examplePrompt Delete department dep_123 and move its rooms to Default
248
+ *
249
+ * # Example
250
+ * ```ts
251
+ * await snaptrude.program.departments.delete("dep_123")
252
+ * ```
253
+ */
254
+ public delete?: (
255
+ departmentId: string,
256
+ ) => PluginApiReturn<PluginProgramDepartmentsDeleteResult>
257
+ }
258
+
259
+ /**
260
+ * A department in the active program. Its `targetArea` is in the enclosing
261
+ * response's `units` (see the area-units convention in
262
+ * {@linkcode PluginAreaUnit}).
263
+ *
264
+ * | Property | Type | Description |
265
+ * |---|---|---|
266
+ * | `id` | `string` | Unique department id |
267
+ * | `name` | `string` | Display name |
268
+ * | `color` | `string` | CSS hex color string (e.g. `"#b5e1dc"`) |
269
+ * | `targetArea` | `number \| null` | Gross target area in the response's `units`, or `null` if no target is set |
270
+ * | `targetCount` | `number` | Target number of units / program blocks (`0` when unset) |
271
+ */
272
+ export const PluginProgramDepartment = z.object({
273
+ id: z.string(),
274
+ name: z.string(),
275
+ color: z.string(),
276
+ targetArea: z.number().nullable(),
277
+ targetCount: z.number(),
278
+ })
279
+ export type PluginProgramDepartment = z.infer<typeof PluginProgramDepartment>
280
+
281
+ /**
282
+ * Result of {@linkcode PluginProgramDepartmentsApi.list}. Per the area-units
283
+ * convention, `units` sits on this response envelope (not on each record).
284
+ *
285
+ * | Property | Type | Description |
286
+ * |---|---|---|
287
+ * | `units` | `"ft2" \| "m2"` | The unit every `targetArea` below is reported in |
288
+ * | `departments` | {@linkcode PluginProgramDepartment}`[]` | All departments in the active program |
289
+ */
290
+ export const PluginProgramDepartmentsListResult = z.object({
291
+ units: PluginAreaUnit,
292
+ departments: z.array(PluginProgramDepartment),
293
+ })
294
+ export type PluginProgramDepartmentsListResult = z.infer<
295
+ typeof PluginProgramDepartmentsListResult
296
+ >
297
+
298
+ /**
299
+ * Arguments for {@linkcode PluginProgramDepartmentsApi.get}.
300
+ *
301
+ * | Property | Type | Description |
302
+ * |---|---|---|
303
+ * | `departmentId` | `string` | The id of the department to read |
304
+ */
305
+ export const PluginProgramDepartmentsGetArgs = z.object({
306
+ departmentId: z.string(),
307
+ })
308
+ export type PluginProgramDepartmentsGetArgs = z.infer<
309
+ typeof PluginProgramDepartmentsGetArgs
310
+ >
311
+
312
+ /**
313
+ * Result of {@linkcode PluginProgramDepartmentsApi.get} — the department, or
314
+ * `null` when no department has the given id. This is a bare `.get` record, so
315
+ * per the area-units convention `units` is carried on the record itself.
316
+ */
317
+ export const PluginProgramDepartmentsGetResult = PluginProgramDepartment.extend(
318
+ {
319
+ units: PluginAreaUnit,
320
+ },
321
+ ).nullable()
322
+ export type PluginProgramDepartmentsGetResult = z.infer<
323
+ typeof PluginProgramDepartmentsGetResult
324
+ >
325
+
326
+ /**
327
+ * A department record with its area `units` — the shape returned by the
328
+ * single-record department writes (`update`, `setTargetArea`). Per the
329
+ * area-units convention, a bare record carries `units` on itself.
330
+ */
331
+ export const PluginProgramDepartmentRecord = PluginProgramDepartment.extend({
332
+ units: PluginAreaUnit,
333
+ })
334
+ export type PluginProgramDepartmentRecord = z.infer<
335
+ typeof PluginProgramDepartmentRecord
336
+ >
337
+
338
+ /**
339
+ * Arguments for {@linkcode PluginProgramDepartmentsApi.create}.
340
+ *
341
+ * | Property | Type | Description |
342
+ * |---|---|---|
343
+ * | `name` | `string` | Display name of the new department |
344
+ * | `color` | `string` | CSS hex color string (e.g. `"#b5e1dc"`) |
345
+ */
346
+ export const PluginProgramDepartmentsCreateArgs = z.object({
347
+ name: z.string(),
348
+ color: z.string(),
349
+ })
350
+ export type PluginProgramDepartmentsCreateArgs = z.infer<
351
+ typeof PluginProgramDepartmentsCreateArgs
352
+ >
353
+
354
+ /**
355
+ * Result of {@linkcode PluginProgramDepartmentsApi.create} — the id of the
356
+ * newly created department.
357
+ */
358
+ export const PluginProgramDepartmentsCreateResult = z.object({
359
+ departmentId: z.string(),
360
+ })
361
+ export type PluginProgramDepartmentsCreateResult = z.infer<
362
+ typeof PluginProgramDepartmentsCreateResult
363
+ >
364
+
365
+ /**
366
+ * Arguments for {@linkcode PluginProgramDepartmentsApi.update}. Sparse — only
367
+ * the provided fields are changed.
368
+ *
369
+ * | Property | Type | Description |
370
+ * |---|---|---|
371
+ * | `departmentId` | `string` | The id of the department to update |
372
+ * | `name` | `string \| undefined` | New display name (unchanged if omitted) |
373
+ * | `color` | `string \| undefined` | New CSS hex color (unchanged if omitted) |
374
+ */
375
+ export const PluginProgramDepartmentsUpdateArgs = z.object({
376
+ departmentId: z.string(),
377
+ name: z.string().optional(),
378
+ color: z.string().optional(),
379
+ })
380
+ export type PluginProgramDepartmentsUpdateArgs = z.infer<
381
+ typeof PluginProgramDepartmentsUpdateArgs
382
+ >
383
+
384
+ /** Result of {@linkcode PluginProgramDepartmentsApi.update} — the updated record. */
385
+ export const PluginProgramDepartmentsUpdateResult =
386
+ PluginProgramDepartmentRecord
387
+ export type PluginProgramDepartmentsUpdateResult = z.infer<
388
+ typeof PluginProgramDepartmentsUpdateResult
389
+ >
390
+
391
+ /**
392
+ * Arguments for {@linkcode PluginProgramDepartmentsApi.assign}.
393
+ *
394
+ * | Property | Type | Description |
395
+ * |---|---|---|
396
+ * | `departmentId` | `string` | The department to assign the spaces to |
397
+ * | `spaceIds` | `ComponentHandle[]` | The ids of the spaces to move into the department |
398
+ */
399
+ export const PluginProgramDepartmentsAssignArgs = z.object({
400
+ departmentId: z.string(),
401
+ spaceIds: z.array(ComponentHandle).min(1),
402
+ })
403
+ export type PluginProgramDepartmentsAssignArgs = z.infer<
404
+ typeof PluginProgramDepartmentsAssignArgs
405
+ >
406
+
407
+ /** Result of {@linkcode PluginProgramDepartmentsApi.assign}. */
408
+ export const PluginProgramDepartmentsAssignResult = z.object({
409
+ departmentId: z.string(),
410
+ spaceIds: z.array(ComponentHandle),
411
+ })
412
+ export type PluginProgramDepartmentsAssignResult = z.infer<
413
+ typeof PluginProgramDepartmentsAssignResult
414
+ >
415
+
416
+ /**
417
+ * Arguments for {@linkcode PluginProgramDepartmentsApi.unassign}.
418
+ *
419
+ * | Property | Type | Description |
420
+ * |---|---|---|
421
+ * | `spaceIds` | `ComponentHandle[]` | The ids of the spaces to return to the Default department |
422
+ */
423
+ export const PluginProgramDepartmentsUnassignArgs = z.object({
424
+ spaceIds: z.array(ComponentHandle).min(1),
425
+ })
426
+ export type PluginProgramDepartmentsUnassignArgs = z.infer<
427
+ typeof PluginProgramDepartmentsUnassignArgs
428
+ >
429
+
430
+ /** Result of {@linkcode PluginProgramDepartmentsApi.unassign}. */
431
+ export const PluginProgramDepartmentsUnassignResult = z.object({
432
+ spaceIds: z.array(ComponentHandle),
433
+ })
434
+ export type PluginProgramDepartmentsUnassignResult = z.infer<
435
+ typeof PluginProgramDepartmentsUnassignResult
436
+ >
437
+
438
+ /**
439
+ * Arguments for {@linkcode PluginProgramDepartmentsApi.setTargetArea}.
440
+ *
441
+ * | Property | Type | Description |
442
+ * |---|---|---|
443
+ * | `departmentId` | `string` | The id of the department whose target to set |
444
+ * | `targetArea` | `number` | The target area, in `units` |
445
+ * | `units` | `"ft2" \| "m2" \| undefined` | Unit of `targetArea` (defaults to the project's area units) |
446
+ */
447
+ export const PluginProgramDepartmentsSetTargetAreaArgs = z.object({
448
+ departmentId: z.string(),
449
+ targetArea: z.number(),
450
+ units: PluginAreaUnit.optional(),
451
+ })
452
+ export type PluginProgramDepartmentsSetTargetAreaArgs = z.infer<
453
+ typeof PluginProgramDepartmentsSetTargetAreaArgs
454
+ >
455
+
456
+ /**
457
+ * Result of {@linkcode PluginProgramDepartmentsApi.setTargetArea} — the updated
458
+ * department record with its `units`.
459
+ */
460
+ export const PluginProgramDepartmentsSetTargetAreaResult =
461
+ PluginProgramDepartmentRecord
462
+ export type PluginProgramDepartmentsSetTargetAreaResult = z.infer<
463
+ typeof PluginProgramDepartmentsSetTargetAreaResult
464
+ >
465
+
466
+ /**
467
+ * Arguments for {@linkcode PluginProgramDepartmentsApi.setTargetCount}.
468
+ *
469
+ * | Property | Type | Description |
470
+ * |---|---|---|
471
+ * | `departmentId` | `string` | The id of the department whose count to set |
472
+ * | `targetCount` | `number` | Target number of units (non-negative integer) |
473
+ */
474
+ export const PluginProgramDepartmentsSetTargetCountArgs = z.object({
475
+ departmentId: z.string(),
476
+ targetCount: z.number().int().nonnegative(),
477
+ })
478
+ export type PluginProgramDepartmentsSetTargetCountArgs = z.infer<
479
+ typeof PluginProgramDepartmentsSetTargetCountArgs
480
+ >
481
+
482
+ /** Result of {@linkcode PluginProgramDepartmentsApi.setTargetCount} — the updated record with `units`. */
483
+ export const PluginProgramDepartmentsSetTargetCountResult =
484
+ PluginProgramDepartmentRecord
485
+ export type PluginProgramDepartmentsSetTargetCountResult = z.infer<
486
+ typeof PluginProgramDepartmentsSetTargetCountResult
487
+ >
488
+
489
+ /**
490
+ * Arguments for {@linkcode PluginProgramDepartmentsApi.delete}.
491
+ *
492
+ * | Property | Type | Description |
493
+ * |---|---|---|
494
+ * | `departmentId` | `string` | The id of the department to delete |
495
+ */
496
+ export const PluginProgramDepartmentsDeleteArgs = z.object({
497
+ departmentId: z.string(),
498
+ })
499
+ export type PluginProgramDepartmentsDeleteArgs = z.infer<
500
+ typeof PluginProgramDepartmentsDeleteArgs
501
+ >
502
+
503
+ /**
504
+ * Result of {@linkcode PluginProgramDepartmentsApi.delete}.
505
+ *
506
+ * | Property | Type | Description |
507
+ * |---|---|---|
508
+ * | `departmentId` | `string` | The id of the deleted department |
509
+ * | `reassignedSpaceIds` | `ComponentHandle[]` | Spaces that were returned to the Default department |
510
+ */
511
+ export const PluginProgramDepartmentsDeleteResult = z.object({
512
+ departmentId: z.string(),
513
+ reassignedSpaceIds: z.array(ComponentHandle),
514
+ })
515
+ export type PluginProgramDepartmentsDeleteResult = z.infer<
516
+ typeof PluginProgramDepartmentsDeleteResult
517
+ >