@aiscene/aiserver 1.0.0
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 +7 -0
- package/dist/api/callback.d.ts.map +1 -0
- package/dist/api/callback.js +116 -0
- package/dist/api/callback.js.map +1 -0
- package/dist/api/device-api.d.ts +13 -0
- package/dist/api/device-api.d.ts.map +1 -0
- package/dist/api/device-api.js +98 -0
- package/dist/api/device-api.js.map +1 -0
- package/dist/api/task-api.d.ts +9 -0
- package/dist/api/task-api.d.ts.map +1 -0
- package/dist/api/task-api.js +47 -0
- package/dist/api/task-api.js.map +1 -0
- package/dist/config/cli.d.ts +30 -0
- package/dist/config/cli.d.ts.map +1 -0
- package/dist/config/cli.js +129 -0
- package/dist/config/cli.js.map +1 -0
- package/dist/config/index.d.ts +6 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +142 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/schema.d.ts +66 -0
- package/dist/config/schema.d.ts.map +1 -0
- package/dist/config/schema.js +2 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/core/event-bus.d.ts +14 -0
- package/dist/core/event-bus.d.ts.map +1 -0
- package/dist/core/event-bus.js +33 -0
- package/dist/core/event-bus.js.map +1 -0
- package/dist/core/logger.d.ts +24 -0
- package/dist/core/logger.d.ts.map +1 -0
- package/dist/core/logger.js +52 -0
- package/dist/core/logger.js.map +1 -0
- package/dist/core/types.d.ts +134 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +3 -0
- package/dist/core/types.js.map +1 -0
- package/dist/debug/dump-manager.d.ts +10 -0
- package/dist/debug/dump-manager.d.ts.map +1 -0
- package/dist/debug/dump-manager.js +52 -0
- package/dist/debug/dump-manager.js.map +1 -0
- package/dist/debug/screencast.d.ts +11 -0
- package/dist/debug/screencast.d.ts.map +1 -0
- package/dist/debug/screencast.js +88 -0
- package/dist/debug/screencast.js.map +1 -0
- package/dist/debug/session-manager.d.ts +14 -0
- package/dist/debug/session-manager.d.ts.map +1 -0
- package/dist/debug/session-manager.js +76 -0
- package/dist/debug/session-manager.js.map +1 -0
- package/dist/debug/types.d.ts +76 -0
- package/dist/debug/types.d.ts.map +1 -0
- package/dist/debug/types.js +2 -0
- package/dist/debug/types.js.map +1 -0
- package/dist/debug/web-screencast.d.ts +60 -0
- package/dist/debug/web-screencast.d.ts.map +1 -0
- package/dist/debug/web-screencast.js +146 -0
- package/dist/debug/web-screencast.js.map +1 -0
- package/dist/debug/websocket-server.d.ts +27 -0
- package/dist/debug/websocket-server.d.ts.map +1 -0
- package/dist/debug/websocket-server.js +681 -0
- package/dist/debug/websocket-server.js.map +1 -0
- package/dist/device/detector.d.ts +10 -0
- package/dist/device/detector.d.ts.map +1 -0
- package/dist/device/detector.js +100 -0
- package/dist/device/detector.js.map +1 -0
- package/dist/device/heartbeat.d.ts +26 -0
- package/dist/device/heartbeat.d.ts.map +1 -0
- package/dist/device/heartbeat.js +225 -0
- package/dist/device/heartbeat.js.map +1 -0
- package/dist/device/status-manager.d.ts +15 -0
- package/dist/device/status-manager.d.ts.map +1 -0
- package/dist/device/status-manager.js +58 -0
- package/dist/device/status-manager.js.map +1 -0
- package/dist/device/types.d.ts +30 -0
- package/dist/device/types.d.ts.map +1 -0
- package/dist/device/types.js +2 -0
- package/dist/device/types.js.map +1 -0
- package/dist/executor/action-executor.d.ts +25 -0
- package/dist/executor/action-executor.d.ts.map +1 -0
- package/dist/executor/action-executor.js +261 -0
- package/dist/executor/action-executor.js.map +1 -0
- package/dist/executor/android-executor.d.ts +12 -0
- package/dist/executor/android-executor.d.ts.map +1 -0
- package/dist/executor/android-executor.js +127 -0
- package/dist/executor/android-executor.js.map +1 -0
- package/dist/executor/base.d.ts +20 -0
- package/dist/executor/base.d.ts.map +1 -0
- package/dist/executor/base.js +91 -0
- package/dist/executor/base.js.map +1 -0
- package/dist/executor/cli-executor.d.ts +12 -0
- package/dist/executor/cli-executor.d.ts.map +1 -0
- package/dist/executor/cli-executor.js +94 -0
- package/dist/executor/cli-executor.js.map +1 -0
- package/dist/executor/code-executor.d.ts +13 -0
- package/dist/executor/code-executor.d.ts.map +1 -0
- package/dist/executor/code-executor.js +52 -0
- package/dist/executor/code-executor.js.map +1 -0
- package/dist/executor/code-instrument.d.ts +12 -0
- package/dist/executor/code-instrument.d.ts.map +1 -0
- package/dist/executor/code-instrument.js +116 -0
- package/dist/executor/code-instrument.js.map +1 -0
- package/dist/executor/executor-factory.d.ts +7 -0
- package/dist/executor/executor-factory.d.ts.map +1 -0
- package/dist/executor/executor-factory.js +24 -0
- package/dist/executor/executor-factory.js.map +1 -0
- package/dist/executor/ios-executor.d.ts +10 -0
- package/dist/executor/ios-executor.d.ts.map +1 -0
- package/dist/executor/ios-executor.js +91 -0
- package/dist/executor/ios-executor.js.map +1 -0
- package/dist/executor/types.d.ts +14 -0
- package/dist/executor/types.d.ts.map +1 -0
- package/dist/executor/types.js +2 -0
- package/dist/executor/types.js.map +1 -0
- package/dist/executor/worker-entry.d.ts +2 -0
- package/dist/executor/worker-entry.d.ts.map +1 -0
- package/dist/executor/worker-entry.js +61 -0
- package/dist/executor/worker-entry.js.map +1 -0
- package/dist/index.d.ts +22 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +157 -0
- package/dist/index.js.map +1 -0
- package/dist/node/service.d.ts +21 -0
- package/dist/node/service.d.ts.map +1 -0
- package/dist/node/service.js +178 -0
- package/dist/node/service.js.map +1 -0
- package/dist/node/types.d.ts +45 -0
- package/dist/node/types.d.ts.map +1 -0
- package/dist/node/types.js +3 -0
- package/dist/node/types.js.map +1 -0
- package/dist/storage/database.d.ts +6 -0
- package/dist/storage/database.d.ts.map +1 -0
- package/dist/storage/database.js +154 -0
- package/dist/storage/database.js.map +1 -0
- package/dist/storage/repositories/debug-log-repo.d.ts +29 -0
- package/dist/storage/repositories/debug-log-repo.d.ts.map +1 -0
- package/dist/storage/repositories/debug-log-repo.js +90 -0
- package/dist/storage/repositories/debug-log-repo.js.map +1 -0
- package/dist/storage/repositories/device-repo.d.ts +12 -0
- package/dist/storage/repositories/device-repo.d.ts.map +1 -0
- package/dist/storage/repositories/device-repo.js +87 -0
- package/dist/storage/repositories/device-repo.js.map +1 -0
- package/dist/storage/repositories/execution-log-repo.d.ts +9 -0
- package/dist/storage/repositories/execution-log-repo.d.ts.map +1 -0
- package/dist/storage/repositories/execution-log-repo.js +49 -0
- package/dist/storage/repositories/execution-log-repo.js.map +1 -0
- package/dist/storage/repositories/task-repo.d.ts +13 -0
- package/dist/storage/repositories/task-repo.d.ts.map +1 -0
- package/dist/storage/repositories/task-repo.js +109 -0
- package/dist/storage/repositories/task-repo.js.map +1 -0
- package/dist/task/poller.d.ts +25 -0
- package/dist/task/poller.d.ts.map +1 -0
- package/dist/task/poller.js +153 -0
- package/dist/task/poller.js.map +1 -0
- package/dist/task/queue.d.ts +13 -0
- package/dist/task/queue.d.ts.map +1 -0
- package/dist/task/queue.js +38 -0
- package/dist/task/queue.js.map +1 -0
- package/dist/task/scheduler.d.ts +25 -0
- package/dist/task/scheduler.d.ts.map +1 -0
- package/dist/task/scheduler.js +274 -0
- package/dist/task/scheduler.js.map +1 -0
- package/dist/task/types.d.ts +31 -0
- package/dist/task/types.d.ts.map +1 -0
- package/dist/task/types.js +37 -0
- package/dist/task/types.js.map +1 -0
- package/dist/web/server.d.ts +14 -0
- package/dist/web/server.d.ts.map +1 -0
- package/dist/web/server.js +478 -0
- package/dist/web/server.js.map +1 -0
- package/package.json +49 -0
|
@@ -0,0 +1,261 @@
|
|
|
1
|
+
import { exec } from 'child_process';
|
|
2
|
+
import { promisify } from 'util';
|
|
3
|
+
import { BaseExecutor } from './base.js';
|
|
4
|
+
import { instrumentCode } from './code-instrument.js';
|
|
5
|
+
const execPromise = promisify(exec);
|
|
6
|
+
/**
|
|
7
|
+
* ActionExecutor - Handles single-step actions from debug-websocket
|
|
8
|
+
* Supports: aiTap, aiInput, aiAssert, aiQuery, aiWaitFor, aiAct, aiDoubleClick, aiHover, aiScroll, aiBoolean, batch, runCode
|
|
9
|
+
* Consistent with electron-shadcn reference project
|
|
10
|
+
*/
|
|
11
|
+
export class ActionExecutor extends BaseExecutor {
|
|
12
|
+
device = null;
|
|
13
|
+
agent = null;
|
|
14
|
+
async execute(config) {
|
|
15
|
+
try {
|
|
16
|
+
this.log(`Executing action: ${config.actionType}`);
|
|
17
|
+
// Connect device
|
|
18
|
+
if (config.udid) {
|
|
19
|
+
const { AndroidAgent: AA, AndroidDevice: AD } = await import('@aiscene/android');
|
|
20
|
+
this.device = new AD(config.udid);
|
|
21
|
+
try {
|
|
22
|
+
await this.device.connect();
|
|
23
|
+
this.log(`Connected to device: ${config.udid}`);
|
|
24
|
+
}
|
|
25
|
+
catch (connectError) {
|
|
26
|
+
const connectErrorMessage = connectError.message;
|
|
27
|
+
const isConnectionConflict = connectErrorMessage.includes('device offline') ||
|
|
28
|
+
connectErrorMessage.includes('device unauthorized') ||
|
|
29
|
+
connectErrorMessage.includes('more than one device');
|
|
30
|
+
if (isConnectionConflict) {
|
|
31
|
+
this.logger.warn(`Device connection issue, possible automation tool conflict: ${connectErrorMessage}`);
|
|
32
|
+
throw new Error(`设备连接失败,可能是由于其他自动化工具正在使用设备。错误详情: ${connectErrorMessage}`);
|
|
33
|
+
}
|
|
34
|
+
throw connectError;
|
|
35
|
+
}
|
|
36
|
+
// Handle testUrl parameter: start app and open specified URL
|
|
37
|
+
if (config.testUrl) {
|
|
38
|
+
await this.handleTestUrl(config.udid, config.testUrl);
|
|
39
|
+
}
|
|
40
|
+
// Create Agent with modelConfig and testName
|
|
41
|
+
const agentConfig = {};
|
|
42
|
+
if (config.modelConfig)
|
|
43
|
+
agentConfig.modelConfig = config.modelConfig;
|
|
44
|
+
if (config.testName)
|
|
45
|
+
agentConfig.groupName = config.testName;
|
|
46
|
+
this.agent = new AA(this.device, agentConfig);
|
|
47
|
+
this.log(`Agent created with modelConfig: ${JSON.stringify(config.modelConfig ? Object.keys(config.modelConfig) : [])}`);
|
|
48
|
+
}
|
|
49
|
+
if (!this.agent) {
|
|
50
|
+
throw new Error('No agent available for action execution');
|
|
51
|
+
}
|
|
52
|
+
// Start dump interval
|
|
53
|
+
this.startDumpInterval(() => {
|
|
54
|
+
try {
|
|
55
|
+
return this.agent?.dumpDataString?.({ inlineScreenshots: true }) || null;
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
return null;
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
// Execute action
|
|
62
|
+
let result;
|
|
63
|
+
const agent = this.agent;
|
|
64
|
+
switch (config.actionType) {
|
|
65
|
+
case 'runCode': {
|
|
66
|
+
result = await this.executeRunCode(config, agent);
|
|
67
|
+
break;
|
|
68
|
+
}
|
|
69
|
+
case 'batch': {
|
|
70
|
+
result = await this.executeBatch(config, agent);
|
|
71
|
+
break;
|
|
72
|
+
}
|
|
73
|
+
case 'aiInput':
|
|
74
|
+
result = await agent.aiInput(config.locatePrompt || '', config.actionParams);
|
|
75
|
+
break;
|
|
76
|
+
case 'aiTap':
|
|
77
|
+
result = await agent.aiTap(config.locatePrompt || '', config.actionParams);
|
|
78
|
+
break;
|
|
79
|
+
case 'aiAssert':
|
|
80
|
+
result = await agent.aiAssert(config.locatePrompt || '', config.actionParams);
|
|
81
|
+
break;
|
|
82
|
+
case 'aiQuery':
|
|
83
|
+
result = await agent.aiQuery(config.locatePrompt || '', config.actionParams);
|
|
84
|
+
break;
|
|
85
|
+
case 'aiWaitFor':
|
|
86
|
+
result = await agent.aiWaitFor(config.locatePrompt || '', config.actionParams);
|
|
87
|
+
break;
|
|
88
|
+
case 'aiDoubleClick':
|
|
89
|
+
result = await agent.aiDoubleClick(config.locatePrompt || '', config.actionParams);
|
|
90
|
+
break;
|
|
91
|
+
case 'aiHover':
|
|
92
|
+
result = await agent.aiHover(config.locatePrompt || '', config.actionParams);
|
|
93
|
+
break;
|
|
94
|
+
case 'aiScroll':
|
|
95
|
+
result = await agent.aiScroll(config.locatePrompt || '', config.actionParams);
|
|
96
|
+
break;
|
|
97
|
+
case 'aiBoolean':
|
|
98
|
+
result = await agent.aiBoolean(config.locatePrompt || '', config.actionParams);
|
|
99
|
+
break;
|
|
100
|
+
case 'aiAct':
|
|
101
|
+
result = await agent.aiAct(config.naturalLanguage || config.locatePrompt || '', config.actionParams);
|
|
102
|
+
break;
|
|
103
|
+
default:
|
|
104
|
+
throw new Error(`Unknown action type: ${config.actionType}`);
|
|
105
|
+
}
|
|
106
|
+
this.stopDumpInterval();
|
|
107
|
+
const dumpString = agent?.dumpDataString?.({ inlineScreenshots: true }) || '';
|
|
108
|
+
const reportHTML = agent?.reportHTMLString?.({ inlineScreenshots: true }) || '';
|
|
109
|
+
const reportFile = agent?.reportFile || '';
|
|
110
|
+
return { success: true, result, dump: dumpString, reportHTML, reportFile };
|
|
111
|
+
}
|
|
112
|
+
catch (error) {
|
|
113
|
+
this.stopDumpInterval();
|
|
114
|
+
this.logger.error(`Action execution failed: ${error.message}`);
|
|
115
|
+
let dumpString = '';
|
|
116
|
+
let reportHTML = '';
|
|
117
|
+
let reportFile = '';
|
|
118
|
+
try {
|
|
119
|
+
if (this.agent && typeof this.agent.dumpDataString === 'function') {
|
|
120
|
+
dumpString = this.agent.dumpDataString({ inlineScreenshots: true });
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
catch { /* ignore */ }
|
|
124
|
+
try {
|
|
125
|
+
if (this.agent && typeof this.agent.reportHTMLString === 'function') {
|
|
126
|
+
reportHTML = this.agent.reportHTMLString({ inlineScreenshots: true });
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
catch { /* ignore */ }
|
|
130
|
+
try {
|
|
131
|
+
if (this.agent && typeof this.agent.reportFile !== 'undefined') {
|
|
132
|
+
reportFile = this.agent.reportFile || '';
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
catch { /* ignore */ }
|
|
136
|
+
return { success: false, errorMessage: error.message, dump: dumpString, reportHTML, reportFile };
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Handle testUrl: start app and open specified URL via ADB
|
|
141
|
+
* Consistent with electron-shadcn reference project
|
|
142
|
+
*/
|
|
143
|
+
async handleTestUrl(deviceId, testUrl) {
|
|
144
|
+
try {
|
|
145
|
+
this.log(`Starting test URL: ${testUrl}`);
|
|
146
|
+
let adbCommand;
|
|
147
|
+
if (!testUrl.startsWith('http')) {
|
|
148
|
+
// Non-HTTP link: use InterfaceActivity
|
|
149
|
+
let processedUrl = testUrl;
|
|
150
|
+
// Handle JSON parameter encoding
|
|
151
|
+
if (testUrl.includes('params=') && testUrl.includes('{')) {
|
|
152
|
+
const urlParts = testUrl.split('params=');
|
|
153
|
+
if (urlParts.length === 2) {
|
|
154
|
+
const encodedParams = encodeURIComponent(urlParts[1]);
|
|
155
|
+
processedUrl = urlParts[0] + 'params=' + encodedParams;
|
|
156
|
+
this.log('URL-encoded JSON parameters');
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
adbCommand = `am start -n com.jingdong.app.mall/.open.InterfaceActivity -a android.intent.action.VIEW -d "${processedUrl}"`;
|
|
160
|
+
}
|
|
161
|
+
else {
|
|
162
|
+
// HTTP link: use BrowserActivity with escaped &
|
|
163
|
+
const escapedUrl = testUrl.replace(/&/g, '\\&');
|
|
164
|
+
adbCommand = `am start -n com.jingdong.app.mall/.open.BrowserActivity -d "${escapedUrl}"`;
|
|
165
|
+
}
|
|
166
|
+
const fullCommand = `adb -s ${deviceId} shell ${adbCommand}`;
|
|
167
|
+
this.log(`Executing ADB command: ${fullCommand}`);
|
|
168
|
+
const { stdout, stderr } = await execPromise(fullCommand, { timeout: 15000 });
|
|
169
|
+
if (stderr) {
|
|
170
|
+
this.logger.warn(`ADB command stderr: ${stderr}`);
|
|
171
|
+
}
|
|
172
|
+
this.log(`ADB command executed successfully, output: ${stdout}`);
|
|
173
|
+
// Wait for app to start
|
|
174
|
+
await this.sleep(10000);
|
|
175
|
+
}
|
|
176
|
+
catch (error) {
|
|
177
|
+
this.logger.warn(`URL launch failed: ${error.message}`);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Execute runCode action with AsyncFunction + code instrumentation + context
|
|
182
|
+
* Consistent with electron-shadcn reference project
|
|
183
|
+
*/
|
|
184
|
+
async executeRunCode(config, agent) {
|
|
185
|
+
const code = config.actionParams?.code;
|
|
186
|
+
if (!code) {
|
|
187
|
+
throw new Error('code parameter is required for runCode action');
|
|
188
|
+
}
|
|
189
|
+
this.log(`Executing runCode (${code.length} chars)`);
|
|
190
|
+
// Capture context callback reference before entering AsyncFunction scope
|
|
191
|
+
const onExecutionLine = this.context?.onExecutionLine;
|
|
192
|
+
// Instrument code for line tracking using AST-based instrumentation
|
|
193
|
+
const instrumentedCode = instrumentCode(code, !!onExecutionLine);
|
|
194
|
+
// Create execution context with agent, device, sleep, console
|
|
195
|
+
// Use direct references to avoid `this` binding issues inside AsyncFunction
|
|
196
|
+
const self = this;
|
|
197
|
+
const device = this.device;
|
|
198
|
+
const contextObj = {
|
|
199
|
+
agent,
|
|
200
|
+
device,
|
|
201
|
+
sleep: (ms) => new Promise(resolve => setTimeout(resolve, ms)),
|
|
202
|
+
console: {
|
|
203
|
+
log: (...args) => self.log(args.join(' ')),
|
|
204
|
+
error: (...args) => self.log('ERROR: ' + args.join(' ')),
|
|
205
|
+
warn: (...args) => self.log('WARN: ' + args.join(' ')),
|
|
206
|
+
},
|
|
207
|
+
__lineCallback: onExecutionLine || (() => { }),
|
|
208
|
+
};
|
|
209
|
+
// Execute using AsyncFunction
|
|
210
|
+
const AsyncFunctionCtor = async function () { }.constructor;
|
|
211
|
+
if (typeof AsyncFunctionCtor !== 'function') {
|
|
212
|
+
throw new Error('Cannot create AsyncFunction constructor');
|
|
213
|
+
}
|
|
214
|
+
const fn = new AsyncFunctionCtor(instrumentedCode);
|
|
215
|
+
if (typeof fn !== 'function') {
|
|
216
|
+
throw new Error('Code compilation failed');
|
|
217
|
+
}
|
|
218
|
+
const result = await fn.call(contextObj);
|
|
219
|
+
// Send execution complete message
|
|
220
|
+
this.emit('debug:execution_line', { sessionId: this.context?.sessionId, complete: true });
|
|
221
|
+
return result;
|
|
222
|
+
}
|
|
223
|
+
async executeBatch(config, agent) {
|
|
224
|
+
const actions = config.actionParams?.actions || [];
|
|
225
|
+
const results = [];
|
|
226
|
+
for (let i = 0; i < actions.length; i++) {
|
|
227
|
+
const action = actions[i];
|
|
228
|
+
const method = action.method;
|
|
229
|
+
if (typeof agent?.[method] === 'function') {
|
|
230
|
+
const actionResult = await agent[method](...action.args);
|
|
231
|
+
results.push({ method: action.method, result: actionResult });
|
|
232
|
+
if (this.context.onProgress) {
|
|
233
|
+
this.context.onProgress({ method: action.method, index: i + 1, total: actions.length });
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
return results;
|
|
238
|
+
}
|
|
239
|
+
async destroy() {
|
|
240
|
+
this.stopDumpInterval();
|
|
241
|
+
if (this.agent) {
|
|
242
|
+
try {
|
|
243
|
+
await this.agent.destroy?.();
|
|
244
|
+
}
|
|
245
|
+
catch (e) {
|
|
246
|
+
this.logger.warn(`Agent destroy error: ${e.message}`);
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
if (this.device) {
|
|
250
|
+
try {
|
|
251
|
+
await this.device.disconnect();
|
|
252
|
+
}
|
|
253
|
+
catch (e) {
|
|
254
|
+
this.logger.warn(`Device disconnect error: ${e.message}`);
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
this.agent = null;
|
|
258
|
+
this.device = null;
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
//# sourceMappingURL=action-executor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"action-executor.js","sourceRoot":"","sources":["../../src/executor/action-executor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { BaseExecutor } from './base.js';
|
|
2
|
+
import type { ExecuteConfig, ExecuteResult } from '../core/types.js';
|
|
3
|
+
export declare class AndroidExecutor extends BaseExecutor {
|
|
4
|
+
private device;
|
|
5
|
+
private agent;
|
|
6
|
+
execute(config: ExecuteConfig): Promise<ExecuteResult>;
|
|
7
|
+
private connectDevice;
|
|
8
|
+
private wakeUpAndLaunch;
|
|
9
|
+
private launchUrl;
|
|
10
|
+
destroy(): Promise<void>;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=android-executor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"android-executor.d.ts","sourceRoot":"","sources":["../../src/executor/android-executor.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAIrE,qBAAa,eAAgB,SAAQ,YAAY;IAC/C,OAAO,CAAC,MAAM,CAA8B;IAC5C,OAAO,CAAC,KAAK,CAA6B;IAEpC,OAAO,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC;YAqD9C,aAAa;YAiBb,eAAe;YAiBf,SAAS;IA2BjB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAY/B"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import { AndroidAgent, AndroidDevice, getConnectedDevices } from '@aiscene/android';
|
|
2
|
+
import { exec } from 'child_process';
|
|
3
|
+
import { promisify } from 'util';
|
|
4
|
+
import { BaseExecutor } from './base.js';
|
|
5
|
+
const execPromise = promisify(exec);
|
|
6
|
+
export class AndroidExecutor extends BaseExecutor {
|
|
7
|
+
device = null;
|
|
8
|
+
agent = null;
|
|
9
|
+
async execute(config) {
|
|
10
|
+
try {
|
|
11
|
+
this.log(`Starting Android execution: ${config.packageName}`);
|
|
12
|
+
// Connect device
|
|
13
|
+
await this.connectDevice(config);
|
|
14
|
+
// Create agent
|
|
15
|
+
const agentConfig = {};
|
|
16
|
+
if (config.aiActionContext)
|
|
17
|
+
agentConfig.aiActionContext = config.aiActionContext;
|
|
18
|
+
if (config.testName)
|
|
19
|
+
agentConfig.groupName = config.testName;
|
|
20
|
+
if (config.modelConfig)
|
|
21
|
+
agentConfig.modelConfig = config.modelConfig;
|
|
22
|
+
this.agent = new AndroidAgent(this.device, agentConfig);
|
|
23
|
+
this.log('Midscene Android Agent initialized');
|
|
24
|
+
// Start dump interval
|
|
25
|
+
this.startDumpInterval(() => {
|
|
26
|
+
try {
|
|
27
|
+
return this.agent?.dumpDataString?.({ inlineScreenshots: true }) || null;
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
// Launch app and navigate
|
|
34
|
+
if (config.executionId && !config.executionId.startsWith('debug-')) {
|
|
35
|
+
await this.wakeUpAndLaunch(config);
|
|
36
|
+
}
|
|
37
|
+
await this.sleep(config.waitTime || 5000);
|
|
38
|
+
// Execute test script (placeholder for AI-generated scripts)
|
|
39
|
+
if (config.requirement) {
|
|
40
|
+
this.log(`Executing requirement: ${config.requirement}`);
|
|
41
|
+
await this.agent.aiAction(config.requirement);
|
|
42
|
+
}
|
|
43
|
+
this.stopDumpInterval();
|
|
44
|
+
const reportFile = this.agent?.reportFile;
|
|
45
|
+
const dumpString = this.agent?.dumpDataString?.({ inlineScreenshots: true }) || '';
|
|
46
|
+
const reportHTML = this.agent?.reportHTMLString?.({ inlineScreenshots: true }) || '';
|
|
47
|
+
return { success: true, reportFile, dump: dumpString, reportHTML };
|
|
48
|
+
}
|
|
49
|
+
catch (error) {
|
|
50
|
+
this.stopDumpInterval();
|
|
51
|
+
this.logger.error(`Android execution failed: ${error.message}`);
|
|
52
|
+
const reportFile = this.agent?.reportFile;
|
|
53
|
+
return { success: false, errorMessage: error.message, reportFile };
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
async connectDevice(config) {
|
|
57
|
+
const devices = await getConnectedDevices();
|
|
58
|
+
if (devices.length === 0) {
|
|
59
|
+
throw new Error('No Android devices connected');
|
|
60
|
+
}
|
|
61
|
+
const targetUdid = config.udid || devices[0].udid;
|
|
62
|
+
const targetDevice = devices.find((d) => d.udid === targetUdid);
|
|
63
|
+
if (!targetDevice) {
|
|
64
|
+
throw new Error(`Device not found: ${targetUdid}`);
|
|
65
|
+
}
|
|
66
|
+
this.device = new AndroidDevice(targetUdid);
|
|
67
|
+
await this.device.connect();
|
|
68
|
+
this.log(`Connected to device: ${targetUdid}`);
|
|
69
|
+
}
|
|
70
|
+
async wakeUpAndLaunch(config) {
|
|
71
|
+
try {
|
|
72
|
+
await this.agent?.runAdbShell?.('input keyevent KEYCODE_WAKEUP');
|
|
73
|
+
await this.agent?.runAdbShell?.('input keyevent KEYCODE_MENU');
|
|
74
|
+
await this.agent?.runAdbShell?.(`am force-stop ${config.packageName}`);
|
|
75
|
+
await this.sleep(2000);
|
|
76
|
+
await this.agent.launch(config.packageName);
|
|
77
|
+
await this.sleep(2000);
|
|
78
|
+
if (config.testUrl) {
|
|
79
|
+
await this.launchUrl(config);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
catch (error) {
|
|
83
|
+
this.logger.warn(`App launch warning: ${error.message}`);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
async launchUrl(config) {
|
|
87
|
+
const deviceId = config.udid || this.device?.deviceId;
|
|
88
|
+
if (!deviceId || !config.testUrl)
|
|
89
|
+
return;
|
|
90
|
+
try {
|
|
91
|
+
let adbCommand;
|
|
92
|
+
if (!config.testUrl.startsWith('http')) {
|
|
93
|
+
let processedUrl = config.testUrl;
|
|
94
|
+
if (config.testUrl.includes('params=') && config.testUrl.includes('{')) {
|
|
95
|
+
const parts = config.testUrl.split('params=');
|
|
96
|
+
if (parts.length === 2) {
|
|
97
|
+
processedUrl = parts[0] + 'params=' + encodeURIComponent(parts[1]);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
adbCommand = `am start -n com.jingdong.app.mall/.open.InterfaceActivity -a android.intent.action.VIEW -d "${processedUrl}"`;
|
|
101
|
+
}
|
|
102
|
+
else {
|
|
103
|
+
const escapedUrl = config.testUrl.replace(/&/g, '\\&');
|
|
104
|
+
adbCommand = `am start -n com.jingdong.app.mall/.open.BrowserActivity -d "${escapedUrl}"`;
|
|
105
|
+
}
|
|
106
|
+
await execPromise(`adb -s ${deviceId} shell ${adbCommand}`, { timeout: 15000 });
|
|
107
|
+
await this.sleep(10000);
|
|
108
|
+
}
|
|
109
|
+
catch (error) {
|
|
110
|
+
this.logger.warn(`URL launch failed: ${error.message}`);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
async destroy() {
|
|
114
|
+
this.stopDumpInterval();
|
|
115
|
+
if (this.device) {
|
|
116
|
+
try {
|
|
117
|
+
await this.device.disconnect();
|
|
118
|
+
}
|
|
119
|
+
catch (e) {
|
|
120
|
+
this.logger.warn(`Device disconnect error: ${e.message}`);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
this.agent = null;
|
|
124
|
+
this.device = null;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=android-executor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"android-executor.js","sourceRoot":"","sources":["../../src/executor/android-executor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { createLogger } from '../core/logger.js';
|
|
2
|
+
import type { ExecuteConfig, ExecuteResult } from '../core/types.js';
|
|
3
|
+
import type { ExecutorContext } from './types.js';
|
|
4
|
+
export declare abstract class BaseExecutor {
|
|
5
|
+
protected context: ExecutorContext;
|
|
6
|
+
readonly logger: ReturnType<typeof createLogger>;
|
|
7
|
+
protected dumpIntervalId: NodeJS.Timeout | null;
|
|
8
|
+
constructor(context?: ExecutorContext);
|
|
9
|
+
abstract execute(config: ExecuteConfig): Promise<ExecuteResult>;
|
|
10
|
+
abstract destroy(): Promise<void>;
|
|
11
|
+
protected emit(event: string, data: unknown): void;
|
|
12
|
+
protected log(message: string): void;
|
|
13
|
+
protected startDumpInterval(getDump: () => string | null, intervalMs?: number): void;
|
|
14
|
+
protected stopDumpInterval(): void;
|
|
15
|
+
protected emitDump(dump: string): void;
|
|
16
|
+
protected sleep(ms: number): Promise<void>;
|
|
17
|
+
protected logMemoryUsage(prefix?: string): void;
|
|
18
|
+
protected tryGC(): void;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=base.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../src/executor/base.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACrE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAIlD,8BAAsB,YAAY;IAChC,SAAS,CAAC,OAAO,EAAE,eAAe,CAAC;IACnC,SAAgB,MAAM,EAAE,UAAU,CAAC,OAAO,YAAY,CAAC,CAAC;IACxD,SAAS,CAAC,cAAc,EAAE,MAAM,CAAC,OAAO,GAAG,IAAI,CAAQ;gBAE3C,OAAO,GAAE,eAAoB;IAKzC,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC;IAC/D,QAAQ,CAAC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAEjC,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,IAAI;IAUlD,SAAS,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAOpC,SAAS,CAAC,iBAAiB,CAAC,OAAO,EAAE,MAAM,MAAM,GAAG,IAAI,EAAE,UAAU,GAAE,MAAa,GAAG,IAAI;IAoB1F,SAAS,CAAC,gBAAgB,IAAI,IAAI;IAOlC,SAAS,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAYtC,SAAS,CAAC,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAK1C,SAAS,CAAC,cAAc,CAAC,MAAM,GAAE,MAAiB,GAAG,IAAI;IAezD,SAAS,CAAC,KAAK,IAAI,IAAI;CAUxB"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { eventBus } from '../core/event-bus.js';
|
|
2
|
+
import { createLogger } from '../core/logger.js';
|
|
3
|
+
const logger = createLogger('BaseExecutor');
|
|
4
|
+
export class BaseExecutor {
|
|
5
|
+
context;
|
|
6
|
+
logger;
|
|
7
|
+
dumpIntervalId = null;
|
|
8
|
+
constructor(context = {}) {
|
|
9
|
+
this.context = context;
|
|
10
|
+
this.logger = createLogger(this.constructor.name);
|
|
11
|
+
}
|
|
12
|
+
emit(event, data) {
|
|
13
|
+
// Emit to event bus for storage
|
|
14
|
+
eventBus.emitEvent(event, this.constructor.name, data);
|
|
15
|
+
// Also call context callbacks for real-time feedback (debug mode)
|
|
16
|
+
if (this.context.onLog && typeof data === 'object' && data !== null && 'content' in data) {
|
|
17
|
+
this.context.onLog(data.content);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
log(message) {
|
|
21
|
+
this.logger.info(message);
|
|
22
|
+
if (this.context.onLog) {
|
|
23
|
+
this.context.onLog(message);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
startDumpInterval(getDump, intervalMs = 5000) {
|
|
27
|
+
// Send initial dump
|
|
28
|
+
const initialDump = getDump();
|
|
29
|
+
if (initialDump) {
|
|
30
|
+
this.emitDump(initialDump);
|
|
31
|
+
}
|
|
32
|
+
// Start periodic dump
|
|
33
|
+
this.dumpIntervalId = setInterval(() => {
|
|
34
|
+
try {
|
|
35
|
+
const dump = getDump();
|
|
36
|
+
if (dump) {
|
|
37
|
+
this.emitDump(dump);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
catch (error) {
|
|
41
|
+
this.logger.warn(`Dump interval error: ${error.message}`);
|
|
42
|
+
}
|
|
43
|
+
}, intervalMs);
|
|
44
|
+
}
|
|
45
|
+
stopDumpInterval() {
|
|
46
|
+
if (this.dumpIntervalId) {
|
|
47
|
+
clearInterval(this.dumpIntervalId);
|
|
48
|
+
this.dumpIntervalId = null;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
emitDump(dump) {
|
|
52
|
+
if (dump && dump.trim().length > 0) {
|
|
53
|
+
eventBus.emitEvent('executor:dump', this.constructor.name, {
|
|
54
|
+
sessionId: this.context.sessionId,
|
|
55
|
+
dump,
|
|
56
|
+
});
|
|
57
|
+
if (this.context.onDump) {
|
|
58
|
+
this.context.onDump(dump);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
sleep(ms) {
|
|
63
|
+
return new Promise(resolve => setTimeout(resolve, ms));
|
|
64
|
+
}
|
|
65
|
+
// Memory monitoring
|
|
66
|
+
logMemoryUsage(prefix = 'Memory') {
|
|
67
|
+
const usage = process.memoryUsage();
|
|
68
|
+
const formatted = {
|
|
69
|
+
rss: `${(usage.rss / 1024 / 1024).toFixed(2)} MB`,
|
|
70
|
+
heapTotal: `${(usage.heapTotal / 1024 / 1024).toFixed(2)} MB`,
|
|
71
|
+
heapUsed: `${(usage.heapUsed / 1024 / 1024).toFixed(2)} MB`,
|
|
72
|
+
};
|
|
73
|
+
this.logger.debug(`${prefix}: ${JSON.stringify(formatted)}`);
|
|
74
|
+
if (usage.heapUsed > 2 * 1024 * 1024 * 1024) {
|
|
75
|
+
this.logger.warn('Heap memory exceeds 2GB, triggering GC');
|
|
76
|
+
this.tryGC();
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
tryGC() {
|
|
80
|
+
if (global && global.gc) {
|
|
81
|
+
try {
|
|
82
|
+
global.gc();
|
|
83
|
+
this.logger.debug('Manual GC triggered successfully');
|
|
84
|
+
}
|
|
85
|
+
catch (e) {
|
|
86
|
+
this.logger.warn(`GC failed: ${e.message}`);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=base.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base.js","sourceRoot":"","sources":["../../src/executor/base.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { BaseExecutor } from './base.js';
|
|
2
|
+
import type { ExecuteConfig, ExecuteResult } from '../core/types.js';
|
|
3
|
+
export declare class CLIExecutor extends BaseExecutor {
|
|
4
|
+
private browser;
|
|
5
|
+
private page;
|
|
6
|
+
private agent;
|
|
7
|
+
execute(config: ExecuteConfig): Promise<ExecuteResult>;
|
|
8
|
+
private initBrowser;
|
|
9
|
+
private configureViewport;
|
|
10
|
+
destroy(): Promise<void>;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=cli-executor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-executor.d.ts","sourceRoot":"","sources":["../../src/executor/cli-executor.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAErE,qBAAa,WAAY,SAAQ,YAAY;IAC3C,OAAO,CAAC,OAAO,CAAwB;IACvC,OAAO,CAAC,IAAI,CAAqB;IACjC,OAAO,CAAC,KAAK,CAAgC;IAEvC,OAAO,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC;YAuD9C,WAAW;YAsBX,iBAAiB;IAQzB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAS/B"}
|