@pascal-app/mcp 1.0.4 → 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 (244) hide show
  1. package/CHANGELOG.md +76 -0
  2. package/README.md +166 -62
  3. package/dist/bin/pascal-mcp.js +1 -1
  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 +3 -0
  10. package/dist/bridge/scene-bridge.d.ts.map +1 -1
  11. package/dist/bridge/scene-bridge.js +7 -0
  12. package/dist/lib/safe-fetch.d.ts +22 -4
  13. package/dist/lib/safe-fetch.d.ts.map +1 -1
  14. package/dist/lib/safe-fetch.js +233 -134
  15. package/dist/operations/scene-operations.d.ts +18 -0
  16. package/dist/operations/scene-operations.d.ts.map +1 -1
  17. package/dist/operations/scene-operations.js +11 -0
  18. package/dist/prompts/from-brief.d.ts +1 -1
  19. package/dist/prompts/from-brief.d.ts.map +1 -1
  20. package/dist/prompts/from-brief.js +3 -3
  21. package/dist/prompts/index.d.ts +1 -1
  22. package/dist/prompts/index.d.ts.map +1 -1
  23. package/dist/prompts/iterate-on-feedback.d.ts +1 -1
  24. package/dist/prompts/iterate-on-feedback.d.ts.map +1 -1
  25. package/dist/prompts/iterate-on-feedback.js +2 -2
  26. package/dist/prompts/renovation-from-photos.d.ts +1 -1
  27. package/dist/prompts/renovation-from-photos.d.ts.map +1 -1
  28. package/dist/prompts/renovation-from-photos.js +2 -2
  29. package/dist/prompts/scene-guidance.d.ts.map +1 -1
  30. package/dist/prompts/scene-guidance.js +10 -3
  31. package/dist/resources/agent-guide.d.ts +1 -1
  32. package/dist/resources/agent-guide.d.ts.map +1 -1
  33. package/dist/resources/agent-guide.js +52 -44
  34. package/dist/resources/catalog-items.d.ts +1 -1
  35. package/dist/resources/catalog-items.d.ts.map +1 -1
  36. package/dist/resources/constraints.d.ts +1 -1
  37. package/dist/resources/constraints.d.ts.map +1 -1
  38. package/dist/resources/constraints.js +1 -1
  39. package/dist/resources/design-schema.d.ts +1 -1
  40. package/dist/resources/design-schema.d.ts.map +1 -1
  41. package/dist/resources/index.d.ts +1 -1
  42. package/dist/resources/index.d.ts.map +1 -1
  43. package/dist/resources/scene-current.d.ts +1 -1
  44. package/dist/resources/scene-current.d.ts.map +1 -1
  45. package/dist/resources/scene-summary.d.ts +1 -1
  46. package/dist/resources/scene-summary.d.ts.map +1 -1
  47. package/dist/server.d.ts +7 -2
  48. package/dist/server.d.ts.map +1 -1
  49. package/dist/server.js +59 -21
  50. package/dist/storage/disk-artifact-store.d.ts.map +1 -1
  51. package/dist/storage/sqlite-scene-store.d.ts +1 -1
  52. package/dist/storage/sqlite-scene-store.d.ts.map +1 -1
  53. package/dist/storage/types.d.ts +4 -4
  54. package/dist/storage/types.d.ts.map +1 -1
  55. package/dist/templates/empty-studio.d.ts +3 -3
  56. package/dist/templates/empty-studio.d.ts.map +1 -1
  57. package/dist/templates/garden-house.d.ts +3 -3
  58. package/dist/templates/garden-house.d.ts.map +1 -1
  59. package/dist/templates/index.d.ts.map +1 -1
  60. package/dist/templates/two-bedroom.d.ts +3 -3
  61. package/dist/templates/two-bedroom.d.ts.map +1 -1
  62. package/dist/tools/add-column.d.ts +1 -1
  63. package/dist/tools/add-column.d.ts.map +1 -1
  64. package/dist/tools/add-column.js +3 -2
  65. package/dist/tools/add-object.d.ts +19 -3
  66. package/dist/tools/add-object.d.ts.map +1 -1
  67. package/dist/tools/add-object.js +66 -35
  68. package/dist/tools/annotations.d.ts.map +1 -1
  69. package/dist/tools/apply-patch.d.ts +6 -2
  70. package/dist/tools/apply-patch.d.ts.map +1 -1
  71. package/dist/tools/apply-patch.js +13 -8
  72. package/dist/tools/asset-catalog.d.ts.map +1 -1
  73. package/dist/tools/asset-catalog.js +23 -0
  74. package/dist/tools/author-scene.d.ts +10 -0
  75. package/dist/tools/author-scene.d.ts.map +1 -0
  76. package/dist/tools/author-scene.js +140 -0
  77. package/dist/tools/check-collisions.d.ts +6 -6
  78. package/dist/tools/check-collisions.d.ts.map +1 -1
  79. package/dist/tools/check-collisions.js +6 -6
  80. package/dist/tools/clear-scene.d.ts +1 -1
  81. package/dist/tools/clear-scene.d.ts.map +1 -1
  82. package/dist/tools/clear-scene.js +3 -3
  83. package/dist/tools/collections.d.ts +1 -1
  84. package/dist/tools/collections.d.ts.map +1 -1
  85. package/dist/tools/collections.js +3 -2
  86. package/dist/tools/construction-tools.d.ts +6 -49
  87. package/dist/tools/construction-tools.d.ts.map +1 -1
  88. package/dist/tools/construction-tools.js +9 -158
  89. package/dist/tools/create-unit.d.ts +3 -3
  90. package/dist/tools/create-unit.d.ts.map +1 -1
  91. package/dist/tools/create-unit.js +2 -2
  92. package/dist/tools/errors.d.ts +5 -5
  93. package/dist/tools/errors.d.ts.map +1 -1
  94. package/dist/tools/errors.js +4 -4
  95. package/dist/tools/export-glb.d.ts +1 -1
  96. package/dist/tools/export-glb.d.ts.map +1 -1
  97. package/dist/tools/export-glb.js +2 -2
  98. package/dist/tools/export-json.d.ts +1 -1
  99. package/dist/tools/export-json.d.ts.map +1 -1
  100. package/dist/tools/export-json.js +2 -2
  101. package/dist/tools/get-scene.d.ts +1 -1
  102. package/dist/tools/get-scene.d.ts.map +1 -1
  103. package/dist/tools/get-scene.js +2 -2
  104. package/dist/tools/hosted-services.d.ts +1 -1
  105. package/dist/tools/hosted-services.d.ts.map +1 -1
  106. package/dist/tools/hosted-services.js +13 -3
  107. package/dist/tools/index.d.ts +4 -3
  108. package/dist/tools/index.d.ts.map +1 -1
  109. package/dist/tools/index.js +8 -13
  110. package/dist/tools/level-height-guard.d.ts +2 -0
  111. package/dist/tools/level-height-guard.d.ts.map +1 -0
  112. package/dist/tools/level-height-guard.js +11 -0
  113. package/dist/tools/list-units.d.ts +2 -2
  114. package/dist/tools/list-units.d.ts.map +1 -1
  115. package/dist/tools/list-units.js +2 -2
  116. package/dist/tools/live-sync.d.ts +1 -1
  117. package/dist/tools/live-sync.d.ts.map +1 -1
  118. package/dist/tools/live-sync.js +4 -4
  119. package/dist/tools/measure.d.ts +1 -1
  120. package/dist/tools/measure.d.ts.map +1 -1
  121. package/dist/tools/measure.js +7 -7
  122. package/dist/tools/node-world-point.d.ts +1 -1
  123. package/dist/tools/node-world-point.d.ts.map +1 -1
  124. package/dist/tools/normalize-schema-dialect.d.ts +1 -1
  125. package/dist/tools/normalize-schema-dialect.d.ts.map +1 -1
  126. package/dist/tools/normalize-schema-dialect.js +2 -3
  127. package/dist/tools/patch-guards.d.ts +6 -4
  128. package/dist/tools/patch-guards.d.ts.map +1 -1
  129. package/dist/tools/patch-guards.js +5 -2
  130. package/dist/tools/photo-to-scene/index.d.ts +1 -1
  131. package/dist/tools/photo-to-scene/index.d.ts.map +1 -1
  132. package/dist/tools/photo-to-scene/photo-to-scene.d.ts +3 -3
  133. package/dist/tools/photo-to-scene/photo-to-scene.d.ts.map +1 -1
  134. package/dist/tools/photo-to-scene/photo-to-scene.js +7 -7
  135. package/dist/tools/project-files.d.ts +4 -0
  136. package/dist/tools/project-files.d.ts.map +1 -0
  137. package/dist/tools/project-files.js +30 -0
  138. package/dist/tools/redo.d.ts +2 -2
  139. package/dist/tools/redo.d.ts.map +1 -1
  140. package/dist/tools/redo.js +2 -2
  141. package/dist/tools/retired-tools.d.ts +10 -0
  142. package/dist/tools/retired-tools.d.ts.map +1 -0
  143. package/dist/tools/retired-tools.js +22 -0
  144. package/dist/tools/roof-level-guard.d.ts +2 -0
  145. package/dist/tools/roof-level-guard.d.ts.map +1 -0
  146. package/dist/tools/roof-level-guard.js +22 -0
  147. package/dist/tools/room-tools.d.ts +47 -46
  148. package/dist/tools/room-tools.d.ts.map +1 -1
  149. package/dist/tools/room-tools.js +6 -5
  150. package/dist/tools/scene-lifecycle/create-project.d.ts +1 -1
  151. package/dist/tools/scene-lifecycle/create-project.d.ts.map +1 -1
  152. package/dist/tools/scene-lifecycle/create-project.js +5 -5
  153. package/dist/tools/scene-lifecycle/delete-scene.d.ts +1 -1
  154. package/dist/tools/scene-lifecycle/delete-scene.d.ts.map +1 -1
  155. package/dist/tools/scene-lifecycle/delete-scene.js +6 -6
  156. package/dist/tools/scene-lifecycle/get-project-status.d.ts +1 -1
  157. package/dist/tools/scene-lifecycle/get-project-status.d.ts.map +1 -1
  158. package/dist/tools/scene-lifecycle/get-project-status.js +6 -6
  159. package/dist/tools/scene-lifecycle/index.d.ts +1 -1
  160. package/dist/tools/scene-lifecycle/index.d.ts.map +1 -1
  161. package/dist/tools/scene-lifecycle/list-scenes.d.ts +1 -1
  162. package/dist/tools/scene-lifecycle/list-scenes.d.ts.map +1 -1
  163. package/dist/tools/scene-lifecycle/list-scenes.js +4 -4
  164. package/dist/tools/scene-lifecycle/load-scene.d.ts +2 -2
  165. package/dist/tools/scene-lifecycle/load-scene.d.ts.map +1 -1
  166. package/dist/tools/scene-lifecycle/load-scene.js +5 -5
  167. package/dist/tools/scene-lifecycle/metadata.d.ts +1 -1
  168. package/dist/tools/scene-lifecycle/rename-scene.d.ts +1 -1
  169. package/dist/tools/scene-lifecycle/rename-scene.d.ts.map +1 -1
  170. package/dist/tools/scene-lifecycle/rename-scene.js +6 -6
  171. package/dist/tools/scene-lifecycle/save-scene.d.ts +5 -3
  172. package/dist/tools/scene-lifecycle/save-scene.d.ts.map +1 -1
  173. package/dist/tools/scene-lifecycle/save-scene.js +80 -12
  174. package/dist/tools/scene-lifecycle/test-utils.d.ts +1 -1
  175. package/dist/tools/scene-lifecycle/test-utils.d.ts.map +1 -1
  176. package/dist/tools/set-unit-members.d.ts +2 -2
  177. package/dist/tools/set-unit-members.d.ts.map +1 -1
  178. package/dist/tools/set-unit-members.js +6 -6
  179. package/dist/tools/set-zone.d.ts +2 -2
  180. package/dist/tools/set-zone.d.ts.map +1 -1
  181. package/dist/tools/set-zone.js +30 -18
  182. package/dist/tools/shared-tools.d.ts +15 -5
  183. package/dist/tools/shared-tools.d.ts.map +1 -1
  184. package/dist/tools/shared-tools.js +242 -29
  185. package/dist/tools/structure-tools.d.ts +3 -3
  186. package/dist/tools/templates/create-from-template.d.ts +2 -2
  187. package/dist/tools/templates/create-from-template.d.ts.map +1 -1
  188. package/dist/tools/templates/create-from-template.js +6 -6
  189. package/dist/tools/templates/create-house-from-brief.d.ts +1 -1
  190. package/dist/tools/templates/create-house-from-brief.d.ts.map +1 -1
  191. package/dist/tools/templates/create-house-from-brief.js +6 -6
  192. package/dist/tools/templates/index.d.ts +1 -1
  193. package/dist/tools/templates/index.d.ts.map +1 -1
  194. package/dist/tools/templates/list-templates.d.ts +1 -1
  195. package/dist/tools/templates/list-templates.d.ts.map +1 -1
  196. package/dist/tools/templates/list-templates.js +2 -2
  197. package/dist/tools/undo.d.ts +2 -2
  198. package/dist/tools/undo.d.ts.map +1 -1
  199. package/dist/tools/undo.js +2 -2
  200. package/dist/tools/unit-members.d.ts.map +1 -1
  201. package/dist/tools/unit-members.js +6 -6
  202. package/dist/tools/variants/generate-variants.d.ts +6 -6
  203. package/dist/tools/variants/generate-variants.d.ts.map +1 -1
  204. package/dist/tools/variants/generate-variants.js +6 -6
  205. package/dist/tools/variants/index.d.ts +1 -1
  206. package/dist/tools/variants/index.d.ts.map +1 -1
  207. package/dist/tools/view-scene.d.ts +8 -2
  208. package/dist/tools/view-scene.d.ts.map +1 -1
  209. package/dist/tools/view-scene.js +17 -5
  210. package/dist/tools/vision/analyze-floorplan-image.d.ts +1 -1
  211. package/dist/tools/vision/analyze-floorplan-image.d.ts.map +1 -1
  212. package/dist/tools/vision/analyze-floorplan-image.js +7 -7
  213. package/dist/tools/vision/analyze-room-photo.d.ts +1 -1
  214. package/dist/tools/vision/analyze-room-photo.d.ts.map +1 -1
  215. package/dist/tools/vision/analyze-room-photo.js +7 -7
  216. package/dist/tools/vision/index.d.ts +1 -1
  217. package/dist/tools/vision/index.d.ts.map +1 -1
  218. package/dist/transports/http.d.ts +8 -2
  219. package/dist/transports/http.d.ts.map +1 -1
  220. package/dist/transports/http.js +9 -3
  221. package/dist/transports/stdio.d.ts +15 -9
  222. package/dist/transports/stdio.d.ts.map +1 -1
  223. package/dist/transports/stdio.js +18 -11
  224. package/examples/coordinate-conventions-demo.md +12 -13
  225. package/examples/embed-in-agent.ts +5 -6
  226. package/examples/generate-apartment.md +4 -4
  227. package/examples/photo-to-scene.md +2 -3
  228. package/examples/renovate-from-photos.md +3 -5
  229. package/package.json +13 -9
  230. package/dist/tools/describe-node.d.ts +0 -17
  231. package/dist/tools/describe-node.d.ts.map +0 -1
  232. package/dist/tools/describe-node.js +0 -99
  233. package/dist/tools/find-nodes.d.ts +0 -16
  234. package/dist/tools/find-nodes.d.ts.map +0 -1
  235. package/dist/tools/find-nodes.js +0 -204
  236. package/dist/tools/place-design.d.ts +0 -34
  237. package/dist/tools/place-design.d.ts.map +0 -1
  238. package/dist/tools/place-design.js +0 -91
  239. package/dist/tools/validate-design.d.ts +0 -136
  240. package/dist/tools/validate-design.d.ts.map +0 -1
  241. package/dist/tools/validate-design.js +0 -28
  242. package/dist/tools/validate-scene.d.ts +0 -19
  243. package/dist/tools/validate-scene.d.ts.map +0 -1
  244. package/dist/tools/validate-scene.js +0 -28
package/dist/server.js CHANGED
@@ -1,4 +1,5 @@
1
- import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
1
+ import { McpServer, ProtocolError, ProtocolErrorCode, } from '@modelcontextprotocol/server';
2
+ import { recordMade, } from '@pascal-app/core/agent-operations';
2
3
  import { createSceneOperations } from './operations/index.js';
3
4
  import { registerPrompts } from './prompts/index.js';
4
5
  import { registerResources } from './resources/index.js';
@@ -6,46 +7,83 @@ import { registerTools } from './tools/index.js';
6
7
  import { cachedCatalog } from './tools/asset-catalog.js';
7
8
  import { registerHostedServiceTools } from './tools/hosted-services.js';
8
9
  import { normalizeToolSchemaDialect } from './tools/normalize-schema-dialect.js';
10
+ import { registerProjectFileTools } from './tools/project-files.js';
11
+ import { answerRetiredTools } from './tools/retired-tools.js';
9
12
  import { registerVisionTools } from './tools/vision/index.js';
10
13
  import { version } from './version.js';
11
14
  export function createPascalMcpServer(opts) {
12
15
  // A client shows these before the agent's first call.
13
- const server = new McpServer({ name: opts.name ?? 'pascal-mcp-server', version: opts.version ?? version }, opts.instructions ? { instructions: opts.instructions } : undefined);
14
- if (opts.executeTool)
15
- installToolExecutor(server, opts.executeTool);
16
+ const server = new McpServer({ name: opts.name ?? 'pascal-mcp-server', version: opts.version ?? version }, {
17
+ instructions: `Pascal builds and edits 3D buildings; the agent guide is the resource pascal://agent-guide.${opts.instructions ? `\n${opts.instructions}` : ''}`,
18
+ });
19
+ answerInvalidInputWithCode(server);
16
20
  const operations = opts.operations ?? createSceneOperations({ bridge: opts.bridge, store: opts.store });
21
+ const executeTool = recordingWhatToolsMake(operations, opts.executeTool);
22
+ if (executeTool)
23
+ installToolExecutor(server, executeTool);
17
24
  const catalog = opts.catalog ? cachedCatalog(opts.catalog) : undefined;
18
25
  registerTools(server, operations, {
19
26
  catalog,
20
27
  geometryScripts: opts.geometryScripts,
21
28
  sceneViews: opts.sceneViews,
29
+ assetViews: opts.assetViews,
22
30
  });
23
31
  registerVisionTools(server, operations);
24
32
  if (opts.services)
25
33
  registerHostedServiceTools(server, opts.services);
34
+ if (opts.files)
35
+ registerProjectFileTools(server, opts.files);
26
36
  registerResources(server, operations, catalog);
27
37
  registerPrompts(server, operations);
28
38
  normalizeToolSchemaDialect(server);
39
+ answerRetiredTools(server);
29
40
  return server;
30
41
  }
42
+ /**
43
+ * Arguments a tool's schema rejects come back with the code `invalid_input`, as every other refusal
44
+ * names its code and as the chat answers them: the SDK's own answer is a bare message. The SDK
45
+ * checks the arguments in its server's validateToolInput and turns what it throws into the tool's
46
+ * error text, so a JSON message carries the code; `server-invalid-input.test` fails if an SDK upgrade
47
+ * moves that check.
48
+ */
49
+ function answerInvalidInputWithCode(server) {
50
+ const sdk = server;
51
+ const validate = sdk.validateToolInput.bind(server);
52
+ sdk.validateToolInput = async (tool, args, name) => {
53
+ try {
54
+ return await validate(tool, args, name);
55
+ }
56
+ catch (error) {
57
+ if (!(error instanceof ProtocolError && error.code === ProtocolErrorCode.InvalidParams))
58
+ throw error;
59
+ throw new Error(JSON.stringify({
60
+ error: error.message,
61
+ code: 'invalid_input',
62
+ }));
63
+ }
64
+ };
65
+ }
66
+ /**
67
+ * Inside the host's executor, so that what a call made is in the session by the time the host
68
+ * saves it: every tool that writes, however it writes, leaves what it created with the agent's
69
+ * session, and the first call of any kind begins it.
70
+ */
71
+ function recordingWhatToolsMake(operations, outer) {
72
+ const session = operations.agentSession;
73
+ if (!session)
74
+ return outer;
75
+ const recording = (input) => recordMade({
76
+ getNodes: () => operations.getNodes(),
77
+ readSession: () => session.read(),
78
+ keep: (keep) => session.keep(keep),
79
+ }, input.execute);
80
+ return outer ? (input) => outer({ ...input, execute: () => recording(input) }) : recording;
81
+ }
31
82
  function installToolExecutor(server, executeTool) {
32
83
  const registerTool = server.registerTool.bind(server);
33
- const wrappedRegisterTool = (name, config, callback) => {
34
- const runtimeCallback = callback;
35
- const registration = registerTool(name, config, wrapToolCallback(name, runtimeCallback, executeTool));
36
- return wrapRegisteredTool(registration, name, runtimeCallback, executeTool);
37
- };
38
- server.registerTool = wrappedRegisterTool;
39
- const tool = server.tool.bind(server);
40
- server.tool = ((name, ...args) => {
41
- const callback = args.at(-1);
42
- if (typeof callback !== 'function') {
43
- return Reflect.apply(tool, undefined, [name, ...args]);
44
- }
45
- const runtimeCallback = callback;
46
- args[args.length - 1] = wrapToolCallback(name, runtimeCallback, executeTool);
47
- const registration = Reflect.apply(tool, undefined, [name, ...args]);
48
- return wrapRegisteredTool(registration, name, runtimeCallback, executeTool);
84
+ server.registerTool = ((name, config, callback) => {
85
+ const registration = registerTool(name, config, wrapToolCallback(name, callback, executeTool));
86
+ return wrapRegisteredTool(registration, name, callback, executeTool);
49
87
  });
50
88
  }
51
89
  function wrapToolCallback(name, callback, executeTool) {
@@ -77,5 +115,5 @@ function wrapRegisteredTool(registration, initialName, initialCallback, executeT
77
115
  return registration;
78
116
  }
79
117
  function toolRequestSignal(args) {
80
- return args.at(-1).signal;
118
+ return args.at(-1).mcpReq.signal;
81
119
  }
@@ -1 +1 @@
1
- {"version":3,"file":"disk-artifact-store.d.ts","sourceRoot":"","sources":["../../src/storage/disk-artifact-store.ts"],"names":[],"mappings":"AAIA,4DAA4D;AAC5D,qBAAa,iBAAiB;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;gBAEd,WAAW,EAAE,MAAM;IAI/B,OAAO,CAAC,IAAI;IAKN,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,GAAG,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAmBnE,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;CAQvD"}
1
+ {"version":3,"file":"disk-artifact-store.d.ts","sourceRoot":"","sources":["../../src/storage/disk-artifact-store.ts"],"names":[],"mappings":"AAIA,4DAA4D;AAC5D,qBAAa,iBAAiB;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAE1B,YAAY,WAAW,EAAE,MAAM,EAE9B;IAED,OAAO,CAAC,IAAI;IAKN,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,GAAG,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAiBxE;IAEK,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAOrD;CACF"}
@@ -25,7 +25,7 @@ export declare function resolveDefaultDatabasePath(env?: NodeJS.ProcessEnv): str
25
25
  * so a local editor and MCP process can safely share scenes on one machine.
26
26
  */
27
27
  export declare class SqliteSceneStore implements SceneStore {
28
- readonly backend: "sqlite";
28
+ readonly backend: 'sqlite';
29
29
  readonly databasePath: string;
30
30
  private readonly maxSceneBytes;
31
31
  private readonly projectPlaceholders;
@@ -1 +1 @@
1
- {"version":3,"file":"sqlite-scene-store.d.ts","sourceRoot":"","sources":["../../src/storage/sqlite-scene-store.ts"],"names":[],"mappings":"AAQA,OAAO,EACL,KAAK,oBAAoB,EACzB,KAAK,aAAa,EAClB,KAAK,iBAAiB,EACtB,KAAK,UAAU,EACf,KAAK,uBAAuB,EAC5B,KAAK,qBAAqB,EAE1B,KAAK,gBAAgB,EACrB,KAAK,SAAS,EACd,KAAK,kBAAkB,EAEvB,KAAK,gBAAgB,EACrB,KAAK,UAAU,EAGf,KAAK,cAAc,EACpB,MAAM,SAAS,CAAA;AAOhB,MAAM,WAAW,uBAAuB;IACtC,sEAAsE;IACtE,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,wEAAwE;IACxE,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAA;IACvB,kEAAkE;IAClE,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB;AAgDD;;;;;;;;;GASG;AACH,wBAAgB,0BAA0B,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,CAmBvF;AAkKD;;;;;GAKG;AACH,qBAAa,gBAAiB,YAAW,UAAU;IACjD,QAAQ,CAAC,OAAO,EAAG,QAAQ,CAAS;IAEpC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;IAE7B,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAQ;IACtC,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAwC;IAC5E,OAAO,CAAC,EAAE,CAA8B;IACxC,OAAO,CAAC,SAAS,CAAuC;gBAE5C,IAAI,GAAE,uBAA4B;IAQxC,aAAa,CAAC,IAAI,EAAE,oBAAoB,GAAG,OAAO,CAAC,aAAa,CAAC;IAuBjE,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAS3D,IAAI,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,SAAS,CAAC;IAyHhD,IAAI,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAUhD,IAAI,CAAC,IAAI,GAAE,gBAAqB,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAiCvD,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,GAAE,kBAAuB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAe7E,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,GAAE,kBAAuB,GAAG,OAAO,CAAC,SAAS,CAAC;IAsCtF,gBAAgB,CAAC,IAAI,EAAE,uBAAuB,GAAG,OAAO,CAAC,UAAU,CAAC;IA6BpE,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,GAAE,qBAA0B,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAmB/F,KAAK,IAAI,IAAI;YAMC,QAAQ;IAiBtB,OAAO,CAAC,OAAO;YAgDD,oBAAoB;IAiBlC,OAAO,CAAC,MAAM;IAad,OAAO,CAAC,gBAAgB;CAOzB"}
1
+ {"version":3,"file":"sqlite-scene-store.d.ts","sourceRoot":"","sources":["../../src/storage/sqlite-scene-store.ts"],"names":[],"mappings":"AAQA,OAAO,EACL,KAAK,oBAAoB,EACzB,KAAK,aAAa,EAClB,KAAK,iBAAiB,EACtB,KAAK,UAAU,EACf,KAAK,uBAAuB,EAC5B,KAAK,qBAAqB,EAE1B,KAAK,gBAAgB,EACrB,KAAK,SAAS,EACd,KAAK,kBAAkB,EAEvB,KAAK,gBAAgB,EACrB,KAAK,UAAU,EAGf,KAAK,cAAc,EACpB,MAAM,SAAS,CAAA;AAOhB,MAAM,WAAW,uBAAuB;IACtC,sEAAsE;IACtE,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,wEAAwE;IACxE,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAA;IACvB,kEAAkE;IAClE,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB;AAgDD;;;;;;;;;GASG;AACH,wBAAgB,0BAA0B,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,CAmBvF;AAkKD;;;;;GAKG;AACH,qBAAa,gBAAiB,YAAW,UAAU;IACjD,QAAQ,CAAC,OAAO,EAAG,QAAQ,CAAS;IAEpC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;IAE7B,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAQ;IACtC,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAwC;IAC5E,OAAO,CAAC,EAAE,CAA8B;IACxC,OAAO,CAAC,SAAS,CAAuC;IAExD,YAAY,IAAI,GAAE,uBAA4B,EAM7C;IAEK,aAAa,CAAC,IAAI,EAAE,oBAAoB,GAAG,OAAO,CAAC,aAAa,CAAC,CAqBtE;IAEK,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAOhE;IAEK,IAAI,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,SAAS,CAAC,CAuHrD;IAEK,IAAI,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAQrD;IAEK,IAAI,CAAC,IAAI,GAAE,gBAAqB,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CA+B5D;IAEK,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,GAAE,kBAAuB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAalF;IAEK,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,GAAE,kBAAuB,GAAG,OAAO,CAAC,SAAS,CAAC,CAoC3F;IAEK,gBAAgB,CAAC,IAAI,EAAE,uBAAuB,GAAG,OAAO,CAAC,UAAU,CAAC,CA2BzE;IAEK,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,GAAE,qBAA0B,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAiB9F;IAED,KAAK,IAAI,IAAI,CAIZ;YAEa,QAAQ;IAiBtB,OAAO,CAAC,OAAO;YAgDD,oBAAoB;IAiBlC,OAAO,CAAC,MAAM;IAad,OAAO,CAAC,gBAAgB;CAOzB"}
@@ -138,15 +138,15 @@ export interface SceneStore {
138
138
  listSceneEvents?(sceneId: SceneId, opts?: SceneEventListOptions): Promise<SceneEvent[]>;
139
139
  }
140
140
  export declare class SceneNotFoundError extends Error {
141
- readonly code: "not_found";
141
+ readonly code: 'not_found';
142
142
  constructor(message?: string);
143
143
  }
144
144
  export declare class SceneVersionConflictError extends Error {
145
- readonly code: "version_conflict";
145
+ readonly code: 'version_conflict';
146
146
  constructor(message?: string);
147
147
  }
148
148
  export declare class SceneInvalidError extends Error {
149
- readonly code: "invalid";
149
+ readonly code: 'invalid';
150
150
  constructor(message?: string);
151
151
  }
152
152
  /**
@@ -159,7 +159,7 @@ export declare class SceneWipeBlockedError extends SceneInvalidError {
159
159
  constructor(message?: string);
160
160
  }
161
161
  export declare class SceneTooLargeError extends Error {
162
- readonly code: "too_large";
162
+ readonly code: 'too_large';
163
163
  constructor(message?: string);
164
164
  }
165
165
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/storage/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/storage/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oCAAoC,CAAA;AAEpE;;GAEG;AACH,MAAM,MAAM,OAAO,GAAG,MAAM,CAAA;AAE5B,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,OAAO,CAAA;IACX,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,yFAAyF;IACzF,OAAO,EAAE,MAAM,CAAA;IACf,0BAA0B;IAC1B,SAAS,EAAE,MAAM,CAAA;IACjB,0BAA0B;IAC1B,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,kGAAkG;IAClG,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,iEAAiE;IACjE,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,4FAA4F;IAC5F,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,4EAA4E;IAC5E,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,0FAA0F;IAC1F,QAAQ,CAAC,EAAE,aAAa,CAAA;IACxB,2EAA2E;IAC3E,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,cAAe,SAAQ,SAAS;IAC/C,KAAK,EAAE,UAAU,CAAA;CAClB;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,OAAO,CAAA;IAChB,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,MAAM,CAAA;IACjB,KAAK,EAAE,UAAU,CAAA;CAClB;AAED,MAAM,WAAW,gBAAgB;IAC/B,EAAE,CAAC,EAAE,OAAO,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,KAAK,EAAE,UAAU,CAAA;IACjB,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC5B,yEAAyE;IACzE,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACjC,+FAA+F;IAC/F,QAAQ,CAAC,EAAE,aAAa,CAAA;IACxB,iGAAiG;IACjG,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,0EAA0E;IAC1E,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,sEAAsE;IACtE,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB;;;OAGG;IACH,cAAc,CAAC,EAAE,OAAO,CAAA;CACzB;AAED,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,YAAY,CAAA;AAElD,MAAM,WAAW,gBAAgB;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,kBAAkB;IACjC,eAAe,CAAC,EAAE,MAAM,CAAA;CACzB;AAED;;;GAGG;AACH,MAAM,MAAM,iBAAiB,GAAG;IAC9B,OAAO,EAAE,OAAO,CAAA;IAChB,MAAM,EAAE,OAAO,CAAA;IACf,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB,CAAA;AAED,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,OAAO,CAAA;IAChB,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,UAAU,CAAA;CAClB;AAED,MAAM,WAAW,qBAAqB;IACpC,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,oBAAoB;IACnC,EAAE,CAAC,EAAE,OAAO,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,SAAS,CAAC,EAAE,OAAO,CAAA;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,OAAO,CAAA;IACX,SAAS,EAAE,MAAM,CAAA;IACjB,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,MAAM,CAAA;IACjB,GAAG,EAAE,MAAM,CAAA;IACX,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAA;IAC/B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;IAC5B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,qBAAqB,EAAE,MAAM,GAAG,IAAI,CAAA;IACpC,+DAA+D;IAC/D,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,OAAO,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,OAAO,EAAE,QAAQ,GAAG,UAAU,CAAA;IACvC,aAAa,CAAC,CAAC,IAAI,EAAE,oBAAoB,GAAG,OAAO,CAAC,aAAa,CAAC,CAAA;IAClE,gBAAgB,CAAC,CAAC,EAAE,EAAE,OAAO,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAAA;IAC7D,IAAI,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,SAAS,CAAC,CAAA;IAChD,IAAI,CAAC,EAAE,EAAE,OAAO,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAAA;IACjD,IAAI,CAAC,IAAI,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAAA;IACnD,MAAM,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAA;IAC1E,MAAM,CAAC,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,SAAS,CAAC,CAAA;IACnF,gBAAgB,CAAC,CAAC,IAAI,EAAE,uBAAuB,GAAG,OAAO,CAAC,UAAU,CAAC,CAAA;IACrE,eAAe,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAAA;CACxF;AAED,qBAAa,kBAAmB,SAAQ,KAAK;IAC3C,QAAQ,CAAC,IAAI,EAAG,WAAW,CAAS;IACpC,YAAY,OAAO,SAAoB,EAGtC;CACF;AAED,qBAAa,yBAA0B,SAAQ,KAAK;IAClD,QAAQ,CAAC,IAAI,EAAG,kBAAkB,CAAS;IAC3C,YAAY,OAAO,SAA2B,EAG7C;CACF;AAED,qBAAa,iBAAkB,SAAQ,KAAK;IAC1C,QAAQ,CAAC,IAAI,EAAG,SAAS,CAAS;IAClC,YAAY,OAAO,SAAkB,EAGpC;CACF;AAED;;;;;GAKG;AACH,qBAAa,qBAAsB,SAAQ,iBAAiB;IAC1D,YAAY,OAAO,SAAuB,EAGzC;CACF;AAED,qBAAa,kBAAmB,SAAQ,KAAK;IAC3C,QAAQ,CAAC,IAAI,EAAG,WAAW,CAAS;IACpC,YAAY,OAAO,SAAoB,EAGtC;CACF"}
@@ -1,8 +1,8 @@
1
1
  import type { SceneGraph } from '@pascal-app/core/clone-scene-graph';
2
2
  export declare const template: SceneGraph;
3
3
  export declare const metadata: {
4
- readonly id: "empty-studio";
5
- readonly name: "Empty studio";
6
- readonly description: "40 m² single-room studio apartment: 4 walls, 1 living/kitchen zone, 1 window, 1 front door.";
4
+ readonly id: 'empty-studio';
5
+ readonly name: 'Empty studio';
6
+ readonly description: '40 m² single-room studio apartment: 4 walls, 1 living/kitchen zone, 1 window, 1 front door.';
7
7
  };
8
8
  //# sourceMappingURL=empty-studio.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"empty-studio.d.ts","sourceRoot":"","sources":["../../src/templates/empty-studio.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oCAAoC,CAAA;AAmPpE,eAAO,MAAM,QAAQ,EAAE,UAA4B,CAAA;AAEnD,eAAO,MAAM,QAAQ;;;;CAKX,CAAA"}
1
+ {"version":3,"file":"empty-studio.d.ts","sourceRoot":"","sources":["../../src/templates/empty-studio.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oCAAoC,CAAA;AAmPpE,eAAO,MAAM,QAAQ,EAAE,UAA4B,CAAA;AAEnD,eAAO,MAAM,QAAQ;aACnB,EAAE,EAAE,cAAc;aAClB,IAAI,EAAE,cAAc;aACpB,WAAW,EACT,6FAA6F;CACvF,CAAA"}
@@ -1,8 +1,8 @@
1
1
  import type { SceneGraph } from '@pascal-app/core/clone-scene-graph';
2
2
  export declare const template: SceneGraph;
3
3
  export declare const metadata: {
4
- readonly id: "garden-house";
5
- readonly name: "Garden house";
6
- readonly description: "12 × 8 m single-level house with a fenced back-garden zone; 4 walls, 2 doors, 4 windows, 3 privacy fences.";
4
+ readonly id: 'garden-house';
5
+ readonly name: 'Garden house';
6
+ readonly description: '12 × 8 m single-level house with a fenced back-garden zone; 4 walls, 2 doors, 4 windows, 3 privacy fences.';
7
7
  };
8
8
  //# sourceMappingURL=garden-house.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"garden-house.d.ts","sourceRoot":"","sources":["../../src/templates/garden-house.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oCAAoC,CAAA;AAkRpE,eAAO,MAAM,QAAQ,EAAE,UAA4B,CAAA;AAEnD,eAAO,MAAM,QAAQ;;;;CAKX,CAAA"}
1
+ {"version":3,"file":"garden-house.d.ts","sourceRoot":"","sources":["../../src/templates/garden-house.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oCAAoC,CAAA;AAkRpE,eAAO,MAAM,QAAQ,EAAE,UAA4B,CAAA;AAEnD,eAAO,MAAM,QAAQ;aACnB,EAAE,EAAE,cAAc;aAClB,IAAI,EAAE,cAAc;aACpB,WAAW,EACT,4GAA4G;CACtG,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/templates/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oCAAoC,CAAA;AAKpE,MAAM,MAAM,gBAAgB,GAAG;IAC7B,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,CAAA;CACpB,CAAA;AAED,MAAM,MAAM,aAAa,GAAG;IAC1B,yDAAyD;IACzD,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,CAAA;IACnB,kFAAkF;IAClF,QAAQ,EAAE,UAAU,CAAA;CACrB,CAAA;AAWD,eAAO,MAAM,SAAS;;;;CAIZ,CAAA;AAEV,MAAM,MAAM,UAAU,GAAG,MAAM,OAAO,SAAS,CAAA;AAE/C,yEAAyE;AACzE,wBAAgB,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,EAAE,IAAI,UAAU,CAEzD"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/templates/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oCAAoC,CAAA;AAKpE,MAAM,MAAM,gBAAgB,GAAG;IAC7B,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,CAAA;CACpB,CAAA;AAED,MAAM,MAAM,aAAa,GAAG;IAC1B,yDAAyD;IACzD,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,CAAA;IACnB,kFAAkF;IAClF,QAAQ,EAAE,UAAU,CAAA;CACrB,CAAA;AAWD,eAAO,MAAM,SAAS;aACpB,cAAc;aACd,aAAa;aACb,cAAc;CACN,CAAA;AAEV,MAAM,MAAM,UAAU,GAAG,MAAM,OAAO,SAAS,CAAA;AAE/C,yEAAyE;AACzE,wBAAgB,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,EAAE,IAAI,UAAU,CAEzD"}
@@ -1,8 +1,8 @@
1
1
  import type { SceneGraph } from '@pascal-app/core/clone-scene-graph';
2
2
  export declare const template: SceneGraph;
3
3
  export declare const metadata: {
4
- readonly id: "two-bedroom";
5
- readonly name: "Two-bedroom apartment";
6
- readonly description: "80 m² two-bedroom flat: 9 walls, 4 zones (living/kitchen, 2 bedrooms, bath), 4 doors and 5 windows.";
4
+ readonly id: 'two-bedroom';
5
+ readonly name: 'Two-bedroom apartment';
6
+ readonly description: '80 m² two-bedroom flat: 9 walls, 4 zones (living/kitchen, 2 bedrooms, bath), 4 doors and 5 windows.';
7
7
  };
8
8
  //# sourceMappingURL=two-bedroom.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"two-bedroom.d.ts","sourceRoot":"","sources":["../../src/templates/two-bedroom.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oCAAoC,CAAA;AA2SpE,eAAO,MAAM,QAAQ,EAAE,UAA4B,CAAA;AAEnD,eAAO,MAAM,QAAQ;;;;CAKX,CAAA"}
1
+ {"version":3,"file":"two-bedroom.d.ts","sourceRoot":"","sources":["../../src/templates/two-bedroom.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oCAAoC,CAAA;AA2SpE,eAAO,MAAM,QAAQ,EAAE,UAA4B,CAAA;AAEnD,eAAO,MAAM,QAAQ;aACnB,EAAE,EAAE,aAAa;aACjB,IAAI,EAAE,uBAAuB;aAC7B,WAAW,EACT,qGAAqG;CAC/F,CAAA"}
@@ -1,4 +1,4 @@
1
- import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
1
+ import type { McpServer } from '@modelcontextprotocol/server';
2
2
  import type { SceneOperations } from '../operations/index.js';
3
3
  import { type GeometryScriptHost } from './add-object.js';
4
4
  export declare function registerAddColumn(server: McpServer, bridge: SceneOperations, host?: GeometryScriptHost): void;
@@ -1 +1 @@
1
- {"version":3,"file":"add-column.d.ts","sourceRoot":"","sources":["../../src/tools/add-column.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AAUxE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AACpD,OAAO,EAAmB,KAAK,kBAAkB,EAAc,MAAM,cAAc,CAAA;AAMnF,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,eAAe,EACvB,IAAI,CAAC,EAAE,kBAAkB,QAiD1B"}
1
+ {"version":3,"file":"add-column.d.ts","sourceRoot":"","sources":["../../src/tools/add-column.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAA;AAW7D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AACpD,OAAO,EAAmB,KAAK,kBAAkB,EAAc,MAAM,cAAc,CAAA;AAMnF,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,eAAe,EACvB,IAAI,CAAC,EAAE,kBAAkB,QAqD1B"}
@@ -2,6 +2,7 @@ import { isScriptedNode, scriptedObjectMeta } from '@pascal-app/core';
2
2
  import { addColumn, columnScriptParams, editedScriptLanguage, } from '@pascal-app/core/agent-operations';
3
3
  import { addColumnTool, isAgentRefusal, refuse } from '@pascal-app/core/agent-tools';
4
4
  import { GeometryReuseFields } from '@pascal-app/core/schema';
5
+ import { z } from 'zod';
5
6
  import { compileAndStore, readScript } from './add-object.js';
6
7
  import { DESTRUCTIVE_TOOL_ANNOTATIONS } from './annotations.js';
7
8
  import { refusalResult, toolError } from './errors.js';
@@ -11,7 +12,7 @@ export function registerAddColumn(server, bridge, host) {
11
12
  server.registerTool(addColumnTool.name, {
12
13
  title: addColumnTool.title,
13
14
  description: addColumnTool.description,
14
- inputSchema: addColumnTool.input,
15
+ inputSchema: z.object(addColumnTool.input),
15
16
  annotations: DESTRUCTIVE_TOOL_ANNOTATIONS,
16
17
  }, async (input) => {
17
18
  try {
@@ -35,7 +36,7 @@ export function registerAddColumn(server, bridge, host) {
35
36
  },
36
37
  });
37
38
  }
38
- const outcome = addColumn(nodes, { ...input, compiled }, { activeLevelId: null });
39
+ const outcome = addColumn(nodes, { ...input, compiled }, { activeLevelId: bridge.activeLevelId?.() ?? null });
39
40
  if (outcome.changes)
40
41
  bridge.applyPatch(toPatches(outcome.changes));
41
42
  const payload = {
@@ -1,4 +1,5 @@
1
- import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
1
+ import type { McpServer } from '@modelcontextprotocol/server';
2
+ import { type AddObjectInput } from '@pascal-app/core/agent-operations';
2
3
  import { type CompiledGeometryScript, GeometryArtifactMetadata, type GeometryScriptLanguage, type GeometryScriptParamValue } from '@pascal-app/core/schema';
3
4
  import type { SceneOperations } from '../operations/index.js';
4
5
  /**
@@ -7,10 +8,15 @@ import type { SceneOperations } from '../operations/index.js';
7
8
  * artifacts live for the active scene.
8
9
  */
9
10
  export type GeometryScriptHost = {
11
+ readonly signal?: AbortSignal;
12
+ /** Recheck the host's active authorization after a long compile and before scene mutation. */
13
+ assertActive?(): Promise<void>;
10
14
  compile(input: {
11
15
  code: string;
12
16
  language: GeometryScriptLanguage;
13
17
  params?: Record<string, GeometryScriptParamValue>;
18
+ /** What the host builds it for (a room's floor, a wall's face: `floorScriptInputs`, `wallFaceScriptInputs`), kept in the host's frame. */
19
+ inputs?: Record<string, unknown>;
14
20
  }): Promise<CompiledGeometryScript & {
15
21
  glb: Uint8Array;
16
22
  }>;
@@ -36,23 +42,33 @@ export type GeometryScriptHost = {
36
42
  code: string;
37
43
  language: GeometryScriptLanguage;
38
44
  params?: Record<string, GeometryScriptParamValue>;
45
+ inputs?: Record<string, unknown>;
39
46
  /** What the script builds, for the host to name it to the user. */
40
47
  kind: ScriptedKind;
41
48
  nodeId: string;
42
49
  metadata?: GeometryArtifactMetadata;
43
50
  }): Promise<CompiledGeometryScript>;
44
51
  };
45
- export type ScriptedKind = 'object' | 'window' | 'door' | 'column';
52
+ export type ScriptedKind = 'object' | 'window' | 'door' | 'column' | 'floor' | 'wall-face';
46
53
  /** Compiles a module on the host and stores its GLB and text for the scene: the step every scripted tool shares. */
47
- export declare function compileAndStore(host: GeometryScriptHost, sceneId: string, { code, language, params, }: {
54
+ export declare function compileAndStore(host: GeometryScriptHost, sceneId: string, { code, language, params, inputs, }: {
48
55
  code: string;
49
56
  language: GeometryScriptLanguage;
50
57
  params: Record<string, GeometryScriptParamValue> | undefined;
58
+ inputs?: Record<string, unknown>;
51
59
  }, kind: ScriptedKind, context?: {
52
60
  nodeId?: string;
53
61
  metadata?: GeometryArtifactMetadata;
54
62
  }): Promise<CompiledGeometryScript>;
55
63
  export declare function readScript(host: GeometryScriptHost, sceneId: string, bridge: SceneOperations, nodeId: string): Promise<string>;
64
+ /**
65
+ * One object's module compiled and stored by the host: a new one from its code, an edit from its
66
+ * code or its stored script, with the params it keeps. The step a lone add_object and each
67
+ * add_object of a run_batch share.
68
+ */
69
+ export declare function compileObject(host: GeometryScriptHost, sceneId: string, bridge: SceneOperations, args: Omit<AddObjectInput, 'compiled'>): Promise<CompiledGeometryScript>;
70
+ /** What a batch's add_object builds with: the host's compile, on the scene open now. */
71
+ export declare function compileObjectOnHost(host: GeometryScriptHost | undefined, bridge: SceneOperations, args: Omit<AddObjectInput, 'compiled'>): Promise<CompiledGeometryScript>;
56
72
  /** `add_object` on the MCP: the shared contract and operation, with the host's compile in front. */
57
73
  export declare function registerAddObject(server: McpServer, bridge: SceneOperations, host: GeometryScriptHost | undefined): void;
58
74
  /** `get_source` on the MCP: the object's module text, read back through the host's store. */
@@ -1 +1 @@
1
- {"version":3,"file":"add-object.d.ts","sourceRoot":"","sources":["../../src/tools/add-object.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AAcxE,OAAO,EAEL,KAAK,sBAAsB,EAE3B,wBAAwB,EAExB,KAAK,sBAAsB,EAC3B,KAAK,wBAAwB,EAE9B,MAAM,yBAAyB,CAAA;AAChC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAMpD;;;;GAIG;AACH,MAAM,MAAM,kBAAkB,GAAG;IAC/B,OAAO,CAAC,KAAK,EAAE;QACb,IAAI,EAAE,MAAM,CAAA;QACZ,QAAQ,EAAE,sBAAsB,CAAA;QAChC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,wBAAwB,CAAC,CAAA;KAClD,GAAG,OAAO,CAAC,sBAAsB,GAAG;QAAE,GAAG,EAAE,UAAU,CAAA;KAAE,CAAC,CAAA;IACzD,aAAa,CAAC,KAAK,EAAE;QACnB,OAAO,EAAE,MAAM,CAAA;QACf,MAAM,EAAE,MAAM,CAAA;QACd,KAAK,EAAE,UAAU,CAAA;QACjB,QAAQ,EAAE,MAAM,CAAA;QAChB,MAAM,CAAC,EAAE,MAAM,CAAA;QACf,QAAQ,CAAC,EAAE,wBAAwB,CAAA;KACpC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;IACnB,wHAAwH;IACxH,YAAY,CAAC,KAAK,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAAA;IACpF;;;OAGG;IACH,KAAK,CAAC,CAAC,KAAK,EAAE;QACZ,OAAO,EAAE,MAAM,CAAA;QACf,IAAI,EAAE,MAAM,CAAA;QACZ,QAAQ,EAAE,sBAAsB,CAAA;QAChC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,wBAAwB,CAAC,CAAA;QACjD,mEAAmE;QACnE,IAAI,EAAE,YAAY,CAAA;QAClB,MAAM,EAAE,MAAM,CAAA;QACd,QAAQ,CAAC,EAAE,wBAAwB,CAAA;KACpC,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAAA;CACpC,CAAA;AAED,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,QAAQ,GAAG,MAAM,GAAG,QAAQ,CAAA;AAElE,oHAAoH;AACpH,wBAAsB,eAAe,CACnC,IAAI,EAAE,kBAAkB,EACxB,OAAO,EAAE,MAAM,EACf,EACE,IAAI,EACJ,QAAQ,EACR,MAAM,GACP,EAAE;IACD,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,sBAAsB,CAAA;IAChC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,wBAAwB,CAAC,GAAG,SAAS,CAAA;CAC7D,EACD,IAAI,EAAE,YAAY,EAClB,OAAO,GAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,wBAAwB,CAAA;CAAO,GACrE,OAAO,CAAC,sBAAsB,CAAC,CAgCjC;AAED,wBAAsB,UAAU,CAC9B,IAAI,EAAE,kBAAkB,EACxB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,eAAe,EACvB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,CAAC,CAKjB;AAED,oGAAoG;AACpG,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,eAAe,EACvB,IAAI,EAAE,kBAAkB,GAAG,SAAS,GACnC,IAAI,CAsEN;AASD,6FAA6F;AAC7F,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,eAAe,EACvB,IAAI,EAAE,kBAAkB,GAAG,SAAS,GACnC,IAAI,CAgCN"}
1
+ {"version":3,"file":"add-object.d.ts","sourceRoot":"","sources":["../../src/tools/add-object.ts"],"names":[],"mappings":"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"}
@@ -1,24 +1,34 @@
1
1
  import { isScriptedNode, scriptedObjectMeta } from '@pascal-app/core';
2
- import { achievedChanges, addObject, authoredObject, editedScriptLanguage, editedScriptParams, readSourceResult, requireAddObjectReason, } from '@pascal-app/core/agent-operations';
3
- import { addObjectTool, getSourceTool, isAgentRefusal, refuse } from '@pascal-app/core/agent-tools';
2
+ import { achievedChanges, addObject, authoredObject, editedScriptLanguage, editedScriptParams, furnishingRefusal, readableScript, readSourceResult, requireAddObjectReason, } from '@pascal-app/core/agent-operations';
3
+ import { addObjectTool, CATALOG_SOURCE, getSourceTool, isAgentRefusal, refuse, } from '@pascal-app/core/agent-tools';
4
4
  import { GEOMETRY_SCRIPT_MIME_TYPES, GeometryArtifactMetadata, GeometryReuseFields, generateId, } from '@pascal-app/core/schema';
5
+ import { z } from 'zod';
5
6
  import { DESTRUCTIVE_TOOL_ANNOTATIONS, READ_ONLY_TOOL_ANNOTATIONS } from './annotations.js';
6
7
  import { refusalResult, toolError } from './errors.js';
7
8
  import { persistencePayload, publishLiveSceneSnapshot } from './live-sync.js';
8
- import { toPatches } from './shared-tools.js';
9
+ import { briefInForce, toPatches } from './shared-tools.js';
10
+ /** The kind an artifact records; a room's floor finish and a wall face's are none of the node kinds. */
11
+ const ARTIFACT_KIND = {
12
+ object: 'item',
13
+ window: 'window',
14
+ door: 'door',
15
+ column: 'column',
16
+ floor: undefined,
17
+ 'wall-face': undefined,
18
+ };
9
19
  /** Compiles a module on the host and stores its GLB and text for the scene: the step every scripted tool shares. */
10
- export async function compileAndStore(host, sceneId, { code, language, params, }, kind, context = {}) {
11
- const nodeId = context.nodeId ?? generateId(kind === 'object' ? 'item' : kind);
20
+ export async function compileAndStore(host, sceneId, { code, language, params, inputs, }, kind, context = {}) {
21
+ const nodeId = context.nodeId ?? generateId(ARTIFACT_KIND[kind] ?? 'item');
12
22
  const metadata = GeometryArtifactMetadata.parse({
13
23
  ...context.metadata,
14
- kind: kind === 'object' ? 'item' : kind,
24
+ kind: ARTIFACT_KIND[kind],
15
25
  });
16
26
  if (host.build)
17
27
  return {
18
- ...(await host.build({ sceneId, code, language, params, kind, nodeId, metadata })),
28
+ ...(await host.build({ sceneId, code, language, params, inputs, kind, nodeId, metadata })),
19
29
  nodeId,
20
30
  };
21
- const { glb, ...compiled } = await host.compile({ code, language, params });
31
+ const { glb, ...compiled } = await host.compile({ code, language, params, inputs });
22
32
  metadata.mount = compiled.mount;
23
33
  const [sha256] = await Promise.all([
24
34
  host.storeArtifact({
@@ -40,21 +50,58 @@ export async function compileAndStore(host, sceneId, { code, language, params, }
40
50
  ]);
41
51
  return { ...compiled, sha256, nodeId };
42
52
  }
43
- export async function readScript(host, sceneId, bridge, nodeId) {
44
- const node = authoredObject(bridge.getNodes(), nodeId);
53
+ async function scriptText(host, sceneId, node) {
45
54
  const bytes = await host.readArtifact({ sceneId, sha256: node.source.script });
46
55
  if (!bytes)
47
- throw new Error(`The script of ${nodeId} could not be read`);
56
+ throw new Error(`The script of ${node.id} could not be read`);
48
57
  return new TextDecoder().decode(bytes);
49
58
  }
59
+ export function readScript(host, sceneId, bridge, nodeId) {
60
+ return scriptText(host, sceneId, authoredObject(bridge.getNodes(), nodeId));
61
+ }
62
+ /**
63
+ * One object's module compiled and stored by the host: a new one from its code, an edit from its
64
+ * code or its stored script, with the params it keeps. The step a lone add_object and each
65
+ * add_object of a run_batch share.
66
+ */
67
+ export async function compileObject(host, sceneId, bridge, args) {
68
+ const code = args.code ??
69
+ (args.nodeId ? await readScript(host, sceneId, bridge, args.nodeId) : refuseMissingCode());
70
+ const nodes = bridge.getNodes();
71
+ const previous = args.nodeId ? nodes[args.nodeId] : undefined;
72
+ const language = editedScriptLanguage(previous, args);
73
+ const params = editedScriptParams(previous, args.params);
74
+ return compileAndStore(host, sceneId, { code, language, params }, 'object', {
75
+ nodeId: args.nodeId,
76
+ metadata: {
77
+ ...(isScriptedNode(previous) ? scriptedObjectMeta(previous) : {}),
78
+ ...GeometryReuseFields.parse(args),
79
+ },
80
+ });
81
+ }
82
+ /** What a batch's add_object builds with: the host's compile, on the scene open now. */
83
+ export async function compileObjectOnHost(host, bridge, args) {
84
+ if (!host)
85
+ refuse('scripts_unavailable', 'This Pascal server cannot run geometry scripts.');
86
+ const scene = bridge.getActiveScene();
87
+ if (!scene)
88
+ refuse('no_active_scene', 'Open or save a scene first: authored objects are stored with a scene.');
89
+ return compileObject(host, scene.id, bridge, args);
90
+ }
50
91
  /** `add_object` on the MCP: the shared contract and operation, with the host's compile in front. */
51
92
  export function registerAddObject(server, bridge, host) {
52
93
  server.registerTool(addObjectTool.name, {
53
94
  title: addObjectTool.title,
54
95
  description: addObjectTool.description,
55
- inputSchema: addObjectTool.input,
96
+ inputSchema: z.object(addObjectTool.input),
56
97
  annotations: DESTRUCTIVE_TOOL_ANNOTATIONS,
57
98
  }, async (input) => {
99
+ const brief = briefInForce(bridge);
100
+ if (brief !== undefined) {
101
+ const refusal = furnishingRefusal(addObjectTool.name, input, brief);
102
+ if (refusal)
103
+ return refusalResult(refusal);
104
+ }
58
105
  if (!host) {
59
106
  return toolError('This Pascal server cannot run geometry scripts.', {
60
107
  code: 'scripts_unavailable',
@@ -70,35 +117,19 @@ export function registerAddObject(server, bridge, host) {
70
117
  let compiled;
71
118
  try {
72
119
  requireAddObjectReason(args);
73
- const code = args.code ??
74
- (args.nodeId
75
- ? await readScript(host, scene.id, bridge, args.nodeId)
76
- : refuseMissingCode());
77
- const nodes = bridge.getNodes();
78
- const previous = args.nodeId ? nodes[args.nodeId] : undefined;
79
- const language = editedScriptLanguage(previous, args);
80
- const params = editedScriptParams(previous, args.params);
81
- compiled = await compileAndStore(host, scene.id, { code, language, params }, 'object', {
82
- nodeId: args.nodeId,
83
- metadata: {
84
- ...(isScriptedNode(previous) ? scriptedObjectMeta(previous) : {}),
85
- ...GeometryReuseFields.parse(args),
86
- },
87
- });
120
+ compiled = await compileObject(host, scene.id, bridge, args);
88
121
  }
89
122
  catch (error) {
90
123
  if (isAgentRefusal(error))
91
124
  return refusalResult(error);
92
- return toolError(error instanceof Error ? error.message : String(error), {
93
- code: 'script_failed',
94
- });
125
+ return toolError(`${error instanceof Error ? error.message : String(error)} ${CATALOG_SOURCE}`, { code: 'script_failed' });
95
126
  }
96
127
  // A copy: the hosted bridge writes its map in place, and a "before" that grows with the call
97
128
  // reads every creation as unchanged.
98
129
  const before = { ...bridge.getNodes() };
99
130
  let outcome;
100
131
  try {
101
- outcome = addObject(before, { ...args, compiled }, { activeLevelId: null });
132
+ outcome = addObject(before, { ...args, compiled }, { activeLevelId: bridge.activeLevelId?.() ?? null });
102
133
  }
103
134
  catch (error) {
104
135
  return refusalResult(error);
@@ -126,9 +157,9 @@ export function registerGetSource(server, bridge, host) {
126
157
  server.registerTool(getSourceTool.name, {
127
158
  title: getSourceTool.title,
128
159
  description: getSourceTool.description,
129
- inputSchema: getSourceTool.input,
160
+ inputSchema: z.object(getSourceTool.input),
130
161
  annotations: READ_ONLY_TOOL_ANNOTATIONS,
131
- }, async ({ nodeId }) => {
162
+ }, async ({ nodeId, face }) => {
132
163
  if (!host) {
133
164
  return toolError('This Pascal server cannot read geometry scripts.', {
134
165
  code: 'scripts_unavailable',
@@ -138,8 +169,8 @@ export function registerGetSource(server, bridge, host) {
138
169
  if (!scene)
139
170
  return toolError('Open a scene first.', { code: 'no_active_scene' });
140
171
  try {
141
- const node = authoredObject(bridge.getNodes(), nodeId);
142
- const payload = readSourceResult(node, await readScript(host, scene.id, bridge, nodeId));
172
+ const node = readableScript(bridge.getNodes(), nodeId, face);
173
+ const payload = readSourceResult(node, await scriptText(host, scene.id, node));
143
174
  return {
144
175
  content: [{ type: 'text', text: JSON.stringify(payload) }],
145
176
  structuredContent: payload,
@@ -1 +1 @@
1
- {"version":3,"file":"annotations.d.ts","sourceRoot":"","sources":["../../src/tools/annotations.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,0BAA0B;;;;;CAK7B,CAAA;AAEV,eAAO,MAAM,qCAAqC;;;;;CAKxC,CAAA;AAEV,eAAO,MAAM,yBAAyB;;;;CAI5B,CAAA;AAEV,eAAO,MAAM,4BAA4B;;;;CAI/B,CAAA;AAEV,eAAO,MAAM,uCAAuC;;;;CAI1C,CAAA"}
1
+ {"version":3,"file":"annotations.d.ts","sourceRoot":"","sources":["../../src/tools/annotations.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,0BAA0B;aACrC,YAAY;aACZ,eAAe;aACf,cAAc;aACd,aAAa;CACL,CAAA;AAEV,eAAO,MAAM,qCAAqC;aAChD,YAAY;aACZ,eAAe;aACf,cAAc;aACd,aAAa;CACL,CAAA;AAEV,eAAO,MAAM,yBAAyB;aACpC,YAAY;aACZ,eAAe;aACf,aAAa;CACL,CAAA;AAEV,eAAO,MAAM,4BAA4B;aACvC,YAAY;aACZ,eAAe;aACf,aAAa;CACL,CAAA;AAEV,eAAO,MAAM,uCAAuC;aAClD,YAAY;aACZ,eAAe;aACf,aAAa;CACL,CAAA"}
@@ -1,7 +1,9 @@
1
- import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
1
+ import type { McpServer } from '@modelcontextprotocol/server';
2
2
  import { z } from 'zod';
3
3
  import type { SceneOperations } from '../operations/index.js';
4
4
  import './honest-patch-guard.js';
5
+ import './level-height-guard.js';
6
+ import './roof-level-guard.js';
5
7
  export declare const applyPatchInput: {
6
8
  patches: z.ZodArray<z.ZodDiscriminatedUnion<[z.ZodObject<{
7
9
  op: z.ZodLiteral<"create">;
@@ -22,14 +24,16 @@ export declare const applyPatchOutput: {
22
24
  unsaved: z.ZodOptional<z.ZodString>;
23
25
  persistence: z.ZodOptional<z.ZodObject<{
24
26
  status: z.ZodEnum<{
25
- unbound: "unbound";
26
27
  events_unsupported: "events_unsupported";
28
+ unbound: "unbound";
27
29
  }>;
28
30
  warning: z.ZodString;
29
31
  }, z.core.$strip>>;
30
32
  appliedOps: z.ZodNumber;
31
33
  deletedIds: z.ZodArray<z.ZodString>;
32
34
  createdIds: z.ZodArray<z.ZodString>;
35
+ /** What the server changed in the patch before writing it, one line each. */
36
+ notes: z.ZodOptional<z.ZodArray<z.ZodString>>;
33
37
  };
34
38
  export declare function registerApplyPatch(server: McpServer, bridge: SceneOperations): void;
35
39
  //# sourceMappingURL=apply-patch.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"apply-patch.d.ts","sourceRoot":"","sources":["../../src/tools/apply-patch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AAGxE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAGpD,OAAO,sBAAsB,CAAA;AAK7B,eAAO,MAAM,eAAe;;;;;;;;;;;;;;CAE3B,CAAA;AAED,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;CAK5B,CAAA;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,eAAe,GAAG,IAAI,CA+EnF"}
1
+ {"version":3,"file":"apply-patch.d.ts","sourceRoot":"","sources":["../../src/tools/apply-patch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAA;AAG7D,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAGpD,OAAO,sBAAsB,CAAA;AAC7B,OAAO,sBAAsB,CAAA;AAC7B,OAAO,oBAAoB,CAAA;AAK3B,eAAO,MAAM,eAAe;IAC1B,OAAO;;;;;;;;;;;;;CACR,CAAA;AAED,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;IAI3B,6EAA6E;;CAG9E,CAAA;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,eAAe,GAAG,IAAI,CAgFnF"}