Drop dead admin/chat protocol fields and fix MCP specialist docs.

Align AIA_MCP_SPECIALISTS defaults, remove inherit/perm-ban/wire-effective noise from admin APIs, and stop echoing confirm_strategy/plan_agent_version on chat mode endpoints.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
oliver 2026-08-11 03:13:59 +08:00
parent 454c841af7
commit 8fce428540
12 changed files with 47 additions and 169 deletions

View file

@ -172,46 +172,31 @@ class AdminChatStreamAsyncTaskTests(unittest.TestCase):
payload = json.loads(str(task.payload or "{}"))
self.assertEqual(str(payload.get("selected_specialist") or ""), "generalist")
def test_user_mode_always_clears_plan_agent_v2_flag(self) -> None:
"""Plan mode removed: POST /user-mode always keeps AIA_EXPERT_PLAN_AGENT_V2_ENABLED=0."""
def test_user_mode_roundtrip_without_legacy_fields(self) -> None:
token = self._login()
headers = {
"authorization": f"Bearer {token}",
"accept": "application/json",
"content-type": "application/json",
}
r2 = self.client.post(
r = self.client.post(
"/admin/api/chat/user-mode",
headers=headers,
json={
"interaction_mode": "expert",
"specialist": "generalist",
"confirm_strategy": "strict",
"confirm_strategy": "auto",
"plan_agent_version": "v2",
},
)
self.assertEqual(r2.status_code, 200)
body2 = r2.json()
self.assertTrue(body2.get("ok"), body2)
self.assertFalse(body2.get("plan_agent_v2_globally_enabled"), body2)
self.assertEqual(str(body2.get("plan_agent_version") or ""), "v1")
self.assertEqual(str(self.store.get_setting("AIA_EXPERT_PLAN_AGENT_V2_ENABLED") or "").strip(), "0")
r1 = self.client.post(
"/admin/api/chat/user-mode",
headers=headers,
json={
"interaction_mode": "expert",
"specialist": "generalist",
"confirm_strategy": "strict",
"plan_agent_version": "v1",
},
)
self.assertEqual(r1.status_code, 200)
body1 = r1.json()
self.assertTrue(body1.get("ok"), body1)
self.assertFalse(body1.get("plan_agent_v2_globally_enabled"), body1)
self.assertEqual(str(self.store.get_setting("AIA_EXPERT_PLAN_AGENT_V2_ENABLED") or "").strip(), "0")
self.assertEqual(r.status_code, 200)
body = r.json()
self.assertTrue(body.get("ok"), body)
self.assertEqual(str(body.get("interaction_mode") or ""), "expert")
self.assertEqual(str(body.get("specialist") or ""), "generalist")
self.assertNotIn("confirm_strategy", body)
self.assertNotIn("plan_agent_version", body)
self.assertNotIn("plan_agent_v2_globally_enabled", body)
def test_session_mode_setting_roundtrip(self) -> None:
token = self._login()
@ -226,8 +211,6 @@ class AdminChatStreamAsyncTaskTests(unittest.TestCase):
json={
"interaction_mode": "expert",
"specialist": "generalist",
"confirm_strategy": "auto",
"plan_agent_version": "v1",
},
)
resp1 = self.client.post(
@ -242,7 +225,8 @@ class AdminChatStreamAsyncTaskTests(unittest.TestCase):
# Session POST ignores interaction/specialist; user menu still has generalist.
self.assertEqual(str(body1.get("specialist") or ""), "generalist")
self.assertEqual(str(body1.get("memory_mode") or ""), "store_only")
self.assertEqual(str(body1.get("confirm_strategy") or ""), "strict")
self.assertNotIn("confirm_strategy", body1)
self.assertNotIn("plan_agent_version", body1)
resp2 = self.client.get(
f"/admin/api/chat/sessions/{self.session_id}/mode",
@ -254,7 +238,8 @@ class AdminChatStreamAsyncTaskTests(unittest.TestCase):
self.assertEqual(str(body2.get("interaction_mode") or ""), "expert")
self.assertEqual(str(body2.get("specialist") or ""), "generalist")
self.assertEqual(str(body2.get("memory_mode") or ""), "store_only")
self.assertEqual(str(body2.get("confirm_strategy") or ""), "strict")
self.assertNotIn("confirm_strategy", body2)
self.assertNotIn("plan_agent_version", body2)
def test_messages_use_session_mode_when_payload_omits_mode(self) -> None:
token = self._login()
@ -269,8 +254,6 @@ class AdminChatStreamAsyncTaskTests(unittest.TestCase):
json={
"interaction_mode": "expert",
"specialist": "ops",
"confirm_strategy": "strict",
"plan_agent_version": "v1",
},
)
_ = self.client.post(
@ -308,8 +291,6 @@ class AdminChatStreamAsyncTaskTests(unittest.TestCase):
json={
"interaction_mode": "expert",
"specialist": "ops",
"confirm_strategy": "strict",
"plan_agent_version": "v1",
},
)
self.assertEqual(pref.status_code, 200)
@ -336,7 +317,8 @@ class AdminChatStreamAsyncTaskTests(unittest.TestCase):
self.assertEqual(str(mode_body.get("specialist") or ""), "ops")
self.assertEqual(str(mode_body.get("memory_mode") or ""), "default")
self.assertEqual(str(mode_body.get("execution_mode") or ""), "agent")
self.assertEqual(str(mode_body.get("confirm_strategy") or ""), "strict")
self.assertNotIn("confirm_strategy", mode_body)
self.assertNotIn("plan_agent_version", mode_body)
gm = mode_body.get("global_menu") if isinstance(mode_body.get("global_menu"), dict) else {}
self.assertEqual(str(gm.get("interaction_mode") or ""), "expert")
self.assertEqual(str(gm.get("specialist") or ""), "ops")
@ -369,7 +351,7 @@ class AdminChatStreamAsyncTaskTests(unittest.TestCase):
self.assertEqual(str(mode_body.get("interaction_mode") or ""), "expert")
self.assertEqual(str(mode_body.get("specialist") or ""), "generalist")
self.assertEqual(str(mode_body.get("memory_mode") or ""), "default")
self.assertEqual(str(mode_body.get("confirm_strategy") or ""), "strict")
self.assertNotIn("confirm_strategy", mode_body)
def test_admin_dynamic_expert_stats_endpoint(self) -> None:
token = self._login()

View file

@ -52,14 +52,15 @@ class AdminToolsSelfCheckApiTests(unittest.TestCase):
summary = dict(body.get("summary") or {})
self.assertIn("total_internal_tools", summary)
self.assertIn("total_wired_tools", summary)
self.assertIn("total_perm_ban_9999", summary)
self.assertNotIn("total_perm_ban_9999", summary)
items = list(body.get("items") or [])
self.assertTrue(items)
one = dict(items[0] if items else {})
self.assertIn("role", one)
self.assertIn("role_mode", one)
self.assertIn("wired_count", one)
self.assertIn("policy_perm_ban_9999", one)
self.assertNotIn("policy_perm_ban_9999", one)
self.assertNotIn("wire_policy_effective", one)
if __name__ == "__main__":

View file

@ -34,51 +34,32 @@ def test_mode_session_and_user_prefs_merge_for_gateway() -> None:
user_id="u1",
interaction_mode="expert",
specialist="generalist",
confirm_strategy="auto",
plan_agent_version="v2",
)
interaction_mode, specialist, memory_mode, execution_mode, confirm_strategy, plan_agent_version = (
_resolve_mode_settings(store=store, tenant_id="t1", user_id="u1", session_id="s1")
interaction_mode, specialist, memory_mode, execution_mode = _resolve_mode_settings(
store=store, tenant_id="t1", user_id="u1", session_id="s1"
)
assert interaction_mode == "expert"
assert specialist == "generalist"
assert memory_mode == "default"
assert execution_mode == "plan"
assert confirm_strategy == "strict"
assert plan_agent_version == "v1"
def test_mode_session_defaults_when_session_keys_missing() -> None:
store = _DummyStore()
store.set_setting("chat.user.mode.t1.u1.confirm_strategy", "invalid")
interaction_mode, specialist, memory_mode, execution_mode, confirm_strategy, plan_agent_version = (
_resolve_mode_settings(store=store, tenant_id="t1", user_id="u1", session_id="s1")
interaction_mode, specialist, memory_mode, execution_mode = _resolve_mode_settings(
store=store, tenant_id="t1", user_id="u1", session_id="s1"
)
assert interaction_mode == "expert"
assert specialist == "generalist"
assert memory_mode == "default"
assert execution_mode == "agent"
assert confirm_strategy == "strict"
assert plan_agent_version == "v1"
def test_invalid_execution_mode_on_session_dialog_falls_back_to_agent() -> None:
store = _DummyStore()
store.set_setting("chat.session.mode.t1.u1.s1.execution_mode", "invalid")
interaction_mode, specialist, memory_mode, execution_mode, confirm_strategy, plan_agent_version = (
_resolve_mode_settings(store=store, tenant_id="t1", user_id="u1", session_id="s1")
interaction_mode, specialist, memory_mode, execution_mode = _resolve_mode_settings(
store=store, tenant_id="t1", user_id="u1", session_id="s1"
)
assert execution_mode == "agent"
assert interaction_mode == "expert"
def test_legacy_confirm_and_plan_agent_prefs_coerce_to_defaults() -> None:
store = _DummyStore()
store.set_setting("chat.user.mode.t1.u1.confirm_strategy", "auto")
store.set_setting("chat.user.mode.t1.u1.plan_agent_version", "v2")
interaction_mode, specialist, memory_mode, execution_mode, confirm_strategy, plan_agent_version = (
_resolve_mode_settings(store=store, tenant_id="t1", user_id="u1", session_id="s1")
)
assert confirm_strategy == "strict"
assert plan_agent_version == "v1"
assert specialist == "generalist"