openchrome-mcp 1.6.6 → 1.6.7
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 +10 -6
- package/assets/chart-tokens.svg +42 -0
- package/dist/hints/hint-engine.d.ts +3 -1
- package/dist/hints/hint-engine.d.ts.map +1 -1
- package/dist/hints/hint-engine.js +41 -1
- package/dist/hints/hint-engine.js.map +1 -1
- package/dist/hints/progress-tracker.d.ts +44 -0
- package/dist/hints/progress-tracker.d.ts.map +1 -0
- package/dist/hints/progress-tracker.js +115 -0
- package/dist/hints/progress-tracker.js.map +1 -0
- package/dist/hints/rules/sequence-detection.d.ts.map +1 -1
- package/dist/hints/rules/sequence-detection.js +7 -4
- package/dist/hints/rules/sequence-detection.js.map +1 -1
- package/dist/tools/navigate.d.ts.map +1 -1
- package/dist/tools/navigate.js +44 -2
- package/dist/tools/navigate.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -20,6 +20,10 @@
|
|
|
20
20
|
<img src="assets/demo.svg" alt="Traditional vs OpenChrome" width="100%">
|
|
21
21
|
</p>
|
|
22
22
|
|
|
23
|
+
<p align="center">
|
|
24
|
+
<img src="assets/chart-tokens.svg" alt="Token Efficiency: OpenChrome vs Playwright" width="100%">
|
|
25
|
+
</p>
|
|
26
|
+
|
|
23
27
|
---
|
|
24
28
|
|
|
25
29
|
## What is OpenChrome?
|
|
@@ -165,11 +169,11 @@ oc compare prices for "AirPods Pro" across Amazon, eBay, Walmart, Best Buy
|
|
|
165
169
|
|
|
166
170
|
---
|
|
167
171
|
|
|
168
|
-
##
|
|
172
|
+
## 45 Tools
|
|
169
173
|
|
|
170
174
|
| Category | Tools |
|
|
171
175
|
|----------|-------|
|
|
172
|
-
| **Navigate & Interact** | `navigate`, `
|
|
176
|
+
| **Navigate & Interact** | `navigate`, `interact`, `fill_form`, `find`, `computer` |
|
|
173
177
|
| **Read & Extract** | `read_page`, `page_content`, `javascript_tool`, `selector_query`, `xpath_query` |
|
|
174
178
|
| **Environment** | `emulate_device`, `geolocation`, `user_agent`, `network` |
|
|
175
179
|
| **Storage & Debug** | `cookies`, `storage`, `console_capture`, `performance_metrics`, `request_intercept` |
|
|
@@ -177,9 +181,9 @@ oc compare prices for "AirPods Pro" across Amazon, eBay, Walmart, Best Buy
|
|
|
177
181
|
| **Memory** | `memory_record`, `memory_query`, `memory_validate` |
|
|
178
182
|
|
|
179
183
|
<details>
|
|
180
|
-
<summary>Full tool list (
|
|
184
|
+
<summary>Full tool list (45)</summary>
|
|
181
185
|
|
|
182
|
-
`navigate` `computer` `read_page` `find` `
|
|
186
|
+
`navigate` `interact` `computer` `read_page` `find` `form_input` `fill_form` `javascript_tool` `page_reload` `page_content` `page_pdf` `wait_for` `user_agent` `geolocation` `emulate_device` `network` `selector_query` `xpath_query` `cookies` `storage` `console_capture` `performance_metrics` `request_intercept` `drag_drop` `file_upload` `http_auth` `worker_create` `worker_list` `worker_update` `worker_complete` `worker_delete` `tabs_create_mcp` `tabs_context_mcp` `tabs_close` `workflow_init` `workflow_status` `workflow_collect` `workflow_collect_partial` `workflow_cleanup` `execute_plan` `batch_execute` `lightweight_scroll` `memory_record` `memory_query` `memory_validate` `oc_stop`
|
|
183
187
|
|
|
184
188
|
</details>
|
|
185
189
|
|
|
@@ -291,7 +295,7 @@ By default, benchmarks run in **stub mode** — measuring protocol correctness a
|
|
|
291
295
|
|
|
292
296
|
## Server / Headless Deployment
|
|
293
297
|
|
|
294
|
-
OpenChrome works on servers and in CI/CD pipelines without Chrome login. All
|
|
298
|
+
OpenChrome works on servers and in CI/CD pipelines without Chrome login. All 45 tools function with unauthenticated Chrome — navigation, scraping, screenshots, form filling, and parallel workflows all work in clean sessions.
|
|
295
299
|
|
|
296
300
|
### Quick start
|
|
297
301
|
|
|
@@ -310,7 +314,7 @@ openchrome serve --server-mode
|
|
|
310
314
|
| Category | Tools |
|
|
311
315
|
|----------|-------|
|
|
312
316
|
| **Navigation & scraping** | `navigate`, `read_page`, `page_content`, `javascript_tool` |
|
|
313
|
-
| **Interaction** | `
|
|
317
|
+
| **Interaction** | `interact`, `fill_form`, `drag_drop`, `file_upload` |
|
|
314
318
|
| **Parallel workflows** | `workflow_init` with multiple workers, `batch_execute` |
|
|
315
319
|
| **Screenshots & PDF** | `computer(screenshot)`, `page_pdf` |
|
|
316
320
|
| **Network & performance** | `request_intercept`, `performance_metrics`, `console_capture` |
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 880 480" font-family="-apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif">
|
|
2
|
+
<defs>
|
|
3
|
+
<linearGradient id="bg2" x1="0" y1="0" x2="0" y2="1">
|
|
4
|
+
<stop offset="0%" stop-color="#f8fafc"/>
|
|
5
|
+
<stop offset="100%" stop-color="#f1f5f9"/>
|
|
6
|
+
</linearGradient>
|
|
7
|
+
</defs>
|
|
8
|
+
<rect width="880" height="480" fill="url(#bg2)" rx="16"/>
|
|
9
|
+
|
|
10
|
+
<!-- Title -->
|
|
11
|
+
<text x="440" y="38" text-anchor="middle" font-size="22" font-weight="700" fill="#0f172a">Simple Task Token Efficiency</text>
|
|
12
|
+
<text x="440" y="62" text-anchor="middle" font-size="13" fill="#94a3b8">Tokens the LLM must process per Twitter profile (lower is better)</text>
|
|
13
|
+
|
|
14
|
+
<!-- Row 1: Playwright + LLM — 178,102 tok/profile -->
|
|
15
|
+
<text x="48" y="108" font-size="13" font-weight="600" fill="#475569">Playwright + LLM</text>
|
|
16
|
+
<text x="48" y="124" font-size="11" fill="#94a3b8">(raw HTML to LLM)</text>
|
|
17
|
+
<rect x="200" y="96" width="580" height="36" fill="#6366f1" opacity="0.85" rx="6"/>
|
|
18
|
+
<text x="770" y="120" text-anchor="end" font-size="14" font-weight="700" fill="#fff">178,102 tok/profile</text>
|
|
19
|
+
<text x="200" y="152" font-size="11" fill="#94a3b8">Total for 20 profiles: 3,562,038 tokens</text>
|
|
20
|
+
|
|
21
|
+
<!-- Row 2: OpenChrome — 11,641 tok/profile -->
|
|
22
|
+
<text x="48" y="198" font-size="13" font-weight="600" fill="#ea580c">OpenChrome</text>
|
|
23
|
+
<text x="48" y="214" font-size="11" fill="#94a3b8">(compact DOM)</text>
|
|
24
|
+
<rect x="200" y="186" width="38" height="36" fill="#f97316" opacity="0.9" rx="6"/>
|
|
25
|
+
<text x="248" y="210" font-size="14" font-weight="700" fill="#1e293b">11,641 tok/profile</text>
|
|
26
|
+
<text x="200" y="242" font-size="11" fill="#94a3b8">Total for 20 profiles: 232,813 tokens</text>
|
|
27
|
+
|
|
28
|
+
<!-- Row 3: Playwright standalone — 290 tok/profile -->
|
|
29
|
+
<text x="48" y="288" font-size="13" font-weight="600" fill="#475569">Playwright standalone</text>
|
|
30
|
+
<text x="48" y="304" font-size="11" fill="#94a3b8">(no per-page LLM)</text>
|
|
31
|
+
<rect x="200" y="276" width="3" height="36" fill="#10b981" opacity="0.9" rx="1"/>
|
|
32
|
+
<text x="214" y="300" font-size="14" font-weight="700" fill="#1e293b">290 tok/profile</text>
|
|
33
|
+
<text x="200" y="332" font-size="11" fill="#94a3b8">Total for 20 profiles: 5,800 tokens</text>
|
|
34
|
+
|
|
35
|
+
<!-- Savings callout box -->
|
|
36
|
+
<rect x="160" y="368" width="560" height="50" fill="#fff7ed" stroke="#f97316" stroke-width="1.5" rx="10"/>
|
|
37
|
+
<text x="440" y="390" text-anchor="middle" font-size="15" font-weight="700" fill="#ea580c">OpenChrome saves 93.5% tokens vs Playwright + LLM</text>
|
|
38
|
+
<text x="440" y="409" text-anchor="middle" font-size="12" fill="#b45309">15.3x compression — compact DOM strips CSS, scripts, and hidden elements</text>
|
|
39
|
+
|
|
40
|
+
<!-- Footer -->
|
|
41
|
+
<text x="440" y="455" text-anchor="middle" font-size="11" fill="#94a3b8">Token estimate: 1 token ≈ 4 characters | Compression ratio calibrated from actual read_page measurements</text>
|
|
42
|
+
</svg>
|
|
@@ -14,6 +14,7 @@
|
|
|
14
14
|
import type { ToolCallEvent } from '../dashboard/types';
|
|
15
15
|
import type { ActivityTracker } from '../dashboard/activity-tracker';
|
|
16
16
|
import { PatternLearner } from './pattern-learner';
|
|
17
|
+
import { ProgressTracker } from './progress-tracker.js';
|
|
17
18
|
export interface HintContext {
|
|
18
19
|
toolName: string;
|
|
19
20
|
resultText: string;
|
|
@@ -56,6 +57,7 @@ export declare class HintEngine {
|
|
|
56
57
|
private rules;
|
|
57
58
|
private activityTracker;
|
|
58
59
|
private learner;
|
|
60
|
+
private progressTracker;
|
|
59
61
|
private logFilePath;
|
|
60
62
|
private hintEscalation;
|
|
61
63
|
private missCounts;
|
|
@@ -63,7 +65,7 @@ export declare class HintEngine {
|
|
|
63
65
|
private logBuffer;
|
|
64
66
|
private flushTimer;
|
|
65
67
|
private static readonly FLUSH_INTERVAL;
|
|
66
|
-
constructor(activityTracker: ActivityTracker);
|
|
68
|
+
constructor(activityTracker: ActivityTracker, progressTracker?: ProgressTracker);
|
|
67
69
|
/**
|
|
68
70
|
* Enable hit/miss logging to a JSONL file for data collection.
|
|
69
71
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hint-engine.d.ts","sourceRoot":"","sources":["../../src/hints/hint-engine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"hint-engine.d.ts","sourceRoot":"","sources":["../../src/hints/hint-engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -50,6 +50,7 @@ exports.HintEngine = void 0;
|
|
|
50
50
|
const fs = __importStar(require("fs"));
|
|
51
51
|
const path = __importStar(require("path"));
|
|
52
52
|
const pattern_learner_1 = require("./pattern-learner");
|
|
53
|
+
const progress_tracker_js_1 = require("./progress-tracker.js");
|
|
53
54
|
const error_recovery_1 = require("./rules/error-recovery");
|
|
54
55
|
const composite_suggestions_1 = require("./rules/composite-suggestions");
|
|
55
56
|
const sequence_detection_1 = require("./rules/sequence-detection");
|
|
@@ -62,6 +63,7 @@ class HintEngine {
|
|
|
62
63
|
rules;
|
|
63
64
|
activityTracker;
|
|
64
65
|
learner;
|
|
66
|
+
progressTracker;
|
|
65
67
|
logFilePath = null;
|
|
66
68
|
hintEscalation = new Map(); // ruleName -> session fire count
|
|
67
69
|
missCounts = new Map(); // ruleName -> consecutive miss count
|
|
@@ -70,8 +72,9 @@ class HintEngine {
|
|
|
70
72
|
logBuffer = [];
|
|
71
73
|
flushTimer = null;
|
|
72
74
|
static FLUSH_INTERVAL = 200; // ms
|
|
73
|
-
constructor(activityTracker) {
|
|
75
|
+
constructor(activityTracker, progressTracker) {
|
|
74
76
|
this.activityTracker = activityTracker;
|
|
77
|
+
this.progressTracker = progressTracker ?? new progress_tracker_js_1.ProgressTracker();
|
|
75
78
|
this.learner = new pattern_learner_1.PatternLearner();
|
|
76
79
|
// Collect all rules and sort by priority (ascending = highest priority first)
|
|
77
80
|
// Learned rules (350) sit between repetition (250) and success hints (400)
|
|
@@ -121,6 +124,43 @@ class HintEngine {
|
|
|
121
124
|
getHint(toolName, result, isError) {
|
|
122
125
|
const resultText = this.extractText(result);
|
|
123
126
|
const recentCalls = this.activityTracker.getRecentCalls(5);
|
|
127
|
+
// Priority 50: Progress tracking (highest priority, runs before all rules)
|
|
128
|
+
// NOTE: ProgressTracker returns early before the rule loop. Miss-count decay
|
|
129
|
+
// for individual rules is intentionally frozen during stuck/stalling phases —
|
|
130
|
+
// we don't want to spuriously reset escalating rule fire counts while the
|
|
131
|
+
// agent is not making progress.
|
|
132
|
+
const status = this.progressTracker.evaluate(recentCalls, toolName, resultText, isError);
|
|
133
|
+
if (status === 'stuck') {
|
|
134
|
+
const fireCount = (this.hintEscalation.get('progress-tracker-stuck') || 0) + 1;
|
|
135
|
+
this.hintEscalation.set('progress-tracker-stuck', fireCount);
|
|
136
|
+
const rawHintText = 'STOP — you are stuck. The last several tool calls made no meaningful progress ' +
|
|
137
|
+
'(errors, stale refs, auth redirects, or timeouts). ' +
|
|
138
|
+
'Step back and try a completely different approach, or ask the user for help.';
|
|
139
|
+
const severity = fireCount >= 2 ? 'critical' : 'warning';
|
|
140
|
+
this.log({ timestamp: Date.now(), toolName, isError, matchedRule: 'progress-tracker-stuck', hint: rawHintText, severity, fireCount });
|
|
141
|
+
return {
|
|
142
|
+
severity,
|
|
143
|
+
rule: 'progress-tracker-stuck',
|
|
144
|
+
fireCount,
|
|
145
|
+
hint: this.formatHintMessage(severity, rawHintText, fireCount),
|
|
146
|
+
rawHint: rawHintText,
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
if (status === 'stalling') {
|
|
150
|
+
const fireCount = (this.hintEscalation.get('progress-tracker-stalling') || 0) + 1;
|
|
151
|
+
this.hintEscalation.set('progress-tracker-stalling', fireCount);
|
|
152
|
+
const rawHintText = 'Warning: recent tool calls are not making progress. ' +
|
|
153
|
+
'Consider trying a different approach before getting stuck.';
|
|
154
|
+
const severity = this.getSeverity(fireCount);
|
|
155
|
+
this.log({ timestamp: Date.now(), toolName, isError, matchedRule: 'progress-tracker-stalling', hint: rawHintText, severity, fireCount });
|
|
156
|
+
return {
|
|
157
|
+
severity,
|
|
158
|
+
rule: 'progress-tracker-stalling',
|
|
159
|
+
fireCount,
|
|
160
|
+
hint: this.formatHintMessage(severity, rawHintText, fireCount),
|
|
161
|
+
rawHint: rawHintText,
|
|
162
|
+
};
|
|
163
|
+
}
|
|
124
164
|
const ctx = { toolName, resultText, isError, recentCalls, fireCounts: this.hintEscalation };
|
|
125
165
|
let matchedRule = null;
|
|
126
166
|
let rawHint = null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hint-engine.js","sourceRoot":"","sources":["../../src/hints/hint-engine.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;GAYG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEH,uCAAyB;AACzB,2CAA6B;AAG7B,uDAAmD;AACnD,2DAA4D;AAC5D,yEAAyE;AACzE,mEAAoE;AACpE,uEAAwE;AACxE,uEAAwE;AACxE,yDAA2D;AAC3D,yDAAyD;AACzD,qDAAqD;AA6CrD,MAAa,UAAU;IACb,KAAK,CAAa;IAClB,eAAe,CAAkB;IACjC,OAAO,CAAiB;IACxB,WAAW,GAAkB,IAAI,CAAC;IAClC,cAAc,GAAwB,IAAI,GAAG,EAAE,CAAC,CAAC,iCAAiC;IAClF,UAAU,GAAwB,IAAI,GAAG,EAAE,CAAC,CAAC,qCAAqC;IAE1F,8BAA8B;IACtB,SAAS,GAA0B,IAAI,CAAC;IACxC,SAAS,GAAa,EAAE,CAAC;IACzB,UAAU,GAA0B,IAAI,CAAC;IACzC,MAAM,CAAU,cAAc,GAAG,GAAG,CAAC,CAAC,KAAK;IAEnD,YAAY,eAAgC;
|
|
1
|
+
{"version":3,"file":"hint-engine.js","sourceRoot":"","sources":["../../src/hints/hint-engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ProgressTracker — Detects when the LLM agent is not making meaningful progress.
|
|
3
|
+
*
|
|
4
|
+
* Instead of matching specific error patterns, measures whether recent tool calls
|
|
5
|
+
* represent meaningful progress (URL change, content extraction, successful interaction)
|
|
6
|
+
* or spinning (auth redirects, stale refs, non-interactive clicks, timeouts).
|
|
7
|
+
*/
|
|
8
|
+
import type { ToolCallEvent } from '../dashboard/types.js';
|
|
9
|
+
export type ProgressStatus = 'progressing' | 'stalling' | 'stuck';
|
|
10
|
+
/**
|
|
11
|
+
* Signals in tool results that indicate NO meaningful progress was made,
|
|
12
|
+
* even if the tool call technically "succeeded".
|
|
13
|
+
*/
|
|
14
|
+
declare const NON_PROGRESS_SIGNALS: string[];
|
|
15
|
+
export declare class ProgressTracker {
|
|
16
|
+
/**
|
|
17
|
+
* Evaluate recent tool calls to determine if the agent is making progress.
|
|
18
|
+
*
|
|
19
|
+
* @param recentCalls - Last 5 tool calls from ActivityTracker (newest first)
|
|
20
|
+
* @param currentToolName - Current tool being evaluated
|
|
21
|
+
* @param currentResultText - Text content of current tool result
|
|
22
|
+
* @param currentIsError - Whether current tool call errored
|
|
23
|
+
* @returns ProgressStatus
|
|
24
|
+
*/
|
|
25
|
+
evaluate(recentCalls: ToolCallEvent[], _currentToolName: string, currentResultText: string, currentIsError: boolean): ProgressStatus;
|
|
26
|
+
/**
|
|
27
|
+
* Check if a tool result text contains non-progress signals.
|
|
28
|
+
* Used for the CURRENT tool call where we have the full result text.
|
|
29
|
+
*/
|
|
30
|
+
isProgressResult(resultText: string): boolean;
|
|
31
|
+
/**
|
|
32
|
+
* Check if a completed tool call was likely progress-producing.
|
|
33
|
+
* Used for PAST calls where we only have ToolCallEvent metadata.
|
|
34
|
+
*
|
|
35
|
+
* LIMITATION: For past calls with result='success' and no error field,
|
|
36
|
+
* this method returns true (progress) even if the actual result text
|
|
37
|
+
* contained non-progress signals. Only the CURRENT call's full result
|
|
38
|
+
* text is inspected by isProgressResult(). Past call evaluation is
|
|
39
|
+
* limited to the error field and tool metadata.
|
|
40
|
+
*/
|
|
41
|
+
private isLikelyProgressCall;
|
|
42
|
+
}
|
|
43
|
+
export { NON_PROGRESS_SIGNALS };
|
|
44
|
+
//# sourceMappingURL=progress-tracker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"progress-tracker.d.ts","sourceRoot":"","sources":["../../src/hints/progress-tracker.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAE3D,MAAM,MAAM,cAAc,GAAG,aAAa,GAAG,UAAU,GAAG,OAAO,CAAC;AAElE;;;GAGG;AACH,QAAA,MAAM,oBAAoB,UAgBzB,CAAC;AAEF,qBAAa,eAAe;IAC1B;;;;;;;;OAQG;IACH,QAAQ,CACN,WAAW,EAAE,aAAa,EAAE,EAC5B,gBAAgB,EAAE,MAAM,EACxB,iBAAiB,EAAE,MAAM,EACzB,cAAc,EAAE,OAAO,GACtB,cAAc;IAwCjB;;;OAGG;IACH,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO;IAM7C;;;;;;;;;OASG;IACH,OAAO,CAAC,oBAAoB;CAe7B;AAGD,OAAO,EAAE,oBAAoB,EAAE,CAAC"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* ProgressTracker — Detects when the LLM agent is not making meaningful progress.
|
|
4
|
+
*
|
|
5
|
+
* Instead of matching specific error patterns, measures whether recent tool calls
|
|
6
|
+
* represent meaningful progress (URL change, content extraction, successful interaction)
|
|
7
|
+
* or spinning (auth redirects, stale refs, non-interactive clicks, timeouts).
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.NON_PROGRESS_SIGNALS = exports.ProgressTracker = void 0;
|
|
11
|
+
/**
|
|
12
|
+
* Signals in tool results that indicate NO meaningful progress was made,
|
|
13
|
+
* even if the tool call technically "succeeded".
|
|
14
|
+
*/
|
|
15
|
+
const NON_PROGRESS_SIGNALS = [
|
|
16
|
+
'authRedirect', // Auth redirect detected
|
|
17
|
+
'not interactive', // Clicked non-interactive element
|
|
18
|
+
'is stale', // Stale ref
|
|
19
|
+
'timed out', // Timeout
|
|
20
|
+
'No significant visual change', // Screenshot unchanged
|
|
21
|
+
'element not found', // Element not found (tightened from 'not found')
|
|
22
|
+
'no longer available', // Tab gone
|
|
23
|
+
'Login page detected', // Login redirect (from hint)
|
|
24
|
+
'CAPTCHA', // CAPTCHA blocked
|
|
25
|
+
'404', // Page not found
|
|
26
|
+
'Access Denied', // Access denied
|
|
27
|
+
'Forbidden', // 403
|
|
28
|
+
'net::ERR_', // Chromium network errors
|
|
29
|
+
'Navigation timeout', // Puppeteer navigation timeout
|
|
30
|
+
'Protocol error', // CDP-level failures
|
|
31
|
+
];
|
|
32
|
+
exports.NON_PROGRESS_SIGNALS = NON_PROGRESS_SIGNALS;
|
|
33
|
+
class ProgressTracker {
|
|
34
|
+
/**
|
|
35
|
+
* Evaluate recent tool calls to determine if the agent is making progress.
|
|
36
|
+
*
|
|
37
|
+
* @param recentCalls - Last 5 tool calls from ActivityTracker (newest first)
|
|
38
|
+
* @param currentToolName - Current tool being evaluated
|
|
39
|
+
* @param currentResultText - Text content of current tool result
|
|
40
|
+
* @param currentIsError - Whether current tool call errored
|
|
41
|
+
* @returns ProgressStatus
|
|
42
|
+
*/
|
|
43
|
+
evaluate(recentCalls, _currentToolName, currentResultText, currentIsError) {
|
|
44
|
+
// Build a list of recent "progress" assessments including the current call
|
|
45
|
+
const currentIsProgress = !currentIsError && this.isProgressResult(currentResultText);
|
|
46
|
+
let consecutiveNonProgress = currentIsProgress ? 0 : 1;
|
|
47
|
+
let consecutiveErrors = currentIsError ? 1 : 0;
|
|
48
|
+
// Walk backward through recent calls
|
|
49
|
+
for (const call of recentCalls) {
|
|
50
|
+
if (call.result === 'error') {
|
|
51
|
+
consecutiveErrors++;
|
|
52
|
+
consecutiveNonProgress++;
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
// Check if the successful call had non-progress signals
|
|
56
|
+
// We can only check error field; for successful calls we check the tool name pattern
|
|
57
|
+
const wasProgress = this.isLikelyProgressCall(call);
|
|
58
|
+
if (!wasProgress) {
|
|
59
|
+
consecutiveNonProgress++;
|
|
60
|
+
// Do NOT reset consecutiveErrors — a non-progress success
|
|
61
|
+
// is not evidence that the error streak ended
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
consecutiveErrors = 0; // Only reset on genuine progress
|
|
65
|
+
break; // Found progress, stop counting
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
// Stuck: 3+ consecutive errors, or 5+ non-progress calls
|
|
70
|
+
if (consecutiveErrors >= 3 || consecutiveNonProgress >= 5) {
|
|
71
|
+
return 'stuck';
|
|
72
|
+
}
|
|
73
|
+
// Stalling: 3+ non-progress calls (mix of errors and non-progress successes)
|
|
74
|
+
if (consecutiveNonProgress >= 3) {
|
|
75
|
+
return 'stalling';
|
|
76
|
+
}
|
|
77
|
+
return 'progressing';
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Check if a tool result text contains non-progress signals.
|
|
81
|
+
* Used for the CURRENT tool call where we have the full result text.
|
|
82
|
+
*/
|
|
83
|
+
isProgressResult(resultText) {
|
|
84
|
+
if (!resultText || resultText.trim().length === 0)
|
|
85
|
+
return false;
|
|
86
|
+
const lower = resultText.toLowerCase();
|
|
87
|
+
return !NON_PROGRESS_SIGNALS.some(signal => lower.includes(signal.toLowerCase()));
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Check if a completed tool call was likely progress-producing.
|
|
91
|
+
* Used for PAST calls where we only have ToolCallEvent metadata.
|
|
92
|
+
*
|
|
93
|
+
* LIMITATION: For past calls with result='success' and no error field,
|
|
94
|
+
* this method returns true (progress) even if the actual result text
|
|
95
|
+
* contained non-progress signals. Only the CURRENT call's full result
|
|
96
|
+
* text is inspected by isProgressResult(). Past call evaluation is
|
|
97
|
+
* limited to the error field and tool metadata.
|
|
98
|
+
*/
|
|
99
|
+
isLikelyProgressCall(call) {
|
|
100
|
+
// Errors are never progress
|
|
101
|
+
if (call.result === 'error')
|
|
102
|
+
return false;
|
|
103
|
+
// If error field is set (even on "success"), check for non-progress signals
|
|
104
|
+
if (call.error) {
|
|
105
|
+
return !NON_PROGRESS_SIGNALS.some(signal => call.error.includes(signal));
|
|
106
|
+
}
|
|
107
|
+
// Tool-based heuristics for past calls without full result text:
|
|
108
|
+
// - navigate with very fast completion (~<500ms) might be a redirect
|
|
109
|
+
// - computer/click calls without errors are usually progress
|
|
110
|
+
// - read_page/find calls are usually progress (information gathering)
|
|
111
|
+
return true;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
exports.ProgressTracker = ProgressTracker;
|
|
115
|
+
//# sourceMappingURL=progress-tracker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"progress-tracker.js","sourceRoot":"","sources":["../../src/hints/progress-tracker.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sequence-detection.d.ts","sourceRoot":"","sources":["../../../src/hints/rules/sequence-detection.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAe,MAAM,gBAAgB,CAAC;AAe5D,eAAO,MAAM,sBAAsB,EAAE,QAAQ,
|
|
1
|
+
{"version":3,"file":"sequence-detection.d.ts","sourceRoot":"","sources":["../../../src/hints/rules/sequence-detection.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAe,MAAM,gBAAgB,CAAC;AAe5D,eAAO,MAAM,sBAAsB,EAAE,QAAQ,EAuF5C,CAAC"}
|
|
@@ -41,14 +41,17 @@ exports.sequenceDetectionRules = [
|
|
|
41
41
|
},
|
|
42
42
|
{
|
|
43
43
|
name: 'navigate-to-login',
|
|
44
|
-
priority:
|
|
44
|
+
priority: 150, // Between error-recovery (100-108) and pagination (190)
|
|
45
45
|
match(ctx) {
|
|
46
46
|
if (ctx.toolName !== 'navigate')
|
|
47
47
|
return null;
|
|
48
48
|
if (ctx.isError)
|
|
49
|
-
return null;
|
|
50
|
-
if (/login|sign.?in|log.?in|auth/i.test(ctx.resultText)) {
|
|
51
|
-
return 'Hint:
|
|
49
|
+
return null; // isError paths already carry inline guidance
|
|
50
|
+
if (/login|sign.?in|log.?in|auth|oauth/i.test(ctx.resultText)) {
|
|
51
|
+
return 'Hint: Authentication required — login page detected. ' +
|
|
52
|
+
'The user must be logged in via their Chrome profile. ' +
|
|
53
|
+
'STOP trying to authenticate programmatically. ' +
|
|
54
|
+
'Ask the user to log in manually in Chrome, then retry.';
|
|
52
55
|
}
|
|
53
56
|
return null;
|
|
54
57
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sequence-detection.js","sourceRoot":"","sources":["../../../src/hints/rules/sequence-detection.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAIH,SAAS,WAAW,CAAC,GAAgB,EAAE,IAAY;IACjD,OAAO,GAAG,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,IAAI,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,KAAK,IAAI,CAAC;AAC5E,CAAC;AAED,SAAS,gBAAgB,CAAC,GAAgB,EAAE,IAAY;IACtD,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,WAAW,EAAE,CAAC;QACnC,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI;YAAE,KAAK,EAAE,CAAC;;YAC/B,MAAM;IACb,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAEY,QAAA,sBAAsB,GAAe;IAChD;QACE,IAAI,EAAE,mBAAmB;QACzB,QAAQ,EAAE,GAAG,EAAE,gDAAgD;QAC/D,KAAK,CAAC,GAAG;YACP,IAAI,GAAG,CAAC,QAAQ,KAAK,UAAU;gBAAE,OAAO,IAAI,CAAC;YAE7C,8CAA8C;YAC9C,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC;gBAAE,OAAO,IAAI,CAAC;YAEpD,8DAA8D;YAC9D,IAAI,GAAG,CAAC,WAAW,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,IAAI,CAAC;YAC9C,MAAM,IAAI,GAAG,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;YAEhC,IACE,IAAI,CAAC,QAAQ,KAAK,UAAU;gBAC5B,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,EAAE,MAAM,KAAK,WAAW,CAAC,EACrE,CAAC;gBACD,OAAO,CACL,yFAAyF;oBACzF,uEAAuE,CACxE,CAAC;YACJ,CAAC;YAED,OAAO,IAAI,CAAC;QACd,CAAC;KACF;IACD;QACE,IAAI,EAAE,mBAAmB;QACzB,QAAQ,EAAE,GAAG;
|
|
1
|
+
{"version":3,"file":"sequence-detection.js","sourceRoot":"","sources":["../../../src/hints/rules/sequence-detection.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"navigate.d.ts","sourceRoot":"","sources":["../../src/tools/navigate.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"navigate.d.ts","sourceRoot":"","sources":["../../src/tools/navigate.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AA2V1C,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAE5D"}
|
package/dist/tools/navigate.js
CHANGED
|
@@ -94,7 +94,29 @@ const handler = async (sessionId, args) => {
|
|
|
94
94
|
if (await sessionManager.isTargetValid(existingTabId)) {
|
|
95
95
|
const page = await sessionManager.getPage(sessionId, existingTabId, undefined, 'navigate');
|
|
96
96
|
if (page) {
|
|
97
|
-
await (0, smart_goto_1.smartGoto)(page, targetUrl, { timeout: defaults_1.DEFAULT_NAVIGATION_TIMEOUT_MS });
|
|
97
|
+
const { authRedirect } = await (0, smart_goto_1.smartGoto)(page, targetUrl, { timeout: defaults_1.DEFAULT_NAVIGATION_TIMEOUT_MS });
|
|
98
|
+
if (authRedirect) {
|
|
99
|
+
adaptive_screenshot_1.AdaptiveScreenshot.getInstance().reset(existingTabId);
|
|
100
|
+
return {
|
|
101
|
+
content: [{
|
|
102
|
+
type: 'text',
|
|
103
|
+
text: JSON.stringify({
|
|
104
|
+
action: 'navigate',
|
|
105
|
+
url: page.url(),
|
|
106
|
+
title: await (0, safe_title_1.safeTitle)(page),
|
|
107
|
+
tabId: existingTabId,
|
|
108
|
+
workerId: resolvedWorkerId,
|
|
109
|
+
authRedirect: true,
|
|
110
|
+
redirectedFrom: authRedirect.from,
|
|
111
|
+
authRedirectHost: authRedirect.host,
|
|
112
|
+
message: 'Authentication required — the page redirected to ' + authRedirect.host +
|
|
113
|
+
'. The user must log in manually in their Chrome browser, then retry. ' +
|
|
114
|
+
'Do NOT attempt to authenticate programmatically (no cookies, tokens, or OAuth workarounds).',
|
|
115
|
+
}),
|
|
116
|
+
}],
|
|
117
|
+
isError: true,
|
|
118
|
+
};
|
|
119
|
+
}
|
|
98
120
|
adaptive_screenshot_1.AdaptiveScreenshot.getInstance().reset(existingTabId);
|
|
99
121
|
const summary = await (0, visual_summary_1.generateVisualSummary)(page);
|
|
100
122
|
return {
|
|
@@ -256,6 +278,27 @@ const handler = async (sessionId, args) => {
|
|
|
256
278
|
(0, domain_guard_1.assertDomainAllowed)(targetUrl);
|
|
257
279
|
// Navigate with smart auth redirect detection
|
|
258
280
|
const { authRedirect } = await (0, smart_goto_1.smartGoto)(page, targetUrl, { timeout: defaults_1.DEFAULT_NAVIGATION_TIMEOUT_MS });
|
|
281
|
+
// Auth redirect = fail-fast with clear error
|
|
282
|
+
if (authRedirect) {
|
|
283
|
+
adaptive_screenshot_1.AdaptiveScreenshot.getInstance().reset(tabId);
|
|
284
|
+
return {
|
|
285
|
+
content: [{
|
|
286
|
+
type: 'text',
|
|
287
|
+
text: JSON.stringify({
|
|
288
|
+
action: 'navigate',
|
|
289
|
+
url: page.url(),
|
|
290
|
+
title: await (0, safe_title_1.safeTitle)(page),
|
|
291
|
+
authRedirect: true,
|
|
292
|
+
redirectedFrom: authRedirect.from,
|
|
293
|
+
authRedirectHost: authRedirect.host,
|
|
294
|
+
message: 'Authentication required — the page redirected to ' + authRedirect.host +
|
|
295
|
+
'. The user must log in manually in their Chrome browser, then retry. ' +
|
|
296
|
+
'Do NOT attempt to authenticate programmatically (no cookies, tokens, or OAuth workarounds).',
|
|
297
|
+
}),
|
|
298
|
+
}],
|
|
299
|
+
isError: true,
|
|
300
|
+
};
|
|
301
|
+
}
|
|
259
302
|
adaptive_screenshot_1.AdaptiveScreenshot.getInstance().reset(tabId);
|
|
260
303
|
const navSummary = await (0, visual_summary_1.generateVisualSummary)(page);
|
|
261
304
|
return {
|
|
@@ -266,7 +309,6 @@ const handler = async (sessionId, args) => {
|
|
|
266
309
|
action: 'navigate',
|
|
267
310
|
url: page.url(),
|
|
268
311
|
title: await (0, safe_title_1.safeTitle)(page),
|
|
269
|
-
...(authRedirect && { redirectedFrom: authRedirect.from, authRedirect: true }),
|
|
270
312
|
...(navSummary && { visualSummary: navSummary }),
|
|
271
313
|
}),
|
|
272
314
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"navigate.js","sourceRoot":"","sources":["../../src/tools/navigate.ts"],"names":[],"mappings":";AAAA;;GAEG;;
|
|
1
|
+
{"version":3,"file":"navigate.js","sourceRoot":"","sources":["../../src/tools/navigate.ts"],"names":[],"mappings":"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"}
|