- Showcase UI Reorganization: * Move web UI dashboard from root directory into apps/showcase_ui/ for cleaner project structure * Add 'artemis ui' CLI command (artemis/interfaces/cli/commands/ui.py) and launcher scripts for the interactive showcase console - Standalone MCP Server & Notifiers (mcp_server/): * Implement dedicated MCP server package with mobile automation tools (device_state, inspect_trace, task_manager, task_runner) * Add multi-channel notifiers (AgentAPI, Desktop notifications, Webhooks, File output, and Composite routing) * Introduce background task runner and trace store for autonomous mobile execution monitoring - Cross-Platform Runtime & Toolchain Support: * Add artemis/platform/ with OS-specific implementations for Linux, macOS (Darwin), and Windows * Add artemis/runtime/supervisor.py for resilient process and agent runtime supervision * Add artemis/toolchain/ with dependency resolution and SDK descriptors * Add cross-platform launcher scripts (start.sh, start.bat) and installer scripts (scripts/install_deps.*) - Core Enhancements & Diagnostics: * Enhance coordinate normalization, OCR API fallback, and perception pipeline * Add credential validation (credentials_validator.py) and system diagnostics * Update bilingual documentation (README.md, README_CN.md) and architecture diagrams - Test Suite Expansion: * Add integration tests for cloud gateway, remote ADB, and Artemis login * Add unit tests covering core diagnostics, platform detection, toolchain, credentials validator, optional OCR, and MCP tools
140 lines
4.7 KiB
Python
140 lines
4.7 KiB
Python
# Copyright 2026 Google LLC
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
# you may not use this file except in compliance with the License.
|
|
# You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
# See the License for the specific language governing permissions and
|
|
# limitations under the License.
|
|
|
|
"""Toolchain and Video Recording Auxiliary Probe."""
|
|
|
|
from artemis.core.diagnostics.probes.base import BaseProbe
|
|
from artemis.core.diagnostics.schema import (
|
|
ProbeAction,
|
|
ProbeCategory,
|
|
ProbeResult,
|
|
ProbeStatus,
|
|
)
|
|
from artemis.platform import OSType, platform
|
|
from artemis.toolchain import toolchain
|
|
|
|
|
|
class ToolchainProbe(BaseProbe):
|
|
"""Probe checking required multimedia and video recording toolchains (ffmpeg, scrcpy)."""
|
|
|
|
@property
|
|
def probe_id(self) -> str:
|
|
return "toolchain"
|
|
|
|
@property
|
|
def category(self) -> ProbeCategory:
|
|
return ProbeCategory.TOOLCHAIN
|
|
|
|
@property
|
|
def is_blocker(self) -> bool:
|
|
return False
|
|
|
|
async def probe(self) -> ProbeResult:
|
|
ffmpeg_path = toolchain.resolve("ffmpeg", force_refresh=True)
|
|
scrcpy_path = toolchain.resolve("scrcpy", force_refresh=True)
|
|
|
|
tools_installed = []
|
|
tools_missing = []
|
|
if ffmpeg_path:
|
|
tools_installed.append("FFmpeg")
|
|
else:
|
|
tools_missing.append("FFmpeg")
|
|
|
|
if scrcpy_path:
|
|
tools_installed.append("scrcpy")
|
|
else:
|
|
tools_missing.append("scrcpy")
|
|
|
|
metadata = {
|
|
"ffmpeg": ffmpeg_path is not None,
|
|
"scrcpy": scrcpy_path is not None,
|
|
"ffmpeg_path": ffmpeg_path,
|
|
"scrcpy_path": scrcpy_path,
|
|
"tools_installed": tools_installed,
|
|
"tools_missing": tools_missing,
|
|
}
|
|
|
|
if ffmpeg_path and scrcpy_path:
|
|
return ProbeResult(
|
|
id=self.probe_id,
|
|
category=self.category,
|
|
title="Video Recording Toolchain",
|
|
status=ProbeStatus.PASS,
|
|
is_blocker=self.is_blocker,
|
|
summary="Ready (FFmpeg + scrcpy)",
|
|
description=f"FFmpeg ({ffmpeg_path}) and scrcpy ({scrcpy_path}) are available. Live stream and high-speed video replays are active.",
|
|
metadata=metadata,
|
|
actions=[
|
|
ProbeAction(
|
|
action_type="hint",
|
|
label="Toolchain Active",
|
|
payload="FFmpeg and scrcpy are installed and active.",
|
|
)
|
|
],
|
|
)
|
|
|
|
missing_str = " & ".join(tools_missing)
|
|
actions = []
|
|
|
|
if platform.os_type == OSType.WINDOWS:
|
|
actions.append(
|
|
ProbeAction(
|
|
action_type="command",
|
|
label="Install via WinGet",
|
|
payload="winget install Gyan.FFmpeg Genymobile.scrcpy",
|
|
)
|
|
)
|
|
actions.append(
|
|
ProbeAction(
|
|
action_type="command",
|
|
label="Run PowerShell Setup",
|
|
payload="powershell -ExecutionPolicy Bypass -File scripts/install_deps.ps1",
|
|
)
|
|
)
|
|
elif platform.os_type == OSType.MACOS:
|
|
actions.append(
|
|
ProbeAction(
|
|
action_type="command",
|
|
label="Install via Homebrew",
|
|
payload="brew install ffmpeg scrcpy",
|
|
)
|
|
)
|
|
else:
|
|
actions.append(
|
|
ProbeAction(
|
|
action_type="command",
|
|
label="Install on Linux",
|
|
payload="sudo apt-get install -y ffmpeg scrcpy",
|
|
)
|
|
)
|
|
actions.append(
|
|
ProbeAction(
|
|
action_type="command",
|
|
label="One-Click Install Script",
|
|
payload="bash scripts/install_deps.sh",
|
|
)
|
|
)
|
|
|
|
return ProbeResult(
|
|
id=self.probe_id,
|
|
category=self.category,
|
|
title="Video Recording Toolchain",
|
|
status=ProbeStatus.FAIL,
|
|
is_blocker=self.is_blocker,
|
|
summary=f"Missing {missing_str}",
|
|
description=f"Video toolchain is required for screen streaming and test replay recording. Missing: {missing_str}.",
|
|
metadata=metadata,
|
|
actions=actions,
|
|
)
|