From cc6c4b547c5af578823c798e4308da1de4f902b6 Mon Sep 17 00:00:00 2001 From: 134 Date: Sun, 12 Jul 2026 10:39:05 +0800 Subject: [PATCH] fix: bootstrap empty Pascal scenes for agents --- .../tools/scene-lifecycle/load-scene.test.ts | 18 ++++++++++++++++++ .../src/tools/scene-lifecycle/load-scene.ts | 7 ++++++- 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/services/pascal-editor/packages/mcp/src/tools/scene-lifecycle/load-scene.test.ts b/services/pascal-editor/packages/mcp/src/tools/scene-lifecycle/load-scene.test.ts index d4250f302..abfef8a5f 100644 --- a/services/pascal-editor/packages/mcp/src/tools/scene-lifecycle/load-scene.test.ts +++ b/services/pascal-editor/packages/mcp/src/tools/scene-lifecycle/load-scene.test.ts @@ -60,6 +60,24 @@ describe('load_scene', () => { expect(result.isError).toBe(true) }) + test('bootstraps an editable default hierarchy for an empty stored scene', async () => { + await store.save({ + id: 'empty-scene', + name: 'Empty', + graph: { nodes: {}, rootNodeIds: [] }, + }) + + const result = await client.callTool({ + name: 'load_scene', + arguments: { id: 'empty-scene' }, + }) + + expect(result.isError).toBeFalsy() + expect(bridge.getRootNodeIds().length).toBeGreaterThan(0) + expect(Object.keys(bridge.getNodes()).length).toBeGreaterThan(0) + expect(bridge.findNodes({ type: 'level' }).length).toBeGreaterThan(0) + }) + test('rejects empty id per schema', async () => { const result = await client.callTool({ name: 'load_scene', diff --git a/services/pascal-editor/packages/mcp/src/tools/scene-lifecycle/load-scene.ts b/services/pascal-editor/packages/mcp/src/tools/scene-lifecycle/load-scene.ts index 125a89e8f..2b44c7f7c 100644 --- a/services/pascal-editor/packages/mcp/src/tools/scene-lifecycle/load-scene.ts +++ b/services/pascal-editor/packages/mcp/src/tools/scene-lifecycle/load-scene.ts @@ -45,7 +45,12 @@ export function registerLoadScene(server: McpServer, bridge: SceneOperations): v throwMcpError(ErrorCode.InvalidParams, 'scene_not_found', { id }) } try { - bridge.loadJSON(result.graph) + if (Object.keys(result.graph.nodes ?? {}).length === 0) { + bridge.setScene({}, []) + bridge.loadDefault() + } else { + bridge.loadJSON(result.graph) + } bridge.setActiveScene(result) } catch (err) { const msg = err instanceof Error ? err.message : String(err)