mycontext-cli 4.2.10 → 4.2.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +13 -4
- package/dist/README.md +13 -4
- package/dist/agents/implementations/ArchitectAgent.js.map +1 -1
- package/dist/agents/implementations/BuildStrategyAgent.js.map +1 -1
- package/dist/agents/implementations/CodeGenSubAgent.js.map +1 -1
- package/dist/agents/implementations/DemoRecorderAgent.d.ts +73 -0
- package/dist/agents/implementations/DemoRecorderAgent.d.ts.map +1 -0
- package/dist/agents/implementations/DemoRecorderAgent.js +485 -0
- package/dist/agents/implementations/DemoRecorderAgent.js.map +1 -0
- package/dist/agents/implementations/DesignPipelineAgent.d.ts +4 -0
- package/dist/agents/implementations/DesignPipelineAgent.d.ts.map +1 -1
- package/dist/agents/implementations/DesignPipelineAgent.js +82 -10
- package/dist/agents/implementations/DesignPipelineAgent.js.map +1 -1
- package/dist/agents/implementations/DocsSubAgent.js.map +1 -1
- package/dist/agents/implementations/FeaturePlannerAgent.d.ts +10 -0
- package/dist/agents/implementations/FeaturePlannerAgent.d.ts.map +1 -0
- package/dist/agents/implementations/FeaturePlannerAgent.js +35 -0
- package/dist/agents/implementations/FeaturePlannerAgent.js.map +1 -0
- package/dist/agents/implementations/QASubAgent.js.map +1 -1
- package/dist/agents/implementations/SecurityAgent.js.map +1 -1
- package/dist/agents/implementations/VOScriptExtractorAgent.d.ts +84 -0
- package/dist/agents/implementations/VOScriptExtractorAgent.d.ts.map +1 -0
- package/dist/agents/implementations/VOScriptExtractorAgent.js +414 -0
- package/dist/agents/implementations/VOScriptExtractorAgent.js.map +1 -0
- package/dist/agents/implementations/VisionNavigatorAgent.d.ts +52 -0
- package/dist/agents/implementations/VisionNavigatorAgent.d.ts.map +1 -0
- package/dist/agents/implementations/VisionNavigatorAgent.js +313 -0
- package/dist/agents/implementations/VisionNavigatorAgent.js.map +1 -0
- package/dist/agents/implementations/VisionTestCoordinator.d.ts +51 -0
- package/dist/agents/implementations/VisionTestCoordinator.d.ts.map +1 -0
- package/dist/agents/implementations/VisionTestCoordinator.js +348 -0
- package/dist/agents/implementations/VisionTestCoordinator.js.map +1 -0
- package/dist/agents/implementations/VisualValidatorAgent.d.ts +83 -0
- package/dist/agents/implementations/VisualValidatorAgent.d.ts.map +1 -0
- package/dist/agents/implementations/VisualValidatorAgent.js +472 -0
- package/dist/agents/implementations/VisualValidatorAgent.js.map +1 -0
- package/dist/agents/orchestrator/SubAgentOrchestrator.js.map +1 -1
- package/dist/cli.js +3 -0
- package/dist/cli.js.map +1 -1
- package/dist/clients/ClaudeSDKClient.d.ts +4 -0
- package/dist/clients/ClaudeSDKClient.d.ts.map +1 -1
- package/dist/clients/ClaudeSDKClient.js +8 -0
- package/dist/clients/ClaudeSDKClient.js.map +1 -1
- package/dist/clients/MyContextAIClient.d.ts +4 -0
- package/dist/clients/MyContextAIClient.d.ts.map +1 -1
- package/dist/clients/MyContextAIClient.js +69 -0
- package/dist/clients/MyContextAIClient.js.map +1 -1
- package/dist/clients/ProviderChain.d.ts +1 -0
- package/dist/clients/ProviderChain.d.ts.map +1 -1
- package/dist/clients/ProviderChain.js +3 -0
- package/dist/clients/ProviderChain.js.map +1 -1
- package/dist/clients/XAIClient.d.ts +4 -0
- package/dist/clients/XAIClient.d.ts.map +1 -1
- package/dist/clients/XAIClient.js +8 -0
- package/dist/clients/XAIClient.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +110 -204
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/plan-feature.d.ts +3 -0
- package/dist/commands/plan-feature.d.ts.map +1 -0
- package/dist/commands/plan-feature.js +57 -0
- package/dist/commands/plan-feature.js.map +1 -0
- package/dist/commands/sanitize.d.ts.map +1 -1
- package/dist/commands/sanitize.js +95 -7
- package/dist/commands/sanitize.js.map +1 -1
- package/dist/commands/vision-test.d.ts +67 -0
- package/dist/commands/vision-test.d.ts.map +1 -0
- package/dist/commands/vision-test.js +347 -0
- package/dist/commands/vision-test.js.map +1 -0
- package/dist/core/ai/AICore.d.ts +13 -0
- package/dist/core/ai/AICore.d.ts.map +1 -1
- package/dist/core/ai/AICore.js +65 -0
- package/dist/core/ai/AICore.js.map +1 -1
- package/dist/doctor/DoctorEngine.d.ts.map +1 -1
- package/dist/doctor/DoctorEngine.js +4 -1
- package/dist/doctor/DoctorEngine.js.map +1 -1
- package/dist/doctor/rules/index.d.ts +2 -1
- package/dist/doctor/rules/index.d.ts.map +1 -1
- package/dist/doctor/rules/index.js +4 -1
- package/dist/doctor/rules/index.js.map +1 -1
- package/dist/doctor/rules/node-rules.d.ts.map +1 -1
- package/dist/doctor/rules/node-rules.js +41 -0
- package/dist/doctor/rules/node-rules.js.map +1 -1
- package/dist/doctor/rules/security-rules.d.ts +6 -0
- package/dist/doctor/rules/security-rules.d.ts.map +1 -0
- package/dist/doctor/rules/security-rules.js +66 -0
- package/dist/doctor/rules/security-rules.js.map +1 -0
- package/dist/doctor/types.d.ts +1 -1
- package/dist/doctor/types.d.ts.map +1 -1
- package/dist/interfaces/AIClient.d.ts +1 -0
- package/dist/interfaces/AIClient.d.ts.map +1 -1
- package/dist/interfaces/AIClient.js.map +1 -1
- package/dist/mcp/vision-test-runner.d.ts +57 -0
- package/dist/mcp/vision-test-runner.d.ts.map +1 -0
- package/dist/mcp/vision-test-runner.js +337 -0
- package/dist/mcp/vision-test-runner.js.map +1 -0
- package/dist/mcp/vision-testing-server.d.ts +38 -0
- package/dist/mcp/vision-testing-server.d.ts.map +1 -0
- package/dist/mcp/vision-testing-server.js +637 -0
- package/dist/mcp/vision-testing-server.js.map +1 -0
- package/dist/package.json +1 -1
- package/dist/services/gemini-vision.d.ts +3 -11
- package/dist/services/gemini-vision.d.ts.map +1 -1
- package/dist/services/gemini-vision.js +13 -132
- package/dist/services/gemini-vision.js.map +1 -1
- package/dist/services/llmClarifier.d.ts +9 -0
- package/dist/services/llmClarifier.d.ts.map +1 -0
- package/dist/services/llmClarifier.js +22 -0
- package/dist/services/llmClarifier.js.map +1 -0
- package/dist/services/vision-element-finder.d.ts +64 -0
- package/dist/services/vision-element-finder.d.ts.map +1 -0
- package/dist/services/vision-element-finder.js +446 -0
- package/dist/services/vision-element-finder.js.map +1 -0
- package/dist/types/flow-testing.d.ts +1 -1
- package/dist/types/flow-testing.d.ts.map +1 -1
- package/dist/types/vision-testing.d.ts +382 -0
- package/dist/types/vision-testing.d.ts.map +1 -0
- package/dist/types/vision-testing.js +9 -0
- package/dist/types/vision-testing.js.map +1 -0
- package/dist/utils/claudeAgentClient.d.ts +4 -0
- package/dist/utils/claudeAgentClient.d.ts.map +1 -1
- package/dist/utils/claudeAgentClient.js +8 -0
- package/dist/utils/claudeAgentClient.js.map +1 -1
- package/dist/utils/geminiClient.d.ts +41 -6
- package/dist/utils/geminiClient.d.ts.map +1 -1
- package/dist/utils/geminiClient.js +124 -18
- package/dist/utils/geminiClient.js.map +1 -1
- package/dist/utils/githubModelsClient.d.ts +19 -6
- package/dist/utils/githubModelsClient.d.ts.map +1 -1
- package/dist/utils/githubModelsClient.js +94 -7
- package/dist/utils/githubModelsClient.js.map +1 -1
- package/dist/utils/openRouterClient.d.ts +12 -3
- package/dist/utils/openRouterClient.d.ts.map +1 -1
- package/dist/utils/openRouterClient.js +91 -2
- package/dist/utils/openRouterClient.js.map +1 -1
- package/dist/utils/unifiedDesignContextLoader.d.ts.map +1 -1
- package/dist/utils/unifiedDesignContextLoader.js +15 -0
- package/dist/utils/unifiedDesignContextLoader.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,446 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Vision Element Finder Service
|
|
4
|
+
*
|
|
5
|
+
* Combines vision AI with DOM understanding to identify and interact with UI elements.
|
|
6
|
+
* This is the revolutionary approach: instead of brittle CSS selectors,
|
|
7
|
+
* we "see" the page and find elements like a human would.
|
|
8
|
+
*/
|
|
9
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
12
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
13
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
14
|
+
}
|
|
15
|
+
Object.defineProperty(o, k2, desc);
|
|
16
|
+
}) : (function(o, m, k, k2) {
|
|
17
|
+
if (k2 === undefined) k2 = k;
|
|
18
|
+
o[k2] = m[k];
|
|
19
|
+
}));
|
|
20
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
21
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
22
|
+
}) : function(o, v) {
|
|
23
|
+
o["default"] = v;
|
|
24
|
+
});
|
|
25
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
26
|
+
var ownKeys = function(o) {
|
|
27
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
28
|
+
var ar = [];
|
|
29
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
30
|
+
return ar;
|
|
31
|
+
};
|
|
32
|
+
return ownKeys(o);
|
|
33
|
+
};
|
|
34
|
+
return function (mod) {
|
|
35
|
+
if (mod && mod.__esModule) return mod;
|
|
36
|
+
var result = {};
|
|
37
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
38
|
+
__setModuleDefault(result, mod);
|
|
39
|
+
return result;
|
|
40
|
+
};
|
|
41
|
+
})();
|
|
42
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
43
|
+
exports.VisionElementFinder = void 0;
|
|
44
|
+
const AICore_1 = require("../core/ai/AICore");
|
|
45
|
+
const fs = __importStar(require("fs-extra"));
|
|
46
|
+
const path = __importStar(require("path"));
|
|
47
|
+
const uuid_1 = require("uuid");
|
|
48
|
+
class VisionElementFinder {
|
|
49
|
+
constructor(projectPath, confidenceThreshold = 70 // Minimum confidence to trust vision over DOM
|
|
50
|
+
) {
|
|
51
|
+
this.aiCore = AICore_1.AICore.getInstance({
|
|
52
|
+
fallbackEnabled: true,
|
|
53
|
+
workingDirectory: projectPath
|
|
54
|
+
});
|
|
55
|
+
this.screenshotsDir = path.join(projectPath, ".mycontext", "vision-screenshots");
|
|
56
|
+
this.confidenceThreshold = confidenceThreshold;
|
|
57
|
+
fs.ensureDirSync(this.screenshotsDir);
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Analyze the current page using vision
|
|
61
|
+
*/
|
|
62
|
+
async analyzePage(page) {
|
|
63
|
+
// Take screenshot
|
|
64
|
+
const screenshotPath = await this.takeScreenshot(page);
|
|
65
|
+
// Get DOM context for hybrid approach
|
|
66
|
+
const domContext = await this.getDOMContext(page);
|
|
67
|
+
// Analyze with vision AI
|
|
68
|
+
const prompt = this.buildAnalysisPrompt(domContext);
|
|
69
|
+
const visionAnalysis = await this.analyzeScreenshotWithPrompt(screenshotPath, prompt);
|
|
70
|
+
return visionAnalysis;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Find an element by natural language description
|
|
74
|
+
*/
|
|
75
|
+
async findElement(page, description, fallbackSelector) {
|
|
76
|
+
// Take screenshot
|
|
77
|
+
const screenshotPath = await this.takeScreenshot(page);
|
|
78
|
+
// Get DOM context
|
|
79
|
+
const domContext = await this.getDOMContext(page);
|
|
80
|
+
// Ask vision AI to locate the element
|
|
81
|
+
const prompt = `You are analyzing a web page screenshot to locate a specific UI element.
|
|
82
|
+
|
|
83
|
+
**Target Element**: ${description}
|
|
84
|
+
|
|
85
|
+
**Available DOM Context** (use this to correlate with visual):
|
|
86
|
+
${domContext}
|
|
87
|
+
|
|
88
|
+
**Task**: Find the element described as "${description}" in the screenshot.
|
|
89
|
+
|
|
90
|
+
Return a JSON response with this structure:
|
|
91
|
+
\`\`\`json
|
|
92
|
+
{
|
|
93
|
+
"found": true/false,
|
|
94
|
+
"element": {
|
|
95
|
+
"description": "Clear description of what you see",
|
|
96
|
+
"type": "button|link|input|form|card|navigation|text|image|unknown",
|
|
97
|
+
"visualCoordinates": {
|
|
98
|
+
"x": number (center X coordinate),
|
|
99
|
+
"y": number (center Y coordinate),
|
|
100
|
+
"width": number,
|
|
101
|
+
"height": number
|
|
102
|
+
},
|
|
103
|
+
"domSelector": "CSS selector if you can determine one from context",
|
|
104
|
+
"confidence": number (0-100),
|
|
105
|
+
"interactable": true/false,
|
|
106
|
+
"textContent": "Any text visible in the element"
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
\`\`\`
|
|
110
|
+
|
|
111
|
+
If you cannot find the element, set "found": false and provide your reasoning.`;
|
|
112
|
+
try {
|
|
113
|
+
const result = await this.askVisionAI(screenshotPath, prompt);
|
|
114
|
+
if (!result.found) {
|
|
115
|
+
// Try fallback selector if provided
|
|
116
|
+
if (fallbackSelector) {
|
|
117
|
+
return await this.findByDOMSelector(page, fallbackSelector);
|
|
118
|
+
}
|
|
119
|
+
return null;
|
|
120
|
+
}
|
|
121
|
+
// Validate confidence
|
|
122
|
+
if (result.element.confidence < this.confidenceThreshold) {
|
|
123
|
+
console.warn(`Vision confidence (${result.element.confidence}%) below threshold (${this.confidenceThreshold}%). Trying fallback.`);
|
|
124
|
+
if (fallbackSelector) {
|
|
125
|
+
return await this.findByDOMSelector(page, fallbackSelector);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
return {
|
|
129
|
+
id: (0, uuid_1.v4)(),
|
|
130
|
+
...result.element,
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
catch (error) {
|
|
134
|
+
console.error("Vision element finding failed:", error);
|
|
135
|
+
// Try fallback
|
|
136
|
+
if (fallbackSelector) {
|
|
137
|
+
return await this.findByDOMSelector(page, fallbackSelector);
|
|
138
|
+
}
|
|
139
|
+
return null;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Find all interactive elements on the page
|
|
144
|
+
*/
|
|
145
|
+
async findAllInteractiveElements(page) {
|
|
146
|
+
const screenshotPath = await this.takeScreenshot(page);
|
|
147
|
+
const domContext = await this.getDOMContext(page);
|
|
148
|
+
const prompt = `You are analyzing a web page to find ALL interactive elements (buttons, links, inputs, etc.).
|
|
149
|
+
|
|
150
|
+
**DOM Context**:
|
|
151
|
+
${domContext}
|
|
152
|
+
|
|
153
|
+
Return a JSON array of all interactive elements you can identify:
|
|
154
|
+
\`\`\`json
|
|
155
|
+
{
|
|
156
|
+
"elements": [
|
|
157
|
+
{
|
|
158
|
+
"description": "Clear description",
|
|
159
|
+
"type": "button|link|input|form|etc",
|
|
160
|
+
"visualCoordinates": { "x": number, "y": number, "width": number, "height": number },
|
|
161
|
+
"domSelector": "CSS selector if determinable",
|
|
162
|
+
"confidence": number (0-100),
|
|
163
|
+
"interactable": true,
|
|
164
|
+
"textContent": "Text visible in element"
|
|
165
|
+
}
|
|
166
|
+
]
|
|
167
|
+
}
|
|
168
|
+
\`\`\`
|
|
169
|
+
|
|
170
|
+
Be thorough but focus on elements users can interact with.`;
|
|
171
|
+
try {
|
|
172
|
+
const result = await this.askVisionAI(screenshotPath, prompt);
|
|
173
|
+
return result.elements.map((el) => ({
|
|
174
|
+
id: (0, uuid_1.v4)(),
|
|
175
|
+
...el,
|
|
176
|
+
}));
|
|
177
|
+
}
|
|
178
|
+
catch (error) {
|
|
179
|
+
console.error("Failed to find interactive elements:", error);
|
|
180
|
+
return [];
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Decide next action based on current page state
|
|
185
|
+
*/
|
|
186
|
+
async decideNextAction(page, mission, previousSteps, primeObjective) {
|
|
187
|
+
const screenshotPath = await this.takeScreenshot(page);
|
|
188
|
+
const domContext = await this.getDOMContext(page);
|
|
189
|
+
const currentUrl = page.url();
|
|
190
|
+
const prompt = `You are an AI agent testing a web application.
|
|
191
|
+
|
|
192
|
+
**PRIME OBJECTIVE (Hard Gravity)**: "${primeObjective}"
|
|
193
|
+
|
|
194
|
+
**Your Mission**: ${mission}
|
|
195
|
+
|
|
196
|
+
**Current URL**: ${currentUrl}
|
|
197
|
+
|
|
198
|
+
**Previous Steps Taken**:
|
|
199
|
+
${previousSteps.map((step, i) => `${i + 1}. ${step}`).join("\n")}
|
|
200
|
+
|
|
201
|
+
**DOM Context**:
|
|
202
|
+
${domContext}
|
|
203
|
+
|
|
204
|
+
**Task**: Analyze the screenshot and decide the NEXT ACTION to accomplish the mission while staying aligned with the Prime Objective.
|
|
205
|
+
|
|
206
|
+
Return JSON:
|
|
207
|
+
\`\`\`json
|
|
208
|
+
{
|
|
209
|
+
"action": "click|fill|scroll|wait|navigate|upload|complete",
|
|
210
|
+
"confidence": number (0-100),
|
|
211
|
+
"reasoning": "Why you chose this action",
|
|
212
|
+
"visualContext": "What you see on screen",
|
|
213
|
+
"targetElement": {
|
|
214
|
+
"description": "What element to interact with",
|
|
215
|
+
"visualCoordinates": { "x": number, "y": number },
|
|
216
|
+
"domSelector": "CSS selector if possible",
|
|
217
|
+
"confidence": number
|
|
218
|
+
},
|
|
219
|
+
"value": "value for fill/upload actions",
|
|
220
|
+
"url": "URL for navigate action",
|
|
221
|
+
"intent": "High-level intent (e.g., 'submitting form')",
|
|
222
|
+
"alignsWithPrimeObjective": true/false,
|
|
223
|
+
"gravityScore": number (0-100, alignment score)
|
|
224
|
+
}
|
|
225
|
+
\`\`\`
|
|
226
|
+
|
|
227
|
+
If mission is complete, set "action": "complete".
|
|
228
|
+
|
|
229
|
+
CRITICAL: Always check alignment with Prime Objective. If your action deviates, set alignsWithPrimeObjective to false.`;
|
|
230
|
+
try {
|
|
231
|
+
const decision = await this.askVisionAI(screenshotPath, prompt);
|
|
232
|
+
return decision;
|
|
233
|
+
}
|
|
234
|
+
catch (error) {
|
|
235
|
+
throw new Error(`Failed to decide next action: ${error instanceof Error ? error.message : "Unknown error"}`);
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* Click an element using visual coordinates
|
|
240
|
+
*/
|
|
241
|
+
async clickElement(page, element) {
|
|
242
|
+
try {
|
|
243
|
+
// Try visual coordinates first
|
|
244
|
+
if (element.visualCoordinates) {
|
|
245
|
+
const { x, y } = element.visualCoordinates;
|
|
246
|
+
await page.mouse.click(x, y);
|
|
247
|
+
return true;
|
|
248
|
+
}
|
|
249
|
+
// Fallback to DOM selector
|
|
250
|
+
if (element.domSelector) {
|
|
251
|
+
await page.click(element.domSelector);
|
|
252
|
+
return true;
|
|
253
|
+
}
|
|
254
|
+
throw new Error("No valid method to click element");
|
|
255
|
+
}
|
|
256
|
+
catch (error) {
|
|
257
|
+
console.error("Click failed:", error);
|
|
258
|
+
return false;
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
/**
|
|
262
|
+
* Fill an input element using visual coordinates or selector
|
|
263
|
+
*/
|
|
264
|
+
async fillElement(page, element, value) {
|
|
265
|
+
try {
|
|
266
|
+
// Try visual coordinates first
|
|
267
|
+
if (element.visualCoordinates) {
|
|
268
|
+
const { x, y } = element.visualCoordinates;
|
|
269
|
+
await page.mouse.click(x, y);
|
|
270
|
+
// Keyboard.type is appropriate for visual coordinates after focus
|
|
271
|
+
await page.keyboard.type(value, { delay: 50 });
|
|
272
|
+
return true;
|
|
273
|
+
}
|
|
274
|
+
// Fallback to DOM selector
|
|
275
|
+
if (element.domSelector) {
|
|
276
|
+
// Use locator().pressSequentially() instead of page.fill() for React state sync
|
|
277
|
+
await page.locator(element.domSelector).pressSequentially(value, { delay: 50 });
|
|
278
|
+
return true;
|
|
279
|
+
}
|
|
280
|
+
throw new Error("No valid method to fill element");
|
|
281
|
+
}
|
|
282
|
+
catch (error) {
|
|
283
|
+
console.error("Fill failed:", error);
|
|
284
|
+
return false;
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
// Private helper methods
|
|
288
|
+
/**
|
|
289
|
+
* Take screenshot of current page
|
|
290
|
+
*/
|
|
291
|
+
async takeScreenshot(page) {
|
|
292
|
+
const filename = `vision-${Date.now()}-${(0, uuid_1.v4)()}.png`;
|
|
293
|
+
const filepath = path.join(this.screenshotsDir, filename);
|
|
294
|
+
await page.screenshot({ path: filepath, fullPage: true });
|
|
295
|
+
return filepath;
|
|
296
|
+
}
|
|
297
|
+
/**
|
|
298
|
+
* Get DOM context for hybrid approach
|
|
299
|
+
*/
|
|
300
|
+
async getDOMContext(page) {
|
|
301
|
+
try {
|
|
302
|
+
return await page.evaluate(() => {
|
|
303
|
+
const title = document.title;
|
|
304
|
+
const url = window.location.href;
|
|
305
|
+
// Get interactive elements
|
|
306
|
+
const buttons = Array.from(document.querySelectorAll("button"))
|
|
307
|
+
.slice(0, 20)
|
|
308
|
+
.map((b, i) => `Button ${i + 1}: "${b.textContent?.trim()}" (${b.className})`);
|
|
309
|
+
const links = Array.from(document.querySelectorAll("a"))
|
|
310
|
+
.slice(0, 20)
|
|
311
|
+
.map((a, i) => `Link ${i + 1}: "${a.textContent?.trim()}" -> ${a.href} (${a.className})`);
|
|
312
|
+
const inputs = Array.from(document.querySelectorAll("input, textarea"))
|
|
313
|
+
.slice(0, 15)
|
|
314
|
+
.map((i, idx) => `Input ${idx + 1}: type="${i.getAttribute("type")}" placeholder="${i.getAttribute("placeholder")}" name="${i.getAttribute("name")}"`);
|
|
315
|
+
const forms = Array.from(document.querySelectorAll("form"))
|
|
316
|
+
.slice(0, 5)
|
|
317
|
+
.map((f, i) => `Form ${i + 1}: action="${f.action}" (${f.className})`);
|
|
318
|
+
return `
|
|
319
|
+
Page Title: ${title}
|
|
320
|
+
URL: ${url}
|
|
321
|
+
|
|
322
|
+
Interactive Elements:
|
|
323
|
+
|
|
324
|
+
BUTTONS:
|
|
325
|
+
${buttons.join("\n")}
|
|
326
|
+
|
|
327
|
+
LINKS:
|
|
328
|
+
${links.join("\n")}
|
|
329
|
+
|
|
330
|
+
INPUTS:
|
|
331
|
+
${inputs.join("\n")}
|
|
332
|
+
|
|
333
|
+
FORMS:
|
|
334
|
+
${forms.join("\n")}
|
|
335
|
+
`.trim();
|
|
336
|
+
});
|
|
337
|
+
}
|
|
338
|
+
catch (error) {
|
|
339
|
+
return "DOM context unavailable";
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
/**
|
|
343
|
+
* Build comprehensive analysis prompt
|
|
344
|
+
*/
|
|
345
|
+
buildAnalysisPrompt(domContext) {
|
|
346
|
+
return `You are analyzing a web page screenshot to understand the UI state.
|
|
347
|
+
|
|
348
|
+
**DOM Context**:
|
|
349
|
+
${domContext}
|
|
350
|
+
|
|
351
|
+
Return a comprehensive JSON analysis:
|
|
352
|
+
\`\`\`json
|
|
353
|
+
{
|
|
354
|
+
"elements": [/* array of VisualElement objects */],
|
|
355
|
+
"interactiveElements": [/* filteredarray of interactive elements */],
|
|
356
|
+
"uiState": {
|
|
357
|
+
"pageTitle": "string",
|
|
358
|
+
"url": "string",
|
|
359
|
+
"loadingState": "loading|loaded|error",
|
|
360
|
+
"modalOpen": true/false,
|
|
361
|
+
"mainContent": "description of main content"
|
|
362
|
+
},
|
|
363
|
+
"designSystem": {
|
|
364
|
+
"colors": ["#hex1", "#hex2"],
|
|
365
|
+
"typography": ["Font family, size"],
|
|
366
|
+
"spacing": "spacing pattern"
|
|
367
|
+
},
|
|
368
|
+
"layoutStructure": {
|
|
369
|
+
"type": "grid|flex|fixed|responsive",
|
|
370
|
+
"sections": ["header", "sidebar", "main", "footer"]
|
|
371
|
+
},
|
|
372
|
+
"aiInterpretation": "Natural language summary of what's on screen"
|
|
373
|
+
}
|
|
374
|
+
\`\`\``;
|
|
375
|
+
}
|
|
376
|
+
/**
|
|
377
|
+
* Analyze screenshot with custom prompt using AICore fallback
|
|
378
|
+
*/
|
|
379
|
+
async analyzeScreenshotWithPrompt(screenshotPath, prompt) {
|
|
380
|
+
return this.askVisionAI(screenshotPath, prompt);
|
|
381
|
+
}
|
|
382
|
+
/**
|
|
383
|
+
* Ask vision AI with a custom prompt via AICore (with fallback)
|
|
384
|
+
*/
|
|
385
|
+
async askVisionAI(screenshotPath, prompt) {
|
|
386
|
+
try {
|
|
387
|
+
const text = await this.aiCore.generateVisionText(prompt, screenshotPath);
|
|
388
|
+
// Extract JSON from response
|
|
389
|
+
const jsonMatch = text.match(/```json\n([\s\S]*?)\n```/);
|
|
390
|
+
const jsonText = jsonMatch?.[1] || text;
|
|
391
|
+
try {
|
|
392
|
+
return JSON.parse(jsonText);
|
|
393
|
+
}
|
|
394
|
+
catch (parseError) {
|
|
395
|
+
// If JSON parsing fails, try to find ANY JSON object in the string
|
|
396
|
+
const fallbackMatch = text.match(/\{[\s\S]*\}/);
|
|
397
|
+
if (fallbackMatch) {
|
|
398
|
+
return JSON.parse(fallbackMatch[0]);
|
|
399
|
+
}
|
|
400
|
+
throw parseError;
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
catch (error) {
|
|
404
|
+
console.error("Vision AI query failed:", error);
|
|
405
|
+
throw error;
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
/**
|
|
409
|
+
* Fallback: Find element by DOM selector
|
|
410
|
+
*/
|
|
411
|
+
async findByDOMSelector(page, selector) {
|
|
412
|
+
try {
|
|
413
|
+
const element = await page.$(selector);
|
|
414
|
+
if (!element) {
|
|
415
|
+
return null;
|
|
416
|
+
}
|
|
417
|
+
// Get bounding box for coordinates
|
|
418
|
+
const box = await element.boundingBox();
|
|
419
|
+
if (!box) {
|
|
420
|
+
return null;
|
|
421
|
+
}
|
|
422
|
+
// Get text content
|
|
423
|
+
const textContent = await element.textContent();
|
|
424
|
+
return {
|
|
425
|
+
id: (0, uuid_1.v4)(),
|
|
426
|
+
description: `Element found by selector: ${selector}`,
|
|
427
|
+
type: "unknown",
|
|
428
|
+
visualCoordinates: {
|
|
429
|
+
x: box.x + box.width / 2,
|
|
430
|
+
y: box.y + box.height / 2,
|
|
431
|
+
width: box.width,
|
|
432
|
+
height: box.height,
|
|
433
|
+
},
|
|
434
|
+
domSelector: selector,
|
|
435
|
+
confidence: 60, // Lower confidence for DOM fallback
|
|
436
|
+
interactable: true,
|
|
437
|
+
textContent: textContent || undefined,
|
|
438
|
+
};
|
|
439
|
+
}
|
|
440
|
+
catch (error) {
|
|
441
|
+
return null;
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
exports.VisionElementFinder = VisionElementFinder;
|
|
446
|
+
//# sourceMappingURL=vision-element-finder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vision-element-finder.js","sourceRoot":"","sources":["../../src/services/vision-element-finder.ts"],"names":[],"mappings":"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"}
|
|
@@ -22,7 +22,7 @@ export interface TestMission {
|
|
|
22
22
|
* Validation Rule - Specific things to check during testing
|
|
23
23
|
*/
|
|
24
24
|
export interface ValidationRule {
|
|
25
|
-
type:
|
|
25
|
+
type: string;
|
|
26
26
|
description: string;
|
|
27
27
|
selector?: string;
|
|
28
28
|
expectedValue?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"flow-testing.d.ts","sourceRoot":"","sources":["../../src/types/flow-testing.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,EAAE,MAAM,CAAC;IACxB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,cAAc,EAAE,CAAC;IACnC,QAAQ,CAAC,EAAE,GAAG,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,IAAI,
|
|
1
|
+
{"version":3,"file":"flow-testing.d.ts","sourceRoot":"","sources":["../../src/types/flow-testing.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,EAAE,MAAM,CAAC;IACxB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,cAAc,EAAE,CAAC;IACnC,QAAQ,CAAC,EAAE,GAAG,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,MAAM,UAAU,GAClB,SAAS,GACT,SAAS,GACT,QAAQ,GACR,QAAQ,GACR,OAAO,GACP,SAAS,CAAC;AAEd;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE;QACT,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC;CACH;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,WAAW,GAAG,QAAQ,GAAG,OAAO,GAAG,gBAAgB,CAAC;IAC1D,QAAQ,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,UAAU,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,iBAAiB,EAAE,gBAAgB,EAAE,CAAC;IACtC,UAAU,EAAE;QACV,GAAG,EAAE,MAAM,CAAC;QACZ,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,GAAG,CAAC,EAAE,MAAM,CAAC;KACd,CAAC;IACF,KAAK,CAAC,EAAE;QACN,OAAO,EAAE,MAAM,CAAC;QAChB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,IAAI,CAAC,EAAE,MAAM,CAAC;KACf,CAAC;IACF,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE;QACd,mBAAmB,EAAE,MAAM,CAAC;QAC5B,MAAM,EAAE,UAAU,EAAE,CAAC;KACtB,CAAC;CACH;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,cAAc,CAAC;IACrB,MAAM,EAAE,OAAO,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,WAAW,CAAC;IACrB,SAAS,EAAE,mBAAmB,CAAC;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE;QACP,UAAU,EAAE,MAAM,CAAC;QACnB,eAAe,EAAE,MAAM,CAAC;QACxB,WAAW,EAAE,MAAM,CAAC;QACpB,gBAAgB,EAAE,MAAM,CAAC;QACzB,iBAAiB,EAAE,MAAM,CAAC;QAC1B,iBAAiB,EAAE,MAAM,CAAC;QAC1B,aAAa,EAAE,UAAU,CAAC;KAC3B,CAAC;IACF,WAAW,CAAC,EAAE;QACZ,YAAY,EAAE,MAAM,CAAC;QACrB,cAAc,EAAE,MAAM,CAAC;KACxB,CAAC;IACF,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;CAC5B;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,gBAAgB,EAAE;QAChB,SAAS,EAAE,MAAM,CAAC;QAClB,UAAU,EAAE,mBAAmB,EAAE,CAAC;KACnC,EAAE,CAAC;CACL;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE;QACT,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;IACF,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,eAAe,CAAC,EAAE,OAAO,GAAG,UAAU,GAAG,eAAe,CAAC;CAC1D;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;IAC9B,aAAa,EAAE,QAAQ,EAAE,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,WAAW,GAAG,QAAQ,GAAG,WAAW,GAAG,WAAW,CAAC;CAC5D"}
|