"""DM routing + super-agent retirement: a DM goes to the user-designated session (delivered like any background turn) or is parked as unrouted; the legacy super-agent surface is gone.""" import asyncio import pytest from fastapi.testclient import TestClient from coworker.connectors.base import MessageEvent, SessionSource from coworker.providers import ModelCapabilities, ProviderClient from coworker.server import create_app from coworker.server.manager import SessionManager class ScriptedProvider(ProviderClient): def complete(self, *, model, messages, tools=None, **settings): raise AssertionError("no turns expected") def capabilities(self, model): return ModelCapabilities() def _dm(text, chat_id="D1", user="bob"): return MessageEvent( text=text, source=SessionSource( platform="slack", chat_id=chat_id, user_name=user, chat_type="dm" ), ) def test_dm_with_designated_session_delivers(tmp_path, monkeypatch): mgr = SessionManager(workspace=tmp_path, provider=ScriptedProvider()) delivered: list[tuple[str, str]] = [] async def fake_deliver(session_id, message, *, source=None): delivered.append((session_id, message)) monkeypatch.setattr(mgr, "deliver_to_session", fake_deliver) mgr.set_dm_session("sDM") asyncio.run(mgr._dispatch_inbound(_dm("ping"))) assert delivered[0][0] == "sDM" assert ( "ping" in delivered[0][1] ) # the tagged text carries the message + a reply handle assert mgr.unrouted.list() == [] def test_dm_without_designation_is_parked(tmp_path): mgr = SessionManager(workspace=tmp_path, provider=ScriptedProvider()) assert mgr.dm_session() is None asyncio.run(mgr._dispatch_inbound(_dm("hello there"))) parked = mgr.unrouted.list() assert len(parked) == 1 assert parked[0]["text"] == "hello there" assert parked[0]["reason"] == "no DM session designated" def test_dm_route_endpoints(tmp_path): mgr = SessionManager(workspace=tmp_path, provider=ScriptedProvider()) client = TestClient(create_app(mgr)) assert client.get("/v1/messaging/dm-route").json()["dm_session"] is None assert ( client.post("/v1/messaging/dm-route", json={"session_id": "sX"}).json()[ "dm_session" ] == "sX" ) assert client.get("/v1/messaging/dm-route").json()["dm_session"] == "sX" # a falsy id clears it assert ( client.post("/v1/messaging/dm-route", json={"session_id": ""}).json()[ "dm_session" ] is None ) def test_dm_session_persists_across_manager_reload(tmp_path): mgr = SessionManager(workspace=tmp_path, provider=ScriptedProvider()) mgr.set_dm_session("sKeep") # a fresh manager over the same data dir reloads the prefs-backed designation reborn = SessionManager( workspace=tmp_path, data_dir=mgr._data_base, provider=ScriptedProvider() ) assert reborn.dm_session() == "sKeep" def test_superagent_surface_is_gone(tmp_path): mgr = SessionManager(workspace=tmp_path, provider=ScriptedProvider()) assert not hasattr(mgr, "superagent") assert not hasattr(mgr, "sa_register") client = TestClient(create_app(mgr)) # the retired routes 404 assert client.get("/v1/superagent").status_code == 404