kolega-code 0.28.2__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.2 → kolega_code-0.28.4}/CHANGELOG.md +16 -0
  2. {kolega_code-0.28.2 → kolega_code-0.28.4}/PKG-INFO +1 -1
  3. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/__init__.py +1 -1
  4. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/__init__.py +1 -1
  5. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/baseagent.py +2 -1
  6. kolega_code-0.28.4/kolega_code/agent/compression.py +324 -0
  7. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/conversation.py +5 -0
  8. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/auxiliary/compression/summary.user.md.j2 +1 -1
  9. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/tools.py +1 -3
  10. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/config.py +1 -1
  11. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/llm/specs/catalog/thinking_machines.py +2 -0
  12. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/llm/specs/catalog/tinker.py +23 -0
  13. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/llm/specs/tinker_catalog.py +4 -0
  14. {kolega_code-0.28.2 → kolega_code-0.28.4}/pyproject.toml +1 -1
  15. kolega_code-0.28.2/kolega_code/agent/compression.py +0 -166
  16. {kolega_code-0.28.2 → kolega_code-0.28.4}/.gitignore +0 -0
  17. {kolega_code-0.28.2 → kolega_code-0.28.4}/CONTRIBUTING.md +0 -0
  18. {kolega_code-0.28.2 → kolega_code-0.28.4}/LICENSE +0 -0
  19. {kolega_code-0.28.2 → kolega_code-0.28.4}/MIGRATION.md +0 -0
  20. {kolega_code-0.28.2 → kolega_code-0.28.4}/README.md +0 -0
  21. {kolega_code-0.28.2 → kolega_code-0.28.4}/RELEASING.md +0 -0
  22. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/_bundled_skills/LICENSE +0 -0
  23. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/_bundled_skills/manifest.json +0 -0
  24. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/deep-research/SKILL.md +0 -0
  25. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/deep-research/references/evidence-and-reporting.md +0 -0
  26. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/deep-research/references/gigacode-workflow.md +0 -0
  27. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/deep-research/scripts/deep-research.workflow +0 -0
  28. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/deep-research/scripts/materialize_report.py +0 -0
  29. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/docx/LICENSE +0 -0
  30. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/docx/SKILL.md +0 -0
  31. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/docx/references/examples.md +0 -0
  32. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/docx/references/limitations.md +0 -0
  33. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/docx/references/operations.md +0 -0
  34. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/docx/references/quality.md +0 -0
  35. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/docx/requirements.txt +0 -0
  36. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/docx/scripts/docx_tool.py +0 -0
  37. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/docx/scripts/smoke_test.py +0 -0
  38. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/humanizer/LICENSE +0 -0
  39. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/humanizer/SKILL.md +0 -0
  40. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/pdf/LICENSE +0 -0
  41. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/pdf/SKILL.md +0 -0
  42. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/pdf/references/examples.md +0 -0
  43. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/pdf/references/limitations.md +0 -0
  44. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/pdf/references/ocr.md +0 -0
  45. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/pdf/references/operations.md +0 -0
  46. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/pdf/references/quality.md +0 -0
  47. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/pdf/references/redaction.md +0 -0
  48. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/pdf/requirements-ocr-paddle.txt +0 -0
  49. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/pdf/requirements-ocr-surya.txt +0 -0
  50. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/pdf/requirements.txt +0 -0
  51. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/pdf/scripts/pdf_tool.py +0 -0
  52. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/pdf/scripts/smoke_test.py +0 -0
  53. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/pptx/LICENSE +0 -0
  54. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/pptx/SKILL.md +0 -0
  55. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/pptx/references/examples.md +0 -0
  56. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/pptx/references/limitations.md +0 -0
  57. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/pptx/references/operations.md +0 -0
  58. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/pptx/requirements.txt +0 -0
  59. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/pptx/scripts/pptx_tool.py +0 -0
  60. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/pptx/scripts/smoke_test.py +0 -0
  61. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/review/SKILL.md +0 -0
  62. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/review/references/github-publishing.md +0 -0
  63. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/skill-authoring/SKILL.md +0 -0
  64. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/skill-authoring/references/review-checklist.md +0 -0
  65. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/xlsx/LICENSE +0 -0
  66. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/xlsx/SKILL.md +0 -0
  67. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/xlsx/references/examples.md +0 -0
  68. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/xlsx/references/limitations.md +0 -0
  69. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/xlsx/references/operations.md +0 -0
  70. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/xlsx/references/quality.md +0 -0
  71. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/xlsx/requirements.txt +0 -0
  72. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/xlsx/scripts/smoke_test.py +0 -0
  73. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/_bundled_skills/skills/xlsx/scripts/xlsx_tool.py +0 -0
  74. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/browseragent.py +0 -0
  75. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/coder.py +0 -0
  76. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/common.py +0 -0
  77. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/context.py +0 -0
  78. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/custom_agents.py +0 -0
  79. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/edit_protocols.py +0 -0
  80. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/errors.py +0 -0
  81. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/eval/__init__.py +0 -0
  82. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/eval/bridge.py +0 -0
  83. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/eval/bundle-requirements.in +0 -0
  84. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/eval/bundle-requirements.txt +0 -0
  85. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/eval/env.py +0 -0
  86. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/eval/js_kernel.py +0 -0
  87. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/eval/kernel.py +0 -0
  88. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/eval/prelude.js +0 -0
  89. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/eval/prelude.py +0 -0
  90. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/eval/protocol.py +0 -0
  91. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/eval/py_kernel.py +0 -0
  92. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/eval/runner.js +0 -0
  93. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/eval/runner.py +0 -0
  94. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/generalagent.py +0 -0
  95. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/goal.py +0 -0
  96. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/investigationagent.py +0 -0
  97. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/model_routing.py +0 -0
  98. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/orchestration/__init__.py +0 -0
  99. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/orchestration/accounting.py +0 -0
  100. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/orchestration/budget.py +0 -0
  101. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/orchestration/context.py +0 -0
  102. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/orchestration/errors.py +0 -0
  103. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/orchestration/executor.py +0 -0
  104. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/orchestration/guide.py +0 -0
  105. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/orchestration/journal.py +0 -0
  106. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/orchestration/runtime.py +0 -0
  107. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/orchestration/types.py +0 -0
  108. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/planningagent.py +0 -0
  109. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/prompt_dump.py +0 -0
  110. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/prompt_overrides.py +0 -0
  111. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/prompt_provider.py +0 -0
  112. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/auxiliary/agent_loop/silent_turn_exhausted.user.md +0 -0
  113. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/auxiliary/agent_loop/silent_turn_nudge.user.md.j2 +0 -0
  114. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/auxiliary/agent_loop/truncated_turn_nudge.user.md.j2 +0 -0
  115. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/auxiliary/compression/summary.system.md +0 -0
  116. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/auxiliary/terminal/output_summary.system.md +0 -0
  117. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/auxiliary/terminal/safety.system.md +0 -0
  118. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/extensions/cli/build_questions.md +0 -0
  119. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/extensions/cli/current_plan_artifact.md.j2 +0 -0
  120. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/extensions/cli/mode_switch_notice.md.j2 +0 -0
  121. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/extensions/cli/planning_questions.md +0 -0
  122. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/extensions/cli/scratchpad.md.j2 +0 -0
  123. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/extensions/cli/shared_task_list.md +0 -0
  124. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/extensions/cli/shared_task_list_readonly.md +0 -0
  125. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/extensions/cli/worktree_control.md.j2 +0 -0
  126. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/extensions/skills/catalog.md.j2 +0 -0
  127. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/system/agents/browser.md.j2 +0 -0
  128. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/system/agents/coder_ask.md.j2 +0 -0
  129. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/system/agents/coder_base.md.j2 +0 -0
  130. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/system/agents/coder_cli.md.j2 +0 -0
  131. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/system/agents/general.md.j2 +0 -0
  132. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/system/agents/investigation.md.j2 +0 -0
  133. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/system/agents/planning.md.j2 +0 -0
  134. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/system/includes/agents_md_instructions.md +0 -0
  135. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/system/includes/context_updates.md +0 -0
  136. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/system/includes/environment_variables/workspace_env_vars.md +0 -0
  137. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/system/includes/frontend_guidance.md +0 -0
  138. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/system/includes/starter_templates/expo.md +0 -0
  139. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/system/includes/starter_templates/html_website.md +0 -0
  140. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/system/includes/starter_templates/mern_stack.md +0 -0
  141. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/system/includes/starter_templates/react_vite_shadcdn.md +0 -0
  142. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/system/includes/terminal_tools.md +0 -0
  143. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/apply_patch.md +0 -0
  144. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/ask_user_choice.md +0 -0
  145. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/browser_click.md +0 -0
  146. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/browser_close.md +0 -0
  147. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/browser_console_messages.md +0 -0
  148. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/browser_drag.md +0 -0
  149. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/browser_drop.md +0 -0
  150. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/browser_evaluate.md +0 -0
  151. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/browser_file_upload.md +0 -0
  152. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/browser_fill_form.md +0 -0
  153. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/browser_find.md +0 -0
  154. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/browser_handle_dialog.md +0 -0
  155. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/browser_hover.md +0 -0
  156. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/browser_navigate.md +0 -0
  157. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/browser_navigate_back.md +0 -0
  158. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/browser_network_request.md +0 -0
  159. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/browser_network_requests.md +0 -0
  160. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/browser_press_key.md +0 -0
  161. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/browser_resize.md +0 -0
  162. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/browser_scroll.md +0 -0
  163. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/browser_select_option.md +0 -0
  164. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/browser_snapshot.md +0 -0
  165. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/browser_tabs.md +0 -0
  166. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/browser_take_screenshot.md +0 -0
  167. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/browser_type.md +0 -0
  168. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/browser_wait_for.md +0 -0
  169. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/build_backend.md +0 -0
  170. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/build_frontend.md +0 -0
  171. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/claude_edit.md +0 -0
  172. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/claude_write.md +0 -0
  173. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/dispatch_agent.md +0 -0
  174. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/edit.md +0 -0
  175. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/eval.md +0 -0
  176. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/exec_command.md +0 -0
  177. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/get_host.md +0 -0
  178. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/get_task_list.md +0 -0
  179. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/get_task_list_readonly.md +0 -0
  180. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/hashline_edit.md +0 -0
  181. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/hashline_write.md +0 -0
  182. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/kill_command.md +0 -0
  183. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/list_sessions.md +0 -0
  184. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/list_subagent_models.md +0 -0
  185. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/list_workflow_runs.md +0 -0
  186. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/lsp.md +0 -0
  187. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/lsp_edit.md +0 -0
  188. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/multi_edit.md +0 -0
  189. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/read.md +0 -0
  190. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/read_image.md +0 -0
  191. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/resolve.md +0 -0
  192. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/run_workflow.md +0 -0
  193. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/set_goal.md +0 -0
  194. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/skill.md +0 -0
  195. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/snapshot.md +0 -0
  196. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/switch_worktree.md +0 -0
  197. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/update_task_list.md +0 -0
  198. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/web_fetch.md +0 -0
  199. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/web_search.md +0 -0
  200. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/write.md +0 -0
  201. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/write_plan.md +0 -0
  202. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/tools/write_stdin.md +0 -0
  203. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/user_tasks/cli/implement_plan.md.j2 +0 -0
  204. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/prompt_templates/user_tasks/cli/init_agents.md.j2 +0 -0
  205. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/prompts.py +0 -0
  206. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/tool_backend/agent_tool.py +0 -0
  207. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/tool_backend/base_tool.py +0 -0
  208. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/tool_backend/browser_tool.py +0 -0
  209. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/tool_backend/build_tool.py +0 -0
  210. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/tool_backend/codex_patch.py +0 -0
  211. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/tool_backend/edit_preview.py +0 -0
  212. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/tool_backend/edit_tool.py +0 -0
  213. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/tool_backend/eval_tool.py +0 -0
  214. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/tool_backend/hashline_v2.py +0 -0
  215. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/tool_backend/lsp_tool.py +0 -0
  216. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/tool_backend/memory_tool.py +0 -0
  217. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/tool_backend/network_status.py +0 -0
  218. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/tool_backend/read_file_tool.py +0 -0
  219. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/tool_backend/read_image_tool.py +0 -0
  220. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/tool_backend/search_backends/__init__.py +0 -0
  221. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/tool_backend/search_backends/base.py +0 -0
  222. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/tool_backend/search_backends/duckduckgo.py +0 -0
  223. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/tool_backend/search_backends/errors.py +0 -0
  224. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/tool_backend/search_backends/firecrawl.py +0 -0
  225. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/tool_backend/search_backends/models.py +0 -0
  226. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/tool_backend/search_backends/searxng.py +0 -0
  227. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/tool_backend/search_backends/tavily.py +0 -0
  228. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/tool_backend/snapshot_tool.py +0 -0
  229. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/tool_backend/streaming_tool.py +0 -0
  230. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/tool_backend/terminal_tool.py +0 -0
  231. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/tool_backend/web_fetch/__init__.py +0 -0
  232. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/tool_backend/web_fetch/answering.py +0 -0
  233. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/tool_backend/web_fetch/documents.py +0 -0
  234. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/tool_backend/web_fetch/extractors.py +0 -0
  235. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/tool_backend/web_fetch/pipeline.py +0 -0
  236. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/tool_backend/web_fetch/retrieval.py +0 -0
  237. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/tool_backend/web_fetch_tool.py +0 -0
  238. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/tool_backend/web_search_tool.py +0 -0
  239. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/tool_backend/workflow_tool.py +0 -0
  240. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/tool_definitions.py +0 -0
  241. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/utils/commands.py +0 -0
  242. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/agent/volatile_context.py +0 -0
  243. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/auth/__init__.py +0 -0
  244. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/auth/_jwt.py +0 -0
  245. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/auth/chatgpt_oauth.py +0 -0
  246. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/auth/constants.py +0 -0
  247. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/auth/tokens.py +0 -0
  248. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/browser_extension/__init__.py +0 -0
  249. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/browser_extension/framing.py +0 -0
  250. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/browser_extension/installer.py +0 -0
  251. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/browser_extension/manager.py +0 -0
  252. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/browser_extension/multiplex.py +0 -0
  253. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/browser_extension/native_host.py +0 -0
  254. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/browser_extension/protocol.py +0 -0
  255. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/browser_extension/registry.py +0 -0
  256. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/browser_extension/runtime.py +0 -0
  257. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/cli/__init__.py +0 -0
  258. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/cli/app.py +0 -0
  259. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/cli/ask_output.py +0 -0
  260. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/cli/atif_export.py +0 -0
  261. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/cli/browser_backend.py +0 -0
  262. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/cli/clipboard_image.py +0 -0
  263. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/cli/config.py +0 -0
  264. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/cli/connection.py +0 -0
  265. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/cli/cron.py +0 -0
  266. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/cli/diagnostics.py +0 -0
  267. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/cli/file_index.py +0 -0
  268. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/cli/goal.py +0 -0
  269. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/cli/loop.py +0 -0
  270. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/cli/main.py +0 -0
  271. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/cli/mentions.py +0 -0
  272. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/cli/messages.py +0 -0
  273. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/cli/model_catalog.py +0 -0
  274. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/cli/model_connection.py +0 -0
  275. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/cli/plan_artifacts.py +0 -0
  276. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/cli/provider_registry.py +0 -0
  277. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/cli/session_event_protocol.py +0 -0
  278. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/cli/session_event_store.py +0 -0
  279. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/cli/session_journal.py +0 -0
  280. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/cli/session_store.py +0 -0
  281. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/cli/session_usage.py +0 -0
  282. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/cli/settings.py +0 -0
  283. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/cli/skills.py +0 -0
  284. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/cli/slash_commands.py +0 -0
  285. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/cli/theme.py +0 -0
  286. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/cli/tui/__init__.py +0 -0
  287. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/cli/tui/agent_runtime.py +0 -0
  288. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/cli/tui/app_base.py +0 -0
  289. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/cli/tui/changes_screen.py +0 -0
  290. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/cli/tui/command_handlers.py +0 -0
  291. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/cli/tui/constants.py +0 -0
  292. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/cli/tui/custom_model.py +0 -0
  293. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/cli/tui/loop_runtime.py +0 -0
  294. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/cli/tui/memory_screen.py +0 -0
  295. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/cli/tui/onboarding_screen.py +0 -0
  296. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/cli/tui/pacing.py +0 -0
  297. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/cli/tui/prompt_flows.py +0 -0
  298. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/cli/tui/session_diff.py +0 -0
  299. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/cli/tui/settings_panel.py +0 -0
  300. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/cli/tui/settings_screen.py +0 -0
  301. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/cli/tui/state.py +0 -0
  302. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/cli/tui/status_dashboard.py +0 -0
  303. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/cli/tui/styles.tcss +0 -0
  304. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/cli/tui/sub_agent_screen.py +0 -0
  305. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/cli/tui/terminal_display.py +0 -0
  306. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/cli/tui/transcript.py +0 -0
  307. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/cli/tui/widgets.py +0 -0
  308. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/cli/updater.py +0 -0
  309. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/events.py +0 -0
  310. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/extensions.py +0 -0
  311. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/git_env.py +0 -0
  312. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/hooks/__init__.py +0 -0
  313. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/hooks/backends.py +0 -0
  314. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/hooks/config.py +0 -0
  315. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/hooks/dispatcher.py +0 -0
  316. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/hooks/events.py +0 -0
  317. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/hooks/matcher.py +0 -0
  318. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/hooks/outcome.py +0 -0
  319. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/llm/client.py +0 -0
  320. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/llm/exceptions.py +0 -0
  321. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/llm/instrumented_client.py +0 -0
  322. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/llm/ledger.py +0 -0
  323. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/llm/models.py +0 -0
  324. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/llm/providers/__init__.py +0 -0
  325. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/llm/providers/_token_encoding.py +0 -0
  326. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/llm/providers/anthropic.py +0 -0
  327. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/llm/providers/base.py +0 -0
  328. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/llm/providers/chatgpt_oauth.py +0 -0
  329. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/llm/providers/deepseek_responses.py +0 -0
  330. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/llm/providers/google.py +0 -0
  331. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/llm/providers/models.py +0 -0
  332. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/llm/providers/openai.py +0 -0
  333. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/llm/providers/openai_responses.py +0 -0
  334. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/llm/providers/responses_common.py +0 -0
  335. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/llm/providers/tinker.py +0 -0
  336. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/llm/providers/tinker_trace.py +0 -0
  337. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/llm/ratelimit.py +0 -0
  338. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/llm/specs/__init__.py +0 -0
  339. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/llm/specs/accessors.py +0 -0
  340. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/llm/specs/catalog/__init__.py +0 -0
  341. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/llm/specs/catalog/anthropic.py +0 -0
  342. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/llm/specs/catalog/dashscope.py +0 -0
  343. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/llm/specs/catalog/deepseek.py +0 -0
  344. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/llm/specs/catalog/fireworks.py +0 -0
  345. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/llm/specs/catalog/google.py +0 -0
  346. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/llm/specs/catalog/kimi_coding.py +0 -0
  347. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/llm/specs/catalog/moonshot.py +0 -0
  348. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/llm/specs/catalog/ollama_cloud.py +0 -0
  349. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/llm/specs/catalog/openai.py +0 -0
  350. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/llm/specs/catalog/openai_chatgpt.py +0 -0
  351. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/llm/specs/catalog/openrouter.py +0 -0
  352. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/llm/specs/catalog/together.py +0 -0
  353. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/llm/specs/catalog/xai.py +0 -0
  354. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/llm/specs/catalog/zai.py +0 -0
  355. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/llm/specs/ollama_cloud_catalog.py +0 -0
  356. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/llm/specs/openrouter_catalog.py +0 -0
  357. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/llm/specs/thinking.py +0 -0
  358. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/llm/specs/types.py +0 -0
  359. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/llm/specs/validation.py +0 -0
  360. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/llm/timeouts.py +0 -0
  361. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/llm/tool_execution_ids.py +0 -0
  362. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/llm/usage.py +0 -0
  363. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/local_state.py +0 -0
  364. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/mcp/__init__.py +0 -0
  365. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/mcp/config.py +0 -0
  366. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/mcp/oauth.py +0 -0
  367. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/mcp/service.py +0 -0
  368. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/mcp/state.py +0 -0
  369. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/mcp/tools.py +0 -0
  370. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/mcp/transport.py +0 -0
  371. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/memory/__init__.py +0 -0
  372. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/memory/identity.py +0 -0
  373. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/memory/manager.py +0 -0
  374. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/memory/manifest.py +0 -0
  375. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/memory/markdown.py +0 -0
  376. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/memory/models.py +0 -0
  377. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/memory/protocol.py +0 -0
  378. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/memory/registry.py +0 -0
  379. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/models/__init__.py +0 -0
  380. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/models/sandbox_terminal_state.py +0 -0
  381. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/permissions.py +0 -0
  382. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/runtime.py +0 -0
  383. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/sandbox/README.md +0 -0
  384. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/sandbox/__init__.py +0 -0
  385. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/sandbox/async_filesystem.py +0 -0
  386. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/sandbox/base.py +0 -0
  387. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/sandbox/browser.py +0 -0
  388. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/sandbox/event_loop.py +0 -0
  389. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/sandbox/filesystem.py +0 -0
  390. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/sandbox/local.py +0 -0
  391. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/sandbox/serializer.py +0 -0
  392. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/sandbox/terminal.py +0 -0
  393. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/sandbox/utils.py +0 -0
  394. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/scratchpad.py +0 -0
  395. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/security/__init__.py +0 -0
  396. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/security/secrets.py +0 -0
  397. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/services/base.py +0 -0
  398. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/services/browser.py +0 -0
  399. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/services/file_system.py +0 -0
  400. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/services/html.py +0 -0
  401. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/services/lsp/__init__.py +0 -0
  402. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/services/lsp/client.py +0 -0
  403. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/services/lsp/config.py +0 -0
  404. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/services/lsp/detector.py +0 -0
  405. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/services/lsp/diagnostics.py +0 -0
  406. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/services/lsp/edits.py +0 -0
  407. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/services/lsp/manager.py +0 -0
  408. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/services/lsp/registry.py +0 -0
  409. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/services/lsp/registry.yaml +0 -0
  410. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/services/snapshots.py +0 -0
  411. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/services/terminal.py +0 -0
  412. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/services/terminal_buffer.py +0 -0
  413. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/services/workspace_scan.py +0 -0
  414. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/session/__init__.py +0 -0
  415. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/session/control.py +0 -0
  416. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/session/inmemory.py +0 -0
  417. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/session/projection.py +0 -0
  418. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/session/recording.py +0 -0
  419. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/session/runtime.py +0 -0
  420. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/session/store.py +0 -0
  421. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/testing/__init__.py +0 -0
  422. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/testing/store_conformance.py +0 -0
  423. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/tools/__init__.py +0 -0
  424. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/tools/core.py +0 -0
  425. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/tools/definitions.py +0 -0
  426. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/tools/param_aliases.py +0 -0
  427. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/tools/registry.py +0 -0
  428. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/utils/__init__.py +0 -0
  429. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/utils/images.py +0 -0
  430. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/web/__init__.py +0 -0
  431. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/web/assets/fold.js +0 -0
  432. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/web/assets/player.css +0 -0
  433. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/web/assets/player.html +0 -0
  434. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/web/assets/player.js +0 -0
  435. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/web/bundle.py +0 -0
  436. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/web/hosting.py +0 -0
  437. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/web/redaction.py +0 -0
  438. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/web/server.py +0 -0
  439. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/web/singlefile.py +0 -0
  440. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/web/theme_css.py +0 -0
  441. {kolega_code-0.28.2 → kolega_code-0.28.4}/kolega_code/worktrees.py +0 -0
@@ -6,6 +6,22 @@ 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
+
17
+ ## 0.28.3 - 2026-08-12
18
+
19
+ ### Changed
20
+
21
+ - Claude-style `edit` and `write` tools are now the default model-facing edit
22
+ protocol. Explicit overrides and model-catalog preferences still take
23
+ precedence, and the legacy search/replace protocol remains available.
24
+
9
25
  ## 0.28.2 - 2026-08-12
10
26
 
11
27
  ### Fixed
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: kolega-code
3
- Version: 0.28.2
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.2"
176
+ __version__ = "0.28.4"
@@ -51,4 +51,4 @@ __all__ = [
51
51
  "ToolExtension",
52
52
  ]
53
53
 
54
- __version__ = "0.28.2"
54
+ __version__ = "0.28.4"
@@ -321,7 +321,7 @@ class BaseAgent(LogMixin):
321
321
  self.primary_model_config = self.config.model_config_for_agent(self.agent_name)
322
322
  resolved_edit_protocol = self.config.resolve_edit_protocol(self.primary_model_config)
323
323
  self.edit_protocol = (
324
- resolved_edit_protocol if isinstance(resolved_edit_protocol, EditProtocol) else EditProtocol.SEARCH_REPLACE
324
+ resolved_edit_protocol if isinstance(resolved_edit_protocol, EditProtocol) else EditProtocol.CLAUDE_CODE
325
325
  )
326
326
  self.filesystem = context.services.filesystem
327
327
  self.terminal_manager = context.services.terminal_manager
@@ -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.
@@ -341,9 +341,7 @@ class ToolCollection(LogMixin):
341
341
  model_config = config.long_context_config
342
342
  resolved_edit_protocol = config.resolve_edit_protocol(model_config)
343
343
  self.edit_protocol = (
344
- resolved_edit_protocol
345
- if isinstance(resolved_edit_protocol, EditProtocol)
346
- else EditProtocol.SEARCH_REPLACE
344
+ resolved_edit_protocol if isinstance(resolved_edit_protocol, EditProtocol) else EditProtocol.CLAUDE_CODE
347
345
  )
348
346
  self.langfuse_client = langfuse_client
349
347
  self.tool_extensions = tool_extensions or []
@@ -313,7 +313,7 @@ class AgentConfig(BaseModel):
313
313
  preferred = preferred_edit_protocol(effective_model.provider, effective_model.model)
314
314
  if preferred is not None:
315
315
  return EditProtocol(preferred), "model_catalog"
316
- return EditProtocol.SEARCH_REPLACE, "default"
316
+ return EditProtocol.CLAUDE_CODE, "default"
317
317
 
318
318
  def get_api_key(self, provider: ModelProvider) -> Optional[str]:
319
319
  """Get the API key for a specific provider."""
@@ -15,6 +15,7 @@ THINKING_MACHINES_SPECS = {
15
15
  "input_budget": "window_minus_output",
16
16
  "default_temperature": 1.0,
17
17
  "supports_vision": True,
18
+ "preferred_edit_protocol": "claude_code",
18
19
  "thinking_effort": ThinkingEffortSpec(
19
20
  options=("none", "low", "medium", "high", "xhigh", "max"),
20
21
  default="high",
@@ -27,6 +28,7 @@ THINKING_MACHINES_SPECS = {
27
28
  "input_budget": "window_minus_output",
28
29
  "default_temperature": 1.0,
29
30
  "supports_vision": True,
31
+ "preferred_edit_protocol": "claude_code",
30
32
  "thinking_effort": ThinkingEffortSpec(
31
33
  options=("none", "low", "medium", "high", "xhigh", "max"),
32
34
  default="high",
@@ -16,6 +16,7 @@ TINKER_SPECS = {
16
16
  "input_budget": "window_minus_output",
17
17
  "default_temperature": 1.0,
18
18
  "supports_vision": True,
19
+ "preferred_edit_protocol": "claude_code",
19
20
  "thinking_effort": ThinkingEffortSpec(
20
21
  options=("none", "low", "medium", "high", "xhigh", "max"),
21
22
  default="high",
@@ -28,6 +29,7 @@ TINKER_SPECS = {
28
29
  "input_budget": "window_minus_output",
29
30
  "default_temperature": 1.0,
30
31
  "supports_vision": True,
32
+ "preferred_edit_protocol": "claude_code",
31
33
  "thinking_effort": ThinkingEffortSpec(
32
34
  options=("none", "low", "medium", "high", "xhigh", "max"),
33
35
  default="high",
@@ -40,6 +42,7 @@ TINKER_SPECS = {
40
42
  "input_budget": "window_minus_output",
41
43
  "default_temperature": 1.0,
42
44
  "supports_vision": True,
45
+ "preferred_edit_protocol": "claude_code",
43
46
  "thinking_effort": ThinkingEffortSpec(
44
47
  options=("none", "low", "medium", "high", "xhigh", "max"),
45
48
  default="high",
@@ -52,6 +55,7 @@ TINKER_SPECS = {
52
55
  "input_budget": "window_minus_output",
53
56
  "default_temperature": 1.0,
54
57
  "supports_vision": True,
58
+ "preferred_edit_protocol": "claude_code",
55
59
  "thinking_effort": ThinkingEffortSpec(
56
60
  options=("none", "low", "medium", "high", "xhigh", "max"),
57
61
  default="high",
@@ -64,6 +68,7 @@ TINKER_SPECS = {
64
68
  "input_budget": "window_minus_output",
65
69
  "default_temperature": 1.0,
66
70
  "supports_vision": False,
71
+ "preferred_edit_protocol": "claude_code",
67
72
  },
68
73
  ("tinker", "nvidia/NVIDIA-Nemotron-3-Ultra-550B-A55B-BF16:peft:262144"): {
69
74
  "context_length": 262144,
@@ -71,6 +76,7 @@ TINKER_SPECS = {
71
76
  "input_budget": "window_minus_output",
72
77
  "default_temperature": 1.0,
73
78
  "supports_vision": False,
79
+ "preferred_edit_protocol": "claude_code",
74
80
  },
75
81
  ("tinker", "nvidia/NVIDIA-Nemotron-3-Super-120B-A12B-BF16"): {
76
82
  "context_length": 65536,
@@ -78,6 +84,7 @@ TINKER_SPECS = {
78
84
  "input_budget": "window_minus_output",
79
85
  "default_temperature": 1.0,
80
86
  "supports_vision": False,
87
+ "preferred_edit_protocol": "claude_code",
81
88
  },
82
89
  ("tinker", "nvidia/NVIDIA-Nemotron-3-Super-120B-A12B-BF16:peft:262144"): {
83
90
  "context_length": 262144,
@@ -85,6 +92,7 @@ TINKER_SPECS = {
85
92
  "input_budget": "window_minus_output",
86
93
  "default_temperature": 1.0,
87
94
  "supports_vision": False,
95
+ "preferred_edit_protocol": "claude_code",
88
96
  },
89
97
  ("tinker", "nvidia/NVIDIA-Nemotron-3-Nano-30B-A3B-BF16"): {
90
98
  "context_length": 65536,
@@ -92,6 +100,7 @@ TINKER_SPECS = {
92
100
  "input_budget": "window_minus_output",
93
101
  "default_temperature": 1.0,
94
102
  "supports_vision": False,
103
+ "preferred_edit_protocol": "claude_code",
95
104
  },
96
105
  ("tinker", "moonshotai/Kimi-K2.6"): {
97
106
  "context_length": 32768,
@@ -99,6 +108,7 @@ TINKER_SPECS = {
99
108
  "input_budget": "output_shares_window",
100
109
  "default_temperature": 1.0,
101
110
  "supports_vision": True,
111
+ "preferred_edit_protocol": "claude_code",
102
112
  "thinking_effort": ThinkingEffortSpec(
103
113
  options=("none", "auto"),
104
114
  default="auto",
@@ -111,6 +121,7 @@ TINKER_SPECS = {
111
121
  "input_budget": "window_minus_output",
112
122
  "default_temperature": 1.0,
113
123
  "supports_vision": True,
124
+ "preferred_edit_protocol": "claude_code",
114
125
  "thinking_effort": ThinkingEffortSpec(
115
126
  options=("none", "auto"),
116
127
  default="auto",
@@ -123,6 +134,7 @@ TINKER_SPECS = {
123
134
  "input_budget": "window_minus_output",
124
135
  "default_temperature": 1.0,
125
136
  "supports_vision": True,
137
+ "preferred_edit_protocol": "claude_code",
126
138
  "thinking_effort": ThinkingEffortSpec(
127
139
  options=("none", "auto"),
128
140
  default="auto",
@@ -135,6 +147,7 @@ TINKER_SPECS = {
135
147
  "input_budget": "window_minus_output",
136
148
  "default_temperature": 1.0,
137
149
  "supports_vision": True,
150
+ "preferred_edit_protocol": "claude_code",
138
151
  "thinking_effort": ThinkingEffortSpec(
139
152
  options=("none", "auto"),
140
153
  default="auto",
@@ -147,6 +160,7 @@ TINKER_SPECS = {
147
160
  "input_budget": "window_minus_output",
148
161
  "default_temperature": 1.0,
149
162
  "supports_vision": True,
163
+ "preferred_edit_protocol": "claude_code",
150
164
  "thinking_effort": ThinkingEffortSpec(
151
165
  options=("none", "auto"),
152
166
  default="auto",
@@ -159,6 +173,7 @@ TINKER_SPECS = {
159
173
  "input_budget": "window_minus_output",
160
174
  "default_temperature": 1.0,
161
175
  "supports_vision": True,
176
+ "preferred_edit_protocol": "claude_code",
162
177
  "thinking_effort": ThinkingEffortSpec(
163
178
  options=("none", "auto"),
164
179
  default="auto",
@@ -171,6 +186,7 @@ TINKER_SPECS = {
171
186
  "input_budget": "window_minus_output",
172
187
  "default_temperature": 1.0,
173
188
  "supports_vision": True,
189
+ "preferred_edit_protocol": "claude_code",
174
190
  "thinking_effort": ThinkingEffortSpec(
175
191
  options=("none", "auto"),
176
192
  default="auto",
@@ -183,6 +199,7 @@ TINKER_SPECS = {
183
199
  "input_budget": "window_minus_output",
184
200
  "default_temperature": 1.0,
185
201
  "supports_vision": True,
202
+ "preferred_edit_protocol": "claude_code",
186
203
  "thinking_effort": ThinkingEffortSpec(
187
204
  options=("none", "auto"),
188
205
  default="auto",
@@ -195,6 +212,7 @@ TINKER_SPECS = {
195
212
  "input_budget": "output_shares_window",
196
213
  "default_temperature": 1.0,
197
214
  "supports_vision": False,
215
+ "preferred_edit_protocol": "claude_code",
198
216
  },
199
217
  ("tinker", "openai/gpt-oss-120b"): {
200
218
  "context_length": 32768,
@@ -202,6 +220,7 @@ TINKER_SPECS = {
202
220
  "input_budget": "output_shares_window",
203
221
  "default_temperature": 1.0,
204
222
  "supports_vision": False,
223
+ "preferred_edit_protocol": "claude_code",
205
224
  },
206
225
  ("tinker", "openai/gpt-oss-120b:peft:131072"): {
207
226
  "context_length": 131072,
@@ -209,6 +228,7 @@ TINKER_SPECS = {
209
228
  "input_budget": "window_minus_output",
210
229
  "default_temperature": 1.0,
211
230
  "supports_vision": False,
231
+ "preferred_edit_protocol": "claude_code",
212
232
  },
213
233
  ("tinker", "openai/gpt-oss-20b"): {
214
234
  "context_length": 32768,
@@ -216,6 +236,7 @@ TINKER_SPECS = {
216
236
  "input_budget": "output_shares_window",
217
237
  "default_temperature": 1.0,
218
238
  "supports_vision": False,
239
+ "preferred_edit_protocol": "claude_code",
219
240
  },
220
241
  ("tinker", "deepseek-ai/DeepSeek-V3.1"): {
221
242
  "context_length": 32768,
@@ -223,6 +244,7 @@ TINKER_SPECS = {
223
244
  "input_budget": "output_shares_window",
224
245
  "default_temperature": 1.0,
225
246
  "supports_vision": False,
247
+ "preferred_edit_protocol": "claude_code",
226
248
  "thinking_effort": ThinkingEffortSpec(
227
249
  options=("none", "auto"),
228
250
  default="auto",
@@ -240,5 +262,6 @@ TINKER_WILDCARD_SPECS = {
240
262
  "input_budget": "window_minus_output",
241
263
  "default_temperature": 1.0,
242
264
  "supports_vision": False,
265
+ "preferred_edit_protocol": "claude_code",
243
266
  },
244
267
  }
@@ -51,6 +51,7 @@ _USER_AGENT = (
51
51
  # used across the direct-provider catalogs.
52
52
  MAX_COMPLETION_TOKENS = 32768
53
53
  DEFAULT_TEMPERATURE = 1.0
54
+ PREFERRED_EDIT_PROTOCOL = "claude_code"
54
55
 
55
56
  # Named-effort spec for the Inkling family (tml-renderers effort floats).
56
57
  INKLING_EFFORT_SPEC = ThinkingEffortSpec(
@@ -131,6 +132,7 @@ def catalog_entries(payload: Any) -> list[tuple[str, dict[str, Any]]]:
131
132
  "input_budget": "output_shares_window",
132
133
  "default_temperature": DEFAULT_TEMPERATURE,
133
134
  "supports_vision": "Vision" in model_type,
135
+ "preferred_edit_protocol": PREFERRED_EDIT_PROTOCOL,
134
136
  }
135
137
  spec.update(_family_spec(str(identifier)))
136
138
  entries.append((str(identifier), spec))
@@ -160,6 +162,7 @@ def spec_to_jsonable(spec: Mapping[str, Any]) -> dict[str, Any]:
160
162
  def spec_from_jsonable(payload: Mapping[str, Any]) -> dict[str, Any]:
161
163
  """Rebuild a runtime spec from ``spec_to_jsonable`` output."""
162
164
  spec = dict(payload)
165
+ spec.setdefault("preferred_edit_protocol", PREFERRED_EDIT_PROTOCOL)
163
166
  thinking = spec.get("thinking_effort")
164
167
  if isinstance(thinking, Mapping) and thinking.get("mode") == "tinker_native_effort":
165
168
  spec["thinking_effort"] = ThinkingEffortSpec(
@@ -236,5 +239,6 @@ TINKER_WILDCARD_SPECS = {
236
239
  "input_budget": "output_shares_window",
237
240
  "default_temperature": DEFAULT_TEMPERATURE,
238
241
  "supports_vision": False,
242
+ "preferred_edit_protocol": PREFERRED_EDIT_PROTOCOL,
239
243
  },
240
244
  }
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "kolega-code"
7
- version = "0.28.2"
7
+ version = "0.28.4"
8
8
  description = "Multi-agent coding in the terminal"
9
9
  readme = "README.md"
10
10
  license = {file = "LICENSE"}