ai-chatbot/lib/canvas/agent-result-view.ts

69 lines
2.0 KiB
TypeScript

import type {
CanvasOperationKind,
CanvasViewOperationPlan,
} from "@/types/canvas/agent-protocol";
function normalizeNodeIds(nodeIds?: string[]) {
return Array.from(
new Set(
(nodeIds || [])
.map((nodeId) => String(nodeId || "").trim())
.filter(Boolean)
)
);
}
export function buildCanvasAgentResultViewOperation(params: {
projectId?: string | null;
operationId: string;
mutationOperation?: CanvasOperationKind;
createdNodeIds?: string[];
updatedNodeIds?: string[];
anchorNodeId?: string | null;
padding?: number;
durationMs?: number;
reason?: string;
}): CanvasViewOperationPlan | null {
const projectId = String(params.projectId || "").trim();
const operationId = String(params.operationId || "").trim();
if (!projectId || !operationId) return null;
const createdNodeIds = normalizeNodeIds(params.createdNodeIds);
const updatedNodeIds = normalizeNodeIds(params.updatedNodeIds).filter(
(nodeId) => !createdNodeIds.includes(nodeId)
);
const nodeIds = createdNodeIds.length > 0 ? createdNodeIds : updatedNodeIds;
if (nodeIds.length === 0) return null;
const requestedAnchorNodeId = String(params.anchorNodeId || "").trim();
const anchorNodeId = nodeIds.includes(requestedAnchorNodeId)
? requestedAnchorNodeId
: nodeIds[0];
const hasCreatedResult = createdNodeIds.length > 0;
const operation =
nodeIds.length > 1
? "focus_nodes"
: hasCreatedResult
? "focus_latest_result"
: "focus_node";
return {
version: 1,
viewOperationId: `${operationId}:view`,
operation,
projectId,
nodeIds,
anchorNodeId,
padding: params.padding ?? 120,
durationMs: params.durationMs ?? 360,
persist: false,
reason:
params.reason ||
(params.mutationOperation === "replace_node_media"
? "focus_canvas_agent_replaced_nodes"
: hasCreatedResult
? "focus_canvas_agent_writeback_result"
: "focus_canvas_agent_updated_nodes"),
};
}