claude-chrome-parallel 3.0.3 → 3.4.0
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/LICENSE +21 -21
- package/README.md +398 -464
- package/assets/demo.svg +278 -173
- package/dist/cdp/client.d.ts +60 -2
- package/dist/cdp/client.d.ts.map +1 -1
- package/dist/cdp/client.js +344 -5
- package/dist/cdp/client.js.map +1 -1
- package/dist/cdp/connection-pool.d.ts.map +1 -1
- package/dist/cdp/connection-pool.js +20 -4
- package/dist/cdp/connection-pool.js.map +1 -1
- package/dist/chrome/launcher.d.ts +11 -0
- package/dist/chrome/launcher.d.ts.map +1 -1
- package/dist/chrome/launcher.js +124 -10
- package/dist/chrome/launcher.js.map +1 -1
- package/dist/chrome/pool.d.ts +54 -0
- package/dist/chrome/pool.d.ts.map +1 -0
- package/dist/chrome/pool.js +301 -0
- package/dist/chrome/pool.js.map +1 -0
- package/dist/chrome/profile-detector.d.ts +52 -0
- package/dist/chrome/profile-detector.d.ts.map +1 -0
- package/dist/chrome/profile-detector.js +246 -0
- package/dist/chrome/profile-detector.js.map +1 -0
- package/dist/cli/claude-session.js +15 -15
- package/dist/cli/index.js +162 -37
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/update-check.d.ts +9 -0
- package/dist/cli/update-check.js +141 -0
- package/dist/cli/update-check.js.map +1 -0
- package/dist/config/global.d.ts +31 -0
- package/dist/config/global.d.ts.map +1 -1
- package/dist/config/global.js.map +1 -1
- package/dist/dashboard/activity-tracker.d.ts +60 -0
- package/dist/dashboard/activity-tracker.d.ts.map +1 -0
- package/dist/dashboard/activity-tracker.js +178 -0
- package/dist/dashboard/activity-tracker.js.map +1 -0
- package/dist/dashboard/ansi.d.ts +117 -0
- package/dist/dashboard/ansi.d.ts.map +1 -0
- package/dist/dashboard/ansi.js +199 -0
- package/dist/dashboard/ansi.js.map +1 -0
- package/dist/dashboard/index.d.ts +110 -0
- package/dist/dashboard/index.d.ts.map +1 -0
- package/dist/dashboard/index.js +412 -0
- package/dist/dashboard/index.js.map +1 -0
- package/dist/dashboard/keyboard-handler.d.ts +43 -0
- package/dist/dashboard/keyboard-handler.d.ts.map +1 -0
- package/dist/dashboard/keyboard-handler.js +215 -0
- package/dist/dashboard/keyboard-handler.js.map +1 -0
- package/dist/dashboard/operation-controller.d.ts +76 -0
- package/dist/dashboard/operation-controller.d.ts.map +1 -0
- package/dist/dashboard/operation-controller.js +167 -0
- package/dist/dashboard/operation-controller.js.map +1 -0
- package/dist/dashboard/renderer.d.ts +76 -0
- package/dist/dashboard/renderer.d.ts.map +1 -0
- package/dist/dashboard/renderer.js +193 -0
- package/dist/dashboard/renderer.js.map +1 -0
- package/dist/dashboard/types.d.ts +56 -0
- package/dist/dashboard/types.d.ts.map +1 -0
- package/dist/dashboard/types.js +12 -0
- package/dist/dashboard/types.js.map +1 -0
- package/dist/dashboard/views/main-view.d.ts +23 -0
- package/dist/dashboard/views/main-view.d.ts.map +1 -0
- package/dist/dashboard/views/main-view.js +143 -0
- package/dist/dashboard/views/main-view.js.map +1 -0
- package/dist/dashboard/views/sessions-view.d.ts +22 -0
- package/dist/dashboard/views/sessions-view.d.ts.map +1 -0
- package/dist/dashboard/views/sessions-view.js +104 -0
- package/dist/dashboard/views/sessions-view.js.map +1 -0
- package/dist/dashboard/views/tabs-view.d.ts +21 -0
- package/dist/dashboard/views/tabs-view.d.ts.map +1 -0
- package/dist/dashboard/views/tabs-view.js +92 -0
- package/dist/dashboard/views/tabs-view.js.map +1 -0
- package/dist/hints/hint-engine.d.ts +65 -0
- package/dist/hints/hint-engine.d.ts.map +1 -0
- package/dist/hints/hint-engine.js +156 -0
- package/dist/hints/hint-engine.js.map +1 -0
- package/dist/hints/index.d.ts +8 -0
- package/dist/hints/index.d.ts.map +1 -0
- package/dist/hints/index.js +11 -0
- package/dist/hints/index.js.map +1 -0
- package/dist/hints/pattern-learner.d.ts +76 -0
- package/dist/hints/pattern-learner.d.ts.map +1 -0
- package/dist/hints/pattern-learner.js +254 -0
- package/dist/hints/pattern-learner.js.map +1 -0
- package/dist/hints/rules/composite-suggestions.d.ts +6 -0
- package/dist/hints/rules/composite-suggestions.d.ts.map +1 -0
- package/dist/hints/rules/composite-suggestions.js +66 -0
- package/dist/hints/rules/composite-suggestions.js.map +1 -0
- package/dist/hints/rules/error-recovery.d.ts +7 -0
- package/dist/hints/rules/error-recovery.d.ts.map +1 -0
- package/dist/hints/rules/error-recovery.js +47 -0
- package/dist/hints/rules/error-recovery.js.map +1 -0
- package/dist/hints/rules/learned-rules.d.ts +13 -0
- package/dist/hints/rules/learned-rules.d.ts.map +1 -0
- package/dist/hints/rules/learned-rules.js +27 -0
- package/dist/hints/rules/learned-rules.js.map +1 -0
- package/dist/hints/rules/repetition-detection.d.ts +7 -0
- package/dist/hints/rules/repetition-detection.d.ts.map +1 -0
- package/dist/hints/rules/repetition-detection.js +82 -0
- package/dist/hints/rules/repetition-detection.js.map +1 -0
- package/dist/hints/rules/sequence-detection.d.ts +6 -0
- package/dist/hints/rules/sequence-detection.d.ts.map +1 -0
- package/dist/hints/rules/sequence-detection.js +61 -0
- package/dist/hints/rules/sequence-detection.js.map +1 -0
- package/dist/hints/rules/success-hints.d.ts +6 -0
- package/dist/hints/rules/success-hints.d.ts.map +1 -0
- package/dist/hints/rules/success-hints.js +62 -0
- package/dist/hints/rules/success-hints.js.map +1 -0
- package/dist/index.js +190 -55
- package/dist/index.js.map +1 -1
- package/dist/lightpanda/launcher.d.ts +58 -0
- package/dist/lightpanda/launcher.d.ts.map +1 -0
- package/dist/lightpanda/launcher.js +199 -0
- package/dist/lightpanda/launcher.js.map +1 -0
- package/dist/mcp-server.d.ts +38 -1
- package/dist/mcp-server.d.ts.map +1 -1
- package/dist/mcp-server.js +220 -6
- package/dist/mcp-server.js.map +1 -1
- package/dist/orchestration/state-manager.js +46 -46
- package/dist/orchestration/workflow-engine.d.ts +1 -0
- package/dist/orchestration/workflow-engine.d.ts.map +1 -1
- package/dist/orchestration/workflow-engine.js +112 -114
- package/dist/orchestration/workflow-engine.js.map +1 -1
- package/dist/resources/usage-guide.d.ts +13 -0
- package/dist/resources/usage-guide.d.ts.map +1 -0
- package/dist/resources/usage-guide.js +101 -0
- package/dist/resources/usage-guide.js.map +1 -0
- package/dist/router/browser-router.d.ts +51 -0
- package/dist/router/browser-router.d.ts.map +1 -0
- package/dist/router/browser-router.js +178 -0
- package/dist/router/browser-router.js.map +1 -0
- package/dist/router/cookie-sync.d.ts +48 -0
- package/dist/router/cookie-sync.d.ts.map +1 -0
- package/dist/router/cookie-sync.js +106 -0
- package/dist/router/cookie-sync.js.map +1 -0
- package/dist/router/index.d.ts +5 -0
- package/dist/router/index.d.ts.map +1 -0
- package/dist/router/index.js +10 -0
- package/dist/router/index.js.map +1 -0
- package/dist/router/tool-routing-registry.d.ts +21 -0
- package/dist/router/tool-routing-registry.d.ts.map +1 -0
- package/dist/router/tool-routing-registry.js +90 -0
- package/dist/router/tool-routing-registry.js.map +1 -0
- package/dist/session-manager.d.ts +41 -1
- package/dist/session-manager.d.ts.map +1 -1
- package/dist/session-manager.js +216 -21
- package/dist/session-manager.js.map +1 -1
- package/dist/tools/click-element.d.ts +8 -0
- package/dist/tools/click-element.d.ts.map +1 -0
- package/dist/tools/click-element.js +383 -0
- package/dist/tools/click-element.js.map +1 -0
- package/dist/tools/computer.d.ts.map +1 -1
- package/dist/tools/computer.js +198 -34
- package/dist/tools/computer.js.map +1 -1
- package/dist/tools/console-capture.d.ts +6 -0
- package/dist/tools/console-capture.d.ts.map +1 -0
- package/dist/tools/console-capture.js +320 -0
- package/dist/tools/console-capture.js.map +1 -0
- package/dist/tools/cookies.d.ts +6 -0
- package/dist/tools/cookies.d.ts.map +1 -0
- package/dist/tools/cookies.js +263 -0
- package/dist/tools/cookies.js.map +1 -0
- package/dist/tools/drag-drop.d.ts +6 -0
- package/dist/tools/drag-drop.d.ts.map +1 -0
- package/dist/tools/drag-drop.js +252 -0
- package/dist/tools/drag-drop.js.map +1 -0
- package/dist/tools/emulate-device.d.ts +6 -0
- package/dist/tools/emulate-device.d.ts.map +1 -0
- package/dist/tools/emulate-device.js +221 -0
- package/dist/tools/emulate-device.js.map +1 -0
- package/dist/tools/file-upload.d.ts +6 -0
- package/dist/tools/file-upload.d.ts.map +1 -0
- package/dist/tools/file-upload.js +208 -0
- package/dist/tools/file-upload.js.map +1 -0
- package/dist/tools/fill-form.d.ts +8 -0
- package/dist/tools/fill-form.d.ts.map +1 -0
- package/dist/tools/fill-form.js +342 -0
- package/dist/tools/fill-form.js.map +1 -0
- package/dist/tools/find.d.ts.map +1 -1
- package/dist/tools/find.js +153 -65
- package/dist/tools/find.js.map +1 -1
- package/dist/tools/form-input.js +52 -52
- package/dist/tools/form-input.js.map +1 -1
- package/dist/tools/geolocation.d.ts +6 -0
- package/dist/tools/geolocation.d.ts.map +1 -0
- package/dist/tools/geolocation.js +172 -0
- package/dist/tools/geolocation.js.map +1 -0
- package/dist/tools/http-auth.d.ts +6 -0
- package/dist/tools/http-auth.d.ts.map +1 -0
- package/dist/tools/http-auth.js +136 -0
- package/dist/tools/http-auth.js.map +1 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +50 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/javascript.js +1 -1
- package/dist/tools/javascript.js.map +1 -1
- package/dist/tools/navigate.d.ts.map +1 -1
- package/dist/tools/navigate.js +5 -2
- package/dist/tools/navigate.js.map +1 -1
- package/dist/tools/network.js +4 -4
- package/dist/tools/network.js.map +1 -1
- package/dist/tools/orchestration.d.ts.map +1 -1
- package/dist/tools/orchestration.js +13 -8
- package/dist/tools/orchestration.js.map +1 -1
- package/dist/tools/page-content.d.ts +6 -0
- package/dist/tools/page-content.d.ts.map +1 -0
- package/dist/tools/page-content.js +120 -0
- package/dist/tools/page-content.js.map +1 -0
- package/dist/tools/page-pdf.d.ts +6 -0
- package/dist/tools/page-pdf.d.ts.map +1 -0
- package/dist/tools/page-pdf.js +245 -0
- package/dist/tools/page-pdf.js.map +1 -0
- package/dist/tools/page-reload.d.ts +6 -0
- package/dist/tools/page-reload.d.ts.map +1 -0
- package/dist/tools/page-reload.js +89 -0
- package/dist/tools/page-reload.js.map +1 -0
- package/dist/tools/performance-metrics.d.ts +6 -0
- package/dist/tools/performance-metrics.d.ts.map +1 -0
- package/dist/tools/performance-metrics.js +158 -0
- package/dist/tools/performance-metrics.js.map +1 -0
- package/dist/tools/read-page.d.ts.map +1 -1
- package/dist/tools/read-page.js +4 -2
- package/dist/tools/read-page.js.map +1 -1
- package/dist/tools/request-intercept.d.ts +6 -0
- package/dist/tools/request-intercept.d.ts.map +1 -0
- package/dist/tools/request-intercept.js +439 -0
- package/dist/tools/request-intercept.js.map +1 -0
- package/dist/tools/selector-query.d.ts +6 -0
- package/dist/tools/selector-query.d.ts.map +1 -0
- package/dist/tools/selector-query.js +206 -0
- package/dist/tools/selector-query.js.map +1 -0
- package/dist/tools/storage.d.ts +6 -0
- package/dist/tools/storage.d.ts.map +1 -0
- package/dist/tools/storage.js +264 -0
- package/dist/tools/storage.js.map +1 -0
- package/dist/tools/tabs-close.d.ts +6 -0
- package/dist/tools/tabs-close.d.ts.map +1 -0
- package/dist/tools/tabs-close.js +124 -0
- package/dist/tools/tabs-close.js.map +1 -0
- package/dist/tools/tabs-context.js +1 -1
- package/dist/tools/tabs-context.js.map +1 -1
- package/dist/tools/user-agent.d.ts +6 -0
- package/dist/tools/user-agent.d.ts.map +1 -0
- package/dist/tools/user-agent.js +128 -0
- package/dist/tools/user-agent.js.map +1 -0
- package/dist/tools/wait-and-click.d.ts +8 -0
- package/dist/tools/wait-and-click.d.ts.map +1 -0
- package/dist/tools/wait-and-click.js +290 -0
- package/dist/tools/wait-and-click.js.map +1 -0
- package/dist/tools/wait-for.d.ts +6 -0
- package/dist/tools/wait-for.d.ts.map +1 -0
- package/dist/tools/wait-for.js +248 -0
- package/dist/tools/wait-for.js.map +1 -0
- package/dist/tools/xpath-query.d.ts +6 -0
- package/dist/tools/xpath-query.d.ts.map +1 -0
- package/dist/tools/xpath-query.js +230 -0
- package/dist/tools/xpath-query.js.map +1 -0
- package/dist/types/browser-backend.d.ts +30 -0
- package/dist/types/browser-backend.d.ts.map +1 -0
- package/dist/types/browser-backend.js +9 -0
- package/dist/types/browser-backend.js.map +1 -0
- package/dist/types/profile.d.ts +76 -0
- package/dist/types/profile.d.ts.map +1 -0
- package/dist/types/profile.js +35 -0
- package/dist/types/profile.js.map +1 -0
- package/dist/types/session.d.ts +7 -3
- package/dist/types/session.d.ts.map +1 -1
- package/package.json +78 -75
- package/dist/master/index.d.ts +0 -18
- package/dist/master/index.d.ts.map +0 -1
- package/dist/master/index.js +0 -75
- package/dist/master/index.js.map +0 -1
- package/dist/master/ipc-server.d.ts +0 -21
- package/dist/master/ipc-server.d.ts.map +0 -1
- package/dist/master/ipc-server.js +0 -175
- package/dist/master/ipc-server.js.map +0 -1
- package/dist/master/request-handler.d.ts +0 -17
- package/dist/master/request-handler.d.ts.map +0 -1
- package/dist/master/request-handler.js +0 -134
- package/dist/master/request-handler.js.map +0 -1
- package/dist/master/session-registry.d.ts +0 -120
- package/dist/master/session-registry.d.ts.map +0 -1
- package/dist/master/session-registry.js +0 -247
- package/dist/master/session-registry.js.map +0 -1
- package/dist/shared/ipc-constants.d.ts +0 -16
- package/dist/shared/ipc-constants.d.ts.map +0 -1
- package/dist/shared/ipc-constants.js +0 -66
- package/dist/shared/ipc-constants.js.map +0 -1
- package/dist/shared/ipc-protocol.d.ts +0 -33
- package/dist/shared/ipc-protocol.d.ts.map +0 -1
- package/dist/shared/ipc-protocol.js +0 -20
- package/dist/shared/ipc-protocol.js.map +0 -1
- package/dist/worker/auto-master.d.ts +0 -24
- package/dist/worker/auto-master.d.ts.map +0 -1
- package/dist/worker/auto-master.js +0 -135
- package/dist/worker/auto-master.js.map +0 -1
- package/dist/worker/index.d.ts +0 -25
- package/dist/worker/index.d.ts.map +0 -1
- package/dist/worker/index.js +0 -93
- package/dist/worker/index.js.map +0 -1
- package/dist/worker/ipc-client.d.ts +0 -26
- package/dist/worker/ipc-client.d.ts.map +0 -1
- package/dist/worker/ipc-client.js +0 -211
- package/dist/worker/ipc-client.js.map +0 -1
- package/dist/worker/remote-session-manager.d.ts +0 -114
- package/dist/worker/remote-session-manager.d.ts.map +0 -1
- package/dist/worker/remote-session-manager.js +0 -151
- package/dist/worker/remote-session-manager.js.map +0 -1
- package/dist/worker/tools.d.ts +0 -7
- package/dist/worker/tools.d.ts.map +0 -1
- package/dist/worker/tools.js +0 -340
- package/dist/worker/tools.js.map +0 -1
- package/dist/worker/worker-mcp-server.d.ts +0 -70
- package/dist/worker/worker-mcp-server.d.ts.map +0 -1
- package/dist/worker/worker-mcp-server.js +0 -295
- package/dist/worker/worker-mcp-server.js.map +0 -1
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hints module — Anti-삽질 hint system
|
|
3
|
+
*/
|
|
4
|
+
export { HintEngine } from './hint-engine';
|
|
5
|
+
export type { HintContext, HintRule, HintLogEntry } from './hint-engine';
|
|
6
|
+
export { PatternLearner } from './pattern-learner';
|
|
7
|
+
export type { LearnedPattern } from './pattern-learner';
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/hints/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,YAAY,EAAE,WAAW,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AACzE,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,YAAY,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Hints module — Anti-삽질 hint system
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.PatternLearner = exports.HintEngine = void 0;
|
|
7
|
+
var hint_engine_1 = require("./hint-engine");
|
|
8
|
+
Object.defineProperty(exports, "HintEngine", { enumerable: true, get: function () { return hint_engine_1.HintEngine; } });
|
|
9
|
+
var pattern_learner_1 = require("./pattern-learner");
|
|
10
|
+
Object.defineProperty(exports, "PatternLearner", { enumerable: true, get: function () { return pattern_learner_1.PatternLearner; } });
|
|
11
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/hints/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAEH,6CAA2C;AAAlC,yGAAA,UAAU,OAAA;AAEnB,qDAAmD;AAA1C,iHAAA,cAAc,OAAA"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PatternLearner — Adaptive memory system that learns error→recovery patterns.
|
|
3
|
+
*
|
|
4
|
+
* Flow:
|
|
5
|
+
* 1. Hint miss on error → start observing next 3 tool calls
|
|
6
|
+
* 2. If a different tool succeeds → record as recovery pattern
|
|
7
|
+
* 3. Same error→recovery seen N times → promote to learned rule
|
|
8
|
+
* 4. Persisted to JSON, survives across sessions
|
|
9
|
+
*/
|
|
10
|
+
export interface LearnedPattern {
|
|
11
|
+
id: string;
|
|
12
|
+
errorFingerprint: string;
|
|
13
|
+
errorTools: string[];
|
|
14
|
+
recoveryTool: string;
|
|
15
|
+
occurrences: number;
|
|
16
|
+
confidence: number;
|
|
17
|
+
firstSeen: number;
|
|
18
|
+
lastSeen: number;
|
|
19
|
+
hint: string;
|
|
20
|
+
}
|
|
21
|
+
export declare class PatternLearner {
|
|
22
|
+
private pending;
|
|
23
|
+
private rawObservations;
|
|
24
|
+
private patterns;
|
|
25
|
+
private filePath;
|
|
26
|
+
private dirty;
|
|
27
|
+
static readonly WATCH_WINDOW = 3;
|
|
28
|
+
static readonly PROMOTE_THRESHOLD = 3;
|
|
29
|
+
static readonly CONFIDENCE_THRESHOLD = 0.6;
|
|
30
|
+
static readonly MAX_PENDING = 10;
|
|
31
|
+
/**
|
|
32
|
+
* Enable persistence — load existing patterns and save new ones.
|
|
33
|
+
*/
|
|
34
|
+
enablePersistence(dirPath: string): void;
|
|
35
|
+
/**
|
|
36
|
+
* Called when a hint miss occurs on an error (no static rule matched).
|
|
37
|
+
* Starts observing subsequent calls to detect recovery pattern.
|
|
38
|
+
*/
|
|
39
|
+
onMiss(toolName: string, errorText: string): void;
|
|
40
|
+
/**
|
|
41
|
+
* Called on every tool completion to observe potential recovery patterns.
|
|
42
|
+
*/
|
|
43
|
+
onToolComplete(toolName: string, isError: boolean): void;
|
|
44
|
+
/**
|
|
45
|
+
* Record an observed error→recovery correlation.
|
|
46
|
+
*/
|
|
47
|
+
private recordRecovery;
|
|
48
|
+
/**
|
|
49
|
+
* Check if a raw observation should be promoted to a learned pattern.
|
|
50
|
+
*/
|
|
51
|
+
private tryPromote;
|
|
52
|
+
/**
|
|
53
|
+
* Match an error against learned patterns.
|
|
54
|
+
*/
|
|
55
|
+
matchPattern(errorText: string, toolName: string): LearnedPattern | null;
|
|
56
|
+
/**
|
|
57
|
+
* Normalize error text for fingerprinting.
|
|
58
|
+
* Strips dynamic values (IDs, large numbers) to group similar errors.
|
|
59
|
+
*/
|
|
60
|
+
normalizeError(text: string): string;
|
|
61
|
+
/**
|
|
62
|
+
* Get all learned patterns (for testing/inspection).
|
|
63
|
+
*/
|
|
64
|
+
getPatterns(): LearnedPattern[];
|
|
65
|
+
/**
|
|
66
|
+
* Get pending observation count (for testing).
|
|
67
|
+
*/
|
|
68
|
+
getPendingCount(): number;
|
|
69
|
+
static generateHint(recoveryTool: string, occurrences: number): string;
|
|
70
|
+
private load;
|
|
71
|
+
/**
|
|
72
|
+
* Persist learned patterns to disk.
|
|
73
|
+
*/
|
|
74
|
+
save(): void;
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=pattern-learner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pattern-learner.d.ts","sourceRoot":"","sources":["../../src/hints/pattern-learner.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAKH,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,gBAAgB,EAAE,MAAM,CAAC;IACzB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;CACd;AAsBD,qBAAa,cAAc;IACzB,OAAO,CAAC,OAAO,CAA4B;IAC3C,OAAO,CAAC,eAAe,CAA0C;IACjE,OAAO,CAAC,QAAQ,CAAwB;IACxC,OAAO,CAAC,QAAQ,CAAuB;IACvC,OAAO,CAAC,KAAK,CAAS;IAEtB,MAAM,CAAC,QAAQ,CAAC,YAAY,KAAK;IACjC,MAAM,CAAC,QAAQ,CAAC,iBAAiB,KAAK;IACtC,MAAM,CAAC,QAAQ,CAAC,oBAAoB,OAAO;IAC3C,MAAM,CAAC,QAAQ,CAAC,WAAW,MAAM;IAEjC;;OAEG;IACH,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAUxC;;;OAGG;IACH,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI;IAiBjD;;OAEG;IACH,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI;IA0BxD;;OAEG;IACH,OAAO,CAAC,cAAc;IAmBtB;;OAEG;IACH,OAAO,CAAC,UAAU;IA0ClB;;OAEG;IACH,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI;IAaxE;;;OAGG;IACH,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAUpC;;OAEG;IACH,WAAW,IAAI,cAAc,EAAE;IAI/B;;OAEG;IACH,eAAe,IAAI,MAAM;IAIzB,MAAM,CAAC,YAAY,CAAC,YAAY,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM;IAItE,OAAO,CAAC,IAAI;IAWZ;;OAEG;IACH,IAAI,IAAI,IAAI;CAgBb"}
|
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* PatternLearner — Adaptive memory system that learns error→recovery patterns.
|
|
4
|
+
*
|
|
5
|
+
* Flow:
|
|
6
|
+
* 1. Hint miss on error → start observing next 3 tool calls
|
|
7
|
+
* 2. If a different tool succeeds → record as recovery pattern
|
|
8
|
+
* 3. Same error→recovery seen N times → promote to learned rule
|
|
9
|
+
* 4. Persisted to JSON, survives across sessions
|
|
10
|
+
*/
|
|
11
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
12
|
+
if (k2 === undefined) k2 = k;
|
|
13
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
14
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
15
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
16
|
+
}
|
|
17
|
+
Object.defineProperty(o, k2, desc);
|
|
18
|
+
}) : (function(o, m, k, k2) {
|
|
19
|
+
if (k2 === undefined) k2 = k;
|
|
20
|
+
o[k2] = m[k];
|
|
21
|
+
}));
|
|
22
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
23
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
24
|
+
}) : function(o, v) {
|
|
25
|
+
o["default"] = v;
|
|
26
|
+
});
|
|
27
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
28
|
+
var ownKeys = function(o) {
|
|
29
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
30
|
+
var ar = [];
|
|
31
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
32
|
+
return ar;
|
|
33
|
+
};
|
|
34
|
+
return ownKeys(o);
|
|
35
|
+
};
|
|
36
|
+
return function (mod) {
|
|
37
|
+
if (mod && mod.__esModule) return mod;
|
|
38
|
+
var result = {};
|
|
39
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
40
|
+
__setModuleDefault(result, mod);
|
|
41
|
+
return result;
|
|
42
|
+
};
|
|
43
|
+
})();
|
|
44
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
45
|
+
exports.PatternLearner = void 0;
|
|
46
|
+
const fs = __importStar(require("fs"));
|
|
47
|
+
const path = __importStar(require("path"));
|
|
48
|
+
class PatternLearner {
|
|
49
|
+
pending = [];
|
|
50
|
+
rawObservations = new Map();
|
|
51
|
+
patterns = [];
|
|
52
|
+
filePath = null;
|
|
53
|
+
dirty = false;
|
|
54
|
+
static WATCH_WINDOW = 3;
|
|
55
|
+
static PROMOTE_THRESHOLD = 3;
|
|
56
|
+
static CONFIDENCE_THRESHOLD = 0.6;
|
|
57
|
+
static MAX_PENDING = 10;
|
|
58
|
+
/**
|
|
59
|
+
* Enable persistence — load existing patterns and save new ones.
|
|
60
|
+
*/
|
|
61
|
+
enablePersistence(dirPath) {
|
|
62
|
+
try {
|
|
63
|
+
fs.mkdirSync(dirPath, { recursive: true });
|
|
64
|
+
this.filePath = path.join(dirPath, 'learned-patterns.json');
|
|
65
|
+
this.load();
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
// Best-effort
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Called when a hint miss occurs on an error (no static rule matched).
|
|
73
|
+
* Starts observing subsequent calls to detect recovery pattern.
|
|
74
|
+
*/
|
|
75
|
+
onMiss(toolName, errorText) {
|
|
76
|
+
const fingerprint = this.normalizeError(errorText);
|
|
77
|
+
if (!fingerprint)
|
|
78
|
+
return;
|
|
79
|
+
// Limit pending observations to prevent memory buildup
|
|
80
|
+
if (this.pending.length >= PatternLearner.MAX_PENDING) {
|
|
81
|
+
this.pending.shift();
|
|
82
|
+
}
|
|
83
|
+
this.pending.push({
|
|
84
|
+
errorTool: toolName,
|
|
85
|
+
errorFingerprint: fingerprint,
|
|
86
|
+
timestamp: Date.now(),
|
|
87
|
+
remainingSlots: PatternLearner.WATCH_WINDOW,
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Called on every tool completion to observe potential recovery patterns.
|
|
92
|
+
*/
|
|
93
|
+
onToolComplete(toolName, isError) {
|
|
94
|
+
const resolved = [];
|
|
95
|
+
for (let i = 0; i < this.pending.length; i++) {
|
|
96
|
+
const obs = this.pending[i];
|
|
97
|
+
if (!isError && toolName !== obs.errorTool) {
|
|
98
|
+
// Success with different tool = potential recovery
|
|
99
|
+
this.recordRecovery(obs.errorFingerprint, obs.errorTool, toolName);
|
|
100
|
+
resolved.push(i);
|
|
101
|
+
}
|
|
102
|
+
else if (!isError && toolName === obs.errorTool) {
|
|
103
|
+
// Same tool succeeded = self-resolved, discard
|
|
104
|
+
resolved.push(i);
|
|
105
|
+
}
|
|
106
|
+
else {
|
|
107
|
+
// Another error, keep watching
|
|
108
|
+
obs.remainingSlots--;
|
|
109
|
+
if (obs.remainingSlots <= 0)
|
|
110
|
+
resolved.push(i);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
// Remove resolved observations (reverse order to preserve indices)
|
|
114
|
+
for (let i = resolved.length - 1; i >= 0; i--) {
|
|
115
|
+
this.pending.splice(resolved[i], 1);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Record an observed error→recovery correlation.
|
|
120
|
+
*/
|
|
121
|
+
recordRecovery(errorFingerprint, errorTool, recoveryTool) {
|
|
122
|
+
let raw = this.rawObservations.get(errorFingerprint);
|
|
123
|
+
if (!raw) {
|
|
124
|
+
raw = {
|
|
125
|
+
errorFingerprint,
|
|
126
|
+
errorTools: new Set(),
|
|
127
|
+
recoveryTools: new Map(),
|
|
128
|
+
totalObservations: 0,
|
|
129
|
+
};
|
|
130
|
+
this.rawObservations.set(errorFingerprint, raw);
|
|
131
|
+
}
|
|
132
|
+
raw.errorTools.add(errorTool);
|
|
133
|
+
raw.recoveryTools.set(recoveryTool, (raw.recoveryTools.get(recoveryTool) || 0) + 1);
|
|
134
|
+
raw.totalObservations++;
|
|
135
|
+
this.tryPromote(raw);
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Check if a raw observation should be promoted to a learned pattern.
|
|
139
|
+
*/
|
|
140
|
+
tryPromote(raw) {
|
|
141
|
+
let bestTool = '';
|
|
142
|
+
let bestCount = 0;
|
|
143
|
+
for (const [tool, count] of raw.recoveryTools) {
|
|
144
|
+
if (count > bestCount) {
|
|
145
|
+
bestTool = tool;
|
|
146
|
+
bestCount = count;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
const confidence = bestCount / raw.totalObservations;
|
|
150
|
+
if (bestCount < PatternLearner.PROMOTE_THRESHOLD || confidence < PatternLearner.CONFIDENCE_THRESHOLD) {
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
const existing = this.patterns.find(p => p.errorFingerprint === raw.errorFingerprint);
|
|
154
|
+
if (existing) {
|
|
155
|
+
existing.occurrences = bestCount;
|
|
156
|
+
existing.confidence = confidence;
|
|
157
|
+
existing.recoveryTool = bestTool;
|
|
158
|
+
existing.lastSeen = Date.now();
|
|
159
|
+
existing.errorTools = Array.from(raw.errorTools);
|
|
160
|
+
existing.hint = PatternLearner.generateHint(bestTool, bestCount);
|
|
161
|
+
}
|
|
162
|
+
else {
|
|
163
|
+
this.patterns.push({
|
|
164
|
+
id: `learned-${Date.now()}-${Math.random().toString(36).slice(2, 6)}`,
|
|
165
|
+
errorFingerprint: raw.errorFingerprint,
|
|
166
|
+
errorTools: Array.from(raw.errorTools),
|
|
167
|
+
recoveryTool: bestTool,
|
|
168
|
+
occurrences: bestCount,
|
|
169
|
+
confidence,
|
|
170
|
+
firstSeen: Date.now(),
|
|
171
|
+
lastSeen: Date.now(),
|
|
172
|
+
hint: PatternLearner.generateHint(bestTool, bestCount),
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
this.dirty = true;
|
|
176
|
+
this.save();
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Match an error against learned patterns.
|
|
180
|
+
*/
|
|
181
|
+
matchPattern(errorText, toolName) {
|
|
182
|
+
const fingerprint = this.normalizeError(errorText);
|
|
183
|
+
for (const pattern of this.patterns) {
|
|
184
|
+
if (pattern.errorTools.includes(toolName) &&
|
|
185
|
+
(fingerprint.includes(pattern.errorFingerprint) || pattern.errorFingerprint.includes(fingerprint))) {
|
|
186
|
+
return pattern;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
return null;
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Normalize error text for fingerprinting.
|
|
193
|
+
* Strips dynamic values (IDs, large numbers) to group similar errors.
|
|
194
|
+
*/
|
|
195
|
+
normalizeError(text) {
|
|
196
|
+
return text
|
|
197
|
+
.toLowerCase()
|
|
198
|
+
.replace(/\b[0-9a-f]{8,}\b/g, '{id}')
|
|
199
|
+
.replace(/\d{4,}/g, '{n}')
|
|
200
|
+
.replace(/\s+/g, ' ')
|
|
201
|
+
.trim()
|
|
202
|
+
.slice(0, 100);
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Get all learned patterns (for testing/inspection).
|
|
206
|
+
*/
|
|
207
|
+
getPatterns() {
|
|
208
|
+
return this.patterns;
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Get pending observation count (for testing).
|
|
212
|
+
*/
|
|
213
|
+
getPendingCount() {
|
|
214
|
+
return this.pending.length;
|
|
215
|
+
}
|
|
216
|
+
static generateHint(recoveryTool, occurrences) {
|
|
217
|
+
return `Hint: Try ${recoveryTool} — learned from ${occurrences} previous recoveries.`;
|
|
218
|
+
}
|
|
219
|
+
load() {
|
|
220
|
+
if (!this.filePath)
|
|
221
|
+
return;
|
|
222
|
+
try {
|
|
223
|
+
const data = fs.readFileSync(this.filePath, 'utf-8');
|
|
224
|
+
const store = JSON.parse(data);
|
|
225
|
+
this.patterns = store.patterns || [];
|
|
226
|
+
}
|
|
227
|
+
catch {
|
|
228
|
+
this.patterns = [];
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Persist learned patterns to disk.
|
|
233
|
+
*/
|
|
234
|
+
save() {
|
|
235
|
+
if (!this.filePath || !this.dirty)
|
|
236
|
+
return;
|
|
237
|
+
try {
|
|
238
|
+
const dir = path.dirname(this.filePath);
|
|
239
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
240
|
+
const store = {
|
|
241
|
+
version: 1,
|
|
242
|
+
patterns: this.patterns,
|
|
243
|
+
updatedAt: Date.now(),
|
|
244
|
+
};
|
|
245
|
+
fs.writeFileSync(this.filePath, JSON.stringify(store, null, 2));
|
|
246
|
+
this.dirty = false;
|
|
247
|
+
}
|
|
248
|
+
catch {
|
|
249
|
+
// Best-effort
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
exports.PatternLearner = PatternLearner;
|
|
254
|
+
//# sourceMappingURL=pattern-learner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pattern-learner.js","sourceRoot":"","sources":["../../src/hints/pattern-learner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"composite-suggestions.d.ts","sourceRoot":"","sources":["../../../src/hints/rules/composite-suggestions.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAe,MAAM,gBAAgB,CAAC;AAU5D,eAAO,MAAM,wBAAwB,EAAE,QAAQ,EA4C9C,CAAC"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Composite Suggestions — suggests combining multi-step patterns into single calls.
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.compositeSuggestionRules = void 0;
|
|
7
|
+
function lastToolWas(ctx, name) {
|
|
8
|
+
return ctx.recentCalls.length > 0 && ctx.recentCalls[0].toolName === name;
|
|
9
|
+
}
|
|
10
|
+
function recentToolCount(ctx, name) {
|
|
11
|
+
return ctx.recentCalls.filter(c => c.toolName === name).length;
|
|
12
|
+
}
|
|
13
|
+
exports.compositeSuggestionRules = [
|
|
14
|
+
{
|
|
15
|
+
name: 'find-then-click',
|
|
16
|
+
priority: 200,
|
|
17
|
+
match(ctx) {
|
|
18
|
+
if (ctx.toolName !== 'computer' && ctx.toolName !== 'click')
|
|
19
|
+
return null;
|
|
20
|
+
if (!lastToolWas(ctx, 'find'))
|
|
21
|
+
return null;
|
|
22
|
+
return 'Hint: Use click_element to find+click in one call.';
|
|
23
|
+
},
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
name: 'multiple-form-input',
|
|
27
|
+
priority: 201,
|
|
28
|
+
match(ctx) {
|
|
29
|
+
if (ctx.toolName !== 'form_input')
|
|
30
|
+
return null;
|
|
31
|
+
if (recentToolCount(ctx, 'form_input') >= 1) {
|
|
32
|
+
return 'Hint: Use fill_form({fields:{...}}) for multiple fields.';
|
|
33
|
+
}
|
|
34
|
+
return null;
|
|
35
|
+
},
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
name: 'navigate-then-click',
|
|
39
|
+
priority: 202,
|
|
40
|
+
match(ctx) {
|
|
41
|
+
if (ctx.toolName !== 'computer' && ctx.toolName !== 'click' && ctx.toolName !== 'click_element')
|
|
42
|
+
return null;
|
|
43
|
+
if (!lastToolWas(ctx, 'navigate'))
|
|
44
|
+
return null;
|
|
45
|
+
// Don't match screenshot operations — handled by sequence-detection
|
|
46
|
+
if (/screenshot/i.test(ctx.resultText))
|
|
47
|
+
return null;
|
|
48
|
+
return 'Hint: Use wait_and_click to handle loading delays.';
|
|
49
|
+
},
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
name: 'read-page-truncated',
|
|
53
|
+
priority: 203,
|
|
54
|
+
match(ctx) {
|
|
55
|
+
if (ctx.toolName !== 'read_page')
|
|
56
|
+
return null;
|
|
57
|
+
if (ctx.isError)
|
|
58
|
+
return null;
|
|
59
|
+
if (/truncat|too (long|large)|content cut|\.\.\.$/i.test(ctx.resultText)) {
|
|
60
|
+
return 'Hint: Use find(query) for targeted element search.';
|
|
61
|
+
}
|
|
62
|
+
return null;
|
|
63
|
+
},
|
|
64
|
+
},
|
|
65
|
+
];
|
|
66
|
+
//# sourceMappingURL=composite-suggestions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"composite-suggestions.js","sourceRoot":"","sources":["../../../src/hints/rules/composite-suggestions.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,eAAe,CAAC,GAAgB,EAAE,IAAY;IACrD,OAAO,GAAG,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,IAAI,CAAC,CAAC,MAAM,CAAC;AACjE,CAAC;AAEY,QAAA,wBAAwB,GAAe;IAClD;QACE,IAAI,EAAE,iBAAiB;QACvB,QAAQ,EAAE,GAAG;QACb,KAAK,CAAC,GAAG;YACP,IAAI,GAAG,CAAC,QAAQ,KAAK,UAAU,IAAI,GAAG,CAAC,QAAQ,KAAK,OAAO;gBAAE,OAAO,IAAI,CAAC;YACzE,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,MAAM,CAAC;gBAAE,OAAO,IAAI,CAAC;YAC3C,OAAO,oDAAoD,CAAC;QAC9D,CAAC;KACF;IACD;QACE,IAAI,EAAE,qBAAqB;QAC3B,QAAQ,EAAE,GAAG;QACb,KAAK,CAAC,GAAG;YACP,IAAI,GAAG,CAAC,QAAQ,KAAK,YAAY;gBAAE,OAAO,IAAI,CAAC;YAC/C,IAAI,eAAe,CAAC,GAAG,EAAE,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC5C,OAAO,0DAA0D,CAAC;YACpE,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;KACF;IACD;QACE,IAAI,EAAE,qBAAqB;QAC3B,QAAQ,EAAE,GAAG;QACb,KAAK,CAAC,GAAG;YACP,IAAI,GAAG,CAAC,QAAQ,KAAK,UAAU,IAAI,GAAG,CAAC,QAAQ,KAAK,OAAO,IAAI,GAAG,CAAC,QAAQ,KAAK,eAAe;gBAAE,OAAO,IAAI,CAAC;YAC7G,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,UAAU,CAAC;gBAAE,OAAO,IAAI,CAAC;YAC/C,oEAAoE;YACpE,IAAI,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC;gBAAE,OAAO,IAAI,CAAC;YACpD,OAAO,oDAAoD,CAAC;QAC9D,CAAC;KACF;IACD;QACE,IAAI,EAAE,qBAAqB;QAC3B,QAAQ,EAAE,GAAG;QACb,KAAK,CAAC,GAAG;YACP,IAAI,GAAG,CAAC,QAAQ,KAAK,WAAW;gBAAE,OAAO,IAAI,CAAC;YAC9C,IAAI,GAAG,CAAC,OAAO;gBAAE,OAAO,IAAI,CAAC;YAC7B,IAAI,+CAA+C,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;gBACzE,OAAO,oDAAoD,CAAC;YAC9D,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;KACF;CACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error-recovery.d.ts","sourceRoot":"","sources":["../../../src/hints/rules/error-recovery.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAiC/C,eAAO,MAAM,kBAAkB,EAAE,QAAQ,EAOtC,CAAC"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Error Recovery Rules — highest priority
|
|
4
|
+
* Maps error patterns to actionable recovery hints.
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.errorRecoveryRules = void 0;
|
|
8
|
+
const patterns = [
|
|
9
|
+
{
|
|
10
|
+
test: /ref[^a-z]*not found|invalid ref|stale ref/i,
|
|
11
|
+
hint: 'Hint: Refs expire after page changes. Use read_page or find for fresh refs.',
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
test: /tab[^a-z]*not found|invalid tab|no such tab/i,
|
|
15
|
+
hint: 'Hint: Use tabs_context_mcp to list valid tabIds.',
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
test: /selector[^a-z]*(failed|not found|no match)|querySelectorAll.*returned 0|no elements? match/i,
|
|
19
|
+
hint: 'Hint: Try find(query) with natural language instead.',
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
test: /click_element[^a-z]*(no match|not found|could not find)/i,
|
|
23
|
+
hint: 'Hint: Element may not be loaded. Try wait_and_click.',
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
test: /timeout|timed?\s*out|navigation timeout/i,
|
|
27
|
+
hint: 'Hint: Page may require login or different navigation.',
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
test: /cannot read propert|null is not|undefined is not|is null|is undefined/i,
|
|
31
|
+
hint: 'Hint: Element is null. Use find or read_page to verify.',
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
test: /coordinate|click at position|x,?\s*y/i,
|
|
35
|
+
hint: 'Hint: Use click_element(query) instead — finds and clicks in one step.',
|
|
36
|
+
},
|
|
37
|
+
];
|
|
38
|
+
exports.errorRecoveryRules = patterns.map((p, i) => ({
|
|
39
|
+
name: `error-recovery-${i}`,
|
|
40
|
+
priority: 100 + i,
|
|
41
|
+
match(ctx) {
|
|
42
|
+
if (!ctx.isError)
|
|
43
|
+
return null;
|
|
44
|
+
return p.test.test(ctx.resultText) ? p.hint : null;
|
|
45
|
+
},
|
|
46
|
+
}));
|
|
47
|
+
//# sourceMappingURL=error-recovery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error-recovery.js","sourceRoot":"","sources":["../../../src/hints/rules/error-recovery.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAIH,MAAM,QAAQ,GAA0C;IACtD;QACE,IAAI,EAAE,4CAA4C;QAClD,IAAI,EAAE,6EAA6E;KACpF;IACD;QACE,IAAI,EAAE,8CAA8C;QACpD,IAAI,EAAE,kDAAkD;KACzD;IACD;QACE,IAAI,EAAE,6FAA6F;QACnG,IAAI,EAAE,sDAAsD;KAC7D;IACD;QACE,IAAI,EAAE,0DAA0D;QAChE,IAAI,EAAE,sDAAsD;KAC7D;IACD;QACE,IAAI,EAAE,0CAA0C;QAChD,IAAI,EAAE,uDAAuD;KAC9D;IACD;QACE,IAAI,EAAE,wEAAwE;QAC9E,IAAI,EAAE,yDAAyD;KAChE;IACD;QACE,IAAI,EAAE,uCAAuC;QAC7C,IAAI,EAAE,wEAAwE;KAC/E;CACF,CAAC;AAEW,QAAA,kBAAkB,GAAe,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;IACpE,IAAI,EAAE,kBAAkB,CAAC,EAAE;IAC3B,QAAQ,EAAE,GAAG,GAAG,CAAC;IACjB,KAAK,CAAC,GAAG;QACP,IAAI,CAAC,GAAG,CAAC,OAAO;YAAE,OAAO,IAAI,CAAC;QAC9B,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;IACrD,CAAC;CACF,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Learned Rules — dynamically matches against patterns discovered by PatternLearner.
|
|
3
|
+
* Priority 350: between repetition detection (250) and success hints (400).
|
|
4
|
+
*/
|
|
5
|
+
import type { HintRule } from '../hint-engine';
|
|
6
|
+
import type { PatternLearner } from '../pattern-learner';
|
|
7
|
+
/**
|
|
8
|
+
* Create a HintRule that delegates to the PatternLearner.
|
|
9
|
+
* The rule's match function reads current patterns at evaluation time,
|
|
10
|
+
* so newly learned patterns are immediately available.
|
|
11
|
+
*/
|
|
12
|
+
export declare function createLearnedRules(learner: PatternLearner): HintRule[];
|
|
13
|
+
//# sourceMappingURL=learned-rules.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"learned-rules.d.ts","sourceRoot":"","sources":["../../../src/hints/rules/learned-rules.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEzD;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,cAAc,GAAG,QAAQ,EAAE,CAYtE"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Learned Rules — dynamically matches against patterns discovered by PatternLearner.
|
|
4
|
+
* Priority 350: between repetition detection (250) and success hints (400).
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.createLearnedRules = createLearnedRules;
|
|
8
|
+
/**
|
|
9
|
+
* Create a HintRule that delegates to the PatternLearner.
|
|
10
|
+
* The rule's match function reads current patterns at evaluation time,
|
|
11
|
+
* so newly learned patterns are immediately available.
|
|
12
|
+
*/
|
|
13
|
+
function createLearnedRules(learner) {
|
|
14
|
+
return [
|
|
15
|
+
{
|
|
16
|
+
name: 'learned-pattern',
|
|
17
|
+
priority: 350,
|
|
18
|
+
match(ctx) {
|
|
19
|
+
if (!ctx.isError)
|
|
20
|
+
return null;
|
|
21
|
+
const pattern = learner.matchPattern(ctx.resultText, ctx.toolName);
|
|
22
|
+
return pattern ? pattern.hint : null;
|
|
23
|
+
},
|
|
24
|
+
},
|
|
25
|
+
];
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=learned-rules.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"learned-rules.js","sourceRoot":"","sources":["../../../src/hints/rules/learned-rules.ts"],"names":[],"mappings":";AAAA;;;GAGG;;AAUH,gDAYC;AAjBD;;;;GAIG;AACH,SAAgB,kBAAkB,CAAC,OAAuB;IACxD,OAAO;QACL;YACE,IAAI,EAAE,iBAAiB;YACvB,QAAQ,EAAE,GAAG;YACb,KAAK,CAAC,GAAG;gBACP,IAAI,CAAC,GAAG,CAAC,OAAO;oBAAE,OAAO,IAAI,CAAC;gBAC9B,MAAM,OAAO,GAAG,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC;gBACnE,OAAO,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;YACvC,CAAC;SACF;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Repetition Detection — generic patterns that catch inefficiency without hardcoded rules.
|
|
3
|
+
* Priority 250: between composite suggestions (200) and sequence detection (300).
|
|
4
|
+
*/
|
|
5
|
+
import type { HintRule } from '../hint-engine';
|
|
6
|
+
export declare const repetitionDetectionRules: HintRule[];
|
|
7
|
+
//# sourceMappingURL=repetition-detection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repetition-detection.d.ts","sourceRoot":"","sources":["../../../src/hints/rules/repetition-detection.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAe,MAAM,gBAAgB,CAAC;AA4C5D,eAAO,MAAM,wBAAwB,EAAE,QAAQ,EA8B9C,CAAC"}
|