Skip to content

Commit 3c04533

Browse files
committed
Redact tool arguments in approval requests before exposing to metadata
- Apply redact_tool_arguments to ApprovalRequest.to_dict() so sensitive fields (content, command, new, old) are redacted in pending_approval and run_paused audit events and CLI/TUI payloads
1 parent e54fcd0 commit 3c04533

4 files changed

Lines changed: 10 additions & 2 deletions

File tree

teaagent/runner.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
from typing import Any, Optional, Union
66
from uuid import uuid4
77

8-
from teaagent.audit import AuditLogger
8+
from teaagent.audit import AuditLogger, redact_tool_arguments
99
from teaagent.budget import RunBudget
1010
from teaagent.context import ContextCompactor
1111
from teaagent.errors import (
@@ -47,7 +47,7 @@ def to_dict(self) -> dict[str, Any]:
4747
return {
4848
'call_id': self.call_id,
4949
'tool_name': self.tool_name,
50-
'arguments': self.arguments,
50+
'arguments': redact_tool_arguments(self.arguments),
5151
'reason': self.reason,
5252
'annotations': self.annotations,
5353
}

tests/test_chat_agent.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
parse_model_decision,
1919
run_chat_agent,
2020
)
21+
from teaagent.audit import AUDIT_REDACTED
2122
from teaagent.cli import main
2223
from teaagent.errors import ToolPermissionError
2324
from teaagent.runner import ToolRequest
@@ -299,6 +300,10 @@ def test_cli_agent_run_returns_pending_approval_for_unapproved_write(self) -> No
299300
self.assertEqual(exit_code, 1)
300301
self.assertEqual(payload['status'], 'pending_approval')
301302
self.assertEqual(payload['approval']['call_id'], 'write-1')
303+
self.assertEqual(payload['approval']['arguments']['path'], 'x.txt')
304+
self.assertEqual(
305+
payload['approval']['arguments']['content'], AUDIT_REDACTED
306+
)
302307

303308
def test_cli_agent_run_hitl_approval_continues_same_run(self) -> None:
304309
with tempfile.TemporaryDirectory() as tmp:

tests/test_p0_harness.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ def decide(_context):
7676

7777
self.assertEqual(result.status, 'pending_approval')
7878
self.assertEqual(result.metadata['approval']['call_id'], 'call-1')
79+
self.assertEqual(result.metadata['approval']['arguments']['value'], 'delete')
7980
pending = [
8081
event
8182
for event in audit.events

tests/test_run_store.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
from pathlib import Path
99

1010
from teaagent import FinalAnswer, RunStore
11+
from teaagent.audit import AUDIT_REDACTED
1112
from teaagent.cli import main
1213
from teaagent.runner import RunResult
1314

@@ -213,6 +214,7 @@ def test_pending_approval_for_run_returns_last_unresolved(self) -> None:
213214
self.assertEqual(pending['call_id'], 'write-1')
214215
self.assertEqual(pending['tool_name'], 'workspace_write_file')
215216
self.assertEqual(pending['arguments']['path'], 'x.txt')
217+
self.assertEqual(pending['arguments']['content'], AUDIT_REDACTED)
216218

217219
def test_pending_approval_for_run_clears_after_resolution(self) -> None:
218220
with tempfile.TemporaryDirectory() as tmp:

0 commit comments

Comments
 (0)