@@ -50,6 +50,45 @@ async def test_prompt_pre_fetch_blocks_without_redaction(self):
5050 assert result .violation .code == "SECRETS_DETECTED"
5151 assert result .modified_payload == payload
5252
53+ async def test_tool_pre_invoke_redacts_arguments_without_blocking (self , plugin ):
54+ payload = ToolPreInvokePayload (
55+ name = "echo" ,
56+ arguments = {"message" : "AWS_ACCESS_KEY_ID=AKIAFAKE12345EXAMPLE" },
57+ )
58+
59+ result = await plugin .tool_pre_invoke (payload , make_context ())
60+
61+ assert result .continue_processing is True
62+ assert result .violation is None
63+ assert result .modified_payload is not None
64+ assert result .modified_payload is not payload
65+ assert (
66+ result .modified_payload .arguments ["message" ]
67+ == "AWS_ACCESS_KEY_ID=[REDACTED]"
68+ )
69+ assert (
70+ payload .arguments ["message" ]
71+ == "AWS_ACCESS_KEY_ID=AKIAFAKE12345EXAMPLE"
72+ )
73+ assert result .metadata == {"secrets_redacted" : True , "count" : 1 }
74+
75+ async def test_tool_pre_invoke_blocks_without_redaction (self ):
76+ plugin = SecretsDetectionPlugin (make_config (block_on_detection = True , redact = False ))
77+ payload = ToolPreInvokePayload (
78+ name = "echo" ,
79+ arguments = {"message" : "AWS_ACCESS_KEY_ID=AKIAFAKE12345EXAMPLE" },
80+ )
81+
82+ result = await plugin .tool_pre_invoke (payload , make_context ())
83+
84+ assert result .continue_processing is False
85+ assert result .violation is not None
86+ assert result .violation .code == "SECRETS_DETECTED"
87+ assert result .violation .description == (
88+ "Potential secrets detected in tool arguments"
89+ )
90+ assert result .modified_payload == payload
91+
5392 async def test_prompt_pre_fetch_blocks_with_redaction_without_leaking_secret (self ):
5493 plugin = SecretsDetectionPlugin (make_config (block_on_detection = True , redact = True ))
5594 payload = PromptPrehookPayload (
0 commit comments