import { z } from 'zod';
// Common schemas
const tabIdSchema = z.string().optional().describe('Tab ID to operate on (uses active tab if not specified)');
const selectorSchema = z.string().min(1).describe('CSS selector for the element');
const timeoutSchema = z.number().int().min(100).max(120000).optional().describe('Timeout in milliseconds');
const waitUntilSchema = z.enum(['load', 'domcontentloaded', 'networkidle0', 'networkidle2']).optional();
// Tab tools schemas
export const listTabsSchema = z.object({});
export const newTabSchema = z.object({
url: z.string().url().optional().describe('URL to navigate to in the new tab'),
});
export const closeTabSchema = z.object({
tabId: tabIdSchema,
});
export const switchTabSchema = z.object({
tabId: z.string().describe('Tab ID to switch to'),
});
// Navigation schemas
export const navigateSchema = z.object({
url: z.string().url().describe('URL to navigate to'),
waitUntil: waitUntilSchema.describe('When to consider navigation complete'),
timeout: timeoutSchema,
tabId: tabIdSchema,
});
export const reloadSchema = z.object({
waitUntil: waitUntilSchema,
timeout: timeoutSchema,
tabId: tabIdSchema,
});
export const goBackSchema = z.object({
waitUntil: waitUntilSchema,
timeout: timeoutSchema,
tabId: tabIdSchema,
});
export const goForwardSchema = z.object({
waitUntil: waitUntilSchema,
timeout: timeoutSchema,
tabId: tabIdSchema,
});
// Interaction schemas
export const clickSchema = z.object({
selector: selectorSchema,
button: z.enum(['left', 'right', 'middle']).optional().default('left').describe('Mouse button to click'),
clickCount: z.number().int().min(1).max(3).optional().default(1).describe('Number of clicks'),
delay: z.number().int().min(0).max(5000).optional().describe('Delay between mousedown and mouseup in ms'),
timeout: timeoutSchema,
tabId: tabIdSchema,
});
export const fillSchema = z.object({
selector: selectorSchema,
value: z.string().describe('Text value to fill'),
clearFirst: z.boolean().optional().default(true).describe('Clear the field before filling'),
timeout: timeoutSchema,
tabId: tabIdSchema,
});
export const selectSchema = z.object({
selector: selectorSchema,
values: z.array(z.string()).min(1).describe('Option values to select'),
timeout: timeoutSchema,
tabId: tabIdSchema,
});
export const hoverSchema = z.object({
selector: selectorSchema,
timeout: timeoutSchema,
tabId: tabIdSchema,
});
export const focusSchema = z.object({
selector: selectorSchema,
timeout: timeoutSchema,
tabId: tabIdSchema,
});
// Input schemas
export const keyboardSchema = z.object({
key: z.string().min(1).describe('Key to press (e.g., "Enter", "Tab", "a")'),
modifiers: z.array(z.enum(['Alt', 'Control', 'Meta', 'Shift'])).optional().default([]).describe('Modifier keys to hold'),
tabId: tabIdSchema,
});
export const mouseSchema = z.object({
x: z.number().describe('X coordinate'),
y: z.number().describe('Y coordinate'),
button: z.enum(['left', 'right', 'middle']).optional().default('left'),
action: z.enum(['move', 'click', 'down', 'up']).optional().default('click').describe('Mouse action to perform'),
tabId: tabIdSchema,
});
export const scrollSchema = z.object({
direction: z.enum(['up', 'down', 'left', 'right']).optional().default('down'),
amount: z.number().int().min(1).optional().default(100).describe('Scroll amount in pixels'),
selector: z.string().optional().describe('Element to scroll (scrolls page if not specified)'),
smooth: z.boolean().optional().default(true).describe('Use smooth scrolling'),
tabId: tabIdSchema,
});
// Content schemas
export const evaluateSchema = z.object({
script: z.string().min(1).max(50000).describe('JavaScript code to execute'),
tabId: tabIdSchema,
});
export const getContentSchema = z.object({
selector: z.string().optional().describe('Element selector (returns full page content if not specified)'),
type: z.enum(['html', 'text']).optional().default('text').describe('Content type to return'),
tabId: tabIdSchema,
});
export const querySelectorSchema = z.object({
selector: selectorSchema,
tabId: tabIdSchema,
});
// Waiting schemas
export const waitForSelectorSchema = z.object({
selector: selectorSchema,
visible: z.boolean().optional().default(false).describe('Wait for element to be visible'),
hidden: z.boolean().optional().default(false).describe('Wait for element to be hidden'),
timeout: timeoutSchema,
tabId: tabIdSchema,
});
export const waitForNavigationSchema = z.object({
waitUntil: waitUntilSchema,
timeout: timeoutSchema,
tabId: tabIdSchema,
});
export const waitSchema = z.object({
ms: z.number().int().min(0).max(30000).describe('Time to wait in milliseconds'),
});
// Media schemas
export const screenshotSchema = z.object({
fullPage: z.boolean().optional().default(false).describe('Capture full scrollable page'),
selector: z.string().optional().describe('Element to screenshot (screenshots viewport if not specified)'),
format: z.enum(['png', 'jpeg', 'webp']).optional().default('png'),
quality: z.number().int().min(0).max(100).optional().describe('Image quality (jpeg/webp only)'),
width: z.number().int().min(200).max(4000).optional().describe('Viewport width in pixels (default 1024)'),
height: z.number().int().min(200).max(4000).optional().describe('Viewport height in pixels (default 768)'),
scale: z.number().min(0.5).max(3).optional().describe('Device scale factor (default 1, use 2 for retina)'),
tabId: tabIdSchema,
});
export const pdfSchema = z.object({
format: z.enum(['Letter', 'Legal', 'Tabloid', 'Ledger', 'A0', 'A1', 'A2', 'A3', 'A4', 'A5', 'A6']).optional().default('A4'),
landscape: z.boolean().optional().default(false),
printBackground: z.boolean().optional().default(true),
margin: z.object({
top: z.string().optional(),
right: z.string().optional(),
bottom: z.string().optional(),
left: z.string().optional(),
}).optional(),
tabId: tabIdSchema,
});
// Cookies schemas
export const getCookiesSchema = z.object({
urls: z.array(z.string().url()).optional().describe('URLs to get cookies for (uses current page URL if not specified)'),
tabId: tabIdSchema,
});
export const setCookiesSchema = z.object({
cookies: z.array(z.object({
name: z.string(),
value: z.string(),
domain: z.string().optional(),
path: z.string().optional().default('/'),
expires: z.number().optional().describe('Unix timestamp when cookie expires'),
httpOnly: z.boolean().optional(),
secure: z.boolean().optional(),
sameSite: z.enum(['Strict', 'Lax', 'None']).optional(),
})).min(1),
tabId: tabIdSchema,
});
export const deleteCookiesSchema = z.object({
names: z.array(z.string()).min(1).describe('Cookie names to delete'),
tabId: tabIdSchema,
});
// Type exports
export type ListTabsInput = z.infer<typeof listTabsSchema>;
export type NewTabInput = z.infer<typeof newTabSchema>;
export type CloseTabInput = z.infer<typeof closeTabSchema>;
export type SwitchTabInput = z.infer<typeof switchTabSchema>;
export type NavigateInput = z.infer<typeof navigateSchema>;
export type ReloadInput = z.infer<typeof reloadSchema>;
export type GoBackInput = z.infer<typeof goBackSchema>;
export type GoForwardInput = z.infer<typeof goForwardSchema>;
export type ClickInput = z.infer<typeof clickSchema>;
export type FillInput = z.infer<typeof fillSchema>;
export type SelectInput = z.infer<typeof selectSchema>;
export type HoverInput = z.infer<typeof hoverSchema>;
export type FocusInput = z.infer<typeof focusSchema>;
export type KeyboardInput = z.infer<typeof keyboardSchema>;
export type MouseInput = z.infer<typeof mouseSchema>;
export type ScrollInput = z.infer<typeof scrollSchema>;
export type EvaluateInput = z.infer<typeof evaluateSchema>;
export type GetContentInput = z.infer<typeof getContentSchema>;
export type QuerySelectorInput = z.infer<typeof querySelectorSchema>;
export type WaitForSelectorInput = z.infer<typeof waitForSelectorSchema>;
export type WaitForNavigationInput = z.infer<typeof waitForNavigationSchema>;
export type WaitInput = z.infer<typeof waitSchema>;
export type ScreenshotInput = z.infer<typeof screenshotSchema>;
export type PdfInput = z.infer<typeof pdfSchema>;
export type GetCookiesInput = z.infer<typeof getCookiesSchema>;
export type SetCookiesInput = z.infer<typeof setCookiesSchema>;
export type DeleteCookiesInput = z.infer<typeof deleteCookiesSchema>;