UNPKG

ai-debug-local-mcp

Version:

🎯 ENHANCED AI GUIDANCE v4.1.2: Dramatically improved tool descriptions help AI users choose the right tools instead of 'close enough' options. Ultra-fast keyboard automation (10x speed), universal recording, multi-ecosystem debugging support, and compreh

236 lines 7.57 kB
/** * Flutter Automation API * High-level API for automating Flutter web applications */ import { FlutterQuantumDebugger } from './flutter-quantum-debugger.js'; import { FlutterFormFiller } from './flutter-form-filler.js'; import { FlutterComprehensiveDetector } from './flutter-comprehensive-detector.js'; export class FlutterAutomation { debugger; constructor() { this.debugger = new FlutterQuantumDebugger(); } /** * Start an automation session */ async startSession(page, sessionId) { // Don't initialize debugger yet - wait until we navigate return { id: sessionId, debugger: this.debugger, page }; } /** * Navigate to a Flutter app and prepare for automation */ async navigateAndPrepare(session, url) { try { // console.log(`🌐 Navigating to ${url}...`); await session.page.goto(url, { waitUntil: 'domcontentloaded' }); // Initialize the quantum debugger after navigation await this.debugger.initialize(session.page, session.id); // Get the session to access detected elements const quantumSession = this.debugger.getSession(session.id); if (!quantumSession) { return { success: false, message: 'Failed to get quantum session' }; } const elements = quantumSession.detectedElements; return { success: true, message: `Ready to automate! Found ${elements.length} interactive elements`, details: { elementCount: elements.length } }; } catch (error) { return { success: false, message: `Navigation failed: ${error}` }; } } /** * Click on an element by its text */ async click(session, elementText) { try { const result = await this.debugger.interact(session.id, `click ${elementText}`); if (result.success) { return { success: true, message: `Clicked on "${elementText}"`, details: { method: result.method } }; } else { return { success: false, message: `Failed to click "${elementText}": ${result.error}` }; } } catch (error) { return { success: false, message: `Click error: ${error}` }; } } /** * Type text into a field */ async type(session, fieldName, text) { try { const result = await this.debugger.interact(session.id, `type ${text} in ${fieldName}`); if (result.success) { return { success: true, message: `Typed "${text}" in "${fieldName}"`, details: { method: result.method } }; } else { return { success: false, message: `Failed to type in "${fieldName}": ${result.error}` }; } } catch (error) { return { success: false, message: `Type error: ${error}` }; } } /** * Fill an entire form */ async fillForm(session, formData) { try { const result = await FlutterFormFiller.fillForm(this.debugger, session.id, formData); if (result.success) { return { success: true, message: `Form filled successfully! Filled ${result.filledFields.length} fields`, details: { filledFields: result.filledFields } }; } else { return { success: false, message: `Form filling had errors: ${result.errors.join(', ')}`, details: { filledFields: result.filledFields, errors: result.errors } }; } } catch (error) { return { success: false, message: `Form fill error: ${error}` }; } } /** * Submit a form */ async submitForm(session, submitButtonText = 'Submit') { try { const result = await FlutterFormFiller.submitForm(this.debugger, session.id, submitButtonText); if (result.success) { return { success: true, message: 'Form submitted successfully!' }; } else { return { success: false, message: `Form submission failed: ${result.error}` }; } } catch (error) { return { success: false, message: `Submit error: ${error}` }; } } /** * Take a screenshot */ async screenshot(session, filename) { try { const path = filename || `flutter-screenshot-${Date.now()}.png`; await session.page.screenshot({ path }); return { success: true, message: `Screenshot saved to ${path}`, screenshot: path }; } catch (error) { return { success: false, message: `Screenshot error: ${error}` }; } } /** * Wait for an element to appear */ async waitForElement(session, elementText, timeout = 10000) { try { const startTime = Date.now(); while (Date.now() - startTime < timeout) { const elements = await FlutterComprehensiveDetector.detectAllElements(session.page); const found = FlutterComprehensiveDetector.findElementByText(elements, elementText); if (found) { return { success: true, message: `Element "${elementText}" found`, details: { element: found } }; } await session.page.waitForTimeout(500); } return { success: false, message: `Element "${elementText}" not found within ${timeout}ms` }; } catch (error) { return { success: false, message: `Wait error: ${error}` }; } } /** * Get all visible text on the page */ async getPageText(session) { try { const elements = await FlutterComprehensiveDetector.detectAllElements(session.page); const texts = elements .filter(el => el.label && el.label.trim()) .map(el => el.label); return { success: true, message: `Found ${texts.length} text elements`, details: { texts } }; } catch (error) { return { success: false, message: `Get text error: ${error}` }; } } } //# sourceMappingURL=flutter-automation-api.js.map