feat(core): consolidate config hub, unify daemon scheduling across all entrypoints, and fix step replay

- Unified configuration and paths under artemis.config as single source of truth
- Consolidated execution across CLI, SDK, MCP, and Admin Console to default to Artemis Daemon
- Fixed frontend step replay to preserve failure steps with proper sequential numbering
- Implemented task deduplication, debouncing, and multi-device lock isolation
- Added comprehensive end-to-end multi-port integration tests for live phone and emulator
This commit is contained in:
somew1nd committed 2026-08-27 10:21:40 -07:00
1 parent e984d17635
commit 5f1ee18bc1
38 files changed
+1426 -203

No files matched your search

+2 -2
View File
@@ -16,12 +16,12 @@ from pathlib import Path
from fastapi import APIRouter, HTTPException
from fastapi.responses import FileResponse, HTMLResponse
from artemis.config import IMAGES_DIR, WORKSPACE_ROOT
try:
from admin_console.core.config import IMAGES_DIR, WORKSPACE_ROOT
from admin_console.database.repositories.session_repository import session_repo
from admin_console.services.media_service import media_service
except ImportError:
from apps.admin_console.core.config import IMAGES_DIR, WORKSPACE_ROOT
from apps.admin_console.database.repositories.session_repository import session_repo
from apps.admin_console.services.media_service import media_service
+2 -2
View File
@@ -15,12 +15,12 @@
import traceback
from fastapi import APIRouter, HTTPException
from artemis.config import WORKSPACE_ROOT
try:
from admin_console.core.config import WORKSPACE_ROOT
from admin_console.schemas.task_schema import ReplayRequest
from admin_console.replay_manager import ReplayManager
except ImportError:
from apps.admin_console.core.config import WORKSPACE_ROOT
from apps.admin_console.schemas.task_schema import ReplayRequest
from apps.admin_console.replay_manager import ReplayManager
+23 -2
View File
@@ -17,15 +17,15 @@ import time
from uuid import UUID
from fastapi import APIRouter, HTTPException
from artemis.config import DB_PATH, TRACES_PATH
try:
from admin_console.core.config import DB_PATH, TRACES_PATH
from admin_console.core.state import state
from admin_console.database.repositories.session_repository import session_repo
from admin_console.database.repositories.trace_repository import trace_repo
from admin_console.services.media_service import media_service
from admin_console.services.model_service import model_service
except ImportError:
from apps.admin_console.core.config import DB_PATH, TRACES_PATH
from apps.admin_console.core.state import state
from apps.admin_console.database.repositories.session_repository import session_repo
from apps.admin_console.database.repositories.trace_repository import trace_repo
@@ -137,6 +137,18 @@ async def list_sessions():
try:
harvested = session_repo.harvest_orphaned_sessions(orphaned_ids)
print(f"[list_sessions] Auto-harvested {harvested} orphaned running session(s).")
try:
from mcp_server.utils import trace_store
for o_id in orphaned_ids:
if trace_store.read_status(str(o_id)):
trace_store.update_trace_status(
str(o_id),
"failed",
error="Process terminated unexpectedly (auto-harvested).",
)
except Exception:
pass
except Exception as e:
print(f"[list_sessions] Failed to update orphaned sessions: {e}")
@@ -145,6 +157,15 @@ async def list_sessions():
raise HTTPException(status_code=500, detail=str(e))
@router.get("/api/sessions/{session_id}")
async def get_session_details(session_id: str):
"""Retrieve details for a single automation session."""
row = session_repo.get_session_by_id(session_id)
if not row:
raise HTTPException(status_code=404, detail=f"Session {session_id} not found")
return dict(row)
@router.get("/api/sessions/{session_id}/tree")
async def get_tree(session_id: str):
try:
+2 -2
View File
@@ -17,13 +17,13 @@ import traceback
from fastapi import APIRouter, HTTPException
from fastapi.responses import PlainTextResponse
from artemis.config import TEST_OUTPUTS_DIR
try:
from admin_console.core.config import TEST_OUTPUTS_DIR
from admin_console.database.repositories.step_repository import step_repo
from admin_console.database.repositories.trace_repository import trace_repo
from admin_console.services.media_service import media_service
except ImportError:
from apps.admin_console.core.config import TEST_OUTPUTS_DIR
from apps.admin_console.database.repositories.step_repository import step_repo
from apps.admin_console.database.repositories.trace_repository import trace_repo
from apps.admin_console.services.media_service import media_service
+1
View File
@@ -298,6 +298,7 @@ async def get_status():
"background_tasks": bg_tasks,
"queue": queue_data,
"active_tasks": active_tasks,
"model_info": model_info,
"ipc_port": state.ipc_port,
}