patchpal 0.22.3__tar.gz → 0.22.4__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {patchpal-0.22.3/patchpal.egg-info → patchpal-0.22.4}/PKG-INFO +1 -1
- {patchpal-0.22.3 → patchpal-0.22.4}/patchpal/__init__.py +1 -1
- {patchpal-0.22.3 → patchpal-0.22.4}/patchpal/agent/function_calling.py +2 -4
- {patchpal-0.22.3 → patchpal-0.22.4}/patchpal/context.py +18 -17
- {patchpal-0.22.3 → patchpal-0.22.4/patchpal.egg-info}/PKG-INFO +1 -1
- {patchpal-0.22.3 → patchpal-0.22.4}/LICENSE +0 -0
- {patchpal-0.22.3 → patchpal-0.22.4}/MANIFEST.in +0 -0
- {patchpal-0.22.3 → patchpal-0.22.4}/README.md +0 -0
- {patchpal-0.22.3 → patchpal-0.22.4}/patchpal/agent/__init__.py +0 -0
- {patchpal-0.22.3 → patchpal-0.22.4}/patchpal/agent/react.py +0 -0
- {patchpal-0.22.3 → patchpal-0.22.4}/patchpal/cli/__init__.py +0 -0
- {patchpal-0.22.3 → patchpal-0.22.4}/patchpal/cli/autopilot.py +0 -0
- {patchpal-0.22.3 → patchpal-0.22.4}/patchpal/cli/interactive.py +0 -0
- {patchpal-0.22.3 → patchpal-0.22.4}/patchpal/cli/mcp.py +0 -0
- {patchpal-0.22.3 → patchpal-0.22.4}/patchpal/cli/sandbox.py +0 -0
- {patchpal-0.22.3 → patchpal-0.22.4}/patchpal/cli/streaming.py +0 -0
- {patchpal-0.22.3 → patchpal-0.22.4}/patchpal/config.py +0 -0
- {patchpal-0.22.3 → patchpal-0.22.4}/patchpal/permissions.py +0 -0
- {patchpal-0.22.3 → patchpal-0.22.4}/patchpal/prompts/react_prompt.md +0 -0
- {patchpal-0.22.3 → patchpal-0.22.4}/patchpal/prompts/system_prompt.md +0 -0
- {patchpal-0.22.3 → patchpal-0.22.4}/patchpal/skills.py +0 -0
- {patchpal-0.22.3 → patchpal-0.22.4}/patchpal/tools/__init__.py +0 -0
- {patchpal-0.22.3 → patchpal-0.22.4}/patchpal/tools/audit.py +0 -0
- {patchpal-0.22.3 → patchpal-0.22.4}/patchpal/tools/code_analysis.py +0 -0
- {patchpal-0.22.3 → patchpal-0.22.4}/patchpal/tools/common.py +0 -0
- {patchpal-0.22.3 → patchpal-0.22.4}/patchpal/tools/definitions.py +0 -0
- {patchpal-0.22.3 → patchpal-0.22.4}/patchpal/tools/file_reading.py +0 -0
- {patchpal-0.22.3 → patchpal-0.22.4}/patchpal/tools/file_writing.py +0 -0
- {patchpal-0.22.3 → patchpal-0.22.4}/patchpal/tools/find_tool.py +0 -0
- {patchpal-0.22.3 → patchpal-0.22.4}/patchpal/tools/grep_tool.py +0 -0
- {patchpal-0.22.3 → patchpal-0.22.4}/patchpal/tools/image_handler.py +0 -0
- {patchpal-0.22.3 → patchpal-0.22.4}/patchpal/tools/mcp.py +0 -0
- {patchpal-0.22.3 → patchpal-0.22.4}/patchpal/tools/repo_map.py +0 -0
- {patchpal-0.22.3 → patchpal-0.22.4}/patchpal/tools/shell_tools.py +0 -0
- {patchpal-0.22.3 → patchpal-0.22.4}/patchpal/tools/todo_tools.py +0 -0
- {patchpal-0.22.3 → patchpal-0.22.4}/patchpal/tools/tool_schema.py +0 -0
- {patchpal-0.22.3 → patchpal-0.22.4}/patchpal/tools/user_interaction.py +0 -0
- {patchpal-0.22.3 → patchpal-0.22.4}/patchpal/tools/web_tools.py +0 -0
- {patchpal-0.22.3 → patchpal-0.22.4}/patchpal.egg-info/SOURCES.txt +0 -0
- {patchpal-0.22.3 → patchpal-0.22.4}/patchpal.egg-info/dependency_links.txt +0 -0
- {patchpal-0.22.3 → patchpal-0.22.4}/patchpal.egg-info/entry_points.txt +0 -0
- {patchpal-0.22.3 → patchpal-0.22.4}/patchpal.egg-info/requires.txt +0 -0
- {patchpal-0.22.3 → patchpal-0.22.4}/patchpal.egg-info/top_level.txt +0 -0
- {patchpal-0.22.3 → patchpal-0.22.4}/pyproject.toml +0 -0
- {patchpal-0.22.3 → patchpal-0.22.4}/setup.cfg +0 -0
- {patchpal-0.22.3 → patchpal-0.22.4}/tests/test_agent.py +0 -0
- {patchpal-0.22.3 → patchpal-0.22.4}/tests/test_cli.py +0 -0
- {patchpal-0.22.3 → patchpal-0.22.4}/tests/test_config_dynamic.py +0 -0
- {patchpal-0.22.3 → patchpal-0.22.4}/tests/test_context.py +0 -0
- {patchpal-0.22.3 → patchpal-0.22.4}/tests/test_custom_tools.py +0 -0
- {patchpal-0.22.3 → patchpal-0.22.4}/tests/test_enabled_tools.py +0 -0
- {patchpal-0.22.3 → patchpal-0.22.4}/tests/test_find_tool.py +0 -0
- {patchpal-0.22.3 → patchpal-0.22.4}/tests/test_guardrails.py +0 -0
- {patchpal-0.22.3 → patchpal-0.22.4}/tests/test_image_blocking.py +0 -0
- {patchpal-0.22.3 → patchpal-0.22.4}/tests/test_maximum_security.py +0 -0
- {patchpal-0.22.3 → patchpal-0.22.4}/tests/test_mcp_config.py +0 -0
- {patchpal-0.22.3 → patchpal-0.22.4}/tests/test_memory.py +0 -0
- {patchpal-0.22.3 → patchpal-0.22.4}/tests/test_operational_safety.py +0 -0
- {patchpal-0.22.3 → patchpal-0.22.4}/tests/test_optional_tools.py +0 -0
- {patchpal-0.22.3 → patchpal-0.22.4}/tests/test_permissions.py +0 -0
- {patchpal-0.22.3 → patchpal-0.22.4}/tests/test_react.py +0 -0
- {patchpal-0.22.3 → patchpal-0.22.4}/tests/test_reasoning_content.py +0 -0
- {patchpal-0.22.3 → patchpal-0.22.4}/tests/test_repo_map.py +0 -0
- {patchpal-0.22.3 → patchpal-0.22.4}/tests/test_simplified_prompt.py +0 -0
- {patchpal-0.22.3 → patchpal-0.22.4}/tests/test_skills.py +0 -0
- {patchpal-0.22.3 → patchpal-0.22.4}/tests/test_streaming.py +0 -0
- {patchpal-0.22.3 → patchpal-0.22.4}/tests/test_tools.py +0 -0
|
@@ -957,10 +957,8 @@ It's currently empty (just the template). The file is automatically loaded at se
|
|
|
957
957
|
|
|
958
958
|
# Check for compaction BEFORE starting work
|
|
959
959
|
# This ensures we never compact mid-execution and lose tool results
|
|
960
|
-
#
|
|
961
|
-
if self.enable_auto_compact and self.context_manager.needs_compaction(
|
|
962
|
-
self.messages, actual_prompt_tokens=self.last_prompt_tokens
|
|
963
|
-
):
|
|
960
|
+
# Always estimates current messages to avoid staleness issues (no actual_prompt_tokens)
|
|
961
|
+
if self.enable_auto_compact and self.context_manager.needs_compaction(self.messages):
|
|
964
962
|
self._perform_auto_compaction()
|
|
965
963
|
|
|
966
964
|
# Agent loop with interrupt handling
|
|
@@ -321,30 +321,31 @@ Be comprehensive but concise. The goal is to continue work seamlessly without lo
|
|
|
321
321
|
) -> bool:
|
|
322
322
|
"""Check if context window needs compaction.
|
|
323
323
|
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
324
|
+
ALWAYS estimates current messages to avoid staleness issues when predicting
|
|
325
|
+
whether the NEXT API call will overflow. Using actual_prompt_tokens from a
|
|
326
|
+
previous call can cause false negatives when large messages are added between
|
|
327
|
+
the last API call and the compaction check.
|
|
328
|
+
|
|
329
|
+
Example of staleness bug (fixed):
|
|
330
|
+
- Previous API call: 120K tokens (60% usage)
|
|
331
|
+
- User pastes huge changelog: +90K tokens
|
|
332
|
+
- Total: 210K tokens (exceeds 200K limit)
|
|
333
|
+
- Bug: If we used actual_prompt_tokens=120K, we'd think we're at 60%
|
|
334
|
+
- Fix: Always re-estimate to see the 210K total
|
|
335
|
+
|
|
336
|
+
The actual_prompt_tokens parameter is kept for API compatibility but ignored
|
|
337
|
+
for compaction decisions. Use get_usage_stats() for display purposes where
|
|
338
|
+
actual tokens are appropriate (staleness OK for showing recent stats).
|
|
330
339
|
|
|
331
340
|
Args:
|
|
332
341
|
messages: Current message history
|
|
333
|
-
actual_prompt_tokens:
|
|
342
|
+
actual_prompt_tokens: IGNORED - kept for API compatibility only
|
|
334
343
|
|
|
335
344
|
Returns:
|
|
336
345
|
True if compaction is needed
|
|
337
346
|
"""
|
|
338
|
-
#
|
|
339
|
-
|
|
340
|
-
# Add output reserve to account for response tokens
|
|
341
|
-
total_tokens = actual_prompt_tokens + self.output_reserve
|
|
342
|
-
usage_ratio = total_tokens / self.context_limit
|
|
343
|
-
return usage_ratio >= self.COMPACT_THRESHOLD
|
|
344
|
-
|
|
345
|
-
# Proactive approach (fallback): estimate tokens when API data not available
|
|
346
|
-
# This uses character-based estimation (3 chars per token) which works
|
|
347
|
-
# reliably without requiring tiktoken or network access
|
|
347
|
+
# ALWAYS estimate current messages - never use stale actual_prompt_tokens
|
|
348
|
+
# This ensures we detect large message additions that happen between API calls
|
|
348
349
|
# Note: Dynamic date/time message adds ~30 tokens on each LLM call
|
|
349
350
|
system_tokens = self.estimator.estimate_tokens(self.system_prompt)
|
|
350
351
|
datetime_tokens = 30 # Approximate size of dynamic date/time message
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|