@snaptrude/plugin-core 0.9.15 → 0.9.16-networks-20261009.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 (59) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/dist/api/analysis/daylight.d.ts +5 -5
  3. package/dist/api/analysis/solar.d.ts +2 -2
  4. package/dist/api/core/camera/index.d.ts +418 -0
  5. package/dist/api/core/camera/index.d.ts.map +1 -1
  6. package/dist/api/design/bim.d.ts +209 -0
  7. package/dist/api/design/bim.d.ts.map +1 -0
  8. package/dist/api/design/catalog.d.ts +242 -0
  9. package/dist/api/design/catalog.d.ts.map +1 -0
  10. package/dist/api/design/create/bulk-items.d.ts +40 -21
  11. package/dist/api/design/create/bulk-items.d.ts.map +1 -1
  12. package/dist/api/design/create/index.d.ts +120 -97
  13. package/dist/api/design/create/index.d.ts.map +1 -1
  14. package/dist/api/design/create/opening-fields.d.ts +13 -12
  15. package/dist/api/design/create/opening-fields.d.ts.map +1 -1
  16. package/dist/api/design/doors/index.d.ts +18 -24
  17. package/dist/api/design/doors/index.d.ts.map +1 -1
  18. package/dist/api/design/family.d.ts +576 -12
  19. package/dist/api/design/family.d.ts.map +1 -1
  20. package/dist/api/design/index.d.ts +16 -0
  21. package/dist/api/design/index.d.ts.map +1 -1
  22. package/dist/api/design/networks.d.ts +1703 -0
  23. package/dist/api/design/networks.d.ts.map +1 -0
  24. package/dist/api/design/query/index.d.ts +30 -30
  25. package/dist/api/design/selection/index.d.ts +10 -10
  26. package/dist/api/design/types/index.d.ts +40 -24
  27. package/dist/api/design/types/index.d.ts.map +1 -1
  28. package/dist/api/design/update/index.d.ts +40 -3
  29. package/dist/api/design/update/index.d.ts.map +1 -1
  30. package/dist/api/design/windows/index.d.ts +8 -8
  31. package/dist/api/design/windows/index.d.ts.map +1 -1
  32. package/dist/api/presentation/aiInspiration.d.ts +10 -10
  33. package/dist/api/presentation/index.d.ts +9 -0
  34. package/dist/api/presentation/index.d.ts.map +1 -1
  35. package/dist/api/presentation/walkthroughs.d.ts +1350 -0
  36. package/dist/api/presentation/walkthroughs.d.ts.map +1 -0
  37. package/dist/index.cjs +3262 -2185
  38. package/dist/index.cjs.map +1 -1
  39. package/dist/index.js +3153 -2185
  40. package/dist/index.js.map +1 -1
  41. package/package.json +1 -1
  42. package/scripts/generate-manifest.mjs +5 -0
  43. package/src/api/core/camera/index.ts +400 -1
  44. package/src/api/design/bim.ts +121 -0
  45. package/src/api/design/catalog.ts +128 -0
  46. package/src/api/design/create/bulk-items.ts +23 -16
  47. package/src/api/design/create/index.ts +129 -119
  48. package/src/api/design/create/opening-fields.ts +15 -12
  49. package/src/api/design/doors/index.ts +58 -42
  50. package/src/api/design/family.ts +470 -17
  51. package/src/api/design/index.ts +34 -4
  52. package/src/api/design/networks.ts +607 -0
  53. package/src/api/design/types/index.ts +31 -24
  54. package/src/api/design/update/index.ts +41 -3
  55. package/src/api/design/windows/index.ts +40 -22
  56. package/src/api/presentation/index.ts +9 -0
  57. package/src/api/presentation/walkthroughs.ts +1201 -0
  58. package/api-manifest.full.json +0 -8930
  59. package/api-manifest.json +0 -9318
@@ -1,23 +1,25 @@
1
1
  import * as z from "zod"
2
2
  import { PluginApiReturn } from "../../../types"
3
3
 
4
+ /** An exact saved native wall family. Access is checked on every use; Draw selection is not registration. */
5
+ export const PluginNativeWallType = z.object({
6
+ id: z.string().min(1),
7
+ version: z.number().int().positive(),
8
+ })
9
+ export type PluginNativeWallType = z.infer<typeof PluginNativeWallType>
10
+
11
+ /** Legacy project type name/id, or an exact authorized native wall family pin. */
12
+ export const PluginWallType = z.union([z.string().trim().min(1), PluginNativeWallType])
13
+ export type PluginWallType = z.infer<typeof PluginWallType>
14
+
4
15
  /**
5
- * `snaptrude.design.types` — READ-ONLY reference over the project's building
6
- * **type / assembly** system (the Project Properties layer stacks: External /
7
- * Internal walls, slabs, floors, ceilings, roofs). A type bundles a labelled
8
- * layer stack — each layer's role, thickness (engine units) and material — plus a
9
- * summed total thickness. Both the built-in defaults and any team/user-added types
10
- * are surfaced.
11
- *
12
- * Types are plain value records ({@linkcode PluginBuildingType}) — NOT scene
13
- * entities/handles. A type's `id` is a stable `"<kind>:<name>"` token
14
- * (e.g. `"wall:brickWithPlasterAndPaint"`) returned by
15
- * {@linkcode PluginDesignTypesApi.list} and consumed by
16
- * {@linkcode PluginDesignTypesApi.get}. Reads never throw — an unknown id yields
17
- * `null`; a kind with no types yields `[]`.
18
- *
19
- * These are reads only: there is no engine seam to author a type from a plugin
20
- * (types are created through the construction/project-properties UI).
16
+ * Read-only project assemblies and authorized saved native wall families.
17
+ * Legacy ids use `"<kind>:<name>"`. Native wall records carry `nativeFamily`:
18
+ * pass that exact `{ id, version }` pin to get, create.walls, create.wallRuns,
19
+ * or update.wall. Labels and bare definition ids do not select native families.
20
+ * Native lengths use Snaptrude units (1 SU = 254 mm).
21
+ * Missing ids return null; catalog/network failures reject rather than return
22
+ * an incomplete catalog. Author native families with design.family.
21
23
  */
22
24
  export abstract class PluginDesignTypesApi {
23
25
  constructor() {}
@@ -46,10 +48,10 @@ export abstract class PluginDesignTypesApi {
46
48
  ): PluginApiReturn<PluginBuildingTypeSummary[]>
47
49
 
48
50
  /**
49
- * Get one building type by its `"<kind>:<name>"` id — its labelled layer stack
51
+ * Get one building type by its legacy id or exact native wall pin — its labelled layer stack
50
52
  * (each layer's role, thickness and material) plus the summed total thickness.
51
53
  *
52
- * @param typeId The type id from {@linkcode PluginDesignTypesApi.list} (e.g. `"wall:exposedConcrete"`)
54
+ * @param typeId The legacy id or nativeFamily pin from {@linkcode PluginDesignTypesApi.list}
53
55
  * @returns The full type, or `null` if no type matches
54
56
  *
55
57
  * @examplePrompt What layers make up this wall type?
@@ -60,11 +62,11 @@ export abstract class PluginDesignTypesApi {
60
62
  * # Example
61
63
  * ```ts
62
64
  * const [first] = await snaptrude.design.types.list("wall")
63
- * const type = await snaptrude.design.types.get(first.id)
65
+ * const type = await snaptrude.design.types.get(first.nativeFamily ?? first.id)
64
66
  * if (type) for (const layer of type.layers) console.log(layer.name, layer.thickness)
65
67
  * ```
66
68
  */
67
- public abstract get(typeId: string): PluginApiReturn<PluginBuildingType | null>
69
+ public abstract get(typeId: PluginWallType): PluginApiReturn<PluginBuildingType | null>
68
70
  }
69
71
 
70
72
  /** The building-type families exposed by {@linkcode PluginDesignTypesApi}. */
@@ -85,6 +87,8 @@ export const PluginTypeLayer = z.object({
85
87
  name: z.string(),
86
88
  role: z.string(),
87
89
  thickness: z.number(),
90
+ /** Native authored core membership. Never inferred from material or layer name. */
91
+ isCore: z.boolean().optional(),
88
92
  material: z
89
93
  .object({
90
94
  name: z.string(),
@@ -99,7 +103,7 @@ export type PluginTypeLayer = z.infer<typeof PluginTypeLayer>
99
103
  *
100
104
  * | Property | Type | Description |
101
105
  * |---|---|---|
102
- * | `id` | `string` | Stable `"<kind>:<name>"` token — pass to `design.types.get` |
106
+ * | `id` | `string` | Legacy `"<kind>:<name>"` token or native definition id; native lookups use `nativeFamily` |
103
107
  * | `kind` | {@linkcode PluginBuildingTypeKind} | Which family it belongs to |
104
108
  * | `label` | `string` | Human-readable label |
105
109
  * | `isDefault` | `boolean` | `true` for a built-in type, `false` for a team/user type |
@@ -111,6 +115,8 @@ export const PluginBuildingTypeSummary = z.object({
111
115
  label: z.string(),
112
116
  isDefault: z.boolean(),
113
117
  thickness: z.number(),
118
+ /** Present for native walls. Pass the whole pin to get/create/update, not its label or bare id. */
119
+ nativeFamily: PluginNativeWallType.optional(),
114
120
  })
115
121
  export type PluginBuildingTypeSummary = z.infer<typeof PluginBuildingTypeSummary>
116
122
 
@@ -119,7 +125,7 @@ export type PluginBuildingTypeSummary = z.infer<typeof PluginBuildingTypeSummary
119
125
  *
120
126
  * | Property | Type | Description |
121
127
  * |---|---|---|
122
- * | `id` | `string` | Stable `"<kind>:<name>"` token |
128
+ * | `id` | `string` | Legacy type token or native definition id |
123
129
  * | `kind` | {@linkcode PluginBuildingTypeKind} | Which family it belongs to |
124
130
  * | `label` | `string` | Human-readable label |
125
131
  * | `isDefault` | `boolean` | `true` for a built-in type |
@@ -148,9 +154,10 @@ export type PluginDesignTypesListArgs = z.infer<typeof PluginDesignTypesListArgs
148
154
  *
149
155
  * | Property | Type | Description |
150
156
  * |---|---|---|
151
- * | `typeId` | `string` | The `"<kind>:<name>"` id from `design.types.list` |
157
+ * | `typeId` | {@linkcode PluginWallType} | A legacy `"<kind>:<name>"` id or exact `nativeFamily` pin from `design.types.list` |
152
158
  */
153
159
  export const PluginDesignTypesGetArgs = z.object({
154
- typeId: z.string(),
160
+ // Preserve legacy lookup behavior: malformed string ids return null in the host.
161
+ typeId: z.union([z.string(), PluginNativeWallType]),
155
162
  })
156
163
  export type PluginDesignTypesGetArgs = z.infer<typeof PluginDesignTypesGetArgs>
@@ -9,7 +9,10 @@ import {
9
9
  PluginSpaceUpdateResult,
10
10
  } from "../../entity/space"
11
11
  import { PluginDesignChangeResult } from "../lock"
12
- import { MassParametersPatch, type MassParametersRecord } from "../../../massParameters"
12
+ import {
13
+ MassParametersPatch,
14
+ type MassParametersRecord,
15
+ } from "../../../massParameters"
13
16
  import {
14
17
  PluginBuildableEnvelopePolygonVertex,
15
18
  PluginBuildableEnvelopeSetbackTier,
@@ -18,6 +21,12 @@ import {
18
21
  } from "../../entity/buildableEnvelope"
19
22
  import { PluginGridStyleOptions } from "../create/grids"
20
23
  import { PluginEntityType } from "../query"
24
+ import { PluginWallType } from "../types"
25
+ import {
26
+ PluginConstructionType,
27
+ PluginFamilyValues,
28
+ type PluginFamilyUpdates,
29
+ } from "../catalog"
21
30
 
22
31
  /**
23
32
  * Sparse property updates for a space. Only provided fields change.
@@ -165,13 +174,14 @@ export type PluginDesignUpdateParametersArgs = z.infer<
165
174
  * |---|---|---|
166
175
  * | `thickness` | `number`? | Wall thickness, engine units (> 0) |
167
176
  * | `height` | `number`? | Wall height, engine units (> 0) |
168
- * | `type` | `string`? | Convert the wall to another wall type — a name (or `wall:`-prefixed id) from `design.types.list("wall")` |
177
+ * | `type` | {@linkcode PluginWallType}? | Legacy name/id or exact authorized native `{ id, version }` pin from `design.types.list("wall")` |
169
178
  */
170
179
  export const PluginWallUpdates = z
171
180
  .object({
172
181
  thickness: z.number().positive().optional(),
173
182
  height: z.number().positive().optional(),
174
- type: z.string().trim().min(1).optional(),
183
+ type: PluginWallType.optional(),
184
+ values: PluginFamilyValues.optional(),
175
185
  })
176
186
  .refine((p) => Object.keys(p).length > 0, {
177
187
  message: "PluginWallUpdates requires at least one field to change",
@@ -196,6 +206,8 @@ export const PluginSlabUpdates = z
196
206
  .object({
197
207
  thickness: z.number().positive().optional(),
198
208
  overhang: z.number().optional(),
209
+ type: PluginConstructionType.optional(),
210
+ values: PluginFamilyValues.optional(),
199
211
  })
200
212
  .refine((p) => Object.keys(p).length > 0, {
201
213
  message: "PluginSlabUpdates requires at least one field to change",
@@ -313,6 +325,11 @@ export type PluginDesignUpdateGridArgs = z.infer<
313
325
  *
314
326
  * Migrated from the removed `entity.space.{update, updateGeometryFromProfile, bulkUpdate}`.
315
327
  * Only provided fields change; each call is undoable. Failures throw (RPC rejects).
328
+ *
329
+ * Native family edits accept `type` and/or sparse `values` from `design.catalog`.
330
+ * Length overrides use mm; dimensional arguments use SU. Contours and axes stay unchanged.
331
+ * Shared/type overrides are refused. A thickness argument must agree with the layer values.
332
+ * Family roof overhang is unsupported; use the native slab path for family overhang edits.
316
333
  */
317
334
  export abstract class PluginDesignUpdateApi {
318
335
  constructor() {}
@@ -566,6 +583,9 @@ export abstract class PluginDesignUpdateApi {
566
583
  * chamfer (the kernel numbers its faces differently): send the twist/taper
567
584
  * keys with `operations: []` first (the message names them), re-select on
568
585
  * the new shape, then send `{ operations }` back.
586
+ * Graph-bound spaces accept amount-only extrusion edits. Footprint, twist,
587
+ * taper and operation edits require the owning boundary tools, so generated
588
+ * walls, junctions and hosted openings remain synchronized.
569
589
  * @throws VALIDATION for a key the kind does not have (the message lists the
570
590
  * kind's keys), `kind` or `version` in a partial patch, or a value outside
571
591
  * the constructor's own rules (torus tube ≥ ring, revolution angle ∉
@@ -773,6 +793,24 @@ export abstract class PluginDesignUpdateApi {
773
793
  updates: PluginSlabUpdates,
774
794
  ): PluginApiReturn<PluginDesignChangeResult>
775
795
 
796
+ /** Replace a native beam family while preserving its authored axis. Values use mm/degrees.
797
+ * @param component Native beam. @param updates Saved family reference and optional instance values.
798
+ * @returns Affected component IDs. One undoable operation; unsupported geometry fails before mutation.
799
+ */
800
+ public abstract beam(
801
+ component: ComponentHandle,
802
+ updates: PluginFamilyUpdates,
803
+ ): PluginApiReturn<PluginDesignChangeResult>
804
+
805
+ /** Replace a native column family while preserving its authored axis. Values use mm/degrees.
806
+ * @param component Native column. @param updates Saved family reference and optional instance values.
807
+ * @returns Affected component IDs. One undoable operation; unsupported geometry fails before mutation.
808
+ */
809
+ public abstract column(
810
+ component: ComponentHandle,
811
+ updates: PluginFamilyUpdates,
812
+ ): PluginApiReturn<PluginDesignChangeResult>
813
+
776
814
  /**
777
815
  * Set a component's **absolute world elevation** — moves it vertically so its
778
816
  * base (the bounding-box bottom, world Y) lands at `elevation`. Composed over
@@ -10,13 +10,14 @@ import { PluginObjectCatalogGroup, PluginObjectCatalogItem } from "../doors"
10
10
  * at `design.query.*`. Window targets are {@linkcode ComponentHandle}s.
11
11
  *
12
12
  * The **catalog** reads (`listCatalogGroups`/`listCatalog`/`getCatalogItem`/`exists`)
13
- * browse the placeable window library — plain value records keyed by a library id
14
- * (team `_id` or general `fullName`), NOT handles — and feed `design.create.window`.
15
- * They are network-backed but carry no `Async` suffix (§6.6) and never throw
16
- * (`[]`/`null`). The {@linkcode PluginObjectCatalogGroup} / {@linkcode PluginObjectCatalogItem}
13
+ * browse saved hosted window families, keyed by definition ID, and feed design.create.window.
14
+ * They reject if saved definitions cannot be loaded completely. A missing item returns null.
15
+ * The {@linkcode PluginObjectCatalogGroup} / {@linkcode PluginObjectCatalogItem}
17
16
  * DTOs are shared with `design.doors` (defined there, re-exported here).
18
17
  *
19
- * `getSillHeight` (bounds-derived) and the command-wired `mirror` land in a later pass.
18
+ * PC-only: dimensions read the evaluated opening and host thickness in SU. Setters
19
+ * write declared width/height parameters, never mesh scale. Missing or derived
20
+ * controls reject. Use design.family.setParameters for sill and other controls.
20
21
  */
21
22
  export abstract class PluginDesignWindowsApi {
22
23
  constructor() {}
@@ -40,7 +41,9 @@ export abstract class PluginDesignWindowsApi {
40
41
  * if (type) console.log("window type:", type)
41
42
  * ```
42
43
  */
43
- public abstract getType(window: ComponentHandle): PluginApiReturn<string | null>
44
+ public abstract getType(
45
+ window: ComponentHandle,
46
+ ): PluginApiReturn<string | null>
44
47
 
45
48
  /**
46
49
  * Get the width of a window — how wide its opening is along the host wall.
@@ -60,7 +63,9 @@ export abstract class PluginDesignWindowsApi {
60
63
  * if (width !== null) console.log("window width:", width)
61
64
  * ```
62
65
  */
63
- public abstract getWidth(window: ComponentHandle): PluginApiReturn<number | null>
66
+ public abstract getWidth(
67
+ window: ComponentHandle,
68
+ ): PluginApiReturn<number | null>
64
69
 
65
70
  /**
66
71
  * Get the height of a window — how tall its opening is on the host wall.
@@ -80,12 +85,13 @@ export abstract class PluginDesignWindowsApi {
80
85
  * if (height !== null) console.log("window height:", height)
81
86
  * ```
82
87
  */
83
- public abstract getHeight(window: ComponentHandle): PluginApiReturn<number | null>
88
+ public abstract getHeight(
89
+ window: ComponentHandle,
90
+ ): PluginApiReturn<number | null>
84
91
 
85
92
  /**
86
- * Get a window's full dimensions in one call — width along the wall, vertical
87
- * height, and thickness through the wall — measured in the window's local
88
- * oriented space.
93
+ * Get evaluated opening width/height and host thickness in Snaptrude units.
94
+ * The opening can differ from the width/height input parameters.
89
95
  *
90
96
  * @param window The window to query
91
97
  * @returns The dimensions, or `null`
@@ -104,7 +110,7 @@ export abstract class PluginDesignWindowsApi {
104
110
  * ```
105
111
  */
106
112
  public abstract getDimensions(
107
- window: ComponentHandle
113
+ window: ComponentHandle,
108
114
  ): PluginApiReturn<PluginWindowDimensions | null>
109
115
 
110
116
  /**
@@ -129,7 +135,7 @@ export abstract class PluginDesignWindowsApi {
129
135
  */
130
136
  public abstract setWidth(
131
137
  window: ComponentHandle,
132
- width: number
138
+ width: number,
133
139
  ): PluginApiReturn<PluginDesignChangeResult>
134
140
 
135
141
  /**
@@ -153,7 +159,7 @@ export abstract class PluginDesignWindowsApi {
153
159
  */
154
160
  public abstract setHeight(
155
161
  window: ComponentHandle,
156
- height: number
162
+ height: number,
157
163
  ): PluginApiReturn<PluginDesignChangeResult>
158
164
 
159
165
  /**
@@ -174,7 +180,9 @@ export abstract class PluginDesignWindowsApi {
174
180
  * for (const g of groups) console.log(g.dbType, g.label, g.source)
175
181
  * ```
176
182
  */
177
- public abstract listCatalogGroups(): PluginApiReturn<PluginObjectCatalogGroup[]>
183
+ public abstract listCatalogGroups(): PluginApiReturn<
184
+ PluginObjectCatalogGroup[]
185
+ >
178
186
 
179
187
  /**
180
188
  * List the placeable window catalog (team + general libraries), optionally
@@ -196,7 +204,7 @@ export abstract class PluginDesignWindowsApi {
196
204
  * ```
197
205
  */
198
206
  public abstract listCatalog(
199
- group?: string
207
+ group?: string,
200
208
  ): PluginApiReturn<PluginObjectCatalogItem[]>
201
209
 
202
210
  /**
@@ -218,7 +226,7 @@ export abstract class PluginDesignWindowsApi {
218
226
  * ```
219
227
  */
220
228
  public abstract getCatalogItem(
221
- id: string
229
+ id: string,
222
230
  ): PluginApiReturn<PluginObjectCatalogItem | null>
223
231
 
224
232
  /**
@@ -282,7 +290,9 @@ export const PluginDesignWindowSetWidthArgs = z.object({
282
290
  window: ComponentHandle,
283
291
  width: z.number(),
284
292
  })
285
- export type PluginDesignWindowSetWidthArgs = z.infer<typeof PluginDesignWindowSetWidthArgs>
293
+ export type PluginDesignWindowSetWidthArgs = z.infer<
294
+ typeof PluginDesignWindowSetWidthArgs
295
+ >
286
296
 
287
297
  /**
288
298
  * Arguments for {@linkcode PluginDesignWindowsApi.setHeight}.
@@ -296,7 +306,9 @@ export const PluginDesignWindowSetHeightArgs = z.object({
296
306
  window: ComponentHandle,
297
307
  height: z.number(),
298
308
  })
299
- export type PluginDesignWindowSetHeightArgs = z.infer<typeof PluginDesignWindowSetHeightArgs>
309
+ export type PluginDesignWindowSetHeightArgs = z.infer<
310
+ typeof PluginDesignWindowSetHeightArgs
311
+ >
300
312
 
301
313
  // ---------------------------------------------------------------------------
302
314
  // catalog (shared DTOs defined in ../doors, re-exported here for symmetry)
@@ -315,7 +327,9 @@ export { PluginObjectCatalogGroup, PluginObjectCatalogItem }
315
327
  export const PluginDesignWindowListCatalogArgs = z.object({
316
328
  group: z.string().optional(),
317
329
  })
318
- export type PluginDesignWindowListCatalogArgs = z.infer<typeof PluginDesignWindowListCatalogArgs>
330
+ export type PluginDesignWindowListCatalogArgs = z.infer<
331
+ typeof PluginDesignWindowListCatalogArgs
332
+ >
319
333
 
320
334
  /**
321
335
  * Arguments for {@linkcode PluginDesignWindowsApi.getCatalogItem} / {@linkcode PluginDesignWindowsApi.exists}.
@@ -327,7 +341,11 @@ export type PluginDesignWindowListCatalogArgs = z.infer<typeof PluginDesignWindo
327
341
  export const PluginDesignWindowGetCatalogItemArgs = z.object({
328
342
  id: z.string(),
329
343
  })
330
- export type PluginDesignWindowGetCatalogItemArgs = z.infer<typeof PluginDesignWindowGetCatalogItemArgs>
344
+ export type PluginDesignWindowGetCatalogItemArgs = z.infer<
345
+ typeof PluginDesignWindowGetCatalogItemArgs
346
+ >
331
347
 
332
348
  export const PluginDesignWindowExistsArgs = PluginDesignWindowGetCatalogItemArgs
333
- export type PluginDesignWindowExistsArgs = z.infer<typeof PluginDesignWindowExistsArgs>
349
+ export type PluginDesignWindowExistsArgs = z.infer<
350
+ typeof PluginDesignWindowExistsArgs
351
+ >
@@ -10,6 +10,7 @@ import { PluginPresentationShapesApi } from "./shapes"
10
10
  import { PluginPresentationTablesApi } from "./tables"
11
11
  import { PluginPresentationSlideshowApi } from "./slideshow"
12
12
  import { PluginPresentationImportApi } from "./import"
13
+ import { PluginPresentationWalkthroughsApi } from "./walkthroughs"
13
14
  import {
14
15
  PluginPresentationExportResult,
15
16
  type PluginPresentationExportFormat,
@@ -35,6 +36,7 @@ import {
35
36
  * - {@linkcode PluginPresentationApi.slideshow} — Run the Present-mode slideshow
36
37
  * - {@linkcode PluginPresentationApi.import} — Import reference images/PDFs onto the canvas
37
38
  * - {@linkcode PluginPresentationApi.aiInspiration} — Present-mode AI image/video generation
39
+ * - {@linkcode PluginPresentationApi.walkthroughs} — Camera paths through the model: create, play, capture, export as video
38
40
  *
39
41
  * Accessed via `snaptrude.presentation`.
40
42
  */
@@ -64,6 +66,12 @@ export abstract class PluginPresentationApi {
64
66
  * {@linkcode PluginPresentationAIInspirationApi}.
65
67
  */
66
68
  public abstract aiInspiration: PluginPresentationAIInspirationApi
69
+ /**
70
+ * Walkthroughs — camera paths through the model: create (keyframes, floor
71
+ * points, camera-move presets), play, capture and export as video onto the
72
+ * Present canvas. See {@linkcode PluginPresentationWalkthroughsApi}.
73
+ */
74
+ public abstract walkthroughs: PluginPresentationWalkthroughsApi
67
75
 
68
76
  /**
69
77
  * Export the presentation's layout sheets to a downloadable file (PDF / PNG /
@@ -114,4 +122,5 @@ export * from "./tables"
114
122
  export * from "./slideshow"
115
123
  export * from "./import"
116
124
  export * from "./aiInspiration"
125
+ export * from "./walkthroughs"
117
126
  export * from "./export"