From 0bb134d3b83b709d58e496fc327835fe6d72db0d Mon Sep 17 00:00:00 2001 From: 134 Date: Tue, 23 Jun 2026 15:18:54 +0800 Subject: [PATCH] fix: include all visible canvas nodes in agent fit-all view --- lib/canvas/agent-view-operations.ts | 18 ++++++++++++++++-- tests/routes/canvas-chat-helpers.test.ts | 6 +++--- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/lib/canvas/agent-view-operations.ts b/lib/canvas/agent-view-operations.ts index 771ba06c6..5ef08720c 100644 --- a/lib/canvas/agent-view-operations.ts +++ b/lib/canvas/agent-view-operations.ts @@ -1,4 +1,5 @@ import type { CanvasViewOperationPlan } from "@/types/canvas/agent-protocol"; +import type { NodeType } from "@/types/canvas"; export type CanvasAgentViewNodeLike = { id: string; @@ -28,6 +29,18 @@ export type ResolvedCanvasViewOperation = { const VIEWPORT_ANCHOR_X_RATIO = 0.52; const VIEWPORT_ANCHOR_Y_RATIO = 0.46; +const FIT_ALL_VISIBLE_NODE_TYPES = new Set([ + "message", + "image", + "video", + "text", + "ui-screen", + "workflow", + "scene-fusion", + "model3d", + "world3d", + "agent-slot", +] satisfies NodeType[]); function toFiniteNumber(value: unknown, fallback = 0) { const numericValue = Number(value); @@ -213,8 +226,9 @@ function computeCanvasAgentFocusNodesViewport(params: { } function getFitAllViewNodes(nodes: CanvasAgentViewNodeLike[]) { - const visibleNodeTypes = new Set(["image", "video", "agent-slot", "ui-screen", "text"]); - return nodes.filter((node) => visibleNodeTypes.has(String(node.type))); + return nodes.filter((node) => + FIT_ALL_VISIBLE_NODE_TYPES.has(String(node.type) as NodeType) + ); } export function resolveCanvasViewOperation(params: { diff --git a/tests/routes/canvas-chat-helpers.test.ts b/tests/routes/canvas-chat-helpers.test.ts index 3567dc613..92c2ccbad 100644 --- a/tests/routes/canvas-chat-helpers.test.ts +++ b/tests/routes/canvas-chat-helpers.test.ts @@ -1822,9 +1822,9 @@ test.describe("canvas chat pure helpers", () => { }); expect(fitAll?.targetNodeIds).toEqual([]); - expect(fitAll?.viewport.zoom).toBeCloseTo(0.675); - expect(fitAll?.viewport.x).toBeCloseTo(317.5); - expect(fitAll?.viewport.y).toBeCloseTo(266.75); + expect(fitAll?.viewport.zoom).toBeCloseTo(0.1784615385); + expect(fitAll?.viewport.x).toBeCloseTo(305.8461538); + expect(fitAll?.viewport.y).toBeCloseTo(153.8461538); }); test("resolves grid media placements to the right of an anchor node", () => {