@elizaos/plugin-browser 2.0.0-alpha.7 → 2.0.0-alpha.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/actions/click.d.ts.map +1 -1
- package/dist/actions/click.js +35 -8
- package/dist/actions/click.js.map +1 -1
- package/dist/actions/extract.d.ts.map +1 -1
- package/dist/actions/extract.js +39 -12
- package/dist/actions/extract.js.map +1 -1
- package/dist/actions/navigate.d.ts.map +1 -1
- package/dist/actions/navigate.js +36 -9
- package/dist/actions/navigate.js.map +1 -1
- package/dist/actions/screenshot.d.ts.map +1 -1
- package/dist/actions/screenshot.js +37 -8
- package/dist/actions/screenshot.js.map +1 -1
- package/dist/actions/select.d.ts.map +1 -1
- package/dist/actions/select.js +40 -9
- package/dist/actions/select.js.map +1 -1
- package/dist/actions/type.d.ts.map +1 -1
- package/dist/actions/type.js +40 -9
- package/dist/actions/type.js.map +1 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/register.d.ts.map +1 -1
- package/dist/cli/register.js +5 -1
- package/dist/cli/register.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -48
- package/dist/index.js.map +1 -1
- package/dist/providerRelevance.d.ts +4 -0
- package/dist/providerRelevance.d.ts.map +1 -0
- package/dist/providerRelevance.js +33 -0
- package/dist/providerRelevance.js.map +1 -0
- package/dist/providers/browser-state.d.ts.map +1 -1
- package/dist/providers/browser-state.js +25 -0
- package/dist/providers/browser-state.js.map +1 -1
- package/dist/services/browser-service.d.ts.map +1 -1
- package/dist/services/browser-service.js +9 -4
- package/dist/services/browser-service.js.map +1 -1
- package/dist/services/process-manager.d.ts.map +1 -1
- package/dist/services/process-manager.js.map +1 -1
- package/dist/services/websocket-client.d.ts.map +1 -1
- package/dist/services/websocket-client.js +4 -2
- package/dist/services/websocket-client.js.map +1 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/utils/captcha.d.ts.map +1 -1
- package/dist/utils/captcha.js.map +1 -1
- package/dist/utils/errors.d.ts.map +1 -1
- package/dist/utils/errors.js.map +1 -1
- package/dist/utils/retry.d.ts.map +1 -1
- package/dist/utils/retry.js +1 -1
- package/dist/utils/retry.js.map +1 -1
- package/dist/utils/security.d.ts.map +1 -1
- package/dist/utils/security.js +2 -1
- package/dist/utils/security.js.map +1 -1
- package/dist/utils/url.d.ts.map +1 -1
- package/dist/utils/url.js +2 -1
- package/dist/utils/url.js.map +1 -1
- package/package.json +110 -110
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"security.js","sourceRoot":"","sources":["../../src/utils/security.ts"],"names":[],"mappings":"
|
|
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.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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,
|
|
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
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
export function extractUrl(text) {
|
|
2
2
|
const quotedUrlMatch = text.match(/["']([^"']+)["']/);
|
|
3
|
-
if (quotedUrlMatch &&
|
|
3
|
+
if (quotedUrlMatch &&
|
|
4
|
+
(quotedUrlMatch[1].startsWith("http") || quotedUrlMatch[1].includes("."))) {
|
|
4
5
|
return quotedUrlMatch[1];
|
|
5
6
|
}
|
|
6
7
|
const urlMatch = text.match(/(https?:\/\/[^\s]+)/);
|
package/dist/utils/url.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"url.js","sourceRoot":"","sources":["../../src/utils/url.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,UAAU,CAAC,IAAY;
|
|
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"]}
|
package/package.json
CHANGED
|
@@ -1,112 +1,112 @@
|
|
|
1
1
|
{
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
2
|
+
"name": "@elizaos/plugin-browser",
|
|
3
|
+
"description": "Browser automation plugin for ElizaOS - enables AI agents to browse websites, interact with elements, and extract data",
|
|
4
|
+
"version": "2.0.0-alpha.8",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"module": "dist/index.js",
|
|
8
|
+
"types": "dist/index.d.ts",
|
|
9
|
+
"packageType": "plugin",
|
|
10
|
+
"platform": "node",
|
|
11
|
+
"license": "MIT",
|
|
12
|
+
"keywords": [
|
|
13
|
+
"plugin",
|
|
14
|
+
"elizaos",
|
|
15
|
+
"browser",
|
|
16
|
+
"automation",
|
|
17
|
+
"stagehand",
|
|
18
|
+
"playwright"
|
|
19
|
+
],
|
|
20
|
+
"repository": {
|
|
21
|
+
"type": "git",
|
|
22
|
+
"url": "https://github.com/elizaos/eliza"
|
|
23
|
+
},
|
|
24
|
+
"homepage": "https://elizaos.ai",
|
|
25
|
+
"exports": {
|
|
26
|
+
"./package.json": "./package.json",
|
|
27
|
+
".": {
|
|
28
|
+
"import": {
|
|
29
|
+
"types": "./dist/index.d.ts",
|
|
30
|
+
"default": "./dist/index.js"
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
},
|
|
34
|
+
"files": [
|
|
35
|
+
"dist",
|
|
36
|
+
"README.md",
|
|
37
|
+
"package.json"
|
|
38
|
+
],
|
|
39
|
+
"dependencies": {
|
|
40
|
+
"@elizaos/plugin-cli": "2.0.0-alpha.3",
|
|
41
|
+
"axios": "^1.7.7",
|
|
42
|
+
"ws": "^8.18.0",
|
|
43
|
+
"zod": "^4.3.6"
|
|
44
|
+
},
|
|
45
|
+
"peerDependencies": {
|
|
46
|
+
"@elizaos/core": "2.0.0-alpha.3"
|
|
47
|
+
},
|
|
48
|
+
"devDependencies": {
|
|
49
|
+
"@biomejs/biome": "^2.3.11",
|
|
50
|
+
"@types/ws": "^8.5.10",
|
|
51
|
+
"typescript": "^5.9.3"
|
|
52
|
+
},
|
|
53
|
+
"scripts": {
|
|
54
|
+
"dev": "bun --hot build.ts",
|
|
55
|
+
"test": "vitest run --passWithNoTests",
|
|
56
|
+
"lint": "bunx @biomejs/biome check --write --unsafe .",
|
|
57
|
+
"typecheck": "tsc --noEmit",
|
|
58
|
+
"clean": "rm -rf dist .turbo",
|
|
59
|
+
"lint:check": "bunx @biomejs/biome check .",
|
|
60
|
+
"build": "bun run build.ts",
|
|
61
|
+
"build:ts": "bun run build.ts",
|
|
62
|
+
"format": "bunx @biomejs/biome format --write .",
|
|
63
|
+
"format:check": "bunx @biomejs/biome format ."
|
|
64
|
+
},
|
|
65
|
+
"agentConfig": {
|
|
66
|
+
"pluginType": "elizaos:plugin:1.0.0",
|
|
67
|
+
"pluginParameters": {
|
|
68
|
+
"BROWSERBASE_API_KEY": {
|
|
69
|
+
"type": "string",
|
|
70
|
+
"description": "API key for Browserbase cloud browser service",
|
|
71
|
+
"required": false
|
|
72
|
+
},
|
|
73
|
+
"BROWSERBASE_PROJECT_ID": {
|
|
74
|
+
"type": "string",
|
|
75
|
+
"description": "Project ID for Browserbase",
|
|
76
|
+
"required": false
|
|
77
|
+
},
|
|
78
|
+
"OPENAI_API_KEY": {
|
|
79
|
+
"type": "string",
|
|
80
|
+
"description": "OpenAI API key for AI-powered browser interactions",
|
|
81
|
+
"required": false
|
|
82
|
+
},
|
|
83
|
+
"ANTHROPIC_API_KEY": {
|
|
84
|
+
"type": "string",
|
|
85
|
+
"description": "Anthropic API key for Claude-powered interactions",
|
|
86
|
+
"required": false
|
|
87
|
+
},
|
|
88
|
+
"BROWSER_HEADLESS": {
|
|
89
|
+
"type": "boolean",
|
|
90
|
+
"description": "Run browser in headless mode (default: true)",
|
|
91
|
+
"required": false
|
|
92
|
+
},
|
|
93
|
+
"CAPSOLVER_API_KEY": {
|
|
94
|
+
"type": "string",
|
|
95
|
+
"description": "CapSolver API key for automated CAPTCHA solving",
|
|
96
|
+
"required": false
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
},
|
|
100
|
+
"publishConfig": {
|
|
101
|
+
"access": "public"
|
|
102
|
+
},
|
|
103
|
+
"milady": {
|
|
104
|
+
"platforms": [
|
|
105
|
+
"node"
|
|
106
|
+
],
|
|
107
|
+
"runtime": "node",
|
|
108
|
+
"platformDetails": {
|
|
109
|
+
"node": "Node.js only (platform: node)"
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
112
|
}
|