diff --git a/.env.example b/.env.example index 2cce48c..3888cbc 100644 --- a/.env.example +++ b/.env.example @@ -62,6 +62,10 @@ OCR_API_KEY= ADB_HOST=127.0.0.1 ADB_PORT=5037 # ADB_DEVICE_SERIAL= +# 自动发现本机模拟器,并重连通过网页连接过的 TCP 设备;不扫描局域网。 +ARTEMIS_ADB_AUTO_CONNECT=true +ARTEMIS_ADB_DISCOVERY_INTERVAL_SECONDS=10 +ARTEMIS_ADB_DISCOVERY_TIMEOUT_SECONDS=5 ARTEMIS_KEEP_DEVICE_AWAKE=true ARTEMIS_HIERARCHY_BACKEND=auto ARTEMIS_HELPER_AUTO_INSTALL=true diff --git a/AGENTS.md b/AGENTS.md index 5680781..fb1f206 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -27,7 +27,7 @@ | 核心类型检查 | `uv run pyright --project pyright-core.json` | | 源码打包 | `uv run --no-sync python scripts/package_source.py` | -Windows 首次安装使用 `start.bat`,国内镜像使用 `start-cn.bat`。开发中需要保留当前源码时传入 `-SkipUpdate`,避免启动脚本拉取远端更新。 +Windows 首次安装使用 `start.bat`,国内镜像使用 `start-cn.bat`。启动只提示源码更新;升级使用 `update.bat` / `update-cn.bat`,会终止本项目运行进程。开发中可传入 `-SkipUpdate` 跳过更新提示。 ## Key Paths @@ -58,6 +58,7 @@ Windows 首次安装使用 `start.bat`,国内镜像使用 `start-cn.bat`。开 - 新增可调参数集中进入配置层,并更新环境示例、网页/MCP 入口和必要文档,避免散落硬编码。 - MCP 工具增删时同步工具注册、CLI 安装白名单、测试、Skill 和能力文档。 - Windows PowerShell 启动脚本保持兼容 Windows PowerShell 5.1,避免编码导致解析失败。升级只做 Git 快进,保护已有配置和本地修改。 +- `update*.bat` 保持精简的 ASCII 入口;升级程序及其辅助脚本先复制到项目外执行。更新后通过新版 `start.ps1 -PrepareOnly -SkipUpdate` 同步环境,保留此内部调用约定,避免继续运行旧版安装函数。 - 前端遵循现有简体中文文案与视觉样式;不直接编辑构建产物。 ## Definition of Done diff --git a/README.md b/README.md index 0fadcd9..025267a 100644 --- a/README.md +++ b/README.md @@ -31,7 +31,7 @@ cd Artemis-Eapil ```powershell .\start-cn.bat -SetupOnly # 准备环境并安装/更新 Codex MCP .\start.bat -Port 8001 # 指定端口 -.\start.bat -SkipUpdate # 跳过 Git 源码更新检查 +.\start.bat -SkipUpdate # 跳过源码更新提示 .\start.bat -SkipMcpSync # MCP 配置异常时,仅启动网页 ``` @@ -39,7 +39,7 @@ cd Artemis-Eapil ### macOS / Linux -克隆仓库后在项目目录执行 `./start.sh`。国内镜像入口和启动时自动更新目前由 Windows 脚本提供。 +克隆仓库后在项目目录执行 `./start.sh`。国内镜像入口和独立升级脚本目前由 Windows 提供。 ## 配置与使用 @@ -72,9 +72,11 @@ uv run artemis mcp --install codex ## 更新与排错 -Windows 用户再次运行一键脚本时,会先检查 Git 上游;即使 `start.bat` 或 `start-cn.bat` 本身被更新,也会重新启动新版脚本,再检查项目依赖、前端构建并同步 Codex MCP。源码只做快进更新。本地修改、分支分叉或网络认证失败时保留本地版本;有任务执行或排队时停止更新启动。Codex 配置同步失败会明确停止启动,可使用 `-SkipMcpSync` 仅启动网页。更新后需在 Codex 中重新加载 MCP。 +启动脚本只检查并提示源码更新,不自动拉取。升级运行 **`.\update.bat`**,国内网络运行 **`.\update-cn.bat`**;支持 `-Help`。升级会终止当前项目的 ARTEMIS 服务、MCP 和任务进程,然后快进更新源码,同步依赖、网页构建及 Codex MCP。升级程序先复制到项目外运行,避免更新正在执行的脚本;其他项目、Codex 本身、模拟器和共享 ADB 服务不会被终止。完成后重新启动 ARTEMIS,并在 Codex 中重载 MCP。 -1.1.1 及更新版本的发布 ZIP 含浅层 Git 工作树,解压后再次运行一键脚本即可检查更新。1.1.0 及更早 ZIP 不含 Git 信息,无法自行拉取;需要下载新版源码包重新解压一次,之后即可自动更新。遇到启动或设备问题,在项目目录运行 `uv run artemis doctor`。 +本地修改、分支分叉或网络认证失败会停止升级,保留现有文件;`.env`、密钥和历史资料不会清空。启动/升级中的依赖或 MCP 同步失败会明确报错,修复后可重新执行;仅启动网页时可用 `-SkipMcpSync`。 + +1.1.1 及更新版本的发布 ZIP 含浅层 Git 工作树;包含独立升级入口的新版源码包可直接用上述脚本升级。1.1.0 及更早 ZIP 不含 Git 信息,需改用 Git 克隆或新版源码包。遇到启动或设备问题,在项目目录运行 `uv run artemis doctor`。 更多说明:[批量任务与报告](docs/automation-workspace.md) · [AI 接入](docs/ai-automation.md) · [开发协作指南](AGENTS.md) diff --git a/apps/admin_console/routers/tasks.py b/apps/admin_console/routers/tasks.py index 3818dfe..d1f928d 100644 --- a/apps/admin_console/routers/tasks.py +++ b/apps/admin_console/routers/tasks.py @@ -274,7 +274,12 @@ async def get_run_defaults(): async def list_devices(): """List all connected Android devices with their busy / idle status.""" devices = await device_pool.list_devices_async() - return {"devices": [d.to_dict() for d in devices]} + from artemis.runtime.adb_discovery import adb_device_discovery + + return { + "devices": [d.to_dict() for d in devices], + "automatic_connections": adb_device_discovery.results.copy(), + } @router.post("/api/stop") diff --git a/apps/admin_console/services/model_settings_service.py b/apps/admin_console/services/model_settings_service.py index a94ada3..87369e4 100644 --- a/apps/admin_console/services/model_settings_service.py +++ b/apps/admin_console/services/model_settings_service.py @@ -166,6 +166,13 @@ def persist_environment(values: dict[str, str]) -> None: class CapabilitySettings(BaseModel): + adb_auto_connect: bool = Field(default_factory=lambda: settings.ARTEMIS_ADB_AUTO_CONNECT) + adb_discovery_interval_seconds: float = Field( + default_factory=lambda: settings.ARTEMIS_ADB_DISCOVERY_INTERVAL_SECONDS, ge=1, le=300 + ) + adb_discovery_timeout_seconds: float = Field( + default_factory=lambda: settings.ARTEMIS_ADB_DISCOVERY_TIMEOUT_SECONDS, gt=0, le=30 + ) video_enabled: bool = False recording_enabled: bool = False outputter_enabled: bool = True @@ -206,6 +213,9 @@ def get_capability_settings() -> CapabilitySettings: def save_capability_settings(update: CapabilitySettings) -> CapabilitySettings: values = { + "ARTEMIS_ADB_AUTO_CONNECT": update.adb_auto_connect, + "ARTEMIS_ADB_DISCOVERY_INTERVAL_SECONDS": update.adb_discovery_interval_seconds, + "ARTEMIS_ADB_DISCOVERY_TIMEOUT_SECONDS": update.adb_discovery_timeout_seconds, "ARTEMIS_VIDEO_ENABLED": update.video_enabled, "ARTEMIS_RECORDING_ENABLED": update.recording_enabled, "ARTEMIS_OUTPUTTER_ENABLED": update.outputter_enabled, diff --git a/apps/showcase_ui/package-lock.json b/apps/showcase_ui/package-lock.json index 9627517..8a6feeb 100644 --- a/apps/showcase_ui/package-lock.json +++ b/apps/showcase_ui/package-lock.json @@ -1,12 +1,12 @@ { "name": "artemis-showcase-ui", - "version": "1.3.3", + "version": "1.4.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "artemis-showcase-ui", - "version": "1.3.3", + "version": "1.4.0", "dependencies": { "@angular/cdk": "^22.1.5", "@angular/common": "^22.1.4", diff --git a/apps/showcase_ui/package.json b/apps/showcase_ui/package.json index 663b896..a2eae17 100644 --- a/apps/showcase_ui/package.json +++ b/apps/showcase_ui/package.json @@ -1,6 +1,6 @@ { "name": "artemis-showcase-ui", - "version": "1.3.3", + "version": "1.4.0", "scripts": { "ng": "ng", "start": "ng serve --proxy-config proxy.conf.json", diff --git a/apps/showcase_ui/src/app/components/model-settings/capability-settings.component.ts b/apps/showcase_ui/src/app/components/model-settings/capability-settings.component.ts index 652b012..e6b676e 100644 --- a/apps/showcase_ui/src/app/components/model-settings/capability-settings.component.ts +++ b/apps/showcase_ui/src/app/components/model-settings/capability-settings.component.ts @@ -4,6 +4,9 @@ import { HttpClient } from '@angular/common/http'; import { finalize } from 'rxjs'; interface Capabilities { + adb_auto_connect: boolean; + adb_discovery_interval_seconds: number; + adb_discovery_timeout_seconds: number; video_enabled: boolean; recording_enabled: boolean; outputter_enabled: boolean; @@ -24,6 +27,8 @@ interface Capabilities {

功能开关

按需启用,保存后对新任务生效。

+