@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":"captcha.js","sourceRoot":"","sources":["../../src/utils/captcha.ts"],"names":[],"mappings":"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","sourcesContent":["import { logger } from \"@elizaos/core\";\nimport axios from \"axios\";\nimport type { CapSolverConfig, CaptchaTask, CaptchaType } from \"../types.js\";\n\ninterface CapSolverTaskResult {\n\ttoken?: string;\n\tgRecaptchaResponse?: string;\n}\n\nexport class CapSolverService {\n\tprivate readonly apiUrl: string;\n\tprivate readonly retryAttempts: number;\n\tprivate readonly pollingInterval: number;\n\n\tconstructor(private config: CapSolverConfig) {\n\t\tthis.apiUrl = config.apiUrl ?? \"https://api.capsolver.com\";\n\t\tthis.retryAttempts = config.retryAttempts ?? 60;\n\t\tthis.pollingInterval = config.pollingInterval ?? 2000;\n\t}\n\n\t/**\n\t * Create a CAPTCHA solving task\n\t */\n\tasync createTask(task: CaptchaTask): Promise<string> {\n\t\ttry {\n\t\t\tconst response = await axios.post(\n\t\t\t\t`${this.apiUrl}/createTask`,\n\t\t\t\t{\n\t\t\t\t\tclientKey: this.config.apiKey,\n\t\t\t\t\ttask,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\theaders: { \"Content-Type\": \"application/json\" },\n\t\t\t\t\ttimeout: 30000,\n\t\t\t\t},\n\t\t\t);\n\n\t\t\tif (response.data.errorId !== 0) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`CapSolver error: ${response.data.errorDescription ?? \"Unknown error\"}`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tlogger.info(\"CapSolver task created:\", response.data.taskId);\n\t\t\treturn response.data.taskId;\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(`Error creating CapSolver task: ${errorMessage}`);\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tasync getTaskResult(taskId: string): Promise<CapSolverTaskResult> {\n\t\tlet attempts = 0;\n\n\t\twhile (attempts < this.retryAttempts) {\n\t\t\ttry {\n\t\t\t\tconst response = await axios.post(\n\t\t\t\t\t`${this.apiUrl}/getTaskResult`,\n\t\t\t\t\t{\n\t\t\t\t\t\tclientKey: this.config.apiKey,\n\t\t\t\t\t\ttaskId,\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\theaders: { \"Content-Type\": \"application/json\" },\n\t\t\t\t\t\ttimeout: 30000,\n\t\t\t\t\t},\n\t\t\t\t);\n\n\t\t\t\tif (response.data.errorId !== 0) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`CapSolver error: ${response.data.errorDescription ?? \"Unknown error\"}`,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tif (response.data.status === \"ready\") {\n\t\t\t\t\tlogger.info(\"CapSolver task completed successfully\");\n\t\t\t\t\treturn response.data.solution;\n\t\t\t\t}\n\n\t\t\t\tawait new Promise((resolve) =>\n\t\t\t\t\tsetTimeout(resolve, this.pollingInterval),\n\t\t\t\t);\n\t\t\t\tattempts++;\n\t\t\t} catch (error) {\n\t\t\t\tconst errorMessage =\n\t\t\t\t\terror instanceof Error ? error.message : String(error);\n\t\t\t\tlogger.error(`Error getting CapSolver task result: ${errorMessage}`);\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t}\n\n\t\tthrow new Error(\"CapSolver task timeout\");\n\t}\n\n\tasync solveTurnstile(\n\t\twebsiteURL: string,\n\t\twebsiteKey: string,\n\t\tproxy?: string,\n\t\tuserAgent?: string,\n\t): Promise<string> {\n\t\tlogger.info(\"Solving Cloudflare Turnstile captcha\");\n\n\t\tconst task: CaptchaTask = {\n\t\t\ttype: proxy ? \"AntiTurnstileTask\" : \"AntiTurnstileTaskProxyLess\",\n\t\t\twebsiteURL,\n\t\t\twebsiteKey,\n\t\t};\n\n\t\tif (proxy) {\n\t\t\tconst proxyParts = proxy.split(\":\");\n\t\t\ttask.proxy = `${proxyParts[0]}:${proxyParts[1]}`;\n\t\t\tif (proxyParts.length > 2) {\n\t\t\t\ttask.proxyLogin = proxyParts[2];\n\t\t\t\ttask.proxyPassword = proxyParts[3];\n\t\t\t}\n\t\t}\n\n\t\tif (userAgent) {\n\t\t\ttask.userAgent = userAgent;\n\t\t}\n\n\t\tconst taskId = await this.createTask(task);\n\t\tconst solution = await this.getTaskResult(taskId);\n\n\t\treturn solution.token ?? \"\";\n\t}\n\n\tasync solveRecaptchaV2(\n\t\twebsiteURL: string,\n\t\twebsiteKey: string,\n\t\tisInvisible = false,\n\t\tproxy?: string,\n\t): Promise<string> {\n\t\tlogger.info(\"Solving reCAPTCHA v2\");\n\n\t\tconst task: CaptchaTask = {\n\t\t\ttype: proxy ? \"RecaptchaV2Task\" : \"RecaptchaV2TaskProxyless\",\n\t\t\twebsiteURL,\n\t\t\twebsiteKey,\n\t\t\tisInvisible,\n\t\t};\n\n\t\tif (proxy) {\n\t\t\tconst proxyParts = proxy.split(\":\");\n\t\t\ttask.proxy = `${proxyParts[0]}:${proxyParts[1]}`;\n\t\t\tif (proxyParts.length > 2) {\n\t\t\t\ttask.proxyLogin = proxyParts[2];\n\t\t\t\ttask.proxyPassword = proxyParts[3];\n\t\t\t}\n\t\t}\n\n\t\tconst taskId = await this.createTask(task);\n\t\tconst solution = await this.getTaskResult(taskId);\n\n\t\treturn solution.gRecaptchaResponse ?? \"\";\n\t}\n\n\tasync solveRecaptchaV3(\n\t\twebsiteURL: string,\n\t\twebsiteKey: string,\n\t\tpageAction: string,\n\t\tminScore = 0.7,\n\t\tproxy?: string,\n\t): Promise<string> {\n\t\tlogger.info(\"Solving reCAPTCHA v3\");\n\n\t\tconst task: CaptchaTask = {\n\t\t\ttype: proxy ? \"RecaptchaV3Task\" : \"RecaptchaV3TaskProxyless\",\n\t\t\twebsiteURL,\n\t\t\twebsiteKey,\n\t\t\tpageAction,\n\t\t\tminScore,\n\t\t};\n\n\t\tif (proxy) {\n\t\t\tconst proxyParts = proxy.split(\":\");\n\t\t\ttask.proxy = `${proxyParts[0]}:${proxyParts[1]}`;\n\t\t\tif (proxyParts.length > 2) {\n\t\t\t\ttask.proxyLogin = proxyParts[2];\n\t\t\t\ttask.proxyPassword = proxyParts[3];\n\t\t\t}\n\t\t}\n\n\t\tconst taskId = await this.createTask(task);\n\t\tconst solution = await this.getTaskResult(taskId);\n\n\t\treturn solution.gRecaptchaResponse ?? \"\";\n\t}\n\n\tasync solveHCaptcha(\n\t\twebsiteURL: string,\n\t\twebsiteKey: string,\n\t\tproxy?: string,\n\t): Promise<string> {\n\t\tlogger.info(\"Solving hCaptcha\");\n\n\t\tconst task: CaptchaTask = {\n\t\t\ttype: proxy ? \"HCaptchaTask\" : \"HCaptchaTaskProxyless\",\n\t\t\twebsiteURL,\n\t\t\twebsiteKey,\n\t\t};\n\n\t\tif (proxy) {\n\t\t\tconst proxyParts = proxy.split(\":\");\n\t\t\ttask.proxy = `${proxyParts[0]}:${proxyParts[1]}`;\n\t\t\tif (proxyParts.length > 2) {\n\t\t\t\ttask.proxyLogin = proxyParts[2];\n\t\t\t\ttask.proxyPassword = proxyParts[3];\n\t\t\t}\n\t\t}\n\n\t\tconst taskId = await this.createTask(task);\n\t\tconst solution = await this.getTaskResult(taskId);\n\n\t\treturn solution.token ?? \"\";\n\t}\n}\n\nexport async function detectCaptchaType(page: {\n\t$: (selector: string) => Promise<Element | null>;\n\tevaluate: <T>(fn: () => T) => Promise<T>;\n}): Promise<{\n\ttype: CaptchaType;\n\tsiteKey?: string;\n}> {\n\ttry {\n\t\tconst turnstileElement = await page.$(\"[data-sitekey]\");\n\t\tif (turnstileElement) {\n\t\t\tconst cfTurnstile = await page.$(\".cf-turnstile\");\n\t\t\tif (cfTurnstile) {\n\t\t\t\treturn { type: \"turnstile\" };\n\t\t\t}\n\t\t}\n\n\t\tconst recaptchaElement = await page.$(\"[data-sitekey], .g-recaptcha\");\n\t\tif (recaptchaElement) {\n\t\t\tconst isV3 = await page.evaluate(() => {\n\t\t\t\tconst grecaptcha = (\n\t\t\t\t\tglobalThis as typeof globalThis & {\n\t\t\t\t\t\tgrecaptcha?: { execute?: () => void };\n\t\t\t\t\t}\n\t\t\t\t).grecaptcha;\n\t\t\t\treturn typeof grecaptcha?.execute === \"function\";\n\t\t\t});\n\t\t\treturn { type: isV3 ? \"recaptcha-v3\" : \"recaptcha-v2\" };\n\t\t}\n\n\t\tconst hcaptchaElement = await page.$(\n\t\t\t\"[data-sitekey].h-captcha, [data-hcaptcha-sitekey]\",\n\t\t);\n\t\tif (hcaptchaElement) {\n\t\t\treturn { type: \"hcaptcha\" };\n\t\t}\n\n\t\treturn { type: \"none\" };\n\t} catch (error) {\n\t\tconst errorMessage = error instanceof Error ? error.message : String(error);\n\t\tlogger.error(`Error detecting CAPTCHA type: ${errorMessage}`);\n\t\treturn { type: \"none\" };\n\t}\n}\n\nexport async function injectCaptchaSolution(\n\tpage: {\n\t\tevaluate: <T>(fn: (token: string) => T, token: string) => Promise<T>;\n\t},\n\tcaptchaType: CaptchaType,\n\tsolution: string,\n): Promise<void> {\n\tswitch (captchaType) {\n\t\tcase \"turnstile\":\n\t\t\tawait page.evaluate((token: string) => {\n\t\t\t\tconst doc = globalThis as typeof globalThis & {\n\t\t\t\t\tdocument: Document;\n\t\t\t\t\tturnstileCallback?: (token: string) => void;\n\t\t\t\t};\n\t\t\t\tconst textarea = doc.document.querySelector(\n\t\t\t\t\t'[name=\"cf-turnstile-response\"]',\n\t\t\t\t) as HTMLTextAreaElement | null;\n\t\t\t\tif (textarea) {\n\t\t\t\t\ttextarea.value = token;\n\t\t\t\t}\n\t\t\t\tdoc.turnstileCallback?.(token);\n\t\t\t}, solution);\n\t\t\tbreak;\n\n\t\tcase \"recaptcha-v2\":\n\t\tcase \"recaptcha-v3\":\n\t\t\tawait page.evaluate((token: string) => {\n\t\t\t\tconst doc = globalThis as typeof globalThis & {\n\t\t\t\t\tdocument: Document;\n\t\t\t\t\tonRecaptchaSuccess?: (token: string) => void;\n\t\t\t\t};\n\t\t\t\tconst textarea = doc.document.querySelector(\n\t\t\t\t\t'[name=\"g-recaptcha-response\"]',\n\t\t\t\t) as HTMLTextAreaElement | null;\n\t\t\t\tif (textarea) {\n\t\t\t\t\ttextarea.value = token;\n\t\t\t\t\t(textarea as HTMLElement).style.display = \"block\";\n\t\t\t\t}\n\t\t\t\tdoc.onRecaptchaSuccess?.(token);\n\t\t\t}, solution);\n\t\t\tbreak;\n\n\t\tcase \"hcaptcha\":\n\t\t\tawait page.evaluate((token: string) => {\n\t\t\t\tconst doc = globalThis as typeof globalThis & {\n\t\t\t\t\tdocument: Document;\n\t\t\t\t\thcaptchaCallback?: (token: string) => void;\n\t\t\t\t};\n\t\t\t\tconst textarea = doc.document.querySelector(\n\t\t\t\t\t'[name=\"h-captcha-response\"]',\n\t\t\t\t) as HTMLTextAreaElement | null;\n\t\t\t\tif (textarea) {\n\t\t\t\t\ttextarea.value = token;\n\t\t\t\t}\n\t\t\t\tconst input = doc.document.querySelector(\n\t\t\t\t\t'[name=\"g-recaptcha-response\"]',\n\t\t\t\t) as HTMLInputElement | null;\n\t\t\t\tif (input) {\n\t\t\t\t\tinput.value = token;\n\t\t\t\t}\n\t\t\t\tdoc.hcaptchaCallback?.(token);\n\t\t\t}, solution);\n\t\t\tbreak;\n\t}\n}\n"]}
|
package/dist/utils/errors.d.ts
DELETED
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
export type ErrorCode = "SERVICE_NOT_AVAILABLE" | "SESSION_ERROR" | "NAVIGATION_ERROR" | "ACTION_ERROR" | "SECURITY_ERROR" | "CAPTCHA_ERROR" | "TIMEOUT_ERROR" | "NO_URL_FOUND";
|
|
2
|
-
export declare class BrowserError extends Error {
|
|
3
|
-
readonly code: ErrorCode;
|
|
4
|
-
readonly userMessage: string;
|
|
5
|
-
readonly recoverable: boolean;
|
|
6
|
-
readonly details?: Record<string, unknown>;
|
|
7
|
-
constructor(message: string, code: ErrorCode, userMessage: string, recoverable?: boolean, details?: Record<string, unknown>);
|
|
8
|
-
}
|
|
9
|
-
export declare class ServiceNotAvailableError extends BrowserError {
|
|
10
|
-
constructor();
|
|
11
|
-
}
|
|
12
|
-
export declare class SessionError extends BrowserError {
|
|
13
|
-
constructor(message: string, details?: Record<string, unknown>);
|
|
14
|
-
}
|
|
15
|
-
export declare class NavigationError extends BrowserError {
|
|
16
|
-
constructor(url: string, originalError?: Error);
|
|
17
|
-
}
|
|
18
|
-
export declare class ActionError extends BrowserError {
|
|
19
|
-
constructor(action: string, target: string, originalError?: Error);
|
|
20
|
-
}
|
|
21
|
-
export declare class SecurityError extends BrowserError {
|
|
22
|
-
constructor(message: string, details?: Record<string, unknown>);
|
|
23
|
-
}
|
|
24
|
-
export declare class CaptchaError extends BrowserError {
|
|
25
|
-
constructor(message: string, details?: Record<string, unknown>);
|
|
26
|
-
}
|
|
27
|
-
export declare class TimeoutError extends BrowserError {
|
|
28
|
-
constructor(operation: string, timeoutMs: number);
|
|
29
|
-
}
|
|
30
|
-
export declare class NoUrlFoundError extends BrowserError {
|
|
31
|
-
constructor();
|
|
32
|
-
}
|
|
33
|
-
export declare function handleBrowserError(error: Error | BrowserError, callback?: (content: {
|
|
34
|
-
text: string;
|
|
35
|
-
error?: boolean;
|
|
36
|
-
}) => Promise<unknown>, action?: string): void;
|
|
37
|
-
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,SAAS,GAClB,uBAAuB,GACvB,eAAe,GACf,kBAAkB,GAClB,cAAc,GACd,gBAAgB,GAChB,eAAe,GACf,eAAe,GACf,cAAc,CAAC;AAElB,qBAAa,YAAa,SAAQ,KAAK;IACtC,SAAgB,IAAI,EAAE,SAAS,CAAC;IAChC,SAAgB,WAAW,EAAE,MAAM,CAAC;IACpC,SAAgB,WAAW,EAAE,OAAO,CAAC;IACrC,SAAgB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;gBAGjD,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,SAAS,EACf,WAAW,EAAE,MAAM,EACnB,WAAW,GAAE,OAAc,EAC3B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CASlC;AAED,qBAAa,wBAAyB,SAAQ,YAAY;;CASzD;AAED,qBAAa,YAAa,SAAQ,YAAY;gBACjC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAS9D;AAED,qBAAa,eAAgB,SAAQ,YAAY;gBACpC,GAAG,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,KAAK;CAa9C;AAED,qBAAa,WAAY,SAAQ,YAAY;gBAChC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,KAAK;CAajE;AAED,qBAAa,aAAc,SAAQ,YAAY;gBAClC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAS9D;AAED,qBAAa,YAAa,SAAQ,YAAY;gBACjC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAS9D;AAED,qBAAa,YAAa,SAAQ,YAAY;gBACjC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM;CAShD;AAED,qBAAa,eAAgB,SAAQ,YAAY;;CAShD;AAED,wBAAgB,kBAAkB,CACjC,KAAK,EAAE,KAAK,GAAG,YAAY,EAC3B,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,KAAK,OAAO,CAAC,OAAO,CAAC,EAC3E,MAAM,CAAC,EAAE,MAAM,GACb,IAAI,CAiBN"}
|
package/dist/utils/errors.js
DELETED
|
@@ -1,81 +0,0 @@
|
|
|
1
|
-
import { logger } from "@elizaos/core";
|
|
2
|
-
export class BrowserError extends Error {
|
|
3
|
-
code;
|
|
4
|
-
userMessage;
|
|
5
|
-
recoverable;
|
|
6
|
-
details;
|
|
7
|
-
constructor(message, code, userMessage, recoverable = true, details) {
|
|
8
|
-
super(message);
|
|
9
|
-
this.name = "BrowserError";
|
|
10
|
-
this.code = code;
|
|
11
|
-
this.userMessage = userMessage;
|
|
12
|
-
this.recoverable = recoverable;
|
|
13
|
-
this.details = details;
|
|
14
|
-
}
|
|
15
|
-
}
|
|
16
|
-
export class ServiceNotAvailableError extends BrowserError {
|
|
17
|
-
constructor() {
|
|
18
|
-
super("Browser service is not available", "SERVICE_NOT_AVAILABLE", "The browser automation service is not available. Please ensure the plugin is properly configured.", false);
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
export class SessionError extends BrowserError {
|
|
22
|
-
constructor(message, details) {
|
|
23
|
-
super(message, "SESSION_ERROR", "There was an error with the browser session. Please try again.", true, details);
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
export class NavigationError extends BrowserError {
|
|
27
|
-
constructor(url, originalError) {
|
|
28
|
-
const message = originalError
|
|
29
|
-
? `Failed to navigate to ${url}: ${originalError.message}`
|
|
30
|
-
: `Failed to navigate to ${url}`;
|
|
31
|
-
super(message, "NAVIGATION_ERROR", "I couldn't navigate to the requested page. Please check the URL and try again.", true, { url, originalError: originalError?.message });
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
export class ActionError extends BrowserError {
|
|
35
|
-
constructor(action, target, originalError) {
|
|
36
|
-
const message = originalError
|
|
37
|
-
? `Failed to ${action} on ${target}: ${originalError.message}`
|
|
38
|
-
: `Failed to ${action} on ${target}`;
|
|
39
|
-
super(message, "ACTION_ERROR", `I couldn't ${action} on the requested element. Please check if the element exists and try again.`, true, { action, target, originalError: originalError?.message });
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
export class SecurityError extends BrowserError {
|
|
43
|
-
constructor(message, details) {
|
|
44
|
-
super(message, "SECURITY_ERROR", "This action was blocked for security reasons.", false, details);
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
export class CaptchaError extends BrowserError {
|
|
48
|
-
constructor(message, details) {
|
|
49
|
-
super(message, "CAPTCHA_ERROR", "Failed to solve the CAPTCHA. Please try again.", true, details);
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
export class TimeoutError extends BrowserError {
|
|
53
|
-
constructor(operation, timeoutMs) {
|
|
54
|
-
super(`${operation} timed out after ${timeoutMs}ms`, "TIMEOUT_ERROR", `The operation timed out. Please try again.`, true, { operation, timeoutMs });
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
export class NoUrlFoundError extends BrowserError {
|
|
58
|
-
constructor() {
|
|
59
|
-
super("No URL found in message", "NO_URL_FOUND", "I couldn't find a URL in your request. Please provide a valid URL to navigate to.", false);
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
export function handleBrowserError(error, callback, action) {
|
|
63
|
-
if (error instanceof BrowserError) {
|
|
64
|
-
logger.error(`Browser error [${error.code}]:`, error.message);
|
|
65
|
-
void callback?.({
|
|
66
|
-
text: error.userMessage,
|
|
67
|
-
error: true,
|
|
68
|
-
});
|
|
69
|
-
}
|
|
70
|
-
else {
|
|
71
|
-
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
72
|
-
logger.error(`Unexpected browser error: ${errorMessage}`);
|
|
73
|
-
void callback?.({
|
|
74
|
-
text: action
|
|
75
|
-
? `I encountered an error while trying to ${action}. Please try again.`
|
|
76
|
-
: "I encountered an unexpected error. Please try again.",
|
|
77
|
-
error: true,
|
|
78
|
-
});
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
//# sourceMappingURL=errors.js.map
|
package/dist/utils/errors.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"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","sourcesContent":["import { logger } from \"@elizaos/core\";\n\nexport type ErrorCode =\n\t| \"SERVICE_NOT_AVAILABLE\"\n\t| \"SESSION_ERROR\"\n\t| \"NAVIGATION_ERROR\"\n\t| \"ACTION_ERROR\"\n\t| \"SECURITY_ERROR\"\n\t| \"CAPTCHA_ERROR\"\n\t| \"TIMEOUT_ERROR\"\n\t| \"NO_URL_FOUND\";\n\nexport class BrowserError extends Error {\n\tpublic readonly code: ErrorCode;\n\tpublic readonly userMessage: string;\n\tpublic readonly recoverable: boolean;\n\tpublic readonly details?: Record<string, unknown>;\n\n\tconstructor(\n\t\tmessage: string,\n\t\tcode: ErrorCode,\n\t\tuserMessage: string,\n\t\trecoverable: boolean = true,\n\t\tdetails?: Record<string, unknown>,\n\t) {\n\t\tsuper(message);\n\t\tthis.name = \"BrowserError\";\n\t\tthis.code = code;\n\t\tthis.userMessage = userMessage;\n\t\tthis.recoverable = recoverable;\n\t\tthis.details = details;\n\t}\n}\n\nexport class ServiceNotAvailableError extends BrowserError {\n\tconstructor() {\n\t\tsuper(\n\t\t\t\"Browser service is not available\",\n\t\t\t\"SERVICE_NOT_AVAILABLE\",\n\t\t\t\"The browser automation service is not available. Please ensure the plugin is properly configured.\",\n\t\t\tfalse,\n\t\t);\n\t}\n}\n\nexport class SessionError extends BrowserError {\n\tconstructor(message: string, details?: Record<string, unknown>) {\n\t\tsuper(\n\t\t\tmessage,\n\t\t\t\"SESSION_ERROR\",\n\t\t\t\"There was an error with the browser session. Please try again.\",\n\t\t\ttrue,\n\t\t\tdetails,\n\t\t);\n\t}\n}\n\nexport class NavigationError extends BrowserError {\n\tconstructor(url: string, originalError?: Error) {\n\t\tconst message = originalError\n\t\t\t? `Failed to navigate to ${url}: ${originalError.message}`\n\t\t\t: `Failed to navigate to ${url}`;\n\n\t\tsuper(\n\t\t\tmessage,\n\t\t\t\"NAVIGATION_ERROR\",\n\t\t\t\"I couldn't navigate to the requested page. Please check the URL and try again.\",\n\t\t\ttrue,\n\t\t\t{ url, originalError: originalError?.message },\n\t\t);\n\t}\n}\n\nexport class ActionError extends BrowserError {\n\tconstructor(action: string, target: string, originalError?: Error) {\n\t\tconst message = originalError\n\t\t\t? `Failed to ${action} on ${target}: ${originalError.message}`\n\t\t\t: `Failed to ${action} on ${target}`;\n\n\t\tsuper(\n\t\t\tmessage,\n\t\t\t\"ACTION_ERROR\",\n\t\t\t`I couldn't ${action} on the requested element. Please check if the element exists and try again.`,\n\t\t\ttrue,\n\t\t\t{ action, target, originalError: originalError?.message },\n\t\t);\n\t}\n}\n\nexport class SecurityError extends BrowserError {\n\tconstructor(message: string, details?: Record<string, unknown>) {\n\t\tsuper(\n\t\t\tmessage,\n\t\t\t\"SECURITY_ERROR\",\n\t\t\t\"This action was blocked for security reasons.\",\n\t\t\tfalse,\n\t\t\tdetails,\n\t\t);\n\t}\n}\n\nexport class CaptchaError extends BrowserError {\n\tconstructor(message: string, details?: Record<string, unknown>) {\n\t\tsuper(\n\t\t\tmessage,\n\t\t\t\"CAPTCHA_ERROR\",\n\t\t\t\"Failed to solve the CAPTCHA. Please try again.\",\n\t\t\ttrue,\n\t\t\tdetails,\n\t\t);\n\t}\n}\n\nexport class TimeoutError extends BrowserError {\n\tconstructor(operation: string, timeoutMs: number) {\n\t\tsuper(\n\t\t\t`${operation} timed out after ${timeoutMs}ms`,\n\t\t\t\"TIMEOUT_ERROR\",\n\t\t\t`The operation timed out. Please try again.`,\n\t\t\ttrue,\n\t\t\t{ operation, timeoutMs },\n\t\t);\n\t}\n}\n\nexport class NoUrlFoundError extends BrowserError {\n\tconstructor() {\n\t\tsuper(\n\t\t\t\"No URL found in message\",\n\t\t\t\"NO_URL_FOUND\",\n\t\t\t\"I couldn't find a URL in your request. Please provide a valid URL to navigate to.\",\n\t\t\tfalse,\n\t\t);\n\t}\n}\n\nexport function handleBrowserError(\n\terror: Error | BrowserError,\n\tcallback?: (content: { text: string; error?: boolean }) => Promise<unknown>,\n\taction?: string,\n): void {\n\tif (error instanceof BrowserError) {\n\t\tlogger.error(`Browser error [${error.code}]:`, error.message);\n\t\tvoid callback?.({\n\t\t\ttext: error.userMessage,\n\t\t\terror: true,\n\t\t});\n\t} else {\n\t\tconst errorMessage = error instanceof Error ? error.message : String(error);\n\t\tlogger.error(`Unexpected browser error: ${errorMessage}`);\n\t\tvoid callback?.({\n\t\t\ttext: action\n\t\t\t\t? `I encountered an error while trying to ${action}. Please try again.`\n\t\t\t\t: \"I encountered an unexpected error. Please try again.\",\n\t\t\terror: true,\n\t\t});\n\t}\n}\n"]}
|
package/dist/utils/index.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,UAAU,CAAC"}
|
package/dist/utils/index.js
DELETED
package/dist/utils/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,UAAU,CAAC","sourcesContent":["export * from \"./errors.js\";\nexport * from \"./retry.js\";\nexport * from \"./security.js\";\nexport * from \"./url.js\";\n"]}
|
package/dist/utils/retry.d.ts
DELETED
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
import type { RetryConfig } from "../types.js";
|
|
2
|
-
export declare const DEFAULT_RETRY_CONFIGS: {
|
|
3
|
-
navigation: {
|
|
4
|
-
maxAttempts: number;
|
|
5
|
-
initialDelayMs: number;
|
|
6
|
-
maxDelayMs: number;
|
|
7
|
-
backoffMultiplier: number;
|
|
8
|
-
};
|
|
9
|
-
action: {
|
|
10
|
-
maxAttempts: number;
|
|
11
|
-
initialDelayMs: number;
|
|
12
|
-
maxDelayMs: number;
|
|
13
|
-
backoffMultiplier: number;
|
|
14
|
-
};
|
|
15
|
-
extraction: {
|
|
16
|
-
maxAttempts: number;
|
|
17
|
-
initialDelayMs: number;
|
|
18
|
-
maxDelayMs: number;
|
|
19
|
-
backoffMultiplier: number;
|
|
20
|
-
};
|
|
21
|
-
};
|
|
22
|
-
export declare function retryWithBackoff<T>(fn: () => Promise<T>, config: Partial<RetryConfig> & {
|
|
23
|
-
timeout?: number;
|
|
24
|
-
}, operation: string): Promise<T>;
|
|
25
|
-
export declare function sleep(ms: number): Promise<void>;
|
|
26
|
-
//# sourceMappingURL=retry.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"retry.d.ts","sourceRoot":"","sources":["../../src/utils/retry.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;CAmBK,CAAC;AAExC,wBAAsB,gBAAgB,CAAC,CAAC,EACvC,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,MAAM,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG;IAAE,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,EACnD,SAAS,EAAE,MAAM,GACf,OAAO,CAAC,CAAC,CAAC,CAiDZ;AAED,wBAAgB,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE/C"}
|
package/dist/utils/retry.js
DELETED
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
import { logger } from "@elizaos/core";
|
|
2
|
-
export const DEFAULT_RETRY_CONFIGS = {
|
|
3
|
-
navigation: {
|
|
4
|
-
maxAttempts: 3,
|
|
5
|
-
initialDelayMs: 1000,
|
|
6
|
-
maxDelayMs: 5000,
|
|
7
|
-
backoffMultiplier: 2,
|
|
8
|
-
},
|
|
9
|
-
action: {
|
|
10
|
-
maxAttempts: 2,
|
|
11
|
-
initialDelayMs: 500,
|
|
12
|
-
maxDelayMs: 2000,
|
|
13
|
-
backoffMultiplier: 1.5,
|
|
14
|
-
},
|
|
15
|
-
extraction: {
|
|
16
|
-
maxAttempts: 2,
|
|
17
|
-
initialDelayMs: 500,
|
|
18
|
-
maxDelayMs: 3000,
|
|
19
|
-
backoffMultiplier: 2,
|
|
20
|
-
},
|
|
21
|
-
};
|
|
22
|
-
export async function retryWithBackoff(fn, config, operation) {
|
|
23
|
-
const maxAttempts = config.maxAttempts ?? 3;
|
|
24
|
-
const initialDelay = config.initialDelayMs ?? 1000;
|
|
25
|
-
const maxDelay = config.maxDelayMs ?? 5000;
|
|
26
|
-
const backoffMultiplier = config.backoffMultiplier ?? 2;
|
|
27
|
-
let lastError;
|
|
28
|
-
let delay = initialDelay;
|
|
29
|
-
for (let attempt = 1; attempt <= maxAttempts; attempt++) {
|
|
30
|
-
try {
|
|
31
|
-
logger.info(`Attempting ${operation} (attempt ${attempt}/${maxAttempts})`);
|
|
32
|
-
if (config.timeout) {
|
|
33
|
-
const timeoutPromise = new Promise((_, reject) => setTimeout(() => reject(new Error(`${operation} timed out after ${config.timeout}ms`)), config.timeout));
|
|
34
|
-
return await Promise.race([fn(), timeoutPromise]);
|
|
35
|
-
}
|
|
36
|
-
return await fn();
|
|
37
|
-
}
|
|
38
|
-
catch (error) {
|
|
39
|
-
lastError = error;
|
|
40
|
-
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
41
|
-
logger.warn(`${operation} failed (attempt ${attempt}/${maxAttempts}): ${errorMessage}`);
|
|
42
|
-
if (attempt < maxAttempts) {
|
|
43
|
-
logger.info(`Retrying ${operation} in ${delay}ms...`);
|
|
44
|
-
await new Promise((resolve) => setTimeout(resolve, delay));
|
|
45
|
-
delay = Math.min(delay * backoffMultiplier, maxDelay);
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
logger.error(`${operation} failed after ${maxAttempts} attempts`);
|
|
50
|
-
throw (lastError ?? new Error(`${operation} failed after ${maxAttempts} attempts`));
|
|
51
|
-
}
|
|
52
|
-
export function sleep(ms) {
|
|
53
|
-
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
54
|
-
}
|
|
55
|
-
//# sourceMappingURL=retry.js.map
|
package/dist/utils/retry.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"retry.js","sourceRoot":"","sources":["../../src/utils/retry.ts"],"names":[],"mappings":"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","sourcesContent":["import { logger } from \"@elizaos/core\";\nimport type { RetryConfig } from \"../types.js\";\n\nexport const DEFAULT_RETRY_CONFIGS = {\n\tnavigation: {\n\t\tmaxAttempts: 3,\n\t\tinitialDelayMs: 1000,\n\t\tmaxDelayMs: 5000,\n\t\tbackoffMultiplier: 2,\n\t},\n\taction: {\n\t\tmaxAttempts: 2,\n\t\tinitialDelayMs: 500,\n\t\tmaxDelayMs: 2000,\n\t\tbackoffMultiplier: 1.5,\n\t},\n\textraction: {\n\t\tmaxAttempts: 2,\n\t\tinitialDelayMs: 500,\n\t\tmaxDelayMs: 3000,\n\t\tbackoffMultiplier: 2,\n\t},\n} satisfies Record<string, RetryConfig>;\n\nexport async function retryWithBackoff<T>(\n\tfn: () => Promise<T>,\n\tconfig: Partial<RetryConfig> & { timeout?: number },\n\toperation: string,\n): Promise<T> {\n\tconst maxAttempts = config.maxAttempts ?? 3;\n\tconst initialDelay = config.initialDelayMs ?? 1000;\n\tconst maxDelay = config.maxDelayMs ?? 5000;\n\tconst backoffMultiplier = config.backoffMultiplier ?? 2;\n\n\tlet lastError: Error | undefined;\n\tlet delay = initialDelay;\n\n\tfor (let attempt = 1; attempt <= maxAttempts; attempt++) {\n\t\ttry {\n\t\t\tlogger.info(\n\t\t\t\t`Attempting ${operation} (attempt ${attempt}/${maxAttempts})`,\n\t\t\t);\n\n\t\t\tif (config.timeout) {\n\t\t\t\tconst timeoutPromise = new Promise<never>((_, reject) =>\n\t\t\t\t\tsetTimeout(\n\t\t\t\t\t\t() =>\n\t\t\t\t\t\t\treject(\n\t\t\t\t\t\t\t\tnew Error(`${operation} timed out after ${config.timeout}ms`),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\tconfig.timeout,\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t\treturn await Promise.race([fn(), timeoutPromise]);\n\t\t\t}\n\n\t\t\treturn await fn();\n\t\t} catch (error) {\n\t\t\tlastError = error as Error;\n\t\t\tconst errorMessage =\n\t\t\t\terror instanceof Error ? error.message : String(error);\n\t\t\tlogger.warn(\n\t\t\t\t`${operation} failed (attempt ${attempt}/${maxAttempts}): ${errorMessage}`,\n\t\t\t);\n\n\t\t\tif (attempt < maxAttempts) {\n\t\t\t\tlogger.info(`Retrying ${operation} in ${delay}ms...`);\n\t\t\t\tawait new Promise((resolve) => setTimeout(resolve, delay));\n\t\t\t\tdelay = Math.min(delay * backoffMultiplier, maxDelay);\n\t\t\t}\n\t\t}\n\t}\n\n\tlogger.error(`${operation} failed after ${maxAttempts} attempts`);\n\tthrow (\n\t\tlastError ?? new Error(`${operation} failed after ${maxAttempts} attempts`)\n\t);\n}\n\nexport function sleep(ms: number): Promise<void> {\n\treturn new Promise((resolve) => setTimeout(resolve, ms));\n}\n"]}
|
package/dist/utils/security.d.ts
DELETED
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
import type { RateLimitConfig, SecurityConfig } from "../types.js";
|
|
2
|
-
export declare class UrlValidator {
|
|
3
|
-
private config;
|
|
4
|
-
constructor(config?: Partial<SecurityConfig>);
|
|
5
|
-
validate(url: string): {
|
|
6
|
-
valid: boolean;
|
|
7
|
-
sanitized?: string;
|
|
8
|
-
error?: string;
|
|
9
|
-
};
|
|
10
|
-
updateConfig(config: Partial<SecurityConfig>): void;
|
|
11
|
-
}
|
|
12
|
-
export declare const InputSanitizer: {
|
|
13
|
-
sanitizeText(input: string): string;
|
|
14
|
-
sanitizeSelector(selector: string): string;
|
|
15
|
-
sanitizeFilePath(path: string): string;
|
|
16
|
-
};
|
|
17
|
-
export declare function validateSecureAction(url: string | null, validator: UrlValidator): void;
|
|
18
|
-
export declare const defaultUrlValidator: UrlValidator;
|
|
19
|
-
export declare class RateLimiter {
|
|
20
|
-
private config;
|
|
21
|
-
private actionCounts;
|
|
22
|
-
private sessionCounts;
|
|
23
|
-
constructor(config: RateLimitConfig);
|
|
24
|
-
checkActionLimit(userId: string): boolean;
|
|
25
|
-
checkSessionLimit(userId: string): boolean;
|
|
26
|
-
}
|
|
27
|
-
//# sourceMappingURL=security.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"security.d.ts","sourceRoot":"","sources":["../../src/utils/security.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACX,eAAe,EAEf,cAAc,EACd,MAAM,aAAa,CAAC;AAWrB,qBAAa,YAAY;IACxB,OAAO,CAAC,MAAM,CAA2B;gBAE7B,MAAM,GAAE,OAAO,CAAC,cAAc,CAAM;IAIhD,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG;QACtB,KAAK,EAAE,OAAO,CAAC;QACf,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,KAAK,CAAC,EAAE,MAAM,CAAC;KACf;IA2DD,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG,IAAI;CAGnD;AAED,eAAO,MAAM,cAAc;wBACN,MAAM,GAAG,MAAM;+BAQR,MAAM,GAAG,MAAM;2BAInB,MAAM,GAAG,MAAM;CAMtC,CAAC;AAEF,wBAAgB,oBAAoB,CACnC,GAAG,EAAE,MAAM,GAAG,IAAI,EAClB,SAAS,EAAE,YAAY,GACrB,IAAI,CAYN;AAED,eAAO,MAAM,mBAAmB,cAAqB,CAAC;AAEtD,qBAAa,WAAW;IAIX,OAAO,CAAC,MAAM;IAH1B,OAAO,CAAC,YAAY,CAAqC;IACzD,OAAO,CAAC,aAAa,CAAqC;gBAEtC,MAAM,EAAE,eAAe;IAE3C,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAoBzC,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;CAmB1C"}
|
package/dist/utils/security.js
DELETED
|
@@ -1,139 +0,0 @@
|
|
|
1
|
-
import { SecurityError } from "./errors.js";
|
|
2
|
-
const DEFAULT_SECURITY_CONFIG = {
|
|
3
|
-
allowedDomains: [],
|
|
4
|
-
blockedDomains: ["malware.com", "phishing.com"],
|
|
5
|
-
maxUrlLength: 2048,
|
|
6
|
-
allowLocalhost: true,
|
|
7
|
-
allowFileProtocol: false,
|
|
8
|
-
};
|
|
9
|
-
export class UrlValidator {
|
|
10
|
-
config;
|
|
11
|
-
constructor(config = {}) {
|
|
12
|
-
this.config = { ...DEFAULT_SECURITY_CONFIG, ...config };
|
|
13
|
-
}
|
|
14
|
-
validate(url) {
|
|
15
|
-
try {
|
|
16
|
-
if (url.length > this.config.maxUrlLength) {
|
|
17
|
-
return { valid: false, error: "URL is too long" };
|
|
18
|
-
}
|
|
19
|
-
let parsedUrl;
|
|
20
|
-
try {
|
|
21
|
-
parsedUrl = new URL(url);
|
|
22
|
-
}
|
|
23
|
-
catch {
|
|
24
|
-
if (!url.startsWith("http://") && !url.startsWith("https://")) {
|
|
25
|
-
try {
|
|
26
|
-
parsedUrl = new URL(`https://${url}`);
|
|
27
|
-
}
|
|
28
|
-
catch {
|
|
29
|
-
return { valid: false, error: "Invalid URL format" };
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
else {
|
|
33
|
-
return { valid: false, error: "Invalid URL format" };
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
if (parsedUrl.protocol === "file:" && !this.config.allowFileProtocol) {
|
|
37
|
-
return { valid: false, error: "File protocol is not allowed" };
|
|
38
|
-
}
|
|
39
|
-
if (!["http:", "https:", "file:"].includes(parsedUrl.protocol)) {
|
|
40
|
-
return { valid: false, error: "Only HTTP(S) protocols are allowed" };
|
|
41
|
-
}
|
|
42
|
-
const isLocalhost = ["localhost", "127.0.0.1", "::1"].includes(parsedUrl.hostname);
|
|
43
|
-
if (isLocalhost && !this.config.allowLocalhost) {
|
|
44
|
-
return { valid: false, error: "Localhost URLs are not allowed" };
|
|
45
|
-
}
|
|
46
|
-
for (const blocked of this.config.blockedDomains) {
|
|
47
|
-
if (parsedUrl.hostname.includes(blocked)) {
|
|
48
|
-
return { valid: false, error: `Domain ${blocked} is blocked` };
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
if (this.config.allowedDomains.length > 0) {
|
|
52
|
-
const isAllowed = this.config.allowedDomains.some((allowed) => parsedUrl.hostname === allowed ||
|
|
53
|
-
parsedUrl.hostname.endsWith(`.${allowed}`));
|
|
54
|
-
if (!isAllowed) {
|
|
55
|
-
return { valid: false, error: "Domain is not in the allowed list" };
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
return { valid: true, sanitized: parsedUrl.href };
|
|
59
|
-
}
|
|
60
|
-
catch {
|
|
61
|
-
return { valid: false, error: "Error validating URL" };
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
updateConfig(config) {
|
|
65
|
-
this.config = { ...this.config, ...config };
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
export const InputSanitizer = {
|
|
69
|
-
sanitizeText(input) {
|
|
70
|
-
return input
|
|
71
|
-
.replace(/[<>]/g, "")
|
|
72
|
-
.replace(/javascript:/gi, "")
|
|
73
|
-
.replace(/on\w+\s*=/gi, "")
|
|
74
|
-
.trim();
|
|
75
|
-
},
|
|
76
|
-
sanitizeSelector(selector) {
|
|
77
|
-
return selector.replace(/['"]/g, "").replace(/[<>]/g, "").trim();
|
|
78
|
-
},
|
|
79
|
-
sanitizeFilePath(path) {
|
|
80
|
-
return path
|
|
81
|
-
.replace(/\.\./g, "")
|
|
82
|
-
.replace(/[<>:"|?*]/g, "")
|
|
83
|
-
.trim();
|
|
84
|
-
},
|
|
85
|
-
};
|
|
86
|
-
export function validateSecureAction(url, validator) {
|
|
87
|
-
if (!url) {
|
|
88
|
-
return;
|
|
89
|
-
}
|
|
90
|
-
const validation = validator.validate(url);
|
|
91
|
-
if (!validation.valid) {
|
|
92
|
-
throw new SecurityError(`URL validation failed: ${validation.error}`, {
|
|
93
|
-
url,
|
|
94
|
-
error: validation.error,
|
|
95
|
-
});
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
export const defaultUrlValidator = new UrlValidator();
|
|
99
|
-
export class RateLimiter {
|
|
100
|
-
config;
|
|
101
|
-
actionCounts = new Map();
|
|
102
|
-
sessionCounts = new Map();
|
|
103
|
-
constructor(config) {
|
|
104
|
-
this.config = config;
|
|
105
|
-
}
|
|
106
|
-
checkActionLimit(userId) {
|
|
107
|
-
const now = Date.now();
|
|
108
|
-
const userLimit = this.actionCounts.get(userId);
|
|
109
|
-
if (!userLimit || now > userLimit.resetTime) {
|
|
110
|
-
this.actionCounts.set(userId, {
|
|
111
|
-
count: 1,
|
|
112
|
-
resetTime: now + 60000,
|
|
113
|
-
});
|
|
114
|
-
return true;
|
|
115
|
-
}
|
|
116
|
-
if (userLimit.count >= this.config.maxActionsPerMinute) {
|
|
117
|
-
return false;
|
|
118
|
-
}
|
|
119
|
-
userLimit.count++;
|
|
120
|
-
return true;
|
|
121
|
-
}
|
|
122
|
-
checkSessionLimit(userId) {
|
|
123
|
-
const now = Date.now();
|
|
124
|
-
const userLimit = this.sessionCounts.get(userId);
|
|
125
|
-
if (!userLimit || now > userLimit.resetTime) {
|
|
126
|
-
this.sessionCounts.set(userId, {
|
|
127
|
-
count: 1,
|
|
128
|
-
resetTime: now + 3600000,
|
|
129
|
-
});
|
|
130
|
-
return true;
|
|
131
|
-
}
|
|
132
|
-
if (userLimit.count >= this.config.maxSessionsPerHour) {
|
|
133
|
-
return false;
|
|
134
|
-
}
|
|
135
|
-
userLimit.count++;
|
|
136
|
-
return true;
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
//# sourceMappingURL=security.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"security.js","sourceRoot":"","sources":["../../src/utils/security.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n\tRateLimitConfig,\n\tRateLimitEntry,\n\tSecurityConfig,\n} from \"../types.js\";\nimport { SecurityError } from \"./errors.js\";\n\nconst DEFAULT_SECURITY_CONFIG: Required<SecurityConfig> = {\n\tallowedDomains: [],\n\tblockedDomains: [\"malware.com\", \"phishing.com\"],\n\tmaxUrlLength: 2048,\n\tallowLocalhost: true,\n\tallowFileProtocol: false,\n};\n\nexport class UrlValidator {\n\tprivate config: Required<SecurityConfig>;\n\n\tconstructor(config: Partial<SecurityConfig> = {}) {\n\t\tthis.config = { ...DEFAULT_SECURITY_CONFIG, ...config };\n\t}\n\n\tvalidate(url: string): {\n\t\tvalid: boolean;\n\t\tsanitized?: string;\n\t\terror?: string;\n\t} {\n\t\ttry {\n\t\t\tif (url.length > this.config.maxUrlLength) {\n\t\t\t\treturn { valid: false, error: \"URL is too long\" };\n\t\t\t}\n\n\t\t\tlet parsedUrl: URL;\n\t\t\ttry {\n\t\t\t\tparsedUrl = new URL(url);\n\t\t\t} catch {\n\t\t\t\tif (!url.startsWith(\"http://\") && !url.startsWith(\"https://\")) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tparsedUrl = new URL(`https://${url}`);\n\t\t\t\t\t} catch {\n\t\t\t\t\t\treturn { valid: false, error: \"Invalid URL format\" };\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\treturn { valid: false, error: \"Invalid URL format\" };\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (parsedUrl.protocol === \"file:\" && !this.config.allowFileProtocol) {\n\t\t\t\treturn { valid: false, error: \"File protocol is not allowed\" };\n\t\t\t}\n\n\t\t\tif (![\"http:\", \"https:\", \"file:\"].includes(parsedUrl.protocol)) {\n\t\t\t\treturn { valid: false, error: \"Only HTTP(S) protocols are allowed\" };\n\t\t\t}\n\n\t\t\tconst isLocalhost = [\"localhost\", \"127.0.0.1\", \"::1\"].includes(\n\t\t\t\tparsedUrl.hostname,\n\t\t\t);\n\t\t\tif (isLocalhost && !this.config.allowLocalhost) {\n\t\t\t\treturn { valid: false, error: \"Localhost URLs are not allowed\" };\n\t\t\t}\n\n\t\t\tfor (const blocked of this.config.blockedDomains) {\n\t\t\t\tif (parsedUrl.hostname.includes(blocked)) {\n\t\t\t\t\treturn { valid: false, error: `Domain ${blocked} is blocked` };\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (this.config.allowedDomains.length > 0) {\n\t\t\t\tconst isAllowed = this.config.allowedDomains.some(\n\t\t\t\t\t(allowed) =>\n\t\t\t\t\t\tparsedUrl.hostname === allowed ||\n\t\t\t\t\t\tparsedUrl.hostname.endsWith(`.${allowed}`),\n\t\t\t\t);\n\t\t\t\tif (!isAllowed) {\n\t\t\t\t\treturn { valid: false, error: \"Domain is not in the allowed list\" };\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn { valid: true, sanitized: parsedUrl.href };\n\t\t} catch {\n\t\t\treturn { valid: false, error: \"Error validating URL\" };\n\t\t}\n\t}\n\n\tupdateConfig(config: Partial<SecurityConfig>): void {\n\t\tthis.config = { ...this.config, ...config };\n\t}\n}\n\nexport const InputSanitizer = {\n\tsanitizeText(input: string): string {\n\t\treturn input\n\t\t\t.replace(/[<>]/g, \"\")\n\t\t\t.replace(/javascript:/gi, \"\")\n\t\t\t.replace(/on\\w+\\s*=/gi, \"\")\n\t\t\t.trim();\n\t},\n\n\tsanitizeSelector(selector: string): string {\n\t\treturn selector.replace(/['\"]/g, \"\").replace(/[<>]/g, \"\").trim();\n\t},\n\n\tsanitizeFilePath(path: string): string {\n\t\treturn path\n\t\t\t.replace(/\\.\\./g, \"\")\n\t\t\t.replace(/[<>:\"|?*]/g, \"\")\n\t\t\t.trim();\n\t},\n};\n\nexport function validateSecureAction(\n\turl: string | null,\n\tvalidator: UrlValidator,\n): void {\n\tif (!url) {\n\t\treturn;\n\t}\n\n\tconst validation = validator.validate(url);\n\tif (!validation.valid) {\n\t\tthrow new SecurityError(`URL validation failed: ${validation.error}`, {\n\t\t\turl,\n\t\t\terror: validation.error,\n\t\t});\n\t}\n}\n\nexport const defaultUrlValidator = new UrlValidator();\n\nexport class RateLimiter {\n\tprivate actionCounts = new Map<string, RateLimitEntry>();\n\tprivate sessionCounts = new Map<string, RateLimitEntry>();\n\n\tconstructor(private config: RateLimitConfig) {}\n\n\tcheckActionLimit(userId: string): boolean {\n\t\tconst now = Date.now();\n\t\tconst userLimit = this.actionCounts.get(userId);\n\n\t\tif (!userLimit || now > userLimit.resetTime) {\n\t\t\tthis.actionCounts.set(userId, {\n\t\t\t\tcount: 1,\n\t\t\t\tresetTime: now + 60000,\n\t\t\t});\n\t\t\treturn true;\n\t\t}\n\n\t\tif (userLimit.count >= this.config.maxActionsPerMinute) {\n\t\t\treturn false;\n\t\t}\n\n\t\tuserLimit.count++;\n\t\treturn true;\n\t}\n\n\tcheckSessionLimit(userId: string): boolean {\n\t\tconst now = Date.now();\n\t\tconst userLimit = this.sessionCounts.get(userId);\n\n\t\tif (!userLimit || now > userLimit.resetTime) {\n\t\t\tthis.sessionCounts.set(userId, {\n\t\t\t\tcount: 1,\n\t\t\t\tresetTime: now + 3600000,\n\t\t\t});\n\t\t\treturn true;\n\t\t}\n\n\t\tif (userLimit.count >= this.config.maxSessionsPerHour) {\n\t\t\treturn false;\n\t\t}\n\n\t\tuserLimit.count++;\n\t\treturn true;\n\t}\n}\n"]}
|
package/dist/utils/url.d.ts
DELETED
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
export declare function extractUrl(text: string): string | null;
|
|
2
|
-
export declare function parseClickTarget(text: string): string;
|
|
3
|
-
export declare function parseTypeAction(text: string): {
|
|
4
|
-
text: string;
|
|
5
|
-
field: string;
|
|
6
|
-
};
|
|
7
|
-
export declare function parseSelectAction(text: string): {
|
|
8
|
-
option: string;
|
|
9
|
-
dropdown: string;
|
|
10
|
-
};
|
|
11
|
-
export declare function parseExtractInstruction(text: string): string;
|
|
12
|
-
//# sourceMappingURL=url.d.ts.map
|
package/dist/utils/url.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"url.d.ts","sourceRoot":"","sources":["../../src/utils/url.ts"],"names":[],"mappings":"AAAA,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAsBtD;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAGrD;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAQ7E;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG;IAChD,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CACjB,CAQA;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAK5D"}
|
package/dist/utils/url.js
DELETED
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
export function extractUrl(text) {
|
|
2
|
-
const quotedUrlMatch = text.match(/["']([^"']+)["']/);
|
|
3
|
-
if (quotedUrlMatch &&
|
|
4
|
-
(quotedUrlMatch[1].startsWith("http") || quotedUrlMatch[1].includes("."))) {
|
|
5
|
-
return quotedUrlMatch[1];
|
|
6
|
-
}
|
|
7
|
-
const urlMatch = text.match(/(https?:\/\/[^\s]+)/);
|
|
8
|
-
if (urlMatch) {
|
|
9
|
-
return urlMatch[1];
|
|
10
|
-
}
|
|
11
|
-
const domainMatch = text.match(/(?:go to|navigate to|open|visit)\s+([a-zA-Z0-9][a-zA-Z0-9-]{0,61}[a-zA-Z0-9]?\.[a-zA-Z]{2,})/i);
|
|
12
|
-
if (domainMatch) {
|
|
13
|
-
return `https://${domainMatch[1]}`;
|
|
14
|
-
}
|
|
15
|
-
return null;
|
|
16
|
-
}
|
|
17
|
-
export function parseClickTarget(text) {
|
|
18
|
-
const match = text.match(/click (?:on |the )?(.+)$/i);
|
|
19
|
-
return match ? match[1] : "element";
|
|
20
|
-
}
|
|
21
|
-
export function parseTypeAction(text) {
|
|
22
|
-
const textMatch = text.match(/["']([^"']+)["']/);
|
|
23
|
-
const textToType = textMatch ? textMatch[1] : "";
|
|
24
|
-
const fieldMatch = text.match(/(?:in|into) (?:the )?(.+)$/i);
|
|
25
|
-
const field = fieldMatch ? fieldMatch[1] : "input field";
|
|
26
|
-
return { text: textToType, field };
|
|
27
|
-
}
|
|
28
|
-
export function parseSelectAction(text) {
|
|
29
|
-
const optionMatch = text.match(/["']([^"']+)["']/);
|
|
30
|
-
const option = optionMatch ? optionMatch[1] : "";
|
|
31
|
-
const dropdownMatch = text.match(/from (?:the )?(.+)$/i);
|
|
32
|
-
const dropdown = dropdownMatch ? dropdownMatch[1] : "dropdown";
|
|
33
|
-
return { option, dropdown };
|
|
34
|
-
}
|
|
35
|
-
export function parseExtractInstruction(text) {
|
|
36
|
-
const match = text.match(/(?:extract|get|find|scrape|read) (?:the )?(.+?)(?:\s+from|\s*$)/i);
|
|
37
|
-
return match ? match[1] : text;
|
|
38
|
-
}
|
|
39
|
-
//# sourceMappingURL=url.js.map
|
package/dist/utils/url.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"url.js","sourceRoot":"","sources":["../../src/utils/url.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,UAAU,CAAC,IAAY;IACtC,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;IACtD,IACC,cAAc;QACd,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,cAAc,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EACxE,CAAC;QACF,OAAO,cAAc,CAAC,CAAC,CAAC,CAAC;IAC1B,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;IACnD,IAAI,QAAQ,EAAE,CAAC;QACd,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;IAED,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAC7B,+FAA+F,CAC/F,CAAC;IACF,IAAI,WAAW,EAAE,CAAC;QACjB,OAAO,WAAW,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC;IACpC,CAAC;IAED,OAAO,IAAI,CAAC;AACb,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC5C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC;IACtD,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,IAAY;IAC3C,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;IACjD,MAAM,UAAU,GAAG,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAEjD,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;IAC7D,MAAM,KAAK,GAAG,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC;IAEzD,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAI7C,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;IACnD,MAAM,MAAM,GAAG,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAEjD,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;IACzD,MAAM,QAAQ,GAAG,aAAa,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC;IAE/D,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,IAAY;IACnD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CACvB,kEAAkE,CAClE,CAAC;IACF,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAChC,CAAC","sourcesContent":["export function extractUrl(text: string): string | null {\n\tconst quotedUrlMatch = text.match(/[\"']([^\"']+)[\"']/);\n\tif (\n\t\tquotedUrlMatch &&\n\t\t(quotedUrlMatch[1].startsWith(\"http\") || quotedUrlMatch[1].includes(\".\"))\n\t) {\n\t\treturn quotedUrlMatch[1];\n\t}\n\n\tconst urlMatch = text.match(/(https?:\\/\\/[^\\s]+)/);\n\tif (urlMatch) {\n\t\treturn urlMatch[1];\n\t}\n\n\tconst domainMatch = text.match(\n\t\t/(?:go to|navigate to|open|visit)\\s+([a-zA-Z0-9][a-zA-Z0-9-]{0,61}[a-zA-Z0-9]?\\.[a-zA-Z]{2,})/i,\n\t);\n\tif (domainMatch) {\n\t\treturn `https://${domainMatch[1]}`;\n\t}\n\n\treturn null;\n}\n\nexport function parseClickTarget(text: string): string {\n\tconst match = text.match(/click (?:on |the )?(.+)$/i);\n\treturn match ? match[1] : \"element\";\n}\n\nexport function parseTypeAction(text: string): { text: string; field: string } {\n\tconst textMatch = text.match(/[\"']([^\"']+)[\"']/);\n\tconst textToType = textMatch ? textMatch[1] : \"\";\n\n\tconst fieldMatch = text.match(/(?:in|into) (?:the )?(.+)$/i);\n\tconst field = fieldMatch ? fieldMatch[1] : \"input field\";\n\n\treturn { text: textToType, field };\n}\n\nexport function parseSelectAction(text: string): {\n\toption: string;\n\tdropdown: string;\n} {\n\tconst optionMatch = text.match(/[\"']([^\"']+)[\"']/);\n\tconst option = optionMatch ? optionMatch[1] : \"\";\n\n\tconst dropdownMatch = text.match(/from (?:the )?(.+)$/i);\n\tconst dropdown = dropdownMatch ? dropdownMatch[1] : \"dropdown\";\n\n\treturn { option, dropdown };\n}\n\nexport function parseExtractInstruction(text: string): string {\n\tconst match = text.match(\n\t\t/(?:extract|get|find|scrape|read) (?:the )?(.+?)(?:\\s+from|\\s*$)/i,\n\t);\n\treturn match ? match[1] : text;\n}\n"]}
|