@framers/agentos-ext-browser-automation 0.1.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 +98 -0
- package/dist/BrowserService.d.ts +125 -0
- package/dist/BrowserService.d.ts.map +1 -0
- package/dist/BrowserService.js +332 -0
- package/dist/BrowserService.js.map +1 -0
- package/dist/captcha/CaptchaSolver.d.ts +20 -0
- package/dist/captcha/CaptchaSolver.d.ts.map +1 -0
- package/dist/captcha/CaptchaSolver.js +91 -0
- package/dist/captcha/CaptchaSolver.js.map +1 -0
- package/dist/captcha/ICaptchaProvider.d.ts +17 -0
- package/dist/captcha/ICaptchaProvider.d.ts.map +1 -0
- package/dist/captcha/ICaptchaProvider.js +7 -0
- package/dist/captcha/ICaptchaProvider.js.map +1 -0
- package/dist/index.d.ts +64 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +148 -0
- package/dist/index.js.map +1 -0
- package/dist/proxy/IProxyProvider.d.ts +20 -0
- package/dist/proxy/IProxyProvider.d.ts.map +1 -0
- package/dist/proxy/IProxyProvider.js +7 -0
- package/dist/proxy/IProxyProvider.js.map +1 -0
- package/dist/proxy/ProxyManager.d.ts +21 -0
- package/dist/proxy/ProxyManager.d.ts.map +1 -0
- package/dist/proxy/ProxyManager.js +67 -0
- package/dist/proxy/ProxyManager.js.map +1 -0
- package/dist/tools/ClickTool.d.ts +38 -0
- package/dist/tools/ClickTool.d.ts.map +1 -0
- package/dist/tools/ClickTool.js +34 -0
- package/dist/tools/ClickTool.js.map +1 -0
- package/dist/tools/EvaluateTool.d.ts +30 -0
- package/dist/tools/EvaluateTool.d.ts.map +1 -0
- package/dist/tools/EvaluateTool.js +33 -0
- package/dist/tools/EvaluateTool.js.map +1 -0
- package/dist/tools/ExtractTool.d.ts +42 -0
- package/dist/tools/ExtractTool.d.ts.map +1 -0
- package/dist/tools/ExtractTool.js +40 -0
- package/dist/tools/ExtractTool.js.map +1 -0
- package/dist/tools/FillTool.d.ts +34 -0
- package/dist/tools/FillTool.d.ts.map +1 -0
- package/dist/tools/FillTool.js +34 -0
- package/dist/tools/FillTool.js.map +1 -0
- package/dist/tools/NavigateTool.d.ts +53 -0
- package/dist/tools/NavigateTool.d.ts.map +1 -0
- package/dist/tools/NavigateTool.js +48 -0
- package/dist/tools/NavigateTool.js.map +1 -0
- package/dist/tools/PageSnapshotTool.d.ts +22 -0
- package/dist/tools/PageSnapshotTool.d.ts.map +1 -0
- package/dist/tools/PageSnapshotTool.js +30 -0
- package/dist/tools/PageSnapshotTool.js.map +1 -0
- package/dist/tools/ScreenshotTool.d.ts +38 -0
- package/dist/tools/ScreenshotTool.d.ts.map +1 -0
- package/dist/tools/ScreenshotTool.js +36 -0
- package/dist/tools/ScreenshotTool.js.map +1 -0
- package/dist/tools/ScrollTool.d.ts +41 -0
- package/dist/tools/ScrollTool.d.ts.map +1 -0
- package/dist/tools/ScrollTool.js +34 -0
- package/dist/tools/ScrollTool.js.map +1 -0
- package/dist/tools/SessionTool.d.ts +36 -0
- package/dist/tools/SessionTool.d.ts.map +1 -0
- package/dist/tools/SessionTool.js +50 -0
- package/dist/tools/SessionTool.js.map +1 -0
- package/dist/tools/WaitTool.d.ts +41 -0
- package/dist/tools/WaitTool.d.ts.map +1 -0
- package/dist/tools/WaitTool.js +39 -0
- package/dist/tools/WaitTool.js.map +1 -0
- package/manifest.json +55 -0
- package/package.json +38 -0
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// @ts-nocheck
|
|
3
|
+
/**
|
|
4
|
+
* @fileoverview 2captcha integration for solving CAPTCHAs.
|
|
5
|
+
*
|
|
6
|
+
* Supports reCAPTCHA v2/v3, hCaptcha, Cloudflare Turnstile, and image captchas.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.CaptchaSolver = void 0;
|
|
10
|
+
class CaptchaSolver {
|
|
11
|
+
constructor(apiKey) {
|
|
12
|
+
this.name = '2captcha';
|
|
13
|
+
this.baseUrl = 'https://2captcha.com';
|
|
14
|
+
this.apiKey = apiKey;
|
|
15
|
+
}
|
|
16
|
+
async solveRecaptchaV2(siteKey, pageUrl) {
|
|
17
|
+
return this.solve({
|
|
18
|
+
method: 'userrecaptcha',
|
|
19
|
+
googlekey: siteKey,
|
|
20
|
+
pageurl: pageUrl,
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
async solveRecaptchaV3(siteKey, pageUrl, action = 'verify') {
|
|
24
|
+
return this.solve({
|
|
25
|
+
method: 'userrecaptcha',
|
|
26
|
+
googlekey: siteKey,
|
|
27
|
+
pageurl: pageUrl,
|
|
28
|
+
version: 'v3',
|
|
29
|
+
action,
|
|
30
|
+
min_score: '0.7',
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
async solveHCaptcha(siteKey, pageUrl) {
|
|
34
|
+
return this.solve({
|
|
35
|
+
method: 'hcaptcha',
|
|
36
|
+
sitekey: siteKey,
|
|
37
|
+
pageurl: pageUrl,
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
async solveTurnstile(siteKey, pageUrl) {
|
|
41
|
+
return this.solve({
|
|
42
|
+
method: 'turnstile',
|
|
43
|
+
sitekey: siteKey,
|
|
44
|
+
pageurl: pageUrl,
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
async solveImage(imageBase64) {
|
|
48
|
+
const result = await this.solve({
|
|
49
|
+
method: 'base64',
|
|
50
|
+
body: imageBase64,
|
|
51
|
+
});
|
|
52
|
+
return result.token;
|
|
53
|
+
}
|
|
54
|
+
async getBalance() {
|
|
55
|
+
const url = `${this.baseUrl}/res.php?key=${this.apiKey}&action=getbalance&json=1`;
|
|
56
|
+
const res = await fetch(url);
|
|
57
|
+
const data = await res.json();
|
|
58
|
+
return parseFloat(data.request) || 0;
|
|
59
|
+
}
|
|
60
|
+
// ── Internal ──
|
|
61
|
+
async solve(params) {
|
|
62
|
+
const start = Date.now();
|
|
63
|
+
// Submit task
|
|
64
|
+
const submitUrl = `${this.baseUrl}/in.php`;
|
|
65
|
+
const body = new URLSearchParams({ key: this.apiKey, json: '1', ...params });
|
|
66
|
+
const submitRes = await fetch(submitUrl, { method: 'POST', body });
|
|
67
|
+
const submitData = await submitRes.json();
|
|
68
|
+
if (submitData.status !== 1) {
|
|
69
|
+
throw new Error(`2captcha submit failed: ${submitData.request}`);
|
|
70
|
+
}
|
|
71
|
+
const taskId = submitData.request;
|
|
72
|
+
// Poll for result
|
|
73
|
+
const resultUrl = `${this.baseUrl}/res.php?key=${this.apiKey}&action=get&id=${taskId}&json=1`;
|
|
74
|
+
const maxAttempts = 60;
|
|
75
|
+
const pollInterval = 5000;
|
|
76
|
+
for (let i = 0; i < maxAttempts; i++) {
|
|
77
|
+
await new Promise((r) => setTimeout(r, pollInterval));
|
|
78
|
+
const res = await fetch(resultUrl);
|
|
79
|
+
const data = await res.json();
|
|
80
|
+
if (data.status === 1) {
|
|
81
|
+
return { token: data.request, solveTimeMs: Date.now() - start };
|
|
82
|
+
}
|
|
83
|
+
if (data.request !== 'CAPCHA_NOT_READY') {
|
|
84
|
+
throw new Error(`2captcha solve failed: ${data.request}`);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
throw new Error('2captcha solve timed out');
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
exports.CaptchaSolver = CaptchaSolver;
|
|
91
|
+
//# sourceMappingURL=CaptchaSolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CaptchaSolver.js","sourceRoot":"","sources":["../../src/captcha/CaptchaSolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Interface for captcha solving services.
|
|
3
|
+
*/
|
|
4
|
+
export interface CaptchaSolution {
|
|
5
|
+
token: string;
|
|
6
|
+
solveTimeMs: number;
|
|
7
|
+
}
|
|
8
|
+
export interface ICaptchaProvider {
|
|
9
|
+
readonly name: string;
|
|
10
|
+
solveRecaptchaV2(siteKey: string, pageUrl: string): Promise<CaptchaSolution>;
|
|
11
|
+
solveRecaptchaV3(siteKey: string, pageUrl: string, action?: string): Promise<CaptchaSolution>;
|
|
12
|
+
solveHCaptcha(siteKey: string, pageUrl: string): Promise<CaptchaSolution>;
|
|
13
|
+
solveTurnstile(siteKey: string, pageUrl: string): Promise<CaptchaSolution>;
|
|
14
|
+
solveImage(imageBase64: string): Promise<string>;
|
|
15
|
+
getBalance(): Promise<number>;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=ICaptchaProvider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ICaptchaProvider.d.ts","sourceRoot":"","sources":["../../src/captcha/ICaptchaProvider.ts"],"names":[],"mappings":"AACA;;GAEG;AAEH,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;IAC7E,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;IAC9F,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;IAC1E,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;IAC3E,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACjD,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;CAC/B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ICaptchaProvider.js","sourceRoot":"","sources":["../../src/captcha/ICaptchaProvider.ts"],"names":[],"mappings":";AAAA,cAAc;AACd;;GAEG"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Browser Automation Extension for AgentOS.
|
|
3
|
+
*
|
|
4
|
+
* Provides 10 tools for autonomous web browsing: navigation, DOM interaction,
|
|
5
|
+
* screenshots, content extraction, page snapshots, JS evaluation, and session
|
|
6
|
+
* management. Includes optional CAPTCHA solving and proxy rotation.
|
|
7
|
+
*
|
|
8
|
+
* @module @framers/agentos-ext-browser-automation
|
|
9
|
+
*/
|
|
10
|
+
import { BrowserService } from './BrowserService.js';
|
|
11
|
+
import { CaptchaSolver } from './captcha/CaptchaSolver.js';
|
|
12
|
+
import { ProxyManager } from './proxy/ProxyManager.js';
|
|
13
|
+
export interface BrowserAutomationOptions {
|
|
14
|
+
headless?: boolean;
|
|
15
|
+
timeout?: number;
|
|
16
|
+
userDataDir?: string;
|
|
17
|
+
proxyServer?: string;
|
|
18
|
+
viewport?: {
|
|
19
|
+
width: number;
|
|
20
|
+
height: number;
|
|
21
|
+
};
|
|
22
|
+
secrets?: Record<string, string>;
|
|
23
|
+
}
|
|
24
|
+
export interface ExtensionContext {
|
|
25
|
+
options?: Record<string, unknown>;
|
|
26
|
+
secrets?: Record<string, string>;
|
|
27
|
+
}
|
|
28
|
+
export interface ExtensionPack {
|
|
29
|
+
name: string;
|
|
30
|
+
version: string;
|
|
31
|
+
descriptors: Array<{
|
|
32
|
+
id: string;
|
|
33
|
+
kind: string;
|
|
34
|
+
priority?: number;
|
|
35
|
+
enableByDefault?: boolean;
|
|
36
|
+
payload: unknown;
|
|
37
|
+
}>;
|
|
38
|
+
onActivate?: () => Promise<void>;
|
|
39
|
+
onDeactivate?: () => Promise<void>;
|
|
40
|
+
}
|
|
41
|
+
export declare function createExtensionPack(context: ExtensionContext): ExtensionPack;
|
|
42
|
+
export { BrowserService } from './BrowserService.js';
|
|
43
|
+
export type { BrowserConfig, NavigationResult, PageSnapshot, InteractiveElement, FormInfo, LinkInfo, PageFeedback, StorageState } from './BrowserService.js';
|
|
44
|
+
export { CaptchaSolver } from './captcha/CaptchaSolver.js';
|
|
45
|
+
export type { ICaptchaProvider, CaptchaSolution } from './captcha/ICaptchaProvider.js';
|
|
46
|
+
export { ProxyManager } from './proxy/ProxyManager.js';
|
|
47
|
+
export type { IProxyProvider, ProxyConfig, ProxyRotationConfig } from './proxy/IProxyProvider.js';
|
|
48
|
+
export { NavigateTool } from './tools/NavigateTool.js';
|
|
49
|
+
export { ClickTool } from './tools/ClickTool.js';
|
|
50
|
+
export { FillTool } from './tools/FillTool.js';
|
|
51
|
+
export { ScreenshotTool } from './tools/ScreenshotTool.js';
|
|
52
|
+
export { ExtractTool } from './tools/ExtractTool.js';
|
|
53
|
+
export { WaitTool } from './tools/WaitTool.js';
|
|
54
|
+
export { ScrollTool } from './tools/ScrollTool.js';
|
|
55
|
+
export { PageSnapshotTool } from './tools/PageSnapshotTool.js';
|
|
56
|
+
export { EvaluateTool } from './tools/EvaluateTool.js';
|
|
57
|
+
export { SessionTool } from './tools/SessionTool.js';
|
|
58
|
+
/** Get the shared browser instance (available after extension activation). */
|
|
59
|
+
export declare function getSharedBrowser(): BrowserService | null;
|
|
60
|
+
/** Get the shared captcha solver (available if API key is configured). */
|
|
61
|
+
export declare function getSharedCaptcha(): CaptchaSolver | null;
|
|
62
|
+
/** Get the shared proxy manager (available if proxy config is set). */
|
|
63
|
+
export declare function getSharedProxy(): ProxyManager | null;
|
|
64
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA;;;;;;;;GAQG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAYrD,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAMvD,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7C,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAMD,MAAM,WAAW,gBAAgB;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,KAAK,CAAC;QACjB,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,eAAe,CAAC,EAAE,OAAO,CAAC;QAC1B,OAAO,EAAE,OAAO,CAAC;KAClB,CAAC,CAAC;IACH,UAAU,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACjC,YAAY,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CACpC;AAcD,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,gBAAgB,GAAG,aAAa,CAuE5E;AAMD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,YAAY,EAAE,aAAa,EAAE,gBAAgB,EAAE,YAAY,EAAE,kBAAkB,EAAE,QAAQ,EAAE,QAAQ,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAC7J,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,YAAY,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AACvF,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAClG,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAErD,8EAA8E;AAC9E,wBAAgB,gBAAgB,IAAI,cAAc,GAAG,IAAI,CAExD;AAED,0EAA0E;AAC1E,wBAAgB,gBAAgB,IAAI,aAAa,GAAG,IAAI,CAEvD;AAED,uEAAuE;AACvE,wBAAgB,cAAc,IAAI,YAAY,GAAG,IAAI,CAEpD"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// @ts-nocheck
|
|
3
|
+
/**
|
|
4
|
+
* @fileoverview Browser Automation Extension for AgentOS.
|
|
5
|
+
*
|
|
6
|
+
* Provides 10 tools for autonomous web browsing: navigation, DOM interaction,
|
|
7
|
+
* screenshots, content extraction, page snapshots, JS evaluation, and session
|
|
8
|
+
* management. Includes optional CAPTCHA solving and proxy rotation.
|
|
9
|
+
*
|
|
10
|
+
* @module @framers/agentos-ext-browser-automation
|
|
11
|
+
*/
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
exports.SessionTool = exports.EvaluateTool = exports.PageSnapshotTool = exports.ScrollTool = exports.WaitTool = exports.ExtractTool = exports.ScreenshotTool = exports.FillTool = exports.ClickTool = exports.NavigateTool = exports.ProxyManager = exports.CaptchaSolver = exports.BrowserService = void 0;
|
|
14
|
+
exports.createExtensionPack = createExtensionPack;
|
|
15
|
+
exports.getSharedBrowser = getSharedBrowser;
|
|
16
|
+
exports.getSharedCaptcha = getSharedCaptcha;
|
|
17
|
+
exports.getSharedProxy = getSharedProxy;
|
|
18
|
+
const BrowserService_js_1 = require("./BrowserService.js");
|
|
19
|
+
const NavigateTool_js_1 = require("./tools/NavigateTool.js");
|
|
20
|
+
const ClickTool_js_1 = require("./tools/ClickTool.js");
|
|
21
|
+
const FillTool_js_1 = require("./tools/FillTool.js");
|
|
22
|
+
const ScreenshotTool_js_1 = require("./tools/ScreenshotTool.js");
|
|
23
|
+
const ExtractTool_js_1 = require("./tools/ExtractTool.js");
|
|
24
|
+
const WaitTool_js_1 = require("./tools/WaitTool.js");
|
|
25
|
+
const ScrollTool_js_1 = require("./tools/ScrollTool.js");
|
|
26
|
+
const PageSnapshotTool_js_1 = require("./tools/PageSnapshotTool.js");
|
|
27
|
+
const EvaluateTool_js_1 = require("./tools/EvaluateTool.js");
|
|
28
|
+
const SessionTool_js_1 = require("./tools/SessionTool.js");
|
|
29
|
+
const CaptchaSolver_js_1 = require("./captcha/CaptchaSolver.js");
|
|
30
|
+
const ProxyManager_js_1 = require("./proxy/ProxyManager.js");
|
|
31
|
+
// ---------------------------------------------------------------------------
|
|
32
|
+
// Singleton browser instance (shared across all tools)
|
|
33
|
+
// ---------------------------------------------------------------------------
|
|
34
|
+
let sharedBrowser = null;
|
|
35
|
+
let sharedCaptcha = null;
|
|
36
|
+
let sharedProxy = null;
|
|
37
|
+
// ---------------------------------------------------------------------------
|
|
38
|
+
// Factory
|
|
39
|
+
// ---------------------------------------------------------------------------
|
|
40
|
+
function createExtensionPack(context) {
|
|
41
|
+
const opts = (context.options ?? {});
|
|
42
|
+
const secrets = opts.secrets ?? context.secrets ?? {};
|
|
43
|
+
// Resolve config
|
|
44
|
+
const config = {
|
|
45
|
+
headless: opts.headless ?? true,
|
|
46
|
+
timeout: opts.timeout ?? 30000,
|
|
47
|
+
userDataDir: opts.userDataDir,
|
|
48
|
+
proxyServer: opts.proxyServer,
|
|
49
|
+
viewport: opts.viewport ?? { width: 1280, height: 720 },
|
|
50
|
+
};
|
|
51
|
+
// Create shared service
|
|
52
|
+
const browser = new BrowserService_js_1.BrowserService(config);
|
|
53
|
+
sharedBrowser = browser;
|
|
54
|
+
// Optional captcha solver
|
|
55
|
+
const captchaKey = secrets['twocaptcha.apiKey'] ?? process.env.TWOCAPTCHA_API_KEY;
|
|
56
|
+
if (captchaKey) {
|
|
57
|
+
sharedCaptcha = new CaptchaSolver_js_1.CaptchaSolver(captchaKey);
|
|
58
|
+
}
|
|
59
|
+
// Optional proxy manager
|
|
60
|
+
const proxyConfig = secrets['proxy.config'] ?? process.env.PROXY_CONFIG;
|
|
61
|
+
if (proxyConfig) {
|
|
62
|
+
try {
|
|
63
|
+
const parsed = JSON.parse(proxyConfig);
|
|
64
|
+
sharedProxy = new ProxyManager_js_1.ProxyManager(parsed);
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
// Invalid proxy config — skip
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
// Create tools
|
|
71
|
+
const navigateTool = new NavigateTool_js_1.NavigateTool(browser);
|
|
72
|
+
const clickTool = new ClickTool_js_1.ClickTool(browser);
|
|
73
|
+
const fillTool = new FillTool_js_1.FillTool(browser);
|
|
74
|
+
const screenshotTool = new ScreenshotTool_js_1.ScreenshotTool(browser);
|
|
75
|
+
const extractTool = new ExtractTool_js_1.ExtractTool(browser);
|
|
76
|
+
const waitTool = new WaitTool_js_1.WaitTool(browser);
|
|
77
|
+
const scrollTool = new ScrollTool_js_1.ScrollTool(browser);
|
|
78
|
+
const snapshotTool = new PageSnapshotTool_js_1.PageSnapshotTool(browser);
|
|
79
|
+
const evaluateTool = new EvaluateTool_js_1.EvaluateTool(browser);
|
|
80
|
+
const sessionTool = new SessionTool_js_1.SessionTool(browser);
|
|
81
|
+
return {
|
|
82
|
+
name: '@framers/agentos-ext-browser-automation',
|
|
83
|
+
version: '0.1.0',
|
|
84
|
+
descriptors: [
|
|
85
|
+
{ id: 'browserNavigate', kind: 'tool', priority: 50, payload: navigateTool },
|
|
86
|
+
{ id: 'browserClick', kind: 'tool', priority: 50, payload: clickTool },
|
|
87
|
+
{ id: 'browserFill', kind: 'tool', priority: 50, payload: fillTool },
|
|
88
|
+
{ id: 'browserScreenshot', kind: 'tool', priority: 50, payload: screenshotTool },
|
|
89
|
+
{ id: 'browserExtract', kind: 'tool', priority: 50, payload: extractTool },
|
|
90
|
+
{ id: 'browserWait', kind: 'tool', priority: 50, payload: waitTool },
|
|
91
|
+
{ id: 'browserScroll', kind: 'tool', priority: 50, payload: scrollTool },
|
|
92
|
+
{ id: 'browserSnapshot', kind: 'tool', priority: 50, payload: snapshotTool },
|
|
93
|
+
{ id: 'browserEvaluate', kind: 'tool', priority: 50, payload: evaluateTool },
|
|
94
|
+
{ id: 'browserSession', kind: 'tool', priority: 50, payload: sessionTool },
|
|
95
|
+
],
|
|
96
|
+
onActivate: async () => {
|
|
97
|
+
await browser.initialize();
|
|
98
|
+
},
|
|
99
|
+
onDeactivate: async () => {
|
|
100
|
+
await browser.shutdown();
|
|
101
|
+
sharedBrowser = null;
|
|
102
|
+
sharedCaptcha = null;
|
|
103
|
+
sharedProxy = null;
|
|
104
|
+
},
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
// ---------------------------------------------------------------------------
|
|
108
|
+
// Public exports
|
|
109
|
+
// ---------------------------------------------------------------------------
|
|
110
|
+
var BrowserService_js_2 = require("./BrowserService.js");
|
|
111
|
+
Object.defineProperty(exports, "BrowserService", { enumerable: true, get: function () { return BrowserService_js_2.BrowserService; } });
|
|
112
|
+
var CaptchaSolver_js_2 = require("./captcha/CaptchaSolver.js");
|
|
113
|
+
Object.defineProperty(exports, "CaptchaSolver", { enumerable: true, get: function () { return CaptchaSolver_js_2.CaptchaSolver; } });
|
|
114
|
+
var ProxyManager_js_2 = require("./proxy/ProxyManager.js");
|
|
115
|
+
Object.defineProperty(exports, "ProxyManager", { enumerable: true, get: function () { return ProxyManager_js_2.ProxyManager; } });
|
|
116
|
+
var NavigateTool_js_2 = require("./tools/NavigateTool.js");
|
|
117
|
+
Object.defineProperty(exports, "NavigateTool", { enumerable: true, get: function () { return NavigateTool_js_2.NavigateTool; } });
|
|
118
|
+
var ClickTool_js_2 = require("./tools/ClickTool.js");
|
|
119
|
+
Object.defineProperty(exports, "ClickTool", { enumerable: true, get: function () { return ClickTool_js_2.ClickTool; } });
|
|
120
|
+
var FillTool_js_2 = require("./tools/FillTool.js");
|
|
121
|
+
Object.defineProperty(exports, "FillTool", { enumerable: true, get: function () { return FillTool_js_2.FillTool; } });
|
|
122
|
+
var ScreenshotTool_js_2 = require("./tools/ScreenshotTool.js");
|
|
123
|
+
Object.defineProperty(exports, "ScreenshotTool", { enumerable: true, get: function () { return ScreenshotTool_js_2.ScreenshotTool; } });
|
|
124
|
+
var ExtractTool_js_2 = require("./tools/ExtractTool.js");
|
|
125
|
+
Object.defineProperty(exports, "ExtractTool", { enumerable: true, get: function () { return ExtractTool_js_2.ExtractTool; } });
|
|
126
|
+
var WaitTool_js_2 = require("./tools/WaitTool.js");
|
|
127
|
+
Object.defineProperty(exports, "WaitTool", { enumerable: true, get: function () { return WaitTool_js_2.WaitTool; } });
|
|
128
|
+
var ScrollTool_js_2 = require("./tools/ScrollTool.js");
|
|
129
|
+
Object.defineProperty(exports, "ScrollTool", { enumerable: true, get: function () { return ScrollTool_js_2.ScrollTool; } });
|
|
130
|
+
var PageSnapshotTool_js_2 = require("./tools/PageSnapshotTool.js");
|
|
131
|
+
Object.defineProperty(exports, "PageSnapshotTool", { enumerable: true, get: function () { return PageSnapshotTool_js_2.PageSnapshotTool; } });
|
|
132
|
+
var EvaluateTool_js_2 = require("./tools/EvaluateTool.js");
|
|
133
|
+
Object.defineProperty(exports, "EvaluateTool", { enumerable: true, get: function () { return EvaluateTool_js_2.EvaluateTool; } });
|
|
134
|
+
var SessionTool_js_2 = require("./tools/SessionTool.js");
|
|
135
|
+
Object.defineProperty(exports, "SessionTool", { enumerable: true, get: function () { return SessionTool_js_2.SessionTool; } });
|
|
136
|
+
/** Get the shared browser instance (available after extension activation). */
|
|
137
|
+
function getSharedBrowser() {
|
|
138
|
+
return sharedBrowser;
|
|
139
|
+
}
|
|
140
|
+
/** Get the shared captcha solver (available if API key is configured). */
|
|
141
|
+
function getSharedCaptcha() {
|
|
142
|
+
return sharedCaptcha;
|
|
143
|
+
}
|
|
144
|
+
/** Get the shared proxy manager (available if proxy config is set). */
|
|
145
|
+
function getSharedProxy() {
|
|
146
|
+
return sharedProxy;
|
|
147
|
+
}
|
|
148
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Interface for proxy services.
|
|
3
|
+
*/
|
|
4
|
+
export interface ProxyConfig {
|
|
5
|
+
server: string;
|
|
6
|
+
username?: string;
|
|
7
|
+
password?: string;
|
|
8
|
+
}
|
|
9
|
+
export interface ProxyRotationConfig {
|
|
10
|
+
providers: ProxyConfig[];
|
|
11
|
+
rotationStrategy: 'round-robin' | 'random' | 'sticky';
|
|
12
|
+
stickyDurationMs?: number;
|
|
13
|
+
geoTarget?: string;
|
|
14
|
+
}
|
|
15
|
+
export interface IProxyProvider {
|
|
16
|
+
getProxy(): ProxyConfig;
|
|
17
|
+
rotateProxy(): ProxyConfig;
|
|
18
|
+
markFailed(server: string): void;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=IProxyProvider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IProxyProvider.d.ts","sourceRoot":"","sources":["../../src/proxy/IProxyProvider.ts"],"names":[],"mappings":"AACA;;GAEG;AAEH,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,WAAW,EAAE,CAAC;IACzB,gBAAgB,EAAE,aAAa,GAAG,QAAQ,GAAG,QAAQ,CAAC;IACtD,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,IAAI,WAAW,CAAC;IACxB,WAAW,IAAI,WAAW,CAAC;IAC3B,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CAClC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IProxyProvider.js","sourceRoot":"","sources":["../../src/proxy/IProxyProvider.ts"],"names":[],"mappings":";AAAA,cAAc;AACd;;GAEG"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Proxy rotation manager with round-robin, random, and sticky strategies.
|
|
3
|
+
*/
|
|
4
|
+
import type { IProxyProvider, ProxyConfig, ProxyRotationConfig } from './IProxyProvider.js';
|
|
5
|
+
export declare class ProxyManager implements IProxyProvider {
|
|
6
|
+
private config;
|
|
7
|
+
private currentIndex;
|
|
8
|
+
private failedServers;
|
|
9
|
+
private stickyProxy;
|
|
10
|
+
private stickyExpiry;
|
|
11
|
+
constructor(config: ProxyRotationConfig);
|
|
12
|
+
getProxy(): ProxyConfig;
|
|
13
|
+
rotateProxy(): ProxyConfig;
|
|
14
|
+
markFailed(server: string): void;
|
|
15
|
+
getStats(): {
|
|
16
|
+
total: number;
|
|
17
|
+
available: number;
|
|
18
|
+
failed: number;
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=ProxyManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProxyManager.d.ts","sourceRoot":"","sources":["../../src/proxy/ProxyManager.ts"],"names":[],"mappings":"AACA;;GAEG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAE5F,qBAAa,YAAa,YAAW,cAAc;IACjD,OAAO,CAAC,MAAM,CAAsB;IACpC,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,aAAa,CAA0B;IAC/C,OAAO,CAAC,WAAW,CAA4B;IAC/C,OAAO,CAAC,YAAY,CAAa;gBAErB,MAAM,EAAE,mBAAmB;IAIvC,QAAQ,IAAI,WAAW;IAoCvB,WAAW,IAAI,WAAW;IAO1B,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAOhC,QAAQ,IAAI;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE;CAOjE"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// @ts-nocheck
|
|
3
|
+
/**
|
|
4
|
+
* @fileoverview Proxy rotation manager with round-robin, random, and sticky strategies.
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.ProxyManager = void 0;
|
|
8
|
+
class ProxyManager {
|
|
9
|
+
constructor(config) {
|
|
10
|
+
this.currentIndex = 0;
|
|
11
|
+
this.failedServers = new Set();
|
|
12
|
+
this.stickyProxy = null;
|
|
13
|
+
this.stickyExpiry = 0;
|
|
14
|
+
this.config = config;
|
|
15
|
+
}
|
|
16
|
+
getProxy() {
|
|
17
|
+
const { rotationStrategy, stickyDurationMs } = this.config;
|
|
18
|
+
if (rotationStrategy === 'sticky' && this.stickyProxy && Date.now() < this.stickyExpiry) {
|
|
19
|
+
return this.stickyProxy;
|
|
20
|
+
}
|
|
21
|
+
const available = this.config.providers.filter((p) => !this.failedServers.has(p.server));
|
|
22
|
+
if (available.length === 0) {
|
|
23
|
+
// Reset failed list if all are failed
|
|
24
|
+
this.failedServers.clear();
|
|
25
|
+
return this.config.providers[0];
|
|
26
|
+
}
|
|
27
|
+
let proxy;
|
|
28
|
+
switch (rotationStrategy) {
|
|
29
|
+
case 'random':
|
|
30
|
+
proxy = available[Math.floor(Math.random() * available.length)];
|
|
31
|
+
break;
|
|
32
|
+
case 'sticky':
|
|
33
|
+
proxy = available[0];
|
|
34
|
+
this.stickyProxy = proxy;
|
|
35
|
+
this.stickyExpiry = Date.now() + (stickyDurationMs ?? 300000);
|
|
36
|
+
break;
|
|
37
|
+
case 'round-robin':
|
|
38
|
+
default:
|
|
39
|
+
this.currentIndex = this.currentIndex % available.length;
|
|
40
|
+
proxy = available[this.currentIndex];
|
|
41
|
+
this.currentIndex++;
|
|
42
|
+
break;
|
|
43
|
+
}
|
|
44
|
+
return proxy;
|
|
45
|
+
}
|
|
46
|
+
rotateProxy() {
|
|
47
|
+
this.stickyProxy = null;
|
|
48
|
+
this.stickyExpiry = 0;
|
|
49
|
+
this.currentIndex++;
|
|
50
|
+
return this.getProxy();
|
|
51
|
+
}
|
|
52
|
+
markFailed(server) {
|
|
53
|
+
this.failedServers.add(server);
|
|
54
|
+
if (this.stickyProxy?.server === server) {
|
|
55
|
+
this.stickyProxy = null;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
getStats() {
|
|
59
|
+
return {
|
|
60
|
+
total: this.config.providers.length,
|
|
61
|
+
available: this.config.providers.filter((p) => !this.failedServers.has(p.server)).length,
|
|
62
|
+
failed: this.failedServers.size,
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
exports.ProxyManager = ProxyManager;
|
|
67
|
+
//# sourceMappingURL=ProxyManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProxyManager.js","sourceRoot":"","sources":["../../src/proxy/ProxyManager.ts"],"names":[],"mappings":";AAAA,cAAc;AACd;;GAEG;;;AAIH,MAAa,YAAY;IAOvB,YAAY,MAA2B;QAL/B,iBAAY,GAAG,CAAC,CAAC;QACjB,kBAAa,GAAgB,IAAI,GAAG,EAAE,CAAC;QACvC,gBAAW,GAAuB,IAAI,CAAC;QACvC,iBAAY,GAAW,CAAC,CAAC;QAG/B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED,QAAQ;QACN,MAAM,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC;QAE3D,IAAI,gBAAgB,KAAK,QAAQ,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;YACxF,OAAO,IAAI,CAAC,WAAW,CAAC;QAC1B,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;QACzF,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3B,sCAAsC;YACtC,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;YAC3B,OAAO,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QAClC,CAAC;QAED,IAAI,KAAkB,CAAC;QAEvB,QAAQ,gBAAgB,EAAE,CAAC;YACzB,KAAK,QAAQ;gBACX,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;gBAChE,MAAM;YACR,KAAK,QAAQ;gBACX,KAAK,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;gBACrB,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;gBACzB,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,gBAAgB,IAAI,MAAO,CAAC,CAAC;gBAC/D,MAAM;YACR,KAAK,aAAa,CAAC;YACnB;gBACE,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,GAAG,SAAS,CAAC,MAAM,CAAC;gBACzD,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;gBACrC,IAAI,CAAC,YAAY,EAAE,CAAC;gBACpB,MAAM;QACV,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAED,WAAW;QACT,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QACxB,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC;QACtB,IAAI,CAAC,YAAY,EAAE,CAAC;QACpB,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC;IACzB,CAAC;IAED,UAAU,CAAC,MAAc;QACvB,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC/B,IAAI,IAAI,CAAC,WAAW,EAAE,MAAM,KAAK,MAAM,EAAE,CAAC;YACxC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,QAAQ;QACN,OAAO;YACL,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM;YACnC,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM;YACxF,MAAM,EAAE,IAAI,CAAC,aAAa,CAAC,IAAI;SAChC,CAAC;IACJ,CAAC;CACF;AApED,oCAoEC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { BrowserService } from '../BrowserService.js';
|
|
2
|
+
export declare class ClickTool {
|
|
3
|
+
private browser;
|
|
4
|
+
readonly id = "browserClick";
|
|
5
|
+
readonly name = "browserClick";
|
|
6
|
+
readonly displayName = "Click Element";
|
|
7
|
+
readonly description = "Click an element on the page by CSS selector, text content, or ARIA role.";
|
|
8
|
+
readonly category = "browser";
|
|
9
|
+
readonly version = "0.1.0";
|
|
10
|
+
readonly hasSideEffects = true;
|
|
11
|
+
readonly inputSchema: {
|
|
12
|
+
type: "object";
|
|
13
|
+
properties: {
|
|
14
|
+
selector: {
|
|
15
|
+
type: string;
|
|
16
|
+
description: string;
|
|
17
|
+
};
|
|
18
|
+
text: {
|
|
19
|
+
type: string;
|
|
20
|
+
description: string;
|
|
21
|
+
};
|
|
22
|
+
role: {
|
|
23
|
+
type: string;
|
|
24
|
+
description: string;
|
|
25
|
+
};
|
|
26
|
+
};
|
|
27
|
+
};
|
|
28
|
+
constructor(browser: BrowserService);
|
|
29
|
+
execute(args: {
|
|
30
|
+
selector?: string;
|
|
31
|
+
text?: string;
|
|
32
|
+
role?: string;
|
|
33
|
+
}): Promise<{
|
|
34
|
+
success: boolean;
|
|
35
|
+
error?: string;
|
|
36
|
+
}>;
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=ClickTool.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ClickTool.d.ts","sourceRoot":"","sources":["../../src/tools/ClickTool.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAE3D,qBAAa,SAAS;IAkBR,OAAO,CAAC,OAAO;IAjB3B,QAAQ,CAAC,EAAE,kBAAkB;IAC7B,QAAQ,CAAC,IAAI,kBAAkB;IAC/B,QAAQ,CAAC,WAAW,mBAAmB;IACvC,QAAQ,CAAC,WAAW,+EAA+E;IACnG,QAAQ,CAAC,QAAQ,aAAa;IAC9B,QAAQ,CAAC,OAAO,WAAW;IAC3B,QAAQ,CAAC,cAAc,QAAQ;IAE/B,QAAQ,CAAC,WAAW;;;;;;;;;;;;;;;;MAOlB;gBAEkB,OAAO,EAAE,cAAc;IAErC,OAAO,CAAC,IAAI,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAQxH"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ClickTool = void 0;
|
|
4
|
+
class ClickTool {
|
|
5
|
+
constructor(browser) {
|
|
6
|
+
this.browser = browser;
|
|
7
|
+
this.id = 'browserClick';
|
|
8
|
+
this.name = 'browserClick';
|
|
9
|
+
this.displayName = 'Click Element';
|
|
10
|
+
this.description = 'Click an element on the page by CSS selector, text content, or ARIA role.';
|
|
11
|
+
this.category = 'browser';
|
|
12
|
+
this.version = '0.1.0';
|
|
13
|
+
this.hasSideEffects = true;
|
|
14
|
+
this.inputSchema = {
|
|
15
|
+
type: 'object',
|
|
16
|
+
properties: {
|
|
17
|
+
selector: { type: 'string', description: 'CSS selector of the element to click' },
|
|
18
|
+
text: { type: 'string', description: 'Text content of the element to click' },
|
|
19
|
+
role: { type: 'string', description: 'ARIA role of the element (e.g., "button", "link")' },
|
|
20
|
+
},
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
async execute(args) {
|
|
24
|
+
try {
|
|
25
|
+
const clicked = await this.browser.click(args);
|
|
26
|
+
return { success: clicked };
|
|
27
|
+
}
|
|
28
|
+
catch (err) {
|
|
29
|
+
return { success: false, error: err.message };
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
exports.ClickTool = ClickTool;
|
|
34
|
+
//# sourceMappingURL=ClickTool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ClickTool.js","sourceRoot":"","sources":["../../src/tools/ClickTool.ts"],"names":[],"mappings":";;;AAGA,MAAa,SAAS;IAkBpB,YAAoB,OAAuB;QAAvB,YAAO,GAAP,OAAO,CAAgB;QAjBlC,OAAE,GAAG,cAAc,CAAC;QACpB,SAAI,GAAG,cAAc,CAAC;QACtB,gBAAW,GAAG,eAAe,CAAC;QAC9B,gBAAW,GAAG,2EAA2E,CAAC;QAC1F,aAAQ,GAAG,SAAS,CAAC;QACrB,YAAO,GAAG,OAAO,CAAC;QAClB,mBAAc,GAAG,IAAI,CAAC;QAEtB,gBAAW,GAAG;YACrB,IAAI,EAAE,QAAiB;YACvB,UAAU,EAAE;gBACV,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,sCAAsC,EAAE;gBACjF,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,sCAAsC,EAAE;gBAC7E,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,mDAAmD,EAAE;aAC3F;SACF,CAAC;IAE4C,CAAC;IAE/C,KAAK,CAAC,OAAO,CAAC,IAAyD;QACrE,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC/C,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;QAC9B,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC;QAChD,CAAC;IACH,CAAC;CACF;AA5BD,8BA4BC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { BrowserService } from '../BrowserService.js';
|
|
2
|
+
export declare class EvaluateTool {
|
|
3
|
+
private browser;
|
|
4
|
+
readonly id = "browserEvaluate";
|
|
5
|
+
readonly name = "browserEvaluate";
|
|
6
|
+
readonly displayName = "Evaluate JavaScript";
|
|
7
|
+
readonly description = "Execute arbitrary JavaScript code in the browser page context and return the result.";
|
|
8
|
+
readonly category = "browser";
|
|
9
|
+
readonly version = "0.1.0";
|
|
10
|
+
readonly hasSideEffects = true;
|
|
11
|
+
readonly inputSchema: {
|
|
12
|
+
type: "object";
|
|
13
|
+
properties: {
|
|
14
|
+
script: {
|
|
15
|
+
type: string;
|
|
16
|
+
description: string;
|
|
17
|
+
};
|
|
18
|
+
};
|
|
19
|
+
required: string[];
|
|
20
|
+
};
|
|
21
|
+
constructor(browser: BrowserService);
|
|
22
|
+
execute(args: {
|
|
23
|
+
script: string;
|
|
24
|
+
}): Promise<{
|
|
25
|
+
success: boolean;
|
|
26
|
+
data?: unknown;
|
|
27
|
+
error?: string;
|
|
28
|
+
}>;
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=EvaluateTool.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EvaluateTool.d.ts","sourceRoot":"","sources":["../../src/tools/EvaluateTool.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAE3D,qBAAa,YAAY;IAiBX,OAAO,CAAC,OAAO;IAhB3B,QAAQ,CAAC,EAAE,qBAAqB;IAChC,QAAQ,CAAC,IAAI,qBAAqB;IAClC,QAAQ,CAAC,WAAW,yBAAyB;IAC7C,QAAQ,CAAC,WAAW,0FAA0F;IAC9G,QAAQ,CAAC,QAAQ,aAAa;IAC9B,QAAQ,CAAC,OAAO,WAAW;IAC3B,QAAQ,CAAC,cAAc,QAAQ;IAE/B,QAAQ,CAAC,WAAW;;;;;;;;;MAMlB;gBAEkB,OAAO,EAAE,cAAc;IAErC,OAAO,CAAC,IAAI,EAAE;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,IAAI,CAAC,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAQvG"}
|