feat: prepare 2.2.0 with UI and execution fixes

Add dark theme, richer Markdown and readable plugin results.
Improve Android input evidence, response integrity and diagnostics.
Unify lifecycle, guidance receipts and evidence sources across clients.
Keep direct action dispatch without an added AI quota approval layer.
Align version metadata at 2.2.0 and bundle Helper 1.2.2.

Validation: 3063 backend tests before the version bump; 44 after.
Frontend: 317 tests and production build passed.
This commit is contained in:
chenmingxuan committed 2026-10-26 00:44:13 +08:00
1 parent 83bcfd54d5
commit fac4ccb760
146 files changed
+5689 -2033

No files matched your search

+29 -4
View File
@@ -70,7 +70,7 @@ def pause_running_task(session_id: str):
@router.post("/api/tasks/{session_id}/guide")
def guide_running_task(session_id: str, value: GuidanceRequest):
_live_task(session_id)
live = _live_task(session_id)
from apps.admin_console.services.exploration_service import exploration_service
from artemis.exploration.store import ExplorationConflict
@@ -93,18 +93,33 @@ def guide_running_task(session_id: str, value: GuidanceRequest):
or (control_dir(session_id) / "pause.request").exists()
):
request_resume(session_id)
return {"session_id": session_id, "status": "guidance_submitted", "guidance": guidance}
from apps.admin_console.services.task_lifecycle import guidance_details
details = guidance_details(session_id)
guidance = next(
(item for item in details["instructions"] if item["id"] == guidance.get("id")), guidance
)
return {
"session_id": session_id,
"status": "guidance_submitted",
"guidance": guidance,
"worker_active": live["process"].returncode is None,
"message": "指导已接收;接收不保证任务结束前消费,请以消费记录为准。",
}
@router.get("/api/tasks/{session_id}/guidance")
def task_guidance_history(session_id: str):
def task_guidance_history(session_id: str, details: bool = False):
from apps.admin_console.services.automation_store import identifier
try:
identifier(session_id)
except ValueError as exc:
raise HTTPException(400, str(exc)) from exc
return list_instructions(session_id)
from apps.admin_console.services.task_lifecycle import guidance_details
result = guidance_details(session_id)
return result if details else result["instructions"]
@router.post("/api/tasks/{session_id}/continue")
@@ -451,6 +466,16 @@ async def get_status():
with store.connection() as connection:
exploration_runs = exploration_metadata(connection)
for item in [*queue_data, *active_tasks]:
control_status = (
read_state(str(item["session_id"])).get("status") if item.get("session_id") else None
)
item["phase"] = {
"queued": "waiting_resources",
"resuming": "waiting_resources",
"task_paused": "paused",
"demonstrating": "demonstrating",
"analyzing_demo": "analyzing_demo",
}.get(control_status)
item.update(exploration_runs.get(str(item.get("session_id")), {}))
if job := batch_jobs.get(str(item.get("session_id"))):
item["batch_id"] = job.get("batch_id")