Drop large mutation call history
- SHA
fad3bf842045f913c43cd0a4d5d4b55cde0b3c0c- Parents
-
8056705 - Tree
bd36a31
fad3bf8
fad3bf842045f913c43cd0a4d5d4b55cde0b3c0c8056705
bd36a31| Status | File | + | - |
|---|---|---|---|
| M |
src/loader/runtime/session.py
|
9 | 18 |
| M |
tests/test_session_state.py
|
3 | 9 |
src/loader/runtime/session.pymodified@@ -39,36 +39,23 @@ _UNSET = object() | ||
| 39 | 39 | _REQUEST_TOOL_PAYLOAD_SUMMARY_THRESHOLD = 240 |
| 40 | 40 | |
| 41 | 41 | |
| 42 | -def _request_text_line_count(value: str) -> int: | |
| 43 | - """Count lines for one request-projected text payload.""" | |
| 44 | - | |
| 45 | - if not value: | |
| 46 | - return 0 | |
| 47 | - return value.count("\n") + 1 | |
| 48 | - | |
| 49 | - | |
| 50 | -def _project_request_tool_call(tool_call: ToolCall) -> ToolCall: | |
| 42 | +def _project_request_tool_call(tool_call: ToolCall) -> ToolCall | None: | |
| 51 | 43 | """Project one historical tool call into a lighter request-time form.""" |
| 52 | 44 | |
| 53 | 45 | arguments = dict(tool_call.arguments) |
| 54 | 46 | if tool_call.name == "write": |
| 55 | 47 | content = arguments.get("content") |
| 56 | 48 | if isinstance(content, str) and len(content) > _REQUEST_TOOL_PAYLOAD_SUMMARY_THRESHOLD: |
| 57 | - arguments.pop("content", None) | |
| 58 | - arguments["content_chars"] = len(content) | |
| 59 | - arguments["content_lines"] = _request_text_line_count(content) | |
| 49 | + return None | |
| 60 | 50 | elif tool_call.name == "edit": |
| 61 | 51 | for key in ("old_string", "new_string"): |
| 62 | 52 | value = arguments.get(key) |
| 63 | 53 | if isinstance(value, str) and len(value) > _REQUEST_TOOL_PAYLOAD_SUMMARY_THRESHOLD: |
| 64 | - arguments.pop(key, None) | |
| 65 | - arguments[f"{key}_chars"] = len(value) | |
| 66 | - arguments[f"{key}_lines"] = _request_text_line_count(value) | |
| 54 | + return None | |
| 67 | 55 | elif tool_call.name == "patch": |
| 68 | 56 | hunks = arguments.get("hunks") |
| 69 | 57 | if isinstance(hunks, list) and hunks: |
| 70 | - arguments.pop("hunks", None) | |
| 71 | - arguments["hunk_count"] = len(hunks) | |
| 58 | + return None | |
| 72 | 59 | return ToolCall( |
| 73 | 60 | id=tool_call.id, |
| 74 | 61 | name=tool_call.name, |
@@ -81,7 +68,11 @@ def _project_request_message(message: Message) -> Message: | ||
| 81 | 68 | |
| 82 | 69 | if message.role is not Role.ASSISTANT or not message.tool_calls: |
| 83 | 70 | return message |
| 84 | - projected_tool_calls = [_project_request_tool_call(tool_call) for tool_call in message.tool_calls] | |
| 71 | + projected_tool_calls = [ | |
| 72 | + projected | |
| 73 | + for tool_call in message.tool_calls | |
| 74 | + if (projected := _project_request_tool_call(tool_call)) is not None | |
| 75 | + ] | |
| 85 | 76 | if projected_tool_calls == message.tool_calls: |
| 86 | 77 | return message |
| 87 | 78 | return Message( |
tests/test_session_state.pymodified@@ -159,7 +159,7 @@ def test_session_compaction_persists_summary_and_recent_messages(temp_dir: Path) | ||
| 159 | 159 | ] |
| 160 | 160 | |
| 161 | 161 | |
| 162 | -def test_build_request_messages_trims_large_mutation_payloads_from_history( | |
| 162 | +def test_build_request_messages_omits_large_mutation_tool_calls_from_history( | |
| 163 | 163 | temp_dir: Path, |
| 164 | 164 | ) -> None: |
| 165 | 165 | large_html = "<html>" + ("x" * 400) + "</html>" |
@@ -199,14 +199,8 @@ def test_build_request_messages_trims_large_mutation_payloads_from_history( | ||
| 199 | 199 | |
| 200 | 200 | request_messages = session.build_request_messages() |
| 201 | 201 | |
| 202 | - assert request_messages[2].tool_calls[0].arguments["file_path"].endswith("index.html") | |
| 203 | - assert "content" not in request_messages[2].tool_calls[0].arguments | |
| 204 | - assert request_messages[2].tool_calls[0].arguments["content_chars"] == len(large_html) | |
| 205 | - assert request_messages[2].tool_calls[0].arguments["content_lines"] == 1 | |
| 206 | - assert "old_string" not in request_messages[2].tool_calls[1].arguments | |
| 207 | - assert "new_string" not in request_messages[2].tool_calls[1].arguments | |
| 208 | - assert request_messages[2].tool_calls[1].arguments["old_string_chars"] == len(old_block) | |
| 209 | - assert request_messages[2].tool_calls[1].arguments["new_string_chars"] == len(new_block) | |
| 202 | + assert request_messages[2].tool_calls == [] | |
| 203 | + assert request_messages[2].content == "I'll write the first files now." | |
| 210 | 204 | assert session.messages[1].tool_calls[0].arguments["content"] == large_html |
| 211 | 205 | assert session.messages[1].tool_calls[1].arguments["old_string"] == old_block |
| 212 | 206 | assert session.messages[1].tool_calls[1].arguments["new_string"] == new_block |