diff --git a/app/service/agent/bootstrap.py b/app/service/agent/bootstrap.py index a25d1f3..269a086 100644 --- a/app/service/agent/bootstrap.py +++ b/app/service/agent/bootstrap.py @@ -189,13 +189,18 @@ def get_agent_factory() -> AgentFactory: required_permission=PROBE_PERMISSION, allowed_roles=("admin",), )) - # 第二个探针工具:让"有白名单但不含该工具"的分支可被构造(见 platform_probe 的说明) + # 第二个探针工具,两个用途: + # ① 让"有白名单但不含该工具"的分支可被构造(见 platform_probe 的说明); + # ② 让**工具层**的"角色不能使用工具"分支可被构造 —— 它的角色集合**比 Agent 的更窄** + # (Agent 允许 admin,本工具只允许 risk_operator)。必须更窄才行:Agent 层的 + # validate_access 会先按 AgentDefinition.allowed_roles 拦截,两者一致时永远进不到 + # 工具层的角色校验。 registry.register(ToolDefinition( name=PROBE_ALT_TOOL, input_model=ProbeEchoArgs, handler=cast(Any, probe_alt_tool), required_permission=PROBE_PERMISSION, - allowed_roles=("admin",), + allowed_roles=("risk_operator",), )) registry.register(ToolDefinition( name="check_suitability", diff --git a/app/service/agent/implementations/platform_probe.py b/app/service/agent/implementations/platform_probe.py index 69a4ea5..646a176 100644 --- a/app/service/agent/implementations/platform_probe.py +++ b/app/service/agent/implementations/platform_probe.py @@ -66,9 +66,12 @@ class PlatformProbeAgent(BaseAgent): ) async def handle(self, request: AgentRequest, context: RequestContext) -> CoreResult: - # 走公共工具链路:探针要验证的正是这条路上的白名单、权限与角色校验。 + # 按消息里的 "alt" 决定调哪个探针工具。两个工具都必须可被指定调用: + # 分支 2(工具不在白名单)要调白名单之外的那个,分支 4(角色不符)要调角色更窄的 + # 那个——硬编码其中一个的话,这两个分支会互相干扰(实测踩到过)。 + tool = PROBE_ALT_TOOL if "alt" in request.message.lower() else PROBE_TOOL output = await self.call_tool( - PROBE_TOOL, + tool, {"note": request.message[:50]}, intent=INTENT_PROBE, context=context,