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.
- package/CHANGELOG.md +7 -0
- package/README.md +35 -0
- package/artemis-main/.dockerignore +15 -0
- package/artemis-main/.env.example +34 -0
- package/artemis-main/CONTRIBUTING.md +35 -0
- package/artemis-main/Dockerfile +68 -0
- package/artemis-main/LICENSE +202 -0
- package/artemis-main/Makefile +115 -0
- package/artemis-main/README.md +322 -0
- package/artemis-main/README_CN.md +320 -0
- package/artemis-main/apps/__init__.py +15 -0
- package/artemis-main/apps/admin_console/__init__.py +19 -0
- package/artemis-main/apps/admin_console/core/__init__.py +13 -0
- package/artemis-main/apps/admin_console/core/config.py +43 -0
- package/artemis-main/apps/admin_console/core/security.py +178 -0
- package/artemis-main/apps/admin_console/core/state.py +243 -0
- package/artemis-main/apps/admin_console/database/__init__.py +13 -0
- package/artemis-main/apps/admin_console/database/connection.py +60 -0
- package/artemis-main/apps/admin_console/database/repositories/__init__.py +13 -0
- package/artemis-main/apps/admin_console/database/repositories/session_repository.py +564 -0
- package/artemis-main/apps/admin_console/database/repositories/step_repository.py +512 -0
- package/artemis-main/apps/admin_console/database/repositories/trace_repository.py +133 -0
- package/artemis-main/apps/admin_console/index.html +3787 -0
- package/artemis-main/apps/admin_console/replay_manager.py +2585 -0
- package/artemis-main/apps/admin_console/routers/__init__.py +13 -0
- package/artemis-main/apps/admin_console/routers/media.py +198 -0
- package/artemis-main/apps/admin_console/routers/replay.py +91 -0
- package/artemis-main/apps/admin_console/routers/sessions.py +239 -0
- package/artemis-main/apps/admin_console/routers/steps.py +109 -0
- package/artemis-main/apps/admin_console/routers/stream.py +56 -0
- package/artemis-main/apps/admin_console/routers/system.py +761 -0
- package/artemis-main/apps/admin_console/routers/tasks.py +517 -0
- package/artemis-main/apps/admin_console/schemas/__init__.py +13 -0
- package/artemis-main/apps/admin_console/schemas/task_schema.py +47 -0
- package/artemis-main/apps/admin_console/server.py +508 -0
- package/artemis-main/apps/admin_console/services/__init__.py +13 -0
- package/artemis-main/apps/admin_console/services/device_stream_service.py +137 -0
- package/artemis-main/apps/admin_console/services/ipc_service.py +262 -0
- package/artemis-main/apps/admin_console/services/media_service.py +623 -0
- package/artemis-main/apps/admin_console/services/model_service.py +148 -0
- package/artemis-main/apps/admin_console/services/task_preset_catalog.py +514 -0
- package/artemis-main/apps/admin_console/services/task_queue_service.py +1719 -0
- package/artemis-main/apps/admin_console/services/worker_process_io.py +144 -0
- package/artemis-main/apps/showcase_ui/README.md +31 -0
- package/artemis-main/apps/showcase_ui/angular.json +132 -0
- package/artemis-main/apps/showcase_ui/package-lock.json +9472 -0
- package/artemis-main/apps/showcase_ui/package.json +39 -0
- package/artemis-main/apps/showcase_ui/proxy.conf.json +23 -0
- package/artemis-main/apps/showcase_ui/public/favicon.ico +0 -0
- package/artemis-main/apps/showcase_ui/public/logo.png +0 -0
- package/artemis-main/apps/showcase_ui/public/logo.svg +56 -0
- package/artemis-main/apps/showcase_ui/src/app/app.component.html +24 -0
- package/artemis-main/apps/showcase_ui/src/app/app.component.scss +49 -0
- package/artemis-main/apps/showcase_ui/src/app/app.component.spec.ts +42 -0
- package/artemis-main/apps/showcase_ui/src/app/app.component.ts +32 -0
- package/artemis-main/apps/showcase_ui/src/app/app.config.ts +29 -0
- package/artemis-main/apps/showcase_ui/src/app/app.routes.ts +27 -0
- package/artemis-main/apps/showcase_ui/src/app/components/agent-stream/agent-stream-startup.spec.ts +108 -0
- package/artemis-main/apps/showcase_ui/src/app/components/agent-stream/agent-stream.component.html +1436 -0
- package/artemis-main/apps/showcase_ui/src/app/components/agent-stream/agent-stream.component.scss +3973 -0
- package/artemis-main/apps/showcase_ui/src/app/components/agent-stream/agent-stream.component.ts +2235 -0
- package/artemis-main/apps/showcase_ui/src/app/components/chat-interface/chat-interface.component.html +380 -0
- package/artemis-main/apps/showcase_ui/src/app/components/chat-interface/chat-interface.component.scss +1171 -0
- package/artemis-main/apps/showcase_ui/src/app/components/chat-interface/chat-interface.component.ts +270 -0
- package/artemis-main/apps/showcase_ui/src/app/components/floating-video-player/floating-video-player.component.html +433 -0
- package/artemis-main/apps/showcase_ui/src/app/components/floating-video-player/floating-video-player.component.scss +987 -0
- package/artemis-main/apps/showcase_ui/src/app/components/floating-video-player/floating-video-player.component.ts +632 -0
- package/artemis-main/apps/showcase_ui/src/app/components/legacy-agent-stream/legacy-agent-stream.component.html +130 -0
- package/artemis-main/apps/showcase_ui/src/app/components/legacy-agent-stream/legacy-agent-stream.component.scss +406 -0
- package/artemis-main/apps/showcase_ui/src/app/components/legacy-agent-stream/legacy-agent-stream.component.ts +74 -0
- package/artemis-main/apps/showcase_ui/src/app/components/nav-switcher/nav-switcher.component.scss +115 -0
- package/artemis-main/apps/showcase_ui/src/app/components/nav-switcher/nav-switcher.component.ts +52 -0
- package/artemis-main/apps/showcase_ui/src/app/core/data/smart-tasks.data.ts +334 -0
- package/artemis-main/apps/showcase_ui/src/app/core/i18n/language.service.spec.ts +55 -0
- package/artemis-main/apps/showcase_ui/src/app/core/i18n/language.service.ts +61 -0
- package/artemis-main/apps/showcase_ui/src/app/core/i18n/translate.pipe.ts +11 -0
- package/artemis-main/apps/showcase_ui/src/app/core/i18n/zh-cn.ts +651 -0
- package/artemis-main/apps/showcase_ui/src/app/core/models/markdown.model.ts +43 -0
- package/artemis-main/apps/showcase_ui/src/app/core/models/pro-tuning.model.spec.ts +47 -0
- package/artemis-main/apps/showcase_ui/src/app/core/models/pro-tuning.model.ts +165 -0
- package/artemis-main/apps/showcase_ui/src/app/core/models/session.model.ts +85 -0
- package/artemis-main/apps/showcase_ui/src/app/core/models/stream.model.ts +246 -0
- package/artemis-main/apps/showcase_ui/src/app/core/models/system.model.ts +118 -0
- package/artemis-main/apps/showcase_ui/src/app/core/services/task-recommendation.service.ts +111 -0
- package/artemis-main/apps/showcase_ui/src/app/pages/home/home.component.html +2130 -0
- package/artemis-main/apps/showcase_ui/src/app/pages/home/home.component.scss +5204 -0
- package/artemis-main/apps/showcase_ui/src/app/pages/home/home.component.ts +1189 -0
- package/artemis-main/apps/showcase_ui/src/app/pages/legacy-workspace/legacy-workspace.component.html +39 -0
- package/artemis-main/apps/showcase_ui/src/app/pages/legacy-workspace/legacy-workspace.component.scss +151 -0
- package/artemis-main/apps/showcase_ui/src/app/pages/legacy-workspace/legacy-workspace.component.ts +58 -0
- package/artemis-main/apps/showcase_ui/src/app/pages/workspace/workspace.component.html +201 -0
- package/artemis-main/apps/showcase_ui/src/app/pages/workspace/workspace.component.scss +886 -0
- package/artemis-main/apps/showcase_ui/src/app/pages/workspace/workspace.component.ts +324 -0
- package/artemis-main/apps/showcase_ui/src/app/services/agent.service.spec.ts +418 -0
- package/artemis-main/apps/showcase_ui/src/app/services/agent.service.ts +2012 -0
- package/artemis-main/apps/showcase_ui/src/app/services/system.service.spec.ts +173 -0
- package/artemis-main/apps/showcase_ui/src/app/services/system.service.ts +620 -0
- package/artemis-main/apps/showcase_ui/src/app/utils/action-formatter.util.spec.ts +513 -0
- package/artemis-main/apps/showcase_ui/src/app/utils/action-formatter.util.ts +1015 -0
- package/artemis-main/apps/showcase_ui/src/app/utils/image-overlay.util.spec.ts +85 -0
- package/artemis-main/apps/showcase_ui/src/app/utils/image-overlay.util.ts +662 -0
- package/artemis-main/apps/showcase_ui/src/app/utils/markdown-parser.util.spec.ts +70 -0
- package/artemis-main/apps/showcase_ui/src/app/utils/markdown-parser.util.ts +383 -0
- package/artemis-main/apps/showcase_ui/src/app/utils/recording-timeline.util.spec.ts +107 -0
- package/artemis-main/apps/showcase_ui/src/app/utils/recording-timeline.util.ts +123 -0
- package/artemis-main/apps/showcase_ui/src/app/utils/run-info.util.spec.ts +92 -0
- package/artemis-main/apps/showcase_ui/src/app/utils/run-info.util.ts +116 -0
- package/artemis-main/apps/showcase_ui/src/app/utils/stream-aggregator.util.spec.ts +640 -0
- package/artemis-main/apps/showcase_ui/src/app/utils/stream-aggregator.util.ts +1021 -0
- package/artemis-main/apps/showcase_ui/src/app/utils/tool-formatter.util.spec.ts +375 -0
- package/artemis-main/apps/showcase_ui/src/app/utils/tool-formatter.util.ts +1419 -0
- package/artemis-main/apps/showcase_ui/src/index.html +37 -0
- package/artemis-main/apps/showcase_ui/src/main.ts +22 -0
- package/artemis-main/apps/showcase_ui/src/styles.scss +60 -0
- package/artemis-main/apps/showcase_ui/tsconfig.app.json +23 -0
- package/artemis-main/apps/showcase_ui/tsconfig.json +27 -0
- package/artemis-main/apps/showcase_ui/tsconfig.spec.json +23 -0
- package/artemis-main/artemis/__init__.py +44 -0
- package/artemis-main/artemis/__main__.py +18 -0
- package/artemis-main/artemis/_legacy_imports.py +94 -0
- package/artemis-main/artemis/_version.py +30 -0
- package/artemis-main/artemis/agents/__init__.py +17 -0
- package/artemis-main/artemis/agents/checker/checker.json +9 -0
- package/artemis-main/artemis/agents/checker/checker.py +859 -0
- package/artemis-main/artemis/agents/diagnoser/diagnoser.json +23 -0
- package/artemis-main/artemis/agents/diagnoser/diagnoser.py +608 -0
- package/artemis-main/artemis/agents/explorer/constants.py +52 -0
- package/artemis-main/artemis/agents/explorer/explorer.json +57 -0
- package/artemis-main/artemis/agents/explorer/explorer.py +473 -0
- package/artemis-main/artemis/agents/explorer/geometry.py +73 -0
- package/artemis-main/artemis/agents/explorer/native_runner.py +878 -0
- package/artemis-main/artemis/agents/explorer/perception_tools.py +632 -0
- package/artemis-main/artemis/agents/explorer/run_setup.py +403 -0
- package/artemis-main/artemis/agents/explorer/screen_index.py +266 -0
- package/artemis-main/artemis/agents/explorer/tiers.py +110 -0
- package/artemis-main/artemis/agents/explorer/tool_declarations.py +394 -0
- package/artemis-main/artemis/agents/explorer/universal_runner.py +317 -0
- package/artemis-main/artemis/agents/flash/context_compressor.py +452 -0
- package/artemis-main/artemis/agents/flash/flash_runner.md +51 -0
- package/artemis-main/artemis/agents/flash/flash_summarizer.md +53 -0
- package/artemis-main/artemis/agents/flash/flash_summarizer_single.md +54 -0
- package/artemis-main/artemis/agents/flash/runner.py +1167 -0
- package/artemis-main/artemis/agents/flash/summarizer.py +511 -0
- package/artemis-main/artemis/agents/history_analyzer/history_analyzer.md +8 -0
- package/artemis-main/artemis/agents/history_analyzer/history_analyzer.py +182 -0
- package/artemis-main/artemis/agents/image_processor/image_processor.md +74 -0
- package/artemis-main/artemis/agents/image_processor/image_processor.py +322 -0
- package/artemis-main/artemis/agents/log_analyzer/log_analyzer.md +15 -0
- package/artemis-main/artemis/agents/log_analyzer/log_analyzer.py +403 -0
- package/artemis-main/artemis/agents/log_analyzer/log_reader_sub_agent.md +8 -0
- package/artemis-main/artemis/agents/log_analyzer/output_analyzer.md +11 -0
- package/artemis-main/artemis/agents/log_analyzer/output_analyzer.py +163 -0
- package/artemis-main/artemis/agents/object_detector/object_detector.json +9 -0
- package/artemis-main/artemis/agents/object_detector/object_detector.py +211 -0
- package/artemis-main/artemis/agents/operator/operator.json +3 -0
- package/artemis-main/artemis/agents/operator/operator.py +1394 -0
- package/artemis-main/artemis/agents/operator/prompts.py +1064 -0
- package/artemis-main/artemis/agents/outputter/outputter.md +36 -0
- package/artemis-main/artemis/agents/outputter/outputter.py +552 -0
- package/artemis-main/artemis/agents/planner/planner.json +32 -0
- package/artemis-main/artemis/agents/planner/planner.py +436 -0
- package/artemis-main/artemis/agents/prompt_assembly.py +79 -0
- package/artemis-main/artemis/agents/summarizer/summarizer.py +190 -0
- package/artemis-main/artemis/agents/validator/action_execution.py +98 -0
- package/artemis-main/artemis/agents/validator/categories.py +33 -0
- package/artemis-main/artemis/agents/validator/execution_loop.py +488 -0
- package/artemis-main/artemis/agents/validator/incidents.py +120 -0
- package/artemis-main/artemis/agents/validator/pixel_safety_net.md +15 -0
- package/artemis-main/artemis/agents/validator/precondition_pixel.py +320 -0
- package/artemis-main/artemis/agents/validator/precondition_xml.py +672 -0
- package/artemis-main/artemis/agents/validator/tool_declarations.py +332 -0
- package/artemis-main/artemis/agents/validator/validator.py +188 -0
- package/artemis-main/artemis/agents/video_analyzer/__init__.py +15 -0
- package/artemis-main/artemis/agents/video_analyzer/audio_native.py +543 -0
- package/artemis-main/artemis/agents/video_analyzer/blackboard.py +821 -0
- package/artemis-main/artemis/agents/video_analyzer/chunk_agentic.py +455 -0
- package/artemis-main/artemis/agents/video_analyzer/chunk_conversation.py +491 -0
- package/artemis-main/artemis/agents/video_analyzer/chunk_native.py +437 -0
- package/artemis-main/artemis/agents/video_analyzer/conflict_resolution.py +137 -0
- package/artemis-main/artemis/agents/video_analyzer/gemini_files.py +162 -0
- package/artemis-main/artemis/agents/video_analyzer/native_coordinator.py +541 -0
- package/artemis-main/artemis/agents/video_analyzer/reliability.py +128 -0
- package/artemis-main/artemis/agents/video_analyzer/universal_engine.py +487 -0
- package/artemis-main/artemis/agents/video_analyzer/universal_tools.py +323 -0
- package/artemis-main/artemis/agents/video_analyzer/video_analyzer.md +51 -0
- package/artemis-main/artemis/agents/video_analyzer/video_analyzer.py +875 -0
- package/artemis-main/artemis/agents/video_analyzer/video_sub_agent.md +15 -0
- package/artemis-main/artemis/agents/video_analyzer/video_sub_agent_audio.md +12 -0
- package/artemis-main/artemis/clients/accessibility_client.py +438 -0
- package/artemis-main/artemis/clients/screen_client_factory.py +403 -0
- package/artemis-main/artemis/config/__init__.py +309 -0
- package/artemis-main/artemis/config/agent.py +1098 -0
- package/artemis-main/artemis/config/constants.py +151 -0
- package/artemis-main/artemis/config/core/__init__.py +24 -0
- package/artemis-main/artemis/config/core/engine.py +118 -0
- package/artemis-main/artemis/config/core/interpolator.py +78 -0
- package/artemis-main/artemis/config/llm.py +267 -0
- package/artemis-main/artemis/config/paths.py +244 -0
- package/artemis-main/artemis/config/runtime.py +197 -0
- package/artemis-main/artemis/config/settings.py +315 -0
- package/artemis-main/artemis/constants.py +47 -0
- package/artemis-main/artemis/context.py +289 -0
- package/artemis-main/artemis/controllers/__init__.py +41 -0
- package/artemis-main/artemis/controllers/controller_factory.py +41 -0
- package/artemis-main/artemis/controllers/device_controller.py +29 -0
- package/artemis-main/artemis/controllers/types.py +37 -0
- package/artemis-main/artemis/controllers/unified_controller.py +649 -0
- package/artemis-main/artemis/core/__init__.py +21 -0
- package/artemis-main/artemis/core/diagnostics/__init__.py +90 -0
- package/artemis-main/artemis/core/diagnostics/adb_keys.py +270 -0
- package/artemis-main/artemis/core/diagnostics/adb_server_connection.py +330 -0
- package/artemis-main/artemis/core/diagnostics/device_smoke.py +364 -0
- package/artemis-main/artemis/core/diagnostics/emulator_manager.py +501 -0
- package/artemis-main/artemis/core/diagnostics/engine.py +438 -0
- package/artemis-main/artemis/core/diagnostics/hierarchy_parity.py +216 -0
- package/artemis-main/artemis/core/diagnostics/probes/adb_probe.py +887 -0
- package/artemis-main/artemis/core/diagnostics/probes/base.py +45 -0
- package/artemis-main/artemis/core/diagnostics/probes/credentials_probe.py +296 -0
- package/artemis-main/artemis/core/diagnostics/probes/host_probe.py +427 -0
- package/artemis-main/artemis/core/diagnostics/probes/runtime_probe.py +169 -0
- package/artemis-main/artemis/core/diagnostics/probes/toolchain_probe.py +139 -0
- package/artemis-main/artemis/core/diagnostics/readiness.py +83 -0
- package/artemis-main/artemis/core/diagnostics/schema.py +118 -0
- package/artemis-main/artemis/core/tool_declaration.py +43 -0
- package/artemis-main/artemis/core/tool_failure.py +56 -0
- package/artemis-main/artemis/data_engine/context_vars.py +24 -0
- package/artemis-main/artemis/data_engine/engine.py +1615 -0
- package/artemis-main/artemis/data_engine/history_reader.py +142 -0
- package/artemis-main/artemis/data_engine/models.py +131 -0
- package/artemis-main/artemis/data_engine/storage.py +1245 -0
- package/artemis-main/artemis/data_engine/trace.py +727 -0
- package/artemis-main/artemis/drivers/__init__.py +48 -0
- package/artemis-main/artemis/drivers/android/adb_driver.py +507 -0
- package/artemis-main/artemis/drivers/android/hierarchy.py +64 -0
- package/artemis-main/artemis/drivers/android/input_ime.py +120 -0
- package/artemis-main/artemis/drivers/android/recorder.py +57 -0
- package/artemis-main/artemis/drivers/base.py +290 -0
- package/artemis-main/artemis/drivers/cloud/cloud_driver.py +117 -0
- package/artemis-main/artemis/drivers/factory.py +80 -0
- package/artemis-main/artemis/drivers/mock/mock_driver.py +198 -0
- package/artemis-main/artemis/drivers/types.py +67 -0
- package/artemis-main/artemis/graph/checkpoints.py +1243 -0
- package/artemis-main/artemis/graph/graph.py +1055 -0
- package/artemis-main/artemis/graph/perception.py +234 -0
- package/artemis-main/artemis/graph/state.py +151 -0
- package/artemis-main/artemis/graph/visibility.py +238 -0
- package/artemis-main/artemis/interfaces/cli/__init__.py +19 -0
- package/artemis-main/artemis/interfaces/cli/commands/__init__.py +15 -0
- package/artemis-main/artemis/interfaces/cli/commands/batch.py +278 -0
- package/artemis-main/artemis/interfaces/cli/commands/doctor.py +468 -0
- package/artemis-main/artemis/interfaces/cli/commands/helper.py +226 -0
- package/artemis-main/artemis/interfaces/cli/commands/init.py +193 -0
- package/artemis-main/artemis/interfaces/cli/commands/mcp.py +862 -0
- package/artemis-main/artemis/interfaces/cli/commands/run.py +463 -0
- package/artemis-main/artemis/interfaces/cli/commands/server.py +151 -0
- package/artemis-main/artemis/interfaces/cli/commands/server_lifecycle.py +328 -0
- package/artemis-main/artemis/interfaces/cli/commands/trace.py +111 -0
- package/artemis-main/artemis/interfaces/cli/commands/ui.py +404 -0
- package/artemis-main/artemis/interfaces/cli/main.py +109 -0
- package/artemis-main/artemis/interfaces/sdk/__init__.py +31 -0
- package/artemis-main/artemis/interfaces/sdk/client.py +19 -0
- package/artemis-main/artemis/interfaces/sdk/task.py +72 -0
- package/artemis-main/artemis/llm/__init__.py +25 -0
- package/artemis-main/artemis/llm/fake_model.py +179 -0
- package/artemis-main/artemis/llm/google/__init__.py +57 -0
- package/artemis-main/artemis/llm/google/provider.py +185 -0
- package/artemis-main/artemis/llm/google/usage.py +148 -0
- package/artemis-main/artemis/llm/parser.py +32 -0
- package/artemis-main/artemis/llm/reliability.py +267 -0
- package/artemis-main/artemis/llm/router.py +389 -0
- package/artemis-main/artemis/llm/schemas.py +36 -0
- package/artemis-main/artemis/llm/structured.py +196 -0
- package/artemis-main/artemis/main.py +58 -0
- package/artemis-main/artemis/mcp/__init__.py +20 -0
- package/artemis-main/artemis/mcp/action_executor.py +760 -0
- package/artemis-main/artemis/mcp/action_manifest.py +320 -0
- package/artemis-main/artemis/mcp/action_names.py +172 -0
- package/artemis-main/artemis/mcp/action_server.py +202 -0
- package/artemis-main/artemis/mcp/action_session.py +245 -0
- package/artemis-main/artemis/mcp/action_specs.py +868 -0
- package/artemis-main/artemis/mcp/action_types.py +86 -0
- package/artemis-main/artemis/mcp/actuators/__init__.py +21 -0
- package/artemis-main/artemis/mcp/actuators/adb.py +414 -0
- package/artemis-main/artemis/mcp/actuators/base.py +113 -0
- package/artemis-main/artemis/mcp/actuators/mock.py +70 -0
- package/artemis-main/artemis/mcp/adb_server.py +490 -0
- package/artemis-main/artemis/mcp/observation.py +133 -0
- package/artemis-main/artemis/mcp/xml_search_server.py +297 -0
- package/artemis-main/artemis/memory/__init__.py +90 -0
- package/artemis-main/artemis/memory/chunking.py +1843 -0
- package/artemis-main/artemis/memory/context_policy.py +226 -0
- package/artemis-main/artemis/memory/step_capsule.md +73 -0
- package/artemis-main/artemis/memory/step_memory.py +281 -0
- package/artemis-main/artemis/memory/transcript.py +798 -0
- package/artemis-main/artemis/platform/__init__.py +61 -0
- package/artemis-main/artemis/platform/base.py +104 -0
- package/artemis-main/artemis/platform/darwin.py +184 -0
- package/artemis-main/artemis/platform/linux.py +207 -0
- package/artemis-main/artemis/platform/windows.py +193 -0
- package/artemis-main/artemis/resources/__init__.py +46 -0
- package/artemis-main/artemis/runtime/__init__.py +108 -0
- package/artemis-main/artemis/runtime/adb_endpoint.py +173 -0
- package/artemis-main/artemis/runtime/awake_lease.py +283 -0
- package/artemis-main/artemis/runtime/awake_service.py +343 -0
- package/artemis-main/artemis/runtime/cancel_requests.py +254 -0
- package/artemis-main/artemis/runtime/daemon_client.py +422 -0
- package/artemis-main/artemis/runtime/device_lock.py +1013 -0
- package/artemis-main/artemis/runtime/device_pool.py +478 -0
- package/artemis-main/artemis/runtime/helper_manager.py +1030 -0
- package/artemis-main/artemis/runtime/process_probe.py +98 -0
- package/artemis-main/artemis/runtime/server_lifecycle.py +435 -0
- package/artemis-main/artemis/runtime/supervisor.py +121 -0
- package/artemis-main/artemis/runtime/trace_store.py +375 -0
- package/artemis-main/artemis/sdk/__init__.py +26 -0
- package/artemis-main/artemis/sdk/agent.py +485 -0
- package/artemis-main/artemis/sdk/builders/__init__.py +29 -0
- package/artemis-main/artemis/sdk/builders/agent_config_builder.py +474 -0
- package/artemis-main/artemis/sdk/constants.py +15 -0
- package/artemis-main/artemis/sdk/run_outcome.py +58 -0
- package/artemis-main/artemis/sdk/types/__init__.py +61 -0
- package/artemis-main/artemis/sdk/types/agent.py +89 -0
- package/artemis-main/artemis/sdk/utils.py +28 -0
- package/artemis-main/artemis/services/llm.py +1040 -0
- package/artemis-main/artemis/services/token_meter.py +267 -0
- package/artemis-main/artemis/telemetry/__init__.py +35 -0
- package/artemis-main/artemis/telemetry/models.py +64 -0
- package/artemis-main/artemis/telemetry/replay.py +34 -0
- package/artemis-main/artemis/telemetry/storage/json_storage.py +47 -0
- package/artemis-main/artemis/telemetry/tracer.py +85 -0
- package/artemis-main/artemis/toolchain/__init__.py +52 -0
- package/artemis-main/artemis/toolchain/descriptors.py +92 -0
- package/artemis-main/artemis/toolchain/resolver.py +185 -0
- package/artemis-main/artemis/tools/base.py +232 -0
- package/artemis-main/artemis/tools/command_tool.py +1240 -0
- package/artemis-main/artemis/tools/committee_prompts.json +5 -0
- package/artemis-main/artemis/tools/committee_tool.py +422 -0
- package/artemis-main/artemis/tools/diagnoser_submit_answer_tool.py +87 -0
- package/artemis-main/artemis/tools/diagnostic_tool.py +120 -0
- package/artemis-main/artemis/tools/explorer_tool.py +581 -0
- package/artemis-main/artemis/tools/history/__init__.py +398 -0
- package/artemis-main/artemis/tools/history/replay.py +120 -0
- package/artemis-main/artemis/tools/history/screenshot.py +139 -0
- package/artemis-main/artemis/tools/history/search.py +563 -0
- package/artemis-main/artemis/tools/image_processor_tool.py +124 -0
- package/artemis-main/artemis/tools/index.py +47 -0
- package/artemis-main/artemis/tools/log_tool.py +108 -0
- package/artemis-main/artemis/tools/mobile/launch_app.py +132 -0
- package/artemis-main/artemis/tools/mobile/log_utils.py +138 -0
- package/artemis-main/artemis/tools/mobile/ocr.py +202 -0
- package/artemis-main/artemis/tools/mobile/read_hierarchy.py +108 -0
- package/artemis-main/artemis/tools/mobile/read_logs.py +116 -0
- package/artemis-main/artemis/tools/mobile/search_logs.py +260 -0
- package/artemis-main/artemis/tools/object_detection_tool.py +244 -0
- package/artemis-main/artemis/tools/scratchpad.py +819 -0
- package/artemis-main/artemis/tools/system/adb_shell.py +31 -0
- package/artemis-main/artemis/tools/tool_wrapper.py +270 -0
- package/artemis-main/artemis/tools/video_tool.py +261 -0
- package/artemis-main/artemis/tools/wait_tool.py +97 -0
- package/artemis-main/artemis/utils/app_launch_utils.py +207 -0
- package/artemis-main/artemis/utils/coordinates.py +606 -0
- package/artemis-main/artemis/utils/credentials_validator.py +201 -0
- package/artemis-main/artemis/utils/cv_canvas.py +189 -0
- package/artemis-main/artemis/utils/cython_compat.py +45 -0
- package/artemis-main/artemis/utils/element_hit_test.py +80 -0
- package/artemis-main/artemis/utils/image_diff.py +335 -0
- package/artemis-main/artemis/utils/image_hash.py +80 -0
- package/artemis-main/artemis/utils/notes.py +470 -0
- package/artemis-main/artemis/utils/ocr_api.py +105 -0
- package/artemis-main/artemis/utils/ocr_xml_fusion.py +318 -0
- package/artemis-main/artemis/utils/plan_grammar.py +513 -0
- package/artemis-main/artemis/utils/python_executor.py +213 -0
- package/artemis-main/artemis/utils/startup_progress.py +60 -0
- package/artemis-main/artemis/utils/task_tree.py +1174 -0
- package/artemis-main/artemis/utils/text.py +37 -0
- package/artemis-main/artemis/utils/ui_filter.py +651 -0
- package/artemis-main/artemis/utils/video.py +685 -0
- package/artemis-main/artemis/utils/visualization.py +802 -0
- package/artemis-main/config/artemis.example.jsonc +12 -0
- package/artemis-main/mcp_server/README.md +111 -0
- package/artemis-main/mcp_server/__init__.py +21 -0
- package/artemis-main/mcp_server/__main__.py +20 -0
- package/artemis-main/mcp_server/background/__init__.py +15 -0
- package/artemis-main/mcp_server/background/task_runner.py +453 -0
- package/artemis-main/mcp_server/base.py +49 -0
- package/artemis-main/mcp_server/notifiers/__init__.py +74 -0
- package/artemis-main/mcp_server/notifiers/agentapi.py +289 -0
- package/artemis-main/mcp_server/notifiers/base.py +45 -0
- package/artemis-main/mcp_server/notifiers/composite.py +87 -0
- package/artemis-main/mcp_server/notifiers/desktop.py +108 -0
- package/artemis-main/mcp_server/notifiers/file.py +69 -0
- package/artemis-main/mcp_server/notifiers/script.py +90 -0
- package/artemis-main/mcp_server/notifiers/webhook.py +87 -0
- package/artemis-main/mcp_server/rules.md +68 -0
- package/artemis-main/mcp_server/server.py +106 -0
- package/artemis-main/mcp_server/tools/__init__.py +29 -0
- package/artemis-main/mcp_server/tools/device_state.py +107 -0
- package/artemis-main/mcp_server/tools/diagnose.py +1249 -0
- package/artemis-main/mcp_server/tools/inspect_trace.py +394 -0
- package/artemis-main/mcp_server/tools/task_manager.py +627 -0
- package/artemis-main/mcp_server/tools/task_runner.py +548 -0
- package/artemis-main/mcp_server/utils/__init__.py +15 -0
- package/artemis-main/mcp_server/utils/device_utils.py +180 -0
- package/artemis-main/mcp_server/utils/env_utils.py +65 -0
- package/artemis-main/packages/artemis-accessibility-helper/ArtemisAccessibilityHelper.apk +0 -0
- package/artemis-main/packages/artemis-accessibility-helper/app/build.gradle.kts +35 -0
- package/artemis-main/packages/artemis-accessibility-helper/app/src/main/AndroidManifest.xml +49 -0
- package/artemis-main/packages/artemis-accessibility-helper/app/src/main/java/com/artemis/helper/A11yNode.java +274 -0
- package/artemis-main/packages/artemis-accessibility-helper/app/src/main/java/com/artemis/helper/ArtemisAccessibilityService.java +227 -0
- package/artemis-main/packages/artemis-accessibility-helper/app/src/main/java/com/artemis/helper/CommandServer.java +463 -0
- package/artemis-main/packages/artemis-accessibility-helper/app/src/main/java/com/artemis/helper/DisplayUtils.java +111 -0
- package/artemis-main/packages/artemis-accessibility-helper/app/src/main/java/com/artemis/helper/GestureController.java +232 -0
- package/artemis-main/packages/artemis-accessibility-helper/app/src/main/java/com/artemis/helper/HierarchyDumper.java +832 -0
- package/artemis-main/packages/artemis-accessibility-helper/app/src/main/java/com/artemis/helper/TokenReceiver.java +36 -0
- package/artemis-main/packages/artemis-accessibility-helper/app/src/main/java/com/artemis/helper/TokenStore.java +38 -0
- package/artemis-main/packages/artemis-accessibility-helper/app/src/main/java/com/artemis/helper/XmlUtils.java +102 -0
- package/artemis-main/packages/artemis-accessibility-helper/app/src/main/res/values/strings.xml +4 -0
- package/artemis-main/packages/artemis-accessibility-helper/app/src/main/res/xml/accessibility_service_config.xml +10 -0
- package/artemis-main/packages/artemis-accessibility-helper/build.gradle.kts +3 -0
- package/artemis-main/packages/artemis-accessibility-helper/build_apk.sh +215 -0
- package/artemis-main/packages/artemis-accessibility-helper/debug.keystore +0 -0
- package/artemis-main/packages/artemis-accessibility-helper/gradle.properties +2 -0
- package/artemis-main/packages/artemis-accessibility-helper/helper_manifest.json +7 -0
- package/artemis-main/packages/artemis-accessibility-helper/settings.gradle.kts +17 -0
- package/artemis-main/packages/artemis-client/DESIGN.md +89 -0
- package/artemis-main/packages/artemis-client/README.md +112 -0
- package/artemis-main/packages/artemis-client/examples/basic.py +30 -0
- package/artemis-main/packages/artemis-client/pyproject.toml +36 -0
- package/artemis-main/packages/artemis-client/src/artemis_client/__init__.py +45 -0
- package/artemis-main/packages/artemis-client/src/artemis_client/client.py +401 -0
- package/artemis-main/packages/artemis-client/src/artemis_client/errors.py +66 -0
- package/artemis-main/packages/artemis-client/src/artemis_client/models.py +212 -0
- package/artemis-main/packages/artemis-client/src/artemis_client/py.typed +1 -0
- package/artemis-main/packages/artemis-client/src/artemis_client/transport.py +134 -0
- package/artemis-main/packages/artemis-client/tests/test_client.py +289 -0
- package/artemis-main/packages/artemis-client/tests/test_transport.py +85 -0
- package/artemis-main/pyproject.toml +259 -0
- package/artemis-main/pyright-core.json +17 -0
- package/artemis-main/scripts/check_dependency_sources.py +68 -0
- package/artemis-main/scripts/install_deps.ps1 +520 -0
- package/artemis-main/scripts/install_deps.sh +533 -0
- package/artemis-main/scripts/quality_ratchet.py +97 -0
- package/artemis-main/scripts/real_device_video_acceptance.py +483 -0
- package/artemis-main/scripts/run_edge_case_part.py +327 -0
- package/artemis-main/scripts/run_ui.py +242 -0
- package/artemis-main/scripts/start.ps1 +500 -0
- package/artemis-main/scripts/test_all_edge_cases.py +269 -0
- package/artemis-main/scripts/verify_concurrency_and_devices.py +385 -0
- package/artemis-main/setup.py +164 -0
- package/artemis-main/start.bat +35 -0
- package/artemis-main/start.sh +423 -0
- package/artemis-main/third_party/mobile_use/LICENSE +190 -0
- package/artemis-main/third_party/mobile_use/METADATA +27 -0
- package/artemis-main/third_party/mobile_use/NOTICE +12 -0
- package/artemis-main/third_party/mobile_use/__init__.py +19 -0
- package/artemis-main/third_party/mobile_use/agents/__init__.py +13 -0
- package/artemis-main/third_party/mobile_use/agents/hopper/__init__.py +13 -0
- package/artemis-main/third_party/mobile_use/agents/hopper/hopper.md +22 -0
- package/artemis-main/third_party/mobile_use/agents/hopper/hopper.py +80 -0
- package/artemis-main/third_party/mobile_use/clients/__init__.py +13 -0
- package/artemis-main/third_party/mobile_use/clients/ui_automator_client.py +482 -0
- package/artemis-main/third_party/mobile_use/config/__init__.py +13 -0
- package/artemis-main/third_party/mobile_use/config/llm.py +183 -0
- package/artemis-main/third_party/mobile_use/config/output.py +184 -0
- package/artemis-main/third_party/mobile_use/context.py +119 -0
- package/artemis-main/third_party/mobile_use/controllers/__init__.py +13 -0
- package/artemis-main/third_party/mobile_use/controllers/platform_specific_commands_controller.py +151 -0
- package/artemis-main/third_party/mobile_use/controllers/types.py +92 -0
- package/artemis-main/third_party/mobile_use/controllers/unified_controller.py +183 -0
- package/artemis-main/third_party/mobile_use/graph.py +54 -0
- package/artemis-main/third_party/mobile_use/llm_service.py +193 -0
- package/artemis-main/third_party/mobile_use/main.py +130 -0
- package/artemis-main/third_party/mobile_use/sdk/__init__.py +13 -0
- package/artemis-main/third_party/mobile_use/sdk/agent.py +1060 -0
- package/artemis-main/third_party/mobile_use/sdk/builders/__init__.py +13 -0
- package/artemis-main/third_party/mobile_use/sdk/builders/agent_config_builder.py +225 -0
- package/artemis-main/third_party/mobile_use/sdk/builders/index.py +33 -0
- package/artemis-main/third_party/mobile_use/sdk/builders/task_request_builder.py +243 -0
- package/artemis-main/third_party/mobile_use/sdk/types/__init__.py +13 -0
- package/artemis-main/third_party/mobile_use/sdk/types/agent.py +98 -0
- package/artemis-main/third_party/mobile_use/sdk/types/exceptions.py +109 -0
- package/artemis-main/third_party/mobile_use/sdk/types/task.py +234 -0
- package/artemis-main/third_party/mobile_use/testing.py +59 -0
- package/artemis-main/third_party/mobile_use/tools/__init__.py +13 -0
- package/artemis-main/third_party/mobile_use/tools/index.py +44 -0
- package/artemis-main/third_party/mobile_use/tools/mobile/__init__.py +13 -0
- package/artemis-main/third_party/mobile_use/tools/mobile/launch_app.py +89 -0
- package/artemis-main/third_party/mobile_use/tools/tool_wrapper.py +52 -0
- package/artemis-main/third_party/mobile_use/utils/__init__.py +13 -0
- package/artemis-main/third_party/mobile_use/utils/app_launch_utils.py +217 -0
- package/artemis-main/third_party/mobile_use/utils/cli_helpers.py +60 -0
- package/artemis-main/third_party/mobile_use/utils/decorators.py +158 -0
- package/artemis-main/third_party/mobile_use/utils/file.py +31 -0
- package/artemis-main/third_party/mobile_use/utils/logger.py +216 -0
- package/artemis-main/third_party/mobile_use/utils/media.py +213 -0
- package/artemis-main/third_party/mobile_use/utils/shell_utils.py +39 -0
- package/artemis-main/third_party/mobile_use/utils/video.py +398 -0
- package/artemis-main/uv.lock +4908 -0
- package/bin/android-midscene-automation.js +1 -5
- package/bin/artemis-config.mjs +15 -0
- package/bin/artemis-embedded.py +56 -0
- package/bin/start-artemis.mjs +30 -0
- package/bin/start-dev.mjs +112 -0
- package/bin/test_artemis_embedded.py +44 -0
- package/package.json +4 -2
- package/server/artemis.ts +34 -0
- package/server/http-api.ts +12 -0
- package/src/App.vue +10 -5
- package/src/api.ts +5 -0
- package/src/appium-recorder/AppiumPage.vue +1 -1
- package/src/appium-recorder/components/ComponentInspector.vue +1 -1
- package/src/appium-recorder/components/FlowNodeSearch.vue +3 -3
- package/src/appium-recorder/components/ImageCheckDialog.vue +3 -3
- package/src/appium-recorder/components/RecorderWorkspace.vue +4 -4
- package/src/appium-recorder/flow-appearance.ts +4 -4
- package/src/components/AppSidebar.vue +8 -7
- package/src/components/MidsceneMaintenanceNotice.vue +17 -0
- package/src/components/analytics/AnalysisCharts.vue +4 -4
- package/src/components/analytics/ReportAnalysis.vue +1 -1
- package/src/components/generator/TestCaseFileUpload.vue +1 -1
- package/src/components/help/HelpCenter.vue +56 -37
- package/src/pages/AiGeneratorPage.vue +1 -1
- package/src/pages/ArtemisPage.vue +72 -0
- package/src/pages/ConfigPage.vue +18 -19
- package/src/style.css +340 -121
- package/src/types.ts +1 -1
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright 2026 Google LLC
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
export interface MarkdownSegment {
|
|
18
|
+
text: string;
|
|
19
|
+
bold: boolean;
|
|
20
|
+
code?: boolean;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export interface MarkdownLine {
|
|
24
|
+
type: 'h1' | 'h2' | 'h3' | 'checked' | 'progress' | 'unchecked' | 'list-item' | 'verify' | 'assert' | 'finding' | 'text' | 'empty';
|
|
25
|
+
segments: MarkdownSegment[];
|
|
26
|
+
indent: number;
|
|
27
|
+
checkKind?: 'verify' | 'assert' | 'finding';
|
|
28
|
+
atEnd?: boolean;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export interface NoteMilestone {
|
|
32
|
+
index: number;
|
|
33
|
+
type: 'checked' | 'progress' | 'unchecked';
|
|
34
|
+
segments: MarkdownSegment[];
|
|
35
|
+
subSteps: MarkdownLine[];
|
|
36
|
+
checks: MarkdownLine[];
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export interface ParsedNote {
|
|
40
|
+
title: string | null;
|
|
41
|
+
milestones: NoteMilestone[];
|
|
42
|
+
otherLines: MarkdownLine[];
|
|
43
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import {
|
|
2
|
+
DEFAULT_EXPLORER_MODE,
|
|
3
|
+
DEFAULT_VERIFICATION_LEVEL,
|
|
4
|
+
EXPLORER_MODES,
|
|
5
|
+
VERIFICATION_LEVELS,
|
|
6
|
+
levelIndex,
|
|
7
|
+
notchPercent
|
|
8
|
+
} from './pro-tuning.model';
|
|
9
|
+
|
|
10
|
+
describe('pro tuning ladders', () => {
|
|
11
|
+
it('keeps every notch id and label unique within its ladder', () => {
|
|
12
|
+
for (const ladder of [VERIFICATION_LEVELS, EXPLORER_MODES]) {
|
|
13
|
+
expect(new Set(ladder.map((l) => l.id)).size).toBe(ladder.length);
|
|
14
|
+
expect(new Set(ladder.map((l) => l.label)).size).toBe(ladder.length);
|
|
15
|
+
}
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
it('mirrors the backend wire values', () => {
|
|
19
|
+
expect(VERIFICATION_LEVELS.map((l) => l.id)).toEqual(['off', 'final', 'checkpoints', 'strict']);
|
|
20
|
+
expect(EXPLORER_MODES.map((l) => l.id)).toEqual(['flash', 'pro', 'ultra']);
|
|
21
|
+
expect(VERIFICATION_LEVELS.map((l) => l.id)).toContain(DEFAULT_VERIFICATION_LEVEL);
|
|
22
|
+
expect(EXPLORER_MODES.map((l) => l.id)).toContain(DEFAULT_EXPLORER_MODE);
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
it('every level explains itself', () => {
|
|
26
|
+
for (const level of [...VERIFICATION_LEVELS, ...EXPLORER_MODES]) {
|
|
27
|
+
expect(level.tagline.length).toBeGreaterThan(10);
|
|
28
|
+
expect(level.latency.length).toBeGreaterThan(0);
|
|
29
|
+
expect(level.runs.length).toBeGreaterThan(0);
|
|
30
|
+
expect(level.bestFor.length).toBeGreaterThan(10);
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
it('resolves ids case-insensitively and falls back to the default', () => {
|
|
35
|
+
expect(levelIndex(VERIFICATION_LEVELS, ' STRICT ', DEFAULT_VERIFICATION_LEVEL)).toBe(3);
|
|
36
|
+
expect(levelIndex(VERIFICATION_LEVELS, 'nope', DEFAULT_VERIFICATION_LEVEL)).toBe(1);
|
|
37
|
+
expect(levelIndex(EXPLORER_MODES, null, DEFAULT_EXPLORER_MODE)).toBe(0);
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
it('maps notches onto the track', () => {
|
|
41
|
+
expect(notchPercent(0, 4)).toBe(0);
|
|
42
|
+
expect(notchPercent(3, 4)).toBe(100);
|
|
43
|
+
expect(notchPercent(1, 3)).toBe(50);
|
|
44
|
+
expect(notchPercent(9, 3)).toBe(100);
|
|
45
|
+
expect(notchPercent(0, 1)).toBe(0);
|
|
46
|
+
});
|
|
47
|
+
});
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright 2026 Google LLC
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Launcher options for `/api/run` (`verification_level`, `explorer_mode`).
|
|
19
|
+
* Keep ids in sync with `VERIFICATION_LEVEL_PRESETS` in `artemis/config/agent.py`
|
|
20
|
+
* and `EXPLORER_TIERS` in `artemis/agents/explorer/tiers.py`.
|
|
21
|
+
*/
|
|
22
|
+
|
|
23
|
+
export type VerificationLevelId = 'off' | 'final' | 'checkpoints' | 'strict';
|
|
24
|
+
export type ExplorerModeId = 'flash' | 'pro' | 'ultra';
|
|
25
|
+
|
|
26
|
+
/** One notch on a tuning slider. */
|
|
27
|
+
export interface TuningLevel<TId extends string = string> {
|
|
28
|
+
/** Wire value sent to the backend. */
|
|
29
|
+
id: TId;
|
|
30
|
+
/** Short name shown next to the slider title and as the hover card heading. */
|
|
31
|
+
label: string;
|
|
32
|
+
/** One-sentence summary shown in the hover card. */
|
|
33
|
+
tagline: string;
|
|
34
|
+
/** Plain-language time cost, e.g. "no extra time". */
|
|
35
|
+
latency: string;
|
|
36
|
+
/** Checks or searches performed at this level. */
|
|
37
|
+
runs: string[];
|
|
38
|
+
/** Checks or searches omitted at this level. */
|
|
39
|
+
skips?: string[];
|
|
40
|
+
/** When to pick this level. */
|
|
41
|
+
bestFor: string;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export const VERIFICATION_LEVELS: readonly TuningLevel<VerificationLevelId>[] = [
|
|
45
|
+
{
|
|
46
|
+
id: 'off',
|
|
47
|
+
label: 'Off',
|
|
48
|
+
tagline: 'No checking. The run ends as soon as the task looks done.',
|
|
49
|
+
latency: 'no extra time',
|
|
50
|
+
runs: [
|
|
51
|
+
'Each step is treated as finished the moment it is carried out.',
|
|
52
|
+
'You get the full action trace, but no pass / fail verdict.'
|
|
53
|
+
],
|
|
54
|
+
skips: ['Nothing is double-checked and nothing is retried.'],
|
|
55
|
+
bestFor: 'Quick tries and demos, when you only want to watch what happens.'
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
id: 'final',
|
|
59
|
+
label: 'At the end',
|
|
60
|
+
tagline: 'One check of the finished result against your goal. This is the default.',
|
|
61
|
+
latency: 'adds about 20–60 s at the end',
|
|
62
|
+
runs: [
|
|
63
|
+
'When the task finishes, the final screen, the step history and the device state are compared with what you asked for.',
|
|
64
|
+
'If the result does not match, the task goes back and tries to fix it, up to 3 times.'
|
|
65
|
+
],
|
|
66
|
+
skips: ['Nothing is checked while the task is still running.'],
|
|
67
|
+
bestFor: 'Everyday tasks: an honest pass / fail without slowing the run down.'
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
id: 'checkpoints',
|
|
71
|
+
label: 'Every step',
|
|
72
|
+
tagline: 'Each step is checked as soon as it is done, plus the final check.',
|
|
73
|
+
latency: 'a short check after each step, done in the background',
|
|
74
|
+
runs: [
|
|
75
|
+
'Every step is checked right after it completes, using the screenshots from that moment.',
|
|
76
|
+
'If a step went wrong, it gets fixed before moving on (up to 2 tries per step).',
|
|
77
|
+
'A failed test condition is written down and the task keeps going.',
|
|
78
|
+
'The final check still runs at the end.'
|
|
79
|
+
],
|
|
80
|
+
bestFor: 'Long tasks where one early mistake would spoil everything after it.'
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
id: 'strict',
|
|
84
|
+
label: 'Strict',
|
|
85
|
+
tagline: 'Every step is checked, with more retries. The first failed test stops the run.',
|
|
86
|
+
latency: 'slowest: more checks and more retries',
|
|
87
|
+
runs: [
|
|
88
|
+
'Each check takes longer and gets more attempts: 4 fixes per step and 5 at the end.',
|
|
89
|
+
'The first failed test condition stops the run immediately, with the evidence attached.'
|
|
90
|
+
],
|
|
91
|
+
bestFor: 'Release checks and regression runs, where a wrong pass is never acceptable.'
|
|
92
|
+
}
|
|
93
|
+
];
|
|
94
|
+
|
|
95
|
+
export const EXPLORER_MODES: readonly TuningLevel<ExplorerModeId>[] = [
|
|
96
|
+
{
|
|
97
|
+
id: 'flash',
|
|
98
|
+
label: 'Quick glance',
|
|
99
|
+
tagline: 'Finds buttons and text on the screen in a single look.',
|
|
100
|
+
latency: '1 look per search',
|
|
101
|
+
runs: [
|
|
102
|
+
'Something on screen is asked for by name, icon or colour and its position comes back straight away.',
|
|
103
|
+
'Several things can be looked up at once.'
|
|
104
|
+
],
|
|
105
|
+
skips: ['No zooming in and no second try.'],
|
|
106
|
+
bestFor: 'Ordinary apps with clearly labelled buttons, icons and text.'
|
|
107
|
+
},
|
|
108
|
+
{
|
|
109
|
+
id: 'pro',
|
|
110
|
+
label: 'Second look',
|
|
111
|
+
tagline: 'Takes up to 3 looks, thinking in between, before answering.',
|
|
112
|
+
latency: 'up to 3 looks per search',
|
|
113
|
+
runs: [
|
|
114
|
+
'The screen layout is read first, then the picture is searched.',
|
|
115
|
+
'If the first try misses, a different approach is tried within the 3 looks.'
|
|
116
|
+
],
|
|
117
|
+
skips: ['Still no zooming into small areas, to keep searches short.'],
|
|
118
|
+
bestFor: 'Things described by where they are ("the switch next to Wi-Fi") or with unclear labels.'
|
|
119
|
+
},
|
|
120
|
+
{
|
|
121
|
+
id: 'ultra',
|
|
122
|
+
label: 'Close-up',
|
|
123
|
+
tagline: 'Zooms into parts of the screen and takes up to 8 looks.',
|
|
124
|
+
latency: 'up to 8 looks per search (slowest)',
|
|
125
|
+
runs: [
|
|
126
|
+
'Parts of the screen can be cropped and magnified to read tiny text and crowded layouts piece by piece.',
|
|
127
|
+
'Later looks reuse the earlier ones, so they cost less time than they sound.'
|
|
128
|
+
],
|
|
129
|
+
bestFor: 'Crowded screens, tiny targets, charts and drawings, and checks where exact placement matters.'
|
|
130
|
+
}
|
|
131
|
+
];
|
|
132
|
+
|
|
133
|
+
/** Per-run tuning sent with `/api/run` for the Pro profile. */
|
|
134
|
+
export interface ProTuningOptions {
|
|
135
|
+
verificationLevel?: VerificationLevelId | string;
|
|
136
|
+
explorerMode?: ExplorerModeId | string;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/** Effective defaults reported by `GET /api/run/defaults`. */
|
|
140
|
+
export interface ProTuningDefaults {
|
|
141
|
+
verification_level?: string | null;
|
|
142
|
+
explorer_mode?: string | null;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
export const DEFAULT_VERIFICATION_LEVEL: VerificationLevelId = 'final';
|
|
146
|
+
export const DEFAULT_EXPLORER_MODE: ExplorerModeId = 'flash';
|
|
147
|
+
|
|
148
|
+
/** Index of a level id within its ladder; falls back to the default when unknown. */
|
|
149
|
+
export function levelIndex<TId extends string>(
|
|
150
|
+
ladder: readonly TuningLevel<TId>[],
|
|
151
|
+
id: string | null | undefined,
|
|
152
|
+
fallback: TId
|
|
153
|
+
): number {
|
|
154
|
+
const wanted = String(id ?? '').trim().toLowerCase();
|
|
155
|
+
const idx = ladder.findIndex((l) => l.id === wanted);
|
|
156
|
+
if (idx >= 0) return idx;
|
|
157
|
+
return Math.max(0, ladder.findIndex((l) => l.id === fallback));
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
/** Slider fill percentage for a notch index on a ladder of `count` notches. */
|
|
161
|
+
export function notchPercent(index: number, count: number): number {
|
|
162
|
+
if (count <= 1) return 0;
|
|
163
|
+
const clamped = Math.min(Math.max(index, 0), count - 1);
|
|
164
|
+
return (clamped / (count - 1)) * 100;
|
|
165
|
+
}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright 2026 Google LLC
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
export interface ModelInfo {
|
|
18
|
+
name: string;
|
|
19
|
+
id: string;
|
|
20
|
+
provider: string;
|
|
21
|
+
architecture?: string;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export interface TaskQueueItem {
|
|
25
|
+
session_id: string;
|
|
26
|
+
goal: string;
|
|
27
|
+
profile?: string;
|
|
28
|
+
status: 'pending' | 'running' | 'paused' | 'completed' | 'failed' | 'cancelled';
|
|
29
|
+
created_at?: number;
|
|
30
|
+
start_time?: number;
|
|
31
|
+
device_serial?: string | null;
|
|
32
|
+
device_id?: string | null;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export interface Session {
|
|
36
|
+
session_id: string;
|
|
37
|
+
initial_goal: string;
|
|
38
|
+
start_time: number;
|
|
39
|
+
end_time?: number;
|
|
40
|
+
status?: string;
|
|
41
|
+
video_url?: string;
|
|
42
|
+
recording_status?: 'recording' | 'finalizing' | 'processing' | 'ready' | 'failed' | 'unavailable';
|
|
43
|
+
model_info?: ModelInfo;
|
|
44
|
+
device_serial?: string | null;
|
|
45
|
+
device_id?: string | null;
|
|
46
|
+
device_info?: any;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export interface AgentStatusResponse {
|
|
50
|
+
status: 'idle' | 'running' | 'paused' | 'completed' | 'offline';
|
|
51
|
+
session_id?: string | null;
|
|
52
|
+
goal?: string | null;
|
|
53
|
+
pid?: number | null;
|
|
54
|
+
queue?: (TaskQueueItem | string)[];
|
|
55
|
+
background_tasks?: any[];
|
|
56
|
+
model_info?: ModelInfo | null;
|
|
57
|
+
paused_error?: string | null;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/** Per-run Pro tuning persisted with the session (`device_info.run_tuning`). */
|
|
61
|
+
export interface SessionRunTuning {
|
|
62
|
+
verification_level?: string | null;
|
|
63
|
+
explorer_mode?: string | null;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/** `GET /api/sessions/{id}/usage`: session-wide LLM usage and the live executor context. */
|
|
67
|
+
export interface SessionUsage {
|
|
68
|
+
session_id: string;
|
|
69
|
+
llm_calls: number;
|
|
70
|
+
prompt_tokens: number;
|
|
71
|
+
completion_tokens: number;
|
|
72
|
+
total_tokens: number;
|
|
73
|
+
cached_tokens: number;
|
|
74
|
+
/** Prompt size of the latest Operator / Flash runner call; null before the first call. */
|
|
75
|
+
operator_context_tokens: number | null;
|
|
76
|
+
operator_context_window_tokens: number;
|
|
77
|
+
operator_context_updated_at?: number | null;
|
|
78
|
+
profile?: string | null;
|
|
79
|
+
run_tuning?: SessionRunTuning | null;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
export type AgentStatus = 'idle' | 'running' | 'completed' | 'offline' | string;
|
|
83
|
+
|
|
84
|
+
export type TaskStatus = 'running' | 'paused' | 'completed' | 'pending' | 'failed' | 'cancelled';
|
|
85
|
+
|
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright 2026 Google LLC
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
export interface ActionParam {
|
|
18
|
+
key: string;
|
|
19
|
+
value: string;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export interface ActionExecution {
|
|
23
|
+
id?: string;
|
|
24
|
+
trace_id?: string;
|
|
25
|
+
agent?: string;
|
|
26
|
+
agent_name?: string;
|
|
27
|
+
action: string;
|
|
28
|
+
name?: string;
|
|
29
|
+
args?: Record<string, any>;
|
|
30
|
+
params?: Record<string, any>;
|
|
31
|
+
payload?: any;
|
|
32
|
+
pre_image_name?: string | null;
|
|
33
|
+
post_image_name?: string | null;
|
|
34
|
+
status?: 'success' | 'failed' | 'error' | 'running' | string;
|
|
35
|
+
duration?: number;
|
|
36
|
+
duration_ms?: number;
|
|
37
|
+
error?: string | null;
|
|
38
|
+
timestamp?: number;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export interface StepEvent {
|
|
42
|
+
type: 'thinking' | 'text' | 'action' | 'tool';
|
|
43
|
+
data: any;
|
|
44
|
+
timestamp?: number;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export interface LLMStreamEventData {
|
|
48
|
+
execution_id: string;
|
|
49
|
+
step_id?: string;
|
|
50
|
+
session_id?: string;
|
|
51
|
+
text?: string;
|
|
52
|
+
chunk?: string;
|
|
53
|
+
stream_type?: 'thinking' | 'text' | string;
|
|
54
|
+
isCompleted?: boolean;
|
|
55
|
+
isReset?: boolean;
|
|
56
|
+
resetMessage?: string;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export const DEFAULT_STREAM_RESET_MESSAGE =
|
|
60
|
+
'A request error occurred during output generation, typically caused by lower API priority. Retrying automatically...';
|
|
61
|
+
|
|
62
|
+
export interface StreamResetNotice {
|
|
63
|
+
id: string;
|
|
64
|
+
message: string;
|
|
65
|
+
isWaiting: boolean;
|
|
66
|
+
streamType: string;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
export interface LLMStreamResetEventData {
|
|
70
|
+
stream_exec_id?: string;
|
|
71
|
+
stream_execution_id?: string;
|
|
72
|
+
step_id?: string;
|
|
73
|
+
session_id?: string;
|
|
74
|
+
action?: 'discard' | string;
|
|
75
|
+
reason?: string;
|
|
76
|
+
category?: string;
|
|
77
|
+
error?: string;
|
|
78
|
+
message?: string;
|
|
79
|
+
retry_attempt?: number;
|
|
80
|
+
timestamp?: number;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
export interface StepItemData {
|
|
84
|
+
step_id: string;
|
|
85
|
+
step_type?: string;
|
|
86
|
+
step_number: number;
|
|
87
|
+
session_id: string;
|
|
88
|
+
timestamp: number;
|
|
89
|
+
operator_native_thinking?: string;
|
|
90
|
+
operator_raw_thinking?: string;
|
|
91
|
+
action_taken?: any;
|
|
92
|
+
generic_tools?: any[];
|
|
93
|
+
last_execution_result?: any;
|
|
94
|
+
pre_image_name?: string;
|
|
95
|
+
post_image_name?: string;
|
|
96
|
+
extra_metadata?: any;
|
|
97
|
+
token_usage?: {
|
|
98
|
+
prompt_tokens?: number;
|
|
99
|
+
completion_tokens?: number;
|
|
100
|
+
total_tokens?: number;
|
|
101
|
+
};
|
|
102
|
+
total_tokens?: number;
|
|
103
|
+
duration?: number;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
export interface StepBlock {
|
|
107
|
+
id: string;
|
|
108
|
+
type: 'llm_stream' | 'step' | 'checker';
|
|
109
|
+
timestamp: string;
|
|
110
|
+
data: any;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
export interface PhaseBlock {
|
|
114
|
+
id: string;
|
|
115
|
+
durationSeconds: number;
|
|
116
|
+
tokens?: number;
|
|
117
|
+
promptTokens?: number;
|
|
118
|
+
completionTokens?: number;
|
|
119
|
+
blocks: StepBlock[];
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/** One check item's verdict as booked by the Checker (ledger record shape). */
|
|
123
|
+
export interface CheckerVerdict {
|
|
124
|
+
item_text: string;
|
|
125
|
+
kind: 'verify' | 'assert' | string;
|
|
126
|
+
status: 'passed' | 'failed' | 'inconclusive' | 'superseded' | 'unchecked' | string;
|
|
127
|
+
evidence: string;
|
|
128
|
+
suggestion?: string;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
export interface CheckerCheckItem {
|
|
132
|
+
kind: string;
|
|
133
|
+
text: string;
|
|
134
|
+
when?: string;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* One streamed LLM turn of a multi-turn agent (the Checker's tool loop):
|
|
139
|
+
* the text of one execution id with the time its first chunk arrived, so the
|
|
140
|
+
* timeline can interleave it with the tool calls that followed. Live sessions
|
|
141
|
+
* build these from `llm_stream` chunks; historical sessions rebuild them from
|
|
142
|
+
* the persisted transcript (`PersistedCheckerStream`).
|
|
143
|
+
*/
|
|
144
|
+
export interface StreamSegment {
|
|
145
|
+
execution_id: string;
|
|
146
|
+
stream_type: 'thinking' | 'text';
|
|
147
|
+
text: string;
|
|
148
|
+
timestamp: string;
|
|
149
|
+
isCompleted?: boolean;
|
|
150
|
+
isReset?: boolean;
|
|
151
|
+
resetMessage?: string;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
/** One persisted segment of a Checker attempt's streamed reasoning (backend `check_streams.jsonl`). */
|
|
155
|
+
export interface PersistedStreamSegment {
|
|
156
|
+
execution_id: string;
|
|
157
|
+
/** `thought` is the model's reasoning stream, `answer` its visible text. */
|
|
158
|
+
role: 'thought' | 'answer' | string;
|
|
159
|
+
/** Unix seconds of the segment's first chunk. */
|
|
160
|
+
when: number;
|
|
161
|
+
text: string;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
/**
|
|
165
|
+
* One Checker attempt's persisted transcript as served by
|
|
166
|
+
* `GET /api/sessions/{id}/checks` (`streams[]`). Text is bounded server-side;
|
|
167
|
+
* `truncated` says the middle was cut out.
|
|
168
|
+
*/
|
|
169
|
+
export interface PersistedCheckerStream {
|
|
170
|
+
attempt_id: string;
|
|
171
|
+
checkpoint_id?: string;
|
|
172
|
+
phase?: string;
|
|
173
|
+
trace_id?: string | null;
|
|
174
|
+
ts?: number;
|
|
175
|
+
truncated?: boolean;
|
|
176
|
+
dropped_chars?: number;
|
|
177
|
+
segments: PersistedStreamSegment[];
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
/**
|
|
181
|
+
* Data of a `checker` timeline block: one Checker attempt (a midway checkpoint
|
|
182
|
+
* of a completed subgoal or the exit final review), or the run outcome
|
|
183
|
+
* (`phase: 'outcome'`). Streamed reasoning and tool traces land in the same
|
|
184
|
+
* `operator_*_thinking` / `generic_tools` fields as an Operator step so the
|
|
185
|
+
* timeline renders them with one code path.
|
|
186
|
+
*/
|
|
187
|
+
export interface CheckerBlockData {
|
|
188
|
+
event?: string;
|
|
189
|
+
attempt_id?: string;
|
|
190
|
+
checkpoint_id?: string;
|
|
191
|
+
phase: 'checkpoint' | 'final' | 'outcome' | string;
|
|
192
|
+
subgoal_text?: string;
|
|
193
|
+
status?: 'running' | 'done' | 'superseded' | 'unchecked' | 'error' | string;
|
|
194
|
+
trace_id?: string | null;
|
|
195
|
+
anchor_step_id?: string | null;
|
|
196
|
+
items?: CheckerCheckItem[];
|
|
197
|
+
verdicts?: CheckerVerdict[];
|
|
198
|
+
findings?: string[];
|
|
199
|
+
unmet_subgoals?: string[];
|
|
200
|
+
reverted?: boolean;
|
|
201
|
+
applicable?: boolean;
|
|
202
|
+
repairs_used?: number;
|
|
203
|
+
route?: string;
|
|
204
|
+
error?: string;
|
|
205
|
+
task_status?: 'completed' | 'partial' | 'blocked' | string;
|
|
206
|
+
tests?: { passed: number; failed: number; inconclusive: number; unchecked: number };
|
|
207
|
+
last_findings?: string[];
|
|
208
|
+
started_at?: number;
|
|
209
|
+
finished_at?: number;
|
|
210
|
+
duration?: number;
|
|
211
|
+
isCompleted?: boolean;
|
|
212
|
+
generic_tools?: any[];
|
|
213
|
+
/** Per-turn stream segments (live chunks or the persisted transcript); the flat fields below hold the joined text. */
|
|
214
|
+
stream_segments?: StreamSegment[];
|
|
215
|
+
operator_native_thinking?: string;
|
|
216
|
+
operator_raw_thinking?: string;
|
|
217
|
+
[key: string]: any;
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
/** @deprecated legacy JSON-in-stream checker verdict (pre-ledger); kept for the parser. */
|
|
221
|
+
export interface CheckerResult {
|
|
222
|
+
success: boolean;
|
|
223
|
+
reason: string;
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
export interface StepReplayFrame {
|
|
227
|
+
index: number;
|
|
228
|
+
stepNumber: number;
|
|
229
|
+
rawStepNumber?: number;
|
|
230
|
+
stepId?: string;
|
|
231
|
+
title: string;
|
|
232
|
+
imageUrl: string;
|
|
233
|
+
preImageUrl?: string | null;
|
|
234
|
+
postImageUrl?: string | null;
|
|
235
|
+
action?: any;
|
|
236
|
+
actionType?: string;
|
|
237
|
+
actionText?: string;
|
|
238
|
+
targetText?: string;
|
|
239
|
+
coords?: string;
|
|
240
|
+
status?: 'dispatched' | 'failed' | string;
|
|
241
|
+
isPost?: boolean;
|
|
242
|
+
timestamp?: number;
|
|
243
|
+
phaseId?: string;
|
|
244
|
+
summary?: string;
|
|
245
|
+
}
|
|
246
|
+
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright 2026 Google LLC
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
export type ProbeStatus = 'pass' | 'warn' | 'fail' | 'skipped';
|
|
18
|
+
|
|
19
|
+
export type ProbeCategory = 'device' | 'auth' | 'toolchain' | 'runtime';
|
|
20
|
+
|
|
21
|
+
export interface ProbeAction {
|
|
22
|
+
action_type: 'command' | 'hint' | 'link';
|
|
23
|
+
label: string;
|
|
24
|
+
payload: string;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export interface DeviceInfo {
|
|
28
|
+
serial: string;
|
|
29
|
+
state: string;
|
|
30
|
+
model: string | null;
|
|
31
|
+
product: string | null;
|
|
32
|
+
android_version: string | null;
|
|
33
|
+
screen_resolution: string | null;
|
|
34
|
+
is_locked: boolean | null;
|
|
35
|
+
is_emulator: boolean;
|
|
36
|
+
installed_packages?: string[];
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export interface AdbServerEndpoint {
|
|
40
|
+
host: string;
|
|
41
|
+
port: number;
|
|
42
|
+
socket: string;
|
|
43
|
+
identity: string;
|
|
44
|
+
mode: 'local' | 'remote';
|
|
45
|
+
is_local_default: boolean;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export interface AdbServerDevice {
|
|
49
|
+
serial: string;
|
|
50
|
+
state: string;
|
|
51
|
+
model: string | null;
|
|
52
|
+
product: string | null;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export interface AdbServerStatus {
|
|
56
|
+
endpoint: AdbServerEndpoint;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export interface AdbServerConnectionResult {
|
|
60
|
+
success: boolean;
|
|
61
|
+
message: string;
|
|
62
|
+
endpoint: AdbServerEndpoint;
|
|
63
|
+
devices: AdbServerDevice[];
|
|
64
|
+
persisted?: boolean;
|
|
65
|
+
persistence_error?: string | null;
|
|
66
|
+
error_code?: string;
|
|
67
|
+
output?: string;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
export interface AdbServerConnectionResponse {
|
|
71
|
+
connection_result: AdbServerConnectionResult;
|
|
72
|
+
report?: SystemReadinessReport;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
export interface ProbeResult {
|
|
76
|
+
id: string;
|
|
77
|
+
category: ProbeCategory;
|
|
78
|
+
title: string;
|
|
79
|
+
status: ProbeStatus;
|
|
80
|
+
is_blocker: boolean;
|
|
81
|
+
summary: string;
|
|
82
|
+
description: string;
|
|
83
|
+
metadata: Record<string, any>;
|
|
84
|
+
actions: ProbeAction[];
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
export interface SystemReadinessReport {
|
|
88
|
+
overall_ready: boolean;
|
|
89
|
+
blocker_count: number;
|
|
90
|
+
passed_blocker_count: number;
|
|
91
|
+
probes: ProbeResult[];
|
|
92
|
+
active_device: DeviceInfo | null;
|
|
93
|
+
os_type?: 'linux' | 'darwin' | 'windows' | string;
|
|
94
|
+
timestamp: number;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
export type EmulatorLaunchStage =
|
|
98
|
+
| 'idle'
|
|
99
|
+
| 'starting'
|
|
100
|
+
| 'waiting_for_adb'
|
|
101
|
+
| 'booting'
|
|
102
|
+
| 'ready'
|
|
103
|
+
| 'failed'
|
|
104
|
+
| 'stopped';
|
|
105
|
+
|
|
106
|
+
export interface EmulatorLaunchState {
|
|
107
|
+
avd_name: string | null;
|
|
108
|
+
status: EmulatorLaunchStage;
|
|
109
|
+
pid: number | null;
|
|
110
|
+
serial: string | null;
|
|
111
|
+
stage_message: string;
|
|
112
|
+
progress_percent: number;
|
|
113
|
+
started_at: number | null;
|
|
114
|
+
elapsed_seconds: number;
|
|
115
|
+
error: string | null;
|
|
116
|
+
logs: string[];
|
|
117
|
+
can_retry: boolean;
|
|
118
|
+
}
|