testchimp-runner-core 0.0.21 → 0.0.23
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/VISION_DIAGNOSTICS_IMPROVEMENTS.md +336 -0
- package/dist/credit-usage-service.d.ts +9 -0
- package/dist/credit-usage-service.d.ts.map +1 -1
- package/dist/credit-usage-service.js +20 -5
- package/dist/credit-usage-service.js.map +1 -1
- package/dist/execution-service.d.ts +7 -2
- package/dist/execution-service.d.ts.map +1 -1
- package/dist/execution-service.js +91 -36
- package/dist/execution-service.js.map +1 -1
- package/dist/index.d.ts +30 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +91 -26
- package/dist/index.js.map +1 -1
- package/dist/llm-facade.d.ts +64 -8
- package/dist/llm-facade.d.ts.map +1 -1
- package/dist/llm-facade.js +361 -109
- package/dist/llm-facade.js.map +1 -1
- package/dist/llm-provider.d.ts +39 -0
- package/dist/llm-provider.d.ts.map +1 -0
- package/dist/llm-provider.js +7 -0
- package/dist/llm-provider.js.map +1 -0
- package/dist/model-constants.d.ts +21 -0
- package/dist/model-constants.d.ts.map +1 -0
- package/dist/model-constants.js +24 -0
- package/dist/model-constants.js.map +1 -0
- package/dist/orchestrator/index.d.ts +8 -0
- package/dist/orchestrator/index.d.ts.map +1 -0
- package/dist/orchestrator/index.js +23 -0
- package/dist/orchestrator/index.js.map +1 -0
- package/dist/orchestrator/orchestrator-agent.d.ts +66 -0
- package/dist/orchestrator/orchestrator-agent.d.ts.map +1 -0
- package/dist/orchestrator/orchestrator-agent.js +855 -0
- package/dist/orchestrator/orchestrator-agent.js.map +1 -0
- package/dist/orchestrator/tool-registry.d.ts +74 -0
- package/dist/orchestrator/tool-registry.d.ts.map +1 -0
- package/dist/orchestrator/tool-registry.js +131 -0
- package/dist/orchestrator/tool-registry.js.map +1 -0
- package/dist/orchestrator/tools/check-page-ready.d.ts +13 -0
- package/dist/orchestrator/tools/check-page-ready.d.ts.map +1 -0
- package/dist/orchestrator/tools/check-page-ready.js +72 -0
- package/dist/orchestrator/tools/check-page-ready.js.map +1 -0
- package/dist/orchestrator/tools/extract-data.d.ts +13 -0
- package/dist/orchestrator/tools/extract-data.d.ts.map +1 -0
- package/dist/orchestrator/tools/extract-data.js +84 -0
- package/dist/orchestrator/tools/extract-data.js.map +1 -0
- package/dist/orchestrator/tools/index.d.ts +10 -0
- package/dist/orchestrator/tools/index.d.ts.map +1 -0
- package/dist/orchestrator/tools/index.js +18 -0
- package/dist/orchestrator/tools/index.js.map +1 -0
- package/dist/orchestrator/tools/inspect-page.d.ts +13 -0
- package/dist/orchestrator/tools/inspect-page.d.ts.map +1 -0
- package/dist/orchestrator/tools/inspect-page.js +39 -0
- package/dist/orchestrator/tools/inspect-page.js.map +1 -0
- package/dist/orchestrator/tools/recall-history.d.ts +13 -0
- package/dist/orchestrator/tools/recall-history.d.ts.map +1 -0
- package/dist/orchestrator/tools/recall-history.js +64 -0
- package/dist/orchestrator/tools/recall-history.js.map +1 -0
- package/dist/orchestrator/tools/take-screenshot.d.ts +15 -0
- package/dist/orchestrator/tools/take-screenshot.d.ts.map +1 -0
- package/dist/orchestrator/tools/take-screenshot.js +112 -0
- package/dist/orchestrator/tools/take-screenshot.js.map +1 -0
- package/dist/orchestrator/types.d.ts +133 -0
- package/dist/orchestrator/types.d.ts.map +1 -0
- package/dist/orchestrator/types.js +28 -0
- package/dist/orchestrator/types.js.map +1 -0
- package/dist/playwright-mcp-service.d.ts +9 -0
- package/dist/playwright-mcp-service.d.ts.map +1 -1
- package/dist/playwright-mcp-service.js +20 -5
- package/dist/playwright-mcp-service.js.map +1 -1
- package/dist/progress-reporter.d.ts +97 -0
- package/dist/progress-reporter.d.ts.map +1 -0
- package/dist/progress-reporter.js +18 -0
- package/dist/progress-reporter.js.map +1 -0
- package/dist/prompts.d.ts +24 -0
- package/dist/prompts.d.ts.map +1 -1
- package/dist/prompts.js +593 -68
- package/dist/prompts.js.map +1 -1
- package/dist/providers/backend-proxy-llm-provider.d.ts +25 -0
- package/dist/providers/backend-proxy-llm-provider.d.ts.map +1 -0
- package/dist/providers/backend-proxy-llm-provider.js +76 -0
- package/dist/providers/backend-proxy-llm-provider.js.map +1 -0
- package/dist/providers/local-llm-provider.d.ts +21 -0
- package/dist/providers/local-llm-provider.d.ts.map +1 -0
- package/dist/providers/local-llm-provider.js +35 -0
- package/dist/providers/local-llm-provider.js.map +1 -0
- package/dist/scenario-service.d.ts +27 -1
- package/dist/scenario-service.d.ts.map +1 -1
- package/dist/scenario-service.js +48 -12
- package/dist/scenario-service.js.map +1 -1
- package/dist/scenario-worker-class.d.ts +39 -2
- package/dist/scenario-worker-class.d.ts.map +1 -1
- package/dist/scenario-worker-class.js +614 -86
- package/dist/scenario-worker-class.js.map +1 -1
- package/dist/script-utils.d.ts +2 -0
- package/dist/script-utils.d.ts.map +1 -1
- package/dist/script-utils.js +44 -4
- package/dist/script-utils.js.map +1 -1
- package/dist/types.d.ts +11 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/utils/browser-utils.d.ts +20 -1
- package/dist/utils/browser-utils.d.ts.map +1 -1
- package/dist/utils/browser-utils.js +102 -51
- package/dist/utils/browser-utils.js.map +1 -1
- package/dist/utils/page-info-utils.d.ts +23 -4
- package/dist/utils/page-info-utils.d.ts.map +1 -1
- package/dist/utils/page-info-utils.js +174 -43
- package/dist/utils/page-info-utils.js.map +1 -1
- package/package.json +1 -2
- package/plandocs/HUMAN_LIKE_IMPROVEMENTS.md +642 -0
- package/plandocs/MULTI_AGENT_ARCHITECTURE_REVIEW.md +844 -0
- package/plandocs/ORCHESTRATOR_MVP_SUMMARY.md +539 -0
- package/plandocs/PHASE1_ABSTRACTION_COMPLETE.md +241 -0
- package/plandocs/PHASE1_FINAL_STATUS.md +210 -0
- package/plandocs/PLANNING_SESSION_SUMMARY.md +372 -0
- package/plandocs/SCRIPT_CLEANUP_FEATURE.md +201 -0
- package/plandocs/SCRIPT_GENERATION_ARCHITECTURE.md +364 -0
- package/plandocs/SELECTOR_IMPROVEMENTS.md +139 -0
- package/src/credit-usage-service.ts +23 -5
- package/src/execution-service.ts +152 -42
- package/src/index.ts +169 -26
- package/src/llm-facade.ts +500 -126
- package/src/llm-provider.ts +43 -0
- package/src/model-constants.ts +23 -0
- package/src/orchestrator/index.ts +33 -0
- package/src/orchestrator/orchestrator-agent.ts +1037 -0
- package/src/orchestrator/tool-registry.ts +182 -0
- package/src/orchestrator/tools/check-page-ready.ts +75 -0
- package/src/orchestrator/tools/extract-data.ts +92 -0
- package/src/orchestrator/tools/index.ts +11 -0
- package/src/orchestrator/tools/inspect-page.ts +42 -0
- package/src/orchestrator/tools/recall-history.ts +72 -0
- package/src/orchestrator/tools/take-screenshot.ts +128 -0
- package/src/orchestrator/types.ts +200 -0
- package/src/playwright-mcp-service.ts +23 -5
- package/src/progress-reporter.ts +109 -0
- package/src/prompts.ts +606 -69
- package/src/providers/backend-proxy-llm-provider.ts +91 -0
- package/src/providers/local-llm-provider.ts +38 -0
- package/src/scenario-service.ts +83 -13
- package/src/scenario-worker-class.ts +740 -72
- package/src/script-utils.ts +50 -5
- package/src/types.ts +13 -1
- package/src/utils/browser-utils.ts +123 -51
- package/src/utils/page-info-utils.ts +210 -53
- package/testchimp-runner-core-0.0.22.tgz +0 -0
|
@@ -0,0 +1,336 @@
|
|
|
1
|
+
# Vision-Based Diagnostic Analysis Improvements
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
Enhanced the test automation system to use screenshot-based vision analysis as a **diagnostic tool** to understand WHY failures occur and recommend better strategies based on visual reality vs DOM assumptions.
|
|
5
|
+
|
|
6
|
+
**Vision diagnostics are now utilized in BOTH:**
|
|
7
|
+
1. **Script Generation** (`ScenarioWorker`) - When generating commands from scenarios
|
|
8
|
+
2. **Script Repair/Execution** (`ExecutionService`) - When repairing failing scripts with AI
|
|
9
|
+
|
|
10
|
+
## Problem Statement (From Logs)
|
|
11
|
+
1. **Hallucinated Verification Targets**: Goal completion was creating fake sub-goals like "verify message was sent" and looking for non-existent elements like "Message sent" text
|
|
12
|
+
2. **No Screenshot Analysis**: Vision mode was never triggering because LLM assessment always said "NO"
|
|
13
|
+
|
|
14
|
+
## Solutions Implemented
|
|
15
|
+
|
|
16
|
+
### 1. Fixed Hallucinated Verification Targets ✅
|
|
17
|
+
|
|
18
|
+
#### A. Goal Completion Check (`prompts.ts` lines 55-129)
|
|
19
|
+
**Changes:**
|
|
20
|
+
- System prompt: "Be EXTREMELY CONSERVATIVE - mark goals complete when PRIMARY action succeeds. DO NOT invent verification steps"
|
|
21
|
+
- Added golden rule: "If goal is SIMPLE ACTION and action SUCCEEDED, mark COMPLETE immediately"
|
|
22
|
+
- Explicit examples showing action goals complete after action succeeds (no verification needed)
|
|
23
|
+
|
|
24
|
+
**Example:**
|
|
25
|
+
```
|
|
26
|
+
Before: "Click send button" → click succeeds → "INCOMPLETE - need to verify message sent"
|
|
27
|
+
After: "Click send button" → click succeeds → "COMPLETE ✅"
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
#### B. Command Generation Anti-Hallucination (`prompts.ts` lines 215-225)
|
|
31
|
+
**New Section: "NEVER Hallucinate Verification Elements"**
|
|
32
|
+
- ONLY verify elements that ACTUALLY EXIST in current DOM state
|
|
33
|
+
- Don't invent success messages, confirmations, or sent indicators
|
|
34
|
+
- Use alternative verification: state changes, network, page load
|
|
35
|
+
- Stop trying to find elements after previous attempts failed
|
|
36
|
+
|
|
37
|
+
#### C. Smart Hallucination Detection (`llm-facade.ts` lines 573-599)
|
|
38
|
+
**Automatic Detection:**
|
|
39
|
+
- Detects when LLM repeatedly tries to find non-existent elements (2+ attempts)
|
|
40
|
+
- Shows "⚠️ HALLUCINATION ALERT" with guidance to stop and use alternatives
|
|
41
|
+
- Analyzes command patterns (getByText, toBeVisible) + errors (not found, timeout)
|
|
42
|
+
|
|
43
|
+
### 2. Enabled Screenshot-Based Diagnostic Analysis 📸
|
|
44
|
+
|
|
45
|
+
#### A. Conservative Screenshot Trigger (`scenario-worker-class.ts` line 193)
|
|
46
|
+
```typescript
|
|
47
|
+
// ONLY on attempt 2 (3rd attempt, after exactly 2 failures)
|
|
48
|
+
// This is the ONLY chance to use vision - must be absolutely necessary
|
|
49
|
+
if (attempt === 2 && lastError && !usedVisionMode)
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
**Attempt Flow:**
|
|
53
|
+
- Attempt 0: First try (DOM-based)
|
|
54
|
+
- Attempt 1: Second try (DOM-based)
|
|
55
|
+
- **Attempt 2: Third try - Vision assessment (if truly needed)**
|
|
56
|
+
- Attempt 3: Fourth try (final, DOM-based)
|
|
57
|
+
|
|
58
|
+
#### B. Conservative Screenshot Assessment (`prompts.ts` lines 131-191)
|
|
59
|
+
**System Prompt:** "Be LIBERAL in recommending screenshots - visual context provides diagnostic insights DOM cannot"
|
|
60
|
+
|
|
61
|
+
**Diagnostic Value Framework:**
|
|
62
|
+
1. Identify WHY attempts failed (DOM assumptions vs visual reality)
|
|
63
|
+
2. Detect hallucinated elements (see if expected elements exist visually)
|
|
64
|
+
3. Recommend better strategies (verification based on what's visible)
|
|
65
|
+
4. Find visual blockers (overlays, modals, layout issues)
|
|
66
|
+
5. Correct wrong assumptions (actual state vs expected state)
|
|
67
|
+
|
|
68
|
+
**Hallucination Detection in Assessment:**
|
|
69
|
+
- If "not found/timeout" errors + verification attempts → HIGH chance of hallucination
|
|
70
|
+
- Screenshot reveals if elements actually exist
|
|
71
|
+
|
|
72
|
+
#### C. Enhanced Vision Mode as Diagnostic Tool (`prompts.ts` lines 359-462)
|
|
73
|
+
|
|
74
|
+
**System Prompt:** "Analyze screenshot to understand WHY previous attempts failed and recommend BEST next step based on visual reality vs DOM assumptions"
|
|
75
|
+
|
|
76
|
+
**Three Primary Tasks:**
|
|
77
|
+
1. **DEBUG WHY PREVIOUS ATTEMPTS FAILED** - Compare what you assumed vs what you SEE
|
|
78
|
+
2. **IDENTIFY THE ROOT CAUSE** - Why did DOM-based approaches fail?
|
|
79
|
+
3. **RECOMMEND SMARTER ALTERNATIVES** - What should we do instead?
|
|
80
|
+
|
|
81
|
+
**Critical Questions Framework:**
|
|
82
|
+
|
|
83
|
+
🔍 **Visual vs DOM Reality Check:**
|
|
84
|
+
- What do you SEE vs what DOM suggested?
|
|
85
|
+
- Are elements you tried to find VISIBLE on screen?
|
|
86
|
+
- Are there visual indicators you missed?
|
|
87
|
+
- What's ACTUALLY present vs ASSUMED?
|
|
88
|
+
|
|
89
|
+
🚫 **Why Did Previous Attempts Fail?**
|
|
90
|
+
- Looking for elements that DON'T EXIST? (hallucination)
|
|
91
|
+
- Wrong selectors for elements that ARE visible?
|
|
92
|
+
- Elements blocked/covered by overlays?
|
|
93
|
+
- Elements in different state than expected?
|
|
94
|
+
- Page in different state than assumed?
|
|
95
|
+
|
|
96
|
+
💡 **What Should You Do Differently?**
|
|
97
|
+
- If verification elements don't exist: Use state-based verification
|
|
98
|
+
- If elements blocked: Remove blocker first
|
|
99
|
+
- If wrong selector: Use visual clues for better selectors
|
|
100
|
+
- If goal achieved: Confirm with simple wait/check
|
|
101
|
+
|
|
102
|
+
**Verification Strategy Based on Visual Reality:**
|
|
103
|
+
|
|
104
|
+
```
|
|
105
|
+
IF you see success indicators in screenshot:
|
|
106
|
+
✅ Use them: await expect(page.getByText('visible-text-here')).toBeVisible()
|
|
107
|
+
|
|
108
|
+
IF you DON'T see success indicators but action appears complete:
|
|
109
|
+
✅ Use state-based checks:
|
|
110
|
+
- Button disabled check
|
|
111
|
+
- Form cleared/reset check
|
|
112
|
+
- URL changed check
|
|
113
|
+
- Network response verification
|
|
114
|
+
- Load state verification
|
|
115
|
+
|
|
116
|
+
IF previous attempts looked for non-existent elements:
|
|
117
|
+
❌ STOP looking for them
|
|
118
|
+
✅ Switch to alternative verification
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
**Comparison Analysis Template:**
|
|
122
|
+
```
|
|
123
|
+
"Based on screenshot analysis:
|
|
124
|
+
- DOM suggested: [what you thought was there]
|
|
125
|
+
- Visual reality: [what you actually see]
|
|
126
|
+
- Why previous failed: [root cause analysis]
|
|
127
|
+
- Better approach: [what to do instead]"
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
#### D. Enhanced Diagnostic Logging (`llm-facade.ts` lines 313-328)
|
|
131
|
+
|
|
132
|
+
**Vision Mode Response Now Includes:**
|
|
133
|
+
- `visualInsights`: What screenshot revealed that DOM couldn't tell you
|
|
134
|
+
- `failureRootCause`: Why previous DOM-based attempts failed
|
|
135
|
+
- `recommendedAlternative`: Better verification/interaction strategy
|
|
136
|
+
- `reasoning`: Full diagnostic analysis
|
|
137
|
+
|
|
138
|
+
**Console Logging:**
|
|
139
|
+
```
|
|
140
|
+
📸 Visual insights: [what was discovered]
|
|
141
|
+
🔍 Root cause analysis: [why it failed]
|
|
142
|
+
💡 Recommended alternative: [what to do instead]
|
|
143
|
+
🧠 Vision-based reasoning: [full analysis]
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
## Code Modularization
|
|
147
|
+
|
|
148
|
+
Vision diagnostics are properly modularized and reused across both flows:
|
|
149
|
+
|
|
150
|
+
1. **`LLMFacade` Methods** (shared by both flows):
|
|
151
|
+
- `assessScreenshotNeed()` - Conservative assessment if screenshot would help
|
|
152
|
+
- `getVisionDiagnostics()` - Supervisor analyzes screenshot (gpt-4o)
|
|
153
|
+
- `generateCommandFromSupervisorInstructions()` - Worker generates command (gpt-4.1-mini)
|
|
154
|
+
|
|
155
|
+
2. **Two-Step Supervisor Pattern** (used consistently):
|
|
156
|
+
```typescript
|
|
157
|
+
// Step 1: Supervisor analyzes screenshot (expensive vision model)
|
|
158
|
+
const supervisorDiagnostics = await llmFacade.getVisionDiagnostics(...)
|
|
159
|
+
|
|
160
|
+
// Step 2: Use insights for action
|
|
161
|
+
// - In generation: Generate command from instructions
|
|
162
|
+
// - In repair: Enhance failure context with visual insights
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
3. **No Code Duplication**:
|
|
166
|
+
- Vision prompts defined once in `prompts.ts`
|
|
167
|
+
- LLM calls handled by `LLMFacade`
|
|
168
|
+
- Both flows use same vision assessment logic
|
|
169
|
+
|
|
170
|
+
## Behavioral Changes
|
|
171
|
+
|
|
172
|
+
### Script Generation - Before:
|
|
173
|
+
```
|
|
174
|
+
1. Click send button → succeeds
|
|
175
|
+
2. Goal check → "INCOMPLETE - verify message sent" (hallucinated)
|
|
176
|
+
3. Try: await expect(page.getByText('Message sent')).toBeVisible()
|
|
177
|
+
4. Fail: Element not found
|
|
178
|
+
5. Try: await page.getByRole('status').waitFor()
|
|
179
|
+
6. Fail: Timeout
|
|
180
|
+
7. Repeat until max failures
|
|
181
|
+
8. Screenshot assessment → "NO, not needed"
|
|
182
|
+
9. Vision mode → never triggers
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
### Script Generation - After:
|
|
186
|
+
```
|
|
187
|
+
1. Click send button → succeeds
|
|
188
|
+
2. Goal check → "COMPLETE ✅" (action succeeded, no verification needed)
|
|
189
|
+
OR if verification truly needed but wrong approach:
|
|
190
|
+
3. After 2 failures → Screenshot assessment
|
|
191
|
+
4. Assessment → "YES - Diagnostic value: Visual reveals if success indicators exist"
|
|
192
|
+
5. Vision mode activates with screenshot
|
|
193
|
+
6. Diagnostic analysis:
|
|
194
|
+
- "DOM suggested: Success message would appear"
|
|
195
|
+
- "Visual reality: No success message visible, button is now disabled"
|
|
196
|
+
- "Root cause: Hallucinated verification element that doesn't exist"
|
|
197
|
+
- "Better approach: Check button disabled state instead"
|
|
198
|
+
7. Generates: await expect(page.locator('button[name="Send"]')).toBeDisabled()
|
|
199
|
+
8. Success ✅
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
### Script Repair - Before:
|
|
203
|
+
```
|
|
204
|
+
1. Script step fails: await page.click('button[name="Submit"]')
|
|
205
|
+
2. AI Repair attempt 1: Try different selector → Fails
|
|
206
|
+
3. AI Repair attempt 2: Try with wait → Fails
|
|
207
|
+
4. AI Repair attempt 3: Try another approach → Fails
|
|
208
|
+
5. Give up - repair failed
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
### Script Repair - After:
|
|
212
|
+
```
|
|
213
|
+
1. Script step fails: await page.click('button[name="Submit"]')
|
|
214
|
+
2. AI Repair attempt 1: Try different selector → Fails
|
|
215
|
+
3. AI Repair attempt 2: Try with wait → Fails
|
|
216
|
+
4. After 2 failures → Screenshot assessment
|
|
217
|
+
5. Assessment → "YES - Visual analysis can reveal why repairs are failing"
|
|
218
|
+
6. Vision supervisor analyzes screenshot:
|
|
219
|
+
- "Visual analysis: Button is disabled and grayed out"
|
|
220
|
+
- "Root cause: Trying to click a disabled button"
|
|
221
|
+
- "Recommended approach: Wait for button to become enabled first"
|
|
222
|
+
7. AI Repair attempt 3 with vision insights: Insert wait step before click
|
|
223
|
+
8. Success ✅ (vision-aided repair)
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
## Cost Considerations
|
|
227
|
+
|
|
228
|
+
**Vision Mode (GPT-4o) Triggers in Both Flows:**
|
|
229
|
+
|
|
230
|
+
1. **Script Generation** (`ScenarioWorker`):
|
|
231
|
+
- After 2 failed command generation attempts (3rd attempt)
|
|
232
|
+
- Only when LLM assessment says "YES"
|
|
233
|
+
- Prevents endless DOM-based retries on wrong assumptions
|
|
234
|
+
|
|
235
|
+
2. **Script Repair** (`ExecutionService`):
|
|
236
|
+
- After 2 failed repair attempts (3rd/final repair attempt)
|
|
237
|
+
- Only when LLM assessment says "YES"
|
|
238
|
+
- Prevents wasted repair cycles on wrong strategy
|
|
239
|
+
|
|
240
|
+
**What You Get (Both Flows):**
|
|
241
|
+
- Root cause analysis of failures
|
|
242
|
+
- Visual vs DOM reality comparison
|
|
243
|
+
- Recommended alternative strategies
|
|
244
|
+
- Smart fallback only when truly needed
|
|
245
|
+
- Prevents wasted attempts on wrong approaches
|
|
246
|
+
|
|
247
|
+
## Files Modified
|
|
248
|
+
|
|
249
|
+
1. **`/runner-core/src/prompts.ts`**
|
|
250
|
+
- Enhanced goal completion check (lines 55-129)
|
|
251
|
+
- Enhanced screenshot assessment (lines 131-184)
|
|
252
|
+
- Enhanced vision mode prompt with diagnostics (lines 359-462)
|
|
253
|
+
- Added anti-hallucination sections
|
|
254
|
+
|
|
255
|
+
2. **`/runner-core/src/llm-facade.ts`**
|
|
256
|
+
- Added hallucination detection (lines 573-599)
|
|
257
|
+
- Enhanced vision logging (lines 313-328)
|
|
258
|
+
- Vision methods: `assessScreenshotNeed`, `getVisionDiagnostics`, `generateCommandFromSupervisorInstructions`
|
|
259
|
+
|
|
260
|
+
3. **`/runner-core/src/scenario-worker-class.ts`** (Script Generation)
|
|
261
|
+
- Vision fallback on attempt 2 (line 197)
|
|
262
|
+
- Two-step supervisor pattern for command generation (lines 197-241)
|
|
263
|
+
|
|
264
|
+
4. **`/runner-core/src/execution-service.ts`** (Script Repair/Execution)
|
|
265
|
+
- Vision fallback on final repair attempt after 2 failures (lines 500-594)
|
|
266
|
+
- Vision-enhanced context for repair suggestions
|
|
267
|
+
- Same supervisor pattern for consistency
|
|
268
|
+
|
|
269
|
+
## Testing Recommendations
|
|
270
|
+
|
|
271
|
+
### Script Generation Tests
|
|
272
|
+
|
|
273
|
+
1. **Test with messaging flow:**
|
|
274
|
+
- Verify "send message" steps complete without hallucinated verification
|
|
275
|
+
- Check if vision mode provides diagnostic insights when command generation fails
|
|
276
|
+
|
|
277
|
+
2. **Test with form submission:**
|
|
278
|
+
- Ensure submit actions complete without looking for non-existent confirmations
|
|
279
|
+
- Verify alternative verification strategies are used
|
|
280
|
+
|
|
281
|
+
### Script Repair Tests
|
|
282
|
+
|
|
283
|
+
1. **Test with selector failures:**
|
|
284
|
+
- Run script with outdated selectors
|
|
285
|
+
- Verify vision diagnostics reveal actual element state
|
|
286
|
+
- Check that repairs use vision insights
|
|
287
|
+
|
|
288
|
+
2. **Test with state-dependent failures:**
|
|
289
|
+
- Run script where timing/state causes failures
|
|
290
|
+
- Verify vision reveals actual page state (e.g., disabled buttons, loading states)
|
|
291
|
+
- Check that repairs address root cause
|
|
292
|
+
|
|
293
|
+
### Monitor Both Flows
|
|
294
|
+
|
|
295
|
+
1. **Vision mode activation:**
|
|
296
|
+
- Should trigger after 2 failures when truly needed (not for every failure)
|
|
297
|
+
- Check diagnostic logs for root cause analysis
|
|
298
|
+
- Verify recommended alternatives are sensible
|
|
299
|
+
|
|
300
|
+
2. **Success patterns:**
|
|
301
|
+
- Look for "(vision-aided)" markers in success logs
|
|
302
|
+
- Track improvement in success rate after vision diagnostics added
|
|
303
|
+
|
|
304
|
+
## Next Steps
|
|
305
|
+
|
|
306
|
+
1. **Monitor logs for:**
|
|
307
|
+
- Reduced hallucination instances (generation flow)
|
|
308
|
+
- Vision mode diagnostic quality (both flows)
|
|
309
|
+
- Alternative verification strategies effectiveness (generation flow)
|
|
310
|
+
- Repair success rate improvement (repair flow)
|
|
311
|
+
|
|
312
|
+
2. **Metrics to track:**
|
|
313
|
+
- Vision mode activation rate in generation vs repair
|
|
314
|
+
- Hallucination detection rate
|
|
315
|
+
- Test success rate improvement (generation)
|
|
316
|
+
- Repair success rate improvement (execution)
|
|
317
|
+
- Cost vs benefit of vision mode in each flow
|
|
318
|
+
|
|
319
|
+
3. **Potential future enhancements:**
|
|
320
|
+
- Learn from vision diagnostics to improve DOM-only approaches
|
|
321
|
+
- Build a library of common visual patterns and solutions
|
|
322
|
+
- Optimize screenshot timing based on diagnostic value
|
|
323
|
+
- Consider vision diagnostics for other failure scenarios
|
|
324
|
+
- Share vision insights between generation and repair flows
|
|
325
|
+
|
|
326
|
+
## Summary
|
|
327
|
+
|
|
328
|
+
**✅ Vision-based diagnostics are now properly integrated into BOTH:**
|
|
329
|
+
- **Script Generation** - Helps generate better commands when DOM info insufficient
|
|
330
|
+
- **Script Repair** - Helps diagnose why repairs fail and suggest better fixes
|
|
331
|
+
|
|
332
|
+
**✅ Properly modularized with no code duplication:**
|
|
333
|
+
- Shared `LLMFacade` methods
|
|
334
|
+
- Consistent two-step supervisor pattern
|
|
335
|
+
- Single source of truth for prompts and logic
|
|
336
|
+
|
|
@@ -15,7 +15,16 @@ export interface InsertCreditUsageResponse {
|
|
|
15
15
|
export declare class CreditUsageService {
|
|
16
16
|
private backendUrl;
|
|
17
17
|
private authConfig;
|
|
18
|
+
private logger?;
|
|
18
19
|
constructor(authConfig?: AuthConfig, backendUrl?: string);
|
|
20
|
+
/**
|
|
21
|
+
* Set a logger callback for capturing execution logs
|
|
22
|
+
*/
|
|
23
|
+
setLogger(logger: (message: string, level?: 'log' | 'error' | 'warn') => void): void;
|
|
24
|
+
/**
|
|
25
|
+
* Log a message using the configured logger
|
|
26
|
+
*/
|
|
27
|
+
private log;
|
|
19
28
|
/**
|
|
20
29
|
* Update authentication configuration
|
|
21
30
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"credit-usage-service.d.ts","sourceRoot":"","sources":["../src/credit-usage-service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAkB,MAAM,eAAe,CAAC;AAG3D,oBAAY,iBAAiB;IAC3B,2BAA2B,IAAI;IAC/B,aAAa,IAAI;IACjB,WAAW,IAAI;IACf,eAAe,IAAI;CACpB;AAED,MAAM,WAAW,wBAAwB;IACvC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,iBAAiB,CAAC;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,yBAAyB;CAEzC;AAED,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,UAAU,CAAoB;
|
|
1
|
+
{"version":3,"file":"credit-usage-service.d.ts","sourceRoot":"","sources":["../src/credit-usage-service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAkB,MAAM,eAAe,CAAC;AAG3D,oBAAY,iBAAiB;IAC3B,2BAA2B,IAAI;IAC/B,aAAa,IAAI;IACjB,WAAW,IAAI;IACf,eAAe,IAAI;CACpB;AAED,MAAM,WAAW,wBAAwB;IACvC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,iBAAiB,CAAC;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,yBAAyB;CAEzC;AAED,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,UAAU,CAAoB;IACtC,OAAO,CAAC,MAAM,CAAC,CAA8D;gBAEjE,UAAU,CAAC,EAAE,UAAU,EAAE,UAAU,CAAC,EAAE,MAAM;IAaxD;;OAEG;IACH,SAAS,CAAC,MAAM,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK,GAAG,OAAO,GAAG,MAAM,KAAK,IAAI,GAAG,IAAI;IAIpF;;OAEG;IACH,OAAO,CAAC,GAAG;IAOX;;OAEG;IACH,aAAa,CAAC,UAAU,EAAE,UAAU,GAAG,IAAI;IAI3C;;OAEG;IACH,aAAa,IAAI,UAAU,GAAG,IAAI;IAIlC;;OAEG;IACG,iBAAiB,CACrB,OAAO,EAAE,MAAM,YAAI,EACnB,WAAW,EAAE,iBAAiB,EAC9B,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,yBAAyB,CAAC;IA8BrC;;OAEG;IACG,4BAA4B,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAUjE;;OAEG;IACG,oBAAoB,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAS1D"}
|
|
@@ -27,6 +27,21 @@ class CreditUsageService {
|
|
|
27
27
|
}
|
|
28
28
|
this.authConfig = authConfig || null;
|
|
29
29
|
}
|
|
30
|
+
/**
|
|
31
|
+
* Set a logger callback for capturing execution logs
|
|
32
|
+
*/
|
|
33
|
+
setLogger(logger) {
|
|
34
|
+
this.logger = logger;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Log a message using the configured logger
|
|
38
|
+
*/
|
|
39
|
+
log(message, level = 'log') {
|
|
40
|
+
if (this.logger) {
|
|
41
|
+
this.logger(message, level);
|
|
42
|
+
}
|
|
43
|
+
// No console fallback - logs are routed to consumer
|
|
44
|
+
}
|
|
30
45
|
/**
|
|
31
46
|
* Update authentication configuration
|
|
32
47
|
*/
|
|
@@ -64,7 +79,7 @@ class CreditUsageService {
|
|
|
64
79
|
return response.data;
|
|
65
80
|
}
|
|
66
81
|
catch (error) {
|
|
67
|
-
|
|
82
|
+
this.log(`Credit usage report failed: ${error}`, 'error');
|
|
68
83
|
throw new Error(`Credit usage report failed: ${error.message}`);
|
|
69
84
|
}
|
|
70
85
|
}
|
|
@@ -74,10 +89,10 @@ class CreditUsageService {
|
|
|
74
89
|
async reportScriptGenerationCredit(jobId) {
|
|
75
90
|
try {
|
|
76
91
|
await this.reportCreditUsage(1, CreditUsageReason.SCRIPT_GENERATE, jobId);
|
|
77
|
-
|
|
92
|
+
this.log(`Credit usage reported for script generation${jobId ? ` (job: ${jobId})` : ''}`);
|
|
78
93
|
}
|
|
79
94
|
catch (error) {
|
|
80
|
-
|
|
95
|
+
this.log(`Failed to report script generation credit usage: ${error}`, 'error');
|
|
81
96
|
// Don't throw - credit reporting should not break the main flow
|
|
82
97
|
}
|
|
83
98
|
}
|
|
@@ -87,10 +102,10 @@ class CreditUsageService {
|
|
|
87
102
|
async reportAIRepairCredit(jobId) {
|
|
88
103
|
try {
|
|
89
104
|
await this.reportCreditUsage(1, CreditUsageReason.TEST_REPAIR, jobId);
|
|
90
|
-
|
|
105
|
+
this.log(`Credit usage reported for AI repair${jobId ? ` (job: ${jobId})` : ''}`);
|
|
91
106
|
}
|
|
92
107
|
catch (error) {
|
|
93
|
-
|
|
108
|
+
this.log(`Failed to report AI repair credit usage: ${error}`, 'error');
|
|
94
109
|
// Don't throw - credit reporting should not break the main flow
|
|
95
110
|
}
|
|
96
111
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"credit-usage-service.js","sourceRoot":"","sources":["../src/credit-usage-service.ts"],"names":[],"mappings":";;;;;;AAAA,kDAA0B;AAC1B,+CAA2D;AAC3D,6CAA6C;AAE7C,IAAY,iBAKX;AALD,WAAY,iBAAiB;IAC3B,uGAA+B,CAAA;IAC/B,2EAAiB,CAAA;IACjB,uEAAe,CAAA;IACf,+EAAmB,CAAA;AACrB,CAAC,EALW,iBAAiB,iCAAjB,iBAAiB,QAK5B;AAYD,MAAa,kBAAkB;
|
|
1
|
+
{"version":3,"file":"credit-usage-service.js","sourceRoot":"","sources":["../src/credit-usage-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,22 +1,26 @@
|
|
|
1
1
|
import { PlaywrightExecutionRequest, PlaywrightExecutionResponse, ScriptExecutionRequest, ScriptExecutionResponse } from './types';
|
|
2
2
|
import { AuthConfig } from './auth-config';
|
|
3
|
+
import { LLMProvider } from './llm-provider';
|
|
4
|
+
import { ProgressReporter } from './progress-reporter';
|
|
3
5
|
/**
|
|
4
6
|
* Service for orchestrating Playwright script execution
|
|
5
7
|
*/
|
|
6
8
|
export declare class ExecutionService {
|
|
7
9
|
private playwrightService;
|
|
8
10
|
private llmFacade;
|
|
11
|
+
private llmProvider;
|
|
12
|
+
private progressReporter?;
|
|
9
13
|
private creditUsageService;
|
|
10
14
|
private maxConcurrentExecutions;
|
|
11
15
|
private activeExecutions;
|
|
12
16
|
private logger?;
|
|
13
|
-
constructor(authConfig?: AuthConfig, backendUrl?: string, maxConcurrentExecutions?: number);
|
|
17
|
+
constructor(authConfig?: AuthConfig, backendUrl?: string, maxConcurrentExecutions?: number, llmProvider?: LLMProvider, progressReporter?: ProgressReporter);
|
|
14
18
|
/**
|
|
15
19
|
* Set a logger callback for capturing execution logs
|
|
16
20
|
*/
|
|
17
21
|
setLogger(logger: (message: string, level?: 'log' | 'error' | 'warn') => void): void;
|
|
18
22
|
/**
|
|
19
|
-
* Log a message using the configured logger
|
|
23
|
+
* Log a message using the configured logger
|
|
20
24
|
*/
|
|
21
25
|
private log;
|
|
22
26
|
/**
|
|
@@ -25,6 +29,7 @@ export declare class ExecutionService {
|
|
|
25
29
|
initialize(): Promise<void>;
|
|
26
30
|
/**
|
|
27
31
|
* Set authentication configuration for the service
|
|
32
|
+
* Note: This recreates the LLM provider with new auth config
|
|
28
33
|
*/
|
|
29
34
|
setAuthConfig(authConfig: AuthConfig): void;
|
|
30
35
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"execution-service.d.ts","sourceRoot":"","sources":["../src/execution-service.ts"],"names":[],"mappings":"AACA,OAAO,EACL,0BAA0B,EAC1B,2BAA2B,EAE3B,sBAAsB,EACtB,uBAAuB,EAKxB,MAAM,SAAS,CAAC;AAKjB,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAI3C;;GAEG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,iBAAiB,CAAoB;IAC7C,OAAO,CAAC,SAAS,CAAY;IAC7B,OAAO,CAAC,kBAAkB,CAAqB;IAC/C,OAAO,CAAC,uBAAuB,CAAS;IACxC,OAAO,CAAC,gBAAgB,CAAgC;IACxD,OAAO,CAAC,MAAM,CAAC,CAA8D;
|
|
1
|
+
{"version":3,"file":"execution-service.d.ts","sourceRoot":"","sources":["../src/execution-service.ts"],"names":[],"mappings":"AACA,OAAO,EACL,0BAA0B,EAC1B,2BAA2B,EAE3B,sBAAsB,EACtB,uBAAuB,EAKxB,MAAM,SAAS,CAAC;AAKjB,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAI3C,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAGvD;;GAEG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,iBAAiB,CAAoB;IAC7C,OAAO,CAAC,SAAS,CAAY;IAC7B,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,gBAAgB,CAAC,CAAmB;IAC5C,OAAO,CAAC,kBAAkB,CAAqB;IAC/C,OAAO,CAAC,uBAAuB,CAAS;IACxC,OAAO,CAAC,gBAAgB,CAAgC;IACxD,OAAO,CAAC,MAAM,CAAC,CAA8D;gBAG3E,UAAU,CAAC,EAAE,UAAU,EACvB,UAAU,CAAC,EAAE,MAAM,EACnB,uBAAuB,GAAE,MAAW,EACpC,WAAW,CAAC,EAAE,WAAW,EACzB,gBAAgB,CAAC,EAAE,gBAAgB;IAarC;;OAEG;IACH,SAAS,CAAC,MAAM,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK,GAAG,OAAO,GAAG,MAAM,KAAK,IAAI,GAAG,IAAI;IAIpF;;OAEG;IACH,OAAO,CAAC,GAAG;IAOX;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAIjC;;;OAGG;IACH,aAAa,CAAC,UAAU,EAAE,UAAU,GAAG,IAAI;IAQ3C;;OAEG;IACG,aAAa,CAAC,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAAC,uBAAuB,CAAC;IAkBtF;;OAEG;YACW,qBAAqB;IAmBnC;;OAEG;IACG,gBAAgB,CAAC,OAAO,EAAE,0BAA0B,GAAG,OAAO,CAAC,2BAA2B,CAAC;IAgCjG;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAsC7B;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAI5B;;OAEG;IACH,OAAO,IAAI,OAAO;YAIJ,UAAU;YAwDV,eAAe;YAsGf,oBAAoB;IAgBlC,OAAO,CAAC,4BAA4B;YA8CtB,iBAAiB;YAqUjB,eAAe;IA0B7B;;OAEG;IACH,OAAO,CAAC,aAAa;YAeP,oBAAoB;YAoDpB,oBAAoB;YAiBpB,mBAAmB;IAcjC,OAAO,CAAC,mBAAmB;IA4B3B,OAAO,CAAC,yBAAyB;YA0CnB,0BAA0B;YAkF1B,iBAAiB;IA0D/B,OAAO,CAAC,qBAAqB;IAyB7B;;OAEG;YACW,iBAAiB;IAI/B;;OAEG;IACH,OAAO,CAAC,kBAAkB;CAkC3B"}
|