@elizaos/plugin-browser 2.0.0-alpha.9 → 2.0.11-beta.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/LICENSE +21 -0
- package/README.md +98 -83
- package/auto-enable.ts +24 -0
- package/dist/actions/browser-autofill-login.d.ts +43 -0
- package/dist/actions/browser-autofill-login.d.ts.map +1 -0
- package/dist/actions/browser-autofill-login.js +278 -0
- package/dist/actions/browser-autofill-login.js.map +1 -0
- package/dist/actions/browser.d.ts +11 -0
- package/dist/actions/browser.d.ts.map +1 -0
- package/dist/actions/browser.js +412 -0
- package/dist/actions/browser.js.map +1 -0
- package/dist/actions/manage-browser-bridge.d.ts +34 -0
- package/dist/actions/manage-browser-bridge.d.ts.map +1 -0
- package/dist/actions/manage-browser-bridge.js +572 -0
- package/dist/actions/manage-browser-bridge.js.map +1 -0
- package/dist/bridge-policy.d.ts +10 -0
- package/dist/bridge-policy.d.ts.map +1 -0
- package/dist/bridge-policy.js +37 -0
- package/dist/bridge-policy.js.map +1 -0
- package/dist/bridge-readiness.d.ts +16 -0
- package/dist/bridge-readiness.d.ts.map +1 -0
- package/dist/bridge-readiness.js +82 -0
- package/dist/bridge-readiness.js.map +1 -0
- package/dist/bridge-records.d.ts +9 -0
- package/dist/bridge-records.d.ts.map +1 -0
- package/dist/bridge-records.js +37 -0
- package/dist/bridge-records.js.map +1 -0
- package/dist/browser-capture-hooks.d.ts +9 -0
- package/dist/browser-capture-hooks.d.ts.map +1 -0
- package/dist/browser-capture-hooks.js +15 -0
- package/dist/browser-capture-hooks.js.map +1 -0
- package/dist/browser-service.d.ts +103 -0
- package/dist/browser-service.d.ts.map +1 -0
- package/dist/browser-service.js +186 -0
- package/dist/browser-service.js.map +1 -0
- package/dist/browser-workspace-hooks.d.ts +14 -0
- package/dist/browser-workspace-hooks.d.ts.map +1 -0
- package/dist/browser-workspace-hooks.js +15 -0
- package/dist/browser-workspace-hooks.js.map +1 -0
- package/dist/companion-auth.d.ts +34 -0
- package/dist/companion-auth.d.ts.map +1 -0
- package/dist/companion-auth.js +98 -0
- package/dist/companion-auth.js.map +1 -0
- package/dist/contracts.d.ts +284 -0
- package/dist/contracts.d.ts.map +1 -0
- package/dist/contracts.js +56 -0
- package/dist/contracts.js.map +1 -0
- package/dist/index.d.ts +30 -16
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +76 -90
- package/dist/index.js.map +1 -1
- package/dist/lifeops-session-contracts.d.ts +46 -0
- package/dist/lifeops-session-contracts.d.ts.map +1 -0
- package/dist/lifeops-session-contracts.js +1 -0
- package/dist/lifeops-session-contracts.js.map +1 -0
- package/dist/message-adapter.d.ts +9 -0
- package/dist/message-adapter.d.ts.map +1 -0
- package/dist/message-adapter.js +104 -0
- package/dist/message-adapter.js.map +1 -0
- package/dist/packaging.d.ts +27 -0
- package/dist/packaging.d.ts.map +1 -0
- package/dist/packaging.js +571 -0
- package/dist/packaging.js.map +1 -0
- package/dist/password-manager-bridge.d.ts +50 -0
- package/dist/password-manager-bridge.d.ts.map +1 -0
- package/dist/password-manager-bridge.js +437 -0
- package/dist/password-manager-bridge.js.map +1 -0
- package/dist/plugin.d.ts +10 -0
- package/dist/plugin.d.ts.map +1 -0
- package/dist/plugin.js +168 -0
- package/dist/plugin.js.map +1 -0
- package/dist/providers/workspace.d.ts +13 -0
- package/dist/providers/workspace.d.ts.map +1 -0
- package/dist/providers/workspace.js +64 -0
- package/dist/providers/workspace.js.map +1 -0
- package/dist/routes/bridge.d.ts +37 -0
- package/dist/routes/bridge.d.ts.map +1 -0
- package/dist/routes/bridge.js +844 -0
- package/dist/routes/bridge.js.map +1 -0
- package/dist/routes/workspace-account-gate.d.ts +29 -0
- package/dist/routes/workspace-account-gate.d.ts.map +1 -0
- package/dist/routes/workspace-account-gate.js +147 -0
- package/dist/routes/workspace-account-gate.js.map +1 -0
- package/dist/routes/workspace-setup.d.ts +10 -0
- package/dist/routes/workspace-setup.d.ts.map +1 -0
- package/dist/routes/workspace-setup.js +65 -0
- package/dist/routes/workspace-setup.js.map +1 -0
- package/dist/routes/workspace.d.ts +20 -0
- package/dist/routes/workspace.d.ts.map +1 -0
- package/dist/routes/workspace.js +276 -0
- package/dist/routes/workspace.js.map +1 -0
- package/dist/schema.d.ts +2326 -0
- package/dist/schema.d.ts.map +1 -0
- package/dist/schema.js +133 -0
- package/dist/schema.js.map +1 -0
- package/dist/service.d.ts +30 -0
- package/dist/service.d.ts.map +1 -0
- package/dist/service.js +5 -0
- package/dist/service.js.map +1 -0
- package/dist/targets/bridge-target.d.ts +31 -0
- package/dist/targets/bridge-target.d.ts.map +1 -0
- package/dist/targets/bridge-target.js +98 -0
- package/dist/targets/bridge-target.js.map +1 -0
- package/dist/targets/stagehand-target.d.ts +3 -0
- package/dist/targets/stagehand-target.d.ts.map +1 -0
- package/dist/targets/stagehand-target.js +187 -0
- package/dist/targets/stagehand-target.js.map +1 -0
- package/dist/workspace/browser-capture.d.ts +41 -0
- package/dist/workspace/browser-capture.d.ts.map +1 -0
- package/dist/workspace/browser-capture.js +159 -0
- package/dist/workspace/browser-capture.js.map +1 -0
- package/dist/workspace/browser-workspace-desktop.d.ts +19 -0
- package/dist/workspace/browser-workspace-desktop.d.ts.map +1 -0
- package/dist/workspace/browser-workspace-desktop.js +1578 -0
- package/dist/workspace/browser-workspace-desktop.js.map +1 -0
- package/dist/workspace/browser-workspace-elements.d.ts +42 -0
- package/dist/workspace/browser-workspace-elements.d.ts.map +1 -0
- package/dist/workspace/browser-workspace-elements.js +547 -0
- package/dist/workspace/browser-workspace-elements.js.map +1 -0
- package/dist/workspace/browser-workspace-forms.d.ts +19 -0
- package/dist/workspace/browser-workspace-forms.d.ts.map +1 -0
- package/dist/workspace/browser-workspace-forms.js +277 -0
- package/dist/workspace/browser-workspace-forms.js.map +1 -0
- package/dist/workspace/browser-workspace-helpers.d.ts +32 -0
- package/dist/workspace/browser-workspace-helpers.d.ts.map +1 -0
- package/dist/workspace/browser-workspace-helpers.js +232 -0
- package/dist/workspace/browser-workspace-helpers.js.map +1 -0
- package/dist/workspace/browser-workspace-jsdom.d.ts +16 -0
- package/dist/workspace/browser-workspace-jsdom.d.ts.map +1 -0
- package/dist/workspace/browser-workspace-jsdom.js +233 -0
- package/dist/workspace/browser-workspace-jsdom.js.map +1 -0
- package/dist/workspace/browser-workspace-network.d.ts +7 -0
- package/dist/workspace/browser-workspace-network.d.ts.map +1 -0
- package/dist/workspace/browser-workspace-network.js +145 -0
- package/dist/workspace/browser-workspace-network.js.map +1 -0
- package/dist/workspace/browser-workspace-snapshots.d.ts +14 -0
- package/dist/workspace/browser-workspace-snapshots.d.ts.map +1 -0
- package/dist/workspace/browser-workspace-snapshots.js +144 -0
- package/dist/workspace/browser-workspace-snapshots.js.map +1 -0
- package/dist/workspace/browser-workspace-state.d.ts +24 -0
- package/dist/workspace/browser-workspace-state.d.ts.map +1 -0
- package/dist/workspace/browser-workspace-state.js +155 -0
- package/dist/workspace/browser-workspace-state.js.map +1 -0
- package/dist/workspace/browser-workspace-types.d.ts +345 -0
- package/dist/workspace/browser-workspace-types.d.ts.map +1 -0
- package/dist/workspace/browser-workspace-types.js +11 -0
- package/dist/workspace/browser-workspace-types.js.map +1 -0
- package/dist/workspace/browser-workspace-web.d.ts +8 -0
- package/dist/workspace/browser-workspace-web.d.ts.map +1 -0
- package/dist/workspace/browser-workspace-web.js +1342 -0
- package/dist/workspace/browser-workspace-web.js.map +1 -0
- package/dist/workspace/browser-workspace.d.ts +39 -0
- package/dist/workspace/browser-workspace.d.ts.map +1 -0
- package/dist/workspace/browser-workspace.js +958 -0
- package/dist/workspace/browser-workspace.js.map +1 -0
- package/dist/workspace/index.d.ts +26 -0
- package/dist/workspace/index.d.ts.map +1 -0
- package/dist/workspace/index.js +3 -0
- package/dist/workspace/index.js.map +1 -0
- package/dist/workspace.d.ts +2 -0
- package/dist/workspace.d.ts.map +1 -0
- package/dist/workspace.js +2 -0
- package/dist/workspace.js.map +1 -0
- package/package.json +71 -110
- package/dist/actions/click.d.ts +0 -3
- package/dist/actions/click.d.ts.map +0 -1
- package/dist/actions/click.js +0 -158
- package/dist/actions/click.js.map +0 -1
- package/dist/actions/extract.d.ts +0 -3
- package/dist/actions/extract.d.ts.map +0 -1
- package/dist/actions/extract.js +0 -168
- package/dist/actions/extract.js.map +0 -1
- package/dist/actions/index.d.ts +0 -7
- package/dist/actions/index.d.ts.map +0 -1
- package/dist/actions/index.js +0 -7
- package/dist/actions/index.js.map +0 -1
- package/dist/actions/navigate.d.ts +0 -3
- package/dist/actions/navigate.d.ts.map +0 -1
- package/dist/actions/navigate.js +0 -187
- package/dist/actions/navigate.js.map +0 -1
- package/dist/actions/screenshot.d.ts +0 -3
- package/dist/actions/screenshot.d.ts.map +0 -1
- package/dist/actions/screenshot.js +0 -167
- package/dist/actions/screenshot.js.map +0 -1
- package/dist/actions/select.d.ts +0 -3
- package/dist/actions/select.d.ts.map +0 -1
- package/dist/actions/select.js +0 -167
- package/dist/actions/select.js.map +0 -1
- package/dist/actions/type.d.ts +0 -3
- package/dist/actions/type.d.ts.map +0 -1
- package/dist/actions/type.js +0 -167
- package/dist/actions/type.js.map +0 -1
- package/dist/cli/index.d.ts +0 -8
- package/dist/cli/index.d.ts.map +0 -1
- package/dist/cli/index.js +0 -13
- package/dist/cli/index.js.map +0 -1
- package/dist/cli/register.d.ts +0 -20
- package/dist/cli/register.d.ts.map +0 -1
- package/dist/cli/register.js +0 -403
- package/dist/cli/register.js.map +0 -1
- package/dist/providerRelevance.d.ts +0 -4
- package/dist/providerRelevance.d.ts.map +0 -1
- package/dist/providerRelevance.js +0 -33
- package/dist/providerRelevance.js.map +0 -1
- package/dist/providers/browser-state.d.ts +0 -3
- package/dist/providers/browser-state.d.ts.map +0 -1
- package/dist/providers/browser-state.js +0 -72
- package/dist/providers/browser-state.js.map +0 -1
- package/dist/providers/index.d.ts +0 -2
- package/dist/providers/index.d.ts.map +0 -1
- package/dist/providers/index.js +0 -2
- package/dist/providers/index.js.map +0 -1
- package/dist/services/browser-service.d.ts +0 -32
- package/dist/services/browser-service.d.ts.map +0 -1
- package/dist/services/browser-service.js +0 -213
- package/dist/services/browser-service.js.map +0 -1
- package/dist/services/index.d.ts +0 -4
- package/dist/services/index.d.ts.map +0 -1
- package/dist/services/index.js +0 -4
- package/dist/services/index.js.map +0 -1
- package/dist/services/process-manager.d.ts +0 -24
- package/dist/services/process-manager.d.ts.map +0 -1
- package/dist/services/process-manager.js +0 -270
- package/dist/services/process-manager.js.map +0 -1
- package/dist/services/websocket-client.d.ts +0 -35
- package/dist/services/websocket-client.d.ts.map +0 -1
- package/dist/services/websocket-client.js +0 -221
- package/dist/services/websocket-client.js.map +0 -1
- package/dist/types.d.ts +0 -101
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js +0 -2
- package/dist/types.js.map +0 -1
- package/dist/utils/captcha.d.ts +0 -33
- package/dist/utils/captcha.d.ts.map +0 -1
- package/dist/utils/captcha.js +0 -219
- package/dist/utils/captcha.js.map +0 -1
- package/dist/utils/errors.d.ts +0 -37
- package/dist/utils/errors.d.ts.map +0 -1
- package/dist/utils/errors.js +0 -81
- package/dist/utils/errors.js.map +0 -1
- package/dist/utils/index.d.ts +0 -5
- package/dist/utils/index.d.ts.map +0 -1
- package/dist/utils/index.js +0 -5
- package/dist/utils/index.js.map +0 -1
- package/dist/utils/retry.d.ts +0 -26
- package/dist/utils/retry.d.ts.map +0 -1
- package/dist/utils/retry.js +0 -55
- package/dist/utils/retry.js.map +0 -1
- package/dist/utils/security.d.ts +0 -27
- package/dist/utils/security.d.ts.map +0 -1
- package/dist/utils/security.js +0 -139
- package/dist/utils/security.js.map +0 -1
- package/dist/utils/url.d.ts +0 -12
- package/dist/utils/url.d.ts.map +0 -1
- package/dist/utils/url.js +0 -39
- package/dist/utils/url.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"websocket-client.d.ts","sourceRoot":"","sources":["../../src/services/websocket-client.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACX,gBAAgB,EAEhB,iBAAiB,EACjB,MAAM,aAAa,CAAC;AAIrB,qBAAa,sBAAsB;IAQtB,OAAO,CAAC,SAAS;IAP7B,OAAO,CAAC,EAAE,CAA0B;IACpC,OAAO,CAAC,eAAe,CAAqC;IAC5D,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,iBAAiB,CAAK;IAC9B,OAAO,CAAC,oBAAoB,CAAK;IACjC,OAAO,CAAC,cAAc,CAAQ;gBAEV,SAAS,EAAE,MAAM;IAE/B,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IA2D9B,OAAO,CAAC,eAAe;YAgBT,gBAAgB;IAmBxB,WAAW,CAChB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC3B,OAAO,CAAC,iBAAiB,CAAC;IAgC7B,UAAU,IAAI,IAAI;IAUlB,WAAW,IAAI,OAAO;IAIhB,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAanE,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC;QAC1C,GAAG,EAAE,MAAM,CAAC;QACZ,KAAK,EAAE,MAAM,CAAC;QACd,SAAS,EAAE,MAAM,CAAC;QAClB,SAAS,EAAE,IAAI,CAAC;KAChB,CAAC;IAWI,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAUpD,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAUvD,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAUrD,KAAK,CACV,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,GACjB,OAAO,CAAC,iBAAiB,CAAC;IAOvB,IAAI,CACT,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,GACX,OAAO,CAAC,iBAAiB,CAAC;IAOvB,MAAM,CACX,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,GACd,OAAO,CAAC,iBAAiB,CAAC;IAOvB,OAAO,CACZ,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,GACjB,OAAO,CAAC,iBAAiB,CAAC;IAOvB,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAIzD,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAI3D,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC;CAchC"}
|
|
@@ -1,221 +0,0 @@
|
|
|
1
|
-
import { logger } from "@elizaos/core";
|
|
2
|
-
import WebSocket from "ws";
|
|
3
|
-
export class BrowserWebSocketClient {
|
|
4
|
-
serverUrl;
|
|
5
|
-
ws = null;
|
|
6
|
-
messageHandlers = new Map();
|
|
7
|
-
connected = false;
|
|
8
|
-
reconnectAttempts = 0;
|
|
9
|
-
maxReconnectAttempts = 5;
|
|
10
|
-
reconnectDelay = 1000;
|
|
11
|
-
constructor(serverUrl) {
|
|
12
|
-
this.serverUrl = serverUrl;
|
|
13
|
-
}
|
|
14
|
-
async connect() {
|
|
15
|
-
return new Promise((resolve, reject) => {
|
|
16
|
-
try {
|
|
17
|
-
this.ws = new WebSocket(this.serverUrl);
|
|
18
|
-
this.ws.on("open", () => {
|
|
19
|
-
this.connected = true;
|
|
20
|
-
this.reconnectAttempts = 0;
|
|
21
|
-
logger.info(`[Browser] Connected to server at ${this.serverUrl}`);
|
|
22
|
-
resolve();
|
|
23
|
-
});
|
|
24
|
-
this.ws.on("message", (data) => {
|
|
25
|
-
try {
|
|
26
|
-
const messageText = this.rawDataToString(data);
|
|
27
|
-
const message = JSON.parse(messageText);
|
|
28
|
-
if (message.requestId &&
|
|
29
|
-
this.messageHandlers.has(message.requestId)) {
|
|
30
|
-
const handler = this.messageHandlers.get(message.requestId);
|
|
31
|
-
this.messageHandlers.delete(message.requestId);
|
|
32
|
-
handler?.(message);
|
|
33
|
-
}
|
|
34
|
-
if (message.type === "connected") {
|
|
35
|
-
logger.info(`[Browser] Server connected: ${JSON.stringify(message)}`);
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
catch (error) {
|
|
39
|
-
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
40
|
-
logger.error(`[Browser] Error parsing message: ${errorMessage}`);
|
|
41
|
-
}
|
|
42
|
-
});
|
|
43
|
-
this.ws.on("error", (error) => {
|
|
44
|
-
logger.error(`[Browser] WebSocket error: ${error.message}`);
|
|
45
|
-
if (!this.connected) {
|
|
46
|
-
reject(error);
|
|
47
|
-
}
|
|
48
|
-
});
|
|
49
|
-
this.ws.on("close", () => {
|
|
50
|
-
this.connected = false;
|
|
51
|
-
logger.info("[Browser] Disconnected from server");
|
|
52
|
-
if (this.ws && this.reconnectAttempts < this.maxReconnectAttempts) {
|
|
53
|
-
this.attemptReconnect();
|
|
54
|
-
}
|
|
55
|
-
});
|
|
56
|
-
}
|
|
57
|
-
catch (error) {
|
|
58
|
-
reject(error);
|
|
59
|
-
}
|
|
60
|
-
});
|
|
61
|
-
}
|
|
62
|
-
rawDataToString(data) {
|
|
63
|
-
if (typeof data === "string") {
|
|
64
|
-
return data;
|
|
65
|
-
}
|
|
66
|
-
if (Buffer.isBuffer(data)) {
|
|
67
|
-
return data.toString("utf8");
|
|
68
|
-
}
|
|
69
|
-
if (data instanceof ArrayBuffer) {
|
|
70
|
-
return Buffer.from(data).toString("utf8");
|
|
71
|
-
}
|
|
72
|
-
if (Array.isArray(data)) {
|
|
73
|
-
return Buffer.concat(data).toString("utf8");
|
|
74
|
-
}
|
|
75
|
-
return String(data);
|
|
76
|
-
}
|
|
77
|
-
async attemptReconnect() {
|
|
78
|
-
this.reconnectAttempts++;
|
|
79
|
-
logger.info(`[Browser] Attempting reconnection ${this.reconnectAttempts}/${this.maxReconnectAttempts}...`);
|
|
80
|
-
await new Promise((resolve) => setTimeout(resolve, this.reconnectDelay * this.reconnectAttempts));
|
|
81
|
-
try {
|
|
82
|
-
await this.connect();
|
|
83
|
-
}
|
|
84
|
-
catch (error) {
|
|
85
|
-
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
86
|
-
logger.error(`[Browser] Reconnection failed: ${errorMessage}`);
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
async sendMessage(type, data) {
|
|
90
|
-
if (!this.ws || !this.connected) {
|
|
91
|
-
throw new Error("Not connected to browser server");
|
|
92
|
-
}
|
|
93
|
-
const requestId = `req-${Date.now()}-${Math.random().toString(36).substring(7)}`;
|
|
94
|
-
const message = {
|
|
95
|
-
type,
|
|
96
|
-
requestId,
|
|
97
|
-
...data,
|
|
98
|
-
};
|
|
99
|
-
return new Promise((resolve, reject) => {
|
|
100
|
-
const timeout = setTimeout(() => {
|
|
101
|
-
this.messageHandlers.delete(requestId);
|
|
102
|
-
reject(new Error(`Request timeout for ${type}`));
|
|
103
|
-
}, 30000);
|
|
104
|
-
this.messageHandlers.set(requestId, (response) => {
|
|
105
|
-
clearTimeout(timeout);
|
|
106
|
-
if (response.type === "error") {
|
|
107
|
-
reject(new Error(response.error ?? "Unknown error"));
|
|
108
|
-
}
|
|
109
|
-
else {
|
|
110
|
-
resolve(response);
|
|
111
|
-
}
|
|
112
|
-
});
|
|
113
|
-
this.ws?.send(JSON.stringify(message));
|
|
114
|
-
logger.debug(`[Browser] Sent message: ${type} (${requestId})`);
|
|
115
|
-
});
|
|
116
|
-
}
|
|
117
|
-
disconnect() {
|
|
118
|
-
this.reconnectAttempts = this.maxReconnectAttempts;
|
|
119
|
-
if (this.ws) {
|
|
120
|
-
this.ws.close();
|
|
121
|
-
this.ws = null;
|
|
122
|
-
}
|
|
123
|
-
this.connected = false;
|
|
124
|
-
logger.info("[Browser] Client disconnected");
|
|
125
|
-
}
|
|
126
|
-
isConnected() {
|
|
127
|
-
return this.connected;
|
|
128
|
-
}
|
|
129
|
-
async navigate(sessionId, url) {
|
|
130
|
-
const response = await this.sendMessage("navigate", {
|
|
131
|
-
sessionId,
|
|
132
|
-
data: { url },
|
|
133
|
-
});
|
|
134
|
-
const data = response.data;
|
|
135
|
-
return {
|
|
136
|
-
success: Boolean(data?.success),
|
|
137
|
-
url: String(data?.url ?? url),
|
|
138
|
-
title: String(data?.title ?? ""),
|
|
139
|
-
};
|
|
140
|
-
}
|
|
141
|
-
async getState(sessionId) {
|
|
142
|
-
const response = await this.sendMessage("getState", { sessionId });
|
|
143
|
-
const data = response.data;
|
|
144
|
-
return {
|
|
145
|
-
url: String(data?.url ?? ""),
|
|
146
|
-
title: String(data?.title ?? ""),
|
|
147
|
-
sessionId,
|
|
148
|
-
createdAt: new Date(),
|
|
149
|
-
};
|
|
150
|
-
}
|
|
151
|
-
async goBack(sessionId) {
|
|
152
|
-
const response = await this.sendMessage("goBack", { sessionId });
|
|
153
|
-
const data = response.data;
|
|
154
|
-
return {
|
|
155
|
-
success: Boolean(data?.success ?? true),
|
|
156
|
-
url: String(data?.url ?? ""),
|
|
157
|
-
title: String(data?.title ?? ""),
|
|
158
|
-
};
|
|
159
|
-
}
|
|
160
|
-
async goForward(sessionId) {
|
|
161
|
-
const response = await this.sendMessage("goForward", { sessionId });
|
|
162
|
-
const data = response.data;
|
|
163
|
-
return {
|
|
164
|
-
success: Boolean(data?.success ?? true),
|
|
165
|
-
url: String(data?.url ?? ""),
|
|
166
|
-
title: String(data?.title ?? ""),
|
|
167
|
-
};
|
|
168
|
-
}
|
|
169
|
-
async refresh(sessionId) {
|
|
170
|
-
const response = await this.sendMessage("refresh", { sessionId });
|
|
171
|
-
const data = response.data;
|
|
172
|
-
return {
|
|
173
|
-
success: Boolean(data?.success ?? true),
|
|
174
|
-
url: String(data?.url ?? ""),
|
|
175
|
-
title: String(data?.title ?? ""),
|
|
176
|
-
};
|
|
177
|
-
}
|
|
178
|
-
async click(sessionId, description) {
|
|
179
|
-
return await this.sendMessage("click", {
|
|
180
|
-
sessionId,
|
|
181
|
-
data: { description },
|
|
182
|
-
});
|
|
183
|
-
}
|
|
184
|
-
async type(sessionId, text, field) {
|
|
185
|
-
return await this.sendMessage("type", {
|
|
186
|
-
sessionId,
|
|
187
|
-
data: { text, field },
|
|
188
|
-
});
|
|
189
|
-
}
|
|
190
|
-
async select(sessionId, option, dropdown) {
|
|
191
|
-
return await this.sendMessage("select", {
|
|
192
|
-
sessionId,
|
|
193
|
-
data: { option, dropdown },
|
|
194
|
-
});
|
|
195
|
-
}
|
|
196
|
-
async extract(sessionId, instruction) {
|
|
197
|
-
return await this.sendMessage("extract", {
|
|
198
|
-
sessionId,
|
|
199
|
-
data: { instruction },
|
|
200
|
-
});
|
|
201
|
-
}
|
|
202
|
-
async screenshot(sessionId) {
|
|
203
|
-
return await this.sendMessage("screenshot", { sessionId });
|
|
204
|
-
}
|
|
205
|
-
async solveCaptcha(sessionId) {
|
|
206
|
-
return await this.sendMessage("solveCaptcha", { sessionId });
|
|
207
|
-
}
|
|
208
|
-
async health() {
|
|
209
|
-
try {
|
|
210
|
-
const response = await this.sendMessage("health", {});
|
|
211
|
-
return (response.type === "health" &&
|
|
212
|
-
response.data?.status === "ok");
|
|
213
|
-
}
|
|
214
|
-
catch (error) {
|
|
215
|
-
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
216
|
-
logger.error(`[Browser] Health check failed: ${errorMessage}`);
|
|
217
|
-
return false;
|
|
218
|
-
}
|
|
219
|
-
}
|
|
220
|
-
}
|
|
221
|
-
//# sourceMappingURL=websocket-client.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"websocket-client.js","sourceRoot":"","sources":["../../src/services/websocket-client.ts"],"names":[],"mappings":"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","sourcesContent":["import { logger } from \"@elizaos/core\";\nimport WebSocket from \"ws\";\nimport type {\n\tNavigationResult,\n\tWebSocketMessage,\n\tWebSocketResponse,\n} from \"../types.js\";\n\ntype MessageHandler = (response: WebSocketResponse) => void;\n\nexport class BrowserWebSocketClient {\n\tprivate ws: WebSocket | null = null;\n\tprivate messageHandlers = new Map<string, MessageHandler>();\n\tprivate connected = false;\n\tprivate reconnectAttempts = 0;\n\tprivate maxReconnectAttempts = 5;\n\tprivate reconnectDelay = 1000;\n\n\tconstructor(private serverUrl: string) {}\n\n\tasync connect(): Promise<void> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\ttry {\n\t\t\t\tthis.ws = new WebSocket(this.serverUrl);\n\n\t\t\t\tthis.ws.on(\"open\", () => {\n\t\t\t\t\tthis.connected = true;\n\t\t\t\t\tthis.reconnectAttempts = 0;\n\t\t\t\t\tlogger.info(`[Browser] Connected to server at ${this.serverUrl}`);\n\t\t\t\t\tresolve();\n\t\t\t\t});\n\n\t\t\t\tthis.ws.on(\"message\", (data: WebSocket.RawData) => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst messageText = this.rawDataToString(data);\n\t\t\t\t\t\tconst message = JSON.parse(messageText) as WebSocketResponse;\n\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tmessage.requestId &&\n\t\t\t\t\t\t\tthis.messageHandlers.has(message.requestId)\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tconst handler = this.messageHandlers.get(message.requestId);\n\t\t\t\t\t\t\tthis.messageHandlers.delete(message.requestId);\n\t\t\t\t\t\t\thandler?.(message);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (message.type === \"connected\") {\n\t\t\t\t\t\t\tlogger.info(\n\t\t\t\t\t\t\t\t`[Browser] Server connected: ${JSON.stringify(message)}`,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tconst errorMessage =\n\t\t\t\t\t\t\terror instanceof Error ? error.message : String(error);\n\t\t\t\t\t\tlogger.error(`[Browser] Error parsing message: ${errorMessage}`);\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tthis.ws.on(\"error\", (error: Error) => {\n\t\t\t\t\tlogger.error(`[Browser] WebSocket error: ${error.message}`);\n\t\t\t\t\tif (!this.connected) {\n\t\t\t\t\t\treject(error);\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tthis.ws.on(\"close\", () => {\n\t\t\t\t\tthis.connected = false;\n\t\t\t\t\tlogger.info(\"[Browser] Disconnected from server\");\n\n\t\t\t\t\tif (this.ws && this.reconnectAttempts < this.maxReconnectAttempts) {\n\t\t\t\t\t\tthis.attemptReconnect();\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t} catch (error) {\n\t\t\t\treject(error);\n\t\t\t}\n\t\t});\n\t}\n\n\tprivate rawDataToString(data: WebSocket.RawData): string {\n\t\tif (typeof data === \"string\") {\n\t\t\treturn data;\n\t\t}\n\t\tif (Buffer.isBuffer(data)) {\n\t\t\treturn data.toString(\"utf8\");\n\t\t}\n\t\tif (data instanceof ArrayBuffer) {\n\t\t\treturn Buffer.from(data).toString(\"utf8\");\n\t\t}\n\t\tif (Array.isArray(data)) {\n\t\t\treturn Buffer.concat(data).toString(\"utf8\");\n\t\t}\n\t\treturn String(data);\n\t}\n\n\tprivate async attemptReconnect(): Promise<void> {\n\t\tthis.reconnectAttempts++;\n\t\tlogger.info(\n\t\t\t`[Browser] Attempting reconnection ${this.reconnectAttempts}/${this.maxReconnectAttempts}...`,\n\t\t);\n\n\t\tawait new Promise((resolve) =>\n\t\t\tsetTimeout(resolve, this.reconnectDelay * this.reconnectAttempts),\n\t\t);\n\n\t\ttry {\n\t\t\tawait this.connect();\n\t\t} catch (error) {\n\t\t\tconst errorMessage =\n\t\t\t\terror instanceof Error ? error.message : String(error);\n\t\t\tlogger.error(`[Browser] Reconnection failed: ${errorMessage}`);\n\t\t}\n\t}\n\n\tasync sendMessage(\n\t\ttype: string,\n\t\tdata: Record<string, unknown>,\n\t): Promise<WebSocketResponse> {\n\t\tif (!this.ws || !this.connected) {\n\t\t\tthrow new Error(\"Not connected to browser server\");\n\t\t}\n\n\t\tconst requestId = `req-${Date.now()}-${Math.random().toString(36).substring(7)}`;\n\t\tconst message: WebSocketMessage = {\n\t\t\ttype,\n\t\t\trequestId,\n\t\t\t...data,\n\t\t};\n\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst timeout = setTimeout(() => {\n\t\t\t\tthis.messageHandlers.delete(requestId);\n\t\t\t\treject(new Error(`Request timeout for ${type}`));\n\t\t\t}, 30000);\n\n\t\t\tthis.messageHandlers.set(requestId, (response) => {\n\t\t\t\tclearTimeout(timeout);\n\t\t\t\tif (response.type === \"error\") {\n\t\t\t\t\treject(new Error(response.error ?? \"Unknown error\"));\n\t\t\t\t} else {\n\t\t\t\t\tresolve(response);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tthis.ws?.send(JSON.stringify(message));\n\t\t\tlogger.debug(`[Browser] Sent message: ${type} (${requestId})`);\n\t\t});\n\t}\n\n\tdisconnect(): void {\n\t\tthis.reconnectAttempts = this.maxReconnectAttempts;\n\t\tif (this.ws) {\n\t\t\tthis.ws.close();\n\t\t\tthis.ws = null;\n\t\t}\n\t\tthis.connected = false;\n\t\tlogger.info(\"[Browser] Client disconnected\");\n\t}\n\n\tisConnected(): boolean {\n\t\treturn this.connected;\n\t}\n\n\tasync navigate(sessionId: string, url: string): Promise<NavigationResult> {\n\t\tconst response = await this.sendMessage(\"navigate\", {\n\t\t\tsessionId,\n\t\t\tdata: { url },\n\t\t});\n\t\tconst data = response.data as Record<string, unknown> | undefined;\n\t\treturn {\n\t\t\tsuccess: Boolean(data?.success),\n\t\t\turl: String(data?.url ?? url),\n\t\t\ttitle: String(data?.title ?? \"\"),\n\t\t};\n\t}\n\n\tasync getState(sessionId: string): Promise<{\n\t\turl: string;\n\t\ttitle: string;\n\t\tsessionId: string;\n\t\tcreatedAt: Date;\n\t}> {\n\t\tconst response = await this.sendMessage(\"getState\", { sessionId });\n\t\tconst data = response.data as Record<string, unknown> | undefined;\n\t\treturn {\n\t\t\turl: String(data?.url ?? \"\"),\n\t\t\ttitle: String(data?.title ?? \"\"),\n\t\t\tsessionId,\n\t\t\tcreatedAt: new Date(),\n\t\t};\n\t}\n\n\tasync goBack(sessionId: string): Promise<NavigationResult> {\n\t\tconst response = await this.sendMessage(\"goBack\", { sessionId });\n\t\tconst data = response.data as Record<string, unknown> | undefined;\n\t\treturn {\n\t\t\tsuccess: Boolean(data?.success ?? true),\n\t\t\turl: String(data?.url ?? \"\"),\n\t\t\ttitle: String(data?.title ?? \"\"),\n\t\t};\n\t}\n\n\tasync goForward(sessionId: string): Promise<NavigationResult> {\n\t\tconst response = await this.sendMessage(\"goForward\", { sessionId });\n\t\tconst data = response.data as Record<string, unknown> | undefined;\n\t\treturn {\n\t\t\tsuccess: Boolean(data?.success ?? true),\n\t\t\turl: String(data?.url ?? \"\"),\n\t\t\ttitle: String(data?.title ?? \"\"),\n\t\t};\n\t}\n\n\tasync refresh(sessionId: string): Promise<NavigationResult> {\n\t\tconst response = await this.sendMessage(\"refresh\", { sessionId });\n\t\tconst data = response.data as Record<string, unknown> | undefined;\n\t\treturn {\n\t\t\tsuccess: Boolean(data?.success ?? true),\n\t\t\turl: String(data?.url ?? \"\"),\n\t\t\ttitle: String(data?.title ?? \"\"),\n\t\t};\n\t}\n\n\tasync click(\n\t\tsessionId: string,\n\t\tdescription: string,\n\t): Promise<WebSocketResponse> {\n\t\treturn await this.sendMessage(\"click\", {\n\t\t\tsessionId,\n\t\t\tdata: { description },\n\t\t});\n\t}\n\n\tasync type(\n\t\tsessionId: string,\n\t\ttext: string,\n\t\tfield: string,\n\t): Promise<WebSocketResponse> {\n\t\treturn await this.sendMessage(\"type\", {\n\t\t\tsessionId,\n\t\t\tdata: { text, field },\n\t\t});\n\t}\n\n\tasync select(\n\t\tsessionId: string,\n\t\toption: string,\n\t\tdropdown: string,\n\t): Promise<WebSocketResponse> {\n\t\treturn await this.sendMessage(\"select\", {\n\t\t\tsessionId,\n\t\t\tdata: { option, dropdown },\n\t\t});\n\t}\n\n\tasync extract(\n\t\tsessionId: string,\n\t\tinstruction: string,\n\t): Promise<WebSocketResponse> {\n\t\treturn await this.sendMessage(\"extract\", {\n\t\t\tsessionId,\n\t\t\tdata: { instruction },\n\t\t});\n\t}\n\n\tasync screenshot(sessionId: string): Promise<WebSocketResponse> {\n\t\treturn await this.sendMessage(\"screenshot\", { sessionId });\n\t}\n\n\tasync solveCaptcha(sessionId: string): Promise<WebSocketResponse> {\n\t\treturn await this.sendMessage(\"solveCaptcha\", { sessionId });\n\t}\n\n\tasync health(): Promise<boolean> {\n\t\ttry {\n\t\t\tconst response = await this.sendMessage(\"health\", {});\n\t\t\treturn (\n\t\t\t\tresponse.type === \"health\" &&\n\t\t\t\t(response.data as { status: string })?.status === \"ok\"\n\t\t\t);\n\t\t} catch (error) {\n\t\t\tconst errorMessage =\n\t\t\t\terror instanceof Error ? error.message : String(error);\n\t\t\tlogger.error(`[Browser] Health check failed: ${errorMessage}`);\n\t\t\treturn false;\n\t\t}\n\t}\n}\n"]}
|
package/dist/types.d.ts
DELETED
|
@@ -1,101 +0,0 @@
|
|
|
1
|
-
export interface BrowserSession {
|
|
2
|
-
id: string;
|
|
3
|
-
createdAt: Date;
|
|
4
|
-
url?: string;
|
|
5
|
-
title?: string;
|
|
6
|
-
}
|
|
7
|
-
export interface NavigationResult {
|
|
8
|
-
success: boolean;
|
|
9
|
-
url: string;
|
|
10
|
-
title: string;
|
|
11
|
-
error?: string;
|
|
12
|
-
}
|
|
13
|
-
export interface BrowserActionResult {
|
|
14
|
-
success: boolean;
|
|
15
|
-
data?: Record<string, unknown>;
|
|
16
|
-
error?: string;
|
|
17
|
-
}
|
|
18
|
-
export interface ExtractResult {
|
|
19
|
-
success: boolean;
|
|
20
|
-
found: boolean;
|
|
21
|
-
data?: string;
|
|
22
|
-
error?: string;
|
|
23
|
-
}
|
|
24
|
-
export interface ScreenshotResult {
|
|
25
|
-
success: boolean;
|
|
26
|
-
data?: string;
|
|
27
|
-
mimeType?: "image/png" | "image/jpeg";
|
|
28
|
-
url?: string;
|
|
29
|
-
title?: string;
|
|
30
|
-
error?: string;
|
|
31
|
-
}
|
|
32
|
-
export interface CaptchaResult {
|
|
33
|
-
detected: boolean;
|
|
34
|
-
type: CaptchaType;
|
|
35
|
-
siteKey?: string;
|
|
36
|
-
solved: boolean;
|
|
37
|
-
token?: string;
|
|
38
|
-
error?: string;
|
|
39
|
-
}
|
|
40
|
-
export type CaptchaType = "turnstile" | "recaptcha-v2" | "recaptcha-v3" | "hcaptcha" | "none";
|
|
41
|
-
export interface SecurityConfig {
|
|
42
|
-
allowedDomains?: string[];
|
|
43
|
-
blockedDomains?: string[];
|
|
44
|
-
maxUrlLength?: number;
|
|
45
|
-
allowLocalhost?: boolean;
|
|
46
|
-
allowFileProtocol?: boolean;
|
|
47
|
-
}
|
|
48
|
-
export interface RetryConfig {
|
|
49
|
-
maxAttempts: number;
|
|
50
|
-
initialDelayMs: number;
|
|
51
|
-
maxDelayMs: number;
|
|
52
|
-
backoffMultiplier: number;
|
|
53
|
-
}
|
|
54
|
-
export interface BrowserConfig {
|
|
55
|
-
headless?: boolean;
|
|
56
|
-
browserbaseApiKey?: string;
|
|
57
|
-
browserbaseProjectId?: string;
|
|
58
|
-
openaiApiKey?: string;
|
|
59
|
-
anthropicApiKey?: string;
|
|
60
|
-
ollamaBaseUrl?: string;
|
|
61
|
-
ollamaModel?: string;
|
|
62
|
-
capsolverApiKey?: string;
|
|
63
|
-
serverPort?: number;
|
|
64
|
-
}
|
|
65
|
-
export interface WebSocketMessage {
|
|
66
|
-
type: string;
|
|
67
|
-
requestId: string;
|
|
68
|
-
sessionId?: string;
|
|
69
|
-
data?: Record<string, unknown>;
|
|
70
|
-
}
|
|
71
|
-
export interface WebSocketResponse {
|
|
72
|
-
type: string;
|
|
73
|
-
requestId: string;
|
|
74
|
-
success: boolean;
|
|
75
|
-
data?: Record<string, unknown>;
|
|
76
|
-
error?: string;
|
|
77
|
-
}
|
|
78
|
-
export interface CapSolverConfig {
|
|
79
|
-
apiKey: string;
|
|
80
|
-
apiUrl?: string;
|
|
81
|
-
retryAttempts?: number;
|
|
82
|
-
pollingInterval?: number;
|
|
83
|
-
}
|
|
84
|
-
export interface CaptchaTask {
|
|
85
|
-
type: string;
|
|
86
|
-
websiteURL: string;
|
|
87
|
-
websiteKey: string;
|
|
88
|
-
proxy?: string;
|
|
89
|
-
userAgent?: string;
|
|
90
|
-
[key: string]: string | boolean | number | undefined;
|
|
91
|
-
}
|
|
92
|
-
export interface RateLimitConfig {
|
|
93
|
-
maxActionsPerMinute: number;
|
|
94
|
-
maxSessionsPerHour: number;
|
|
95
|
-
}
|
|
96
|
-
export interface RateLimitEntry {
|
|
97
|
-
count: number;
|
|
98
|
-
resetTime: number;
|
|
99
|
-
}
|
|
100
|
-
export declare const BROWSER_SERVICE_TYPE: "browser";
|
|
101
|
-
//# sourceMappingURL=types.d.ts.map
|
package/dist/types.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/types.js
DELETED
package/dist/types.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAwHA,MAAM,CAAC,MAAM,oBAAoB,GAAG,SAAkB,CAAC","sourcesContent":["export interface BrowserSession {\n\tid: string;\n\tcreatedAt: Date;\n\turl?: string;\n\ttitle?: string;\n}\n\nexport interface NavigationResult {\n\tsuccess: boolean;\n\turl: string;\n\ttitle: string;\n\terror?: string;\n}\n\nexport interface BrowserActionResult {\n\tsuccess: boolean;\n\tdata?: Record<string, unknown>;\n\terror?: string;\n}\n\nexport interface ExtractResult {\n\tsuccess: boolean;\n\tfound: boolean;\n\tdata?: string;\n\terror?: string;\n}\n\nexport interface ScreenshotResult {\n\tsuccess: boolean;\n\tdata?: string;\n\tmimeType?: \"image/png\" | \"image/jpeg\";\n\turl?: string;\n\ttitle?: string;\n\terror?: string;\n}\n\nexport interface CaptchaResult {\n\tdetected: boolean;\n\ttype: CaptchaType;\n\tsiteKey?: string;\n\tsolved: boolean;\n\ttoken?: string;\n\terror?: string;\n}\n\nexport type CaptchaType =\n\t| \"turnstile\"\n\t| \"recaptcha-v2\"\n\t| \"recaptcha-v3\"\n\t| \"hcaptcha\"\n\t| \"none\";\n\nexport interface SecurityConfig {\n\tallowedDomains?: string[];\n\tblockedDomains?: string[];\n\tmaxUrlLength?: number;\n\tallowLocalhost?: boolean;\n\tallowFileProtocol?: boolean;\n}\n\nexport interface RetryConfig {\n\tmaxAttempts: number;\n\tinitialDelayMs: number;\n\tmaxDelayMs: number;\n\tbackoffMultiplier: number;\n}\n\nexport interface BrowserConfig {\n\theadless?: boolean;\n\tbrowserbaseApiKey?: string;\n\tbrowserbaseProjectId?: string;\n\topenaiApiKey?: string;\n\tanthropicApiKey?: string;\n\tollamaBaseUrl?: string;\n\tollamaModel?: string;\n\tcapsolverApiKey?: string;\n\tserverPort?: number;\n}\n\nexport interface WebSocketMessage {\n\ttype: string;\n\trequestId: string;\n\tsessionId?: string;\n\tdata?: Record<string, unknown>;\n}\n\nexport interface WebSocketResponse {\n\ttype: string;\n\trequestId: string;\n\tsuccess: boolean;\n\tdata?: Record<string, unknown>;\n\terror?: string;\n}\n\nexport interface CapSolverConfig {\n\tapiKey: string;\n\tapiUrl?: string;\n\tretryAttempts?: number;\n\tpollingInterval?: number;\n}\n\nexport interface CaptchaTask {\n\ttype: string;\n\twebsiteURL: string;\n\twebsiteKey: string;\n\tproxy?: string;\n\tuserAgent?: string;\n\t[key: string]: string | boolean | number | undefined;\n}\n\nexport interface RateLimitConfig {\n\tmaxActionsPerMinute: number;\n\tmaxSessionsPerHour: number;\n}\n\nexport interface RateLimitEntry {\n\tcount: number;\n\tresetTime: number;\n}\n\nexport const BROWSER_SERVICE_TYPE = \"browser\" as const;\n"]}
|
package/dist/utils/captcha.d.ts
DELETED
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
import type { CapSolverConfig, CaptchaTask, CaptchaType } from "../types.js";
|
|
2
|
-
interface CapSolverTaskResult {
|
|
3
|
-
token?: string;
|
|
4
|
-
gRecaptchaResponse?: string;
|
|
5
|
-
}
|
|
6
|
-
export declare class CapSolverService {
|
|
7
|
-
private config;
|
|
8
|
-
private readonly apiUrl;
|
|
9
|
-
private readonly retryAttempts;
|
|
10
|
-
private readonly pollingInterval;
|
|
11
|
-
constructor(config: CapSolverConfig);
|
|
12
|
-
/**
|
|
13
|
-
* Create a CAPTCHA solving task
|
|
14
|
-
*/
|
|
15
|
-
createTask(task: CaptchaTask): Promise<string>;
|
|
16
|
-
getTaskResult(taskId: string): Promise<CapSolverTaskResult>;
|
|
17
|
-
solveTurnstile(websiteURL: string, websiteKey: string, proxy?: string, userAgent?: string): Promise<string>;
|
|
18
|
-
solveRecaptchaV2(websiteURL: string, websiteKey: string, isInvisible?: boolean, proxy?: string): Promise<string>;
|
|
19
|
-
solveRecaptchaV3(websiteURL: string, websiteKey: string, pageAction: string, minScore?: number, proxy?: string): Promise<string>;
|
|
20
|
-
solveHCaptcha(websiteURL: string, websiteKey: string, proxy?: string): Promise<string>;
|
|
21
|
-
}
|
|
22
|
-
export declare function detectCaptchaType(page: {
|
|
23
|
-
$: (selector: string) => Promise<Element | null>;
|
|
24
|
-
evaluate: <T>(fn: () => T) => Promise<T>;
|
|
25
|
-
}): Promise<{
|
|
26
|
-
type: CaptchaType;
|
|
27
|
-
siteKey?: string;
|
|
28
|
-
}>;
|
|
29
|
-
export declare function injectCaptchaSolution(page: {
|
|
30
|
-
evaluate: <T>(fn: (token: string) => T, token: string) => Promise<T>;
|
|
31
|
-
}, captchaType: CaptchaType, solution: string): Promise<void>;
|
|
32
|
-
export {};
|
|
33
|
-
//# sourceMappingURL=captcha.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"captcha.d.ts","sourceRoot":"","sources":["../../src/utils/captcha.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE7E,UAAU,mBAAmB;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,qBAAa,gBAAgB;IAKhB,OAAO,CAAC,MAAM;IAJ1B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAS;gBAErB,MAAM,EAAE,eAAe;IAM3C;;OAEG;IACG,UAAU,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC;IA8B9C,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC;IA2C3D,cAAc,CACnB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,EAClB,KAAK,CAAC,EAAE,MAAM,EACd,SAAS,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,MAAM,CAAC;IA4BZ,gBAAgB,CACrB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,EAClB,WAAW,UAAQ,EACnB,KAAK,CAAC,EAAE,MAAM,GACZ,OAAO,CAAC,MAAM,CAAC;IAyBZ,gBAAgB,CACrB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,EAClB,QAAQ,SAAM,EACd,KAAK,CAAC,EAAE,MAAM,GACZ,OAAO,CAAC,MAAM,CAAC;IA0BZ,aAAa,CAClB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,EAClB,KAAK,CAAC,EAAE,MAAM,GACZ,OAAO,CAAC,MAAM,CAAC;CAuBlB;AAED,wBAAsB,iBAAiB,CAAC,IAAI,EAAE;IAC7C,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;IACjD,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC;CACzC,GAAG,OAAO,CAAC;IACX,IAAI,EAAE,WAAW,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC,CAoCD;AAED,wBAAsB,qBAAqB,CAC1C,IAAI,EAAE;IACL,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,CAAC,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC;CACrE,EACD,WAAW,EAAE,WAAW,EACxB,QAAQ,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC,CA0Df"}
|
package/dist/utils/captcha.js
DELETED
|
@@ -1,219 +0,0 @@
|
|
|
1
|
-
import { logger } from "@elizaos/core";
|
|
2
|
-
import axios from "axios";
|
|
3
|
-
export class CapSolverService {
|
|
4
|
-
config;
|
|
5
|
-
apiUrl;
|
|
6
|
-
retryAttempts;
|
|
7
|
-
pollingInterval;
|
|
8
|
-
constructor(config) {
|
|
9
|
-
this.config = config;
|
|
10
|
-
this.apiUrl = config.apiUrl ?? "https://api.capsolver.com";
|
|
11
|
-
this.retryAttempts = config.retryAttempts ?? 60;
|
|
12
|
-
this.pollingInterval = config.pollingInterval ?? 2000;
|
|
13
|
-
}
|
|
14
|
-
/**
|
|
15
|
-
* Create a CAPTCHA solving task
|
|
16
|
-
*/
|
|
17
|
-
async createTask(task) {
|
|
18
|
-
try {
|
|
19
|
-
const response = await axios.post(`${this.apiUrl}/createTask`, {
|
|
20
|
-
clientKey: this.config.apiKey,
|
|
21
|
-
task,
|
|
22
|
-
}, {
|
|
23
|
-
headers: { "Content-Type": "application/json" },
|
|
24
|
-
timeout: 30000,
|
|
25
|
-
});
|
|
26
|
-
if (response.data.errorId !== 0) {
|
|
27
|
-
throw new Error(`CapSolver error: ${response.data.errorDescription ?? "Unknown error"}`);
|
|
28
|
-
}
|
|
29
|
-
logger.info("CapSolver task created:", response.data.taskId);
|
|
30
|
-
return response.data.taskId;
|
|
31
|
-
}
|
|
32
|
-
catch (error) {
|
|
33
|
-
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
34
|
-
logger.error(`Error creating CapSolver task: ${errorMessage}`);
|
|
35
|
-
throw error;
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
async getTaskResult(taskId) {
|
|
39
|
-
let attempts = 0;
|
|
40
|
-
while (attempts < this.retryAttempts) {
|
|
41
|
-
try {
|
|
42
|
-
const response = await axios.post(`${this.apiUrl}/getTaskResult`, {
|
|
43
|
-
clientKey: this.config.apiKey,
|
|
44
|
-
taskId,
|
|
45
|
-
}, {
|
|
46
|
-
headers: { "Content-Type": "application/json" },
|
|
47
|
-
timeout: 30000,
|
|
48
|
-
});
|
|
49
|
-
if (response.data.errorId !== 0) {
|
|
50
|
-
throw new Error(`CapSolver error: ${response.data.errorDescription ?? "Unknown error"}`);
|
|
51
|
-
}
|
|
52
|
-
if (response.data.status === "ready") {
|
|
53
|
-
logger.info("CapSolver task completed successfully");
|
|
54
|
-
return response.data.solution;
|
|
55
|
-
}
|
|
56
|
-
await new Promise((resolve) => setTimeout(resolve, this.pollingInterval));
|
|
57
|
-
attempts++;
|
|
58
|
-
}
|
|
59
|
-
catch (error) {
|
|
60
|
-
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
61
|
-
logger.error(`Error getting CapSolver task result: ${errorMessage}`);
|
|
62
|
-
throw error;
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
throw new Error("CapSolver task timeout");
|
|
66
|
-
}
|
|
67
|
-
async solveTurnstile(websiteURL, websiteKey, proxy, userAgent) {
|
|
68
|
-
logger.info("Solving Cloudflare Turnstile captcha");
|
|
69
|
-
const task = {
|
|
70
|
-
type: proxy ? "AntiTurnstileTask" : "AntiTurnstileTaskProxyLess",
|
|
71
|
-
websiteURL,
|
|
72
|
-
websiteKey,
|
|
73
|
-
};
|
|
74
|
-
if (proxy) {
|
|
75
|
-
const proxyParts = proxy.split(":");
|
|
76
|
-
task.proxy = `${proxyParts[0]}:${proxyParts[1]}`;
|
|
77
|
-
if (proxyParts.length > 2) {
|
|
78
|
-
task.proxyLogin = proxyParts[2];
|
|
79
|
-
task.proxyPassword = proxyParts[3];
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
if (userAgent) {
|
|
83
|
-
task.userAgent = userAgent;
|
|
84
|
-
}
|
|
85
|
-
const taskId = await this.createTask(task);
|
|
86
|
-
const solution = await this.getTaskResult(taskId);
|
|
87
|
-
return solution.token ?? "";
|
|
88
|
-
}
|
|
89
|
-
async solveRecaptchaV2(websiteURL, websiteKey, isInvisible = false, proxy) {
|
|
90
|
-
logger.info("Solving reCAPTCHA v2");
|
|
91
|
-
const task = {
|
|
92
|
-
type: proxy ? "RecaptchaV2Task" : "RecaptchaV2TaskProxyless",
|
|
93
|
-
websiteURL,
|
|
94
|
-
websiteKey,
|
|
95
|
-
isInvisible,
|
|
96
|
-
};
|
|
97
|
-
if (proxy) {
|
|
98
|
-
const proxyParts = proxy.split(":");
|
|
99
|
-
task.proxy = `${proxyParts[0]}:${proxyParts[1]}`;
|
|
100
|
-
if (proxyParts.length > 2) {
|
|
101
|
-
task.proxyLogin = proxyParts[2];
|
|
102
|
-
task.proxyPassword = proxyParts[3];
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
const taskId = await this.createTask(task);
|
|
106
|
-
const solution = await this.getTaskResult(taskId);
|
|
107
|
-
return solution.gRecaptchaResponse ?? "";
|
|
108
|
-
}
|
|
109
|
-
async solveRecaptchaV3(websiteURL, websiteKey, pageAction, minScore = 0.7, proxy) {
|
|
110
|
-
logger.info("Solving reCAPTCHA v3");
|
|
111
|
-
const task = {
|
|
112
|
-
type: proxy ? "RecaptchaV3Task" : "RecaptchaV3TaskProxyless",
|
|
113
|
-
websiteURL,
|
|
114
|
-
websiteKey,
|
|
115
|
-
pageAction,
|
|
116
|
-
minScore,
|
|
117
|
-
};
|
|
118
|
-
if (proxy) {
|
|
119
|
-
const proxyParts = proxy.split(":");
|
|
120
|
-
task.proxy = `${proxyParts[0]}:${proxyParts[1]}`;
|
|
121
|
-
if (proxyParts.length > 2) {
|
|
122
|
-
task.proxyLogin = proxyParts[2];
|
|
123
|
-
task.proxyPassword = proxyParts[3];
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
const taskId = await this.createTask(task);
|
|
127
|
-
const solution = await this.getTaskResult(taskId);
|
|
128
|
-
return solution.gRecaptchaResponse ?? "";
|
|
129
|
-
}
|
|
130
|
-
async solveHCaptcha(websiteURL, websiteKey, proxy) {
|
|
131
|
-
logger.info("Solving hCaptcha");
|
|
132
|
-
const task = {
|
|
133
|
-
type: proxy ? "HCaptchaTask" : "HCaptchaTaskProxyless",
|
|
134
|
-
websiteURL,
|
|
135
|
-
websiteKey,
|
|
136
|
-
};
|
|
137
|
-
if (proxy) {
|
|
138
|
-
const proxyParts = proxy.split(":");
|
|
139
|
-
task.proxy = `${proxyParts[0]}:${proxyParts[1]}`;
|
|
140
|
-
if (proxyParts.length > 2) {
|
|
141
|
-
task.proxyLogin = proxyParts[2];
|
|
142
|
-
task.proxyPassword = proxyParts[3];
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
const taskId = await this.createTask(task);
|
|
146
|
-
const solution = await this.getTaskResult(taskId);
|
|
147
|
-
return solution.token ?? "";
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
export async function detectCaptchaType(page) {
|
|
151
|
-
try {
|
|
152
|
-
const turnstileElement = await page.$("[data-sitekey]");
|
|
153
|
-
if (turnstileElement) {
|
|
154
|
-
const cfTurnstile = await page.$(".cf-turnstile");
|
|
155
|
-
if (cfTurnstile) {
|
|
156
|
-
return { type: "turnstile" };
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
const recaptchaElement = await page.$("[data-sitekey], .g-recaptcha");
|
|
160
|
-
if (recaptchaElement) {
|
|
161
|
-
const isV3 = await page.evaluate(() => {
|
|
162
|
-
const grecaptcha = globalThis.grecaptcha;
|
|
163
|
-
return typeof grecaptcha?.execute === "function";
|
|
164
|
-
});
|
|
165
|
-
return { type: isV3 ? "recaptcha-v3" : "recaptcha-v2" };
|
|
166
|
-
}
|
|
167
|
-
const hcaptchaElement = await page.$("[data-sitekey].h-captcha, [data-hcaptcha-sitekey]");
|
|
168
|
-
if (hcaptchaElement) {
|
|
169
|
-
return { type: "hcaptcha" };
|
|
170
|
-
}
|
|
171
|
-
return { type: "none" };
|
|
172
|
-
}
|
|
173
|
-
catch (error) {
|
|
174
|
-
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
175
|
-
logger.error(`Error detecting CAPTCHA type: ${errorMessage}`);
|
|
176
|
-
return { type: "none" };
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
export async function injectCaptchaSolution(page, captchaType, solution) {
|
|
180
|
-
switch (captchaType) {
|
|
181
|
-
case "turnstile":
|
|
182
|
-
await page.evaluate((token) => {
|
|
183
|
-
const doc = globalThis;
|
|
184
|
-
const textarea = doc.document.querySelector('[name="cf-turnstile-response"]');
|
|
185
|
-
if (textarea) {
|
|
186
|
-
textarea.value = token;
|
|
187
|
-
}
|
|
188
|
-
doc.turnstileCallback?.(token);
|
|
189
|
-
}, solution);
|
|
190
|
-
break;
|
|
191
|
-
case "recaptcha-v2":
|
|
192
|
-
case "recaptcha-v3":
|
|
193
|
-
await page.evaluate((token) => {
|
|
194
|
-
const doc = globalThis;
|
|
195
|
-
const textarea = doc.document.querySelector('[name="g-recaptcha-response"]');
|
|
196
|
-
if (textarea) {
|
|
197
|
-
textarea.value = token;
|
|
198
|
-
textarea.style.display = "block";
|
|
199
|
-
}
|
|
200
|
-
doc.onRecaptchaSuccess?.(token);
|
|
201
|
-
}, solution);
|
|
202
|
-
break;
|
|
203
|
-
case "hcaptcha":
|
|
204
|
-
await page.evaluate((token) => {
|
|
205
|
-
const doc = globalThis;
|
|
206
|
-
const textarea = doc.document.querySelector('[name="h-captcha-response"]');
|
|
207
|
-
if (textarea) {
|
|
208
|
-
textarea.value = token;
|
|
209
|
-
}
|
|
210
|
-
const input = doc.document.querySelector('[name="g-recaptcha-response"]');
|
|
211
|
-
if (input) {
|
|
212
|
-
input.value = token;
|
|
213
|
-
}
|
|
214
|
-
doc.hcaptchaCallback?.(token);
|
|
215
|
-
}, solution);
|
|
216
|
-
break;
|
|
217
|
-
}
|
|
218
|
-
}
|
|
219
|
-
//# sourceMappingURL=captcha.js.map
|