feat: add node coverage and improve investigation presentation
Generic Container CI/CD / test-build-publish (push) Failing after 1m50s
Server CI/CD v2 / build-test-publish-and-deploy (push) Failing after 1m51s

This commit is contained in:
2026-11-02 15:23:34 +08:00
parent 05183aff93
commit f2cfce8192
25 changed files with 588 additions and 21 deletions
+36
View File
@@ -598,6 +598,42 @@ async def test_unified_commands_record_canonical_events_without_mutating_task(pa
assert len(repository.events) == 1 and repository.task["revision"] == task["revision"]
@pytest.mark.anyio
async def test_saved_mcp_coverage_envelope_publishes_groups_without_agent_geometry():
from fastapi.encoders import jsonable_encoder
from app.services.node_coverage import build_node_coverage
now = datetime(2026, 10, 10, tzinfo=timezone.utc)
context = _context()
task = _task_document(context, now, lease=now + timedelta(minutes=1))
repository = RunTaskRepository(task, _active_run(task, now))
service = OperationalTaskService(repository, context, set(), clock=lambda: now)
coverage = build_node_coverage(
[{"group_id": "one", "title": "第一组", "node_ids": ["A"]},
{"group_id": "two", "title": "第二组", "node_ids": ["A", "B"]}],
[{"id": "A", "longitude": 117.24, "latitude": 32.75},
{"id": "B", "longitude": 117.241, "latitude": 32.75}],
[],
)
snapshot = TaskDataSnapshot(
source="generate_node_coverage", source_ref="mcp:node-coverage", queried_at=now,
origin="system_data", truncated=False,
data=jsonable_encoder({"source": "generate_node_coverage", "data": {
"result": {"map_payload": coverage["map_payload"]},
}}),
)
evidence, _ = await service.record_data_snapshot(task["task_id"], snapshot)
await service.publish_presentation_event(task["task_id"], TaskPresentationEventCommand(
request_id=uuid4(), run_id=repository.run["run_id"], source_session_id="session-1",
command={"action": "set_overlay", "overlay_id": "isolation-coverage", "title": "节点覆盖示意",
"mode": "geometry", "evidence_id": evidence.evidence_id},
))
features = repository.events[-1]["metadata"]["command"]["data"]["features"]
assert {feature["properties"]["coverage_group"] for feature in features} == {"one", "two"}
assert all(feature["properties"]["display_only"] for feature in features)
assert [feature["properties"]["node_count"] for feature in features] == [1, 2]
@pytest.mark.anyio
async def test_overlay_event_uses_stored_coordinates_and_rejects_untrusted_or_oversized_data():
now = datetime(2026, 10, 10, tzinfo=timezone.utc)