import { createErrorResponse, ToolResult } from '@/common/tool-handler'; import { BaseBrowserToolExecutor } from '../base-browser'; import { TOOL_NAMES } from 'chrome-mcp-shared'; import { TOOL_MESSAGE_TYPES } from '@/common/message-types'; import { TIMEOUTS, ERROR_MESSAGES } from '@/common/constants'; interface KeyboardToolParams { keys: string; // Required: string representing keys or key combinations to simulate (e.g., "Enter", "Ctrl+C") selector?: string; // Optional: CSS selector for target element to send keyboard events to delay?: number; // Optional: delay between keystrokes in milliseconds } /** * Tool for simulating keyboard input on web pages */ class KeyboardTool extends BaseBrowserToolExecutor { name = TOOL_NAMES.BROWSER.KEYBOARD; /** * Execute keyboard operation */ async execute(args: KeyboardToolParams): Promise { const { keys, selector, delay = TIMEOUTS.KEYBOARD_DELAY } = args; console.log(`Starting keyboard operation with options:`, args); if (!keys) { return createErrorResponse( ERROR_MESSAGES.INVALID_PARAMETERS + ': Keys parameter must be provided', ); } try { // Get current tab const tabs = await chrome.tabs.query({ active: true, currentWindow: true }); if (!tabs[0]) { return createErrorResponse(ERROR_MESSAGES.TAB_NOT_FOUND); } const tab = tabs[0]; if (!tab.id) { return createErrorResponse(ERROR_MESSAGES.TAB_NOT_FOUND + ': Active tab has no ID'); } await this.injectContentScript(tab.id, ['inject-scripts/keyboard-helper.js']); // Send keyboard simulation message to content script const result = await this.sendMessageToTab(tab.id, { action: TOOL_MESSAGE_TYPES.SIMULATE_KEYBOARD, keys, selector, delay, }); if (result.error) { return createErrorResponse(result.error); } return { content: [ { type: 'text', text: JSON.stringify({ success: true, message: result.message || 'Keyboard operation successful', targetElement: result.targetElement, results: result.results, }), }, ], isError: false, }; } catch (error) { console.error('Error in keyboard operation:', error); return createErrorResponse( `Error simulating keyboard events: ${error instanceof Error ? error.message : String(error)}`, ); } } } export const keyboardTool = new KeyboardTool();