@snaptrude/plugin-core 0.0.0-dev-20260708130115 → 0.0.0-dev-20260827135706

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 (261) hide show
  1. package/CHANGELOG.md +152 -1
  2. package/api-manifest.json +3620 -276
  3. package/dist/api/analysis/daylight.d.ts +603 -0
  4. package/dist/api/analysis/daylight.d.ts.map +1 -0
  5. package/dist/api/analysis/heatmaps.d.ts +658 -0
  6. package/dist/api/analysis/heatmaps.d.ts.map +1 -0
  7. package/dist/api/analysis/illuminance.d.ts +145 -0
  8. package/dist/api/analysis/illuminance.d.ts.map +1 -0
  9. package/dist/api/analysis/index.d.ts +59 -0
  10. package/dist/api/analysis/index.d.ts.map +1 -0
  11. package/dist/api/analysis/shadows.d.ts +165 -0
  12. package/dist/api/analysis/shadows.d.ts.map +1 -0
  13. package/dist/api/analysis/solar.d.ts +249 -0
  14. package/dist/api/analysis/solar.d.ts.map +1 -0
  15. package/dist/api/analysis/sunlightHours.d.ts +208 -0
  16. package/dist/api/analysis/sunlightHours.d.ts.map +1 -0
  17. package/dist/api/analysis/sunpath.d.ts +80 -0
  18. package/dist/api/analysis/sunpath.d.ts.map +1 -0
  19. package/dist/api/analysis/weather.d.ts +193 -0
  20. package/dist/api/analysis/weather.d.ts.map +1 -0
  21. package/dist/api/core/camera/index.d.ts +261 -0
  22. package/dist/api/core/camera/index.d.ts.map +1 -0
  23. package/dist/api/core/comment/index.d.ts +105 -2
  24. package/dist/api/core/comment/index.d.ts.map +1 -1
  25. package/dist/api/core/geom/create/index.d.ts +840 -14
  26. package/dist/api/core/geom/create/index.d.ts.map +1 -1
  27. package/dist/api/core/geom/delete/index.d.ts +8 -2
  28. package/dist/api/core/geom/delete/index.d.ts.map +1 -1
  29. package/dist/api/core/geom/query/arc.d.ts +5 -5
  30. package/dist/api/core/geom/query/brep.d.ts +130 -18
  31. package/dist/api/core/geom/query/brep.d.ts.map +1 -1
  32. package/dist/api/core/geom/query/circle.d.ts +18 -18
  33. package/dist/api/core/geom/query/contour.d.ts +20 -20
  34. package/dist/api/core/geom/query/curve.d.ts +49 -49
  35. package/dist/api/core/geom/query/edge.d.ts +5 -5
  36. package/dist/api/core/geom/query/face.d.ts +16 -16
  37. package/dist/api/core/geom/query/halfedge.d.ts +8 -8
  38. package/dist/api/core/geom/query/profile.d.ts +19 -19
  39. package/dist/api/core/geom/query/vertex.d.ts +8 -8
  40. package/dist/api/core/geom/update/contour.d.ts +14 -14
  41. package/dist/api/core/geom/update/curve.d.ts +7 -7
  42. package/dist/api/core/geom/update/profile.d.ts +16 -16
  43. package/dist/api/core/handles/index.d.ts +210 -0
  44. package/dist/api/core/handles/index.d.ts.map +1 -0
  45. package/dist/api/core/index.d.ts +34 -0
  46. package/dist/api/core/index.d.ts.map +1 -1
  47. package/dist/api/core/io/export/index.d.ts +134 -0
  48. package/dist/api/core/io/export/index.d.ts.map +1 -0
  49. package/dist/api/core/io/import/index.d.ts +453 -0
  50. package/dist/api/core/io/import/index.d.ts.map +1 -0
  51. package/dist/api/core/io/index.d.ts +40 -0
  52. package/dist/api/core/io/index.d.ts.map +1 -0
  53. package/dist/api/core/io/job/index.d.ts +139 -0
  54. package/dist/api/core/io/job/index.d.ts.map +1 -0
  55. package/dist/api/core/io/query/index.d.ts +74 -0
  56. package/dist/api/core/io/query/index.d.ts.map +1 -0
  57. package/dist/api/core/io/terrain/index.d.ts +341 -0
  58. package/dist/api/core/io/terrain/index.d.ts.map +1 -0
  59. package/dist/api/core/io/underlay/index.d.ts +805 -0
  60. package/dist/api/core/io/underlay/index.d.ts.map +1 -0
  61. package/dist/api/core/layers.d.ts +7 -7
  62. package/dist/api/core/mode/index.d.ts +99 -0
  63. package/dist/api/core/mode/index.d.ts.map +1 -0
  64. package/dist/api/core/project/index.d.ts +68 -1
  65. package/dist/api/core/project/index.d.ts.map +1 -1
  66. package/dist/api/core/proposals/index.d.ts +531 -0
  67. package/dist/api/core/proposals/index.d.ts.map +1 -0
  68. package/dist/api/core/storeys/index.d.ts +265 -0
  69. package/dist/api/core/storeys/index.d.ts.map +1 -0
  70. package/dist/api/core/tags.d.ts +24 -0
  71. package/dist/api/core/tags.d.ts.map +1 -1
  72. package/dist/api/core/user.d.ts +44 -0
  73. package/dist/api/core/user.d.ts.map +1 -0
  74. package/dist/api/core/zoom/index.d.ts +4 -0
  75. package/dist/api/core/zoom/index.d.ts.map +1 -1
  76. package/dist/api/design/boolean/index.d.ts +4 -4
  77. package/dist/api/design/create/index.d.ts +568 -45
  78. package/dist/api/design/create/index.d.ts.map +1 -1
  79. package/dist/api/design/delete/index.d.ts +3 -0
  80. package/dist/api/design/delete/index.d.ts.map +1 -1
  81. package/dist/api/design/doors/index.d.ts +195 -0
  82. package/dist/api/design/doors/index.d.ts.map +1 -1
  83. package/dist/api/design/edit/index.d.ts +1 -1
  84. package/dist/api/design/erase/index.d.ts +2 -2
  85. package/dist/api/design/family.d.ts +349 -0
  86. package/dist/api/design/family.d.ts.map +1 -0
  87. package/dist/api/design/furniture/index.d.ts +181 -8
  88. package/dist/api/design/furniture/index.d.ts.map +1 -1
  89. package/dist/api/design/index.d.ts +98 -0
  90. package/dist/api/design/index.d.ts.map +1 -1
  91. package/dist/api/design/lock.d.ts +26 -0
  92. package/dist/api/design/lock.d.ts.map +1 -1
  93. package/dist/api/design/materials/index.d.ts +270 -16
  94. package/dist/api/design/materials/index.d.ts.map +1 -1
  95. package/dist/api/design/query/geometry/index.d.ts +112 -0
  96. package/dist/api/design/query/geometry/index.d.ts.map +1 -1
  97. package/dist/api/design/query/index.d.ts +282 -11
  98. package/dist/api/design/query/index.d.ts.map +1 -1
  99. package/dist/api/design/query/referenceLines.d.ts +45 -0
  100. package/dist/api/design/query/referenceLines.d.ts.map +1 -0
  101. package/dist/api/design/query/spaces.d.ts +181 -8
  102. package/dist/api/design/query/spaces.d.ts.map +1 -1
  103. package/dist/api/design/selection/index.d.ts +144 -0
  104. package/dist/api/design/selection/index.d.ts.map +1 -1
  105. package/dist/api/design/transform/index.d.ts +172 -10
  106. package/dist/api/design/transform/index.d.ts.map +1 -1
  107. package/dist/api/design/types/index.d.ts +181 -0
  108. package/dist/api/design/types/index.d.ts.map +1 -0
  109. package/dist/api/design/update/index.d.ts +553 -2
  110. package/dist/api/design/update/index.d.ts.map +1 -1
  111. package/dist/api/design/visibility.d.ts +126 -0
  112. package/dist/api/design/visibility.d.ts.map +1 -0
  113. package/dist/api/design/windows/index.d.ts +113 -2
  114. package/dist/api/design/windows/index.d.ts.map +1 -1
  115. package/dist/api/entity/buildableEnvelope.d.ts +4 -0
  116. package/dist/api/entity/buildableEnvelope.d.ts.map +1 -1
  117. package/dist/api/entity/referenceLine.d.ts +10 -2
  118. package/dist/api/entity/referenceLine.d.ts.map +1 -1
  119. package/dist/api/entity/space.d.ts +21 -21
  120. package/dist/api/entity/story.d.ts +242 -15
  121. package/dist/api/entity/story.d.ts.map +1 -1
  122. package/dist/api/index.d.ts +10 -0
  123. package/dist/api/index.d.ts.map +1 -1
  124. package/dist/api/presentation/aiInspiration.d.ts +25 -25
  125. package/dist/api/presentation/annotate.d.ts +467 -0
  126. package/dist/api/presentation/annotate.d.ts.map +1 -0
  127. package/dist/api/presentation/diagrams.d.ts +111 -8
  128. package/dist/api/presentation/diagrams.d.ts.map +1 -1
  129. package/dist/api/presentation/export.d.ts +108 -0
  130. package/dist/api/presentation/export.d.ts.map +1 -0
  131. package/dist/api/presentation/import.d.ts +55 -4
  132. package/dist/api/presentation/import.d.ts.map +1 -1
  133. package/dist/api/presentation/index.d.ts +58 -1
  134. package/dist/api/presentation/index.d.ts.map +1 -1
  135. package/dist/api/presentation/placedViews.d.ts +1139 -0
  136. package/dist/api/presentation/placedViews.d.ts.map +1 -0
  137. package/dist/api/presentation/shapes.d.ts +481 -0
  138. package/dist/api/presentation/shapes.d.ts.map +1 -0
  139. package/dist/api/presentation/sheets.d.ts +452 -13
  140. package/dist/api/presentation/sheets.d.ts.map +1 -1
  141. package/dist/api/presentation/slideshow.d.ts +125 -0
  142. package/dist/api/presentation/slideshow.d.ts.map +1 -0
  143. package/dist/api/presentation/tables.d.ts +81 -0
  144. package/dist/api/presentation/tables.d.ts.map +1 -0
  145. package/dist/api/presentation/views.d.ts +367 -7
  146. package/dist/api/presentation/views.d.ts.map +1 -1
  147. package/dist/api/program/areas.d.ts +102 -12
  148. package/dist/api/program/areas.d.ts.map +1 -1
  149. package/dist/api/program/cores.d.ts +3 -99
  150. package/dist/api/program/cores.d.ts.map +1 -1
  151. package/dist/api/program/index.d.ts +7 -15
  152. package/dist/api/program/index.d.ts.map +1 -1
  153. package/dist/api/program/layout.d.ts +346 -11
  154. package/dist/api/program/layout.d.ts.map +1 -1
  155. package/dist/api/program/site.d.ts +469 -13
  156. package/dist/api/program/site.d.ts.map +1 -1
  157. package/dist/api/program/spreadsheet.d.ts +365 -41
  158. package/dist/api/program/spreadsheet.d.ts.map +1 -1
  159. package/dist/api/workspace/index.d.ts +505 -0
  160. package/dist/api/workspace/index.d.ts.map +1 -0
  161. package/dist/errors/codes.d.ts +34 -0
  162. package/dist/errors/codes.d.ts.map +1 -0
  163. package/dist/errors/envelope.d.ts +56 -0
  164. package/dist/errors/envelope.d.ts.map +1 -0
  165. package/dist/errors/index.d.ts +6 -0
  166. package/dist/errors/index.d.ts.map +1 -0
  167. package/dist/errors/plugin-error.d.ts +69 -0
  168. package/dist/errors/plugin-error.d.ts.map +1 -0
  169. package/dist/handles.d.ts +97 -25
  170. package/dist/handles.d.ts.map +1 -1
  171. package/dist/host-utils.d.ts +4 -0
  172. package/dist/host-utils.d.ts.map +1 -1
  173. package/dist/index.cjs +4582 -1422
  174. package/dist/index.cjs.map +1 -1
  175. package/dist/index.d.ts +1 -0
  176. package/dist/index.d.ts.map +1 -1
  177. package/dist/index.js +4171 -1411
  178. package/dist/index.js.map +1 -1
  179. package/package.json +4 -2
  180. package/scripts/generate-manifest.mjs +45 -0
  181. package/scripts/generate-manifest.test.mjs +103 -4
  182. package/src/api/analysis/daylight.ts +470 -0
  183. package/src/api/analysis/heatmaps.ts +683 -0
  184. package/src/api/analysis/illuminance.ts +155 -0
  185. package/src/api/analysis/index.ts +61 -0
  186. package/src/api/analysis/shadows.ts +183 -0
  187. package/src/api/analysis/solar.ts +237 -0
  188. package/src/api/analysis/sunlightHours.ts +211 -0
  189. package/src/api/analysis/sunpath.ts +83 -0
  190. package/src/api/analysis/weather.ts +179 -0
  191. package/src/api/core/camera/index.ts +268 -0
  192. package/src/api/core/comment/index.ts +120 -2
  193. package/src/api/core/geom/create/index.ts +912 -1
  194. package/src/api/core/geom/delete/index.ts +6 -0
  195. package/src/api/core/geom/query/brep.ts +119 -0
  196. package/src/api/core/handles/index.ts +233 -0
  197. package/src/api/core/index.ts +34 -0
  198. package/src/api/core/io/export/index.ts +126 -0
  199. package/src/api/core/io/import/index.ts +496 -0
  200. package/src/api/core/io/index.ts +42 -0
  201. package/src/api/core/io/job/index.ts +140 -0
  202. package/src/api/core/io/query/index.ts +71 -0
  203. package/src/api/core/io/terrain/index.ts +360 -0
  204. package/src/api/core/io/underlay/index.ts +705 -0
  205. package/src/api/core/mode/index.ts +96 -0
  206. package/src/api/core/project/index.ts +62 -1
  207. package/src/api/core/proposals/index.ts +569 -0
  208. package/src/api/core/storeys/index.ts +294 -0
  209. package/src/api/core/tags.ts +27 -0
  210. package/src/api/core/user.ts +46 -0
  211. package/src/api/core/zoom/index.ts +4 -0
  212. package/src/api/design/create/index.ts +670 -30
  213. package/src/api/design/delete/index.ts +3 -0
  214. package/src/api/design/doors/index.ts +208 -0
  215. package/src/api/design/erase/index.ts +1 -1
  216. package/src/api/design/family.ts +388 -0
  217. package/src/api/design/furniture/index.ts +197 -8
  218. package/src/api/design/index.ts +102 -0
  219. package/src/api/design/lock.ts +27 -0
  220. package/src/api/design/materials/index.ts +334 -27
  221. package/src/api/design/query/geometry/index.ts +125 -3
  222. package/src/api/design/query/index.ts +217 -7
  223. package/src/api/design/query/referenceLines.ts +52 -0
  224. package/src/api/design/query/spaces.ts +143 -0
  225. package/src/api/design/selection/index.ts +129 -0
  226. package/src/api/design/transform/index.ts +170 -9
  227. package/src/api/design/types/index.ts +156 -0
  228. package/src/api/design/update/index.ts +631 -3
  229. package/src/api/design/visibility.ts +143 -0
  230. package/src/api/design/windows/index.ts +128 -2
  231. package/src/api/entity/buildableEnvelope.ts +4 -0
  232. package/src/api/entity/referenceLine.ts +8 -0
  233. package/src/api/entity/story.ts +259 -15
  234. package/src/api/index.ts +10 -0
  235. package/src/api/presentation/annotate.ts +385 -0
  236. package/src/api/presentation/diagrams.ts +118 -8
  237. package/src/api/presentation/export.ts +108 -0
  238. package/src/api/presentation/import.ts +51 -4
  239. package/src/api/presentation/index.ts +66 -1
  240. package/src/api/presentation/placedViews.ts +1120 -0
  241. package/src/api/presentation/shapes.ts +274 -0
  242. package/src/api/presentation/sheets.ts +400 -13
  243. package/src/api/presentation/slideshow.ts +134 -0
  244. package/src/api/presentation/tables.ts +84 -0
  245. package/src/api/presentation/views.ts +376 -8
  246. package/src/api/program/areas.ts +88 -15
  247. package/src/api/program/cores.ts +3 -91
  248. package/src/api/program/index.ts +7 -15
  249. package/src/api/program/layout.ts +365 -11
  250. package/src/api/program/site.ts +435 -13
  251. package/src/api/program/spreadsheet.ts +376 -35
  252. package/src/api/workspace/index.ts +563 -0
  253. package/src/errors/codes.ts +136 -0
  254. package/src/errors/envelope.ts +75 -0
  255. package/src/errors/index.ts +21 -0
  256. package/src/errors/plugin-error.ts +134 -0
  257. package/src/handles.ts +123 -13
  258. package/src/host-utils.ts +4 -0
  259. package/src/index.ts +1 -0
  260. package/test/errors.test.mjs +184 -0
  261. package/tsconfig.json +7 -2
@@ -0,0 +1,294 @@
1
+ import * as z from "zod"
2
+ import { PluginApiReturn } from "../../../types"
3
+ import { ComponentHandle } from "../../../handles"
4
+ import {
5
+ PluginStoryGetProperty,
6
+ PluginStoryGetResult,
7
+ PluginStoryGetAllResult,
8
+ PluginStoryCreateResult,
9
+ PluginStoryUpdateResult,
10
+ PluginStorySetActiveResult,
11
+ PluginStoryDeleteResult,
12
+ PluginStoryDuplicateResult,
13
+ } from "../../entity/story"
14
+
15
+ /**
16
+ * Storey (floor) management.
17
+ *
18
+ * A storey represents a building floor in the Snaptrude project. Storeys are
19
+ * identified by their integer **storey value** (e.g. `1` for the ground floor,
20
+ * `2` for the first floor, `-1` for a basement).
21
+ *
22
+ * This is the canonical home for storey operations; it shares its implementation
23
+ * and schemas with the deprecated `entity.story` surface. All methods are **host
24
+ * API calls** that return Promises and support undo/redo via Snaptrude's command
25
+ * system (except {@linkcode PluginCoreStoreysApi.setActive}, a view change).
26
+ *
27
+ * Accessed via `snaptrude.core.storeys`.
28
+ */
29
+ export abstract class PluginCoreStoreysApi {
30
+ constructor() {}
31
+
32
+ /**
33
+ * Get properties of a storey by its storey number.
34
+ *
35
+ * Only the properties listed in `properties` are returned — unlisted
36
+ * properties will be `undefined` in the result.
37
+ *
38
+ * @param storyValue - Integer storey number
39
+ * (e.g. `1` for ground floor, `2` for first floor, `-1` for basement)
40
+ * @param properties - Array of property names to retrieve. See
41
+ * {@linkcode PluginStoryGetProperty} for available values.
42
+ * @returns A partial {@linkcode PluginStoryGetResult} containing only the requested properties
43
+ * @throws If the storey with the given value does not exist
44
+ *
45
+ * @examplePrompt What is the height of the ground floor?
46
+ * @examplePrompt How many rooms are on the second storey?
47
+ * @examplePrompt Get the total floor area of level 3
48
+ * @examplePrompt Is the first floor hidden in the viewport?
49
+ * @examplePrompt Show me the name and height of storey 2
50
+ *
51
+ * # Example
52
+ * ```ts
53
+ * const info = await snaptrude.core.storeys.get(1, ["height", "name", "spacesCount"])
54
+ * console.log(info.name, info.height, info.spacesCount)
55
+ * ```
56
+ */
57
+ public abstract get(
58
+ storyValue: number,
59
+ properties: PluginStoryGetProperty[],
60
+ ): PluginApiReturn<PluginStoryGetResult>
61
+
62
+ /**
63
+ * List all storeys in the current project.
64
+ *
65
+ * Returns basic identification data for every storey. Storeys are sorted
66
+ * from **top to bottom** (highest storey value first).
67
+ *
68
+ * @returns A {@linkcode PluginCoreStoreysListResult} with a `storeys` array,
69
+ * each entry containing `value`, `id`, and `name`
70
+ *
71
+ * @examplePrompt How many floors does this building have?
72
+ * @examplePrompt List all the storeys in the project
73
+ * @examplePrompt Show me every level with its name
74
+ * @examplePrompt Which storeys exist in this model?
75
+ *
76
+ * # Example
77
+ * ```ts
78
+ * const { storeys } = await snaptrude.core.storeys.list()
79
+ * for (const s of storeys) {
80
+ * console.log(`Storey ${s.value}: ${s.name} (id: ${s.id})`)
81
+ * }
82
+ * ```
83
+ */
84
+ public abstract list(): PluginApiReturn<PluginCoreStoreysListResult>
85
+
86
+ /**
87
+ * Create a new storey (floor) in the project.
88
+ *
89
+ * The new storey is inserted at the position specified by `storyValue`. This
90
+ * operation is undoable.
91
+ *
92
+ * @param storyValue - Integer storey number
93
+ * to create (e.g. `3` to add a third floor)
94
+ * @param height - Optional height in Babylon
95
+ * units. If omitted, the project's default storey height is used.
96
+ * @returns A {@linkcode PluginStoryCreateResult} with `storyId` and `storyValue`
97
+ * @throws If a storey with the given value already exists or creation fails
98
+ *
99
+ * @examplePrompt Add a third floor to the building
100
+ * @examplePrompt Create a new storey above the second floor
101
+ * @examplePrompt Add a basement level to this project
102
+ * @examplePrompt Insert a new level with a custom floor height
103
+ *
104
+ * # Example
105
+ * ```ts
106
+ * // Create a new third floor with custom height
107
+ * const { storyId } = await snaptrude.core.storeys.create(3, 4.5)
108
+ * ```
109
+ */
110
+ public abstract create(
111
+ storyValue: number,
112
+ height?: number,
113
+ ): PluginApiReturn<PluginStoryCreateResult>
114
+
115
+ /**
116
+ * Update a storey's floor-to-floor `height` and/or `name`.
117
+ *
118
+ * **Height** is the same operation as editing the height in the Storeys panel:
119
+ * the walls, columns, and masses on the storey are **stretched** to the new
120
+ * height, every storey **above shifts up/down** by the delta so the stack stays
121
+ * contiguous, and coupled elements (staircases, parametric curtain walls,
122
+ * furniture offsets) are re-fitted. The whole height cascade is committed as
123
+ * **one undo step**. Height-locked elements are left untouched.
124
+ *
125
+ * **Name** is the same as renaming the storey in the Storeys panel: it is
126
+ * persisted immediately but, mirroring the panel, is **not** part of the height
127
+ * undo step.
128
+ *
129
+ * At least one of `height` or `options.name` must be supplied. Omitting the
130
+ * `height` argument (e.g. for a rename-only update) leaves the height untouched.
131
+ *
132
+ * @param storyValue - Integer storey number identifying the storey to update
133
+ * @param height - New floor-to-floor height in
134
+ * Babylon units. Omit to leave the height unchanged.
135
+ * @param options - `name` (new display name for the storey)
136
+ * @returns A {@linkcode PluginStoryUpdateResult} with the storey's
137
+ * `storyValue`, `height`, and `name` after the update
138
+ * @throws `PRECONDITION_FAILED` if no storey has the given value;
139
+ * `VALIDATION` if neither `height` nor `options.name` is supplied;
140
+ * `STORY_HEIGHT_REJECTED` if the engine rejects the height;
141
+ * `STORY_UPDATE_FAILED` if the storey cannot be re-read after the update
142
+ *
143
+ * @examplePrompt Change the ground floor height to 3.5 metres
144
+ * @examplePrompt Make the second storey taller
145
+ * @examplePrompt Rename the ground floor to "Lobby"
146
+ * @examplePrompt Set the floor-to-floor height of level 1
147
+ *
148
+ * # Example
149
+ * ```ts
150
+ * // Set ground floor height to 5 Babylon units — walls stretch and the
151
+ * // floors above move up to match, all in a single undo step.
152
+ * const result = await snaptrude.core.storeys.update(1, 5)
153
+ * // Rename only, leaving the height untouched.
154
+ * await snaptrude.core.storeys.update(1, undefined, { name: "Lobby" })
155
+ * ```
156
+ */
157
+ public abstract update(
158
+ storyValue: number,
159
+ height?: number,
160
+ options?: { name?: string },
161
+ ): PluginApiReturn<PluginStoryUpdateResult>
162
+
163
+ /**
164
+ * Get the active storey's value. Paired with {@linkcode PluginCoreStoreysApi.setActive}.
165
+ *
166
+ * @returns The active storey value, in the same numbering `list` and `get` use.
167
+ *
168
+ * @examplePrompt Which storey am I on?
169
+ * @examplePrompt What is the current storey?
170
+ *
171
+ * # Example
172
+ * ```ts
173
+ * const storey = await snaptrude.core.storeys.getActive()
174
+ * ```
175
+ */
176
+ public abstract getActive(): PluginApiReturn<number>
177
+
178
+ /**
179
+ * Make a storey the active storey — the same as clicking it in the storey/layer
180
+ * panel. Subsequent draws and creates target this storey, and in 2D the
181
+ * viewport switches to it. This is a view/navigation change: it is **not**
182
+ * undoable and commits nothing to the model.
183
+ *
184
+ * @param storyValue - Integer storey number to activate
185
+ * @returns A {@linkcode PluginStorySetActiveResult} echoing the now-active `storyValue`
186
+ * @throws `PRECONDITION_FAILED` if no storey has the given value
187
+ *
188
+ * @examplePrompt Switch to the second floor
189
+ * @examplePrompt Make the ground storey active
190
+ * @examplePrompt Go to the basement level
191
+ * @examplePrompt Set level 3 as the current storey
192
+ *
193
+ * # Example
194
+ * ```ts
195
+ * // Activate storey 2, then draw a wall — it lands on storey 2.
196
+ * await snaptrude.core.storeys.setActive(2)
197
+ * ```
198
+ */
199
+ public abstract setActive(
200
+ storyValue: number,
201
+ ): PluginApiReturn<PluginStorySetActiveResult>
202
+
203
+ /**
204
+ * Delete a storey and everything on it — the same as removing it from the
205
+ * storey panel. Every element placed on the storey (walls, floors, masses, …)
206
+ * is deleted with it, the remaining storeys are re-stacked, and the active
207
+ * storey falls back to an adjacent one. Committed as a single undo step.
208
+ *
209
+ * @param storyValue - Integer storey number to delete
210
+ * @returns A {@linkcode PluginStoryDeleteResult} with the deleted `storyValue`
211
+ * and the `newActiveStory` the editor fell back to
212
+ * @throws `PRECONDITION_FAILED` if no storey has the given value; or if plugin
213
+ * writes are disabled
214
+ *
215
+ * @examplePrompt Delete the top floor
216
+ * @examplePrompt Remove the basement level
217
+ * @examplePrompt Get rid of storey 3
218
+ * @examplePrompt Delete the second floor and everything on it
219
+ *
220
+ * # Example
221
+ * ```ts
222
+ * const { newActiveStory } = await snaptrude.core.storeys.delete(3)
223
+ * console.log(`Deleted storey 3; now on storey ${newActiveStory}`)
224
+ * ```
225
+ */
226
+ public abstract delete(
227
+ storyValue: number,
228
+ ): PluginApiReturn<PluginStoryDeleteResult>
229
+
230
+ /**
231
+ * Copy a storey into the adjacent level, up or down.
232
+ *
233
+ * By default the **whole storey** is copied: every eligible element on the
234
+ * active storey (walls, floors, roofs, masses, columns, beams, staircases,
235
+ * ceilings, parametric curtain walls, and furniture) is copied into the storey
236
+ * one level `"up"` or `"down"`. Pass `options.components` to copy only a subset
237
+ * instead. The target storey is **created automatically** if it does not yet
238
+ * exist, inheriting the source storey's height.
239
+ *
240
+ * Copies are **instanced** by default (`unique: false`) — they share geometry
241
+ * with the source, so later edits propagate. Set `unique: true` for independent
242
+ * geometry. Doors and windows are never copied on their own; they ride along
243
+ * with their host wall. Locked, throw-away, and unsupported elements are skipped
244
+ * and counted in `skipped`. The whole operation is a single undo step.
245
+ *
246
+ * @param direction - `"up"` to copy into the storey above, `"down"` for below
247
+ * @param options - `components` (restrict to a subset of the storey's elements;
248
+ * omit for the whole storey) and `unique` (default `false` = instanced copies;
249
+ * `true` = independent geometry)
250
+ * @returns A {@linkcode PluginStoryDuplicateResult} with the `sourceStory`, the
251
+ * `targetStories` the copies landed on, the `created` component handles, the
252
+ * `createdStoryValues` for any storeys generated to receive them, and the
253
+ * `skipped` count of ineligible elements
254
+ * @throws `NO_ACTIVE_STRUCTURE` if there is no active structure to copy into;
255
+ * `NO_ELIGIBLE_ELEMENTS` if nothing on the source storey (or in
256
+ * `options.components`) is copyable; `HANDLE_INVALID` for a stale or foreign
257
+ * supplied handle; or if plugin writes are disabled
258
+ *
259
+ * @examplePrompt Copy this floor to the storey above
260
+ * @examplePrompt Copy the ground floor down into a new basement
261
+ * @examplePrompt Repeat this level upwards with its own independent geometry
262
+ * @examplePrompt Copy just the selected walls onto the next floor up
263
+ *
264
+ * # Example
265
+ * ```ts
266
+ * // Copy the whole active storey one level up (instanced copies).
267
+ * const { targetStories, created, skipped } =
268
+ * await snaptrude.core.storeys.copy("up")
269
+ * console.log(`Copied ${created.length} elements onto storey ${targetStories}`)
270
+ * if (skipped) console.log(`${skipped} elements were skipped`)
271
+ * ```
272
+ */
273
+ public abstract copy(
274
+ direction: "up" | "down",
275
+ options?: { components?: ComponentHandle[]; unique?: boolean },
276
+ ): PluginApiReturn<PluginStoryDuplicateResult>
277
+ }
278
+
279
+ /**
280
+ * Result of {@linkcode PluginCoreStoreysApi.list} — the {@linkcode PluginStoryGetAllResult}
281
+ * shape with the array field renamed `stories` → `storeys`. Each entry shares the
282
+ * same element type: `{ value, id, name }`, sorted top to bottom.
283
+ *
284
+ * | Property | Type | Description |
285
+ * |---|---|---|
286
+ * | `storeys` | `Array<{ value, id, name }>` | All storeys, sorted top to bottom |
287
+ */
288
+ export const PluginCoreStoreysListResult = z.object({
289
+ storeys: PluginStoryGetAllResult.shape.stories,
290
+ })
291
+
292
+ export type PluginCoreStoreysListResult = z.infer<
293
+ typeof PluginCoreStoreysListResult
294
+ >
@@ -131,11 +131,38 @@ export abstract class PluginCoreTagsApi {
131
131
  * const { tags } = await snaptrude.core.tags.getTagsForComponent("cmp_42")
132
132
  * for (const t of tags) console.log(t.categoryName, t.tagName)
133
133
  * ```
134
+ *
135
+ * @deprecated Use `core.tags.listForComponent`
134
136
  */
135
137
  public abstract getTagsForComponent(
136
138
  componentId: ComponentHandle,
137
139
  ): PluginApiReturn<PluginCoreTagsGetTagsForComponentResult>
138
140
 
141
+ /**
142
+ * List the tags carried by a component.
143
+ *
144
+ * Returns one entry per category the component is tagged in, each carrying the
145
+ * category and tag names and the tag color. Canonical home of the read formerly
146
+ * at `getTagsForComponent` (now deprecated).
147
+ *
148
+ * @param componentId - The `Component.id` to read.
149
+ * @returns A {@linkcode PluginCoreTagsGetTagsForComponentResult} with a `tags`
150
+ * array (empty when the component has none or does not exist).
151
+ *
152
+ * @examplePrompt What tags does this space have?
153
+ * @examplePrompt List the tags on component cmp_42
154
+ * @examplePrompt Show the labels applied to this room
155
+ *
156
+ * # Example
157
+ * ```ts
158
+ * const { tags } = await snaptrude.core.tags.listForComponent("cmp_42")
159
+ * for (const t of tags) console.log(t.categoryName, t.tagName)
160
+ * ```
161
+ */
162
+ public abstract listForComponent(
163
+ componentId: ComponentHandle,
164
+ ): PluginApiReturn<PluginCoreTagsGetTagsForComponentResult>
165
+
139
166
  /**
140
167
  * List the components carrying a given tag or category.
141
168
  *
@@ -0,0 +1,46 @@
1
+ import * as z from "zod"
2
+ import { PluginApiReturn } from "../../types"
3
+
4
+ /**
5
+ * User locale.
6
+ *
7
+ * Read the viewer's timezone and language — for date/number formatting and
8
+ * localized labels. This is locale only: NO precise geolocation, no IP, no
9
+ * account identity. Accessed via `snaptrude.core.user`.
10
+ */
11
+ export abstract class PluginUserApi {
12
+ constructor() {}
13
+
14
+ /**
15
+ * Get the viewer's locale: IANA timezone and BCP-47 language tag, resolved
16
+ * from the browser (`Intl.DateTimeFormat().resolvedOptions().timeZone` and
17
+ * `navigator.language`). Locale only — no precise location.
18
+ *
19
+ * @returns `{ timezone, language }` — e.g. `{ timezone: "Asia/Kolkata", language: "en-US" }`.
20
+ *
21
+ * @examplePrompt What timezone is the user in?
22
+ * @examplePrompt Get the viewer's language for localized labels
23
+ * @examplePrompt Format the report date in the user's local timezone
24
+ * @examplePrompt Which locale should I use for this plugin's UI?
25
+ *
26
+ * # Example
27
+ * ```ts
28
+ * const { timezone, language } = await snaptrude.core.user.getLocale()
29
+ * ```
30
+ */
31
+ public abstract getLocale(): PluginApiReturn<PluginUserLocale>
32
+ }
33
+
34
+ /**
35
+ * The viewer's locale.
36
+ *
37
+ * | Property | Type | Description |
38
+ * |---|---|---|
39
+ * | `timezone` | `string` | IANA timezone id (e.g. `"Asia/Kolkata"`) |
40
+ * | `language` | `string` | BCP-47 language tag (e.g. `"en-US"`) |
41
+ */
42
+ export const PluginUserLocale = z.object({
43
+ timezone: z.string(),
44
+ language: z.string(),
45
+ })
46
+ export type PluginUserLocale = z.infer<typeof PluginUserLocale>
@@ -24,6 +24,8 @@ export abstract class PluginZoomApi {
24
24
  * ```ts
25
25
  * await snaptrude.core.zoom.extents()
26
26
  * ```
27
+ *
28
+ * @deprecated Use `core.camera.zoomExtents`
27
29
  */
28
30
  public abstract extents(): PluginApiReturn<boolean>
29
31
 
@@ -42,6 +44,8 @@ export abstract class PluginZoomApi {
42
44
  * ```ts
43
45
  * await snaptrude.core.zoom.selection()
44
46
  * ```
47
+ *
48
+ * @deprecated Use `core.camera.zoomSelection`
45
49
  */
46
50
  public abstract selection(): PluginApiReturn<boolean>
47
51
  }