@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,6 +1,7 @@
1
1
  import * as z from "zod";
2
2
  import { PluginApiReturn } from "../../types";
3
3
  import { BrepHandle, ComponentHandle } from "../../handles";
4
+ import { NetworkFamilyContract } from "./networks";
4
5
  /**
5
6
  * `snaptrude.design.family.*` — author NATIVE parametric families from a JSON spec.
6
7
  *
@@ -11,19 +12,53 @@ import { BrepHandle, ComponentHandle } from "../../handles";
11
12
  * compiles that into a live parametric definition the user can place, flex and
12
13
  * save to their library.
13
14
  *
14
- * ## Workflow
15
+ * ## Generic component workflow
15
16
  *
16
17
  * ```
17
- * getReference() read the spec DSL once — grammar, ops, expressions, example
18
- * prepare({ bundle }) validate + compile + show a live ghost; nothing committed
18
+ * getReference() read the spec DSL once — grammar, ops, expressions, examples
19
+ * getExamples() worked example families by discipline; getExamples({ id }) for one
20
+ * prepare({ bundle }) validate + compile; nothing committed, nothing in the viewport
19
21
  * flex({ values }) re-run at new values; returns the geometry delta
20
22
  * place({ position }) put it in the model — saves the family as the first instance drops
21
23
  * place() save the family, then arm placement — the USER clicks to drop it
24
+ * create() save an EDIT of a saved family — the app asks the user
22
25
  * create({ teamId }) share with a team; a save with nothing placed also drops one instance
23
26
  * ```
24
27
  *
25
- * `place` saves the prepared family to the user's personal library, so it
26
- * survives reload with no extra step; finish on `place`, not on `create`.
28
+ * `place` saves the prepared family to the library, so it survives reload with no extra step:
29
+ * the open project's team library in a team project, else the user's personal library
30
+ * (`teamId` picks another: a team's id, or `null` for the personal library); finish a NEW generic component on
31
+ * `place`, not on `create` (`create` ends only an edit of a saved family, below).
32
+ *
33
+ * Architectural types use `create({ name })` to save the prepared recipe.
34
+ * Saving does not assign a family to a native host.
35
+ * Read `design.catalog` and pass the saved `{ id, version }` reference to the
36
+ * native `design.create` method with its contour, wall profile, or straight axis.
37
+ * Standalone placement does not create a native host. Selecting a Draw type
38
+ * does not register an API type. Native creator values use mm, while this
39
+ * generic family API uses SU. Read `family_authoring` for the full workflow.
40
+ *
41
+ * ## Door and window templates
42
+ *
43
+ * Start with `getTemplate({ kind: "door" | "window", subType? })`, edit the
44
+ * recipe's style while keeping its contract, then `prepare` → `flex` → `create`.
45
+ * Place the saved family with
46
+ * `design.create.door(familyId, hostWall, position, { version, values, hinge }, facing)`
47
+ * or `design.create.window` with the same positional signature. Positions,
48
+ * hinge and facing are vec3 handles; values use the authored parameter keys.
49
+ * Templates produce ParametricComponents, not separate OpeningComponents. Read
50
+ * and edit their instances through `getParameters` / `setParameters`.
51
+ * The contract maps opening dimensions to parameter keys; do not assume the
52
+ * recipe names its width parameter `width`. Generic family lengths use SU.
53
+ * Hosted door/window `create({ name })` saves without placing a standalone
54
+ * sample. Supply the host and position in a subsequent placement.
55
+ *
56
+ * ## Changing a saved family
57
+ *
58
+ * Open it with `get({ id })` or `get({ component })`, edit with `prepare` /
59
+ * `flex`, then `create()`. The app — not the agent — asks the user whether to
60
+ * update that family (this project's placed copies move to the new version) or
61
+ * save a new family. Do not ask this yourself; report the returned `decision`.
27
62
  *
28
63
  * ## Read getReference() first
29
64
  *
@@ -70,6 +105,8 @@ export declare abstract class PluginDesignFamilyApi {
70
105
  * Read this before authoring a family for the first time in a session. The
71
106
  * DSL is a closed language — a guessed op or function is a rejected spec.
72
107
  *
108
+ * @param args Optional section, or its bare name. Omit for the core reference.
109
+ * Fetch architectural, networks or relations only when the family needs them.
73
110
  * @returns The reference text
74
111
  *
75
112
  * @examplePrompt How do I write a parametric family spec?
@@ -80,7 +117,53 @@ export declare abstract class PluginDesignFamilyApi {
80
117
  * const { reference } = await snaptrude.design.family.getReference()
81
118
  * ```
82
119
  */
83
- abstract getReference(): PluginApiReturn<PluginFamilyReference>;
120
+ abstract getReference(args?: PluginDesignFamilyGetReferenceArgs | PluginFamilyReferenceSection): PluginApiReturn<PluginFamilyReference>;
121
+ /**
122
+ * Worked example families to learn from: real, tested bundles by discipline
123
+ * (architecture, structure, MEP, furniture). With no `id`, returns the
124
+ * catalogue — each example's id, label, discipline and the patterns it
125
+ * teaches — filtered by `discipline` / `tag` when given. With an `id`,
126
+ * returns that example's full bundle. Fetch the one closest to the task
127
+ * before authoring and borrow its patterns; examples are patterns to
128
+ * combine, not templates to copy whole.
129
+ *
130
+ * @param args - `{ id }` for one bundle, or `{ discipline?, tag? }` to list
131
+ * @returns The catalogue, or one example with its bundle
132
+ *
133
+ * @examplePrompt Show me an example of a structural family
134
+ * @examplePrompt How is a hosted door family written?
135
+ *
136
+ * # Example
137
+ * ```ts
138
+ * const list = await snaptrude.design.family.getExamples({ discipline: "mep" })
139
+ * const ex = await snaptrude.design.family.getExamples({ id: list[0].id })
140
+ * ```
141
+ */
142
+ abstract getExamples(args?: PluginDesignFamilyGetExamplesArgs | string): PluginApiReturn<PluginFamilyExampleSummary[] | PluginFamilyExample>;
143
+ /**
144
+ * Get a validated starter recipe for a door or window, with an opening
145
+ * contract, host wall-thickness binding and role-named parts. Edit profiles,
146
+ * panels, glazing, hardware and materials while preserving the contract.
147
+ * Use `prepare` / `flex` to check the recipe, then `create` to save it and
148
+ * `design.create.door(familyId, hostWall, position, { version, values }, facing)`
149
+ * (or `window`) to place it. Edit the resulting ParametricComponent through
150
+ * `getParameters` / `setParameters`, not a separate opening API.
151
+ *
152
+ * `subType` defaults to `singleDoor` / `fixedWindow`. An unsupported subType
153
+ * returns the kind's default template, a note in `guidance`, and `available`
154
+ * templates. Start from the closest recipe and set `root.subType` to your token.
155
+ *
156
+ * @param args The opening kind and optional subtype token
157
+ * @returns The bundle, parameter-key contract, subtype, guidance and available templates
158
+ * @example
159
+ * const { bundle, contract } = await snaptrude.design.family.getTemplate({
160
+ * kind: "door", subType: "doubleDoor",
161
+ * })
162
+ * // Flex the authored width key, not an assumed parameter name (lengths in SU).
163
+ * await snaptrude.design.family.prepare({ bundle })
164
+ * await snaptrude.design.family.flex({ values: { [contract.width]: 4 } })
165
+ */
166
+ abstract getTemplate(args: PluginDesignFamilyGetTemplateArgs): PluginApiReturn<PluginFamilyTemplateResult>;
84
167
  /**
85
168
  * Validate, compile and preview a family spec. Nothing is committed to the
86
169
  * model or the library — call {@linkcode PluginDesignFamilyApi.place} to put
@@ -118,7 +201,8 @@ export declare abstract class PluginDesignFamilyApi {
118
201
  * buckets are the host's own diff of what the geometry did — flexing a
119
202
  * driving parameter and reporting them demonstrates the family is parametric.
120
203
  *
121
- * @param args The parameter values to change
204
+ * @param args The parameter values to change. Omit values (or pass an empty
205
+ * record) to report or photograph the current draft without rebuilding it.
122
206
  * @returns The new build plus the geometry delta
123
207
  *
124
208
  * @examplePrompt Change it to 6 bays
@@ -130,22 +214,44 @@ export declare abstract class PluginDesignFamilyApi {
130
214
  * console.log(`removed ${changed.removed}, rebuilt ${changed.rebuilt}`)
131
215
  * ```
132
216
  */
133
- abstract flex(args: PluginDesignFamilyFlexArgs): PluginApiReturn<PluginFamilyFlexResult>;
217
+ abstract flex(args?: PluginDesignFamilyFlexArgs): PluginApiReturn<PluginFamilyFlexResult>;
134
218
  /**
135
- * The prepared family's spec bundle, or `null` when nothing is prepared.
219
+ * A family's spec bundle: the prepared draft's, or — to CHANGE a saved
220
+ * family — that family's recipe, opened as the new draft.
221
+ *
222
+ * - No arguments: the prepared draft, or `null` when nothing is prepared.
223
+ * - `{ id, version? }`: open a saved family from the library (newest version
224
+ * when `version` is omitted).
225
+ * - `{ component }`: open the family (at its version) of that placed copy.
226
+ *
227
+ * Opening makes the recipe the current draft and returns `editing` — which
228
+ * saved family it is. Edit it with `prepare` / `flex`, then call `create`.
229
+ * On that save the APP shows the user its own window asking whether to
230
+ * update the family (every placed copy in this project moves to the new
231
+ * version) or save it as a new family — "new family" is the default. Never
232
+ * ask the user this yourself, and never promise either outcome: report what
233
+ * `create` returns.
136
234
  *
137
- * @returns The draft bundle, or `null`
235
+ * @param args Optional: which saved family to open
236
+ * @returns The bundle (plus `editing` when it edits a saved family), or `null`
237
+ *
238
+ * @examplePrompt Make the chairs I placed 50 mm wider
239
+ * @examplePrompt Change the Louvre Screen family so its blades are deeper
138
240
  *
139
241
  * # Example
140
242
  * ```ts
141
- * const bundle = await snaptrude.design.family.get()
243
+ * const draft = await snaptrude.design.family.get()
244
+ * const family = await snaptrude.design.family.get({ component })
245
+ * // family.editing → { familyId, version, name, library }
142
246
  * ```
143
247
  */
144
- abstract get(): PluginApiReturn<PluginFamilyBundle | null>;
248
+ abstract get(args?: PluginDesignFamilyGetArgs | string): PluginApiReturn<PluginFamilyGetResult | null>;
145
249
  /**
146
- * Every parametric family registered in this session — native and imported.
250
+ * Every available parametric family, merging the session registry and catalog.
147
251
  *
148
- * @returns One summary per family
252
+ * @param args Opt into compact lines for generic discovery. The default stays
253
+ * object-shaped so existing callers retain version, openingKind and subType.
254
+ * @returns Summary objects, or `id | label | category | kind` lines when compact.
149
255
  *
150
256
  * @examplePrompt What families are available?
151
257
  *
@@ -154,13 +260,37 @@ export declare abstract class PluginDesignFamilyApi {
154
260
  * const families = await snaptrude.design.family.list()
155
261
  * ```
156
262
  */
157
- abstract list(): PluginApiReturn<PluginFamilySummary[]>;
263
+ abstract list(args: PluginDesignFamilyListArgs & {
264
+ compact: true;
265
+ }): PluginApiReturn<string[]>;
266
+ abstract list(args?: PluginDesignFamilyListArgs & {
267
+ compact?: false;
268
+ }): PluginApiReturn<PluginFamilySummary[]>;
269
+ abstract list(args?: PluginDesignFamilyListArgs): PluginApiReturn<PluginFamilySummary[] | string[]>;
270
+ /**
271
+ * Read one saved catalog definition without opening a draft or placing geometry.
272
+ * Both id and version are required. The catalog checks access on every read.
273
+ * Length defaults and bounds are in mm, ready for network graph overrides;
274
+ * angle parameters retain degrees, identified by each parameter's unit.
275
+ * existing getParameters/place/setParameters continue to use Snaptrude units.
276
+ * Defaults include current catalog overrides, which can change without a new version.
277
+ * No scene, registry, history, or persistence state is changed.
278
+ * Missing/inaccessible pins and invalid recipes fail; no latest-version fallback.
279
+ * This metadata does not certify connectors or engineering compatibility.
280
+ *
281
+ * @param args Exact saved catalog id and version, from list()
282
+ * @returns Compact parameter metadata, not geometry or the recipe bundle
283
+ * @example
284
+ * const definition = await snaptrude.design.family.getDefinition({ id, version })
285
+ */
286
+ abstract getDefinition(args: PluginDesignFamilyGetDefinitionArgs): PluginApiReturn<PluginFamilyDefinition>;
158
287
  /**
159
288
  * Put a family into the model — either the prepared draft or any family from
160
289
  * {@linkcode PluginDesignFamilyApi.list}.
161
290
  *
162
- * Placing the prepared draft saves it to the user's personal library first,
163
- * so its instances survive reload.
291
+ * Placing the prepared draft saves it to the library first, so its instances survive
292
+ * reload: the open project's team library in a team project, else the user's personal
293
+ * library. `teamId` picks another (`null` is the personal library).
164
294
  *
165
295
  * Two modes, chosen by whether you pass `position`:
166
296
  *
@@ -177,6 +307,13 @@ export declare abstract class PluginDesignFamilyApi {
177
307
  * To COPY a placed component, place its family again at the new position with
178
308
  * the same `values` — there is no separate copy call.
179
309
  *
310
+ * HOSTED families (doors, windows — anything with an `opening`, a `host`
311
+ * block, or a void with `cuts: "host"`) take `host`: a wall or a placed
312
+ * family. The family is set into the host's face nearest `position` (the
313
+ * host's middle when omitted), and the host is cut — a system wall by the
314
+ * wall cutter, a family by its own recipe. Host-bound parameters then follow
315
+ * the host (a door's wall thickness follows the wall).
316
+ *
180
317
  * @param args Which family, where, and at what parameter values
181
318
  * @returns What was placed; `component` is present only in positioned mode
182
319
  *
@@ -194,8 +331,14 @@ export declare abstract class PluginDesignFamilyApi {
194
331
  * })
195
332
  * await snaptrude.design.transform.move([component], { x: 2, y: 0, z: 0 })
196
333
  *
334
+ * // on the first floor — position.y is an offset above storey 2's base
335
+ * await snaptrude.design.family.place({ id: familyId, position: { x: 4, y: 0, z: 0 }, storey: 2 })
336
+ *
197
337
  * // interactive — the user clicks
198
338
  * await snaptrude.design.family.place()
339
+ *
340
+ * // hosted — a door in a wall, near a point along it
341
+ * await snaptrude.design.family.place({ id: doorId, host: wall, position: { x: 3, y: 0, z: 0 } })
199
342
  * ```
200
343
  */
201
344
  abstract place(args?: PluginDesignFamilyPlaceArgs): PluginApiReturn<PluginFamilyPlaceResult>;
@@ -232,6 +375,34 @@ export declare abstract class PluginDesignFamilyApi {
232
375
  * that does not is accepted and stored (it round-trips to Revit) but nothing
233
376
  * visible happens — say so rather than claiming a change the user cannot see.
234
377
  *
378
+ * NESTED children: `children: { "<path>": { key: value } }` sets a nested
379
+ * child's own values (every copy of it). A value its parent sets is sent up
380
+ * to what it follows when that is a plain relationship; otherwise it is
381
+ * refused with what to change instead (see `refused`).
382
+ *
383
+ * LINKS: `links: { key: { from, expr } }` makes this family's `key` follow
384
+ * another placed object — `from` is a family (it reports its parameters and
385
+ * outputs) or a wall (it reports thickness, length, height); `expr` is an
386
+ * expression over those reports. `null` removes a link. Links that would
387
+ * make objects follow each other in a loop are refused. Values accept unit
388
+ * literals ("600mm").
389
+ *
390
+ * RELATIONS: `relations: { add: [...], remove: ["r1"] }` sets how the family
391
+ * sits against other placed objects or cuts its host:
392
+ * - `attach` — `{ kind: "attach", side: "base" | "top", to: <object> | { level, face? }, offset? }`:
393
+ * sits on a surface, or its top reaches one (reports `reach`, `gap`, `surface`).
394
+ * - `join` — `{ kind: "join", end, to: <family>, toEnd, bindOther? }`: its end moves onto
395
+ * the other's end (reports `angle`, `absAngle`, `mitre`).
396
+ * - `span` — `{ kind: "span", from, to, at? }`: pinned between two objects, running along
397
+ * its +X (reports `distance`, `run`, `rise`, `slope`, `from.*`, `to.*`).
398
+ * - `path` — `{ kind: "path", from? | points, closed? }`: follows a wall's centreline, a
399
+ * family's run or given points (reports `length`; the recipe reads the path).
400
+ * - `cut` — `{ kind: "cut", to: "host" }`: applies recipe voids to the current host.
401
+ * Removing it closes the opening without detaching or deleting the family.
402
+ * Door/window placement adds it. Hosting alone does not cut. No parameter binds.
403
+ * Placement relations take `bind: { <param>: "<expression over its reports>" }`; bound
404
+ * parameters are read-only. A relation with an existing `id` replaces it.
405
+ *
235
406
  * `length` values are Snaptrude units: the same 254 mm unit as the kernel's
236
407
  * internal (`"babylon"`) unit — convert the user's number with
237
408
  * `core.units.convert` first; a bare `400` is 400 SU, not 400 mm. Kernel part
@@ -246,18 +417,40 @@ export declare abstract class PluginDesignFamilyApi {
246
417
  * # Example
247
418
  * ```ts
248
419
  * await snaptrude.design.family.setParameters({ component, values: { seats: 8 } })
420
+ * await snaptrude.design.family.setParameters({ component, children: { chair: { width: "380mm" } } })
421
+ * await snaptrude.design.family.setParameters({
422
+ * component: railing,
423
+ * links: { steps: { from: stair, expr: "steps" }, side: { from: stair, expr: "width - 40mm" } },
424
+ * })
425
+ * await snaptrude.design.family.setParameters({
426
+ * component: post,
427
+ * relations: { add: [{ kind: "attach", side: "top", to: slab, bind: { height: "reach" } }] },
428
+ * })
249
429
  * ```
250
430
  */
251
431
  abstract setParameters(args: PluginDesignFamilySetParametersArgs): PluginApiReturn<PluginFamilyInstanceParameters>;
252
432
  /**
253
- * Save the prepared bundle to the library — the user's personal library
254
- * unless `teamId` is given. {@linkcode PluginDesignFamilyApi.place} already
255
- * saves, so `create` is for sharing with a team. When nothing of the family is
256
- * in the model yet, one instance is also dropped at the centre of the current
257
- * view on the active storey (`placed: true`), so a save is never invisible.
433
+ * Save the prepared bundle to the library: the open project's team library in a team
434
+ * project, else the user's personal library. `teamId` picks another team, and `null` the
435
+ * personal library. {@linkcode PluginDesignFamilyApi.place} already
436
+ * saves generic components. Hosted doors/windows save without placement;
437
+ * they need a wall and position through `design.create.door` / `design.create.window`.
438
+ * For a non-hosted family with no placed instance, saving also drops one
439
+ * standalone sample at the current view centre on the active storey
440
+ * (`placed: true`). This includes architectural families: the sample does
441
+ * not assign a family to a native host.
442
+ *
443
+ * When the draft edits a saved family (opened with `get({ id })` /
444
+ * `get({ component })`), or its name is already taken in that library, the
445
+ * APP asks the user in its own window whether to save a new version of that
446
+ * family — every placed copy in this project moves to it, and families
447
+ * nesting it may be offered theirs — or a new family ("new family" is the
448
+ * default). The agent never asks this itself and cannot answer the window.
449
+ * `decision` reports what the user chose; `"cancelled"` means nothing was
450
+ * saved (`ok: false`) and nothing will auto-save until `create` is called again.
258
451
  *
259
452
  * @param args Optional library name and team scope
260
- * @returns The catalogued definition's id and version
453
+ * @returns The catalogued definition's id and version, and what the user chose
261
454
  *
262
455
  * @examplePrompt Save this as a family called Vertical Louvre
263
456
  * @examplePrompt Add it to my library
@@ -290,7 +483,42 @@ export declare abstract class PluginDesignFamilyApi {
290
483
  * await snaptrude.design.family.delete({ id: "revit:steel-bollard~bef047", instances: true })
291
484
  * ```
292
485
  */
293
- abstract delete(args?: PluginDesignFamilyDeleteArgs): PluginApiReturn<PluginFamilyDeleteResult>;
486
+ abstract delete(args?: PluginDesignFamilyDeleteArgs | string): PluginApiReturn<PluginFamilyDeleteResult>;
487
+ }
488
+ /** Optional reference sections keep unrelated grammar out of the core response. */
489
+ export declare const PluginFamilyReferenceSection: z.ZodEnum<{
490
+ architectural: "architectural";
491
+ networks: "networks";
492
+ relations: "relations";
493
+ }>;
494
+ export type PluginFamilyReferenceSection = z.infer<typeof PluginFamilyReferenceSection>;
495
+ /** Omit section for the core grammar, workflow and example catalogue. */
496
+ export declare const PluginDesignFamilyGetReferenceArgs: z.ZodObject<{
497
+ section: z.ZodOptional<z.ZodEnum<{
498
+ architectural: "architectural";
499
+ networks: "networks";
500
+ relations: "relations";
501
+ }>>;
502
+ }, z.core.$strip>;
503
+ export type PluginDesignFamilyGetReferenceArgs = z.infer<typeof PluginDesignFamilyGetReferenceArgs>;
504
+ /** Compact output is opt-in: existing object consumers must retain their metadata. */
505
+ export declare const PluginDesignFamilyListArgs: z.ZodObject<{
506
+ compact: z.ZodOptional<z.ZodBoolean>;
507
+ }, z.core.$strip>;
508
+ export type PluginDesignFamilyListArgs = z.infer<typeof PluginDesignFamilyListArgs>;
509
+ /** One worked example in the catalogue returned by `getExamples`. */
510
+ export interface PluginFamilyExampleSummary {
511
+ id: string;
512
+ label: string;
513
+ discipline: "architecture" | "structure" | "mep" | "furniture";
514
+ /** The patterns it demonstrates, e.g. "nesting", "slot", "path", "union", "trim". */
515
+ teaches: string[];
516
+ /** Size of the bundle as compact JSON, kilobytes — what fetching it costs. */
517
+ sizeKB: number;
518
+ }
519
+ /** One worked example with its full bundle, from `getExamples({ id })`. */
520
+ export interface PluginFamilyExample extends PluginFamilyExampleSummary {
521
+ bundle: PluginFamilyBundle;
294
522
  }
295
523
  /** The family-spec DSL reference returned by `getReference`. */
296
524
  export interface PluginFamilyReference {
@@ -309,6 +537,31 @@ export interface PluginFamilyReference {
309
537
  export interface PluginFamilyBundle {
310
538
  root: Record<string, unknown>;
311
539
  deps?: Record<string, Record<string, unknown>>;
540
+ /** Connector metadata saved with the recipe; network placement evaluates these expressions. */
541
+ network?: NetworkFamilyContract;
542
+ }
543
+ /** Which saved family a draft edits. */
544
+ export interface PluginFamilyEditing {
545
+ /** Library id of the family being edited. */
546
+ familyId: string;
547
+ /** The version that was opened. */
548
+ version: number;
549
+ /** Its library name — an update saves under this name. */
550
+ name: string;
551
+ /** "your library", or the team library's name. */
552
+ library: string;
553
+ }
554
+ /** What `get` returns: the bundle, plus `editing` when the draft edits a saved family. */
555
+ export interface PluginFamilyGetResult extends PluginFamilyBundle {
556
+ editing?: PluginFamilyEditing;
557
+ }
558
+ /** A family at a version, as `create` reports parents it did or did not update. */
559
+ export interface PluginFamilyVersionRef {
560
+ id: string;
561
+ name: string;
562
+ version: number;
563
+ /** Set when the user chose to update it but the update failed. */
564
+ error?: string;
312
565
  }
313
566
  /** Axis-aligned extents of a built family. Snaptrude units (1 SU = 254 mm), +Y up. */
314
567
  export interface PluginFamilyBBox {
@@ -342,7 +595,11 @@ export interface PluginFamilyParameter {
342
595
  export interface PluginFamilyDiagnostic {
343
596
  /** JSON pointer, e.g. `"/root/geometry/2/body/0/w"`. */
344
597
  path: string;
345
- code: "schema" | "bad-expression" | "unknown-name" | "unknown-def" | "cycle" | "duplicate-name" | "unbounded-repeat" | "depth" | "bad-dimension" | "proportion";
598
+ code: "schema" | "bad-expression" | "unknown-name" | "unknown-def" | "cycle" | "duplicate-name" | "unbounded-repeat" | "depth" | "bad-dimension" | "proportion"
599
+ /** A part the geometry kernel could not build exactly; drawn approximately. */
600
+ | "kernel-fallback"
601
+ /** A part whose hole loop crosses its outline. */
602
+ | "profile-hole";
346
603
  message: string;
347
604
  hint?: string;
348
605
  }
@@ -422,6 +679,13 @@ export interface PluginFamilySummary {
422
679
  version: number;
423
680
  label: string;
424
681
  category?: string;
682
+ /** The category's type token (`root.subType`), e.g. singleDoor or casementDouble. */
683
+ subType?: string;
684
+ /**
685
+ * Opening contract kind, distinct from provenance (`kind`). Place with the
686
+ * positional `design.create.door` / `window` API and edit via family parameters.
687
+ */
688
+ openingKind?: "door" | "window";
425
689
  /** Number of rows on the family's parameter sheet. */
426
690
  parameters: number;
427
691
  /**
@@ -437,6 +701,93 @@ export interface PluginFamilySummary {
437
701
  */
438
702
  kind: "native" | "revit";
439
703
  }
704
+ /** Exact catalog pin. Unsaved session definitions are not catalog inventory. */
705
+ export declare const PluginDesignFamilyGetDefinitionArgs: z.ZodObject<{
706
+ id: z.ZodString;
707
+ version: z.ZodNumber;
708
+ }, z.core.$strip>;
709
+ export type PluginDesignFamilyGetDefinitionArgs = z.infer<typeof PluginDesignFamilyGetDefinitionArgs>;
710
+ /** Saved-family metadata. Physical lengths use mm; angle entries retain degrees. */
711
+ export declare const PluginFamilyDefinitionParameter: z.ZodObject<{
712
+ key: z.ZodString;
713
+ label: z.ZodString;
714
+ type: z.ZodEnum<{
715
+ boolean: "boolean";
716
+ enum: "enum";
717
+ length: "length";
718
+ text: "text";
719
+ integer: "integer";
720
+ }>;
721
+ unit: z.ZodOptional<z.ZodEnum<{
722
+ mm: "mm";
723
+ degrees: "degrees";
724
+ }>>;
725
+ default: z.ZodUnion<readonly [z.ZodNumber, z.ZodString]>;
726
+ min: z.ZodOptional<z.ZodNumber>;
727
+ max: z.ZodOptional<z.ZodNumber>;
728
+ options: z.ZodOptional<z.ZodArray<z.ZodString>>;
729
+ drivesGeometry: z.ZodBoolean;
730
+ readOnly: z.ZodBoolean;
731
+ formulaDriven: z.ZodBoolean;
732
+ isInstance: z.ZodBoolean;
733
+ }, z.core.$strip>;
734
+ export type PluginFamilyDefinitionParameter = z.infer<typeof PluginFamilyDefinitionParameter>;
735
+ /** Read-only catalog inventory. Boolean defaults retain the family DSL's Yes/No strings. */
736
+ export declare const PluginFamilyDefinition: z.ZodObject<{
737
+ id: z.ZodString;
738
+ version: z.ZodNumber;
739
+ label: z.ZodString;
740
+ category: z.ZodOptional<z.ZodString>;
741
+ lengthUnit: z.ZodLiteral<"mm">;
742
+ parameters: z.ZodArray<z.ZodObject<{
743
+ key: z.ZodString;
744
+ label: z.ZodString;
745
+ type: z.ZodEnum<{
746
+ boolean: "boolean";
747
+ enum: "enum";
748
+ length: "length";
749
+ text: "text";
750
+ integer: "integer";
751
+ }>;
752
+ unit: z.ZodOptional<z.ZodEnum<{
753
+ mm: "mm";
754
+ degrees: "degrees";
755
+ }>>;
756
+ default: z.ZodUnion<readonly [z.ZodNumber, z.ZodString]>;
757
+ min: z.ZodOptional<z.ZodNumber>;
758
+ max: z.ZodOptional<z.ZodNumber>;
759
+ options: z.ZodOptional<z.ZodArray<z.ZodString>>;
760
+ drivesGeometry: z.ZodBoolean;
761
+ readOnly: z.ZodBoolean;
762
+ formulaDriven: z.ZodBoolean;
763
+ isInstance: z.ZodBoolean;
764
+ }, z.core.$strip>>;
765
+ network: z.ZodOptional<z.ZodObject<{
766
+ schemaVersion: z.ZodLiteral<1>;
767
+ role: z.ZodEnum<{
768
+ pipe: "pipe";
769
+ duct: "duct";
770
+ wire: "wire";
771
+ cable: "cable";
772
+ conduit: "conduit";
773
+ cableDuct: "cableDuct";
774
+ cableTray: "cableTray";
775
+ connector: "connector";
776
+ equipment: "equipment";
777
+ }>;
778
+ lengthParameter: z.ZodOptional<z.ZodString>;
779
+ ports: z.ZodArray<z.ZodObject<{
780
+ id: z.ZodString;
781
+ position: z.ZodTuple<[z.ZodString, z.ZodString, z.ZodString], null>;
782
+ direction: z.ZodTuple<[z.ZodString, z.ZodString, z.ZodString], null>;
783
+ size: z.ZodString;
784
+ height: z.ZodOptional<z.ZodString>;
785
+ widthDirection: z.ZodOptional<z.ZodTuple<[z.ZodString, z.ZodString, z.ZodString], null>>;
786
+ systems: z.ZodArray<z.ZodString>;
787
+ }, z.core.$strict>>;
788
+ }, z.core.$strict>>;
789
+ }, z.core.$strip>;
790
+ export type PluginFamilyDefinition = z.infer<typeof PluginFamilyDefinition>;
440
791
  /** What `place` reports. */
441
792
  export interface PluginFamilyPlaceResult {
442
793
  ok: boolean;
@@ -464,6 +815,108 @@ export interface PluginFamilyInstanceParameters {
464
815
  parts?: PluginFamilyPart[];
465
816
  /** Present when `getParameters` was asked for a `snapshot`. */
466
817
  snapshot?: PluginFamilySnapshot;
818
+ /** The family's `outputs`, as last built. */
819
+ reports?: Record<string, number | string>;
820
+ /** Every declared nested child, as last built. */
821
+ children?: PluginFamilyNestedChild[];
822
+ /** Parameters that follow another object (links) or the host. */
823
+ follows?: PluginFamilyFollow[];
824
+ /** Where a hosted family sits: a system wall, or a family by id. */
825
+ host?: ({
826
+ kind: "wall";
827
+ } | {
828
+ kind: "family";
829
+ id: string;
830
+ }) & {
831
+ /** True when the host no longer has room for it: it is out of the model until it fits again. */
832
+ parked?: boolean;
833
+ };
834
+ /** Guests hosted in THIS family that no longer fit it (parked); they return when they fit. */
835
+ parkedGuests?: {
836
+ id: string;
837
+ family: string;
838
+ }[];
839
+ /** How it sits against other placed objects (attach, join, span, path), with current reports. */
840
+ relations?: PluginFamilyRelation[];
841
+ /** setParameters only: the edits refused, each with what to change instead. */
842
+ refused?: string[];
843
+ }
844
+ /** A nested child of a placed family. */
845
+ export interface PluginFamilyNestedChild {
846
+ /** "chair", or "chair/cushion" for a child of a child — the key for `children` edits. */
847
+ path: string;
848
+ label: string;
849
+ /** The family it is now (a slot's current pick). */
850
+ family: string;
851
+ familyLabel: string;
852
+ /** How many copies the parent places. */
853
+ copies: number;
854
+ slot?: {
855
+ expr: string;
856
+ options: string[];
857
+ };
858
+ values: Record<string, number | string>;
859
+ /** Values the parent sets, with the expression it sets them by. */
860
+ setBy: Record<string, string | undefined>;
861
+ reports: Record<string, number | string>;
862
+ }
863
+ /** A placed relation as stored, plus what it measures now. */
864
+ export type PluginFamilyRelation = PluginFamilyRelationInput & {
865
+ id: string;
866
+ /** "Attached to", "Joins", "Spans between", "Along a path", "Cuts host". */
867
+ label: string;
868
+ summary: string;
869
+ /** False when a target is gone: the family stayed where it was. */
870
+ live: boolean;
871
+ reports: Record<string, number | string>;
872
+ };
873
+ /** One relation to add (`relations.add`). Targets are handles, except a cut's symbolic "host". */
874
+ export type PluginFamilyRelationInput = {
875
+ /** Replaces the relation with this id; a new one gets "r1", "r2"… */
876
+ id?: string;
877
+ /** This family's parameter → an expression over the relation's reports and own parameters. */
878
+ bind?: Record<string, string>;
879
+ } & ({
880
+ kind: "attach";
881
+ side: "base" | "top";
882
+ to: ComponentHandle | {
883
+ level: number;
884
+ face?: "base" | "top";
885
+ };
886
+ offset?: number;
887
+ } | {
888
+ kind: "join";
889
+ end: "start" | "end";
890
+ to: ComponentHandle;
891
+ toEnd: "start" | "end";
892
+ /** The other family's parameters, over the same reports. */
893
+ bindOther?: Record<string, string>;
894
+ } | {
895
+ kind: "span";
896
+ from: ComponentHandle;
897
+ to: ComponentHandle;
898
+ at?: "top" | "centre" | "base";
899
+ } | {
900
+ kind: "path";
901
+ from?: ComponentHandle;
902
+ points?: [number, number, number][];
903
+ closed?: boolean;
904
+ } | {
905
+ /** Apply recipe voids to the existing host without adding another host ID. */
906
+ kind: "cut";
907
+ to: "host";
908
+ bind?: never;
909
+ });
910
+ /** One parameter that follows something else. */
911
+ export interface PluginFamilyFollow {
912
+ key: string;
913
+ /** "relation": set by a placed relation — `from` is the relation's id. */
914
+ kind: "link" | "host" | "relation";
915
+ /** The source's id. */
916
+ from: string;
917
+ fromLabel: string;
918
+ /** The expression over the source's reports (for a host: the report name). */
919
+ expr: string;
467
920
  }
468
921
  /** What `create` reports. */
469
922
  export interface PluginFamilyCreateResult {
@@ -475,6 +928,36 @@ export interface PluginFamilyCreateResult {
475
928
  placed?: boolean;
476
929
  /** Host guidance for the caller, e.g. that an instance was placed at the view centre. */
477
930
  hint?: string;
931
+ /**
932
+ * What the user chose in the app's window: `"version"` (a new version of
933
+ * the saved family), `"new"` (a new family), `"cancelled"` (nothing saved).
934
+ * `"saved"` = no question was needed.
935
+ */
936
+ decision?: "version" | "new" | "cancelled" | "saved";
937
+ /** The library name it was saved under. */
938
+ name?: string;
939
+ /** Placed copies in this project moved to the new version (the family's and updated parents'). */
940
+ movedCopies?: number;
941
+ /** What the moved copies lost because the new version no longer has it. */
942
+ dropped?: {
943
+ values: Array<{
944
+ copy: string;
945
+ key: string;
946
+ }>;
947
+ childValues: Array<{
948
+ copy: string;
949
+ path: string;
950
+ }>;
951
+ follows: Array<{
952
+ copy: string;
953
+ key: string;
954
+ kind: "link" | "relation";
955
+ }>;
956
+ };
957
+ /** Families nesting this one that the user chose to update, at their new versions. */
958
+ parentsUpdated?: PluginFamilyVersionRef[];
959
+ /** Families nesting this one that keep their version. */
960
+ parentsKept?: PluginFamilyVersionRef[];
478
961
  error?: string;
479
962
  }
480
963
  /** What `delete` reports. */
@@ -497,6 +980,30 @@ export interface PluginFamilyDeleteResult {
497
980
  export declare const PluginFamilyBundleSchema: z.ZodObject<{
498
981
  root: z.ZodRecord<z.ZodString, z.ZodUnknown>;
499
982
  deps: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
983
+ network: z.ZodOptional<z.ZodObject<{
984
+ schemaVersion: z.ZodLiteral<1>;
985
+ role: z.ZodEnum<{
986
+ pipe: "pipe";
987
+ duct: "duct";
988
+ wire: "wire";
989
+ cable: "cable";
990
+ conduit: "conduit";
991
+ cableDuct: "cableDuct";
992
+ cableTray: "cableTray";
993
+ connector: "connector";
994
+ equipment: "equipment";
995
+ }>;
996
+ lengthParameter: z.ZodOptional<z.ZodString>;
997
+ ports: z.ZodArray<z.ZodObject<{
998
+ id: z.ZodString;
999
+ position: z.ZodTuple<[z.ZodString, z.ZodString, z.ZodString], null>;
1000
+ direction: z.ZodTuple<[z.ZodString, z.ZodString, z.ZodString], null>;
1001
+ size: z.ZodString;
1002
+ height: z.ZodOptional<z.ZodString>;
1003
+ widthDirection: z.ZodOptional<z.ZodTuple<[z.ZodString, z.ZodString, z.ZodString], null>>;
1004
+ systems: z.ZodArray<z.ZodString>;
1005
+ }, z.core.$strict>>;
1006
+ }, z.core.$strict>>;
500
1007
  }, z.core.$strip>;
501
1008
  /**
502
1009
  * Arguments for {@linkcode PluginDesignFamilyApi.prepare}.
@@ -517,7 +1024,42 @@ export declare const PluginFamilyBundleSchema: z.ZodObject<{
517
1024
  * the viewport is not moved — and comes back as a PNG data URL in the result's
518
1025
  * `snapshot.image`. Through the agent's `run_worker`, return the result and the
519
1026
  * image reaches the model as an image.
1027
+ *
1028
+ * `focus` makes it a close-up: `{ parts: ["seat", "back", "slat@*"] }` frames
1029
+ * the joint where those groups meet (`*` matches any run of characters;
1030
+ * nested names are `a/b`), or their full bounds if they do not meet. A margin
1031
+ * of a quarter of their size (at least 50 mm) surrounds the joint.
1032
+ * `{ box: { min, max } }` frames a region in family space
1033
+ * (Snaptrude units, +Y up). Every other part is still drawn; the dimension line
1034
+ * then gives the framed region and the result says `closeUp: true`. A part
1035
+ * name that matches nothing fails the snapshot with a list of real names.
520
1036
  */
1037
+ export declare const PluginFamilySnapshotFocus: z.ZodUnion<readonly [z.ZodObject<{
1038
+ parts: z.ZodArray<z.ZodString>;
1039
+ }, z.core.$strip>, z.ZodObject<{
1040
+ box: z.ZodObject<{
1041
+ min: z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>;
1042
+ max: z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>;
1043
+ }, z.core.$strip>;
1044
+ }, z.core.$strip>]>;
1045
+ export type PluginFamilySnapshotFocus = z.infer<typeof PluginFamilySnapshotFocus>;
1046
+ /** One close-up tile; omission of view uses the sheet's first view. */
1047
+ export declare const PluginFamilySnapshotCloseUp: z.ZodIntersection<z.ZodUnion<readonly [z.ZodObject<{
1048
+ parts: z.ZodArray<z.ZodString>;
1049
+ }, z.core.$strip>, z.ZodObject<{
1050
+ box: z.ZodObject<{
1051
+ min: z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>;
1052
+ max: z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>;
1053
+ }, z.core.$strip>;
1054
+ }, z.core.$strip>]>, z.ZodObject<{
1055
+ view: z.ZodOptional<z.ZodEnum<{
1056
+ top: "top";
1057
+ front: "front";
1058
+ right: "right";
1059
+ iso: "iso";
1060
+ }>>;
1061
+ }, z.core.$strip>>;
1062
+ export type PluginFamilySnapshotCloseUp = z.infer<typeof PluginFamilySnapshotCloseUp>;
521
1063
  export declare const PluginFamilySnapshotOption: z.ZodUnion<readonly [z.ZodBoolean, z.ZodObject<{
522
1064
  views: z.ZodOptional<z.ZodArray<z.ZodEnum<{
523
1065
  top: "top";
@@ -526,6 +1068,28 @@ export declare const PluginFamilySnapshotOption: z.ZodUnion<readonly [z.ZodBoole
526
1068
  iso: "iso";
527
1069
  }>>>;
528
1070
  tileSize: z.ZodOptional<z.ZodNumber>;
1071
+ focus: z.ZodOptional<z.ZodUnion<readonly [z.ZodUnion<readonly [z.ZodObject<{
1072
+ parts: z.ZodArray<z.ZodString>;
1073
+ }, z.core.$strip>, z.ZodObject<{
1074
+ box: z.ZodObject<{
1075
+ min: z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>;
1076
+ max: z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>;
1077
+ }, z.core.$strip>;
1078
+ }, z.core.$strip>]>, z.ZodArray<z.ZodIntersection<z.ZodUnion<readonly [z.ZodObject<{
1079
+ parts: z.ZodArray<z.ZodString>;
1080
+ }, z.core.$strip>, z.ZodObject<{
1081
+ box: z.ZodObject<{
1082
+ min: z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>;
1083
+ max: z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>;
1084
+ }, z.core.$strip>;
1085
+ }, z.core.$strip>]>, z.ZodObject<{
1086
+ view: z.ZodOptional<z.ZodEnum<{
1087
+ top: "top";
1088
+ front: "front";
1089
+ right: "right";
1090
+ iso: "iso";
1091
+ }>>;
1092
+ }, z.core.$strip>>>]>>;
529
1093
  }, z.core.$strip>]>;
530
1094
  export type PluginFamilySnapshotOption = z.infer<typeof PluginFamilySnapshotOption>;
531
1095
  /** The picture block on prepare / flex / getParameters results when `snapshot` was asked for. */
@@ -534,9 +1098,18 @@ export interface PluginFamilySnapshot {
534
1098
  /** PNG data URL of the composed sheet. */
535
1099
  image?: string;
536
1100
  views?: ("iso" | "front" | "right" | "top")[];
537
- /** [width, height, depth] in Snaptrude units. */
1101
+ /** [width, height, depth] in SU. For a close-up list, this remains the whole family's size. */
538
1102
  size?: [number, number, number];
539
1103
  ms?: number;
1104
+ /** True when the sheet is a close-up (`focus`), not the whole family. */
1105
+ closeUp?: boolean;
1106
+ /** Per-tile results for a focus list. One invalid target does not discard other tiles. */
1107
+ closeUps?: Array<{
1108
+ view: "iso" | "front" | "right" | "top";
1109
+ label: string;
1110
+ size?: [number, number, number];
1111
+ error?: string;
1112
+ }>;
540
1113
  /** Set when the picture could not be taken (e.g. the legacy renderer); the call itself still succeeded. */
541
1114
  error?: string;
542
1115
  }
@@ -544,10 +1117,58 @@ export declare const PluginDesignFamilyPrepareArgs: z.ZodObject<{
544
1117
  bundle: z.ZodOptional<z.ZodObject<{
545
1118
  root: z.ZodRecord<z.ZodString, z.ZodUnknown>;
546
1119
  deps: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
1120
+ network: z.ZodOptional<z.ZodObject<{
1121
+ schemaVersion: z.ZodLiteral<1>;
1122
+ role: z.ZodEnum<{
1123
+ pipe: "pipe";
1124
+ duct: "duct";
1125
+ wire: "wire";
1126
+ cable: "cable";
1127
+ conduit: "conduit";
1128
+ cableDuct: "cableDuct";
1129
+ cableTray: "cableTray";
1130
+ connector: "connector";
1131
+ equipment: "equipment";
1132
+ }>;
1133
+ lengthParameter: z.ZodOptional<z.ZodString>;
1134
+ ports: z.ZodArray<z.ZodObject<{
1135
+ id: z.ZodString;
1136
+ position: z.ZodTuple<[z.ZodString, z.ZodString, z.ZodString], null>;
1137
+ direction: z.ZodTuple<[z.ZodString, z.ZodString, z.ZodString], null>;
1138
+ size: z.ZodString;
1139
+ height: z.ZodOptional<z.ZodString>;
1140
+ widthDirection: z.ZodOptional<z.ZodTuple<[z.ZodString, z.ZodString, z.ZodString], null>>;
1141
+ systems: z.ZodArray<z.ZodString>;
1142
+ }, z.core.$strict>>;
1143
+ }, z.core.$strict>>;
547
1144
  }, z.core.$strip>>;
548
1145
  spec: z.ZodOptional<z.ZodObject<{
549
1146
  root: z.ZodRecord<z.ZodString, z.ZodUnknown>;
550
1147
  deps: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
1148
+ network: z.ZodOptional<z.ZodObject<{
1149
+ schemaVersion: z.ZodLiteral<1>;
1150
+ role: z.ZodEnum<{
1151
+ pipe: "pipe";
1152
+ duct: "duct";
1153
+ wire: "wire";
1154
+ cable: "cable";
1155
+ conduit: "conduit";
1156
+ cableDuct: "cableDuct";
1157
+ cableTray: "cableTray";
1158
+ connector: "connector";
1159
+ equipment: "equipment";
1160
+ }>;
1161
+ lengthParameter: z.ZodOptional<z.ZodString>;
1162
+ ports: z.ZodArray<z.ZodObject<{
1163
+ id: z.ZodString;
1164
+ position: z.ZodTuple<[z.ZodString, z.ZodString, z.ZodString], null>;
1165
+ direction: z.ZodTuple<[z.ZodString, z.ZodString, z.ZodString], null>;
1166
+ size: z.ZodString;
1167
+ height: z.ZodOptional<z.ZodString>;
1168
+ widthDirection: z.ZodOptional<z.ZodTuple<[z.ZodString, z.ZodString, z.ZodString], null>>;
1169
+ systems: z.ZodArray<z.ZodString>;
1170
+ }, z.core.$strict>>;
1171
+ }, z.core.$strict>>;
551
1172
  }, z.core.$strip>>;
552
1173
  snapshot: z.ZodOptional<z.ZodUnion<readonly [z.ZodBoolean, z.ZodObject<{
553
1174
  views: z.ZodOptional<z.ZodArray<z.ZodEnum<{
@@ -557,6 +1178,28 @@ export declare const PluginDesignFamilyPrepareArgs: z.ZodObject<{
557
1178
  iso: "iso";
558
1179
  }>>>;
559
1180
  tileSize: z.ZodOptional<z.ZodNumber>;
1181
+ focus: z.ZodOptional<z.ZodUnion<readonly [z.ZodUnion<readonly [z.ZodObject<{
1182
+ parts: z.ZodArray<z.ZodString>;
1183
+ }, z.core.$strip>, z.ZodObject<{
1184
+ box: z.ZodObject<{
1185
+ min: z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>;
1186
+ max: z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>;
1187
+ }, z.core.$strip>;
1188
+ }, z.core.$strip>]>, z.ZodArray<z.ZodIntersection<z.ZodUnion<readonly [z.ZodObject<{
1189
+ parts: z.ZodArray<z.ZodString>;
1190
+ }, z.core.$strip>, z.ZodObject<{
1191
+ box: z.ZodObject<{
1192
+ min: z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>;
1193
+ max: z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>;
1194
+ }, z.core.$strip>;
1195
+ }, z.core.$strip>]>, z.ZodObject<{
1196
+ view: z.ZodOptional<z.ZodEnum<{
1197
+ top: "top";
1198
+ front: "front";
1199
+ right: "right";
1200
+ iso: "iso";
1201
+ }>>;
1202
+ }, z.core.$strip>>>]>>;
560
1203
  }, z.core.$strip>]>>;
561
1204
  }, z.core.$strip>;
562
1205
  export type PluginDesignFamilyPrepareArgs = z.infer<typeof PluginDesignFamilyPrepareArgs>;
@@ -565,11 +1208,11 @@ export type PluginDesignFamilyPrepareArgs = z.infer<typeof PluginDesignFamilyPre
565
1208
  *
566
1209
  * | Property | Type | Description |
567
1210
  * |---|---|---|
568
- * | `values` | `Record<string, number \| string>` | Parameter values to change (partial) |
1211
+ * | `values` | `Record<string, number \| string>` | Optional sparse changes; omission does not rebuild |
569
1212
  * | `snapshot` | {@linkcode PluginFamilySnapshotOption} | Also return a picture of the flexed family |
570
1213
  */
571
1214
  export declare const PluginDesignFamilyFlexArgs: z.ZodObject<{
572
- values: z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodNumber, z.ZodString]>>;
1215
+ values: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodNumber, z.ZodString]>>>;
573
1216
  snapshot: z.ZodOptional<z.ZodUnion<readonly [z.ZodBoolean, z.ZodObject<{
574
1217
  views: z.ZodOptional<z.ZodArray<z.ZodEnum<{
575
1218
  top: "top";
@@ -578,20 +1221,121 @@ export declare const PluginDesignFamilyFlexArgs: z.ZodObject<{
578
1221
  iso: "iso";
579
1222
  }>>>;
580
1223
  tileSize: z.ZodOptional<z.ZodNumber>;
1224
+ focus: z.ZodOptional<z.ZodUnion<readonly [z.ZodUnion<readonly [z.ZodObject<{
1225
+ parts: z.ZodArray<z.ZodString>;
1226
+ }, z.core.$strip>, z.ZodObject<{
1227
+ box: z.ZodObject<{
1228
+ min: z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>;
1229
+ max: z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>;
1230
+ }, z.core.$strip>;
1231
+ }, z.core.$strip>]>, z.ZodArray<z.ZodIntersection<z.ZodUnion<readonly [z.ZodObject<{
1232
+ parts: z.ZodArray<z.ZodString>;
1233
+ }, z.core.$strip>, z.ZodObject<{
1234
+ box: z.ZodObject<{
1235
+ min: z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>;
1236
+ max: z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>;
1237
+ }, z.core.$strip>;
1238
+ }, z.core.$strip>]>, z.ZodObject<{
1239
+ view: z.ZodOptional<z.ZodEnum<{
1240
+ top: "top";
1241
+ front: "front";
1242
+ right: "right";
1243
+ iso: "iso";
1244
+ }>>;
1245
+ }, z.core.$strip>>>]>>;
581
1246
  }, z.core.$strip>]>>;
582
1247
  }, z.core.$strip>;
583
1248
  export type PluginDesignFamilyFlexArgs = z.infer<typeof PluginDesignFamilyFlexArgs>;
1249
+ /**
1250
+ * Arguments for {@linkcode PluginDesignFamilyApi.get}. All optional — no
1251
+ * arguments returns the prepared draft.
1252
+ *
1253
+ * | Property | Type | Description |
1254
+ * |---|---|---|
1255
+ * | `id` | `string` | A saved family to open for editing, from {@linkcode PluginDesignFamilyApi.list} |
1256
+ * | `version` | `number` | Exact version to open; defaults to the newest |
1257
+ * | `component` | {@linkcode ComponentHandle} | Open the family of this placed copy, at its version |
1258
+ */
1259
+ export declare const PluginDesignFamilyGetArgs: z.ZodObject<{
1260
+ id: z.ZodOptional<z.ZodString>;
1261
+ version: z.ZodOptional<z.ZodNumber>;
1262
+ component: z.ZodOptional<z.ZodPipe<z.ZodString, z.ZodTransform<ComponentHandle, string>>>;
1263
+ }, z.core.$strip>;
1264
+ export type PluginDesignFamilyGetArgs = z.infer<typeof PluginDesignFamilyGetArgs>;
1265
+ /**
1266
+ * Arguments for {@linkcode PluginDesignFamilyApi.getExamples}.
1267
+ *
1268
+ * | Property | Type | Description |
1269
+ * |---|---|---|
1270
+ * | `id` | `string` | One example's id — returns its bundle |
1271
+ * | `discipline` | `string` | List only this discipline: architecture, structure, mep, furniture |
1272
+ * | `tag` | `string` | List only examples teaching this pattern (e.g. "path", "union") |
1273
+ */
1274
+ export declare const PluginDesignFamilyGetExamplesArgs: z.ZodObject<{
1275
+ id: z.ZodOptional<z.ZodString>;
1276
+ discipline: z.ZodOptional<z.ZodEnum<{
1277
+ architecture: "architecture";
1278
+ structure: "structure";
1279
+ mep: "mep";
1280
+ furniture: "furniture";
1281
+ }>>;
1282
+ tag: z.ZodOptional<z.ZodString>;
1283
+ }, z.core.$strip>;
1284
+ export type PluginDesignFamilyGetExamplesArgs = z.infer<typeof PluginDesignFamilyGetExamplesArgs>;
1285
+ /**
1286
+ * Arguments for {@linkcode PluginDesignFamilyApi.getTemplate}.
1287
+ * `kind` selects the opening contract. `subType` is a nonempty type token;
1288
+ * omission selects singleDoor / fixedWindow. Unsupported tokens return the
1289
+ * default template with guidance rather than preventing custom subtype authoring.
1290
+ */
1291
+ export declare const PluginDesignFamilyGetTemplateArgs: z.ZodObject<{
1292
+ kind: z.ZodEnum<{
1293
+ door: "door";
1294
+ window: "window";
1295
+ }>;
1296
+ subType: z.ZodOptional<z.ZodString>;
1297
+ }, z.core.$strip>;
1298
+ export type PluginDesignFamilyGetTemplateArgs = z.infer<typeof PluginDesignFamilyGetTemplateArgs>;
1299
+ /**
1300
+ * Maps opening dimensions to authored length parameter KEYS, not values.
1301
+ * Width and height describe the wall hole; sill measures from the wall base
1302
+ * to the hole bottom (windows). Wall thickness follows the host wall.
1303
+ * The recipe and family parameter APIs use Snaptrude units (1 SU = 254 mm).
1304
+ */
1305
+ export interface PluginFamilyOpeningContract {
1306
+ kind: "door" | "window";
1307
+ width: string;
1308
+ height: string;
1309
+ sill?: string;
1310
+ wallThickness?: string;
1311
+ }
1312
+ /** Starter recipe metadata returned by `getTemplate`; instances are ParametricComponents. */
1313
+ export interface PluginFamilyTemplateResult {
1314
+ /** Validated recipe bundle: edit its style while preserving the contract. */
1315
+ bundle: PluginFamilyBundle;
1316
+ contract: PluginFamilyOpeningContract;
1317
+ /** Actual template subtype, including when an unsupported token used the default. */
1318
+ subType: string;
1319
+ /** Authoring rules and any note about an unsupported requested subtype. */
1320
+ guidance: string[];
1321
+ /** Available starter templates for the requested kind. */
1322
+ available: Array<{
1323
+ subType: string;
1324
+ label: string;
1325
+ teaches: string[];
1326
+ }>;
1327
+ }
584
1328
  /**
585
1329
  * Arguments for {@linkcode PluginDesignFamilyApi.create}.
586
1330
  *
587
1331
  * | Property | Type | Description |
588
1332
  * |---|---|---|
589
1333
  * | `name` | `string` | Library name; defaults to the spec's own label |
590
- * | `teamId` | `string` | Team library to save into; omit for personal |
1334
+ * | `teamId` | `string \| null` | Library to save into: a team's id, or `null` for the personal library. Omit for the open project's team library (personal in a personal project) |
591
1335
  */
592
1336
  export declare const PluginDesignFamilyCreateArgs: z.ZodObject<{
593
1337
  name: z.ZodOptional<z.ZodString>;
594
- teamId: z.ZodOptional<z.ZodString>;
1338
+ teamId: z.ZodOptional<z.ZodNullable<z.ZodString>>;
595
1339
  }, z.core.$strip>;
596
1340
  export type PluginDesignFamilyCreateArgs = z.infer<typeof PluginDesignFamilyCreateArgs>;
597
1341
  /**
@@ -614,22 +1358,25 @@ export type PluginDesignFamilyDeleteArgs = z.infer<typeof PluginDesignFamilyDele
614
1358
  * |---|---|---|
615
1359
  * | `id` | `string` | Family to place, from {@linkcode PluginDesignFamilyApi.list}. Omit to place the prepared draft |
616
1360
  * | `version` | `number` | Exact version; defaults to the newest known |
617
- * | `position` | `{ x, y, z }` | Place HERE, without user interaction. Omit to arm the cursor instead |
1361
+ * | `position` | `Vec3Handle` or `{ x, y, z }` | Place here in SU. Prefer a vec3 handle; coordinates remain for existing callers. Omit to arm the cursor |
618
1362
  * | `rotation` | `number` | Yaw in degrees about +Y. Only with `position` |
619
1363
  * | `values` | `Record<string, number \| string>` | Parameter values for THIS instance |
620
- * | `storey` | `number` | Storey to place on; defaults to the active one |
1364
+ * | `storey` | `number` | Target storey (integer: 1 ground, 2 first floor, -1 basement; must already exist). The family is lifted to that storey's base and `position.y` is an offset above it, like `design.create.walls`. Without it, `position` is absolute and the storey is derived from where the family's geometry sits. Ignored with `host`: a hosted family follows its host |
1365
+ * | `teamId` | `string \| null` | Library an unsaved draft saves to before it is placed: a team's id, or `null` for the personal library. Omit for the open project's team library (personal in a personal project). Ignored for a family already in a library |
621
1366
  */
622
1367
  export declare const PluginDesignFamilyPlaceArgs: z.ZodObject<{
623
1368
  id: z.ZodOptional<z.ZodString>;
624
1369
  version: z.ZodOptional<z.ZodNumber>;
625
- position: z.ZodOptional<z.ZodObject<{
1370
+ position: z.ZodOptional<z.ZodUnion<readonly [z.ZodPipe<z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodString>, z.ZodTransform<import("../..").Handle<"vec3">, string>>, z.ZodObject<{
626
1371
  x: z.ZodNumber;
627
1372
  y: z.ZodNumber;
628
1373
  z: z.ZodNumber;
629
- }, z.core.$strip>>;
1374
+ }, z.core.$strip>]>>;
630
1375
  rotation: z.ZodOptional<z.ZodNumber>;
631
1376
  values: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodNumber, z.ZodString]>>>;
632
1377
  storey: z.ZodOptional<z.ZodNumber>;
1378
+ host: z.ZodOptional<z.ZodPipe<z.ZodString, z.ZodTransform<ComponentHandle, string>>>;
1379
+ teamId: z.ZodOptional<z.ZodNullable<z.ZodString>>;
633
1380
  }, z.core.$strip>;
634
1381
  export type PluginDesignFamilyPlaceArgs = z.infer<typeof PluginDesignFamilyPlaceArgs>;
635
1382
  /**
@@ -649,6 +1396,28 @@ export declare const PluginDesignFamilyGetParametersArgs: z.ZodObject<{
649
1396
  iso: "iso";
650
1397
  }>>>;
651
1398
  tileSize: z.ZodOptional<z.ZodNumber>;
1399
+ focus: z.ZodOptional<z.ZodUnion<readonly [z.ZodUnion<readonly [z.ZodObject<{
1400
+ parts: z.ZodArray<z.ZodString>;
1401
+ }, z.core.$strip>, z.ZodObject<{
1402
+ box: z.ZodObject<{
1403
+ min: z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>;
1404
+ max: z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>;
1405
+ }, z.core.$strip>;
1406
+ }, z.core.$strip>]>, z.ZodArray<z.ZodIntersection<z.ZodUnion<readonly [z.ZodObject<{
1407
+ parts: z.ZodArray<z.ZodString>;
1408
+ }, z.core.$strip>, z.ZodObject<{
1409
+ box: z.ZodObject<{
1410
+ min: z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>;
1411
+ max: z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>;
1412
+ }, z.core.$strip>;
1413
+ }, z.core.$strip>]>, z.ZodObject<{
1414
+ view: z.ZodOptional<z.ZodEnum<{
1415
+ top: "top";
1416
+ front: "front";
1417
+ right: "right";
1418
+ iso: "iso";
1419
+ }>>;
1420
+ }, z.core.$strip>>>]>>;
652
1421
  }, z.core.$strip>]>>;
653
1422
  }, z.core.$strip>;
654
1423
  export type PluginDesignFamilyGetParametersArgs = z.infer<typeof PluginDesignFamilyGetParametersArgs>;
@@ -662,7 +1431,16 @@ export type PluginDesignFamilyGetParametersArgs = z.infer<typeof PluginDesignFam
662
1431
  */
663
1432
  export declare const PluginDesignFamilySetParametersArgs: z.ZodObject<{
664
1433
  component: z.ZodPipe<z.ZodString, z.ZodTransform<ComponentHandle, string>>;
665
- values: z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodNumber, z.ZodString]>>;
1434
+ values: z.ZodDefault<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodNumber, z.ZodString]>>>>;
1435
+ children: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodNumber, z.ZodString]>>>>;
1436
+ links: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodObject<{
1437
+ from: z.ZodPipe<z.ZodString, z.ZodTransform<ComponentHandle, string>>;
1438
+ expr: z.ZodString;
1439
+ }, z.core.$strip>, z.ZodNull]>>>;
1440
+ relations: z.ZodOptional<z.ZodObject<{
1441
+ add: z.ZodOptional<z.ZodArray<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
1442
+ remove: z.ZodOptional<z.ZodArray<z.ZodString>>;
1443
+ }, z.core.$strip>>;
666
1444
  }, z.core.$strip>;
667
1445
  export type PluginDesignFamilySetParametersArgs = z.infer<typeof PluginDesignFamilySetParametersArgs>;
668
1446
  //# sourceMappingURL=family.d.ts.map