@snaptrude/plugin-core 0.3.0 → 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 (266) hide show
  1. package/AGENTS.md +130 -48
  2. package/CHANGELOG.md +111 -0
  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 +261 -0
  102. package/dist/api/entity/buildableEnvelope.d.ts.map +1 -0
  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 +9 -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 +482 -249
  110. package/dist/api/entity/space.d.ts.map +1 -1
  111. package/dist/api/entity/story.d.ts +49 -39
  112. package/dist/api/entity/story.d.ts.map +1 -1
  113. package/dist/api/index.d.ts +17 -12
  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 +4001 -904
  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 +3392 -870
  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 +318 -0
  209. package/src/api/entity/department.ts +0 -113
  210. package/src/api/entity/index.ts +9 -9
  211. package/src/api/entity/referenceLine.ts +50 -38
  212. package/src/api/entity/space.ts +285 -226
  213. package/src/api/entity/story.ts +53 -42
  214. package/src/api/index.ts +17 -12
  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/tools/copy.d.ts +0 -59
  243. package/dist/api/tools/copy.d.ts.map +0 -1
  244. package/dist/api/tools/index.d.ts +0 -33
  245. package/dist/api/tools/index.d.ts.map +0 -1
  246. package/dist/api/tools/material.d.ts +0 -51
  247. package/dist/api/tools/material.d.ts.map +0 -1
  248. package/dist/api/tools/offset.d.ts +0 -43
  249. package/dist/api/tools/offset.d.ts.map +0 -1
  250. package/dist/api/tools/selection.d.ts +0 -48
  251. package/dist/api/tools/selection.d.ts.map +0 -1
  252. package/dist/api/tools/transform.d.ts +0 -114
  253. package/dist/api/tools/transform.d.ts.map +0 -1
  254. package/dist/api/units/index.d.ts +0 -163
  255. package/dist/api/units/index.d.ts.map +0 -1
  256. package/src/api/core/geom/arc.ts +0 -70
  257. package/src/api/core/geom/curve.ts +0 -41
  258. package/src/api/core/geom/line.ts +0 -53
  259. package/src/api/core/geom/profile.ts +0 -94
  260. package/src/api/tools/copy.ts +0 -55
  261. package/src/api/tools/index.ts +0 -39
  262. package/src/api/tools/material.ts +0 -49
  263. package/src/api/tools/offset.ts +0 -43
  264. package/src/api/tools/selection.ts +0 -51
  265. package/src/api/tools/transform.ts +0 -117
  266. package/src/api/units/index.ts +0 -163
@@ -0,0 +1,3845 @@
1
+ [
2
+ {
3
+ "path": "core.buildings.copy",
4
+ "namespace": "core.buildings",
5
+ "summary": "Copy a building.",
6
+ "examplePrompts": [
7
+ "Copy building blg_1",
8
+ "Make an independent editable copy of this building",
9
+ "Copy Tower A as instances to save memory\n\n# Example\n```ts\nconst { buildingId } = await snaptrude.core.buildings.copy(\"blg_1\", {\nname: \"Tower A Copy\",\nasInstances: false,\n})\n```"
10
+ ],
11
+ "argsType": "string",
12
+ "resultType": "PluginCoreBuildingsCopyResult"
13
+ },
14
+ {
15
+ "path": "core.buildings.create",
16
+ "namespace": "core.buildings",
17
+ "summary": "Create a new building.",
18
+ "examplePrompts": [
19
+ "Create a building called Tower B",
20
+ "Add a new building at elevation 12 meters",
21
+ "Make a second building named Annex\n\n# Example\n```ts\nconst { buildingId } = await snaptrude.core.buildings.create(\"Tower B\", 0)\n```"
22
+ ],
23
+ "argsType": "string",
24
+ "resultType": "PluginCoreBuildingsCreateResult"
25
+ },
26
+ {
27
+ "path": "core.buildings.delete",
28
+ "namespace": "core.buildings",
29
+ "summary": "Delete a building.",
30
+ "examplePrompts": [
31
+ "Delete building blg_2",
32
+ "Remove the Annex building and everything in it",
33
+ "Delete this building\n\n# Example\n```ts\nawait snaptrude.core.buildings.delete(\"blg_2\")\n```"
34
+ ],
35
+ "argsType": "string",
36
+ "resultType": "PluginCoreBuildingsDeleteResult"
37
+ },
38
+ {
39
+ "path": "core.buildings.get",
40
+ "namespace": "core.buildings",
41
+ "summary": "Get a single building by id.",
42
+ "examplePrompts": [
43
+ "Get the building with id blg_1",
44
+ "Look up a single building by its id",
45
+ "What is the base elevation of building blg_2?\n\n# Example\n```ts\nconst building = await snaptrude.core.buildings.get(\"blg_1\")\nif (building) console.log(building.name, building.baseElevation)\n```"
46
+ ],
47
+ "argsType": "string",
48
+ "resultType": "PluginCoreBuildingsGetResult"
49
+ },
50
+ {
51
+ "path": "core.buildings.getActive",
52
+ "namespace": "core.buildings",
53
+ "summary": "Get the active building.",
54
+ "examplePrompts": [
55
+ "Which building is active?",
56
+ "Get the current building",
57
+ "What building am I working in?\n\n# Example\n```ts\nconst active = await snaptrude.core.buildings.getActive()\nif (active) console.log(active.buildingId)\n```"
58
+ ],
59
+ "argsType": null,
60
+ "resultType": "PluginCoreBuildingsGetActiveResult"
61
+ },
62
+ {
63
+ "path": "core.buildings.list",
64
+ "namespace": "core.buildings",
65
+ "summary": "List the buildings in the active project.",
66
+ "examplePrompts": [
67
+ "List all the buildings in my project",
68
+ "How many buildings are in this model?",
69
+ "Show every building with its base elevation\n\n# Example\n```ts\nconst { buildings } = await snaptrude.core.buildings.list()\nfor (const b of buildings) console.log(b.name, b.baseElevation)\n```"
70
+ ],
71
+ "argsType": null,
72
+ "resultType": "PluginCoreBuildingsListResult"
73
+ },
74
+ {
75
+ "path": "core.buildings.listStoreys",
76
+ "namespace": "core.buildings",
77
+ "summary": "List the storeys of a building.",
78
+ "examplePrompts": [
79
+ "List the storeys in building blg_1",
80
+ "How many floors does this building have?",
81
+ "Get the storey ids of the active building\n\n# Example\n```ts\nconst { storeyIds } = await snaptrude.core.buildings.listStoreys(\"blg_1\")\nconsole.log(`${storeyIds.length} storeys`)\n```"
82
+ ],
83
+ "argsType": "string",
84
+ "resultType": "PluginCoreBuildingsListStoreysResult"
85
+ },
86
+ {
87
+ "path": "core.buildings.setActive",
88
+ "namespace": "core.buildings",
89
+ "summary": "Make a building the active building.",
90
+ "examplePrompts": [
91
+ "Switch to building blg_2",
92
+ "Make this building the active one",
93
+ "Set the active building to blg_1\n\n# Example\n```ts\nawait snaptrude.core.buildings.setActive(\"blg_2\")\n```"
94
+ ],
95
+ "argsType": "string",
96
+ "resultType": "PluginCoreBuildingsSetActiveResult"
97
+ },
98
+ {
99
+ "path": "core.buildings.update",
100
+ "namespace": "core.buildings",
101
+ "summary": "Update a building's name and/or base elevation.",
102
+ "examplePrompts": [
103
+ "Rename building blg_1 to Tower A",
104
+ "Move the building up to elevation 6 meters",
105
+ "Change the base elevation of blg_2\n\n# Example\n```ts\nconst building = await snaptrude.core.buildings.update(\"blg_1\", { name: \"Tower A\" })\n```"
106
+ ],
107
+ "argsType": "string",
108
+ "resultType": "PluginCoreBuildingsUpdateResult"
109
+ },
110
+ {
111
+ "path": "core.comment.create",
112
+ "namespace": "core.comment",
113
+ "summary": "Create a comment.",
114
+ "examplePrompts": [],
115
+ "argsType": "string",
116
+ "resultType": "CommentHandle"
117
+ },
118
+ {
119
+ "path": "core.comment.delete",
120
+ "namespace": "core.comment",
121
+ "summary": "Delete a comment.",
122
+ "examplePrompts": [],
123
+ "argsType": "CommentHandle",
124
+ "resultType": "boolean"
125
+ },
126
+ {
127
+ "path": "core.comment.isResolved",
128
+ "namespace": "core.comment",
129
+ "summary": "Whether a comment is resolved.",
130
+ "examplePrompts": [],
131
+ "argsType": "CommentHandle",
132
+ "resultType": "boolean"
133
+ },
134
+ {
135
+ "path": "core.comment.list",
136
+ "namespace": "core.comment",
137
+ "summary": "List all (non-deleted) comment handles in the project.",
138
+ "examplePrompts": [],
139
+ "argsType": null,
140
+ "resultType": "CommentHandle[]"
141
+ },
142
+ {
143
+ "path": "core.comment.reopen",
144
+ "namespace": "core.comment",
145
+ "summary": "Reopen a resolved comment. Paired with {@link PluginCommentApi.resolve}.",
146
+ "examplePrompts": [],
147
+ "argsType": "CommentHandle",
148
+ "resultType": "boolean"
149
+ },
150
+ {
151
+ "path": "core.comment.resolve",
152
+ "namespace": "core.comment",
153
+ "summary": "Mark a comment resolved. Paired with {@link PluginCommentApi.reopen}.",
154
+ "examplePrompts": [],
155
+ "argsType": "CommentHandle",
156
+ "resultType": "boolean"
157
+ },
158
+ {
159
+ "path": "core.comment.tag",
160
+ "namespace": "core.comment",
161
+ "summary": "Tag (mention) a user on an existing comment, by email.",
162
+ "examplePrompts": [],
163
+ "argsType": "CommentHandle",
164
+ "resultType": "boolean"
165
+ },
166
+ {
167
+ "path": "core.comment.update",
168
+ "namespace": "core.comment",
169
+ "summary": "Edit a comment's message (and optional",
170
+ "examplePrompts": [],
171
+ "argsType": "CommentHandle",
172
+ "resultType": "boolean"
173
+ },
174
+ {
175
+ "path": "core.geom.create.arc",
176
+ "namespace": "core.geom.create",
177
+ "summary": "Create a circular arc from its start, end, centre, and axis point handles. Host API call — returns a handle.",
178
+ "examplePrompts": [],
179
+ "argsType": "Vec3Handle",
180
+ "resultType": "ArcHandle"
181
+ },
182
+ {
183
+ "path": "core.geom.create.circle",
184
+ "namespace": "core.geom.create",
185
+ "summary": "Create a circle from a centre point, an axis (plane normal), and a radius. Host API call — returns a handle. A circle is a closed curve; read it back via `snaptrude.core.geom.query.circle.*`.",
186
+ "examplePrompts": [],
187
+ "argsType": "Vec3Handle",
188
+ "resultType": "CircleHandle"
189
+ },
190
+ {
191
+ "path": "core.geom.create.contourFromProfile",
192
+ "namespace": "core.geom.create",
193
+ "summary": "Create a contour (an outer profile loop, no holes). Host API call — returns a handle.",
194
+ "examplePrompts": [],
195
+ "argsType": "ProfileHandle",
196
+ "resultType": "ContourHandle"
197
+ },
198
+ {
199
+ "path": "core.geom.create.contourFromProfiles",
200
+ "namespace": "core.geom.create",
201
+ "summary": "Create a contour from an outer profile plus zero or more inner profiles (holes). Host API call — returns a handle.",
202
+ "examplePrompts": [],
203
+ "argsType": "ProfileHandle",
204
+ "resultType": "ContourHandle"
205
+ },
206
+ {
207
+ "path": "core.geom.create.line",
208
+ "namespace": "core.geom.create",
209
+ "summary": "Create a straight line segment between two point handles. Host API call — returns a handle.",
210
+ "examplePrompts": [],
211
+ "argsType": "Vec3Handle",
212
+ "resultType": "LineHandle"
213
+ },
214
+ {
215
+ "path": "core.geom.create.profileFromCurves",
216
+ "namespace": "core.geom.create",
217
+ "summary": "Create a profile from an ordered list of curve handles forming a closed loop. Host API call — returns a handle.",
218
+ "examplePrompts": [],
219
+ "argsType": "CurveHandle[]",
220
+ "resultType": "ProfileHandle"
221
+ },
222
+ {
223
+ "path": "core.geom.create.profileFromLinePoints",
224
+ "namespace": "core.geom.create",
225
+ "summary": "Create a closed profile from an ordered list of point handles connected by line segments (last auto-connected to first). Host API call — returns a handle.",
226
+ "examplePrompts": [],
227
+ "argsType": "Vec3Handle[]",
228
+ "resultType": "ProfileHandle"
229
+ },
230
+ {
231
+ "path": "core.geom.create.profileRect",
232
+ "namespace": "core.geom.create",
233
+ "summary": "Create an axis-aligned **rectangle** profile (XZ plane) of `width` × `depth`, centred at `center` (defaults to the origin). Host API call — returns a handle.",
234
+ "examplePrompts": [],
235
+ "argsType": "number",
236
+ "resultType": "ProfileHandle"
237
+ },
238
+ {
239
+ "path": "core.geom.delete.contour",
240
+ "namespace": "core.geom.delete",
241
+ "summary": "Free a transient contour resource handle — releases its registry entry and reclaims its share of the plugin's resource quota. Handle-lifecycle only; does NOT tear down engine-side geometry, nor the contour's child profile handles.",
242
+ "examplePrompts": [],
243
+ "argsType": "ContourHandle",
244
+ "resultType": "void"
245
+ },
246
+ {
247
+ "path": "core.geom.delete.profile",
248
+ "namespace": "core.geom.delete",
249
+ "summary": "Free a transient profile resource handle — releases its registry entry and reclaims its share of the plugin's resource quota. This is a handle-lifecycle operation only and does NOT tear down any engine-side geometry.",
250
+ "examplePrompts": [],
251
+ "argsType": "ProfileHandle",
252
+ "resultType": "void"
253
+ },
254
+ {
255
+ "path": "core.geom.query.arc.getAxis",
256
+ "namespace": "core.geom.query.arc",
257
+ "summary": "Read the rotation axis of an arc.",
258
+ "examplePrompts": [],
259
+ "argsType": "ArcHandle",
260
+ "resultType": "Vec3Components"
261
+ },
262
+ {
263
+ "path": "core.geom.query.arc.getCentre",
264
+ "namespace": "core.geom.query.arc",
265
+ "summary": "Read the centre point of an arc.",
266
+ "examplePrompts": [],
267
+ "argsType": "ArcHandle",
268
+ "resultType": "Vec3Components"
269
+ },
270
+ {
271
+ "path": "core.geom.query.arc.getRadius",
272
+ "namespace": "core.geom.query.arc",
273
+ "summary": "Read the radius of an arc.",
274
+ "examplePrompts": [],
275
+ "argsType": "ArcHandle",
276
+ "resultType": "number"
277
+ },
278
+ {
279
+ "path": "core.geom.query.arc.getSweepAngle",
280
+ "namespace": "core.geom.query.arc",
281
+ "summary": "Read the sweep angle of an arc (the angle subtended at its centre).",
282
+ "examplePrompts": [],
283
+ "argsType": "ArcHandle",
284
+ "resultType": "number"
285
+ },
286
+ {
287
+ "path": "core.geom.query.arc.isValid",
288
+ "namespace": "core.geom.query.arc",
289
+ "summary": "Check whether an arc is geometrically valid.",
290
+ "examplePrompts": [],
291
+ "argsType": "ArcHandle",
292
+ "resultType": "boolean"
293
+ },
294
+ {
295
+ "path": "core.geom.query.brep.getBoundingBox",
296
+ "namespace": "core.geom.query.brep",
297
+ "summary": "Get the axis-aligned bounding box of a brep.",
298
+ "examplePrompts": [],
299
+ "argsType": "BrepHandle",
300
+ "resultType": "BBoxComponents"
301
+ },
302
+ {
303
+ "path": "core.geom.query.brep.getCentroid",
304
+ "namespace": "core.geom.query.brep",
305
+ "summary": "Get the centroid (mean of all vertex positions) of a brep.",
306
+ "examplePrompts": [],
307
+ "argsType": "BrepHandle",
308
+ "resultType": "Vec3Components"
309
+ },
310
+ {
311
+ "path": "core.geom.query.brep.getEdge",
312
+ "namespace": "core.geom.query.brep",
313
+ "summary": "Get the edge connecting two vertices (by their brep vertex indices).",
314
+ "examplePrompts": [],
315
+ "argsType": "BrepHandle",
316
+ "resultType": "EdgeHandle | null"
317
+ },
318
+ {
319
+ "path": "core.geom.query.brep.getEdgeCount",
320
+ "namespace": "core.geom.query.brep",
321
+ "summary": "Get the number of edges in a brep.",
322
+ "examplePrompts": [],
323
+ "argsType": "BrepHandle",
324
+ "resultType": "number"
325
+ },
326
+ {
327
+ "path": "core.geom.query.brep.getFaceCount",
328
+ "namespace": "core.geom.query.brep",
329
+ "summary": "Get the number of faces in a brep.",
330
+ "examplePrompts": [],
331
+ "argsType": "BrepHandle",
332
+ "resultType": "number"
333
+ },
334
+ {
335
+ "path": "core.geom.query.brep.getHalfEdgeCount",
336
+ "namespace": "core.geom.query.brep",
337
+ "summary": "Get the number of half-edges in a brep.",
338
+ "examplePrompts": [],
339
+ "argsType": "BrepHandle",
340
+ "resultType": "number"
341
+ },
342
+ {
343
+ "path": "core.geom.query.brep.getVertexCount",
344
+ "namespace": "core.geom.query.brep",
345
+ "summary": "Get the number of vertices in a brep.",
346
+ "examplePrompts": [],
347
+ "argsType": "BrepHandle",
348
+ "resultType": "number"
349
+ },
350
+ {
351
+ "path": "core.geom.query.brep.getVertexPosition",
352
+ "namespace": "core.geom.query.brep",
353
+ "summary": "Get the position of a vertex within a brep.",
354
+ "examplePrompts": [],
355
+ "argsType": "BrepHandle",
356
+ "resultType": "Vec3Components"
357
+ },
358
+ {
359
+ "path": "core.geom.query.brep.hasEdge",
360
+ "namespace": "core.geom.query.brep",
361
+ "summary": "Test whether an edge connects two vertices (by their brep vertex indices).",
362
+ "examplePrompts": [],
363
+ "argsType": "BrepHandle",
364
+ "resultType": "boolean"
365
+ },
366
+ {
367
+ "path": "core.geom.query.brep.isEqual",
368
+ "namespace": "core.geom.query.brep",
369
+ "summary": "Test whether two breps are geometrically equal.",
370
+ "examplePrompts": [],
371
+ "argsType": "BrepHandle",
372
+ "resultType": "boolean"
373
+ },
374
+ {
375
+ "path": "core.geom.query.brep.listEdges",
376
+ "namespace": "core.geom.query.brep",
377
+ "summary": "List the edges of a brep.",
378
+ "examplePrompts": [],
379
+ "argsType": "BrepHandle",
380
+ "resultType": "EdgeHandle[]"
381
+ },
382
+ {
383
+ "path": "core.geom.query.brep.listEdgesBetween",
384
+ "namespace": "core.geom.query.brep",
385
+ "summary": "List every edge connecting two vertices (by their brep vertex indices).",
386
+ "examplePrompts": [],
387
+ "argsType": "BrepHandle",
388
+ "resultType": "EdgeHandle[]"
389
+ },
390
+ {
391
+ "path": "core.geom.query.brep.listFaces",
392
+ "namespace": "core.geom.query.brep",
393
+ "summary": "List the faces of a brep.",
394
+ "examplePrompts": [],
395
+ "argsType": "BrepHandle",
396
+ "resultType": "FaceHandle[]"
397
+ },
398
+ {
399
+ "path": "core.geom.query.brep.listHalfEdges",
400
+ "namespace": "core.geom.query.brep",
401
+ "summary": "List the half-edges of a brep.",
402
+ "examplePrompts": [],
403
+ "argsType": "BrepHandle",
404
+ "resultType": "HalfEdgeHandle[]"
405
+ },
406
+ {
407
+ "path": "core.geom.query.brep.listVertexPositions",
408
+ "namespace": "core.geom.query.brep",
409
+ "summary": "List the positions of all vertices in a brep (ordered as {@linkcode PluginGeomQueryBrepApi.listVertices}).",
410
+ "examplePrompts": [],
411
+ "argsType": "BrepHandle",
412
+ "resultType": "Vec3Components[]"
413
+ },
414
+ {
415
+ "path": "core.geom.query.brep.listVertices",
416
+ "namespace": "core.geom.query.brep",
417
+ "summary": "List the vertices of a brep.",
418
+ "examplePrompts": [],
419
+ "argsType": "BrepHandle",
420
+ "resultType": "VertexHandle[]"
421
+ },
422
+ {
423
+ "path": "core.geom.query.circle.getAxis",
424
+ "namespace": "core.geom.query.circle",
425
+ "summary": "Read the axis (plane normal) of a circle.",
426
+ "examplePrompts": [],
427
+ "argsType": "CircleHandle",
428
+ "resultType": "Vec3Components"
429
+ },
430
+ {
431
+ "path": "core.geom.query.circle.getCentre",
432
+ "namespace": "core.geom.query.circle",
433
+ "summary": "Read the centre point of a circle.",
434
+ "examplePrompts": [],
435
+ "argsType": "CircleHandle",
436
+ "resultType": "Vec3Components"
437
+ },
438
+ {
439
+ "path": "core.geom.query.circle.getLength",
440
+ "namespace": "core.geom.query.circle",
441
+ "summary": "Read the length (circumference, `2πr`) of a circle.",
442
+ "examplePrompts": [],
443
+ "argsType": "CircleHandle",
444
+ "resultType": "number"
445
+ },
446
+ {
447
+ "path": "core.geom.query.circle.getNearestPoint",
448
+ "namespace": "core.geom.query.circle",
449
+ "summary": "Get the point on a circle nearest to an arbitrary point.",
450
+ "examplePrompts": [],
451
+ "argsType": "CircleHandle",
452
+ "resultType": "Vec3Components"
453
+ },
454
+ {
455
+ "path": "core.geom.query.circle.getNormal",
456
+ "namespace": "core.geom.query.circle",
457
+ "summary": "Get the (in-plane, radial) normal direction of a circle at a point on it.",
458
+ "examplePrompts": [],
459
+ "argsType": "CircleHandle",
460
+ "resultType": "Vec3Components"
461
+ },
462
+ {
463
+ "path": "core.geom.query.circle.getPointAtDistance",
464
+ "namespace": "core.geom.query.circle",
465
+ "summary": "Get the point reached by travelling a signed arc-distance along the circle from a reference point that lies on it.",
466
+ "examplePrompts": [],
467
+ "argsType": "CircleHandle",
468
+ "resultType": "Vec3Components"
469
+ },
470
+ {
471
+ "path": "core.geom.query.circle.getRadius",
472
+ "namespace": "core.geom.query.circle",
473
+ "summary": "Read the radius of a circle.",
474
+ "examplePrompts": [],
475
+ "argsType": "CircleHandle",
476
+ "resultType": "number"
477
+ },
478
+ {
479
+ "path": "core.geom.query.circle.getTangent",
480
+ "namespace": "core.geom.query.circle",
481
+ "summary": "Get the tangent direction of a circle at a point on it.",
482
+ "examplePrompts": [],
483
+ "argsType": "CircleHandle",
484
+ "resultType": "Vec3Components"
485
+ },
486
+ {
487
+ "path": "core.geom.query.circle.hasPoint",
488
+ "namespace": "core.geom.query.circle",
489
+ "summary": "Test whether a point lies on a circle.",
490
+ "examplePrompts": [],
491
+ "argsType": "CircleHandle",
492
+ "resultType": "boolean"
493
+ },
494
+ {
495
+ "path": "core.geom.query.circle.isEqual",
496
+ "namespace": "core.geom.query.circle",
497
+ "summary": "Test whether two circles are geometrically equal.",
498
+ "examplePrompts": [],
499
+ "argsType": "CircleHandle",
500
+ "resultType": "boolean"
501
+ },
502
+ {
503
+ "path": "core.geom.query.circle.isValid",
504
+ "namespace": "core.geom.query.circle",
505
+ "summary": "Check whether a circle is geometrically valid (non-degenerate axis + positive radius).",
506
+ "examplePrompts": [],
507
+ "argsType": "CircleHandle",
508
+ "resultType": "boolean"
509
+ },
510
+ {
511
+ "path": "core.geom.query.circle.listPoints",
512
+ "namespace": "core.geom.query.circle",
513
+ "summary": "Sample a circle into an ordered list of points.",
514
+ "examplePrompts": [],
515
+ "argsType": "CircleHandle",
516
+ "resultType": "Vec3Components[]"
517
+ },
518
+ {
519
+ "path": "core.geom.query.contour.getArea",
520
+ "namespace": "core.geom.query.contour",
521
+ "summary": "Get the (approximate) net enclosed area of a contour — the outer profile area minus the area of every hole.",
522
+ "examplePrompts": [],
523
+ "argsType": "ContourHandle",
524
+ "resultType": "number"
525
+ },
526
+ {
527
+ "path": "core.geom.query.contour.getBoundingBox",
528
+ "namespace": "core.geom.query.contour",
529
+ "summary": "Get the axis-aligned bounding box of a contour.",
530
+ "examplePrompts": [],
531
+ "argsType": "ContourHandle",
532
+ "resultType": "BBoxComponents"
533
+ },
534
+ {
535
+ "path": "core.geom.query.contour.getHoleCount",
536
+ "namespace": "core.geom.query.contour",
537
+ "summary": "Get the number of inner profiles (holes) in a contour.",
538
+ "examplePrompts": [],
539
+ "argsType": "ContourHandle",
540
+ "resultType": "number"
541
+ },
542
+ {
543
+ "path": "core.geom.query.contour.getNearestPoint",
544
+ "namespace": "core.geom.query.contour",
545
+ "summary": "Get the point on a contour nearest to an arbitrary point.",
546
+ "examplePrompts": [],
547
+ "argsType": "ContourHandle",
548
+ "resultType": "Vec3Components"
549
+ },
550
+ {
551
+ "path": "core.geom.query.contour.getNormal",
552
+ "namespace": "core.geom.query.contour",
553
+ "summary": "Get the unit normal vector of a contour's plane.",
554
+ "examplePrompts": [],
555
+ "argsType": "ContourHandle",
556
+ "resultType": "Vec3Components | null"
557
+ },
558
+ {
559
+ "path": "core.geom.query.contour.getOuterProfile",
560
+ "namespace": "core.geom.query.contour",
561
+ "summary": "Get the outer (boundary) profile of a contour. Host API call — mints a fresh handle.",
562
+ "examplePrompts": [],
563
+ "argsType": "ContourHandle",
564
+ "resultType": "ProfileHandle | null"
565
+ },
566
+ {
567
+ "path": "core.geom.query.contour.getPerimeter",
568
+ "namespace": "core.geom.query.contour",
569
+ "summary": "Get the perimeter (total length of every curve) of a contour, including holes.",
570
+ "examplePrompts": [],
571
+ "argsType": "ContourHandle",
572
+ "resultType": "number"
573
+ },
574
+ {
575
+ "path": "core.geom.query.contour.hasPoint",
576
+ "namespace": "core.geom.query.contour",
577
+ "summary": "Test whether a point lies inside a contour (inside the outer profile and outside every hole).",
578
+ "examplePrompts": [],
579
+ "argsType": "ContourHandle",
580
+ "resultType": "boolean"
581
+ },
582
+ {
583
+ "path": "core.geom.query.contour.isClockwise",
584
+ "namespace": "core.geom.query.contour",
585
+ "summary": "Test whether a contour's outer profile is wound clockwise on the XZ plane.",
586
+ "examplePrompts": [],
587
+ "argsType": "ContourHandle",
588
+ "resultType": "boolean"
589
+ },
590
+ {
591
+ "path": "core.geom.query.contour.isEmpty",
592
+ "namespace": "core.geom.query.contour",
593
+ "summary": "Test whether a contour is empty (its outer profile contains no curves).",
594
+ "examplePrompts": [],
595
+ "argsType": "ContourHandle",
596
+ "resultType": "boolean"
597
+ },
598
+ {
599
+ "path": "core.geom.query.contour.isEqual",
600
+ "namespace": "core.geom.query.contour",
601
+ "summary": "Test whether two contours are geometrically equal.",
602
+ "examplePrompts": [],
603
+ "argsType": "ContourHandle",
604
+ "resultType": "boolean"
605
+ },
606
+ {
607
+ "path": "core.geom.query.contour.isOnBoundary",
608
+ "namespace": "core.geom.query.contour",
609
+ "summary": "Test whether a point lies on a contour's boundary (any of its curves).",
610
+ "examplePrompts": [],
611
+ "argsType": "ContourHandle",
612
+ "resultType": "boolean"
613
+ },
614
+ {
615
+ "path": "core.geom.query.contour.isOrientationValid",
616
+ "namespace": "core.geom.query.contour",
617
+ "summary": "Test whether a contour's orientation is valid (outer profile and holes are wound consistently).",
618
+ "examplePrompts": [],
619
+ "argsType": "ContourHandle",
620
+ "resultType": "boolean"
621
+ },
622
+ {
623
+ "path": "core.geom.query.contour.isPlanar",
624
+ "namespace": "core.geom.query.contour",
625
+ "summary": "Test whether a contour is planar.",
626
+ "examplePrompts": [],
627
+ "argsType": "ContourHandle",
628
+ "resultType": "boolean"
629
+ },
630
+ {
631
+ "path": "core.geom.query.contour.isSelfIntersecting",
632
+ "namespace": "core.geom.query.contour",
633
+ "summary": "Test whether a contour intersects itself.",
634
+ "examplePrompts": [],
635
+ "argsType": "ContourHandle",
636
+ "resultType": "boolean"
637
+ },
638
+ {
639
+ "path": "core.geom.query.contour.listHoles",
640
+ "namespace": "core.geom.query.contour",
641
+ "summary": "List the inner profiles (holes) of a contour. Host API call — mints fresh handles.",
642
+ "examplePrompts": [],
643
+ "argsType": "ContourHandle",
644
+ "resultType": "ProfileHandle[]"
645
+ },
646
+ {
647
+ "path": "core.geom.query.curve.getChordLength",
648
+ "namespace": "core.geom.query.curve",
649
+ "summary": "Get the straight-line chord length between a curve's endpoints.",
650
+ "examplePrompts": [],
651
+ "argsType": "CurveHandle",
652
+ "resultType": "number"
653
+ },
654
+ {
655
+ "path": "core.geom.query.curve.getCommonPart",
656
+ "namespace": "core.geom.query.curve",
657
+ "summary": "Get the common (overlapping) part of two curves.",
658
+ "examplePrompts": [],
659
+ "argsType": "CurveHandle",
660
+ "resultType": "CurveHandle | null"
661
+ },
662
+ {
663
+ "path": "core.geom.query.curve.getCurvature",
664
+ "namespace": "core.geom.query.curve",
665
+ "summary": "Get the curvature of a curve at a point on it.",
666
+ "examplePrompts": [],
667
+ "argsType": "CurveHandle",
668
+ "resultType": "number"
669
+ },
670
+ {
671
+ "path": "core.geom.query.curve.getDistanceAlong",
672
+ "namespace": "core.geom.query.curve",
673
+ "summary": "Get the arc-length distance along a curve between two points on it.",
674
+ "examplePrompts": [],
675
+ "argsType": "CurveHandle",
676
+ "resultType": "number"
677
+ },
678
+ {
679
+ "path": "core.geom.query.curve.getDistanceBetween",
680
+ "namespace": "core.geom.query.curve",
681
+ "summary": "Get the perpendicular distance between two parallel lines.",
682
+ "examplePrompts": [],
683
+ "argsType": "LineHandle",
684
+ "resultType": "number"
685
+ },
686
+ {
687
+ "path": "core.geom.query.curve.getDistanceToPoint",
688
+ "namespace": "core.geom.query.curve",
689
+ "summary": "Get the shortest distance from an arbitrary point to a curve.",
690
+ "examplePrompts": [],
691
+ "argsType": "CurveHandle",
692
+ "resultType": "number"
693
+ },
694
+ {
695
+ "path": "core.geom.query.curve.getEndPoint",
696
+ "namespace": "core.geom.query.curve",
697
+ "summary": "Get the end point of a curve.",
698
+ "examplePrompts": [],
699
+ "argsType": "CurveHandle",
700
+ "resultType": "Vec3Components"
701
+ },
702
+ {
703
+ "path": "core.geom.query.curve.getLength",
704
+ "namespace": "core.geom.query.curve",
705
+ "summary": "Get the arc-length of a curve.",
706
+ "examplePrompts": [],
707
+ "argsType": "CurveHandle",
708
+ "resultType": "number"
709
+ },
710
+ {
711
+ "path": "core.geom.query.curve.getMergedCurve",
712
+ "namespace": "core.geom.query.curve",
713
+ "summary": "Merge two curves into a single curve when they are mergeable.",
714
+ "examplePrompts": [],
715
+ "argsType": "CurveHandle",
716
+ "resultType": "CurveHandle | null"
717
+ },
718
+ {
719
+ "path": "core.geom.query.curve.getMidPoint",
720
+ "namespace": "core.geom.query.curve",
721
+ "summary": "Get the mid point of a curve.",
722
+ "examplePrompts": [],
723
+ "argsType": "CurveHandle",
724
+ "resultType": "Vec3Components"
725
+ },
726
+ {
727
+ "path": "core.geom.query.curve.getNearestPoint",
728
+ "namespace": "core.geom.query.curve",
729
+ "summary": "Get the point on a curve nearest to an arbitrary point.",
730
+ "examplePrompts": [],
731
+ "argsType": "CurveHandle",
732
+ "resultType": "Vec3Components"
733
+ },
734
+ {
735
+ "path": "core.geom.query.curve.getNormal",
736
+ "namespace": "core.geom.query.curve",
737
+ "summary": "Get the unit normal vector of a curve at a point on it.",
738
+ "examplePrompts": [],
739
+ "argsType": "CurveHandle",
740
+ "resultType": "Vec3Components"
741
+ },
742
+ {
743
+ "path": "core.geom.query.curve.getParameterAtPoint",
744
+ "namespace": "core.geom.query.curve",
745
+ "summary": "Get the curve parameter corresponding to a point on the curve.",
746
+ "examplePrompts": [],
747
+ "argsType": "CurveHandle",
748
+ "resultType": "number"
749
+ },
750
+ {
751
+ "path": "core.geom.query.curve.getPointAtDistance",
752
+ "namespace": "core.geom.query.curve",
753
+ "summary": "Get the point at a given distance along a curve from a reference point.",
754
+ "examplePrompts": [],
755
+ "argsType": "CurveHandle",
756
+ "resultType": "Vec3Components"
757
+ },
758
+ {
759
+ "path": "core.geom.query.curve.getProjection",
760
+ "namespace": "core.geom.query.curve",
761
+ "summary": "Project a point onto a curve.",
762
+ "examplePrompts": [],
763
+ "argsType": "CurveHandle",
764
+ "resultType": "Vec3Components"
765
+ },
766
+ {
767
+ "path": "core.geom.query.curve.getShortestGap",
768
+ "namespace": "core.geom.query.curve",
769
+ "summary": "Get the shortest gap between two curves, optionally including their endpoints.",
770
+ "examplePrompts": [],
771
+ "argsType": "CurveHandle",
772
+ "resultType": "number"
773
+ },
774
+ {
775
+ "path": "core.geom.query.curve.getStartPoint",
776
+ "namespace": "core.geom.query.curve",
777
+ "summary": "Get the start point of a curve.",
778
+ "examplePrompts": [],
779
+ "argsType": "CurveHandle",
780
+ "resultType": "Vec3Components"
781
+ },
782
+ {
783
+ "path": "core.geom.query.curve.getTangent",
784
+ "namespace": "core.geom.query.curve",
785
+ "summary": "Get the unit tangent vector of a curve at a point on it.",
786
+ "examplePrompts": [],
787
+ "argsType": "CurveHandle",
788
+ "resultType": "Vec3Components"
789
+ },
790
+ {
791
+ "path": "core.geom.query.curve.hasPoint",
792
+ "namespace": "core.geom.query.curve",
793
+ "summary": "Test whether a curve contains a point, optionally including its endpoints.",
794
+ "examplePrompts": [],
795
+ "argsType": "CurveHandle",
796
+ "resultType": "boolean"
797
+ },
798
+ {
799
+ "path": "core.geom.query.curve.isContinuous",
800
+ "namespace": "core.geom.query.curve",
801
+ "summary": "Test whether two curves are continuous (share an endpoint without a gap).",
802
+ "examplePrompts": [],
803
+ "argsType": "CurveHandle",
804
+ "resultType": "boolean"
805
+ },
806
+ {
807
+ "path": "core.geom.query.curve.isEqual",
808
+ "namespace": "core.geom.query.curve",
809
+ "summary": "Test whether two curves are geometrically equal.",
810
+ "examplePrompts": [],
811
+ "argsType": "CurveHandle",
812
+ "resultType": "boolean"
813
+ },
814
+ {
815
+ "path": "core.geom.query.curve.isLinear",
816
+ "namespace": "core.geom.query.curve",
817
+ "summary": "Test whether a curve is a straight line.",
818
+ "examplePrompts": [],
819
+ "argsType": "CurveHandle",
820
+ "resultType": "boolean"
821
+ },
822
+ {
823
+ "path": "core.geom.query.curve.isOnCurve",
824
+ "namespace": "core.geom.query.curve",
825
+ "summary": "Test whether a point lies on a curve within an optional threshold.",
826
+ "examplePrompts": [],
827
+ "argsType": "CurveHandle",
828
+ "resultType": "boolean"
829
+ },
830
+ {
831
+ "path": "core.geom.query.curve.isOverlapping",
832
+ "namespace": "core.geom.query.curve",
833
+ "summary": "Test whether two curves overlap (share a collinear/concentric span), optionally including their endpoints.",
834
+ "examplePrompts": [],
835
+ "argsType": "CurveHandle",
836
+ "resultType": "boolean"
837
+ },
838
+ {
839
+ "path": "core.geom.query.curve.isParallel",
840
+ "namespace": "core.geom.query.curve",
841
+ "summary": "Test whether two lines are parallel within an optional tolerance.",
842
+ "examplePrompts": [],
843
+ "argsType": "LineHandle",
844
+ "resultType": "boolean"
845
+ },
846
+ {
847
+ "path": "core.geom.query.curve.listIntersections",
848
+ "namespace": "core.geom.query.curve",
849
+ "summary": "List the intersection points between two curves.",
850
+ "examplePrompts": [],
851
+ "argsType": "CurveHandle",
852
+ "resultType": "Vec3Components[]"
853
+ },
854
+ {
855
+ "path": "core.geom.query.curve.listPoints",
856
+ "namespace": "core.geom.query.curve",
857
+ "summary": "List sampled points along a curve.",
858
+ "examplePrompts": [],
859
+ "argsType": "CurveHandle",
860
+ "resultType": "Vec3Components[]"
861
+ },
862
+ {
863
+ "path": "core.geom.query.curve.listSubdivisions",
864
+ "namespace": "core.geom.query.curve",
865
+ "summary": "List the points produced by subdividing a curve into equal segments.",
866
+ "examplePrompts": [],
867
+ "argsType": "CurveHandle",
868
+ "resultType": "Vec3Components[]"
869
+ },
870
+ {
871
+ "path": "core.geom.query.edge.getCurve",
872
+ "namespace": "core.geom.query.edge",
873
+ "summary": "Get the underlying curve geometry of an edge (a line or arc).",
874
+ "examplePrompts": [],
875
+ "argsType": "EdgeHandle",
876
+ "resultType": "CurveHandle | null"
877
+ },
878
+ {
879
+ "path": "core.geom.query.edge.getHalfEdge",
880
+ "namespace": "core.geom.query.edge",
881
+ "summary": "Get the primary half-edge of an edge.",
882
+ "examplePrompts": [],
883
+ "argsType": "EdgeHandle",
884
+ "resultType": "HalfEdgeHandle | null"
885
+ },
886
+ {
887
+ "path": "core.geom.query.edge.getIndex",
888
+ "namespace": "core.geom.query.edge",
889
+ "summary": "Get the index of an edge within its brep.",
890
+ "examplePrompts": [],
891
+ "argsType": "EdgeHandle",
892
+ "resultType": "number"
893
+ },
894
+ {
895
+ "path": "core.geom.query.edge.listFaces",
896
+ "namespace": "core.geom.query.edge",
897
+ "summary": "List the faces bordering an edge (one or two).",
898
+ "examplePrompts": [],
899
+ "argsType": "EdgeHandle",
900
+ "resultType": "FaceHandle[]"
901
+ },
902
+ {
903
+ "path": "core.geom.query.edge.listVertices",
904
+ "namespace": "core.geom.query.edge",
905
+ "summary": "List the two endpoint vertices of an edge.",
906
+ "examplePrompts": [],
907
+ "argsType": "EdgeHandle",
908
+ "resultType": "VertexHandle[]"
909
+ },
910
+ {
911
+ "path": "core.geom.query.face.getHalfEdge",
912
+ "namespace": "core.geom.query.face",
913
+ "summary": "Get a seed half-edge of a face's outer loop.",
914
+ "examplePrompts": [],
915
+ "argsType": "FaceHandle",
916
+ "resultType": "HalfEdgeHandle | null"
917
+ },
918
+ {
919
+ "path": "core.geom.query.face.getHoleContainingHalfEdge",
920
+ "namespace": "core.geom.query.face",
921
+ "summary": "Get the seed half-edge of the hole loop containing a given half-edge.",
922
+ "examplePrompts": [],
923
+ "argsType": "FaceHandle",
924
+ "resultType": "HalfEdgeHandle | null"
925
+ },
926
+ {
927
+ "path": "core.geom.query.face.getHoleCount",
928
+ "namespace": "core.geom.query.face",
929
+ "summary": "Get the number of holes in a face.",
930
+ "examplePrompts": [],
931
+ "argsType": "FaceHandle",
932
+ "resultType": "number"
933
+ },
934
+ {
935
+ "path": "core.geom.query.face.getIndex",
936
+ "namespace": "core.geom.query.face",
937
+ "summary": "Get the index of a face within its brep.",
938
+ "examplePrompts": [],
939
+ "argsType": "FaceHandle",
940
+ "resultType": "number"
941
+ },
942
+ {
943
+ "path": "core.geom.query.face.getMaterialIndex",
944
+ "namespace": "core.geom.query.face",
945
+ "summary": "Get the raw (unmapped) material index of a face.",
946
+ "examplePrompts": [],
947
+ "argsType": "FaceHandle",
948
+ "resultType": "number"
949
+ },
950
+ {
951
+ "path": "core.geom.query.face.hasHoles",
952
+ "namespace": "core.geom.query.face",
953
+ "summary": "Test whether a face has any holes.",
954
+ "examplePrompts": [],
955
+ "argsType": "FaceHandle",
956
+ "resultType": "boolean"
957
+ },
958
+ {
959
+ "path": "core.geom.query.face.listAdjacentFaces",
960
+ "namespace": "core.geom.query.face",
961
+ "summary": "List the faces adjacent to a face (sharing an edge). Boundary edges are skipped.",
962
+ "examplePrompts": [],
963
+ "argsType": "FaceHandle",
964
+ "resultType": "FaceHandle[]"
965
+ },
966
+ {
967
+ "path": "core.geom.query.face.listEdges",
968
+ "namespace": "core.geom.query.face",
969
+ "summary": "List the edges of a face's outer loop.",
970
+ "examplePrompts": [],
971
+ "argsType": "FaceHandle",
972
+ "resultType": "EdgeHandle[]"
973
+ },
974
+ {
975
+ "path": "core.geom.query.face.listHalfEdges",
976
+ "namespace": "core.geom.query.face",
977
+ "summary": "List the half-edges of a face's outer loop.",
978
+ "examplePrompts": [],
979
+ "argsType": "FaceHandle",
980
+ "resultType": "HalfEdgeHandle[]"
981
+ },
982
+ {
983
+ "path": "core.geom.query.face.listHoleHalfEdges",
984
+ "namespace": "core.geom.query.face",
985
+ "summary": "List the half-edge loop of one hole of a face (by hole index).",
986
+ "examplePrompts": [],
987
+ "argsType": "FaceHandle",
988
+ "resultType": "HalfEdgeHandle[]"
989
+ },
990
+ {
991
+ "path": "core.geom.query.face.listHoles",
992
+ "namespace": "core.geom.query.face",
993
+ "summary": "List a face's holes as one seed half-edge per hole loop.",
994
+ "examplePrompts": [],
995
+ "argsType": "FaceHandle",
996
+ "resultType": "HalfEdgeHandle[]"
997
+ },
998
+ {
999
+ "path": "core.geom.query.face.listVertexPositions",
1000
+ "namespace": "core.geom.query.face",
1001
+ "summary": "List the positions of a face's outer-loop vertices (needs the parent brep for coordinates).",
1002
+ "examplePrompts": [],
1003
+ "argsType": "FaceHandle",
1004
+ "resultType": "Vec3Components[]"
1005
+ },
1006
+ {
1007
+ "path": "core.geom.query.face.listVertexPositionsWithCurves",
1008
+ "namespace": "core.geom.query.face",
1009
+ "summary": "List the tessellated boundary points of a face's outer loop (arcs sampled, sense-corrected). Not cardinality-equal to {@linkcode PluginGeomQueryFaceApi.listVertexPositions}.",
1010
+ "examplePrompts": [],
1011
+ "argsType": "FaceHandle",
1012
+ "resultType": "Vec3Components[]"
1013
+ },
1014
+ {
1015
+ "path": "core.geom.query.face.listVertices",
1016
+ "namespace": "core.geom.query.face",
1017
+ "summary": "List the vertices of a face's outer loop.",
1018
+ "examplePrompts": [],
1019
+ "argsType": "FaceHandle",
1020
+ "resultType": "VertexHandle[]"
1021
+ },
1022
+ {
1023
+ "path": "core.geom.query.halfedge.getEdge",
1024
+ "namespace": "core.geom.query.halfedge",
1025
+ "summary": "Get the edge of a half-edge.",
1026
+ "examplePrompts": [],
1027
+ "argsType": "HalfEdgeHandle",
1028
+ "resultType": "EdgeHandle"
1029
+ },
1030
+ {
1031
+ "path": "core.geom.query.halfedge.getFace",
1032
+ "namespace": "core.geom.query.halfedge",
1033
+ "summary": "Get the face of a half-edge.",
1034
+ "examplePrompts": [],
1035
+ "argsType": "HalfEdgeHandle",
1036
+ "resultType": "FaceHandle"
1037
+ },
1038
+ {
1039
+ "path": "core.geom.query.halfedge.getFlip",
1040
+ "namespace": "core.geom.query.halfedge",
1041
+ "summary": "Get the flip (opposite) half-edge of the shared edge.",
1042
+ "examplePrompts": [],
1043
+ "argsType": "HalfEdgeHandle",
1044
+ "resultType": "HalfEdgeHandle | null"
1045
+ },
1046
+ {
1047
+ "path": "core.geom.query.halfedge.getNext",
1048
+ "namespace": "core.geom.query.halfedge",
1049
+ "summary": "Get the next half-edge around the face loop.",
1050
+ "examplePrompts": [],
1051
+ "argsType": "HalfEdgeHandle",
1052
+ "resultType": "HalfEdgeHandle | null"
1053
+ },
1054
+ {
1055
+ "path": "core.geom.query.halfedge.getPrev",
1056
+ "namespace": "core.geom.query.halfedge",
1057
+ "summary": "Get the previous half-edge around the face loop.",
1058
+ "examplePrompts": [],
1059
+ "argsType": "HalfEdgeHandle",
1060
+ "resultType": "HalfEdgeHandle | null"
1061
+ },
1062
+ {
1063
+ "path": "core.geom.query.halfedge.getVertex",
1064
+ "namespace": "core.geom.query.halfedge",
1065
+ "summary": "Get the tail vertex of a half-edge.",
1066
+ "examplePrompts": [],
1067
+ "argsType": "HalfEdgeHandle",
1068
+ "resultType": "VertexHandle"
1069
+ },
1070
+ {
1071
+ "path": "core.geom.query.halfedge.isForward",
1072
+ "namespace": "core.geom.query.halfedge",
1073
+ "summary": "Test whether a half-edge is the forward (primary) half-edge of its edge — i.e. `edge.getHalfEdge() === thisHalfEdge`.",
1074
+ "examplePrompts": [],
1075
+ "argsType": "HalfEdgeHandle",
1076
+ "resultType": "boolean"
1077
+ },
1078
+ {
1079
+ "path": "core.geom.query.halfedge.isOnBoundary",
1080
+ "namespace": "core.geom.query.halfedge",
1081
+ "summary": "Test whether a half-edge lies on the brep boundary (has no flip).",
1082
+ "examplePrompts": [],
1083
+ "argsType": "HalfEdgeHandle",
1084
+ "resultType": "boolean"
1085
+ },
1086
+ {
1087
+ "path": "core.geom.query.profile.getArea",
1088
+ "namespace": "core.geom.query.profile",
1089
+ "summary": "Get the (approximate) enclosed area of a profile.",
1090
+ "examplePrompts": [],
1091
+ "argsType": "ProfileHandle",
1092
+ "resultType": "number"
1093
+ },
1094
+ {
1095
+ "path": "core.geom.query.profile.getBoundingBox",
1096
+ "namespace": "core.geom.query.profile",
1097
+ "summary": "Get the axis-aligned bounding box of a profile.",
1098
+ "examplePrompts": [],
1099
+ "argsType": "ProfileHandle",
1100
+ "resultType": "BBoxComponents"
1101
+ },
1102
+ {
1103
+ "path": "core.geom.query.profile.getNearestPoint",
1104
+ "namespace": "core.geom.query.profile",
1105
+ "summary": "Get the point on a profile nearest to an arbitrary point.",
1106
+ "examplePrompts": [],
1107
+ "argsType": "ProfileHandle",
1108
+ "resultType": "Vec3Components"
1109
+ },
1110
+ {
1111
+ "path": "core.geom.query.profile.getNormal",
1112
+ "namespace": "core.geom.query.profile",
1113
+ "summary": "Get the unit normal vector of a profile's plane.",
1114
+ "examplePrompts": [],
1115
+ "argsType": "ProfileHandle",
1116
+ "resultType": "Vec3Components | null"
1117
+ },
1118
+ {
1119
+ "path": "core.geom.query.profile.getPerimeter",
1120
+ "namespace": "core.geom.query.profile",
1121
+ "summary": "Get the perimeter (total curve length) of a profile.",
1122
+ "examplePrompts": [],
1123
+ "argsType": "ProfileHandle",
1124
+ "resultType": "number"
1125
+ },
1126
+ {
1127
+ "path": "core.geom.query.profile.hasPoint",
1128
+ "namespace": "core.geom.query.profile",
1129
+ "summary": "Test whether a point lies inside a profile.",
1130
+ "examplePrompts": [],
1131
+ "argsType": "ProfileHandle",
1132
+ "resultType": "boolean"
1133
+ },
1134
+ {
1135
+ "path": "core.geom.query.profile.isClockwise",
1136
+ "namespace": "core.geom.query.profile",
1137
+ "summary": "Test whether a profile is wound clockwise on the XZ plane.",
1138
+ "examplePrompts": [],
1139
+ "argsType": "ProfileHandle",
1140
+ "resultType": "boolean"
1141
+ },
1142
+ {
1143
+ "path": "core.geom.query.profile.isClosed",
1144
+ "namespace": "core.geom.query.profile",
1145
+ "summary": "Test whether a profile forms a closed loop.",
1146
+ "examplePrompts": [],
1147
+ "argsType": "ProfileHandle",
1148
+ "resultType": "boolean"
1149
+ },
1150
+ {
1151
+ "path": "core.geom.query.profile.isEmpty",
1152
+ "namespace": "core.geom.query.profile",
1153
+ "summary": "Test whether a profile contains no curves.",
1154
+ "examplePrompts": [],
1155
+ "argsType": "ProfileHandle",
1156
+ "resultType": "boolean"
1157
+ },
1158
+ {
1159
+ "path": "core.geom.query.profile.isEqual",
1160
+ "namespace": "core.geom.query.profile",
1161
+ "summary": "Test whether two profiles are geometrically equal.",
1162
+ "examplePrompts": [],
1163
+ "argsType": "ProfileHandle",
1164
+ "resultType": "boolean"
1165
+ },
1166
+ {
1167
+ "path": "core.geom.query.profile.isOnBoundary",
1168
+ "namespace": "core.geom.query.profile",
1169
+ "summary": "Test whether a point lies on a profile's boundary.",
1170
+ "examplePrompts": [],
1171
+ "argsType": "ProfileHandle",
1172
+ "resultType": "boolean"
1173
+ },
1174
+ {
1175
+ "path": "core.geom.query.profile.isPlanar",
1176
+ "namespace": "core.geom.query.profile",
1177
+ "summary": "Test whether a profile is planar.",
1178
+ "examplePrompts": [],
1179
+ "argsType": "ProfileHandle",
1180
+ "resultType": "boolean"
1181
+ },
1182
+ {
1183
+ "path": "core.geom.query.profile.isSelfIntersecting",
1184
+ "namespace": "core.geom.query.profile",
1185
+ "summary": "Test whether a profile intersects itself.",
1186
+ "examplePrompts": [],
1187
+ "argsType": "ProfileHandle",
1188
+ "resultType": "boolean"
1189
+ },
1190
+ {
1191
+ "path": "core.geom.query.profile.listCurves",
1192
+ "namespace": "core.geom.query.profile",
1193
+ "summary": "List the curves that make up a profile. Host API call — mints fresh handles.",
1194
+ "examplePrompts": [],
1195
+ "argsType": "ProfileHandle",
1196
+ "resultType": "CurveHandle[]"
1197
+ },
1198
+ {
1199
+ "path": "core.geom.query.profile.listPoints",
1200
+ "namespace": "core.geom.query.profile",
1201
+ "summary": "List the tessellated points along a profile.",
1202
+ "examplePrompts": [],
1203
+ "argsType": "ProfileHandle",
1204
+ "resultType": "Vec3Components[]"
1205
+ },
1206
+ {
1207
+ "path": "core.geom.query.vertex.getHalfEdge",
1208
+ "namespace": "core.geom.query.vertex",
1209
+ "summary": "Get a seed half-edge emanating from a vertex.",
1210
+ "examplePrompts": [],
1211
+ "argsType": "VertexHandle",
1212
+ "resultType": "HalfEdgeHandle | null"
1213
+ },
1214
+ {
1215
+ "path": "core.geom.query.vertex.getIndex",
1216
+ "namespace": "core.geom.query.vertex",
1217
+ "summary": "Get the index of a vertex within its brep.",
1218
+ "examplePrompts": [],
1219
+ "argsType": "VertexHandle",
1220
+ "resultType": "number"
1221
+ },
1222
+ {
1223
+ "path": "core.geom.query.vertex.getPosition",
1224
+ "namespace": "core.geom.query.vertex",
1225
+ "summary": "Get the position of a vertex (needs the parent brep for coordinates).",
1226
+ "examplePrompts": [],
1227
+ "argsType": "BrepHandle",
1228
+ "resultType": "Vec3Components"
1229
+ },
1230
+ {
1231
+ "path": "core.geom.query.vertex.listEdges",
1232
+ "namespace": "core.geom.query.vertex",
1233
+ "summary": "List the edges around a vertex.",
1234
+ "examplePrompts": [],
1235
+ "argsType": "VertexHandle",
1236
+ "resultType": "EdgeHandle[]"
1237
+ },
1238
+ {
1239
+ "path": "core.geom.query.vertex.listFaces",
1240
+ "namespace": "core.geom.query.vertex",
1241
+ "summary": "List the faces around a vertex.",
1242
+ "examplePrompts": [],
1243
+ "argsType": "VertexHandle",
1244
+ "resultType": "FaceHandle[]"
1245
+ },
1246
+ {
1247
+ "path": "core.geom.query.vertex.listHalfEdges",
1248
+ "namespace": "core.geom.query.vertex",
1249
+ "summary": "List the half-edges around a vertex.",
1250
+ "examplePrompts": [],
1251
+ "argsType": "VertexHandle",
1252
+ "resultType": "HalfEdgeHandle[]"
1253
+ },
1254
+ {
1255
+ "path": "core.geom.query.vertex.listNeighbors",
1256
+ "namespace": "core.geom.query.vertex",
1257
+ "summary": "List the neighbouring vertices of a vertex.",
1258
+ "examplePrompts": [],
1259
+ "argsType": "VertexHandle",
1260
+ "resultType": "VertexHandle[]"
1261
+ },
1262
+ {
1263
+ "path": "core.geom.update.contour.addHole",
1264
+ "namespace": "core.geom.update.contour",
1265
+ "summary": "Add a hole to a contour by appending an inner profile. Immutable — returns a NEW contour and leaves the input unchanged.",
1266
+ "examplePrompts": [],
1267
+ "argsType": "ContourHandle",
1268
+ "resultType": "ContourHandle"
1269
+ },
1270
+ {
1271
+ "path": "core.geom.update.contour.mirror",
1272
+ "namespace": "core.geom.update.contour",
1273
+ "summary": "Mirror a contour across a plane. Immutable — returns a NEW contour and leaves the input unchanged.",
1274
+ "examplePrompts": [],
1275
+ "argsType": "ContourHandle",
1276
+ "resultType": "ContourHandle"
1277
+ },
1278
+ {
1279
+ "path": "core.geom.update.contour.move",
1280
+ "namespace": "core.geom.update.contour",
1281
+ "summary": "Translate a contour by a vector. Immutable — returns a NEW contour and leaves the input unchanged.",
1282
+ "examplePrompts": [],
1283
+ "argsType": "ContourHandle",
1284
+ "resultType": "ContourHandle"
1285
+ },
1286
+ {
1287
+ "path": "core.geom.update.contour.offset",
1288
+ "namespace": "core.geom.update.contour",
1289
+ "summary": "Offset a contour inward/outward by a signed distance. Immutable — returns a NEW contour and leaves the input unchanged.",
1290
+ "examplePrompts": [],
1291
+ "argsType": "ContourHandle",
1292
+ "resultType": "ContourHandle"
1293
+ },
1294
+ {
1295
+ "path": "core.geom.update.contour.removeHole",
1296
+ "namespace": "core.geom.update.contour",
1297
+ "summary": "Remove a hole from a contour by inner-profile index. Immutable — returns a NEW contour and leaves the input unchanged.",
1298
+ "examplePrompts": [],
1299
+ "argsType": "ContourHandle",
1300
+ "resultType": "ContourHandle"
1301
+ },
1302
+ {
1303
+ "path": "core.geom.update.contour.rotate",
1304
+ "namespace": "core.geom.update.contour",
1305
+ "summary": "Rotate a contour about an axis through an optional pivot. Immutable — returns a NEW contour and leaves the input unchanged.",
1306
+ "examplePrompts": [],
1307
+ "argsType": "ContourHandle",
1308
+ "resultType": "ContourHandle"
1309
+ },
1310
+ {
1311
+ "path": "core.geom.update.contour.scale",
1312
+ "namespace": "core.geom.update.contour",
1313
+ "summary": "Scale a contour uniformly or per-axis about an optional pivot. Immutable — returns a NEW contour and leaves the input unchanged.",
1314
+ "examplePrompts": [],
1315
+ "argsType": "ContourHandle",
1316
+ "resultType": "ContourHandle"
1317
+ },
1318
+ {
1319
+ "path": "core.geom.update.curve.extend",
1320
+ "namespace": "core.geom.update.curve",
1321
+ "summary": "Extend a curve by a distance from one of its ends. Host API call — returns a handle.",
1322
+ "examplePrompts": [],
1323
+ "argsType": "CurveHandle",
1324
+ "resultType": "CurveHandle"
1325
+ },
1326
+ {
1327
+ "path": "core.geom.update.curve.offset",
1328
+ "namespace": "core.geom.update.curve",
1329
+ "summary": "Offset a curve by a translation vector. Host API call — returns a handle.",
1330
+ "examplePrompts": [],
1331
+ "argsType": "CurveHandle",
1332
+ "resultType": "CurveHandle"
1333
+ },
1334
+ {
1335
+ "path": "core.geom.update.curve.reverse",
1336
+ "namespace": "core.geom.update.curve",
1337
+ "summary": "Reverse the direction of a curve. Host API call — returns a handle.",
1338
+ "examplePrompts": [],
1339
+ "argsType": "CurveHandle",
1340
+ "resultType": "CurveHandle"
1341
+ },
1342
+ {
1343
+ "path": "core.geom.update.curve.split",
1344
+ "namespace": "core.geom.update.curve",
1345
+ "summary": "Split a curve at a point into separate segments. Host API call — returns handles.",
1346
+ "examplePrompts": [],
1347
+ "argsType": "CurveHandle",
1348
+ "resultType": "CurveHandle[]"
1349
+ },
1350
+ {
1351
+ "path": "core.geom.update.curve.trim",
1352
+ "namespace": "core.geom.update.curve",
1353
+ "summary": "Trim a curve to the portion between two parameter values. Host API call — returns a handle.",
1354
+ "examplePrompts": [],
1355
+ "argsType": "CurveHandle",
1356
+ "resultType": "CurveHandle"
1357
+ },
1358
+ {
1359
+ "path": "core.geom.update.profile.add",
1360
+ "namespace": "core.geom.update.profile",
1361
+ "summary": "Append a curve to the start or end of a profile. The curve must connect to the chosen end. Immutable — returns a NEW profile and leaves the input unchanged.",
1362
+ "examplePrompts": [],
1363
+ "argsType": "ProfileHandle",
1364
+ "resultType": "ProfileHandle"
1365
+ },
1366
+ {
1367
+ "path": "core.geom.update.profile.mirror",
1368
+ "namespace": "core.geom.update.profile",
1369
+ "summary": "Mirror a profile across a plane. Immutable — returns a NEW profile and leaves the input unchanged.",
1370
+ "examplePrompts": [],
1371
+ "argsType": "ProfileHandle",
1372
+ "resultType": "ProfileHandle"
1373
+ },
1374
+ {
1375
+ "path": "core.geom.update.profile.move",
1376
+ "namespace": "core.geom.update.profile",
1377
+ "summary": "Translate a profile by a vector. Immutable — returns a NEW profile and leaves the input unchanged.",
1378
+ "examplePrompts": [],
1379
+ "argsType": "ProfileHandle",
1380
+ "resultType": "ProfileHandle"
1381
+ },
1382
+ {
1383
+ "path": "core.geom.update.profile.offset",
1384
+ "namespace": "core.geom.update.profile",
1385
+ "summary": "Offset a closed profile inward/outward by a signed distance. Immutable — returns a NEW profile and leaves the input unchanged.",
1386
+ "examplePrompts": [],
1387
+ "argsType": "ProfileHandle",
1388
+ "resultType": "ProfileHandle"
1389
+ },
1390
+ {
1391
+ "path": "core.geom.update.profile.remove",
1392
+ "namespace": "core.geom.update.profile",
1393
+ "summary": "Remove the curve at the start or end of a profile. Immutable — returns a NEW profile and leaves the input unchanged.",
1394
+ "examplePrompts": [],
1395
+ "argsType": "ProfileHandle",
1396
+ "resultType": "ProfileHandle"
1397
+ },
1398
+ {
1399
+ "path": "core.geom.update.profile.reverse",
1400
+ "namespace": "core.geom.update.profile",
1401
+ "summary": "Reverse the orientation of a profile. Immutable — returns a NEW profile and leaves the input unchanged.",
1402
+ "examplePrompts": [],
1403
+ "argsType": "ProfileHandle",
1404
+ "resultType": "ProfileHandle"
1405
+ },
1406
+ {
1407
+ "path": "core.geom.update.profile.rotate",
1408
+ "namespace": "core.geom.update.profile",
1409
+ "summary": "Rotate a profile about an axis through an optional pivot. Immutable — returns a NEW profile and leaves the input unchanged.",
1410
+ "examplePrompts": [],
1411
+ "argsType": "ProfileHandle",
1412
+ "resultType": "ProfileHandle"
1413
+ },
1414
+ {
1415
+ "path": "core.geom.update.profile.scale",
1416
+ "namespace": "core.geom.update.profile",
1417
+ "summary": "Scale a profile uniformly or per-axis about an optional pivot. Immutable — returns a NEW profile and leaves the input unchanged.",
1418
+ "examplePrompts": [],
1419
+ "argsType": "ProfileHandle",
1420
+ "resultType": "ProfileHandle"
1421
+ },
1422
+ {
1423
+ "path": "core.geom.update.profile.simplify",
1424
+ "namespace": "core.geom.update.profile",
1425
+ "summary": "Simplify a profile by merging collinear/redundant segments. Immutable — returns a NEW profile and leaves the input unchanged.",
1426
+ "examplePrompts": [],
1427
+ "argsType": "ProfileHandle",
1428
+ "resultType": "ProfileHandle"
1429
+ },
1430
+ {
1431
+ "path": "core.groups.create",
1432
+ "namespace": "core.groups",
1433
+ "summary": "Group components into a new group.",
1434
+ "examplePrompts": [
1435
+ "Group the selected components",
1436
+ "Make a group called Kitchen from these elements",
1437
+ "Bundle components cmp_1 and cmp_2 into a group\n\n# Example\n```ts\nconst { groupId } = await snaptrude.core.groups.create([\"cmp_1\", \"cmp_2\"], \"Kitchen\")\n```"
1438
+ ],
1439
+ "argsType": "ComponentHandle[]",
1440
+ "resultType": "PluginCoreGroupsCreateResult"
1441
+ },
1442
+ {
1443
+ "path": "core.groups.delete",
1444
+ "namespace": "core.groups",
1445
+ "summary": "Delete (dissolve) a group.",
1446
+ "examplePrompts": [
1447
+ "Ungroup group-12",
1448
+ "Dissolve this group but keep its contents",
1449
+ "Delete the group without deleting its members\n\n# Example\n```ts\nawait snaptrude.core.groups.delete(\"group-12\")\n```"
1450
+ ],
1451
+ "argsType": "string",
1452
+ "resultType": "PluginCoreGroupsDeleteResult"
1453
+ },
1454
+ {
1455
+ "path": "core.groups.get",
1456
+ "namespace": "core.groups",
1457
+ "summary": "Get a single group by id.",
1458
+ "examplePrompts": [
1459
+ "Get the group with id group-12",
1460
+ "Look up a single group by its id",
1461
+ "Is group-3 locked and how many members does it have?\n\n# Example\n```ts\nconst group = await snaptrude.core.groups.get(\"group-12\")\nif (group) console.log(group.name, group.memberCount)\n```"
1462
+ ],
1463
+ "argsType": "string",
1464
+ "resultType": "PluginCoreGroupsGetResult"
1465
+ },
1466
+ {
1467
+ "path": "core.groups.getBounds",
1468
+ "namespace": "core.groups",
1469
+ "summary": "Get the axis-aligned bounds of a group.",
1470
+ "examplePrompts": [
1471
+ "How big is this group?",
1472
+ "Get the bounding box of group-12",
1473
+ "Where is the center of this group?\n\n# Example\n```ts\nconst bounds = await snaptrude.core.groups.getBounds(\"group-12\")\nif (bounds) console.log(bounds.center.x, bounds.center.y, bounds.center.z)\n```"
1474
+ ],
1475
+ "argsType": "string",
1476
+ "resultType": "PluginCoreGroupsGetBoundsResult"
1477
+ },
1478
+ {
1479
+ "path": "core.groups.getForComponent",
1480
+ "namespace": "core.groups",
1481
+ "summary": "Get the group a component belongs to.",
1482
+ "examplePrompts": [
1483
+ "Which group is this wall in?",
1484
+ "Find the group that contains component cmp_42",
1485
+ "Is this element grouped, and if so which group?\n\n# Example\n```ts\nconst group = await snaptrude.core.groups.getForComponent(\"cmp_42\")\nconsole.log(group ? group.name : \"ungrouped\")\n```"
1486
+ ],
1487
+ "argsType": "ComponentHandle",
1488
+ "resultType": "PluginCoreGroupsGetForComponentResult"
1489
+ },
1490
+ {
1491
+ "path": "core.groups.isLocked",
1492
+ "namespace": "core.groups",
1493
+ "summary": "Report whether a group is locked.",
1494
+ "examplePrompts": [
1495
+ "Is group-12 locked?",
1496
+ "Check whether this group is locked before editing it",
1497
+ "Tell me if the group is locked\n\n# Example\n```ts\nif (await snaptrude.core.groups.isLocked(\"group-12\")) {\nconsole.log(\"locked — unlock it first\")\n}\n```"
1498
+ ],
1499
+ "argsType": "string",
1500
+ "resultType": "PluginCoreGroupsIsLockedResult"
1501
+ },
1502
+ {
1503
+ "path": "core.groups.list",
1504
+ "namespace": "core.groups",
1505
+ "summary": "List every group in the active project.",
1506
+ "examplePrompts": [
1507
+ "List all the groups in my project",
1508
+ "What groups do I have and how many things are in each?",
1509
+ "Show every group with its lock state",
1510
+ "How many groups are in this model?\n\n# Example\n```ts\nconst { groups } = await snaptrude.core.groups.list()\nfor (const g of groups) console.log(g.name, g.memberCount, g.isLocked)\n```"
1511
+ ],
1512
+ "argsType": null,
1513
+ "resultType": "PluginCoreGroupsListResult"
1514
+ },
1515
+ {
1516
+ "path": "core.groups.listMembers",
1517
+ "namespace": "core.groups",
1518
+ "summary": "List the direct members of a group.",
1519
+ "examplePrompts": [
1520
+ "What's inside group-12?",
1521
+ "List the members of this group",
1522
+ "Show the components and subgroups in group-3\n\n# Example\n```ts\nconst { members } = await snaptrude.core.groups.listMembers(\"group-12\")\nfor (const m of members) console.log(m.type, m.id)\n```"
1523
+ ],
1524
+ "argsType": "string",
1525
+ "resultType": "PluginCoreGroupsListMembersResult"
1526
+ },
1527
+ {
1528
+ "path": "core.groups.update",
1529
+ "namespace": "core.groups",
1530
+ "summary": "Update a group's name and/or membership.",
1531
+ "examplePrompts": [
1532
+ "Rename group-12 to Kitchen",
1533
+ "Add these two walls to the group",
1534
+ "Remove cmp_7 from group-3\n\n# Example\n```ts\nconst group = await snaptrude.core.groups.update(\"group-12\", {\nname: \"Kitchen\",\naddComponentIds: [\"cmp_9\"],\n})\n```"
1535
+ ],
1536
+ "argsType": "string",
1537
+ "resultType": "PluginCoreGroupsUpdateResult"
1538
+ },
1539
+ {
1540
+ "path": "core.history.redo",
1541
+ "namespace": "core.history",
1542
+ "summary": "Step forward over previously undone entries. Symmetric with {@linkcode PluginHistoryApi.undo}.",
1543
+ "examplePrompts": [],
1544
+ "argsType": "number",
1545
+ "resultType": "PluginHistoryStepResult"
1546
+ },
1547
+ {
1548
+ "path": "core.history.undo",
1549
+ "namespace": "core.history",
1550
+ "summary": "Step back over committed history entries.",
1551
+ "examplePrompts": [],
1552
+ "argsType": "number",
1553
+ "resultType": "PluginHistoryStepResult"
1554
+ },
1555
+ {
1556
+ "path": "core.layers.get",
1557
+ "namespace": "core.layers",
1558
+ "summary": "Get a single drawing layer by id.",
1559
+ "examplePrompts": [
1560
+ "Get the drawing layer with id ly_5",
1561
+ "Is layer ly_5 hidden or locked?",
1562
+ "Look up a single drawing layer by its id\n\n# Example\n```ts\nconst layer = await snaptrude.core.layers.get(\"ly_5\")\nif (layer) console.log(layer.name, layer.hidden, layer.locked)\n```"
1563
+ ],
1564
+ "argsType": "string",
1565
+ "resultType": "PluginCoreLayersGetResult"
1566
+ },
1567
+ {
1568
+ "path": "core.layers.getActive",
1569
+ "namespace": "core.layers",
1570
+ "summary": "Get the active drawing layer of a storey.",
1571
+ "examplePrompts": [
1572
+ "Which drawing layer is active on this storey?",
1573
+ "Get the current layer on storey st_2",
1574
+ "What layer am I drawing on?\n\n# Example\n```ts\nconst active = await snaptrude.core.layers.getActive(\"st_2\")\nif (active) console.log(active.name)\n```"
1575
+ ],
1576
+ "argsType": "string",
1577
+ "resultType": "PluginCoreLayersGetActiveResult"
1578
+ },
1579
+ {
1580
+ "path": "core.layers.list",
1581
+ "namespace": "core.layers",
1582
+ "summary": "List the drawing layers of a storey.",
1583
+ "examplePrompts": [
1584
+ "List the drawing layers on this storey",
1585
+ "Show all the PDF underlays on storey st_2",
1586
+ "What CAD layers are on the ground floor?\n\n# Example\n```ts\nconst { layers } = await snaptrude.core.layers.list(\"st_2\")\nfor (const l of layers) console.log(l.name, l.layerType, l.hidden)\n```"
1587
+ ],
1588
+ "argsType": "string",
1589
+ "resultType": "PluginCoreLayersListResult"
1590
+ },
1591
+ {
1592
+ "path": "core.layers.setActive",
1593
+ "namespace": "core.layers",
1594
+ "summary": "Make a drawing layer the active layer of its storey.",
1595
+ "examplePrompts": [
1596
+ "Draw on layer ly_5",
1597
+ "Make this the active layer",
1598
+ "Switch the active layer to the CAD underlay\n\n# Example\n```ts\nawait snaptrude.core.layers.setActive(\"ly_5\")\n```"
1599
+ ],
1600
+ "argsType": "string",
1601
+ "resultType": "PluginCoreLayersSetActiveResult"
1602
+ },
1603
+ {
1604
+ "path": "core.layers.update",
1605
+ "namespace": "core.layers",
1606
+ "summary": "Update a drawing layer's visibility.",
1607
+ "examplePrompts": [
1608
+ "Hide the PDF underlay layer",
1609
+ "Show the CAD layer again",
1610
+ "Hide layer ly_5\n\n# Example\n```ts\nconst layer = await snaptrude.core.layers.update(\"ly_5\", true)\n```"
1611
+ ],
1612
+ "argsType": "string",
1613
+ "resultType": "PluginCoreLayersUpdateResult"
1614
+ },
1615
+ {
1616
+ "path": "core.math.quat.components",
1617
+ "namespace": "core.math.quat",
1618
+ "summary": "Read the primitive `{ x, y, z, w }` components of a quaternion handle.",
1619
+ "examplePrompts": [],
1620
+ "argsType": "QuatHandle",
1621
+ "resultType": "QuatComponents"
1622
+ },
1623
+ {
1624
+ "path": "core.math.quat.conjugate",
1625
+ "namespace": "core.math.quat",
1626
+ "summary": "Conjugate.",
1627
+ "examplePrompts": [],
1628
+ "argsType": "QuatHandle",
1629
+ "resultType": "QuatHandle"
1630
+ },
1631
+ {
1632
+ "path": "core.math.quat.dot",
1633
+ "namespace": "core.math.quat",
1634
+ "summary": "Dot product.",
1635
+ "examplePrompts": [],
1636
+ "argsType": "QuatHandle",
1637
+ "resultType": "number"
1638
+ },
1639
+ {
1640
+ "path": "core.math.quat.equals",
1641
+ "namespace": "core.math.quat",
1642
+ "summary": "Exact component equality.",
1643
+ "examplePrompts": [],
1644
+ "argsType": "QuatHandle",
1645
+ "resultType": "boolean"
1646
+ },
1647
+ {
1648
+ "path": "core.math.quat.equalsApprox",
1649
+ "namespace": "core.math.quat",
1650
+ "summary": "Approximate equality within `epsilon` (default `1e-6`).",
1651
+ "examplePrompts": [],
1652
+ "argsType": "QuatHandle",
1653
+ "resultType": "boolean"
1654
+ },
1655
+ {
1656
+ "path": "core.math.quat.fromAxisAngle",
1657
+ "namespace": "core.math.quat",
1658
+ "summary": "Build from a rotation axis and angle (radians).",
1659
+ "examplePrompts": [],
1660
+ "argsType": "Vec3Handle",
1661
+ "resultType": "QuatHandle"
1662
+ },
1663
+ {
1664
+ "path": "core.math.quat.fromEuler",
1665
+ "namespace": "core.math.quat",
1666
+ "summary": "Build from Euler angles (radians).",
1667
+ "examplePrompts": [],
1668
+ "argsType": "number",
1669
+ "resultType": "QuatHandle"
1670
+ },
1671
+ {
1672
+ "path": "core.math.quat.identity",
1673
+ "namespace": "core.math.quat",
1674
+ "summary": "The identity rotation.",
1675
+ "examplePrompts": [],
1676
+ "argsType": null,
1677
+ "resultType": "QuatHandle"
1678
+ },
1679
+ {
1680
+ "path": "core.math.quat.inverse",
1681
+ "namespace": "core.math.quat",
1682
+ "summary": "Inverse rotation.",
1683
+ "examplePrompts": [],
1684
+ "argsType": "QuatHandle",
1685
+ "resultType": "QuatHandle"
1686
+ },
1687
+ {
1688
+ "path": "core.math.quat.length",
1689
+ "namespace": "core.math.quat",
1690
+ "summary": "Magnitude.",
1691
+ "examplePrompts": [],
1692
+ "argsType": "QuatHandle",
1693
+ "resultType": "number"
1694
+ },
1695
+ {
1696
+ "path": "core.math.quat.multiply",
1697
+ "namespace": "core.math.quat",
1698
+ "summary": "Hamilton product `a * b` (apply `b` then `a`).",
1699
+ "examplePrompts": [],
1700
+ "argsType": "QuatHandle",
1701
+ "resultType": "QuatHandle"
1702
+ },
1703
+ {
1704
+ "path": "core.math.quat.new",
1705
+ "namespace": "core.math.quat",
1706
+ "summary": "Create a quaternion from primitive components.",
1707
+ "examplePrompts": [],
1708
+ "argsType": "number",
1709
+ "resultType": "QuatHandle"
1710
+ },
1711
+ {
1712
+ "path": "core.math.quat.normalize",
1713
+ "namespace": "core.math.quat",
1714
+ "summary": "Unit quaternion.",
1715
+ "examplePrompts": [],
1716
+ "argsType": "QuatHandle",
1717
+ "resultType": "QuatHandle"
1718
+ },
1719
+ {
1720
+ "path": "core.math.quat.slerp",
1721
+ "namespace": "core.math.quat",
1722
+ "summary": "Spherical linear interpolation.",
1723
+ "examplePrompts": [],
1724
+ "argsType": "QuatHandle",
1725
+ "resultType": "QuatHandle"
1726
+ },
1727
+ {
1728
+ "path": "core.math.quat.toAxisAngle",
1729
+ "namespace": "core.math.quat",
1730
+ "summary": "Decompose into axis + angle.",
1731
+ "examplePrompts": [],
1732
+ "argsType": "QuatHandle",
1733
+ "resultType": "{ axis: Vec3Handle; angle: number }"
1734
+ },
1735
+ {
1736
+ "path": "core.math.vec3.add",
1737
+ "namespace": "core.math.vec3",
1738
+ "summary": "Component-wise sum `a + b`.",
1739
+ "examplePrompts": [],
1740
+ "argsType": "Vec3Handle",
1741
+ "resultType": "Vec3Handle"
1742
+ },
1743
+ {
1744
+ "path": "core.math.vec3.components",
1745
+ "namespace": "core.math.vec3",
1746
+ "summary": "Read the primitive `{ x, y, z }` components of a vector handle.",
1747
+ "examplePrompts": [],
1748
+ "argsType": "Vec3Handle",
1749
+ "resultType": "Vec3Components"
1750
+ },
1751
+ {
1752
+ "path": "core.math.vec3.cross",
1753
+ "namespace": "core.math.vec3",
1754
+ "summary": "Cross product `a × b`.",
1755
+ "examplePrompts": [],
1756
+ "argsType": "Vec3Handle",
1757
+ "resultType": "Vec3Handle"
1758
+ },
1759
+ {
1760
+ "path": "core.math.vec3.distance",
1761
+ "namespace": "core.math.vec3",
1762
+ "summary": "Euclidean distance between two points.",
1763
+ "examplePrompts": [],
1764
+ "argsType": "Vec3Handle",
1765
+ "resultType": "number"
1766
+ },
1767
+ {
1768
+ "path": "core.math.vec3.dot",
1769
+ "namespace": "core.math.vec3",
1770
+ "summary": "Dot product.",
1771
+ "examplePrompts": [],
1772
+ "argsType": "Vec3Handle",
1773
+ "resultType": "number"
1774
+ },
1775
+ {
1776
+ "path": "core.math.vec3.equals",
1777
+ "namespace": "core.math.vec3",
1778
+ "summary": "Exact component equality.",
1779
+ "examplePrompts": [],
1780
+ "argsType": "Vec3Handle",
1781
+ "resultType": "boolean"
1782
+ },
1783
+ {
1784
+ "path": "core.math.vec3.equalsApprox",
1785
+ "namespace": "core.math.vec3",
1786
+ "summary": "Approximate equality within `epsilon` (default `1e-6`).",
1787
+ "examplePrompts": [],
1788
+ "argsType": "Vec3Handle",
1789
+ "resultType": "boolean"
1790
+ },
1791
+ {
1792
+ "path": "core.math.vec3.length",
1793
+ "namespace": "core.math.vec3",
1794
+ "summary": "Euclidean length.",
1795
+ "examplePrompts": [],
1796
+ "argsType": "Vec3Handle",
1797
+ "resultType": "number"
1798
+ },
1799
+ {
1800
+ "path": "core.math.vec3.lengthSquared",
1801
+ "namespace": "core.math.vec3",
1802
+ "summary": "Squared length (avoids the sqrt).",
1803
+ "examplePrompts": [],
1804
+ "argsType": "Vec3Handle",
1805
+ "resultType": "number"
1806
+ },
1807
+ {
1808
+ "path": "core.math.vec3.lerp",
1809
+ "namespace": "core.math.vec3",
1810
+ "summary": "Linear interpolation `a + (b - a) * t`.",
1811
+ "examplePrompts": [],
1812
+ "argsType": "Vec3Handle",
1813
+ "resultType": "Vec3Handle"
1814
+ },
1815
+ {
1816
+ "path": "core.math.vec3.negate",
1817
+ "namespace": "core.math.vec3",
1818
+ "summary": "Negate (reverse direction).",
1819
+ "examplePrompts": [],
1820
+ "argsType": "Vec3Handle",
1821
+ "resultType": "Vec3Handle"
1822
+ },
1823
+ {
1824
+ "path": "core.math.vec3.new",
1825
+ "namespace": "core.math.vec3",
1826
+ "summary": "Create a vector from primitive components.",
1827
+ "examplePrompts": [],
1828
+ "argsType": "number",
1829
+ "resultType": "Vec3Handle"
1830
+ },
1831
+ {
1832
+ "path": "core.math.vec3.normalize",
1833
+ "namespace": "core.math.vec3",
1834
+ "summary": "Unit vector in the same direction (zero vector if length 0).",
1835
+ "examplePrompts": [],
1836
+ "argsType": "Vec3Handle",
1837
+ "resultType": "Vec3Handle"
1838
+ },
1839
+ {
1840
+ "path": "core.math.vec3.scale",
1841
+ "namespace": "core.math.vec3",
1842
+ "summary": "Scale `v` by a scalar.",
1843
+ "examplePrompts": [],
1844
+ "argsType": "Vec3Handle",
1845
+ "resultType": "Vec3Handle"
1846
+ },
1847
+ {
1848
+ "path": "core.math.vec3.subtract",
1849
+ "namespace": "core.math.vec3",
1850
+ "summary": "Component-wise difference `a - b`.",
1851
+ "examplePrompts": [],
1852
+ "argsType": "Vec3Handle",
1853
+ "resultType": "Vec3Handle"
1854
+ },
1855
+ {
1856
+ "path": "core.project.settings.getTolerance",
1857
+ "namespace": "core.project.settings",
1858
+ "summary": "Get the project tolerance as a numeric magnitude.",
1859
+ "examplePrompts": [],
1860
+ "argsType": null,
1861
+ "resultType": "number"
1862
+ },
1863
+ {
1864
+ "path": "core.project.settings.grid.disable",
1865
+ "namespace": "core.project.settings.grid",
1866
+ "summary": "Turn the grid off.",
1867
+ "examplePrompts": [],
1868
+ "argsType": null,
1869
+ "resultType": "boolean"
1870
+ },
1871
+ {
1872
+ "path": "core.project.settings.grid.enable",
1873
+ "namespace": "core.project.settings.grid",
1874
+ "summary": "Turn the grid on.",
1875
+ "examplePrompts": [],
1876
+ "argsType": null,
1877
+ "resultType": "boolean"
1878
+ },
1879
+ {
1880
+ "path": "core.project.settings.grid.getValue",
1881
+ "namespace": "core.project.settings.grid",
1882
+ "summary": "Get the grid cell value.",
1883
+ "examplePrompts": [],
1884
+ "argsType": null,
1885
+ "resultType": "number"
1886
+ },
1887
+ {
1888
+ "path": "core.project.settings.grid.setValue",
1889
+ "namespace": "core.project.settings.grid",
1890
+ "summary": "Set the grid cell value.",
1891
+ "examplePrompts": [],
1892
+ "argsType": "number",
1893
+ "resultType": "boolean"
1894
+ },
1895
+ {
1896
+ "path": "core.project.settings.setTolerance",
1897
+ "namespace": "core.project.settings",
1898
+ "summary": "Set the project tolerance. The value snaps to the **nearest allowed** per-unit precision option (tolerance is a discrete dropdown, not arbitrary).",
1899
+ "examplePrompts": [],
1900
+ "argsType": "number",
1901
+ "resultType": "boolean"
1902
+ },
1903
+ {
1904
+ "path": "core.project.settings.snaps.disableAngle",
1905
+ "namespace": "core.project.settings.snaps",
1906
+ "summary": "Turn angle snapping off.",
1907
+ "examplePrompts": [],
1908
+ "argsType": null,
1909
+ "resultType": "boolean"
1910
+ },
1911
+ {
1912
+ "path": "core.project.settings.snaps.disableDimension",
1913
+ "namespace": "core.project.settings.snaps",
1914
+ "summary": "Turn dimension snapping off.",
1915
+ "examplePrompts": [],
1916
+ "argsType": null,
1917
+ "resultType": "boolean"
1918
+ },
1919
+ {
1920
+ "path": "core.project.settings.snaps.disableMagnetic",
1921
+ "namespace": "core.project.settings.snaps",
1922
+ "summary": "Turn magnetic snapping off.",
1923
+ "examplePrompts": [],
1924
+ "argsType": null,
1925
+ "resultType": "boolean"
1926
+ },
1927
+ {
1928
+ "path": "core.project.settings.snaps.disableNormal",
1929
+ "namespace": "core.project.settings.snaps",
1930
+ "summary": "Turn normal (perpendicular) snapping off.",
1931
+ "examplePrompts": [],
1932
+ "argsType": null,
1933
+ "resultType": "boolean"
1934
+ },
1935
+ {
1936
+ "path": "core.project.settings.snaps.disableParallel",
1937
+ "namespace": "core.project.settings.snaps",
1938
+ "summary": "Turn parallel snapping off.",
1939
+ "examplePrompts": [],
1940
+ "argsType": null,
1941
+ "resultType": "boolean"
1942
+ },
1943
+ {
1944
+ "path": "core.project.settings.snaps.enableAngle",
1945
+ "namespace": "core.project.settings.snaps",
1946
+ "summary": "Turn angle snapping on.",
1947
+ "examplePrompts": [],
1948
+ "argsType": null,
1949
+ "resultType": "boolean"
1950
+ },
1951
+ {
1952
+ "path": "core.project.settings.snaps.enableDimension",
1953
+ "namespace": "core.project.settings.snaps",
1954
+ "summary": "Turn dimension snapping on.",
1955
+ "examplePrompts": [],
1956
+ "argsType": null,
1957
+ "resultType": "boolean"
1958
+ },
1959
+ {
1960
+ "path": "core.project.settings.snaps.enableMagnetic",
1961
+ "namespace": "core.project.settings.snaps",
1962
+ "summary": "Turn magnetic snapping on.",
1963
+ "examplePrompts": [],
1964
+ "argsType": null,
1965
+ "resultType": "boolean"
1966
+ },
1967
+ {
1968
+ "path": "core.project.settings.snaps.enableNormal",
1969
+ "namespace": "core.project.settings.snaps",
1970
+ "summary": "Turn normal (perpendicular) snapping on.",
1971
+ "examplePrompts": [],
1972
+ "argsType": null,
1973
+ "resultType": "boolean"
1974
+ },
1975
+ {
1976
+ "path": "core.project.settings.snaps.enableParallel",
1977
+ "namespace": "core.project.settings.snaps",
1978
+ "summary": "Turn parallel snapping on.",
1979
+ "examplePrompts": [],
1980
+ "argsType": null,
1981
+ "resultType": "boolean"
1982
+ },
1983
+ {
1984
+ "path": "core.project.settings.snaps.getAngle",
1985
+ "namespace": "core.project.settings.snaps",
1986
+ "summary": "Get the angle-snap threshold (degrees).",
1987
+ "examplePrompts": [],
1988
+ "argsType": null,
1989
+ "resultType": "number"
1990
+ },
1991
+ {
1992
+ "path": "core.project.settings.snaps.getDimension",
1993
+ "namespace": "core.project.settings.snaps",
1994
+ "summary": "Get the dimension-snap threshold.",
1995
+ "examplePrompts": [],
1996
+ "argsType": null,
1997
+ "resultType": "number"
1998
+ },
1999
+ {
2000
+ "path": "core.project.settings.snaps.setAngle",
2001
+ "namespace": "core.project.settings.snaps",
2002
+ "summary": "Set the angle-snap threshold (degrees).",
2003
+ "examplePrompts": [],
2004
+ "argsType": "number",
2005
+ "resultType": "boolean"
2006
+ },
2007
+ {
2008
+ "path": "core.project.settings.snaps.setDimension",
2009
+ "namespace": "core.project.settings.snaps",
2010
+ "summary": "Set the dimension-snap threshold.",
2011
+ "examplePrompts": [],
2012
+ "argsType": "number",
2013
+ "resultType": "boolean"
2014
+ },
2015
+ {
2016
+ "path": "core.tags.assign",
2017
+ "namespace": "core.tags",
2018
+ "summary": "Assign a tag to components, creating the category and tag if needed.",
2019
+ "examplePrompts": [
2020
+ "Tag the selected spaces as Retail in the Zone category",
2021
+ "Tag these rooms High Priority, creating the tag if it doesn't exist",
2022
+ "Put cmp_1 and cmp_2 in Zone / Retail\n\n# Example\n```ts\nconst { tagId, tagCreated, assigned } = await snaptrude.core.tags.assign(\n[\"cmp_1\", \"cmp_2\"],\n\"Zone\",\n\"Retail\",\n)\n```"
2023
+ ],
2024
+ "argsType": "ComponentHandle[]",
2025
+ "resultType": "PluginCoreTagsAssignResult"
2026
+ },
2027
+ {
2028
+ "path": "core.tags.create",
2029
+ "namespace": "core.tags",
2030
+ "summary": "Create a new tag in a category.",
2031
+ "examplePrompts": [
2032
+ "Add a tag called 2-hour to the Fire Rating category",
2033
+ "Create a red High Priority tag in category cat_3",
2034
+ "Make a new tag named Retail\n\n# Example\n```ts\nconst tag = await snaptrude.core.tags.create(\"cat_3\", \"Retail\", \"#b5e1dc\")\n```"
2035
+ ],
2036
+ "argsType": "string",
2037
+ "resultType": "PluginCoreTagsCreateResult"
2038
+ },
2039
+ {
2040
+ "path": "core.tags.createCategory",
2041
+ "namespace": "core.tags",
2042
+ "summary": "Create a new tag category.",
2043
+ "examplePrompts": [
2044
+ "Create a tag category called Fire Rating",
2045
+ "Add a new category named Zone",
2046
+ "Make a category for occupancy type\n\n# Example\n```ts\nconst category = await snaptrude.core.tags.createCategory(\"Fire Rating\")\n```"
2047
+ ],
2048
+ "argsType": "string",
2049
+ "resultType": "PluginCoreTagsCreateCategoryResult"
2050
+ },
2051
+ {
2052
+ "path": "core.tags.delete",
2053
+ "namespace": "core.tags",
2054
+ "summary": "Delete a tag.",
2055
+ "examplePrompts": [
2056
+ "Delete the Retail tag",
2057
+ "Remove tag tag_9",
2058
+ "Delete this label\n\n# Example\n```ts\nconst { resetComponentCount } = await snaptrude.core.tags.delete(\"tag_9\")\n```"
2059
+ ],
2060
+ "argsType": "string",
2061
+ "resultType": "PluginCoreTagsDeleteResult"
2062
+ },
2063
+ {
2064
+ "path": "core.tags.deleteCategory",
2065
+ "namespace": "core.tags",
2066
+ "summary": "Delete a tag category and all its tags.",
2067
+ "examplePrompts": [
2068
+ "Delete the Zone tag category",
2069
+ "Remove category cat_3 and all its tags",
2070
+ "Delete this category\n\n# Example\n```ts\nconst { deletedTagCount } = await snaptrude.core.tags.deleteCategory(\"cat_3\")\n```"
2071
+ ],
2072
+ "argsType": "string",
2073
+ "resultType": "PluginCoreTagsDeleteCategoryResult"
2074
+ },
2075
+ {
2076
+ "path": "core.tags.get",
2077
+ "namespace": "core.tags",
2078
+ "summary": "Get a single tag by id.",
2079
+ "examplePrompts": [
2080
+ "Get the tag with id tag_9",
2081
+ "Look up a single tag by its id",
2082
+ "What color is this tag?\n\n# Example\n```ts\nconst tag = await snaptrude.core.tags.get(\"tag_9\")\nif (tag) console.log(tag.name, tag.color)\n```"
2083
+ ],
2084
+ "argsType": "string",
2085
+ "resultType": "PluginCoreTagsGetResult"
2086
+ },
2087
+ {
2088
+ "path": "core.tags.getCategory",
2089
+ "namespace": "core.tags",
2090
+ "summary": "Get a single tag category by id.",
2091
+ "examplePrompts": [
2092
+ "Get the tag category with id cat_3",
2093
+ "Look up a category by its id",
2094
+ "Which tags are in this category?\n\n# Example\n```ts\nconst category = await snaptrude.core.tags.getCategory(\"cat_3\")\nif (category) console.log(category.name, category.tagIds)\n```"
2095
+ ],
2096
+ "argsType": "string",
2097
+ "resultType": "PluginCoreTagsGetCategoryResult"
2098
+ },
2099
+ {
2100
+ "path": "core.tags.getTagsForComponent",
2101
+ "namespace": "core.tags",
2102
+ "summary": "List the tags carried by a component.",
2103
+ "examplePrompts": [
2104
+ "What tags does this space have?",
2105
+ "List the tags on component cmp_42",
2106
+ "Show the labels applied to this room\n\n# Example\n```ts\nconst { tags } = await snaptrude.core.tags.getTagsForComponent(\"cmp_42\")\nfor (const t of tags) console.log(t.categoryName, t.tagName)\n```"
2107
+ ],
2108
+ "argsType": "ComponentHandle",
2109
+ "resultType": "PluginCoreTagsGetTagsForComponentResult"
2110
+ },
2111
+ {
2112
+ "path": "core.tags.list",
2113
+ "namespace": "core.tags",
2114
+ "summary": "List tags, optionally within one category.",
2115
+ "examplePrompts": [
2116
+ "List every tag in the project",
2117
+ "Show the tags in category cat_3",
2118
+ "What tags are available?\n\n# Example\n```ts\nconst { tags } = await snaptrude.core.tags.list(\"cat_3\")\nfor (const t of tags) console.log(t.name, t.color)\n```"
2119
+ ],
2120
+ "argsType": "string",
2121
+ "resultType": "PluginCoreTagsListResult"
2122
+ },
2123
+ {
2124
+ "path": "core.tags.listCategories",
2125
+ "namespace": "core.tags",
2126
+ "summary": "List the tag categories.",
2127
+ "examplePrompts": [
2128
+ "List all the tag categories",
2129
+ "What tag categories do I have?",
2130
+ "Show every category and its tags\n\n# Example\n```ts\nconst { categories } = await snaptrude.core.tags.listCategories()\nfor (const c of categories) console.log(c.name, c.tagIds.length)\n```"
2131
+ ],
2132
+ "argsType": null,
2133
+ "resultType": "PluginCoreTagsListCategoriesResult"
2134
+ },
2135
+ {
2136
+ "path": "core.tags.listComponents",
2137
+ "namespace": "core.tags",
2138
+ "summary": "List the components carrying a given tag or category.",
2139
+ "examplePrompts": [
2140
+ "Which spaces have the tag tag_9?",
2141
+ "List every component tagged in category cat_3",
2142
+ "Which spaces are untagged in the Occupancy category?\n\n# Example\n```ts\nconst { componentIds } = await snaptrude.core.tags.listComponents({ tagId: \"tag_9\" })\nconsole.log(`${componentIds.length} components`)\n```"
2143
+ ],
2144
+ "argsType": "{ tagId?: string; categoryId?: string; untagged?: boolean }",
2145
+ "resultType": "PluginCoreTagsListComponentsResult"
2146
+ },
2147
+ {
2148
+ "path": "core.tags.unassign",
2149
+ "namespace": "core.tags",
2150
+ "summary": "Clear a category's tag from components.",
2151
+ "examplePrompts": [
2152
+ "Remove the Occupancy tag from the selected spaces",
2153
+ "Clear category cat_3 on components cmp_1 and cmp_2",
2154
+ "Untag these rooms in the Zone category\n\n# Example\n```ts\nawait snaptrude.core.tags.unassign(\"cat_3\", [\"cmp_1\", \"cmp_2\"])\n```"
2155
+ ],
2156
+ "argsType": "string",
2157
+ "resultType": "PluginCoreTagsUnassignResult"
2158
+ },
2159
+ {
2160
+ "path": "core.tags.update",
2161
+ "namespace": "core.tags",
2162
+ "summary": "Update a tag's name and/or color.",
2163
+ "examplePrompts": [
2164
+ "Rename tag tag_9 to Retail",
2165
+ "Change this tag's color to #ff8800",
2166
+ "Recolor the High Priority tag\n\n# Example\n```ts\nconst tag = await snaptrude.core.tags.update(\"tag_9\", { name: \"Retail\" })\n```"
2167
+ ],
2168
+ "argsType": "string",
2169
+ "resultType": "PluginCoreTagsUpdateResult"
2170
+ },
2171
+ {
2172
+ "path": "core.tags.updateCategory",
2173
+ "namespace": "core.tags",
2174
+ "summary": "Rename a tag category.",
2175
+ "examplePrompts": [
2176
+ "Rename category cat_3 to Occupancy",
2177
+ "Change the name of this tag category",
2178
+ "Update the Zone category's name\n\n# Example\n```ts\nconst category = await snaptrude.core.tags.updateCategory(\"cat_3\", \"Occupancy\")\n```"
2179
+ ],
2180
+ "argsType": "string",
2181
+ "resultType": "PluginCoreTagsUpdateCategoryResult"
2182
+ },
2183
+ {
2184
+ "path": "core.units.convert",
2185
+ "namespace": "core.units",
2186
+ "summary": "Convert a value between two unit types.",
2187
+ "examplePrompts": [],
2188
+ "argsType": "number",
2189
+ "resultType": "number"
2190
+ },
2191
+ {
2192
+ "path": "core.units.getBabylonType",
2193
+ "namespace": "core.units",
2194
+ "summary": "The internal storage unit type all geometry is stored in (`\"babylon\"`).",
2195
+ "examplePrompts": [],
2196
+ "argsType": null,
2197
+ "resultType": "PUnitType"
2198
+ },
2199
+ {
2200
+ "path": "core.units.getType",
2201
+ "namespace": "core.units",
2202
+ "summary": "The current project's unit type. Paired with {@linkcode PluginUnitsApi.setType}.",
2203
+ "examplePrompts": [],
2204
+ "argsType": null,
2205
+ "resultType": "PUnitType"
2206
+ },
2207
+ {
2208
+ "path": "core.units.listTypes",
2209
+ "namespace": "core.units",
2210
+ "summary": "List the selectable real-world unit types (excludes the internal `babylon` storage type, which is read via {@linkcode PluginUnitsApi.getBabylonType}).",
2211
+ "examplePrompts": [],
2212
+ "argsType": null,
2213
+ "resultType": "PUnitType[]"
2214
+ },
2215
+ {
2216
+ "path": "core.units.setType",
2217
+ "namespace": "core.units",
2218
+ "summary": "Set the current project's unit type. Paired with {@linkcode PluginUnitsApi.getType}.",
2219
+ "examplePrompts": [],
2220
+ "argsType": "PUnitType",
2221
+ "resultType": "boolean"
2222
+ },
2223
+ {
2224
+ "path": "core.zoom.extents",
2225
+ "namespace": "core.zoom",
2226
+ "summary": "Zoom (fit) the camera to all geometry in the scene — the \"zoom extents\" action.",
2227
+ "examplePrompts": [],
2228
+ "argsType": null,
2229
+ "resultType": "boolean"
2230
+ },
2231
+ {
2232
+ "path": "core.zoom.selection",
2233
+ "namespace": "core.zoom",
2234
+ "summary": "Zoom (fit) the camera to the current selection.",
2235
+ "examplePrompts": [],
2236
+ "argsType": null,
2237
+ "resultType": "boolean"
2238
+ },
2239
+ {
2240
+ "path": "design.boolean.intersect",
2241
+ "namespace": "design.boolean",
2242
+ "summary": "Keep only the overlap of the inputs (`A ∩ B`). Order-independent. HARD constraint: **EXACTLY 2** components (schema `.length(2)`; the engine also throws `MoreThan2ComponentsForIntersect` on >2).",
2243
+ "examplePrompts": [],
2244
+ "argsType": "ComponentHandle[]",
2245
+ "resultType": "BooleanOutcome"
2246
+ },
2247
+ {
2248
+ "path": "design.boolean.subtract",
2249
+ "namespace": "design.boolean",
2250
+ "summary": "Subtract `tools` from `target` (`target − ⋃tools`). ORDER-SENSITIVE: the host seeds `[target, ...tools]`; index 0 is the arg brep, the rest are tool breps. `deleted` includes the target AND every tool; `created` is the remainder mass(es).",
2251
+ "examplePrompts": [],
2252
+ "argsType": "ComponentHandle",
2253
+ "resultType": "BooleanOutcome"
2254
+ },
2255
+ {
2256
+ "path": "design.boolean.union",
2257
+ "namespace": "design.boolean",
2258
+ "summary": "Fuse ≥2 components into a single mass (`A ∪ B ∪ …`). Order-independent.",
2259
+ "examplePrompts": [],
2260
+ "argsType": "ComponentHandle[]",
2261
+ "resultType": "BooleanOutcome"
2262
+ },
2263
+ {
2264
+ "path": "design.create.beam",
2265
+ "namespace": "design.create",
2266
+ "summary": "Create a **beam** by extruding a cross-section contour along `direction` by `length`.",
2267
+ "examplePrompts": [],
2268
+ "argsType": "ContourHandle",
2269
+ "resultType": "ComponentHandle"
2270
+ },
2271
+ {
2272
+ "path": "design.create.ceiling",
2273
+ "namespace": "design.create",
2274
+ "summary": "Create a **ceiling** by extruding a footprint contour by `thickness`, lifted `heightFromFloor` above the floor.",
2275
+ "examplePrompts": [],
2276
+ "argsType": "ContourHandle",
2277
+ "resultType": "ComponentHandle"
2278
+ },
2279
+ {
2280
+ "path": "design.create.column",
2281
+ "namespace": "design.create",
2282
+ "summary": "Create a **column** by extruding a cross-section contour upward by `height` from a base `position`.",
2283
+ "examplePrompts": [],
2284
+ "argsType": "Vec3Handle",
2285
+ "resultType": "ComponentHandle"
2286
+ },
2287
+ {
2288
+ "path": "design.create.copy",
2289
+ "namespace": "design.create",
2290
+ "summary": "**Copy** existing entities, offsetting each copy by `displacement * i` (i = 1…count), source positions preserved. Migrated from the removed `tools.copy`. In `\"instance\"` mode copies stay in the source's instance family where possible; `\"unique\"` makes independent geometry. The created copies become the active selection. Undoable.",
2291
+ "examplePrompts": [],
2292
+ "argsType": "ComponentHandle[]",
2293
+ "resultType": "ComponentHandle[]"
2294
+ },
2295
+ {
2296
+ "path": "design.create.floor",
2297
+ "namespace": "design.create",
2298
+ "summary": "Create a **floor** by extruding a footprint contour by `thickness` (extruded upward).",
2299
+ "examplePrompts": [],
2300
+ "argsType": "ContourHandle",
2301
+ "resultType": "ComponentHandle"
2302
+ },
2303
+ {
2304
+ "path": "design.create.furniture",
2305
+ "namespace": "design.create",
2306
+ "summary": "Place a **furniture** item from the project library at a world position.",
2307
+ "examplePrompts": [],
2308
+ "argsType": "string",
2309
+ "resultType": "ComponentHandle"
2310
+ },
2311
+ {
2312
+ "path": "design.create.mass",
2313
+ "namespace": "design.create",
2314
+ "summary": "Create a **mass** — a generic extruded prism (default `massType` \"Generic mass\"). Same footprint-extrude path as {@linkcode PluginDesignCreateApi.space}.",
2315
+ "examplePrompts": [],
2316
+ "argsType": "ContourHandle",
2317
+ "resultType": "ComponentHandle"
2318
+ },
2319
+ {
2320
+ "path": "design.create.referenceLines",
2321
+ "namespace": "design.create",
2322
+ "summary": "Create **reference lines** from a profile — one reference line per curve in the profile's ordered chain. Returns a handle per created line.",
2323
+ "examplePrompts": [],
2324
+ "argsType": "ProfileHandle",
2325
+ "resultType": "ComponentHandle[]"
2326
+ },
2327
+ {
2328
+ "path": "design.create.roof",
2329
+ "namespace": "design.create",
2330
+ "summary": "Create a **roof** by extruding a footprint contour by `thickness`. Created flat (extruded downward); pitch/slope is a separate post-creation edit.",
2331
+ "examplePrompts": [],
2332
+ "argsType": "ContourHandle",
2333
+ "resultType": "ComponentHandle"
2334
+ },
2335
+ {
2336
+ "path": "design.create.slab",
2337
+ "namespace": "design.create",
2338
+ "summary": "Create a **slab** by extruding a footprint contour by `thickness` (default direction: down).",
2339
+ "examplePrompts": [],
2340
+ "argsType": "ContourHandle",
2341
+ "resultType": "ComponentHandle"
2342
+ },
2343
+ {
2344
+ "path": "design.create.space",
2345
+ "namespace": "design.create",
2346
+ "summary": "Create a **space** (a room / mass) by extruding a footprint contour upward.",
2347
+ "examplePrompts": [],
2348
+ "argsType": "ContourHandle",
2349
+ "resultType": "ComponentHandle"
2350
+ },
2351
+ {
2352
+ "path": "design.create.spaces",
2353
+ "namespace": "design.create",
2354
+ "summary": "Create **many spaces** in one undoable operation (bulk plural of {@linkcode space}). Migrated from the removed `entity.space.bulkCreate`. Each item extrudes a contour footprint up `height`. Validate-all-or-throw; one command. For a rectangular (box) space, build the footprint with `core.geom.create.profileRect` → `contourFromProfile`, then pass it as an item.",
2355
+ "examplePrompts": [],
2356
+ "argsType": "PluginCreateSpaceItem[]",
2357
+ "resultType": "ComponentHandle[]"
2358
+ },
2359
+ {
2360
+ "path": "design.create.staircase",
2361
+ "namespace": "design.create",
2362
+ "summary": "Create a **staircase** from a parametric preset, placed at a point.",
2363
+ "examplePrompts": [],
2364
+ "argsType": "PluginStaircasePreset",
2365
+ "resultType": "ComponentHandle"
2366
+ },
2367
+ {
2368
+ "path": "design.create.walls",
2369
+ "namespace": "design.create",
2370
+ "summary": "Create a connected run of **walls** from a profile — one wall per curve in the profile's chain, with mitred corners at shared endpoints.",
2371
+ "examplePrompts": [],
2372
+ "argsType": "ProfileHandle",
2373
+ "resultType": "ComponentHandle[]"
2374
+ },
2375
+ {
2376
+ "path": "design.delete.entities",
2377
+ "namespace": "design.delete",
2378
+ "summary": "Delete one or more entities. Generic hard delete (backed by the same batched, undoable path as `entity.space.delete`). Cascade is opinionated by the engine: children are removed and linked-list neighbours are fixed up — not caller-tunable in v1. Undoable — commits as a **single** undo entry.",
2379
+ "examplePrompts": [],
2380
+ "argsType": "ComponentHandle[]",
2381
+ "resultType": "PluginDesignChangeResult"
2382
+ },
2383
+ {
2384
+ "path": "design.doors.getFamily",
2385
+ "namespace": "design.doors",
2386
+ "summary": "Get a door's family name (Revit/native).",
2387
+ "examplePrompts": [],
2388
+ "argsType": "ComponentHandle",
2389
+ "resultType": "string | null"
2390
+ },
2391
+ {
2392
+ "path": "design.doors.getHeight",
2393
+ "namespace": "design.doors",
2394
+ "summary": "Get a door's height.",
2395
+ "examplePrompts": [],
2396
+ "argsType": "ComponentHandle",
2397
+ "resultType": "number | null"
2398
+ },
2399
+ {
2400
+ "path": "design.doors.getSupportFloor",
2401
+ "namespace": "design.doors",
2402
+ "summary": "Get the floor a door is hosted on.",
2403
+ "examplePrompts": [],
2404
+ "argsType": "ComponentHandle",
2405
+ "resultType": "ComponentHandle | null"
2406
+ },
2407
+ {
2408
+ "path": "design.doors.getSwingDirection",
2409
+ "namespace": "design.doors",
2410
+ "summary": "Get a door's swing (hinge) handedness — derived from the mesh reflection state.",
2411
+ "examplePrompts": [],
2412
+ "argsType": "ComponentHandle",
2413
+ "resultType": "\"left\" | \"right\" | null"
2414
+ },
2415
+ {
2416
+ "path": "design.doors.getType",
2417
+ "namespace": "design.doors",
2418
+ "summary": "Get a door's type name.",
2419
+ "examplePrompts": [],
2420
+ "argsType": "ComponentHandle",
2421
+ "resultType": "string | null"
2422
+ },
2423
+ {
2424
+ "path": "design.doors.getWidth",
2425
+ "namespace": "design.doors",
2426
+ "summary": "Get a door's width.",
2427
+ "examplePrompts": [],
2428
+ "argsType": "ComponentHandle",
2429
+ "resultType": "number | null"
2430
+ },
2431
+ {
2432
+ "path": "design.doors.mirror",
2433
+ "namespace": "design.doors",
2434
+ "summary": "Mirror a door across an axis (reflect its swing). Undoable (one command).",
2435
+ "examplePrompts": [],
2436
+ "argsType": "ComponentHandle",
2437
+ "resultType": "PluginDesignChangeResult"
2438
+ },
2439
+ {
2440
+ "path": "design.doors.setHeight",
2441
+ "namespace": "design.doors",
2442
+ "summary": "Set the height of one or more doors (engine units; re-cuts the host wall). Undoable.",
2443
+ "examplePrompts": [],
2444
+ "argsType": "ComponentHandle[]",
2445
+ "resultType": "PluginDesignChangeResult"
2446
+ },
2447
+ {
2448
+ "path": "design.doors.setWidth",
2449
+ "namespace": "design.doors",
2450
+ "summary": "Set the width of one or more doors (engine units; re-cuts the host wall). Undoable.",
2451
+ "examplePrompts": [],
2452
+ "argsType": "ComponentHandle[]",
2453
+ "resultType": "PluginDesignChangeResult"
2454
+ },
2455
+ {
2456
+ "path": "design.edit.offsetSplit",
2457
+ "namespace": "design.edit",
2458
+ "summary": "Offset-and-split the top profile of one component. Positive = outward, negative = inward. Single-component only (the engine rejects batches).",
2459
+ "examplePrompts": [],
2460
+ "argsType": "ComponentHandle",
2461
+ "resultType": "OffsetSplitOutcome"
2462
+ },
2463
+ {
2464
+ "path": "design.erase.edge",
2465
+ "namespace": "design.erase",
2466
+ "summary": "Commit the erase for one edge. `DirectUnion` merges the two adjacent masses; `DirectDelete` drops the single mass behind the boundary edge. Single undo entry.",
2467
+ "examplePrompts": [],
2468
+ "argsType": "ErasableEdgeRef",
2469
+ "resultType": "PluginDesignEraseEdgeResult"
2470
+ },
2471
+ {
2472
+ "path": "design.erase.listErasableEdges",
2473
+ "namespace": "design.erase",
2474
+ "summary": "Enumerate every erasable edge in the current plan's bottom-adjacency graph (one {@linkcode ErasableEdgeRef} per edge). Pure read — no scene mutation, no command, not undoable. Erase-ineligible components (locked, hidden, off-storey) are filtered out.",
2475
+ "examplePrompts": [],
2476
+ "argsType": "PluginDesignListErasableEdgesArgs",
2477
+ "resultType": "ErasableEdgeRef[]"
2478
+ },
2479
+ {
2480
+ "path": "design.furniture.exists",
2481
+ "namespace": "design.furniture",
2482
+ "summary": "Test whether a catalog item exists for the given library id.",
2483
+ "examplePrompts": [],
2484
+ "argsType": "string",
2485
+ "resultType": "boolean"
2486
+ },
2487
+ {
2488
+ "path": "design.furniture.getCatalogItem",
2489
+ "namespace": "design.furniture",
2490
+ "summary": "Get a single catalog item by its library id.",
2491
+ "examplePrompts": [],
2492
+ "argsType": "string",
2493
+ "resultType": "PluginFurnitureCatalogItem | null"
2494
+ },
2495
+ {
2496
+ "path": "design.furniture.listCatalog",
2497
+ "namespace": "design.furniture",
2498
+ "summary": "List the placeable furniture catalog (team + general libraries).",
2499
+ "examplePrompts": [],
2500
+ "argsType": "\"team\" | \"general\"",
2501
+ "resultType": "PluginFurnitureCatalogItem[]"
2502
+ },
2503
+ {
2504
+ "path": "design.isLocked",
2505
+ "namespace": "design",
2506
+ "summary": "Test whether an entity is locked (folds group + bucket lock unless `includeInherited: false`).",
2507
+ "examplePrompts": [],
2508
+ "argsType": "ComponentHandle",
2509
+ "resultType": "boolean"
2510
+ },
2511
+ {
2512
+ "path": "design.listLocked",
2513
+ "namespace": "design",
2514
+ "summary": "List the explicitly-locked entities (excludes purely group/bucket-inherited locks).",
2515
+ "examplePrompts": [],
2516
+ "argsType": null,
2517
+ "resultType": "ComponentHandle[]"
2518
+ },
2519
+ {
2520
+ "path": "design.lock",
2521
+ "namespace": "design",
2522
+ "summary": "Lock entities (blocks editing). Undoable. Cascades to void/door/window children, stacked-wall companions, and terrain neighborhood; skips active-group members.",
2523
+ "examplePrompts": [],
2524
+ "argsType": "ComponentHandle[]",
2525
+ "resultType": "PluginDesignChangeResult"
2526
+ },
2527
+ {
2528
+ "path": "design.materials.apply",
2529
+ "namespace": "design.materials",
2530
+ "summary": "Apply a material (by handle or spec) to one or more components. Undoable (`save`, default true).",
2531
+ "examplePrompts": [],
2532
+ "argsType": "ComponentHandle[]",
2533
+ "resultType": "PluginMaterialResult"
2534
+ },
2535
+ {
2536
+ "path": "design.materials.create",
2537
+ "namespace": "design.materials",
2538
+ "summary": "Create (or get, idempotent by name) a material from a spec.",
2539
+ "examplePrompts": [],
2540
+ "argsType": "PluginMaterialSpec",
2541
+ "resultType": "MaterialHandle"
2542
+ },
2543
+ {
2544
+ "path": "design.materials.getDefault",
2545
+ "namespace": "design.materials",
2546
+ "summary": "Get the default material for a component's type.",
2547
+ "examplePrompts": [],
2548
+ "argsType": "ComponentHandle",
2549
+ "resultType": "MaterialHandle | null"
2550
+ },
2551
+ {
2552
+ "path": "design.materials.getInfo",
2553
+ "namespace": "design.materials",
2554
+ "summary": "Read a material's descriptor.",
2555
+ "examplePrompts": [],
2556
+ "argsType": "MaterialHandle",
2557
+ "resultType": "PluginMaterialInfo | null"
2558
+ },
2559
+ {
2560
+ "path": "design.materials.hasTexture",
2561
+ "namespace": "design.materials",
2562
+ "summary": "Test whether a material has a texture.",
2563
+ "examplePrompts": [],
2564
+ "argsType": "MaterialHandle",
2565
+ "resultType": "boolean"
2566
+ },
2567
+ {
2568
+ "path": "design.materials.isDefault",
2569
+ "namespace": "design.materials",
2570
+ "summary": "Test whether a component carries its (type) default material.",
2571
+ "examplePrompts": [],
2572
+ "argsType": "ComponentHandle",
2573
+ "resultType": "boolean"
2574
+ },
2575
+ {
2576
+ "path": "design.materials.isUniform",
2577
+ "namespace": "design.materials",
2578
+ "summary": "Test whether a component has a single (uniform) material across all faces.",
2579
+ "examplePrompts": [],
2580
+ "argsType": "ComponentHandle",
2581
+ "resultType": "boolean"
2582
+ },
2583
+ {
2584
+ "path": "design.materials.list",
2585
+ "namespace": "design.materials",
2586
+ "summary": "List the project materials.",
2587
+ "examplePrompts": [],
2588
+ "argsType": "\"project\" | \"preset\"",
2589
+ "resultType": "MaterialHandle[]"
2590
+ },
2591
+ {
2592
+ "path": "design.materials.reset",
2593
+ "namespace": "design.materials",
2594
+ "summary": "Reset one or more components to their default material. Undoable. Paired with `apply`.",
2595
+ "examplePrompts": [],
2596
+ "argsType": "ComponentHandle[]",
2597
+ "resultType": "PluginMaterialResult"
2598
+ },
2599
+ {
2600
+ "path": "design.query.exists",
2601
+ "namespace": "design.query",
2602
+ "summary": "Test whether an entity id resolves to a live scene entity.",
2603
+ "examplePrompts": [],
2604
+ "argsType": "ComponentHandle",
2605
+ "resultType": "boolean"
2606
+ },
2607
+ {
2608
+ "path": "design.query.geometry.getBottomContour",
2609
+ "namespace": "design.query.geometry",
2610
+ "summary": "Get the **bottom-face contour** of a component — the footprint outline (outer profile + holes) of its lowest horizontal face, as a reusable {@linkcode ContourHandle}.",
2611
+ "examplePrompts": [],
2612
+ "argsType": "ComponentHandle",
2613
+ "resultType": "ContourHandle | null"
2614
+ },
2615
+ {
2616
+ "path": "design.query.geometry.getBrep",
2617
+ "namespace": "design.query.geometry",
2618
+ "summary": "Get the boundary-representation (BREP) mesh of a scene component.",
2619
+ "examplePrompts": [],
2620
+ "argsType": "ComponentHandle",
2621
+ "resultType": "BrepHandle | null"
2622
+ },
2623
+ {
2624
+ "path": "design.query.getBoundingBox",
2625
+ "namespace": "design.query",
2626
+ "summary": "Get the **union** axis-aligned bounding box enclosing a set of entities.",
2627
+ "examplePrompts": [],
2628
+ "argsType": "ComponentHandle[]",
2629
+ "resultType": "BBoxComponents | null"
2630
+ },
2631
+ {
2632
+ "path": "design.query.getById",
2633
+ "namespace": "design.query",
2634
+ "summary": "Look an entity up by id — returns the same handle if it still resolves live, else `null`. A cheap validity probe (distinct from {@linkcode PluginDesignQueryApi.exists}).",
2635
+ "examplePrompts": [],
2636
+ "argsType": "ComponentHandle",
2637
+ "resultType": "ComponentHandle | null"
2638
+ },
2639
+ {
2640
+ "path": "design.query.getEntityRef",
2641
+ "namespace": "design.query",
2642
+ "summary": "Get a serializable, persistable reference to an entity. Under the all-handle model a {@linkcode ComponentHandle} already IS the ref (raw `Component.id`), so this is the identity passthrough — provided for API completeness.",
2643
+ "examplePrompts": [],
2644
+ "argsType": "ComponentHandle",
2645
+ "resultType": "ComponentHandle"
2646
+ },
2647
+ {
2648
+ "path": "design.query.getEntityType",
2649
+ "namespace": "design.query",
2650
+ "summary": "Get an entity's {@linkcode PluginEntityType}.",
2651
+ "examplePrompts": [],
2652
+ "argsType": "ComponentHandle",
2653
+ "resultType": "PluginEntityType | null"
2654
+ },
2655
+ {
2656
+ "path": "design.query.getHost",
2657
+ "namespace": "design.query",
2658
+ "summary": "Get an entity's host/parent entity (e.g. the wall a door is cut into).",
2659
+ "examplePrompts": [],
2660
+ "argsType": "ComponentHandle",
2661
+ "resultType": "ComponentHandle | null"
2662
+ },
2663
+ {
2664
+ "path": "design.query.getLabel",
2665
+ "namespace": "design.query",
2666
+ "summary": "Get an entity's human label (`room_type` for spaces/masses, else the mesh label; `\"\"` when unlabelled). The write side is `design.update` (`setLabel`).",
2667
+ "examplePrompts": [],
2668
+ "argsType": "ComponentHandle",
2669
+ "resultType": "string"
2670
+ },
2671
+ {
2672
+ "path": "design.query.getProperties",
2673
+ "namespace": "design.query",
2674
+ "summary": "Read an entity's common properties as a {@linkcode PluginEntityProperties} record (only applicable fields are present). For spaces/masses this includes `adjacency` — the per-entity adjacency read (bulk form: `program.adjacency.getMatrix`).",
2675
+ "examplePrompts": [],
2676
+ "argsType": "ComponentHandle",
2677
+ "resultType": "PluginEntityProperties"
2678
+ },
2679
+ {
2680
+ "path": "design.query.listBeams",
2681
+ "namespace": "design.query",
2682
+ "summary": "List all **beams**, filtered.",
2683
+ "examplePrompts": [],
2684
+ "argsType": "PluginEntityFilter",
2685
+ "resultType": "ComponentHandle[]"
2686
+ },
2687
+ {
2688
+ "path": "design.query.listByType",
2689
+ "namespace": "design.query",
2690
+ "summary": "List entities of a single {@linkcode PluginEntityType}, plus filter.",
2691
+ "examplePrompts": [],
2692
+ "argsType": "PluginEntityType",
2693
+ "resultType": "ComponentHandle[]"
2694
+ },
2695
+ {
2696
+ "path": "design.query.listCeilings",
2697
+ "namespace": "design.query",
2698
+ "summary": "List all **ceilings**, filtered.",
2699
+ "examplePrompts": [],
2700
+ "argsType": "PluginEntityFilter",
2701
+ "resultType": "ComponentHandle[]"
2702
+ },
2703
+ {
2704
+ "path": "design.query.listChildren",
2705
+ "namespace": "design.query",
2706
+ "summary": "List an entity's direct child entities.",
2707
+ "examplePrompts": [],
2708
+ "argsType": "ComponentHandle",
2709
+ "resultType": "ComponentHandle[]"
2710
+ },
2711
+ {
2712
+ "path": "design.query.listColumns",
2713
+ "namespace": "design.query",
2714
+ "summary": "List all **columns**, filtered.",
2715
+ "examplePrompts": [],
2716
+ "argsType": "PluginEntityFilter",
2717
+ "resultType": "ComponentHandle[]"
2718
+ },
2719
+ {
2720
+ "path": "design.query.listDoors",
2721
+ "namespace": "design.query",
2722
+ "summary": "List all **doors**, filtered.",
2723
+ "examplePrompts": [],
2724
+ "argsType": "PluginEntityFilter",
2725
+ "resultType": "ComponentHandle[]"
2726
+ },
2727
+ {
2728
+ "path": "design.query.listEntities",
2729
+ "namespace": "design.query",
2730
+ "summary": "List **all** BIM entities in the project matching the filter.",
2731
+ "examplePrompts": [],
2732
+ "argsType": "PluginEntityFilter",
2733
+ "resultType": "ComponentHandle[]"
2734
+ },
2735
+ {
2736
+ "path": "design.query.listFloors",
2737
+ "namespace": "design.query",
2738
+ "summary": "List all **floors**, filtered.",
2739
+ "examplePrompts": [],
2740
+ "argsType": "PluginEntityFilter",
2741
+ "resultType": "ComponentHandle[]"
2742
+ },
2743
+ {
2744
+ "path": "design.query.listFurniture",
2745
+ "namespace": "design.query",
2746
+ "summary": "List all **furniture**, filtered.",
2747
+ "examplePrompts": [],
2748
+ "argsType": "PluginEntityFilter",
2749
+ "resultType": "ComponentHandle[]"
2750
+ },
2751
+ {
2752
+ "path": "design.query.listMasses",
2753
+ "namespace": "design.query",
2754
+ "summary": "List all **generic masses** (non-room masses), filtered.",
2755
+ "examplePrompts": [],
2756
+ "argsType": "PluginEntityFilter",
2757
+ "resultType": "ComponentHandle[]"
2758
+ },
2759
+ {
2760
+ "path": "design.query.listMullions",
2761
+ "namespace": "design.query",
2762
+ "summary": "List all **curtain-wall mullions**, filtered.",
2763
+ "examplePrompts": [],
2764
+ "argsType": "PluginEntityFilter",
2765
+ "resultType": "ComponentHandle[]"
2766
+ },
2767
+ {
2768
+ "path": "design.query.listReferenceLines",
2769
+ "namespace": "design.query",
2770
+ "summary": "List all **reference lines**, filtered.",
2771
+ "examplePrompts": [],
2772
+ "argsType": "PluginEntityFilter",
2773
+ "resultType": "ComponentHandle[]"
2774
+ },
2775
+ {
2776
+ "path": "design.query.listRoofs",
2777
+ "namespace": "design.query",
2778
+ "summary": "List all **roofs**, filtered.",
2779
+ "examplePrompts": [],
2780
+ "argsType": "PluginEntityFilter",
2781
+ "resultType": "ComponentHandle[]"
2782
+ },
2783
+ {
2784
+ "path": "design.query.listSlabs",
2785
+ "namespace": "design.query",
2786
+ "summary": "List all **slabs**, filtered.",
2787
+ "examplePrompts": [],
2788
+ "argsType": "PluginEntityFilter",
2789
+ "resultType": "ComponentHandle[]"
2790
+ },
2791
+ {
2792
+ "path": "design.query.listSpaces",
2793
+ "namespace": "design.query",
2794
+ "summary": "List all **spaces** (room masses), filtered. See {@linkcode PluginDesignQueryApi.listWalls}.",
2795
+ "examplePrompts": [],
2796
+ "argsType": "PluginEntityFilter",
2797
+ "resultType": "ComponentHandle[]"
2798
+ },
2799
+ {
2800
+ "path": "design.query.listStaircases",
2801
+ "namespace": "design.query",
2802
+ "summary": "List all **staircases**, filtered.",
2803
+ "examplePrompts": [],
2804
+ "argsType": "PluginEntityFilter",
2805
+ "resultType": "ComponentHandle[]"
2806
+ },
2807
+ {
2808
+ "path": "design.query.listWalls",
2809
+ "namespace": "design.query",
2810
+ "summary": "List all **walls**, filtered.",
2811
+ "examplePrompts": [],
2812
+ "argsType": "PluginEntityFilter",
2813
+ "resultType": "ComponentHandle[]"
2814
+ },
2815
+ {
2816
+ "path": "design.query.listWindows",
2817
+ "namespace": "design.query",
2818
+ "summary": "List all **windows**, filtered.",
2819
+ "examplePrompts": [],
2820
+ "argsType": "PluginEntityFilter",
2821
+ "resultType": "ComponentHandle[]"
2822
+ },
2823
+ {
2824
+ "path": "design.query.measure",
2825
+ "namespace": "design.query",
2826
+ "summary": "Measure an entity — the multi-metric bundle (area/volume/length + bbox).",
2827
+ "examplePrompts": [],
2828
+ "argsType": "ComponentHandle",
2829
+ "resultType": "PluginEntityMeasurements | null"
2830
+ },
2831
+ {
2832
+ "path": "design.query.spaces.get",
2833
+ "namespace": "design.query.spaces",
2834
+ "summary": "Get selected properties of a space — the selective multi-property read.",
2835
+ "examplePrompts": [],
2836
+ "argsType": "ComponentHandle",
2837
+ "resultType": "PluginDesignQuerySpacesGetResult"
2838
+ },
2839
+ {
2840
+ "path": "design.query.spaces.getFootprint",
2841
+ "namespace": "design.query.spaces",
2842
+ "summary": "Get the **footprint** of a space — its bottom-face contour (outer profile + holes) as a reusable {@linkcode ContourHandle}. Equivalent to {@linkcode PluginDesignQueryGeometryApi.getBottomContour} narrowed to spaces.",
2843
+ "examplePrompts": [],
2844
+ "argsType": "ComponentHandle",
2845
+ "resultType": "ContourHandle | null"
2846
+ },
2847
+ {
2848
+ "path": "design.selection.add",
2849
+ "namespace": "design.selection",
2850
+ "summary": "Add entities to the current selection.",
2851
+ "examplePrompts": [],
2852
+ "argsType": "ComponentHandle[]",
2853
+ "resultType": "PluginDesignChangeResult"
2854
+ },
2855
+ {
2856
+ "path": "design.selection.clear",
2857
+ "namespace": "design.selection",
2858
+ "summary": "Clear the selection (≡ `set([])`).",
2859
+ "examplePrompts": [],
2860
+ "argsType": null,
2861
+ "resultType": "PluginDesignChangeResult"
2862
+ },
2863
+ {
2864
+ "path": "design.selection.get",
2865
+ "namespace": "design.selection",
2866
+ "summary": "Get the currently-selected entities.",
2867
+ "examplePrompts": [],
2868
+ "argsType": null,
2869
+ "resultType": "ComponentHandle[]"
2870
+ },
2871
+ {
2872
+ "path": "design.selection.remove",
2873
+ "namespace": "design.selection",
2874
+ "summary": "Remove entities from the current selection.",
2875
+ "examplePrompts": [],
2876
+ "argsType": "ComponentHandle[]",
2877
+ "resultType": "PluginDesignChangeResult"
2878
+ },
2879
+ {
2880
+ "path": "design.selection.set",
2881
+ "namespace": "design.selection",
2882
+ "summary": "Replace the selection with exactly the given entities.",
2883
+ "examplePrompts": [],
2884
+ "argsType": "ComponentHandle[]",
2885
+ "resultType": "PluginDesignChangeResult"
2886
+ },
2887
+ {
2888
+ "path": "design.transform.move",
2889
+ "namespace": "design.transform",
2890
+ "summary": "Translate entities by a **relative** displacement vector (added to the first component's absolute position as the anchor). Undoable.",
2891
+ "examplePrompts": [],
2892
+ "argsType": "ComponentHandle[]",
2893
+ "resultType": "PluginDesignChangeResult"
2894
+ },
2895
+ {
2896
+ "path": "design.transform.rotate",
2897
+ "namespace": "design.transform",
2898
+ "summary": "Rotate entities by a **signed angle in DEGREES**, anchored at the combined bounding-box centre (positive = CCW about +Y). NOTE: unlike the removed `tools.transform.rotate` (radians + caller pivot), this canonical form takes DEGREES and has NO caller pivot — the pivot is always the bbox centre. Undoable.",
2899
+ "examplePrompts": [],
2900
+ "argsType": "ComponentHandle[]",
2901
+ "resultType": "PluginDesignChangeResult"
2902
+ },
2903
+ {
2904
+ "path": "design.unlock",
2905
+ "namespace": "design",
2906
+ "summary": "Unlock entities. Undoable. Paired with {@linkcode PluginDesignApi.lock}.",
2907
+ "examplePrompts": [],
2908
+ "argsType": "ComponentHandle[]",
2909
+ "resultType": "PluginDesignChangeResult"
2910
+ },
2911
+ {
2912
+ "path": "design.update.space",
2913
+ "namespace": "design.update",
2914
+ "summary": "Update ONE space — sparse `properties` and/or a `geometry` re-extrude. Undoable.",
2915
+ "examplePrompts": [],
2916
+ "argsType": "ComponentHandle",
2917
+ "resultType": "PluginSpaceUpdateResult"
2918
+ },
2919
+ {
2920
+ "path": "design.update.spaces",
2921
+ "namespace": "design.update",
2922
+ "summary": "Update **many spaces** in one undoable operation (bulk plural of {@linkcode space}). Migrated from `entity.space.bulkUpdate`. Validate-all-or-throw; one command.",
2923
+ "examplePrompts": [],
2924
+ "argsType": "PluginUpdateSpaceItem[]",
2925
+ "resultType": "PluginSpaceUpdateResult[]"
2926
+ },
2927
+ {
2928
+ "path": "design.windows.getDimensions",
2929
+ "namespace": "design.windows",
2930
+ "summary": "Get a window's dimensions (local oriented space; `thickness` = through-wall depth).",
2931
+ "examplePrompts": [],
2932
+ "argsType": "ComponentHandle",
2933
+ "resultType": "PluginWindowDimensions | null"
2934
+ },
2935
+ {
2936
+ "path": "design.windows.getHeight",
2937
+ "namespace": "design.windows",
2938
+ "summary": "Get a window's height.",
2939
+ "examplePrompts": [],
2940
+ "argsType": "ComponentHandle",
2941
+ "resultType": "number | null"
2942
+ },
2943
+ {
2944
+ "path": "design.windows.getType",
2945
+ "namespace": "design.windows",
2946
+ "summary": "Get a window's type name.",
2947
+ "examplePrompts": [],
2948
+ "argsType": "ComponentHandle",
2949
+ "resultType": "string | null"
2950
+ },
2951
+ {
2952
+ "path": "design.windows.getWidth",
2953
+ "namespace": "design.windows",
2954
+ "summary": "Get a window's width.",
2955
+ "examplePrompts": [],
2956
+ "argsType": "ComponentHandle",
2957
+ "resultType": "number | null"
2958
+ },
2959
+ {
2960
+ "path": "design.windows.setHeight",
2961
+ "namespace": "design.windows",
2962
+ "summary": "Set a window's height (engine units; re-cuts the host wall). Undoable.",
2963
+ "examplePrompts": [],
2964
+ "argsType": "ComponentHandle",
2965
+ "resultType": "PluginDesignChangeResult"
2966
+ },
2967
+ {
2968
+ "path": "design.windows.setWidth",
2969
+ "namespace": "design.windows",
2970
+ "summary": "Set a window's width (engine units; re-cuts the host wall). Undoable.",
2971
+ "examplePrompts": [],
2972
+ "argsType": "ComponentHandle",
2973
+ "resultType": "PluginDesignChangeResult"
2974
+ },
2975
+ {
2976
+ "path": "entity.buildableEnvelope.create",
2977
+ "namespace": "entity.buildableEnvelope",
2978
+ "summary": "Create a new parametric buildable envelope.",
2979
+ "examplePrompts": [],
2980
+ "argsType": "PluginBuildableEnvelopePolygonVertex[]",
2981
+ "resultType": "PluginBuildableEnvelopeCreateResult"
2982
+ },
2983
+ {
2984
+ "path": "entity.buildableEnvelope.update",
2985
+ "namespace": "entity.buildableEnvelope",
2986
+ "summary": "Update an existing parametric buildable envelope.",
2987
+ "examplePrompts": [],
2988
+ "argsType": "string",
2989
+ "resultType": "PluginBuildableEnvelopeUpdateResult"
2990
+ },
2991
+ {
2992
+ "path": "entity.referenceLine.createMulti",
2993
+ "namespace": "entity.referenceLine",
2994
+ "summary": "Create multiple reference lines from a profile.",
2995
+ "examplePrompts": [],
2996
+ "argsType": "ProfileHandle",
2997
+ "resultType": "PluginReferenceLineCreateMultiResult"
2998
+ },
2999
+ {
3000
+ "path": "entity.referenceLine.delete",
3001
+ "namespace": "entity.referenceLine",
3002
+ "summary": "Delete a reference line by its ID.",
3003
+ "examplePrompts": [],
3004
+ "argsType": "string",
3005
+ "resultType": "PluginReferenceLineDeleteResult"
3006
+ },
3007
+ {
3008
+ "path": "entity.referenceLine.get",
3009
+ "namespace": "entity.referenceLine",
3010
+ "summary": "Get properties of a reference line by its ID.",
3011
+ "examplePrompts": [],
3012
+ "argsType": "string",
3013
+ "resultType": "PluginReferenceLineGetResult"
3014
+ },
3015
+ {
3016
+ "path": "entity.referenceLine.getAll",
3017
+ "namespace": "entity.referenceLine",
3018
+ "summary": "Get the IDs of all reference lines in the current project.",
3019
+ "examplePrompts": [],
3020
+ "argsType": null,
3021
+ "resultType": "PluginReferenceLineGetAllResult"
3022
+ },
3023
+ {
3024
+ "path": "entity.story.create",
3025
+ "namespace": "entity.story",
3026
+ "summary": "Create a new story (floor) in the project.",
3027
+ "examplePrompts": [],
3028
+ "argsType": "number",
3029
+ "resultType": "PluginStoryCreateResult"
3030
+ },
3031
+ {
3032
+ "path": "entity.story.get",
3033
+ "namespace": "entity.story",
3034
+ "summary": "Get properties of a story by its storey number.",
3035
+ "examplePrompts": [],
3036
+ "argsType": "number",
3037
+ "resultType": "PluginStoryGetResult"
3038
+ },
3039
+ {
3040
+ "path": "entity.story.getAll",
3041
+ "namespace": "entity.story",
3042
+ "summary": "Get all stories in the current project.",
3043
+ "examplePrompts": [],
3044
+ "argsType": null,
3045
+ "resultType": "PluginStoryGetAllResult"
3046
+ },
3047
+ {
3048
+ "path": "entity.story.update",
3049
+ "namespace": "entity.story",
3050
+ "summary": "Update a story's height.",
3051
+ "examplePrompts": [],
3052
+ "argsType": "number",
3053
+ "resultType": "PluginStoryUpdateResult"
3054
+ },
3055
+ {
3056
+ "path": "presentation.diagrams.place",
3057
+ "namespace": "presentation.diagrams",
3058
+ "summary": "Place diagram images onto a sheet.",
3059
+ "examplePrompts": [
3060
+ "Place the adjacency diagram on Sheet 1",
3061
+ "Add the program diagram to the cover sheet",
3062
+ "Drop these diagram images onto the layout\n\n# Example\n```ts\nawait snaptrude.presentation.diagrams.place(\"sheet_1\", [\n\"https://example.com/program-diagram.png\",\n])\n```"
3063
+ ],
3064
+ "argsType": "string",
3065
+ "resultType": "PluginPresentationDiagramsPlaceResult"
3066
+ },
3067
+ {
3068
+ "path": "presentation.import.image",
3069
+ "namespace": "presentation.import",
3070
+ "summary": "Import a reference image onto the current Present sheet.",
3071
+ "examplePrompts": [
3072
+ "Import this reference image onto the present canvas",
3073
+ "Add a JPG to my presentation board",
3074
+ "Drop this site photo onto the current sheet",
3075
+ "Bring an inspiration image into Present mode\n\n# Example\n```ts\nconst { shapeIds } = await snaptrude.presentation.import.image(\n{ url: \"https://example.com/ref.png\" },\n{ position: { x: 200, y: 150 } },\n)\n```"
3076
+ ],
3077
+ "argsType": "{ url?: string; dataUrl?: string }",
3078
+ "resultType": "PluginPresentationImportResult"
3079
+ },
3080
+ {
3081
+ "path": "presentation.import.pdf",
3082
+ "namespace": "presentation.import",
3083
+ "summary": "Import a PDF onto the current Present sheet (one shape per page).",
3084
+ "examplePrompts": [
3085
+ "Import this PDF onto the present canvas",
3086
+ "Add a multi-page PDF reference to my board",
3087
+ "Bring a PDF floor plan into Present mode as vectors",
3088
+ "Place each page of this PDF on the sheet\n\n# Example\n```ts\nconst { shapeIds } = await snaptrude.presentation.import.pdf({\nurl: \"https://example.com/plans.pdf\",\n})\n```"
3089
+ ],
3090
+ "argsType": "{ url?: string; dataUrl?: string }",
3091
+ "resultType": "PluginPresentationImportResult"
3092
+ },
3093
+ {
3094
+ "path": "presentation.sheets.create",
3095
+ "namespace": "presentation.sheets",
3096
+ "summary": "Create a new layout sheet.",
3097
+ "examplePrompts": [
3098
+ "Create a new sheet called Cover",
3099
+ "Add a layout sheet",
3100
+ "Make a new presentation sheet named Floor Plans\n\n# Example\n```ts\nconst sheet = await snaptrude.presentation.sheets.create(\"Cover\")\n```"
3101
+ ],
3102
+ "argsType": "string",
3103
+ "resultType": "PluginPresentationSheet"
3104
+ },
3105
+ {
3106
+ "path": "presentation.sheets.get",
3107
+ "namespace": "presentation.sheets",
3108
+ "summary": "Get a single sheet by id.",
3109
+ "examplePrompts": [
3110
+ "Get the sheet with id sheet_1",
3111
+ "Find the sheet called Cover",
3112
+ "Look up a layout sheet by id\n\n# Example\n```ts\nconst sheet = await snaptrude.presentation.sheets.get(\"sheet_1\")\n```"
3113
+ ],
3114
+ "argsType": "string",
3115
+ "resultType": "PluginPresentationSheetsGetResult"
3116
+ },
3117
+ {
3118
+ "path": "presentation.sheets.list",
3119
+ "namespace": "presentation.sheets",
3120
+ "summary": "List the layout sheets in the presentation.",
3121
+ "examplePrompts": [
3122
+ "List all the sheets",
3123
+ "How many layout sheets are there?",
3124
+ "Show me the presentation sheets",
3125
+ "What sheets can I place views on?\n\n# Example\n```ts\nconst { sheets } = await snaptrude.presentation.sheets.list()\n```"
3126
+ ],
3127
+ "argsType": null,
3128
+ "resultType": "PluginPresentationSheetsListResult"
3129
+ },
3130
+ {
3131
+ "path": "presentation.sheets.place",
3132
+ "namespace": "presentation.sheets",
3133
+ "summary": "Place a saved view onto a sheet.",
3134
+ "examplePrompts": [
3135
+ "Place the floor plan on Sheet 1",
3136
+ "Add this 3D view to the cover sheet",
3137
+ "Drop the site plan onto the layout sheet at 100, 200",
3138
+ "Put the Ground Floor view on sheet_1\n\n# Example\n```ts\nconst { shapeId } = await snaptrude.presentation.sheets.place(\"sheet_1\", \"view_123\")\n```"
3139
+ ],
3140
+ "argsType": "string",
3141
+ "resultType": "PluginPresentationSheetsPlaceResult"
3142
+ },
3143
+ {
3144
+ "path": "presentation.views.capture",
3145
+ "namespace": "presentation.views",
3146
+ "summary": "Capture a screenshot of a view as a base64 image.",
3147
+ "examplePrompts": [
3148
+ "Take a screenshot of the current view",
3149
+ "Capture this view as a PNG",
3150
+ "Render the Site Plan view to an image",
3151
+ "Export a high-res image of what I'm looking at\n\n# Example\n```ts\nconst { image } = await snaptrude.presentation.views.capture({ format: \"png\" })\n```"
3152
+ ],
3153
+ "argsType": "{\n viewId?: string\n format?: \"png\" | \"jpeg\"\n resolution?: string\n }",
3154
+ "resultType": "PluginPresentationViewsCaptureResult"
3155
+ },
3156
+ {
3157
+ "path": "presentation.views.create",
3158
+ "namespace": "presentation.views",
3159
+ "summary": "Save the current camera/scene state as a new named view.",
3160
+ "examplePrompts": [
3161
+ "Save the current view as Lobby Perspective",
3162
+ "Create a new saved view from where I'm looking",
3163
+ "Bookmark this camera angle",
3164
+ "Save the current 2D plan as a view\n\n# Example\n```ts\nconst view = await snaptrude.presentation.views.create(\"Lobby\")\n```"
3165
+ ],
3166
+ "argsType": "string",
3167
+ "resultType": "PluginPresentationViewsCreateResult"
3168
+ },
3169
+ {
3170
+ "path": "presentation.views.get",
3171
+ "namespace": "presentation.views",
3172
+ "summary": "Get a single saved view by id.",
3173
+ "examplePrompts": [
3174
+ "Get the view with id view_12345",
3175
+ "Find the saved view called Ground Floor Plan",
3176
+ "Look up a presentation view by its id\n\n# Example\n```ts\nconst view = await snaptrude.presentation.views.get(\"view_123\")\n```"
3177
+ ],
3178
+ "argsType": "string",
3179
+ "resultType": "PluginPresentationViewsGetResult"
3180
+ },
3181
+ {
3182
+ "path": "presentation.views.getActive",
3183
+ "namespace": "presentation.views",
3184
+ "summary": "Get the currently active view.",
3185
+ "examplePrompts": [
3186
+ "Which view is active right now?",
3187
+ "Get the current view",
3188
+ "What view am I looking at?\n\n# Example\n```ts\nconst active = await snaptrude.presentation.views.getActive()\n```"
3189
+ ],
3190
+ "argsType": null,
3191
+ "resultType": "PluginPresentationViewsGetResult"
3192
+ },
3193
+ {
3194
+ "path": "presentation.views.list",
3195
+ "namespace": "presentation.views",
3196
+ "summary": "List the saved views in the active project.",
3197
+ "examplePrompts": [
3198
+ "List all the saved views",
3199
+ "What 2D and 3D views are in this project?",
3200
+ "Which view is currently active?",
3201
+ "Get the names of every presentation view",
3202
+ "Show me the 3D views I can put on a sheet\n\n# Example\n```ts\nconst { views } = await snaptrude.presentation.views.list()\nconst active = views.find((v) => v.isActive)\nconst plans = views.filter((v) => v.type === \"2d\")\n```"
3203
+ ],
3204
+ "argsType": null,
3205
+ "resultType": "PluginPresentationViewsListResult"
3206
+ },
3207
+ {
3208
+ "path": "presentation.views.setActive",
3209
+ "namespace": "presentation.views",
3210
+ "summary": "Activate a saved view — move the camera to it and restore its scene state.",
3211
+ "examplePrompts": [
3212
+ "Switch to the Ground Floor plan view",
3213
+ "Make the 3D view active",
3214
+ "Go to the view named Entrance",
3215
+ "Load the site plan view\n\n# Example\n```ts\nawait snaptrude.presentation.views.setActive(\"view_123\")\n```"
3216
+ ],
3217
+ "argsType": "string",
3218
+ "resultType": "PluginPresentationViewsSetActiveResult"
3219
+ },
3220
+ {
3221
+ "path": "program.adjacency.compute",
3222
+ "namespace": "program.adjacency",
3223
+ "summary": "Compute (or refresh) the adjacency data for the project.",
3224
+ "examplePrompts": [
3225
+ "Refresh adjacency analysis",
3226
+ "Compute the adjacency matrix for this project",
3227
+ "Recalculate which departments should be adjacent\n\n# Example\n```ts\nconst { success } = await snaptrude.program.adjacency.compute()\nif (success) {\nconst data = await snaptrude.program.adjacency.getMatrix(\"space\")\n}\n```"
3228
+ ],
3229
+ "argsType": null,
3230
+ "resultType": "PluginProgramAdjacencyComputeResult"
3231
+ },
3232
+ {
3233
+ "path": "program.adjacency.getMatrix",
3234
+ "namespace": "program.adjacency",
3235
+ "summary": "Read the adjacency matrix at the department or space level.",
3236
+ "examplePrompts": [
3237
+ "Get the space adjacency matrix",
3238
+ "Which departments must be adjacent?",
3239
+ "Show the adjacency relationships between departments",
3240
+ "Read the adjacency matrix for these spaces",
3241
+ "Which rooms are restricted from being next to each other?\n\n# Example\n```ts\nconst { ids, matrix } = await snaptrude.program.adjacency.getMatrix(\"department\")\n```"
3242
+ ],
3243
+ "argsType": "PluginAdjacencyLevel",
3244
+ "resultType": "PluginProgramAdjacencyGetMatrixResult"
3245
+ },
3246
+ {
3247
+ "path": "program.areas.get",
3248
+ "namespace": "program.areas",
3249
+ "summary": "Get the program area summary.",
3250
+ "examplePrompts": [
3251
+ "What's my FAR right now?",
3252
+ "Give me the program area summary",
3253
+ "How much built-up area have I used against the site area?",
3254
+ "Am I within my FAR target?\n\n# Example\n```ts\nconst s = await snaptrude.program.areas.get()\nconsole.log(s.builtUp, s.siteArea, s.achievedFar, s.targetFar, s.areaUnit)\n```"
3255
+ ],
3256
+ "argsType": null,
3257
+ "resultType": "PluginProgramAreasGetResult"
3258
+ },
3259
+ {
3260
+ "path": "program.areas.list",
3261
+ "namespace": "program.areas",
3262
+ "summary": "List the program area rollup grouped by a facet.",
3263
+ "examplePrompts": [
3264
+ "Break down the area by storey",
3265
+ "Show the area rollup per department",
3266
+ "Group the built-up area by building\n\n# Example\n```ts\nconst { groups } = await snaptrude.program.areas.list(\"storeys\")\nfor (const g of groups) console.log(g.name, g.builtUp, g.count)\n```"
3267
+ ],
3268
+ "argsType": "PluginProgramAreaGroupBy",
3269
+ "resultType": "PluginProgramAreasListResult"
3270
+ },
3271
+ {
3272
+ "path": "program.areas.listMembers",
3273
+ "namespace": "program.areas",
3274
+ "summary": "List the spaces that make up one area group.",
3275
+ "examplePrompts": [
3276
+ "List the spaces on this storey with their areas",
3277
+ "What rooms are in the Bedrooms department bucket?",
3278
+ "Break the storey area down into individual spaces\n\n# Example\n```ts\nconst { members } = await snaptrude.program.areas.listMembers(\"storeys\", \"st_2\")\nfor (const m of members) console.log(m.label, m.carpet)\n```"
3279
+ ],
3280
+ "argsType": "PluginProgramAreaGroupBy",
3281
+ "resultType": "PluginProgramAreasListMembersResult"
3282
+ },
3283
+ {
3284
+ "path": "program.areas.update",
3285
+ "namespace": "program.areas",
3286
+ "summary": "Update the program's FAR settings.",
3287
+ "examplePrompts": [
3288
+ "Set the target FAR to 2.5",
3289
+ "Override the site area to 5000",
3290
+ "Allow a 10 percent FAR deviation\n\n# Example\n```ts\nconst s = await snaptrude.program.areas.update({ targetFar: 2.5 })\nconsole.log(s.achievedFar, s.targetFar)\n```"
3291
+ ],
3292
+ "argsType": "{ targetFar?: number; siteArea?: number; deviation?: number }",
3293
+ "resultType": "PluginProgramAreasUpdateResult"
3294
+ },
3295
+ {
3296
+ "path": "program.classification.listTags",
3297
+ "namespace": "program.classification",
3298
+ "summary": "List a space's tags for display, grouped by category.",
3299
+ "examplePrompts": [
3300
+ "What tags are on this space?",
3301
+ "Show the tags grouped by category for sp_4",
3302
+ "List this room's display tags",
3303
+ "Which tags does this space have?\n\n# Example\n```ts\nconst { tagsByCategory } = await snaptrude.program.classification.listTags(\"sp_4\")\n```"
3304
+ ],
3305
+ "argsType": "string",
3306
+ "resultType": "PluginProgramClassificationTagsResult"
3307
+ },
3308
+ {
3309
+ "path": "program.classification.listTypes",
3310
+ "namespace": "program.classification",
3311
+ "summary": "List the selectable classification options for spaces.",
3312
+ "examplePrompts": [
3313
+ "What space types can I assign?",
3314
+ "List the available area classifications",
3315
+ "What classification options exist?",
3316
+ "Show me the valid space-type values\n\n# Example\n```ts\nconst { spaceTypes, areaClasses } = await snaptrude.program.classification.listTypes()\n```"
3317
+ ],
3318
+ "argsType": null,
3319
+ "resultType": "PluginProgramClassificationTypesResult"
3320
+ },
3321
+ {
3322
+ "path": "program.cores.isCore",
3323
+ "namespace": "program.cores",
3324
+ "summary": "Test whether a space is a circulation core element.",
3325
+ "examplePrompts": [
3326
+ "Is this space a core?",
3327
+ "Does this mass belong to the core?",
3328
+ "Check if space sp_1 is a circulation core\n\n# Example\n```ts\nconst isCore = await snaptrude.program.cores.isCore(\"sp_1\")\n```"
3329
+ ],
3330
+ "argsType": "string",
3331
+ "resultType": "boolean"
3332
+ },
3333
+ {
3334
+ "path": "program.cores.list",
3335
+ "namespace": "program.cores",
3336
+ "summary": "List the cores currently in the building.",
3337
+ "examplePrompts": [
3338
+ "List the cores in the building",
3339
+ "How many cores are placed?",
3340
+ "Show me the lift and stair cores",
3341
+ "Which storeys have cores?\n\n# Example\n```ts\nconst { cores } = await snaptrude.program.cores.list()\n```"
3342
+ ],
3343
+ "argsType": null,
3344
+ "resultType": "PluginProgramCoresListResult"
3345
+ },
3346
+ {
3347
+ "path": "program.departments.assign",
3348
+ "namespace": "program.departments",
3349
+ "summary": "Assign one or more spaces to a department.",
3350
+ "examplePrompts": [
3351
+ "Assign the selected rooms to the Bedrooms department",
3352
+ "Put spaces 12 and 13 in the Circulation department",
3353
+ "Move this space into the Lobby department",
3354
+ "Add the kitchen spaces to the Service department\n\n# Example\n```ts\nawait snaptrude.program.departments.assign(\"dep_123\", [\"sp_1\", \"sp_2\"])\n```"
3355
+ ],
3356
+ "argsType": "string",
3357
+ "resultType": "PluginProgramDepartmentsAssignResult"
3358
+ },
3359
+ {
3360
+ "path": "program.departments.create",
3361
+ "namespace": "program.departments",
3362
+ "summary": "Create a new department in the active program.",
3363
+ "examplePrompts": [
3364
+ "Create a department called Bedrooms in light blue",
3365
+ "Add a new program group named Circulation with color #cccccc",
3366
+ "Make a Classrooms department",
3367
+ "Set up a Lobby department in the program\n\n# Example\n```ts\nconst { departmentId } = await snaptrude.program.departments.create(\"Bedrooms\", \"#b5e1dc\")\n```"
3368
+ ],
3369
+ "argsType": "string",
3370
+ "resultType": "PluginProgramDepartmentsCreateResult"
3371
+ },
3372
+ {
3373
+ "path": "program.departments.get",
3374
+ "namespace": "program.departments",
3375
+ "summary": "Get a single department by id.",
3376
+ "examplePrompts": [
3377
+ "Get the department with id dep_123",
3378
+ "Look up a single department by its id",
3379
+ "What is the target area of this department id?\n\n# Example\n```ts\nconst dept = await snaptrude.program.departments.get(\"dep_123\")\nif (dept) console.log(dept.name, dept.targetArea)\n```"
3380
+ ],
3381
+ "argsType": "string",
3382
+ "resultType": "PluginProgramDepartmentsGetResult"
3383
+ },
3384
+ {
3385
+ "path": "program.departments.list",
3386
+ "namespace": "program.departments",
3387
+ "summary": "List the departments in the active program.",
3388
+ "examplePrompts": [
3389
+ "List all the departments in my program",
3390
+ "What program groups do I have and what are their target areas?",
3391
+ "Show every department with its colour",
3392
+ "Get the area target for each department",
3393
+ "How many departments are in this project?\n\n# Example\n```ts\nconst { units, departments } = await snaptrude.program.departments.list()\nfor (const d of departments) console.log(d.name, d.color, d.targetArea, units)\n```"
3394
+ ],
3395
+ "argsType": null,
3396
+ "resultType": "PluginProgramDepartmentsListResult"
3397
+ },
3398
+ {
3399
+ "path": "program.departments.setTargetArea",
3400
+ "namespace": "program.departments",
3401
+ "summary": "Set a department's target area.",
3402
+ "examplePrompts": [
3403
+ "Set the Bedrooms department target area to 2000 sqft",
3404
+ "Give the Circulation department a 500 sqm area target",
3405
+ "Target 1500 square feet for the Classrooms department",
3406
+ "Update the area goal for department dep_123\n\n# Example\n```ts\nawait snaptrude.program.departments.setTargetArea(\"dep_123\", 2000, \"ft2\")\n```"
3407
+ ],
3408
+ "argsType": "string",
3409
+ "resultType": "PluginProgramDepartmentsSetTargetAreaResult"
3410
+ },
3411
+ {
3412
+ "path": "program.departments.unassign",
3413
+ "namespace": "program.departments",
3414
+ "summary": "Remove one or more spaces from their department.",
3415
+ "examplePrompts": [
3416
+ "Remove the selected rooms from their department",
3417
+ "Unassign space sp_1 from any department",
3418
+ "Clear the department on these spaces",
3419
+ "Take the kitchen out of the Service department\n\n# Example\n```ts\nawait snaptrude.program.departments.unassign([\"sp_1\"])\n```"
3420
+ ],
3421
+ "argsType": "ComponentHandle[]",
3422
+ "resultType": "PluginProgramDepartmentsUnassignResult"
3423
+ },
3424
+ {
3425
+ "path": "program.departments.update",
3426
+ "namespace": "program.departments",
3427
+ "summary": "Update a department's name and/or color.",
3428
+ "examplePrompts": [
3429
+ "Rename the Bedrooms department to Suites",
3430
+ "Change the Circulation department colour to #ff8800",
3431
+ "Recolour department dep_123",
3432
+ "Update the Lobby department's display name\n\n# Example\n```ts\nconst dept = await snaptrude.program.departments.update(\"dep_123\", { name: \"Suites\" })\n```"
3433
+ ],
3434
+ "argsType": "string",
3435
+ "resultType": "PluginProgramDepartmentsUpdateResult"
3436
+ },
3437
+ {
3438
+ "path": "program.metrics.get",
3439
+ "namespace": "program.metrics",
3440
+ "summary": "Get the area-program summary for the active project.",
3441
+ "examplePrompts": [
3442
+ "How much area have I allocated versus my targets?",
3443
+ "Give me the program area summary",
3444
+ "Which departments are over or under their target area?",
3445
+ "What's the total built area in the program?",
3446
+ "Show the area breakdown per department",
3447
+ "Am I within my area program?\n\n# Example\n```ts\nconst m = await snaptrude.program.metrics.get()\nconsole.log(`${m.totalAllocatedArea} / ${m.totalTargetArea} ${m.units}`)\nconsole.log(\"unassigned:\", m.unassignedArea)\nfor (const d of m.departments) {\nconsole.log(d.name, d.allocatedArea, d.targetArea)\n}\n```"
3448
+ ],
3449
+ "argsType": null,
3450
+ "resultType": "PluginProgramMetricsSummary"
3451
+ },
3452
+ {
3453
+ "path": "program.site.get",
3454
+ "namespace": "program.site",
3455
+ "summary": "Get a snapshot of the project site.",
3456
+ "examplePrompts": [
3457
+ "What is my total site area?",
3458
+ "Give me a summary of the site",
3459
+ "How many site parcels are on the canvas?",
3460
+ "Show the site footprint and its area",
3461
+ "How big is the plot I'm building on?\n\n# Example\n```ts\nconst site = await snaptrude.program.site.get()\nconsole.log(`${site.totalArea} ${site.units} across ${site.polygonCount} parcels`)\n```"
3462
+ ],
3463
+ "argsType": null,
3464
+ "resultType": "PluginProgramSiteSnapshot"
3465
+ },
3466
+ {
3467
+ "path": "program.site.getArea",
3468
+ "namespace": "program.site",
3469
+ "summary": "Get just the total site area.",
3470
+ "examplePrompts": [
3471
+ "What's the total site area?",
3472
+ "How big is my plot in square metres?",
3473
+ "Total parcel area on the site\n\n# Example\n```ts\nconst { area, units } = await snaptrude.program.site.getArea()\n```"
3474
+ ],
3475
+ "argsType": null,
3476
+ "resultType": "PluginProgramSiteAreaResult"
3477
+ },
3478
+ {
3479
+ "path": "program.site.getContext",
3480
+ "namespace": "program.site",
3481
+ "summary": "Get the geo-referenced terrain context of the site.",
3482
+ "examplePrompts": [
3483
+ "What's the site's map center and bounds?",
3484
+ "How wide is the terrain in metres?",
3485
+ "Give me the parcel geometry and areas",
3486
+ "Where is the site located on the map?\n\n# Example\n```ts\nconst ctx = await snaptrude.program.site.getContext()\nif (ctx) console.log(ctx.center, ctx.widthInM)\n```"
3487
+ ],
3488
+ "argsType": null,
3489
+ "resultType": "PluginProgramSiteContextResult"
3490
+ },
3491
+ {
3492
+ "path": "program.site.listGeoPolygons",
3493
+ "namespace": "program.site",
3494
+ "summary": "List the site parcels as geographic latitude/longitude rings.",
3495
+ "examplePrompts": [
3496
+ "Give me the site polygons in latitude and longitude",
3497
+ "Export the plot boundary as geo-coordinates",
3498
+ "Where is the site located geographically?",
3499
+ "Get the site parcels as lat/long rings\n\n# Example\n```ts\nconst { polygons } = await snaptrude.program.site.listGeoPolygons()\nconst firstRing = polygons[0] // [{ lat, lng, alt }, ...]\n```"
3500
+ ],
3501
+ "argsType": null,
3502
+ "resultType": "PluginProgramSiteListGeoPolygonsResult"
3503
+ },
3504
+ {
3505
+ "path": "program.site.listPolygons",
3506
+ "namespace": "program.site",
3507
+ "summary": "List the site parcels with their footprints (in scene coordinates).",
3508
+ "examplePrompts": [
3509
+ "List every site parcel",
3510
+ "Show me each plot's footprint",
3511
+ "Which site parcels are largest?",
3512
+ "Get the boundary points of the site polygons\n\n# Example\n```ts\nconst { polygons, units } = await snaptrude.program.site.listPolygons()\nfor (const p of polygons) console.log(p.label, p.area, units, p.footprint.length)\n```"
3513
+ ],
3514
+ "argsType": null,
3515
+ "resultType": "PluginProgramSiteListPolygonsResult"
3516
+ },
3517
+ {
3518
+ "path": "program.spreadsheet.addChart",
3519
+ "namespace": "program.spreadsheet",
3520
+ "summary": "Add a chart to a sheet, driven by a cell range.",
3521
+ "examplePrompts": [
3522
+ "Add a bar chart of the department areas",
3523
+ "Insert a pie chart from range B2:C10",
3524
+ "Put a column chart on the Program sheet",
3525
+ "Chart the area breakdown by department\n\n# Example\n```ts\nconst { chartId } = await snaptrude.program.spreadsheet.addChart(\n\"Program\",\n\"column\",\n\"A1:B10\",\n{ title: \"Area by department\" },\n)\n```"
3526
+ ],
3527
+ "argsType": "string",
3528
+ "resultType": "PluginProgramSpreadsheetAddChartResult"
3529
+ },
3530
+ {
3531
+ "path": "program.spreadsheet.addConditionalFormatting",
3532
+ "namespace": "program.spreadsheet",
3533
+ "summary": "Add a conditional-formatting rule to a range.",
3534
+ "examplePrompts": [
3535
+ "Add data bars to the area column",
3536
+ "Show a proportional bar inside cells B2:B10",
3537
+ "Add conditional formatting data bars to the quantities\n\n# Example\n```ts\nawait snaptrude.program.spreadsheet.addConditionalFormatting(\"Summary\", \"B2:B10\", {\ntype: \"dataBar\",\ncolor: \"#4f9cf9\",\n})\n```"
3538
+ ],
3539
+ "argsType": "string",
3540
+ "resultType": "PluginProgramSpreadsheetAddConditionalFormattingResult"
3541
+ },
3542
+ {
3543
+ "path": "program.spreadsheet.bindings.create",
3544
+ "namespace": "program.spreadsheet.bindings",
3545
+ "summary": "Create a named binding from a dataset to a sheet range (and do an initial refresh).",
3546
+ "examplePrompts": [
3547
+ "Bind the takeoff to the Data sheet",
3548
+ "Create a live binding from the takeoff to A1 on Data",
3549
+ "Link the takeoff dataset to a sheet range\n\n# Example\n```ts\nawait snaptrude.program.spreadsheet.bindings.create(\n\"takeoff\",\n{ dataset: \"takeoff\" },\n{ sheetName: \"Data\", startCell: \"A1\" },\n)\n```"
3550
+ ],
3551
+ "argsType": "string",
3552
+ "resultType": "PluginProgramSpreadsheetBindingsCreateResult"
3553
+ },
3554
+ {
3555
+ "path": "program.spreadsheet.bindings.list",
3556
+ "namespace": "program.spreadsheet.bindings",
3557
+ "summary": "List all data bindings in the workbook.",
3558
+ "examplePrompts": [
3559
+ "List the data bindings",
3560
+ "What bindings are set up on the sheets?",
3561
+ "Show all the live data bindings\n\n# Example\n```ts\nconst { bindings } = await snaptrude.program.spreadsheet.bindings.list()\n```"
3562
+ ],
3563
+ "argsType": null,
3564
+ "resultType": "PluginProgramSpreadsheetBindingsListResult"
3565
+ },
3566
+ {
3567
+ "path": "program.spreadsheet.bindings.refresh",
3568
+ "namespace": "program.spreadsheet.bindings",
3569
+ "summary": "Refresh one binding (by name) or all bindings, re-pulling their source data.",
3570
+ "examplePrompts": [
3571
+ "Refresh the takeoff binding",
3572
+ "Re-pull all my data bindings",
3573
+ "Refresh every binding on the sheets\n\n# Example\n```ts\nawait snaptrude.program.spreadsheet.bindings.refresh({ name: \"takeoff\" })\n```"
3574
+ ],
3575
+ "argsType": "{ name?: string }",
3576
+ "resultType": "PluginProgramSpreadsheetBindingsRefreshResult"
3577
+ },
3578
+ {
3579
+ "path": "program.spreadsheet.createSheet",
3580
+ "namespace": "program.spreadsheet",
3581
+ "summary": "Create (or reuse/replace) a named sheet in the report workbook.",
3582
+ "examplePrompts": [
3583
+ "Create a sheet called Summary",
3584
+ "Add a new blank sheet named Takeoff",
3585
+ "Make a sheet, replacing it if it already exists",
3586
+ "Start a fresh sheet to write into\n\n# Example\n```ts\nawait snaptrude.program.spreadsheet.createSheet(\"Summary\")\n```"
3587
+ ],
3588
+ "argsType": "string",
3589
+ "resultType": "PluginProgramSpreadsheetCreateSheetResult"
3590
+ },
3591
+ {
3592
+ "path": "program.spreadsheet.export",
3593
+ "namespace": "program.spreadsheet",
3594
+ "summary": "Export the whole report workbook to a file (xlsx, pdf, or csv).",
3595
+ "examplePrompts": [
3596
+ "Export the report as an Excel file",
3597
+ "Download the whole workbook as a PDF",
3598
+ "Export the program workbook to xlsx",
3599
+ "Save the report as a csv file\n\n# Example\n```ts\nconst file = await snaptrude.program.spreadsheet.export(\"xlsx\")\n// file.fileName, file.mimeType, file.dataBase64\n```"
3600
+ ],
3601
+ "argsType": "PluginSpreadsheetExportFormat",
3602
+ "resultType": "PluginProgramSpreadsheetExportResult"
3603
+ },
3604
+ {
3605
+ "path": "program.spreadsheet.getAuditLog",
3606
+ "namespace": "program.spreadsheet",
3607
+ "summary": "Read the recent audit log of program-spreadsheet operations.",
3608
+ "examplePrompts": [
3609
+ "Show the recent spreadsheet actions",
3610
+ "What did the plugin change in the workbook?",
3611
+ "Get the last 10 audit log entries",
3612
+ "Read the program spreadsheet audit log\n\n# Example\n```ts\nconst { entries } = await snaptrude.program.spreadsheet.getAuditLog({ limit: 10 })\n```"
3613
+ ],
3614
+ "argsType": "{ limit?: number }",
3615
+ "resultType": "PluginProgramSpreadsheetGetAuditLogResult"
3616
+ },
3617
+ {
3618
+ "path": "program.spreadsheet.getProgram",
3619
+ "namespace": "program.spreadsheet",
3620
+ "summary": "Read the area-program dataset (departments with target vs allocated area).",
3621
+ "examplePrompts": [
3622
+ "Get the area program data",
3623
+ "Read the department program before I render it",
3624
+ "Give me the program rows with target vs allocated area",
3625
+ "What's the program dataset the report is built from?\n\n# Example\n```ts\nconst program = await snaptrude.program.spreadsheet.getProgram()\nfor (const row of program.rows) console.log(row.name, row.allocatedArea, row.targetArea)\n```"
3626
+ ],
3627
+ "argsType": null,
3628
+ "resultType": "PluginProgramSpreadsheetGetProgramResult"
3629
+ },
3630
+ {
3631
+ "path": "program.spreadsheet.getSheetData",
3632
+ "namespace": "program.spreadsheet",
3633
+ "summary": "Read a sheet's data back as a matrix (and optionally as header-keyed records).",
3634
+ "examplePrompts": [
3635
+ "Read the data back from the Program sheet",
3636
+ "Get the values in range A1:D20 of a sheet",
3637
+ "Read a sheet as rows of records keyed by header",
3638
+ "What's in the takeoff sheet right now?\n\n# Example\n```ts\nconst { values, records } = await snaptrude.program.spreadsheet.getSheetData(\n\"Program\",\n{ header: true },\n)\n```"
3639
+ ],
3640
+ "argsType": "string",
3641
+ "resultType": "PluginProgramSpreadsheetGetSheetDataResult"
3642
+ },
3643
+ {
3644
+ "path": "program.spreadsheet.getTakeoff",
3645
+ "namespace": "program.spreadsheet",
3646
+ "summary": "Read the quantity/material takeoff dataset (per-element quantities).",
3647
+ "examplePrompts": [
3648
+ "Get the takeoff data",
3649
+ "Read the quantity takeoff rows",
3650
+ "Give me the per-element quantities before I render them",
3651
+ "What's in the material takeoff right now?\n\n# Example\n```ts\nconst takeoff = await snaptrude.program.spreadsheet.getTakeoff()\nconsole.log(takeoff.rowCount, \"elements\")\n```"
3652
+ ],
3653
+ "argsType": null,
3654
+ "resultType": "PluginProgramSpreadsheetGetTakeoffResult"
3655
+ },
3656
+ {
3657
+ "path": "program.spreadsheet.highlightCells",
3658
+ "namespace": "program.spreadsheet",
3659
+ "summary": "Highlight a range of cells (background color and optional emphasis).",
3660
+ "examplePrompts": [
3661
+ "Highlight the cells that are over budget",
3662
+ "Color range A2:A10 red",
3663
+ "Highlight B2:D2 in yellow",
3664
+ "Emphasize the totals row on the Program sheet\n\n# Example\n```ts\nawait snaptrude.program.spreadsheet.highlightCells(\"Program\", \"A2:A10\", {\ncolor: \"#ffe08a\",\n})\n```"
3665
+ ],
3666
+ "argsType": "string",
3667
+ "resultType": "PluginProgramSpreadsheetHighlightCellsResult"
3668
+ },
3669
+ {
3670
+ "path": "program.spreadsheet.listSheets",
3671
+ "namespace": "program.spreadsheet",
3672
+ "summary": "List the sheets in the report workbook.",
3673
+ "examplePrompts": [
3674
+ "List the sheets in the spreadsheet",
3675
+ "What sheets are in the report workbook?",
3676
+ "Which sheet is currently active?",
3677
+ "How many sheets does the report have?\n\n# Example\n```ts\nconst { sheets, activeSheet } = await snaptrude.program.spreadsheet.listSheets()\n```"
3678
+ ],
3679
+ "argsType": null,
3680
+ "resultType": "PluginProgramSpreadsheetListSheetsResult"
3681
+ },
3682
+ {
3683
+ "path": "program.spreadsheet.mergeCells",
3684
+ "namespace": "program.spreadsheet",
3685
+ "summary": "Merge a contiguous range of cells into a single spanned cell.",
3686
+ "examplePrompts": [
3687
+ "Merge cells A1 to D1 for the title",
3688
+ "Span the header across the first four columns",
3689
+ "Merge A1:D1 and set it to \"Program Summary\"\n\n# Example\n```ts\nawait snaptrude.program.spreadsheet.mergeCells(\"Summary\", \"A1:D1\", \"Program Summary\")\n```"
3690
+ ],
3691
+ "argsType": "string",
3692
+ "resultType": "PluginProgramSpreadsheetMergeCellsResult"
3693
+ },
3694
+ {
3695
+ "path": "program.spreadsheet.ping",
3696
+ "namespace": "program.spreadsheet",
3697
+ "summary": "Ping the program-mode spreadsheet bridge to check it is reachable.",
3698
+ "examplePrompts": [
3699
+ "Ping the spreadsheet bridge",
3700
+ "Is the program spreadsheet available?",
3701
+ "Check the spreadsheet connection is alive\n\n# Example\n```ts\nconst { pong } = await snaptrude.program.spreadsheet.ping()\n```"
3702
+ ],
3703
+ "argsType": null,
3704
+ "resultType": "PluginProgramSpreadsheetPingResult"
3705
+ },
3706
+ {
3707
+ "path": "program.spreadsheet.recalculate",
3708
+ "namespace": "program.spreadsheet",
3709
+ "summary": "Recompute the workbook's formula results.",
3710
+ "examplePrompts": [
3711
+ "Recalculate the workbook",
3712
+ "Recompute all the formulas",
3713
+ "Recalculate the Summary sheet\n\n# Example\n```ts\nawait snaptrude.program.spreadsheet.recalculate()\n```"
3714
+ ],
3715
+ "argsType": "{ sheetName?: string }",
3716
+ "resultType": "PluginProgramSpreadsheetRecalculateResult"
3717
+ },
3718
+ {
3719
+ "path": "program.spreadsheet.render",
3720
+ "namespace": "program.spreadsheet",
3721
+ "summary": "Render a titled, formatted table onto a named sheet (create-or-replace).",
3722
+ "examplePrompts": [
3723
+ "Render my takeoff as a table on a sheet",
3724
+ "Write the area schedule to a spreadsheet with totals",
3725
+ "Put the department breakdown on a sheet called \"Program\"",
3726
+ "Output this data as a formatted table with a header",
3727
+ "Create a report sheet from these rows and columns\n\n# Example\n```ts\nawait snaptrude.program.spreadsheet.render(\n\"Program\",\n[\n{ key: \"name\", header: \"Department\" },\n{ key: \"area\", header: \"Area\", format: \"0.00\", align: \"right\" },\n],\n[{ name: \"FOH\", area: 120.5 }],\n{ totals: [{ column: \"area\", fn: \"sum\", label: \"Total\" }] },\n)\n```"
3728
+ ],
3729
+ "argsType": "string",
3730
+ "resultType": "PluginProgramSpreadsheetRenderResult"
3731
+ },
3732
+ {
3733
+ "path": "program.spreadsheet.renderProgram",
3734
+ "namespace": "program.spreadsheet",
3735
+ "summary": "Render the area program onto a sheet.",
3736
+ "examplePrompts": [
3737
+ "Render the area program onto a sheet",
3738
+ "Put the department program on a spreadsheet",
3739
+ "Generate the program schedule sheet titled Program",
3740
+ "Render the program filtered to the residential departments\n\n# Example\n```ts\nawait snaptrude.program.spreadsheet.renderProgram({ sheetName: \"Program\" })\n```"
3741
+ ],
3742
+ "argsType": "{ sheetName?: string; title?: string; filter?: string }",
3743
+ "resultType": "PluginProgramSpreadsheetRenderResult"
3744
+ },
3745
+ {
3746
+ "path": "program.spreadsheet.renderTakeoff",
3747
+ "namespace": "program.spreadsheet",
3748
+ "summary": "Render the quantity/material takeoff onto a sheet.",
3749
+ "examplePrompts": [
3750
+ "Render the takeoff onto a sheet",
3751
+ "Put the quantity takeoff on a spreadsheet",
3752
+ "Generate the takeoff schedule sheet titled Takeoff",
3753
+ "Render the material takeoff filtered to the walls\n\n# Example\n```ts\nawait snaptrude.program.spreadsheet.renderTakeoff({ sheetName: \"Takeoff\" })\n```"
3754
+ ],
3755
+ "argsType": "{ sheetName?: string; title?: string; filter?: string }",
3756
+ "resultType": "PluginProgramSpreadsheetRenderResult"
3757
+ },
3758
+ {
3759
+ "path": "program.spreadsheet.runScript",
3760
+ "namespace": "program.spreadsheet",
3761
+ "summary": "Run an author-supplied script against a sandboxed workbook facade.",
3762
+ "examplePrompts": [
3763
+ "Run this SpreadJS script against the workbook",
3764
+ "Execute a custom script on the sheets",
3765
+ "Run a script to tweak the workbook\n\n# Example\n```ts\nconst { result } = await snaptrude.program.spreadsheet.runScript(\n\"return workbook.getSheetCount();\",\n)\n```"
3766
+ ],
3767
+ "argsType": "string",
3768
+ "resultType": "PluginProgramSpreadsheetRunScriptResult"
3769
+ },
3770
+ {
3771
+ "path": "program.spreadsheet.setFormulas",
3772
+ "namespace": "program.spreadsheet",
3773
+ "summary": "Set formulas on individual cells of a sheet.",
3774
+ "examplePrompts": [
3775
+ "Put a SUM formula in cell B10",
3776
+ "Set formulas totalling each column",
3777
+ "Add a formula to compute the variance column",
3778
+ "Write =SUM(B2:B9) into B10 on the Summary sheet\n\n# Example\n```ts\nawait snaptrude.program.spreadsheet.setFormulas(\"Summary\", [\n{ cell: \"B10\", formula: \"=SUM(B2:B9)\" },\n])\n```"
3779
+ ],
3780
+ "argsType": "string",
3781
+ "resultType": "PluginProgramSpreadsheetSetFormulasResult"
3782
+ },
3783
+ {
3784
+ "path": "program.spreadsheet.setStyles",
3785
+ "namespace": "program.spreadsheet",
3786
+ "summary": "Apply cell styles to one or more ranges of a sheet.",
3787
+ "examplePrompts": [
3788
+ "Make the header row bold with a grey fill",
3789
+ "Right-align the numbers in column B",
3790
+ "Format A1:D1 with a background color and bold text",
3791
+ "Style the totals row\n\n# Example\n```ts\nawait snaptrude.program.spreadsheet.setStyles(\"Summary\", [\n{ range: \"A1:D1\", style: { fontWeight: \"bold\", backColor: \"#eef\" } },\n])\n```"
3792
+ ],
3793
+ "argsType": "string",
3794
+ "resultType": "PluginProgramSpreadsheetSetStylesResult"
3795
+ },
3796
+ {
3797
+ "path": "program.spreadsheet.setValues",
3798
+ "namespace": "program.spreadsheet",
3799
+ "summary": "Write a block of raw values into a sheet, anchored at a cell.",
3800
+ "examplePrompts": [
3801
+ "Write these rows to the sheet starting at A1",
3802
+ "Put this data into the Summary sheet",
3803
+ "Set the values in the takeoff sheet from B2",
3804
+ "Drop this matrix of numbers onto a sheet\n\n# Example\n```ts\nawait snaptrude.program.spreadsheet.setValues(\n\"Summary\",\n[[\"Department\", \"Area\"], [\"FOH\", 120.5]],\n\"A1\",\n)\n```"
3805
+ ],
3806
+ "argsType": "string",
3807
+ "resultType": "PluginProgramSpreadsheetSetValuesResult"
3808
+ },
3809
+ {
3810
+ "path": "program.spreadsheet.templates.apply",
3811
+ "namespace": "program.spreadsheet.templates",
3812
+ "summary": "Apply a saved template to a target sheet (create-or-replace).",
3813
+ "examplePrompts": [
3814
+ "Apply the Cover template to a new sheet",
3815
+ "Use my saved template on the Report sheet",
3816
+ "Apply template \"Cover\" to sheet \"Report\"\n\n# Example\n```ts\nawait snaptrude.program.spreadsheet.templates.apply(\"Cover\", \"Report\")\n```"
3817
+ ],
3818
+ "argsType": "string",
3819
+ "resultType": "PluginProgramSpreadsheetTemplatesApplyResult"
3820
+ },
3821
+ {
3822
+ "path": "program.spreadsheet.templates.create",
3823
+ "namespace": "program.spreadsheet.templates",
3824
+ "summary": "Save a sheet's current layout as a named template.",
3825
+ "examplePrompts": [
3826
+ "Save this sheet as a reusable template",
3827
+ "Create a template from the Summary sheet",
3828
+ "Save the current layout as a template called \"Cover\"\n\n# Example\n```ts\nawait snaptrude.program.spreadsheet.templates.create(\"Cover\", \"Summary\")\n```"
3829
+ ],
3830
+ "argsType": "string",
3831
+ "resultType": "PluginProgramSpreadsheetTemplatesCreateResult"
3832
+ },
3833
+ {
3834
+ "path": "program.spreadsheet.transaction",
3835
+ "namespace": "program.spreadsheet",
3836
+ "summary": "Run a sequence of sheet operations as one atomic, undoable transaction.",
3837
+ "examplePrompts": [
3838
+ "Create a sheet and write to it in one atomic step",
3839
+ "Batch these sheet edits as a single undoable action",
3840
+ "Run these operations together as one transaction\n\n# Example\n```ts\nawait snaptrude.program.spreadsheet.transaction(\n[\n{ method: \"createSheet\", args: { name: \"Summary\" } },\n{ method: \"setValues\", args: { sheetName: \"Summary\", values: [[\"A\", 1]] } },\n],\n\"Build summary\",\n)\n```"
3841
+ ],
3842
+ "argsType": "PluginSpreadsheetTransactionOp[]",
3843
+ "resultType": "PluginProgramSpreadsheetTransactionResult"
3844
+ }
3845
+ ]