@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.
Files changed (57) hide show
  1. package/dist/actions/click.d.ts.map +1 -1
  2. package/dist/actions/click.js +35 -8
  3. package/dist/actions/click.js.map +1 -1
  4. package/dist/actions/extract.d.ts.map +1 -1
  5. package/dist/actions/extract.js +39 -12
  6. package/dist/actions/extract.js.map +1 -1
  7. package/dist/actions/navigate.d.ts.map +1 -1
  8. package/dist/actions/navigate.js +36 -9
  9. package/dist/actions/navigate.js.map +1 -1
  10. package/dist/actions/screenshot.d.ts.map +1 -1
  11. package/dist/actions/screenshot.js +37 -8
  12. package/dist/actions/screenshot.js.map +1 -1
  13. package/dist/actions/select.d.ts.map +1 -1
  14. package/dist/actions/select.js +40 -9
  15. package/dist/actions/select.js.map +1 -1
  16. package/dist/actions/type.d.ts.map +1 -1
  17. package/dist/actions/type.js +40 -9
  18. package/dist/actions/type.js.map +1 -1
  19. package/dist/cli/index.js.map +1 -1
  20. package/dist/cli/register.d.ts.map +1 -1
  21. package/dist/cli/register.js +5 -1
  22. package/dist/cli/register.js.map +1 -1
  23. package/dist/index.d.ts +1 -1
  24. package/dist/index.d.ts.map +1 -1
  25. package/dist/index.js +6 -48
  26. package/dist/index.js.map +1 -1
  27. package/dist/providerRelevance.d.ts +4 -0
  28. package/dist/providerRelevance.d.ts.map +1 -0
  29. package/dist/providerRelevance.js +33 -0
  30. package/dist/providerRelevance.js.map +1 -0
  31. package/dist/providers/browser-state.d.ts.map +1 -1
  32. package/dist/providers/browser-state.js +25 -0
  33. package/dist/providers/browser-state.js.map +1 -1
  34. package/dist/services/browser-service.d.ts.map +1 -1
  35. package/dist/services/browser-service.js +9 -4
  36. package/dist/services/browser-service.js.map +1 -1
  37. package/dist/services/process-manager.d.ts.map +1 -1
  38. package/dist/services/process-manager.js.map +1 -1
  39. package/dist/services/websocket-client.d.ts.map +1 -1
  40. package/dist/services/websocket-client.js +4 -2
  41. package/dist/services/websocket-client.js.map +1 -1
  42. package/dist/types.d.ts.map +1 -1
  43. package/dist/types.js.map +1 -1
  44. package/dist/utils/captcha.d.ts.map +1 -1
  45. package/dist/utils/captcha.js.map +1 -1
  46. package/dist/utils/errors.d.ts.map +1 -1
  47. package/dist/utils/errors.js.map +1 -1
  48. package/dist/utils/retry.d.ts.map +1 -1
  49. package/dist/utils/retry.js +1 -1
  50. package/dist/utils/retry.js.map +1 -1
  51. package/dist/utils/security.d.ts.map +1 -1
  52. package/dist/utils/security.js +2 -1
  53. package/dist/utils/security.js.map +1 -1
  54. package/dist/utils/url.d.ts.map +1 -1
  55. package/dist/utils/url.js +2 -1
  56. package/dist/utils/url.js.map +1 -1
  57. package/package.json +110 -110
@@ -1 +1 @@
1
- {"version":3,"file":"security.js","sourceRoot":"","sources":["../../src/utils/security.ts"],"names":[],"mappings":"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","sourcesContent":["import type { RateLimitConfig, RateLimitEntry, SecurityConfig } from \"../types.js\";\nimport { SecurityError } from \"./errors.js\";\n\nconst DEFAULT_SECURITY_CONFIG: Required<SecurityConfig> = {\n allowedDomains: [],\n blockedDomains: [\"malware.com\", \"phishing.com\"],\n maxUrlLength: 2048,\n allowLocalhost: true,\n allowFileProtocol: false,\n};\n\nexport class UrlValidator {\n private config: Required<SecurityConfig>;\n\n constructor(config: Partial<SecurityConfig> = {}) {\n this.config = { ...DEFAULT_SECURITY_CONFIG, ...config };\n }\n\n validate(url: string): { valid: boolean; sanitized?: string; error?: string } {\n try {\n if (url.length > this.config.maxUrlLength) {\n return { valid: false, error: \"URL is too long\" };\n }\n\n let parsedUrl: URL;\n try {\n parsedUrl = new URL(url);\n } catch {\n if (!url.startsWith(\"http://\") && !url.startsWith(\"https://\")) {\n try {\n parsedUrl = new URL(`https://${url}`);\n } catch {\n return { valid: false, error: \"Invalid URL format\" };\n }\n } else {\n return { valid: false, error: \"Invalid URL format\" };\n }\n }\n\n if (parsedUrl.protocol === \"file:\" && !this.config.allowFileProtocol) {\n return { valid: false, error: \"File protocol is not allowed\" };\n }\n\n if (![\"http:\", \"https:\", \"file:\"].includes(parsedUrl.protocol)) {\n return { valid: false, error: \"Only HTTP(S) protocols are allowed\" };\n }\n\n const isLocalhost = [\"localhost\", \"127.0.0.1\", \"::1\"].includes(parsedUrl.hostname);\n if (isLocalhost && !this.config.allowLocalhost) {\n return { valid: false, error: \"Localhost URLs are not allowed\" };\n }\n\n for (const blocked of this.config.blockedDomains) {\n if (parsedUrl.hostname.includes(blocked)) {\n return { valid: false, error: `Domain ${blocked} is blocked` };\n }\n }\n\n if (this.config.allowedDomains.length > 0) {\n const isAllowed = this.config.allowedDomains.some(\n (allowed) => parsedUrl.hostname === allowed || parsedUrl.hostname.endsWith(`.${allowed}`)\n );\n if (!isAllowed) {\n return { valid: false, error: \"Domain is not in the allowed list\" };\n }\n }\n\n return { valid: true, sanitized: parsedUrl.href };\n } catch {\n return { valid: false, error: \"Error validating URL\" };\n }\n }\n\n updateConfig(config: Partial<SecurityConfig>): void {\n this.config = { ...this.config, ...config };\n }\n}\n\nexport const InputSanitizer = {\n sanitizeText(input: string): string {\n return input\n .replace(/[<>]/g, \"\")\n .replace(/javascript:/gi, \"\")\n .replace(/on\\w+\\s*=/gi, \"\")\n .trim();\n },\n\n sanitizeSelector(selector: string): string {\n return selector.replace(/['\"]/g, \"\").replace(/[<>]/g, \"\").trim();\n },\n\n sanitizeFilePath(path: string): string {\n return path\n .replace(/\\.\\./g, \"\")\n .replace(/[<>:\"|?*]/g, \"\")\n .trim();\n },\n};\n\nexport function validateSecureAction(url: string | null, validator: UrlValidator): void {\n if (!url) {\n return;\n }\n\n const validation = validator.validate(url);\n if (!validation.valid) {\n throw new SecurityError(`URL validation failed: ${validation.error}`, {\n url,\n error: validation.error,\n });\n }\n}\n\nexport const defaultUrlValidator = new UrlValidator();\n\nexport class RateLimiter {\n private actionCounts = new Map<string, RateLimitEntry>();\n private sessionCounts = new Map<string, RateLimitEntry>();\n\n constructor(private config: RateLimitConfig) {}\n\n checkActionLimit(userId: string): boolean {\n const now = Date.now();\n const userLimit = this.actionCounts.get(userId);\n\n if (!userLimit || now > userLimit.resetTime) {\n this.actionCounts.set(userId, {\n count: 1,\n resetTime: now + 60000,\n });\n return true;\n }\n\n if (userLimit.count >= this.config.maxActionsPerMinute) {\n return false;\n }\n\n userLimit.count++;\n return true;\n }\n\n checkSessionLimit(userId: string): boolean {\n const now = Date.now();\n const userLimit = this.sessionCounts.get(userId);\n\n if (!userLimit || now > userLimit.resetTime) {\n this.sessionCounts.set(userId, {\n count: 1,\n resetTime: now + 3600000,\n });\n return true;\n }\n\n if (userLimit.count >= this.config.maxSessionsPerHour) {\n return false;\n }\n\n userLimit.count++;\n return true;\n }\n}\n"]}
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"]}
@@ -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,CAmBtD;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;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAQpF;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAG5D"}
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 && (quotedUrlMatch[1].startsWith("http") || quotedUrlMatch[1].includes("."))) {
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]+)/);
@@ -1 +1 @@
1
- {"version":3,"file":"url.js","sourceRoot":"","sources":["../../src/utils/url.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;IACtD,IAAI,cAAc,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,cAAc,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;QAChG,OAAO,cAAc,CAAC,CAAC,CAAC,CAAC;IAC3B,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;IACnD,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC;IACrB,CAAC;IAED,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAC5B,+FAA+F,CAChG,CAAC;IACF,IAAI,WAAW,EAAE,CAAC;QAChB,OAAO,WAAW,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC;IACrC,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC3C,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;AACtC,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,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;AACrC,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC5C,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;AAC9B,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,IAAY;IAClD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,kEAAkE,CAAC,CAAC;IAC7F,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACjC,CAAC","sourcesContent":["export function extractUrl(text: string): string | null {\n const quotedUrlMatch = text.match(/[\"']([^\"']+)[\"']/);\n if (quotedUrlMatch && (quotedUrlMatch[1].startsWith(\"http\") || quotedUrlMatch[1].includes(\".\"))) {\n return quotedUrlMatch[1];\n }\n\n const urlMatch = text.match(/(https?:\\/\\/[^\\s]+)/);\n if (urlMatch) {\n return urlMatch[1];\n }\n\n const domainMatch = text.match(\n /(?: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 );\n if (domainMatch) {\n return `https://${domainMatch[1]}`;\n }\n\n return null;\n}\n\nexport function parseClickTarget(text: string): string {\n const match = text.match(/click (?:on |the )?(.+)$/i);\n return match ? match[1] : \"element\";\n}\n\nexport function parseTypeAction(text: string): { text: string; field: string } {\n const textMatch = text.match(/[\"']([^\"']+)[\"']/);\n const textToType = textMatch ? textMatch[1] : \"\";\n\n const fieldMatch = text.match(/(?:in|into) (?:the )?(.+)$/i);\n const field = fieldMatch ? fieldMatch[1] : \"input field\";\n\n return { text: textToType, field };\n}\n\nexport function parseSelectAction(text: string): { option: string; dropdown: string } {\n const optionMatch = text.match(/[\"']([^\"']+)[\"']/);\n const option = optionMatch ? optionMatch[1] : \"\";\n\n const dropdownMatch = text.match(/from (?:the )?(.+)$/i);\n const dropdown = dropdownMatch ? dropdownMatch[1] : \"dropdown\";\n\n return { option, dropdown };\n}\n\nexport function parseExtractInstruction(text: string): string {\n const match = text.match(/(?:extract|get|find|scrape|read) (?:the )?(.+?)(?:\\s+from|\\s*$)/i);\n return match ? match[1] : text;\n}\n"]}
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
- "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.7",
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 || echo 'TypeScript tests skipped - no tests found'",
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
- "milaidy": {
104
- "platforms": [
105
- "node"
106
- ],
107
- "runtime": "node",
108
- "platformDetails": {
109
- "node": "Node.js only (platform: node)"
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
  }