@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
@@ -1,57 +0,0 @@
1
- import { WallNode } from '@pascal-app/core/schema';
2
- import { z } from 'zod';
3
- import { ADDITIVE_TOOL_ANNOTATIONS } from './annotations.js';
4
- import { ErrorCode, throwMcpError } from './errors.js';
5
- import { liveSyncOutput, persistencePayload, publishLiveSceneSnapshot } from './live-sync.js';
6
- import { measurement } from './measurement.js';
7
- import { NodeIdSchema, Vec2Schema } from './schemas.js';
8
- export const createWallInput = {
9
- levelId: NodeIdSchema,
10
- start: Vec2Schema,
11
- end: Vec2Schema,
12
- thickness: measurement('length', 'm', {
13
- positive: true,
14
- description: 'Wall thickness.',
15
- }).optional(),
16
- height: measurement('length', 'm', { positive: true, description: 'Wall height.' }).optional(),
17
- };
18
- export const createWallOutput = {
19
- wallId: z.string(),
20
- ...liveSyncOutput,
21
- };
22
- export function registerCreateWall(server, bridge) {
23
- server.registerTool('create_wall', {
24
- title: 'Create wall',
25
- description: 'Create a new wall on the given level between two 2D points. Thickness and height default to the core library defaults when omitted.',
26
- inputSchema: createWallInput,
27
- outputSchema: createWallOutput,
28
- annotations: ADDITIVE_TOOL_ANNOTATIONS,
29
- }, async ({ levelId, start, end, thickness, height }) => {
30
- const parent = bridge.getNode(levelId);
31
- if (!parent) {
32
- throwMcpError(ErrorCode.InvalidParams, `Level not found: ${levelId}`);
33
- }
34
- if (parent.type !== 'level') {
35
- throwMcpError(ErrorCode.InvalidParams, `Node ${levelId} is a ${parent.type}, expected level`);
36
- }
37
- if (typeof parent.metadata === 'object' &&
38
- parent.metadata !== null &&
39
- 'role' in parent.metadata &&
40
- parent.metadata.role === 'roof') {
41
- throwMcpError(ErrorCode.InvalidParams, `Roof support level ${levelId} is not an occupied story; create walls on an occupied level instead`);
42
- }
43
- const wall = WallNode.parse({
44
- start: start,
45
- end: end,
46
- ...(thickness !== undefined ? { thickness } : {}),
47
- ...(height !== undefined ? { height } : {}),
48
- });
49
- const id = bridge.createNode(wall, levelId);
50
- const persistence = await publishLiveSceneSnapshot(bridge, 'create_wall');
51
- const payload = { wallId: id, ...persistencePayload(persistence) };
52
- return {
53
- content: [{ type: 'text', text: JSON.stringify(payload) }],
54
- structuredContent: payload,
55
- };
56
- });
57
- }
@@ -1,25 +0,0 @@
1
- import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
- import { z } from 'zod';
3
- import type { SceneOperations } from '../operations/index.js';
4
- export declare const cutOpeningInput: {
5
- wallId: z.ZodString;
6
- type: z.ZodEnum<{
7
- door: "door";
8
- window: "window";
9
- }>;
10
- position: z.ZodNumber;
11
- width: z.ZodPipe<z.ZodUnion<readonly [z.ZodNumber, z.ZodString]>, z.ZodTransform<number, string | number>>;
12
- height: z.ZodPipe<z.ZodUnion<readonly [z.ZodNumber, z.ZodString]>, z.ZodTransform<number, string | number>>;
13
- };
14
- export declare const cutOpeningOutput: {
15
- persistence: z.ZodOptional<z.ZodObject<{
16
- status: z.ZodEnum<{
17
- unbound: "unbound";
18
- events_unsupported: "events_unsupported";
19
- }>;
20
- warning: z.ZodString;
21
- }, z.core.$strip>>;
22
- openingId: z.ZodString;
23
- };
24
- export declare function registerCutOpening(server: McpServer, bridge: SceneOperations): void;
25
- //# sourceMappingURL=cut-opening.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"cut-opening.d.ts","sourceRoot":"","sources":["../../src/tools/cut-opening.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AAGxE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAQpD,eAAO,MAAM,eAAe;;;;;;;;;CAM3B,CAAA;AAED,eAAO,MAAM,gBAAgB;;;;;;;;;CAG5B,CAAA;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,eAAe,GAAG,IAAI,CA0DnF"}
@@ -1,61 +0,0 @@
1
- import { DoorNode, WindowNode } from '@pascal-app/core/schema';
2
- import { z } from 'zod';
3
- import { ADDITIVE_TOOL_ANNOTATIONS } from './annotations.js';
4
- import { ErrorCode, throwMcpError } from './errors.js';
5
- import { wallLength, wallLocalXFromT } from './geometry.js';
6
- import { liveSyncOutput, persistencePayload, publishLiveSceneSnapshot } from './live-sync.js';
7
- import { measurement } from './measurement.js';
8
- import { NodeIdSchema } from './schemas.js';
9
- export const cutOpeningInput = {
10
- wallId: NodeIdSchema,
11
- type: z.enum(['door', 'window']),
12
- position: z.number().min(0).max(1),
13
- width: measurement('length', 'm', { positive: true, description: 'Opening width.' }),
14
- height: measurement('length', 'm', { positive: true, description: 'Opening height.' }),
15
- };
16
- export const cutOpeningOutput = {
17
- openingId: z.string(),
18
- ...liveSyncOutput,
19
- };
20
- export function registerCutOpening(server, bridge) {
21
- server.registerTool('cut_opening', {
22
- title: 'Cut opening',
23
- description: 'Cut a door or window opening into an existing wall. position is a parametric 0..1 offset along the wall centreline.',
24
- inputSchema: cutOpeningInput,
25
- outputSchema: cutOpeningOutput,
26
- annotations: ADDITIVE_TOOL_ANNOTATIONS,
27
- }, async ({ wallId, type, position, width, height }) => {
28
- const wall = bridge.getNode(wallId);
29
- if (!wall) {
30
- throwMcpError(ErrorCode.InvalidParams, `Wall not found: ${wallId}`);
31
- }
32
- if (wall.type !== 'wall') {
33
- throwMcpError(ErrorCode.InvalidParams, `Node ${wallId} is a ${wall.type}, expected wall`);
34
- }
35
- const length = wallLength(wall);
36
- if (length < width) {
37
- throwMcpError(ErrorCode.InvalidParams, `Wall ${wallId} is ${length.toFixed(2)}m long, too short for a ${width.toFixed(2)}m opening`);
38
- }
39
- // `position` is public MCP ergonomics: 0..1 along the wall. Door/window
40
- // nodes store wall-local meters in position[0], so convert before writing.
41
- const base = {
42
- wallId,
43
- width,
44
- height,
45
- position: [wallLocalXFromT(wall, position, width), height / 2, 0],
46
- };
47
- const opening = type === 'door'
48
- ? DoorNode.parse(base)
49
- : WindowNode.parse({
50
- ...base,
51
- position: [base.position[0], 0.9 + height / 2, 0],
52
- });
53
- const id = bridge.createNode(opening, wallId);
54
- const persistence = await publishLiveSceneSnapshot(bridge, 'cut_opening');
55
- const payload = { openingId: id, ...persistencePayload(persistence) };
56
- return {
57
- content: [{ type: 'text', text: JSON.stringify(payload) }],
58
- structuredContent: payload,
59
- };
60
- });
61
- }
@@ -1,19 +0,0 @@
1
- import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
- import { z } from 'zod';
3
- import type { SceneOperations } from '../operations/index.js';
4
- export declare const deleteNodeInput: {
5
- id: z.ZodString;
6
- cascade: z.ZodOptional<z.ZodBoolean>;
7
- };
8
- export declare const deleteNodeOutput: {
9
- persistence: z.ZodOptional<z.ZodObject<{
10
- status: z.ZodEnum<{
11
- unbound: "unbound";
12
- events_unsupported: "events_unsupported";
13
- }>;
14
- warning: z.ZodString;
15
- }, z.core.$strip>>;
16
- deletedIds: z.ZodArray<z.ZodString>;
17
- };
18
- export declare function registerDeleteNode(server: McpServer, bridge: SceneOperations): void;
19
- //# sourceMappingURL=delete-node.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"delete-node.d.ts","sourceRoot":"","sources":["../../src/tools/delete-node.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AAExE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAMpD,eAAO,MAAM,eAAe;;;CAG3B,CAAA;AAED,eAAO,MAAM,gBAAgB;;;;;;;;;CAG5B,CAAA;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,eAAe,GAAG,IAAI,CA8BnF"}
@@ -1,40 +0,0 @@
1
- import { z } from 'zod';
2
- import { DESTRUCTIVE_TOOL_ANNOTATIONS } from './annotations.js';
3
- import { ErrorCode, throwMcpError } from './errors.js';
4
- import { liveSyncOutput, persistencePayload, publishLiveSceneSnapshot } from './live-sync.js';
5
- import { NodeIdSchema } from './schemas.js';
6
- export const deleteNodeInput = {
7
- id: NodeIdSchema,
8
- cascade: z.boolean().optional(),
9
- };
10
- export const deleteNodeOutput = {
11
- deletedIds: z.array(z.string()),
12
- ...liveSyncOutput,
13
- };
14
- export function registerDeleteNode(server, bridge) {
15
- server.registerTool('delete_node', {
16
- title: 'Delete node',
17
- description: 'Delete a node. If it has children, pass `cascade: true` to delete descendants recursively.',
18
- inputSchema: deleteNodeInput,
19
- outputSchema: deleteNodeOutput,
20
- annotations: DESTRUCTIVE_TOOL_ANNOTATIONS,
21
- }, async ({ id, cascade }) => {
22
- const node = bridge.getNode(id);
23
- if (!node) {
24
- throwMcpError(ErrorCode.InvalidParams, `Node not found: ${id}`);
25
- }
26
- try {
27
- const removed = bridge.deleteNode(id, cascade ?? false);
28
- const persistence = await publishLiveSceneSnapshot(bridge, 'delete_node');
29
- const payload = { deletedIds: removed, ...persistencePayload(persistence) };
30
- return {
31
- content: [{ type: 'text', text: JSON.stringify(payload) }],
32
- structuredContent: payload,
33
- };
34
- }
35
- catch (err) {
36
- const msg = err instanceof Error ? err.message : String(err);
37
- throwMcpError(ErrorCode.InvalidRequest, msg);
38
- }
39
- });
40
- }
@@ -1,17 +0,0 @@
1
- import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
- import { z } from 'zod';
3
- import type { SceneOperations } from '../operations/index.js';
4
- export declare const describeNodeInput: {
5
- id: z.ZodString;
6
- };
7
- export declare const describeNodeOutput: {
8
- id: z.ZodString;
9
- type: z.ZodString;
10
- parentId: z.ZodNullable<z.ZodString>;
11
- ancestryIds: z.ZodArray<z.ZodString>;
12
- childrenIds: z.ZodArray<z.ZodString>;
13
- properties: z.ZodRecord<z.ZodString, z.ZodUnknown>;
14
- description: z.ZodString;
15
- };
16
- export declare function registerDescribeNode(server: McpServer, bridge: SceneOperations): void;
17
- //# sourceMappingURL=describe-node.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"describe-node.d.ts","sourceRoot":"","sources":["../../src/tools/describe-node.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AAGxE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAMpD,eAAO,MAAM,iBAAiB;;CAE7B,CAAA;AAED,eAAO,MAAM,kBAAkB;;;;;;;;CAQ9B,CAAA;AA0CD,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,eAAe,GAAG,IAAI,CAiDrF"}
@@ -1,97 +0,0 @@
1
- import { resolveCeilingHeight } from '@pascal-app/core';
2
- import { z } from 'zod';
3
- import { READ_ONLY_TOOL_ANNOTATIONS } from './annotations.js';
4
- import { ErrorCode, throwMcpError } from './errors.js';
5
- import { resolveReportedWallHeight } from './scene-query.js';
6
- import { NodeIdSchema } from './schemas.js';
7
- export const describeNodeInput = {
8
- id: NodeIdSchema,
9
- };
10
- export const describeNodeOutput = {
11
- id: z.string(),
12
- type: z.string(),
13
- parentId: z.string().nullable(),
14
- ancestryIds: z.array(z.string()),
15
- childrenIds: z.array(z.string()),
16
- properties: z.record(z.string(), z.unknown()),
17
- description: z.string(),
18
- };
19
- /**
20
- * Build a short, human-readable one-liner describing the node.
21
- * Covers the common shapes; falls back to a generic sentence otherwise.
22
- */
23
- function describe(node, bridge) {
24
- switch (node.type) {
25
- case 'wall': {
26
- const [x1, z1] = node.start;
27
- const [x2, z2] = node.end;
28
- const t = node.thickness ?? 0.1;
29
- const h = resolveReportedWallHeight(bridge, node);
30
- return `Wall from (${x1},${z1}) to (${x2},${z2}), thickness ${t.toFixed(2)}m, height ${h.toFixed(2)}m`;
31
- }
32
- case 'level':
33
- return `Level ${node.level}`;
34
- case 'building': {
35
- const [x, y, z] = node.position;
36
- return `Building at (${x},${y},${z})`;
37
- }
38
- case 'site':
39
- return `Site with ${node.polygon?.points.length ?? 0}-sided property line`;
40
- case 'zone':
41
- return `Zone "${node.name}" with ${node.polygon.length} vertices`;
42
- case 'slab':
43
- return `Slab with ${node.polygon.length} vertices`;
44
- case 'ceiling':
45
- return `Ceiling with ${node.polygon.length} vertices, height ${resolveCeilingHeight(node, bridge.getNodes()).toFixed(2)}m`;
46
- case 'door':
47
- return `Door (${node.width.toFixed(2)}m x ${node.height.toFixed(2)}m)`;
48
- case 'window':
49
- return `Window (${node.width.toFixed(2)}m x ${node.height.toFixed(2)}m)`;
50
- case 'item': {
51
- const [x, y, z] = node.position;
52
- return `Item "${node.asset.name}" at (${x},${y},${z})`;
53
- }
54
- default:
55
- return `${node.type} node`;
56
- }
57
- }
58
- export function registerDescribeNode(server, bridge) {
59
- server.registerTool('describe_node', {
60
- title: 'Describe node',
61
- description: 'Return a structured summary of a node including its ancestry, children IDs, key properties, and a short human description.',
62
- inputSchema: describeNodeInput,
63
- outputSchema: describeNodeOutput,
64
- annotations: READ_ONLY_TOOL_ANNOTATIONS,
65
- }, async ({ id }) => {
66
- const node = bridge.getNode(id);
67
- if (!node) {
68
- throwMcpError(ErrorCode.InvalidParams, `Node not found: ${id}`);
69
- }
70
- // Ancestry minus self.
71
- const ancestry = bridge.getAncestry(id);
72
- const ancestryIds = ancestry.slice(1).map((n) => n.id);
73
- const children = bridge.getChildren(id);
74
- const childrenIds = children.map((n) => n.id);
75
- const n = node;
76
- const properties = n.type === 'wall'
77
- ? {
78
- ...n,
79
- resolvedHeight: resolveReportedWallHeight(bridge, n),
80
- heightIsExplicit: n.height !== undefined,
81
- }
82
- : n;
83
- const payload = {
84
- id: n.id,
85
- type: n.type,
86
- parentId: (n.parentId ?? null),
87
- ancestryIds,
88
- childrenIds,
89
- properties: properties,
90
- description: describe(n, bridge),
91
- };
92
- return {
93
- content: [{ type: 'text', text: JSON.stringify(payload) }],
94
- structuredContent: payload,
95
- };
96
- });
97
- }
@@ -1,135 +0,0 @@
1
- /**
2
- * Door access keep-outs for MCP layout tools.
3
- *
4
- * Furniture that overlaps a door clear zone is reported as blocking the door.
5
- * Used by furnish_room (skip placements) and verify_scene (layout issues).
6
- *
7
- * See docs/layout-clearance-error-log.md for pitfalls (levels, gap sign, scale).
8
- */
9
- import { type AnyNode } from '@pascal-app/core/schema';
10
- import { type Vec2 } from './geometry.js';
11
- export type PlanAabb = {
12
- minX: number;
13
- maxX: number;
14
- minZ: number;
15
- maxZ: number;
16
- };
17
- export type ItemFootprintFailureReason = 'missing_dimensions' | 'non_finite_position' | 'non_finite_rotation' | 'non_finite_dimensions' | 'non_positive_plan_dimensions' | 'non_finite_scale' | 'zero_plan_scale' | 'non_planar_rotation' | 'unsupported_attachment';
18
- export type ItemFootprintInspection = {
19
- ok: true;
20
- aabb: PlanAabb;
21
- sourceDimensions: [number, number, number];
22
- effectiveDimensions: [number, number, number];
23
- rotationY: number;
24
- } | {
25
- ok: false;
26
- reason: ItemFootprintFailureReason;
27
- };
28
- export type DoorKeepout = {
29
- doorId: string;
30
- wallId: string;
31
- levelId: string | null;
32
- /** World-space AABB on both sides of the wall opening. */
33
- aabb: PlanAabb;
34
- width: number;
35
- localX: number;
36
- };
37
- /**
38
- * Wall shape these helpers accept. Deliberately structural rather than
39
- * `Pick<WallNode, …>`: `keepoutForPolygonEdge` feeds in synthetic `edge-N`
40
- * segments for room edges that do not have a wall node yet, so the id cannot
41
- * be the branded `wall_${string}`.
42
- */
43
- export type WallSegmentLike = {
44
- id: string;
45
- start: Vec2;
46
- end: Vec2;
47
- };
48
- /**
49
- * Door shape these helpers accept — a real `DoorNode` or a planned opening.
50
- * `Pick<AnyNode, 'position' | 'width'>` does not work: those keys exist on
51
- * only some members of the `AnyNode` union, so `Pick` rejects them.
52
- */
53
- export type DoorOpeningLike = {
54
- id: string;
55
- position?: readonly number[];
56
- width?: number;
57
- };
58
- /** Plan depth (m) cleared on each side of the wall face through the opening. */
59
- export declare const DEFAULT_DOOR_CLEAR_DEPTH = 0.65;
60
- /** Extra half-width (m) beyond the door leaf along the wall. */
61
- export declare const DEFAULT_DOOR_SIDE_PAD = 0.05;
62
- /**
63
- * True when A and B come closer than `gap` meters (including penetration).
64
- * `gap` is the **minimum free space required** between boxes:
65
- * expand each box by gap/2, then test intersection.
66
- */
67
- export declare function aabbsOverlap(a: PlanAabb, b: PlanAabb, gap?: number): boolean;
68
- /**
69
- * Walk parentId chain to the enclosing level id (pure; no bridge required).
70
- */
71
- export declare function resolveNodeLevelId(nodeId: string, byId: Map<string, AnyNode>): string | null;
72
- /**
73
- * Axis-aligned item footprint in plan (x/z), rotation-aware.
74
- * Prefer scaled dimensions when the node is available.
75
- */
76
- export declare function itemPlanAabb(position: [number, number, number] | number[], dimensions: [number, number, number] | number[] | undefined, rotationYRad?: number): PlanAabb;
77
- /** Scaled plan footprint used by legacy placement and door-clearance callers. */
78
- export declare function itemNodePlanAabb(node: AnyNode): PlanAabb | null;
79
- export declare function inspectItemPlanFootprint(node: Extract<AnyNode, {
80
- type: 'item';
81
- }>, options?: {
82
- floorOnly?: boolean;
83
- }): ItemFootprintInspection;
84
- /**
85
- * Build a rectangular keep-out around a wall door, extruded perpendicular to the wall
86
- * on both faces so either swing side is protected.
87
- */
88
- export declare function doorKeepoutFromWall(wall: WallSegmentLike, door: DoorOpeningLike, options?: {
89
- clearDepth?: number;
90
- sidePad?: number;
91
- levelId?: string | null;
92
- }): DoorKeepout | null;
93
- export declare function collectDoorKeepouts(nodes: Iterable<AnyNode>, options?: {
94
- clearDepth?: number;
95
- sidePad?: number;
96
- levelId?: string;
97
- }): DoorKeepout[];
98
- export declare function itemBlocksDoorKeepout(itemAabb: PlanAabb, keepout: DoorKeepout): boolean;
99
- export type BlockedDoorIssue = {
100
- doorId: string;
101
- wallId: string;
102
- itemId: string;
103
- levelId?: string | null;
104
- itemName?: string;
105
- message: string;
106
- };
107
- export declare function findBlockedDoors(args: {
108
- nodes: Iterable<AnyNode>;
109
- clearDepth?: number;
110
- sidePad?: number;
111
- /** When set, only doors and items on this level are considered. */
112
- levelId?: string;
113
- }): BlockedDoorIssue[];
114
- /**
115
- * Synthetic keep-outs for a room polygon edge that will host a door (before doors exist).
116
- * Used by furnish_room when doorWallIndex is known.
117
- */
118
- export declare function keepoutForPolygonEdge(polygon: Vec2[], edgeIndex: number, options?: {
119
- t?: number;
120
- width?: number;
121
- clearDepth?: number;
122
- sidePad?: number;
123
- }): PlanAabb | null;
124
- /**
125
- * Whether an existing keep-out already covers this room-edge planned zone
126
- * (so we do not double-count a real door on that edge).
127
- *
128
- * Requires the planned keep-out **center** to lie inside the existing keep-out,
129
- * and the existing box to cover a large fraction of the planned area.
130
- * Plain AABB overlap is not enough (nearby hallway doors must not suppress
131
- * this room's entrance keep-out).
132
- */
133
- export declare function keepoutCoversPlanned(existing: PlanAabb, planned: PlanAabb): boolean;
134
- export declare function aabbFromPlan(a: PlanAabb): PlanAabb;
135
- //# sourceMappingURL=door-clearance.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"door-clearance.d.ts","sourceRoot":"","sources":["../../src/tools/door-clearance.ts"],"names":[],"mappings":"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"}