android-midscene-automation 0.2.4 → 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 +7 -0
  2. package/README.md +35 -0
  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 +4 -2
  505. package/server/artemis.ts +34 -0
  506. package/server/http-api.ts +12 -0
  507. package/src/App.vue +10 -5
  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 +340 -121
  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;
@@ -126,7 +126,7 @@ select {
126
126
  display: flex;
127
127
  align-items: center;
128
128
  justify-content: space-between;
129
- border-bottom: 1px solid #e4e7ed;
129
+ border-bottom: 1px solid var(--ui-border);
130
130
  }
131
131
 
132
132
  .layout-header__actions {
@@ -264,7 +264,7 @@ select {
264
264
  height: 100%;
265
265
  min-height: 0;
266
266
  overflow: auto;
267
- scrollbar-color: #c0c4cc transparent;
267
+ scrollbar-color: #cbd5e1 transparent;
268
268
  }
269
269
 
270
270
  .appium-tree .el-tree {
@@ -308,7 +308,7 @@ select {
308
308
 
309
309
  .appium-tree::-webkit-scrollbar-thumb {
310
310
  border-radius: 4px;
311
- background: #c0c4cc;
311
+ background: #cbd5e1;
312
312
  }
313
313
 
314
314
  .appium-tree-panel {
@@ -324,15 +324,15 @@ select {
324
324
  align-items: start;
325
325
  gap: 12px;
326
326
  padding: 12px 0 0;
327
- border-top: 1px solid #e4e7ed;
328
- color: #606266;
327
+ border-top: 1px solid var(--ui-border);
328
+ color: var(--ui-text-secondary);
329
329
  font-size: 13px;
330
330
  }
331
331
 
332
332
  .appium-current-activity code {
333
333
  display: -webkit-box;
334
334
  overflow: hidden;
335
- color: #303133;
335
+ color: var(--ui-text);
336
336
  font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
337
337
  line-height: 1.45;
338
338
  overflow-wrap: anywhere;
@@ -343,7 +343,7 @@ select {
343
343
 
344
344
  .appium-node-detail__title {
345
345
  margin-bottom: 12px;
346
- color: #303133;
346
+ color: var(--ui-text);
347
347
  font-weight: 700;
348
348
  }
349
349
 
@@ -376,7 +376,7 @@ select {
376
376
  gap: 8px;
377
377
  align-items: center;
378
378
  padding: 10px;
379
- border: 1px solid #e4e7ed;
379
+ border: 1px solid var(--ui-border);
380
380
  }
381
381
 
382
382
  .appium-script-list__main {
@@ -394,7 +394,7 @@ select {
394
394
  }
395
395
 
396
396
  .appium-script-list__main strong {
397
- color: #303133;
397
+ color: var(--ui-text);
398
398
  font-size: 13px;
399
399
  }
400
400
 
@@ -454,7 +454,7 @@ select {
454
454
  overflow-x: hidden;
455
455
  overflow-y: auto;
456
456
  padding-right: 4px;
457
- scrollbar-color: #c0c4cc transparent;
457
+ scrollbar-color: #cbd5e1 transparent;
458
458
  }
459
459
 
460
460
  .appium-recorded-steps::-webkit-scrollbar {
@@ -467,7 +467,7 @@ select {
467
467
 
468
468
  .appium-recorded-steps::-webkit-scrollbar-thumb {
469
469
  border-radius: 3px;
470
- background: #c0c4cc;
470
+ background: #cbd5e1;
471
471
  }
472
472
 
473
473
  .appium-step-item {
@@ -482,7 +482,7 @@ select {
482
482
  gap: 8px;
483
483
  align-items: center;
484
484
  padding: 8px;
485
- border: 1px solid #e4e7ed;
485
+ border: 1px solid var(--ui-border);
486
486
  border-radius: 6px;
487
487
  background: #fff;
488
488
  min-height: var(--appium-step-row-height);
@@ -562,8 +562,8 @@ select {
562
562
  }
563
563
 
564
564
  .appium-step-insert-delay:hover {
565
- border-color: #409eff;
566
- color: #409eff;
565
+ border-color: var(--ui-primary);
566
+ color: var(--ui-primary);
567
567
  background: #f5f9ff;
568
568
  }
569
569
 
@@ -595,7 +595,7 @@ select {
595
595
  height: 460px;
596
596
  min-width: 0;
597
597
  overflow: hidden;
598
- border: 1px solid #e4e7ed;
598
+ border: 1px solid var(--ui-border);
599
599
  border-radius: 8px;
600
600
  background:
601
601
  radial-gradient(circle at 1px 1px, #e7edf6 1px, transparent 0) 0 0 / 18px 18px,
@@ -635,7 +635,7 @@ select {
635
635
  height: 72vh;
636
636
  overflow: auto;
637
637
  padding: 12px;
638
- border: 1px solid #e4e7ed;
638
+ border: 1px solid var(--ui-border);
639
639
  border-radius: 8px;
640
640
  background:
641
641
  radial-gradient(circle at 1px 1px, #e7edf6 1px, transparent 0) 0 0 / 18px 18px,
@@ -711,10 +711,10 @@ select {
711
711
  width: 38px;
712
712
  height: 30px;
713
713
  padding: 0 6px;
714
- border: 1px solid #409eff;
714
+ border: 1px solid var(--ui-primary);
715
715
  border-radius: 8px;
716
716
  background: #ecf5ff;
717
- color: #337ecc;
717
+ color: var(--ui-primary-active);
718
718
  font-size: 12px;
719
719
  font-weight: 700;
720
720
  }
@@ -759,7 +759,7 @@ select {
759
759
  border: 1px solid #d8e0ea;
760
760
  border-radius: 8px;
761
761
  background: #fff;
762
- color: #303133;
762
+ color: var(--ui-text);
763
763
  text-align: left;
764
764
  cursor: pointer;
765
765
  }
@@ -799,7 +799,7 @@ select {
799
799
 
800
800
  .appium-flow-node--expanded {
801
801
  box-shadow: 0 0 0 2px rgba(64, 158, 255, 0.12);
802
- border-color: #409eff;
802
+ border-color: var(--ui-primary);
803
803
  }
804
804
 
805
805
  .appium-flow-node--copying {
@@ -807,7 +807,7 @@ select {
807
807
  }
808
808
 
809
809
  .appium-flow-node--selected {
810
- border-color: #337ecc;
810
+ border-color: var(--ui-primary-active);
811
811
  box-shadow: 0 0 0 3px rgba(64, 158, 255, 0.32);
812
812
  background: #d9ecff;
813
813
  }
@@ -836,7 +836,7 @@ select {
836
836
 
837
837
  .appium-flow-node__note {
838
838
  min-width: 0;
839
- color: #303133;
839
+ color: var(--ui-text);
840
840
  font-size: 11px;
841
841
  line-height: 1.4;
842
842
  overflow-wrap: anywhere;
@@ -968,7 +968,7 @@ select {
968
968
  border: 1px solid #d8e0ea;
969
969
  border-radius: 999px;
970
970
  background: #fff;
971
- color: #303133;
971
+ color: var(--ui-text);
972
972
  font-weight: 600;
973
973
  line-height: 1.4;
974
974
  overflow-wrap: anywhere;
@@ -1164,8 +1164,8 @@ select {
1164
1164
  }
1165
1165
 
1166
1166
  .appium-flow-insert:hover {
1167
- border-color: #409eff;
1168
- color: #409eff;
1167
+ border-color: var(--ui-primary);
1168
+ color: var(--ui-primary);
1169
1169
  background: #f5f9ff;
1170
1170
  }
1171
1171
 
@@ -1208,10 +1208,10 @@ select {
1208
1208
  box-sizing: border-box;
1209
1209
  width: 100%;
1210
1210
  padding: 8px 10px;
1211
- border: 1px solid #e4e7ed;
1211
+ border: 1px solid var(--ui-border);
1212
1212
  border-radius: 6px;
1213
1213
  background: #f7f8fa;
1214
- color: #606266;
1214
+ color: var(--ui-text-secondary);
1215
1215
  font-family: inherit;
1216
1216
  line-height: 1.5;
1217
1217
  overflow-wrap: anywhere;
@@ -1243,7 +1243,7 @@ select {
1243
1243
  max-height: 260px;
1244
1244
  margin: 0;
1245
1245
  padding: 12px;
1246
- border: 1px solid #e4e7ed;
1246
+ border: 1px solid var(--ui-border);
1247
1247
  border-radius: 6px;
1248
1248
  background: #fff;
1249
1249
  color: #475569;
@@ -1368,7 +1368,7 @@ select {
1368
1368
  min-width: 0;
1369
1369
  margin: 0;
1370
1370
  overflow-wrap: anywhere;
1371
- color: #303133;
1371
+ color: var(--ui-text);
1372
1372
  font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
1373
1373
  }
1374
1374
 
@@ -1393,7 +1393,7 @@ select {
1393
1393
  }
1394
1394
 
1395
1395
  .subnav__item--active {
1396
- border-color: #409eff;
1396
+ border-color: var(--ui-primary);
1397
1397
  }
1398
1398
 
1399
1399
  .page-grid {
@@ -1420,11 +1420,11 @@ select {
1420
1420
 
1421
1421
  .generator-page--ai {
1422
1422
  display: grid;
1423
- grid-template-rows: auto auto minmax(0, 1fr);
1423
+ grid-template-rows: auto auto minmax(260px, 1fr);
1424
1424
  gap: 16px;
1425
- height: 100%;
1426
- min-height: 0;
1427
- overflow: hidden;
1425
+ height: auto;
1426
+ min-height: 100%;
1427
+ overflow: visible;
1428
1428
  }
1429
1429
 
1430
1430
  .generator-page--manual {
@@ -1626,13 +1626,13 @@ select {
1626
1626
  grid-template-columns: 100px minmax(0, 1fr);
1627
1627
  gap: 12px;
1628
1628
  padding-top: 12px;
1629
- color: #606266;
1629
+ color: var(--ui-text-secondary);
1630
1630
  font-size: 13px;
1631
1631
  line-height: 1.6;
1632
1632
  }
1633
1633
 
1634
1634
  .method-guide__row strong {
1635
- color: #303133;
1635
+ color: var(--ui-text);
1636
1636
  }
1637
1637
 
1638
1638
  .method-guide__text {
@@ -1739,7 +1739,7 @@ select {
1739
1739
  }
1740
1740
 
1741
1741
  .step-item__index {
1742
- color: #606266;
1742
+ color: var(--ui-text-secondary);
1743
1743
  font-size: 13px;
1744
1744
  font-weight: 600;
1745
1745
  }
@@ -1883,7 +1883,7 @@ select {
1883
1883
  width: 100%;
1884
1884
  min-height: 48px;
1885
1885
  padding: 12px;
1886
- border: 1px dashed #dcdfe6;
1886
+ border: 1px dashed var(--ui-border-strong);
1887
1887
  border-radius: 6px;
1888
1888
  background: #f8fafc;
1889
1889
  color: #909399;
@@ -2025,7 +2025,7 @@ select {
2025
2025
  }
2026
2026
 
2027
2027
  .script-row__main strong {
2028
- color: #303133;
2028
+ color: var(--ui-text);
2029
2029
  overflow: hidden;
2030
2030
  text-overflow: ellipsis;
2031
2031
  white-space: nowrap;
@@ -2169,7 +2169,9 @@ select {
2169
2169
 
2170
2170
  .device-preview--image {
2171
2171
  border-radius: 8px;
2172
- background: #111827;
2172
+ background: #f8fafc;
2173
+ color: #334155;
2174
+ border: 1px solid var(--ui-border);
2173
2175
  }
2174
2176
 
2175
2177
  .device-preview__interactive {
@@ -2258,7 +2260,7 @@ select {
2258
2260
  display: grid;
2259
2261
  place-items: center;
2260
2262
  height: 100%;
2261
- color: #606266;
2263
+ color: var(--ui-text-secondary);
2262
2264
  text-align: center;
2263
2265
  padding: 24px;
2264
2266
  }
@@ -2271,7 +2273,7 @@ select {
2271
2273
 
2272
2274
  .device-preview__meta {
2273
2275
  margin: 0 0 8px;
2274
- color: #303133;
2276
+ color: var(--ui-text);
2275
2277
  font-weight: 600;
2276
2278
  }
2277
2279
 
@@ -2283,7 +2285,7 @@ select {
2283
2285
  height: 100%;
2284
2286
  min-height: 0;
2285
2287
  padding: 12px;
2286
- border: 1px solid #e4e7ed;
2288
+ border: 1px solid var(--ui-border);
2287
2289
  border-radius: 6px;
2288
2290
  background: #f8fafc;
2289
2291
  }
@@ -2322,7 +2324,7 @@ select {
2322
2324
 
2323
2325
  .run-result__header strong,
2324
2326
  .execution-output__header strong {
2325
- color: #303133;
2327
+ color: var(--ui-text);
2326
2328
  font-size: 13px;
2327
2329
  font-weight: 600;
2328
2330
  }
@@ -2484,7 +2486,7 @@ select {
2484
2486
  max-height: none;
2485
2487
  overflow: auto;
2486
2488
  padding: 12px;
2487
- border: 1px solid #e4e7ed;
2489
+ border: 1px solid var(--ui-border);
2488
2490
  border-radius: 6px;
2489
2491
  background: #f8fafc;
2490
2492
  }
@@ -2652,7 +2654,7 @@ select {
2652
2654
  overflow: hidden;
2653
2655
  border: 1px solid #e6edf5;
2654
2656
  border-radius: 12px;
2655
- background: var(--flow-background, #d4e8dd);
2657
+ background: var(--flow-background, #f8fafc);
2656
2658
  }
2657
2659
 
2658
2660
  .appium-flow-canvas--dialog.appium-flow-canvas--vue {
@@ -2664,8 +2666,8 @@ select {
2664
2666
  width: 100%;
2665
2667
  height: 100%;
2666
2668
  background:
2667
- radial-gradient(circle at 1px 1px, #aecfbd 1px, transparent 0) 0 0 / 22px 22px,
2668
- var(--flow-background, #d4e8dd);
2669
+ radial-gradient(circle at 1px 1px, #cbd5e1 1px, transparent 0) 0 0 / 22px 22px,
2670
+ var(--flow-background, #f8fafc);
2669
2671
  }
2670
2672
 
2671
2673
  .appium-vue-flow .vue-flow__pane {
@@ -2698,7 +2700,7 @@ select {
2698
2700
 
2699
2701
  .appium-vue-flow .vue-flow__edge-path,
2700
2702
  .appium-vue-flow .vue-flow__connection-path {
2701
- stroke: var(--appium-flow-line-color, #719985);
2703
+ stroke: var(--appium-flow-line-color, #94a3b8);
2702
2704
  stroke-width: 2.5;
2703
2705
  stroke-linecap: round;
2704
2706
  stroke-linejoin: round;
@@ -2988,48 +2990,76 @@ select {
2988
2990
  font-size: 12px;
2989
2991
  }
2990
2992
 
2993
+ /* Artemis visual language shared by every host page and Element Plus control. */
2991
2994
  :root {
2992
- --ui-primary: #006be6;
2993
- --ui-primary-hover: #3389eb;
2994
- --ui-primary-active: #0056b8;
2995
- --ui-success: #52c41a;
2996
- --ui-warning: #faad14;
2997
- --ui-danger: #ff4d4f;
2998
- --ui-text: #303133;
2999
- --ui-text-secondary: #6b7280;
3000
- --ui-text-muted: #9ca3af;
3001
- --ui-border: #e4e4e7;
3002
- --ui-border-strong: #dcdfe6;
3003
- --ui-bg: #f2f3f5;
3004
- --ui-bg-soft: #fafafa;
3005
- --ui-surface: #fff;
3006
- --ui-radius: 12px;
3007
- --ui-radius-control: 6px;
3008
- --ui-shadow-popover: 0 8px 24px rgba(15, 23, 42, 0.1);
3009
-
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);
3010
3021
  --el-color-primary: var(--ui-primary);
3011
- --el-color-primary-light-3: #4d97ee;
3012
- --el-color-primary-light-5: #80b5f3;
3013
- --el-color-primary-light-7: #b3d3f8;
3014
- --el-color-primary-light-8: #cce1fa;
3015
- --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;
3016
3027
  --el-color-primary-dark-2: var(--ui-primary-active);
3017
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;
3018
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;
3019
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;
3020
3049
  --el-text-color-primary: var(--ui-text);
3021
- --el-text-color-regular: #4b5563;
3050
+ --el-text-color-regular: var(--ui-text-secondary);
3022
3051
  --el-text-color-secondary: var(--ui-text-secondary);
3023
- --el-text-color-placeholder: var(--ui-text-muted);
3052
+ --el-text-color-placeholder: #94a3b8;
3024
3053
  --el-border-color: var(--ui-border-strong);
3025
3054
  --el-border-color-light: var(--ui-border);
3026
- --el-border-color-lighter: #edf0f3;
3027
- --el-fill-color-light: #f6f8fb;
3028
- --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;
3029
3058
  --el-bg-color-page: var(--ui-bg);
3030
3059
  --el-border-radius-base: var(--ui-radius-control);
3031
- --el-border-radius-small: 4px;
3060
+ --el-border-radius-small: 8px;
3032
3061
  --el-box-shadow-light: var(--ui-shadow-popover);
3062
+ font-family: var(--ui-font);
3033
3063
  color: var(--ui-text);
3034
3064
  }
3035
3065
 
@@ -3040,8 +3070,8 @@ body {
3040
3070
  }
3041
3071
 
3042
3072
  ::selection {
3043
- background: #e1eaff;
3044
- color: #006be6;
3073
+ background: #e8f0fe;
3074
+ color: var(--ui-primary);
3045
3075
  }
3046
3076
 
3047
3077
  .layout {
@@ -3051,7 +3081,7 @@ body {
3051
3081
 
3052
3082
  .layout-sidebar {
3053
3083
  border-right: 1px solid var(--ui-border);
3054
- background: #fff;
3084
+ background: rgb(255 255 255 / 78%);
3055
3085
  }
3056
3086
 
3057
3087
  .layout-sidebar__top {
@@ -3067,8 +3097,8 @@ body {
3067
3097
  flex: none;
3068
3098
  width: 32px;
3069
3099
  height: 32px;
3070
- background: linear-gradient(135deg, #9775fa, #5178f5 55%, #20c4e7);
3071
- box-shadow: none;
3100
+ background: var(--ui-primary);
3101
+ box-shadow: 0 2px 8px rgb(26 115 232 / 18%);
3072
3102
  color: #fff;
3073
3103
  font-size: 20px;
3074
3104
  }
@@ -3076,7 +3106,7 @@ body {
3076
3106
  .layout-menu.el-menu {
3077
3107
  --el-menu-bg-color: #fff;
3078
3108
  --el-menu-text-color: #4b5563;
3079
- --el-menu-hover-bg-color: #f4f4f5;
3109
+ --el-menu-hover-bg-color: #f1f5f9;
3080
3110
  --el-menu-active-color: var(--ui-primary);
3081
3111
  padding: 10px 8px;
3082
3112
  }
@@ -3085,12 +3115,12 @@ body {
3085
3115
  .layout-menu .el-sub-menu__title {
3086
3116
  height: 44px;
3087
3117
  margin: 2px 0;
3088
- border-radius: 8px;
3118
+ border-radius: var(--ui-radius-pill);
3089
3119
  line-height: 44px;
3090
3120
  }
3091
3121
 
3092
3122
  .layout-menu .el-menu-item.is-active {
3093
- background: #e1eaff;
3123
+ background: #e8f0fe;
3094
3124
  box-shadow: none;
3095
3125
  font-weight: 600;
3096
3126
  }
@@ -3166,7 +3196,7 @@ body {
3166
3196
  letter-spacing: 0;
3167
3197
  }
3168
3198
 
3169
- .el-button:not(.is-circle) {
3199
+ .el-button:not(.is-circle):not(.el-button--small) {
3170
3200
  min-height: 32px;
3171
3201
  padding-right: 14px;
3172
3202
  padding-left: 14px;
@@ -3202,7 +3232,7 @@ body {
3202
3232
  .el-input__wrapper:hover,
3203
3233
  .el-select__wrapper:hover,
3204
3234
  .el-textarea__inner:hover {
3205
- box-shadow: 0 0 0 1px #80b5f3 inset;
3235
+ box-shadow: 0 0 0 1px #bfdbfe inset;
3206
3236
  }
3207
3237
 
3208
3238
  .el-form-item__label {
@@ -3282,15 +3312,15 @@ body {
3282
3312
  width: fit-content;
3283
3313
  padding: 4px;
3284
3314
  border: 1px solid var(--ui-border);
3285
- border-radius: var(--ui-radius);
3286
- background: #eef1f5;
3315
+ border-radius: var(--ui-radius-pill);
3316
+ background: var(--ui-bg-soft);
3287
3317
  }
3288
3318
 
3289
3319
  .subnav__item {
3290
3320
  min-height: 32px;
3291
3321
  padding: 6px 14px;
3292
3322
  border: 0;
3293
- border-radius: 5px;
3323
+ border-radius: var(--ui-radius-pill);
3294
3324
  background: transparent;
3295
3325
  color: var(--ui-text-secondary);
3296
3326
  font-size: 13px;
@@ -3303,7 +3333,7 @@ body {
3303
3333
 
3304
3334
  .subnav__item--active {
3305
3335
  border: 0;
3306
- background: #e1eaff;
3336
+ background: #e8f0fe;
3307
3337
  color: var(--ui-primary);
3308
3338
  box-shadow: none;
3309
3339
  }
@@ -3373,8 +3403,8 @@ body {
3373
3403
  }
3374
3404
 
3375
3405
  .model-usage-chart__record:not(.model-usage-chart__record--head):hover {
3376
- border-color: #b3d3f8;
3377
- background: #f0f6ff;
3406
+ border-color: #bfdbfe;
3407
+ background: #eff6ff;
3378
3408
  }
3379
3409
 
3380
3410
  .model-usage-chart__record--head {
@@ -3391,13 +3421,13 @@ body {
3391
3421
 
3392
3422
  .app-preset-row:hover,
3393
3423
  .script-row:hover {
3394
- border-color: #b3d3f8;
3395
- background: #f0f6ff;
3424
+ border-color: #bfdbfe;
3425
+ background: #eff6ff;
3396
3426
  }
3397
3427
 
3398
3428
  .method-guide {
3399
3429
  border-color: #cce1fa;
3400
- background: #f0f6ff;
3430
+ background: #eff6ff;
3401
3431
  }
3402
3432
 
3403
3433
  .method-guide__summary {
@@ -3412,7 +3442,9 @@ body {
3412
3442
  .terminal-block,
3413
3443
  .generator-code-editor .el-textarea__inner,
3414
3444
  .code-dialog__editor .el-textarea__inner {
3415
- background: #111827;
3445
+ background: #f8fafc;
3446
+ color: #334155;
3447
+ border: 1px solid var(--ui-border);
3416
3448
  }
3417
3449
 
3418
3450
  .automation-layout,
@@ -3421,8 +3453,8 @@ body {
3421
3453
  }
3422
3454
 
3423
3455
  .script-row--active {
3424
- border-color: #80b5f3;
3425
- background: #e1eaff;
3456
+ border-color: #bfdbfe;
3457
+ background: #e8f0fe;
3426
3458
  }
3427
3459
 
3428
3460
  .execution-output {
@@ -3433,7 +3465,9 @@ body {
3433
3465
 
3434
3466
  .execution-log__output {
3435
3467
  border-radius: var(--ui-radius-control);
3436
- background: #111827;
3468
+ background: #f8fafc;
3469
+ color: #334155;
3470
+ border: 1px solid var(--ui-border);
3437
3471
  }
3438
3472
 
3439
3473
  .device-preview {
@@ -3467,8 +3501,9 @@ body {
3467
3501
  }
3468
3502
 
3469
3503
  .appium-workbench-tabs > .el-tabs__header {
3470
- padding: 0 18px;
3471
- background: #fbfcfe;
3504
+ flex: none;
3505
+ padding: 16px 16px 8px;
3506
+ background: var(--ui-surface);
3472
3507
  }
3473
3508
 
3474
3509
  .appium-workbench {
@@ -3488,12 +3523,12 @@ body {
3488
3523
  }
3489
3524
 
3490
3525
  .appium-tree .el-tree-node__content:hover {
3491
- background: #f0f6ff;
3526
+ background: #eff6ff;
3492
3527
  }
3493
3528
 
3494
3529
  .appium-tree .el-tree-node.is-current > .el-tree-node__content {
3495
- background: #e1eaff;
3496
- color: #006be6;
3530
+ background: #e8f0fe;
3531
+ color: var(--ui-primary);
3497
3532
  }
3498
3533
 
3499
3534
  .appium-current-activity {
@@ -3517,13 +3552,13 @@ body {
3517
3552
  }
3518
3553
 
3519
3554
  .appium-script-list__item:hover {
3520
- border-color: #b3d3f8;
3521
- background: #f0f6ff;
3555
+ border-color: #bfdbfe;
3556
+ background: #eff6ff;
3522
3557
  }
3523
3558
 
3524
3559
  .appium-script-list__item--active {
3525
- border-color: #80b5f3;
3526
- background: #e1eaff;
3560
+ border-color: #bfdbfe;
3561
+ background: #e8f0fe;
3527
3562
  }
3528
3563
 
3529
3564
  .appium-replay-fab .el-button {
@@ -3532,14 +3567,16 @@ body {
3532
3567
 
3533
3568
  .appium-replay-output--dialog {
3534
3569
  border-radius: var(--ui-radius-control);
3535
- background: #111827;
3570
+ background: #f8fafc;
3571
+ color: #334155;
3572
+ border: 1px solid var(--ui-border);
3536
3573
  }
3537
3574
 
3538
3575
  .el-button.recorder-panel-tool {
3539
- --el-button-text-color: #606266;
3540
- --el-button-border-color: #dcdfe6;
3576
+ --el-button-text-color: var(--ui-text-secondary);
3577
+ --el-button-border-color: var(--ui-border-strong);
3541
3578
  --el-button-disabled-text-color: #a8abb2;
3542
- --el-button-disabled-border-color: #e4e7ed;
3579
+ --el-button-disabled-border-color: var(--ui-border);
3543
3580
  width: 30px;
3544
3581
  min-width: 30px;
3545
3582
  height: 32px;
@@ -3604,7 +3641,7 @@ body {
3604
3641
 
3605
3642
  .appium-recorded-steps-panel .el-form-item__label,
3606
3643
  .appium-flow-dialog .el-form-item__label {
3607
- color: #606266;
3644
+ color: var(--ui-text-secondary);
3608
3645
  font-size: 14px;
3609
3646
  font-weight: 400;
3610
3647
  }
@@ -3647,15 +3684,16 @@ body {
3647
3684
 
3648
3685
  .layout-collapse.el-button { width: 32px; padding: 0; font-size: 18px; }
3649
3686
 
3650
- .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; }
3651
3688
 
3652
- .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; }
3653
3690
 
3654
3691
  .layout-page-tab:hover { background: var(--ui-bg); }
3655
3692
 
3656
- .layout-page-tab.is-active { color: var(--ui-primary); background: #e1eaff; }
3693
+ .layout-page-tab.is-active { color: var(--ui-primary); background: #e8f0fe; }
3657
3694
 
3658
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; }
3659
3697
 
3660
3698
  button:focus-visible { outline: 2px solid var(--ui-primary); outline-offset: -2px; }
3661
3699
 
@@ -3669,7 +3707,7 @@ button:focus-visible { outline: 2px solid var(--ui-primary); outline-offset: -2p
3669
3707
 
3670
3708
  .appium-header-actions { height: auto; flex-wrap: wrap; gap: 8px; }
3671
3709
 
3672
- .layout-page-tabs { flex: none; min-height: 40px; }
3710
+ .layout-page-tabs { flex: none; min-height: 52px; }
3673
3711
 
3674
3712
  .layout-page-tab { padding: 0 6px 0 0; gap: 0; }
3675
3713
 
@@ -3677,7 +3715,7 @@ button:focus-visible { outline: 2px solid var(--ui-primary); outline-offset: -2p
3677
3715
 
3678
3716
  .layout-page-tab__select { gap: 8px; padding: 0 10px 0 14px; height: 100%; font: inherit; }
3679
3717
 
3680
- .layout-page-tab__close { width: 24px; height: 24px; border-radius: 4px; }
3718
+ .layout-page-tab__close { width: 24px; height: 24px; border-radius: 50%; }
3681
3719
 
3682
3720
  .layout-page-tab__close:hover:not(:disabled) { background: var(--el-color-primary-light-8); }
3683
3721
 
@@ -3697,3 +3735,184 @@ button:focus-visible { outline: 2px solid var(--ui-primary); outline-offset: -2p
3697
3735
  .layout-header__breadcrumb { display: none; }
3698
3736
  .appium-header-actions__script { width: 170px; }
3699
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
+ }