android-midscene-automation 0.2.3 → 1.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 (525) hide show
  1. package/CHANGELOG.md +11 -1
  2. package/README.md +63 -1
  3. package/artemis-main/.dockerignore +15 -0
  4. package/artemis-main/.env.example +34 -0
  5. package/artemis-main/CONTRIBUTING.md +35 -0
  6. package/artemis-main/Dockerfile +68 -0
  7. package/artemis-main/LICENSE +202 -0
  8. package/artemis-main/Makefile +115 -0
  9. package/artemis-main/README.md +322 -0
  10. package/artemis-main/README_CN.md +320 -0
  11. package/artemis-main/apps/__init__.py +15 -0
  12. package/artemis-main/apps/admin_console/__init__.py +19 -0
  13. package/artemis-main/apps/admin_console/core/__init__.py +13 -0
  14. package/artemis-main/apps/admin_console/core/config.py +43 -0
  15. package/artemis-main/apps/admin_console/core/security.py +178 -0
  16. package/artemis-main/apps/admin_console/core/state.py +243 -0
  17. package/artemis-main/apps/admin_console/database/__init__.py +13 -0
  18. package/artemis-main/apps/admin_console/database/connection.py +60 -0
  19. package/artemis-main/apps/admin_console/database/repositories/__init__.py +13 -0
  20. package/artemis-main/apps/admin_console/database/repositories/session_repository.py +564 -0
  21. package/artemis-main/apps/admin_console/database/repositories/step_repository.py +512 -0
  22. package/artemis-main/apps/admin_console/database/repositories/trace_repository.py +133 -0
  23. package/artemis-main/apps/admin_console/index.html +3787 -0
  24. package/artemis-main/apps/admin_console/replay_manager.py +2585 -0
  25. package/artemis-main/apps/admin_console/routers/__init__.py +13 -0
  26. package/artemis-main/apps/admin_console/routers/media.py +198 -0
  27. package/artemis-main/apps/admin_console/routers/replay.py +91 -0
  28. package/artemis-main/apps/admin_console/routers/sessions.py +239 -0
  29. package/artemis-main/apps/admin_console/routers/steps.py +109 -0
  30. package/artemis-main/apps/admin_console/routers/stream.py +56 -0
  31. package/artemis-main/apps/admin_console/routers/system.py +761 -0
  32. package/artemis-main/apps/admin_console/routers/tasks.py +517 -0
  33. package/artemis-main/apps/admin_console/schemas/__init__.py +13 -0
  34. package/artemis-main/apps/admin_console/schemas/task_schema.py +47 -0
  35. package/artemis-main/apps/admin_console/server.py +508 -0
  36. package/artemis-main/apps/admin_console/services/__init__.py +13 -0
  37. package/artemis-main/apps/admin_console/services/device_stream_service.py +137 -0
  38. package/artemis-main/apps/admin_console/services/ipc_service.py +262 -0
  39. package/artemis-main/apps/admin_console/services/media_service.py +623 -0
  40. package/artemis-main/apps/admin_console/services/model_service.py +148 -0
  41. package/artemis-main/apps/admin_console/services/task_preset_catalog.py +514 -0
  42. package/artemis-main/apps/admin_console/services/task_queue_service.py +1719 -0
  43. package/artemis-main/apps/admin_console/services/worker_process_io.py +144 -0
  44. package/artemis-main/apps/showcase_ui/README.md +31 -0
  45. package/artemis-main/apps/showcase_ui/angular.json +132 -0
  46. package/artemis-main/apps/showcase_ui/package-lock.json +9472 -0
  47. package/artemis-main/apps/showcase_ui/package.json +39 -0
  48. package/artemis-main/apps/showcase_ui/proxy.conf.json +23 -0
  49. package/artemis-main/apps/showcase_ui/public/favicon.ico +0 -0
  50. package/artemis-main/apps/showcase_ui/public/logo.png +0 -0
  51. package/artemis-main/apps/showcase_ui/public/logo.svg +56 -0
  52. package/artemis-main/apps/showcase_ui/src/app/app.component.html +24 -0
  53. package/artemis-main/apps/showcase_ui/src/app/app.component.scss +49 -0
  54. package/artemis-main/apps/showcase_ui/src/app/app.component.spec.ts +42 -0
  55. package/artemis-main/apps/showcase_ui/src/app/app.component.ts +32 -0
  56. package/artemis-main/apps/showcase_ui/src/app/app.config.ts +29 -0
  57. package/artemis-main/apps/showcase_ui/src/app/app.routes.ts +27 -0
  58. package/artemis-main/apps/showcase_ui/src/app/components/agent-stream/agent-stream-startup.spec.ts +108 -0
  59. package/artemis-main/apps/showcase_ui/src/app/components/agent-stream/agent-stream.component.html +1436 -0
  60. package/artemis-main/apps/showcase_ui/src/app/components/agent-stream/agent-stream.component.scss +3973 -0
  61. package/artemis-main/apps/showcase_ui/src/app/components/agent-stream/agent-stream.component.ts +2235 -0
  62. package/artemis-main/apps/showcase_ui/src/app/components/chat-interface/chat-interface.component.html +380 -0
  63. package/artemis-main/apps/showcase_ui/src/app/components/chat-interface/chat-interface.component.scss +1171 -0
  64. package/artemis-main/apps/showcase_ui/src/app/components/chat-interface/chat-interface.component.ts +270 -0
  65. package/artemis-main/apps/showcase_ui/src/app/components/floating-video-player/floating-video-player.component.html +433 -0
  66. package/artemis-main/apps/showcase_ui/src/app/components/floating-video-player/floating-video-player.component.scss +987 -0
  67. package/artemis-main/apps/showcase_ui/src/app/components/floating-video-player/floating-video-player.component.ts +632 -0
  68. package/artemis-main/apps/showcase_ui/src/app/components/legacy-agent-stream/legacy-agent-stream.component.html +130 -0
  69. package/artemis-main/apps/showcase_ui/src/app/components/legacy-agent-stream/legacy-agent-stream.component.scss +406 -0
  70. package/artemis-main/apps/showcase_ui/src/app/components/legacy-agent-stream/legacy-agent-stream.component.ts +74 -0
  71. package/artemis-main/apps/showcase_ui/src/app/components/nav-switcher/nav-switcher.component.scss +115 -0
  72. package/artemis-main/apps/showcase_ui/src/app/components/nav-switcher/nav-switcher.component.ts +52 -0
  73. package/artemis-main/apps/showcase_ui/src/app/core/data/smart-tasks.data.ts +334 -0
  74. package/artemis-main/apps/showcase_ui/src/app/core/i18n/language.service.spec.ts +55 -0
  75. package/artemis-main/apps/showcase_ui/src/app/core/i18n/language.service.ts +61 -0
  76. package/artemis-main/apps/showcase_ui/src/app/core/i18n/translate.pipe.ts +11 -0
  77. package/artemis-main/apps/showcase_ui/src/app/core/i18n/zh-cn.ts +651 -0
  78. package/artemis-main/apps/showcase_ui/src/app/core/models/markdown.model.ts +43 -0
  79. package/artemis-main/apps/showcase_ui/src/app/core/models/pro-tuning.model.spec.ts +47 -0
  80. package/artemis-main/apps/showcase_ui/src/app/core/models/pro-tuning.model.ts +165 -0
  81. package/artemis-main/apps/showcase_ui/src/app/core/models/session.model.ts +85 -0
  82. package/artemis-main/apps/showcase_ui/src/app/core/models/stream.model.ts +246 -0
  83. package/artemis-main/apps/showcase_ui/src/app/core/models/system.model.ts +118 -0
  84. package/artemis-main/apps/showcase_ui/src/app/core/services/task-recommendation.service.ts +111 -0
  85. package/artemis-main/apps/showcase_ui/src/app/pages/home/home.component.html +2130 -0
  86. package/artemis-main/apps/showcase_ui/src/app/pages/home/home.component.scss +5204 -0
  87. package/artemis-main/apps/showcase_ui/src/app/pages/home/home.component.ts +1189 -0
  88. package/artemis-main/apps/showcase_ui/src/app/pages/legacy-workspace/legacy-workspace.component.html +39 -0
  89. package/artemis-main/apps/showcase_ui/src/app/pages/legacy-workspace/legacy-workspace.component.scss +151 -0
  90. package/artemis-main/apps/showcase_ui/src/app/pages/legacy-workspace/legacy-workspace.component.ts +58 -0
  91. package/artemis-main/apps/showcase_ui/src/app/pages/workspace/workspace.component.html +201 -0
  92. package/artemis-main/apps/showcase_ui/src/app/pages/workspace/workspace.component.scss +886 -0
  93. package/artemis-main/apps/showcase_ui/src/app/pages/workspace/workspace.component.ts +324 -0
  94. package/artemis-main/apps/showcase_ui/src/app/services/agent.service.spec.ts +418 -0
  95. package/artemis-main/apps/showcase_ui/src/app/services/agent.service.ts +2012 -0
  96. package/artemis-main/apps/showcase_ui/src/app/services/system.service.spec.ts +173 -0
  97. package/artemis-main/apps/showcase_ui/src/app/services/system.service.ts +620 -0
  98. package/artemis-main/apps/showcase_ui/src/app/utils/action-formatter.util.spec.ts +513 -0
  99. package/artemis-main/apps/showcase_ui/src/app/utils/action-formatter.util.ts +1015 -0
  100. package/artemis-main/apps/showcase_ui/src/app/utils/image-overlay.util.spec.ts +85 -0
  101. package/artemis-main/apps/showcase_ui/src/app/utils/image-overlay.util.ts +662 -0
  102. package/artemis-main/apps/showcase_ui/src/app/utils/markdown-parser.util.spec.ts +70 -0
  103. package/artemis-main/apps/showcase_ui/src/app/utils/markdown-parser.util.ts +383 -0
  104. package/artemis-main/apps/showcase_ui/src/app/utils/recording-timeline.util.spec.ts +107 -0
  105. package/artemis-main/apps/showcase_ui/src/app/utils/recording-timeline.util.ts +123 -0
  106. package/artemis-main/apps/showcase_ui/src/app/utils/run-info.util.spec.ts +92 -0
  107. package/artemis-main/apps/showcase_ui/src/app/utils/run-info.util.ts +116 -0
  108. package/artemis-main/apps/showcase_ui/src/app/utils/stream-aggregator.util.spec.ts +640 -0
  109. package/artemis-main/apps/showcase_ui/src/app/utils/stream-aggregator.util.ts +1021 -0
  110. package/artemis-main/apps/showcase_ui/src/app/utils/tool-formatter.util.spec.ts +375 -0
  111. package/artemis-main/apps/showcase_ui/src/app/utils/tool-formatter.util.ts +1419 -0
  112. package/artemis-main/apps/showcase_ui/src/index.html +37 -0
  113. package/artemis-main/apps/showcase_ui/src/main.ts +22 -0
  114. package/artemis-main/apps/showcase_ui/src/styles.scss +60 -0
  115. package/artemis-main/apps/showcase_ui/tsconfig.app.json +23 -0
  116. package/artemis-main/apps/showcase_ui/tsconfig.json +27 -0
  117. package/artemis-main/apps/showcase_ui/tsconfig.spec.json +23 -0
  118. package/artemis-main/artemis/__init__.py +44 -0
  119. package/artemis-main/artemis/__main__.py +18 -0
  120. package/artemis-main/artemis/_legacy_imports.py +94 -0
  121. package/artemis-main/artemis/_version.py +30 -0
  122. package/artemis-main/artemis/agents/__init__.py +17 -0
  123. package/artemis-main/artemis/agents/checker/checker.json +9 -0
  124. package/artemis-main/artemis/agents/checker/checker.py +859 -0
  125. package/artemis-main/artemis/agents/diagnoser/diagnoser.json +23 -0
  126. package/artemis-main/artemis/agents/diagnoser/diagnoser.py +608 -0
  127. package/artemis-main/artemis/agents/explorer/constants.py +52 -0
  128. package/artemis-main/artemis/agents/explorer/explorer.json +57 -0
  129. package/artemis-main/artemis/agents/explorer/explorer.py +473 -0
  130. package/artemis-main/artemis/agents/explorer/geometry.py +73 -0
  131. package/artemis-main/artemis/agents/explorer/native_runner.py +878 -0
  132. package/artemis-main/artemis/agents/explorer/perception_tools.py +632 -0
  133. package/artemis-main/artemis/agents/explorer/run_setup.py +403 -0
  134. package/artemis-main/artemis/agents/explorer/screen_index.py +266 -0
  135. package/artemis-main/artemis/agents/explorer/tiers.py +110 -0
  136. package/artemis-main/artemis/agents/explorer/tool_declarations.py +394 -0
  137. package/artemis-main/artemis/agents/explorer/universal_runner.py +317 -0
  138. package/artemis-main/artemis/agents/flash/context_compressor.py +452 -0
  139. package/artemis-main/artemis/agents/flash/flash_runner.md +51 -0
  140. package/artemis-main/artemis/agents/flash/flash_summarizer.md +53 -0
  141. package/artemis-main/artemis/agents/flash/flash_summarizer_single.md +54 -0
  142. package/artemis-main/artemis/agents/flash/runner.py +1167 -0
  143. package/artemis-main/artemis/agents/flash/summarizer.py +511 -0
  144. package/artemis-main/artemis/agents/history_analyzer/history_analyzer.md +8 -0
  145. package/artemis-main/artemis/agents/history_analyzer/history_analyzer.py +182 -0
  146. package/artemis-main/artemis/agents/image_processor/image_processor.md +74 -0
  147. package/artemis-main/artemis/agents/image_processor/image_processor.py +322 -0
  148. package/artemis-main/artemis/agents/log_analyzer/log_analyzer.md +15 -0
  149. package/artemis-main/artemis/agents/log_analyzer/log_analyzer.py +403 -0
  150. package/artemis-main/artemis/agents/log_analyzer/log_reader_sub_agent.md +8 -0
  151. package/artemis-main/artemis/agents/log_analyzer/output_analyzer.md +11 -0
  152. package/artemis-main/artemis/agents/log_analyzer/output_analyzer.py +163 -0
  153. package/artemis-main/artemis/agents/object_detector/object_detector.json +9 -0
  154. package/artemis-main/artemis/agents/object_detector/object_detector.py +211 -0
  155. package/artemis-main/artemis/agents/operator/operator.json +3 -0
  156. package/artemis-main/artemis/agents/operator/operator.py +1394 -0
  157. package/artemis-main/artemis/agents/operator/prompts.py +1064 -0
  158. package/artemis-main/artemis/agents/outputter/outputter.md +36 -0
  159. package/artemis-main/artemis/agents/outputter/outputter.py +552 -0
  160. package/artemis-main/artemis/agents/planner/planner.json +32 -0
  161. package/artemis-main/artemis/agents/planner/planner.py +436 -0
  162. package/artemis-main/artemis/agents/prompt_assembly.py +79 -0
  163. package/artemis-main/artemis/agents/summarizer/summarizer.py +190 -0
  164. package/artemis-main/artemis/agents/validator/action_execution.py +98 -0
  165. package/artemis-main/artemis/agents/validator/categories.py +33 -0
  166. package/artemis-main/artemis/agents/validator/execution_loop.py +488 -0
  167. package/artemis-main/artemis/agents/validator/incidents.py +120 -0
  168. package/artemis-main/artemis/agents/validator/pixel_safety_net.md +15 -0
  169. package/artemis-main/artemis/agents/validator/precondition_pixel.py +320 -0
  170. package/artemis-main/artemis/agents/validator/precondition_xml.py +672 -0
  171. package/artemis-main/artemis/agents/validator/tool_declarations.py +332 -0
  172. package/artemis-main/artemis/agents/validator/validator.py +188 -0
  173. package/artemis-main/artemis/agents/video_analyzer/__init__.py +15 -0
  174. package/artemis-main/artemis/agents/video_analyzer/audio_native.py +543 -0
  175. package/artemis-main/artemis/agents/video_analyzer/blackboard.py +821 -0
  176. package/artemis-main/artemis/agents/video_analyzer/chunk_agentic.py +455 -0
  177. package/artemis-main/artemis/agents/video_analyzer/chunk_conversation.py +491 -0
  178. package/artemis-main/artemis/agents/video_analyzer/chunk_native.py +437 -0
  179. package/artemis-main/artemis/agents/video_analyzer/conflict_resolution.py +137 -0
  180. package/artemis-main/artemis/agents/video_analyzer/gemini_files.py +162 -0
  181. package/artemis-main/artemis/agents/video_analyzer/native_coordinator.py +541 -0
  182. package/artemis-main/artemis/agents/video_analyzer/reliability.py +128 -0
  183. package/artemis-main/artemis/agents/video_analyzer/universal_engine.py +487 -0
  184. package/artemis-main/artemis/agents/video_analyzer/universal_tools.py +323 -0
  185. package/artemis-main/artemis/agents/video_analyzer/video_analyzer.md +51 -0
  186. package/artemis-main/artemis/agents/video_analyzer/video_analyzer.py +875 -0
  187. package/artemis-main/artemis/agents/video_analyzer/video_sub_agent.md +15 -0
  188. package/artemis-main/artemis/agents/video_analyzer/video_sub_agent_audio.md +12 -0
  189. package/artemis-main/artemis/clients/accessibility_client.py +438 -0
  190. package/artemis-main/artemis/clients/screen_client_factory.py +403 -0
  191. package/artemis-main/artemis/config/__init__.py +309 -0
  192. package/artemis-main/artemis/config/agent.py +1098 -0
  193. package/artemis-main/artemis/config/constants.py +151 -0
  194. package/artemis-main/artemis/config/core/__init__.py +24 -0
  195. package/artemis-main/artemis/config/core/engine.py +118 -0
  196. package/artemis-main/artemis/config/core/interpolator.py +78 -0
  197. package/artemis-main/artemis/config/llm.py +267 -0
  198. package/artemis-main/artemis/config/paths.py +244 -0
  199. package/artemis-main/artemis/config/runtime.py +197 -0
  200. package/artemis-main/artemis/config/settings.py +315 -0
  201. package/artemis-main/artemis/constants.py +47 -0
  202. package/artemis-main/artemis/context.py +289 -0
  203. package/artemis-main/artemis/controllers/__init__.py +41 -0
  204. package/artemis-main/artemis/controllers/controller_factory.py +41 -0
  205. package/artemis-main/artemis/controllers/device_controller.py +29 -0
  206. package/artemis-main/artemis/controllers/types.py +37 -0
  207. package/artemis-main/artemis/controllers/unified_controller.py +649 -0
  208. package/artemis-main/artemis/core/__init__.py +21 -0
  209. package/artemis-main/artemis/core/diagnostics/__init__.py +90 -0
  210. package/artemis-main/artemis/core/diagnostics/adb_keys.py +270 -0
  211. package/artemis-main/artemis/core/diagnostics/adb_server_connection.py +330 -0
  212. package/artemis-main/artemis/core/diagnostics/device_smoke.py +364 -0
  213. package/artemis-main/artemis/core/diagnostics/emulator_manager.py +501 -0
  214. package/artemis-main/artemis/core/diagnostics/engine.py +438 -0
  215. package/artemis-main/artemis/core/diagnostics/hierarchy_parity.py +216 -0
  216. package/artemis-main/artemis/core/diagnostics/probes/adb_probe.py +887 -0
  217. package/artemis-main/artemis/core/diagnostics/probes/base.py +45 -0
  218. package/artemis-main/artemis/core/diagnostics/probes/credentials_probe.py +296 -0
  219. package/artemis-main/artemis/core/diagnostics/probes/host_probe.py +427 -0
  220. package/artemis-main/artemis/core/diagnostics/probes/runtime_probe.py +169 -0
  221. package/artemis-main/artemis/core/diagnostics/probes/toolchain_probe.py +139 -0
  222. package/artemis-main/artemis/core/diagnostics/readiness.py +83 -0
  223. package/artemis-main/artemis/core/diagnostics/schema.py +118 -0
  224. package/artemis-main/artemis/core/tool_declaration.py +43 -0
  225. package/artemis-main/artemis/core/tool_failure.py +56 -0
  226. package/artemis-main/artemis/data_engine/context_vars.py +24 -0
  227. package/artemis-main/artemis/data_engine/engine.py +1615 -0
  228. package/artemis-main/artemis/data_engine/history_reader.py +142 -0
  229. package/artemis-main/artemis/data_engine/models.py +131 -0
  230. package/artemis-main/artemis/data_engine/storage.py +1245 -0
  231. package/artemis-main/artemis/data_engine/trace.py +727 -0
  232. package/artemis-main/artemis/drivers/__init__.py +48 -0
  233. package/artemis-main/artemis/drivers/android/adb_driver.py +507 -0
  234. package/artemis-main/artemis/drivers/android/hierarchy.py +64 -0
  235. package/artemis-main/artemis/drivers/android/input_ime.py +120 -0
  236. package/artemis-main/artemis/drivers/android/recorder.py +57 -0
  237. package/artemis-main/artemis/drivers/base.py +290 -0
  238. package/artemis-main/artemis/drivers/cloud/cloud_driver.py +117 -0
  239. package/artemis-main/artemis/drivers/factory.py +80 -0
  240. package/artemis-main/artemis/drivers/mock/mock_driver.py +198 -0
  241. package/artemis-main/artemis/drivers/types.py +67 -0
  242. package/artemis-main/artemis/graph/checkpoints.py +1243 -0
  243. package/artemis-main/artemis/graph/graph.py +1055 -0
  244. package/artemis-main/artemis/graph/perception.py +234 -0
  245. package/artemis-main/artemis/graph/state.py +151 -0
  246. package/artemis-main/artemis/graph/visibility.py +238 -0
  247. package/artemis-main/artemis/interfaces/cli/__init__.py +19 -0
  248. package/artemis-main/artemis/interfaces/cli/commands/__init__.py +15 -0
  249. package/artemis-main/artemis/interfaces/cli/commands/batch.py +278 -0
  250. package/artemis-main/artemis/interfaces/cli/commands/doctor.py +468 -0
  251. package/artemis-main/artemis/interfaces/cli/commands/helper.py +226 -0
  252. package/artemis-main/artemis/interfaces/cli/commands/init.py +193 -0
  253. package/artemis-main/artemis/interfaces/cli/commands/mcp.py +862 -0
  254. package/artemis-main/artemis/interfaces/cli/commands/run.py +463 -0
  255. package/artemis-main/artemis/interfaces/cli/commands/server.py +151 -0
  256. package/artemis-main/artemis/interfaces/cli/commands/server_lifecycle.py +328 -0
  257. package/artemis-main/artemis/interfaces/cli/commands/trace.py +111 -0
  258. package/artemis-main/artemis/interfaces/cli/commands/ui.py +404 -0
  259. package/artemis-main/artemis/interfaces/cli/main.py +109 -0
  260. package/artemis-main/artemis/interfaces/sdk/__init__.py +31 -0
  261. package/artemis-main/artemis/interfaces/sdk/client.py +19 -0
  262. package/artemis-main/artemis/interfaces/sdk/task.py +72 -0
  263. package/artemis-main/artemis/llm/__init__.py +25 -0
  264. package/artemis-main/artemis/llm/fake_model.py +179 -0
  265. package/artemis-main/artemis/llm/google/__init__.py +57 -0
  266. package/artemis-main/artemis/llm/google/provider.py +185 -0
  267. package/artemis-main/artemis/llm/google/usage.py +148 -0
  268. package/artemis-main/artemis/llm/parser.py +32 -0
  269. package/artemis-main/artemis/llm/reliability.py +267 -0
  270. package/artemis-main/artemis/llm/router.py +389 -0
  271. package/artemis-main/artemis/llm/schemas.py +36 -0
  272. package/artemis-main/artemis/llm/structured.py +196 -0
  273. package/artemis-main/artemis/main.py +58 -0
  274. package/artemis-main/artemis/mcp/__init__.py +20 -0
  275. package/artemis-main/artemis/mcp/action_executor.py +760 -0
  276. package/artemis-main/artemis/mcp/action_manifest.py +320 -0
  277. package/artemis-main/artemis/mcp/action_names.py +172 -0
  278. package/artemis-main/artemis/mcp/action_server.py +202 -0
  279. package/artemis-main/artemis/mcp/action_session.py +245 -0
  280. package/artemis-main/artemis/mcp/action_specs.py +868 -0
  281. package/artemis-main/artemis/mcp/action_types.py +86 -0
  282. package/artemis-main/artemis/mcp/actuators/__init__.py +21 -0
  283. package/artemis-main/artemis/mcp/actuators/adb.py +414 -0
  284. package/artemis-main/artemis/mcp/actuators/base.py +113 -0
  285. package/artemis-main/artemis/mcp/actuators/mock.py +70 -0
  286. package/artemis-main/artemis/mcp/adb_server.py +490 -0
  287. package/artemis-main/artemis/mcp/observation.py +133 -0
  288. package/artemis-main/artemis/mcp/xml_search_server.py +297 -0
  289. package/artemis-main/artemis/memory/__init__.py +90 -0
  290. package/artemis-main/artemis/memory/chunking.py +1843 -0
  291. package/artemis-main/artemis/memory/context_policy.py +226 -0
  292. package/artemis-main/artemis/memory/step_capsule.md +73 -0
  293. package/artemis-main/artemis/memory/step_memory.py +281 -0
  294. package/artemis-main/artemis/memory/transcript.py +798 -0
  295. package/artemis-main/artemis/platform/__init__.py +61 -0
  296. package/artemis-main/artemis/platform/base.py +104 -0
  297. package/artemis-main/artemis/platform/darwin.py +184 -0
  298. package/artemis-main/artemis/platform/linux.py +207 -0
  299. package/artemis-main/artemis/platform/windows.py +193 -0
  300. package/artemis-main/artemis/resources/__init__.py +46 -0
  301. package/artemis-main/artemis/runtime/__init__.py +108 -0
  302. package/artemis-main/artemis/runtime/adb_endpoint.py +173 -0
  303. package/artemis-main/artemis/runtime/awake_lease.py +283 -0
  304. package/artemis-main/artemis/runtime/awake_service.py +343 -0
  305. package/artemis-main/artemis/runtime/cancel_requests.py +254 -0
  306. package/artemis-main/artemis/runtime/daemon_client.py +422 -0
  307. package/artemis-main/artemis/runtime/device_lock.py +1013 -0
  308. package/artemis-main/artemis/runtime/device_pool.py +478 -0
  309. package/artemis-main/artemis/runtime/helper_manager.py +1030 -0
  310. package/artemis-main/artemis/runtime/process_probe.py +98 -0
  311. package/artemis-main/artemis/runtime/server_lifecycle.py +435 -0
  312. package/artemis-main/artemis/runtime/supervisor.py +121 -0
  313. package/artemis-main/artemis/runtime/trace_store.py +375 -0
  314. package/artemis-main/artemis/sdk/__init__.py +26 -0
  315. package/artemis-main/artemis/sdk/agent.py +485 -0
  316. package/artemis-main/artemis/sdk/builders/__init__.py +29 -0
  317. package/artemis-main/artemis/sdk/builders/agent_config_builder.py +474 -0
  318. package/artemis-main/artemis/sdk/constants.py +15 -0
  319. package/artemis-main/artemis/sdk/run_outcome.py +58 -0
  320. package/artemis-main/artemis/sdk/types/__init__.py +61 -0
  321. package/artemis-main/artemis/sdk/types/agent.py +89 -0
  322. package/artemis-main/artemis/sdk/utils.py +28 -0
  323. package/artemis-main/artemis/services/llm.py +1040 -0
  324. package/artemis-main/artemis/services/token_meter.py +267 -0
  325. package/artemis-main/artemis/telemetry/__init__.py +35 -0
  326. package/artemis-main/artemis/telemetry/models.py +64 -0
  327. package/artemis-main/artemis/telemetry/replay.py +34 -0
  328. package/artemis-main/artemis/telemetry/storage/json_storage.py +47 -0
  329. package/artemis-main/artemis/telemetry/tracer.py +85 -0
  330. package/artemis-main/artemis/toolchain/__init__.py +52 -0
  331. package/artemis-main/artemis/toolchain/descriptors.py +92 -0
  332. package/artemis-main/artemis/toolchain/resolver.py +185 -0
  333. package/artemis-main/artemis/tools/base.py +232 -0
  334. package/artemis-main/artemis/tools/command_tool.py +1240 -0
  335. package/artemis-main/artemis/tools/committee_prompts.json +5 -0
  336. package/artemis-main/artemis/tools/committee_tool.py +422 -0
  337. package/artemis-main/artemis/tools/diagnoser_submit_answer_tool.py +87 -0
  338. package/artemis-main/artemis/tools/diagnostic_tool.py +120 -0
  339. package/artemis-main/artemis/tools/explorer_tool.py +581 -0
  340. package/artemis-main/artemis/tools/history/__init__.py +398 -0
  341. package/artemis-main/artemis/tools/history/replay.py +120 -0
  342. package/artemis-main/artemis/tools/history/screenshot.py +139 -0
  343. package/artemis-main/artemis/tools/history/search.py +563 -0
  344. package/artemis-main/artemis/tools/image_processor_tool.py +124 -0
  345. package/artemis-main/artemis/tools/index.py +47 -0
  346. package/artemis-main/artemis/tools/log_tool.py +108 -0
  347. package/artemis-main/artemis/tools/mobile/launch_app.py +132 -0
  348. package/artemis-main/artemis/tools/mobile/log_utils.py +138 -0
  349. package/artemis-main/artemis/tools/mobile/ocr.py +202 -0
  350. package/artemis-main/artemis/tools/mobile/read_hierarchy.py +108 -0
  351. package/artemis-main/artemis/tools/mobile/read_logs.py +116 -0
  352. package/artemis-main/artemis/tools/mobile/search_logs.py +260 -0
  353. package/artemis-main/artemis/tools/object_detection_tool.py +244 -0
  354. package/artemis-main/artemis/tools/scratchpad.py +819 -0
  355. package/artemis-main/artemis/tools/system/adb_shell.py +31 -0
  356. package/artemis-main/artemis/tools/tool_wrapper.py +270 -0
  357. package/artemis-main/artemis/tools/video_tool.py +261 -0
  358. package/artemis-main/artemis/tools/wait_tool.py +97 -0
  359. package/artemis-main/artemis/utils/app_launch_utils.py +207 -0
  360. package/artemis-main/artemis/utils/coordinates.py +606 -0
  361. package/artemis-main/artemis/utils/credentials_validator.py +201 -0
  362. package/artemis-main/artemis/utils/cv_canvas.py +189 -0
  363. package/artemis-main/artemis/utils/cython_compat.py +45 -0
  364. package/artemis-main/artemis/utils/element_hit_test.py +80 -0
  365. package/artemis-main/artemis/utils/image_diff.py +335 -0
  366. package/artemis-main/artemis/utils/image_hash.py +80 -0
  367. package/artemis-main/artemis/utils/notes.py +470 -0
  368. package/artemis-main/artemis/utils/ocr_api.py +105 -0
  369. package/artemis-main/artemis/utils/ocr_xml_fusion.py +318 -0
  370. package/artemis-main/artemis/utils/plan_grammar.py +513 -0
  371. package/artemis-main/artemis/utils/python_executor.py +213 -0
  372. package/artemis-main/artemis/utils/startup_progress.py +60 -0
  373. package/artemis-main/artemis/utils/task_tree.py +1174 -0
  374. package/artemis-main/artemis/utils/text.py +37 -0
  375. package/artemis-main/artemis/utils/ui_filter.py +651 -0
  376. package/artemis-main/artemis/utils/video.py +685 -0
  377. package/artemis-main/artemis/utils/visualization.py +802 -0
  378. package/artemis-main/config/artemis.example.jsonc +12 -0
  379. package/artemis-main/mcp_server/README.md +111 -0
  380. package/artemis-main/mcp_server/__init__.py +21 -0
  381. package/artemis-main/mcp_server/__main__.py +20 -0
  382. package/artemis-main/mcp_server/background/__init__.py +15 -0
  383. package/artemis-main/mcp_server/background/task_runner.py +453 -0
  384. package/artemis-main/mcp_server/base.py +49 -0
  385. package/artemis-main/mcp_server/notifiers/__init__.py +74 -0
  386. package/artemis-main/mcp_server/notifiers/agentapi.py +289 -0
  387. package/artemis-main/mcp_server/notifiers/base.py +45 -0
  388. package/artemis-main/mcp_server/notifiers/composite.py +87 -0
  389. package/artemis-main/mcp_server/notifiers/desktop.py +108 -0
  390. package/artemis-main/mcp_server/notifiers/file.py +69 -0
  391. package/artemis-main/mcp_server/notifiers/script.py +90 -0
  392. package/artemis-main/mcp_server/notifiers/webhook.py +87 -0
  393. package/artemis-main/mcp_server/rules.md +68 -0
  394. package/artemis-main/mcp_server/server.py +106 -0
  395. package/artemis-main/mcp_server/tools/__init__.py +29 -0
  396. package/artemis-main/mcp_server/tools/device_state.py +107 -0
  397. package/artemis-main/mcp_server/tools/diagnose.py +1249 -0
  398. package/artemis-main/mcp_server/tools/inspect_trace.py +394 -0
  399. package/artemis-main/mcp_server/tools/task_manager.py +627 -0
  400. package/artemis-main/mcp_server/tools/task_runner.py +548 -0
  401. package/artemis-main/mcp_server/utils/__init__.py +15 -0
  402. package/artemis-main/mcp_server/utils/device_utils.py +180 -0
  403. package/artemis-main/mcp_server/utils/env_utils.py +65 -0
  404. package/artemis-main/packages/artemis-accessibility-helper/ArtemisAccessibilityHelper.apk +0 -0
  405. package/artemis-main/packages/artemis-accessibility-helper/app/build.gradle.kts +35 -0
  406. package/artemis-main/packages/artemis-accessibility-helper/app/src/main/AndroidManifest.xml +49 -0
  407. package/artemis-main/packages/artemis-accessibility-helper/app/src/main/java/com/artemis/helper/A11yNode.java +274 -0
  408. package/artemis-main/packages/artemis-accessibility-helper/app/src/main/java/com/artemis/helper/ArtemisAccessibilityService.java +227 -0
  409. package/artemis-main/packages/artemis-accessibility-helper/app/src/main/java/com/artemis/helper/CommandServer.java +463 -0
  410. package/artemis-main/packages/artemis-accessibility-helper/app/src/main/java/com/artemis/helper/DisplayUtils.java +111 -0
  411. package/artemis-main/packages/artemis-accessibility-helper/app/src/main/java/com/artemis/helper/GestureController.java +232 -0
  412. package/artemis-main/packages/artemis-accessibility-helper/app/src/main/java/com/artemis/helper/HierarchyDumper.java +832 -0
  413. package/artemis-main/packages/artemis-accessibility-helper/app/src/main/java/com/artemis/helper/TokenReceiver.java +36 -0
  414. package/artemis-main/packages/artemis-accessibility-helper/app/src/main/java/com/artemis/helper/TokenStore.java +38 -0
  415. package/artemis-main/packages/artemis-accessibility-helper/app/src/main/java/com/artemis/helper/XmlUtils.java +102 -0
  416. package/artemis-main/packages/artemis-accessibility-helper/app/src/main/res/values/strings.xml +4 -0
  417. package/artemis-main/packages/artemis-accessibility-helper/app/src/main/res/xml/accessibility_service_config.xml +10 -0
  418. package/artemis-main/packages/artemis-accessibility-helper/build.gradle.kts +3 -0
  419. package/artemis-main/packages/artemis-accessibility-helper/build_apk.sh +215 -0
  420. package/artemis-main/packages/artemis-accessibility-helper/debug.keystore +0 -0
  421. package/artemis-main/packages/artemis-accessibility-helper/gradle.properties +2 -0
  422. package/artemis-main/packages/artemis-accessibility-helper/helper_manifest.json +7 -0
  423. package/artemis-main/packages/artemis-accessibility-helper/settings.gradle.kts +17 -0
  424. package/artemis-main/packages/artemis-client/DESIGN.md +89 -0
  425. package/artemis-main/packages/artemis-client/README.md +112 -0
  426. package/artemis-main/packages/artemis-client/examples/basic.py +30 -0
  427. package/artemis-main/packages/artemis-client/pyproject.toml +36 -0
  428. package/artemis-main/packages/artemis-client/src/artemis_client/__init__.py +45 -0
  429. package/artemis-main/packages/artemis-client/src/artemis_client/client.py +401 -0
  430. package/artemis-main/packages/artemis-client/src/artemis_client/errors.py +66 -0
  431. package/artemis-main/packages/artemis-client/src/artemis_client/models.py +212 -0
  432. package/artemis-main/packages/artemis-client/src/artemis_client/py.typed +1 -0
  433. package/artemis-main/packages/artemis-client/src/artemis_client/transport.py +134 -0
  434. package/artemis-main/packages/artemis-client/tests/test_client.py +289 -0
  435. package/artemis-main/packages/artemis-client/tests/test_transport.py +85 -0
  436. package/artemis-main/pyproject.toml +259 -0
  437. package/artemis-main/pyright-core.json +17 -0
  438. package/artemis-main/scripts/check_dependency_sources.py +68 -0
  439. package/artemis-main/scripts/install_deps.ps1 +520 -0
  440. package/artemis-main/scripts/install_deps.sh +533 -0
  441. package/artemis-main/scripts/quality_ratchet.py +97 -0
  442. package/artemis-main/scripts/real_device_video_acceptance.py +483 -0
  443. package/artemis-main/scripts/run_edge_case_part.py +327 -0
  444. package/artemis-main/scripts/run_ui.py +242 -0
  445. package/artemis-main/scripts/start.ps1 +500 -0
  446. package/artemis-main/scripts/test_all_edge_cases.py +269 -0
  447. package/artemis-main/scripts/verify_concurrency_and_devices.py +385 -0
  448. package/artemis-main/setup.py +164 -0
  449. package/artemis-main/start.bat +35 -0
  450. package/artemis-main/start.sh +423 -0
  451. package/artemis-main/third_party/mobile_use/LICENSE +190 -0
  452. package/artemis-main/third_party/mobile_use/METADATA +27 -0
  453. package/artemis-main/third_party/mobile_use/NOTICE +12 -0
  454. package/artemis-main/third_party/mobile_use/__init__.py +19 -0
  455. package/artemis-main/third_party/mobile_use/agents/__init__.py +13 -0
  456. package/artemis-main/third_party/mobile_use/agents/hopper/__init__.py +13 -0
  457. package/artemis-main/third_party/mobile_use/agents/hopper/hopper.md +22 -0
  458. package/artemis-main/third_party/mobile_use/agents/hopper/hopper.py +80 -0
  459. package/artemis-main/third_party/mobile_use/clients/__init__.py +13 -0
  460. package/artemis-main/third_party/mobile_use/clients/ui_automator_client.py +482 -0
  461. package/artemis-main/third_party/mobile_use/config/__init__.py +13 -0
  462. package/artemis-main/third_party/mobile_use/config/llm.py +183 -0
  463. package/artemis-main/third_party/mobile_use/config/output.py +184 -0
  464. package/artemis-main/third_party/mobile_use/context.py +119 -0
  465. package/artemis-main/third_party/mobile_use/controllers/__init__.py +13 -0
  466. package/artemis-main/third_party/mobile_use/controllers/platform_specific_commands_controller.py +151 -0
  467. package/artemis-main/third_party/mobile_use/controllers/types.py +92 -0
  468. package/artemis-main/third_party/mobile_use/controllers/unified_controller.py +183 -0
  469. package/artemis-main/third_party/mobile_use/graph.py +54 -0
  470. package/artemis-main/third_party/mobile_use/llm_service.py +193 -0
  471. package/artemis-main/third_party/mobile_use/main.py +130 -0
  472. package/artemis-main/third_party/mobile_use/sdk/__init__.py +13 -0
  473. package/artemis-main/third_party/mobile_use/sdk/agent.py +1060 -0
  474. package/artemis-main/third_party/mobile_use/sdk/builders/__init__.py +13 -0
  475. package/artemis-main/third_party/mobile_use/sdk/builders/agent_config_builder.py +225 -0
  476. package/artemis-main/third_party/mobile_use/sdk/builders/index.py +33 -0
  477. package/artemis-main/third_party/mobile_use/sdk/builders/task_request_builder.py +243 -0
  478. package/artemis-main/third_party/mobile_use/sdk/types/__init__.py +13 -0
  479. package/artemis-main/third_party/mobile_use/sdk/types/agent.py +98 -0
  480. package/artemis-main/third_party/mobile_use/sdk/types/exceptions.py +109 -0
  481. package/artemis-main/third_party/mobile_use/sdk/types/task.py +234 -0
  482. package/artemis-main/third_party/mobile_use/testing.py +59 -0
  483. package/artemis-main/third_party/mobile_use/tools/__init__.py +13 -0
  484. package/artemis-main/third_party/mobile_use/tools/index.py +44 -0
  485. package/artemis-main/third_party/mobile_use/tools/mobile/__init__.py +13 -0
  486. package/artemis-main/third_party/mobile_use/tools/mobile/launch_app.py +89 -0
  487. package/artemis-main/third_party/mobile_use/tools/tool_wrapper.py +52 -0
  488. package/artemis-main/third_party/mobile_use/utils/__init__.py +13 -0
  489. package/artemis-main/third_party/mobile_use/utils/app_launch_utils.py +217 -0
  490. package/artemis-main/third_party/mobile_use/utils/cli_helpers.py +60 -0
  491. package/artemis-main/third_party/mobile_use/utils/decorators.py +158 -0
  492. package/artemis-main/third_party/mobile_use/utils/file.py +31 -0
  493. package/artemis-main/third_party/mobile_use/utils/logger.py +216 -0
  494. package/artemis-main/third_party/mobile_use/utils/media.py +213 -0
  495. package/artemis-main/third_party/mobile_use/utils/shell_utils.py +39 -0
  496. package/artemis-main/third_party/mobile_use/utils/video.py +398 -0
  497. package/artemis-main/uv.lock +4908 -0
  498. package/bin/android-midscene-automation.js +1 -5
  499. package/bin/artemis-config.mjs +15 -0
  500. package/bin/artemis-embedded.py +56 -0
  501. package/bin/start-artemis.mjs +30 -0
  502. package/bin/start-dev.mjs +112 -0
  503. package/bin/test_artemis_embedded.py +44 -0
  504. package/package.json +10 -8
  505. package/server/artemis.ts +34 -0
  506. package/server/http-api.ts +13 -1
  507. package/src/App.vue +72 -23
  508. package/src/api.ts +5 -0
  509. package/src/appium-recorder/AppiumPage.vue +1 -1
  510. package/src/appium-recorder/components/ComponentInspector.vue +1 -1
  511. package/src/appium-recorder/components/FlowNodeSearch.vue +3 -3
  512. package/src/appium-recorder/components/ImageCheckDialog.vue +3 -3
  513. package/src/appium-recorder/components/RecorderWorkspace.vue +4 -4
  514. package/src/appium-recorder/flow-appearance.ts +4 -4
  515. package/src/components/AppSidebar.vue +8 -7
  516. package/src/components/MidsceneMaintenanceNotice.vue +17 -0
  517. package/src/components/analytics/AnalysisCharts.vue +4 -4
  518. package/src/components/analytics/ReportAnalysis.vue +1 -1
  519. package/src/components/generator/TestCaseFileUpload.vue +1 -1
  520. package/src/components/help/HelpCenter.vue +56 -37
  521. package/src/pages/AiGeneratorPage.vue +1 -1
  522. package/src/pages/ArtemisPage.vue +72 -0
  523. package/src/pages/ConfigPage.vue +18 -19
  524. package/src/style.css +369 -186
  525. package/src/types.ts +1 -1
package/src/style.css CHANGED
@@ -1,5 +1,5 @@
1
1
  :root {
2
- background: #f5f7fa;
2
+ background: #f8f9fa;
3
3
  font-family:
4
4
  "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", sans-serif;
5
5
  line-height: 1.5;
@@ -68,38 +68,33 @@ select {
68
68
  display: flex;
69
69
  align-items: center;
70
70
  justify-content: center;
71
- gap: 8px;
72
- min-height: 56px;
73
- padding: 4px 0;
74
- color: #303133;
71
+ gap: 10px;
72
+ min-height: 72px;
73
+ padding: 8px 0;
74
+ color: var(--ui-text);
75
75
  font-size: 14px;
76
76
  }
77
77
 
78
78
  .action-dialog__spinner {
79
- font-size: 16px;
79
+ color: var(--ui-primary);
80
+ font-size: 18px;
80
81
  animation: action-dialog-spin 1s linear infinite;
81
82
  }
82
83
 
83
84
  .action-dialog__error {
84
- min-height: 0;
85
- padding: 4px 0 2px;
86
- color: #f56c6c;
85
+ min-height: 72px;
86
+ padding: 14px 16px;
87
+ border: 1px solid #ffd6d6;
88
+ border-radius: var(--ui-radius-control);
89
+ background: #fff5f5;
90
+ color: var(--ui-danger);
87
91
  font-size: 13px;
88
92
  line-height: 1.6;
89
93
  white-space: pre-wrap;
90
94
  }
91
95
 
92
- .action-dialog .el-dialog__header {
93
- margin-right: 0;
94
- padding: 14px 16px 6px;
95
- }
96
-
97
96
  .action-dialog .el-dialog__body {
98
- padding: 8px 16px 6px;
99
- }
100
-
101
- .action-dialog .el-dialog__footer {
102
- padding: 6px 16px 14px;
97
+ padding-bottom: 14px;
103
98
  }
104
99
 
105
100
  .action-dialog__footer-actions {
@@ -110,44 +105,13 @@ select {
110
105
  }
111
106
 
112
107
  .action-dialog__footer-button.el-button {
113
- min-width: 88px;
114
- height: 34px;
115
- padding: 0 16px;
116
- border-radius: 7px;
117
- font-size: 14px;
118
- font-weight: 700;
108
+ min-width: 104px;
119
109
  }
120
110
 
121
111
  .action-dialog__footer-button.el-button + .action-dialog__footer-button.el-button {
122
112
  margin-left: 0;
123
113
  }
124
114
 
125
- .action-dialog__footer-button--secondary.el-button {
126
- border-color: #e5e7eb;
127
- background: #fff;
128
- color: #8b95a5;
129
- }
130
-
131
- .action-dialog__footer-button--secondary.el-button:hover,
132
- .action-dialog__footer-button--secondary.el-button:focus {
133
- border-color: #d7dce5;
134
- background: #f8fafc;
135
- color: #6b7280;
136
- }
137
-
138
- .action-dialog__footer-button--primary.el-button {
139
- border-color: #ffd436;
140
- background: #ffd436;
141
- color: #111827;
142
- }
143
-
144
- .action-dialog__footer-button--primary.el-button:hover,
145
- .action-dialog__footer-button--primary.el-button:focus {
146
- border-color: #ffca1f;
147
- background: #ffca1f;
148
- color: #111827;
149
- }
150
-
151
115
  @keyframes action-dialog-spin {
152
116
  from {
153
117
  transform: rotate(0deg);
@@ -162,7 +126,7 @@ select {
162
126
  display: flex;
163
127
  align-items: center;
164
128
  justify-content: space-between;
165
- border-bottom: 1px solid #e4e7ed;
129
+ border-bottom: 1px solid var(--ui-border);
166
130
  }
167
131
 
168
132
  .layout-header__actions {
@@ -300,7 +264,7 @@ select {
300
264
  height: 100%;
301
265
  min-height: 0;
302
266
  overflow: auto;
303
- scrollbar-color: #c0c4cc transparent;
267
+ scrollbar-color: #cbd5e1 transparent;
304
268
  }
305
269
 
306
270
  .appium-tree .el-tree {
@@ -344,7 +308,7 @@ select {
344
308
 
345
309
  .appium-tree::-webkit-scrollbar-thumb {
346
310
  border-radius: 4px;
347
- background: #c0c4cc;
311
+ background: #cbd5e1;
348
312
  }
349
313
 
350
314
  .appium-tree-panel {
@@ -360,15 +324,15 @@ select {
360
324
  align-items: start;
361
325
  gap: 12px;
362
326
  padding: 12px 0 0;
363
- border-top: 1px solid #e4e7ed;
364
- color: #606266;
327
+ border-top: 1px solid var(--ui-border);
328
+ color: var(--ui-text-secondary);
365
329
  font-size: 13px;
366
330
  }
367
331
 
368
332
  .appium-current-activity code {
369
333
  display: -webkit-box;
370
334
  overflow: hidden;
371
- color: #303133;
335
+ color: var(--ui-text);
372
336
  font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
373
337
  line-height: 1.45;
374
338
  overflow-wrap: anywhere;
@@ -379,7 +343,7 @@ select {
379
343
 
380
344
  .appium-node-detail__title {
381
345
  margin-bottom: 12px;
382
- color: #303133;
346
+ color: var(--ui-text);
383
347
  font-weight: 700;
384
348
  }
385
349
 
@@ -412,7 +376,7 @@ select {
412
376
  gap: 8px;
413
377
  align-items: center;
414
378
  padding: 10px;
415
- border: 1px solid #e4e7ed;
379
+ border: 1px solid var(--ui-border);
416
380
  }
417
381
 
418
382
  .appium-script-list__main {
@@ -430,7 +394,7 @@ select {
430
394
  }
431
395
 
432
396
  .appium-script-list__main strong {
433
- color: #303133;
397
+ color: var(--ui-text);
434
398
  font-size: 13px;
435
399
  }
436
400
 
@@ -490,7 +454,7 @@ select {
490
454
  overflow-x: hidden;
491
455
  overflow-y: auto;
492
456
  padding-right: 4px;
493
- scrollbar-color: #c0c4cc transparent;
457
+ scrollbar-color: #cbd5e1 transparent;
494
458
  }
495
459
 
496
460
  .appium-recorded-steps::-webkit-scrollbar {
@@ -503,7 +467,7 @@ select {
503
467
 
504
468
  .appium-recorded-steps::-webkit-scrollbar-thumb {
505
469
  border-radius: 3px;
506
- background: #c0c4cc;
470
+ background: #cbd5e1;
507
471
  }
508
472
 
509
473
  .appium-step-item {
@@ -518,7 +482,7 @@ select {
518
482
  gap: 8px;
519
483
  align-items: center;
520
484
  padding: 8px;
521
- border: 1px solid #e4e7ed;
485
+ border: 1px solid var(--ui-border);
522
486
  border-radius: 6px;
523
487
  background: #fff;
524
488
  min-height: var(--appium-step-row-height);
@@ -598,8 +562,8 @@ select {
598
562
  }
599
563
 
600
564
  .appium-step-insert-delay:hover {
601
- border-color: #409eff;
602
- color: #409eff;
565
+ border-color: var(--ui-primary);
566
+ color: var(--ui-primary);
603
567
  background: #f5f9ff;
604
568
  }
605
569
 
@@ -631,7 +595,7 @@ select {
631
595
  height: 460px;
632
596
  min-width: 0;
633
597
  overflow: hidden;
634
- border: 1px solid #e4e7ed;
598
+ border: 1px solid var(--ui-border);
635
599
  border-radius: 8px;
636
600
  background:
637
601
  radial-gradient(circle at 1px 1px, #e7edf6 1px, transparent 0) 0 0 / 18px 18px,
@@ -671,7 +635,7 @@ select {
671
635
  height: 72vh;
672
636
  overflow: auto;
673
637
  padding: 12px;
674
- border: 1px solid #e4e7ed;
638
+ border: 1px solid var(--ui-border);
675
639
  border-radius: 8px;
676
640
  background:
677
641
  radial-gradient(circle at 1px 1px, #e7edf6 1px, transparent 0) 0 0 / 18px 18px,
@@ -747,10 +711,10 @@ select {
747
711
  width: 38px;
748
712
  height: 30px;
749
713
  padding: 0 6px;
750
- border: 1px solid #409eff;
714
+ border: 1px solid var(--ui-primary);
751
715
  border-radius: 8px;
752
716
  background: #ecf5ff;
753
- color: #337ecc;
717
+ color: var(--ui-primary-active);
754
718
  font-size: 12px;
755
719
  font-weight: 700;
756
720
  }
@@ -795,7 +759,7 @@ select {
795
759
  border: 1px solid #d8e0ea;
796
760
  border-radius: 8px;
797
761
  background: #fff;
798
- color: #303133;
762
+ color: var(--ui-text);
799
763
  text-align: left;
800
764
  cursor: pointer;
801
765
  }
@@ -835,7 +799,7 @@ select {
835
799
 
836
800
  .appium-flow-node--expanded {
837
801
  box-shadow: 0 0 0 2px rgba(64, 158, 255, 0.12);
838
- border-color: #409eff;
802
+ border-color: var(--ui-primary);
839
803
  }
840
804
 
841
805
  .appium-flow-node--copying {
@@ -843,7 +807,7 @@ select {
843
807
  }
844
808
 
845
809
  .appium-flow-node--selected {
846
- border-color: #337ecc;
810
+ border-color: var(--ui-primary-active);
847
811
  box-shadow: 0 0 0 3px rgba(64, 158, 255, 0.32);
848
812
  background: #d9ecff;
849
813
  }
@@ -872,7 +836,7 @@ select {
872
836
 
873
837
  .appium-flow-node__note {
874
838
  min-width: 0;
875
- color: #303133;
839
+ color: var(--ui-text);
876
840
  font-size: 11px;
877
841
  line-height: 1.4;
878
842
  overflow-wrap: anywhere;
@@ -1004,7 +968,7 @@ select {
1004
968
  border: 1px solid #d8e0ea;
1005
969
  border-radius: 999px;
1006
970
  background: #fff;
1007
- color: #303133;
971
+ color: var(--ui-text);
1008
972
  font-weight: 600;
1009
973
  line-height: 1.4;
1010
974
  overflow-wrap: anywhere;
@@ -1200,8 +1164,8 @@ select {
1200
1164
  }
1201
1165
 
1202
1166
  .appium-flow-insert:hover {
1203
- border-color: #409eff;
1204
- color: #409eff;
1167
+ border-color: var(--ui-primary);
1168
+ color: var(--ui-primary);
1205
1169
  background: #f5f9ff;
1206
1170
  }
1207
1171
 
@@ -1244,10 +1208,10 @@ select {
1244
1208
  box-sizing: border-box;
1245
1209
  width: 100%;
1246
1210
  padding: 8px 10px;
1247
- border: 1px solid #e4e7ed;
1211
+ border: 1px solid var(--ui-border);
1248
1212
  border-radius: 6px;
1249
1213
  background: #f7f8fa;
1250
- color: #606266;
1214
+ color: var(--ui-text-secondary);
1251
1215
  font-family: inherit;
1252
1216
  line-height: 1.5;
1253
1217
  overflow-wrap: anywhere;
@@ -1279,7 +1243,7 @@ select {
1279
1243
  max-height: 260px;
1280
1244
  margin: 0;
1281
1245
  padding: 12px;
1282
- border: 1px solid #e4e7ed;
1246
+ border: 1px solid var(--ui-border);
1283
1247
  border-radius: 6px;
1284
1248
  background: #fff;
1285
1249
  color: #475569;
@@ -1298,7 +1262,7 @@ select {
1298
1262
 
1299
1263
  .appium-replay-dialog.el-dialog {
1300
1264
  display: flex;
1301
- padding: 16px;
1265
+ padding: 0;
1302
1266
  height: min(620px, calc(100vh - 64px));
1303
1267
  min-width: 420px;
1304
1268
  min-height: 280px;
@@ -1318,16 +1282,16 @@ select {
1318
1282
  flex: 1 1 auto;
1319
1283
  min-height: 0;
1320
1284
  overflow: hidden;
1321
- padding: 8px 0 0;
1285
+ padding: 16px 20px 0;
1322
1286
  }
1323
1287
 
1324
1288
  .appium-replay-dialog > .el-dialog__header {
1325
- padding: 0 0 16px;
1326
- border-bottom: 0;
1289
+ padding: 18px 20px 14px;
1290
+ border-bottom: 1px solid var(--ui-border);
1327
1291
  }
1328
1292
 
1329
1293
  .appium-replay-dialog > .el-dialog__footer {
1330
- padding: 16px 0 0;
1294
+ padding: 12px 20px 18px;
1331
1295
  }
1332
1296
 
1333
1297
  .appium-replay-dialog .appium-replay-output {
@@ -1404,7 +1368,7 @@ select {
1404
1368
  min-width: 0;
1405
1369
  margin: 0;
1406
1370
  overflow-wrap: anywhere;
1407
- color: #303133;
1371
+ color: var(--ui-text);
1408
1372
  font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
1409
1373
  }
1410
1374
 
@@ -1429,7 +1393,7 @@ select {
1429
1393
  }
1430
1394
 
1431
1395
  .subnav__item--active {
1432
- border-color: #409eff;
1396
+ border-color: var(--ui-primary);
1433
1397
  }
1434
1398
 
1435
1399
  .page-grid {
@@ -1456,11 +1420,11 @@ select {
1456
1420
 
1457
1421
  .generator-page--ai {
1458
1422
  display: grid;
1459
- grid-template-rows: auto auto minmax(0, 1fr);
1423
+ grid-template-rows: auto auto minmax(260px, 1fr);
1460
1424
  gap: 16px;
1461
- height: 100%;
1462
- min-height: 0;
1463
- overflow: hidden;
1425
+ height: auto;
1426
+ min-height: 100%;
1427
+ overflow: visible;
1464
1428
  }
1465
1429
 
1466
1430
  .generator-page--manual {
@@ -1662,13 +1626,13 @@ select {
1662
1626
  grid-template-columns: 100px minmax(0, 1fr);
1663
1627
  gap: 12px;
1664
1628
  padding-top: 12px;
1665
- color: #606266;
1629
+ color: var(--ui-text-secondary);
1666
1630
  font-size: 13px;
1667
1631
  line-height: 1.6;
1668
1632
  }
1669
1633
 
1670
1634
  .method-guide__row strong {
1671
- color: #303133;
1635
+ color: var(--ui-text);
1672
1636
  }
1673
1637
 
1674
1638
  .method-guide__text {
@@ -1775,7 +1739,7 @@ select {
1775
1739
  }
1776
1740
 
1777
1741
  .step-item__index {
1778
- color: #606266;
1742
+ color: var(--ui-text-secondary);
1779
1743
  font-size: 13px;
1780
1744
  font-weight: 600;
1781
1745
  }
@@ -1919,7 +1883,7 @@ select {
1919
1883
  width: 100%;
1920
1884
  min-height: 48px;
1921
1885
  padding: 12px;
1922
- border: 1px dashed #dcdfe6;
1886
+ border: 1px dashed var(--ui-border-strong);
1923
1887
  border-radius: 6px;
1924
1888
  background: #f8fafc;
1925
1889
  color: #909399;
@@ -2061,7 +2025,7 @@ select {
2061
2025
  }
2062
2026
 
2063
2027
  .script-row__main strong {
2064
- color: #303133;
2028
+ color: var(--ui-text);
2065
2029
  overflow: hidden;
2066
2030
  text-overflow: ellipsis;
2067
2031
  white-space: nowrap;
@@ -2205,7 +2169,9 @@ select {
2205
2169
 
2206
2170
  .device-preview--image {
2207
2171
  border-radius: 8px;
2208
- background: #111827;
2172
+ background: #f8fafc;
2173
+ color: #334155;
2174
+ border: 1px solid var(--ui-border);
2209
2175
  }
2210
2176
 
2211
2177
  .device-preview__interactive {
@@ -2294,7 +2260,7 @@ select {
2294
2260
  display: grid;
2295
2261
  place-items: center;
2296
2262
  height: 100%;
2297
- color: #606266;
2263
+ color: var(--ui-text-secondary);
2298
2264
  text-align: center;
2299
2265
  padding: 24px;
2300
2266
  }
@@ -2307,7 +2273,7 @@ select {
2307
2273
 
2308
2274
  .device-preview__meta {
2309
2275
  margin: 0 0 8px;
2310
- color: #303133;
2276
+ color: var(--ui-text);
2311
2277
  font-weight: 600;
2312
2278
  }
2313
2279
 
@@ -2319,7 +2285,7 @@ select {
2319
2285
  height: 100%;
2320
2286
  min-height: 0;
2321
2287
  padding: 12px;
2322
- border: 1px solid #e4e7ed;
2288
+ border: 1px solid var(--ui-border);
2323
2289
  border-radius: 6px;
2324
2290
  background: #f8fafc;
2325
2291
  }
@@ -2358,7 +2324,7 @@ select {
2358
2324
 
2359
2325
  .run-result__header strong,
2360
2326
  .execution-output__header strong {
2361
- color: #303133;
2327
+ color: var(--ui-text);
2362
2328
  font-size: 13px;
2363
2329
  font-weight: 600;
2364
2330
  }
@@ -2520,7 +2486,7 @@ select {
2520
2486
  max-height: none;
2521
2487
  overflow: auto;
2522
2488
  padding: 12px;
2523
- border: 1px solid #e4e7ed;
2489
+ border: 1px solid var(--ui-border);
2524
2490
  border-radius: 6px;
2525
2491
  background: #f8fafc;
2526
2492
  }
@@ -2688,7 +2654,7 @@ select {
2688
2654
  overflow: hidden;
2689
2655
  border: 1px solid #e6edf5;
2690
2656
  border-radius: 12px;
2691
- background: var(--flow-background, #d4e8dd);
2657
+ background: var(--flow-background, #f8fafc);
2692
2658
  }
2693
2659
 
2694
2660
  .appium-flow-canvas--dialog.appium-flow-canvas--vue {
@@ -2700,8 +2666,8 @@ select {
2700
2666
  width: 100%;
2701
2667
  height: 100%;
2702
2668
  background:
2703
- radial-gradient(circle at 1px 1px, #aecfbd 1px, transparent 0) 0 0 / 22px 22px,
2704
- var(--flow-background, #d4e8dd);
2669
+ radial-gradient(circle at 1px 1px, #cbd5e1 1px, transparent 0) 0 0 / 22px 22px,
2670
+ var(--flow-background, #f8fafc);
2705
2671
  }
2706
2672
 
2707
2673
  .appium-vue-flow .vue-flow__pane {
@@ -2734,7 +2700,7 @@ select {
2734
2700
 
2735
2701
  .appium-vue-flow .vue-flow__edge-path,
2736
2702
  .appium-vue-flow .vue-flow__connection-path {
2737
- stroke: var(--appium-flow-line-color, #719985);
2703
+ stroke: var(--appium-flow-line-color, #94a3b8);
2738
2704
  stroke-width: 2.5;
2739
2705
  stroke-linecap: round;
2740
2706
  stroke-linejoin: round;
@@ -3024,48 +2990,76 @@ select {
3024
2990
  font-size: 12px;
3025
2991
  }
3026
2992
 
2993
+ /* Artemis visual language shared by every host page and Element Plus control. */
3027
2994
  :root {
3028
- --ui-primary: #006be6;
3029
- --ui-primary-hover: #3389eb;
3030
- --ui-primary-active: #0056b8;
3031
- --ui-success: #52c41a;
3032
- --ui-warning: #faad14;
3033
- --ui-danger: #ff4d4f;
3034
- --ui-text: #303133;
3035
- --ui-text-secondary: #6b7280;
3036
- --ui-text-muted: #9ca3af;
3037
- --ui-border: #e4e4e7;
3038
- --ui-border-strong: #dcdfe6;
3039
- --ui-bg: #f2f3f5;
3040
- --ui-bg-soft: #fafafa;
3041
- --ui-surface: #fff;
3042
- --ui-radius: 12px;
3043
- --ui-radius-control: 6px;
3044
- --ui-shadow-popover: 0 8px 24px rgba(15, 23, 42, 0.1);
3045
-
2995
+ --ui-primary: #1a73e8;
2996
+ --ui-primary-hover: #1557b0;
2997
+ --ui-primary-active: #174ea6;
2998
+ --ui-success: #059669;
2999
+ --ui-warning: #d97706;
3000
+ --ui-danger: #dc2626;
3001
+ --ui-text: #0f172a;
3002
+ --ui-text-secondary: #475569;
3003
+ --ui-text-muted: #64748b;
3004
+ --ui-border: #e2e8f0;
3005
+ --ui-border-strong: #cbd5e1;
3006
+ --ui-bg: #f8f9fa;
3007
+ --ui-bg-soft: #f1f5f9;
3008
+ --ui-surface: #ffffff;
3009
+ --ui-radius: 20px;
3010
+ --ui-radius-control: 12px;
3011
+ --ui-radius-pill: 999px;
3012
+ --ui-shadow-card: inset 0 1px 0 rgb(255 255 255 / 95%), 0 2px 4px rgb(15 23 42 / 5%), 0 10px 24px -8px rgb(15 23 42 / 14%);
3013
+ --ui-shadow-control: inset 0 1px 0 rgb(255 255 255 / 90%), 0 2px 3px rgb(15 23 42 / 7%), 0 4px 8px -3px rgb(15 23 42 / 10%);
3014
+ --ui-shadow-inset: inset 0 2px 4px rgb(15 23 42 / 5%), 0 1px 0 rgb(255 255 255 / 90%);
3015
+ --ui-shadow-primary: inset 0 1px 0 rgb(255 255 255 / 25%), 0 2px 3px rgb(26 115 232 / 18%), 0 6px 12px -3px rgb(26 115 232 / 28%);
3016
+ --ui-shadow-popover: inset 0 1px 0 rgb(255 255 255 / 95%), 0 4px 10px rgb(15 23 42 / 8%), 0 18px 40px -8px rgb(15 23 42 / 20%);
3017
+ --ui-font: 'Google Sans Text', 'Google Sans', 'Inter', -apple-system, BlinkMacSystemFont,
3018
+ 'Segoe UI', 'PingFang SC', 'Microsoft YaHei', sans-serif;
3019
+
3020
+ --el-font-family: var(--ui-font);
3046
3021
  --el-color-primary: var(--ui-primary);
3047
- --el-color-primary-light-3: #4d97ee;
3048
- --el-color-primary-light-5: #80b5f3;
3049
- --el-color-primary-light-7: #b3d3f8;
3050
- --el-color-primary-light-8: #cce1fa;
3051
- --el-color-primary-light-9: #e6f0fd;
3022
+ --el-color-primary-light-3: #5f9aee;
3023
+ --el-color-primary-light-5: #8cb9f4;
3024
+ --el-color-primary-light-7: #bfdbfe;
3025
+ --el-color-primary-light-8: #dbeafe;
3026
+ --el-color-primary-light-9: #eff6ff;
3052
3027
  --el-color-primary-dark-2: var(--ui-primary-active);
3053
3028
  --el-color-success: var(--ui-success);
3029
+ --el-color-success-light-3: #50b69b;
3030
+ --el-color-success-light-5: #82ceba;
3031
+ --el-color-success-light-7: #a7f3d0;
3032
+ --el-color-success-light-8: #d1fae5;
3033
+ --el-color-success-light-9: #ecfdf5;
3034
+ --el-color-success-dark-2: #047857;
3054
3035
  --el-color-warning: var(--ui-warning);
3036
+ --el-color-warning-light-3: #e5a050;
3037
+ --el-color-warning-light-5: #f2c082;
3038
+ --el-color-warning-light-7: #fde68a;
3039
+ --el-color-warning-light-8: #fef3c7;
3040
+ --el-color-warning-light-9: #fffbeb;
3041
+ --el-color-warning-dark-2: #b45309;
3055
3042
  --el-color-danger: var(--ui-danger);
3043
+ --el-color-danger-light-3: #e86b6b;
3044
+ --el-color-danger-light-5: #f39b9b;
3045
+ --el-color-danger-light-7: #fecaca;
3046
+ --el-color-danger-light-8: #fee2e2;
3047
+ --el-color-danger-light-9: #fef2f2;
3048
+ --el-color-danger-dark-2: #b91c1c;
3056
3049
  --el-text-color-primary: var(--ui-text);
3057
- --el-text-color-regular: #4b5563;
3050
+ --el-text-color-regular: var(--ui-text-secondary);
3058
3051
  --el-text-color-secondary: var(--ui-text-secondary);
3059
- --el-text-color-placeholder: var(--ui-text-muted);
3052
+ --el-text-color-placeholder: #94a3b8;
3060
3053
  --el-border-color: var(--ui-border-strong);
3061
3054
  --el-border-color-light: var(--ui-border);
3062
- --el-border-color-lighter: #edf0f3;
3063
- --el-fill-color-light: #f6f8fb;
3064
- --el-fill-color-lighter: #fafbfc;
3055
+ --el-border-color-lighter: #f1f5f9;
3056
+ --el-fill-color-light: var(--ui-bg-soft);
3057
+ --el-fill-color-lighter: #f8fafc;
3065
3058
  --el-bg-color-page: var(--ui-bg);
3066
3059
  --el-border-radius-base: var(--ui-radius-control);
3067
- --el-border-radius-small: 4px;
3060
+ --el-border-radius-small: 8px;
3068
3061
  --el-box-shadow-light: var(--ui-shadow-popover);
3062
+ font-family: var(--ui-font);
3069
3063
  color: var(--ui-text);
3070
3064
  }
3071
3065
 
@@ -3076,8 +3070,8 @@ body {
3076
3070
  }
3077
3071
 
3078
3072
  ::selection {
3079
- background: #e1eaff;
3080
- color: #006be6;
3073
+ background: #e8f0fe;
3074
+ color: var(--ui-primary);
3081
3075
  }
3082
3076
 
3083
3077
  .layout {
@@ -3087,7 +3081,7 @@ body {
3087
3081
 
3088
3082
  .layout-sidebar {
3089
3083
  border-right: 1px solid var(--ui-border);
3090
- background: #fff;
3084
+ background: rgb(255 255 255 / 78%);
3091
3085
  }
3092
3086
 
3093
3087
  .layout-sidebar__top {
@@ -3103,8 +3097,8 @@ body {
3103
3097
  flex: none;
3104
3098
  width: 32px;
3105
3099
  height: 32px;
3106
- background: linear-gradient(135deg, #9775fa, #5178f5 55%, #20c4e7);
3107
- box-shadow: none;
3100
+ background: var(--ui-primary);
3101
+ box-shadow: 0 2px 8px rgb(26 115 232 / 18%);
3108
3102
  color: #fff;
3109
3103
  font-size: 20px;
3110
3104
  }
@@ -3112,7 +3106,7 @@ body {
3112
3106
  .layout-menu.el-menu {
3113
3107
  --el-menu-bg-color: #fff;
3114
3108
  --el-menu-text-color: #4b5563;
3115
- --el-menu-hover-bg-color: #f4f4f5;
3109
+ --el-menu-hover-bg-color: #f1f5f9;
3116
3110
  --el-menu-active-color: var(--ui-primary);
3117
3111
  padding: 10px 8px;
3118
3112
  }
@@ -3121,12 +3115,12 @@ body {
3121
3115
  .layout-menu .el-sub-menu__title {
3122
3116
  height: 44px;
3123
3117
  margin: 2px 0;
3124
- border-radius: 8px;
3118
+ border-radius: var(--ui-radius-pill);
3125
3119
  line-height: 44px;
3126
3120
  }
3127
3121
 
3128
3122
  .layout-menu .el-menu-item.is-active {
3129
- background: #e1eaff;
3123
+ background: #e8f0fe;
3130
3124
  box-shadow: none;
3131
3125
  font-weight: 600;
3132
3126
  }
@@ -3202,7 +3196,7 @@ body {
3202
3196
  letter-spacing: 0;
3203
3197
  }
3204
3198
 
3205
- .el-button:not(.is-circle) {
3199
+ .el-button:not(.is-circle):not(.el-button--small) {
3206
3200
  min-height: 32px;
3207
3201
  padding-right: 14px;
3208
3202
  padding-left: 14px;
@@ -3238,7 +3232,7 @@ body {
3238
3232
  .el-input__wrapper:hover,
3239
3233
  .el-select__wrapper:hover,
3240
3234
  .el-textarea__inner:hover {
3241
- box-shadow: 0 0 0 1px #80b5f3 inset;
3235
+ box-shadow: 0 0 0 1px #bfdbfe inset;
3242
3236
  }
3243
3237
 
3244
3238
  .el-form-item__label {
@@ -3318,15 +3312,15 @@ body {
3318
3312
  width: fit-content;
3319
3313
  padding: 4px;
3320
3314
  border: 1px solid var(--ui-border);
3321
- border-radius: var(--ui-radius);
3322
- background: #eef1f5;
3315
+ border-radius: var(--ui-radius-pill);
3316
+ background: var(--ui-bg-soft);
3323
3317
  }
3324
3318
 
3325
3319
  .subnav__item {
3326
3320
  min-height: 32px;
3327
3321
  padding: 6px 14px;
3328
3322
  border: 0;
3329
- border-radius: 5px;
3323
+ border-radius: var(--ui-radius-pill);
3330
3324
  background: transparent;
3331
3325
  color: var(--ui-text-secondary);
3332
3326
  font-size: 13px;
@@ -3339,7 +3333,7 @@ body {
3339
3333
 
3340
3334
  .subnav__item--active {
3341
3335
  border: 0;
3342
- background: #e1eaff;
3336
+ background: #e8f0fe;
3343
3337
  color: var(--ui-primary);
3344
3338
  box-shadow: none;
3345
3339
  }
@@ -3409,8 +3403,8 @@ body {
3409
3403
  }
3410
3404
 
3411
3405
  .model-usage-chart__record:not(.model-usage-chart__record--head):hover {
3412
- border-color: #b3d3f8;
3413
- background: #f0f6ff;
3406
+ border-color: #bfdbfe;
3407
+ background: #eff6ff;
3414
3408
  }
3415
3409
 
3416
3410
  .model-usage-chart__record--head {
@@ -3427,13 +3421,13 @@ body {
3427
3421
 
3428
3422
  .app-preset-row:hover,
3429
3423
  .script-row:hover {
3430
- border-color: #b3d3f8;
3431
- background: #f0f6ff;
3424
+ border-color: #bfdbfe;
3425
+ background: #eff6ff;
3432
3426
  }
3433
3427
 
3434
3428
  .method-guide {
3435
3429
  border-color: #cce1fa;
3436
- background: #f0f6ff;
3430
+ background: #eff6ff;
3437
3431
  }
3438
3432
 
3439
3433
  .method-guide__summary {
@@ -3448,7 +3442,9 @@ body {
3448
3442
  .terminal-block,
3449
3443
  .generator-code-editor .el-textarea__inner,
3450
3444
  .code-dialog__editor .el-textarea__inner {
3451
- background: #111827;
3445
+ background: #f8fafc;
3446
+ color: #334155;
3447
+ border: 1px solid var(--ui-border);
3452
3448
  }
3453
3449
 
3454
3450
  .automation-layout,
@@ -3457,8 +3453,8 @@ body {
3457
3453
  }
3458
3454
 
3459
3455
  .script-row--active {
3460
- border-color: #80b5f3;
3461
- background: #e1eaff;
3456
+ border-color: #bfdbfe;
3457
+ background: #e8f0fe;
3462
3458
  }
3463
3459
 
3464
3460
  .execution-output {
@@ -3469,7 +3465,9 @@ body {
3469
3465
 
3470
3466
  .execution-log__output {
3471
3467
  border-radius: var(--ui-radius-control);
3472
- background: #111827;
3468
+ background: #f8fafc;
3469
+ color: #334155;
3470
+ border: 1px solid var(--ui-border);
3473
3471
  }
3474
3472
 
3475
3473
  .device-preview {
@@ -3503,8 +3501,9 @@ body {
3503
3501
  }
3504
3502
 
3505
3503
  .appium-workbench-tabs > .el-tabs__header {
3506
- padding: 0 18px;
3507
- background: #fbfcfe;
3504
+ flex: none;
3505
+ padding: 16px 16px 8px;
3506
+ background: var(--ui-surface);
3508
3507
  }
3509
3508
 
3510
3509
  .appium-workbench {
@@ -3524,12 +3523,12 @@ body {
3524
3523
  }
3525
3524
 
3526
3525
  .appium-tree .el-tree-node__content:hover {
3527
- background: #f0f6ff;
3526
+ background: #eff6ff;
3528
3527
  }
3529
3528
 
3530
3529
  .appium-tree .el-tree-node.is-current > .el-tree-node__content {
3531
- background: #e1eaff;
3532
- color: #006be6;
3530
+ background: #e8f0fe;
3531
+ color: var(--ui-primary);
3533
3532
  }
3534
3533
 
3535
3534
  .appium-current-activity {
@@ -3553,13 +3552,13 @@ body {
3553
3552
  }
3554
3553
 
3555
3554
  .appium-script-list__item:hover {
3556
- border-color: #b3d3f8;
3557
- background: #f0f6ff;
3555
+ border-color: #bfdbfe;
3556
+ background: #eff6ff;
3558
3557
  }
3559
3558
 
3560
3559
  .appium-script-list__item--active {
3561
- border-color: #80b5f3;
3562
- background: #e1eaff;
3560
+ border-color: #bfdbfe;
3561
+ background: #e8f0fe;
3563
3562
  }
3564
3563
 
3565
3564
  .appium-replay-fab .el-button {
@@ -3568,14 +3567,16 @@ body {
3568
3567
 
3569
3568
  .appium-replay-output--dialog {
3570
3569
  border-radius: var(--ui-radius-control);
3571
- background: #111827;
3570
+ background: #f8fafc;
3571
+ color: #334155;
3572
+ border: 1px solid var(--ui-border);
3572
3573
  }
3573
3574
 
3574
3575
  .el-button.recorder-panel-tool {
3575
- --el-button-text-color: #606266;
3576
- --el-button-border-color: #dcdfe6;
3576
+ --el-button-text-color: var(--ui-text-secondary);
3577
+ --el-button-border-color: var(--ui-border-strong);
3577
3578
  --el-button-disabled-text-color: #a8abb2;
3578
- --el-button-disabled-border-color: #e4e7ed;
3579
+ --el-button-disabled-border-color: var(--ui-border);
3579
3580
  width: 30px;
3580
3581
  min-width: 30px;
3581
3582
  height: 32px;
@@ -3592,22 +3593,22 @@ body {
3592
3593
  flex-direction: column;
3593
3594
  height: 86dvh;
3594
3595
  max-height: calc(100dvh - 32px);
3595
- overflow: visible;
3596
- padding: 16px;
3597
- border: 0;
3598
- border-radius: 4px;
3599
- box-shadow: var(--el-box-shadow);
3596
+ overflow: hidden;
3597
+ padding: 0;
3598
+ border: 1px solid var(--ui-border);
3599
+ border-radius: var(--ui-radius);
3600
+ box-shadow: 0 18px 48px rgba(15, 23, 42, 0.18);
3600
3601
  }
3601
3602
 
3602
3603
  .appium-flow-dialog .el-dialog__header {
3603
3604
  flex: none;
3604
- padding: 0 0 16px;
3605
- border-bottom: 0;
3605
+ padding: 18px 20px 14px;
3606
+ border-bottom: 1px solid var(--ui-border);
3606
3607
  }
3607
3608
 
3608
3609
  .appium-flow-dialog .el-dialog__title {
3609
- font-size: var(--el-dialog-title-font-size);
3610
- font-weight: 400;
3610
+ font-size: 16px;
3611
+ font-weight: 650;
3611
3612
  }
3612
3613
 
3613
3614
  .appium-flow-dialog .el-dialog__body {
@@ -3615,7 +3616,7 @@ body {
3615
3616
  flex-direction: column;
3616
3617
  flex: 1;
3617
3618
  min-height: 0;
3618
- padding: 8px 0 0;
3619
+ padding: 16px 20px 20px;
3619
3620
  }
3620
3621
 
3621
3622
  .appium-flow-dialog__toolbar { flex: none; }
@@ -3640,7 +3641,7 @@ body {
3640
3641
 
3641
3642
  .appium-recorded-steps-panel .el-form-item__label,
3642
3643
  .appium-flow-dialog .el-form-item__label {
3643
- color: #606266;
3644
+ color: var(--ui-text-secondary);
3644
3645
  font-size: 14px;
3645
3646
  font-weight: 400;
3646
3647
  }
@@ -3683,15 +3684,16 @@ body {
3683
3684
 
3684
3685
  .layout-collapse.el-button { width: 32px; padding: 0; font-size: 18px; }
3685
3686
 
3686
- .layout-page-tabs { display: flex; align-items: flex-end; gap: 4px; padding: 4px 16px 0; border-bottom: 1px solid var(--ui-border); background: var(--ui-surface); overflow-x: auto; }
3687
+ .layout-page-tabs { display: flex; align-items: center; gap: 6px; padding: 8px 20px; border-bottom: 1px solid var(--ui-border); background: var(--ui-surface); overflow-x: auto; }
3687
3688
 
3688
- .layout-page-tab { display: inline-flex; flex: none; align-items: center; height: 35px; border: 0; border-radius: 8px 8px 0 0; background: transparent; color: var(--ui-text); font-size: 13px; cursor: pointer; }
3689
+ .layout-page-tab { display: inline-flex; flex: none; align-items: center; height: 35px; border: 0; border-radius: var(--ui-radius-pill); background: transparent; color: var(--ui-text); font-size: 13px; cursor: pointer; }
3689
3690
 
3690
3691
  .layout-page-tab:hover { background: var(--ui-bg); }
3691
3692
 
3692
- .layout-page-tab.is-active { color: var(--ui-primary); background: #e1eaff; }
3693
+ .layout-page-tab.is-active { color: var(--ui-primary); background: #e8f0fe; }
3693
3694
 
3694
3695
  .page-body.page-body--config { padding: 0; overflow: hidden; scrollbar-gutter: auto; }
3696
+ .page-body.page-body--artemis { padding: 0; overflow: hidden; scrollbar-gutter: auto; }
3695
3697
 
3696
3698
  button:focus-visible { outline: 2px solid var(--ui-primary); outline-offset: -2px; }
3697
3699
 
@@ -3705,7 +3707,7 @@ button:focus-visible { outline: 2px solid var(--ui-primary); outline-offset: -2p
3705
3707
 
3706
3708
  .appium-header-actions { height: auto; flex-wrap: wrap; gap: 8px; }
3707
3709
 
3708
- .layout-page-tabs { flex: none; min-height: 40px; }
3710
+ .layout-page-tabs { flex: none; min-height: 52px; }
3709
3711
 
3710
3712
  .layout-page-tab { padding: 0 6px 0 0; gap: 0; }
3711
3713
 
@@ -3713,7 +3715,7 @@ button:focus-visible { outline: 2px solid var(--ui-primary); outline-offset: -2p
3713
3715
 
3714
3716
  .layout-page-tab__select { gap: 8px; padding: 0 10px 0 14px; height: 100%; font: inherit; }
3715
3717
 
3716
- .layout-page-tab__close { width: 24px; height: 24px; border-radius: 4px; }
3718
+ .layout-page-tab__close { width: 24px; height: 24px; border-radius: 50%; }
3717
3719
 
3718
3720
  .layout-page-tab__close:hover:not(:disabled) { background: var(--el-color-primary-light-8); }
3719
3721
 
@@ -3733,3 +3735,184 @@ button:focus-visible { outline: 2px solid var(--ui-primary); outline-offset: -2p
3733
3735
  .layout-header__breadcrumb { display: none; }
3734
3736
  .appium-header-actions__script { width: 170px; }
3735
3737
  }
3738
+
3739
+ /* Soft surfaces and pill controls match the embedded Artemis application. */
3740
+ .layout {
3741
+ background: radial-gradient(ellipse at 55% 0, rgb(232 240 254 / 45%), transparent 55%), var(--ui-bg);
3742
+ }
3743
+ .layout-header { background: rgb(255 255 255 / 76%); }
3744
+ .layout-page-tabs { background: rgb(255 255 255 / 60%); }
3745
+ .layout-page-tab.is-active {
3746
+ background: var(--ui-primary);
3747
+ color: #fff;
3748
+ box-shadow: 0 2px 8px rgb(26 115 232 / 20%);
3749
+ }
3750
+ .layout-page-tab.is-active .layout-page-tab__close:hover:not(:disabled) { background: rgb(255 255 255 / 20%); }
3751
+ .el-card, .el-card.is-never-shadow { box-shadow: var(--ui-shadow-card); }
3752
+ .el-card__header { background: transparent; }
3753
+ .el-button:not(.is-circle) { border-radius: var(--ui-radius-pill); }
3754
+ .el-button:not(.is-text):not(.is-link):not(.is-disabled):hover { box-shadow: 0 2px 6px rgb(15 23 42 / 6%); }
3755
+ .el-button--primary:not(.is-disabled):not(.is-plain):not(.is-text):not(.is-link) {
3756
+ box-shadow: 0 2px 8px rgb(26 115 232 / 15%);
3757
+ }
3758
+ .el-tag { border-radius: var(--ui-radius-pill); }
3759
+ .el-input__wrapper, .el-select__wrapper, .el-textarea__inner { background: var(--ui-surface); }
3760
+ .el-table { --el-table-header-bg-color: #f8fafc; --el-table-row-hover-bg-color: #eff6ff; }
3761
+ .el-table th.el-table__cell { color: var(--ui-text-secondary); font-weight: 600; }
3762
+ .el-tabs__nav-wrap::after { background-color: var(--ui-border); }
3763
+ .subnav__item--active { background: var(--ui-surface); box-shadow: var(--ui-shadow-card); }
3764
+ .appium-flow-node, .appium-flow-branch-step, .appium-flow-step-card, .appium-flow-start-card {
3765
+ border-radius: var(--ui-radius-control);
3766
+ box-shadow: var(--ui-shadow-card);
3767
+ }
3768
+ .appium-flow-editor, .appium-flow-dialog-canvas, .appium-flow-canvas { border-radius: var(--ui-radius); }
3769
+ .device-preview--empty { background: #f8fafc; }
3770
+ .el-button.recorder-panel-tool { border-radius: 50%; }
3771
+ @media (prefers-reduced-motion: reduce) {
3772
+ .layout-menu .el-menu-item, .layout-page-tab, .el-button { transition: none; }
3773
+ }
3774
+
3775
+ /* Internal page tabs use the same segmented navigation as Artemis. */
3776
+ .el-tabs:not(.el-tabs--card):not(.el-tabs--border-card) > .el-tabs__header .el-tabs__nav {
3777
+ padding: 4px;
3778
+ border: 1px solid var(--ui-border);
3779
+ border-radius: var(--ui-radius-pill);
3780
+ background: var(--ui-bg-soft);
3781
+ }
3782
+ .el-tabs:not(.el-tabs--card):not(.el-tabs--border-card) > .el-tabs__header .el-tabs__item {
3783
+ height: 32px;
3784
+ padding: 0 14px;
3785
+ margin: 0 2px;
3786
+ border-radius: var(--ui-radius-pill);
3787
+ font-size: 13px;
3788
+ }
3789
+ .el-tabs:not(.el-tabs--card):not(.el-tabs--border-card) > .el-tabs__header .el-tabs__item.is-active {
3790
+ background: var(--ui-surface);
3791
+ box-shadow: var(--ui-shadow-card);
3792
+ }
3793
+ .el-tabs:not(.el-tabs--card):not(.el-tabs--border-card) > .el-tabs__header .el-tabs__active-bar,
3794
+ .el-tabs:not(.el-tabs--card):not(.el-tabs--border-card) > .el-tabs__header .el-tabs__nav-wrap::after {
3795
+ display: none;
3796
+ }
3797
+
3798
+ /* Keep action gaps predictable instead of combining flex gaps with library margins. */
3799
+ :is(.layout-header__actions, .appium-header-actions, .panel-header__actions,
3800
+ .prompt-template-actions, .appium-section-title__actions, .recorder-workspace__tools)
3801
+ > .el-button + .el-button { margin-left: 0; }
3802
+ .layout-sidebar__brand { min-width: 0; overflow: hidden; text-overflow: ellipsis; }
3803
+ .layout-menu .el-sub-menu .el-menu-item { padding-right: 16px !important; }
3804
+ @media (max-width: 1000px) {
3805
+ .layout-sidebar__brand span { display: none; }
3806
+ }
3807
+
3808
+ /* Long editors and reports scroll inside the dialog, keeping actions reachable. */
3809
+ .el-dialog {
3810
+ --el-dialog-margin-top: 24px;
3811
+ display: flex;
3812
+ flex-direction: column;
3813
+ max-height: calc(100dvh - 48px);
3814
+ }
3815
+ .el-dialog > .el-dialog__header,
3816
+ .el-dialog > .el-dialog__footer { flex: none; }
3817
+ .el-dialog > .el-dialog__body { flex: 1; min-height: 0; overflow-y: auto; }
3818
+
3819
+ /* One depth scale for raised surfaces, recessed fields and tactile controls. */
3820
+ .layout-sidebar {
3821
+ background: linear-gradient(120deg, #fff, #f8fafc);
3822
+ box-shadow: 4px 0 18px -10px rgb(15 23 42 / 18%);
3823
+ z-index: 1;
3824
+ }
3825
+ .layout-header { box-shadow: 0 2px 6px -3px rgb(15 23 42 / 12%); }
3826
+ .layout-sidebar__logo, .layout-page-tab.is-active {
3827
+ background: linear-gradient(180deg, #3588f3, var(--ui-primary));
3828
+ box-shadow: var(--ui-shadow-primary);
3829
+ }
3830
+ .layout-menu .el-menu-item.is-active {
3831
+ background: linear-gradient(180deg, #f3f7ff, #e8f0fe);
3832
+ box-shadow: var(--ui-shadow-control);
3833
+ }
3834
+ .layout .el-card, .layout .help-center-page, .layout .help-center__version-card {
3835
+ box-shadow: var(--ui-shadow-card);
3836
+ }
3837
+ .el-card__header {
3838
+ background: linear-gradient(180deg, #fff, #f8fafc);
3839
+ box-shadow: 0 1px 0 rgb(255 255 255 / 90%);
3840
+ }
3841
+ :is(.layout, .el-dialog, .el-message-box) .el-button:not(.is-text):not(.is-link):not(.is-disabled) {
3842
+ background-image: linear-gradient(180deg, rgb(255 255 255 / 16%), rgb(15 23 42 / 3%));
3843
+ box-shadow: var(--ui-shadow-control);
3844
+ transition: box-shadow 160ms ease, background-color 160ms ease, border-color 160ms ease;
3845
+ }
3846
+ :is(.layout, .el-dialog, .el-message-box) .el-button--primary:not(.is-disabled):not(.is-plain):not(.is-text):not(.is-link) {
3847
+ box-shadow: var(--ui-shadow-primary);
3848
+ }
3849
+ :is(.layout, .el-dialog, .el-message-box) .el-button:not(.is-text):not(.is-link):not(.is-disabled):hover {
3850
+ box-shadow: inset 0 1px 0 rgb(255 255 255 / 70%), 0 3px 6px rgb(26 115 232 / 12%), 0 6px 12px -4px rgb(15 23 42 / 16%);
3851
+ }
3852
+ :is(.layout, .el-dialog, .el-message-box) .el-button:not(.is-text):not(.is-link):not(.is-disabled):active {
3853
+ box-shadow: inset 0 2px 4px rgb(15 23 42 / 16%);
3854
+ }
3855
+ .el-input .el-input__wrapper, .el-select .el-select__wrapper, .el-textarea .el-textarea__inner {
3856
+ background: linear-gradient(180deg, #f8fafc, #fff 12px);
3857
+ box-shadow: inset 0 0 0 1px var(--ui-border-strong), var(--ui-shadow-inset);
3858
+ transition: box-shadow 160ms ease;
3859
+ }
3860
+ .el-input .el-input__wrapper:hover, .el-select .el-select__wrapper:hover, .el-textarea .el-textarea__inner:hover {
3861
+ box-shadow: inset 0 0 0 1px #94b9ea, var(--ui-shadow-inset);
3862
+ }
3863
+ .el-input .el-input__wrapper.is-focus, .el-select .el-select__wrapper.is-focused, .el-textarea .el-textarea__inner:focus {
3864
+ box-shadow: inset 0 0 0 1px var(--ui-primary), 0 0 0 3px rgb(26 115 232 / 12%);
3865
+ }
3866
+ .el-input.is-disabled .el-input__wrapper, .el-select .el-select__wrapper.is-disabled, .el-textarea.is-disabled .el-textarea__inner {
3867
+ background: var(--el-disabled-bg-color);
3868
+ box-shadow: inset 0 0 0 1px var(--ui-border);
3869
+ }
3870
+ .layout .subnav, .layout .trend-tabs,
3871
+ .el-tabs:not(.el-tabs--card):not(.el-tabs--border-card) > .el-tabs__header .el-tabs__nav {
3872
+ box-shadow: var(--ui-shadow-inset);
3873
+ }
3874
+ .layout .subnav__item--active, .layout .trend-tabs button.active,
3875
+ .el-tabs:not(.el-tabs--card):not(.el-tabs--border-card) > .el-tabs__header .el-tabs__item.is-active,
3876
+ .el-radio-group .el-radio-button.is-active .el-radio-button__inner {
3877
+ box-shadow: var(--ui-shadow-control);
3878
+ }
3879
+ .el-dialog, .el-message-box, .el-popper.is-light { box-shadow: var(--ui-shadow-popover); }
3880
+ .el-dialog__header, .el-message-box__header { background: linear-gradient(180deg, #fff, #f8fafc); }
3881
+ .el-table {
3882
+ border-radius: var(--ui-radius-control);
3883
+ box-shadow: 0 0 0 1px var(--ui-border), 0 3px 8px -4px rgb(15 23 42 / 12%);
3884
+ }
3885
+ .el-table th.el-table__cell { background: linear-gradient(180deg, #f8fafc, #eef2f6); }
3886
+ .el-tag, .el-checkbox__inner, .el-radio__inner, .el-switch__core {
3887
+ box-shadow: inset 0 1px 2px rgb(15 23 42 / 8%), 0 1px 0 rgb(255 255 255 / 90%);
3888
+ }
3889
+ .el-switch__action, .el-slider__button,
3890
+ .layout .metric-card__value .el-icon, .layout .help-center__version-label .el-icon,
3891
+ .appium-flow-start-card__icon, .execution-step__index { box-shadow: var(--ui-shadow-control); }
3892
+ .layout .appium-flow-step-card, .layout .appium-flow-start-card,
3893
+ .layout .execution-step__body { box-shadow: var(--ui-shadow-card); }
3894
+ .layout .appium-flow-step-card:hover {
3895
+ box-shadow: inset 0 1px 0 #fff, 0 3px 6px rgb(26 115 232 / 10%), 0 10px 20px -6px rgb(26 115 232 / 20%);
3896
+ }
3897
+ .layout .appium-flow-step-shell--selected .appium-flow-step-card {
3898
+ box-shadow: 0 0 0 3px rgb(26 115 232 / 18%), var(--ui-shadow-card);
3899
+ }
3900
+ .layout .generator-code-block, .layout .execution-log, .layout .execution-process,
3901
+ .layout .appium-flow-editor, .layout .device-preview {
3902
+ box-shadow: var(--ui-shadow-inset);
3903
+ }
3904
+ .layout .app-preset-row, .layout .script-row {
3905
+ background-image: linear-gradient(180deg, #fff, #f8fafc);
3906
+ box-shadow: var(--ui-shadow-control);
3907
+ }
3908
+ .layout .device-action-button:not(:disabled) {
3909
+ border-radius: var(--ui-radius-control);
3910
+ background-image: linear-gradient(180deg, rgb(255 255 255 / 80%), rgb(241 245 249 / 60%));
3911
+ box-shadow: var(--ui-shadow-control);
3912
+ }
3913
+ .layout .device-action-button:not(:disabled):active { box-shadow: var(--ui-shadow-inset); }
3914
+ @media (prefers-reduced-motion: reduce) {
3915
+ :is(.layout, .el-dialog, .el-message-box) .el-button,
3916
+ .el-input .el-input__wrapper, .el-select .el-select__wrapper,
3917
+ .el-textarea .el-textarea__inner { transition: none; }
3918
+ }