feat: preserve isolated visitor agent runtime

This commit is contained in:
张胜宇
2026-09-10 17:36:39 +08:00
parent 8e36a9941d
commit ba22a2220f
10 changed files with 154 additions and 17 deletions
@@ -4,6 +4,7 @@ from unittest.mock import AsyncMock
import pytest
from app.core.contracts import AgentResult, CoreResult, RequestContext
from app.service.memory_recall_service import MemoryRecallService
from app.service.model_gateway import ModelGenerationService
from app.worker.runtime import WorkerRuntime
@@ -22,6 +23,40 @@ OUTBOX = {
}
@pytest.mark.asyncio
async def test_worker_restores_visitor_without_identity_repository_call() -> None:
"""访客异步任务只能恢复最小公开上下文,不能查询正式身份库。"""
runtime = WorkerRuntime.__new__(WorkerRuntime)
runtime.resolve_identity = AsyncMock(side_effect=AssertionError("identity lookup is forbidden"))
context = await runtime.restore_context(
actor_type="visitor", actor_id="visitor:test", trace_id="trace-test"
)
assert context.roles == ("visitor",)
assert context.permissions == ("agent:run",)
assert context.data_scope == "public"
runtime.resolve_identity.assert_not_awaited()
def test_visitor_does_not_request_memory_extraction() -> None:
"""访客消息即使包含偏好信号,也不能进入客户记忆抽取队列。"""
context = RequestContext(
user_id="visitor:test", trace_id="visitor-trace", roles=("visitor",),
permissions=("agent:run",), data_scope="public",
)
result = AgentResult(run_id="visitor-run", result=CoreResult(text="公开答复"))
requested = WorkerRuntime.should_request_memory_extraction(
context=context,
message="我的风险偏好是稳健型",
result=result,
business_events=(),
)
assert requested is False
class FakeSession(AbstractAsyncContextManager["FakeSession"]):
def __init__(self) -> None:
self.scalar = AsyncMock(return_value="event-1")