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
JavaScript
/**
* 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