test-wuying-agentbay-sdk 0.13.1-beta.20251223194518 → 0.13.1-beta.20251224091333

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.mjs CHANGED
@@ -79,6 +79,10 @@ import {
79
79
  GetMcpResourceResponseBody,
80
80
  GetMcpResourceResponseBodyData,
81
81
  GetMcpResourceResponseBodyDataDesktopInfo,
82
+ GetSessionDetailRequest,
83
+ GetSessionDetailResponse,
84
+ GetSessionDetailResponseBody,
85
+ GetSessionDetailResponseBodyData,
82
86
  GetSessionRequest,
83
87
  GetSessionResponse,
84
88
  GetSessionResponseBody,
@@ -116,7 +120,7 @@ import {
116
120
  SyncContextRequest,
117
121
  SyncContextResponse,
118
122
  SyncContextResponseBody
119
- } from "./chunk-P2CXYF4T.mjs";
123
+ } from "./chunk-GQ4JBIRO.mjs";
120
124
  import {
121
125
  __commonJS,
122
126
  __dirname,
@@ -1118,6 +1122,53 @@ var _Client = class _Client extends (OpenApi.default || OpenApi) {
1118
1122
  const runtime = new $dara.RuntimeOptions({});
1119
1123
  return await this.getSessionWithOptions(request, runtime);
1120
1124
  }
1125
+ /**
1126
+ * Get basic session information by session ID
1127
+ *
1128
+ * @param request - GetSessionDetailRequest
1129
+ * @param runtime - runtime options for this request RuntimeOptions
1130
+ * @returns GetSessionDetailResponse
1131
+ */
1132
+ async getSessionDetailWithOptions(request, runtime) {
1133
+ request.validate();
1134
+ const query = {};
1135
+ if (!$dara.isNull(request.sessionId)) {
1136
+ query["SessionId"] = request.sessionId;
1137
+ }
1138
+ const body = {};
1139
+ if (!$dara.isNull(request.authorization)) {
1140
+ body["Authorization"] = request.authorization;
1141
+ }
1142
+ const req = new $OpenApiUtil.OpenApiRequest({
1143
+ query: OpenApiUtil.query(query),
1144
+ body: OpenApiUtil.parseToMap(body)
1145
+ });
1146
+ const params = new $OpenApiUtil.Params({
1147
+ action: "GetSessionDetail",
1148
+ version: "2025-05-06",
1149
+ protocol: "HTTPS",
1150
+ pathname: "/",
1151
+ method: "POST",
1152
+ authType: "Anonymous",
1153
+ style: "RPC",
1154
+ reqBodyType: "formData",
1155
+ bodyType: "json"
1156
+ });
1157
+ return $dara.cast(
1158
+ await this.callApi(params, req, runtime),
1159
+ new GetSessionDetailResponse({})
1160
+ );
1161
+ }
1162
+ /**
1163
+ * Get basic session information by session ID
1164
+ *
1165
+ * @param request - GetSessionDetailRequest
1166
+ * @returns GetSessionDetailResponse
1167
+ */
1168
+ async getSessionDetail(request) {
1169
+ const runtime = new $dara.RuntimeOptions({});
1170
+ return await this.getSessionDetailWithOptions(request, runtime);
1171
+ }
1121
1172
  /**
1122
1173
  * Pause session async
1123
1174
  *
@@ -3835,41 +3886,35 @@ init_esm_shims();
3835
3886
 
3836
3887
  // src/agent/agent.ts
3837
3888
  init_esm_shims();
3838
- var _ComputerUseAgent = class _ComputerUseAgent {
3839
- /**
3840
- * Initialize an Computer Agent object.
3841
- *
3842
- * @param session - The Session instance that this Agent belongs to.
3843
- */
3889
+ var _BaseTaskAgent = class _BaseTaskAgent {
3844
3890
  constructor(session) {
3845
3891
  this.session = session;
3846
3892
  }
3893
+ /**
3894
+ * Get the full MCP tool name based on prefix and action.
3895
+ */
3896
+ getToolName(action) {
3897
+ const toolMap = {
3898
+ execute: "execute_task",
3899
+ get_status: "get_task_status",
3900
+ terminate: "terminate_task"
3901
+ };
3902
+ const baseName = toolMap[action] || action;
3903
+ if (this.toolPrefix) {
3904
+ return `${this.toolPrefix}_${baseName}`;
3905
+ }
3906
+ return baseName;
3907
+ }
3847
3908
  /**
3848
3909
  * Execute a specific task described in human language.
3849
- *
3850
- * @param task - Task description in human language.
3851
- * @param maxTryTimes - Maximum number of retry attempts.
3852
- * @returns ExecutionResult containing success status, task output, and error
3853
- * message if any.
3854
- *
3855
- * @example
3856
- * ```typescript
3857
- * const agentBay = new AgentBay({ apiKey: 'your_api_key' });
3858
- * const result = await agentBay.create({ imageId: 'windows_latest' });
3859
- * if (result.success) {
3860
- * const taskResult = await result.session.agent.computer.executeTask(
3861
- * 'Open notepad',
3862
- * 10
3863
- * );
3864
- * console.log(`Task status: ${taskResult.taskStatus}`);
3865
- * await result.session.delete();
3866
- * }
3867
- * ```
3868
3910
  */
3869
3911
  async executeTask(task, maxTryTimes) {
3870
3912
  try {
3871
3913
  const args = { task, max_try_times: maxTryTimes };
3872
- const result = await this.session.callMcpTool("flux_execute_task", args);
3914
+ const result = await this.session.callMcpTool(
3915
+ this.getToolName("execute"),
3916
+ args
3917
+ );
3873
3918
  if (!result.success) {
3874
3919
  return {
3875
3920
  requestId: result.requestId,
@@ -3893,7 +3938,7 @@ var _ComputerUseAgent = class _ComputerUseAgent {
3893
3938
  taskResult: "Invalid execution response."
3894
3939
  };
3895
3940
  }
3896
- const taskId = content.task_id;
3941
+ const taskId = content.taskId || content.task_id;
3897
3942
  if (!taskId) {
3898
3943
  return {
3899
3944
  requestId: result.requestId,
@@ -3918,13 +3963,13 @@ var _ComputerUseAgent = class _ComputerUseAgent {
3918
3963
  };
3919
3964
  }
3920
3965
  switch (query.taskStatus) {
3921
- case "finished":
3966
+ case "completed":
3922
3967
  return {
3923
3968
  requestId: query.requestId,
3924
3969
  success: true,
3925
3970
  errorMessage: "",
3926
3971
  taskId,
3927
- taskStatus: "finished",
3972
+ taskStatus: "completed",
3928
3973
  taskResult: query.taskProduct
3929
3974
  };
3930
3975
  case "failed":
@@ -3936,6 +3981,15 @@ var _ComputerUseAgent = class _ComputerUseAgent {
3936
3981
  taskStatus: "failed",
3937
3982
  taskResult: ""
3938
3983
  };
3984
+ case "cancelled":
3985
+ return {
3986
+ requestId: query.requestId,
3987
+ success: false,
3988
+ errorMessage: query.errorMessage || "Task was cancelled.",
3989
+ taskId,
3990
+ taskStatus: "cancelled",
3991
+ taskResult: ""
3992
+ };
3939
3993
  case "unsupported":
3940
3994
  return {
3941
3995
  requestId: query.requestId,
@@ -3971,32 +4025,20 @@ var _ComputerUseAgent = class _ComputerUseAgent {
3971
4025
  }
3972
4026
  /**
3973
4027
  * Get the status of the task with the given task ID.
3974
- *
3975
- * @param taskId - Task ID
3976
- * @returns QueryResult containing the task status
3977
- *
3978
- * @example
3979
- * ```typescript
3980
- * const agentBay = new AgentBay({ apiKey: 'your_api_key' });
3981
- * const result = await agentBay.create({ imageId: 'windows_latest' });
3982
- * if (result.success) {
3983
- * const taskResult = await result.session.agent.computer.executeTask('Open
3984
- * calculator', 10); const statusResult = await
3985
- * result.session.agent.computer.getTaskStatus(taskResult.taskId);
3986
- * console.log(`Status:
3987
- * ${JSON.parse(statusResult.output).status}`); await result.session.delete();
3988
- * }
3989
- * ```
3990
4028
  */
3991
4029
  async getTaskStatus(taskId) {
3992
4030
  try {
3993
4031
  const args = { task_id: taskId };
3994
- const result = await this.session.callMcpTool("flux_get_task_status", args);
4032
+ const result = await this.session.callMcpTool(
4033
+ this.getToolName("get_status"),
4034
+ args
4035
+ );
3995
4036
  if (!result.success) {
3996
4037
  return {
3997
4038
  requestId: result.requestId,
3998
4039
  success: false,
3999
4040
  errorMessage: result.errorMessage,
4041
+ taskId,
4000
4042
  taskAction: "",
4001
4043
  taskProduct: "",
4002
4044
  taskStatus: "failed"
@@ -4005,19 +4047,27 @@ var _ComputerUseAgent = class _ComputerUseAgent {
4005
4047
  let queryResult;
4006
4048
  try {
4007
4049
  queryResult = JSON.parse(result.data);
4050
+ const contentTaskId = queryResult.taskId || queryResult.task_id || taskId;
4051
+ const taskProduct = queryResult.result || queryResult.product || "";
4052
+ const stream = Array.isArray(queryResult.stream) ? queryResult.stream : void 0;
4053
+ const error = queryResult.error || void 0;
4008
4054
  return {
4009
4055
  requestId: result.requestId,
4010
4056
  success: true,
4011
4057
  errorMessage: "",
4058
+ taskId: contentTaskId,
4012
4059
  taskAction: queryResult.action || "",
4013
- taskProduct: queryResult.product || "",
4014
- taskStatus: queryResult.status || "failed"
4060
+ taskProduct,
4061
+ taskStatus: queryResult.status || "completed",
4062
+ stream,
4063
+ error
4015
4064
  };
4016
4065
  } catch (error) {
4017
4066
  return {
4018
4067
  requestId: result.requestId,
4019
4068
  success: false,
4020
4069
  errorMessage: `Failed to get task status: ${error}`,
4070
+ taskId,
4021
4071
  taskAction: "",
4022
4072
  taskProduct: "",
4023
4073
  taskStatus: "failed"
@@ -4028,6 +4078,7 @@ var _ComputerUseAgent = class _ComputerUseAgent {
4028
4078
  requestId: "",
4029
4079
  success: false,
4030
4080
  errorMessage: `Failed to get task status: ${error}`,
4081
+ taskId,
4031
4082
  taskAction: "",
4032
4083
  taskProduct: "",
4033
4084
  taskStatus: "failed"
@@ -4036,33 +4087,15 @@ var _ComputerUseAgent = class _ComputerUseAgent {
4036
4087
  }
4037
4088
  /**
4038
4089
  * Terminate a task with a specified task ID.
4039
- *
4040
- * @param taskId - The ID of the running task.
4041
- * @returns ExecutionResult containing success status, task output, and
4042
- * error message if any.
4043
- *
4044
- * @example
4045
- * ```typescript
4046
- * const agentBay = new AgentBay({ apiKey: 'your_api_key' });
4047
- * const result = await agentBay.create({ imageId: 'windows_latest' });
4048
- * if (result.success) {
4049
- * const taskResult = await result.session.agent.computer.executeTask(
4050
- * 'Open notepad',
4051
- * 5
4052
- * );
4053
- * const terminateResult = await result.session.agent.computer.terminateTask(
4054
- * taskResult.taskId
4055
- * );
4056
- * console.log(`Terminated: ${terminateResult.taskStatus}`);
4057
- * await result.session.delete();
4058
- * }
4059
- * ```
4060
4090
  */
4061
4091
  async terminateTask(taskId) {
4062
4092
  logDebug("Terminating task");
4063
4093
  try {
4064
4094
  const args = { task_id: taskId };
4065
- const result = await this.session.callMcpTool("flux_terminate_task", args);
4095
+ const result = await this.session.callMcpTool(
4096
+ this.getToolName("terminate"),
4097
+ args
4098
+ );
4066
4099
  let content;
4067
4100
  try {
4068
4101
  content = JSON.parse(result.data);
@@ -4076,8 +4109,8 @@ var _ComputerUseAgent = class _ComputerUseAgent {
4076
4109
  taskResult: ""
4077
4110
  };
4078
4111
  }
4079
- const terminatedTaskId = content.task_id || taskId;
4080
- const status = content.status || "unknown";
4112
+ const terminatedTaskId = content.taskId || content.task_id || taskId;
4113
+ const status = content.status || "cancelling";
4081
4114
  if (result.success) {
4082
4115
  return {
4083
4116
  requestId: result.requestId,
@@ -4108,17 +4141,20 @@ var _ComputerUseAgent = class _ComputerUseAgent {
4108
4141
  }
4109
4142
  }
4110
4143
  };
4144
+ __name(_BaseTaskAgent, "BaseTaskAgent");
4145
+ var BaseTaskAgent = _BaseTaskAgent;
4146
+ var _ComputerUseAgent = class _ComputerUseAgent extends (BaseTaskAgent.default || BaseTaskAgent) {
4147
+ constructor() {
4148
+ super(...arguments);
4149
+ this.toolPrefix = "flux";
4150
+ }
4151
+ };
4111
4152
  __name(_ComputerUseAgent, "ComputerUseAgent");
4112
4153
  var ComputerUseAgent = _ComputerUseAgent;
4113
- var _BrowserUseAgent = class _BrowserUseAgent {
4114
- /**
4115
- * Initialize an Browser Agent object.
4116
- * @description Browser Use Agent is in BETA ⚠️ .
4117
- *
4118
- * @param session - The Session instance that this Agent belongs to.
4119
- */
4120
- constructor(session) {
4121
- this.session = session;
4154
+ var _BrowserUseAgent = class _BrowserUseAgent extends (BaseTaskAgent.default || BaseTaskAgent) {
4155
+ constructor() {
4156
+ super(...arguments);
4157
+ this.toolPrefix = "browser_use";
4122
4158
  }
4123
4159
  /**
4124
4160
  * Initialize the browser agent with specific options.
@@ -4163,276 +4199,345 @@ var _BrowserUseAgent = class _BrowserUseAgent {
4163
4199
  };
4164
4200
  }
4165
4201
  }
4202
+ };
4203
+ __name(_BrowserUseAgent, "BrowserUseAgent");
4204
+ var BrowserUseAgent = _BrowserUseAgent;
4205
+ var _MobileUseAgent = class _MobileUseAgent extends (BaseTaskAgent.default || BaseTaskAgent) {
4206
+ constructor() {
4207
+ super(...arguments);
4208
+ this.toolPrefix = "";
4209
+ }
4166
4210
  /**
4167
- * Execute a specific task described in human language.
4211
+ * Execute a task in human language without waiting for completion
4212
+ * (non-blocking). This is a fire-and-return interface that immediately
4213
+ * provides a task ID. Call getTaskStatus to check the task status.
4168
4214
  *
4169
4215
  * @param task - Task description in human language.
4170
- * @param maxTryTimes - Maximum number of retry attempts.
4171
- * @returns ExecutionResult containing success status, task output, and
4172
- * error message if any.
4216
+ * @param maxSteps - Maximum number of steps (clicks/swipes/etc.) allowed.
4217
+ * Used to prevent infinite loops or excessive resource
4218
+ * consumption. Default is 50.
4219
+ * @param maxStepRetries - Maximum retry times for MCP tool call failures
4220
+ * at SDK level. Used to retry when callMcpTool fails
4221
+ * (e.g., network errors, timeouts). Default is 3.
4222
+ * @returns ExecutionResult containing success status, task ID, task status,
4223
+ * and error message if any.
4173
4224
  *
4174
4225
  * @example
4175
4226
  * ```typescript
4176
4227
  * const agentBay = new AgentBay({ apiKey: 'your_api_key' });
4177
- * const result = await agentBay.create({ imageId: 'linux_latest' });
4228
+ * const result = await agentBay.create({ imageId: 'mobile_latest' });
4178
4229
  * if (result.success) {
4179
- * const taskResult = await result.session.agent.browser.executeTask(
4180
- * 'Navigate to baidu and query the weather of Shanghai',
4181
- * 10
4230
+ * const execResult = await result.session.agent.mobile.executeTask(
4231
+ * 'Open WeChat app', 100, 5
4182
4232
  * );
4183
- * console.log(`Task status: ${taskResult.taskStatus}`);
4233
+ * console.log(`Task ID: ${execResult.taskId}`);
4184
4234
  * await result.session.delete();
4185
4235
  * }
4186
4236
  * ```
4187
4237
  */
4188
- async executeTask(task, maxTryTimes) {
4189
- try {
4190
- const args = { task, max_try_times: maxTryTimes };
4191
- const result = await this.session.callMcpTool("browser_use_execute_task", args);
4192
- if (!result.success) {
4193
- return {
4194
- requestId: result.requestId,
4195
- success: false,
4196
- errorMessage: result.errorMessage,
4197
- taskStatus: "failed",
4198
- taskId: "",
4199
- taskResult: "Task Failed"
4200
- };
4201
- }
4202
- let content;
4238
+ async executeTask(task, maxSteps = 50, maxStepRetries = 3) {
4239
+ const args = {
4240
+ task,
4241
+ max_steps: maxSteps
4242
+ };
4243
+ let lastError;
4244
+ let lastRequestId = "";
4245
+ for (let attempt = 0; attempt < maxStepRetries; attempt++) {
4203
4246
  try {
4204
- content = JSON.parse(result.data);
4205
- } catch (err) {
4206
- return {
4207
- requestId: result.requestId,
4208
- success: false,
4209
- errorMessage: `Failed to parse response: ${err}`,
4210
- taskStatus: "failed",
4211
- taskId: "",
4212
- taskResult: "Invalid execution response."
4213
- };
4214
- }
4215
- const taskId = content.task_id;
4216
- if (!taskId) {
4217
- return {
4218
- requestId: result.requestId,
4219
- success: false,
4220
- errorMessage: "Task ID not found in response",
4221
- taskStatus: "failed",
4222
- taskId: "",
4223
- taskResult: "Invalid task ID."
4224
- };
4225
- }
4226
- let triedTime = 0;
4227
- while (triedTime < maxTryTimes) {
4228
- const query = await this.getTaskStatus(taskId);
4229
- if (!query.success) {
4230
- return {
4231
- requestId: query.requestId,
4232
- success: false,
4233
- errorMessage: query.errorMessage,
4234
- taskStatus: "failed",
4235
- taskId,
4236
- taskResult: ""
4237
- };
4238
- }
4239
- switch (query.taskStatus) {
4240
- case "finished":
4247
+ const result = await this.session.callMcpTool(
4248
+ this.getToolName("execute"),
4249
+ args
4250
+ );
4251
+ lastRequestId = result.requestId;
4252
+ if (result.success) {
4253
+ let content;
4254
+ try {
4255
+ content = JSON.parse(result.data);
4256
+ } catch (err) {
4241
4257
  return {
4242
- requestId: query.requestId,
4243
- success: true,
4244
- errorMessage: "",
4245
- taskId,
4246
- taskStatus: "finished",
4247
- taskResult: query.taskProduct
4258
+ requestId: result.requestId,
4259
+ success: false,
4260
+ errorMessage: `Failed to parse response: ${err}`,
4261
+ taskStatus: "failed",
4262
+ taskId: "",
4263
+ taskResult: "Invalid execution response."
4248
4264
  };
4249
- case "failed":
4265
+ }
4266
+ const taskId = content.taskId || content.task_id;
4267
+ if (!taskId) {
4250
4268
  return {
4251
- requestId: query.requestId,
4269
+ requestId: result.requestId,
4252
4270
  success: false,
4253
- errorMessage: query.errorMessage || "Failed to execute task.",
4254
- taskId,
4271
+ errorMessage: "Task ID not found in response",
4255
4272
  taskStatus: "failed",
4256
- taskResult: ""
4273
+ taskId: "",
4274
+ taskResult: "Invalid task ID."
4257
4275
  };
4258
- case "unsupported":
4276
+ }
4277
+ return {
4278
+ requestId: result.requestId,
4279
+ success: true,
4280
+ errorMessage: "",
4281
+ taskId,
4282
+ taskStatus: "running",
4283
+ taskResult: ""
4284
+ };
4285
+ } else {
4286
+ lastError = result.errorMessage || "Failed to execute task";
4287
+ if (attempt < maxStepRetries - 1) {
4288
+ logDebug(
4289
+ `Attempt ${attempt + 1}/${maxStepRetries} failed, retrying...`
4290
+ );
4291
+ await new Promise((resolve2) => setTimeout(resolve2, 1e3));
4292
+ continue;
4293
+ } else {
4259
4294
  return {
4260
- requestId: query.requestId,
4295
+ requestId: result.requestId,
4261
4296
  success: false,
4262
- errorMessage: query.errorMessage || "Unsupported task.",
4263
- taskId,
4264
- taskStatus: "unsupported",
4265
- taskResult: ""
4297
+ errorMessage: lastError,
4298
+ taskStatus: "failed",
4299
+ taskId: "",
4300
+ taskResult: "Task Failed"
4266
4301
  };
4302
+ }
4303
+ }
4304
+ } catch (error) {
4305
+ lastError = `Failed to execute: ${error}`;
4306
+ if (attempt < maxStepRetries - 1) {
4307
+ logDebug(
4308
+ `Attempt ${attempt + 1}/${maxStepRetries} raised exception, retrying...`
4309
+ );
4310
+ await new Promise((resolve2) => setTimeout(resolve2, 1e3));
4311
+ continue;
4312
+ } else {
4313
+ return {
4314
+ requestId: lastRequestId,
4315
+ success: false,
4316
+ errorMessage: lastError,
4317
+ taskStatus: "failed",
4318
+ taskId: "",
4319
+ taskResult: "Task Failed"
4320
+ };
4267
4321
  }
4268
- logDebug(`Task ${taskId} is still running, please wait for a while.`);
4269
- await new Promise((resolve2) => setTimeout(resolve2, 3e3));
4270
- triedTime++;
4271
4322
  }
4272
- return {
4273
- requestId: result.requestId,
4274
- success: false,
4275
- errorMessage: "Task execution timed out",
4276
- taskStatus: "timeout",
4277
- taskId,
4278
- taskResult: "Task Timed Out"
4279
- };
4280
- } catch (error) {
4281
- return {
4282
- requestId: "",
4283
- success: false,
4284
- errorMessage: `Failed to execute: ${error}`,
4285
- taskStatus: "failed",
4286
- taskId: "",
4287
- taskResult: "Task Failed"
4288
- };
4289
4323
  }
4324
+ return {
4325
+ requestId: lastRequestId,
4326
+ success: false,
4327
+ errorMessage: `Failed after ${maxStepRetries} attempts: ${lastError || "Unknown error"}`,
4328
+ taskStatus: "failed",
4329
+ taskId: "",
4330
+ taskResult: "Task Failed"
4331
+ };
4290
4332
  }
4291
4333
  /**
4292
- * Get the status of the task with the given task ID.
4334
+ * Execute a specific task described in human language synchronously.
4335
+ * This is a synchronous interface that blocks until the task is completed or
4336
+ * an error occurs, or timeout happens. The default polling interval is
4337
+ * 3 seconds.
4293
4338
  *
4294
- * @param taskId - Task ID
4295
- * @returns QueryResult containing the task status
4339
+ * @param task - Task description in human language.
4340
+ * @param maxSteps - Maximum number of steps (clicks/swipes/etc.) allowed.
4341
+ * Used to prevent infinite loops or excessive resource
4342
+ * consumption. Default is 50.
4343
+ * @param maxStepRetries - Maximum retry times for MCP tool call failures
4344
+ * at SDK level. Used to retry when callMcpTool fails
4345
+ * (e.g., network errors, timeouts). Default is 3.
4346
+ * @param maxTryTimes - Maximum number of polling attempts (each 3 seconds).
4347
+ * Used to control how long to wait for task completion.
4348
+ * Default is 300 (about 15 minutes).
4349
+ * @returns ExecutionResult containing success status, task ID, task status,
4350
+ * and error message if any.
4296
4351
  *
4297
4352
  * @example
4298
4353
  * ```typescript
4299
4354
  * const agentBay = new AgentBay({ apiKey: 'your_api_key' });
4300
- * const result = await agentBay.create({ imageId: 'linux_latest' });
4355
+ * const result = await agentBay.create({ imageId: 'mobile_latest' });
4301
4356
  * if (result.success) {
4302
- * const taskResult = await result.session.agent.browser.executeTask(
4303
- * 'Navigate to baidu and query the weather of Shanghai',
4304
- * 10
4357
+ * const execResult = await result.session.agent.mobile.executeTaskAndWait(
4358
+ * 'Open WeChat app', 100, 3, 200
4305
4359
  * );
4306
- * const statusResult = await result.session.agent.browser.getTaskStatus(
4307
- * taskResult.taskId
4308
- * );
4309
- * console.log(`Status: ${statusResult.taskStatus}`);
4360
+ * console.log(`Task result: ${execResult.taskResult}`);
4310
4361
  * await result.session.delete();
4311
4362
  * }
4312
4363
  * ```
4313
4364
  */
4314
- async getTaskStatus(taskId) {
4315
- try {
4316
- const args = { task_id: taskId };
4317
- const result = await this.session.callMcpTool("browser_use_get_task_status", args);
4318
- if (!result.success) {
4319
- return {
4320
- requestId: result.requestId,
4321
- success: false,
4322
- errorMessage: result.errorMessage,
4323
- taskAction: "",
4324
- taskProduct: "",
4325
- taskStatus: "failed"
4326
- };
4327
- }
4328
- let queryResult;
4365
+ async executeTaskAndWait(task, maxSteps = 50, maxStepRetries = 3, maxTryTimes = 300) {
4366
+ const args = {
4367
+ task,
4368
+ max_steps: maxSteps
4369
+ };
4370
+ let taskId;
4371
+ let lastError;
4372
+ let lastRequestId = "";
4373
+ for (let attempt = 0; attempt < maxStepRetries; attempt++) {
4329
4374
  try {
4330
- queryResult = JSON.parse(result.data);
4331
- return {
4332
- requestId: result.requestId,
4333
- success: true,
4334
- errorMessage: "",
4335
- taskAction: queryResult.action || "",
4336
- taskProduct: queryResult.product || "",
4337
- taskStatus: queryResult.status || "failed"
4338
- };
4375
+ const result = await this.session.callMcpTool(
4376
+ this.getToolName("execute"),
4377
+ args
4378
+ );
4379
+ lastRequestId = result.requestId;
4380
+ if (result.success) {
4381
+ let content;
4382
+ try {
4383
+ content = JSON.parse(result.data);
4384
+ } catch (err) {
4385
+ return {
4386
+ requestId: result.requestId,
4387
+ success: false,
4388
+ errorMessage: `Failed to parse response: ${err}`,
4389
+ taskStatus: "failed",
4390
+ taskId: "",
4391
+ taskResult: "Invalid execution response."
4392
+ };
4393
+ }
4394
+ taskId = content.taskId || content.task_id;
4395
+ if (!taskId) {
4396
+ return {
4397
+ requestId: result.requestId,
4398
+ success: false,
4399
+ errorMessage: "Task ID not found in response",
4400
+ taskStatus: "failed",
4401
+ taskId: "",
4402
+ taskResult: "Invalid task ID."
4403
+ };
4404
+ }
4405
+ break;
4406
+ } else {
4407
+ lastError = result.errorMessage || "Failed to execute task";
4408
+ if (attempt < maxStepRetries - 1) {
4409
+ logDebug(
4410
+ `Attempt ${attempt + 1}/${maxStepRetries} failed, retrying...`
4411
+ );
4412
+ await new Promise((resolve2) => setTimeout(resolve2, 1e3));
4413
+ continue;
4414
+ } else {
4415
+ return {
4416
+ requestId: result.requestId,
4417
+ success: false,
4418
+ errorMessage: lastError,
4419
+ taskStatus: "failed",
4420
+ taskId: "",
4421
+ taskResult: "Task Failed"
4422
+ };
4423
+ }
4424
+ }
4339
4425
  } catch (error) {
4340
- return {
4341
- requestId: result.requestId,
4342
- success: false,
4343
- errorMessage: `Failed to get task status: ${error}`,
4344
- taskAction: "",
4345
- taskProduct: "",
4346
- taskStatus: "failed"
4347
- };
4426
+ lastError = `Failed to execute: ${error}`;
4427
+ if (attempt < maxStepRetries - 1) {
4428
+ logDebug(
4429
+ `Attempt ${attempt + 1}/${maxStepRetries} raised exception, retrying...`
4430
+ );
4431
+ await new Promise((resolve2) => setTimeout(resolve2, 1e3));
4432
+ continue;
4433
+ } else {
4434
+ return {
4435
+ requestId: lastRequestId,
4436
+ success: false,
4437
+ errorMessage: lastError,
4438
+ taskStatus: "failed",
4439
+ taskId: "",
4440
+ taskResult: "Task Failed"
4441
+ };
4442
+ }
4348
4443
  }
4349
- } catch (error) {
4444
+ }
4445
+ if (!taskId) {
4350
4446
  return {
4351
- requestId: "",
4447
+ requestId: lastRequestId,
4352
4448
  success: false,
4353
- errorMessage: `Failed to get task status: ${error}`,
4354
- taskAction: "",
4355
- taskProduct: "",
4356
- taskStatus: "failed"
4449
+ errorMessage: `Failed to get task_id after ${maxStepRetries} attempts: ${lastError || "Unknown error"}`,
4450
+ taskStatus: "failed",
4451
+ taskId: "",
4452
+ taskResult: "Task Failed"
4357
4453
  };
4358
4454
  }
4359
- }
4360
- /**
4361
- * Terminate a task with a specified task ID.
4362
- *
4363
- * @param taskId - The ID of the running task.
4364
- * @returns ExecutionResult containing success status, task output, and
4365
- * error message if any.
4366
- *
4367
- * @example
4368
- * ```typescript
4369
- * const agentBay = new AgentBay({ apiKey: 'your_api_key' });
4370
- * const result = await agentBay.create({ imageId: 'linux_latest' });
4371
- * if (result.success) {
4372
- * const taskResult = await result.session.agent.browser.executeTask(
4373
- * 'Navigate to baidu and query the weather of Shanghai',
4374
- * 10
4375
- * );
4376
- * const terminateResult = await result.session.agent.browser.terminateTask(
4377
- * taskResult.taskId
4378
- * );
4379
- * console.log(`Terminated: ${terminateResult.taskStatus}`);
4380
- * await result.session.delete();
4381
- * }
4382
- * ```
4383
- */
4384
- async terminateTask(taskId) {
4385
- logDebug("Terminating task");
4386
- try {
4387
- const args = { task_id: taskId };
4388
- const result = await this.session.callMcpTool("browser_use_terminate_task", args);
4389
- let content;
4390
- try {
4391
- content = JSON.parse(result.data);
4392
- } catch (err) {
4455
+ let triedTime = 0;
4456
+ const processedTimestamps = /* @__PURE__ */ new Set();
4457
+ while (triedTime < maxTryTimes) {
4458
+ const query = await this.getTaskStatus(taskId);
4459
+ if (!query.success) {
4393
4460
  return {
4394
- requestId: result.requestId,
4461
+ requestId: query.requestId,
4395
4462
  success: false,
4396
- errorMessage: `Failed to parse response: ${err}`,
4397
- taskId,
4463
+ errorMessage: query.errorMessage,
4398
4464
  taskStatus: "failed",
4465
+ taskId,
4399
4466
  taskResult: ""
4400
4467
  };
4401
4468
  }
4402
- const terminatedTaskId = content.task_id || taskId;
4403
- const status = content.status || "unknown";
4404
- if (result.success) {
4405
- return {
4406
- requestId: result.requestId,
4407
- success: true,
4408
- errorMessage: "",
4409
- taskId: terminatedTaskId,
4410
- taskStatus: status,
4411
- taskResult: ""
4412
- };
4469
+ if (query.stream) {
4470
+ for (const streamItem of query.stream) {
4471
+ const timestamp = streamItem.timestamp_ms;
4472
+ if (timestamp !== void 0 && !processedTimestamps.has(timestamp)) {
4473
+ processedTimestamps.add(timestamp);
4474
+ const content = streamItem.content || "";
4475
+ const reasoning = streamItem.reasoning || "";
4476
+ if (content) {
4477
+ process.stdout.write(content);
4478
+ }
4479
+ if (reasoning) {
4480
+ }
4481
+ }
4482
+ }
4413
4483
  }
4414
- return {
4415
- requestId: result.requestId,
4416
- success: false,
4417
- errorMessage: result.errorMessage,
4418
- taskId: terminatedTaskId,
4419
- taskStatus: status,
4420
- taskResult: ""
4421
- };
4422
- } catch (error) {
4423
- return {
4424
- requestId: "",
4425
- success: false,
4426
- errorMessage: `Failed to terminate: ${error}`,
4427
- taskId,
4428
- taskStatus: "failed",
4429
- taskResult: ""
4430
- };
4484
+ if (query.error) {
4485
+ }
4486
+ switch (query.taskStatus) {
4487
+ case "completed":
4488
+ return {
4489
+ requestId: query.requestId,
4490
+ success: true,
4491
+ errorMessage: "",
4492
+ taskId,
4493
+ taskStatus: "completed",
4494
+ taskResult: query.taskProduct
4495
+ };
4496
+ case "failed":
4497
+ return {
4498
+ requestId: query.requestId,
4499
+ success: false,
4500
+ errorMessage: query.errorMessage || "Failed to execute task.",
4501
+ taskId,
4502
+ taskStatus: "failed",
4503
+ taskResult: ""
4504
+ };
4505
+ case "cancelled":
4506
+ return {
4507
+ requestId: query.requestId,
4508
+ success: false,
4509
+ errorMessage: query.errorMessage || "Task was cancelled.",
4510
+ taskId,
4511
+ taskStatus: "cancelled",
4512
+ taskResult: ""
4513
+ };
4514
+ case "unsupported":
4515
+ return {
4516
+ requestId: query.requestId,
4517
+ success: false,
4518
+ errorMessage: query.errorMessage || "Unsupported task.",
4519
+ taskId,
4520
+ taskStatus: "unsupported",
4521
+ taskResult: ""
4522
+ };
4523
+ }
4524
+ logDebug(`\u23F3 Task ${taskId} running \u{1F680}: ${query.taskAction}.`);
4525
+ await new Promise((resolve2) => setTimeout(resolve2, 3e3));
4526
+ triedTime++;
4431
4527
  }
4528
+ logDebug("\u26A0\uFE0F task execution timeout!");
4529
+ return {
4530
+ requestId: lastRequestId,
4531
+ success: false,
4532
+ errorMessage: "Task timeout.",
4533
+ taskStatus: "failed",
4534
+ taskId,
4535
+ taskResult: "Task timeout."
4536
+ };
4432
4537
  }
4433
4538
  };
4434
- __name(_BrowserUseAgent, "BrowserUseAgent");
4435
- var BrowserUseAgent = _BrowserUseAgent;
4539
+ __name(_MobileUseAgent, "MobileUseAgent");
4540
+ var MobileUseAgent = _MobileUseAgent;
4436
4541
  var _Agent = class _Agent {
4437
4542
  /**
4438
4543
  * Initialize an Agent object.
@@ -4442,6 +4547,7 @@ var _Agent = class _Agent {
4442
4547
  constructor(session) {
4443
4548
  this.computer = new ComputerUseAgent(session);
4444
4549
  this.browser = new BrowserUseAgent(session);
4550
+ this.mobile = new MobileUseAgent(session);
4445
4551
  }
4446
4552
  };
4447
4553
  __name(_Agent, "Agent");
@@ -10974,7 +11080,7 @@ var _Browser = class _Browser {
10974
11080
  logDebug(`VPC mode, endpoint_router_port: ${this.session.httpPort}`);
10975
11081
  this._endpointUrl = `ws://${this.session.networkInterfaceIp}:${this.session.httpPort}`;
10976
11082
  } else {
10977
- const { GetCdpLinkRequest: GetCdpLinkRequest2 } = await import("./model-BRLR6F3P.mjs");
11083
+ const { GetCdpLinkRequest: GetCdpLinkRequest2 } = await import("./model-O3ASLZ3Y.mjs");
10978
11084
  const request = new GetCdpLinkRequest2({
10979
11085
  authorization: `Bearer ${this.session.getAPIKey()}`,
10980
11086
  sessionId: this.session.sessionId
@@ -15295,7 +15401,7 @@ var _Mobile = class _Mobile {
15295
15401
  async getAdbUrl(adbkeyPub) {
15296
15402
  try {
15297
15403
  const optionsJson = JSON.stringify({ adbkey_pub: adbkeyPub });
15298
- const { GetAdbLinkRequest: GetAdbLinkRequest2 } = await import("./model-BRLR6F3P.mjs");
15404
+ const { GetAdbLinkRequest: GetAdbLinkRequest2 } = await import("./model-O3ASLZ3Y.mjs");
15299
15405
  const request = new GetAdbLinkRequest2({
15300
15406
  authorization: `Bearer ${this.session.getAPIKey()}`,
15301
15407
  sessionId: this.session.sessionId,
@@ -17925,6 +18031,91 @@ var _AgentBay = class _AgentBay {
17925
18031
  }
17926
18032
  }
17927
18033
  }
18034
+ /**
18035
+ * Get basic session information by session ID.
18036
+ *
18037
+ * @param sessionId - The ID of the session to retrieve.
18038
+ * @returns GetSessionDetailResult containing basic session information
18039
+ */
18040
+ async getSessionDetail(sessionId) {
18041
+ try {
18042
+ logAPICall("GetSessionDetail", { sessionId });
18043
+ const request = new GetSessionDetailRequest({
18044
+ authorization: `Bearer ${this.apiKey}`,
18045
+ sessionId
18046
+ });
18047
+ const response = await this.client.getSessionDetail(request);
18048
+ const body = response.body;
18049
+ const requestId = extractRequestId(response) || body?.requestId || "";
18050
+ setRequestId(requestId);
18051
+ if (body?.success === false && body.code) {
18052
+ logAPIResponseWithDetails(
18053
+ "GetSessionDetail",
18054
+ requestId,
18055
+ false,
18056
+ {},
18057
+ `[${body.code}] ${body.message || "Unknown error"}`
18058
+ );
18059
+ logDebug(
18060
+ "Full GetSessionDetail response:",
18061
+ JSON.stringify(body, null, 2)
18062
+ );
18063
+ return {
18064
+ requestId,
18065
+ httpStatusCode: body.httpStatusCode || 0,
18066
+ code: body.code,
18067
+ success: false,
18068
+ errorMessage: `[${body.code}] ${body.message || "Unknown error"}`
18069
+ };
18070
+ }
18071
+ const result = {
18072
+ requestId,
18073
+ httpStatusCode: body?.httpStatusCode || 0,
18074
+ code: body?.code || "",
18075
+ success: body?.success || false,
18076
+ errorMessage: ""
18077
+ };
18078
+ if (body?.data) {
18079
+ result.data = {
18080
+ aliuid: body.data.aliuid || "",
18081
+ apikeyId: body.data.apikeyId || "",
18082
+ appInstanceGroupId: body.data.appInstanceGroupId || "",
18083
+ appInstanceId: body.data.appInstanceId || "",
18084
+ appUserId: body.data.appUserId || "",
18085
+ bizType: body.data.bizType || 0,
18086
+ endReason: body.data.endReason || "",
18087
+ id: body.data.id || 0,
18088
+ imageId: body.data.imageId || "",
18089
+ imageType: body.data.imageType || "",
18090
+ isDeleted: body.data.isDeleted || 0,
18091
+ policyId: body.data.policyId || "",
18092
+ regionId: body.data.regionId || "",
18093
+ resourceConfigId: body.data.resourceConfigId || "",
18094
+ status: body.data.status || ""
18095
+ };
18096
+ logAPIResponseWithDetails(
18097
+ "GetSessionDetail",
18098
+ requestId,
18099
+ true,
18100
+ {
18101
+ appInstanceId: result.data.appInstanceId,
18102
+ regionId: result.data.regionId,
18103
+ status: result.data.status
18104
+ }
18105
+ );
18106
+ }
18107
+ return result;
18108
+ } catch (error) {
18109
+ logError("Error calling GetSessionDetail:", error);
18110
+ return {
18111
+ requestId: "",
18112
+ httpStatusCode: 0,
18113
+ code: "",
18114
+ success: false,
18115
+ errorMessage: `Failed to get session detail ${sessionId}: ${error}`
18116
+ };
18117
+ }
18118
+ }
17928
18119
  /**
17929
18120
  * Get a session by its ID.
17930
18121
  *
@@ -19408,6 +19599,10 @@ export {
19408
19599
  GetMcpResourceResponseBody,
19409
19600
  GetMcpResourceResponseBodyData,
19410
19601
  GetMcpResourceResponseBodyDataDesktopInfo,
19602
+ GetSessionDetailRequest,
19603
+ GetSessionDetailResponse,
19604
+ GetSessionDetailResponseBody,
19605
+ GetSessionDetailResponseBodyData,
19411
19606
  GetSessionRequest,
19412
19607
  GetSessionResponse,
19413
19608
  GetSessionResponseBody,