android-midscene-automation 0.1.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 (78) hide show
  1. package/README.md +160 -0
  2. package/bin/android-midscene-automation.js +27 -0
  3. package/index.html +12 -0
  4. package/package.json +49 -0
  5. package/remote-agent/index.ts +206 -0
  6. package/server/appium-recorder/appium-runner.ts +427 -0
  7. package/server/appium-recorder/repository.ts +228 -0
  8. package/server/appium-recorder/routes.ts +219 -0
  9. package/server/config-store.ts +167 -0
  10. package/server/config.ts +130 -0
  11. package/server/device-locks/repository.ts +147 -0
  12. package/server/device-locks/service.ts +72 -0
  13. package/server/device-locks/types.ts +22 -0
  14. package/server/device-sessions/repository.ts +169 -0
  15. package/server/device-sessions/service.ts +59 -0
  16. package/server/device-sessions/types.ts +24 -0
  17. package/server/http-api.ts +1389 -0
  18. package/server/model-call-usage-importer.ts +108 -0
  19. package/server/model-tester.ts +104 -0
  20. package/server/model-usage-repository.ts +131 -0
  21. package/server/operations/repository.ts +218 -0
  22. package/server/operations/service.ts +84 -0
  23. package/server/operations/types.ts +27 -0
  24. package/server/paths.ts +27 -0
  25. package/server/remote-agents/protocol.ts +38 -0
  26. package/server/remote-agents/registry.ts +136 -0
  27. package/server/remote-agents/routes.ts +89 -0
  28. package/server/script-agent.ts +284 -0
  29. package/server/script-db.ts +281 -0
  30. package/server/script-runner.ts +551 -0
  31. package/server/storage/sqlite.ts +49 -0
  32. package/server/test-case-import/formatter.ts +28 -0
  33. package/server/test-case-import/parsers/excel.ts +69 -0
  34. package/server/test-case-import/parsers/txt.ts +11 -0
  35. package/server/test-case-import/parsers/word.ts +9 -0
  36. package/server/test-case-import/service.ts +58 -0
  37. package/server/test-case-import/text-normalizer.ts +98 -0
  38. package/server/test-case-import/types.ts +24 -0
  39. package/server/test-case-import/validator.ts +34 -0
  40. package/src/App.vue +1450 -0
  41. package/src/api.ts +290 -0
  42. package/src/appium-recorder/AppiumPage.vue +894 -0
  43. package/src/appium-recorder/api.ts +64 -0
  44. package/src/appium-recorder/components/ComponentTree.vue +44 -0
  45. package/src/appium-recorder/components/NodeDetail.vue +152 -0
  46. package/src/appium-recorder/components/RecordedSteps.vue +79 -0
  47. package/src/appium-recorder/tree.ts +129 -0
  48. package/src/appium-recorder/types.ts +88 -0
  49. package/src/assets/device-actions/back.svg +5 -0
  50. package/src/assets/device-actions/home.svg +3 -0
  51. package/src/assets/device-actions/power.svg +5 -0
  52. package/src/assets/device-actions/tasks.svg +3 -0
  53. package/src/assets/device-actions/volume-down.svg +3 -0
  54. package/src/assets/device-actions/volume-up.svg +3 -0
  55. package/src/components/config/ModelUsageChart.vue +188 -0
  56. package/src/components/device/DevicePreviewPanel.vue +266 -0
  57. package/src/components/generator/GeneratedCodePanel.vue +70 -0
  58. package/src/components/generator/TestCaseFileUpload.vue +97 -0
  59. package/src/config/midscene-model-presets.ts +75 -0
  60. package/src/config/prompt-example.ts +6 -0
  61. package/src/main.ts +7 -0
  62. package/src/pages/AiGeneratorPage.vue +90 -0
  63. package/src/pages/AutomationPage.vue +161 -0
  64. package/src/pages/ConfigPage.vue +273 -0
  65. package/src/pages/GeneratorPage.vue +97 -0
  66. package/src/pages/ManualStepsPage.vue +179 -0
  67. package/src/script-generator/codegen.ts +126 -0
  68. package/src/script-generator/index.ts +4 -0
  69. package/src/script-generator/presets.ts +37 -0
  70. package/src/script-generator/step-options.ts +52 -0
  71. package/src/script-generator/types.ts +27 -0
  72. package/src/style.css +1983 -0
  73. package/src/types.ts +157 -0
  74. package/src/vite-env.d.ts +1 -0
  75. package/tsconfig.app.json +8 -0
  76. package/tsconfig.json +11 -0
  77. package/tsconfig.node.json +16 -0
  78. package/vite.config.ts +28 -0
package/src/types.ts ADDED
@@ -0,0 +1,157 @@
1
+ import type { ScriptStep } from './script-generator';
2
+ import type { MidsceneModelProvider } from './config/midscene-model-presets';
3
+
4
+ export type MenuKey = 'generator' | 'automation' | 'config' | 'appium';
5
+ export type GeneratorMode = 'ai' | 'manual';
6
+
7
+ export type GeneratorForm = {
8
+ promptTitle: string;
9
+ testName: string;
10
+ appPresetId: string;
11
+ };
12
+
13
+ export type ConfigForm = {
14
+ midscene: {
15
+ model: {
16
+ provider: MidsceneModelProvider;
17
+ baseUrl: string;
18
+ apiKey: string;
19
+ name: string;
20
+ family: string;
21
+ };
22
+ env: Record<string, string>;
23
+ };
24
+ scriptOptimizer: {
25
+ model: {
26
+ baseUrl: string;
27
+ apiKey: string;
28
+ name: string;
29
+ };
30
+ };
31
+ };
32
+
33
+ export type ModelUsageRecord = {
34
+ id: string;
35
+ modelKey: 'midscene' | 'scriptOptimizer';
36
+ provider: string;
37
+ modelName: string;
38
+ family: string;
39
+ success: boolean;
40
+ durationMs: number;
41
+ promptTokens?: number;
42
+ completionTokens?: number;
43
+ totalTokens?: number;
44
+ createdAt: string;
45
+ };
46
+
47
+ export type SavedScript = {
48
+ id: string;
49
+ name: string;
50
+ promptTitle: string;
51
+ sourcePrompt: string;
52
+ code: string;
53
+ filePath: string;
54
+ steps: ScriptStep[];
55
+ createdAt: string;
56
+ updatedAt: string;
57
+ };
58
+
59
+ export type AppPreset = {
60
+ id: string;
61
+ name: string;
62
+ packageName: string;
63
+ createdAt: string;
64
+ updatedAt: string;
65
+ };
66
+
67
+ export type TestCaseImportResult = {
68
+ fileName: string;
69
+ format: 'txt' | 'excel' | 'word';
70
+ caseCount: number;
71
+ prompt: string;
72
+ };
73
+
74
+ export type ExecutionStep = {
75
+ id: string;
76
+ sourceIndex: number;
77
+ title: string;
78
+ method: string;
79
+ prompt: string;
80
+ status: 'pending' | 'running' | 'success' | 'error';
81
+ detail: string;
82
+ startedAt?: number;
83
+ };
84
+
85
+ // 后端执行脚本时按 NDJSON 推送这些事件,前端执行面板逐条消费。
86
+ export type RunScriptStreamEvent =
87
+ | { type: 'operation'; operation: unknown }
88
+ | { type: 'output'; chunk: string }
89
+ | { type: 'step'; status: 'start' | 'success' | 'error'; index: number; id?: string; title?: string; detail?: string }
90
+ | { type: 'done'; success: boolean; output: string; filePath: string }
91
+ | { type: 'error'; message: string };
92
+
93
+ export type AndroidDevice = {
94
+ id: string;
95
+ status: string;
96
+ description: string;
97
+ };
98
+
99
+ export type DeviceSession = {
100
+ id: string;
101
+ deviceId: string;
102
+ status: 'active' | 'expired' | 'closed';
103
+ playgroundUrl: string;
104
+ previewKind: string;
105
+ sessionConnected: boolean;
106
+ setupState: string;
107
+ previewError: string;
108
+ createdAt: string;
109
+ updatedAt: string;
110
+ expiresAt: string;
111
+ idleExpiresAt: string;
112
+ };
113
+
114
+ export type DeviceLock = {
115
+ id: string;
116
+ deviceId: string;
117
+ ownerType: 'script_run' | 'manual_action' | 'preview';
118
+ ownerId: string;
119
+ metadata: Record<string, unknown>;
120
+ acquiredAt: string;
121
+ expiresAt: string;
122
+ releasedAt: string;
123
+ };
124
+
125
+ export type OperationRecord = {
126
+ id: string;
127
+ kind: 'script_run';
128
+ status: 'running' | 'succeeded' | 'failed' | 'cancelled';
129
+ scriptName: string;
130
+ deviceId: string;
131
+ sessionId: string;
132
+ request: Record<string, unknown>;
133
+ result: Record<string, unknown> | null;
134
+ output: string;
135
+ filePath: string;
136
+ errorMessage: string;
137
+ createdAt: string;
138
+ startedAt: string;
139
+ finishedAt: string;
140
+ };
141
+
142
+ export type OperationEvent = {
143
+ seq: number;
144
+ operationId: string;
145
+ timestamp: string;
146
+ eventType: string;
147
+ message: string;
148
+ data: Record<string, unknown>;
149
+ };
150
+
151
+ // 设备预览顶部工具栏的硬件按键动作定义。
152
+ export type DeviceAction = {
153
+ key: string;
154
+ label: string;
155
+ icon: string;
156
+ keyCode: number;
157
+ };
@@ -0,0 +1 @@
1
+ /// <reference types="vite/client" />
@@ -0,0 +1,8 @@
1
+ {
2
+ "extends": "@vue/tsconfig/tsconfig.dom.json",
3
+ "compilerOptions": {
4
+ "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
5
+ "types": ["vite/client"]
6
+ },
7
+ "include": ["src/**/*.ts", "src/**/*.tsx", "src/**/*.vue"]
8
+ }
package/tsconfig.json ADDED
@@ -0,0 +1,11 @@
1
+ {
2
+ "files": [],
3
+ "references": [
4
+ {
5
+ "path": "./tsconfig.app.json"
6
+ },
7
+ {
8
+ "path": "./tsconfig.node.json"
9
+ }
10
+ ]
11
+ }
@@ -0,0 +1,16 @@
1
+ {
2
+ "compilerOptions": {
3
+ "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo",
4
+ "target": "ES2022",
5
+ "lib": ["ES2023"],
6
+ "module": "ESNext",
7
+ "types": ["node"],
8
+ "skipLibCheck": true,
9
+ "moduleResolution": "Bundler",
10
+ "allowImportingTsExtensions": true,
11
+ "resolveJsonModule": true,
12
+ "moduleDetection": "force",
13
+ "noEmit": true
14
+ },
15
+ "include": ["vite.config.ts", "playwright.config.ts", "scripts/**/*.ts", "server/**/*.ts", "remote-agent/**/*.ts", "e2e/**/*.ts"]
16
+ }
package/vite.config.ts ADDED
@@ -0,0 +1,28 @@
1
+ import { defineConfig } from 'vite';
2
+ import vue from '@vitejs/plugin-vue';
3
+ import type { PreviewServer, ViteDevServer } from 'vite';
4
+ import { createApiMiddleware } from './server/http-api';
5
+
6
+ // The complete HTTP API (30+ /api/* endpoints plus the Android playground
7
+ // proxy) lives in server/http-api.ts as a Connect-style middleware and is
8
+ // shared verbatim with the DSH plugin (plugin/index.ts).
9
+ function apiPlugin() {
10
+ const handler = createApiMiddleware();
11
+ const attach = (server: ViteDevServer | PreviewServer) => {
12
+ server.middlewares.use(handler);
13
+ };
14
+
15
+ return {
16
+ name: 'local-script-agent-api',
17
+ configureServer(server: ViteDevServer) {
18
+ attach(server);
19
+ },
20
+ configurePreviewServer(server: PreviewServer) {
21
+ attach(server);
22
+ },
23
+ };
24
+ }
25
+
26
+ export default defineConfig(() => ({
27
+ plugins: [vue(), apiPlugin()],
28
+ }));