mirror of
https://github.com/bytedance/deer-flow.git
synced 2026-09-14 16:08:41 +00:00
* feat(mcp): add durable task runtime foundation * fix(chart): sync embedded config version * fix(mcp): isolate task polls during shutdown * feat(mcp): track consecutive poll errors on mcp_tasks poll_attempt_count grows on every claim (successful polls included), so it cannot drive a failure backoff without misjudging normal long tasks. Add consecutive_poll_error_count: incremented when a claim is released after a poll error, reset to zero by any applied snapshot. The backoff/terminal policy that consumes it lands with the first concrete driver. * fix(mcp): harden durable task lifecycle * fix(mcp): preserve tracked task on dedup conflict --------- Co-authored-by: Willem Jiang <willem.jiang@gmail.com>
28 lines
1.0 KiB
Python
28 lines
1.0 KiB
Python
import pytest
|
|
|
|
from deerflow.mcp.tasks import McpTaskDriverRegistry, TaskSnapshot, TaskStatus, TaskSubmission
|
|
|
|
|
|
def test_task_snapshot_normalizes_string_statuses():
|
|
snapshot = TaskSnapshot(status="working") # type: ignore[arg-type]
|
|
assert snapshot.status is TaskStatus.WORKING
|
|
assert snapshot.is_pollable is True
|
|
|
|
|
|
def test_input_required_snapshot_requires_payload():
|
|
with pytest.raises(ValueError, match="requires an input_required payload"):
|
|
TaskSnapshot(status=TaskStatus.INPUT_REQUIRED)
|
|
|
|
|
|
def test_submission_rejects_empty_remote_id():
|
|
with pytest.raises(ValueError, match="remote_task_id must not be empty"):
|
|
TaskSubmission(remote_task_id=" ", snapshot=TaskSnapshot(status=TaskStatus.SUBMITTED))
|
|
|
|
|
|
def test_driver_registry_rejects_duplicate_names():
|
|
registry = McpTaskDriverRegistry()
|
|
driver = object()
|
|
registry.register("ordinary", driver) # type: ignore[arg-type]
|
|
with pytest.raises(ValueError, match="already registered"):
|
|
registry.register("ordinary", driver) # type: ignore[arg-type]
|