ai-chatbot/types/canvas/agent-protocol.ts

202 lines
4.4 KiB
TypeScript

import type { NodeType } from "@/types/canvas";
export type CanvasAgentSource = "canvas" | "realtime-canvas";
export type CanvasAgentFocusPolicy =
| "auto"
| "selected"
| "latest_result"
| "original"
| "slot";
export type CanvasAgentSlotType = "image" | "video" | "ui-screen";
export type CanvasAgentSlotFillPolicy =
| "replace-empty"
| "append-version"
| "replace-existing";
export type CanvasAgentSlotAcceptedSource =
| "text"
| "image"
| "selection"
| "annotation";
export interface CanvasViewportContext {
x: number;
y: number;
zoom: number;
width?: number;
height?: number;
}
export type CanvasAgentNodeType = NodeType | "agent-slot";
export interface CanvasAgentNodeRef {
nodeId: string;
type: CanvasAgentNodeType;
assetId?: string;
url?: string;
title?: string;
prompt?: string;
x: number;
y: number;
width?: number;
height?: number;
isSelected?: boolean;
metadata?: {
sourceNodeId?: string;
revisionOf?: string;
generatedByAgent?: boolean;
model?: string;
taskId?: string;
role?: string;
[key: string]: unknown;
};
}
export interface CanvasAgentSlotRef {
nodeId: string;
slotType: CanvasAgentSlotType;
label?: string;
x: number;
y: number;
width: number;
height: number;
aspectRatio: string;
isSelected?: boolean;
fillPolicy: CanvasAgentSlotFillPolicy;
acceptedSources?: CanvasAgentSlotAcceptedSource[];
}
export interface CanvasAgentSlotSpec {
slotType: CanvasAgentSlotType;
label?: string;
aspectRatio?: string;
fillPolicy?: CanvasAgentSlotFillPolicy;
acceptedSources?: CanvasAgentSlotAcceptedSource[];
}
export interface CanvasAgentAnnotationRef {
id: string;
sourceNodeId: string;
type: "text-note" | "arrow-note" | "box" | "freehand" | "crop-box";
text?: string;
bounds?: {
x: number;
y: number;
width: number;
height: number;
};
targetPoint?: {
x: number;
y: number;
};
color?: string;
createdAt?: string;
}
export interface CanvasAgentContext {
version: 1;
source: CanvasAgentSource;
projectId?: string;
canvasRevision?: string;
canvasUpdatedAt?: string;
viewport?: CanvasViewportContext;
selectedNodeIds: string[];
selectedNodes: CanvasAgentNodeRef[];
candidateNodes: CanvasAgentNodeRef[];
slots: CanvasAgentSlotRef[];
annotations: CanvasAgentAnnotationRef[];
focusPolicy: CanvasAgentFocusPolicy;
}
export type CanvasOperationKind =
| "create_agent_slot"
| "create_text_node"
| "fill_slot"
| "insert_beside"
| "append_revision"
| "replace_node_media"
| "add_annotation"
| "link_nodes"
| "move_nodes"
| "delete_nodes"
| "rename_node"
| "update_note"
| "update_text";
export interface CanvasMediaItem {
mediaItemId: string;
type: "image" | "video";
url: string;
assetId?: string;
width?: number;
height?: number;
title?: string;
prompt?: string;
sourceNodeIds?: string[];
metadata?: Record<string, unknown>;
}
export interface CanvasOperationPlan {
version: 1;
operationId: string;
operation: CanvasOperationKind;
projectId: string;
baseCanvasRevision?: string;
baseCanvasUpdatedAt?: string;
sourceNodeIds?: string[];
targetNodeIds?: string[];
targetSlotId?: string;
anchorNodeId?: string;
edgeType?: "default" | "reference" | "conversation";
textContent?: string;
confirmed?: boolean;
layoutStrategy?: "row" | "column" | "grid";
spacing?: number;
targetPosition?: {
x: number;
y: number;
};
slot?: CanvasAgentSlotSpec;
annotations?: Array<
Partial<CanvasAgentAnnotationRef> & {
type: CanvasAgentAnnotationRef["type"];
}
>;
placement?: "right" | "left" | "below" | "above" | "viewport-center";
placementStrategy?: "single" | "row" | "grid" | "overlay" | "beside_each_source";
preserveOriginal?: boolean;
media?: Omit<CanvasMediaItem, "mediaItemId">;
mediaItems?: CanvasMediaItem[];
metadata?: Record<string, unknown>;
}
export type CanvasViewOperationKind =
| "focus_node"
| "focus_nodes"
| "focus_selection"
| "focus_latest_result"
| "fit_all"
| "zoom_in"
| "zoom_out"
| "zoom_to"
| "pan_to";
export interface CanvasViewOperationPlan {
version: 1;
viewOperationId: string;
operation: CanvasViewOperationKind;
projectId?: string;
nodeIds?: string[];
anchorNodeId?: string;
zoom?: number;
padding?: number;
durationMs?: number;
persist?: false;
center?: {
x: number;
y: number;
};
reason?: string;
}