openchrome-mcp 1.9.6 → 1.9.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/dist/actions/action-cache.d.ts +26 -0
- package/dist/actions/action-cache.d.ts.map +1 -0
- package/dist/actions/action-cache.js +75 -0
- package/dist/actions/action-cache.js.map +1 -0
- package/dist/actions/action-parser.d.ts +23 -0
- package/dist/actions/action-parser.d.ts.map +1 -0
- package/dist/actions/action-parser.js +321 -0
- package/dist/actions/action-parser.js.map +1 -0
- package/dist/actions/action-templates.d.ts +29 -0
- package/dist/actions/action-templates.d.ts.map +1 -0
- package/dist/actions/action-templates.js +128 -0
- package/dist/actions/action-templates.js.map +1 -0
- package/dist/auth/adapters/bitwarden-adapter.d.ts +22 -0
- package/dist/auth/adapters/bitwarden-adapter.d.ts.map +1 -0
- package/dist/auth/adapters/bitwarden-adapter.js +113 -0
- package/dist/auth/adapters/bitwarden-adapter.js.map +1 -0
- package/dist/auth/adapters/index.d.ts +7 -0
- package/dist/auth/adapters/index.d.ts.map +1 -0
- package/dist/auth/adapters/index.js +13 -0
- package/dist/auth/adapters/index.js.map +1 -0
- package/dist/auth/adapters/local-adapter.d.ts +27 -0
- package/dist/auth/adapters/local-adapter.d.ts.map +1 -0
- package/dist/auth/adapters/local-adapter.js +59 -0
- package/dist/auth/adapters/local-adapter.js.map +1 -0
- package/dist/auth/adapters/onepassword-adapter.d.ts +22 -0
- package/dist/auth/adapters/onepassword-adapter.d.ts.map +1 -0
- package/dist/auth/adapters/onepassword-adapter.js +126 -0
- package/dist/auth/adapters/onepassword-adapter.js.map +1 -0
- package/dist/auth/credential-provider.d.ts +23 -0
- package/dist/auth/credential-provider.d.ts.map +1 -0
- package/dist/auth/credential-provider.js +30 -0
- package/dist/auth/credential-provider.js.map +1 -0
- package/dist/auth/credential-store.d.ts +29 -0
- package/dist/auth/credential-store.d.ts.map +1 -0
- package/dist/auth/credential-store.js +295 -0
- package/dist/auth/credential-store.js.map +1 -0
- package/dist/auth/totp-manager.d.ts +35 -0
- package/dist/auth/totp-manager.d.ts.map +1 -0
- package/dist/auth/totp-manager.js +133 -0
- package/dist/auth/totp-manager.js.map +1 -0
- package/dist/auth/twofa-detector.d.ts +30 -0
- package/dist/auth/twofa-detector.d.ts.map +1 -0
- package/dist/auth/twofa-detector.js +302 -0
- package/dist/auth/twofa-detector.js.map +1 -0
- package/dist/auth/twofa-handler.d.ts +32 -0
- package/dist/auth/twofa-handler.d.ts.map +1 -0
- package/dist/auth/twofa-handler.js +175 -0
- package/dist/auth/twofa-handler.js.map +1 -0
- package/dist/captcha/detect.d.ts +7 -0
- package/dist/captcha/detect.d.ts.map +1 -0
- package/dist/captcha/detect.js +54 -0
- package/dist/captcha/detect.js.map +1 -0
- package/dist/captcha/handler.d.ts +28 -0
- package/dist/captcha/handler.d.ts.map +1 -0
- package/dist/captcha/handler.js +196 -0
- package/dist/captcha/handler.js.map +1 -0
- package/dist/captcha/index.d.ts +13 -0
- package/dist/captcha/index.d.ts.map +1 -0
- package/dist/captcha/index.js +20 -0
- package/dist/captcha/index.js.map +1 -0
- package/dist/captcha/inject-solution.d.ts +14 -0
- package/dist/captcha/inject-solution.d.ts.map +1 -0
- package/dist/captcha/inject-solution.js +103 -0
- package/dist/captcha/inject-solution.js.map +1 -0
- package/dist/captcha/providers/anticaptcha.d.ts +18 -0
- package/dist/captcha/providers/anticaptcha.d.ts.map +1 -0
- package/dist/captcha/providers/anticaptcha.js +132 -0
- package/dist/captcha/providers/anticaptcha.js.map +1 -0
- package/dist/captcha/providers/capsolver.d.ts +18 -0
- package/dist/captcha/providers/capsolver.d.ts.map +1 -0
- package/dist/captcha/providers/capsolver.js +136 -0
- package/dist/captcha/providers/capsolver.js.map +1 -0
- package/dist/captcha/providers/twocaptcha.d.ts +18 -0
- package/dist/captcha/providers/twocaptcha.d.ts.map +1 -0
- package/dist/captcha/providers/twocaptcha.js +132 -0
- package/dist/captcha/providers/twocaptcha.js.map +1 -0
- package/dist/captcha/solver-interface.d.ts +68 -0
- package/dist/captcha/solver-interface.d.ts.map +1 -0
- package/dist/captcha/solver-interface.js +31 -0
- package/dist/captcha/solver-interface.js.map +1 -0
- package/dist/captcha/solver-registry.d.ts +45 -0
- package/dist/captcha/solver-registry.d.ts.map +1 -0
- package/dist/captcha/solver-registry.js +174 -0
- package/dist/captcha/solver-registry.js.map +1 -0
- package/dist/cdp/client.js +1 -1
- package/dist/cdp/client.js.map +1 -1
- package/dist/chrome/launcher.d.ts.map +1 -1
- package/dist/chrome/launcher.js +3 -0
- package/dist/chrome/launcher.js.map +1 -1
- package/dist/chrome/profile-manager.d.ts +1 -1
- package/dist/chrome/profile-manager.d.ts.map +1 -1
- package/dist/chrome/profile-manager.js +24 -2
- package/dist/chrome/profile-manager.js.map +1 -1
- package/dist/cli/index.js +90 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/totp-store.d.ts +51 -0
- package/dist/cli/totp-store.js +255 -0
- package/dist/cli/totp-store.js.map +1 -0
- package/dist/config/tool-tiers.d.ts.map +1 -1
- package/dist/config/tool-tiers.js +11 -0
- package/dist/config/tool-tiers.js.map +1 -1
- package/dist/extraction/index.d.ts +5 -0
- package/dist/extraction/index.d.ts.map +1 -0
- package/dist/extraction/index.js +13 -0
- package/dist/extraction/index.js.map +1 -0
- package/dist/extraction/schema-validator.d.ts +32 -0
- package/dist/extraction/schema-validator.d.ts.map +1 -0
- package/dist/extraction/schema-validator.js +121 -0
- package/dist/extraction/schema-validator.js.map +1 -0
- package/dist/extraction/strategies.d.ts +12 -0
- package/dist/extraction/strategies.d.ts.map +1 -0
- package/dist/extraction/strategies.js +23 -0
- package/dist/extraction/strategies.js.map +1 -0
- package/dist/hints/rules/blocking-page.d.ts +1 -3
- package/dist/hints/rules/blocking-page.d.ts.map +1 -1
- package/dist/hints/rules/blocking-page.js +16 -12
- package/dist/hints/rules/blocking-page.js.map +1 -1
- package/dist/index.js +43 -10
- package/dist/index.js.map +1 -1
- package/dist/mcp-server.d.ts +12 -0
- package/dist/mcp-server.d.ts.map +1 -1
- package/dist/mcp-server.js +89 -44
- package/dist/mcp-server.js.map +1 -1
- package/dist/recording/action-recorder.d.ts +82 -0
- package/dist/recording/action-recorder.d.ts.map +1 -0
- package/dist/recording/action-recorder.js +249 -0
- package/dist/recording/action-recorder.js.map +1 -0
- package/dist/recording/html-template.d.ts +15 -0
- package/dist/recording/html-template.d.ts.map +1 -0
- package/dist/recording/html-template.js +610 -0
- package/dist/recording/html-template.js.map +1 -0
- package/dist/recording/index.d.ts +10 -0
- package/dist/recording/index.d.ts.map +1 -0
- package/dist/recording/index.js +26 -0
- package/dist/recording/index.js.map +1 -0
- package/dist/recording/recording-store.d.ts +104 -0
- package/dist/recording/recording-store.d.ts.map +1 -0
- package/dist/recording/recording-store.js +301 -0
- package/dist/recording/recording-store.js.map +1 -0
- package/dist/recording/replay-viewer.d.ts +45 -0
- package/dist/recording/replay-viewer.d.ts.map +1 -0
- package/dist/recording/replay-viewer.js +224 -0
- package/dist/recording/replay-viewer.js.map +1 -0
- package/dist/recording/types.d.ts +74 -0
- package/dist/recording/types.d.ts.map +1 -0
- package/dist/recording/types.js +18 -0
- package/dist/recording/types.js.map +1 -0
- package/dist/session-manager.d.ts +5 -0
- package/dist/session-manager.d.ts.map +1 -1
- package/dist/session-manager.js +29 -0
- package/dist/session-manager.js.map +1 -1
- package/dist/tools/act.d.ts +9 -0
- package/dist/tools/act.d.ts.map +1 -0
- package/dist/tools/act.js +469 -0
- package/dist/tools/act.js.map +1 -0
- package/dist/tools/crawl-sitemap.d.ts +11 -0
- package/dist/tools/crawl-sitemap.d.ts.map +1 -0
- package/dist/tools/crawl-sitemap.js +489 -0
- package/dist/tools/crawl-sitemap.js.map +1 -0
- package/dist/tools/crawl.d.ts +11 -0
- package/dist/tools/crawl.d.ts.map +1 -0
- package/dist/tools/crawl.js +483 -0
- package/dist/tools/crawl.js.map +1 -0
- package/dist/tools/extract-data.d.ts +6 -0
- package/dist/tools/extract-data.d.ts.map +1 -0
- package/dist/tools/extract-data.js +195 -0
- package/dist/tools/extract-data.js.map +1 -0
- package/dist/tools/find.d.ts.map +1 -1
- package/dist/tools/find.js +53 -0
- package/dist/tools/find.js.map +1 -1
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +26 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/navigate.d.ts.map +1 -1
- package/dist/tools/navigate.js +45 -0
- package/dist/tools/navigate.js.map +1 -1
- package/dist/tools/recording.d.ts +7 -0
- package/dist/tools/recording.d.ts.map +1 -0
- package/dist/tools/recording.js +399 -0
- package/dist/tools/recording.js.map +1 -0
- package/dist/tools/totp-generate.d.ts +6 -0
- package/dist/tools/totp-generate.d.ts.map +1 -0
- package/dist/tools/totp-generate.js +105 -0
- package/dist/tools/totp-generate.js.map +1 -0
- package/dist/tools/vision-find.d.ts +12 -0
- package/dist/tools/vision-find.d.ts.map +1 -0
- package/dist/tools/vision-find.js +115 -0
- package/dist/tools/vision-find.js.map +1 -0
- package/dist/transports/http.d.ts +2 -1
- package/dist/transports/http.d.ts.map +1 -1
- package/dist/transports/http.js +44 -1
- package/dist/transports/http.js.map +1 -1
- package/dist/transports/index.d.ts +3 -1
- package/dist/transports/index.d.ts.map +1 -1
- package/dist/transports/index.js +3 -1
- package/dist/transports/index.js.map +1 -1
- package/dist/types/captcha.d.ts +16 -0
- package/dist/types/captcha.d.ts.map +1 -0
- package/dist/types/captcha.js +6 -0
- package/dist/types/captcha.js.map +1 -0
- package/dist/utils/auth-token.d.ts +18 -0
- package/dist/utils/auth-token.d.ts.map +1 -0
- package/dist/utils/auth-token.js +95 -0
- package/dist/utils/auth-token.js.map +1 -0
- package/dist/utils/crawl-utils.d.ts +104 -0
- package/dist/utils/crawl-utils.d.ts.map +1 -0
- package/dist/utils/crawl-utils.js +354 -0
- package/dist/utils/crawl-utils.js.map +1 -0
- package/dist/utils/page-diagnostics.d.ts +6 -0
- package/dist/utils/page-diagnostics.d.ts.map +1 -1
- package/dist/utils/page-diagnostics.js +44 -49
- package/dist/utils/page-diagnostics.js.map +1 -1
- package/dist/vision/auto-detect.d.ts +26 -0
- package/dist/vision/auto-detect.d.ts.map +1 -0
- package/dist/vision/auto-detect.js +100 -0
- package/dist/vision/auto-detect.js.map +1 -0
- package/dist/vision/config.d.ts +21 -0
- package/dist/vision/config.d.ts.map +1 -0
- package/dist/vision/config.js +39 -0
- package/dist/vision/config.js.map +1 -0
- package/dist/vision/screenshot-analyzer.d.ts +53 -0
- package/dist/vision/screenshot-analyzer.d.ts.map +1 -0
- package/dist/vision/screenshot-analyzer.js +310 -0
- package/dist/vision/screenshot-analyzer.js.map +1 -0
- package/dist/vision/types.d.ts +51 -0
- package/dist/vision/types.d.ts.map +1 -0
- package/dist/vision/types.js +8 -0
- package/dist/vision/types.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Action Cache - Domain memory integration for caching successful action sequences.
|
|
3
|
+
*
|
|
4
|
+
* After a successful `act` execution, saves the instruction→sequence mapping.
|
|
5
|
+
* On repeat visits to the same domain, tries the cached sequence first.
|
|
6
|
+
*/
|
|
7
|
+
import { ParsedAction } from './action-parser';
|
|
8
|
+
export interface CachedSequence {
|
|
9
|
+
instruction: string;
|
|
10
|
+
actions: ParsedAction[];
|
|
11
|
+
cachedAt: number;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Look up a cached action sequence for the given instruction and domain.
|
|
15
|
+
* Returns null if no cache hit or confidence is too low.
|
|
16
|
+
*/
|
|
17
|
+
export declare function getCachedSequence(url: string, instruction: string): CachedSequence | null;
|
|
18
|
+
/**
|
|
19
|
+
* Cache a successful action sequence for the given domain.
|
|
20
|
+
*/
|
|
21
|
+
export declare function cacheSequence(url: string, instruction: string, actions: ParsedAction[]): void;
|
|
22
|
+
/**
|
|
23
|
+
* Report success/failure for a cached sequence to adjust confidence.
|
|
24
|
+
*/
|
|
25
|
+
export declare function validateCachedSequence(url: string, instruction: string, success: boolean): void;
|
|
26
|
+
//# sourceMappingURL=action-cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"action-cache.d.ts","sourceRoot":"","sources":["../../src/actions/action-cache.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAK/C,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CAmBzF;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,GAAG,IAAI,CAa7F;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,CAW/F"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Action Cache - Domain memory integration for caching successful action sequences.
|
|
4
|
+
*
|
|
5
|
+
* After a successful `act` execution, saves the instruction→sequence mapping.
|
|
6
|
+
* On repeat visits to the same domain, tries the cached sequence first.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.getCachedSequence = getCachedSequence;
|
|
10
|
+
exports.cacheSequence = cacheSequence;
|
|
11
|
+
exports.validateCachedSequence = validateCachedSequence;
|
|
12
|
+
const domain_memory_1 = require("../memory/domain-memory");
|
|
13
|
+
const CACHE_KEY_PREFIX = 'act-sequence:';
|
|
14
|
+
const MIN_CONFIDENCE = 0.6;
|
|
15
|
+
/**
|
|
16
|
+
* Look up a cached action sequence for the given instruction and domain.
|
|
17
|
+
* Returns null if no cache hit or confidence is too low.
|
|
18
|
+
*/
|
|
19
|
+
function getCachedSequence(url, instruction) {
|
|
20
|
+
const domain = (0, domain_memory_1.extractDomainFromUrl)(url);
|
|
21
|
+
if (!domain)
|
|
22
|
+
return null;
|
|
23
|
+
const key = CACHE_KEY_PREFIX + normalizeForCache(instruction);
|
|
24
|
+
const memory = (0, domain_memory_1.getDomainMemory)();
|
|
25
|
+
const entries = memory.query(domain, key);
|
|
26
|
+
if (entries.length === 0)
|
|
27
|
+
return null;
|
|
28
|
+
const best = entries[0]; // Already sorted by confidence desc
|
|
29
|
+
if (best.confidence < MIN_CONFIDENCE)
|
|
30
|
+
return null;
|
|
31
|
+
try {
|
|
32
|
+
const cached = JSON.parse(best.value);
|
|
33
|
+
return cached;
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Cache a successful action sequence for the given domain.
|
|
41
|
+
*/
|
|
42
|
+
function cacheSequence(url, instruction, actions) {
|
|
43
|
+
const domain = (0, domain_memory_1.extractDomainFromUrl)(url);
|
|
44
|
+
if (!domain)
|
|
45
|
+
return;
|
|
46
|
+
const key = CACHE_KEY_PREFIX + normalizeForCache(instruction);
|
|
47
|
+
const value = {
|
|
48
|
+
instruction,
|
|
49
|
+
actions,
|
|
50
|
+
cachedAt: Date.now(),
|
|
51
|
+
};
|
|
52
|
+
const memory = (0, domain_memory_1.getDomainMemory)();
|
|
53
|
+
memory.record(domain, key, JSON.stringify(value));
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Report success/failure for a cached sequence to adjust confidence.
|
|
57
|
+
*/
|
|
58
|
+
function validateCachedSequence(url, instruction, success) {
|
|
59
|
+
const domain = (0, domain_memory_1.extractDomainFromUrl)(url);
|
|
60
|
+
if (!domain)
|
|
61
|
+
return;
|
|
62
|
+
const key = CACHE_KEY_PREFIX + normalizeForCache(instruction);
|
|
63
|
+
const memory = (0, domain_memory_1.getDomainMemory)();
|
|
64
|
+
const entries = memory.query(domain, key);
|
|
65
|
+
if (entries.length > 0) {
|
|
66
|
+
memory.validate(entries[0].id, success);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Normalize instruction for cache key: lowercase, collapse whitespace, trim.
|
|
71
|
+
*/
|
|
72
|
+
function normalizeForCache(instruction) {
|
|
73
|
+
return instruction.toLowerCase().replace(/\s+/g, ' ').trim();
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=action-cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"action-cache.js","sourceRoot":"","sources":["../../src/actions/action-cache.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;AAkBH,8CAmBC;AAKD,sCAaC;AAKD,wDAWC;AArED,2DAAgF;AAGhF,MAAM,gBAAgB,GAAG,eAAe,CAAC;AACzC,MAAM,cAAc,GAAG,GAAG,CAAC;AAQ3B;;;GAGG;AACH,SAAgB,iBAAiB,CAAC,GAAW,EAAE,WAAmB;IAChE,MAAM,MAAM,GAAG,IAAA,oCAAoB,EAAC,GAAG,CAAC,CAAC;IACzC,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IAEzB,MAAM,GAAG,GAAG,gBAAgB,GAAG,iBAAiB,CAAC,WAAW,CAAC,CAAC;IAC9D,MAAM,MAAM,GAAG,IAAA,+BAAe,GAAE,CAAC;IACjC,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAE1C,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAEtC,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,oCAAoC;IAC7D,IAAI,IAAI,CAAC,UAAU,GAAG,cAAc;QAAE,OAAO,IAAI,CAAC;IAElD,IAAI,CAAC;QACH,MAAM,MAAM,GAAmB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACtD,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAgB,aAAa,CAAC,GAAW,EAAE,WAAmB,EAAE,OAAuB;IACrF,MAAM,MAAM,GAAG,IAAA,oCAAoB,EAAC,GAAG,CAAC,CAAC;IACzC,IAAI,CAAC,MAAM;QAAE,OAAO;IAEpB,MAAM,GAAG,GAAG,gBAAgB,GAAG,iBAAiB,CAAC,WAAW,CAAC,CAAC;IAC9D,MAAM,KAAK,GAAmB;QAC5B,WAAW;QACX,OAAO;QACP,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE;KACrB,CAAC;IAEF,MAAM,MAAM,GAAG,IAAA,+BAAe,GAAE,CAAC;IACjC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;AACpD,CAAC;AAED;;GAEG;AACH,SAAgB,sBAAsB,CAAC,GAAW,EAAE,WAAmB,EAAE,OAAgB;IACvF,MAAM,MAAM,GAAG,IAAA,oCAAoB,EAAC,GAAG,CAAC,CAAC;IACzC,IAAI,CAAC,MAAM;QAAE,OAAO;IAEpB,MAAM,GAAG,GAAG,gBAAgB,GAAG,iBAAiB,CAAC,WAAW,CAAC,CAAC;IAC9D,MAAM,MAAM,GAAG,IAAA,+BAAe,GAAE,CAAC;IACjC,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAE1C,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;IAC1C,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,iBAAiB,CAAC,WAAmB;IAC5C,OAAO,WAAW,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;AAC/D,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Action Parser - Converts natural language instructions into structured action sequences.
|
|
3
|
+
* Uses pattern matching and keyword extraction only — no LLM calls.
|
|
4
|
+
*/
|
|
5
|
+
export type ActionVerb = 'click' | 'type' | 'select' | 'check' | 'uncheck' | 'hover' | 'scroll' | 'wait' | 'navigate';
|
|
6
|
+
export interface ParsedAction {
|
|
7
|
+
action: ActionVerb;
|
|
8
|
+
target?: string;
|
|
9
|
+
value?: string;
|
|
10
|
+
condition?: string;
|
|
11
|
+
}
|
|
12
|
+
export interface ParseResult {
|
|
13
|
+
success: boolean;
|
|
14
|
+
actions: ParsedAction[];
|
|
15
|
+
error?: string;
|
|
16
|
+
suggestion?: string;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Parse a natural language browser instruction into a structured action sequence.
|
|
20
|
+
* Pure pattern-matching — no LLM calls, no network I/O.
|
|
21
|
+
*/
|
|
22
|
+
export declare function parseInstruction(instruction: string): ParseResult;
|
|
23
|
+
//# sourceMappingURL=action-parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"action-parser.d.ts","sourceRoot":"","sources":["../../src/actions/action-parser.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,GAAG,SAAS,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,CAAC;AAEtH,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,UAAU,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAkTD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,WAAW,CA0CjE"}
|
|
@@ -0,0 +1,321 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Action Parser - Converts natural language instructions into structured action sequences.
|
|
4
|
+
* Uses pattern matching and keyword extraction only — no LLM calls.
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.parseInstruction = parseInstruction;
|
|
8
|
+
// ---------------------------------------------------------------------------
|
|
9
|
+
// Verb detection patterns
|
|
10
|
+
// ---------------------------------------------------------------------------
|
|
11
|
+
/** Returns the ActionVerb for a given phrase prefix, or null if unrecognised. */
|
|
12
|
+
function detectVerb(phrase) {
|
|
13
|
+
const s = phrase.trim().toLowerCase();
|
|
14
|
+
// Korean — check first so multi-byte sequences don't interfere with ASCII patterns
|
|
15
|
+
if (/체크\s*해제|언체크/.test(s))
|
|
16
|
+
return 'uncheck';
|
|
17
|
+
if (/체크/.test(s))
|
|
18
|
+
return 'check';
|
|
19
|
+
if (/클릭|누르|탭/.test(s))
|
|
20
|
+
return 'click';
|
|
21
|
+
if (/입력|작성|쓰|타이핑/.test(s))
|
|
22
|
+
return 'type';
|
|
23
|
+
if (/선택|고르/.test(s))
|
|
24
|
+
return 'select';
|
|
25
|
+
if (/호버|마우스\s*오버/.test(s))
|
|
26
|
+
return 'hover';
|
|
27
|
+
if (/스크롤/.test(s))
|
|
28
|
+
return 'scroll';
|
|
29
|
+
if (/기다리|대기/.test(s))
|
|
30
|
+
return 'wait';
|
|
31
|
+
if (/이동|열|방문|접속/.test(s))
|
|
32
|
+
return 'navigate';
|
|
33
|
+
// English — longer phrases before shorter ones to avoid partial matches
|
|
34
|
+
if (/^(?:hover\s+over|mouse\s+over|hover)\b/.test(s))
|
|
35
|
+
return 'hover';
|
|
36
|
+
if (/^(?:scroll\s+(?:down|up|to)|scroll)\b/.test(s))
|
|
37
|
+
return 'scroll';
|
|
38
|
+
if (/^(?:wait\s+for|wait)\b/.test(s))
|
|
39
|
+
return 'wait';
|
|
40
|
+
if (/^(?:navigate\s+to|go\s+to|open|visit)\b/.test(s))
|
|
41
|
+
return 'navigate';
|
|
42
|
+
if (/^(?:fill\s+in|type|enter|input|write)\b/.test(s))
|
|
43
|
+
return 'type';
|
|
44
|
+
if (/^(?:select|choose|pick)\b/.test(s))
|
|
45
|
+
return 'select';
|
|
46
|
+
if (/^(?:uncheck|untick)\b/.test(s))
|
|
47
|
+
return 'uncheck';
|
|
48
|
+
if (/^(?:check|tick)\b/.test(s))
|
|
49
|
+
return 'check';
|
|
50
|
+
if (/^(?:click|press|tap)\b/.test(s))
|
|
51
|
+
return 'click';
|
|
52
|
+
return null;
|
|
53
|
+
}
|
|
54
|
+
/** True if the trimmed phrase starts with a recognised verb (English or Korean). */
|
|
55
|
+
function startsWithVerb(phrase) {
|
|
56
|
+
return detectVerb(phrase) !== null;
|
|
57
|
+
}
|
|
58
|
+
// ---------------------------------------------------------------------------
|
|
59
|
+
// Compound instruction splitter
|
|
60
|
+
// ---------------------------------------------------------------------------
|
|
61
|
+
/**
|
|
62
|
+
* Split a compound instruction into individual clauses.
|
|
63
|
+
* Splitting happens on:
|
|
64
|
+
* ", then " / ", and then "
|
|
65
|
+
* " then " — only when followed by a verb
|
|
66
|
+
* " and " — only when followed by a verb (avoids "name and email")
|
|
67
|
+
* "," — followed by a space and a verb
|
|
68
|
+
*/
|
|
69
|
+
function splitIntoSegments(instruction) {
|
|
70
|
+
// Normalise whitespace
|
|
71
|
+
const text = instruction.trim().replace(/\s+/g, ' ');
|
|
72
|
+
// First pass: split on ", then " and ", and then " unconditionally
|
|
73
|
+
const parts = [];
|
|
74
|
+
const unconditional = text.split(/,\s*and\s+then\s+|,\s*then\s+/i);
|
|
75
|
+
for (const part of unconditional) {
|
|
76
|
+
// Second pass within each part: Korean conjunctions, then English conjunctions
|
|
77
|
+
const koreanParts = splitOnKoreanConjunctions(part.trim());
|
|
78
|
+
for (const kp of koreanParts) {
|
|
79
|
+
const subParts = splitOnConjunctions(kp.trim());
|
|
80
|
+
parts.push(...subParts);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
return parts.filter(p => p.length > 0);
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Split Korean compound sentences on conjunctive endings:
|
|
87
|
+
* "하고" (and do), "이고" (and), "고" after verb stem.
|
|
88
|
+
* e.g. "이메일을 입력하고 제출 버튼을 클릭해" → ["이메일을 입력하고", "제출 버튼을 클릭해"]
|
|
89
|
+
* We split AFTER the "하고/고" suffix so the first segment retains it for verb detection.
|
|
90
|
+
*/
|
|
91
|
+
function splitOnKoreanConjunctions(text) {
|
|
92
|
+
// Split on "하고 " (connective "and") between two Korean segments
|
|
93
|
+
// Pattern: split at boundary after "하고" followed by a Korean character
|
|
94
|
+
const parts = [];
|
|
95
|
+
// Match "하고" or "이고" or "ㄱ고" connectives between clauses
|
|
96
|
+
const re = /하고\s+(?=\S)/gu;
|
|
97
|
+
let lastIndex = 0;
|
|
98
|
+
let match;
|
|
99
|
+
while ((match = re.exec(text)) !== null) {
|
|
100
|
+
// Include "하고" in the first segment so its verb can still be detected
|
|
101
|
+
parts.push(text.slice(lastIndex, match.index + 2).trim()); // up to and including "하고"
|
|
102
|
+
lastIndex = match.index + match[0].length;
|
|
103
|
+
}
|
|
104
|
+
parts.push(text.slice(lastIndex).trim());
|
|
105
|
+
return parts.filter(p => p.length > 0);
|
|
106
|
+
}
|
|
107
|
+
function splitOnConjunctions(text) {
|
|
108
|
+
// Split on "WORD, VERB" — comma followed by a verb-starting word
|
|
109
|
+
// or " then VERB" / " and VERB"
|
|
110
|
+
const result = [];
|
|
111
|
+
let remaining = text;
|
|
112
|
+
// Pattern: (", " | " then " | " and ") followed by a verb-starting token
|
|
113
|
+
const re = /(?:,\s+|\s+then\s+|\s+and\s+)(?=[a-z\u3131-\uD7A3\u4E00-\u9FFF])/gi;
|
|
114
|
+
let lastIndex = 0;
|
|
115
|
+
let match;
|
|
116
|
+
while ((match = re.exec(remaining)) !== null) {
|
|
117
|
+
const afterSplit = remaining.slice(match.index + match[0].length);
|
|
118
|
+
if (startsWithVerb(afterSplit)) {
|
|
119
|
+
result.push(remaining.slice(lastIndex, match.index).trim());
|
|
120
|
+
lastIndex = match.index + match[0].length;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
result.push(remaining.slice(lastIndex).trim());
|
|
124
|
+
return result.filter(p => p.length > 0);
|
|
125
|
+
}
|
|
126
|
+
// ---------------------------------------------------------------------------
|
|
127
|
+
// Value / target extractors per verb
|
|
128
|
+
// ---------------------------------------------------------------------------
|
|
129
|
+
/** Detect a URL anywhere in a string. */
|
|
130
|
+
function extractUrl(text) {
|
|
131
|
+
const m = text.match(/https?:\/\/[^\s,"']+/);
|
|
132
|
+
return m ? m[0] : undefined;
|
|
133
|
+
}
|
|
134
|
+
function parseClickPhrase(phrase) {
|
|
135
|
+
const s = phrase.trim();
|
|
136
|
+
// Korean: "{target}을/를 클릭" or "{target} 클릭"
|
|
137
|
+
const krMatch = s.match(/^(.+?)(?:을|를)?\s+(?:클릭|누르|탭)/u);
|
|
138
|
+
if (krMatch) {
|
|
139
|
+
return { action: 'click', target: krMatch[1].trim() };
|
|
140
|
+
}
|
|
141
|
+
// English: strip leading verb words
|
|
142
|
+
const stripped = s.replace(/^(?:click|press|tap)\s+(?:on\s+)?(?:the\s+)?/i, '');
|
|
143
|
+
return { action: 'click', target: stripped || undefined };
|
|
144
|
+
}
|
|
145
|
+
function parseTypePhrase(phrase) {
|
|
146
|
+
const s = phrase.trim();
|
|
147
|
+
// Korean: "{target}에 {value}을/를 입력" or "{value}을/를 입력"
|
|
148
|
+
const krInTarget = s.match(/^(.+?)에\s+(.+?)(?:을|를)?\s+입력/u);
|
|
149
|
+
if (krInTarget) {
|
|
150
|
+
return { action: 'type', target: krInTarget[1].trim(), value: krInTarget[2].trim() };
|
|
151
|
+
}
|
|
152
|
+
const krNoTarget = s.match(/^(.+?)(?:을|를)?\s+입력/u);
|
|
153
|
+
if (krNoTarget) {
|
|
154
|
+
return { action: 'type', value: krNoTarget[1].trim() };
|
|
155
|
+
}
|
|
156
|
+
// English patterns:
|
|
157
|
+
// "type {value} in(to) the {target}"
|
|
158
|
+
const inMatch = s.match(/^(?:type|enter|input|fill\s+in|write)\s+(.+?)\s+in(?:to)?\s+(?:the\s+)?(.+)$/i);
|
|
159
|
+
if (inMatch) {
|
|
160
|
+
return { action: 'type', value: inMatch[1].trim(), target: inMatch[2].trim() };
|
|
161
|
+
}
|
|
162
|
+
// "type {value}"
|
|
163
|
+
const simpleMatch = s.match(/^(?:type|enter|input|fill\s+in|write)\s+(.+)$/i);
|
|
164
|
+
if (simpleMatch) {
|
|
165
|
+
return { action: 'type', value: simpleMatch[1].trim() };
|
|
166
|
+
}
|
|
167
|
+
return { action: 'type' };
|
|
168
|
+
}
|
|
169
|
+
function parseSelectPhrase(phrase) {
|
|
170
|
+
const s = phrase.trim();
|
|
171
|
+
// "select {value} from (the) {target}" / "choose {value} in (the) {target}"
|
|
172
|
+
const fromMatch = s.match(/^(?:select|choose|pick)\s+(.+?)\s+(?:from|in)\s+(?:the\s+)?(.+)$/i);
|
|
173
|
+
if (fromMatch) {
|
|
174
|
+
return { action: 'select', value: fromMatch[1].trim(), target: fromMatch[2].trim() };
|
|
175
|
+
}
|
|
176
|
+
// Korean: "{value}을/를 선택" or "{target}에서 {value} 선택"
|
|
177
|
+
const krSelect = s.match(/^(.+?)(?:을|를)?\s+선택/u);
|
|
178
|
+
if (krSelect) {
|
|
179
|
+
return { action: 'select', value: krSelect[1].trim() };
|
|
180
|
+
}
|
|
181
|
+
const stripped = s.replace(/^(?:select|choose|pick)\s+/i, '');
|
|
182
|
+
return { action: 'select', target: stripped || undefined };
|
|
183
|
+
}
|
|
184
|
+
function parseNavigatePhrase(phrase) {
|
|
185
|
+
const s = phrase.trim();
|
|
186
|
+
// Extract URL first
|
|
187
|
+
const url = extractUrl(s);
|
|
188
|
+
if (url) {
|
|
189
|
+
return { action: 'navigate', value: url };
|
|
190
|
+
}
|
|
191
|
+
// Korean: "{url}로 이동" / "{url}에 접속"
|
|
192
|
+
const krNav = s.match(/^(.+?)(?:로|에)\s+(?:이동|접속)/u);
|
|
193
|
+
if (krNav) {
|
|
194
|
+
return { action: 'navigate', value: krNav[1].trim() };
|
|
195
|
+
}
|
|
196
|
+
// English: strip verb prefix
|
|
197
|
+
const stripped = s.replace(/^(?:navigate\s+to|go\s+to|open|visit)\s+/i, '');
|
|
198
|
+
return { action: 'navigate', value: stripped || undefined };
|
|
199
|
+
}
|
|
200
|
+
function parseScrollPhrase(phrase) {
|
|
201
|
+
const s = phrase.trim();
|
|
202
|
+
// "scroll down to {target}" / "scroll up to {target}" / "scroll to {target}"
|
|
203
|
+
const toMatch = s.match(/^(?:스크롤\s+)?scroll\s+(?:down\s+to|up\s+to|to)\s+(?:the\s+)?(.+)$/i);
|
|
204
|
+
if (toMatch) {
|
|
205
|
+
return { action: 'scroll', target: toMatch[1].trim() };
|
|
206
|
+
}
|
|
207
|
+
// "scroll down" / "scroll up"
|
|
208
|
+
const dirMatch = s.match(/^(?:스크롤\s+)?scroll\s+(down|up)$/i);
|
|
209
|
+
if (dirMatch) {
|
|
210
|
+
return { action: 'scroll', value: dirMatch[1].toLowerCase() };
|
|
211
|
+
}
|
|
212
|
+
// Korean bare: "스크롤"
|
|
213
|
+
if (/^스크롤$/.test(s)) {
|
|
214
|
+
return { action: 'scroll' };
|
|
215
|
+
}
|
|
216
|
+
const stripped = s.replace(/^(?:스크롤|scroll)\s+/i, '');
|
|
217
|
+
return { action: 'scroll', target: stripped || undefined };
|
|
218
|
+
}
|
|
219
|
+
function parseWaitPhrase(phrase) {
|
|
220
|
+
const s = phrase.trim();
|
|
221
|
+
// "wait for {target} to {condition}"
|
|
222
|
+
const toCondMatch = s.match(/^(?:wait\s+for|wait)\s+(?:the\s+)?(.+?)\s+to\s+(appear|disappear|load)$/i);
|
|
223
|
+
if (toCondMatch) {
|
|
224
|
+
return { action: 'wait', target: toCondMatch[1].trim(), condition: toCondMatch[2].toLowerCase() };
|
|
225
|
+
}
|
|
226
|
+
// "wait for {target}"
|
|
227
|
+
const forMatch = s.match(/^(?:wait\s+for|wait)\s+(?:the\s+)?(.+)$/i);
|
|
228
|
+
if (forMatch) {
|
|
229
|
+
return { action: 'wait', target: forMatch[1].trim(), condition: 'appear' };
|
|
230
|
+
}
|
|
231
|
+
// Korean: "{target}을/를 기다리" or "기다리"
|
|
232
|
+
const krWait = s.match(/^(.+?)(?:을|를)?\s*(?:기다리|대기)/u);
|
|
233
|
+
if (krWait) {
|
|
234
|
+
return { action: 'wait', target: krWait[1].trim(), condition: 'appear' };
|
|
235
|
+
}
|
|
236
|
+
return { action: 'wait', condition: 'appear' };
|
|
237
|
+
}
|
|
238
|
+
function parseCheckPhrase(phrase, verb) {
|
|
239
|
+
const s = phrase.trim();
|
|
240
|
+
const stripped = s.replace(/^(?:uncheck|untick|check|tick|체크\s*해제|언체크|체크)\s+(?:the\s+)?/i, '');
|
|
241
|
+
return { action: verb, target: stripped || undefined };
|
|
242
|
+
}
|
|
243
|
+
function parseHoverPhrase(phrase) {
|
|
244
|
+
const s = phrase.trim();
|
|
245
|
+
const stripped = s.replace(/^(?:hover\s+over|mouse\s+over|hover|호버|마우스\s*오버)\s+(?:the\s+)?/i, '');
|
|
246
|
+
return { action: 'hover', target: stripped || undefined };
|
|
247
|
+
}
|
|
248
|
+
// ---------------------------------------------------------------------------
|
|
249
|
+
// Single-phrase parser
|
|
250
|
+
// ---------------------------------------------------------------------------
|
|
251
|
+
function parsePhrase(phrase) {
|
|
252
|
+
const trimmed = phrase.trim();
|
|
253
|
+
if (!trimmed)
|
|
254
|
+
return null;
|
|
255
|
+
const verb = detectVerb(trimmed);
|
|
256
|
+
if (!verb) {
|
|
257
|
+
// Check if it contains a URL — treat as navigate
|
|
258
|
+
const url = extractUrl(trimmed);
|
|
259
|
+
if (url)
|
|
260
|
+
return { action: 'navigate', value: url };
|
|
261
|
+
return null;
|
|
262
|
+
}
|
|
263
|
+
switch (verb) {
|
|
264
|
+
case 'click': return parseClickPhrase(trimmed);
|
|
265
|
+
case 'type': return parseTypePhrase(trimmed);
|
|
266
|
+
case 'select': return parseSelectPhrase(trimmed);
|
|
267
|
+
case 'navigate': return parseNavigatePhrase(trimmed);
|
|
268
|
+
case 'scroll': return parseScrollPhrase(trimmed);
|
|
269
|
+
case 'wait': return parseWaitPhrase(trimmed);
|
|
270
|
+
case 'check': return parseCheckPhrase(trimmed, 'check');
|
|
271
|
+
case 'uncheck': return parseCheckPhrase(trimmed, 'uncheck');
|
|
272
|
+
case 'hover': return parseHoverPhrase(trimmed);
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
// ---------------------------------------------------------------------------
|
|
276
|
+
// Public API
|
|
277
|
+
// ---------------------------------------------------------------------------
|
|
278
|
+
/**
|
|
279
|
+
* Parse a natural language browser instruction into a structured action sequence.
|
|
280
|
+
* Pure pattern-matching — no LLM calls, no network I/O.
|
|
281
|
+
*/
|
|
282
|
+
function parseInstruction(instruction) {
|
|
283
|
+
if (!instruction || instruction.trim().length === 0) {
|
|
284
|
+
return {
|
|
285
|
+
success: false,
|
|
286
|
+
actions: [],
|
|
287
|
+
error: 'Instruction is empty',
|
|
288
|
+
suggestion: 'Provide a natural language instruction such as "click the login button" or "type hello in the search box".',
|
|
289
|
+
};
|
|
290
|
+
}
|
|
291
|
+
const segments = splitIntoSegments(instruction);
|
|
292
|
+
const actions = [];
|
|
293
|
+
const failed = [];
|
|
294
|
+
for (const segment of segments) {
|
|
295
|
+
const parsed = parsePhrase(segment);
|
|
296
|
+
if (parsed) {
|
|
297
|
+
actions.push(parsed);
|
|
298
|
+
}
|
|
299
|
+
else {
|
|
300
|
+
failed.push(segment);
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
if (actions.length === 0) {
|
|
304
|
+
return {
|
|
305
|
+
success: false,
|
|
306
|
+
actions: [],
|
|
307
|
+
error: `Could not parse instruction: "${instruction}"`,
|
|
308
|
+
suggestion: 'Try breaking the instruction into individual steps such as "click X", "type Y in Z", or "navigate to URL".',
|
|
309
|
+
};
|
|
310
|
+
}
|
|
311
|
+
if (failed.length > 0) {
|
|
312
|
+
// Partial parse — return what we have but still signal success for the parseable parts
|
|
313
|
+
return {
|
|
314
|
+
success: true,
|
|
315
|
+
actions,
|
|
316
|
+
suggestion: `Could not parse the following segment(s): ${failed.map(f => `"${f}"`).join(', ')}. Try breaking these into individual tool calls.`,
|
|
317
|
+
};
|
|
318
|
+
}
|
|
319
|
+
return { success: true, actions };
|
|
320
|
+
}
|
|
321
|
+
//# sourceMappingURL=action-parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"action-parser.js","sourceRoot":"","sources":["../../src/actions/action-parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Action Templates - Pre-compiled action sequences for common browser workflows.
|
|
3
|
+
*
|
|
4
|
+
* When the user's instruction matches a template, the cached sequence is used
|
|
5
|
+
* instead of NL parsing. This is faster and more reliable for known patterns.
|
|
6
|
+
*/
|
|
7
|
+
import { ParsedAction } from './action-parser';
|
|
8
|
+
export interface ActionTemplate {
|
|
9
|
+
id: string;
|
|
10
|
+
name: string;
|
|
11
|
+
description: string;
|
|
12
|
+
/** Regex pattern to match the instruction. Named groups become template variables. */
|
|
13
|
+
pattern: RegExp;
|
|
14
|
+
/** Function that returns the action sequence, using captured groups as variables. */
|
|
15
|
+
build: (vars: Record<string, string>) => ParsedAction[];
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Built-in action templates for common workflows.
|
|
19
|
+
*/
|
|
20
|
+
export declare const ACTION_TEMPLATES: ActionTemplate[];
|
|
21
|
+
/**
|
|
22
|
+
* Try to match instruction against known templates.
|
|
23
|
+
* Returns the action sequence if matched, null otherwise.
|
|
24
|
+
*/
|
|
25
|
+
export declare function matchTemplate(instruction: string): {
|
|
26
|
+
template: ActionTemplate;
|
|
27
|
+
actions: ParsedAction[];
|
|
28
|
+
} | null;
|
|
29
|
+
//# sourceMappingURL=action-templates.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"action-templates.d.ts","sourceRoot":"","sources":["../../src/actions/action-templates.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAoB,MAAM,iBAAiB,CAAC;AAEjE,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,sFAAsF;IACtF,OAAO,EAAE,MAAM,CAAC;IAChB,qFAAqF;IACrF,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,YAAY,EAAE,CAAC;CACzD;AAED;;GAEG;AACH,eAAO,MAAM,gBAAgB,EAAE,cAAc,EAwF5C,CAAC;AAEF;;;GAGG;AACH,wBAAgB,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG;IAAE,QAAQ,EAAE,cAAc,CAAC;IAAC,OAAO,EAAE,YAAY,EAAE,CAAA;CAAE,GAAG,IAAI,CAmB/G"}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Action Templates - Pre-compiled action sequences for common browser workflows.
|
|
4
|
+
*
|
|
5
|
+
* When the user's instruction matches a template, the cached sequence is used
|
|
6
|
+
* instead of NL parsing. This is faster and more reliable for known patterns.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.ACTION_TEMPLATES = void 0;
|
|
10
|
+
exports.matchTemplate = matchTemplate;
|
|
11
|
+
const action_parser_1 = require("./action-parser");
|
|
12
|
+
/**
|
|
13
|
+
* Built-in action templates for common workflows.
|
|
14
|
+
*/
|
|
15
|
+
exports.ACTION_TEMPLATES = [
|
|
16
|
+
// Login template
|
|
17
|
+
{
|
|
18
|
+
id: 'login',
|
|
19
|
+
name: 'Login',
|
|
20
|
+
description: 'Log in with email/username and password',
|
|
21
|
+
pattern: /^(?:log\s*in|sign\s*in)\s+(?:with\s+)?(?<email>[^\s]+)\s+(?:and\s+)?(?<password>.+)$/i,
|
|
22
|
+
build: (vars) => [
|
|
23
|
+
{ action: 'type', target: 'email', value: vars.email },
|
|
24
|
+
{ action: 'type', target: 'password', value: vars.password },
|
|
25
|
+
{ action: 'click', target: 'login button' },
|
|
26
|
+
],
|
|
27
|
+
},
|
|
28
|
+
// Korean login
|
|
29
|
+
{
|
|
30
|
+
id: 'login-kr',
|
|
31
|
+
name: 'Login (Korean)',
|
|
32
|
+
description: '로그인',
|
|
33
|
+
pattern: /^(?<email>[^\s]+)(?:와|과|하고)\s*(?<password>.+?)(?:로|으로)\s*(?:로그인|로그 인|사인 인)$/,
|
|
34
|
+
build: (vars) => [
|
|
35
|
+
{ action: 'type', target: 'email', value: vars.email },
|
|
36
|
+
{ action: 'type', target: 'password', value: vars.password },
|
|
37
|
+
{ action: 'click', target: '로그인 버튼' },
|
|
38
|
+
],
|
|
39
|
+
},
|
|
40
|
+
// Search template
|
|
41
|
+
{
|
|
42
|
+
id: 'search',
|
|
43
|
+
name: 'Search',
|
|
44
|
+
description: 'Search for a query',
|
|
45
|
+
pattern: /^search\s+(?:for\s+)?(?<query>.+?)(?:\s+in\s+(?:the\s+)?(?<target>.+?))?$/i,
|
|
46
|
+
build: (vars) => {
|
|
47
|
+
const steps = [];
|
|
48
|
+
if (vars.target) {
|
|
49
|
+
steps.push({ action: 'type', target: vars.target, value: vars.query });
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
steps.push({ action: 'type', target: 'search', value: vars.query });
|
|
53
|
+
}
|
|
54
|
+
steps.push({ action: 'click', target: 'search button' });
|
|
55
|
+
return steps;
|
|
56
|
+
},
|
|
57
|
+
},
|
|
58
|
+
// Korean search
|
|
59
|
+
{
|
|
60
|
+
id: 'search-kr',
|
|
61
|
+
name: 'Search (Korean)',
|
|
62
|
+
description: '검색',
|
|
63
|
+
pattern: /^(?<query>.+?)(?:을|를)?\s*검색$/,
|
|
64
|
+
build: (vars) => [
|
|
65
|
+
{ action: 'type', target: 'search', value: vars.query },
|
|
66
|
+
{ action: 'click', target: '검색 버튼' },
|
|
67
|
+
],
|
|
68
|
+
},
|
|
69
|
+
// Form fill template
|
|
70
|
+
{
|
|
71
|
+
id: 'fill-form',
|
|
72
|
+
name: 'Fill Form',
|
|
73
|
+
description: 'Fill form fields with key-value pairs',
|
|
74
|
+
pattern: /^fill\s+(?:out\s+)?(?:the\s+)?(?:(?<formName>.+?)\s+)?(?:form\s+)?with\s+(?<pairs>.+)$/i,
|
|
75
|
+
build: (vars) => {
|
|
76
|
+
const actions = [];
|
|
77
|
+
// Parse comma-separated key=value or "key value" pairs
|
|
78
|
+
const pairs = vars.pairs.split(/,\s*/);
|
|
79
|
+
for (const pair of pairs) {
|
|
80
|
+
const kv = pair.match(/^(.+?)\s+(.+)$/) || pair.match(/^(.+?)=(.+)$/);
|
|
81
|
+
if (kv) {
|
|
82
|
+
actions.push({ action: 'type', target: kv[1].trim(), value: kv[2].trim() });
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
return actions;
|
|
86
|
+
},
|
|
87
|
+
},
|
|
88
|
+
// Navigate and do template
|
|
89
|
+
{
|
|
90
|
+
id: 'goto-and-do',
|
|
91
|
+
name: 'Navigate and Act',
|
|
92
|
+
description: 'Go to a URL and perform an action',
|
|
93
|
+
pattern: /^(?:go\s+to|navigate\s+to|open|visit)\s+(?<url>https?:\/\/\S+)\s+(?:and|then)\s+(?<action>.+)$/i,
|
|
94
|
+
build: (vars) => {
|
|
95
|
+
// The remaining action part will be parsed by the action parser
|
|
96
|
+
// For templates, we just handle the navigate part
|
|
97
|
+
const parsed = (0, action_parser_1.parseInstruction)(vars.action);
|
|
98
|
+
return [
|
|
99
|
+
{ action: 'navigate', value: vars.url },
|
|
100
|
+
...(parsed.success ? parsed.actions : []),
|
|
101
|
+
];
|
|
102
|
+
},
|
|
103
|
+
},
|
|
104
|
+
];
|
|
105
|
+
/**
|
|
106
|
+
* Try to match instruction against known templates.
|
|
107
|
+
* Returns the action sequence if matched, null otherwise.
|
|
108
|
+
*/
|
|
109
|
+
function matchTemplate(instruction) {
|
|
110
|
+
const trimmed = instruction.trim();
|
|
111
|
+
for (const tpl of exports.ACTION_TEMPLATES) {
|
|
112
|
+
const match = trimmed.match(tpl.pattern);
|
|
113
|
+
if (match && match.groups) {
|
|
114
|
+
try {
|
|
115
|
+
const actions = tpl.build(match.groups);
|
|
116
|
+
if (actions.length > 0) {
|
|
117
|
+
return { template: tpl, actions };
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
catch {
|
|
121
|
+
// Template build failed — try next template
|
|
122
|
+
continue;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
return null;
|
|
127
|
+
}
|
|
128
|
+
//# sourceMappingURL=action-templates.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"action-templates.js","sourceRoot":"","sources":["../../src/actions/action-templates.ts"],"names":[],"mappings":"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"}
|