Install and update artemis-use with task diagnostics and plugin guidance. Preserve cross-device file receipts, review canonical reports, guard stage transitions and reduce small history summaries. Improve exploration lifecycle, request recovery and browser live connections.
56 lines
2.3 KiB
Python
56 lines
2.3 KiB
Python
from concurrent.futures import ThreadPoolExecutor
|
|
from unittest.mock import Mock
|
|
|
|
import pytest
|
|
|
|
from apps.admin_console.services.automation_store import AutomationStore
|
|
from mcp_server import task_requests
|
|
from mcp_server.tools import task_runner
|
|
|
|
|
|
@pytest.fixture
|
|
def receipts(tmp_path, monkeypatch):
|
|
store = AutomationStore(tmp_path / "automation.db")
|
|
monkeypatch.setattr(task_requests, "store", store)
|
|
return store
|
|
|
|
|
|
def test_concurrent_retries_dispatch_once(receipts):
|
|
execute = Mock(side_effect=lambda sid: {"trace_id": sid, "status": "queued"})
|
|
with ThreadPoolExecutor(max_workers=4) as pool:
|
|
results = list(
|
|
pool.map(
|
|
lambda _: task_requests.run_once("one", {"goal": "observe"}, execute), range(8)
|
|
)
|
|
)
|
|
assert execute.call_count == 1
|
|
assert len({result["trace_id"] for result in results}) == 1
|
|
assert task_requests.lookup("one")["status"] == "queued"
|
|
receipts.save_job({"session_id": results[0]["trace_id"], "status": "completed", "position": 1})
|
|
assert task_requests.lookup("one")["status"] == "completed"
|
|
assert task_requests.lookup("one")["status_scope"] == "task_queue"
|
|
|
|
|
|
def test_conflicting_content_and_lost_reply_never_repeat(receipts):
|
|
execute = Mock(side_effect=ConnectionError("after admission"))
|
|
with pytest.raises(ConnectionError):
|
|
task_requests.run_once("one", {"goal": "observe"}, execute)
|
|
receipt = task_requests.run_once("one", {"goal": "observe"}, execute)
|
|
assert receipt["submission_state"] == "unknown"
|
|
assert receipt["trace_id"]
|
|
assert execute.call_count == 1
|
|
with pytest.raises(ValueError, match="不同任务内容"):
|
|
task_requests.run_once("one", {"goal": "write"}, execute)
|
|
assert task_requests.lookup("missing")["status"] == "not_found"
|
|
|
|
|
|
def test_public_task_entry_uses_receipts_before_dispatch(receipts, monkeypatch):
|
|
execute = Mock(
|
|
side_effect=lambda **kwargs: {"trace_id": kwargs["trace_id"], "status": "queued"}
|
|
)
|
|
monkeypatch.setattr(task_runner, "_run_task", execute)
|
|
first = task_runner.mobile_run_task("observe", request_id="public-one")
|
|
second = task_runner.mobile_run_task("observe", request_id="public-one")
|
|
assert first["trace_id"] == second["trace_id"]
|
|
execute.assert_called_once()
|