@jarvis-agent/core 0.1.6 → 0.1.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 (135) hide show
  1. package/README.md +5 -12
  2. package/dist/agent/agent-context.d.ts +32 -0
  3. package/dist/agent/agent-context.d.ts.map +1 -0
  4. package/dist/agent/agent-llm.d.ts +13 -0
  5. package/dist/agent/agent-llm.d.ts.map +1 -0
  6. package/dist/agent/base.d.ts +12 -10
  7. package/dist/agent/base.d.ts.map +1 -1
  8. package/dist/agent/browser/browser-base.d.ts +52 -0
  9. package/dist/agent/browser/browser-base.d.ts.map +1 -0
  10. package/dist/agent/browser/browser-labels.d.ts +43 -0
  11. package/dist/agent/browser/browser-labels.d.ts.map +1 -0
  12. package/dist/agent/browser/browser-screen.d.ts +17 -0
  13. package/dist/agent/browser/browser-screen.d.ts.map +1 -0
  14. package/dist/agent/browser/browser_labels.d.ts +1 -1
  15. package/dist/agent/browser/browser_labels.d.ts.map +1 -1
  16. package/dist/agent/browser/browser_screen.d.ts +1 -1
  17. package/dist/agent/browser/browser_screen.d.ts.map +1 -1
  18. package/dist/agent/browser/build-dom-tree.d.ts +2 -0
  19. package/dist/agent/browser/build-dom-tree.d.ts.map +1 -0
  20. package/dist/agent/browser/index.d.ts +3 -3
  21. package/dist/agent/browser/utils.d.ts +21 -1
  22. package/dist/agent/browser/utils.d.ts.map +1 -1
  23. package/dist/agent/chain.d.ts +45 -0
  24. package/dist/agent/chain.d.ts.map +1 -0
  25. package/dist/agent/computer.d.ts +1 -1
  26. package/dist/agent/computer.d.ts.map +1 -1
  27. package/dist/agent/eko.d.ts +25 -0
  28. package/dist/agent/eko.d.ts.map +1 -0
  29. package/dist/agent/file.d.ts +1 -1
  30. package/dist/agent/file.d.ts.map +1 -1
  31. package/dist/agent/index.d.ts +4 -5
  32. package/dist/agent/index.d.ts.map +1 -1
  33. package/dist/agent/plan.d.ts +13 -0
  34. package/dist/agent/plan.d.ts.map +1 -0
  35. package/dist/agent/replan.d.ts +4 -0
  36. package/dist/agent/replan.d.ts.map +1 -0
  37. package/dist/agent/shell.d.ts +1 -1
  38. package/dist/agent/shell.d.ts.map +1 -1
  39. package/dist/chat/chat-agent.d.ts +21 -0
  40. package/dist/chat/chat-agent.d.ts.map +1 -0
  41. package/dist/chat/chat-context.d.ts +15 -0
  42. package/dist/chat/chat-context.d.ts.map +1 -0
  43. package/dist/chat/chat-llm.d.ts +8 -0
  44. package/dist/chat/chat-llm.d.ts.map +1 -0
  45. package/dist/chat/index.d.ts +9 -0
  46. package/dist/chat/index.d.ts.map +1 -0
  47. package/dist/chat/tools/agent-wrap-tool.d.ts +24 -0
  48. package/dist/chat/tools/agent-wrap-tool.d.ts.map +1 -0
  49. package/dist/chat/tools/deep-action.d.ts +16 -0
  50. package/dist/chat/tools/deep-action.d.ts.map +1 -0
  51. package/dist/chat/tools/variable-storage.d.ts +15 -0
  52. package/dist/chat/tools/variable-storage.d.ts.map +1 -0
  53. package/dist/chat/tools/web-search.d.ts +15 -0
  54. package/dist/chat/tools/web-search.d.ts.map +1 -0
  55. package/dist/chat/tools/webpage-qa.d.ts +16 -0
  56. package/dist/chat/tools/webpage-qa.d.ts.map +1 -0
  57. package/dist/common/tree.d.ts +1 -1
  58. package/dist/common/tree.d.ts.map +1 -1
  59. package/dist/common/utils.d.ts +13 -2
  60. package/dist/common/utils.d.ts.map +1 -1
  61. package/dist/common/workflow.d.ts +3 -0
  62. package/dist/common/workflow.d.ts.map +1 -0
  63. package/dist/common/xml.d.ts +1 -1
  64. package/dist/common/xml.d.ts.map +1 -1
  65. package/dist/config/global.d.ts +4 -0
  66. package/dist/config/global.d.ts.map +1 -0
  67. package/dist/config/index.d.ts +4 -22
  68. package/dist/config/index.d.ts.map +1 -1
  69. package/dist/index.cjs +46108 -0
  70. package/dist/index.cjs.js +87 -76
  71. package/dist/index.cjs.js.map +1 -1
  72. package/dist/index.cjs.map +1 -0
  73. package/dist/index.d.ts +15 -10
  74. package/dist/index.d.ts.map +1 -1
  75. package/dist/index.esm.js +26449 -17475
  76. package/dist/index.esm.js.map +1 -1
  77. package/dist/llm/index.d.ts +2 -21
  78. package/dist/llm/index.d.ts.map +1 -1
  79. package/dist/llm/react.d.ts +9 -0
  80. package/dist/llm/react.d.ts.map +1 -0
  81. package/dist/llm/rlm.d.ts +22 -0
  82. package/dist/llm/rlm.d.ts.map +1 -0
  83. package/dist/memory/index.d.ts +3 -2
  84. package/dist/memory/index.d.ts.map +1 -1
  85. package/dist/memory/memory.d.ts +6 -17
  86. package/dist/memory/memory.d.ts.map +1 -1
  87. package/dist/memory/snapshot.d.ts +1 -1
  88. package/dist/memory/snapshot.d.ts.map +1 -1
  89. package/dist/prompt/agent.d.ts +3 -3
  90. package/dist/prompt/agent.d.ts.map +1 -1
  91. package/dist/prompt/chat.d.ts +3 -0
  92. package/dist/prompt/chat.d.ts.map +1 -0
  93. package/dist/prompt/plan.d.ts +3 -3
  94. package/dist/prompt/plan.d.ts.map +1 -1
  95. package/dist/prompt/prompt-template.d.ts +30 -0
  96. package/dist/prompt/prompt-template.d.ts.map +1 -0
  97. package/dist/service/browser-service.d.ts +7 -0
  98. package/dist/service/browser-service.d.ts.map +1 -0
  99. package/dist/service/chat-service.d.ts +17 -0
  100. package/dist/service/chat-service.d.ts.map +1 -0
  101. package/dist/service/index.d.ts +4 -0
  102. package/dist/service/index.d.ts.map +1 -0
  103. package/dist/tools/foreach-task.d.ts +13 -0
  104. package/dist/tools/foreach-task.d.ts.map +1 -0
  105. package/dist/tools/human-interact.d.ts +15 -0
  106. package/dist/tools/human-interact.d.ts.map +1 -0
  107. package/dist/tools/index.d.ts +6 -6
  108. package/dist/tools/index.d.ts.map +1 -1
  109. package/dist/tools/task-node-status.d.ts +13 -0
  110. package/dist/tools/task-node-status.d.ts.map +1 -0
  111. package/dist/tools/task-result-check.d.ts +18 -0
  112. package/dist/tools/task-result-check.d.ts.map +1 -0
  113. package/dist/tools/todo-list-manager.d.ts +16 -0
  114. package/dist/tools/todo-list-manager.d.ts.map +1 -0
  115. package/dist/tools/variable-storage.d.ts +13 -0
  116. package/dist/tools/variable-storage.d.ts.map +1 -0
  117. package/dist/tools/watch-trigger.d.ts +17 -0
  118. package/dist/tools/watch-trigger.d.ts.map +1 -0
  119. package/dist/tools/wrapper.d.ts +2 -2
  120. package/dist/tools/wrapper.d.ts.map +1 -1
  121. package/dist/types/agent.types.d.ts +124 -0
  122. package/dist/types/agent.types.d.ts.map +1 -0
  123. package/dist/types/chat.types.d.ts +105 -0
  124. package/dist/types/chat.types.d.ts.map +1 -0
  125. package/dist/types/config.types.d.ts +51 -0
  126. package/dist/types/config.types.d.ts.map +1 -0
  127. package/dist/types/index.d.ts +10 -6
  128. package/dist/types/index.d.ts.map +1 -1
  129. package/dist/types/llm.types.d.ts +94 -6
  130. package/dist/types/llm.types.d.ts.map +1 -1
  131. package/dist/types/service.types.d.ts +26 -0
  132. package/dist/types/service.types.d.ts.map +1 -0
  133. package/dist/types/tools.types.d.ts +1 -1
  134. package/dist/types/tools.types.d.ts.map +1 -1
  135. package/package.json +13 -11
package/dist/index.cjs.js CHANGED
@@ -34268,25 +34268,31 @@ class Agent {
34268
34268
  this.description = params.description;
34269
34269
  this.tools = params.tools;
34270
34270
  this.llms = params.llms;
34271
- this.mcpClient = params.mcpClient;
34271
+ this.mcpClients = params.mcpClients || (params.mcpClient ? [params.mcpClient] : []);
34272
34272
  this.planDescription = params.planDescription;
34273
34273
  this.requestHandler = params.requestHandler;
34274
34274
  }
34275
34275
  async run(context, agentChain) {
34276
- const mcpClient = this.mcpClient || context.config.defaultMcpClient;
34276
+ const mcpClients = this.mcpClients.length > 0
34277
+ ? this.mcpClients
34278
+ : (context.config.defaultMcpClient ? [context.config.defaultMcpClient] : []);
34277
34279
  const agentContext = new AgentContext(context, this, agentChain);
34278
34280
  try {
34279
34281
  this.agentContext = agentContext;
34280
- mcpClient &&
34281
- !mcpClient.isConnected() &&
34282
- (await mcpClient.connect(context.controller.signal));
34283
- return await this.runWithContext(agentContext, mcpClient, exports.config.maxReactNum);
34282
+ for (const client of mcpClients) {
34283
+ if (!client.isConnected()) {
34284
+ await client.connect(context.controller.signal);
34285
+ }
34286
+ }
34287
+ return await this.runWithContext(agentContext, mcpClients, exports.config.maxReactNum);
34284
34288
  }
34285
34289
  finally {
34286
- mcpClient && (await mcpClient.close());
34290
+ for (const client of mcpClients) {
34291
+ await client.close();
34292
+ }
34287
34293
  }
34288
34294
  }
34289
- async runWithContext(agentContext, mcpClient, maxReactNum = 100, historyMessages = []) {
34295
+ async runWithContext(agentContext, mcpClients, maxReactNum = 100, historyMessages = []) {
34290
34296
  let loopNum = 0;
34291
34297
  let checkNum = 0;
34292
34298
  this.agentContext = agentContext;
@@ -34310,16 +34316,19 @@ class Agent {
34310
34316
  ];
34311
34317
  agentContext.messages = messages;
34312
34318
  const rlm = new RetryLanguageModel(context.config.llms, this.llms, context.config.globalConfig?.streamFirstTimeout, context.config.globalConfig?.streamTokenTimeout, agentContext);
34319
+ const resolvedMcpClients = Array.isArray(mcpClients)
34320
+ ? mcpClients
34321
+ : (mcpClients ? [mcpClients] : []);
34313
34322
  let agentTools = tools;
34314
34323
  while (loopNum < maxReactNum) {
34315
34324
  await context.checkAborted();
34316
- if (mcpClient) {
34325
+ if (resolvedMcpClients.length > 0) {
34317
34326
  const controlMcp = await this.controlMcpTools(agentContext, messages, loopNum);
34318
34327
  if (controlMcp.mcpTools) {
34319
- const mcpTools = await this.listTools(context, mcpClient, agentNode, controlMcp.mcpParams);
34328
+ const mcpTools = await this.listMcpTools(context, resolvedMcpClients, agentNode, controlMcp.mcpParams);
34320
34329
  const usedTools = extractUsedTool(messages, agentTools);
34321
- const _agentTools = mergeTools(tools, usedTools);
34322
- agentTools = mergeTools(_agentTools, mcpTools);
34330
+ const mergedTools = mergeTools(tools, usedTools);
34331
+ agentTools = mergeTools(mergedTools, mcpTools);
34323
34332
  }
34324
34333
  }
34325
34334
  await this.handleMessages(agentContext, messages, tools);
@@ -34476,33 +34485,32 @@ class Agent {
34476
34485
  async extSysPrompt(agentContext, tools) {
34477
34486
  return "";
34478
34487
  }
34479
- async listTools(context, mcpClient, agentNode, mcpParams) {
34480
- try {
34481
- if (!mcpClient.isConnected()) {
34482
- await mcpClient.connect(context.controller.signal);
34488
+ async listMcpTools(context, clients, agentNode, mcpParams) {
34489
+ const allTools = [];
34490
+ for (const client of clients) {
34491
+ try {
34492
+ if (!client.isConnected()) {
34493
+ await client.connect(context.controller.signal);
34494
+ }
34495
+ const list = await client.listTools({
34496
+ taskId: context.taskId,
34497
+ nodeId: agentNode?.id,
34498
+ environment: exports.config.platform,
34499
+ agent_name: agentNode?.name || this.name,
34500
+ params: {},
34501
+ prompt: agentNode?.task || context.chain.taskPrompt,
34502
+ ...(mcpParams || {}),
34503
+ }, context.controller.signal);
34504
+ for (const toolSchema of list) {
34505
+ const execute = this.toolExecuter(client, toolSchema.name);
34506
+ allTools.push(new McpTool(new ToolWrapper(toolSchema, execute)));
34507
+ }
34508
+ }
34509
+ catch (e) {
34510
+ Log.error("Mcp listTools error", e);
34483
34511
  }
34484
- let list = await mcpClient.listTools({
34485
- taskId: context.taskId,
34486
- nodeId: agentNode?.id,
34487
- environment: exports.config.platform,
34488
- agent_name: agentNode?.name || this.name,
34489
- params: {},
34490
- prompt: agentNode?.task || context.chain.taskPrompt,
34491
- ...(mcpParams || {}),
34492
- }, context.controller.signal);
34493
- let mcpTools = [];
34494
- for (let i = 0; i < list.length; i++) {
34495
- let toolSchema = list[i];
34496
- let execute = this.toolExecuter(mcpClient, toolSchema.name);
34497
- let toolWrapper = new ToolWrapper(toolSchema, execute);
34498
- mcpTools.push(new McpTool(toolWrapper));
34499
- }
34500
- return mcpTools;
34501
- }
34502
- catch (e) {
34503
- Log.error("Mcp listTools error", e);
34504
- return [];
34505
34512
  }
34513
+ return allTools;
34506
34514
  }
34507
34515
  async controlMcpTools(agentContext, messages, loopNum) {
34508
34516
  return {
@@ -34545,9 +34553,9 @@ class Agent {
34545
34553
  };
34546
34554
  }
34547
34555
  async loadTools(context) {
34548
- if (this.mcpClient) {
34549
- let mcpTools = await this.listTools(context, this.mcpClient);
34550
- if (mcpTools && mcpTools.length > 0) {
34556
+ if (this.mcpClients.length > 0) {
34557
+ const mcpTools = await this.listMcpTools(context, this.mcpClients);
34558
+ if (mcpTools.length > 0) {
34551
34559
  return mergeTools(this.tools, mcpTools);
34552
34560
  }
34553
34561
  }
@@ -34579,8 +34587,11 @@ class Agent {
34579
34587
  get PlanDescription() {
34580
34588
  return this.planDescription;
34581
34589
  }
34590
+ get McpClients() {
34591
+ return this.mcpClients;
34592
+ }
34582
34593
  get McpClient() {
34583
- return this.mcpClient;
34594
+ return this.mcpClients[0];
34584
34595
  }
34585
34596
  get AgentContext() {
34586
34597
  return this.agentContext;
@@ -34589,8 +34600,8 @@ class Agent {
34589
34600
 
34590
34601
  const AGENT_NAME$3 = "File";
34591
34602
  class BaseFileAgent extends Agent {
34592
- constructor(work_path, llms, ext_tools, mcpClient, planDescription) {
34593
- const _tools_ = [];
34603
+ constructor(work_path, llms, ext_tools, mcpClients, planDescription) {
34604
+ const initTools = [];
34594
34605
  const prompt = work_path
34595
34606
  ? `Your working directory is: ${work_path}
34596
34607
  - When viewing file lists and outputting file paths, always include the working directory
@@ -34603,9 +34614,9 @@ class BaseFileAgent extends Agent {
34603
34614
  super({
34604
34615
  name: AGENT_NAME$3,
34605
34616
  description: `You are a file agent, handling file-related tasks such as creating, finding, reading, modifying files, etc.${prompt}`,
34606
- tools: _tools_,
34617
+ tools: initTools,
34607
34618
  llms: llms,
34608
- mcpClient: mcpClient,
34619
+ mcpClients: Array.isArray(mcpClients) ? mcpClients : (mcpClients ? [mcpClients] : []),
34609
34620
  planDescription: planDescription ||
34610
34621
  `File operation agent, handles file-related tasks such as creating, finding, reading, modifying files, etc. Only supports text file output
34611
34622
  - Output file names must be in English
@@ -34613,11 +34624,11 @@ class BaseFileAgent extends Agent {
34613
34624
  - For data-related content, combine with visualization tools for display
34614
34625
  - For visualizations, generate charts first before page generation to minimize repetitive work`,
34615
34626
  });
34616
- let init_tools = this.buildInitTools();
34627
+ let builtTools = this.buildInitTools();
34617
34628
  if (ext_tools && ext_tools.length > 0) {
34618
- init_tools = mergeTools(init_tools, ext_tools);
34629
+ builtTools = mergeTools(builtTools, ext_tools);
34619
34630
  }
34620
- init_tools.forEach((tool) => _tools_.push(tool));
34631
+ builtTools.forEach((tool) => initTools.push(tool));
34621
34632
  }
34622
34633
  async do_file_read(agentContext, path, write_variable) {
34623
34634
  let file_context = await this.file_read(agentContext, path);
@@ -34772,24 +34783,24 @@ class BaseFileAgent extends Agent {
34772
34783
 
34773
34784
  const AGENT_NAME$2 = "Shell";
34774
34785
  class BaseShellAgent extends Agent {
34775
- constructor(llms, ext_tools, mcpClient, planDescription) {
34776
- const _tools_ = [];
34786
+ constructor(llms, ext_tools, mcpClients, planDescription) {
34787
+ const initTools = [];
34777
34788
  super({
34778
34789
  name: AGENT_NAME$2,
34779
34790
  description: `Run commands in a bash shell,
34780
34791
  * You must first call create_session to create a new session when using it for the first time.
34781
34792
  * Please execute delete commands with caution, and never perform dangerous operations like \`rm -rf /\`.
34782
34793
  * Please avoid commands that may produce a very large amount of output.`,
34783
- tools: _tools_,
34794
+ tools: initTools,
34784
34795
  llms: llms,
34785
- mcpClient: mcpClient,
34796
+ mcpClients: Array.isArray(mcpClients) ? mcpClients : (mcpClients ? [mcpClients] : []),
34786
34797
  planDescription: planDescription || "Shell command agent, use to execute shell commands.",
34787
34798
  });
34788
- let init_tools = this.buildInitTools();
34799
+ let builtTools = this.buildInitTools();
34789
34800
  if (ext_tools && ext_tools.length > 0) {
34790
- init_tools = mergeTools(init_tools, ext_tools);
34801
+ builtTools = mergeTools(builtTools, ext_tools);
34791
34802
  }
34792
- init_tools.forEach((tool) => _tools_.push(tool));
34803
+ builtTools.forEach((tool) => initTools.push(tool));
34793
34804
  }
34794
34805
  buildInitTools() {
34795
34806
  return [
@@ -34854,8 +34865,8 @@ class BaseShellAgent extends Agent {
34854
34865
 
34855
34866
  const AGENT_NAME$1 = "Computer";
34856
34867
  class BaseComputerAgent extends Agent {
34857
- constructor(llms, ext_tools, mcpClient, keyboardKeys) {
34858
- const _tools_ = [];
34868
+ constructor(llms, ext_tools, mcpClients, keyboardKeys) {
34869
+ const initTools = [];
34859
34870
  super({
34860
34871
  name: AGENT_NAME$1,
34861
34872
  description: `You are a computer operation agent, who interacts with the computer using mouse and keyboard, completing specified tasks step by step based on the given tasks and screenshots. After each of your operations, you will receive the latest computer screenshot to evaluate the task execution status.
@@ -34863,9 +34874,9 @@ This is a computer GUI interface, observe the execution through screenshots, and
34863
34874
  * COMPUTER OPERATIONS:
34864
34875
  - You can operate the application using shortcuts.
34865
34876
  - If stuck, try alternative approaches`,
34866
- tools: _tools_,
34877
+ tools: initTools,
34867
34878
  llms: llms,
34868
- mcpClient: mcpClient,
34879
+ mcpClients: Array.isArray(mcpClients) ? mcpClients : (mcpClients ? [mcpClients] : []),
34869
34880
  planDescription: "Computer operation agent, interact with the computer using the mouse and keyboard."
34870
34881
  });
34871
34882
  if (!keyboardKeys) {
@@ -34896,11 +34907,11 @@ This is a computer GUI interface, observe the execution through screenshots, and
34896
34907
  ];
34897
34908
  }
34898
34909
  }
34899
- let init_tools = this.buildInitTools(keyboardKeys);
34910
+ let builtTools = this.buildInitTools(keyboardKeys);
34900
34911
  if (ext_tools && ext_tools.length > 0) {
34901
- init_tools = mergeTools(init_tools, ext_tools);
34912
+ builtTools = mergeTools(builtTools, ext_tools);
34902
34913
  }
34903
- init_tools.forEach((tool) => _tools_.push(tool));
34914
+ builtTools.forEach((tool) => initTools.push(tool));
34904
34915
  }
34905
34916
  buildInitTools(keyboardKeys) {
34906
34917
  return [
@@ -36027,7 +36038,7 @@ function run_build_dom_tree() {
36027
36038
  }
36028
36039
 
36029
36040
  class BaseBrowserLabelsAgent extends BaseBrowserAgent {
36030
- constructor(llms, ext_tools, mcpClient) {
36041
+ constructor(llms, ext_tools, mcpClients) {
36031
36042
  let description = `You are a browser operation agent, use structured commands to interact with the browser.
36032
36043
  * This is a browser GUI interface where you need to analyze webpages by taking screenshot and page element structures, and specify action sequences to complete designated tasks.
36033
36044
  * For your first visit, please start by calling either the \`navigate_to\` or \`current_page\` tool. After each action you perform, I will provide you with updated information about the current state, including page screenshots and structured element data that has been specially processed for easier analysis.
@@ -36062,20 +36073,20 @@ class BaseBrowserLabelsAgent extends BaseBrowserAgent {
36062
36073
  - When filling out a form, fields that are not dependent on each other should be filled simultaneously
36063
36074
  - Avoid parallel processing for dependent operations, such as those that need to wait for page loading, DOM changes, redirects, subsequent operations that depend on the results of previous operations, or operations that may interfere with each other and affect the same page elements. In these cases, please do not use parallelization.`;
36064
36075
  }
36065
- const _tools_ = [];
36076
+ const initTools = [];
36066
36077
  super({
36067
36078
  name: AGENT_NAME,
36068
36079
  description: description,
36069
- tools: _tools_,
36080
+ tools: initTools,
36070
36081
  llms: llms,
36071
- mcpClient: mcpClient,
36082
+ mcpClients: Array.isArray(mcpClients) ? mcpClients : (mcpClients ? [mcpClients] : []),
36072
36083
  planDescription: "Browser operation agent, interact with the browser using the mouse and keyboard.",
36073
36084
  });
36074
- let init_tools = this.buildInitTools();
36085
+ let builtTools = this.buildInitTools();
36075
36086
  if (ext_tools && ext_tools.length > 0) {
36076
- init_tools = mergeTools(init_tools, ext_tools);
36087
+ builtTools = mergeTools(builtTools, ext_tools);
36077
36088
  }
36078
- init_tools.forEach((tool) => _tools_.push(tool));
36089
+ builtTools.forEach((tool) => initTools.push(tool));
36079
36090
  }
36080
36091
  async input_text(agentContext, index, text, enter) {
36081
36092
  await this.execute_script(agentContext, typing, [{ index, text, enter }]);
@@ -36780,7 +36791,7 @@ function scroll_by(params) {
36780
36791
  }
36781
36792
 
36782
36793
  class BaseBrowserScreenAgent extends BaseBrowserAgent {
36783
- constructor(llms, ext_tools, mcpClient) {
36794
+ constructor(llms, ext_tools, mcpClients) {
36784
36795
  const description = `You are a browser operation agent, use a mouse and keyboard to interact with a browser.
36785
36796
  * This is a browser GUI interface, observe the webpage execution through screenshots, and specify action sequences to complete designated tasks.
36786
36797
  * For the first visit, please call the \`navigate_to\` or \`current_page\` tool first. After that, each of your actions will return a screenshot of the page.
@@ -36792,20 +36803,20 @@ class BaseBrowserScreenAgent extends BaseBrowserAgent {
36792
36803
  - Wait for elements to load
36793
36804
  - Scroll pages and handle infinite scroll
36794
36805
  - YOU CAN DO ANYTHING ON THE BROWSER - including clicking on elements, filling forms, submitting data, etc.`;
36795
- const _tools_ = [];
36806
+ const initTools = [];
36796
36807
  super({
36797
36808
  name: AGENT_NAME,
36798
36809
  description: description,
36799
- tools: _tools_,
36810
+ tools: initTools,
36800
36811
  llms: llms,
36801
- mcpClient: mcpClient,
36812
+ mcpClients: Array.isArray(mcpClients) ? mcpClients : (mcpClients ? [mcpClients] : []),
36802
36813
  planDescription: "Browser operation agent, interact with the browser using the mouse and keyboard.",
36803
36814
  });
36804
- let init_tools = this.buildInitTools();
36815
+ let builtTools = this.buildInitTools();
36805
36816
  if (ext_tools && ext_tools.length > 0) {
36806
- init_tools = mergeTools(init_tools, ext_tools);
36817
+ builtTools = mergeTools(builtTools, ext_tools);
36807
36818
  }
36808
- init_tools.forEach((tool) => _tools_.push(tool));
36819
+ builtTools.forEach((tool) => initTools.push(tool));
36809
36820
  }
36810
36821
  buildInitTools() {
36811
36822
  return [