kolega-code 0.28.3__tar.gz → 0.28.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.
Files changed (441) hide show
  1. {kolega_code-0.28.3 → kolega_code-0.28.4}/CHANGELOG.md +8 -0
  2. {kolega_code-0.28.3 → kolega_code-0.28.4}/PKG-INFO +1 -1
  3. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/__init__.py +1 -1
  4. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/__init__.py +1 -1
  5. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/baseagent.py +1 -0
  6. kolega_code-0.28.4/kolega_code/agent/compression.py +324 -0
  7. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/conversation.py +5 -0
  8. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/auxiliary/compression/summary.user.md.j2 +1 -1
  9. {kolega_code-0.28.3 → kolega_code-0.28.4}/pyproject.toml +1 -1
  10. kolega_code-0.28.3/kolega_code/agent/compression.py +0 -166
  11. {kolega_code-0.28.3 → kolega_code-0.28.4}/.gitignore +0 -0
  12. {kolega_code-0.28.3 → kolega_code-0.28.4}/CONTRIBUTING.md +0 -0
  13. {kolega_code-0.28.3 → kolega_code-0.28.4}/LICENSE +0 -0
  14. {kolega_code-0.28.3 → kolega_code-0.28.4}/MIGRATION.md +0 -0
  15. {kolega_code-0.28.3 → kolega_code-0.28.4}/README.md +0 -0
  16. {kolega_code-0.28.3 → kolega_code-0.28.4}/RELEASING.md +0 -0
  17. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/_bundled_skills/LICENSE +0 -0
  18. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/_bundled_skills/manifest.json +0 -0
  19. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/deep-research/SKILL.md +0 -0
  20. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/deep-research/references/evidence-and-reporting.md +0 -0
  21. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/deep-research/references/gigacode-workflow.md +0 -0
  22. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/deep-research/scripts/deep-research.workflow +0 -0
  23. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/deep-research/scripts/materialize_report.py +0 -0
  24. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/docx/LICENSE +0 -0
  25. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/docx/SKILL.md +0 -0
  26. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/docx/references/examples.md +0 -0
  27. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/docx/references/limitations.md +0 -0
  28. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/docx/references/operations.md +0 -0
  29. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/docx/references/quality.md +0 -0
  30. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/docx/requirements.txt +0 -0
  31. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/docx/scripts/docx_tool.py +0 -0
  32. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/docx/scripts/smoke_test.py +0 -0
  33. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/humanizer/LICENSE +0 -0
  34. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/humanizer/SKILL.md +0 -0
  35. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/pdf/LICENSE +0 -0
  36. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/pdf/SKILL.md +0 -0
  37. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/pdf/references/examples.md +0 -0
  38. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/pdf/references/limitations.md +0 -0
  39. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/pdf/references/ocr.md +0 -0
  40. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/pdf/references/operations.md +0 -0
  41. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/pdf/references/quality.md +0 -0
  42. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/pdf/references/redaction.md +0 -0
  43. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/pdf/requirements-ocr-paddle.txt +0 -0
  44. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/pdf/requirements-ocr-surya.txt +0 -0
  45. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/pdf/requirements.txt +0 -0
  46. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/pdf/scripts/pdf_tool.py +0 -0
  47. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/pdf/scripts/smoke_test.py +0 -0
  48. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/pptx/LICENSE +0 -0
  49. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/pptx/SKILL.md +0 -0
  50. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/pptx/references/examples.md +0 -0
  51. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/pptx/references/limitations.md +0 -0
  52. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/pptx/references/operations.md +0 -0
  53. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/pptx/requirements.txt +0 -0
  54. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/pptx/scripts/pptx_tool.py +0 -0
  55. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/pptx/scripts/smoke_test.py +0 -0
  56. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/review/SKILL.md +0 -0
  57. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/review/references/github-publishing.md +0 -0
  58. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/skill-authoring/SKILL.md +0 -0
  59. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/skill-authoring/references/review-checklist.md +0 -0
  60. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/xlsx/LICENSE +0 -0
  61. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/xlsx/SKILL.md +0 -0
  62. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/xlsx/references/examples.md +0 -0
  63. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/xlsx/references/limitations.md +0 -0
  64. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/xlsx/references/operations.md +0 -0
  65. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/xlsx/references/quality.md +0 -0
  66. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/xlsx/requirements.txt +0 -0
  67. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/xlsx/scripts/smoke_test.py +0 -0
  68. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/xlsx/scripts/xlsx_tool.py +0 -0
  69. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/browseragent.py +0 -0
  70. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/coder.py +0 -0
  71. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/common.py +0 -0
  72. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/context.py +0 -0
  73. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/custom_agents.py +0 -0
  74. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/edit_protocols.py +0 -0
  75. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/errors.py +0 -0
  76. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/eval/__init__.py +0 -0
  77. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/eval/bridge.py +0 -0
  78. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/eval/bundle-requirements.in +0 -0
  79. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/eval/bundle-requirements.txt +0 -0
  80. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/eval/env.py +0 -0
  81. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/eval/js_kernel.py +0 -0
  82. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/eval/kernel.py +0 -0
  83. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/eval/prelude.js +0 -0
  84. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/eval/prelude.py +0 -0
  85. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/eval/protocol.py +0 -0
  86. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/eval/py_kernel.py +0 -0
  87. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/eval/runner.js +0 -0
  88. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/eval/runner.py +0 -0
  89. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/generalagent.py +0 -0
  90. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/goal.py +0 -0
  91. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/investigationagent.py +0 -0
  92. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/model_routing.py +0 -0
  93. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/orchestration/__init__.py +0 -0
  94. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/orchestration/accounting.py +0 -0
  95. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/orchestration/budget.py +0 -0
  96. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/orchestration/context.py +0 -0
  97. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/orchestration/errors.py +0 -0
  98. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/orchestration/executor.py +0 -0
  99. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/orchestration/guide.py +0 -0
  100. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/orchestration/journal.py +0 -0
  101. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/orchestration/runtime.py +0 -0
  102. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/orchestration/types.py +0 -0
  103. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/planningagent.py +0 -0
  104. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_dump.py +0 -0
  105. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_overrides.py +0 -0
  106. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_provider.py +0 -0
  107. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/auxiliary/agent_loop/silent_turn_exhausted.user.md +0 -0
  108. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/auxiliary/agent_loop/silent_turn_nudge.user.md.j2 +0 -0
  109. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/auxiliary/agent_loop/truncated_turn_nudge.user.md.j2 +0 -0
  110. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/auxiliary/compression/summary.system.md +0 -0
  111. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/auxiliary/terminal/output_summary.system.md +0 -0
  112. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/auxiliary/terminal/safety.system.md +0 -0
  113. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/extensions/cli/build_questions.md +0 -0
  114. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/extensions/cli/current_plan_artifact.md.j2 +0 -0
  115. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/extensions/cli/mode_switch_notice.md.j2 +0 -0
  116. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/extensions/cli/planning_questions.md +0 -0
  117. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/extensions/cli/scratchpad.md.j2 +0 -0
  118. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/extensions/cli/shared_task_list.md +0 -0
  119. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/extensions/cli/shared_task_list_readonly.md +0 -0
  120. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/extensions/cli/worktree_control.md.j2 +0 -0
  121. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/extensions/skills/catalog.md.j2 +0 -0
  122. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/system/agents/browser.md.j2 +0 -0
  123. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/system/agents/coder_ask.md.j2 +0 -0
  124. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/system/agents/coder_base.md.j2 +0 -0
  125. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/system/agents/coder_cli.md.j2 +0 -0
  126. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/system/agents/general.md.j2 +0 -0
  127. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/system/agents/investigation.md.j2 +0 -0
  128. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/system/agents/planning.md.j2 +0 -0
  129. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/system/includes/agents_md_instructions.md +0 -0
  130. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/system/includes/context_updates.md +0 -0
  131. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/system/includes/environment_variables/workspace_env_vars.md +0 -0
  132. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/system/includes/frontend_guidance.md +0 -0
  133. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/system/includes/starter_templates/expo.md +0 -0
  134. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/system/includes/starter_templates/html_website.md +0 -0
  135. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/system/includes/starter_templates/mern_stack.md +0 -0
  136. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/system/includes/starter_templates/react_vite_shadcdn.md +0 -0
  137. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/system/includes/terminal_tools.md +0 -0
  138. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/apply_patch.md +0 -0
  139. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/ask_user_choice.md +0 -0
  140. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/browser_click.md +0 -0
  141. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/browser_close.md +0 -0
  142. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/browser_console_messages.md +0 -0
  143. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/browser_drag.md +0 -0
  144. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/browser_drop.md +0 -0
  145. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/browser_evaluate.md +0 -0
  146. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/browser_file_upload.md +0 -0
  147. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/browser_fill_form.md +0 -0
  148. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/browser_find.md +0 -0
  149. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/browser_handle_dialog.md +0 -0
  150. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/browser_hover.md +0 -0
  151. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/browser_navigate.md +0 -0
  152. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/browser_navigate_back.md +0 -0
  153. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/browser_network_request.md +0 -0
  154. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/browser_network_requests.md +0 -0
  155. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/browser_press_key.md +0 -0
  156. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/browser_resize.md +0 -0
  157. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/browser_scroll.md +0 -0
  158. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/browser_select_option.md +0 -0
  159. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/browser_snapshot.md +0 -0
  160. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/browser_tabs.md +0 -0
  161. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/browser_take_screenshot.md +0 -0
  162. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/browser_type.md +0 -0
  163. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/browser_wait_for.md +0 -0
  164. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/build_backend.md +0 -0
  165. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/build_frontend.md +0 -0
  166. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/claude_edit.md +0 -0
  167. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/claude_write.md +0 -0
  168. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/dispatch_agent.md +0 -0
  169. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/edit.md +0 -0
  170. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/eval.md +0 -0
  171. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/exec_command.md +0 -0
  172. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/get_host.md +0 -0
  173. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/get_task_list.md +0 -0
  174. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/get_task_list_readonly.md +0 -0
  175. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/hashline_edit.md +0 -0
  176. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/hashline_write.md +0 -0
  177. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/kill_command.md +0 -0
  178. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/list_sessions.md +0 -0
  179. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/list_subagent_models.md +0 -0
  180. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/list_workflow_runs.md +0 -0
  181. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/lsp.md +0 -0
  182. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/lsp_edit.md +0 -0
  183. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/multi_edit.md +0 -0
  184. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/read.md +0 -0
  185. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/read_image.md +0 -0
  186. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/resolve.md +0 -0
  187. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/run_workflow.md +0 -0
  188. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/set_goal.md +0 -0
  189. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/skill.md +0 -0
  190. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/snapshot.md +0 -0
  191. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/switch_worktree.md +0 -0
  192. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/update_task_list.md +0 -0
  193. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/web_fetch.md +0 -0
  194. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/web_search.md +0 -0
  195. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/write.md +0 -0
  196. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/write_plan.md +0 -0
  197. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/write_stdin.md +0 -0
  198. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/user_tasks/cli/implement_plan.md.j2 +0 -0
  199. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/user_tasks/cli/init_agents.md.j2 +0 -0
  200. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/prompts.py +0 -0
  201. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/tool_backend/agent_tool.py +0 -0
  202. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/tool_backend/base_tool.py +0 -0
  203. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/tool_backend/browser_tool.py +0 -0
  204. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/tool_backend/build_tool.py +0 -0
  205. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/tool_backend/codex_patch.py +0 -0
  206. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/tool_backend/edit_preview.py +0 -0
  207. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/tool_backend/edit_tool.py +0 -0
  208. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/tool_backend/eval_tool.py +0 -0
  209. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/tool_backend/hashline_v2.py +0 -0
  210. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/tool_backend/lsp_tool.py +0 -0
  211. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/tool_backend/memory_tool.py +0 -0
  212. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/tool_backend/network_status.py +0 -0
  213. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/tool_backend/read_file_tool.py +0 -0
  214. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/tool_backend/read_image_tool.py +0 -0
  215. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/tool_backend/search_backends/__init__.py +0 -0
  216. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/tool_backend/search_backends/base.py +0 -0
  217. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/tool_backend/search_backends/duckduckgo.py +0 -0
  218. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/tool_backend/search_backends/errors.py +0 -0
  219. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/tool_backend/search_backends/firecrawl.py +0 -0
  220. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/tool_backend/search_backends/models.py +0 -0
  221. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/tool_backend/search_backends/searxng.py +0 -0
  222. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/tool_backend/search_backends/tavily.py +0 -0
  223. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/tool_backend/snapshot_tool.py +0 -0
  224. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/tool_backend/streaming_tool.py +0 -0
  225. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/tool_backend/terminal_tool.py +0 -0
  226. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/tool_backend/web_fetch/__init__.py +0 -0
  227. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/tool_backend/web_fetch/answering.py +0 -0
  228. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/tool_backend/web_fetch/documents.py +0 -0
  229. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/tool_backend/web_fetch/extractors.py +0 -0
  230. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/tool_backend/web_fetch/pipeline.py +0 -0
  231. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/tool_backend/web_fetch/retrieval.py +0 -0
  232. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/tool_backend/web_fetch_tool.py +0 -0
  233. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/tool_backend/web_search_tool.py +0 -0
  234. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/tool_backend/workflow_tool.py +0 -0
  235. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/tool_definitions.py +0 -0
  236. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/tools.py +0 -0
  237. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/utils/commands.py +0 -0
  238. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/agent/volatile_context.py +0 -0
  239. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/auth/__init__.py +0 -0
  240. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/auth/_jwt.py +0 -0
  241. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/auth/chatgpt_oauth.py +0 -0
  242. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/auth/constants.py +0 -0
  243. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/auth/tokens.py +0 -0
  244. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/browser_extension/__init__.py +0 -0
  245. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/browser_extension/framing.py +0 -0
  246. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/browser_extension/installer.py +0 -0
  247. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/browser_extension/manager.py +0 -0
  248. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/browser_extension/multiplex.py +0 -0
  249. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/browser_extension/native_host.py +0 -0
  250. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/browser_extension/protocol.py +0 -0
  251. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/browser_extension/registry.py +0 -0
  252. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/browser_extension/runtime.py +0 -0
  253. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/cli/__init__.py +0 -0
  254. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/cli/app.py +0 -0
  255. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/cli/ask_output.py +0 -0
  256. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/cli/atif_export.py +0 -0
  257. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/cli/browser_backend.py +0 -0
  258. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/cli/clipboard_image.py +0 -0
  259. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/cli/config.py +0 -0
  260. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/cli/connection.py +0 -0
  261. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/cli/cron.py +0 -0
  262. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/cli/diagnostics.py +0 -0
  263. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/cli/file_index.py +0 -0
  264. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/cli/goal.py +0 -0
  265. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/cli/loop.py +0 -0
  266. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/cli/main.py +0 -0
  267. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/cli/mentions.py +0 -0
  268. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/cli/messages.py +0 -0
  269. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/cli/model_catalog.py +0 -0
  270. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/cli/model_connection.py +0 -0
  271. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/cli/plan_artifacts.py +0 -0
  272. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/cli/provider_registry.py +0 -0
  273. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/cli/session_event_protocol.py +0 -0
  274. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/cli/session_event_store.py +0 -0
  275. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/cli/session_journal.py +0 -0
  276. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/cli/session_store.py +0 -0
  277. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/cli/session_usage.py +0 -0
  278. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/cli/settings.py +0 -0
  279. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/cli/skills.py +0 -0
  280. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/cli/slash_commands.py +0 -0
  281. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/cli/theme.py +0 -0
  282. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/cli/tui/__init__.py +0 -0
  283. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/cli/tui/agent_runtime.py +0 -0
  284. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/cli/tui/app_base.py +0 -0
  285. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/cli/tui/changes_screen.py +0 -0
  286. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/cli/tui/command_handlers.py +0 -0
  287. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/cli/tui/constants.py +0 -0
  288. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/cli/tui/custom_model.py +0 -0
  289. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/cli/tui/loop_runtime.py +0 -0
  290. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/cli/tui/memory_screen.py +0 -0
  291. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/cli/tui/onboarding_screen.py +0 -0
  292. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/cli/tui/pacing.py +0 -0
  293. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/cli/tui/prompt_flows.py +0 -0
  294. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/cli/tui/session_diff.py +0 -0
  295. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/cli/tui/settings_panel.py +0 -0
  296. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/cli/tui/settings_screen.py +0 -0
  297. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/cli/tui/state.py +0 -0
  298. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/cli/tui/status_dashboard.py +0 -0
  299. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/cli/tui/styles.tcss +0 -0
  300. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/cli/tui/sub_agent_screen.py +0 -0
  301. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/cli/tui/terminal_display.py +0 -0
  302. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/cli/tui/transcript.py +0 -0
  303. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/cli/tui/widgets.py +0 -0
  304. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/cli/updater.py +0 -0
  305. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/config.py +0 -0
  306. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/events.py +0 -0
  307. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/extensions.py +0 -0
  308. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/git_env.py +0 -0
  309. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/hooks/__init__.py +0 -0
  310. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/hooks/backends.py +0 -0
  311. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/hooks/config.py +0 -0
  312. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/hooks/dispatcher.py +0 -0
  313. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/hooks/events.py +0 -0
  314. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/hooks/matcher.py +0 -0
  315. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/hooks/outcome.py +0 -0
  316. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/llm/client.py +0 -0
  317. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/llm/exceptions.py +0 -0
  318. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/llm/instrumented_client.py +0 -0
  319. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/llm/ledger.py +0 -0
  320. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/llm/models.py +0 -0
  321. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/llm/providers/__init__.py +0 -0
  322. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/llm/providers/_token_encoding.py +0 -0
  323. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/llm/providers/anthropic.py +0 -0
  324. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/llm/providers/base.py +0 -0
  325. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/llm/providers/chatgpt_oauth.py +0 -0
  326. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/llm/providers/deepseek_responses.py +0 -0
  327. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/llm/providers/google.py +0 -0
  328. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/llm/providers/models.py +0 -0
  329. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/llm/providers/openai.py +0 -0
  330. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/llm/providers/openai_responses.py +0 -0
  331. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/llm/providers/responses_common.py +0 -0
  332. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/llm/providers/tinker.py +0 -0
  333. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/llm/providers/tinker_trace.py +0 -0
  334. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/llm/ratelimit.py +0 -0
  335. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/llm/specs/__init__.py +0 -0
  336. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/llm/specs/accessors.py +0 -0
  337. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/llm/specs/catalog/__init__.py +0 -0
  338. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/llm/specs/catalog/anthropic.py +0 -0
  339. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/llm/specs/catalog/dashscope.py +0 -0
  340. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/llm/specs/catalog/deepseek.py +0 -0
  341. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/llm/specs/catalog/fireworks.py +0 -0
  342. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/llm/specs/catalog/google.py +0 -0
  343. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/llm/specs/catalog/kimi_coding.py +0 -0
  344. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/llm/specs/catalog/moonshot.py +0 -0
  345. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/llm/specs/catalog/ollama_cloud.py +0 -0
  346. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/llm/specs/catalog/openai.py +0 -0
  347. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/llm/specs/catalog/openai_chatgpt.py +0 -0
  348. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/llm/specs/catalog/openrouter.py +0 -0
  349. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/llm/specs/catalog/thinking_machines.py +0 -0
  350. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/llm/specs/catalog/tinker.py +0 -0
  351. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/llm/specs/catalog/together.py +0 -0
  352. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/llm/specs/catalog/xai.py +0 -0
  353. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/llm/specs/catalog/zai.py +0 -0
  354. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/llm/specs/ollama_cloud_catalog.py +0 -0
  355. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/llm/specs/openrouter_catalog.py +0 -0
  356. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/llm/specs/thinking.py +0 -0
  357. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/llm/specs/tinker_catalog.py +0 -0
  358. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/llm/specs/types.py +0 -0
  359. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/llm/specs/validation.py +0 -0
  360. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/llm/timeouts.py +0 -0
  361. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/llm/tool_execution_ids.py +0 -0
  362. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/llm/usage.py +0 -0
  363. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/local_state.py +0 -0
  364. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/mcp/__init__.py +0 -0
  365. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/mcp/config.py +0 -0
  366. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/mcp/oauth.py +0 -0
  367. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/mcp/service.py +0 -0
  368. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/mcp/state.py +0 -0
  369. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/mcp/tools.py +0 -0
  370. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/mcp/transport.py +0 -0
  371. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/memory/__init__.py +0 -0
  372. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/memory/identity.py +0 -0
  373. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/memory/manager.py +0 -0
  374. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/memory/manifest.py +0 -0
  375. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/memory/markdown.py +0 -0
  376. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/memory/models.py +0 -0
  377. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/memory/protocol.py +0 -0
  378. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/memory/registry.py +0 -0
  379. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/models/__init__.py +0 -0
  380. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/models/sandbox_terminal_state.py +0 -0
  381. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/permissions.py +0 -0
  382. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/runtime.py +0 -0
  383. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/sandbox/README.md +0 -0
  384. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/sandbox/__init__.py +0 -0
  385. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/sandbox/async_filesystem.py +0 -0
  386. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/sandbox/base.py +0 -0
  387. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/sandbox/browser.py +0 -0
  388. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/sandbox/event_loop.py +0 -0
  389. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/sandbox/filesystem.py +0 -0
  390. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/sandbox/local.py +0 -0
  391. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/sandbox/serializer.py +0 -0
  392. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/sandbox/terminal.py +0 -0
  393. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/sandbox/utils.py +0 -0
  394. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/scratchpad.py +0 -0
  395. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/security/__init__.py +0 -0
  396. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/security/secrets.py +0 -0
  397. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/services/base.py +0 -0
  398. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/services/browser.py +0 -0
  399. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/services/file_system.py +0 -0
  400. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/services/html.py +0 -0
  401. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/services/lsp/__init__.py +0 -0
  402. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/services/lsp/client.py +0 -0
  403. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/services/lsp/config.py +0 -0
  404. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/services/lsp/detector.py +0 -0
  405. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/services/lsp/diagnostics.py +0 -0
  406. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/services/lsp/edits.py +0 -0
  407. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/services/lsp/manager.py +0 -0
  408. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/services/lsp/registry.py +0 -0
  409. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/services/lsp/registry.yaml +0 -0
  410. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/services/snapshots.py +0 -0
  411. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/services/terminal.py +0 -0
  412. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/services/terminal_buffer.py +0 -0
  413. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/services/workspace_scan.py +0 -0
  414. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/session/__init__.py +0 -0
  415. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/session/control.py +0 -0
  416. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/session/inmemory.py +0 -0
  417. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/session/projection.py +0 -0
  418. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/session/recording.py +0 -0
  419. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/session/runtime.py +0 -0
  420. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/session/store.py +0 -0
  421. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/testing/__init__.py +0 -0
  422. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/testing/store_conformance.py +0 -0
  423. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/tools/__init__.py +0 -0
  424. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/tools/core.py +0 -0
  425. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/tools/definitions.py +0 -0
  426. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/tools/param_aliases.py +0 -0
  427. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/tools/registry.py +0 -0
  428. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/utils/__init__.py +0 -0
  429. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/utils/images.py +0 -0
  430. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/web/__init__.py +0 -0
  431. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/web/assets/fold.js +0 -0
  432. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/web/assets/player.css +0 -0
  433. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/web/assets/player.html +0 -0
  434. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/web/assets/player.js +0 -0
  435. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/web/bundle.py +0 -0
  436. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/web/hosting.py +0 -0
  437. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/web/redaction.py +0 -0
  438. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/web/server.py +0 -0
  439. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/web/singlefile.py +0 -0
  440. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/web/theme_css.py +0 -0
  441. {kolega_code-0.28.3 → kolega_code-0.28.4}/kolega_code/worktrees.py +0 -0
@@ -6,6 +6,14 @@ This project uses GitHub Releases for detailed generated release notes. This fil
6
6
 
7
7
  ## Unreleased
8
8
 
9
+ ## 0.28.4 - 2026-08-12
10
+
11
+ ### Fixed
12
+
13
+ - Conversation compaction now keeps the summarization request within the run's
14
+ input token budget, so auto-compaction no longer fails on long conversations
15
+ and lets the run continue instead of aborting.
16
+
9
17
  ## 0.28.3 - 2026-08-12
10
18
 
11
19
  ### Changed
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: kolega-code
3
- Version: 0.28.3
3
+ Version: 0.28.4
4
4
  Summary: Multi-agent coding in the terminal
5
5
  Project-URL: Homepage, https://kolega-ai.github.io/kolega-code/
6
6
  Project-URL: Documentation, https://kolega-ai.github.io/kolega-code/
@@ -173,4 +173,4 @@ __all__ = [
173
173
  "parse_git_status_output",
174
174
  ]
175
175
 
176
- __version__ = "0.28.3"
176
+ __version__ = "0.28.4"
@@ -51,4 +51,4 @@ __all__ = [
51
51
  "ToolExtension",
52
52
  ]
53
53
 
54
- __version__ = "0.28.3"
54
+ __version__ = "0.28.4"
@@ -1208,6 +1208,7 @@ class BaseAgent(LogMixin):
1208
1208
  on_error=on_error,
1209
1209
  system_prompt_text=compaction_system_prompt,
1210
1210
  keep_recent=keep_recent,
1211
+ max_input_tokens=self.model_max_input_tokens,
1211
1212
  )
1212
1213
  if result.ok:
1213
1214
  # Compaction summarizes the injected volatile-context blocks along with
@@ -0,0 +1,324 @@
1
+ """History compression: summarize a conversation when it outgrows the context window."""
2
+
3
+ import json
4
+ import logging
5
+ from dataclasses import dataclass
6
+ from typing import Awaitable, Callable, List, Optional
7
+
8
+ from .conversation import Conversation, replace_image_blocks_with_placeholders
9
+ from kolega_code.llm.exceptions import LLMContextWindowExceededError
10
+ from kolega_code.llm.ledger import helper_origin, llm_call_origin
11
+ from kolega_code.llm.models import Message, MessageHistory, TextBlock, ToolCall, ToolResult
12
+ from .prompts import (
13
+ build_compression_summary_user_prompt,
14
+ COMPRESSION_SUMMARY_SYSTEM_PROMPT,
15
+ )
16
+
17
+ logger = logging.getLogger(__name__)
18
+
19
+ LogCallback = Callable[[str], Awaitable[None]]
20
+
21
+
22
+ @dataclass(frozen=True)
23
+ class CompactionResult:
24
+ """Outcome of a compaction attempt, surfaced to callers and the UI.
25
+
26
+ ``reason`` is a machine tag: "ok" | "too_few" | "nothing_to_summarize" | "llm_error".
27
+ ``message`` is a human-readable line for the command output / logs.
28
+ """
29
+
30
+ ok: bool
31
+ reason: str
32
+ summarized_messages: int = 0
33
+ message: str = ""
34
+
35
+
36
+ def _render_transcript(messages: List[Message]) -> str:
37
+ """Role-tagged plain text: JSON only for tool arguments, tool results raw.
38
+
39
+ JSON-escaping newline-heavy tool output costs ~30% more tokens than
40
+ leaving it raw.
41
+ """
42
+ out: List[str] = []
43
+ for message in messages:
44
+ if isinstance(message.content, str):
45
+ if message.content:
46
+ out.append(f"[{message.role}]\n{message.content}")
47
+ continue
48
+ for block in message.content:
49
+ if isinstance(block, ToolCall):
50
+ try:
51
+ args = json.dumps(block.input, ensure_ascii=False)
52
+ except (TypeError, ValueError):
53
+ args = str(block.input)
54
+ out.append(f"[assistant → {block.name}] {args}")
55
+ elif isinstance(block, ToolResult):
56
+ if isinstance(block.content, str):
57
+ body = block.content
58
+ else:
59
+ body = "\n".join(getattr(item, "text", "") or "" for item in block.content)
60
+ tag = "error" if block.is_error else "result"
61
+ out.append(f"[{block.name} {tag}]\n{body}")
62
+ else:
63
+ text = getattr(block, "text", None)
64
+ thinking = getattr(block, "thinking", None)
65
+ if text:
66
+ out.append(f"[{message.role}]\n{text}")
67
+ elif thinking:
68
+ out.append(f"[{message.role} thinking]\n{thinking}")
69
+ return "\n\n".join(out)
70
+
71
+
72
+ def _omission_notice(omitted: int) -> str:
73
+ return f"[... {omitted} conversation message(s) omitted here so the compaction request fits the context budget ...]"
74
+
75
+
76
+ def _approx_message_chars(message: Message) -> int:
77
+ """Size proxy for picking the omission gap; the request is re-counted before dispatch."""
78
+ if isinstance(message.content, str):
79
+ return len(message.content)
80
+ chars = 0
81
+ for block in message.content:
82
+ if isinstance(block, ToolCall):
83
+ try:
84
+ chars += len(json.dumps(block.input))
85
+ except (TypeError, ValueError):
86
+ chars += len(str(block.input))
87
+ elif isinstance(block, ToolResult):
88
+ if isinstance(block.content, str):
89
+ chars += len(block.content)
90
+ else:
91
+ chars += sum(len(getattr(item, "text", "") or "") for item in block.content)
92
+ else:
93
+ chars += len(getattr(block, "text", "") or "") + len(getattr(block, "thinking", "") or "")
94
+ return chars
95
+
96
+
97
+ def _middle_gap(weights: List[int], target_chars: float) -> tuple[int, int]:
98
+ """Pick the (head_end, tail_start) gap keeping ~``target_chars``: half from the
99
+ oldest messages (task statement), half from the newest (continuity)."""
100
+ half = target_chars / 2
101
+ head_end, acc = 0, 0
102
+ for index, weight in enumerate(weights):
103
+ if acc + weight > half:
104
+ break
105
+ acc += weight
106
+ head_end = index + 1
107
+ tail_start, acc = len(weights), 0
108
+ for index in range(len(weights) - 1, head_end - 1, -1):
109
+ if acc + weights[index] > half:
110
+ break
111
+ acc += weights[index]
112
+ tail_start = index
113
+ return head_end, tail_start
114
+
115
+
116
+ def _bundles_tool_results(message: Message) -> bool:
117
+ return isinstance(message.content, list) and any(isinstance(block, ToolResult) for block in message.content)
118
+
119
+
120
+ class HistoryCompressor:
121
+ """Summarizes a conversation non-destructively when it crosses the budget threshold."""
122
+
123
+ MIN_MESSAGES_TO_COMPRESS = 5
124
+ # How many of the most recent messages to keep verbatim after the summary.
125
+ KEEP_RECENT_MESSAGES = 6
126
+ # Don't bother summarizing a trivially short prefix.
127
+ MIN_PREFIX_TO_SUMMARIZE = 3
128
+ # Cap the summary length. The prompt targets ~600 words, but reasoning
129
+ # models (deepseek-v4-flash Responses, etc.) can consume the entire budget
130
+ # on chain-of-thought and leave no room for text output, producing an empty
131
+ # summary. A generous ceiling gives reasoning headroom while still staying
132
+ # well under the model's full completion budget.
133
+ SUMMARY_MAX_TOKENS = 8192
134
+ # Attempts at widening the omission gap per budget rung.
135
+ MAX_FIT_ATTEMPTS = 6
136
+
137
+ def __init__(self, threshold: float = 0.8) -> None:
138
+ # Fraction of the model context window above which compression kicks in
139
+ self.threshold = threshold
140
+
141
+ def over_budget(self, input_tokens: int, input_budget_tokens: int) -> bool:
142
+ """True when input exceeds the threshold fraction of the input budget."""
143
+ return input_tokens > input_budget_tokens * self.threshold
144
+
145
+ async def summarize(
146
+ self,
147
+ conversation: Conversation,
148
+ *,
149
+ llm,
150
+ model: str,
151
+ temperature: float,
152
+ thinking,
153
+ on_info: Optional[LogCallback] = None,
154
+ on_error: Optional[LogCallback] = None,
155
+ system_prompt_text: Optional[str] = None,
156
+ keep_recent: Optional[int] = None,
157
+ max_input_tokens: Optional[int] = None,
158
+ ) -> CompactionResult:
159
+ """
160
+ Non-destructively summarize the aged-out prefix while keeping the most
161
+ recent turns verbatim, and move the compaction boundary.
162
+
163
+ Incremental: only the messages that have aged out since the previous
164
+ boundary are summarized, with the prior summary folded in for continuity.
165
+ The aged-out span is presented to the summarizer as a role-tagged
166
+ plain-text transcript (tool arguments as JSON, tool results raw).
167
+ Returns a CompactionResult describing what happened — never a silent no-op.
168
+
169
+ ``keep_recent`` overrides KEEP_RECENT_MESSAGES (the verbatim tail). A
170
+ literal ``0`` is the aggressive fallback: everything before the safe
171
+ boundary — potentially including recent user content — becomes eligible
172
+ for lossy summarization. The raw history is never modified, and the
173
+ safe-boundary snap still keeps tool_use/tool_result pairs together.
174
+
175
+ ``max_input_tokens`` bounds the summarization request itself: while the
176
+ rendered request exceeds it, whole messages are dropped from the middle
177
+ of the span (never splitting a tool exchange) and an omission notice is
178
+ left in the gap. Dispatch walks a descending budget ladder (100%, 90%,
179
+ 80%, ... of the bound): if the enforcing side rejects a request the
180
+ counter accepted, the next rung re-widens the gap and retries until a
181
+ request is accepted. An unbounded request would be rejected before
182
+ dispatch and read as ``llm_error``, permanently disabling
183
+ auto-compaction.
184
+ """
185
+ history = conversation.history
186
+ if not history or len(history) < self.MIN_MESSAGES_TO_COMPRESS:
187
+ return CompactionResult(
188
+ ok=False,
189
+ reason="too_few",
190
+ message=(
191
+ f"Nothing to compress yet ({len(history)} message(s); "
192
+ f"need at least {self.MIN_MESSAGES_TO_COMPRESS})."
193
+ ),
194
+ )
195
+
196
+ if keep_recent is None:
197
+ keep_recent = self.KEEP_RECENT_MESSAGES
198
+ split = conversation.compaction_split_point(keep_recent=keep_recent, min_prefix=self.MIN_PREFIX_TO_SUMMARIZE)
199
+ prior_through = conversation.compacted_through if conversation.summary is not None else 0
200
+ if split is None or split <= prior_through:
201
+ return CompactionResult(
202
+ ok=False,
203
+ reason="nothing_to_summarize",
204
+ message="Already compact — no older messages to summarize.",
205
+ )
206
+
207
+ if on_info:
208
+ await on_info("Compressing message history...")
209
+
210
+ try:
211
+ # A summary needs no pixels, and base64 must stay out of the transcript.
212
+ prefix = replace_image_blocks_with_placeholders(list(history[prior_through:split]), model)
213
+ previous_summary = conversation.summary.get_text_content() if conversation.summary is not None else None
214
+
215
+ def build_request(head_end: int, tail_start: int) -> MessageHistory:
216
+ omitted = tail_start - head_end
217
+ if omitted:
218
+ parts = [
219
+ _render_transcript(prefix[:head_end]),
220
+ _omission_notice(omitted),
221
+ _render_transcript(prefix[tail_start:]),
222
+ ]
223
+ transcript = "\n\n".join(part for part in parts if part)
224
+ else:
225
+ transcript = _render_transcript(prefix)
226
+ prompt = build_compression_summary_user_prompt(transcript, previous_summary=previous_summary)
227
+ return MessageHistory([Message(role="user", content=[TextBlock(text=prompt)])])
228
+
229
+ head_end, tail_start = len(prefix), len(prefix)
230
+ messages = build_request(head_end, tail_start)
231
+ system_text = system_prompt_text or COMPRESSION_SUMMARY_SYSTEM_PROMPT
232
+ system_message = Message(role="system", content=[TextBlock(text=system_text)])
233
+ weights = [_approx_message_chars(message) for message in prefix]
234
+
235
+ async def widen_gap_until_fits(budget: int) -> None:
236
+ nonlocal head_end, tail_start, messages
237
+ for _ in range(self.MAX_FIT_ATTEMPTS):
238
+ counted = await llm.count_tokens(
239
+ messages=messages, system=system_message, model=model, thinking=thinking
240
+ )
241
+ if counted.input_tokens <= budget:
242
+ return
243
+ kept_chars = sum(weights[:head_end]) + sum(weights[tail_start:])
244
+ target_chars = kept_chars * budget / counted.input_tokens * 0.9
245
+ new_head, new_tail = _middle_gap(weights, target_chars)
246
+ # Keep tool exchanges whole on both edges of the gap.
247
+ new_head = conversation.snap_split_point(prior_through + new_head) - prior_through
248
+ while new_head < new_tail < len(prefix) and _bundles_tool_results(prefix[new_tail]):
249
+ new_tail += 1
250
+ if (new_head, new_tail) == (head_end, tail_start):
251
+ # Stalled (fixed prompt parts dominate): let the budget
252
+ # check or provider give the definitive answer.
253
+ return
254
+ head_end, tail_start = new_head, new_tail
255
+ messages = build_request(head_end, tail_start)
256
+
257
+ # Stream and drain rather than calling generate(): the Anthropic SDK
258
+ # rejects non-streaming requests whose max_tokens is large enough to risk
259
+ # a >10-minute response, which the model's full completion budget triggers.
260
+ #
261
+ # The helper origin spans the whole request: providers may sample and
262
+ # emit their trace record at context entry or final-message time, not
263
+ # at stream().
264
+ response = None
265
+ last_error: Optional[LLMContextWindowExceededError] = None
266
+ dispatched_gap: Optional[tuple[int, int]] = None
267
+ rungs = range(10, 0, -1) if max_input_tokens is not None else range(1)
268
+ for tenths in rungs:
269
+ if max_input_tokens is not None:
270
+ await widen_gap_until_fits(max_input_tokens * tenths // 10)
271
+ if dispatched_gap == (head_end, tail_start):
272
+ # This rung could not shrink the request any further;
273
+ # re-sending it would only be rejected again.
274
+ continue
275
+ try:
276
+ with llm_call_origin(helper_origin("compression")):
277
+ stream_cm = await llm.stream(
278
+ messages=messages,
279
+ system=system_message,
280
+ temperature=temperature,
281
+ model=model,
282
+ max_completion_tokens=self.SUMMARY_MAX_TOKENS,
283
+ thinking=thinking,
284
+ )
285
+ async with stream_cm as stream:
286
+ async for _event in stream:
287
+ pass
288
+ response = await stream.get_final_message()
289
+ break
290
+ except LLMContextWindowExceededError as exc:
291
+ if max_input_tokens is None:
292
+ raise
293
+ dispatched_gap = (head_end, tail_start)
294
+ last_error = exc
295
+ if response is None:
296
+ # Every rung was rejected or would have re-sent an identical request.
297
+ assert last_error is not None
298
+ raise last_error
299
+
300
+ summary_text = response.get_text_content()
301
+ if not summary_text or not summary_text.strip():
302
+ msg = "Compression produced an empty summary; history left unchanged."
303
+ if on_error:
304
+ await on_error(msg)
305
+ else:
306
+ logger.error(msg)
307
+ return CompactionResult(ok=False, reason="llm_error", message=msg)
308
+
309
+ folded = split - prior_through
310
+ conversation.apply_compaction(summary_text, split)
311
+
312
+ done = f"Compressed {folded} older message(s) into a summary; kept the latest turns verbatim."
313
+ if on_info:
314
+ await on_info(done)
315
+ return CompactionResult(ok=True, reason="ok", summarized_messages=folded, message=done)
316
+
317
+ except Exception as e:
318
+ # Never swallow into a fake success: log the full traceback and surface
319
+ # the real error to the caller.
320
+ logger.exception("Failed to compress message history")
321
+ msg = f"Failed to compress message history: {type(e).__name__}: {e}"
322
+ if on_error:
323
+ await on_error(msg)
324
+ return CompactionResult(ok=False, reason="llm_error", message=msg)
@@ -1085,6 +1085,11 @@ class Conversation:
1085
1085
  return None
1086
1086
  return candidate
1087
1087
 
1088
+ def snap_split_point(self, idx: int) -> int:
1089
+ """Clamp ``idx`` to history bounds and snap it backward so a tool_use/
1090
+ tool_result group is never split across a compaction boundary."""
1091
+ return self._snap_to_safe_boundary(max(0, min(idx, len(self._history))))
1092
+
1088
1093
  def _snap_to_safe_boundary(self, idx: int) -> int:
1089
1094
  """Move ``idx`` backward past any assistant tool_use so a tool_use/tool_result
1090
1095
  group is never split across the compaction boundary."""
@@ -14,4 +14,4 @@ Summarize the following coding session so far:
14
14
  {{ history }}
15
15
  </conversation_history>
16
16
 
17
- Produce the continuity briefing exactly as specified in your instructions. Summary text only — do not call tools.
17
+ Each transcript entry is tagged with its role; tool calls show their JSON arguments and tool results follow raw. A bracketed line marks messages omitted for length. Produce the continuity briefing exactly as specified in your instructions. Summary text only — do not call tools.
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "kolega-code"
7
- version = "0.28.3"
7
+ version = "0.28.4"
8
8
  description = "Multi-agent coding in the terminal"
9
9
  readme = "README.md"
10
10
  license = {file = "LICENSE"}
@@ -1,166 +0,0 @@
1
- """History compression: summarize a conversation when it outgrows the context window."""
2
-
3
- import logging
4
- from dataclasses import dataclass
5
- from typing import Awaitable, Callable, Optional
6
-
7
- from .conversation import Conversation
8
- from kolega_code.llm.ledger import helper_origin, llm_call_origin
9
- from kolega_code.llm.models import Message, MessageHistory, TextBlock
10
- from .prompts import (
11
- build_compression_summary_user_prompt,
12
- COMPRESSION_SUMMARY_SYSTEM_PROMPT,
13
- )
14
-
15
- logger = logging.getLogger(__name__)
16
-
17
- LogCallback = Callable[[str], Awaitable[None]]
18
-
19
-
20
- @dataclass(frozen=True)
21
- class CompactionResult:
22
- """Outcome of a compaction attempt, surfaced to callers and the UI.
23
-
24
- ``reason`` is a machine tag: "ok" | "too_few" | "nothing_to_summarize" | "llm_error".
25
- ``message`` is a human-readable line for the command output / logs.
26
- """
27
-
28
- ok: bool
29
- reason: str
30
- summarized_messages: int = 0
31
- message: str = ""
32
-
33
-
34
- class HistoryCompressor:
35
- """Summarizes a conversation non-destructively when it crosses the budget threshold."""
36
-
37
- MIN_MESSAGES_TO_COMPRESS = 5
38
- # How many of the most recent messages to keep verbatim after the summary.
39
- KEEP_RECENT_MESSAGES = 6
40
- # Don't bother summarizing a trivially short prefix.
41
- MIN_PREFIX_TO_SUMMARIZE = 3
42
- # Cap the summary length. The prompt targets ~600 words, but reasoning
43
- # models (deepseek-v4-flash Responses, etc.) can consume the entire budget
44
- # on chain-of-thought and leave no room for text output, producing an empty
45
- # summary. A generous ceiling gives reasoning headroom while still staying
46
- # well under the model's full completion budget.
47
- SUMMARY_MAX_TOKENS = 8192
48
-
49
- def __init__(self, threshold: float = 0.8) -> None:
50
- # Fraction of the model context window above which compression kicks in
51
- self.threshold = threshold
52
-
53
- def over_budget(self, input_tokens: int, input_budget_tokens: int) -> bool:
54
- """True when input exceeds the threshold fraction of the input budget."""
55
- return input_tokens > input_budget_tokens * self.threshold
56
-
57
- async def summarize(
58
- self,
59
- conversation: Conversation,
60
- *,
61
- llm,
62
- model: str,
63
- temperature: float,
64
- thinking,
65
- on_info: Optional[LogCallback] = None,
66
- on_error: Optional[LogCallback] = None,
67
- system_prompt_text: Optional[str] = None,
68
- keep_recent: Optional[int] = None,
69
- ) -> CompactionResult:
70
- """
71
- Non-destructively summarize the aged-out prefix while keeping the most
72
- recent turns verbatim, and move the compaction boundary.
73
-
74
- Incremental: only the messages that have aged out since the previous
75
- boundary are summarized, with the prior summary folded in for continuity.
76
- Returns a CompactionResult describing what happened — never a silent no-op.
77
-
78
- ``keep_recent`` overrides KEEP_RECENT_MESSAGES (the verbatim tail). A
79
- literal ``0`` is the aggressive fallback: everything before the safe
80
- boundary — potentially including recent user content — becomes eligible
81
- for lossy summarization. The raw history is never modified, and the
82
- safe-boundary snap still keeps tool_use/tool_result pairs together.
83
- """
84
- history = conversation.history
85
- if not history or len(history) < self.MIN_MESSAGES_TO_COMPRESS:
86
- return CompactionResult(
87
- ok=False,
88
- reason="too_few",
89
- message=(
90
- f"Nothing to compress yet ({len(history)} message(s); "
91
- f"need at least {self.MIN_MESSAGES_TO_COMPRESS})."
92
- ),
93
- )
94
-
95
- if keep_recent is None:
96
- keep_recent = self.KEEP_RECENT_MESSAGES
97
- split = conversation.compaction_split_point(keep_recent=keep_recent, min_prefix=self.MIN_PREFIX_TO_SUMMARIZE)
98
- prior_through = conversation.compacted_through if conversation.summary is not None else 0
99
- if split is None or split <= prior_through:
100
- return CompactionResult(
101
- ok=False,
102
- reason="nothing_to_summarize",
103
- message="Already compact — no older messages to summarize.",
104
- )
105
-
106
- if on_info:
107
- await on_info("Compressing message history...")
108
-
109
- try:
110
- prefix = MessageHistory(list(history[prior_through:split]))
111
- prefix_markdown = prefix.get_markdown_conversation()
112
- previous_summary = conversation.summary.get_text_content() if conversation.summary is not None else None
113
- user_prompt_filled = build_compression_summary_user_prompt(
114
- prefix_markdown, previous_summary=previous_summary
115
- )
116
-
117
- messages = MessageHistory([Message(role="user", content=[TextBlock(text=user_prompt_filled)])])
118
- system_text = system_prompt_text or COMPRESSION_SUMMARY_SYSTEM_PROMPT
119
- system_message = Message(role="system", content=[TextBlock(text=system_text)])
120
-
121
- # Stream and drain rather than calling generate(): the Anthropic SDK
122
- # rejects non-streaming requests whose max_tokens is large enough to risk
123
- # a >10-minute response, which the model's full completion budget triggers.
124
- #
125
- # The helper origin spans the whole request: providers may sample and
126
- # emit their trace record at context entry or final-message time, not
127
- # at stream().
128
- with llm_call_origin(helper_origin("compression")):
129
- stream_cm = await llm.stream(
130
- messages=messages,
131
- system=system_message,
132
- temperature=temperature,
133
- model=model,
134
- max_completion_tokens=self.SUMMARY_MAX_TOKENS,
135
- thinking=thinking,
136
- )
137
- async with stream_cm as stream:
138
- async for _event in stream:
139
- pass
140
- response = await stream.get_final_message()
141
-
142
- summary_text = response.get_text_content()
143
- if not summary_text or not summary_text.strip():
144
- msg = "Compression produced an empty summary; history left unchanged."
145
- if on_error:
146
- await on_error(msg)
147
- else:
148
- logger.error(msg)
149
- return CompactionResult(ok=False, reason="llm_error", message=msg)
150
-
151
- folded = split - prior_through
152
- conversation.apply_compaction(summary_text, split)
153
-
154
- done = f"Compressed {folded} older message(s) into a summary; kept the latest turns verbatim."
155
- if on_info:
156
- await on_info(done)
157
- return CompactionResult(ok=True, reason="ok", summarized_messages=folded, message=done)
158
-
159
- except Exception as e:
160
- # Never swallow into a fake success: log the full traceback and surface
161
- # the real error to the caller.
162
- logger.exception("Failed to compress message history")
163
- msg = f"Failed to compress message history: {type(e).__name__}: {e}"
164
- if on_error:
165
- await on_error(msg)
166
- return CompactionResult(ok=False, reason="llm_error", message=msg)
File without changes
File without changes
File without changes
File without changes
File without changes