@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.
- package/dist/api/callback.d.ts +3 -0
- package/dist/api/callback.d.ts.map +1 -1
- package/dist/api/callback.js +48 -1
- package/dist/api/callback.js.map +1 -1
- package/dist/config/cli.d.ts +2 -0
- package/dist/config/cli.d.ts.map +1 -1
- package/dist/config/cli.js +10 -0
- package/dist/config/cli.js.map +1 -1
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +8 -4
- package/dist/config/index.js.map +1 -1
- package/dist/config/schema.d.ts +1 -0
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/core/device-proxy.d.ts +17 -0
- package/dist/core/device-proxy.d.ts.map +1 -1
- package/dist/core/device-proxy.js +95 -5
- package/dist/core/device-proxy.js.map +1 -1
- package/dist/core/types.d.ts +5 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/debug/types.d.ts +56 -4
- package/dist/debug/types.d.ts.map +1 -1
- package/dist/debug/websocket-server.d.ts +8 -1
- package/dist/debug/websocket-server.d.ts.map +1 -1
- package/dist/debug/websocket-server.js +177 -18
- package/dist/debug/websocket-server.js.map +1 -1
- package/dist/executor/action-executor.d.ts +5 -5
- package/dist/executor/action-executor.d.ts.map +1 -1
- package/dist/executor/action-executor.js +32 -25
- package/dist/executor/action-executor.js.map +1 -1
- package/dist/executor/android-executor.d.ts +3 -14
- package/dist/executor/android-executor.d.ts.map +1 -1
- package/dist/executor/android-executor.js +21 -96
- package/dist/executor/android-executor.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +22 -10
- package/dist/index.js.map +1 -1
- package/dist/scrcpy/server.d.ts +5 -0
- package/dist/scrcpy/server.d.ts.map +1 -1
- package/dist/scrcpy/server.js +80 -14
- package/dist/scrcpy/server.js.map +1 -1
- package/dist/task/guada-online-batch-poller.d.ts +21 -0
- package/dist/task/guada-online-batch-poller.d.ts.map +1 -0
- package/dist/task/guada-online-batch-poller.js +132 -0
- package/dist/task/guada-online-batch-poller.js.map +1 -0
- package/dist/task/online-loop-poller.d.ts +20 -0
- package/dist/task/online-loop-poller.d.ts.map +1 -0
- package/dist/task/online-loop-poller.js +152 -0
- package/dist/task/online-loop-poller.js.map +1 -0
- package/dist/task/scheduler.d.ts.map +1 -1
- package/dist/task/scheduler.js +5 -1
- package/dist/task/scheduler.js.map +1 -1
- package/dist/web/server.d.ts +2 -1
- package/dist/web/server.d.ts.map +1 -1
- package/dist/web/server.js +16 -2
- package/dist/web/server.js.map +1 -1
- package/package.json +2 -2
package/dist/debug/types.d.ts
CHANGED
|
@@ -63,7 +63,7 @@ export interface DebugRequest extends AiMemoryRequestFields {
|
|
|
63
63
|
skipAppRestart?: boolean;
|
|
64
64
|
loginConfig?: LoginConfig;
|
|
65
65
|
loginContext?: AndroidLoginContext;
|
|
66
|
-
/**
|
|
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
|
-
/**
|
|
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
|
-
/**
|
|
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;
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
1598
|
-
|
|
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)) {
|