@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,94 @@
1
+ import { chromium } from 'playwright';
2
+ import { PlaywrightAgent } from '@midscene/web/playwright';
3
+ import { BaseExecutor } from './base.js';
4
+ export class CLIExecutor extends BaseExecutor {
5
+ browser = null;
6
+ page = null;
7
+ agent = null;
8
+ async execute(config) {
9
+ try {
10
+ this.log(`Starting CLI execution: ${config.url || config.testUrl}`);
11
+ // Validate
12
+ if (!config.url && !config.testUrl) {
13
+ throw new Error('URL is required for CLI execution');
14
+ }
15
+ // Init browser
16
+ await this.initBrowser(config);
17
+ await this.configureViewport(config);
18
+ // Init agent
19
+ this.agent = new PlaywrightAgent(this.page);
20
+ this.log('Midscene Web Agent initialized');
21
+ // Start dump interval
22
+ this.startDumpInterval(() => {
23
+ try {
24
+ return this.agent?.dumpDataString?.({ inlineScreenshots: true }) || null;
25
+ }
26
+ catch {
27
+ return null;
28
+ }
29
+ });
30
+ // Navigate
31
+ const targetUrl = config.url || config.testUrl;
32
+ await this.page.goto(targetUrl, { waitUntil: 'networkidle' });
33
+ await this.sleep(config.waitTime || 5000);
34
+ this.log(`Navigated to: ${targetUrl}`);
35
+ // Execute test script (placeholder for AI-generated scripts)
36
+ if (config.requirement) {
37
+ this.log(`Executing requirement: ${config.requirement}`);
38
+ await this.agent.aiAction(config.requirement);
39
+ }
40
+ this.stopDumpInterval();
41
+ const reportFile = this.agent?.reportFile;
42
+ const dumpString = this.agent?.dumpDataString?.({ inlineScreenshots: true }) || '';
43
+ const reportHTML = this.agent?.reportHTMLString?.({ inlineScreenshots: true }) || '';
44
+ return { success: true, reportFile, dump: dumpString, reportHTML };
45
+ }
46
+ catch (error) {
47
+ this.stopDumpInterval();
48
+ this.logger.error(`CLI execution failed: ${error.message}`);
49
+ const reportFile = this.agent?.reportFile;
50
+ return { success: false, errorMessage: error.message, reportFile };
51
+ }
52
+ finally {
53
+ await this.destroy();
54
+ }
55
+ }
56
+ async initBrowser(config) {
57
+ const launchArgs = [
58
+ '--no-sandbox', '--disable-setuid-sandbox', '--disable-dev-shm-usage',
59
+ '--disable-gpu', '--no-first-run', '--no-zygote',
60
+ '--disable-extensions', '--disable-default-apps',
61
+ ];
62
+ if (config.cdpEnabled && config.cdpUrl) {
63
+ this.browser = await chromium.connectOverCDP({ endpointURL: config.cdpUrl, timeout: 10000 });
64
+ }
65
+ else {
66
+ this.browser = await chromium.launch({
67
+ headless: config.headless ?? false,
68
+ args: launchArgs,
69
+ timeout: 30000,
70
+ });
71
+ }
72
+ const context = await this.browser.newContext();
73
+ this.page = await context.newPage();
74
+ this.log('Browser launched successfully');
75
+ }
76
+ async configureViewport(config) {
77
+ if (config.mobileMode && this.page) {
78
+ await this.page.setViewportSize({ width: 375, height: 667 });
79
+ }
80
+ else if (config.viewport && this.page) {
81
+ await this.page.setViewportSize(config.viewport);
82
+ }
83
+ }
84
+ async destroy() {
85
+ this.stopDumpInterval();
86
+ if (this.browser) {
87
+ await this.browser.close().catch(e => this.logger.warn(`Browser close error: ${e.message}`));
88
+ }
89
+ this.agent = null;
90
+ this.page = null;
91
+ this.browser = null;
92
+ }
93
+ }
94
+ //# sourceMappingURL=cli-executor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-executor.js","sourceRoot":"","sources":["../../src/executor/cli-executor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import { BaseExecutor } from './base.js';
2
+ import type { ExecuteConfig, ExecuteResult } from '../core/types.js';
3
+ /**
4
+ * CodeExecutor - Executes dynamic code with instrumentation and line tracking
5
+ * Extracted from debug-websocket.ts runCode handler
6
+ */
7
+ export declare class CodeExecutor extends BaseExecutor {
8
+ private agent;
9
+ setAgent(agent: unknown): void;
10
+ execute(config: ExecuteConfig): Promise<ExecuteResult>;
11
+ destroy(): Promise<void>;
12
+ }
13
+ //# sourceMappingURL=code-executor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"code-executor.d.ts","sourceRoot":"","sources":["../../src/executor/code-executor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAEzC,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAErE;;;GAGG;AACH,qBAAa,YAAa,SAAQ,YAAY;IAC5C,OAAO,CAAC,KAAK,CAAiB;IAE9B,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI;IAIxB,OAAO,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC;IA2CtD,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAG/B"}
@@ -0,0 +1,52 @@
1
+ import { BaseExecutor } from './base.js';
2
+ import { instrumentCode } from './code-instrument.js';
3
+ /**
4
+ * CodeExecutor - Executes dynamic code with instrumentation and line tracking
5
+ * Extracted from debug-websocket.ts runCode handler
6
+ */
7
+ export class CodeExecutor extends BaseExecutor {
8
+ agent = null;
9
+ setAgent(agent) {
10
+ this.agent = agent;
11
+ }
12
+ async execute(config) {
13
+ try {
14
+ if (!config.code) {
15
+ throw new Error('Code parameter is required');
16
+ }
17
+ this.log(`Executing dynamic code (${config.code.length} chars)`);
18
+ // Capture line callback reference before entering AsyncFunction scope
19
+ const onExecutionLine = this.context?.onExecutionLine;
20
+ const hasLineCallback = !!onExecutionLine;
21
+ // Instrument code for line tracking using AST-based instrumentation
22
+ const instrumentedCode = instrumentCode(config.code, hasLineCallback);
23
+ // Create execution context
24
+ // Pass __lineCallback as a property to avoid serializing closures
25
+ const self = this;
26
+ const contextObj = {
27
+ agent: this.agent,
28
+ sleep: (ms) => new Promise(resolve => setTimeout(resolve, ms)),
29
+ console: {
30
+ log: (...args) => self.log(args.join(' ')),
31
+ error: (...args) => self.log('ERROR: ' + args.join(' ')),
32
+ warn: (...args) => self.log('WARN: ' + args.join(' ')),
33
+ },
34
+ __lineCallback: onExecutionLine || (() => { }),
35
+ };
36
+ // Execute using AsyncFunction
37
+ const AsyncFunctionCtor = async function () { }.constructor;
38
+ const fn = new AsyncFunctionCtor(instrumentedCode);
39
+ const result = await fn.call(contextObj);
40
+ this.log('Code execution completed');
41
+ return { success: true, result };
42
+ }
43
+ catch (error) {
44
+ this.logger.error(`Code execution failed: ${error.message}`);
45
+ return { success: false, errorMessage: error.message };
46
+ }
47
+ }
48
+ async destroy() {
49
+ this.agent = null;
50
+ }
51
+ }
52
+ //# sourceMappingURL=code-executor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"code-executor.js","sourceRoot":"","sources":["../../src/executor/code-executor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAGtD;;;GAGG;AACH,MAAM,OAAO,YAAa,SAAQ,YAAY;IACpC,KAAK,GAAY,IAAI,CAAC;IAE9B,QAAQ,CAAC,KAAc;QACrB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,MAAqB;QACjC,IAAI,CAAC;YACH,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;gBACjB,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;YAChD,CAAC;YAED,IAAI,CAAC,GAAG,CAAC,2BAA2B,MAAM,CAAC,IAAI,CAAC,MAAM,SAAS,CAAC,CAAC;YAEjE,sEAAsE;YACtE,MAAM,eAAe,GAAG,IAAI,CAAC,OAAO,EAAE,eAAe,CAAC;YACtD,MAAM,eAAe,GAAG,CAAC,CAAC,eAAe,CAAC;YAE1C,oEAAoE;YACpE,MAAM,gBAAgB,GAAG,cAAc,CAAC,MAAM,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC;YAEtE,2BAA2B;YAC3B,kEAAkE;YAClE,MAAM,IAAI,GAAG,IAAI,CAAC;YAClB,MAAM,UAAU,GAAG;gBACjB,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,KAAK,EAAE,CAAC,EAAU,EAAE,EAAE,CAAC,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;gBACtE,OAAO,EAAE;oBACP,GAAG,EAAE,CAAC,GAAG,IAAe,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;oBACrD,KAAK,EAAE,CAAC,GAAG,IAAe,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;oBACnE,IAAI,EAAE,CAAC,GAAG,IAAe,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;iBAClE;gBACD,cAAc,EAAE,eAAe,IAAI,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC;aAC9C,CAAC;YAEF,8BAA8B;YAC9B,MAAM,iBAAiB,GAAQ,KAAK,eAAc,CAAC,CAAC,WAAW,CAAC;YAChE,MAAM,EAAE,GAAG,IAAI,iBAAiB,CAAC,gBAAgB,CAA6C,CAAC;YAC/F,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAEzC,IAAI,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;YAErC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;QACnC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,0BAA2B,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;YACxE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,YAAY,EAAG,KAAe,CAAC,OAAO,EAAE,CAAC;QACpE,CAAC;IACH,CAAC;IAED,KAAK,CAAC,OAAO;QACX,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;IACpB,CAAC;CACF"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * 代码插桩工具 - 使用 AST 解析,在语句级别插入行号追踪
3
+ * 基于 electron-shadcn 参考项目的实现
4
+ */
5
+ /**
6
+ * 给代码添加行号追踪
7
+ * @param code 原始代码
8
+ * @param hasLineCallback 是否有行号回调
9
+ * @returns 插桩后的代码
10
+ */
11
+ export declare function instrumentCode(code: string, hasLineCallback: boolean): string;
12
+ //# sourceMappingURL=code-instrument.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"code-instrument.d.ts","sourceRoot":"","sources":["../../src/executor/code-instrument.ts"],"names":[],"mappings":"AAEA;;;GAGG;AAEH;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,eAAe,EAAE,OAAO,GAAG,MAAM,CAwH7E"}
@@ -0,0 +1,116 @@
1
+ import * as acorn from 'acorn';
2
+ /**
3
+ * 代码插桩工具 - 使用 AST 解析,在语句级别插入行号追踪
4
+ * 基于 electron-shadcn 参考项目的实现
5
+ */
6
+ /**
7
+ * 给代码添加行号追踪
8
+ * @param code 原始代码
9
+ * @param hasLineCallback 是否有行号回调
10
+ * @returns 插桩后的代码
11
+ */
12
+ export function instrumentCode(code, hasLineCallback) {
13
+ if (!hasLineCallback) {
14
+ return code;
15
+ }
16
+ try {
17
+ // 解析代码获取 AST
18
+ const ast = acorn.parse(code, {
19
+ ecmaVersion: 2022,
20
+ sourceType: 'module',
21
+ locations: true,
22
+ allowAwaitOutsideFunction: true,
23
+ allowReturnOutsideFunction: true,
24
+ });
25
+ // 收集所有语句的行号
26
+ const statementLines = new Set();
27
+ function walkBody(body) {
28
+ for (const stmt of body) {
29
+ if (stmt.loc) {
30
+ statementLines.add(stmt.loc.start.line);
31
+ }
32
+ walkNode(stmt);
33
+ }
34
+ }
35
+ function walkNode(node) {
36
+ const n = node;
37
+ if (Array.isArray(n.body)) {
38
+ walkBody(n.body);
39
+ }
40
+ else if (n.body && typeof n.body === 'object' && 'type' in n.body) {
41
+ walkNode(n.body);
42
+ }
43
+ if (Array.isArray(n.consequent)) {
44
+ walkBody(n.consequent);
45
+ }
46
+ else if (n.consequent && typeof n.consequent === 'object' && 'type' in n.consequent) {
47
+ walkNode(n.consequent);
48
+ }
49
+ if (n.alternate) {
50
+ if (Array.isArray(n.alternate)) {
51
+ walkBody(n.alternate);
52
+ }
53
+ else if (typeof n.alternate === 'object' && 'type' in n.alternate) {
54
+ walkNode(n.alternate);
55
+ }
56
+ }
57
+ if (Array.isArray(n.finalBody)) {
58
+ walkBody(n.finalBody);
59
+ }
60
+ else if (n.finalBody && typeof n.finalBody === 'object' && 'type' in n.finalBody) {
61
+ walkNode(n.finalBody);
62
+ }
63
+ if (n.cases) {
64
+ for (const c of n.cases) {
65
+ if (Array.isArray(c.consequent)) {
66
+ walkBody(c.consequent);
67
+ }
68
+ }
69
+ }
70
+ if (n.block && Array.isArray(n.block.body)) {
71
+ walkBody(n.block.body);
72
+ }
73
+ }
74
+ if (ast.body) {
75
+ walkBody(ast.body);
76
+ }
77
+ // 创建行号追踪函数 - 通过 this 访问 __lineCallback
78
+ const trackingCode = `
79
+ const __lineTracker = (line) => {
80
+ try {
81
+ if (typeof this !== 'undefined' && typeof this.__lineCallback === 'function') {
82
+ this.__lineCallback(line);
83
+ }
84
+ } catch (e) {
85
+ // 静默忽略错误,避免干扰代码执行
86
+ }
87
+ };
88
+ `;
89
+ // 在每行代码之前插入追踪调用
90
+ const lines = code.split('\n');
91
+ const instrumentedLines = [...lines];
92
+ // 从后往前插入,避免行号变化影响
93
+ for (let i = lines.length - 1; i >= 0; i--) {
94
+ const lineNum = i + 1;
95
+ if (statementLines.has(lineNum)) {
96
+ const line = instrumentedLines[i];
97
+ // 检查是否已经有追踪代码
98
+ if (!line.includes('__lineTracker')) {
99
+ // 在同一行前插入追踪,使用 .call(this) 确保 this 上下文正确传递
100
+ if (line.trim()) {
101
+ instrumentedLines[i] = `__lineTracker.call(this, ${lineNum}); ` + line;
102
+ }
103
+ }
104
+ }
105
+ }
106
+ // 构建最终的代码
107
+ const finalCode = trackingCode + '\n' + instrumentedLines.join('\n');
108
+ return finalCode;
109
+ }
110
+ catch (error) {
111
+ // 如果 AST 解析失败,返回原始代码(不插桩,保证代码能正常执行)
112
+ console.error('[CodeInstrument] Failed to instrument code, returning original:', error);
113
+ return code;
114
+ }
115
+ }
116
+ //# sourceMappingURL=code-instrument.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"code-instrument.js","sourceRoot":"","sources":["../../src/executor/code-instrument.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { BaseExecutor } from './base.js';
2
+ import type { ExecutorType } from './types.js';
3
+ import type { ExecutorContext } from './types.js';
4
+ export declare class ExecutorFactory {
5
+ static create(type: ExecutorType, context?: ExecutorContext): BaseExecutor;
6
+ }
7
+ //# sourceMappingURL=executor-factory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executor-factory.d.ts","sourceRoot":"","sources":["../../src/executor/executor-factory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAMzC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD,qBAAa,eAAe;IAC1B,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,YAAY;CAgB3E"}
@@ -0,0 +1,24 @@
1
+ import { CLIExecutor } from './cli-executor.js';
2
+ import { AndroidExecutor } from './android-executor.js';
3
+ import { IOSExecutor } from './ios-executor.js';
4
+ import { ActionExecutor } from './action-executor.js';
5
+ import { CodeExecutor } from './code-executor.js';
6
+ export class ExecutorFactory {
7
+ static create(type, context) {
8
+ switch (type) {
9
+ case 'cli':
10
+ return new CLIExecutor(context);
11
+ case 'android':
12
+ return new AndroidExecutor(context);
13
+ case 'ios':
14
+ return new IOSExecutor(context);
15
+ case 'action':
16
+ return new ActionExecutor(context);
17
+ case 'code':
18
+ return new CodeExecutor(context);
19
+ default:
20
+ throw new Error(`Unknown executor type: ${type}`);
21
+ }
22
+ }
23
+ }
24
+ //# sourceMappingURL=executor-factory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executor-factory.js","sourceRoot":"","sources":["../../src/executor/executor-factory.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAIlD,MAAM,OAAO,eAAe;IAC1B,MAAM,CAAC,MAAM,CAAC,IAAkB,EAAE,OAAyB;QACzD,QAAQ,IAAI,EAAE,CAAC;YACb,KAAK,KAAK;gBACR,OAAO,IAAI,WAAW,CAAC,OAAO,CAAC,CAAC;YAClC,KAAK,SAAS;gBACZ,OAAO,IAAI,eAAe,CAAC,OAAO,CAAC,CAAC;YACtC,KAAK,KAAK;gBACR,OAAO,IAAI,WAAW,CAAC,OAAO,CAAC,CAAC;YAClC,KAAK,QAAQ;gBACX,OAAO,IAAI,cAAc,CAAC,OAAO,CAAC,CAAC;YACrC,KAAK,MAAM;gBACT,OAAO,IAAI,YAAY,CAAC,OAAO,CAAC,CAAC;YACnC;gBACE,MAAM,IAAI,KAAK,CAAC,0BAA0B,IAAI,EAAE,CAAC,CAAC;QACtD,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,10 @@
1
+ import { BaseExecutor } from './base.js';
2
+ import type { ExecuteConfig, ExecuteResult } from '../core/types.js';
3
+ export declare class IOSExecutor extends BaseExecutor {
4
+ private device;
5
+ private agent;
6
+ execute(config: ExecuteConfig): Promise<ExecuteResult>;
7
+ private connectDevice;
8
+ destroy(): Promise<void>;
9
+ }
10
+ //# sourceMappingURL=ios-executor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ios-executor.d.ts","sourceRoot":"","sources":["../../src/executor/ios-executor.ts"],"names":[],"mappings":"AACA,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,MAAM,CAA0B;IACxC,OAAO,CAAC,KAAK,CAAyB;IAEhC,OAAO,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC;YA8D9C,aAAa;IAiBrB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAY/B"}
@@ -0,0 +1,91 @@
1
+ import { IOSAgent, IOSDevice } from '@midscene/ios';
2
+ import { BaseExecutor } from './base.js';
3
+ export class IOSExecutor extends BaseExecutor {
4
+ device = null;
5
+ agent = null;
6
+ async execute(config) {
7
+ try {
8
+ this.log(`Starting iOS execution: ${config.bundleId}`);
9
+ // Connect device
10
+ await this.connectDevice(config);
11
+ // Create agent
12
+ const agentConfig = {};
13
+ if (config.aiActionContext)
14
+ agentConfig.aiActionContext = config.aiActionContext;
15
+ if (config.testName)
16
+ agentConfig.groupName = config.testName;
17
+ if (config.modelConfig)
18
+ agentConfig.modelConfig = config.modelConfig;
19
+ if (!this.device)
20
+ throw new Error('Device not connected');
21
+ this.agent = new IOSAgent(this.device, agentConfig);
22
+ this.log('Midscene iOS Agent initialized');
23
+ // Start dump interval
24
+ this.startDumpInterval(() => {
25
+ try {
26
+ return this.agent?.dumpDataString?.({ inlineScreenshots: true }) || null;
27
+ }
28
+ catch {
29
+ return null;
30
+ }
31
+ });
32
+ // Launch app
33
+ try {
34
+ await this.agent.launch(config.bundleId);
35
+ await this.sleep(2000);
36
+ if (config.testUrl) {
37
+ await this.agent.openUrl?.(config.testUrl);
38
+ await this.sleep(10000);
39
+ }
40
+ }
41
+ catch (error) {
42
+ this.logger.warn(`App launch warning: ${error.message}`);
43
+ }
44
+ await this.sleep(config.waitTime || 5000);
45
+ // Execute test script
46
+ if (config.requirement) {
47
+ this.log(`Executing requirement: ${config.requirement}`);
48
+ await this.agent.aiAction(config.requirement);
49
+ }
50
+ this.stopDumpInterval();
51
+ const reportFile = this.agent?.reportFile;
52
+ const dumpString = this.agent?.dumpDataString?.({ inlineScreenshots: true }) || '';
53
+ const reportHTML = this.agent?.reportHTMLString?.({ inlineScreenshots: true }) || '';
54
+ return { success: true, reportFile, dump: dumpString, reportHTML };
55
+ }
56
+ catch (error) {
57
+ this.stopDumpInterval();
58
+ this.logger.error(`iOS execution failed: ${error.message}`);
59
+ const reportFile = this.agent?.reportFile;
60
+ return { success: false, errorMessage: error.message, reportFile };
61
+ }
62
+ }
63
+ async connectDevice(config) {
64
+ const devices = await IOSDevice.getConnectedDevices();
65
+ if (devices.length === 0) {
66
+ throw new Error('No iOS devices connected');
67
+ }
68
+ const targetUdid = config.udid || devices[0].udid;
69
+ const targetDevice = devices.find((d) => d.udid === targetUdid);
70
+ if (!targetDevice) {
71
+ throw new Error(`Device not found: ${targetUdid}`);
72
+ }
73
+ this.device = new IOSDevice(targetUdid);
74
+ await this.device.connect();
75
+ this.log(`Connected to iOS device: ${targetUdid}`);
76
+ }
77
+ async destroy() {
78
+ this.stopDumpInterval();
79
+ if (this.device) {
80
+ try {
81
+ await this.device.disconnect?.();
82
+ }
83
+ catch (e) {
84
+ this.logger.warn(`Device disconnect error: ${e.message}`);
85
+ }
86
+ }
87
+ this.agent = null;
88
+ this.device = null;
89
+ }
90
+ }
91
+ //# sourceMappingURL=ios-executor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ios-executor.js","sourceRoot":"","sources":["../../src/executor/ios-executor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ export interface ExecutorContext {
2
+ sessionId?: string;
3
+ taskId?: string;
4
+ onLog?: (message: string) => void;
5
+ onDump?: (dump: string) => void;
6
+ onExecutionLine?: (line: number) => void;
7
+ onProgress?: (info: {
8
+ method: string;
9
+ index: number;
10
+ total: number;
11
+ }) => void;
12
+ }
13
+ export type ExecutorType = 'cli' | 'android' | 'ios' | 'action' | 'code';
14
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/executor/types.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,eAAe;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,eAAe,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACzC,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;CAC/E;AAED,MAAM,MAAM,YAAY,GAAG,KAAK,GAAG,SAAS,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/executor/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=worker-entry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker-entry.d.ts","sourceRoot":"","sources":["../../src/executor/worker-entry.ts"],"names":[],"mappings":""}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Worker entry point - runs in a forked child process
3
+ * This is the equivalent of the runWorker() function in midscene-unified-executor.js
4
+ */
5
+ import { ExecutorFactory } from './executor-factory.js';
6
+ async function runWorker() {
7
+ const config = JSON.parse(process.env.WORKER_CONFIG || '{}');
8
+ try {
9
+ const executor = ExecutorFactory.create(config.type);
10
+ const result = await executor.execute(config);
11
+ if (process.send) {
12
+ await new Promise((resolve) => {
13
+ process.send?.({
14
+ success: result.success,
15
+ reportFile: result.reportFile,
16
+ logFile: result.logFile,
17
+ errorMessage: result.errorMessage,
18
+ }, (err) => {
19
+ if (err)
20
+ console.error('Message send failed:', err.message);
21
+ resolve();
22
+ });
23
+ });
24
+ await new Promise(r => setTimeout(r, 500));
25
+ }
26
+ process.exit(0);
27
+ }
28
+ catch (error) {
29
+ let errorMessage = 'Unknown error';
30
+ let reportFile;
31
+ if (error && typeof error === 'object') {
32
+ if ('message' in error)
33
+ errorMessage = error.message;
34
+ if ('reportFile' in error)
35
+ reportFile = error.reportFile;
36
+ }
37
+ if (process.send) {
38
+ await new Promise((resolve) => {
39
+ process.send?.({
40
+ success: false,
41
+ errorMessage,
42
+ reportFile,
43
+ }, (err) => {
44
+ if (err)
45
+ console.error('Error message send failed:', err.message);
46
+ resolve();
47
+ });
48
+ });
49
+ await new Promise(r => setTimeout(r, 500));
50
+ }
51
+ process.exit(0);
52
+ }
53
+ }
54
+ // Entry point
55
+ if (process.argv.includes('--worker')) {
56
+ runWorker().catch(err => {
57
+ console.error('Worker fatal error:', err);
58
+ process.exit(1);
59
+ });
60
+ }
61
+ //# sourceMappingURL=worker-entry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker-entry.js","sourceRoot":"","sources":["../../src/executor/worker-entry.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAIxD,KAAK,UAAU,SAAS;IACtB,MAAM,MAAM,GAAkB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,IAAI,CAAC,CAAC;IAE5E,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,eAAe,CAAC,MAAM,CAAC,MAAM,CAAC,IAAoB,CAAC,CAAC;QACrE,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAE9C,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;gBAClC,OAAO,CAAC,IAAI,EAAE,CAAC;oBACb,OAAO,EAAE,MAAM,CAAC,OAAO;oBACvB,UAAU,EAAE,MAAM,CAAC,UAAU;oBAC7B,OAAO,EAAE,MAAM,CAAC,OAAO;oBACvB,YAAY,EAAE,MAAM,CAAC,YAAY;iBAClC,EAAE,CAAC,GAAG,EAAE,EAAE;oBACT,IAAI,GAAG;wBAAE,OAAO,CAAC,KAAK,CAAC,sBAAsB,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;oBAC5D,OAAO,EAAE,CAAC;gBACZ,CAAC,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;YACH,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;QAC7C,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,YAAY,GAAG,eAAe,CAAC;QACnC,IAAI,UAA8B,CAAC;QAEnC,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YACvC,IAAI,SAAS,IAAI,KAAK;gBAAE,YAAY,GAAI,KAAe,CAAC,OAAO,CAAC;YAChE,IAAI,YAAY,IAAI,KAAK;gBAAE,UAAU,GAAI,KAAa,CAAC,UAAU,CAAC;QACpE,CAAC;QAED,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;gBAClC,OAAO,CAAC,IAAI,EAAE,CAAC;oBACb,OAAO,EAAE,KAAK;oBACd,YAAY;oBACZ,UAAU;iBACX,EAAE,CAAC,GAAG,EAAE,EAAE;oBACT,IAAI,GAAG;wBAAE,OAAO,CAAC,KAAK,CAAC,4BAA4B,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;oBAClE,OAAO,EAAE,CAAC;gBACZ,CAAC,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;YACH,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;QAC7C,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,cAAc;AACd,IAAI,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;IACtC,SAAS,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE;QACtB,OAAO,CAAC,KAAK,CAAC,qBAAqB,EAAE,GAAG,CAAC,CAAC;QAC1C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,22 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * @aiscene/aiserver - AI Automation Server
4
+ *
5
+ * Features:
6
+ * 1. Device detection & heartbeat with configurable polling
7
+ * 2. Task polling & scheduling with configurable interval
8
+ * 3. Unified executor (CLI/Android/iOS/Action/Code)
9
+ * 4. Debug WebSocket with real-time feedback
10
+ * 5. Web dashboard for monitoring
11
+ * 6. SQLite storage for all execution data
12
+ */
13
+ declare class AIServer {
14
+ private debugWsServer;
15
+ private shuttingDown;
16
+ constructor();
17
+ start(): Promise<void>;
18
+ private setupEventListeners;
19
+ shutdown(): Promise<void>;
20
+ }
21
+ export { AIServer };
22
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;;;;;;;;GAUG;AAiBH,cAAM,QAAQ;IACZ,OAAO,CAAC,aAAa,CAAuB;IAC5C,OAAO,CAAC,YAAY,CAAkB;;IAMhC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA0C5B,OAAO,CAAC,mBAAmB;IAmGrB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAqBhC;AA0BD,OAAO,EAAE,QAAQ,EAAE,CAAC"}