@pascal-app/mcp 1.0.3 → 1.0.5

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 (305) hide show
  1. package/CHANGELOG.md +76 -0
  2. package/README.md +181 -56
  3. package/dist/bin/pascal-mcp.js +9 -3
  4. package/dist/bridge/agent-session.d.ts +18 -0
  5. package/dist/bridge/agent-session.d.ts.map +1 -0
  6. package/dist/bridge/agent-session.js +15 -0
  7. package/dist/bridge/index.d.ts +1 -1
  8. package/dist/bridge/index.d.ts.map +1 -1
  9. package/dist/bridge/scene-bridge.d.ts +42 -6
  10. package/dist/bridge/scene-bridge.d.ts.map +1 -1
  11. package/dist/bridge/scene-bridge.js +232 -45
  12. package/dist/index.d.ts +3 -0
  13. package/dist/index.d.ts.map +1 -1
  14. package/dist/index.js +1 -0
  15. package/dist/lib/safe-fetch.d.ts +22 -4
  16. package/dist/lib/safe-fetch.d.ts.map +1 -1
  17. package/dist/lib/safe-fetch.js +233 -134
  18. package/dist/operations/scene-operations.d.ts +41 -3
  19. package/dist/operations/scene-operations.d.ts.map +1 -1
  20. package/dist/operations/scene-operations.js +42 -1
  21. package/dist/prompts/from-brief.d.ts +1 -1
  22. package/dist/prompts/from-brief.d.ts.map +1 -1
  23. package/dist/prompts/from-brief.js +3 -3
  24. package/dist/prompts/index.d.ts +1 -1
  25. package/dist/prompts/index.d.ts.map +1 -1
  26. package/dist/prompts/iterate-on-feedback.d.ts +1 -1
  27. package/dist/prompts/iterate-on-feedback.d.ts.map +1 -1
  28. package/dist/prompts/iterate-on-feedback.js +3 -3
  29. package/dist/prompts/renovation-from-photos.d.ts +1 -1
  30. package/dist/prompts/renovation-from-photos.d.ts.map +1 -1
  31. package/dist/prompts/renovation-from-photos.js +2 -2
  32. package/dist/prompts/scene-guidance.d.ts.map +1 -1
  33. package/dist/prompts/scene-guidance.js +13 -6
  34. package/dist/resources/agent-guide.d.ts +1 -1
  35. package/dist/resources/agent-guide.d.ts.map +1 -1
  36. package/dist/resources/agent-guide.js +62 -33
  37. package/dist/resources/catalog-items.d.ts +5 -6
  38. package/dist/resources/catalog-items.d.ts.map +1 -1
  39. package/dist/resources/catalog-items.js +7 -9
  40. package/dist/resources/constraints.d.ts +1 -1
  41. package/dist/resources/constraints.d.ts.map +1 -1
  42. package/dist/resources/constraints.js +1 -1
  43. package/dist/resources/design-schema.d.ts +9 -0
  44. package/dist/resources/design-schema.d.ts.map +1 -0
  45. package/dist/resources/design-schema.js +21 -0
  46. package/dist/resources/index.d.ts +4 -2
  47. package/dist/resources/index.d.ts.map +1 -1
  48. package/dist/resources/index.js +5 -2
  49. package/dist/resources/scene-current.d.ts +1 -1
  50. package/dist/resources/scene-current.d.ts.map +1 -1
  51. package/dist/resources/scene-summary.d.ts +1 -1
  52. package/dist/resources/scene-summary.d.ts.map +1 -1
  53. package/dist/server.d.ts +25 -1
  54. package/dist/server.d.ts.map +1 -1
  55. package/dist/server.js +71 -25
  56. package/dist/storage/disk-artifact-store.d.ts +9 -0
  57. package/dist/storage/disk-artifact-store.d.ts.map +1 -0
  58. package/dist/storage/disk-artifact-store.js +46 -0
  59. package/dist/storage/index.d.ts +1 -0
  60. package/dist/storage/index.d.ts.map +1 -1
  61. package/dist/storage/index.js +1 -0
  62. package/dist/storage/sqlite-scene-store.d.ts +3 -3
  63. package/dist/storage/sqlite-scene-store.d.ts.map +1 -1
  64. package/dist/storage/sqlite-scene-store.js +4 -3
  65. package/dist/storage/types.d.ts +36 -7
  66. package/dist/storage/types.d.ts.map +1 -1
  67. package/dist/storage/types.js +12 -0
  68. package/dist/templates/empty-studio.d.ts +3 -3
  69. package/dist/templates/empty-studio.d.ts.map +1 -1
  70. package/dist/templates/garden-house.d.ts +3 -3
  71. package/dist/templates/garden-house.d.ts.map +1 -1
  72. package/dist/templates/index.d.ts.map +1 -1
  73. package/dist/templates/two-bedroom.d.ts +3 -3
  74. package/dist/templates/two-bedroom.d.ts.map +1 -1
  75. package/dist/tools/add-column.d.ts +5 -0
  76. package/dist/tools/add-column.d.ts.map +1 -0
  77. package/dist/tools/add-column.js +59 -0
  78. package/dist/tools/add-object.d.ts +76 -0
  79. package/dist/tools/add-object.d.ts.map +1 -0
  80. package/dist/tools/add-object.js +187 -0
  81. package/dist/tools/annotations.d.ts.map +1 -1
  82. package/dist/tools/apply-patch.d.ts +9 -2
  83. package/dist/tools/apply-patch.d.ts.map +1 -1
  84. package/dist/tools/apply-patch.js +36 -5
  85. package/dist/tools/asset-catalog.d.ts +9 -5
  86. package/dist/tools/asset-catalog.d.ts.map +1 -1
  87. package/dist/tools/asset-catalog.js +33 -12
  88. package/dist/tools/author-scene.d.ts +10 -0
  89. package/dist/tools/author-scene.d.ts.map +1 -0
  90. package/dist/tools/author-scene.js +140 -0
  91. package/dist/tools/check-collisions.d.ts +7 -7
  92. package/dist/tools/check-collisions.d.ts.map +1 -1
  93. package/dist/tools/check-collisions.js +7 -8
  94. package/dist/tools/clear-scene.d.ts +9 -0
  95. package/dist/tools/clear-scene.d.ts.map +1 -0
  96. package/dist/tools/clear-scene.js +59 -0
  97. package/dist/tools/collections.d.ts +4 -0
  98. package/dist/tools/collections.d.ts.map +1 -0
  99. package/dist/tools/collections.js +53 -0
  100. package/dist/tools/construction-tools.d.ts +12 -88
  101. package/dist/tools/construction-tools.d.ts.map +1 -1
  102. package/dist/tools/construction-tools.js +122 -381
  103. package/dist/tools/create-unit.d.ts +5 -3
  104. package/dist/tools/create-unit.d.ts.map +1 -1
  105. package/dist/tools/create-unit.js +2 -2
  106. package/dist/tools/errors.d.ts +15 -4
  107. package/dist/tools/errors.d.ts.map +1 -1
  108. package/dist/tools/errors.js +14 -4
  109. package/dist/tools/export-glb.d.ts +1 -1
  110. package/dist/tools/export-glb.d.ts.map +1 -1
  111. package/dist/tools/export-glb.js +2 -2
  112. package/dist/tools/export-json.d.ts +1 -1
  113. package/dist/tools/export-json.d.ts.map +1 -1
  114. package/dist/tools/export-json.js +2 -2
  115. package/dist/tools/geometry-script-worker.d.ts +2 -0
  116. package/dist/tools/geometry-script-worker.d.ts.map +1 -0
  117. package/dist/tools/geometry-script-worker.js +21 -0
  118. package/dist/tools/get-scene.d.ts +2 -1
  119. package/dist/tools/get-scene.d.ts.map +1 -1
  120. package/dist/tools/get-scene.js +5 -3
  121. package/dist/tools/honest-patch-guard.d.ts +2 -0
  122. package/dist/tools/honest-patch-guard.d.ts.map +1 -0
  123. package/dist/tools/honest-patch-guard.js +32 -0
  124. package/dist/tools/hosted-services.d.ts +4 -0
  125. package/dist/tools/hosted-services.d.ts.map +1 -0
  126. package/dist/tools/hosted-services.js +40 -0
  127. package/dist/tools/index.d.ts +12 -2
  128. package/dist/tools/index.d.ts.map +1 -1
  129. package/dist/tools/index.js +18 -32
  130. package/dist/tools/level-height-guard.d.ts +2 -0
  131. package/dist/tools/level-height-guard.d.ts.map +1 -0
  132. package/dist/tools/level-height-guard.js +11 -0
  133. package/dist/tools/list-units.d.ts +2 -2
  134. package/dist/tools/list-units.d.ts.map +1 -1
  135. package/dist/tools/list-units.js +2 -2
  136. package/dist/tools/live-sync.d.ts +25 -6
  137. package/dist/tools/live-sync.d.ts.map +1 -1
  138. package/dist/tools/live-sync.js +48 -27
  139. package/dist/tools/local-geometry-scripts.d.ts +8 -0
  140. package/dist/tools/local-geometry-scripts.d.ts.map +1 -0
  141. package/dist/tools/local-geometry-scripts.js +67 -0
  142. package/dist/tools/measure.d.ts +7 -1
  143. package/dist/tools/measure.d.ts.map +1 -1
  144. package/dist/tools/measure.js +38 -70
  145. package/dist/tools/measurement.d.ts +1 -36
  146. package/dist/tools/measurement.d.ts.map +1 -1
  147. package/dist/tools/measurement.js +2 -94
  148. package/dist/tools/node-world-point.d.ts +37 -0
  149. package/dist/tools/node-world-point.d.ts.map +1 -0
  150. package/dist/tools/node-world-point.js +457 -0
  151. package/dist/tools/normalize-schema-dialect.d.ts +1 -1
  152. package/dist/tools/normalize-schema-dialect.d.ts.map +1 -1
  153. package/dist/tools/normalize-schema-dialect.js +22 -3
  154. package/dist/tools/patch-guards.d.ts +60 -0
  155. package/dist/tools/patch-guards.d.ts.map +1 -0
  156. package/dist/tools/patch-guards.js +256 -0
  157. package/dist/tools/photo-to-scene/index.d.ts +1 -1
  158. package/dist/tools/photo-to-scene/index.d.ts.map +1 -1
  159. package/dist/tools/photo-to-scene/photo-to-scene.d.ts +3 -3
  160. package/dist/tools/photo-to-scene/photo-to-scene.d.ts.map +1 -1
  161. package/dist/tools/photo-to-scene/photo-to-scene.js +10 -9
  162. package/dist/tools/project-files.d.ts +4 -0
  163. package/dist/tools/project-files.d.ts.map +1 -0
  164. package/dist/tools/project-files.js +30 -0
  165. package/dist/tools/redo.d.ts +4 -2
  166. package/dist/tools/redo.d.ts.map +1 -1
  167. package/dist/tools/redo.js +4 -4
  168. package/dist/tools/retired-tools.d.ts +10 -0
  169. package/dist/tools/retired-tools.d.ts.map +1 -0
  170. package/dist/tools/retired-tools.js +22 -0
  171. package/dist/tools/roof-level-guard.d.ts +2 -0
  172. package/dist/tools/roof-level-guard.d.ts.map +1 -0
  173. package/dist/tools/roof-level-guard.js +22 -0
  174. package/dist/tools/room-tools.d.ts +36 -98
  175. package/dist/tools/room-tools.d.ts.map +1 -1
  176. package/dist/tools/room-tools.js +130 -565
  177. package/dist/tools/scene-lifecycle/create-project.d.ts +1 -1
  178. package/dist/tools/scene-lifecycle/create-project.d.ts.map +1 -1
  179. package/dist/tools/scene-lifecycle/create-project.js +31 -6
  180. package/dist/tools/scene-lifecycle/delete-scene.d.ts +3 -1
  181. package/dist/tools/scene-lifecycle/delete-scene.d.ts.map +1 -1
  182. package/dist/tools/scene-lifecycle/delete-scene.js +10 -9
  183. package/dist/tools/scene-lifecycle/get-project-status.d.ts +1 -1
  184. package/dist/tools/scene-lifecycle/get-project-status.d.ts.map +1 -1
  185. package/dist/tools/scene-lifecycle/get-project-status.js +6 -6
  186. package/dist/tools/scene-lifecycle/index.d.ts +1 -1
  187. package/dist/tools/scene-lifecycle/index.d.ts.map +1 -1
  188. package/dist/tools/scene-lifecycle/list-scenes.d.ts +1 -1
  189. package/dist/tools/scene-lifecycle/list-scenes.d.ts.map +1 -1
  190. package/dist/tools/scene-lifecycle/list-scenes.js +4 -4
  191. package/dist/tools/scene-lifecycle/load-scene.d.ts +2 -2
  192. package/dist/tools/scene-lifecycle/load-scene.d.ts.map +1 -1
  193. package/dist/tools/scene-lifecycle/load-scene.js +5 -5
  194. package/dist/tools/scene-lifecycle/metadata.d.ts +1 -1
  195. package/dist/tools/scene-lifecycle/rename-scene.d.ts +1 -1
  196. package/dist/tools/scene-lifecycle/rename-scene.d.ts.map +1 -1
  197. package/dist/tools/scene-lifecycle/rename-scene.js +6 -6
  198. package/dist/tools/scene-lifecycle/save-scene.d.ts +6 -3
  199. package/dist/tools/scene-lifecycle/save-scene.d.ts.map +1 -1
  200. package/dist/tools/scene-lifecycle/save-scene.js +124 -16
  201. package/dist/tools/scene-lifecycle/test-utils.d.ts +3 -3
  202. package/dist/tools/scene-lifecycle/test-utils.d.ts.map +1 -1
  203. package/dist/tools/scene-lifecycle/test-utils.js +2 -1
  204. package/dist/tools/set-unit-members.d.ts +4 -2
  205. package/dist/tools/set-unit-members.d.ts.map +1 -1
  206. package/dist/tools/set-unit-members.js +6 -6
  207. package/dist/tools/set-zone.d.ts +4 -2
  208. package/dist/tools/set-zone.d.ts.map +1 -1
  209. package/dist/tools/set-zone.js +30 -18
  210. package/dist/tools/shared-tools.d.ts +40 -0
  211. package/dist/tools/shared-tools.d.ts.map +1 -0
  212. package/dist/tools/shared-tools.js +574 -0
  213. package/dist/tools/structure-tools.d.ts +57 -0
  214. package/dist/tools/structure-tools.d.ts.map +1 -0
  215. package/dist/tools/structure-tools.js +57 -0
  216. package/dist/tools/templates/create-from-template.d.ts +2 -2
  217. package/dist/tools/templates/create-from-template.d.ts.map +1 -1
  218. package/dist/tools/templates/create-from-template.js +6 -6
  219. package/dist/tools/templates/create-house-from-brief.d.ts +1 -1
  220. package/dist/tools/templates/create-house-from-brief.d.ts.map +1 -1
  221. package/dist/tools/templates/create-house-from-brief.js +6 -6
  222. package/dist/tools/templates/index.d.ts +1 -1
  223. package/dist/tools/templates/index.d.ts.map +1 -1
  224. package/dist/tools/templates/list-templates.d.ts +1 -1
  225. package/dist/tools/templates/list-templates.d.ts.map +1 -1
  226. package/dist/tools/templates/list-templates.js +2 -2
  227. package/dist/tools/undo.d.ts +4 -2
  228. package/dist/tools/undo.d.ts.map +1 -1
  229. package/dist/tools/undo.js +4 -4
  230. package/dist/tools/unit-members.d.ts.map +1 -1
  231. package/dist/tools/unit-members.js +6 -6
  232. package/dist/tools/variants/generate-variants.d.ts +6 -6
  233. package/dist/tools/variants/generate-variants.d.ts.map +1 -1
  234. package/dist/tools/variants/generate-variants.js +6 -6
  235. package/dist/tools/variants/index.d.ts +1 -1
  236. package/dist/tools/variants/index.d.ts.map +1 -1
  237. package/dist/tools/variants/mutations.js +1 -1
  238. package/dist/tools/view-scene.d.ts +44 -0
  239. package/dist/tools/view-scene.d.ts.map +1 -0
  240. package/dist/tools/view-scene.js +75 -0
  241. package/dist/tools/vision/analyze-floorplan-image.d.ts +1 -1
  242. package/dist/tools/vision/analyze-floorplan-image.d.ts.map +1 -1
  243. package/dist/tools/vision/analyze-floorplan-image.js +7 -7
  244. package/dist/tools/vision/analyze-room-photo.d.ts +1 -1
  245. package/dist/tools/vision/analyze-room-photo.d.ts.map +1 -1
  246. package/dist/tools/vision/analyze-room-photo.js +7 -7
  247. package/dist/tools/vision/index.d.ts +1 -1
  248. package/dist/tools/vision/index.d.ts.map +1 -1
  249. package/dist/transports/http.d.ts +8 -2
  250. package/dist/transports/http.d.ts.map +1 -1
  251. package/dist/transports/http.js +9 -3
  252. package/dist/transports/stdio.d.ts +15 -9
  253. package/dist/transports/stdio.d.ts.map +1 -1
  254. package/dist/transports/stdio.js +18 -11
  255. package/dist/version.d.ts +5 -0
  256. package/dist/version.d.ts.map +1 -1
  257. package/dist/version.js +17 -3
  258. package/examples/coordinate-conventions-demo.md +12 -13
  259. package/examples/embed-in-agent.ts +6 -7
  260. package/examples/generate-apartment.md +13 -15
  261. package/examples/photo-to-scene.md +3 -4
  262. package/examples/renovate-from-photos.md +6 -9
  263. package/package.json +19 -9
  264. package/dist/tools/create-level.d.ts +0 -21
  265. package/dist/tools/create-level.d.ts.map +0 -1
  266. package/dist/tools/create-level.js +0 -63
  267. package/dist/tools/create-wall.d.ts +0 -22
  268. package/dist/tools/create-wall.d.ts.map +0 -1
  269. package/dist/tools/create-wall.js +0 -57
  270. package/dist/tools/cut-opening.d.ts +0 -25
  271. package/dist/tools/cut-opening.d.ts.map +0 -1
  272. package/dist/tools/cut-opening.js +0 -61
  273. package/dist/tools/delete-node.d.ts +0 -19
  274. package/dist/tools/delete-node.d.ts.map +0 -1
  275. package/dist/tools/delete-node.js +0 -40
  276. package/dist/tools/describe-node.d.ts +0 -17
  277. package/dist/tools/describe-node.d.ts.map +0 -1
  278. package/dist/tools/describe-node.js +0 -97
  279. package/dist/tools/door-clearance.d.ts +0 -135
  280. package/dist/tools/door-clearance.d.ts.map +0 -1
  281. package/dist/tools/door-clearance.js +0 -334
  282. package/dist/tools/duplicate-level.d.ts +0 -19
  283. package/dist/tools/duplicate-level.d.ts.map +0 -1
  284. package/dist/tools/duplicate-level.js +0 -60
  285. package/dist/tools/find-nodes.d.ts +0 -32
  286. package/dist/tools/find-nodes.d.ts.map +0 -1
  287. package/dist/tools/find-nodes.js +0 -107
  288. package/dist/tools/geometry.d.ts +0 -24
  289. package/dist/tools/geometry.d.ts.map +0 -1
  290. package/dist/tools/geometry.js +0 -94
  291. package/dist/tools/get-node.d.ts +0 -11
  292. package/dist/tools/get-node.d.ts.map +0 -1
  293. package/dist/tools/get-node.js +0 -29
  294. package/dist/tools/layout-clearance.d.ts +0 -105
  295. package/dist/tools/layout-clearance.d.ts.map +0 -1
  296. package/dist/tools/layout-clearance.js +0 -190
  297. package/dist/tools/place-item.d.ts +0 -22
  298. package/dist/tools/place-item.d.ts.map +0 -1
  299. package/dist/tools/place-item.js +0 -89
  300. package/dist/tools/scene-query.d.ts +0 -62
  301. package/dist/tools/scene-query.d.ts.map +0 -1
  302. package/dist/tools/scene-query.js +0 -670
  303. package/dist/tools/validate-scene.d.ts +0 -19
  304. package/dist/tools/validate-scene.d.ts.map +0 -1
  305. package/dist/tools/validate-scene.js +0 -28
@@ -0,0 +1,574 @@
1
+ import { AGENT_OPERATIONS, achievedChanges, applyAgentOutcome, assetViewNeeds, assetViewsReadCatalog, briefReadsCatalog, buildBatchObjects, createAssetViewLoader, createFetchAssetViewIO, furnishingRefusal, startOfSession, writeCollections, } from '@pascal-app/core/agent-operations';
2
+ import { addCornerWindowTool, addFenceTool, addLevelTool, addObjectTool, addWallTool, createRoofTool, createRoomTool, createStairTool, deleteNodeTool, designBriefTool, duplicateLevelTool, findByTypeTool, fitStairTool, furnishRoomTool, getLevelSummaryTool, getNodeTool, getSiteTool, getWallsTool, getZonesTool, listLevelsTool, measureStairTool, mergeWindowsTool, moveRoofsToRoofLevelTool, paintTool, placeBuildingTool, placeDesignTool, placeInRoomTool, placeItemsTool, ROOM_TOOL_CONTRACTS, refuse, runBatchTool, searchAssetsTool, searchMaterialsTool, setCheckpointTool, setGroundLevelTool, validateDesignTool, verifySceneTool, viewAssetsTool, } from '@pascal-app/core/agent-tools';
3
+ import { DesignValidationSchema } from '@pascal-app/core/procedural-items';
4
+ import { MaterialSchema, SceneMaterial, } from '@pascal-app/core/schema';
5
+ import { z } from 'zod';
6
+ import { ADDITIVE_TOOL_ANNOTATIONS, DESTRUCTIVE_TOOL_ANNOTATIONS, READ_ONLY_TOOL_ANNOTATIONS, } from './annotations.js';
7
+ import { builtInCatalog } from './asset-catalog.js';
8
+ import { registerCollectionTools } from './collections.js';
9
+ import { refusalResult } from './errors.js';
10
+ import { liveSyncOutput, persistencePayload, publishLiveSceneSnapshot } from './live-sync.js';
11
+ import { ROOM_TOOL_ANNOTATIONS, structureOutput } from './structure-tools.js';
12
+ const defaultAssetViews = createAssetViewLoader(createFetchAssetViewIO());
13
+ const jsonObject = z.record(z.string(), z.unknown());
14
+ function refuseScripts() {
15
+ refuse('scripts_unavailable', 'This Pascal server cannot run geometry scripts.');
16
+ }
17
+ /** What the scene holds after a mutating call (core achievedChanges). */
18
+ const achievedOutput = {
19
+ achieved: z
20
+ .object({
21
+ created: z.record(z.string(), z.number()),
22
+ updated: z.number(),
23
+ deleted: z.record(z.string(), z.number()),
24
+ unchanged: z.literal(true).optional(),
25
+ })
26
+ .optional(),
27
+ };
28
+ const levelRoleOutput = {
29
+ levelId: z.string(),
30
+ levelName: z.string().optional(),
31
+ floorIndex: z.number(),
32
+ role: z.string(),
33
+ metadataRole: z.string().nullable(),
34
+ isOccupiedStory: z.boolean(),
35
+ isSupportLevel: z.boolean(),
36
+ referenceLevelId: z.string().nullable(),
37
+ };
38
+ const SHARED_TOOLS = [
39
+ {
40
+ contract: validateDesignTool,
41
+ operation: AGENT_OPERATIONS.validate_design,
42
+ annotations: READ_ONLY_TOOL_ANNOTATIONS,
43
+ outputSchema: DesignValidationSchema.shape,
44
+ },
45
+ {
46
+ contract: placeDesignTool,
47
+ operation: AGENT_OPERATIONS.place_design,
48
+ annotations: ADDITIVE_TOOL_ANNOTATIONS,
49
+ outputSchema: {
50
+ designId: z.string(),
51
+ parentId: z.string(),
52
+ surfaceId: z.string().nullable(),
53
+ ...liveSyncOutput,
54
+ },
55
+ },
56
+ {
57
+ contract: measureStairTool,
58
+ operation: AGENT_OPERATIONS.measure_stair,
59
+ annotations: READ_ONLY_TOOL_ANNOTATIONS,
60
+ outputSchema: { measurements: z.json(), layouts: z.json() },
61
+ },
62
+ {
63
+ contract: fitStairTool,
64
+ operation: AGENT_OPERATIONS.fit_stair,
65
+ annotations: DESTRUCTIVE_TOOL_ANNOTATIONS,
66
+ outputSchema: { stairId: z.string().min(1), measurements: z.json(), ...liveSyncOutput },
67
+ },
68
+ {
69
+ contract: findByTypeTool,
70
+ operation: AGENT_OPERATIONS.find_by_type,
71
+ annotations: READ_ONLY_TOOL_ANNOTATIONS,
72
+ },
73
+ {
74
+ contract: listLevelsTool,
75
+ operation: AGENT_OPERATIONS.list_levels,
76
+ annotations: READ_ONLY_TOOL_ANNOTATIONS,
77
+ outputSchema: {
78
+ activeSceneId: z.string().nullable(),
79
+ activeLevelId: z.string().nullable(),
80
+ levelCount: z.number(),
81
+ occupiedStoryCount: z.number(),
82
+ supportLevelCount: z.number(),
83
+ roofLevelIds: z.array(z.string()),
84
+ levels: z.array(jsonObject),
85
+ },
86
+ envelope: (bridge) => ({ activeSceneId: bridge.getActiveScene()?.id ?? null }),
87
+ },
88
+ {
89
+ contract: getNodeTool,
90
+ operation: AGENT_OPERATIONS.get_node,
91
+ annotations: READ_ONLY_TOOL_ANNOTATIONS,
92
+ outputSchema: {
93
+ node: jsonObject,
94
+ ancestorIds: z.array(z.string()),
95
+ missingChildIds: z.array(z.string()).optional(),
96
+ materials: z.record(z.string(), SceneMaterial).optional(),
97
+ },
98
+ },
99
+ {
100
+ contract: getLevelSummaryTool,
101
+ operation: AGENT_OPERATIONS.get_level_summary,
102
+ annotations: READ_ONLY_TOOL_ANNOTATIONS,
103
+ outputSchema: {
104
+ ...levelRoleOutput,
105
+ counts: jsonObject,
106
+ walls: z.array(jsonObject),
107
+ zones: z.array(jsonObject),
108
+ slabs: z.array(jsonObject),
109
+ ceilings: z.array(jsonObject),
110
+ items: z.array(jsonObject),
111
+ openings: z.array(jsonObject),
112
+ stairs: z.array(jsonObject),
113
+ roofs: z.array(jsonObject),
114
+ other: z.array(jsonObject),
115
+ },
116
+ },
117
+ {
118
+ contract: getWallsTool,
119
+ operation: AGENT_OPERATIONS.get_walls,
120
+ annotations: READ_ONLY_TOOL_ANNOTATIONS,
121
+ outputSchema: { levelId: z.string(), walls: z.array(jsonObject) },
122
+ },
123
+ {
124
+ contract: getZonesTool,
125
+ operation: AGENT_OPERATIONS.get_zones,
126
+ annotations: READ_ONLY_TOOL_ANNOTATIONS,
127
+ outputSchema: { levelId: z.string(), zones: z.array(jsonObject) },
128
+ },
129
+ {
130
+ contract: duplicateLevelTool,
131
+ operation: AGENT_OPERATIONS.duplicate_level,
132
+ annotations: ADDITIVE_TOOL_ANNOTATIONS,
133
+ outputSchema: {
134
+ newLevelId: z.string(),
135
+ name: z.string().optional(),
136
+ floorIndex: z.number(),
137
+ shiftedLevelIds: z.array(z.string()),
138
+ copied: z.record(z.string(), z.number()),
139
+ skipped: z.record(z.string(), z.number()),
140
+ newNodeIds: z.array(z.string()),
141
+ // A floor copy is hundreds of ids: the result lists 40 and counts the rest.
142
+ newNodeIdsOmitted: z.number().optional(),
143
+ ...achievedOutput,
144
+ ...liveSyncOutput,
145
+ },
146
+ },
147
+ {
148
+ contract: setGroundLevelTool,
149
+ operation: AGENT_OPERATIONS.set_ground_level,
150
+ annotations: DESTRUCTIVE_TOOL_ANNOTATIONS,
151
+ outputSchema: {
152
+ ok: z.boolean(),
153
+ levelId: z.string(),
154
+ buildingId: z.string(),
155
+ floorElevation: z.number(),
156
+ gradeElevation: z.number().optional(),
157
+ movedBuildingBy: z.number().optional(),
158
+ renumbered: z.boolean().optional(),
159
+ unchanged: z.boolean().optional(),
160
+ message: z.string(),
161
+ ...achievedOutput,
162
+ ...liveSyncOutput,
163
+ },
164
+ },
165
+ {
166
+ contract: verifySceneTool,
167
+ operation: AGENT_OPERATIONS.verify_scene,
168
+ annotations: READ_ONLY_TOOL_ANNOTATIONS,
169
+ outputSchema: {
170
+ ok: z.boolean(),
171
+ valid: z.boolean(),
172
+ levelCount: z.number(),
173
+ occupiedStoryCount: z.number(),
174
+ supportLevelCount: z.number(),
175
+ roofLevelIds: z.array(z.string()),
176
+ activeSceneId: z.string().nullable(),
177
+ activeLevelId: z.string().nullable(),
178
+ levels: z.array(jsonObject),
179
+ emptyLevelIds: z.array(z.string()),
180
+ // Typed by `type`; a check registered with verify_scene may add fields of its own.
181
+ issues: z.array(z.looseObject({
182
+ type: z.string(),
183
+ message: z.string(),
184
+ severity: z.literal('info').optional(),
185
+ nodeId: z.string().optional(),
186
+ path: z.string().optional(),
187
+ zoneId: z.string().optional(),
188
+ wallIds: z.array(z.string()).optional(),
189
+ area: z.number().optional(),
190
+ at: z.tuple([z.number(), z.number()]).optional(),
191
+ wallId: z.string().optional(),
192
+ slabId: z.string().optional(),
193
+ levelId: z.string().optional(),
194
+ wallTop: z.number().optional(),
195
+ slabUnderside: z.number().optional(),
196
+ slabTop: z.number().optional(),
197
+ penetration: z.number().optional(),
198
+ coplanar: z.boolean().optional(),
199
+ end: z.enum(['start', 'end']).optional(),
200
+ reason: z.enum(['gap', 'crosses', 'parallel', 'rejected']).optional(),
201
+ gap: z.number().optional(),
202
+ nearestWallId: z.string().optional(),
203
+ })),
204
+ hasIssues: z.boolean(),
205
+ checkpoints: z.array(z.string()).optional(),
206
+ since: jsonObject.optional(),
207
+ authoredObjects: z
208
+ .array(z.object({
209
+ id: z.string(),
210
+ name: z.string(),
211
+ category: z.string(),
212
+ reason: z.string().nullable(),
213
+ }))
214
+ .optional(),
215
+ },
216
+ envelope: (bridge) => ({ activeSceneId: bridge.getActiveScene()?.id ?? null }),
217
+ },
218
+ {
219
+ contract: setCheckpointTool,
220
+ operation: AGENT_OPERATIONS.set_checkpoint,
221
+ annotations: ADDITIVE_TOOL_ANNOTATIONS,
222
+ },
223
+ {
224
+ contract: designBriefTool,
225
+ operation: AGENT_OPERATIONS.design_brief,
226
+ annotations: ADDITIVE_TOOL_ANNOTATIONS,
227
+ },
228
+ {
229
+ contract: addWallTool,
230
+ operation: AGENT_OPERATIONS.add_wall,
231
+ annotations: ADDITIVE_TOOL_ANNOTATIONS,
232
+ },
233
+ {
234
+ contract: addFenceTool,
235
+ operation: AGENT_OPERATIONS.add_fence,
236
+ annotations: ADDITIVE_TOOL_ANNOTATIONS,
237
+ },
238
+ {
239
+ contract: addCornerWindowTool,
240
+ operation: AGENT_OPERATIONS.add_corner_window,
241
+ annotations: ADDITIVE_TOOL_ANNOTATIONS,
242
+ },
243
+ {
244
+ contract: mergeWindowsTool,
245
+ operation: AGENT_OPERATIONS.merge_windows,
246
+ annotations: DESTRUCTIVE_TOOL_ANNOTATIONS,
247
+ },
248
+ {
249
+ contract: addLevelTool,
250
+ operation: AGENT_OPERATIONS.add_level,
251
+ annotations: ADDITIVE_TOOL_ANNOTATIONS,
252
+ },
253
+ {
254
+ contract: createStairTool,
255
+ operation: AGENT_OPERATIONS.create_stair,
256
+ annotations: ADDITIVE_TOOL_ANNOTATIONS,
257
+ },
258
+ {
259
+ contract: createRoofTool,
260
+ operation: AGENT_OPERATIONS.create_roof,
261
+ annotations: ADDITIVE_TOOL_ANNOTATIONS,
262
+ },
263
+ {
264
+ contract: moveRoofsToRoofLevelTool,
265
+ operation: AGENT_OPERATIONS.move_roofs_to_roof_level,
266
+ annotations: DESTRUCTIVE_TOOL_ANNOTATIONS,
267
+ },
268
+ {
269
+ contract: placeItemsTool,
270
+ operation: AGENT_OPERATIONS.place_items,
271
+ annotations: ADDITIVE_TOOL_ANNOTATIONS,
272
+ catalog: true,
273
+ },
274
+ {
275
+ contract: deleteNodeTool,
276
+ operation: AGENT_OPERATIONS.delete_node,
277
+ annotations: DESTRUCTIVE_TOOL_ANNOTATIONS,
278
+ outputSchema: { deletedIds: z.array(z.string()), ...achievedOutput, ...liveSyncOutput },
279
+ },
280
+ {
281
+ contract: createRoomTool,
282
+ operation: AGENT_OPERATIONS.create_room,
283
+ annotations: ADDITIVE_TOOL_ANNOTATIONS,
284
+ outputSchema: {
285
+ ok: z.literal(true),
286
+ zoneId: z.string(),
287
+ // The floor plate and the ceiling the host derived; null where it derives none (a terrace).
288
+ slabId: z.string().nullable(),
289
+ ceilingId: z.string().nullable(),
290
+ // One per polygon edge; null where no wall runs along it.
291
+ wallIds: z.array(z.string().nullable()),
292
+ reusedWalls: z.number(),
293
+ areaSqMeters: z.number(),
294
+ doorIds: z.array(z.string()),
295
+ windowIds: z.array(z.string()),
296
+ skippedOpenings: z
297
+ .array(z.object({
298
+ kind: z.enum(['door', 'window']),
299
+ index: z.number(),
300
+ code: z.string(),
301
+ message: z.string(),
302
+ }))
303
+ .optional(),
304
+ message: z.string(),
305
+ ...achievedOutput,
306
+ ...liveSyncOutput,
307
+ },
308
+ },
309
+ {
310
+ contract: furnishRoomTool,
311
+ operation: AGENT_OPERATIONS.furnish_room,
312
+ annotations: ADDITIVE_TOOL_ANNOTATIONS,
313
+ catalog: true,
314
+ outputSchema: {
315
+ ok: z.literal(true),
316
+ placed: z.number(),
317
+ itemIds: z.array(z.string()),
318
+ skipped: z.array(z.string()),
319
+ doorWallIndex: z.number(),
320
+ doorsDetected: z.number(),
321
+ message: z.string(),
322
+ ...achievedOutput,
323
+ ...liveSyncOutput,
324
+ },
325
+ },
326
+ {
327
+ contract: paintTool,
328
+ operation: AGENT_OPERATIONS.paint,
329
+ annotations: DESTRUCTIVE_TOOL_ANNOTATIONS,
330
+ outputSchema: {
331
+ ok: z.literal(true),
332
+ painted: z.array(z.object({ id: z.string(), roles: z.array(z.string()) })),
333
+ finish: z.string(),
334
+ materialId: z.string().optional(),
335
+ material: MaterialSchema.optional(),
336
+ createdMaterial: SceneMaterial.optional(),
337
+ note: z.string().optional(),
338
+ ...achievedOutput,
339
+ ...liveSyncOutput,
340
+ },
341
+ },
342
+ {
343
+ contract: placeInRoomTool,
344
+ operation: AGENT_OPERATIONS.place_in_room,
345
+ annotations: ADDITIVE_TOOL_ANNOTATIONS,
346
+ catalog: true,
347
+ outputSchema: {
348
+ ok: z.literal(true),
349
+ itemId: z.string(),
350
+ kind: z.string(),
351
+ placed: z.object({ position: z.array(z.number()), rotationDeg: z.number() }),
352
+ against: z.object({ edge: z.number(), wall: z.string() }).optional(),
353
+ around: z.string().optional(),
354
+ facing: z.string().optional(),
355
+ message: z.string(),
356
+ ...achievedOutput,
357
+ ...liveSyncOutput,
358
+ },
359
+ },
360
+ {
361
+ contract: getSiteTool,
362
+ operation: AGENT_OPERATIONS.get_site,
363
+ annotations: READ_ONLY_TOOL_ANNOTATIONS,
364
+ },
365
+ {
366
+ contract: placeBuildingTool,
367
+ operation: AGENT_OPERATIONS.place_building,
368
+ annotations: DESTRUCTIVE_TOOL_ANNOTATIONS,
369
+ outputSchema: {
370
+ buildingId: z.string(),
371
+ moved: z.boolean(),
372
+ fit: z.enum(['buildable', 'lot', 'outside']),
373
+ message: z.string(),
374
+ ...achievedOutput,
375
+ ...liveSyncOutput,
376
+ },
377
+ },
378
+ {
379
+ contract: searchAssetsTool,
380
+ operation: AGENT_OPERATIONS.search_assets,
381
+ annotations: READ_ONLY_TOOL_ANNOTATIONS,
382
+ catalog: true,
383
+ },
384
+ {
385
+ contract: viewAssetsTool,
386
+ operation: AGENT_OPERATIONS.view_assets,
387
+ annotations: READ_ONLY_TOOL_ANNOTATIONS,
388
+ catalog: true,
389
+ },
390
+ {
391
+ contract: searchMaterialsTool,
392
+ operation: AGENT_OPERATIONS.search_materials,
393
+ annotations: READ_ONLY_TOOL_ANNOTATIONS,
394
+ },
395
+ ...ROOM_TOOL_CONTRACTS.map((contract) => {
396
+ const name = contract.name;
397
+ return {
398
+ contract,
399
+ operation: AGENT_OPERATIONS[name],
400
+ annotations: ROOM_TOOL_ANNOTATIONS[name],
401
+ outputSchema: { ...structureOutput, ...achievedOutput },
402
+ };
403
+ }),
404
+ {
405
+ contract: runBatchTool,
406
+ operation: AGENT_OPERATIONS.run_batch,
407
+ annotations: DESTRUCTIVE_TOOL_ANNOTATIONS,
408
+ },
409
+ ];
410
+ export function toPatches(changes) {
411
+ return [
412
+ ...(changes.materials ?? []).map((material) => ({ op: 'upsert_material', material })),
413
+ ...(changes.create ?? []).map(({ node, parentId }) => ({
414
+ op: 'create',
415
+ node,
416
+ parentId: parentId,
417
+ })),
418
+ ...(changes.update ?? []).map(({ id, data }) => ({
419
+ op: 'update',
420
+ id: id,
421
+ data,
422
+ })),
423
+ ...(changes.delete ?? []).map((id) => ({
424
+ op: 'delete',
425
+ id: id,
426
+ cascade: true,
427
+ })),
428
+ ];
429
+ }
430
+ /** How an outcome reaches this bridge: its patches, its derived construction, its session record. */
431
+ export function agentRuntime(bridge) {
432
+ return {
433
+ getNodes: () => bridge.getNodes(),
434
+ applyChanges: (changes) => {
435
+ if (changes.materials?.length &&
436
+ (bridge.supportsMaterialUpserts !== true || bridge.getMaterials?.() === undefined))
437
+ refuse('materials_unavailable', 'This host cannot atomically persist native materials; nothing was painted.');
438
+ const next = toPatches(changes);
439
+ if (next.length)
440
+ bridge.applyPatch(next);
441
+ if (changes.collections && Object.keys(changes.collections).length)
442
+ bridge.setCollections(writeCollections(bridge.getCollections(), changes.collections));
443
+ },
444
+ reconcile: () => {
445
+ bridge.deriveStructure();
446
+ },
447
+ keep: (keep) => bridge.agentSession?.keep(keep),
448
+ };
449
+ }
450
+ export function briefInForce(bridge) {
451
+ if (bridge.designBriefRequired === false)
452
+ return undefined;
453
+ const session = bridge.agentSession;
454
+ return session ? (session.read().designBrief ?? null) : undefined;
455
+ }
456
+ function writesScene(changes) {
457
+ return Boolean(changes &&
458
+ (toPatches(changes).length ||
459
+ (changes.collections && Object.keys(changes.collections).length)));
460
+ }
461
+ export function registerSharedTools(server, bridge, catalog = builtInCatalog, hosts = {}) {
462
+ for (const tool of SHARED_TOOLS)
463
+ registerOperationTool(server, bridge, tool, catalog, hosts);
464
+ registerCollectionTools(server, bridge);
465
+ }
466
+ /**
467
+ * Registers one operation tool, as the shared tools are: a host adds a plugin's `'operation'`
468
+ * tools with it, from the plugin's `./agent-tools` contract and `./agent-operations` operation.
469
+ */
470
+ export function registerOperationTool(server, bridge, tool, catalog = builtInCatalog, hosts = {}) {
471
+ server.registerTool(tool.contract.name, {
472
+ title: tool.contract.title,
473
+ description: tool.contract.description,
474
+ inputSchema: z.object(tool.contract.input),
475
+ // Loose: a client that listed the tools rejects any field the schema leaves out, and the
476
+ // operations in core grow fields (verify_scene's guesses) that this list would miss.
477
+ ...(tool.outputSchema ? { outputSchema: z.looseObject(tool.outputSchema) } : {}),
478
+ annotations: tool.annotations,
479
+ }, async (input) => {
480
+ let outcome;
481
+ // A copy of the map: a host may write its own in place (the hosted bridge does), and a
482
+ // "before" that grows with the call reads every creation as unchanged.
483
+ const before = { ...bridge.getNodes() };
484
+ // The agent's session begins with its first call, before anything is written.
485
+ const first = bridge.agentSession && startOfSession(bridge.agentSession.read(), before);
486
+ if (first)
487
+ bridge.agentSession?.keep(first);
488
+ // Gate before catalog I/O or module compilation.
489
+ const designBrief = briefInForce(bridge);
490
+ if (designBrief !== undefined) {
491
+ const refusal = furnishingRefusal(tool.contract.name, input, designBrief);
492
+ if (refusal)
493
+ return refusalResult(refusal);
494
+ }
495
+ const batchPlacesInRoom = tool.contract.name === runBatchTool.name &&
496
+ Array.isArray(input.calls) &&
497
+ input.calls.some((call) => typeof call === 'object' &&
498
+ call !== null &&
499
+ 'tool' in call &&
500
+ call.tool === placeInRoomTool.name);
501
+ const batchesObjects = tool.contract.name === runBatchTool.name &&
502
+ Array.isArray(input.calls) &&
503
+ input.calls.some((call) => typeof call === 'object' &&
504
+ call !== null &&
505
+ 'tool' in call &&
506
+ call.tool === addObjectTool.name);
507
+ const context = {
508
+ activeLevelId: bridge.activeLevelId?.() ?? null,
509
+ ...(bridge.supportsMaterialUpserts && bridge.getMaterials
510
+ ? { materials: bridge.getMaterials() }
511
+ : {}),
512
+ ...(bridge.nodeSchema && { nodeSchema: (kind) => bridge.nodeSchema(kind) }),
513
+ session: bridge.agentSession?.read(),
514
+ ...(designBrief !== undefined && { designBrief }),
515
+ ...((tool.catalog ||
516
+ batchPlacesInRoom ||
517
+ assetViewsReadCatalog(tool.contract.name, input) ||
518
+ briefReadsCatalog(tool.contract.name, input)) && { catalog: await catalog() }),
519
+ ...(batchesObjects && {
520
+ batchObjects: await buildBatchObjects(input.calls, hosts.buildObject ?? refuseScripts),
521
+ }),
522
+ };
523
+ const needs = assetViewNeeds(before, tool.contract.name, input, context);
524
+ if (needs.subjects.length)
525
+ context.assetViews = await (hosts.assetViews ?? defaultAssetViews)(needs.subjects, {
526
+ pictures: needs.pictures,
527
+ });
528
+ try {
529
+ outcome = tool.operation(before, input, context);
530
+ }
531
+ catch (error) {
532
+ return refusalResult(error);
533
+ }
534
+ let result = outcome.result;
535
+ let persistence = {};
536
+ // An outcome edits the scene through its node changes, its collection writes, or the
537
+ // follow-up it plans once the host has reconciled; any of them is one history step.
538
+ if (writesScene(outcome.changes) || outcome.afterReconcile) {
539
+ result = bridge.runAsSingleHistoryStep(() => applyAgentOutcome(outcome, agentRuntime(bridge)));
540
+ persistence = persistencePayload(await publishLiveSceneSnapshot(bridge, tool.contract.name));
541
+ }
542
+ else if (outcome.keep) {
543
+ // A checkpoint: kept with the session, nothing in the scene to save.
544
+ result = applyAgentOutcome(outcome, agentRuntime(bridge));
545
+ }
546
+ // What the scene holds after the call, not only what the call says it built.
547
+ const achieved = outcome.changes ? achievedChanges(before, outcome.changes) : null;
548
+ const payload = {
549
+ ...result,
550
+ ...(achieved ? { achieved } : {}),
551
+ ...(tool.envelope?.(bridge) ?? {}),
552
+ ...persistence,
553
+ };
554
+ const { previews, ...shown } = payload;
555
+ const pictures = (Array.isArray(previews) ? previews : []).flatMap(({ label, image }) => {
556
+ const [, mimeType, data] = /^data:(image\/[\w.+-]+);base64,(.+)$/.exec(image) ?? [];
557
+ return mimeType && data
558
+ ? [
559
+ { type: 'text', text: label },
560
+ { type: 'image', data, mimeType },
561
+ ]
562
+ : [];
563
+ });
564
+ if (pictures.length)
565
+ return {
566
+ content: [{ type: 'text', text: JSON.stringify(shown) }, ...pictures],
567
+ structuredContent: shown,
568
+ };
569
+ return {
570
+ content: [{ type: 'text', text: JSON.stringify(payload) }],
571
+ structuredContent: payload,
572
+ };
573
+ });
574
+ }
@@ -0,0 +1,57 @@
1
+ import type { ROOM_OPERATIONS } from '@pascal-app/core/agent-operations';
2
+ import { z } from 'zod';
3
+ import { ADDITIVE_TOOL_ANNOTATIONS, DESTRUCTIVE_TOOL_ANNOTATIONS } from './annotations.js';
4
+ export type RoomToolName = keyof typeof ROOM_OPERATIONS;
5
+ export declare const ROOM_TOOL_ANNOTATIONS: Record<RoomToolName, typeof ADDITIVE_TOOL_ANNOTATIONS | typeof DESTRUCTIVE_TOOL_ANNOTATIONS>;
6
+ export declare const structureOutput: {
7
+ project: z.ZodOptional<z.ZodNullable<z.ZodString>>;
8
+ unsaved: z.ZodOptional<z.ZodString>;
9
+ persistence: z.ZodOptional<z.ZodObject<{
10
+ status: z.ZodEnum<{
11
+ events_unsupported: "events_unsupported";
12
+ unbound: "unbound";
13
+ }>;
14
+ warning: z.ZodString;
15
+ }, z.core.$strip>>;
16
+ zoneId: z.ZodOptional<z.ZodString>;
17
+ openingId: z.ZodOptional<z.ZodString>;
18
+ openingIds: z.ZodOptional<z.ZodArray<z.ZodString>>;
19
+ hints: z.ZodOptional<z.ZodArray<z.ZodObject<{
20
+ code: z.ZodLiteral<"manual-ceiling">;
21
+ openingId: z.ZodString;
22
+ surfaceIds: z.ZodArray<z.ZodString>;
23
+ message: z.ZodString;
24
+ }, z.core.$strip>>>;
25
+ idMap: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodArray<z.ZodString>>>;
26
+ changes: z.ZodNumber;
27
+ separatorId: z.ZodOptional<z.ZodString>;
28
+ separatorIds: z.ZodOptional<z.ZodArray<z.ZodString>>;
29
+ zoneIds: z.ZodOptional<z.ZodArray<z.ZodString>>;
30
+ payload: z.ZodOptional<z.ZodObject<{
31
+ zoneId: z.ZodString;
32
+ name: z.ZodString;
33
+ mode: z.ZodEnum<{
34
+ blocked: "blocked";
35
+ delete: "delete";
36
+ merge: "merge";
37
+ }>;
38
+ mergedIntoZoneId: z.ZodOptional<z.ZodString>;
39
+ contents: z.ZodEnum<{
40
+ delete: "delete";
41
+ keep: "keep";
42
+ }>;
43
+ wallIds: z.ZodArray<z.ZodString>;
44
+ keptSharedWallIds: z.ZodArray<z.ZodString>;
45
+ separatorIds: z.ZodArray<z.ZodString>;
46
+ keptSharedSeparatorIds: z.ZodArray<z.ZodString>;
47
+ openingIds: z.ZodArray<z.ZodString>;
48
+ itemIds: z.ZodArray<z.ZodString>;
49
+ opensZoneIds: z.ZodArray<z.ZodString>;
50
+ }, z.core.$strip>>;
51
+ conflicts: z.ZodOptional<z.ZodArray<z.ZodObject<{
52
+ code: z.ZodString;
53
+ nodeIds: z.ZodArray<z.ZodString>;
54
+ message: z.ZodString;
55
+ }, z.core.$strip>>>;
56
+ };
57
+ //# sourceMappingURL=structure-tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"structure-tools.d.ts","sourceRoot":"","sources":["../../src/tools/structure-tools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAA;AACxE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,EAAE,yBAAyB,EAAE,4BAA4B,EAAE,MAAM,eAAe,CAAA;AAMvF,MAAM,MAAM,YAAY,GAAG,MAAM,OAAO,eAAe,CAAA;AAEvD,eAAO,MAAM,qBAAqB,EAAE,MAAM,CACxC,YAAY,EACZ,OAAO,yBAAyB,GAAG,OAAO,4BAA4B,CAgBvE,CAAA;AAED,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuC3B,CAAA"}
@@ -0,0 +1,57 @@
1
+ import { z } from 'zod';
2
+ import { ADDITIVE_TOOL_ANNOTATIONS, DESTRUCTIVE_TOOL_ANNOTATIONS } from './annotations.js';
3
+ import { liveSyncOutput } from './live-sync.js';
4
+ export const ROOM_TOOL_ANNOTATIONS = {
5
+ cut_floor_opening: ADDITIVE_TOOL_ANNOTATIONS,
6
+ remove_floor_opening: DESTRUCTIVE_TOOL_ANNOTATIONS,
7
+ set_floor_foundation: ADDITIVE_TOOL_ANNOTATIONS,
8
+ set_room_floor_construction: ADDITIVE_TOOL_ANNOTATIONS,
9
+ rebase_floor_reference: DESTRUCTIVE_TOOL_ANNOTATIONS,
10
+ create_mezzanine: ADDITIVE_TOOL_ANNOTATIONS,
11
+ move_zone: DESTRUCTIVE_TOOL_ANNOTATIONS,
12
+ duplicate_zone: DESTRUCTIVE_TOOL_ANNOTATIONS,
13
+ rotate_zone: DESTRUCTIVE_TOOL_ANNOTATIONS,
14
+ lock_outside_faces: DESTRUCTIVE_TOOL_ANNOTATIONS,
15
+ set_zone_intent: ADDITIVE_TOOL_ANNOTATIONS,
16
+ divide_zone: DESTRUCTIVE_TOOL_ANNOTATIONS,
17
+ merge_zones: DESTRUCTIVE_TOOL_ANNOTATIONS,
18
+ delete_zone: DESTRUCTIVE_TOOL_ANNOTATIONS,
19
+ };
20
+ export const structureOutput = {
21
+ zoneId: z.string().optional(),
22
+ openingId: z.string().optional(),
23
+ openingIds: z.array(z.string()).optional(),
24
+ hints: z
25
+ .array(z.object({
26
+ code: z.literal('manual-ceiling'),
27
+ openingId: z.string(),
28
+ surfaceIds: z.array(z.string()),
29
+ message: z.string(),
30
+ }))
31
+ .optional(),
32
+ idMap: z.record(z.string(), z.array(z.string())).optional(),
33
+ changes: z.number(),
34
+ separatorId: z.string().optional(),
35
+ separatorIds: z.array(z.string()).optional(),
36
+ zoneIds: z.array(z.string()).optional(),
37
+ payload: z
38
+ .object({
39
+ zoneId: z.string(),
40
+ name: z.string(),
41
+ mode: z.enum(['delete', 'merge', 'blocked']),
42
+ mergedIntoZoneId: z.string().optional(),
43
+ contents: z.enum(['delete', 'keep']),
44
+ wallIds: z.array(z.string()),
45
+ keptSharedWallIds: z.array(z.string()),
46
+ separatorIds: z.array(z.string()),
47
+ keptSharedSeparatorIds: z.array(z.string()),
48
+ openingIds: z.array(z.string()),
49
+ itemIds: z.array(z.string()),
50
+ opensZoneIds: z.array(z.string()),
51
+ })
52
+ .optional(),
53
+ conflicts: z
54
+ .array(z.object({ code: z.string(), nodeIds: z.array(z.string()), message: z.string() }))
55
+ .optional(),
56
+ ...liveSyncOutput,
57
+ };