@pascal-app/mcp 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +39 -0
- package/README.md +330 -0
- package/dist/bin/pascal-mcp.d.ts +3 -0
- package/dist/bin/pascal-mcp.d.ts.map +1 -0
- package/dist/bin/pascal-mcp.js +91 -0
- package/dist/bridge/index.d.ts +3 -0
- package/dist/bridge/index.d.ts.map +1 -0
- package/dist/bridge/index.js +1 -0
- package/dist/bridge/node-shims.d.ts +16 -0
- package/dist/bridge/node-shims.d.ts.map +1 -0
- package/dist/bridge/node-shims.js +25 -0
- package/dist/bridge/scene-bridge.d.ts +158 -0
- package/dist/bridge/scene-bridge.d.ts.map +1 -0
- package/dist/bridge/scene-bridge.js +482 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4 -0
- package/dist/lib/rehydrate-site-children.d.ts +12 -0
- package/dist/lib/rehydrate-site-children.d.ts.map +1 -0
- package/dist/lib/rehydrate-site-children.js +40 -0
- package/dist/lib/safe-fetch.d.ts +19 -0
- package/dist/lib/safe-fetch.d.ts.map +1 -0
- package/dist/lib/safe-fetch.js +221 -0
- package/dist/operations/index.d.ts +2 -0
- package/dist/operations/index.d.ts.map +1 -0
- package/dist/operations/index.js +1 -0
- package/dist/operations/scene-operations.d.ts +67 -0
- package/dist/operations/scene-operations.d.ts.map +1 -0
- package/dist/operations/scene-operations.js +192 -0
- package/dist/prompts/from-brief.d.ts +11 -0
- package/dist/prompts/from-brief.d.ts.map +1 -0
- package/dist/prompts/from-brief.js +48 -0
- package/dist/prompts/index.d.ts +10 -0
- package/dist/prompts/index.d.ts.map +1 -0
- package/dist/prompts/index.js +14 -0
- package/dist/prompts/iterate-on-feedback.d.ts +11 -0
- package/dist/prompts/iterate-on-feedback.d.ts.map +1 -0
- package/dist/prompts/iterate-on-feedback.js +41 -0
- package/dist/prompts/renovation-from-photos.d.ts +24 -0
- package/dist/prompts/renovation-from-photos.d.ts.map +1 -0
- package/dist/prompts/renovation-from-photos.js +135 -0
- package/dist/prompts/scene-guidance.d.ts +2 -0
- package/dist/prompts/scene-guidance.d.ts.map +1 -0
- package/dist/prompts/scene-guidance.js +24 -0
- package/dist/resources/agent-guide.d.ts +5 -0
- package/dist/resources/agent-guide.d.ts.map +1 -0
- package/dist/resources/agent-guide.js +85 -0
- package/dist/resources/catalog-items.d.ts +10 -0
- package/dist/resources/catalog-items.d.ts.map +1 -0
- package/dist/resources/catalog-items.js +29 -0
- package/dist/resources/constraints.d.ts +9 -0
- package/dist/resources/constraints.d.ts.map +1 -0
- package/dist/resources/constraints.js +69 -0
- package/dist/resources/index.d.ts +15 -0
- package/dist/resources/index.d.ts.map +1 -0
- package/dist/resources/index.js +23 -0
- package/dist/resources/scene-current.d.ts +9 -0
- package/dist/resources/scene-current.d.ts.map +1 -0
- package/dist/resources/scene-current.js +20 -0
- package/dist/resources/scene-summary.d.ts +10 -0
- package/dist/resources/scene-summary.d.ts.map +1 -0
- package/dist/resources/scene-summary.js +196 -0
- package/dist/server.d.ts +14 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +18 -0
- package/dist/storage/index.d.ts +13 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +14 -0
- package/dist/storage/slug.d.ts +21 -0
- package/dist/storage/slug.d.ts.map +1 -0
- package/dist/storage/slug.js +62 -0
- package/dist/storage/sqlite-driver.d.ts +18 -0
- package/dist/storage/sqlite-driver.d.ts.map +1 -0
- package/dist/storage/sqlite-driver.js +32 -0
- package/dist/storage/sqlite-scene-store.d.ts +51 -0
- package/dist/storage/sqlite-scene-store.d.ts.map +1 -0
- package/dist/storage/sqlite-scene-store.js +526 -0
- package/dist/storage/types.d.ts +136 -0
- package/dist/storage/types.d.ts.map +1 -0
- package/dist/storage/types.js +28 -0
- package/dist/templates/empty-studio.d.ts +8 -0
- package/dist/templates/empty-studio.d.ts.map +1 -0
- package/dist/templates/empty-studio.js +230 -0
- package/dist/templates/garden-house.d.ts +8 -0
- package/dist/templates/garden-house.d.ts.map +1 -0
- package/dist/templates/garden-house.js +242 -0
- package/dist/templates/index.d.ts +23 -0
- package/dist/templates/index.d.ts.map +1 -0
- package/dist/templates/index.js +20 -0
- package/dist/templates/two-bedroom.d.ts +8 -0
- package/dist/templates/two-bedroom.d.ts.map +1 -0
- package/dist/templates/two-bedroom.js +270 -0
- package/dist/tools/apply-patch.d.ts +25 -0
- package/dist/tools/apply-patch.d.ts.map +1 -0
- package/dist/tools/apply-patch.js +59 -0
- package/dist/tools/asset-catalog.d.ts +16 -0
- package/dist/tools/asset-catalog.d.ts.map +1 -0
- package/dist/tools/asset-catalog.js +308 -0
- package/dist/tools/check-collisions.d.ts +15 -0
- package/dist/tools/check-collisions.d.ts.map +1 -0
- package/dist/tools/check-collisions.js +61 -0
- package/dist/tools/construction-tools.d.ts +93 -0
- package/dist/tools/construction-tools.d.ts.map +1 -0
- package/dist/tools/construction-tools.js +369 -0
- package/dist/tools/create-level.d.ts +14 -0
- package/dist/tools/create-level.d.ts.map +1 -0
- package/dist/tools/create-level.js +48 -0
- package/dist/tools/create-wall.d.ts +15 -0
- package/dist/tools/create-wall.d.ts.map +1 -0
- package/dist/tools/create-wall.js +50 -0
- package/dist/tools/cut-opening.d.ts +18 -0
- package/dist/tools/cut-opening.d.ts.map +1 -0
- package/dist/tools/cut-opening.js +57 -0
- package/dist/tools/delete-node.d.ts +12 -0
- package/dist/tools/delete-node.d.ts.map +1 -0
- package/dist/tools/delete-node.js +37 -0
- package/dist/tools/describe-node.d.ts +17 -0
- package/dist/tools/describe-node.d.ts.map +1 -0
- package/dist/tools/describe-node.js +86 -0
- package/dist/tools/duplicate-level.d.ts +12 -0
- package/dist/tools/duplicate-level.d.ts.map +1 -0
- package/dist/tools/duplicate-level.js +56 -0
- package/dist/tools/errors.d.ts +20 -0
- package/dist/tools/errors.d.ts.map +1 -0
- package/dist/tools/errors.js +25 -0
- package/dist/tools/export-glb.d.ts +10 -0
- package/dist/tools/export-glb.d.ts.map +1 -0
- package/dist/tools/export-glb.js +24 -0
- package/dist/tools/export-json.d.ts +11 -0
- package/dist/tools/export-json.d.ts.map +1 -0
- package/dist/tools/export-json.js +23 -0
- package/dist/tools/find-nodes.d.ts +32 -0
- package/dist/tools/find-nodes.d.ts.map +1 -0
- package/dist/tools/find-nodes.js +105 -0
- package/dist/tools/geometry.d.ts +24 -0
- package/dist/tools/geometry.d.ts.map +1 -0
- package/dist/tools/geometry.js +94 -0
- package/dist/tools/get-node.d.ts +11 -0
- package/dist/tools/get-node.d.ts.map +1 -0
- package/dist/tools/get-node.js +27 -0
- package/dist/tools/get-scene.d.ts +11 -0
- package/dist/tools/get-scene.d.ts.map +1 -0
- package/dist/tools/get-scene.js +26 -0
- package/dist/tools/index.d.ts +12 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +64 -0
- package/dist/tools/live-sync.d.ts +11 -0
- package/dist/tools/live-sync.d.ts.map +1 -0
- package/dist/tools/live-sync.js +62 -0
- package/dist/tools/measure.d.ts +14 -0
- package/dist/tools/measure.d.ts.map +1 -0
- package/dist/tools/measure.js +137 -0
- package/dist/tools/photo-to-scene/index.d.ts +11 -0
- package/dist/tools/photo-to-scene/index.d.ts.map +1 -0
- package/dist/tools/photo-to-scene/index.js +11 -0
- package/dist/tools/photo-to-scene/photo-to-scene.d.ts +26 -0
- package/dist/tools/photo-to-scene/photo-to-scene.d.ts.map +1 -0
- package/dist/tools/photo-to-scene/photo-to-scene.js +323 -0
- package/dist/tools/place-item.d.ts +15 -0
- package/dist/tools/place-item.d.ts.map +1 -0
- package/dist/tools/place-item.js +84 -0
- package/dist/tools/redo.d.ts +11 -0
- package/dist/tools/redo.d.ts.map +1 -0
- package/dist/tools/redo.js +25 -0
- package/dist/tools/room-tools.d.ts +97 -0
- package/dist/tools/room-tools.d.ts.map +1 -0
- package/dist/tools/room-tools.js +510 -0
- package/dist/tools/scene-lifecycle/create-project.d.ts +33 -0
- package/dist/tools/scene-lifecycle/create-project.d.ts.map +1 -0
- package/dist/tools/scene-lifecycle/create-project.js +70 -0
- package/dist/tools/scene-lifecycle/delete-scene.d.ts +12 -0
- package/dist/tools/scene-lifecycle/delete-scene.d.ts.map +1 -0
- package/dist/tools/scene-lifecycle/delete-scene.js +42 -0
- package/dist/tools/scene-lifecycle/get-project-status.d.ts +31 -0
- package/dist/tools/scene-lifecycle/get-project-status.d.ts.map +1 -0
- package/dist/tools/scene-lifecycle/get-project-status.js +69 -0
- package/dist/tools/scene-lifecycle/index.d.ts +17 -0
- package/dist/tools/scene-lifecycle/index.d.ts.map +1 -0
- package/dist/tools/scene-lifecycle/index.js +29 -0
- package/dist/tools/scene-lifecycle/list-scenes.d.ts +27 -0
- package/dist/tools/scene-lifecycle/list-scenes.d.ts.map +1 -0
- package/dist/tools/scene-lifecycle/list-scenes.js +49 -0
- package/dist/tools/scene-lifecycle/load-scene.d.ts +31 -0
- package/dist/tools/scene-lifecycle/load-scene.d.ts.map +1 -0
- package/dist/tools/scene-lifecycle/load-scene.js +55 -0
- package/dist/tools/scene-lifecycle/metadata.d.ts +49 -0
- package/dist/tools/scene-lifecycle/metadata.d.ts.map +1 -0
- package/dist/tools/scene-lifecycle/metadata.js +68 -0
- package/dist/tools/scene-lifecycle/rename-scene.d.ts +22 -0
- package/dist/tools/scene-lifecycle/rename-scene.d.ts.map +1 -0
- package/dist/tools/scene-lifecycle/rename-scene.js +63 -0
- package/dist/tools/scene-lifecycle/save-scene.d.ts +42 -0
- package/dist/tools/scene-lifecycle/save-scene.d.ts.map +1 -0
- package/dist/tools/scene-lifecycle/save-scene.js +130 -0
- package/dist/tools/scene-lifecycle/test-utils.d.ts +39 -0
- package/dist/tools/scene-lifecycle/test-utils.d.ts.map +1 -0
- package/dist/tools/scene-lifecycle/test-utils.js +211 -0
- package/dist/tools/scene-query.d.ts +57 -0
- package/dist/tools/scene-query.d.ts.map +1 -0
- package/dist/tools/scene-query.js +645 -0
- package/dist/tools/schemas.d.ts +52 -0
- package/dist/tools/schemas.d.ts.map +1 -0
- package/dist/tools/schemas.js +42 -0
- package/dist/tools/set-zone.d.ts +14 -0
- package/dist/tools/set-zone.d.ts.map +1 -0
- package/dist/tools/set-zone.js +48 -0
- package/dist/tools/templates/create-from-template.d.ts +54 -0
- package/dist/tools/templates/create-from-template.d.ts.map +1 -0
- package/dist/tools/templates/create-from-template.js +145 -0
- package/dist/tools/templates/create-house-from-brief.d.ts +35 -0
- package/dist/tools/templates/create-house-from-brief.d.ts.map +1 -0
- package/dist/tools/templates/create-house-from-brief.js +170 -0
- package/dist/tools/templates/index.d.ts +14 -0
- package/dist/tools/templates/index.d.ts.map +1 -0
- package/dist/tools/templates/index.js +18 -0
- package/dist/tools/templates/list-templates.d.ts +18 -0
- package/dist/tools/templates/list-templates.d.ts.map +1 -0
- package/dist/tools/templates/list-templates.js +36 -0
- package/dist/tools/undo.d.ts +11 -0
- package/dist/tools/undo.d.ts.map +1 -0
- package/dist/tools/undo.js +25 -0
- package/dist/tools/validate-scene.d.ts +14 -0
- package/dist/tools/validate-scene.d.ts.map +1 -0
- package/dist/tools/validate-scene.js +24 -0
- package/dist/tools/variants/generate-variants.d.ts +30 -0
- package/dist/tools/variants/generate-variants.d.ts.map +1 -0
- package/dist/tools/variants/generate-variants.js +160 -0
- package/dist/tools/variants/index.d.ts +9 -0
- package/dist/tools/variants/index.d.ts.map +1 -0
- package/dist/tools/variants/index.js +9 -0
- package/dist/tools/variants/mutations.d.ts +18 -0
- package/dist/tools/variants/mutations.d.ts.map +1 -0
- package/dist/tools/variants/mutations.js +324 -0
- package/dist/tools/vision/analyze-floorplan-image.d.ts +33 -0
- package/dist/tools/vision/analyze-floorplan-image.d.ts.map +1 -0
- package/dist/tools/vision/analyze-floorplan-image.js +146 -0
- package/dist/tools/vision/analyze-room-photo.d.ts +29 -0
- package/dist/tools/vision/analyze-room-photo.d.ts.map +1 -0
- package/dist/tools/vision/analyze-room-photo.js +130 -0
- package/dist/tools/vision/index.d.ts +12 -0
- package/dist/tools/vision/index.d.ts.map +1 -0
- package/dist/tools/vision/index.js +14 -0
- package/dist/transports/http.d.ts +36 -0
- package/dist/transports/http.d.ts.map +1 -0
- package/dist/transports/http.js +203 -0
- package/dist/transports/stdio.d.ts +14 -0
- package/dist/transports/stdio.d.ts.map +1 -0
- package/dist/transports/stdio.js +16 -0
- package/package.json +86 -0
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
import type { SceneOperations } from '../../operations';
|
|
4
|
+
export declare const getProjectStatusInput: {
|
|
5
|
+
id: z.ZodString;
|
|
6
|
+
};
|
|
7
|
+
export declare const getProjectStatusOutput: {
|
|
8
|
+
id: z.ZodString;
|
|
9
|
+
projectId: z.ZodString;
|
|
10
|
+
name: z.ZodString;
|
|
11
|
+
editorUrl: z.ZodString;
|
|
12
|
+
url: z.ZodString;
|
|
13
|
+
ownerId: z.ZodNullable<z.ZodString>;
|
|
14
|
+
thumbnailUrl: z.ZodNullable<z.ZodString>;
|
|
15
|
+
publishedVersion: z.ZodNullable<z.ZodNumber>;
|
|
16
|
+
latestVersion: z.ZodNullable<z.ZodNumber>;
|
|
17
|
+
draftVersion: z.ZodNullable<z.ZodNumber>;
|
|
18
|
+
browserVisibleVersion: z.ZodNullable<z.ZodNumber>;
|
|
19
|
+
version: z.ZodNumber;
|
|
20
|
+
isEmpty: z.ZodBoolean;
|
|
21
|
+
sizeBytes: z.ZodNumber;
|
|
22
|
+
nodeCount: z.ZodNumber;
|
|
23
|
+
graphHash: z.ZodNullable<z.ZodString>;
|
|
24
|
+
createdAt: z.ZodString;
|
|
25
|
+
updatedAt: z.ZodString;
|
|
26
|
+
levelIds: z.ZodArray<z.ZodString>;
|
|
27
|
+
defaultLevelId: z.ZodNullable<z.ZodString>;
|
|
28
|
+
nextStep: z.ZodString;
|
|
29
|
+
};
|
|
30
|
+
export declare function registerGetProjectStatus(server: McpServer, operations: SceneOperations): void;
|
|
31
|
+
//# sourceMappingURL=get-project-status.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-project-status.d.ts","sourceRoot":"","sources":["../../../src/tools/scene-lifecycle/get-project-status.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AACxE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAIvD,eAAO,MAAM,qBAAqB;;CAEjC,CAAA;AAED,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;CAsBlC,CAAA;AAED,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,eAAe,GAAG,IAAI,CA2C7F"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { ErrorCode, McpError, throwMcpError } from '../errors';
|
|
3
|
+
import { currentLevelContext, projectStatusPayload } from './metadata';
|
|
4
|
+
export const getProjectStatusInput = {
|
|
5
|
+
id: z.string().min(1).max(64),
|
|
6
|
+
};
|
|
7
|
+
export const getProjectStatusOutput = {
|
|
8
|
+
id: z.string(),
|
|
9
|
+
projectId: z.string(),
|
|
10
|
+
name: z.string(),
|
|
11
|
+
editorUrl: z.string(),
|
|
12
|
+
url: z.string(),
|
|
13
|
+
ownerId: z.string().nullable(),
|
|
14
|
+
thumbnailUrl: z.string().nullable(),
|
|
15
|
+
publishedVersion: z.number().nullable(),
|
|
16
|
+
latestVersion: z.number().nullable(),
|
|
17
|
+
draftVersion: z.number().nullable(),
|
|
18
|
+
browserVisibleVersion: z.number().nullable(),
|
|
19
|
+
version: z.number(),
|
|
20
|
+
isEmpty: z.boolean(),
|
|
21
|
+
sizeBytes: z.number(),
|
|
22
|
+
nodeCount: z.number(),
|
|
23
|
+
graphHash: z.string().nullable(),
|
|
24
|
+
createdAt: z.string(),
|
|
25
|
+
updatedAt: z.string(),
|
|
26
|
+
levelIds: z.array(z.string()),
|
|
27
|
+
defaultLevelId: z.string().nullable(),
|
|
28
|
+
nextStep: z.string(),
|
|
29
|
+
};
|
|
30
|
+
export function registerGetProjectStatus(server, operations) {
|
|
31
|
+
server.registerTool('get_project_status', {
|
|
32
|
+
title: 'Get project status',
|
|
33
|
+
description: 'Authoritative status/debug call for a Pascal project: editor URL, browser-visible version, latest saved version, published version, node count, and graph hash.',
|
|
34
|
+
inputSchema: getProjectStatusInput,
|
|
35
|
+
outputSchema: getProjectStatusOutput,
|
|
36
|
+
}, async ({ id }) => {
|
|
37
|
+
try {
|
|
38
|
+
const status = await operations.getProjectStatus(id);
|
|
39
|
+
if (!status) {
|
|
40
|
+
throwMcpError(ErrorCode.InvalidParams, 'project_not_found', { id });
|
|
41
|
+
}
|
|
42
|
+
const activeScene = operations.getActiveScene();
|
|
43
|
+
if (activeScene?.id !== status.id) {
|
|
44
|
+
const scene = await operations.loadStoredScene(status.id);
|
|
45
|
+
if (scene) {
|
|
46
|
+
operations.loadJSON(scene.graph);
|
|
47
|
+
operations.setActiveScene(scene);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
const nextStep = status.nodeCount > 0
|
|
51
|
+
? 'Open editorUrl or continue editing, then save_scene again.'
|
|
52
|
+
: 'Project is empty. Build a scene with semantic tools or create_from_template, then save_scene.';
|
|
53
|
+
const payload = {
|
|
54
|
+
...projectStatusPayload(status, nextStep),
|
|
55
|
+
...currentLevelContext(operations),
|
|
56
|
+
};
|
|
57
|
+
return {
|
|
58
|
+
content: [{ type: 'text', text: JSON.stringify(payload) }],
|
|
59
|
+
structuredContent: payload,
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
catch (err) {
|
|
63
|
+
if (err instanceof McpError)
|
|
64
|
+
throw err;
|
|
65
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
66
|
+
throwMcpError(ErrorCode.InternalError, msg);
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
import type { SceneOperations } from '../../operations';
|
|
3
|
+
/**
|
|
4
|
+
* Register the scene-lifecycle MCP tools (`save_scene`, `load_scene`,
|
|
5
|
+
* `list_scenes`, `delete_scene`, `rename_scene`) against the given server.
|
|
6
|
+
* All tools operate against shared scene operations so MCP, REST, and future CLI
|
|
7
|
+
* entry points share the same storage boundary.
|
|
8
|
+
*/
|
|
9
|
+
export declare function registerSceneLifecycleTools(server: McpServer, operations: SceneOperations): void;
|
|
10
|
+
export { createProjectInput, createProjectOutput, registerCreateProject } from './create-project';
|
|
11
|
+
export { deleteSceneInput, deleteSceneOutput, registerDeleteScene } from './delete-scene';
|
|
12
|
+
export { getProjectStatusInput, getProjectStatusOutput, registerGetProjectStatus, } from './get-project-status';
|
|
13
|
+
export { listScenesInput, listScenesOutput, registerListScenes } from './list-scenes';
|
|
14
|
+
export { loadSceneInput, loadSceneOutput, registerLoadScene } from './load-scene';
|
|
15
|
+
export { registerRenameScene, renameSceneInput, renameSceneOutput } from './rename-scene';
|
|
16
|
+
export { registerSaveScene, saveSceneInput, saveSceneOutput } from './save-scene';
|
|
17
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/scene-lifecycle/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AACxE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AASvD;;;;;GAKG;AACH,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,eAAe,GAAG,IAAI,CAQhG;AAED,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAA;AACjG,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAA;AACzF,OAAO,EACL,qBAAqB,EACrB,sBAAsB,EACtB,wBAAwB,GACzB,MAAM,sBAAsB,CAAA;AAC7B,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAA;AACrF,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAA;AACjF,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;AACzF,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { registerCreateProject } from './create-project';
|
|
2
|
+
import { registerDeleteScene } from './delete-scene';
|
|
3
|
+
import { registerGetProjectStatus } from './get-project-status';
|
|
4
|
+
import { registerListScenes } from './list-scenes';
|
|
5
|
+
import { registerLoadScene } from './load-scene';
|
|
6
|
+
import { registerRenameScene } from './rename-scene';
|
|
7
|
+
import { registerSaveScene } from './save-scene';
|
|
8
|
+
/**
|
|
9
|
+
* Register the scene-lifecycle MCP tools (`save_scene`, `load_scene`,
|
|
10
|
+
* `list_scenes`, `delete_scene`, `rename_scene`) against the given server.
|
|
11
|
+
* All tools operate against shared scene operations so MCP, REST, and future CLI
|
|
12
|
+
* entry points share the same storage boundary.
|
|
13
|
+
*/
|
|
14
|
+
export function registerSceneLifecycleTools(server, operations) {
|
|
15
|
+
registerCreateProject(server, operations);
|
|
16
|
+
registerGetProjectStatus(server, operations);
|
|
17
|
+
registerSaveScene(server, operations);
|
|
18
|
+
registerLoadScene(server, operations);
|
|
19
|
+
registerListScenes(server, operations);
|
|
20
|
+
registerDeleteScene(server, operations);
|
|
21
|
+
registerRenameScene(server, operations);
|
|
22
|
+
}
|
|
23
|
+
export { createProjectInput, createProjectOutput, registerCreateProject } from './create-project';
|
|
24
|
+
export { deleteSceneInput, deleteSceneOutput, registerDeleteScene } from './delete-scene';
|
|
25
|
+
export { getProjectStatusInput, getProjectStatusOutput, registerGetProjectStatus, } from './get-project-status';
|
|
26
|
+
export { listScenesInput, listScenesOutput, registerListScenes } from './list-scenes';
|
|
27
|
+
export { loadSceneInput, loadSceneOutput, registerLoadScene } from './load-scene';
|
|
28
|
+
export { registerRenameScene, renameSceneInput, renameSceneOutput } from './rename-scene';
|
|
29
|
+
export { registerSaveScene, saveSceneInput, saveSceneOutput } from './save-scene';
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
import type { SceneOperations } from '../../operations';
|
|
4
|
+
export declare const listScenesInput: {
|
|
5
|
+
projectId: z.ZodOptional<z.ZodString>;
|
|
6
|
+
limit: z.ZodOptional<z.ZodNumber>;
|
|
7
|
+
};
|
|
8
|
+
export declare const listScenesOutput: {
|
|
9
|
+
scenes: z.ZodArray<z.ZodObject<{
|
|
10
|
+
id: z.ZodString;
|
|
11
|
+
name: z.ZodString;
|
|
12
|
+
projectId: z.ZodNullable<z.ZodString>;
|
|
13
|
+
thumbnailUrl: z.ZodNullable<z.ZodString>;
|
|
14
|
+
version: z.ZodNumber;
|
|
15
|
+
createdAt: z.ZodString;
|
|
16
|
+
updatedAt: z.ZodString;
|
|
17
|
+
ownerId: z.ZodNullable<z.ZodString>;
|
|
18
|
+
sizeBytes: z.ZodNumber;
|
|
19
|
+
nodeCount: z.ZodNumber;
|
|
20
|
+
editorUrl: z.ZodOptional<z.ZodString>;
|
|
21
|
+
url: z.ZodOptional<z.ZodString>;
|
|
22
|
+
published: z.ZodOptional<z.ZodBoolean>;
|
|
23
|
+
graphHash: z.ZodOptional<z.ZodString>;
|
|
24
|
+
}, z.core.$strip>>;
|
|
25
|
+
};
|
|
26
|
+
export declare function registerListScenes(server: McpServer, operations: SceneOperations): void;
|
|
27
|
+
//# sourceMappingURL=list-scenes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-scenes.d.ts","sourceRoot":"","sources":["../../../src/tools/scene-lifecycle/list-scenes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AACxE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAKvD,eAAO,MAAM,eAAe;;;CAG3B,CAAA;AAED,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;CAmB5B,CAAA;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,eAAe,GAAG,IAAI,CA2BvF"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { ErrorCode, throwMcpError } from '../errors';
|
|
3
|
+
const DEFAULT_LIMIT = 100;
|
|
4
|
+
export const listScenesInput = {
|
|
5
|
+
projectId: z.string().optional(),
|
|
6
|
+
limit: z.number().int().positive().max(1000).optional(),
|
|
7
|
+
};
|
|
8
|
+
export const listScenesOutput = {
|
|
9
|
+
scenes: z.array(z.object({
|
|
10
|
+
id: z.string(),
|
|
11
|
+
name: z.string(),
|
|
12
|
+
projectId: z.string().nullable(),
|
|
13
|
+
thumbnailUrl: z.string().nullable(),
|
|
14
|
+
version: z.number(),
|
|
15
|
+
createdAt: z.string(),
|
|
16
|
+
updatedAt: z.string(),
|
|
17
|
+
ownerId: z.string().nullable(),
|
|
18
|
+
sizeBytes: z.number(),
|
|
19
|
+
nodeCount: z.number(),
|
|
20
|
+
editorUrl: z.string().optional(),
|
|
21
|
+
url: z.string().optional(),
|
|
22
|
+
published: z.boolean().optional(),
|
|
23
|
+
graphHash: z.string().optional(),
|
|
24
|
+
})),
|
|
25
|
+
};
|
|
26
|
+
export function registerListScenes(server, operations) {
|
|
27
|
+
server.registerTool('list_scenes', {
|
|
28
|
+
title: 'List scenes',
|
|
29
|
+
description: 'List scenes in the SceneStore. Optionally filter by `projectId` and cap results with `limit` (default 100).',
|
|
30
|
+
inputSchema: listScenesInput,
|
|
31
|
+
outputSchema: listScenesOutput,
|
|
32
|
+
}, async ({ projectId, limit }) => {
|
|
33
|
+
try {
|
|
34
|
+
const scenes = await operations.listScenes({
|
|
35
|
+
...(projectId !== undefined ? { projectId } : {}),
|
|
36
|
+
limit: limit ?? DEFAULT_LIMIT,
|
|
37
|
+
});
|
|
38
|
+
const payload = { scenes };
|
|
39
|
+
return {
|
|
40
|
+
content: [{ type: 'text', text: JSON.stringify(payload) }],
|
|
41
|
+
structuredContent: payload,
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
catch (err) {
|
|
45
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
46
|
+
throwMcpError(ErrorCode.InternalError, msg);
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
import type { SceneOperations } from '../../operations';
|
|
4
|
+
export declare const loadSceneInput: {
|
|
5
|
+
id: z.ZodString;
|
|
6
|
+
};
|
|
7
|
+
export declare const loadSceneOutput: {
|
|
8
|
+
id: z.ZodString;
|
|
9
|
+
name: z.ZodString;
|
|
10
|
+
projectId: z.ZodNullable<z.ZodString>;
|
|
11
|
+
thumbnailUrl: z.ZodNullable<z.ZodString>;
|
|
12
|
+
version: z.ZodNumber;
|
|
13
|
+
createdAt: z.ZodString;
|
|
14
|
+
updatedAt: z.ZodString;
|
|
15
|
+
ownerId: z.ZodNullable<z.ZodString>;
|
|
16
|
+
sizeBytes: z.ZodNumber;
|
|
17
|
+
nodeCount: z.ZodNumber;
|
|
18
|
+
url: z.ZodString;
|
|
19
|
+
editorUrl: z.ZodString;
|
|
20
|
+
published: z.ZodBoolean;
|
|
21
|
+
isDraft: z.ZodBoolean;
|
|
22
|
+
saveMode: z.ZodEnum<{
|
|
23
|
+
draft: "draft";
|
|
24
|
+
checkpoint: "checkpoint";
|
|
25
|
+
}>;
|
|
26
|
+
graphHash: z.ZodOptional<z.ZodString>;
|
|
27
|
+
levelIds: z.ZodArray<z.ZodString>;
|
|
28
|
+
defaultLevelId: z.ZodNullable<z.ZodString>;
|
|
29
|
+
};
|
|
30
|
+
export declare function registerLoadScene(server: McpServer, bridge: SceneOperations): void;
|
|
31
|
+
//# sourceMappingURL=load-scene.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"load-scene.d.ts","sourceRoot":"","sources":["../../../src/tools/scene-lifecycle/load-scene.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AACxE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAIvD,eAAO,MAAM,cAAc;;CAE1B,CAAA;AAED,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;CAmB3B,CAAA;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,eAAe,GAAG,IAAI,CAgClF"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { ErrorCode, throwMcpError } from '../errors';
|
|
3
|
+
import { currentLevelContext, sceneMetaPayload } from './metadata';
|
|
4
|
+
export const loadSceneInput = {
|
|
5
|
+
id: z.string().min(1).max(64),
|
|
6
|
+
};
|
|
7
|
+
export const loadSceneOutput = {
|
|
8
|
+
id: z.string(),
|
|
9
|
+
name: z.string(),
|
|
10
|
+
projectId: z.string().nullable(),
|
|
11
|
+
thumbnailUrl: z.string().nullable(),
|
|
12
|
+
version: z.number(),
|
|
13
|
+
createdAt: z.string(),
|
|
14
|
+
updatedAt: z.string(),
|
|
15
|
+
ownerId: z.string().nullable(),
|
|
16
|
+
sizeBytes: z.number(),
|
|
17
|
+
nodeCount: z.number(),
|
|
18
|
+
url: z.string(),
|
|
19
|
+
editorUrl: z.string(),
|
|
20
|
+
published: z.boolean(),
|
|
21
|
+
isDraft: z.boolean(),
|
|
22
|
+
saveMode: z.enum(['draft', 'checkpoint']),
|
|
23
|
+
graphHash: z.string().optional(),
|
|
24
|
+
levelIds: z.array(z.string()),
|
|
25
|
+
defaultLevelId: z.string().nullable(),
|
|
26
|
+
};
|
|
27
|
+
export function registerLoadScene(server, bridge) {
|
|
28
|
+
server.registerTool('load_scene', {
|
|
29
|
+
title: 'Load scene',
|
|
30
|
+
description: 'Load a scene from the SceneStore into the bridge. Returns the scene metadata. Throws `scene_not_found` if the id does not exist.',
|
|
31
|
+
inputSchema: loadSceneInput,
|
|
32
|
+
outputSchema: loadSceneOutput,
|
|
33
|
+
}, async ({ id }) => {
|
|
34
|
+
const result = await bridge.loadStoredScene(id);
|
|
35
|
+
if (!result) {
|
|
36
|
+
throwMcpError(ErrorCode.InvalidParams, 'scene_not_found', { id });
|
|
37
|
+
}
|
|
38
|
+
try {
|
|
39
|
+
bridge.loadJSON(result.graph);
|
|
40
|
+
bridge.setActiveScene(result);
|
|
41
|
+
}
|
|
42
|
+
catch (err) {
|
|
43
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
44
|
+
throwMcpError(ErrorCode.InvalidRequest, `load_failed: ${msg}`, { id });
|
|
45
|
+
}
|
|
46
|
+
const payload = {
|
|
47
|
+
...sceneMetaPayload(result, result.graph),
|
|
48
|
+
...currentLevelContext(bridge),
|
|
49
|
+
};
|
|
50
|
+
return {
|
|
51
|
+
content: [{ type: 'text', text: JSON.stringify(payload) }],
|
|
52
|
+
structuredContent: payload,
|
|
53
|
+
};
|
|
54
|
+
});
|
|
55
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import type { SceneGraph } from '@pascal-app/core/clone-scene-graph';
|
|
2
|
+
import type { SceneOperations } from '../../operations';
|
|
3
|
+
import type { ProjectStatus, SceneMeta } from '../../storage/types';
|
|
4
|
+
export declare function computeGraphHash(graph: SceneGraph): string;
|
|
5
|
+
export declare function editorUrlFor(meta: Pick<SceneMeta, 'id' | 'editorUrl' | 'url'>): string;
|
|
6
|
+
export declare function sceneMetaPayload(meta: SceneMeta, graph?: SceneGraph): {
|
|
7
|
+
id: string;
|
|
8
|
+
name: string;
|
|
9
|
+
projectId: string | null;
|
|
10
|
+
thumbnailUrl: string | null;
|
|
11
|
+
version: number;
|
|
12
|
+
createdAt: string;
|
|
13
|
+
updatedAt: string;
|
|
14
|
+
ownerId: string | null;
|
|
15
|
+
sizeBytes: number;
|
|
16
|
+
nodeCount: number;
|
|
17
|
+
editorUrl: string;
|
|
18
|
+
url: string;
|
|
19
|
+
published: boolean;
|
|
20
|
+
isDraft: boolean;
|
|
21
|
+
saveMode: import("../../storage").SceneSaveMode;
|
|
22
|
+
graphHash: string | undefined;
|
|
23
|
+
};
|
|
24
|
+
export declare function projectStatusPayload(status: ProjectStatus, nextStep?: string): {
|
|
25
|
+
nextStep?: string | undefined;
|
|
26
|
+
id: string;
|
|
27
|
+
projectId: string;
|
|
28
|
+
name: string;
|
|
29
|
+
editorUrl: string;
|
|
30
|
+
url: string;
|
|
31
|
+
ownerId: string | null;
|
|
32
|
+
thumbnailUrl: string | null;
|
|
33
|
+
publishedVersion: number | null;
|
|
34
|
+
latestVersion: number | null;
|
|
35
|
+
draftVersion: number | null;
|
|
36
|
+
browserVisibleVersion: number | null;
|
|
37
|
+
version: number;
|
|
38
|
+
isEmpty: boolean;
|
|
39
|
+
sizeBytes: number;
|
|
40
|
+
nodeCount: number;
|
|
41
|
+
graphHash: string | null;
|
|
42
|
+
createdAt: string;
|
|
43
|
+
updatedAt: string;
|
|
44
|
+
};
|
|
45
|
+
export declare function currentLevelContext(operations: SceneOperations): {
|
|
46
|
+
levelIds: string[];
|
|
47
|
+
defaultLevelId: string | null;
|
|
48
|
+
};
|
|
49
|
+
//# sourceMappingURL=metadata.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metadata.d.ts","sourceRoot":"","sources":["../../../src/tools/scene-lifecycle/metadata.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oCAAoC,CAAA;AAEpE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AACvD,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AAEnE,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAO1D;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,GAAG,WAAW,GAAG,KAAK,CAAC,GAAG,MAAM,CAEtF;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,CAAC,EAAE,UAAU;;;;;;;;;;;;;;;;;EAoBnE;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,aAAa,EAAE,QAAQ,CAAC,EAAE,MAAM;;;;;;;;;;;;;;;;;;;;EAsB5E;AAED,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,eAAe;;;EAW9D"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
export function computeGraphHash(graph) {
|
|
3
|
+
const normalized = JSON.stringify({
|
|
4
|
+
nodes: graph.nodes ?? {},
|
|
5
|
+
rootNodeIds: graph.rootNodeIds ?? [],
|
|
6
|
+
collections: graph.collections ?? {},
|
|
7
|
+
});
|
|
8
|
+
return createHash('sha256').update(normalized).digest('hex');
|
|
9
|
+
}
|
|
10
|
+
export function editorUrlFor(meta) {
|
|
11
|
+
return meta.editorUrl ?? meta.url ?? `/editor/${meta.id}`;
|
|
12
|
+
}
|
|
13
|
+
export function sceneMetaPayload(meta, graph) {
|
|
14
|
+
const editorUrl = editorUrlFor(meta);
|
|
15
|
+
return {
|
|
16
|
+
id: meta.id,
|
|
17
|
+
name: meta.name,
|
|
18
|
+
projectId: meta.projectId,
|
|
19
|
+
thumbnailUrl: meta.thumbnailUrl,
|
|
20
|
+
version: meta.version,
|
|
21
|
+
createdAt: meta.createdAt,
|
|
22
|
+
updatedAt: meta.updatedAt,
|
|
23
|
+
ownerId: meta.ownerId,
|
|
24
|
+
sizeBytes: meta.sizeBytes,
|
|
25
|
+
nodeCount: meta.nodeCount,
|
|
26
|
+
editorUrl,
|
|
27
|
+
url: editorUrl,
|
|
28
|
+
published: meta.published ?? true,
|
|
29
|
+
isDraft: meta.isDraft ?? false,
|
|
30
|
+
saveMode: meta.saveMode ?? (meta.isDraft ? 'draft' : 'checkpoint'),
|
|
31
|
+
graphHash: meta.graphHash ?? (graph ? computeGraphHash(graph) : undefined),
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
export function projectStatusPayload(status, nextStep) {
|
|
35
|
+
return {
|
|
36
|
+
id: status.id,
|
|
37
|
+
projectId: status.projectId,
|
|
38
|
+
name: status.name,
|
|
39
|
+
editorUrl: status.editorUrl,
|
|
40
|
+
url: status.url,
|
|
41
|
+
ownerId: status.ownerId,
|
|
42
|
+
thumbnailUrl: status.thumbnailUrl,
|
|
43
|
+
publishedVersion: status.publishedVersion,
|
|
44
|
+
latestVersion: status.latestVersion,
|
|
45
|
+
draftVersion: status.draftVersion,
|
|
46
|
+
browserVisibleVersion: status.browserVisibleVersion,
|
|
47
|
+
version: status.version,
|
|
48
|
+
isEmpty: status.isEmpty,
|
|
49
|
+
sizeBytes: status.sizeBytes,
|
|
50
|
+
nodeCount: status.nodeCount,
|
|
51
|
+
graphHash: status.graphHash,
|
|
52
|
+
createdAt: status.createdAt,
|
|
53
|
+
updatedAt: status.updatedAt,
|
|
54
|
+
...(nextStep ? { nextStep } : {}),
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
export function currentLevelContext(operations) {
|
|
58
|
+
const levels = operations.findNodes({ type: 'level' }).sort((a, b) => {
|
|
59
|
+
const aa = a.type === 'level' ? a.level : 0;
|
|
60
|
+
const bb = b.type === 'level' ? b.level : 0;
|
|
61
|
+
return aa - bb;
|
|
62
|
+
});
|
|
63
|
+
const levelIds = levels.map((level) => level.id);
|
|
64
|
+
return {
|
|
65
|
+
levelIds,
|
|
66
|
+
defaultLevelId: levelIds[0] ?? null,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
import type { SceneOperations } from '../../operations';
|
|
4
|
+
export declare const renameSceneInput: {
|
|
5
|
+
id: z.ZodString;
|
|
6
|
+
newName: z.ZodString;
|
|
7
|
+
expectedVersion: z.ZodOptional<z.ZodNumber>;
|
|
8
|
+
};
|
|
9
|
+
export declare const renameSceneOutput: {
|
|
10
|
+
id: z.ZodString;
|
|
11
|
+
name: z.ZodString;
|
|
12
|
+
projectId: z.ZodNullable<z.ZodString>;
|
|
13
|
+
thumbnailUrl: z.ZodNullable<z.ZodString>;
|
|
14
|
+
version: z.ZodNumber;
|
|
15
|
+
createdAt: z.ZodString;
|
|
16
|
+
updatedAt: z.ZodString;
|
|
17
|
+
ownerId: z.ZodNullable<z.ZodString>;
|
|
18
|
+
sizeBytes: z.ZodNumber;
|
|
19
|
+
nodeCount: z.ZodNumber;
|
|
20
|
+
};
|
|
21
|
+
export declare function registerRenameScene(server: McpServer, operations: SceneOperations): void;
|
|
22
|
+
//# sourceMappingURL=rename-scene.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rename-scene.d.ts","sourceRoot":"","sources":["../../../src/tools/scene-lifecycle/rename-scene.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AACxE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAIvD,eAAO,MAAM,gBAAgB;;;;CAI5B,CAAA;AAED,eAAO,MAAM,iBAAiB;;;;;;;;;;;CAW7B,CAAA;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,eAAe,GAAG,IAAI,CA8CxF"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { SceneNotFoundError, SceneVersionConflictError } from '../../storage/types';
|
|
3
|
+
import { ErrorCode, throwMcpError } from '../errors';
|
|
4
|
+
export const renameSceneInput = {
|
|
5
|
+
id: z.string().min(1).max(64),
|
|
6
|
+
newName: z.string().min(1).max(200),
|
|
7
|
+
expectedVersion: z.number().int().positive().optional(),
|
|
8
|
+
};
|
|
9
|
+
export const renameSceneOutput = {
|
|
10
|
+
id: z.string(),
|
|
11
|
+
name: z.string(),
|
|
12
|
+
projectId: z.string().nullable(),
|
|
13
|
+
thumbnailUrl: z.string().nullable(),
|
|
14
|
+
version: z.number(),
|
|
15
|
+
createdAt: z.string(),
|
|
16
|
+
updatedAt: z.string(),
|
|
17
|
+
ownerId: z.string().nullable(),
|
|
18
|
+
sizeBytes: z.number(),
|
|
19
|
+
nodeCount: z.number(),
|
|
20
|
+
};
|
|
21
|
+
export function registerRenameScene(server, operations) {
|
|
22
|
+
server.registerTool('rename_scene', {
|
|
23
|
+
title: 'Rename scene',
|
|
24
|
+
description: 'Rename a scene in the SceneStore. Returns the updated SceneMeta. Optionally pass `expectedVersion` for optimistic concurrency.',
|
|
25
|
+
inputSchema: renameSceneInput,
|
|
26
|
+
outputSchema: renameSceneOutput,
|
|
27
|
+
}, async ({ id, newName, expectedVersion }) => {
|
|
28
|
+
try {
|
|
29
|
+
const meta = await operations.renameStoredScene(id, newName, {
|
|
30
|
+
...(expectedVersion !== undefined ? { expectedVersion } : {}),
|
|
31
|
+
});
|
|
32
|
+
const payload = {
|
|
33
|
+
id: meta.id,
|
|
34
|
+
name: meta.name,
|
|
35
|
+
projectId: meta.projectId,
|
|
36
|
+
thumbnailUrl: meta.thumbnailUrl,
|
|
37
|
+
version: meta.version,
|
|
38
|
+
createdAt: meta.createdAt,
|
|
39
|
+
updatedAt: meta.updatedAt,
|
|
40
|
+
ownerId: meta.ownerId,
|
|
41
|
+
sizeBytes: meta.sizeBytes,
|
|
42
|
+
nodeCount: meta.nodeCount,
|
|
43
|
+
};
|
|
44
|
+
return {
|
|
45
|
+
content: [{ type: 'text', text: JSON.stringify(payload) }],
|
|
46
|
+
structuredContent: payload,
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
catch (err) {
|
|
50
|
+
if (err instanceof SceneNotFoundError) {
|
|
51
|
+
throwMcpError(ErrorCode.InvalidParams, 'scene_not_found', { id });
|
|
52
|
+
}
|
|
53
|
+
if (err instanceof SceneVersionConflictError) {
|
|
54
|
+
throwMcpError(ErrorCode.InvalidRequest, 'version_conflict', {
|
|
55
|
+
id,
|
|
56
|
+
expectedVersion,
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
60
|
+
throwMcpError(ErrorCode.InternalError, msg);
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
import type { SceneOperations } from '../../operations';
|
|
4
|
+
export declare const saveSceneInput: {
|
|
5
|
+
id: z.ZodOptional<z.ZodString>;
|
|
6
|
+
name: z.ZodString;
|
|
7
|
+
projectId: z.ZodOptional<z.ZodString>;
|
|
8
|
+
expectedVersion: z.ZodOptional<z.ZodNumber>;
|
|
9
|
+
saveMode: z.ZodDefault<z.ZodEnum<{
|
|
10
|
+
draft: "draft";
|
|
11
|
+
checkpoint: "checkpoint";
|
|
12
|
+
}>>;
|
|
13
|
+
publish: z.ZodOptional<z.ZodBoolean>;
|
|
14
|
+
thumbnail: z.ZodOptional<z.ZodString>;
|
|
15
|
+
includeCurrentScene: z.ZodDefault<z.ZodBoolean>;
|
|
16
|
+
graph: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
17
|
+
};
|
|
18
|
+
export declare const saveSceneOutput: {
|
|
19
|
+
id: z.ZodString;
|
|
20
|
+
name: z.ZodString;
|
|
21
|
+
projectId: z.ZodNullable<z.ZodString>;
|
|
22
|
+
thumbnailUrl: z.ZodNullable<z.ZodString>;
|
|
23
|
+
version: z.ZodNumber;
|
|
24
|
+
createdAt: z.ZodString;
|
|
25
|
+
updatedAt: z.ZodString;
|
|
26
|
+
ownerId: z.ZodNullable<z.ZodString>;
|
|
27
|
+
sizeBytes: z.ZodNumber;
|
|
28
|
+
nodeCount: z.ZodNumber;
|
|
29
|
+
url: z.ZodString;
|
|
30
|
+
editorUrl: z.ZodString;
|
|
31
|
+
published: z.ZodBoolean;
|
|
32
|
+
isDraft: z.ZodBoolean;
|
|
33
|
+
saveMode: z.ZodEnum<{
|
|
34
|
+
draft: "draft";
|
|
35
|
+
checkpoint: "checkpoint";
|
|
36
|
+
}>;
|
|
37
|
+
graphHash: z.ZodOptional<z.ZodString>;
|
|
38
|
+
levelIds: z.ZodArray<z.ZodString>;
|
|
39
|
+
defaultLevelId: z.ZodNullable<z.ZodString>;
|
|
40
|
+
};
|
|
41
|
+
export declare function registerSaveScene(server: McpServer, bridge: SceneOperations): void;
|
|
42
|
+
//# sourceMappingURL=save-scene.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"save-scene.d.ts","sourceRoot":"","sources":["../../../src/tools/scene-lifecycle/save-scene.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,kBAAkB,CAAA;AAMvD,eAAO,MAAM,cAAc;;;;;;;;;;;;;CA0B1B,CAAA;AAED,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;CAmB3B,CAAA;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,eAAe,GAAG,IAAI,CAiGlF"}
|