You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
* fix: suppress output redaction on file tools to prevent secret placeholder writeback (#1333)
SecretOutputRedactor was replacing secret values with ***REDACTED***
placeholders in file_read output before it reached the model. When the
model subsequently wrote that content back via file_write/file_edit, the
placeholders were persisted to disk, destroying real secret values in
config files.
The fix moves redaction out of the model-facing path for file tools while
keeping it on the observability path (spill files, logs, transcripts):
- Add SuppressOutputRedaction flag to INetclawTool; FileReadTool opts in
- DispatchingToolExecutor splits model-facing (raw) vs spill (redacted)
result when the flag is set
- ToolOutputSpill gains a two-param overload so spill files always use
redacted content even when the inline result is unredacted
- Consolidate file_write logic into FileEditTool as a Content parameter
mode; FileWriteTool becomes a thin backward-compatible delegate
* fix: address code review findings from #1333 redaction PR
- Redact tool results in SessionLogActor before writing to session.log
so file_read's SuppressOutputRedaction doesn't leak secrets to the
observability log on disk
- Tighten FileEditTool Content mutual-exclusivity guard to also reject
NewString and ReplaceAll (not just OldString) when Content is supplied
- Always redact streaming ToolActivityUpdate chunks regardless of
SuppressOutputRedaction — activity chunks are progressive display, not
content the model writes back
- Fix stale doc comment in ToolOutputSpill that claimed inputs are
always pre-redacted
- Normalize error message casing in FileWriteTool ('path' → 'Path')
[property:Description("Absolute path to the file to edit")]stringPath,
30
-
[property:Description("The exact text to find in the file")]stringOldString,
31
-
[property:Description("The text to replace it with (must differ from OldString; use empty string to delete)")]stringNewString,
32
-
[property:Description("Replace all occurrences instead of just the first (default: false)")]bool?ReplaceAll=null);
32
+
[property:Description("Absolute path to the file")]stringPath,
33
+
[property:Description("The exact text to find in the file (omit when using Content for a full write)")]string?OldString=null,
34
+
[property:Description("The text to replace OldString with (must differ from OldString; use empty string to delete)")]string?NewString=null,
35
+
[property:Description("Replace all occurrences instead of just the first (default: false)")]bool?ReplaceAll=null,
36
+
[property:Description("Full content to write to the file, creating parent directories if needed. Mutually exclusive with OldString/NewString.")]string?Content=null);
0 commit comments