/** * Gemini function declarations for the design agent. * These map to Scribus bridge commands executed via the Python bridge server. */ export const DESIGN_TOOL_DECLARATIONS = [ { name: "new_document", description: "Create a new Scribus document with specified dimensions and margins.", parameters: { type: "object", properties: { width: { type: "number", description: "Document width in mm (default: 210 for A4)" }, height: { type: "number", description: "Document height in mm (default: 297 for A4)" }, margins: { type: "number", description: "Page margins in mm (default: 10)" }, pages: { type: "integer", description: "Number of pages (default: 1)" }, }, required: [], }, }, { name: "add_text_frame", description: "Add a text frame to the page at the specified position. Coordinates and dimensions in mm from top-left.", parameters: { type: "object", properties: { x: { type: "number", description: "X position in mm from left edge" }, y: { type: "number", description: "Y position in mm from top edge" }, width: { type: "number", description: "Frame width in mm" }, height: { type: "number", description: "Frame height in mm" }, text: { type: "string", description: "Text content for the frame" }, fontSize: { type: "number", description: "Font size in points (default: 12)" }, fontName: { type: "string", description: "Font name. Safe fonts: Liberation Sans, Liberation Serif, DejaVu Sans" }, name: { type: "string", description: "Optional frame name for later reference" }, }, required: ["x", "y", "width", "height"], }, }, { name: "add_image_frame", description: "Add an image frame to the page. If imagePath is provided, the image will be loaded into the frame.", parameters: { type: "object", properties: { x: { type: "number", description: "X position in mm from left edge" }, y: { type: "number", description: "Y position in mm from top edge" }, width: { type: "number", description: "Frame width in mm" }, height: { type: "number", description: "Frame height in mm" }, imagePath: { type: "string", description: "Path to image file to load into frame" }, name: { type: "string", description: "Optional frame name for later reference" }, }, required: ["x", "y", "width", "height"], }, }, { name: "add_shape", description: "Add a geometric shape (rectangle or ellipse) to the page.", parameters: { type: "object", properties: { shapeType: { type: "string", description: "Shape type: 'rect' or 'ellipse'", enum: ["rect", "ellipse"] }, x: { type: "number", description: "X position in mm from left edge" }, y: { type: "number", description: "Y position in mm from top edge" }, width: { type: "number", description: "Shape width in mm" }, height: { type: "number", description: "Shape height in mm" }, fill: { type: "string", description: "Fill color as hex string (e.g. '#ff6600')" }, name: { type: "string", description: "Optional shape name for later reference" }, }, required: ["x", "y", "width", "height"], }, }, { name: "set_background_color", description: "Set the page background color by creating a full-page rectangle.", parameters: { type: "object", properties: { color: { type: "string", description: "Background color as hex string (e.g. '#1a1a2e')" }, }, required: ["color"], }, }, { name: "get_state", description: "Get the current document state including all pages and frames. Use this to verify layout after making changes.", parameters: { type: "object", properties: {}, required: [], }, }, { name: "save_document", description: "Save the current document as a .sla file.", parameters: { type: "object", properties: { space: { type: "string", description: "Space slug for the save directory" }, filename: { type: "string", description: "Filename for the .sla file" }, }, required: ["filename"], }, }, { name: "generate_image", description: "Generate an AI image from a text prompt using fal.ai and place it in an image frame on the page.", parameters: { type: "object", properties: { prompt: { type: "string", description: "Text prompt describing the image to generate" }, x: { type: "number", description: "X position for the image frame in mm" }, y: { type: "number", description: "Y position for the image frame in mm" }, width: { type: "number", description: "Image frame width in mm" }, height: { type: "number", description: "Image frame height in mm" }, }, required: ["prompt", "x", "y", "width", "height"], }, }, ]; export type DesignToolName = (typeof DESIGN_TOOL_DECLARATIONS)[number]["name"]; export const DESIGN_SYSTEM_PROMPT = `You are a professional graphic designer using Scribus DTP software. Given a design brief: 1. Create a document with appropriate dimensions 2. Establish visual hierarchy with text frames (heading > subheading > body) 3. Place image frames for visual elements 4. Add geometric shapes for structure and decoration 5. Verify layout with get_state 6. Save the document Coordinates are in mm from top-left. Safe fonts: Liberation Sans, Liberation Serif, DejaVu Sans. Minimum margins: 10mm. Standard sizes: A4 (210x297), A5 (148x210), Letter (216x279). Always create the document first before adding frames.`;