android-midscene-automation 0.1.43 → 0.2.2

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 (56) hide show
  1. package/{AI_RECOGNITION_GUIDE.md → AI/350/257/206/345/210/253/346/223/215/344/275/234/350/257/264/346/230/216.md} +78 -6
  2. package/CHANGELOG.md +13 -0
  3. package/FAQ.md +8 -8
  4. package/README.md +143 -17
  5. package/USAGE.md +120 -8
  6. package/package.json +3 -2
  7. package/server/analytics.test.ts +46 -0
  8. package/server/analytics.ts +24 -0
  9. package/server/api-safety-analytics.test.ts +57 -0
  10. package/server/appium-auto-save.test.ts +6 -0
  11. package/server/appium-recorder/ai-recognition.test.ts +27 -0
  12. package/server/appium-recorder/ai-recognition.ts +16 -4
  13. package/server/appium-recorder/appium-runner.ts +11 -1
  14. package/server/appium-recorder/appium-version.test.ts +55 -0
  15. package/server/appium-recorder/managed-appium.ts +37 -1
  16. package/server/appium-recorder/repository.ts +6 -2
  17. package/server/appium-recorder/routes.ts +2 -12
  18. package/server/appium-recorder/run-history.ts +11 -0
  19. package/server/config-access.test.ts +27 -0
  20. package/server/config-access.ts +27 -0
  21. package/server/http-api.ts +63 -54
  22. package/server/operations/repository.ts +8 -0
  23. package/server/remote-agents/routes.ts +2 -12
  24. package/server/request-body.test.ts +40 -0
  25. package/server/request-body.ts +48 -0
  26. package/src/App.vue +98 -742
  27. package/src/analytics/summary.ts +75 -0
  28. package/src/api.ts +11 -0
  29. package/src/appium-recorder/AppiumPage.vue +4 -1
  30. package/src/appium-recorder/ai-recognition.ts +7 -0
  31. package/src/appium-recorder/components/AiRecognitionSettings.vue +27 -0
  32. package/src/appium-recorder/flow-labels.ts +1 -1
  33. package/src/appium-recorder/types.ts +2 -1
  34. package/src/components/AppSidebar.vue +31 -0
  35. package/src/components/analytics/AnalysisCharts.vue +189 -0
  36. package/src/components/analytics/ReportAnalysis.vue +78 -0
  37. package/src/components/config/AiPromptPresetsSettings.vue +55 -5
  38. package/src/components/config/AppiumConfigPanel.vue +4 -1
  39. package/src/components/config/AppiumModelSettings.vue +1 -1
  40. package/src/components/config/BaseConfigPanel.vue +6 -2
  41. package/src/components/config/MidsceneConfigPanel.vue +4 -5
  42. package/src/components/help/HelpCenter.vue +185 -0
  43. package/src/components/help/MarkdownDocument.vue +139 -0
  44. package/src/composables/use-device-preview.ts +279 -0
  45. package/src/composables/use-initial-resource.ts +17 -0
  46. package/src/composables/use-script-execution.ts +277 -0
  47. package/src/config/credentials.ts +2 -0
  48. package/src/config/use-appium-auto-save.ts +22 -11
  49. package/src/config/use-model-config.ts +157 -0
  50. package/src/main.ts +2 -2
  51. package/src/pages/AnalysisPage.vue +60 -0
  52. package/src/pages/ConfigPage.vue +36 -5
  53. package/src/style.css +716 -91
  54. package/src/types.ts +7 -1
  55. package//346/265/201/347/250/213/350/212/202/347/202/271/346/223/215/344/275/234/350/257/264/346/230/216.md +408 -0
  56. package/src/ui-refresh.css +0 -677
@@ -1,677 +0,0 @@
1
- :root {
2
- --ui-primary: #fed73b;
3
- --ui-primary-hover: #ffe166;
4
- --ui-primary-active: #e5b900;
5
- --ui-success: #52c41a;
6
- --ui-warning: #faad14;
7
- --ui-danger: #ff4d4f;
8
- --ui-text: #1f2937;
9
- --ui-text-secondary: #6b7280;
10
- --ui-text-muted: #9ca3af;
11
- --ui-border: #ededed;
12
- --ui-border-strong: #dedede;
13
- --ui-bg: #f5f5f5;
14
- --ui-bg-soft: #fafafa;
15
- --ui-surface: #fff;
16
- --ui-radius: 8px;
17
- --ui-radius-control: 6px;
18
- --ui-shadow-popover: 0 8px 24px rgba(15, 23, 42, 0.1);
19
-
20
- --el-color-primary: var(--ui-primary);
21
- --el-color-primary-light-3: #ffe575;
22
- --el-color-primary-light-5: #ffeb9d;
23
- --el-color-primary-light-7: #fff2c4;
24
- --el-color-primary-light-8: #fff6d8;
25
- --el-color-primary-light-9: #fffaeb;
26
- --el-color-primary-dark-2: var(--ui-primary-active);
27
- --el-color-success: var(--ui-success);
28
- --el-color-warning: var(--ui-warning);
29
- --el-color-danger: var(--ui-danger);
30
- --el-text-color-primary: var(--ui-text);
31
- --el-text-color-regular: #4b5563;
32
- --el-text-color-secondary: var(--ui-text-secondary);
33
- --el-text-color-placeholder: var(--ui-text-muted);
34
- --el-border-color: var(--ui-border-strong);
35
- --el-border-color-light: var(--ui-border);
36
- --el-border-color-lighter: #edf0f3;
37
- --el-fill-color-light: #f6f8fb;
38
- --el-fill-color-lighter: #fafbfc;
39
- --el-bg-color-page: var(--ui-bg);
40
- --el-border-radius-base: var(--ui-radius-control);
41
- --el-border-radius-small: 4px;
42
- --el-box-shadow-light: var(--ui-shadow-popover);
43
- color: var(--ui-text);
44
- }
45
-
46
- body {
47
- background: var(--ui-bg);
48
- color: var(--ui-text);
49
- letter-spacing: 0;
50
- }
51
-
52
- ::selection {
53
- background: #fff0a8;
54
- color: #342a00;
55
- }
56
-
57
- .layout {
58
- grid-template-columns: 216px minmax(0, 1fr);
59
- background: var(--ui-bg);
60
- }
61
-
62
- .layout-sidebar {
63
- border-right: 1px solid var(--ui-border);
64
- background: #fff;
65
- }
66
-
67
- .layout-sidebar__top {
68
- height: 64px;
69
- border-bottom-color: var(--ui-border);
70
- }
71
-
72
- .layout-sidebar__logo {
73
- width: 38px;
74
- height: 38px;
75
- border-radius: var(--ui-radius);
76
- background: var(--ui-primary);
77
- box-shadow: none;
78
- color: #1f1f1f;
79
- font-size: 14px;
80
- }
81
-
82
- .layout-menu.el-menu {
83
- --el-menu-bg-color: #fff;
84
- --el-menu-text-color: #4b5563;
85
- --el-menu-hover-bg-color: #fafafa;
86
- --el-menu-active-color: #1f2937;
87
- padding: 10px 8px;
88
- }
89
-
90
- .layout-menu .el-menu-item,
91
- .layout-menu .el-sub-menu__title {
92
- height: 44px;
93
- margin: 2px 0;
94
- border-radius: 6px;
95
- line-height: 44px;
96
- }
97
-
98
- .layout-menu .el-menu-item.is-active {
99
- background: #fff9df;
100
- box-shadow: 3px 0 0 var(--ui-primary) inset;
101
- font-weight: 600;
102
- }
103
-
104
- .layout-menu .el-sub-menu .el-menu-item {
105
- min-width: 0;
106
- padding-left: 48px !important;
107
- }
108
-
109
- .layout-main {
110
- grid-template-rows: 64px minmax(0, 1fr);
111
- }
112
-
113
- .layout-header {
114
- height: 64px;
115
- padding: 0 24px;
116
- border-bottom-color: var(--ui-border);
117
- background: rgba(255, 255, 255, 0.96);
118
- }
119
-
120
- .layout-header__title {
121
- color: var(--ui-text);
122
- font-size: 18px;
123
- font-weight: 650;
124
- }
125
-
126
- .layout-header__actions {
127
- align-items: center;
128
- gap: 8px;
129
- }
130
-
131
- .page-body {
132
- padding: 20px 24px 24px;
133
- scrollbar-gutter: stable;
134
- }
135
-
136
- .page-body:not(.page-body--appium) > .generator-page,
137
- .page-body:not(.page-body--appium) > .config-page,
138
- .page-body:not(.page-body--appium) > .automation-layout {
139
- width: 100%;
140
- margin: 0;
141
- }
142
-
143
- .page-alert,
144
- .page-section {
145
- margin-bottom: 16px;
146
- }
147
-
148
- .el-card {
149
- border-color: var(--ui-border);
150
- border-radius: var(--ui-radius);
151
- background: var(--ui-surface);
152
- }
153
-
154
- .el-card__header {
155
- min-height: 54px;
156
- padding: 15px 18px;
157
- border-bottom-color: var(--ui-border);
158
- color: var(--ui-text);
159
- font-size: 15px;
160
- font-weight: 650;
161
- }
162
-
163
- .el-card__body {
164
- padding: 18px;
165
- }
166
-
167
- .el-button {
168
- font-weight: 500;
169
- letter-spacing: 0;
170
- }
171
-
172
- .el-button:not(.is-circle) {
173
- min-height: 32px;
174
- padding-right: 14px;
175
- padding-left: 14px;
176
- }
177
-
178
- .el-button--primary:not(.is-disabled) {
179
- --el-button-text-color: #1f1f1f;
180
- --el-button-hover-text-color: #1f1f1f;
181
- --el-button-active-text-color: #1f1f1f;
182
- box-shadow: none;
183
- }
184
-
185
- .layout-header .el-button--primary.is-disabled,
186
- .generator-page .el-button--primary.is-disabled,
187
- .appium-header-actions .el-button--primary.is-disabled {
188
- --el-button-disabled-text-color: #9ca3af;
189
- --el-button-disabled-bg-color: #f3f4f6;
190
- --el-button-disabled-border-color: #e5e7eb;
191
- }
192
-
193
- .el-button--danger:not(.is-disabled) {
194
- box-shadow: 0 2px 5px rgba(255, 77, 79, 0.12);
195
- }
196
-
197
- .el-input__wrapper,
198
- .el-select__wrapper,
199
- .el-textarea__inner,
200
- .el-input-number .el-input__wrapper {
201
- border-radius: var(--ui-radius-control);
202
- box-shadow: 0 0 0 1px var(--ui-border-strong) inset;
203
- }
204
-
205
- .el-input__wrapper:hover,
206
- .el-select__wrapper:hover,
207
- .el-textarea__inner:hover {
208
- box-shadow: 0 0 0 1px #e8c32f inset;
209
- }
210
-
211
- .el-form-item__label {
212
- color: #374151;
213
- font-size: 13px;
214
- font-weight: 500;
215
- }
216
-
217
- .el-dialog {
218
- overflow: hidden;
219
- border: 1px solid var(--ui-border);
220
- border-radius: var(--ui-radius);
221
- box-shadow: 0 18px 48px rgba(15, 23, 42, 0.18);
222
- }
223
-
224
- .el-dialog__header {
225
- padding: 18px 20px 14px;
226
- border-bottom: 1px solid var(--ui-border);
227
- }
228
-
229
- .el-dialog__title {
230
- color: var(--ui-text);
231
- font-size: 16px;
232
- font-weight: 650;
233
- }
234
-
235
- .el-dialog__body {
236
- padding: 20px;
237
- }
238
-
239
- .el-dialog__footer {
240
- padding: 12px 20px 18px;
241
- }
242
-
243
- .el-message-box {
244
- border: 1px solid var(--ui-border);
245
- border-radius: var(--ui-radius);
246
- box-shadow: 0 18px 48px rgba(15, 23, 42, 0.18);
247
- }
248
-
249
- .el-tabs__item {
250
- color: var(--ui-text-secondary);
251
- font-weight: 500;
252
- }
253
-
254
- .el-tabs__item.is-active {
255
- color: var(--ui-text);
256
- font-weight: 600;
257
- }
258
-
259
- .el-alert {
260
- border: 1px solid color-mix(in srgb, currentColor 14%, transparent);
261
- border-radius: var(--ui-radius-control);
262
- }
263
-
264
- .el-tag {
265
- border-radius: 4px;
266
- font-weight: 500;
267
- }
268
-
269
- .el-empty__description p {
270
- color: var(--ui-text-muted);
271
- font-size: 13px;
272
- }
273
-
274
- .el-select-dropdown,
275
- .el-dropdown__popper,
276
- .el-picker__popper,
277
- .el-popover.el-popper,
278
- .el-tooltip__popper {
279
- border-radius: var(--ui-radius-control);
280
- box-shadow: var(--ui-shadow-popover);
281
- }
282
-
283
- .subnav {
284
- display: inline-flex;
285
- width: fit-content;
286
- padding: 4px;
287
- border: 1px solid var(--ui-border);
288
- border-radius: var(--ui-radius);
289
- background: #eef1f5;
290
- }
291
-
292
- .subnav__item {
293
- min-height: 32px;
294
- padding: 6px 14px;
295
- border: 0;
296
- border-radius: 5px;
297
- background: transparent;
298
- color: var(--ui-text-secondary);
299
- font-size: 13px;
300
- font-weight: 500;
301
- }
302
-
303
- .subnav__item:hover {
304
- color: var(--ui-text);
305
- }
306
-
307
- .subnav__item--active {
308
- border: 0;
309
- background: var(--ui-surface);
310
- color: #1f2937;
311
- box-shadow:
312
- 0 1px 4px rgba(15, 23, 42, 0.08),
313
- 0 2px 0 var(--ui-primary);
314
- }
315
-
316
- .page-grid,
317
- .config-grid,
318
- .generator-page--ai {
319
- gap: 16px;
320
- }
321
-
322
- .panel-header {
323
- min-width: 0;
324
- }
325
-
326
- .panel-header > span,
327
- .panel-header__title {
328
- color: var(--ui-text);
329
- font-weight: 650;
330
- }
331
-
332
- .panel-header__actions {
333
- align-items: center;
334
- }
335
-
336
- .config-model-grid {
337
- gap: 32px;
338
- }
339
-
340
- .config-model-grid > section {
341
- min-width: 0;
342
- padding: 0;
343
- border: 0;
344
- border-radius: 0;
345
- }
346
-
347
- .config-model-grid > section + section {
348
- padding-left: 32px;
349
- border-left: 1px solid var(--ui-border);
350
- }
351
-
352
- @media (max-width: 640px) {
353
- .config-model-grid > section + section {
354
- padding: 24px 0 0;
355
- border-left: 0;
356
- border-top: 1px solid var(--ui-border);
357
- }
358
- }
359
-
360
- .config-model-grid > section,
361
- .config-page .config-grid > .config-module-card > .el-card__body,
362
- .config-appium-card > .el-card__body {
363
- background: var(--ui-bg-soft);
364
- }
365
-
366
- .model-usage-chart {
367
- border-top-color: var(--ui-border);
368
- }
369
-
370
- .model-usage-chart__svg {
371
- border-color: var(--ui-border);
372
- background: #fbfcfe;
373
- }
374
-
375
- .model-usage-chart__record {
376
- border: 1px solid transparent;
377
- background: var(--ui-bg-soft);
378
- }
379
-
380
- .model-usage-chart__record:not(.model-usage-chart__record--head):hover {
381
- border-color: #f2d768;
382
- background: #fffdf2;
383
- }
384
-
385
- .model-usage-chart__record--head {
386
- background: #eef1f5;
387
- color: #374151;
388
- }
389
-
390
- .app-preset-row,
391
- .script-row,
392
- .step-item {
393
- border-color: var(--ui-border);
394
- border-radius: var(--ui-radius-control);
395
- }
396
-
397
- .app-preset-row:hover,
398
- .script-row:hover {
399
- border-color: #efd467;
400
- background: #fffdf4;
401
- }
402
-
403
- .method-guide {
404
- border-color: #f0dc8a;
405
- background: #fffbed;
406
- }
407
-
408
- .method-guide__summary {
409
- color: #594b12;
410
- }
411
-
412
- .step-item {
413
- background: var(--ui-bg-soft);
414
- }
415
-
416
- .code-block,
417
- .terminal-block,
418
- .generator-code-editor .el-textarea__inner,
419
- .code-dialog__editor .el-textarea__inner {
420
- background: #111827;
421
- }
422
-
423
- .automation-layout,
424
- .automation-stage {
425
- gap: 16px;
426
- }
427
-
428
- .script-row--active {
429
- border-color: #e7c63f;
430
- background: #fff9df;
431
- }
432
-
433
- .execution-output {
434
- border-color: var(--ui-border);
435
- border-radius: var(--ui-radius-control);
436
- background: var(--ui-surface);
437
- }
438
-
439
- .execution-log__output {
440
- border-radius: var(--ui-radius-control);
441
- background: #111827;
442
- }
443
-
444
- .device-preview {
445
- border-radius: var(--ui-radius-control);
446
- background: #0f172a;
447
- }
448
-
449
- .device-preview--empty {
450
- border: 1px dashed var(--ui-border-strong);
451
- background: #fafafa;
452
- }
453
-
454
- .device-action-button {
455
- border-radius: var(--ui-radius-control);
456
- }
457
-
458
- .device-action-button:hover {
459
- background: #fff8d6;
460
- }
461
-
462
- .appium-header-actions {
463
- top: 0;
464
- right: 24px;
465
- height: 64px;
466
- gap: 8px;
467
- }
468
-
469
- .appium-recorder-page {
470
- gap: 16px;
471
- }
472
-
473
- .appium-recorder-layout {
474
- gap: 16px;
475
- }
476
-
477
- .appium-workbench-tabs > .el-tabs__header {
478
- padding: 0 18px;
479
- background: #fbfcfe;
480
- }
481
-
482
- .appium-workbench {
483
- gap: 18px;
484
- padding: 18px;
485
- }
486
-
487
- .appium-workbench__section h3 {
488
- color: var(--ui-text);
489
- font-size: 15px;
490
- font-weight: 650;
491
- }
492
-
493
- .appium-tree .el-tree-node__content {
494
- min-height: 30px;
495
- border-radius: 4px;
496
- }
497
-
498
- .appium-tree .el-tree-node__content:hover {
499
- background: #fffbed;
500
- }
501
-
502
- .appium-tree .el-tree-node.is-current > .el-tree-node__content {
503
- background: #fff6cf;
504
- color: #6b5700;
505
- }
506
-
507
- .appium-current-activity {
508
- border-top-color: var(--ui-border);
509
- background: #fbfcfe;
510
- }
511
-
512
- .appium-current-activity > span {
513
- color: var(--ui-text-secondary);
514
- font-weight: 500;
515
- }
516
-
517
- .appium-side-form {
518
- gap: 10px;
519
- }
520
-
521
- .appium-script-list__item {
522
- border-color: var(--ui-border);
523
- border-radius: var(--ui-radius-control);
524
- background: var(--ui-surface);
525
- }
526
-
527
- .appium-script-list__item:hover {
528
- border-color: #efd467;
529
- background: #fffdf4;
530
- }
531
-
532
- .appium-script-list__item--active {
533
- border-color: #e7c63f;
534
- background: #fff9df;
535
- }
536
-
537
- .appium-replay-fab .el-button {
538
- box-shadow: 0 8px 24px rgba(181, 145, 0, 0.24);
539
- }
540
-
541
- .appium-replay-output--dialog {
542
- border-radius: var(--ui-radius-control);
543
- background: #111827;
544
- }
545
-
546
- .el-button.recorder-panel-tool {
547
- --el-button-text-color: #606266;
548
- --el-button-border-color: #dcdfe6;
549
- --el-button-disabled-text-color: #a8abb2;
550
- --el-button-disabled-border-color: #e4e7ed;
551
- --el-color-primary: #409eff;
552
- --el-color-primary-light-3: #79bbff;
553
- --el-color-primary-light-5: #a0cfff;
554
- --el-color-primary-light-7: #c6e2ff;
555
- --el-color-primary-light-9: #ecf5ff;
556
- --el-color-primary-dark-2: #337ecc;
557
- width: 30px;
558
- min-width: 30px;
559
- height: 32px;
560
- min-height: 32px;
561
- padding: 0;
562
- margin: 0;
563
- border-radius: 3px;
564
- font-size: 12px;
565
- font-weight: 400;
566
- }
567
-
568
- /* Keep the Appium flow editor on its original Element Plus theme. */
569
- .appium-recorded-steps-panel,
570
- .appium-flow-dialog,
571
- .appium-action-dropdown {
572
- --el-color-primary: #409eff;
573
- --el-color-primary-light-3: #79bbff;
574
- --el-color-primary-light-5: #a0cfff;
575
- --el-color-primary-light-7: #c6e2ff;
576
- --el-color-primary-light-8: #d9ecff;
577
- --el-color-primary-light-9: #ecf5ff;
578
- --el-color-primary-dark-2: #337ecc;
579
- --el-color-success: #67c23a;
580
- --el-color-warning: #e6a23c;
581
- --el-color-danger: #f56c6c;
582
- --el-text-color-primary: #303133;
583
- --el-text-color-regular: #606266;
584
- --el-text-color-secondary: #909399;
585
- --el-text-color-placeholder: #a8abb2;
586
- --el-border-color: #dcdfe6;
587
- --el-border-color-light: #e4e7ed;
588
- --el-border-color-lighter: #ebeef5;
589
- --el-fill-color-light: #f5f7fa;
590
- --el-fill-color-lighter: #fafafa;
591
- --el-border-radius-base: 4px;
592
- --el-border-radius-small: 2px;
593
- color: #303133;
594
- }
595
-
596
- .appium-flow-dialog.el-dialog {
597
- display: flex;
598
- flex-direction: column;
599
- height: 86dvh;
600
- max-height: calc(100dvh - 32px);
601
- overflow: visible;
602
- padding: 16px;
603
- border: 0;
604
- border-radius: 4px;
605
- box-shadow: var(--el-box-shadow);
606
- }
607
-
608
- .appium-flow-dialog .el-dialog__header {
609
- flex: none;
610
- padding: 0 0 16px;
611
- border-bottom: 0;
612
- }
613
-
614
- .appium-flow-dialog .el-dialog__title {
615
- font-size: var(--el-dialog-title-font-size);
616
- font-weight: 400;
617
- }
618
-
619
- .appium-flow-dialog .el-dialog__body {
620
- display: flex;
621
- flex-direction: column;
622
- flex: 1;
623
- min-height: 0;
624
- padding: 8px 0 0;
625
- }
626
-
627
- .appium-flow-dialog__toolbar { flex: none; }
628
-
629
- /* Keep the canvas within the centered dialog even on short viewports. */
630
- .appium-flow-dialog .appium-flow-canvas--dialog.appium-flow-canvas--vue {
631
- flex: 1;
632
- height: auto;
633
- min-height: 0;
634
- }
635
-
636
- .appium-flow-dialog .el-dialog__footer {
637
- padding: 16px 0 0;
638
- }
639
-
640
- .appium-recorded-steps-panel .el-button,
641
- .appium-flow-dialog .el-button {
642
- --el-button-disabled-text-color: #a8abb2;
643
- font-weight: 400;
644
- }
645
-
646
- .appium-recorded-steps-panel .el-form-item__label,
647
- .appium-flow-dialog .el-form-item__label {
648
- color: #606266;
649
- font-size: 14px;
650
- font-weight: 400;
651
- }
652
-
653
- .appium-recorded-steps-panel .el-button:not(.is-circle),
654
- .appium-flow-dialog .el-button:not(.is-circle) {
655
- min-height: var(--el-component-size, 32px);
656
- padding-right: 15px;
657
- padding-left: 15px;
658
- }
659
-
660
- .appium-recorded-steps-panel .el-button--primary:not(.is-disabled),
661
- .appium-flow-dialog .el-button--primary:not(.is-disabled) {
662
- --el-button-text-color: #fff;
663
- --el-button-hover-text-color: #fff;
664
- --el-button-active-text-color: #fff;
665
- box-shadow: none;
666
- }
667
-
668
- @media (max-width: 1440px) {
669
- .layout {
670
- grid-template-columns: 200px minmax(0, 1fr);
671
- }
672
-
673
- .page-body {
674
- padding-right: 18px;
675
- padding-left: 18px;
676
- }
677
- }