@aiscene/aiserver 1.9.7 → 1.9.9

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 (56) hide show
  1. package/dist/api/callback.d.ts +3 -0
  2. package/dist/api/callback.d.ts.map +1 -1
  3. package/dist/api/callback.js +48 -1
  4. package/dist/api/callback.js.map +1 -1
  5. package/dist/config/cli.d.ts +2 -0
  6. package/dist/config/cli.d.ts.map +1 -1
  7. package/dist/config/cli.js +10 -0
  8. package/dist/config/cli.js.map +1 -1
  9. package/dist/config/index.d.ts.map +1 -1
  10. package/dist/config/index.js +8 -4
  11. package/dist/config/index.js.map +1 -1
  12. package/dist/config/schema.d.ts +1 -0
  13. package/dist/config/schema.d.ts.map +1 -1
  14. package/dist/core/device-proxy.d.ts +17 -0
  15. package/dist/core/device-proxy.d.ts.map +1 -1
  16. package/dist/core/device-proxy.js +95 -5
  17. package/dist/core/device-proxy.js.map +1 -1
  18. package/dist/core/types.d.ts +5 -0
  19. package/dist/core/types.d.ts.map +1 -1
  20. package/dist/debug/types.d.ts +56 -4
  21. package/dist/debug/types.d.ts.map +1 -1
  22. package/dist/debug/websocket-server.d.ts +8 -1
  23. package/dist/debug/websocket-server.d.ts.map +1 -1
  24. package/dist/debug/websocket-server.js +177 -18
  25. package/dist/debug/websocket-server.js.map +1 -1
  26. package/dist/executor/action-executor.d.ts +5 -5
  27. package/dist/executor/action-executor.d.ts.map +1 -1
  28. package/dist/executor/action-executor.js +32 -25
  29. package/dist/executor/action-executor.js.map +1 -1
  30. package/dist/executor/android-executor.d.ts +3 -14
  31. package/dist/executor/android-executor.d.ts.map +1 -1
  32. package/dist/executor/android-executor.js +21 -96
  33. package/dist/executor/android-executor.js.map +1 -1
  34. package/dist/index.d.ts.map +1 -1
  35. package/dist/index.js +22 -10
  36. package/dist/index.js.map +1 -1
  37. package/dist/scrcpy/server.d.ts +5 -0
  38. package/dist/scrcpy/server.d.ts.map +1 -1
  39. package/dist/scrcpy/server.js +80 -14
  40. package/dist/scrcpy/server.js.map +1 -1
  41. package/dist/task/guada-online-batch-poller.d.ts +21 -0
  42. package/dist/task/guada-online-batch-poller.d.ts.map +1 -0
  43. package/dist/task/guada-online-batch-poller.js +132 -0
  44. package/dist/task/guada-online-batch-poller.js.map +1 -0
  45. package/dist/task/online-loop-poller.d.ts +20 -0
  46. package/dist/task/online-loop-poller.d.ts.map +1 -0
  47. package/dist/task/online-loop-poller.js +152 -0
  48. package/dist/task/online-loop-poller.js.map +1 -0
  49. package/dist/task/scheduler.d.ts.map +1 -1
  50. package/dist/task/scheduler.js +5 -1
  51. package/dist/task/scheduler.js.map +1 -1
  52. package/dist/web/server.d.ts +2 -1
  53. package/dist/web/server.d.ts.map +1 -1
  54. package/dist/web/server.js +16 -2
  55. package/dist/web/server.js.map +1 -1
  56. package/package.json +2 -2
@@ -63,7 +63,7 @@ export interface DebugRequest extends AiMemoryRequestFields {
63
63
  skipAppRestart?: boolean;
64
64
  loginConfig?: LoginConfig;
65
65
  loginContext?: AndroidLoginContext;
66
- /** Whistle proxy port, default 8899 */
66
+ /** Capture proxy port, default 8899. Device proxy is company-proxy only. */
67
67
  proxyPort?: number;
68
68
  /** Proxy account (userPin) for company proxy platform (proxy-pc.jd.com) */
69
69
  proxyAccount?: string;
@@ -85,12 +85,23 @@ export interface ActionExecuteRequest extends AiMemoryRequestFields {
85
85
  platform?: 'android' | 'ios';
86
86
  packageName?: string;
87
87
  modelName?: string;
88
+ url?: string;
88
89
  testUrl?: string;
90
+ test_url?: string;
91
+ targetUrl?: string;
92
+ target_url?: string;
93
+ pageUrl?: string;
94
+ openUrl?: string;
95
+ jumpUrl?: string;
96
+ deeplink?: string;
97
+ deepLink?: string;
98
+ schemeUrl?: string;
99
+ schemaUrl?: string;
89
100
  modelConfig?: Record<string, unknown>;
90
101
  skipAppRestart?: boolean;
91
102
  /** Proxy account (userPin) for company proxy platform */
92
103
  proxyAccount?: string;
93
- /** Proxy port, default 8899 */
104
+ /** Capture proxy port, default 8899. Device proxy is company-proxy only. */
94
105
  proxyPort?: number;
95
106
  loginConfig?: LoginConfig;
96
107
  loginContext?: AndroidLoginContext;
@@ -104,11 +115,23 @@ export interface AiActExecuteRequest extends AiMemoryRequestFields {
104
115
  deepLocate?: boolean;
105
116
  deepThink?: boolean;
106
117
  modelName?: string;
118
+ url?: string;
119
+ testUrl?: string;
120
+ test_url?: string;
121
+ targetUrl?: string;
122
+ target_url?: string;
123
+ pageUrl?: string;
124
+ openUrl?: string;
125
+ jumpUrl?: string;
126
+ deeplink?: string;
127
+ deepLink?: string;
128
+ schemeUrl?: string;
129
+ schemaUrl?: string;
107
130
  modelConfig?: Record<string, unknown>;
108
131
  skipAppRestart?: boolean;
109
132
  /** Proxy account (userPin) for company proxy platform */
110
133
  proxyAccount?: string;
111
- /** Proxy port, default 8899 */
134
+ /** Capture proxy port, default 8899. Device proxy is company-proxy only. */
112
135
  proxyPort?: number;
113
136
  loginConfig?: LoginConfig;
114
137
  loginContext?: AndroidLoginContext;
@@ -119,6 +142,15 @@ export interface WebActionExecuteRequest extends AiMemoryRequestFields {
119
142
  url?: string;
120
143
  testUrl?: string;
121
144
  test_url?: string;
145
+ targetUrl?: string;
146
+ target_url?: string;
147
+ pageUrl?: string;
148
+ openUrl?: string;
149
+ jumpUrl?: string;
150
+ deeplink?: string;
151
+ deepLink?: string;
152
+ schemeUrl?: string;
153
+ schemaUrl?: string;
122
154
  locatePrompt?: string;
123
155
  actionParams?: Record<string, unknown>;
124
156
  naturalLanguage?: string;
@@ -145,6 +177,15 @@ export interface BatchCase extends AiMemoryRequestFields {
145
177
  /** 测试目标 URL(web 类型,兼容平台用例字段) */
146
178
  testUrl?: string;
147
179
  test_url?: string;
180
+ targetUrl?: string;
181
+ target_url?: string;
182
+ pageUrl?: string;
183
+ openUrl?: string;
184
+ jumpUrl?: string;
185
+ deeplink?: string;
186
+ deepLink?: string;
187
+ schemeUrl?: string;
188
+ schemaUrl?: string;
148
189
  /** 自然语言指令(aiAct 模式) */
149
190
  naturalLanguage?: string;
150
191
  /** 动作类型,默认 aiAction */
@@ -170,6 +211,17 @@ export interface BatchActionRequest extends AiMemoryRequestFields {
170
211
  cases: BatchCase[];
171
212
  /** 批次级别默认配置(每条用例可覆盖) */
172
213
  url?: string;
214
+ testUrl?: string;
215
+ test_url?: string;
216
+ targetUrl?: string;
217
+ target_url?: string;
218
+ pageUrl?: string;
219
+ openUrl?: string;
220
+ jumpUrl?: string;
221
+ deeplink?: string;
222
+ deepLink?: string;
223
+ schemeUrl?: string;
224
+ schemaUrl?: string;
173
225
  mobileMode?: boolean;
174
226
  deviceName?: string;
175
227
  viewport?: {
@@ -190,7 +242,7 @@ export interface BatchActionRequest extends AiMemoryRequestFields {
190
242
  bundleId?: string;
191
243
  /** 是否跳过 app 重启 —— 仅 app */
192
244
  skipAppRestart?: boolean;
193
- /** 代理端口 */
245
+ /** 抓包代理端口;设备代理只走公司代理平台 */
194
246
  proxyPort?: number;
195
247
  /** 代理账号 */
196
248
  proxyAccount?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/debug/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/debug/types.ts"],"names":[],"mappings":"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"}
@@ -8,7 +8,7 @@ export declare class DebugWebSocketServer {
8
8
  private isStarted;
9
9
  private activeBatchSessionIds;
10
10
  private createHeadlessBatchClient;
11
- runBatchActionInBackground(request: BatchActionRequest): void;
11
+ runBatchActionInBackground(request: BatchActionRequest): Promise<void>;
12
12
  private taskLogSubscribers;
13
13
  private clientTaskSubscriptions;
14
14
  /** 当前已启动浏览器的 web session 集合(用于并发计数与 TTL 扫描) */
@@ -58,6 +58,10 @@ export declare class DebugWebSocketServer {
58
58
  private isCodeScript;
59
59
  private resolveScriptReferences;
60
60
  private resolveActionParamsReferences;
61
+ private pickNonEmptyString;
62
+ private buildCaptureDataPersistenceMeta;
63
+ private rememberCaptureDataPersistenceMeta;
64
+ private getCaptureDataPersistenceMeta;
61
65
  private handleStartDebug;
62
66
  /**
63
67
  * Web 调试主进程内嵌执行
@@ -77,7 +81,10 @@ export declare class DebugWebSocketServer {
77
81
  private handleExecuteAction;
78
82
  private handleExecuteAiAct;
79
83
  private normalizeWebUrl;
84
+ private nonEmptyText;
85
+ private pickWebTargetUrlWithSource;
80
86
  private pickWebTargetUrl;
87
+ private summarizeUrlInputs;
81
88
  private pickBatchAiMemorySource;
82
89
  private getCurrentWebUrl;
83
90
  private waitForWebPageStable;
@@ -1 +1 @@
1
- {"version":3,"file":"websocket-server.d.ts","sourceRoot":"","sources":["../../src/debug/websocket-server.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAGrD,OAAO,KAAK,EAQV,kBAAkB,EAUnB,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AA2B1D,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,GAAG,CAAgC;IAC3C,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,SAAS,CAAkB;IACnC,OAAO,CAAC,qBAAqB,CAA0B;IAEvD,OAAO,CAAC,yBAAyB;IAajC,0BAA0B,CAAC,OAAO,EAAE,kBAAkB,GAAG,IAAI;IAY7D,OAAO,CAAC,kBAAkB,CAA0C;IAEpE,OAAO,CAAC,uBAAuB,CAA0C;IAGzE,+CAA+C;IAC/C,OAAO,CAAC,mBAAmB,CAAkC;IAC7D,6DAA6D;IAC7D,OAAO,CAAC,wBAAwB,CAAgE;IAChG,6CAA6C;IAC7C,OAAO,CAAC,uBAAuB,CAA6E;IAC5G,gBAAgB;IAChB,OAAO,CAAC,iBAAiB,CAA+B;gBAE5C,IAAI,GAAE,MAAa;IAI/B,8CAA8C;IAC9C,OAAO,CAAC,eAAe;IAMvB,2CAA2C;IAC3C,OAAO,CAAC,kBAAkB;IAI1B,8BAA8B;IAC9B,OAAO,CAAC,oBAAoB;IAI5B,qCAAqC;IACrC,OAAO,CAAC,iBAAiB;IAenB,KAAK,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IA4ElD;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAmB5B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAexB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAcxB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAiB1B;;OAEG;IACH,OAAO,CAAC,0BAA0B;IAUlC,OAAO,CAAC,uBAAuB;YAuDjB,aAAa;YAuDb,kBAAkB;IAwGhC,OAAO,CAAC,uBAAuB;IAS/B,OAAO,CAAC,yBAAyB;IAWjC,4CAA4C;IAC5C,OAAO,CAAC,YAAY;YAON,uBAAuB;YAQvB,6BAA6B;YAY7B,gBAAgB;IAkD9B;;;;;OAKG;YACW,mBAAmB;IAkQjC;;OAEG;YACW,gBAAgB;IAyC9B,6CAA6C;YAC/B,uBAAuB;IAkJrC,uCAAuC;YACzB,wBAAwB;YAwKxB,mBAAmB;YAyNnB,kBAAkB;IAkQhC,OAAO,CAAC,eAAe;IAWvB,OAAO,CAAC,gBAAgB;IAKxB,OAAO,CAAC,uBAAuB;IAY/B,OAAO,CAAC,gBAAgB;YAQV,oBAAoB;YAKpB,WAAW;YAmDX,sBAAsB;IA2fpC,OAAO,CAAC,qBAAqB,CAAsC;YAErD,iBAAiB;IA8M/B,OAAO,CAAC,oBAAoB;YAiBd,uBAAuB;IAqCrC,uBAAuB;YACT,mBAAmB;IAoPjC,qCAAqC;YACvB,mBAAmB;YAkJnB,eAAe;YAiBf,qBAAqB;YA4BrB,oBAAoB;YAuBpB,eAAe;YAqDf,qBAAqB;YAqBrB,eAAe;YAgIf,aAAa;IAU3B;;OAEG;YACW,gBAAgB;IA2B9B;;;OAGG;IACH,OAAO,CAAC,gBAAgB;YAgFV,iBAAiB;IAiE/B,OAAO,CAAC,WAAW;IA2DnB,OAAO,CAAC,SAAS;IAIjB;;;OAGG;IAEH;;;OAGG;YACW,wBAAwB;YAqCxB,cAAc;IA4B5B,WAAW,IAAI,YAAY,EAAE;IAIvB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAa7B"}
1
+ {"version":3,"file":"websocket-server.d.ts","sourceRoot":"","sources":["../../src/debug/websocket-server.ts"],"names":[],"mappings":"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"}
@@ -3,7 +3,7 @@ import { fork } from 'child_process';
3
3
  import { URL } from 'url';
4
4
  import os from 'os';
5
5
  import { randomUUID } from 'crypto';
6
- import { uploadReportToServer, uploadCapturePackageFile } from '../api/callback.js';
6
+ import { saveCaptureDataToDatabase, uploadReportToServer, uploadCapturePackageFile } from '../api/callback.js';
7
7
  import fs from 'fs';
8
8
  import path from 'path';
9
9
  import { createLogger } from '../core/logger.js';
@@ -63,8 +63,9 @@ export class DebugWebSocketServer {
63
63
  }
64
64
  const batchId = request?.batchId || 'unknown';
65
65
  const ws = this.createHeadlessBatchClient(batchId);
66
- void this.handleBatchAction(ws, request).catch((error) => {
66
+ return this.handleBatchAction(ws, request).catch((error) => {
67
67
  logger.error(`[BatchAction] Background batch failed: batchId=${batchId}, error=${error.message}`);
68
+ throw error;
68
69
  });
69
70
  }
70
71
  // 任务日志订阅: taskId -> Set of WebSocket clients
@@ -491,6 +492,46 @@ export class DebugWebSocketServer {
491
492
  code: resolvedCode || actionParams.code,
492
493
  };
493
494
  }
495
+ pickNonEmptyString(...values) {
496
+ for (const value of values) {
497
+ if (typeof value === 'string' && value.trim())
498
+ return value.trim();
499
+ if (typeof value === 'number' && Number.isFinite(value))
500
+ return String(value);
501
+ }
502
+ return undefined;
503
+ }
504
+ buildCaptureDataPersistenceMeta(fallbackBatchId, ...sources) {
505
+ let batchId;
506
+ let creator;
507
+ for (const source of sources) {
508
+ if (!source || typeof source !== 'object')
509
+ continue;
510
+ const data = source;
511
+ batchId = batchId || this.pickNonEmptyString(data.batchId, data.batch_id, data.executionBatchId);
512
+ creator = creator || this.pickNonEmptyString(data.creator, data.erp, data.ownerErp, data.ownerERP, data.userErp, data.username, data.userName, data.proxyAccount);
513
+ }
514
+ return {
515
+ batchId: batchId || fallbackBatchId,
516
+ creator: creator || '',
517
+ };
518
+ }
519
+ rememberCaptureDataPersistenceMeta(sessionId, meta) {
520
+ const session = sessionManager.get(sessionId);
521
+ if (!session)
522
+ return;
523
+ session.captureDataPersistence = {
524
+ ...session.captureDataPersistence,
525
+ ...meta,
526
+ };
527
+ }
528
+ getCaptureDataPersistenceMeta(sessionId) {
529
+ const session = sessionManager.get(sessionId);
530
+ return {
531
+ batchId: session?.captureDataPersistence?.batchId || sessionId,
532
+ creator: session?.captureDataPersistence?.creator || '',
533
+ };
534
+ }
494
535
  async handleStartDebug(ws, request) {
495
536
  // Web 分支:支持 sessionId 复用 + 主进程内嵌执行 + 投屏
496
537
  if (request.platform === 'web') {
@@ -500,6 +541,7 @@ export class DebugWebSocketServer {
500
541
  // 真机分支:保持原有 fork worker 逻辑
501
542
  const sessionId = `debug-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
502
543
  const session = sessionManager.create(sessionId, ws, request.deviceId);
544
+ this.rememberCaptureDataPersistenceMeta(sessionId, this.buildCaptureDataPersistenceMeta(sessionId, request));
503
545
  this.sendMessage(ws, { type: 'session_created', sessionId }, request.deviceId);
504
546
  try {
505
547
  request.naturalLanguage = await this.resolveScriptReferences(request.naturalLanguage) || request.naturalLanguage;
@@ -556,6 +598,7 @@ export class DebugWebSocketServer {
556
598
  // 复用:更新 client 引用为最新的 ws(旧 ws 可能已断)
557
599
  session.client = ws;
558
600
  }
601
+ this.rememberCaptureDataPersistenceMeta(sessionId, this.buildCaptureDataPersistenceMeta(sessionId, request));
559
602
  // 复用时校验浏览器形态参数是否一致:mobileMode/deviceName 在 launch 阶段决定,无法热切
560
603
  if (isReuse) {
561
604
  const incomingMobile = !!request.mobileMode;
@@ -924,7 +967,7 @@ export class DebugWebSocketServer {
924
967
  logger.info('[Debug] Captured ' + capturedRequests.length + ' requests during debug session');
925
968
  // 将抓包数据保存到文件并上传到 OSS
926
969
  try {
927
- const uploadResult = await this.saveAndUploadCaptureData(capturedRequests, sessionId);
970
+ const uploadResult = await this.saveAndUploadCaptureData(capturedRequests, sessionId, this.buildCaptureDataPersistenceMeta(sessionId, request));
928
971
  if (uploadResult) {
929
972
  captureDataUrl = uploadResult;
930
973
  logger.info('[Debug] Capture data uploaded: ' + captureDataUrl);
@@ -1068,7 +1111,7 @@ export class DebugWebSocketServer {
1068
1111
  let workerCaptureDataUrl;
1069
1112
  if (workerCapturedRequests.length > 0) {
1070
1113
  try {
1071
- const uploadResult = await this.saveAndUploadCaptureData(workerCapturedRequests, sessionId);
1114
+ const uploadResult = await this.saveAndUploadCaptureData(workerCapturedRequests, sessionId, this.buildCaptureDataPersistenceMeta(sessionId, request));
1072
1115
  if (uploadResult) {
1073
1116
  workerCaptureDataUrl = uploadResult;
1074
1117
  logger.info('[Debug-Worker] Capture data uploaded: ' + workerCaptureDataUrl);
@@ -1126,6 +1169,7 @@ export class DebugWebSocketServer {
1126
1169
  async handleExecuteAction(ws, request) {
1127
1170
  const sessionId = `action-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
1128
1171
  const session = sessionManager.create(sessionId, ws, request.deviceId);
1172
+ this.rememberCaptureDataPersistenceMeta(sessionId, this.buildCaptureDataPersistenceMeta(sessionId, request));
1129
1173
  const abortController = new AbortController();
1130
1174
  session.abortController = abortController;
1131
1175
  // 调试日志:打印收到的模型配置
@@ -1172,7 +1216,8 @@ export class DebugWebSocketServer {
1172
1216
  actionParams: resolvedActionParams,
1173
1217
  udid: request.deviceId,
1174
1218
  packageName: request.packageName,
1175
- testUrl: request.testUrl,
1219
+ testUrl: this.pickWebTargetUrl(request),
1220
+ url: this.pickWebTargetUrl(request),
1176
1221
  modelConfig: fullModelConfig,
1177
1222
  aiMemory: request.aiMemory,
1178
1223
  memory: request.memory,
@@ -1224,7 +1269,7 @@ export class DebugWebSocketServer {
1224
1269
  if (capturedRequests.length > 0) {
1225
1270
  logger.info('[Action] Captured ' + capturedRequests.length + ' requests during session');
1226
1271
  try {
1227
- const uploadResult = await this.saveAndUploadCaptureData(capturedRequests, sessionId);
1272
+ const uploadResult = await this.saveAndUploadCaptureData(capturedRequests, sessionId, this.buildCaptureDataPersistenceMeta(sessionId, request));
1228
1273
  if (uploadResult) {
1229
1274
  captureDataUrl = uploadResult;
1230
1275
  logger.info('[Action] Capture data uploaded: ' + captureDataUrl);
@@ -1283,7 +1328,7 @@ export class DebugWebSocketServer {
1283
1328
  if (capturedRequests.length > 0) {
1284
1329
  logger.info('[Action] Captured ' + capturedRequests.length + ' requests (error path)');
1285
1330
  try {
1286
- const uploadResult = await this.saveAndUploadCaptureData(capturedRequests, sessionId);
1331
+ const uploadResult = await this.saveAndUploadCaptureData(capturedRequests, sessionId, this.buildCaptureDataPersistenceMeta(sessionId, request));
1287
1332
  if (uploadResult)
1288
1333
  captureDataUrl = uploadResult;
1289
1334
  }
@@ -1330,13 +1375,14 @@ export class DebugWebSocketServer {
1330
1375
  async handleExecuteAiAct(ws, request) {
1331
1376
  const sessionId = `aiact-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
1332
1377
  const session = sessionManager.create(sessionId, ws, request.deviceId);
1378
+ this.rememberCaptureDataPersistenceMeta(sessionId, this.buildCaptureDataPersistenceMeta(sessionId, request));
1333
1379
  const abortController = new AbortController();
1334
1380
  session.abortController = abortController;
1335
1381
  // 将前端传来的 modelConfig 应用到环境变量,并获取补全后的 modelConfig(含 Planning/Insight)
1336
1382
  const fullModelConfig = this.applyModelConfig(request.modelConfig);
1337
1383
  // 始终启动请求抓包
1338
1384
  try {
1339
- await whistleManager.startCapture(sessionId);
1385
+ await whistleManager.startCapture(sessionId, undefined, 3000, request.proxyAccount);
1340
1386
  logger.info('[AiAct] Whistle request capture started: sessionId=' + sessionId);
1341
1387
  }
1342
1388
  catch (captureErr) {
@@ -1442,11 +1488,15 @@ export class DebugWebSocketServer {
1442
1488
  naturalLanguage: resolvedNaturalLanguage,
1443
1489
  udid: request.deviceId,
1444
1490
  packageName: request.packageName,
1491
+ testUrl: this.pickWebTargetUrl(request),
1492
+ url: this.pickWebTargetUrl(request),
1445
1493
  modelConfig: fullModelConfig,
1446
1494
  aiMemory: request.aiMemory,
1447
1495
  memory: request.memory,
1448
1496
  memoryScope: request.memoryScope,
1449
1497
  skipAppRestart: request.skipAppRestart,
1498
+ proxyPort: request.proxyPort,
1499
+ proxyAccount: request.proxyAccount,
1450
1500
  actionParams: {
1451
1501
  deepLocate: request.deepLocate,
1452
1502
  deepThink: request.deepThink,
@@ -1492,7 +1542,7 @@ export class DebugWebSocketServer {
1492
1542
  if (capturedRequests.length > 0) {
1493
1543
  logger.info('[AiAct] Captured ' + capturedRequests.length + ' requests during session');
1494
1544
  try {
1495
- const uploadResult = await this.saveAndUploadCaptureData(capturedRequests, sessionId);
1545
+ const uploadResult = await this.saveAndUploadCaptureData(capturedRequests, sessionId, this.buildCaptureDataPersistenceMeta(sessionId, request));
1496
1546
  if (uploadResult) {
1497
1547
  captureDataUrl = uploadResult;
1498
1548
  logger.info('[AiAct] Capture data uploaded: ' + captureDataUrl);
@@ -1539,7 +1589,7 @@ export class DebugWebSocketServer {
1539
1589
  if (capturedRequests.length > 0) {
1540
1590
  logger.info('[AiAct] Captured ' + capturedRequests.length + ' requests (error path)');
1541
1591
  try {
1542
- const uploadResult = await this.saveAndUploadCaptureData(capturedRequests, sessionId);
1592
+ const uploadResult = await this.saveAndUploadCaptureData(capturedRequests, sessionId, this.buildCaptureDataPersistenceMeta(sessionId, request));
1543
1593
  if (uploadResult)
1544
1594
  captureDataUrl = uploadResult;
1545
1595
  }
@@ -1593,9 +1643,92 @@ export class DebugWebSocketServer {
1593
1643
  return String(value).split('#')[0].replace(/\/$/, '');
1594
1644
  }
1595
1645
  }
1646
+ nonEmptyText(value) {
1647
+ if (typeof value !== 'string')
1648
+ return '';
1649
+ const trimmed = value.trim();
1650
+ if (!trimmed)
1651
+ return '';
1652
+ if (trimmed.length >= 2 &&
1653
+ ((trimmed[0] === '"' && trimmed[trimmed.length - 1] === '"') ||
1654
+ (trimmed[0] === "'" && trimmed[trimmed.length - 1] === "'"))) {
1655
+ return trimmed.slice(1, -1).trim();
1656
+ }
1657
+ return trimmed;
1658
+ }
1659
+ pickWebTargetUrlWithSource(source, label = 'source', seen = new WeakSet()) {
1660
+ if (!source || typeof source !== 'object')
1661
+ return { value: '', path: '' };
1662
+ if (seen.has(source))
1663
+ return { value: '', path: '' };
1664
+ seen.add(source);
1665
+ const record = source;
1666
+ const urlKeys = [
1667
+ 'testUrl',
1668
+ 'test_url',
1669
+ 'url',
1670
+ 'targetUrl',
1671
+ 'target_url',
1672
+ 'pageUrl',
1673
+ 'page_url',
1674
+ 'openUrl',
1675
+ 'open_url',
1676
+ 'jumpUrl',
1677
+ 'jump_url',
1678
+ 'deeplink',
1679
+ 'deepLink',
1680
+ 'deep_link',
1681
+ 'schemeUrl',
1682
+ 'scheme_url',
1683
+ 'schemaUrl',
1684
+ 'schema_url',
1685
+ 'h5Url',
1686
+ 'h5_url',
1687
+ 'webUrl',
1688
+ 'web_url',
1689
+ 'landingUrl',
1690
+ 'landing_url',
1691
+ ];
1692
+ for (const key of urlKeys) {
1693
+ const value = this.nonEmptyText(record[key]);
1694
+ if (value)
1695
+ return { value, path: `${label}.${key}` };
1696
+ }
1697
+ const nestedKeys = [
1698
+ 'actionParams',
1699
+ 'params',
1700
+ 'config',
1701
+ 'data',
1702
+ 'payload',
1703
+ 'extra',
1704
+ 'case',
1705
+ 'testCase',
1706
+ 'request',
1707
+ 'context',
1708
+ ];
1709
+ for (const key of nestedKeys) {
1710
+ const nested = record[key];
1711
+ if (nested && typeof nested === 'object') {
1712
+ const picked = this.pickWebTargetUrlWithSource(nested, `${label}.${key}`, seen);
1713
+ if (picked.value)
1714
+ return picked;
1715
+ }
1716
+ }
1717
+ return { value: '', path: '' };
1718
+ }
1596
1719
  pickWebTargetUrl(source) {
1597
- const value = source?.testUrl || source?.test_url || source?.url;
1598
- return value && String(value).trim() ? String(value).trim() : '';
1720
+ return this.pickWebTargetUrlWithSource(source).value;
1721
+ }
1722
+ summarizeUrlInputs(source) {
1723
+ if (!source || typeof source !== 'object')
1724
+ return 'none';
1725
+ const record = source;
1726
+ const topLevelKeys = Object.keys(record).filter((key) => /url|link|scheme|schema|deep/i.test(key));
1727
+ const actionParams = record.actionParams;
1728
+ const actionParamKeys = actionParams && typeof actionParams === 'object'
1729
+ ? Object.keys(actionParams).filter((key) => /url|link|scheme|schema|deep/i.test(key))
1730
+ : [];
1731
+ return `top=[${topLevelKeys.join(',') || '-'}], actionParams=[${actionParamKeys.join(',') || '-'}]`;
1599
1732
  }
1600
1733
  pickBatchAiMemorySource(request, tc) {
1601
1734
  return {
@@ -1677,6 +1810,7 @@ export class DebugWebSocketServer {
1677
1810
  session = sessionManager.create(sessionId, ws);
1678
1811
  session.platform = 'web';
1679
1812
  }
1813
+ this.rememberCaptureDataPersistenceMeta(sessionId, this.buildCaptureDataPersistenceMeta(sessionId, request));
1680
1814
  try {
1681
1815
  this.sendMessage(ws, { type: 'web_action_started', sessionId, actionType: request.actionType });
1682
1816
  const resolvedNaturalLanguage = await this.resolveScriptReferences(request.naturalLanguage);
@@ -2022,7 +2156,7 @@ export class DebugWebSocketServer {
2022
2156
  if (capturedRequests.length > 0) {
2023
2157
  logger.info('[WebAction] Captured ' + capturedRequests.length + ' requests during session');
2024
2158
  try {
2025
- const uploadResult = await this.saveAndUploadCaptureData(capturedRequests, sessionId);
2159
+ const uploadResult = await this.saveAndUploadCaptureData(capturedRequests, sessionId, this.buildCaptureDataPersistenceMeta(sessionId, request));
2026
2160
  if (uploadResult) {
2027
2161
  captureDataUrl = uploadResult;
2028
2162
  logger.info('[WebAction] Capture data uploaded: ' + captureDataUrl);
@@ -2089,7 +2223,7 @@ export class DebugWebSocketServer {
2089
2223
  if (capturedRequests.length > 0) {
2090
2224
  logger.info('[WebAction] Captured ' + capturedRequests.length + ' requests (error path)');
2091
2225
  try {
2092
- const uploadResult = await this.saveAndUploadCaptureData(capturedRequests, sessionId);
2226
+ const uploadResult = await this.saveAndUploadCaptureData(capturedRequests, sessionId, this.buildCaptureDataPersistenceMeta(sessionId, request));
2093
2227
  if (uploadResult)
2094
2228
  captureDataUrl = uploadResult;
2095
2229
  }
@@ -2435,6 +2569,7 @@ export class DebugWebSocketServer {
2435
2569
  webActionRequest.sessionId = sharedSessionId;
2436
2570
  }
2437
2571
  const sessionId = sharedSessionId;
2572
+ this.rememberCaptureDataPersistenceMeta(sessionId, this.buildCaptureDataPersistenceMeta(request.batchId, tc, request));
2438
2573
  const reportGroupName = tc.title || tc.id || `batch-${request.batchId}-case-${caseIndex + 1}`;
2439
2574
  const caseMemorySource = this.pickBatchAiMemorySource(request, tc);
2440
2575
  let session = sessionManager.get(sessionId);
@@ -2443,6 +2578,7 @@ export class DebugWebSocketServer {
2443
2578
  if (!session)
2444
2579
  session = sessionManager.create(sessionId, ws);
2445
2580
  session.platform = 'web';
2581
+ this.rememberCaptureDataPersistenceMeta(sessionId, this.buildCaptureDataPersistenceMeta(request.batchId, tc, request));
2446
2582
  // 并发上限保护
2447
2583
  if (this.webSessionsActivity.size >= this.webSessionMaxConcurrency) {
2448
2584
  throw new Error(`Web 调试会话数已达上限 (${this.webSessionMaxConcurrency}),请稍后重试`);
@@ -2557,7 +2693,7 @@ export class DebugWebSocketServer {
2557
2693
  try {
2558
2694
  const capturedRequests = await whistleManager.stopCapture(sessionId);
2559
2695
  if (capturedRequests.length > 0) {
2560
- const uploadResult = await this.saveAndUploadCaptureData(capturedRequests, `${request.batchId}-${tc.id}`);
2696
+ const uploadResult = await this.saveAndUploadCaptureData(capturedRequests, `${request.batchId}-${tc.id}`, this.buildCaptureDataPersistenceMeta(request.batchId, tc, request));
2561
2697
  if (uploadResult)
2562
2698
  caseCaptureDataUrl = uploadResult;
2563
2699
  }
@@ -2639,10 +2775,16 @@ export class DebugWebSocketServer {
2639
2775
  const effectiveDeviceId = tc.deviceId || request.deviceId;
2640
2776
  const effectivePackageName = tc.packageName || request.packageName;
2641
2777
  const effectiveBundleId = tc.bundleId || request.bundleId;
2778
+ let effectiveTestUrlInfo = this.pickWebTargetUrlWithSource(tc, 'case');
2779
+ if (!effectiveTestUrlInfo.value) {
2780
+ effectiveTestUrlInfo = this.pickWebTargetUrlWithSource(request, 'request');
2781
+ }
2782
+ let effectiveTestUrl = effectiveTestUrlInfo.value;
2642
2783
  const effectiveLoginContext = tc.loginContext || batchLoginContext;
2643
2784
  const caseMemorySource = this.pickBatchAiMemorySource(request, tc);
2644
2785
  const caseSessionId = `batch-${batchId}-case-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
2645
2786
  const session = sessionManager.create(caseSessionId, ws, effectiveDeviceId);
2787
+ this.rememberCaptureDataPersistenceMeta(caseSessionId, this.buildCaptureDataPersistenceMeta(batchId, tc, request));
2646
2788
  this.activeBatchSessionIds.add(caseSessionId);
2647
2789
  const caseAbortController = new AbortController();
2648
2790
  session.abortController = caseAbortController;
@@ -2688,6 +2830,16 @@ export class DebugWebSocketServer {
2688
2830
  }
2689
2831
  const resolvedNaturalLanguage = await this.resolveScriptReferences(tc.naturalLanguage);
2690
2832
  const resolvedActionParams = await this.resolveActionParamsReferences(tc.actionParams);
2833
+ if (!effectiveTestUrl && resolvedActionParams && resolvedActionParams !== tc.actionParams) {
2834
+ effectiveTestUrlInfo = this.pickWebTargetUrlWithSource({ actionParams: resolvedActionParams }, 'case');
2835
+ effectiveTestUrl = effectiveTestUrlInfo.value;
2836
+ }
2837
+ if (effectiveTestUrl) {
2838
+ logger.info(`${caseLabel}: resolved test URL from ${effectiveTestUrlInfo.path}`);
2839
+ }
2840
+ else {
2841
+ logger.warn(`${caseLabel}: no test URL resolved; checked case ${this.summarizeUrlInputs(tc)}; request ${this.summarizeUrlInputs(request)}`);
2842
+ }
2691
2843
  // 构造 ExecuteConfig
2692
2844
  const actionType = tc.actionType || 'aiAct';
2693
2845
  const config = {
@@ -2700,6 +2852,8 @@ export class DebugWebSocketServer {
2700
2852
  udid: effectiveDeviceId,
2701
2853
  packageName: effectivePackageName,
2702
2854
  bundleId: effectiveBundleId,
2855
+ testUrl: effectiveTestUrl || undefined,
2856
+ url: effectiveTestUrl || undefined,
2703
2857
  modelConfig: fullModelConfig,
2704
2858
  aiMemory: caseMemorySource.aiMemory,
2705
2859
  memory: caseMemorySource.memory,
@@ -2735,7 +2889,7 @@ export class DebugWebSocketServer {
2735
2889
  try {
2736
2890
  const capturedRequests = await whistleManager.stopCapture(caseSessionId);
2737
2891
  if (capturedRequests.length > 0) {
2738
- const uploadResult = await this.saveAndUploadCaptureData(capturedRequests, `${batchId}-${tc.id}`);
2892
+ const uploadResult = await this.saveAndUploadCaptureData(capturedRequests, `${batchId}-${tc.id}`, this.buildCaptureDataPersistenceMeta(batchId, tc, request));
2739
2893
  if (uploadResult)
2740
2894
  caseCaptureDataUrl = uploadResult;
2741
2895
  }
@@ -2971,7 +3125,7 @@ export class DebugWebSocketServer {
2971
3125
  let stopCaptureDataUrl;
2972
3126
  if (stopCapturedRequests.length > 0) {
2973
3127
  try {
2974
- const uploadResult = await this.saveAndUploadCaptureData(stopCapturedRequests, request.sessionId);
3128
+ const uploadResult = await this.saveAndUploadCaptureData(stopCapturedRequests, request.sessionId, this.getCaptureDataPersistenceMeta(request.sessionId));
2975
3129
  if (uploadResult) {
2976
3130
  stopCaptureDataUrl = uploadResult;
2977
3131
  logger.info('[StopDebug] Capture data uploaded: ' + stopCaptureDataUrl);
@@ -3257,10 +3411,15 @@ export class DebugWebSocketServer {
3257
3411
  * 将抓包数据保存到本地文件并上传到 OSS
3258
3412
  * 返回 OSS URL,失败则返回 undefined
3259
3413
  */
3260
- async saveAndUploadCaptureData(capturedRequests, sessionId) {
3414
+ async saveAndUploadCaptureData(capturedRequests, sessionId, metadata) {
3261
3415
  if (!capturedRequests || capturedRequests.length === 0)
3262
3416
  return undefined;
3263
3417
  try {
3418
+ const effectiveMetadata = metadata || this.getCaptureDataPersistenceMeta(sessionId);
3419
+ const saveOk = await saveCaptureDataToDatabase(capturedRequests, effectiveMetadata.batchId || sessionId, effectiveMetadata.creator || '');
3420
+ if (!saveOk) {
3421
+ logger.warn(`[CaptureUpload] Save capture data to database failed, continue OSS upload (sessionId=${sessionId})`);
3422
+ }
3264
3423
  // 保存到本地临时文件
3265
3424
  const tmpDir = path.join(process.cwd(), 'tmp', 'captures');
3266
3425
  if (!fs.existsSync(tmpDir)) {