@snaptrude/plugin-core 0.2.9 → 0.5.0

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 (269) hide show
  1. package/AGENTS.md +128 -50
  2. package/CHANGELOG.md +52 -6
  3. package/api-manifest.full.json +3999 -0
  4. package/api-manifest.json +3845 -0
  5. package/dist/api/core/buildings.d.ts +427 -0
  6. package/dist/api/core/buildings.d.ts.map +1 -0
  7. package/dist/api/core/comment/index.d.ts +230 -0
  8. package/dist/api/core/comment/index.d.ts.map +1 -0
  9. package/dist/api/core/geom/create/index.d.ts +247 -0
  10. package/dist/api/core/geom/create/index.d.ts.map +1 -0
  11. package/dist/api/core/geom/delete/index.d.ts +72 -0
  12. package/dist/api/core/geom/delete/index.d.ts.map +1 -0
  13. package/dist/api/core/geom/index.d.ts +24 -23
  14. package/dist/api/core/geom/index.d.ts.map +1 -1
  15. package/dist/api/core/geom/query/arc.d.ts +169 -0
  16. package/dist/api/core/geom/query/arc.d.ts.map +1 -0
  17. package/dist/api/core/geom/query/brep.d.ts +402 -0
  18. package/dist/api/core/geom/query/brep.d.ts.map +1 -0
  19. package/dist/api/core/geom/query/circle.d.ts +378 -0
  20. package/dist/api/core/geom/query/circle.d.ts.map +1 -0
  21. package/dist/api/core/geom/query/contour.d.ts +450 -0
  22. package/dist/api/core/geom/query/contour.d.ts.map +1 -0
  23. package/dist/api/core/geom/query/curve.d.ts +918 -0
  24. package/dist/api/core/geom/query/curve.d.ts.map +1 -0
  25. package/dist/api/core/geom/query/edge.d.ts +128 -0
  26. package/dist/api/core/geom/query/edge.d.ts.map +1 -0
  27. package/dist/api/core/geom/query/face.d.ts +363 -0
  28. package/dist/api/core/geom/query/face.d.ts.map +1 -0
  29. package/dist/api/core/geom/query/halfedge.d.ts +206 -0
  30. package/dist/api/core/geom/query/halfedge.d.ts.map +1 -0
  31. package/dist/api/core/geom/query/index.d.ts +61 -0
  32. package/dist/api/core/geom/query/index.d.ts.map +1 -0
  33. package/dist/api/core/geom/query/profile.d.ts +410 -0
  34. package/dist/api/core/geom/query/profile.d.ts.map +1 -0
  35. package/dist/api/core/geom/query/vertex.d.ts +187 -0
  36. package/dist/api/core/geom/query/vertex.d.ts.map +1 -0
  37. package/dist/api/core/geom/update/contour.d.ts +272 -0
  38. package/dist/api/core/geom/update/contour.d.ts.map +1 -0
  39. package/dist/api/core/geom/update/curve.d.ts +180 -0
  40. package/dist/api/core/geom/update/curve.d.ts.map +1 -0
  41. package/dist/api/core/geom/update/index.d.ts +27 -0
  42. package/dist/api/core/geom/update/index.d.ts.map +1 -0
  43. package/dist/api/core/geom/update/profile.d.ts +329 -0
  44. package/dist/api/core/geom/update/profile.d.ts.map +1 -0
  45. package/dist/api/core/groups.d.ts +485 -0
  46. package/dist/api/core/groups.d.ts.map +1 -0
  47. package/dist/api/core/history/index.d.ts +78 -0
  48. package/dist/api/core/history/index.d.ts.map +1 -0
  49. package/dist/api/core/index.d.ts +46 -1
  50. package/dist/api/core/index.d.ts.map +1 -1
  51. package/dist/api/core/layers.d.ts +402 -0
  52. package/dist/api/core/layers.d.ts.map +1 -0
  53. package/dist/api/core/math/quat.d.ts +111 -128
  54. package/dist/api/core/math/quat.d.ts.map +1 -1
  55. package/dist/api/core/math/vec3.d.ts +120 -102
  56. package/dist/api/core/math/vec3.d.ts.map +1 -1
  57. package/dist/api/core/project/index.d.ts +399 -0
  58. package/dist/api/core/project/index.d.ts.map +1 -0
  59. package/dist/api/core/tags.d.ts +755 -0
  60. package/dist/api/core/tags.d.ts.map +1 -0
  61. package/dist/api/core/units/index.d.ts +175 -0
  62. package/dist/api/core/units/index.d.ts.map +1 -0
  63. package/dist/api/core/zoom/index.d.ts +45 -0
  64. package/dist/api/core/zoom/index.d.ts.map +1 -0
  65. package/dist/api/design/boolean/index.d.ts +168 -0
  66. package/dist/api/design/boolean/index.d.ts.map +1 -0
  67. package/dist/api/design/create/index.d.ts +828 -0
  68. package/dist/api/design/create/index.d.ts.map +1 -0
  69. package/dist/api/design/delete/index.d.ts +63 -0
  70. package/dist/api/design/delete/index.d.ts.map +1 -0
  71. package/dist/api/design/doors/index.d.ts +268 -0
  72. package/dist/api/design/doors/index.d.ts.map +1 -0
  73. package/dist/api/design/edit/index.d.ts +49 -0
  74. package/dist/api/design/edit/index.d.ts.map +1 -0
  75. package/dist/api/design/erase/index.d.ts +160 -0
  76. package/dist/api/design/erase/index.d.ts.map +1 -0
  77. package/dist/api/design/furniture/index.d.ts +123 -0
  78. package/dist/api/design/furniture/index.d.ts.map +1 -0
  79. package/dist/api/design/index.d.ts +153 -0
  80. package/dist/api/design/index.d.ts.map +1 -0
  81. package/dist/api/design/lock.d.ts +41 -0
  82. package/dist/api/design/lock.d.ts.map +1 -0
  83. package/dist/api/design/materials/index.d.ts +297 -0
  84. package/dist/api/design/materials/index.d.ts.map +1 -0
  85. package/dist/api/design/query/geometry/index.d.ts +140 -0
  86. package/dist/api/design/query/geometry/index.d.ts.map +1 -0
  87. package/dist/api/design/query/index.d.ts +1011 -0
  88. package/dist/api/design/query/index.d.ts.map +1 -0
  89. package/dist/api/design/query/spaces.d.ts +221 -0
  90. package/dist/api/design/query/spaces.d.ts.map +1 -0
  91. package/dist/api/design/selection/index.d.ts +138 -0
  92. package/dist/api/design/selection/index.d.ts.map +1 -0
  93. package/dist/api/design/shared.d.ts +38 -0
  94. package/dist/api/design/shared.d.ts.map +1 -0
  95. package/dist/api/design/transform/index.d.ts +87 -0
  96. package/dist/api/design/transform/index.d.ts.map +1 -0
  97. package/dist/api/design/update/index.d.ts +178 -0
  98. package/dist/api/design/update/index.d.ts.map +1 -0
  99. package/dist/api/design/windows/index.d.ts +189 -0
  100. package/dist/api/design/windows/index.d.ts.map +1 -0
  101. package/dist/api/entity/buildableEnvelope.d.ts +51 -23
  102. package/dist/api/entity/buildableEnvelope.d.ts.map +1 -1
  103. package/dist/api/entity/department.d.ts +0 -98
  104. package/dist/api/entity/department.d.ts.map +1 -1
  105. package/dist/api/entity/index.d.ts +4 -9
  106. package/dist/api/entity/index.d.ts.map +1 -1
  107. package/dist/api/entity/referenceLine.d.ts +49 -106
  108. package/dist/api/entity/referenceLine.d.ts.map +1 -1
  109. package/dist/api/entity/space.d.ts +76 -828
  110. package/dist/api/entity/space.d.ts.map +1 -1
  111. package/dist/api/entity/story.d.ts +47 -37
  112. package/dist/api/entity/story.d.ts.map +1 -1
  113. package/dist/api/index.d.ts +17 -17
  114. package/dist/api/index.d.ts.map +1 -1
  115. package/dist/api/presentation/aiInspiration.d.ts +440 -0
  116. package/dist/api/presentation/aiInspiration.d.ts.map +1 -0
  117. package/dist/api/presentation/diagrams.d.ts +81 -0
  118. package/dist/api/presentation/diagrams.d.ts.map +1 -0
  119. package/dist/api/presentation/import.d.ts +113 -0
  120. package/dist/api/presentation/import.d.ts.map +1 -0
  121. package/dist/api/presentation/index.d.ts +46 -0
  122. package/dist/api/presentation/index.d.ts.map +1 -0
  123. package/dist/api/presentation/sheets.d.ts +176 -0
  124. package/dist/api/presentation/sheets.d.ts.map +1 -0
  125. package/dist/api/presentation/views.d.ts +296 -0
  126. package/dist/api/presentation/views.d.ts.map +1 -0
  127. package/dist/api/program/adjacency.d.ts +155 -0
  128. package/dist/api/program/adjacency.d.ts.map +1 -0
  129. package/dist/api/program/areas.d.ts +360 -0
  130. package/dist/api/program/areas.d.ts.map +1 -0
  131. package/dist/api/program/classification.d.ts +135 -0
  132. package/dist/api/program/classification.d.ts.map +1 -0
  133. package/dist/api/program/cores.d.ts +174 -0
  134. package/dist/api/program/cores.d.ts.map +1 -0
  135. package/dist/api/program/departments.d.ts +431 -0
  136. package/dist/api/program/departments.d.ts.map +1 -0
  137. package/dist/api/program/index.d.ts +69 -0
  138. package/dist/api/program/index.d.ts.map +1 -0
  139. package/dist/api/program/layout.d.ts +63 -0
  140. package/dist/api/program/layout.d.ts.map +1 -0
  141. package/dist/api/program/metrics.d.ts +108 -0
  142. package/dist/api/program/metrics.d.ts.map +1 -0
  143. package/dist/api/program/site.d.ts +367 -0
  144. package/dist/api/program/site.d.ts.map +1 -0
  145. package/dist/api/program/spreadsheet.d.ts +2041 -0
  146. package/dist/api/program/spreadsheet.d.ts.map +1 -0
  147. package/dist/handles.d.ts +138 -0
  148. package/dist/handles.d.ts.map +1 -0
  149. package/dist/host-utils.d.ts +7 -5
  150. package/dist/host-utils.d.ts.map +1 -1
  151. package/dist/index.cjs +3897 -1542
  152. package/dist/index.cjs.map +1 -1
  153. package/dist/index.d.ts +1 -0
  154. package/dist/index.d.ts.map +1 -1
  155. package/dist/index.js +3326 -1462
  156. package/dist/index.js.map +1 -1
  157. package/package.json +6 -2
  158. package/scripts/generate-manifest.mjs +193 -0
  159. package/scripts/generate-manifest.test.mjs +193 -0
  160. package/src/api/core/buildings.ts +485 -0
  161. package/src/api/core/comment/index.ts +258 -0
  162. package/src/api/core/geom/create/index.ts +293 -0
  163. package/src/api/core/geom/delete/index.ts +78 -0
  164. package/src/api/core/geom/index.ts +24 -23
  165. package/src/api/core/geom/query/arc.ts +169 -0
  166. package/src/api/core/geom/query/brep.ts +444 -0
  167. package/src/api/core/geom/query/circle.ts +404 -0
  168. package/src/api/core/geom/query/contour.ts +540 -0
  169. package/src/api/core/geom/query/curve.ts +1078 -0
  170. package/src/api/core/geom/query/edge.ts +130 -0
  171. package/src/api/core/geom/query/face.ts +403 -0
  172. package/src/api/core/geom/query/halfedge.ts +210 -0
  173. package/src/api/core/geom/query/index.ts +63 -0
  174. package/src/api/core/geom/query/profile.ts +473 -0
  175. package/src/api/core/geom/query/vertex.ts +205 -0
  176. package/src/api/core/geom/update/contour.ts +315 -0
  177. package/src/api/core/geom/update/curve.ts +209 -0
  178. package/src/api/core/geom/update/index.ts +29 -0
  179. package/src/api/core/geom/update/profile.ts +377 -0
  180. package/src/api/core/groups.ts +521 -0
  181. package/src/api/core/history/index.ts +84 -0
  182. package/src/api/core/index.ts +46 -1
  183. package/src/api/core/layers.ts +333 -0
  184. package/src/api/core/math/quat.ts +112 -235
  185. package/src/api/core/math/vec3.ts +124 -159
  186. package/src/api/core/project/index.ts +418 -0
  187. package/src/api/core/tags.ts +808 -0
  188. package/src/api/core/units/index.ts +164 -0
  189. package/src/api/core/zoom/index.ts +47 -0
  190. package/src/api/design/boolean/index.ts +179 -0
  191. package/src/api/design/create/index.ts +886 -0
  192. package/src/api/design/delete/index.ts +67 -0
  193. package/src/api/design/doors/index.ts +285 -0
  194. package/src/api/design/edit/index.ts +54 -0
  195. package/src/api/design/erase/index.ts +151 -0
  196. package/src/api/design/furniture/index.ts +130 -0
  197. package/src/api/design/index.ts +162 -0
  198. package/src/api/design/lock.ts +42 -0
  199. package/src/api/design/materials/index.ts +301 -0
  200. package/src/api/design/query/geometry/index.ts +166 -0
  201. package/src/api/design/query/index.ts +937 -0
  202. package/src/api/design/query/spaces.ts +132 -0
  203. package/src/api/design/selection/index.ts +144 -0
  204. package/src/api/design/shared.ts +40 -0
  205. package/src/api/design/transform/index.ts +93 -0
  206. package/src/api/design/update/index.ts +117 -0
  207. package/src/api/design/windows/index.ts +207 -0
  208. package/src/api/entity/buildableEnvelope.ts +64 -23
  209. package/src/api/entity/department.ts +0 -113
  210. package/src/api/entity/index.ts +4 -9
  211. package/src/api/entity/referenceLine.ts +50 -38
  212. package/src/api/entity/space.ts +84 -440
  213. package/src/api/entity/story.ts +53 -42
  214. package/src/api/index.ts +17 -17
  215. package/src/api/presentation/aiInspiration.ts +362 -0
  216. package/src/api/presentation/diagrams.ts +84 -0
  217. package/src/api/presentation/import.ts +112 -0
  218. package/src/api/presentation/index.ts +48 -0
  219. package/src/api/presentation/sheets.ts +198 -0
  220. package/src/api/presentation/views.ts +303 -0
  221. package/src/api/program/adjacency.ts +164 -0
  222. package/src/api/program/areas.ts +335 -0
  223. package/src/api/program/classification.ts +138 -0
  224. package/src/api/program/cores.ts +171 -0
  225. package/src/api/program/departments.ts +465 -0
  226. package/src/api/program/index.ts +71 -0
  227. package/src/api/program/layout.ts +68 -0
  228. package/src/api/program/metrics.ts +120 -0
  229. package/src/api/program/site.ts +326 -0
  230. package/src/api/program/spreadsheet.ts +2075 -0
  231. package/src/handles.ts +148 -0
  232. package/src/host-utils.ts +10 -6
  233. package/src/index.ts +1 -0
  234. package/dist/api/core/geom/arc.d.ts +0 -81
  235. package/dist/api/core/geom/arc.d.ts.map +0 -1
  236. package/dist/api/core/geom/curve.d.ts +0 -70
  237. package/dist/api/core/geom/curve.d.ts.map +0 -1
  238. package/dist/api/core/geom/line.d.ts +0 -56
  239. package/dist/api/core/geom/line.d.ts.map +0 -1
  240. package/dist/api/core/geom/profile.d.ts +0 -121
  241. package/dist/api/core/geom/profile.d.ts.map +0 -1
  242. package/dist/api/documentation/aiInspiration.d.ts +0 -2155
  243. package/dist/api/documentation/aiInspiration.d.ts.map +0 -1
  244. package/dist/api/documentation/index.d.ts +0 -13
  245. package/dist/api/documentation/index.d.ts.map +0 -1
  246. package/dist/api/tools/copy.d.ts +0 -59
  247. package/dist/api/tools/copy.d.ts.map +0 -1
  248. package/dist/api/tools/index.d.ts +0 -29
  249. package/dist/api/tools/index.d.ts.map +0 -1
  250. package/dist/api/tools/offset.d.ts +0 -43
  251. package/dist/api/tools/offset.d.ts.map +0 -1
  252. package/dist/api/tools/selection.d.ts +0 -48
  253. package/dist/api/tools/selection.d.ts.map +0 -1
  254. package/dist/api/tools/transform.d.ts +0 -114
  255. package/dist/api/tools/transform.d.ts.map +0 -1
  256. package/dist/api/units/index.d.ts +0 -163
  257. package/dist/api/units/index.d.ts.map +0 -1
  258. package/src/api/core/geom/arc.ts +0 -70
  259. package/src/api/core/geom/curve.ts +0 -41
  260. package/src/api/core/geom/line.ts +0 -53
  261. package/src/api/core/geom/profile.ts +0 -94
  262. package/src/api/documentation/aiInspiration.ts +0 -871
  263. package/src/api/documentation/index.ts +0 -15
  264. package/src/api/tools/copy.ts +0 -55
  265. package/src/api/tools/index.ts +0 -35
  266. package/src/api/tools/offset.ts +0 -43
  267. package/src/api/tools/selection.ts +0 -51
  268. package/src/api/tools/transform.ts +0 -117
  269. package/src/api/units/index.ts +0 -163
package/AGENTS.md CHANGED
@@ -10,6 +10,73 @@ considering your work done**.
10
10
  - Shared types (`src/types.ts`) — `ComponentId`, `PluginApiReturn<T>`, etc.
11
11
  - Host utilities (`src/host-utils.ts`) — `PluginApiMethodMap`, `PluginApiMethod`, RPC payload types
12
12
 
13
+ ## Transport model — Handle vs value
14
+
15
+ Every plugin API argument and return value crosses the worker↔host RPC boundary by one
16
+ of exactly **two transports**. Choose the transport per type **before** writing the
17
+ signature — it is a contract decision, not an implementation detail. Authoritative design
18
+ record: [`PLUGIN_HANDLE_MIGRATION_HLD.md`](../../PLUGIN_HANDLE_MIGRATION_HLD.md) §2–§6.
19
+ Handle types + Zod schemas live in `src/handles.ts`.
20
+
21
+ ### The decision rule (Handle or value)
22
+
23
+ > **Is the type a JS primitive (`number` / `string` / `boolean`) or a string enum?**
24
+ > **Yes → value. No (any structured type) → handle.** No third option: no value DTOs, no
25
+ > `{x,y,z}`-as-input objects, no converter layer.
26
+
27
+ - A `Vec3`, `Quat`, `Line`, `Arc`, `Curve`, `Circle`, `Profile`, `Contour`, a BREP
28
+ topology object, or any scene entity is **structured → always a handle** — even a vec3,
29
+ which is "just three numbers". We never send its components across as an input object.
30
+ - A distance in mm, a boolean flag, a count, a `"round" | "square"` enum → **value**.
31
+ - **Reads are the one exception:** a read returns a bare **primitive record** (e.g.
32
+ `{ x, y, z }`) by value. That is not a value transport for a structured *type*; it is the
33
+ irreducible read leaf. A read must never mint a handle per call (§3).
34
+
35
+ ### Value transport — rules
36
+
37
+ - Primitives and enums only. No object arg may stand in for a structured type.
38
+ - Validated for **shape** at the router (`validateRPCCall`); numbers use Zod `.finite()`
39
+ wherever a schema exists. Trusted for shape only — never for identity or existence.
40
+ - Stateless: no arena, no registry, no lifecycle, no `dispose`.
41
+
42
+ ### Handle transport — rules
43
+
44
+ A handle is an opaque, kind-tagged string `"<kind>_<token>"` (`Handle<K>`), engine-free
45
+ and structured-clone-safe. The three method shapes:
46
+
47
+ - **Construction** — primitives in → handle out, async: `vec3.new({x,y,z}): Promise<Vec3Handle>`.
48
+ - **Operations** — handles in → handle out, async (every op is a host round-trip):
49
+ `vec3.add({a,b}): Promise<Vec3Handle>`.
50
+ - **Reads** — handle in → **primitive record out** (never a handle, never a DTO):
51
+ `vec3.components({v}): Promise<{x,y,z}>`.
52
+
53
+ Crossing/security rules:
54
+
55
+ - **Validation**: `handleSchema(kind)` checks only the `"<kind>_"` prefix at the trust
56
+ boundary; existence + kind + ownership are enforced host-side on resolve, and any miss
57
+ throws one `HANDLE_INVALID` (anti-oracle). Never resolve a handle in plugin-core.
58
+ - **Host wiring**: add a `register*`/`resolve*` pair in `plugins/handles/valueResolvers.ts`
59
+ (the one handle↔object converter) for value/resource handles. Entity handles are **not**
60
+ registered — they resolve live via the scene index. Reads build the record inline
61
+ (`{ x: v.x, y: v.y, z: v.z }`), never via a converter.
62
+
63
+ #### Handle classes — pick by lifecycle
64
+
65
+ All three are handles; they differ only in storage + lifecycle. Choose per backing object:
66
+
67
+ | Class | Kinds | Token shape | Storage | Lifecycle |
68
+ | ------------ | ---------------------------------------------------------------------------------- | ---------------------------------------- | ---------------------------------------------------------- | --------------------------------------------------------------- |
69
+ | **Value** | `vec3`, `quat`, `line`, `arc`, `curve`, `circle` | `<kind>_<token>` | value arena (quota 100k) | immutable; freed on plugin teardown; **not** deduped |
70
+ | **Resource** | `profile`, `contour`, `brep`, `face`, `edge`, `halfedge`, `vertex` | `<kind>_<token>` | resource arena (quota 10k) | session-ephemeral; explicit `dispose` + teardown; dedup by identity |
71
+ | **Entity** | `component`/`mass`, `material`, `story`, `referenceLine`, `department`, `buildableEnvelope` | raw `Component.id` / `Material.name` (**no prefix**) | not stored — resolved live via `StructureCollection` / `getMaterialByName` | scene-owned; stable across undo/redo; persistable across sessions |
72
+
73
+ - **Value vs Resource**: a lightweight immutable math/geom value with high churn → value
74
+ arena (big quota, no dispose obligation). A heavier engine object a plugin holds then
75
+ releases → resource arena (small quota, must `dispose`; deduped by object identity).
76
+ - **Entity**: any live scene object with a stable `Component.id` → entity handle. No arena,
77
+ no quota, no `<kind>_` prefix — the token IS the id, so it round-trips with the ids the
78
+ host already hands out.
79
+
13
80
  ## Quick commands
14
81
 
15
82
  ```bash
@@ -28,43 +95,37 @@ checklist:
28
95
 
29
96
  > See [`packages/plugin-client/AGENTS.md`](../../packages/plugin-client/AGENTS.md) for client-specific guidance.
30
97
 
31
- Every abstract method in `plugin-core` has a concrete implementation in `plugin-client`.
32
- The file structure mirrors this package 1:1:
33
-
34
- | plugin-core source | plugin-client counterpart |
35
- | ------------------------------------- | ------------------------------------- |
36
- | `src/api/core/math/vec3.ts` | `src/api/core/math/vec3.ts` |
37
- | `src/api/core/math/quat.ts` | `src/api/core/math/quat.ts` |
38
- | `src/api/core/geom/line.ts` | `src/api/core/geom/line.ts` |
39
- | `src/api/core/geom/arc.ts` | `src/api/core/geom/arc.ts` |
40
- | `src/api/core/geom/curve.ts` | `src/api/core/geom/curve.ts` |
41
- | `src/api/core/geom/profile.ts` | `src/api/core/geom/profile.ts` |
42
- | `src/api/entity/space.ts` | `src/api/entity/space.ts` |
43
- | `src/api/entity/story.ts` | `src/api/entity/story.ts` |
44
- | `src/api/entity/referenceLine.ts` | `src/api/entity/referenceLine.ts` |
45
- | `src/api/entity/department.ts` | `src/api/entity/department.ts` |
46
- | `src/api/entity/buildableEnvelope.ts` | `src/api/entity/buildableEnvelope.ts` |
47
- | `src/api/tools/selection.ts` | `src/api/tools/selection.ts` |
48
- | `src/api/tools/transform.ts` | `src/api/tools/transform.ts` |
49
- | `src/api/units/index.ts` | `src/api/units/index.ts` |
50
-
51
- - **New method**: Add the concrete implementation (pure math = direct impl; host API = `getHostApi().call(...)`)
52
- - **Removed method**: Delete from client
53
- - **Renamed/signature change**: Update the client method to match
54
- - **New API module** (new file): Create the corresponding client file and wire it into the parent barrel (`index.ts`)
98
+ Every abstract method in `plugin-core` is served to plugins by `plugin-client`, but the
99
+ client has **no per-method code**: every namespace is backed by a single generic RPC
100
+ proxy (`createRpcNamespace` in `src/rpc-proxy.ts`). All calls — including math and
101
+ geom are forwarded to the host; structured values cross as opaque handles.
102
+
103
+ | plugin-core source | plugin-client counterpart |
104
+ | ------------------- | ------------------------------------------------------------------ |
105
+ | `src/api/core/**` | `createRpcNamespace<PluginCoreApi>("core")` in `src/api/index.ts` |
106
+ | `src/api/design/**` | `createRpcNamespace<PluginDesignApi>("design")` in the same file |
107
+ | `src/api/entity/**` | `createRpcNamespace<PluginEntityApi>("entity")` in the same file |
108
+ | `src/api/tools/**` | `createRpcNamespace<PluginToolsApi>("tools")` in the same file |
109
+
110
+ - **New / removed / renamed method or signature change**: No client code change — the
111
+ proxy is generic and the types flow from plugin-core. Rebuild plugin-core so the
112
+ client picks up the new signatures.
113
+ - **New nested API module** (e.g. a new file under `core/` or `design/`): No client change
114
+ - **New top-level namespace**: Add a `createRpcNamespace<PluginXApi>("x")` property to
115
+ `ClientPluginApi` in `src/api/index.ts`
55
116
 
56
117
  ### 2. Host implementation — `apps/snaptrudereact/src/app/plugins/api/`
57
118
 
58
119
  > See [`apps/snaptrudereact/src/app/plugins/AGENTS.md`](../../apps/snaptrudereact/src/app/plugins/AGENTS.md) for host-specific guidance.
59
120
 
60
- Same 1:1 mirror. Host classes extend the abstract classes from plugin-core and provide
61
- the actual Snaptrude-internal implementation.
121
+ The host mirrors this package's `src/api/` file structure 1:1. Host classes extend the
122
+ abstract classes from plugin-core and provide the actual Snaptrude-internal implementation.
62
123
 
63
124
  - **New method**: Implement using Snaptrude internals. Use Zod `.parse()` for input validation.
64
125
  - **Removed method**: Delete from host
65
126
  - **Renamed/signature change**: Update the host method to match
66
127
  - **New API module**: Create the host file, wire into barrel, and add to `SnaptrudePluginApi` in `api/index.ts`
67
- - **New types/converters**: If the new API introduces types that bridge plugin <-> internal representations, add converters in `apps/snaptrudereact/src/app/plugins/converters/`
128
+ - **New structured type**: Structured types cross as opaque handles (all-handle model) there is no DTO converter layer. Add a `register*`/`resolve*` pair in the host's `plugins/handles/valueResolvers.ts` (the one handle ↔ live-object converter); reads return primitive records built inline via `handles/readRecords.ts`.
68
129
 
69
130
  ### 3. JSDoc — keep it complete
70
131
 
@@ -93,18 +154,36 @@ In summary:
93
154
 
94
155
  These are in-browser integration tests that exercise the plugin API end-to-end.
95
156
 
96
- | plugin-core API module | Test file |
97
- | ----------------------------- | ----------------------------- |
98
- | `core/math/*` | `tests/math.ts` |
99
- | `core/geom/*` | `tests/geom.ts` |
100
- | `entity/space.ts` | `tests/spaces.ts` |
101
- | `entity/story.ts` | `tests/story.ts` |
102
- | `entity/referenceLine.ts` | `tests/referenceLines.ts` |
103
- | `entity/department.ts` | `tests/departments.ts` |
104
- | `entity/buildableEnvelope.ts` | `tests/buildableEnvelopes.ts` |
105
- | `tools/selection.ts` | `tests/selection.ts` |
106
- | `tools/transform.ts` | `tests/transform.ts` |
107
- | `units/index.ts` | `tests/units.ts` |
157
+ | plugin-core API module | Test file |
158
+ | ------------------------------------------------- | ---------------------------- |
159
+ | `core/math/*` | `tests/math.ts` |
160
+ | `core/geom/*` (curve/arc/profile/contour) | `tests/geom.ts` |
161
+ | `core/geom/query/*` (brep/face/edge/vertex topology) | `tests/geomTopology.ts` |
162
+ | `core/units/*` | `tests/units.ts` |
163
+ | `core/history/*` | `tests/history.ts` |
164
+ | `core/zoom/*` | `tests/zoom.ts` |
165
+ | `core/project/*` | `tests/project.ts` |
166
+ | `core/comment/*` | `tests/comment.ts` |
167
+ | `design/boolean/*` | `tests/designBoolean.ts` |
168
+ | `design/create/*` | `tests/designCreate.ts` |
169
+ | `design/query/*` | `tests/designQuery.ts` |
170
+ | `design/selection/*` | `tests/designSelection.ts` |
171
+ | `design/lock.ts` | `tests/designLock.ts` |
172
+ | `design/delete/*` | `tests/delete.ts` |
173
+ | `design/erase/*` | `tests/erase.ts` |
174
+ | `design/doors/*` | `tests/doors.ts` |
175
+ | `design/windows/*` | `tests/windows.ts` |
176
+ | `design/furniture/*` | `tests/furniture.ts` |
177
+ | `design/materials/*` | `tests/materials.ts` |
178
+ | `entity/space.ts` | `tests/spaces.ts` |
179
+ | `entity/story.ts` | `tests/story.ts` |
180
+ | `entity/referenceLine.ts` | `tests/referenceLines.ts` |
181
+ | `entity/department.ts` | `tests/departments.ts` |
182
+ | `entity/buildableEnvelope.ts` | `tests/buildableEnvelope.ts` |
183
+ | `tools/selection.ts` | `tests/selection.ts` |
184
+ | `tools/transform.ts` | `tests/transform.ts` |
185
+ | `tools/copy.ts` | `tests/copy.ts` |
186
+ | `tools/offset.ts` | `tests/offset.ts` |
108
187
 
109
188
  - **New method**: Add test cases covering the new method
110
189
  - **Removed method**: Remove corresponding tests
@@ -116,10 +195,8 @@ These are in-browser integration tests that exercise the plugin API end-to-end.
116
195
  Some host implementations have co-located `.test.ts` files:
117
196
 
118
197
  - `api/core/math/vec3.test.ts`, `quat.test.ts`
119
- - `api/core/geom/line.test.ts`, `arc.test.ts`, `curve.test.ts`
120
- - `api/units/index.test.ts`
121
198
 
122
- If your change affects pure math/geom/units logic, update the corresponding Jest tests.
199
+ If your change affects pure math logic, update the corresponding Jest tests.
123
200
 
124
201
  ### 7. Downstream consumers (breaking changes only)
125
202
 
@@ -139,11 +216,12 @@ When adding an entirely new namespace (e.g. `snaptrude.materials`):
139
216
  1. **plugin-core**: Create abstract class + Zod schemas + types in `src/api/<namespace>/`
140
217
  2. **plugin-core**: Export from `src/api/index.ts` and add as property on `PluginApi`
141
218
  3. **plugin-core**: Verify `host-utils.ts` types auto-infer the new methods (they should via `ExtractMethodPaths`)
142
- 4. **plugin-client**: Create client implementation in `src/api/<namespace>/`
143
- 5. **plugin-client**: Wire into `ClientPluginApi` and export from `src/api/index.ts`
144
- 6. **host**: Create host implementation in `apps/snaptrudereact/src/app/plugins/api/<namespace>/`
145
- 7. **host**: Add to `SnaptrudePluginApi` class in `api/index.ts`
146
- 8. **docs**: Create doc pages, update sidebar, follow [`apps/snaptrudereact/api-docs/AGENTS.md`](../../apps/snaptrudereact/api-docs/AGENTS.md) template
147
- 9. **tests**: Add console test file + Jest tests for pure logic
148
- 10. **examples**: Update example plugins if they should showcase the new namespace
149
- 11. **build**: Run `pnpm check-types` in plugin-core, plugin-client, and snaptrudereact
219
+ 4. **plugin-client**: Only if it's a new **top-level** namespace, add a
220
+ `createRpcNamespace<PluginXApi>("x")` property to `ClientPluginApi` in
221
+ `src/api/index.ts` (nested namespaces need no client change)
222
+ 5. **host**: Create host implementation in `apps/snaptrudereact/src/app/plugins/api/<namespace>/`
223
+ 6. **host**: Add to `SnaptrudePluginApi` class in `api/index.ts`
224
+ 7. **docs**: Create doc pages, update sidebar, follow [`apps/snaptrudereact/api-docs/AGENTS.md`](../../apps/snaptrudereact/api-docs/AGENTS.md) template
225
+ 8. **tests**: Add console test file + Jest tests for pure logic
226
+ 9. **examples**: Update example plugins if they should showcase the new namespace
227
+ 10. **build**: Run `pnpm check-types` in plugin-core, plugin-client, and snaptrudereact
package/CHANGELOG.md CHANGED
@@ -1,13 +1,59 @@
1
1
  # @snaptrude/plugin-core
2
2
 
3
- ## 0.2.9
3
+ ## 0.5.0
4
4
 
5
- ### Patch Changes
5
+ ### Minor Changes
6
+
7
+ - 7750aa3: Exposed more snaptrude APIs
8
+
9
+ ## 0.4.0
10
+
11
+ The Plugin API expose initiative. Pre-1.0, breaking changes ship as minor
12
+ version bumps.
13
+
14
+ ### Minor Changes
6
15
 
7
- - 94842d0: added new space areaClass and innerProfiles APIs
8
- - ddf05fa: Add area-class and inner-profile properties to `entity.space`.
9
- - `get`: new readable properties `areaClass` (effective `"NET" | "GROSS" | "EXCLUDED"`, resolving any per-space override then the space-type default; never null), `innerProfiles` (`PProfile[]` of bottom holes), and `innerPlanPoints` (`PVec3[][]`, one `y = 0` point loop per hole). All three return empty arrays / never-null values for spaces without holes.
10
- - `update` / `bulkUpdate`: new optional `properties.areaClass` that sets an explicit per-space override which wins over the space-type default.
16
+ - **Breaking positional arguments.** Every API method now takes positional
17
+ parameters, options-last (required first, then one optional `options`
18
+ object), replacing the single-args-object transport. Migrate by unwrapping
19
+ the object into positional args `foo({ a, b, t })` `foo(a, b, t)`. E.g.
20
+ `vec3.lerp(a, b, 0.5)`, `departments.assign(departmentId, spaceIds)`,
21
+ `design.query.spaces.get(space, ["area", "position"])`.
22
+ - **Breaking — handle-based boundary.** Only JS primitives and enum strings
23
+ cross the plugin ↔ host boundary by value. Every structured type (vector,
24
+ curve, profile, BREP topology, scene entity) is now an opaque, kind-tagged
25
+ string handle; scene-entity references use `ComponentHandle`. Migrate by
26
+ minting a handle instead of passing a raw object (`vec3.new(x, y, z)`, then
27
+ pass the handle) and reading values back with a query call
28
+ (`vec3.components(h)` → `{ x, y, z }`) — reads return primitive records,
29
+ never handles.
30
+ - **New namespaces.** Reorganized the surface into `core`, `design`, `entity`,
31
+ `program`, and `presentation`:
32
+ - `core`: `math` (`vec3`/`quat`), the `geom` geometry kernel, `history`
33
+ (undo/redo), `units`, `zoom`, `project`, `comment`, and the
34
+ `groups`/`buildings`/`layers`/`tags` organization families.
35
+ - `design`: `create`, `query` (+ `geom` query), `selection`, `doors`,
36
+ `windows`, `furniture`, `materials`, `boolean`, `erase`, `delete`,
37
+ `transform`, `edit`, `update`, plus top-level `lock`/`unlock`/`isLocked`/
38
+ `listLocked` verbs.
39
+ - `entity`: `story`, `referenceLine`, `buildableEnvelope`.
40
+ - `program`: `areas`, `departments`, `metrics`, `site`, `cores`,
41
+ `classification`, `adjacency`, and the `spreadsheet` reporting family.
42
+ - `presentation`: `views`, `sheets`, `diagrams`, `import`.
43
+ - Removed the legacy `entity.space.*` methods from the contract and
44
+ consolidated departments under `program.departments`. The selective space
45
+ property read is now `design.query.spaces.get`, and space adjacency is read
46
+ as an entity property via `design.query.getProperties().adjacency`. (The
47
+ host keeps a deprecated `entity.space.get` shim, but it is no longer part of
48
+ the published contract surface.)
49
+ - Added the `overlaps` entity filter to `design.query` list methods — matches
50
+ entities whose plan footprint has non-zero intersection area with a given
51
+ space's bottom-face footprint (fully-inside, boundary-nested, and overhanging
52
+ all match; edge-touching does not; holes respected). Hidden entities are
53
+ excluded unless `isHidden` is passed explicitly.
54
+ - Removed the never-shipped `computeAdjacencyMatrix`; renamed
55
+ `buildings.duplicate` → `buildings.copy`; folded `tags.createAndAssign` into
56
+ `tags.assign` (resolve-or-create, one atomic undo).
11
57
 
12
58
  ## 0.2.8
13
59