test-wuying-agentbay-sdk 0.13.1-beta.20251223203147 → 0.13.1-beta.20251224094729

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -2311,11 +2311,20 @@ var LOG_LEVEL_VALUES = {
2311
2311
  };
2312
2312
  var currentRequestId = "";
2313
2313
  var currentLogLevel = process.env.LOG_LEVEL || process.env.AGENTBAY_LOG_LEVEL || "INFO";
2314
+ var currentLogFormat = process.env.AGENTBAY_LOG_FORMAT || "pretty";
2315
+ if (["sls", "compact"].includes(String(currentLogFormat).toLowerCase())) {
2316
+ currentLogFormat = "sls";
2317
+ } else {
2318
+ currentLogFormat = "pretty";
2319
+ }
2314
2320
  var fileLoggingEnabled = false;
2315
2321
  var logFilePath = null;
2316
2322
  var logFileMaxSize = 10 * 1024 * 1024;
2317
2323
  var consoleLoggingEnabled = true;
2318
2324
  function shouldUseColors() {
2325
+ if (currentLogFormat === "sls") {
2326
+ return false;
2327
+ }
2319
2328
  if (process.env.DISABLE_COLORS === "true") {
2320
2329
  return false;
2321
2330
  }
@@ -2357,6 +2366,9 @@ var SENSITIVE_FIELDS = [
2357
2366
  "authorization"
2358
2367
  ];
2359
2368
  function getLogLevelEmoji(level) {
2369
+ if (currentLogFormat === "sls") {
2370
+ return level;
2371
+ }
2360
2372
  switch (level) {
2361
2373
  case "DEBUG":
2362
2374
  return "\u{1F41B} DEBUG";
@@ -2376,6 +2388,13 @@ function shouldLog(level) {
2376
2388
  }
2377
2389
  _chunk4IPTHWLMcjs.__name.call(void 0, shouldLog, "shouldLog");
2378
2390
  function formatLogMessage(level, message, forFile = false) {
2391
+ if (currentLogFormat === "sls") {
2392
+ let formattedMessage2 = `${level}: ${message}`;
2393
+ if (currentRequestId) {
2394
+ formattedMessage2 += ` [RequestId=${currentRequestId}]`;
2395
+ }
2396
+ return formattedMessage2;
2397
+ }
2379
2398
  let formattedMessage = `${getLogLevelEmoji(level)}: ${message}`;
2380
2399
  if (currentRequestId) {
2381
2400
  formattedMessage += ` [RequestId=${currentRequestId}]`;
@@ -2523,6 +2542,23 @@ function setupLogger(config) {
2523
2542
  if (config.enableConsole !== void 0) {
2524
2543
  consoleLoggingEnabled = config.enableConsole;
2525
2544
  }
2545
+ if (config.format) {
2546
+ if (["sls", "compact"].includes(String(config.format).toLowerCase())) {
2547
+ currentLogFormat = "sls";
2548
+ } else {
2549
+ currentLogFormat = "pretty";
2550
+ }
2551
+ } else {
2552
+ const envFormat = process.env.AGENTBAY_LOG_FORMAT;
2553
+ if (envFormat) {
2554
+ if (["sls", "compact"].includes(String(envFormat).toLowerCase())) {
2555
+ currentLogFormat = "sls";
2556
+ } else {
2557
+ currentLogFormat = "pretty";
2558
+ }
2559
+ }
2560
+ }
2561
+ useColors = shouldUseColors();
2526
2562
  }
2527
2563
  _chunk4IPTHWLMcjs.__name.call(void 0, setupLogger, "setupLogger");
2528
2564
  function log(message, ...args) {
@@ -2630,6 +2666,22 @@ ${error.stack}`;
2630
2666
  _chunk4IPTHWLMcjs.__name.call(void 0, logError, "logError");
2631
2667
  function logAPICall(apiName, requestData) {
2632
2668
  if (!shouldLog("INFO")) return;
2669
+ if (currentLogFormat === "sls") {
2670
+ let message2 = `API Call: ${apiName}`;
2671
+ if (requestData) {
2672
+ const maskedData = maskSensitiveData(requestData);
2673
+ if (typeof maskedData === "string") {
2674
+ message2 += `, ${maskedData}`;
2675
+ } else {
2676
+ message2 += `, ${JSON.stringify(maskedData)}`;
2677
+ }
2678
+ }
2679
+ if (consoleLoggingEnabled) {
2680
+ process.stdout.write(message2 + "\n");
2681
+ }
2682
+ writeToFile(message2);
2683
+ return;
2684
+ }
2633
2685
  const message = `\u{1F517} API Call: ${apiName}`;
2634
2686
  const savedRequestId = currentRequestId;
2635
2687
  currentRequestId = "";
@@ -2647,6 +2699,35 @@ function logAPICall(apiName, requestData) {
2647
2699
  }
2648
2700
  _chunk4IPTHWLMcjs.__name.call(void 0, logAPICall, "logAPICall");
2649
2701
  function logAPIResponseWithDetails(apiName, requestId, success = true, keyFields, fullResponse) {
2702
+ if (currentLogFormat === "sls") {
2703
+ if (!shouldLog(success ? "INFO" : "ERROR")) return;
2704
+ const status = success ? "API Response" : "API Response Failed";
2705
+ let msg = `${status}: ${apiName}`;
2706
+ if (requestId) {
2707
+ msg += `, RequestId=${requestId}`;
2708
+ }
2709
+ if (keyFields) {
2710
+ for (const [key, value] of Object.entries(keyFields)) {
2711
+ const maskedValue = maskSensitiveData({ [key]: value });
2712
+ msg += `, ${key}=${maskedValue[key]}`;
2713
+ }
2714
+ }
2715
+ if (success) {
2716
+ if (consoleLoggingEnabled) {
2717
+ process.stdout.write(msg + "\n");
2718
+ }
2719
+ writeToFile(msg);
2720
+ } else {
2721
+ if (consoleLoggingEnabled) {
2722
+ process.stderr.write(msg + "\n");
2723
+ }
2724
+ writeToFile(msg);
2725
+ }
2726
+ if (fullResponse && shouldLog("DEBUG")) {
2727
+ logDebug(`Full Response: ${fullResponse}`);
2728
+ }
2729
+ return;
2730
+ }
2650
2731
  if (success) {
2651
2732
  if (shouldLog("INFO")) {
2652
2733
  let mainMessage = `\u2705 API Response: ${apiName}`;
@@ -2718,6 +2799,16 @@ function logCodeExecutionOutput(requestId, rawOutput) {
2718
2799
  return;
2719
2800
  }
2720
2801
  const actualOutput = texts.join("");
2802
+ if (currentLogFormat === "sls") {
2803
+ const header2 = `Code Execution Output (RequestID: ${requestId}):`;
2804
+ if (consoleLoggingEnabled) {
2805
+ process.stdout.write(header2 + "\n");
2806
+ process.stdout.write(actualOutput + "\n");
2807
+ }
2808
+ writeToFile(header2);
2809
+ writeToFile(actualOutput);
2810
+ return;
2811
+ }
2721
2812
  const header = `\u{1F4CB} Code Execution Output (RequestID: ${requestId}):`;
2722
2813
  if (useColors) {
2723
2814
  process.stdout.write(`${ANSI_GREEN}\u2139\uFE0F INFO: ${header}${ANSI_RESET}
@@ -2747,6 +2838,10 @@ function logCodeExecutionOutput(requestId, rawOutput) {
2747
2838
  _chunk4IPTHWLMcjs.__name.call(void 0, logCodeExecutionOutput, "logCodeExecutionOutput");
2748
2839
  function logInfoWithColor(message, color = ANSI_RED) {
2749
2840
  if (!shouldLog("INFO")) return;
2841
+ if (currentLogFormat === "sls") {
2842
+ logInfo(message);
2843
+ return;
2844
+ }
2750
2845
  const emoji = "\u2139\uFE0F INFO";
2751
2846
  const fullMessage = `${emoji}: ${message}`;
2752
2847
  if (useColors) {
@@ -3872,41 +3967,35 @@ _chunk4IPTHWLMcjs.init_cjs_shims.call(void 0, );
3872
3967
 
3873
3968
  // src/agent/agent.ts
3874
3969
  _chunk4IPTHWLMcjs.init_cjs_shims.call(void 0, );
3875
- var _ComputerUseAgent = class _ComputerUseAgent {
3876
- /**
3877
- * Initialize an Computer Agent object.
3878
- *
3879
- * @param session - The Session instance that this Agent belongs to.
3880
- */
3970
+ var _BaseTaskAgent = class _BaseTaskAgent {
3881
3971
  constructor(session) {
3882
3972
  this.session = session;
3883
3973
  }
3974
+ /**
3975
+ * Get the full MCP tool name based on prefix and action.
3976
+ */
3977
+ getToolName(action) {
3978
+ const toolMap = {
3979
+ execute: "execute_task",
3980
+ get_status: "get_task_status",
3981
+ terminate: "terminate_task"
3982
+ };
3983
+ const baseName = toolMap[action] || action;
3984
+ if (this.toolPrefix) {
3985
+ return `${this.toolPrefix}_${baseName}`;
3986
+ }
3987
+ return baseName;
3988
+ }
3884
3989
  /**
3885
3990
  * Execute a specific task described in human language.
3886
- *
3887
- * @param task - Task description in human language.
3888
- * @param maxTryTimes - Maximum number of retry attempts.
3889
- * @returns ExecutionResult containing success status, task output, and error
3890
- * message if any.
3891
- *
3892
- * @example
3893
- * ```typescript
3894
- * const agentBay = new AgentBay({ apiKey: 'your_api_key' });
3895
- * const result = await agentBay.create({ imageId: 'windows_latest' });
3896
- * if (result.success) {
3897
- * const taskResult = await result.session.agent.computer.executeTask(
3898
- * 'Open notepad',
3899
- * 10
3900
- * );
3901
- * console.log(`Task status: ${taskResult.taskStatus}`);
3902
- * await result.session.delete();
3903
- * }
3904
- * ```
3905
3991
  */
3906
3992
  async executeTask(task, maxTryTimes) {
3907
3993
  try {
3908
3994
  const args = { task, max_try_times: maxTryTimes };
3909
- const result = await this.session.callMcpTool("flux_execute_task", args);
3995
+ const result = await this.session.callMcpTool(
3996
+ this.getToolName("execute"),
3997
+ args
3998
+ );
3910
3999
  if (!result.success) {
3911
4000
  return {
3912
4001
  requestId: result.requestId,
@@ -3930,7 +4019,7 @@ var _ComputerUseAgent = class _ComputerUseAgent {
3930
4019
  taskResult: "Invalid execution response."
3931
4020
  };
3932
4021
  }
3933
- const taskId = content.task_id;
4022
+ const taskId = content.taskId || content.task_id;
3934
4023
  if (!taskId) {
3935
4024
  return {
3936
4025
  requestId: result.requestId,
@@ -3955,13 +4044,13 @@ var _ComputerUseAgent = class _ComputerUseAgent {
3955
4044
  };
3956
4045
  }
3957
4046
  switch (query.taskStatus) {
3958
- case "finished":
4047
+ case "completed":
3959
4048
  return {
3960
4049
  requestId: query.requestId,
3961
4050
  success: true,
3962
4051
  errorMessage: "",
3963
4052
  taskId,
3964
- taskStatus: "finished",
4053
+ taskStatus: "completed",
3965
4054
  taskResult: query.taskProduct
3966
4055
  };
3967
4056
  case "failed":
@@ -3973,6 +4062,15 @@ var _ComputerUseAgent = class _ComputerUseAgent {
3973
4062
  taskStatus: "failed",
3974
4063
  taskResult: ""
3975
4064
  };
4065
+ case "cancelled":
4066
+ return {
4067
+ requestId: query.requestId,
4068
+ success: false,
4069
+ errorMessage: query.errorMessage || "Task was cancelled.",
4070
+ taskId,
4071
+ taskStatus: "cancelled",
4072
+ taskResult: ""
4073
+ };
3976
4074
  case "unsupported":
3977
4075
  return {
3978
4076
  requestId: query.requestId,
@@ -4008,32 +4106,20 @@ var _ComputerUseAgent = class _ComputerUseAgent {
4008
4106
  }
4009
4107
  /**
4010
4108
  * Get the status of the task with the given task ID.
4011
- *
4012
- * @param taskId - Task ID
4013
- * @returns QueryResult containing the task status
4014
- *
4015
- * @example
4016
- * ```typescript
4017
- * const agentBay = new AgentBay({ apiKey: 'your_api_key' });
4018
- * const result = await agentBay.create({ imageId: 'windows_latest' });
4019
- * if (result.success) {
4020
- * const taskResult = await result.session.agent.computer.executeTask('Open
4021
- * calculator', 10); const statusResult = await
4022
- * result.session.agent.computer.getTaskStatus(taskResult.taskId);
4023
- * console.log(`Status:
4024
- * ${JSON.parse(statusResult.output).status}`); await result.session.delete();
4025
- * }
4026
- * ```
4027
4109
  */
4028
4110
  async getTaskStatus(taskId) {
4029
4111
  try {
4030
4112
  const args = { task_id: taskId };
4031
- const result = await this.session.callMcpTool("flux_get_task_status", args);
4113
+ const result = await this.session.callMcpTool(
4114
+ this.getToolName("get_status"),
4115
+ args
4116
+ );
4032
4117
  if (!result.success) {
4033
4118
  return {
4034
4119
  requestId: result.requestId,
4035
4120
  success: false,
4036
4121
  errorMessage: result.errorMessage,
4122
+ taskId,
4037
4123
  taskAction: "",
4038
4124
  taskProduct: "",
4039
4125
  taskStatus: "failed"
@@ -4042,19 +4128,27 @@ var _ComputerUseAgent = class _ComputerUseAgent {
4042
4128
  let queryResult;
4043
4129
  try {
4044
4130
  queryResult = JSON.parse(result.data);
4131
+ const contentTaskId = queryResult.taskId || queryResult.task_id || taskId;
4132
+ const taskProduct = queryResult.result || queryResult.product || "";
4133
+ const stream = Array.isArray(queryResult.stream) ? queryResult.stream : void 0;
4134
+ const error = queryResult.error || void 0;
4045
4135
  return {
4046
4136
  requestId: result.requestId,
4047
4137
  success: true,
4048
4138
  errorMessage: "",
4139
+ taskId: contentTaskId,
4049
4140
  taskAction: queryResult.action || "",
4050
- taskProduct: queryResult.product || "",
4051
- taskStatus: queryResult.status || "failed"
4141
+ taskProduct,
4142
+ taskStatus: queryResult.status || "completed",
4143
+ stream,
4144
+ error
4052
4145
  };
4053
4146
  } catch (error) {
4054
4147
  return {
4055
4148
  requestId: result.requestId,
4056
4149
  success: false,
4057
4150
  errorMessage: `Failed to get task status: ${error}`,
4151
+ taskId,
4058
4152
  taskAction: "",
4059
4153
  taskProduct: "",
4060
4154
  taskStatus: "failed"
@@ -4065,6 +4159,7 @@ var _ComputerUseAgent = class _ComputerUseAgent {
4065
4159
  requestId: "",
4066
4160
  success: false,
4067
4161
  errorMessage: `Failed to get task status: ${error}`,
4162
+ taskId,
4068
4163
  taskAction: "",
4069
4164
  taskProduct: "",
4070
4165
  taskStatus: "failed"
@@ -4073,33 +4168,15 @@ var _ComputerUseAgent = class _ComputerUseAgent {
4073
4168
  }
4074
4169
  /**
4075
4170
  * Terminate a task with a specified task ID.
4076
- *
4077
- * @param taskId - The ID of the running task.
4078
- * @returns ExecutionResult containing success status, task output, and
4079
- * error message if any.
4080
- *
4081
- * @example
4082
- * ```typescript
4083
- * const agentBay = new AgentBay({ apiKey: 'your_api_key' });
4084
- * const result = await agentBay.create({ imageId: 'windows_latest' });
4085
- * if (result.success) {
4086
- * const taskResult = await result.session.agent.computer.executeTask(
4087
- * 'Open notepad',
4088
- * 5
4089
- * );
4090
- * const terminateResult = await result.session.agent.computer.terminateTask(
4091
- * taskResult.taskId
4092
- * );
4093
- * console.log(`Terminated: ${terminateResult.taskStatus}`);
4094
- * await result.session.delete();
4095
- * }
4096
- * ```
4097
4171
  */
4098
4172
  async terminateTask(taskId) {
4099
4173
  logDebug("Terminating task");
4100
4174
  try {
4101
4175
  const args = { task_id: taskId };
4102
- const result = await this.session.callMcpTool("flux_terminate_task", args);
4176
+ const result = await this.session.callMcpTool(
4177
+ this.getToolName("terminate"),
4178
+ args
4179
+ );
4103
4180
  let content;
4104
4181
  try {
4105
4182
  content = JSON.parse(result.data);
@@ -4113,8 +4190,8 @@ var _ComputerUseAgent = class _ComputerUseAgent {
4113
4190
  taskResult: ""
4114
4191
  };
4115
4192
  }
4116
- const terminatedTaskId = content.task_id || taskId;
4117
- const status = content.status || "unknown";
4193
+ const terminatedTaskId = content.taskId || content.task_id || taskId;
4194
+ const status = content.status || "cancelling";
4118
4195
  if (result.success) {
4119
4196
  return {
4120
4197
  requestId: result.requestId,
@@ -4145,17 +4222,20 @@ var _ComputerUseAgent = class _ComputerUseAgent {
4145
4222
  }
4146
4223
  }
4147
4224
  };
4225
+ _chunk4IPTHWLMcjs.__name.call(void 0, _BaseTaskAgent, "BaseTaskAgent");
4226
+ var BaseTaskAgent = _BaseTaskAgent;
4227
+ var _ComputerUseAgent = class _ComputerUseAgent extends BaseTaskAgent {
4228
+ constructor() {
4229
+ super(...arguments);
4230
+ this.toolPrefix = "flux";
4231
+ }
4232
+ };
4148
4233
  _chunk4IPTHWLMcjs.__name.call(void 0, _ComputerUseAgent, "ComputerUseAgent");
4149
4234
  var ComputerUseAgent = _ComputerUseAgent;
4150
- var _BrowserUseAgent = class _BrowserUseAgent {
4151
- /**
4152
- * Initialize an Browser Agent object.
4153
- * @description Browser Use Agent is in BETA ⚠️ .
4154
- *
4155
- * @param session - The Session instance that this Agent belongs to.
4156
- */
4157
- constructor(session) {
4158
- this.session = session;
4235
+ var _BrowserUseAgent = class _BrowserUseAgent extends BaseTaskAgent {
4236
+ constructor() {
4237
+ super(...arguments);
4238
+ this.toolPrefix = "browser_use";
4159
4239
  }
4160
4240
  /**
4161
4241
  * Initialize the browser agent with specific options.
@@ -4200,276 +4280,345 @@ var _BrowserUseAgent = class _BrowserUseAgent {
4200
4280
  };
4201
4281
  }
4202
4282
  }
4283
+ };
4284
+ _chunk4IPTHWLMcjs.__name.call(void 0, _BrowserUseAgent, "BrowserUseAgent");
4285
+ var BrowserUseAgent = _BrowserUseAgent;
4286
+ var _MobileUseAgent = class _MobileUseAgent extends BaseTaskAgent {
4287
+ constructor() {
4288
+ super(...arguments);
4289
+ this.toolPrefix = "";
4290
+ }
4203
4291
  /**
4204
- * Execute a specific task described in human language.
4292
+ * Execute a task in human language without waiting for completion
4293
+ * (non-blocking). This is a fire-and-return interface that immediately
4294
+ * provides a task ID. Call getTaskStatus to check the task status.
4205
4295
  *
4206
4296
  * @param task - Task description in human language.
4207
- * @param maxTryTimes - Maximum number of retry attempts.
4208
- * @returns ExecutionResult containing success status, task output, and
4209
- * error message if any.
4297
+ * @param maxSteps - Maximum number of steps (clicks/swipes/etc.) allowed.
4298
+ * Used to prevent infinite loops or excessive resource
4299
+ * consumption. Default is 50.
4300
+ * @param maxStepRetries - Maximum retry times for MCP tool call failures
4301
+ * at SDK level. Used to retry when callMcpTool fails
4302
+ * (e.g., network errors, timeouts). Default is 3.
4303
+ * @returns ExecutionResult containing success status, task ID, task status,
4304
+ * and error message if any.
4210
4305
  *
4211
4306
  * @example
4212
4307
  * ```typescript
4213
4308
  * const agentBay = new AgentBay({ apiKey: 'your_api_key' });
4214
- * const result = await agentBay.create({ imageId: 'linux_latest' });
4309
+ * const result = await agentBay.create({ imageId: 'mobile_latest' });
4215
4310
  * if (result.success) {
4216
- * const taskResult = await result.session.agent.browser.executeTask(
4217
- * 'Navigate to baidu and query the weather of Shanghai',
4218
- * 10
4311
+ * const execResult = await result.session.agent.mobile.executeTask(
4312
+ * 'Open WeChat app', 100, 5
4219
4313
  * );
4220
- * console.log(`Task status: ${taskResult.taskStatus}`);
4314
+ * console.log(`Task ID: ${execResult.taskId}`);
4221
4315
  * await result.session.delete();
4222
4316
  * }
4223
4317
  * ```
4224
4318
  */
4225
- async executeTask(task, maxTryTimes) {
4226
- try {
4227
- const args = { task, max_try_times: maxTryTimes };
4228
- const result = await this.session.callMcpTool("browser_use_execute_task", args);
4229
- if (!result.success) {
4230
- return {
4231
- requestId: result.requestId,
4232
- success: false,
4233
- errorMessage: result.errorMessage,
4234
- taskStatus: "failed",
4235
- taskId: "",
4236
- taskResult: "Task Failed"
4237
- };
4238
- }
4239
- let content;
4319
+ async executeTask(task, maxSteps = 50, maxStepRetries = 3) {
4320
+ const args = {
4321
+ task,
4322
+ max_steps: maxSteps
4323
+ };
4324
+ let lastError;
4325
+ let lastRequestId = "";
4326
+ for (let attempt = 0; attempt < maxStepRetries; attempt++) {
4240
4327
  try {
4241
- content = JSON.parse(result.data);
4242
- } catch (err) {
4243
- return {
4244
- requestId: result.requestId,
4245
- success: false,
4246
- errorMessage: `Failed to parse response: ${err}`,
4247
- taskStatus: "failed",
4248
- taskId: "",
4249
- taskResult: "Invalid execution response."
4250
- };
4251
- }
4252
- const taskId = content.task_id;
4253
- if (!taskId) {
4254
- return {
4255
- requestId: result.requestId,
4256
- success: false,
4257
- errorMessage: "Task ID not found in response",
4258
- taskStatus: "failed",
4259
- taskId: "",
4260
- taskResult: "Invalid task ID."
4261
- };
4262
- }
4263
- let triedTime = 0;
4264
- while (triedTime < maxTryTimes) {
4265
- const query = await this.getTaskStatus(taskId);
4266
- if (!query.success) {
4267
- return {
4268
- requestId: query.requestId,
4269
- success: false,
4270
- errorMessage: query.errorMessage,
4271
- taskStatus: "failed",
4272
- taskId,
4273
- taskResult: ""
4274
- };
4275
- }
4276
- switch (query.taskStatus) {
4277
- case "finished":
4328
+ const result = await this.session.callMcpTool(
4329
+ this.getToolName("execute"),
4330
+ args
4331
+ );
4332
+ lastRequestId = result.requestId;
4333
+ if (result.success) {
4334
+ let content;
4335
+ try {
4336
+ content = JSON.parse(result.data);
4337
+ } catch (err) {
4278
4338
  return {
4279
- requestId: query.requestId,
4280
- success: true,
4281
- errorMessage: "",
4282
- taskId,
4283
- taskStatus: "finished",
4284
- taskResult: query.taskProduct
4339
+ requestId: result.requestId,
4340
+ success: false,
4341
+ errorMessage: `Failed to parse response: ${err}`,
4342
+ taskStatus: "failed",
4343
+ taskId: "",
4344
+ taskResult: "Invalid execution response."
4285
4345
  };
4286
- case "failed":
4346
+ }
4347
+ const taskId = content.taskId || content.task_id;
4348
+ if (!taskId) {
4287
4349
  return {
4288
- requestId: query.requestId,
4350
+ requestId: result.requestId,
4289
4351
  success: false,
4290
- errorMessage: query.errorMessage || "Failed to execute task.",
4291
- taskId,
4352
+ errorMessage: "Task ID not found in response",
4292
4353
  taskStatus: "failed",
4293
- taskResult: ""
4354
+ taskId: "",
4355
+ taskResult: "Invalid task ID."
4294
4356
  };
4295
- case "unsupported":
4357
+ }
4358
+ return {
4359
+ requestId: result.requestId,
4360
+ success: true,
4361
+ errorMessage: "",
4362
+ taskId,
4363
+ taskStatus: "running",
4364
+ taskResult: ""
4365
+ };
4366
+ } else {
4367
+ lastError = result.errorMessage || "Failed to execute task";
4368
+ if (attempt < maxStepRetries - 1) {
4369
+ logDebug(
4370
+ `Attempt ${attempt + 1}/${maxStepRetries} failed, retrying...`
4371
+ );
4372
+ await new Promise((resolve2) => setTimeout(resolve2, 1e3));
4373
+ continue;
4374
+ } else {
4296
4375
  return {
4297
- requestId: query.requestId,
4376
+ requestId: result.requestId,
4298
4377
  success: false,
4299
- errorMessage: query.errorMessage || "Unsupported task.",
4300
- taskId,
4301
- taskStatus: "unsupported",
4302
- taskResult: ""
4378
+ errorMessage: lastError,
4379
+ taskStatus: "failed",
4380
+ taskId: "",
4381
+ taskResult: "Task Failed"
4303
4382
  };
4383
+ }
4384
+ }
4385
+ } catch (error) {
4386
+ lastError = `Failed to execute: ${error}`;
4387
+ if (attempt < maxStepRetries - 1) {
4388
+ logDebug(
4389
+ `Attempt ${attempt + 1}/${maxStepRetries} raised exception, retrying...`
4390
+ );
4391
+ await new Promise((resolve2) => setTimeout(resolve2, 1e3));
4392
+ continue;
4393
+ } else {
4394
+ return {
4395
+ requestId: lastRequestId,
4396
+ success: false,
4397
+ errorMessage: lastError,
4398
+ taskStatus: "failed",
4399
+ taskId: "",
4400
+ taskResult: "Task Failed"
4401
+ };
4304
4402
  }
4305
- logDebug(`Task ${taskId} is still running, please wait for a while.`);
4306
- await new Promise((resolve2) => setTimeout(resolve2, 3e3));
4307
- triedTime++;
4308
4403
  }
4309
- return {
4310
- requestId: result.requestId,
4311
- success: false,
4312
- errorMessage: "Task execution timed out",
4313
- taskStatus: "timeout",
4314
- taskId,
4315
- taskResult: "Task Timed Out"
4316
- };
4317
- } catch (error) {
4318
- return {
4319
- requestId: "",
4320
- success: false,
4321
- errorMessage: `Failed to execute: ${error}`,
4322
- taskStatus: "failed",
4323
- taskId: "",
4324
- taskResult: "Task Failed"
4325
- };
4326
4404
  }
4405
+ return {
4406
+ requestId: lastRequestId,
4407
+ success: false,
4408
+ errorMessage: `Failed after ${maxStepRetries} attempts: ${lastError || "Unknown error"}`,
4409
+ taskStatus: "failed",
4410
+ taskId: "",
4411
+ taskResult: "Task Failed"
4412
+ };
4327
4413
  }
4328
4414
  /**
4329
- * Get the status of the task with the given task ID.
4415
+ * Execute a specific task described in human language synchronously.
4416
+ * This is a synchronous interface that blocks until the task is completed or
4417
+ * an error occurs, or timeout happens. The default polling interval is
4418
+ * 3 seconds.
4330
4419
  *
4331
- * @param taskId - Task ID
4332
- * @returns QueryResult containing the task status
4420
+ * @param task - Task description in human language.
4421
+ * @param maxSteps - Maximum number of steps (clicks/swipes/etc.) allowed.
4422
+ * Used to prevent infinite loops or excessive resource
4423
+ * consumption. Default is 50.
4424
+ * @param maxStepRetries - Maximum retry times for MCP tool call failures
4425
+ * at SDK level. Used to retry when callMcpTool fails
4426
+ * (e.g., network errors, timeouts). Default is 3.
4427
+ * @param maxTryTimes - Maximum number of polling attempts (each 3 seconds).
4428
+ * Used to control how long to wait for task completion.
4429
+ * Default is 300 (about 15 minutes).
4430
+ * @returns ExecutionResult containing success status, task ID, task status,
4431
+ * and error message if any.
4333
4432
  *
4334
4433
  * @example
4335
4434
  * ```typescript
4336
4435
  * const agentBay = new AgentBay({ apiKey: 'your_api_key' });
4337
- * const result = await agentBay.create({ imageId: 'linux_latest' });
4436
+ * const result = await agentBay.create({ imageId: 'mobile_latest' });
4338
4437
  * if (result.success) {
4339
- * const taskResult = await result.session.agent.browser.executeTask(
4340
- * 'Navigate to baidu and query the weather of Shanghai',
4341
- * 10
4438
+ * const execResult = await result.session.agent.mobile.executeTaskAndWait(
4439
+ * 'Open WeChat app', 100, 3, 200
4342
4440
  * );
4343
- * const statusResult = await result.session.agent.browser.getTaskStatus(
4344
- * taskResult.taskId
4345
- * );
4346
- * console.log(`Status: ${statusResult.taskStatus}`);
4441
+ * console.log(`Task result: ${execResult.taskResult}`);
4347
4442
  * await result.session.delete();
4348
4443
  * }
4349
4444
  * ```
4350
4445
  */
4351
- async getTaskStatus(taskId) {
4352
- try {
4353
- const args = { task_id: taskId };
4354
- const result = await this.session.callMcpTool("browser_use_get_task_status", args);
4355
- if (!result.success) {
4356
- return {
4357
- requestId: result.requestId,
4358
- success: false,
4359
- errorMessage: result.errorMessage,
4360
- taskAction: "",
4361
- taskProduct: "",
4362
- taskStatus: "failed"
4363
- };
4364
- }
4365
- let queryResult;
4446
+ async executeTaskAndWait(task, maxSteps = 50, maxStepRetries = 3, maxTryTimes = 300) {
4447
+ const args = {
4448
+ task,
4449
+ max_steps: maxSteps
4450
+ };
4451
+ let taskId;
4452
+ let lastError;
4453
+ let lastRequestId = "";
4454
+ for (let attempt = 0; attempt < maxStepRetries; attempt++) {
4366
4455
  try {
4367
- queryResult = JSON.parse(result.data);
4368
- return {
4369
- requestId: result.requestId,
4370
- success: true,
4371
- errorMessage: "",
4372
- taskAction: queryResult.action || "",
4373
- taskProduct: queryResult.product || "",
4374
- taskStatus: queryResult.status || "failed"
4375
- };
4456
+ const result = await this.session.callMcpTool(
4457
+ this.getToolName("execute"),
4458
+ args
4459
+ );
4460
+ lastRequestId = result.requestId;
4461
+ if (result.success) {
4462
+ let content;
4463
+ try {
4464
+ content = JSON.parse(result.data);
4465
+ } catch (err) {
4466
+ return {
4467
+ requestId: result.requestId,
4468
+ success: false,
4469
+ errorMessage: `Failed to parse response: ${err}`,
4470
+ taskStatus: "failed",
4471
+ taskId: "",
4472
+ taskResult: "Invalid execution response."
4473
+ };
4474
+ }
4475
+ taskId = content.taskId || content.task_id;
4476
+ if (!taskId) {
4477
+ return {
4478
+ requestId: result.requestId,
4479
+ success: false,
4480
+ errorMessage: "Task ID not found in response",
4481
+ taskStatus: "failed",
4482
+ taskId: "",
4483
+ taskResult: "Invalid task ID."
4484
+ };
4485
+ }
4486
+ break;
4487
+ } else {
4488
+ lastError = result.errorMessage || "Failed to execute task";
4489
+ if (attempt < maxStepRetries - 1) {
4490
+ logDebug(
4491
+ `Attempt ${attempt + 1}/${maxStepRetries} failed, retrying...`
4492
+ );
4493
+ await new Promise((resolve2) => setTimeout(resolve2, 1e3));
4494
+ continue;
4495
+ } else {
4496
+ return {
4497
+ requestId: result.requestId,
4498
+ success: false,
4499
+ errorMessage: lastError,
4500
+ taskStatus: "failed",
4501
+ taskId: "",
4502
+ taskResult: "Task Failed"
4503
+ };
4504
+ }
4505
+ }
4376
4506
  } catch (error) {
4377
- return {
4378
- requestId: result.requestId,
4379
- success: false,
4380
- errorMessage: `Failed to get task status: ${error}`,
4381
- taskAction: "",
4382
- taskProduct: "",
4383
- taskStatus: "failed"
4384
- };
4507
+ lastError = `Failed to execute: ${error}`;
4508
+ if (attempt < maxStepRetries - 1) {
4509
+ logDebug(
4510
+ `Attempt ${attempt + 1}/${maxStepRetries} raised exception, retrying...`
4511
+ );
4512
+ await new Promise((resolve2) => setTimeout(resolve2, 1e3));
4513
+ continue;
4514
+ } else {
4515
+ return {
4516
+ requestId: lastRequestId,
4517
+ success: false,
4518
+ errorMessage: lastError,
4519
+ taskStatus: "failed",
4520
+ taskId: "",
4521
+ taskResult: "Task Failed"
4522
+ };
4523
+ }
4385
4524
  }
4386
- } catch (error) {
4525
+ }
4526
+ if (!taskId) {
4387
4527
  return {
4388
- requestId: "",
4528
+ requestId: lastRequestId,
4389
4529
  success: false,
4390
- errorMessage: `Failed to get task status: ${error}`,
4391
- taskAction: "",
4392
- taskProduct: "",
4393
- taskStatus: "failed"
4530
+ errorMessage: `Failed to get task_id after ${maxStepRetries} attempts: ${lastError || "Unknown error"}`,
4531
+ taskStatus: "failed",
4532
+ taskId: "",
4533
+ taskResult: "Task Failed"
4394
4534
  };
4395
4535
  }
4396
- }
4397
- /**
4398
- * Terminate a task with a specified task ID.
4399
- *
4400
- * @param taskId - The ID of the running task.
4401
- * @returns ExecutionResult containing success status, task output, and
4402
- * error message if any.
4403
- *
4404
- * @example
4405
- * ```typescript
4406
- * const agentBay = new AgentBay({ apiKey: 'your_api_key' });
4407
- * const result = await agentBay.create({ imageId: 'linux_latest' });
4408
- * if (result.success) {
4409
- * const taskResult = await result.session.agent.browser.executeTask(
4410
- * 'Navigate to baidu and query the weather of Shanghai',
4411
- * 10
4412
- * );
4413
- * const terminateResult = await result.session.agent.browser.terminateTask(
4414
- * taskResult.taskId
4415
- * );
4416
- * console.log(`Terminated: ${terminateResult.taskStatus}`);
4417
- * await result.session.delete();
4418
- * }
4419
- * ```
4420
- */
4421
- async terminateTask(taskId) {
4422
- logDebug("Terminating task");
4423
- try {
4424
- const args = { task_id: taskId };
4425
- const result = await this.session.callMcpTool("browser_use_terminate_task", args);
4426
- let content;
4427
- try {
4428
- content = JSON.parse(result.data);
4429
- } catch (err) {
4536
+ let triedTime = 0;
4537
+ const processedTimestamps = /* @__PURE__ */ new Set();
4538
+ while (triedTime < maxTryTimes) {
4539
+ const query = await this.getTaskStatus(taskId);
4540
+ if (!query.success) {
4430
4541
  return {
4431
- requestId: result.requestId,
4542
+ requestId: query.requestId,
4432
4543
  success: false,
4433
- errorMessage: `Failed to parse response: ${err}`,
4434
- taskId,
4544
+ errorMessage: query.errorMessage,
4435
4545
  taskStatus: "failed",
4546
+ taskId,
4436
4547
  taskResult: ""
4437
4548
  };
4438
4549
  }
4439
- const terminatedTaskId = content.task_id || taskId;
4440
- const status = content.status || "unknown";
4441
- if (result.success) {
4442
- return {
4443
- requestId: result.requestId,
4444
- success: true,
4445
- errorMessage: "",
4446
- taskId: terminatedTaskId,
4447
- taskStatus: status,
4448
- taskResult: ""
4449
- };
4550
+ if (query.stream) {
4551
+ for (const streamItem of query.stream) {
4552
+ const timestamp = streamItem.timestamp_ms;
4553
+ if (timestamp !== void 0 && !processedTimestamps.has(timestamp)) {
4554
+ processedTimestamps.add(timestamp);
4555
+ const content = streamItem.content || "";
4556
+ const reasoning = streamItem.reasoning || "";
4557
+ if (content) {
4558
+ process.stdout.write(content);
4559
+ }
4560
+ if (reasoning) {
4561
+ }
4562
+ }
4563
+ }
4450
4564
  }
4451
- return {
4452
- requestId: result.requestId,
4453
- success: false,
4454
- errorMessage: result.errorMessage,
4455
- taskId: terminatedTaskId,
4456
- taskStatus: status,
4457
- taskResult: ""
4458
- };
4459
- } catch (error) {
4460
- return {
4461
- requestId: "",
4462
- success: false,
4463
- errorMessage: `Failed to terminate: ${error}`,
4464
- taskId,
4465
- taskStatus: "failed",
4466
- taskResult: ""
4467
- };
4565
+ if (query.error) {
4566
+ }
4567
+ switch (query.taskStatus) {
4568
+ case "completed":
4569
+ return {
4570
+ requestId: query.requestId,
4571
+ success: true,
4572
+ errorMessage: "",
4573
+ taskId,
4574
+ taskStatus: "completed",
4575
+ taskResult: query.taskProduct
4576
+ };
4577
+ case "failed":
4578
+ return {
4579
+ requestId: query.requestId,
4580
+ success: false,
4581
+ errorMessage: query.errorMessage || "Failed to execute task.",
4582
+ taskId,
4583
+ taskStatus: "failed",
4584
+ taskResult: ""
4585
+ };
4586
+ case "cancelled":
4587
+ return {
4588
+ requestId: query.requestId,
4589
+ success: false,
4590
+ errorMessage: query.errorMessage || "Task was cancelled.",
4591
+ taskId,
4592
+ taskStatus: "cancelled",
4593
+ taskResult: ""
4594
+ };
4595
+ case "unsupported":
4596
+ return {
4597
+ requestId: query.requestId,
4598
+ success: false,
4599
+ errorMessage: query.errorMessage || "Unsupported task.",
4600
+ taskId,
4601
+ taskStatus: "unsupported",
4602
+ taskResult: ""
4603
+ };
4604
+ }
4605
+ logDebug(`\u23F3 Task ${taskId} running \u{1F680}: ${query.taskAction}.`);
4606
+ await new Promise((resolve2) => setTimeout(resolve2, 3e3));
4607
+ triedTime++;
4468
4608
  }
4609
+ logDebug("\u26A0\uFE0F task execution timeout!");
4610
+ return {
4611
+ requestId: lastRequestId,
4612
+ success: false,
4613
+ errorMessage: "Task timeout.",
4614
+ taskStatus: "failed",
4615
+ taskId,
4616
+ taskResult: "Task timeout."
4617
+ };
4469
4618
  }
4470
4619
  };
4471
- _chunk4IPTHWLMcjs.__name.call(void 0, _BrowserUseAgent, "BrowserUseAgent");
4472
- var BrowserUseAgent = _BrowserUseAgent;
4620
+ _chunk4IPTHWLMcjs.__name.call(void 0, _MobileUseAgent, "MobileUseAgent");
4621
+ var MobileUseAgent = _MobileUseAgent;
4473
4622
  var _Agent = class _Agent {
4474
4623
  /**
4475
4624
  * Initialize an Agent object.
@@ -4479,6 +4628,7 @@ var _Agent = class _Agent {
4479
4628
  constructor(session) {
4480
4629
  this.computer = new ComputerUseAgent(session);
4481
4630
  this.browser = new BrowserUseAgent(session);
4631
+ this.mobile = new MobileUseAgent(session);
4482
4632
  }
4483
4633
  };
4484
4634
  _chunk4IPTHWLMcjs.__name.call(void 0, _Agent, "Agent");