@elizaos/plugin-browser 2.0.0-alpha.6 → 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 (60) 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 +10 -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 +2 -0
  35. package/dist/services/browser-service.d.ts.map +1 -1
  36. package/dist/services/browser-service.js +39 -6
  37. package/dist/services/browser-service.js.map +1 -1
  38. package/dist/services/process-manager.d.ts +10 -1
  39. package/dist/services/process-manager.d.ts.map +1 -1
  40. package/dist/services/process-manager.js +143 -59
  41. package/dist/services/process-manager.js.map +1 -1
  42. package/dist/services/websocket-client.d.ts.map +1 -1
  43. package/dist/services/websocket-client.js +4 -2
  44. package/dist/services/websocket-client.js.map +1 -1
  45. package/dist/types.d.ts.map +1 -1
  46. package/dist/types.js.map +1 -1
  47. package/dist/utils/captcha.d.ts.map +1 -1
  48. package/dist/utils/captcha.js.map +1 -1
  49. package/dist/utils/errors.d.ts.map +1 -1
  50. package/dist/utils/errors.js.map +1 -1
  51. package/dist/utils/retry.d.ts.map +1 -1
  52. package/dist/utils/retry.js +1 -1
  53. package/dist/utils/retry.js.map +1 -1
  54. package/dist/utils/security.d.ts.map +1 -1
  55. package/dist/utils/security.js +2 -1
  56. package/dist/utils/security.js.map +1 -1
  57. package/dist/utils/url.d.ts.map +1 -1
  58. package/dist/utils/url.js +2 -1
  59. package/dist/utils/url.js.map +1 -1
  60. package/package.json +110 -110
@@ -4,18 +4,47 @@ export const browserTypeAction = {
4
4
  name: "BROWSER_TYPE",
5
5
  similes: ["TYPE_TEXT", "INPUT", "ENTER_TEXT"],
6
6
  description: "Type text into an input field on the webpage",
7
- validate: async (runtime, message, _state) => {
8
- const browserEnabled = runtime.getSetting("ENABLE_BROWSER") === "true" ||
9
- runtime.getSetting("BROWSER_ENABLED") === "true";
10
- if (!browserEnabled) {
7
+ validate: async (runtime, message, state, options) => {
8
+ const __avTextRaw = typeof message?.content?.text === "string" ? message.content.text : "";
9
+ const __avText = __avTextRaw.toLowerCase();
10
+ const __avKeywords = ["browser", "type"];
11
+ const __avKeywordOk = __avKeywords.length > 0 &&
12
+ __avKeywords.some((kw) => kw.length > 0 && __avText.includes(kw));
13
+ const __avRegex = /\b(?:browser|type)\b/i;
14
+ const __avRegexOk = __avRegex.test(__avText);
15
+ const __avSource = String(message?.content?.source ?? message?.source ?? "");
16
+ const __avExpectedSource = "";
17
+ const __avSourceOk = __avExpectedSource
18
+ ? __avSource === __avExpectedSource
19
+ : Boolean(__avSource || state || runtime?.agentId || runtime?.getService);
20
+ const __avOptions = options && typeof options === "object" ? options : {};
21
+ const __avInputOk = __avText.trim().length > 0 ||
22
+ Object.keys(__avOptions).length > 0 ||
23
+ Boolean(message?.content && typeof message.content === "object");
24
+ if (!(__avKeywordOk && __avRegexOk && __avSourceOk && __avInputOk)) {
11
25
  return false;
12
26
  }
13
- const service = runtime.getService(ServiceType.BROWSER);
14
- if (!service) {
27
+ const __avLegacyValidate = async (runtime, message, _state) => {
28
+ const browserEnabled = runtime.getSetting("ENABLE_BROWSER") === "true" ||
29
+ runtime.getSetting("BROWSER_ENABLED") === "true";
30
+ if (!browserEnabled) {
31
+ return false;
32
+ }
33
+ const service = runtime.getService(ServiceType.BROWSER);
34
+ if (!service) {
35
+ return false;
36
+ }
37
+ const text = message.content?.text?.toLowerCase() ?? "";
38
+ return (text.includes("type") ||
39
+ text.includes("input") ||
40
+ text.includes("enter"));
41
+ };
42
+ try {
43
+ return Boolean(await __avLegacyValidate(runtime, message, state, options));
44
+ }
45
+ catch {
15
46
  return false;
16
47
  }
17
- const text = message.content?.text?.toLowerCase() ?? "";
18
- return text.includes("type") || text.includes("input") || text.includes("enter");
19
48
  },
20
49
  handler: async (runtime, message, _state, _options, callback, _responses) => {
21
50
  const service = runtime.getService(ServiceType.BROWSER);
@@ -60,7 +89,9 @@ export const browserTypeAction = {
60
89
  if (!textToType) {
61
90
  throw new ActionError("type", field, new Error("No text specified to type"));
62
91
  }
63
- const result = await service.getClient().type(session.id, textToType, field);
92
+ const result = await service
93
+ .getClient()
94
+ .type(session.id, textToType, field);
64
95
  if (!result.success) {
65
96
  throw new ActionError("type", field, new Error(result.error ?? "Type failed"));
66
97
  }
@@ -1 +1 @@
1
- {"version":3,"file":"type.js","sourceRoot":"","sources":["../../src/actions/type.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n Action,\n ActionResult,\n Content,\n HandlerCallback,\n HandlerOptions,\n IAgentRuntime,\n Memory,\n State,\n} from \"@elizaos/core\";\nimport { ServiceType } from \"@elizaos/core\";\nimport type { BrowserService } from \"../services/browser-service.js\";\nimport {\n ActionError,\n handleBrowserError,\n ServiceNotAvailableError,\n SessionError,\n} from \"../utils/errors.js\";\n\nexport const browserTypeAction: Action = {\n name: \"BROWSER_TYPE\",\n similes: [\"TYPE_TEXT\", \"INPUT\", \"ENTER_TEXT\"],\n description: \"Type text into an input field on the webpage\",\n\n validate: async (runtime: IAgentRuntime, message: Memory, _state?: State): Promise<boolean> => {\n const browserEnabled =\n runtime.getSetting(\"ENABLE_BROWSER\") === \"true\" ||\n runtime.getSetting(\"BROWSER_ENABLED\") === \"true\";\n\n if (!browserEnabled) {\n return false;\n }\n\n const service = runtime.getService<BrowserService>(ServiceType.BROWSER);\n if (!service) {\n return false;\n }\n\n const text = message.content?.text?.toLowerCase() ?? \"\";\n return text.includes(\"type\") || text.includes(\"input\") || text.includes(\"enter\");\n },\n\n handler: async (\n runtime: IAgentRuntime,\n message: Memory,\n _state?: State,\n _options?: HandlerOptions,\n callback?: HandlerCallback,\n _responses?: Memory[]\n ): Promise<ActionResult | undefined> => {\n const service = runtime.getService<BrowserService>(ServiceType.BROWSER);\n if (!service) {\n const error = new ServiceNotAvailableError();\n handleBrowserError(\n error,\n callback as (content: { text: string; error?: boolean }) => Promise<unknown>,\n \"type text\"\n );\n return {\n text: \"Browser service is not available\",\n success: false,\n data: {\n actionName: \"BROWSER_TYPE\",\n error: \"service_not_available\",\n },\n values: {\n success: false,\n errorType: \"service_not_available\",\n },\n };\n }\n\n const session = await service.getOrCreateSession();\n if (!session) {\n const error = new SessionError(\"No active browser session\");\n handleBrowserError(\n error,\n callback as (content: { text: string; error?: boolean }) => Promise<unknown>,\n \"type text\"\n );\n return {\n text: \"No active browser session\",\n success: false,\n data: {\n actionName: \"BROWSER_TYPE\",\n error: \"no_session\",\n },\n values: {\n success: false,\n errorType: \"no_session\",\n },\n };\n }\n\n const text = message.content?.text ?? \"\";\n const match = text.match(/[\"']([^\"']+)[\"']/);\n const textToType = match ? match[1] : \"\";\n\n const fieldMatch = text.match(/(?:in|into) (?:the )?(.+)$/i);\n const field = fieldMatch ? fieldMatch[1] : \"input field\";\n\n if (!textToType) {\n throw new ActionError(\"type\", field, new Error(\"No text specified to type\"));\n }\n\n const result = await service.getClient().type(session.id, textToType, field);\n if (!result.success) {\n throw new ActionError(\"type\", field, new Error(result.error ?? \"Type failed\"));\n }\n\n const responseContent: Content = {\n text: `I've typed \"${textToType}\" in the ${field}`,\n actions: [\"BROWSER_TYPE\"],\n source: message.content?.source ?? \"action\",\n };\n\n await callback?.(responseContent);\n\n return {\n text: responseContent.text ?? \"\",\n success: true,\n data: {\n actionName: \"BROWSER_TYPE\",\n textTyped: textToType,\n field,\n sessionId: session.id,\n },\n values: {\n success: true,\n textTyped: textToType,\n field,\n },\n };\n },\n\n examples: [\n [\n {\n name: \"{{user}}\",\n content: { text: 'Type \"hello world\" in the search box' },\n },\n {\n name: \"{{agent}}\",\n content: {\n text: 'I\\'ve typed \"hello world\" in the search box.',\n actions: [\"BROWSER_TYPE\"],\n },\n },\n ],\n ],\n};\n"]}
1
+ {"version":3,"file":"type.js","sourceRoot":"","sources":["../../src/actions/type.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n\tAction,\n\tActionResult,\n\tContent,\n\tHandlerCallback,\n\tHandlerOptions,\n\tIAgentRuntime,\n\tMemory,\n\tState,\n} from \"@elizaos/core\";\nimport { ServiceType } from \"@elizaos/core\";\nimport type { BrowserService } from \"../services/browser-service.js\";\nimport {\n\tActionError,\n\thandleBrowserError,\n\tServiceNotAvailableError,\n\tSessionError,\n} from \"../utils/errors.js\";\n\nexport const browserTypeAction: Action = {\n\tname: \"BROWSER_TYPE\",\n\tsimiles: [\"TYPE_TEXT\", \"INPUT\", \"ENTER_TEXT\"],\n\tdescription: \"Type text into an input field on the webpage\",\n\n\tvalidate: async (\n\t\truntime: any,\n\t\tmessage: any,\n\t\tstate?: any,\n\t\toptions?: any,\n\t): Promise<boolean> => {\n\t\tconst __avTextRaw =\n\t\t\ttypeof message?.content?.text === \"string\" ? message.content.text : \"\";\n\t\tconst __avText = __avTextRaw.toLowerCase();\n\t\tconst __avKeywords = [\"browser\", \"type\"];\n\t\tconst __avKeywordOk =\n\t\t\t__avKeywords.length > 0 &&\n\t\t\t__avKeywords.some((kw) => kw.length > 0 && __avText.includes(kw));\n\t\tconst __avRegex = /\\b(?:browser|type)\\b/i;\n\t\tconst __avRegexOk = __avRegex.test(__avText);\n\t\tconst __avSource = String(\n\t\t\tmessage?.content?.source ?? message?.source ?? \"\",\n\t\t);\n\t\tconst __avExpectedSource = \"\";\n\t\tconst __avSourceOk = __avExpectedSource\n\t\t\t? __avSource === __avExpectedSource\n\t\t\t: Boolean(__avSource || state || runtime?.agentId || runtime?.getService);\n\t\tconst __avOptions = options && typeof options === \"object\" ? options : {};\n\t\tconst __avInputOk =\n\t\t\t__avText.trim().length > 0 ||\n\t\t\tObject.keys(__avOptions as Record<string, unknown>).length > 0 ||\n\t\t\tBoolean(message?.content && typeof message.content === \"object\");\n\n\t\tif (!(__avKeywordOk && __avRegexOk && __avSourceOk && __avInputOk)) {\n\t\t\treturn false;\n\t\t}\n\n\t\tconst __avLegacyValidate = async (\n\t\t\truntime: IAgentRuntime,\n\t\t\tmessage: Memory,\n\t\t\t_state?: State,\n\t\t): Promise<boolean> => {\n\t\t\tconst browserEnabled =\n\t\t\t\truntime.getSetting(\"ENABLE_BROWSER\") === \"true\" ||\n\t\t\t\truntime.getSetting(\"BROWSER_ENABLED\") === \"true\";\n\n\t\t\tif (!browserEnabled) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tconst service = runtime.getService<BrowserService>(ServiceType.BROWSER);\n\t\t\tif (!service) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tconst text = message.content?.text?.toLowerCase() ?? \"\";\n\t\t\treturn (\n\t\t\t\ttext.includes(\"type\") ||\n\t\t\t\ttext.includes(\"input\") ||\n\t\t\t\ttext.includes(\"enter\")\n\t\t\t);\n\t\t};\n\t\ttry {\n\t\t\treturn Boolean(\n\t\t\t\tawait (__avLegacyValidate as any)(runtime, message, state, options),\n\t\t\t);\n\t\t} catch {\n\t\t\treturn false;\n\t\t}\n\t},\n\n\thandler: async (\n\t\truntime: IAgentRuntime,\n\t\tmessage: Memory,\n\t\t_state?: State,\n\t\t_options?: HandlerOptions,\n\t\tcallback?: HandlerCallback,\n\t\t_responses?: Memory[],\n\t): Promise<ActionResult | undefined> => {\n\t\tconst service = runtime.getService<BrowserService>(ServiceType.BROWSER);\n\t\tif (!service) {\n\t\t\tconst error = new ServiceNotAvailableError();\n\t\t\thandleBrowserError(\n\t\t\t\terror,\n\t\t\t\tcallback as (content: {\n\t\t\t\t\ttext: string;\n\t\t\t\t\terror?: boolean;\n\t\t\t\t}) => Promise<unknown>,\n\t\t\t\t\"type text\",\n\t\t\t);\n\t\t\treturn {\n\t\t\t\ttext: \"Browser service is not available\",\n\t\t\t\tsuccess: false,\n\t\t\t\tdata: {\n\t\t\t\t\tactionName: \"BROWSER_TYPE\",\n\t\t\t\t\terror: \"service_not_available\",\n\t\t\t\t},\n\t\t\t\tvalues: {\n\t\t\t\t\tsuccess: false,\n\t\t\t\t\terrorType: \"service_not_available\",\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\n\t\tconst session = await service.getOrCreateSession();\n\t\tif (!session) {\n\t\t\tconst error = new SessionError(\"No active browser session\");\n\t\t\thandleBrowserError(\n\t\t\t\terror,\n\t\t\t\tcallback as (content: {\n\t\t\t\t\ttext: string;\n\t\t\t\t\terror?: boolean;\n\t\t\t\t}) => Promise<unknown>,\n\t\t\t\t\"type text\",\n\t\t\t);\n\t\t\treturn {\n\t\t\t\ttext: \"No active browser session\",\n\t\t\t\tsuccess: false,\n\t\t\t\tdata: {\n\t\t\t\t\tactionName: \"BROWSER_TYPE\",\n\t\t\t\t\terror: \"no_session\",\n\t\t\t\t},\n\t\t\t\tvalues: {\n\t\t\t\t\tsuccess: false,\n\t\t\t\t\terrorType: \"no_session\",\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\n\t\tconst text = message.content?.text ?? \"\";\n\t\tconst match = text.match(/[\"']([^\"']+)[\"']/);\n\t\tconst textToType = match ? match[1] : \"\";\n\n\t\tconst fieldMatch = text.match(/(?:in|into) (?:the )?(.+)$/i);\n\t\tconst field = fieldMatch ? fieldMatch[1] : \"input field\";\n\n\t\tif (!textToType) {\n\t\t\tthrow new ActionError(\n\t\t\t\t\"type\",\n\t\t\t\tfield,\n\t\t\t\tnew Error(\"No text specified to type\"),\n\t\t\t);\n\t\t}\n\n\t\tconst result = await service\n\t\t\t.getClient()\n\t\t\t.type(session.id, textToType, field);\n\t\tif (!result.success) {\n\t\t\tthrow new ActionError(\n\t\t\t\t\"type\",\n\t\t\t\tfield,\n\t\t\t\tnew Error(result.error ?? \"Type failed\"),\n\t\t\t);\n\t\t}\n\n\t\tconst responseContent: Content = {\n\t\t\ttext: `I've typed \"${textToType}\" in the ${field}`,\n\t\t\tactions: [\"BROWSER_TYPE\"],\n\t\t\tsource: message.content?.source ?? \"action\",\n\t\t};\n\n\t\tawait callback?.(responseContent);\n\n\t\treturn {\n\t\t\ttext: responseContent.text ?? \"\",\n\t\t\tsuccess: true,\n\t\t\tdata: {\n\t\t\t\tactionName: \"BROWSER_TYPE\",\n\t\t\t\ttextTyped: textToType,\n\t\t\t\tfield,\n\t\t\t\tsessionId: session.id,\n\t\t\t},\n\t\t\tvalues: {\n\t\t\t\tsuccess: true,\n\t\t\t\ttextTyped: textToType,\n\t\t\t\tfield,\n\t\t\t},\n\t\t};\n\t},\n\n\texamples: [\n\t\t[\n\t\t\t{\n\t\t\t\tname: \"{{user}}\",\n\t\t\t\tcontent: { text: 'Type \"hello world\" in the search box' },\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"{{agent}}\",\n\t\t\t\tcontent: {\n\t\t\t\t\ttext: 'I\\'ve typed \"hello world\" in the search box.',\n\t\t\t\t\tactions: [\"BROWSER_TYPE\"],\n\t\t\t\t},\n\t\t\t},\n\t\t],\n\t],\n};\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAC3E,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAEnD,+BAA+B;AAC/B,kBAAkB,CAChB,gBAAgB,CAAC,SAAS,EAAE,6BAA6B,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,kBAAkB,CAAC,GAAG,CAAC,EAAE;IAC3F,QAAQ,EAAE,EAAE;CACb,CAAC,CACH,CAAC","sourcesContent":["/**\n * Browser CLI module\n *\n * Provides CLI commands for the browser automation plugin.\n * Self-registers with the plugin-cli registry at module load.\n */\n\nimport { defineCliCommand, registerCliCommand } from \"@elizaos/plugin-cli\";\nimport { registerBrowserCli } from \"./register.js\";\n\n// Self-register at module load\nregisterCliCommand(\n defineCliCommand(\"browser\", \"Browser automation commands\", (ctx) => registerBrowserCli(ctx), {\n priority: 50,\n })\n);\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAC3E,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAEnD,+BAA+B;AAC/B,kBAAkB,CACjB,gBAAgB,CACf,SAAS,EACT,6BAA6B,EAC7B,CAAC,GAAG,EAAE,EAAE,CAAC,kBAAkB,CAAC,GAAG,CAAC,EAChC;IACC,QAAQ,EAAE,EAAE;CACZ,CACD,CACD,CAAC","sourcesContent":["/**\n * Browser CLI module\n *\n * Provides CLI commands for the browser automation plugin.\n * Self-registers with the plugin-cli registry at module load.\n */\n\nimport { defineCliCommand, registerCliCommand } from \"@elizaos/plugin-cli\";\nimport { registerBrowserCli } from \"./register.js\";\n\n// Self-register at module load\nregisterCliCommand(\n\tdefineCliCommand(\n\t\t\"browser\",\n\t\t\"Browser automation commands\",\n\t\t(ctx) => registerBrowserCli(ctx),\n\t\t{\n\t\t\tpriority: 50,\n\t\t},\n\t),\n);\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"register.d.ts","sourceRoot":"","sources":["../../src/cli/register.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAyCtD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,UAAU,GAAG,IAAI,CAyYxD"}
1
+ {"version":3,"file":"register.d.ts","sourceRoot":"","sources":["../../src/cli/register.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAqDtD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,UAAU,GAAG,IAAI,CA4ZxD"}
@@ -31,7 +31,11 @@ function requireService(ctx) {
31
31
  * Format navigation result for display
32
32
  */
33
33
  function formatNavigationResult(result) {
34
- return [`Success: ${result.success}`, `URL: ${result.url}`, `Title: ${result.title}`].join("\n");
34
+ return [
35
+ `Success: ${result.success}`,
36
+ `URL: ${result.url}`,
37
+ `Title: ${result.title}`,
38
+ ].join("\n");
35
39
  }
36
40
  /**
37
41
  * Register Browser CLI commands
@@ -1 +1 @@
1
- {"version":3,"file":"register.js","sourceRoot":"","sources":["../../src/cli/register.ts"],"names":[],"mappings":"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","sourcesContent":["import type { CliContext } from \"@elizaos/plugin-cli\";\nimport { BrowserService, type Session } from \"../services/browser-service.js\";\n\n/**\n * Get the Browser service from runtime\n */\nfunction getBrowserService(ctx: CliContext): BrowserService | null {\n const runtime = ctx.getRuntime?.();\n if (!runtime) {\n return null;\n }\n return runtime.getService<BrowserService>(BrowserService.serviceType);\n}\n\n/**\n * Handle errors in browser commands\n */\nfunction handleError(error: Error | string): never {\n const message = error instanceof Error ? error.message : String(error);\n console.error(`Error: ${message}`);\n process.exit(1);\n}\n\n/**\n * Ensure service is available\n */\nfunction requireService(ctx: CliContext): BrowserService {\n const service = getBrowserService(ctx);\n if (!service) {\n handleError(\"Browser service not available. Ensure the agent runtime is initialized.\");\n }\n return service;\n}\n\n/**\n * Format navigation result for display\n */\nfunction formatNavigationResult(result: { success: boolean; url: string; title: string }): string {\n return [`Success: ${result.success}`, `URL: ${result.url}`, `Title: ${result.title}`].join(\"\\n\");\n}\n\n/**\n * Register Browser CLI commands\n *\n * Commands:\n * - browser status: Show browser service status\n * - browser start: Start a browser session\n * - browser stop: Stop browser service\n * - browser navigate: Navigate to a URL\n * - browser click: Click an element\n * - browser type: Type text into a field\n * - browser select: Select an option from dropdown\n * - browser extract: Extract information from the page\n * - browser screenshot: Take a screenshot\n * - browser back/forward/refresh: Navigation controls\n *\n * @param ctx - CLI context with program and optional runtime\n */\nexport function registerBrowserCli(ctx: CliContext): void {\n const browser = ctx.program\n .command(\"browser\")\n .description(\"Browser automation commands\")\n .option(\"--json\", \"Output as JSON\", false);\n\n // Status command\n browser\n .command(\"status\")\n .description(\"Show browser service status\")\n .action(async (_opts, cmd) => {\n const parent = cmd.parent?.opts() as { json?: boolean } | undefined;\n const service = getBrowserService(ctx);\n\n const status = {\n serviceAvailable: service !== null,\n serverConnected: service?.getClient?.()?.isConnected?.() ?? false,\n };\n\n let currentSession: Session | undefined;\n if (service) {\n currentSession = await service.getCurrentSession();\n }\n\n const output = {\n ...status,\n hasActiveSession: !!currentSession,\n sessionId: currentSession?.id ?? null,\n };\n\n if (parent?.json) {\n console.log(JSON.stringify(output, null, 2));\n } else {\n console.log(\"Browser Service Status:\");\n console.log(` Service available: ${output.serviceAvailable}`);\n console.log(` Server connected: ${output.serverConnected}`);\n console.log(` Active session: ${output.hasActiveSession ? output.sessionId : \"none\"}`);\n }\n });\n\n // Start command\n browser\n .command(\"start\")\n .description(\"Start or ensure browser session is active\")\n .action(async (_opts, cmd) => {\n const parent = cmd.parent?.opts() as { json?: boolean } | undefined;\n const service = requireService(ctx);\n\n const session = await service.getOrCreateSession();\n\n if (parent?.json) {\n console.log(\n JSON.stringify({ sessionId: session.id, createdAt: session.createdAt }, null, 2)\n );\n } else {\n console.log(`Browser session active: ${session.id}`);\n }\n });\n\n // Stop command\n browser\n .command(\"stop\")\n .description(\"Stop browser service\")\n .action(async (_opts, cmd) => {\n const parent = cmd.parent?.opts() as { json?: boolean } | undefined;\n const service = requireService(ctx);\n\n await service.stop();\n\n if (parent?.json) {\n console.log(JSON.stringify({ stopped: true }, null, 2));\n } else {\n console.log(\"Browser service stopped\");\n }\n });\n\n // Navigate command\n browser\n .command(\"navigate\")\n .description(\"Navigate to a URL\")\n .argument(\"<url>\", \"URL to navigate to\")\n .action(async (url: string, _opts, cmd) => {\n const parent = cmd.parent?.opts() as { json?: boolean } | undefined;\n const service = requireService(ctx);\n const client = service.getClient();\n\n const session = await service.getOrCreateSession();\n const result = await client.navigate(session.id, url);\n\n if (parent?.json) {\n console.log(JSON.stringify(result, null, 2));\n } else {\n console.log(formatNavigationResult(result));\n }\n });\n\n // Go back command\n browser\n .command(\"back\")\n .description(\"Navigate back in browser history\")\n .action(async (_opts, cmd) => {\n const parent = cmd.parent?.opts() as { json?: boolean } | undefined;\n const service = requireService(ctx);\n const client = service.getClient();\n\n const session = await service.getCurrentSession();\n if (!session) {\n handleError(\"No active browser session\");\n }\n\n const result = await client.goBack(session.id);\n\n if (parent?.json) {\n console.log(JSON.stringify(result, null, 2));\n } else {\n console.log(formatNavigationResult(result));\n }\n });\n\n // Go forward command\n browser\n .command(\"forward\")\n .description(\"Navigate forward in browser history\")\n .action(async (_opts, cmd) => {\n const parent = cmd.parent?.opts() as { json?: boolean } | undefined;\n const service = requireService(ctx);\n const client = service.getClient();\n\n const session = await service.getCurrentSession();\n if (!session) {\n handleError(\"No active browser session\");\n }\n\n const result = await client.goForward(session.id);\n\n if (parent?.json) {\n console.log(JSON.stringify(result, null, 2));\n } else {\n console.log(formatNavigationResult(result));\n }\n });\n\n // Refresh command\n browser\n .command(\"refresh\")\n .description(\"Refresh the current page\")\n .action(async (_opts, cmd) => {\n const parent = cmd.parent?.opts() as { json?: boolean } | undefined;\n const service = requireService(ctx);\n const client = service.getClient();\n\n const session = await service.getCurrentSession();\n if (!session) {\n handleError(\"No active browser session\");\n }\n\n const result = await client.refresh(session.id);\n\n if (parent?.json) {\n console.log(JSON.stringify(result, null, 2));\n } else {\n console.log(formatNavigationResult(result));\n }\n });\n\n // Click command\n browser\n .command(\"click\")\n .description(\"Click an element on the page\")\n .argument(\"<description>\", \"Description of the element to click (natural language)\")\n .action(async (description: string, _opts, cmd) => {\n const parent = cmd.parent?.opts() as { json?: boolean } | undefined;\n const service = requireService(ctx);\n const client = service.getClient();\n\n const session = await service.getCurrentSession();\n if (!session) {\n handleError(\"No active browser session\");\n }\n\n const result = await client.click(session.id, description);\n\n if (parent?.json) {\n console.log(JSON.stringify(result.data ?? { success: true }, null, 2));\n } else {\n console.log(`Clicked: ${description}`);\n if (result.data) {\n console.log(JSON.stringify(result.data, null, 2));\n }\n }\n });\n\n // Type command\n browser\n .command(\"type\")\n .description(\"Type text into a field\")\n .argument(\"<text>\", \"Text to type\")\n .requiredOption(\"--field <description>\", \"Description of the field (natural language)\")\n .action(async (text: string, opts: { field: string }, cmd) => {\n const parent = cmd.parent?.opts() as { json?: boolean } | undefined;\n const service = requireService(ctx);\n const client = service.getClient();\n\n const session = await service.getCurrentSession();\n if (!session) {\n handleError(\"No active browser session\");\n }\n\n const result = await client.type(session.id, text, opts.field);\n\n if (parent?.json) {\n console.log(JSON.stringify(result.data ?? { success: true }, null, 2));\n } else {\n console.log(`Typed \"${text}\" into: ${opts.field}`);\n if (result.data) {\n console.log(JSON.stringify(result.data, null, 2));\n }\n }\n });\n\n // Select command\n browser\n .command(\"select\")\n .description(\"Select an option from a dropdown\")\n .argument(\"<option>\", \"Option to select\")\n .requiredOption(\"--dropdown <description>\", \"Description of the dropdown (natural language)\")\n .action(async (option: string, opts: { dropdown: string }, cmd) => {\n const parent = cmd.parent?.opts() as { json?: boolean } | undefined;\n const service = requireService(ctx);\n const client = service.getClient();\n\n const session = await service.getCurrentSession();\n if (!session) {\n handleError(\"No active browser session\");\n }\n\n const result = await client.select(session.id, option, opts.dropdown);\n\n if (parent?.json) {\n console.log(JSON.stringify(result.data ?? { success: true }, null, 2));\n } else {\n console.log(`Selected \"${option}\" from: ${opts.dropdown}`);\n if (result.data) {\n console.log(JSON.stringify(result.data, null, 2));\n }\n }\n });\n\n // Extract command\n browser\n .command(\"extract\")\n .description(\"Extract information from the page\")\n .argument(\"<instruction>\", \"What to extract (natural language)\")\n .action(async (instruction: string, _opts, cmd) => {\n const parent = cmd.parent?.opts() as { json?: boolean } | undefined;\n const service = requireService(ctx);\n const client = service.getClient();\n\n const session = await service.getCurrentSession();\n if (!session) {\n handleError(\"No active browser session\");\n }\n\n const result = await client.extract(session.id, instruction);\n\n if (parent?.json) {\n console.log(JSON.stringify(result.data ?? {}, null, 2));\n } else {\n console.log(`Extracted: ${instruction}`);\n console.log(JSON.stringify(result.data ?? {}, null, 2));\n }\n });\n\n // Screenshot command\n browser\n .command(\"screenshot\")\n .description(\"Take a screenshot of the current page\")\n .option(\"--output <path>\", \"Output file path\")\n .action(async (opts: { output?: string }, cmd) => {\n const parent = cmd.parent?.opts() as { json?: boolean } | undefined;\n const service = requireService(ctx);\n const client = service.getClient();\n\n const session = await service.getCurrentSession();\n if (!session) {\n handleError(\"No active browser session\");\n }\n\n const result = await client.screenshot(session.id);\n const data = result.data as { screenshot?: string } | undefined;\n\n if (parent?.json) {\n console.log(\n JSON.stringify(\n {\n success: !!data?.screenshot,\n hasScreenshot: !!data?.screenshot,\n outputPath: opts.output ?? null,\n },\n null,\n 2\n )\n );\n } else {\n if (data?.screenshot) {\n if (opts.output) {\n const fs = await import(\"node:fs/promises\");\n const buffer = Buffer.from(data.screenshot, \"base64\");\n await fs.writeFile(opts.output, buffer);\n console.log(`Screenshot saved to: ${opts.output}`);\n } else {\n console.log(\"Screenshot captured (use --output to save to file)\");\n console.log(`Base64 length: ${data.screenshot.length}`);\n }\n } else {\n console.log(\"Failed to capture screenshot\");\n }\n }\n });\n\n // State command\n browser\n .command(\"state\")\n .description(\"Get current browser state\")\n .action(async (_opts, cmd) => {\n const parent = cmd.parent?.opts() as { json?: boolean } | undefined;\n const service = requireService(ctx);\n const client = service.getClient();\n\n const session = await service.getCurrentSession();\n if (!session) {\n handleError(\"No active browser session\");\n }\n\n const state = await client.getState(session.id);\n\n if (parent?.json) {\n console.log(JSON.stringify(state, null, 2));\n } else {\n console.log(\"Browser State:\");\n console.log(` URL: ${state.url}`);\n console.log(` Title: ${state.title}`);\n console.log(` Session ID: ${state.sessionId}`);\n }\n });\n\n // Solve captcha command\n browser\n .command(\"solve-captcha\")\n .description(\"Attempt to solve a captcha on the page\")\n .action(async (_opts, cmd) => {\n const parent = cmd.parent?.opts() as { json?: boolean } | undefined;\n const service = requireService(ctx);\n const client = service.getClient();\n\n const session = await service.getCurrentSession();\n if (!session) {\n handleError(\"No active browser session\");\n }\n\n const result = await client.solveCaptcha(session.id);\n\n if (parent?.json) {\n console.log(JSON.stringify(result.data ?? { attempted: true }, null, 2));\n } else {\n console.log(\"Captcha solve attempted\");\n if (result.data) {\n console.log(JSON.stringify(result.data, null, 2));\n }\n }\n });\n\n // Health command\n browser\n .command(\"health\")\n .description(\"Check browser server health\")\n .action(async (_opts, cmd) => {\n const parent = cmd.parent?.opts() as { json?: boolean } | undefined;\n const service = getBrowserService(ctx);\n\n let healthy = false;\n if (service) {\n const client = service.getClient();\n healthy = await client.health();\n }\n\n if (parent?.json) {\n console.log(JSON.stringify({ healthy, serviceAvailable: !!service }, null, 2));\n } else {\n console.log(`Browser server health: ${healthy ? \"OK\" : \"UNHEALTHY\"}`);\n console.log(`Service available: ${!!service}`);\n }\n });\n}\n"]}
1
+ {"version":3,"file":"register.js","sourceRoot":"","sources":["../../src/cli/register.ts"],"names":[],"mappings":"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","sourcesContent":["import type { CliContext } from \"@elizaos/plugin-cli\";\nimport { BrowserService, type Session } from \"../services/browser-service.js\";\n\n/**\n * Get the Browser service from runtime\n */\nfunction getBrowserService(ctx: CliContext): BrowserService | null {\n\tconst runtime = ctx.getRuntime?.();\n\tif (!runtime) {\n\t\treturn null;\n\t}\n\treturn runtime.getService(\n\t\tBrowserService.serviceType,\n\t) as BrowserService | null;\n}\n\n/**\n * Handle errors in browser commands\n */\nfunction handleError(error: Error | string): never {\n\tconst message = error instanceof Error ? error.message : String(error);\n\tconsole.error(`Error: ${message}`);\n\tprocess.exit(1);\n}\n\n/**\n * Ensure service is available\n */\nfunction requireService(ctx: CliContext): BrowserService {\n\tconst service = getBrowserService(ctx);\n\tif (!service) {\n\t\thandleError(\n\t\t\t\"Browser service not available. Ensure the agent runtime is initialized.\",\n\t\t);\n\t}\n\treturn service;\n}\n\n/**\n * Format navigation result for display\n */\nfunction formatNavigationResult(result: {\n\tsuccess: boolean;\n\turl: string;\n\ttitle: string;\n}): string {\n\treturn [\n\t\t`Success: ${result.success}`,\n\t\t`URL: ${result.url}`,\n\t\t`Title: ${result.title}`,\n\t].join(\"\\n\");\n}\n\n/**\n * Register Browser CLI commands\n *\n * Commands:\n * - browser status: Show browser service status\n * - browser start: Start a browser session\n * - browser stop: Stop browser service\n * - browser navigate: Navigate to a URL\n * - browser click: Click an element\n * - browser type: Type text into a field\n * - browser select: Select an option from dropdown\n * - browser extract: Extract information from the page\n * - browser screenshot: Take a screenshot\n * - browser back/forward/refresh: Navigation controls\n *\n * @param ctx - CLI context with program and optional runtime\n */\nexport function registerBrowserCli(ctx: CliContext): void {\n\tconst browser = ctx.program\n\t\t.command(\"browser\")\n\t\t.description(\"Browser automation commands\")\n\t\t.option(\"--json\", \"Output as JSON\", false);\n\n\t// Status command\n\tbrowser\n\t\t.command(\"status\")\n\t\t.description(\"Show browser service status\")\n\t\t.action(async (_opts, cmd) => {\n\t\t\tconst parent = cmd.parent?.opts() as { json?: boolean } | undefined;\n\t\t\tconst service = getBrowserService(ctx);\n\n\t\t\tconst status = {\n\t\t\t\tserviceAvailable: service !== null,\n\t\t\t\tserverConnected: service?.getClient?.()?.isConnected?.() ?? false,\n\t\t\t};\n\n\t\t\tlet currentSession: Session | undefined;\n\t\t\tif (service) {\n\t\t\t\tcurrentSession = await service.getCurrentSession();\n\t\t\t}\n\n\t\t\tconst output = {\n\t\t\t\t...status,\n\t\t\t\thasActiveSession: !!currentSession,\n\t\t\t\tsessionId: currentSession?.id ?? null,\n\t\t\t};\n\n\t\t\tif (parent?.json) {\n\t\t\t\tconsole.log(JSON.stringify(output, null, 2));\n\t\t\t} else {\n\t\t\t\tconsole.log(\"Browser Service Status:\");\n\t\t\t\tconsole.log(` Service available: ${output.serviceAvailable}`);\n\t\t\t\tconsole.log(` Server connected: ${output.serverConnected}`);\n\t\t\t\tconsole.log(\n\t\t\t\t\t` Active session: ${output.hasActiveSession ? output.sessionId : \"none\"}`,\n\t\t\t\t);\n\t\t\t}\n\t\t});\n\n\t// Start command\n\tbrowser\n\t\t.command(\"start\")\n\t\t.description(\"Start or ensure browser session is active\")\n\t\t.action(async (_opts, cmd) => {\n\t\t\tconst parent = cmd.parent?.opts() as { json?: boolean } | undefined;\n\t\t\tconst service = requireService(ctx);\n\n\t\t\tconst session = await service.getOrCreateSession();\n\n\t\t\tif (parent?.json) {\n\t\t\t\tconsole.log(\n\t\t\t\t\tJSON.stringify(\n\t\t\t\t\t\t{ sessionId: session.id, createdAt: session.createdAt },\n\t\t\t\t\t\tnull,\n\t\t\t\t\t\t2,\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tconsole.log(`Browser session active: ${session.id}`);\n\t\t\t}\n\t\t});\n\n\t// Stop command\n\tbrowser\n\t\t.command(\"stop\")\n\t\t.description(\"Stop browser service\")\n\t\t.action(async (_opts, cmd) => {\n\t\t\tconst parent = cmd.parent?.opts() as { json?: boolean } | undefined;\n\t\t\tconst service = requireService(ctx);\n\n\t\t\tawait service.stop();\n\n\t\t\tif (parent?.json) {\n\t\t\t\tconsole.log(JSON.stringify({ stopped: true }, null, 2));\n\t\t\t} else {\n\t\t\t\tconsole.log(\"Browser service stopped\");\n\t\t\t}\n\t\t});\n\n\t// Navigate command\n\tbrowser\n\t\t.command(\"navigate\")\n\t\t.description(\"Navigate to a URL\")\n\t\t.argument(\"<url>\", \"URL to navigate to\")\n\t\t.action(async (url: string, _opts, cmd) => {\n\t\t\tconst parent = cmd.parent?.opts() as { json?: boolean } | undefined;\n\t\t\tconst service = requireService(ctx);\n\t\t\tconst client = service.getClient();\n\n\t\t\tconst session = await service.getOrCreateSession();\n\t\t\tconst result = await client.navigate(session.id, url);\n\n\t\t\tif (parent?.json) {\n\t\t\t\tconsole.log(JSON.stringify(result, null, 2));\n\t\t\t} else {\n\t\t\t\tconsole.log(formatNavigationResult(result));\n\t\t\t}\n\t\t});\n\n\t// Go back command\n\tbrowser\n\t\t.command(\"back\")\n\t\t.description(\"Navigate back in browser history\")\n\t\t.action(async (_opts, cmd) => {\n\t\t\tconst parent = cmd.parent?.opts() as { json?: boolean } | undefined;\n\t\t\tconst service = requireService(ctx);\n\t\t\tconst client = service.getClient();\n\n\t\t\tconst session = await service.getCurrentSession();\n\t\t\tif (!session) {\n\t\t\t\thandleError(\"No active browser session\");\n\t\t\t}\n\n\t\t\tconst result = await client.goBack(session.id);\n\n\t\t\tif (parent?.json) {\n\t\t\t\tconsole.log(JSON.stringify(result, null, 2));\n\t\t\t} else {\n\t\t\t\tconsole.log(formatNavigationResult(result));\n\t\t\t}\n\t\t});\n\n\t// Go forward command\n\tbrowser\n\t\t.command(\"forward\")\n\t\t.description(\"Navigate forward in browser history\")\n\t\t.action(async (_opts, cmd) => {\n\t\t\tconst parent = cmd.parent?.opts() as { json?: boolean } | undefined;\n\t\t\tconst service = requireService(ctx);\n\t\t\tconst client = service.getClient();\n\n\t\t\tconst session = await service.getCurrentSession();\n\t\t\tif (!session) {\n\t\t\t\thandleError(\"No active browser session\");\n\t\t\t}\n\n\t\t\tconst result = await client.goForward(session.id);\n\n\t\t\tif (parent?.json) {\n\t\t\t\tconsole.log(JSON.stringify(result, null, 2));\n\t\t\t} else {\n\t\t\t\tconsole.log(formatNavigationResult(result));\n\t\t\t}\n\t\t});\n\n\t// Refresh command\n\tbrowser\n\t\t.command(\"refresh\")\n\t\t.description(\"Refresh the current page\")\n\t\t.action(async (_opts, cmd) => {\n\t\t\tconst parent = cmd.parent?.opts() as { json?: boolean } | undefined;\n\t\t\tconst service = requireService(ctx);\n\t\t\tconst client = service.getClient();\n\n\t\t\tconst session = await service.getCurrentSession();\n\t\t\tif (!session) {\n\t\t\t\thandleError(\"No active browser session\");\n\t\t\t}\n\n\t\t\tconst result = await client.refresh(session.id);\n\n\t\t\tif (parent?.json) {\n\t\t\t\tconsole.log(JSON.stringify(result, null, 2));\n\t\t\t} else {\n\t\t\t\tconsole.log(formatNavigationResult(result));\n\t\t\t}\n\t\t});\n\n\t// Click command\n\tbrowser\n\t\t.command(\"click\")\n\t\t.description(\"Click an element on the page\")\n\t\t.argument(\n\t\t\t\"<description>\",\n\t\t\t\"Description of the element to click (natural language)\",\n\t\t)\n\t\t.action(async (description: string, _opts, cmd) => {\n\t\t\tconst parent = cmd.parent?.opts() as { json?: boolean } | undefined;\n\t\t\tconst service = requireService(ctx);\n\t\t\tconst client = service.getClient();\n\n\t\t\tconst session = await service.getCurrentSession();\n\t\t\tif (!session) {\n\t\t\t\thandleError(\"No active browser session\");\n\t\t\t}\n\n\t\t\tconst result = await client.click(session.id, description);\n\n\t\t\tif (parent?.json) {\n\t\t\t\tconsole.log(JSON.stringify(result.data ?? { success: true }, null, 2));\n\t\t\t} else {\n\t\t\t\tconsole.log(`Clicked: ${description}`);\n\t\t\t\tif (result.data) {\n\t\t\t\t\tconsole.log(JSON.stringify(result.data, null, 2));\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t// Type command\n\tbrowser\n\t\t.command(\"type\")\n\t\t.description(\"Type text into a field\")\n\t\t.argument(\"<text>\", \"Text to type\")\n\t\t.requiredOption(\n\t\t\t\"--field <description>\",\n\t\t\t\"Description of the field (natural language)\",\n\t\t)\n\t\t.action(async (text: string, opts: { field: string }, cmd) => {\n\t\t\tconst parent = cmd.parent?.opts() as { json?: boolean } | undefined;\n\t\t\tconst service = requireService(ctx);\n\t\t\tconst client = service.getClient();\n\n\t\t\tconst session = await service.getCurrentSession();\n\t\t\tif (!session) {\n\t\t\t\thandleError(\"No active browser session\");\n\t\t\t}\n\n\t\t\tconst result = await client.type(session.id, text, opts.field);\n\n\t\t\tif (parent?.json) {\n\t\t\t\tconsole.log(JSON.stringify(result.data ?? { success: true }, null, 2));\n\t\t\t} else {\n\t\t\t\tconsole.log(`Typed \"${text}\" into: ${opts.field}`);\n\t\t\t\tif (result.data) {\n\t\t\t\t\tconsole.log(JSON.stringify(result.data, null, 2));\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t// Select command\n\tbrowser\n\t\t.command(\"select\")\n\t\t.description(\"Select an option from a dropdown\")\n\t\t.argument(\"<option>\", \"Option to select\")\n\t\t.requiredOption(\n\t\t\t\"--dropdown <description>\",\n\t\t\t\"Description of the dropdown (natural language)\",\n\t\t)\n\t\t.action(async (option: string, opts: { dropdown: string }, cmd) => {\n\t\t\tconst parent = cmd.parent?.opts() as { json?: boolean } | undefined;\n\t\t\tconst service = requireService(ctx);\n\t\t\tconst client = service.getClient();\n\n\t\t\tconst session = await service.getCurrentSession();\n\t\t\tif (!session) {\n\t\t\t\thandleError(\"No active browser session\");\n\t\t\t}\n\n\t\t\tconst result = await client.select(session.id, option, opts.dropdown);\n\n\t\t\tif (parent?.json) {\n\t\t\t\tconsole.log(JSON.stringify(result.data ?? { success: true }, null, 2));\n\t\t\t} else {\n\t\t\t\tconsole.log(`Selected \"${option}\" from: ${opts.dropdown}`);\n\t\t\t\tif (result.data) {\n\t\t\t\t\tconsole.log(JSON.stringify(result.data, null, 2));\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t// Extract command\n\tbrowser\n\t\t.command(\"extract\")\n\t\t.description(\"Extract information from the page\")\n\t\t.argument(\"<instruction>\", \"What to extract (natural language)\")\n\t\t.action(async (instruction: string, _opts, cmd) => {\n\t\t\tconst parent = cmd.parent?.opts() as { json?: boolean } | undefined;\n\t\t\tconst service = requireService(ctx);\n\t\t\tconst client = service.getClient();\n\n\t\t\tconst session = await service.getCurrentSession();\n\t\t\tif (!session) {\n\t\t\t\thandleError(\"No active browser session\");\n\t\t\t}\n\n\t\t\tconst result = await client.extract(session.id, instruction);\n\n\t\t\tif (parent?.json) {\n\t\t\t\tconsole.log(JSON.stringify(result.data ?? {}, null, 2));\n\t\t\t} else {\n\t\t\t\tconsole.log(`Extracted: ${instruction}`);\n\t\t\t\tconsole.log(JSON.stringify(result.data ?? {}, null, 2));\n\t\t\t}\n\t\t});\n\n\t// Screenshot command\n\tbrowser\n\t\t.command(\"screenshot\")\n\t\t.description(\"Take a screenshot of the current page\")\n\t\t.option(\"--output <path>\", \"Output file path\")\n\t\t.action(async (opts: { output?: string }, cmd) => {\n\t\t\tconst parent = cmd.parent?.opts() as { json?: boolean } | undefined;\n\t\t\tconst service = requireService(ctx);\n\t\t\tconst client = service.getClient();\n\n\t\t\tconst session = await service.getCurrentSession();\n\t\t\tif (!session) {\n\t\t\t\thandleError(\"No active browser session\");\n\t\t\t}\n\n\t\t\tconst result = await client.screenshot(session.id);\n\t\t\tconst data = result.data as { screenshot?: string } | undefined;\n\n\t\t\tif (parent?.json) {\n\t\t\t\tconsole.log(\n\t\t\t\t\tJSON.stringify(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tsuccess: !!data?.screenshot,\n\t\t\t\t\t\t\thasScreenshot: !!data?.screenshot,\n\t\t\t\t\t\t\toutputPath: opts.output ?? null,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tnull,\n\t\t\t\t\t\t2,\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tif (data?.screenshot) {\n\t\t\t\t\tif (opts.output) {\n\t\t\t\t\t\tconst fs = await import(\"node:fs/promises\");\n\t\t\t\t\t\tconst buffer = Buffer.from(data.screenshot, \"base64\");\n\t\t\t\t\t\tawait fs.writeFile(opts.output, buffer);\n\t\t\t\t\t\tconsole.log(`Screenshot saved to: ${opts.output}`);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconsole.log(\"Screenshot captured (use --output to save to file)\");\n\t\t\t\t\t\tconsole.log(`Base64 length: ${data.screenshot.length}`);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tconsole.log(\"Failed to capture screenshot\");\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t// State command\n\tbrowser\n\t\t.command(\"state\")\n\t\t.description(\"Get current browser state\")\n\t\t.action(async (_opts, cmd) => {\n\t\t\tconst parent = cmd.parent?.opts() as { json?: boolean } | undefined;\n\t\t\tconst service = requireService(ctx);\n\t\t\tconst client = service.getClient();\n\n\t\t\tconst session = await service.getCurrentSession();\n\t\t\tif (!session) {\n\t\t\t\thandleError(\"No active browser session\");\n\t\t\t}\n\n\t\t\tconst state = await client.getState(session.id);\n\n\t\t\tif (parent?.json) {\n\t\t\t\tconsole.log(JSON.stringify(state, null, 2));\n\t\t\t} else {\n\t\t\t\tconsole.log(\"Browser State:\");\n\t\t\t\tconsole.log(` URL: ${state.url}`);\n\t\t\t\tconsole.log(` Title: ${state.title}`);\n\t\t\t\tconsole.log(` Session ID: ${state.sessionId}`);\n\t\t\t}\n\t\t});\n\n\t// Solve captcha command\n\tbrowser\n\t\t.command(\"solve-captcha\")\n\t\t.description(\"Attempt to solve a captcha on the page\")\n\t\t.action(async (_opts, cmd) => {\n\t\t\tconst parent = cmd.parent?.opts() as { json?: boolean } | undefined;\n\t\t\tconst service = requireService(ctx);\n\t\t\tconst client = service.getClient();\n\n\t\t\tconst session = await service.getCurrentSession();\n\t\t\tif (!session) {\n\t\t\t\thandleError(\"No active browser session\");\n\t\t\t}\n\n\t\t\tconst result = await client.solveCaptcha(session.id);\n\n\t\t\tif (parent?.json) {\n\t\t\t\tconsole.log(\n\t\t\t\t\tJSON.stringify(result.data ?? { attempted: true }, null, 2),\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tconsole.log(\"Captcha solve attempted\");\n\t\t\t\tif (result.data) {\n\t\t\t\t\tconsole.log(JSON.stringify(result.data, null, 2));\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t// Health command\n\tbrowser\n\t\t.command(\"health\")\n\t\t.description(\"Check browser server health\")\n\t\t.action(async (_opts, cmd) => {\n\t\t\tconst parent = cmd.parent?.opts() as { json?: boolean } | undefined;\n\t\t\tconst service = getBrowserService(ctx);\n\n\t\t\tlet healthy = false;\n\t\t\tif (service) {\n\t\t\t\tconst client = service.getClient();\n\t\t\t\thealthy = await client.health();\n\t\t\t}\n\n\t\t\tif (parent?.json) {\n\t\t\t\tconsole.log(\n\t\t\t\t\tJSON.stringify({ healthy, serviceAvailable: !!service }, null, 2),\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tconsole.log(`Browser server health: ${healthy ? \"OK\" : \"UNHEALTHY\"}`);\n\t\t\t\tconsole.log(`Service available: ${!!service}`);\n\t\t\t}\n\t\t});\n}\n"]}
package/dist/index.d.ts CHANGED
@@ -10,7 +10,7 @@ import { BrowserProcessManager } from "./services/process-manager.js";
10
10
  import { BrowserWebSocketClient } from "./services/websocket-client.js";
11
11
  export * from "./types.js";
12
12
  export * from "./utils/index.js";
13
- export { BrowserService, Session, BrowserWebSocketClient, BrowserProcessManager };
13
+ export { BrowserService, Session, BrowserWebSocketClient, BrowserProcessManager, };
14
14
  export { browserNavigateAction, browserClickAction, browserTypeAction, browserSelectAction, browserExtractAction, browserScreenshotAction, };
15
15
  export declare const browserPlugin: Plugin;
16
16
  export default browserPlugin;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAyB,MAAM,EAAmC,MAAM,eAAe,CAAC;AAGpG,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,+BAA+B,CAAC;AACxE,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AAExE,cAAc,YAAY,CAAC;AAC3B,cAAc,kBAAkB,CAAC;AACjC,OAAO,EAAE,cAAc,EAAE,OAAO,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,CAAC;AAClF,OAAO,EACL,qBAAqB,EACrB,kBAAkB,EAClB,iBAAiB,EACjB,mBAAmB,EACnB,oBAAoB,EACpB,uBAAuB,GACxB,CAAC;AA6EF,eAAO,MAAM,aAAa,EAAE,MA+C3B,CAAC;AAEF,eAAe,aAAa,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAiB,MAAM,EAAE,MAAM,eAAe,CAAC;AAG3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAEtD,OAAO,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,+BAA+B,CAAC;AACxE,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AAExE,cAAc,YAAY,CAAC;AAC3B,cAAc,kBAAkB,CAAC;AACjC,OAAO,EACN,cAAc,EACd,OAAO,EACP,sBAAsB,EACtB,qBAAqB,GACrB,CAAC;AACF,OAAO,EACN,qBAAqB,EACrB,kBAAkB,EAClB,iBAAiB,EACjB,mBAAmB,EACnB,oBAAoB,EACpB,uBAAuB,GACvB,CAAC;AAwBF,eAAO,MAAM,aAAa,EAAE,MAsD3B,CAAC;AAEF,eAAe,aAAa,CAAC"}
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import { logger, ServiceType } from "@elizaos/core";
1
+ import { logger } from "@elizaos/core";
2
2
  import { z } from "zod";
3
3
  import { browserClickAction } from "./actions/click.js";
4
4
  import { browserExtractAction } from "./actions/extract.js";
@@ -6,12 +6,13 @@ import { browserNavigateAction } from "./actions/navigate.js";
6
6
  import { browserScreenshotAction } from "./actions/screenshot.js";
7
7
  import { browserSelectAction } from "./actions/select.js";
8
8
  import { browserTypeAction } from "./actions/type.js";
9
+ import { browserStateProvider } from "./providers/browser-state.js";
9
10
  import { BrowserService, Session } from "./services/browser-service.js";
10
11
  import { BrowserProcessManager } from "./services/process-manager.js";
11
12
  import { BrowserWebSocketClient } from "./services/websocket-client.js";
12
13
  export * from "./types.js";
13
14
  export * from "./utils/index.js";
14
- export { BrowserService, Session, BrowserWebSocketClient, BrowserProcessManager };
15
+ export { BrowserService, Session, BrowserWebSocketClient, BrowserProcessManager, };
15
16
  export { browserNavigateAction, browserClickAction, browserTypeAction, browserSelectAction, browserExtractAction, browserScreenshotAction, };
16
17
  const configSchema = z.object({
17
18
  BROWSERBASE_API_KEY: z.string().optional(),
@@ -28,51 +29,6 @@ const configSchema = z.object({
28
29
  CAPSOLVER_API_KEY: z.string().optional(),
29
30
  BROWSER_SERVER_PORT: z.string().optional().default("3456"),
30
31
  });
31
- const browserStateProvider = {
32
- name: "BROWSER_STATE",
33
- description: "Provides current browser state information",
34
- get: async (runtime, _message, _state) => {
35
- const service = runtime.getService(ServiceType.BROWSER);
36
- const session = await service?.getCurrentSession();
37
- if (!session || !service) {
38
- return {
39
- text: "No active browser session",
40
- values: {
41
- hasSession: false,
42
- },
43
- data: {},
44
- };
45
- }
46
- try {
47
- const client = service.getClient();
48
- const state = await client.getState(session.id);
49
- return {
50
- text: `Current browser page: "${state.title}" at ${state.url}`,
51
- values: {
52
- hasSession: true,
53
- url: state.url,
54
- title: state.title,
55
- },
56
- data: {
57
- sessionId: session.id,
58
- createdAt: session.createdAt.toISOString(),
59
- },
60
- };
61
- }
62
- catch (error) {
63
- const errorMessage = error instanceof Error ? error.message : String(error);
64
- logger.error(`Error getting browser state: ${errorMessage}`);
65
- return {
66
- text: "Error getting browser state",
67
- values: {
68
- hasSession: true,
69
- error: true,
70
- },
71
- data: {},
72
- };
73
- }
74
- },
75
- };
76
32
  // CLI self-registration - importing this module triggers CLI command registration.
77
33
  // Wrapped in a dynamic import so the plugin still loads when @elizaos/plugin-cli
78
34
  // is unavailable (e.g. when consumed outside the monorepo).
@@ -102,13 +58,19 @@ export const browserPlugin = {
102
58
  process.env[key] = String(value);
103
59
  }
104
60
  }
61
+ // Auto-enable browser actions when the plugin is loaded.
62
+ // The plugin being present in the runtime means the user toggled it on.
63
+ process.env.ENABLE_BROWSER = "true";
64
+ process.env.BROWSER_ENABLED = "true";
105
65
  logger.info("Browser plugin initialized successfully");
106
66
  }
107
67
  catch (error) {
108
68
  if (error && typeof error === "object" && "issues" in error) {
109
69
  const zodError = error;
110
70
  if (Array.isArray(zodError.issues)) {
111
- const errorMessages = zodError.issues.map((e) => e.message).join(", ");
71
+ const errorMessages = zodError.issues
72
+ .map((e) => e.message)
73
+ .join(", ");
112
74
  throw new Error(`Invalid plugin configuration: ${errorMessages}`);
113
75
  }
114
76
  }
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["import type { IAgentRuntime, Memory, Plugin, Provider, ProviderResult, State } from \"@elizaos/core\";\nimport { logger, ServiceType } from \"@elizaos/core\";\nimport { z } from \"zod\";\nimport { browserClickAction } from \"./actions/click.js\";\nimport { browserExtractAction } from \"./actions/extract.js\";\nimport { browserNavigateAction } from \"./actions/navigate.js\";\nimport { browserScreenshotAction } from \"./actions/screenshot.js\";\nimport { browserSelectAction } from \"./actions/select.js\";\nimport { browserTypeAction } from \"./actions/type.js\";\nimport { BrowserService, Session } from \"./services/browser-service.js\";\nimport { BrowserProcessManager } from \"./services/process-manager.js\";\nimport { BrowserWebSocketClient } from \"./services/websocket-client.js\";\n\nexport * from \"./types.js\";\nexport * from \"./utils/index.js\";\nexport { BrowserService, Session, BrowserWebSocketClient, BrowserProcessManager };\nexport {\n browserNavigateAction,\n browserClickAction,\n browserTypeAction,\n browserSelectAction,\n browserExtractAction,\n browserScreenshotAction,\n};\nconst configSchema = z.object({\n BROWSERBASE_API_KEY: z.string().optional(),\n BROWSERBASE_PROJECT_ID: z.string().optional(),\n OPENAI_API_KEY: z.string().optional(),\n ANTHROPIC_API_KEY: z.string().optional(),\n OLLAMA_BASE_URL: z.string().optional(),\n OLLAMA_MODEL: z.string().optional(),\n BROWSER_HEADLESS: z\n .string()\n .transform((val: string) => val === \"true\")\n .optional()\n .default(true),\n CAPSOLVER_API_KEY: z.string().optional(),\n BROWSER_SERVER_PORT: z.string().optional().default(\"3456\"),\n});\n\nconst browserStateProvider: Provider = {\n name: \"BROWSER_STATE\",\n description: \"Provides current browser state information\",\n\n get: async (\n runtime: IAgentRuntime,\n _message: Memory,\n _state?: State\n ): Promise<ProviderResult> => {\n const service = runtime.getService<BrowserService>(ServiceType.BROWSER);\n const session = await service?.getCurrentSession();\n\n if (!session || !service) {\n return {\n text: \"No active browser session\",\n values: {\n hasSession: false,\n },\n data: {},\n };\n }\n\n try {\n const client = service.getClient();\n const state = await client.getState(session.id);\n\n return {\n text: `Current browser page: \"${state.title}\" at ${state.url}`,\n values: {\n hasSession: true,\n url: state.url,\n title: state.title,\n },\n data: {\n sessionId: session.id,\n createdAt: session.createdAt.toISOString(),\n },\n };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n logger.error(`Error getting browser state: ${errorMessage}`);\n return {\n text: \"Error getting browser state\",\n values: {\n hasSession: true,\n error: true,\n },\n data: {},\n };\n }\n },\n};\n\n// CLI self-registration - importing this module triggers CLI command registration.\n// Wrapped in a dynamic import so the plugin still loads when @elizaos/plugin-cli\n// is unavailable (e.g. when consumed outside the monorepo).\nimport(\"./cli/index.js\").catch(() => {\n // plugin-cli not available — skip CLI registration silently\n});\n\nexport const browserPlugin: Plugin = {\n name: \"plugin-browser\",\n description: \"Browser automation plugin\",\n config: {\n BROWSERBASE_API_KEY: process.env.BROWSERBASE_API_KEY ?? null,\n BROWSERBASE_PROJECT_ID: process.env.BROWSERBASE_PROJECT_ID ?? null,\n OPENAI_API_KEY: process.env.OPENAI_API_KEY ?? null,\n ANTHROPIC_API_KEY: process.env.ANTHROPIC_API_KEY ?? null,\n OLLAMA_BASE_URL: process.env.OLLAMA_BASE_URL ?? null,\n OLLAMA_MODEL: process.env.OLLAMA_MODEL ?? null,\n BROWSER_HEADLESS: process.env.BROWSER_HEADLESS ?? \"true\",\n CAPSOLVER_API_KEY: process.env.CAPSOLVER_API_KEY ?? null,\n BROWSER_SERVER_PORT: process.env.BROWSER_SERVER_PORT ?? \"3456\",\n },\n async init(config: Record<string, string | null>, _runtime: IAgentRuntime) {\n logger.info(\"Initializing browser automation plugin\");\n try {\n const validatedConfig = await configSchema.parseAsync(config);\n\n for (const [key, value] of Object.entries(validatedConfig)) {\n if (value !== undefined && value !== null) {\n process.env[key] = String(value);\n }\n }\n\n logger.info(\"Browser plugin initialized successfully\");\n } catch (error) {\n if (error && typeof error === \"object\" && \"issues\" in error) {\n const zodError = error as { issues?: Array<{ message: string }> };\n if (Array.isArray(zodError.issues)) {\n const errorMessages = zodError.issues.map((e) => e.message).join(\", \");\n throw new Error(`Invalid plugin configuration: ${errorMessages}`);\n }\n }\n throw error;\n }\n },\n services: [BrowserService],\n actions: [\n browserNavigateAction,\n browserClickAction,\n browserTypeAction,\n browserSelectAction,\n browserExtractAction,\n browserScreenshotAction,\n ],\n providers: [browserStateProvider],\n};\n\nexport default browserPlugin;\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["import type { IAgentRuntime, Plugin } from \"@elizaos/core\";\nimport { logger } from \"@elizaos/core\";\nimport { z } from \"zod\";\nimport { browserClickAction } from \"./actions/click.js\";\nimport { browserExtractAction } from \"./actions/extract.js\";\nimport { browserNavigateAction } from \"./actions/navigate.js\";\nimport { browserScreenshotAction } from \"./actions/screenshot.js\";\nimport { browserSelectAction } from \"./actions/select.js\";\nimport { browserTypeAction } from \"./actions/type.js\";\nimport { browserStateProvider } from \"./providers/browser-state.js\";\nimport { BrowserService, Session } from \"./services/browser-service.js\";\nimport { BrowserProcessManager } from \"./services/process-manager.js\";\nimport { BrowserWebSocketClient } from \"./services/websocket-client.js\";\n\nexport * from \"./types.js\";\nexport * from \"./utils/index.js\";\nexport {\n\tBrowserService,\n\tSession,\n\tBrowserWebSocketClient,\n\tBrowserProcessManager,\n};\nexport {\n\tbrowserNavigateAction,\n\tbrowserClickAction,\n\tbrowserTypeAction,\n\tbrowserSelectAction,\n\tbrowserExtractAction,\n\tbrowserScreenshotAction,\n};\nconst configSchema = z.object({\n\tBROWSERBASE_API_KEY: z.string().optional(),\n\tBROWSERBASE_PROJECT_ID: z.string().optional(),\n\tOPENAI_API_KEY: z.string().optional(),\n\tANTHROPIC_API_KEY: z.string().optional(),\n\tOLLAMA_BASE_URL: z.string().optional(),\n\tOLLAMA_MODEL: z.string().optional(),\n\tBROWSER_HEADLESS: z\n\t\t.string()\n\t\t.transform((val: string) => val === \"true\")\n\t\t.optional()\n\t\t.default(true),\n\tCAPSOLVER_API_KEY: z.string().optional(),\n\tBROWSER_SERVER_PORT: z.string().optional().default(\"3456\"),\n});\n\n// CLI self-registration - importing this module triggers CLI command registration.\n// Wrapped in a dynamic import so the plugin still loads when @elizaos/plugin-cli\n// is unavailable (e.g. when consumed outside the monorepo).\nimport(\"./cli/index.js\").catch(() => {\n\t// plugin-cli not available — skip CLI registration silently\n});\n\nexport const browserPlugin: Plugin = {\n\tname: \"plugin-browser\",\n\tdescription: \"Browser automation plugin\",\n\tconfig: {\n\t\tBROWSERBASE_API_KEY: process.env.BROWSERBASE_API_KEY ?? null,\n\t\tBROWSERBASE_PROJECT_ID: process.env.BROWSERBASE_PROJECT_ID ?? null,\n\t\tOPENAI_API_KEY: process.env.OPENAI_API_KEY ?? null,\n\t\tANTHROPIC_API_KEY: process.env.ANTHROPIC_API_KEY ?? null,\n\t\tOLLAMA_BASE_URL: process.env.OLLAMA_BASE_URL ?? null,\n\t\tOLLAMA_MODEL: process.env.OLLAMA_MODEL ?? null,\n\t\tBROWSER_HEADLESS: process.env.BROWSER_HEADLESS ?? \"true\",\n\t\tCAPSOLVER_API_KEY: process.env.CAPSOLVER_API_KEY ?? null,\n\t\tBROWSER_SERVER_PORT: process.env.BROWSER_SERVER_PORT ?? \"3456\",\n\t},\n\tasync init(config: Record<string, string | null>, _runtime: IAgentRuntime) {\n\t\tlogger.info(\"Initializing browser automation plugin\");\n\t\ttry {\n\t\t\tconst validatedConfig = await configSchema.parseAsync(config);\n\n\t\t\tfor (const [key, value] of Object.entries(validatedConfig)) {\n\t\t\t\tif (value !== undefined && value !== null) {\n\t\t\t\t\tprocess.env[key] = String(value);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Auto-enable browser actions when the plugin is loaded.\n\t\t\t// The plugin being present in the runtime means the user toggled it on.\n\t\t\tprocess.env.ENABLE_BROWSER = \"true\";\n\t\t\tprocess.env.BROWSER_ENABLED = \"true\";\n\n\t\t\tlogger.info(\"Browser plugin initialized successfully\");\n\t\t} catch (error) {\n\t\t\tif (error && typeof error === \"object\" && \"issues\" in error) {\n\t\t\t\tconst zodError = error as { issues?: Array<{ message: string }> };\n\t\t\t\tif (Array.isArray(zodError.issues)) {\n\t\t\t\t\tconst errorMessages = zodError.issues\n\t\t\t\t\t\t.map((e) => e.message)\n\t\t\t\t\t\t.join(\", \");\n\t\t\t\t\tthrow new Error(`Invalid plugin configuration: ${errorMessages}`);\n\t\t\t\t}\n\t\t\t}\n\t\t\tthrow error;\n\t\t}\n\t},\n\tservices: [BrowserService],\n\tactions: [\n\t\tbrowserNavigateAction,\n\t\tbrowserClickAction,\n\t\tbrowserTypeAction,\n\t\tbrowserSelectAction,\n\t\tbrowserExtractAction,\n\t\tbrowserScreenshotAction,\n\t],\n\tproviders: [browserStateProvider],\n};\n\nexport default browserPlugin;\n"]}
@@ -0,0 +1,4 @@
1
+ import type { Memory } from "@elizaos/core";
2
+ export declare function validateActionKeywords(message: Memory, recentMessages: unknown, keywords: string[]): boolean;
3
+ export declare function validateActionRegex(message: Memory, recentMessages: unknown, regex: RegExp): boolean;
4
+ //# sourceMappingURL=providerRelevance.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"providerRelevance.d.ts","sourceRoot":"","sources":["../src/providerRelevance.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAqB5C,wBAAgB,sBAAsB,CACrC,OAAO,EAAE,MAAM,EACf,cAAc,EAAE,OAAO,EACvB,QAAQ,EAAE,MAAM,EAAE,GAChB,OAAO,CAIT;AAED,wBAAgB,mBAAmB,CAClC,OAAO,EAAE,MAAM,EACf,cAAc,EAAE,OAAO,EACvB,KAAK,EAAE,MAAM,GACX,OAAO,CAIT"}
@@ -0,0 +1,33 @@
1
+ function getMessageText(message) {
2
+ if (!message || typeof message !== "object")
3
+ return "";
4
+ const content = message.content;
5
+ if (typeof content === "string")
6
+ return content;
7
+ if (!content || typeof content !== "object")
8
+ return "";
9
+ const text = content.text;
10
+ return typeof text === "string" ? text : "";
11
+ }
12
+ function toHaystack(message, recentMessages) {
13
+ const recent = Array.isArray(recentMessages) ? recentMessages : [];
14
+ return [
15
+ getMessageText(message),
16
+ ...recent.map((entry) => getMessageText(entry)),
17
+ ]
18
+ .join(" ")
19
+ .toLowerCase();
20
+ }
21
+ export function validateActionKeywords(message, recentMessages, keywords) {
22
+ const haystack = toHaystack(message, recentMessages);
23
+ if (!haystack.trim())
24
+ return true;
25
+ return keywords.some((keyword) => haystack.includes(keyword.toLowerCase()));
26
+ }
27
+ export function validateActionRegex(message, recentMessages, regex) {
28
+ const haystack = toHaystack(message, recentMessages);
29
+ if (!haystack.trim())
30
+ return true;
31
+ return regex.test(haystack);
32
+ }
33
+ //# sourceMappingURL=providerRelevance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"providerRelevance.js","sourceRoot":"","sources":["../src/providerRelevance.ts"],"names":[],"mappings":"AAEA,SAAS,cAAc,CAAC,OAAgB;IACvC,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,OAAO,EAAE,CAAC;IACvD,MAAM,OAAO,GAAI,OAAiC,CAAC,OAAO,CAAC;IAC3D,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,OAAO,OAAO,CAAC;IAChD,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,OAAO,EAAE,CAAC;IACvD,MAAM,IAAI,GAAI,OAA8B,CAAC,IAAI,CAAC;IAClD,OAAO,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;AAC7C,CAAC;AAED,SAAS,UAAU,CAAC,OAAe,EAAE,cAAuB;IAC3D,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC;IACnE,OAAO;QACN,cAAc,CAAC,OAAO,CAAC;QACvB,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;KAC/C;SACC,IAAI,CAAC,GAAG,CAAC;SACT,WAAW,EAAE,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,sBAAsB,CACrC,OAAe,EACf,cAAuB,EACvB,QAAkB;IAElB,MAAM,QAAQ,GAAG,UAAU,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;IACrD,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE;QAAE,OAAO,IAAI,CAAC;IAClC,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;AAC7E,CAAC;AAED,MAAM,UAAU,mBAAmB,CAClC,OAAe,EACf,cAAuB,EACvB,KAAa;IAEb,MAAM,QAAQ,GAAG,UAAU,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;IACrD,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE;QAAE,OAAO,IAAI,CAAC;IAClC,OAAO,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAC7B,CAAC","sourcesContent":["import type { Memory } from \"@elizaos/core\";\n\nfunction getMessageText(message: unknown): string {\n\tif (!message || typeof message !== \"object\") return \"\";\n\tconst content = (message as { content?: unknown }).content;\n\tif (typeof content === \"string\") return content;\n\tif (!content || typeof content !== \"object\") return \"\";\n\tconst text = (content as { text?: unknown }).text;\n\treturn typeof text === \"string\" ? text : \"\";\n}\n\nfunction toHaystack(message: Memory, recentMessages: unknown): string {\n\tconst recent = Array.isArray(recentMessages) ? recentMessages : [];\n\treturn [\n\t\tgetMessageText(message),\n\t\t...recent.map((entry) => getMessageText(entry)),\n\t]\n\t\t.join(\" \")\n\t\t.toLowerCase();\n}\n\nexport function validateActionKeywords(\n\tmessage: Memory,\n\trecentMessages: unknown,\n\tkeywords: string[],\n): boolean {\n\tconst haystack = toHaystack(message, recentMessages);\n\tif (!haystack.trim()) return true;\n\treturn keywords.some((keyword) => haystack.includes(keyword.toLowerCase()));\n}\n\nexport function validateActionRegex(\n\tmessage: Memory,\n\trecentMessages: unknown,\n\tregex: RegExp,\n): boolean {\n\tconst haystack = toHaystack(message, recentMessages);\n\tif (!haystack.trim()) return true;\n\treturn regex.test(haystack);\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"browser-state.d.ts","sourceRoot":"","sources":["../../src/providers/browser-state.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAyB,QAAQ,EAAyB,MAAM,eAAe,CAAC;AAI5F,eAAO,MAAM,oBAAoB,EAAE,QAmDlC,CAAC"}
1
+ {"version":3,"file":"browser-state.d.ts","sourceRoot":"","sources":["../../src/providers/browser-state.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAGX,QAAQ,EAGR,MAAM,eAAe,CAAC;AAQvB,eAAO,MAAM,oBAAoB,EAAE,QAgFlC,CAAC"}
@@ -1,8 +1,33 @@
1
1
  import { logger, ServiceType } from "@elizaos/core";
2
+ import { validateActionKeywords, validateActionRegex, } from "../providerRelevance.js";
2
3
  export const browserStateProvider = {
3
4
  name: "BROWSER_STATE",
4
5
  description: "Provides current browser state information",
6
+ dynamic: true,
5
7
  get: async (runtime, _message, _state) => {
8
+ const __providerKeywords = [
9
+ "browser",
10
+ "state",
11
+ "browserstateprovider",
12
+ "plugin",
13
+ "status",
14
+ "context",
15
+ "info",
16
+ "details",
17
+ "chat",
18
+ "conversation",
19
+ "agent",
20
+ "room",
21
+ "channel",
22
+ "user",
23
+ ];
24
+ const __providerRegex = new RegExp(`\\b(${__providerKeywords.join("|")})\\b`, "i");
25
+ const __recentMessages = _state?.recentMessagesData || [];
26
+ const __isRelevant = validateActionKeywords(_message, __recentMessages, __providerKeywords) ||
27
+ validateActionRegex(_message, __recentMessages, __providerRegex);
28
+ if (!__isRelevant) {
29
+ return { text: "" };
30
+ }
6
31
  const service = runtime.getService(ServiceType.BROWSER);
7
32
  const session = await service?.getCurrentSession();
8
33
  if (!session || !service) {
@@ -1 +1 @@
1
- {"version":3,"file":"browser-state.js","sourceRoot":"","sources":["../../src/providers/browser-state.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAGpD,MAAM,CAAC,MAAM,oBAAoB,GAAa;IAC5C,IAAI,EAAE,eAAe;IACrB,WAAW,EAAE,4CAA4C;IAEzD,GAAG,EAAE,KAAK,EACR,OAAsB,EACtB,QAAgB,EAChB,MAAc,EACW,EAAE;QAC3B,MAAM,OAAO,GAAG,OAAO,CAAC,UAAU,CAAiB,WAAW,CAAC,OAAO,CAAC,CAAC;QACxE,MAAM,OAAO,GAAG,MAAM,OAAO,EAAE,iBAAiB,EAAE,CAAC;QAEnD,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC;YACzB,OAAO;gBACL,IAAI,EAAE,2BAA2B;gBACjC,MAAM,EAAE;oBACN,UAAU,EAAE,KAAK;iBAClB;gBACD,IAAI,EAAE,EAAE;aACT,CAAC;QACJ,CAAC;QAED,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;YACnC,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YAEhD,OAAO;gBACL,IAAI,EAAE,0BAA0B,KAAK,CAAC,KAAK,QAAQ,KAAK,CAAC,GAAG,EAAE;gBAC9D,MAAM,EAAE;oBACN,UAAU,EAAE,IAAI;oBAChB,GAAG,EAAE,KAAK,CAAC,GAAG;oBACd,KAAK,EAAE,KAAK,CAAC,KAAK;iBACnB;gBACD,IAAI,EAAE;oBACJ,SAAS,EAAE,OAAO,CAAC,EAAE;oBACrB,SAAS,EAAE,OAAO,CAAC,SAAS,CAAC,WAAW,EAAE;iBAC3C;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,YAAY,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC5E,MAAM,CAAC,KAAK,CAAC,gCAAgC,YAAY,EAAE,CAAC,CAAC;YAC7D,OAAO;gBACL,IAAI,EAAE,6BAA6B;gBACnC,MAAM,EAAE;oBACN,UAAU,EAAE,IAAI;oBAChB,KAAK,EAAE,IAAI;iBACZ;gBACD,IAAI,EAAE,EAAE;aACT,CAAC;QACJ,CAAC;IACH,CAAC;CACF,CAAC","sourcesContent":["import type { IAgentRuntime, Memory, Provider, ProviderResult, State } from \"@elizaos/core\";\nimport { logger, ServiceType } from \"@elizaos/core\";\nimport type { BrowserService } from \"../services/browser-service.js\";\n\nexport const browserStateProvider: Provider = {\n name: \"BROWSER_STATE\",\n description: \"Provides current browser state information\",\n\n get: async (\n runtime: IAgentRuntime,\n _message: Memory,\n _state?: State\n ): Promise<ProviderResult> => {\n const service = runtime.getService<BrowserService>(ServiceType.BROWSER);\n const session = await service?.getCurrentSession();\n\n if (!session || !service) {\n return {\n text: \"No active browser session\",\n values: {\n hasSession: false,\n },\n data: {},\n };\n }\n\n try {\n const client = service.getClient();\n const state = await client.getState(session.id);\n\n return {\n text: `Current browser page: \"${state.title}\" at ${state.url}`,\n values: {\n hasSession: true,\n url: state.url,\n title: state.title,\n },\n data: {\n sessionId: session.id,\n createdAt: session.createdAt.toISOString(),\n },\n };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n logger.error(`Error getting browser state: ${errorMessage}`);\n return {\n text: \"Error getting browser state\",\n values: {\n hasSession: true,\n error: true,\n },\n data: {},\n };\n }\n },\n};\n"]}
1
+ {"version":3,"file":"browser-state.js","sourceRoot":"","sources":["../../src/providers/browser-state.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EACN,sBAAsB,EACtB,mBAAmB,GACnB,MAAM,yBAAyB,CAAC;AAGjC,MAAM,CAAC,MAAM,oBAAoB,GAAa;IAC7C,IAAI,EAAE,eAAe;IACrB,WAAW,EAAE,4CAA4C;IAEzD,OAAO,EAAE,IAAI;IACb,GAAG,EAAE,KAAK,EACT,OAAsB,EACtB,QAAgB,EAChB,MAAc,EACY,EAAE;QAC5B,MAAM,kBAAkB,GAAG;YAC1B,SAAS;YACT,OAAO;YACP,sBAAsB;YACtB,QAAQ;YACR,QAAQ;YACR,SAAS;YACT,MAAM;YACN,SAAS;YACT,MAAM;YACN,cAAc;YACd,OAAO;YACP,MAAM;YACN,SAAS;YACT,MAAM;SACN,CAAC;QACF,MAAM,eAAe,GAAG,IAAI,MAAM,CACjC,OAAO,kBAAkB,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,EACzC,GAAG,CACH,CAAC;QACF,MAAM,gBAAgB,GAAG,MAAM,EAAE,kBAAkB,IAAI,EAAE,CAAC;QAC1D,MAAM,YAAY,GACjB,sBAAsB,CAAC,QAAQ,EAAE,gBAAgB,EAAE,kBAAkB,CAAC;YACtE,mBAAmB,CAAC,QAAQ,EAAE,gBAAgB,EAAE,eAAe,CAAC,CAAC;QAClE,IAAI,CAAC,YAAY,EAAE,CAAC;YACnB,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;QACrB,CAAC;QACD,MAAM,OAAO,GAAG,OAAO,CAAC,UAAU,CAAiB,WAAW,CAAC,OAAO,CAAC,CAAC;QACxE,MAAM,OAAO,GAAG,MAAM,OAAO,EAAE,iBAAiB,EAAE,CAAC;QAEnD,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC;YAC1B,OAAO;gBACN,IAAI,EAAE,2BAA2B;gBACjC,MAAM,EAAE;oBACP,UAAU,EAAE,KAAK;iBACjB;gBACD,IAAI,EAAE,EAAE;aACR,CAAC;QACH,CAAC;QAED,IAAI,CAAC;YACJ,MAAM,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;YACnC,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YAEhD,OAAO;gBACN,IAAI,EAAE,0BAA0B,KAAK,CAAC,KAAK,QAAQ,KAAK,CAAC,GAAG,EAAE;gBAC9D,MAAM,EAAE;oBACP,UAAU,EAAE,IAAI;oBAChB,GAAG,EAAE,KAAK,CAAC,GAAG;oBACd,KAAK,EAAE,KAAK,CAAC,KAAK;iBAClB;gBACD,IAAI,EAAE;oBACL,SAAS,EAAE,OAAO,CAAC,EAAE;oBACrB,SAAS,EAAE,OAAO,CAAC,SAAS,CAAC,WAAW,EAAE;iBAC1C;aACD,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,MAAM,YAAY,GACjB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACxD,MAAM,CAAC,KAAK,CAAC,gCAAgC,YAAY,EAAE,CAAC,CAAC;YAC7D,OAAO;gBACN,IAAI,EAAE,6BAA6B;gBACnC,MAAM,EAAE;oBACP,UAAU,EAAE,IAAI;oBAChB,KAAK,EAAE,IAAI;iBACX;gBACD,IAAI,EAAE,EAAE;aACR,CAAC;QACH,CAAC;IACF,CAAC;CACD,CAAC","sourcesContent":["import type {\n\tIAgentRuntime,\n\tMemory,\n\tProvider,\n\tProviderResult,\n\tState,\n} from \"@elizaos/core\";\nimport { logger, ServiceType } from \"@elizaos/core\";\nimport {\n\tvalidateActionKeywords,\n\tvalidateActionRegex,\n} from \"../providerRelevance.js\";\nimport type { BrowserService } from \"../services/browser-service.js\";\n\nexport const browserStateProvider: Provider = {\n\tname: \"BROWSER_STATE\",\n\tdescription: \"Provides current browser state information\",\n\n\tdynamic: true,\n\tget: async (\n\t\truntime: IAgentRuntime,\n\t\t_message: Memory,\n\t\t_state?: State,\n\t): Promise<ProviderResult> => {\n\t\tconst __providerKeywords = [\n\t\t\t\"browser\",\n\t\t\t\"state\",\n\t\t\t\"browserstateprovider\",\n\t\t\t\"plugin\",\n\t\t\t\"status\",\n\t\t\t\"context\",\n\t\t\t\"info\",\n\t\t\t\"details\",\n\t\t\t\"chat\",\n\t\t\t\"conversation\",\n\t\t\t\"agent\",\n\t\t\t\"room\",\n\t\t\t\"channel\",\n\t\t\t\"user\",\n\t\t];\n\t\tconst __providerRegex = new RegExp(\n\t\t\t`\\\\b(${__providerKeywords.join(\"|\")})\\\\b`,\n\t\t\t\"i\",\n\t\t);\n\t\tconst __recentMessages = _state?.recentMessagesData || [];\n\t\tconst __isRelevant =\n\t\t\tvalidateActionKeywords(_message, __recentMessages, __providerKeywords) ||\n\t\t\tvalidateActionRegex(_message, __recentMessages, __providerRegex);\n\t\tif (!__isRelevant) {\n\t\t\treturn { text: \"\" };\n\t\t}\n\t\tconst service = runtime.getService<BrowserService>(ServiceType.BROWSER);\n\t\tconst session = await service?.getCurrentSession();\n\n\t\tif (!session || !service) {\n\t\t\treturn {\n\t\t\t\ttext: \"No active browser session\",\n\t\t\t\tvalues: {\n\t\t\t\t\thasSession: false,\n\t\t\t\t},\n\t\t\t\tdata: {},\n\t\t\t};\n\t\t}\n\n\t\ttry {\n\t\t\tconst client = service.getClient();\n\t\t\tconst state = await client.getState(session.id);\n\n\t\t\treturn {\n\t\t\t\ttext: `Current browser page: \"${state.title}\" at ${state.url}`,\n\t\t\t\tvalues: {\n\t\t\t\t\thasSession: true,\n\t\t\t\t\turl: state.url,\n\t\t\t\t\ttitle: state.title,\n\t\t\t\t},\n\t\t\t\tdata: {\n\t\t\t\t\tsessionId: session.id,\n\t\t\t\t\tcreatedAt: session.createdAt.toISOString(),\n\t\t\t\t},\n\t\t\t};\n\t\t} catch (error) {\n\t\t\tconst errorMessage =\n\t\t\t\terror instanceof Error ? error.message : String(error);\n\t\t\tlogger.error(`Error getting browser state: ${errorMessage}`);\n\t\t\treturn {\n\t\t\t\ttext: \"Error getting browser state\",\n\t\t\t\tvalues: {\n\t\t\t\t\thasSession: true,\n\t\t\t\t\terror: true,\n\t\t\t\t},\n\t\t\t\tdata: {},\n\t\t\t};\n\t\t}\n\t},\n};\n"]}
@@ -14,6 +14,8 @@ export declare class BrowserService extends Service {
14
14
  private processManager;
15
15
  private client;
16
16
  private isInitialized;
17
+ /** Whether this service is operating in sandbox remote mode. */
18
+ private sandboxMode;
17
19
  constructor(runtime?: IAgentRuntime);
18
20
  static start(runtime: IAgentRuntime): Promise<BrowserService>;
19
21
  static stopRuntime(runtime: IAgentRuntime): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"browser-service.d.ts","sourceRoot":"","sources":["../../src/services/browser-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,aAAa,EAAU,OAAO,EAAe,MAAM,eAAe,CAAC;AACjF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAElD,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAE/D,qBAAa,OAAQ,YAAW,cAAc;IAEnC,EAAE,EAAE,MAAM;IACV,SAAS,EAAE,IAAI;gBADf,EAAE,EAAE,MAAM,EACV,SAAS,GAAE,IAAiB;CAEtC;AAED,qBAAa,cAAe,SAAQ,OAAO;IACzC,MAAM,CAAC,WAAW,YAAuB;IACzC,qBAAqB,SAAgC;IAErD,OAAO,CAAC,QAAQ,CAA8B;IAC9C,OAAO,CAAC,gBAAgB,CAAuB;IAC/C,OAAO,CAAC,cAAc,CAAwB;IAC9C,OAAO,CAAC,MAAM,CAAyB;IACvC,OAAO,CAAC,aAAa,CAAS;gBAElB,OAAO,CAAC,EAAE,aAAa;WAYtB,KAAK,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,cAAc,CAAC;WAkCtD,WAAW,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IASzD,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAYrB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAkC3B,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAkBlD,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC;IAI3D,iBAAiB,IAAI,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC;IAOjD,kBAAkB,IAAI,OAAO,CAAC,OAAO,CAAC;IAUtC,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAWtD,SAAS,IAAI,sBAAsB;YAOrB,YAAY;CAyB3B"}
1
+ {"version":3,"file":"browser-service.d.ts","sourceRoot":"","sources":["../../src/services/browser-service.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,KAAK,aAAa,EAElB,OAAO,EAEP,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAElD,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAE/D,qBAAa,OAAQ,YAAW,cAAc;IAErC,EAAE,EAAE,MAAM;IACV,SAAS,EAAE,IAAI;gBADf,EAAE,EAAE,MAAM,EACV,SAAS,GAAE,IAAiB;CAEpC;AAED,qBAAa,cAAe,SAAQ,OAAO;IAC1C,MAAM,CAAC,WAAW,YAAuB;IACzC,qBAAqB,SAAgC;IAErD,OAAO,CAAC,QAAQ,CAA8B;IAC9C,OAAO,CAAC,gBAAgB,CAAuB;IAC/C,OAAO,CAAC,cAAc,CAAwB;IAC9C,OAAO,CAAC,MAAM,CAAyB;IACvC,OAAO,CAAC,aAAa,CAAS;IAE9B,gEAAgE;IAChE,OAAO,CAAC,WAAW,CAAS;gBAEhB,OAAO,CAAC,EAAE,aAAa;WAgCtB,KAAK,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,cAAc,CAAC;WAyDtD,WAAW,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAWzD,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAYrB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAsC3B,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAmBlD,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC;IAI3D,iBAAiB,IAAI,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC;IAOjD,kBAAkB,IAAI,OAAO,CAAC,OAAO,CAAC;IAUtC,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAatD,SAAS,IAAI,sBAAsB;YAOrB,YAAY;CA8B1B"}