Ctrl K
ComunidadGuías…

test_team_read_discovery_isolated.py

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
"""Team mention discovery contracts without importing or starting the server."""
from __future__ import annotations

import ast
import hashlib
from pathlib import Path
import unittest


def extracted():
    names = {
        "PROVIDER_TOOL_DESCRIPTION", "PROVIDER_TOOL_READ_ONLY_COMMANDS",
        "MAX_PROVIDER_STATIC_INSTRUCTIONS_CHARS", "PROVIDER_AUTHORITY_USAGE_INSTRUCTIONS",
        "CROSS_CHAT_DELIVERY_INSTRUCTIONS", "PROVIDER_THREAD_INSTRUCTION_ADDENDUM",
        "CLAUDE_PROMPT_PRELUDE", "CODEX_PROMPT_PRELUDE", "CODEX_THREAD_POLICY_VERSION",
        "provider_turn_may_read_team", "provider_tool_call_is_read_only",
        "codex_thread_instructions", "codex_thread_instruction_hash",
    }
    tree = ast.parse(Path(__file__).with_name("agent_server.py").read_text())
    nodes = [ast.ImportFrom(module="__future__", names=[ast.alias(name="annotations")], level=0)]
    for node in tree.body:
        if isinstance(node, ast.Assign) and any(
            isinstance(target, ast.Name) and target.id in names for target in node.targets
        ):
            nodes.append(node)
        elif isinstance(node, ast.FunctionDef) and node.name in names:
            nodes.append(node)
    namespace = {
        "CLAUDE_PROVIDER_MCP_TOOL_NAME": "mcp__agentsdock_internal_provider__run",
        "hashlib": hashlib,
        "codex_manifest_path": lambda _: "/isolated/artifact-manifest.json",
        "terminal_session_name": lambda _: "isolated-terminal",
        "codex_user_developer_instructions": lambda: "",
        "session_prompt_addendum": lambda _: "",
    }
    exec(compile(ast.fix_missing_locations(ast.Module(body=nodes, type_ignores=[])),
                 "<isolated-team-read-discovery>", "exec"), namespace)
    return namespace


class TeamReadDiscoveryTests(unittest.TestCase):
    @classmethod
    def setUpClass(cls):
        cls.ns = extracted()

    def test_tool_discovery_names_native_team_reads_not_external_connectors(self):
        description = self.ns["PROVIDER_TOOL_DESCRIPTION"]
        for text in ("@@bulletin", "@@NAME", "not Slack or email", "helper=team",
                     "[mentions]", "[bulletin, --mention, N]", "[inbox, --mention, N]",
                     "[read, MESSAGE_ID, --team, TEAM_ID]",
                     "no manual Route", "must not send or post"):
            with self.subTest(text=text):
                self.assertIn(text, description)

    def test_both_providers_get_the_same_bounded_static_read_guidance(self):
        shared = self.ns["PROVIDER_THREAD_INSTRUCTION_ADDENDUM"]
        self.assertLess(len(shared), self.ns["MAX_PROVIDER_STATIC_INSTRUCTIONS_CHARS"])
        for name in ("CLAUDE_PROMPT_PRELUDE", "CODEX_PROMPT_PRELUDE"):
            with self.subTest(provider=name):
                prelude = self.ns[name]
                self.assertTrue(prelude.endswith(shared))
                formatted = prelude.format(manifest_path="/isolated/manifest", terminal_session="isolated", chat_id="test")
                for text in ("`bulletin --mention N` for @@bulletin", "`inbox --mention N`",
                             "`inbox --from NAME`", "do not substitute it for a selected mention",
                             "Manual routing into the chat is not required",
                             "must not call send, reply, or publish", "not an instruction to post",
                             "has_more", "--after next_after_sequence", "do not poll"):
                    self.assertIn(text, formatted)

    def test_bulletin_alias_is_read_only_but_team_writes_are_not(self):
        classify = self.ns["provider_tool_call_is_read_only"]
        for args in (["mentions"], ["bulletin"], ["feed"], ["inbox", "--mention", "1"],
                     ["inbox", "--from", "@@Pat"], ["read", "message-1"]):
            with self.subTest(args=args):
                self.assertTrue(classify("team", args))
        for args in ([], ["send"], ["reply"], ["edit"], ["skill", "publish"]):
            with self.subTest(args=args):
                self.assertFalse(classify("team", args))

    def test_discovery_does_not_expand_read_authority_for_agent_deliveries(self):
        allowed = self.ns["provider_turn_may_read_team"]
        for purpose in (None, "", "scheduled_job"):
            self.assertTrue(allowed(purpose))
        for purpose in ("cross_chat_handoff_delivery", "secure_peer_handoff_delivery", "goal_resume"):
            self.assertFalse(allowed(purpose))

    def test_new_guidance_changes_existing_thread_instruction_hash(self):
        ns = extracted()
        revised = ns["codex_thread_instruction_hash"]("test", {})
        ns["CODEX_PROMPT_PRELUDE"] = ns["CODEX_PROMPT_PRELUDE"].replace(
            "`bulletin --mention N` for @@bulletin", "legacy unspecified destination"
        )
        self.assertNotEqual(revised, ns["codex_thread_instruction_hash"]("test", {}))

    def test_discovery_contains_no_dynamic_authority_or_history_wrapper(self):
        description = self.ns["PROVIDER_TOOL_DESCRIPTION"]
        shared = self.ns["PROVIDER_THREAD_INSTRUCTION_ADDENDUM"]
        for text in ("[AgentsDock provider authority]", "authority-file=", "run_", "sess_"):
            self.assertNotIn(text, description)
            self.assertNotIn(text, shared)


if __name__ == "__main__":
    unittest.main()