@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.
Files changed (169) hide show
  1. package/dist/api/callback.d.ts +7 -0
  2. package/dist/api/callback.d.ts.map +1 -0
  3. package/dist/api/callback.js +116 -0
  4. package/dist/api/callback.js.map +1 -0
  5. package/dist/api/device-api.d.ts +13 -0
  6. package/dist/api/device-api.d.ts.map +1 -0
  7. package/dist/api/device-api.js +98 -0
  8. package/dist/api/device-api.js.map +1 -0
  9. package/dist/api/task-api.d.ts +9 -0
  10. package/dist/api/task-api.d.ts.map +1 -0
  11. package/dist/api/task-api.js +47 -0
  12. package/dist/api/task-api.js.map +1 -0
  13. package/dist/config/cli.d.ts +30 -0
  14. package/dist/config/cli.d.ts.map +1 -0
  15. package/dist/config/cli.js +129 -0
  16. package/dist/config/cli.js.map +1 -0
  17. package/dist/config/index.d.ts +6 -0
  18. package/dist/config/index.d.ts.map +1 -0
  19. package/dist/config/index.js +142 -0
  20. package/dist/config/index.js.map +1 -0
  21. package/dist/config/schema.d.ts +66 -0
  22. package/dist/config/schema.d.ts.map +1 -0
  23. package/dist/config/schema.js +2 -0
  24. package/dist/config/schema.js.map +1 -0
  25. package/dist/core/event-bus.d.ts +14 -0
  26. package/dist/core/event-bus.d.ts.map +1 -0
  27. package/dist/core/event-bus.js +33 -0
  28. package/dist/core/event-bus.js.map +1 -0
  29. package/dist/core/logger.d.ts +24 -0
  30. package/dist/core/logger.d.ts.map +1 -0
  31. package/dist/core/logger.js +52 -0
  32. package/dist/core/logger.js.map +1 -0
  33. package/dist/core/types.d.ts +134 -0
  34. package/dist/core/types.d.ts.map +1 -0
  35. package/dist/core/types.js +3 -0
  36. package/dist/core/types.js.map +1 -0
  37. package/dist/debug/dump-manager.d.ts +10 -0
  38. package/dist/debug/dump-manager.d.ts.map +1 -0
  39. package/dist/debug/dump-manager.js +52 -0
  40. package/dist/debug/dump-manager.js.map +1 -0
  41. package/dist/debug/screencast.d.ts +11 -0
  42. package/dist/debug/screencast.d.ts.map +1 -0
  43. package/dist/debug/screencast.js +88 -0
  44. package/dist/debug/screencast.js.map +1 -0
  45. package/dist/debug/session-manager.d.ts +14 -0
  46. package/dist/debug/session-manager.d.ts.map +1 -0
  47. package/dist/debug/session-manager.js +76 -0
  48. package/dist/debug/session-manager.js.map +1 -0
  49. package/dist/debug/types.d.ts +76 -0
  50. package/dist/debug/types.d.ts.map +1 -0
  51. package/dist/debug/types.js +2 -0
  52. package/dist/debug/types.js.map +1 -0
  53. package/dist/debug/web-screencast.d.ts +60 -0
  54. package/dist/debug/web-screencast.d.ts.map +1 -0
  55. package/dist/debug/web-screencast.js +146 -0
  56. package/dist/debug/web-screencast.js.map +1 -0
  57. package/dist/debug/websocket-server.d.ts +27 -0
  58. package/dist/debug/websocket-server.d.ts.map +1 -0
  59. package/dist/debug/websocket-server.js +681 -0
  60. package/dist/debug/websocket-server.js.map +1 -0
  61. package/dist/device/detector.d.ts +10 -0
  62. package/dist/device/detector.d.ts.map +1 -0
  63. package/dist/device/detector.js +100 -0
  64. package/dist/device/detector.js.map +1 -0
  65. package/dist/device/heartbeat.d.ts +26 -0
  66. package/dist/device/heartbeat.d.ts.map +1 -0
  67. package/dist/device/heartbeat.js +225 -0
  68. package/dist/device/heartbeat.js.map +1 -0
  69. package/dist/device/status-manager.d.ts +15 -0
  70. package/dist/device/status-manager.d.ts.map +1 -0
  71. package/dist/device/status-manager.js +58 -0
  72. package/dist/device/status-manager.js.map +1 -0
  73. package/dist/device/types.d.ts +30 -0
  74. package/dist/device/types.d.ts.map +1 -0
  75. package/dist/device/types.js +2 -0
  76. package/dist/device/types.js.map +1 -0
  77. package/dist/executor/action-executor.d.ts +25 -0
  78. package/dist/executor/action-executor.d.ts.map +1 -0
  79. package/dist/executor/action-executor.js +261 -0
  80. package/dist/executor/action-executor.js.map +1 -0
  81. package/dist/executor/android-executor.d.ts +12 -0
  82. package/dist/executor/android-executor.d.ts.map +1 -0
  83. package/dist/executor/android-executor.js +127 -0
  84. package/dist/executor/android-executor.js.map +1 -0
  85. package/dist/executor/base.d.ts +20 -0
  86. package/dist/executor/base.d.ts.map +1 -0
  87. package/dist/executor/base.js +91 -0
  88. package/dist/executor/base.js.map +1 -0
  89. package/dist/executor/cli-executor.d.ts +12 -0
  90. package/dist/executor/cli-executor.d.ts.map +1 -0
  91. package/dist/executor/cli-executor.js +94 -0
  92. package/dist/executor/cli-executor.js.map +1 -0
  93. package/dist/executor/code-executor.d.ts +13 -0
  94. package/dist/executor/code-executor.d.ts.map +1 -0
  95. package/dist/executor/code-executor.js +52 -0
  96. package/dist/executor/code-executor.js.map +1 -0
  97. package/dist/executor/code-instrument.d.ts +12 -0
  98. package/dist/executor/code-instrument.d.ts.map +1 -0
  99. package/dist/executor/code-instrument.js +116 -0
  100. package/dist/executor/code-instrument.js.map +1 -0
  101. package/dist/executor/executor-factory.d.ts +7 -0
  102. package/dist/executor/executor-factory.d.ts.map +1 -0
  103. package/dist/executor/executor-factory.js +24 -0
  104. package/dist/executor/executor-factory.js.map +1 -0
  105. package/dist/executor/ios-executor.d.ts +10 -0
  106. package/dist/executor/ios-executor.d.ts.map +1 -0
  107. package/dist/executor/ios-executor.js +91 -0
  108. package/dist/executor/ios-executor.js.map +1 -0
  109. package/dist/executor/types.d.ts +14 -0
  110. package/dist/executor/types.d.ts.map +1 -0
  111. package/dist/executor/types.js +2 -0
  112. package/dist/executor/types.js.map +1 -0
  113. package/dist/executor/worker-entry.d.ts +2 -0
  114. package/dist/executor/worker-entry.d.ts.map +1 -0
  115. package/dist/executor/worker-entry.js +61 -0
  116. package/dist/executor/worker-entry.js.map +1 -0
  117. package/dist/index.d.ts +22 -0
  118. package/dist/index.d.ts.map +1 -0
  119. package/dist/index.js +157 -0
  120. package/dist/index.js.map +1 -0
  121. package/dist/node/service.d.ts +21 -0
  122. package/dist/node/service.d.ts.map +1 -0
  123. package/dist/node/service.js +178 -0
  124. package/dist/node/service.js.map +1 -0
  125. package/dist/node/types.d.ts +45 -0
  126. package/dist/node/types.d.ts.map +1 -0
  127. package/dist/node/types.js +3 -0
  128. package/dist/node/types.js.map +1 -0
  129. package/dist/storage/database.d.ts +6 -0
  130. package/dist/storage/database.d.ts.map +1 -0
  131. package/dist/storage/database.js +154 -0
  132. package/dist/storage/database.js.map +1 -0
  133. package/dist/storage/repositories/debug-log-repo.d.ts +29 -0
  134. package/dist/storage/repositories/debug-log-repo.d.ts.map +1 -0
  135. package/dist/storage/repositories/debug-log-repo.js +90 -0
  136. package/dist/storage/repositories/debug-log-repo.js.map +1 -0
  137. package/dist/storage/repositories/device-repo.d.ts +12 -0
  138. package/dist/storage/repositories/device-repo.d.ts.map +1 -0
  139. package/dist/storage/repositories/device-repo.js +87 -0
  140. package/dist/storage/repositories/device-repo.js.map +1 -0
  141. package/dist/storage/repositories/execution-log-repo.d.ts +9 -0
  142. package/dist/storage/repositories/execution-log-repo.d.ts.map +1 -0
  143. package/dist/storage/repositories/execution-log-repo.js +49 -0
  144. package/dist/storage/repositories/execution-log-repo.js.map +1 -0
  145. package/dist/storage/repositories/task-repo.d.ts +13 -0
  146. package/dist/storage/repositories/task-repo.d.ts.map +1 -0
  147. package/dist/storage/repositories/task-repo.js +109 -0
  148. package/dist/storage/repositories/task-repo.js.map +1 -0
  149. package/dist/task/poller.d.ts +25 -0
  150. package/dist/task/poller.d.ts.map +1 -0
  151. package/dist/task/poller.js +153 -0
  152. package/dist/task/poller.js.map +1 -0
  153. package/dist/task/queue.d.ts +13 -0
  154. package/dist/task/queue.d.ts.map +1 -0
  155. package/dist/task/queue.js +38 -0
  156. package/dist/task/queue.js.map +1 -0
  157. package/dist/task/scheduler.d.ts +25 -0
  158. package/dist/task/scheduler.d.ts.map +1 -0
  159. package/dist/task/scheduler.js +274 -0
  160. package/dist/task/scheduler.js.map +1 -0
  161. package/dist/task/types.d.ts +31 -0
  162. package/dist/task/types.d.ts.map +1 -0
  163. package/dist/task/types.js +37 -0
  164. package/dist/task/types.js.map +1 -0
  165. package/dist/web/server.d.ts +14 -0
  166. package/dist/web/server.d.ts.map +1 -0
  167. package/dist/web/server.js +478 -0
  168. package/dist/web/server.js.map +1 -0
  169. 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"}