kolega-code 0.29.0__tar.gz → 0.30.1__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 (444) hide show
  1. {kolega_code-0.29.0 → kolega_code-0.30.1}/CHANGELOG.md +47 -0
  2. {kolega_code-0.29.0 → kolega_code-0.30.1}/PKG-INFO +1 -1
  3. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/__init__.py +1 -1
  4. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/__init__.py +1 -1
  5. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/baseagent.py +45 -18
  6. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/compression.py +80 -35
  7. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/tool_backend/agent_tool.py +1 -1
  8. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/tools.py +0 -6
  9. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/utils/commands.py +3 -3
  10. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/cli/config.py +11 -2
  11. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/cli/main.py +75 -14
  12. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/cli/model_catalog.py +5 -2
  13. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/cli/provider_registry.py +9 -2
  14. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/cli/slash_commands.py +1 -1
  15. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/cli/theme.py +18 -18
  16. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/cli/tui/agent_runtime.py +21 -0
  17. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/cli/tui/command_handlers.py +15 -1
  18. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/cli/tui/settings_panel.py +7 -2
  19. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/config.py +5 -0
  20. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/llm/client.py +18 -24
  21. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/llm/exceptions.py +59 -28
  22. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/llm/models.py +89 -25
  23. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/llm/providers/anthropic.py +5 -5
  24. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/llm/providers/deepseek_responses.py +5 -6
  25. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/llm/providers/models.py +3 -0
  26. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/llm/providers/openai.py +4 -2
  27. kolega_code-0.30.1/kolega_code/llm/providers/perplexity_responses.py +107 -0
  28. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/llm/providers/responses_common.py +98 -4
  29. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/llm/specs/catalog/__init__.py +3 -0
  30. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/llm/specs/catalog/deepseek.py +5 -4
  31. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/llm/specs/catalog/google.py +13 -0
  32. kolega_code-0.30.1/kolega_code/llm/specs/catalog/perplexity_agent.py +616 -0
  33. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/llm/specs/catalog/xai.py +12 -0
  34. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/llm/specs/catalog/zai.py +12 -0
  35. kolega_code-0.30.1/kolega_code/llm/specs/perplexity_catalog.py +267 -0
  36. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/llm/specs/thinking.py +1 -11
  37. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/llm/usage.py +1 -0
  38. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/mcp/config.py +49 -7
  39. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/mcp/service.py +103 -3
  40. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/mcp/tools.py +29 -12
  41. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/sandbox/async_filesystem.py +0 -3
  42. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/sandbox/filesystem.py +0 -3
  43. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/sandbox/serializer.py +4 -13
  44. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/sandbox/terminal.py +10 -72
  45. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/sandbox/utils.py +0 -4
  46. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/services/file_system.py +1 -4
  47. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/services/html.py +0 -19
  48. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/services/lsp/manager.py +5 -5
  49. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/services/lsp/registry.py +0 -1
  50. {kolega_code-0.29.0 → kolega_code-0.30.1}/pyproject.toml +1 -1
  51. {kolega_code-0.29.0 → kolega_code-0.30.1}/.gitignore +0 -0
  52. {kolega_code-0.29.0 → kolega_code-0.30.1}/CONTRIBUTING.md +0 -0
  53. {kolega_code-0.29.0 → kolega_code-0.30.1}/LICENSE +0 -0
  54. {kolega_code-0.29.0 → kolega_code-0.30.1}/MIGRATION.md +0 -0
  55. {kolega_code-0.29.0 → kolega_code-0.30.1}/README.md +0 -0
  56. {kolega_code-0.29.0 → kolega_code-0.30.1}/RELEASING.md +0 -0
  57. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/_bundled_skills/LICENSE +0 -0
  58. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/_bundled_skills/manifest.json +0 -0
  59. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/_bundled_skills/skills/deep-research/SKILL.md +0 -0
  60. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/_bundled_skills/skills/deep-research/references/evidence-and-reporting.md +0 -0
  61. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/_bundled_skills/skills/deep-research/references/gigacode-workflow.md +0 -0
  62. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/_bundled_skills/skills/deep-research/scripts/deep-research.workflow +0 -0
  63. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/_bundled_skills/skills/deep-research/scripts/materialize_report.py +0 -0
  64. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/_bundled_skills/skills/docx/LICENSE +0 -0
  65. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/_bundled_skills/skills/docx/SKILL.md +0 -0
  66. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/_bundled_skills/skills/docx/references/examples.md +0 -0
  67. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/_bundled_skills/skills/docx/references/limitations.md +0 -0
  68. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/_bundled_skills/skills/docx/references/operations.md +0 -0
  69. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/_bundled_skills/skills/docx/references/quality.md +0 -0
  70. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/_bundled_skills/skills/docx/requirements.txt +0 -0
  71. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/_bundled_skills/skills/docx/scripts/docx_tool.py +0 -0
  72. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/_bundled_skills/skills/docx/scripts/smoke_test.py +0 -0
  73. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/_bundled_skills/skills/humanizer/LICENSE +0 -0
  74. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/_bundled_skills/skills/humanizer/SKILL.md +0 -0
  75. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/_bundled_skills/skills/pdf/LICENSE +0 -0
  76. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/_bundled_skills/skills/pdf/SKILL.md +0 -0
  77. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/_bundled_skills/skills/pdf/references/examples.md +0 -0
  78. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/_bundled_skills/skills/pdf/references/limitations.md +0 -0
  79. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/_bundled_skills/skills/pdf/references/ocr.md +0 -0
  80. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/_bundled_skills/skills/pdf/references/operations.md +0 -0
  81. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/_bundled_skills/skills/pdf/references/quality.md +0 -0
  82. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/_bundled_skills/skills/pdf/references/redaction.md +0 -0
  83. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/_bundled_skills/skills/pdf/requirements-ocr-paddle.txt +0 -0
  84. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/_bundled_skills/skills/pdf/requirements-ocr-surya.txt +0 -0
  85. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/_bundled_skills/skills/pdf/requirements.txt +0 -0
  86. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/_bundled_skills/skills/pdf/scripts/pdf_tool.py +0 -0
  87. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/_bundled_skills/skills/pdf/scripts/smoke_test.py +0 -0
  88. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/_bundled_skills/skills/pptx/LICENSE +0 -0
  89. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/_bundled_skills/skills/pptx/SKILL.md +0 -0
  90. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/_bundled_skills/skills/pptx/references/examples.md +0 -0
  91. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/_bundled_skills/skills/pptx/references/limitations.md +0 -0
  92. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/_bundled_skills/skills/pptx/references/operations.md +0 -0
  93. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/_bundled_skills/skills/pptx/requirements.txt +0 -0
  94. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/_bundled_skills/skills/pptx/scripts/pptx_tool.py +0 -0
  95. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/_bundled_skills/skills/pptx/scripts/smoke_test.py +0 -0
  96. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/_bundled_skills/skills/review/SKILL.md +0 -0
  97. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/_bundled_skills/skills/review/references/github-publishing.md +0 -0
  98. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/_bundled_skills/skills/skill-authoring/SKILL.md +0 -0
  99. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/_bundled_skills/skills/skill-authoring/references/review-checklist.md +0 -0
  100. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/_bundled_skills/skills/xlsx/LICENSE +0 -0
  101. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/_bundled_skills/skills/xlsx/SKILL.md +0 -0
  102. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/_bundled_skills/skills/xlsx/references/examples.md +0 -0
  103. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/_bundled_skills/skills/xlsx/references/limitations.md +0 -0
  104. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/_bundled_skills/skills/xlsx/references/operations.md +0 -0
  105. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/_bundled_skills/skills/xlsx/references/quality.md +0 -0
  106. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/_bundled_skills/skills/xlsx/requirements.txt +0 -0
  107. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/_bundled_skills/skills/xlsx/scripts/smoke_test.py +0 -0
  108. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/_bundled_skills/skills/xlsx/scripts/xlsx_tool.py +0 -0
  109. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/browseragent.py +0 -0
  110. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/coder.py +0 -0
  111. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/common.py +0 -0
  112. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/context.py +0 -0
  113. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/conversation.py +0 -0
  114. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/custom_agents.py +0 -0
  115. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/edit_protocols.py +0 -0
  116. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/errors.py +0 -0
  117. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/eval/__init__.py +0 -0
  118. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/eval/bridge.py +0 -0
  119. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/eval/bundle-requirements.in +0 -0
  120. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/eval/bundle-requirements.txt +0 -0
  121. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/eval/env.py +0 -0
  122. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/eval/js_kernel.py +0 -0
  123. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/eval/kernel.py +0 -0
  124. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/eval/prelude.js +0 -0
  125. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/eval/prelude.py +0 -0
  126. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/eval/protocol.py +0 -0
  127. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/eval/py_kernel.py +0 -0
  128. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/eval/runner.js +0 -0
  129. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/eval/runner.py +0 -0
  130. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/generalagent.py +0 -0
  131. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/goal.py +0 -0
  132. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/investigationagent.py +0 -0
  133. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/model_routing.py +0 -0
  134. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/orchestration/__init__.py +0 -0
  135. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/orchestration/accounting.py +0 -0
  136. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/orchestration/budget.py +0 -0
  137. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/orchestration/context.py +0 -0
  138. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/orchestration/errors.py +0 -0
  139. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/orchestration/executor.py +0 -0
  140. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/orchestration/guide.py +0 -0
  141. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/orchestration/journal.py +0 -0
  142. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/orchestration/runtime.py +0 -0
  143. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/orchestration/types.py +0 -0
  144. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/planningagent.py +0 -0
  145. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_dump.py +0 -0
  146. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_overrides.py +0 -0
  147. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_provider.py +0 -0
  148. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/auxiliary/agent_loop/silent_turn_exhausted.user.md +0 -0
  149. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/auxiliary/agent_loop/silent_turn_nudge.user.md.j2 +0 -0
  150. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/auxiliary/agent_loop/truncated_turn_nudge.user.md.j2 +0 -0
  151. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/auxiliary/compression/summary.system.md +0 -0
  152. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/auxiliary/compression/summary.user.md.j2 +0 -0
  153. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/auxiliary/terminal/output_summary.system.md +0 -0
  154. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/auxiliary/terminal/safety.system.md +0 -0
  155. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/extensions/cli/build_questions.md +0 -0
  156. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/extensions/cli/current_plan_artifact.md.j2 +0 -0
  157. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/extensions/cli/mode_switch_notice.md.j2 +0 -0
  158. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/extensions/cli/planning_questions.md +0 -0
  159. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/extensions/cli/scratchpad.md.j2 +0 -0
  160. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/extensions/cli/shared_task_list.md +0 -0
  161. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/extensions/cli/shared_task_list_readonly.md +0 -0
  162. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/extensions/cli/worktree_control.md.j2 +0 -0
  163. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/extensions/skills/catalog.md.j2 +0 -0
  164. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/system/agents/browser.md.j2 +0 -0
  165. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/system/agents/coder_ask.md.j2 +0 -0
  166. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/system/agents/coder_base.md.j2 +0 -0
  167. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/system/agents/coder_cli.md.j2 +0 -0
  168. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/system/agents/general.md.j2 +0 -0
  169. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/system/agents/investigation.md.j2 +0 -0
  170. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/system/agents/planning.md.j2 +0 -0
  171. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/system/includes/agents_md_instructions.md +0 -0
  172. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/system/includes/context_updates.md +0 -0
  173. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/system/includes/environment_variables/workspace_env_vars.md +0 -0
  174. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/system/includes/frontend_guidance.md +0 -0
  175. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/system/includes/starter_templates/expo.md +0 -0
  176. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/system/includes/starter_templates/html_website.md +0 -0
  177. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/system/includes/starter_templates/mern_stack.md +0 -0
  178. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/system/includes/starter_templates/react_vite_shadcdn.md +0 -0
  179. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/system/includes/terminal_tools.md +0 -0
  180. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/tools/apply_patch.md +0 -0
  181. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/tools/ask_user_choice.md +0 -0
  182. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/tools/browser_click.md +0 -0
  183. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/tools/browser_close.md +0 -0
  184. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/tools/browser_console_messages.md +0 -0
  185. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/tools/browser_drag.md +0 -0
  186. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/tools/browser_drop.md +0 -0
  187. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/tools/browser_evaluate.md +0 -0
  188. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/tools/browser_file_upload.md +0 -0
  189. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/tools/browser_fill_form.md +0 -0
  190. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/tools/browser_find.md +0 -0
  191. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/tools/browser_handle_dialog.md +0 -0
  192. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/tools/browser_hover.md +0 -0
  193. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/tools/browser_navigate.md +0 -0
  194. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/tools/browser_navigate_back.md +0 -0
  195. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/tools/browser_network_request.md +0 -0
  196. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/tools/browser_network_requests.md +0 -0
  197. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/tools/browser_press_key.md +0 -0
  198. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/tools/browser_resize.md +0 -0
  199. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/tools/browser_scroll.md +0 -0
  200. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/tools/browser_select_option.md +0 -0
  201. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/tools/browser_snapshot.md +0 -0
  202. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/tools/browser_tabs.md +0 -0
  203. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/tools/browser_take_screenshot.md +0 -0
  204. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/tools/browser_type.md +0 -0
  205. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/tools/browser_wait_for.md +0 -0
  206. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/tools/build_backend.md +0 -0
  207. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/tools/build_frontend.md +0 -0
  208. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/tools/claude_edit.md +0 -0
  209. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/tools/claude_write.md +0 -0
  210. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/tools/dispatch_agent.md +0 -0
  211. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/tools/edit.md +0 -0
  212. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/tools/eval.md +0 -0
  213. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/tools/exec_command.md +0 -0
  214. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/tools/get_host.md +0 -0
  215. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/tools/get_task_list.md +0 -0
  216. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/tools/get_task_list_readonly.md +0 -0
  217. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/tools/hashline_edit.md +0 -0
  218. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/tools/hashline_write.md +0 -0
  219. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/tools/kill_command.md +0 -0
  220. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/tools/list_sessions.md +0 -0
  221. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/tools/list_subagent_models.md +0 -0
  222. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/tools/list_workflow_runs.md +0 -0
  223. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/tools/lsp.md +0 -0
  224. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/tools/lsp_edit.md +0 -0
  225. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/tools/multi_edit.md +0 -0
  226. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/tools/read.md +0 -0
  227. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/tools/read_image.md +0 -0
  228. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/tools/resolve.md +0 -0
  229. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/tools/run_workflow.md +0 -0
  230. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/tools/set_goal.md +0 -0
  231. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/tools/skill.md +0 -0
  232. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/tools/snapshot.md +0 -0
  233. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/tools/switch_worktree.md +0 -0
  234. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/tools/update_task_list.md +0 -0
  235. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/tools/web_fetch.md +0 -0
  236. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/tools/web_search.md +0 -0
  237. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/tools/write.md +0 -0
  238. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/tools/write_plan.md +0 -0
  239. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/tools/write_stdin.md +0 -0
  240. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/user_tasks/cli/implement_plan.md.j2 +0 -0
  241. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompt_templates/user_tasks/cli/init_agents.md.j2 +0 -0
  242. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/prompts.py +0 -0
  243. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/tool_backend/base_tool.py +0 -0
  244. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/tool_backend/browser_tool.py +0 -0
  245. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/tool_backend/build_tool.py +0 -0
  246. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/tool_backend/codex_patch.py +0 -0
  247. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/tool_backend/edit_preview.py +0 -0
  248. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/tool_backend/edit_tool.py +0 -0
  249. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/tool_backend/eval_tool.py +0 -0
  250. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/tool_backend/hashline_v2.py +0 -0
  251. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/tool_backend/lsp_tool.py +0 -0
  252. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/tool_backend/memory_tool.py +0 -0
  253. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/tool_backend/network_status.py +0 -0
  254. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/tool_backend/read_file_tool.py +0 -0
  255. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/tool_backend/read_image_tool.py +0 -0
  256. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/tool_backend/search_backends/__init__.py +0 -0
  257. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/tool_backend/search_backends/base.py +0 -0
  258. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/tool_backend/search_backends/duckduckgo.py +0 -0
  259. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/tool_backend/search_backends/errors.py +0 -0
  260. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/tool_backend/search_backends/firecrawl.py +0 -0
  261. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/tool_backend/search_backends/models.py +0 -0
  262. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/tool_backend/search_backends/searxng.py +0 -0
  263. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/tool_backend/search_backends/tavily.py +0 -0
  264. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/tool_backend/snapshot_tool.py +0 -0
  265. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/tool_backend/streaming_tool.py +0 -0
  266. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/tool_backend/terminal_tool.py +0 -0
  267. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/tool_backend/web_fetch/__init__.py +0 -0
  268. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/tool_backend/web_fetch/answering.py +0 -0
  269. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/tool_backend/web_fetch/documents.py +0 -0
  270. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/tool_backend/web_fetch/extractors.py +0 -0
  271. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/tool_backend/web_fetch/pipeline.py +0 -0
  272. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/tool_backend/web_fetch/retrieval.py +0 -0
  273. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/tool_backend/web_fetch_tool.py +0 -0
  274. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/tool_backend/web_search_tool.py +0 -0
  275. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/tool_backend/workflow_tool.py +0 -0
  276. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/tool_definitions.py +0 -0
  277. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/agent/volatile_context.py +0 -0
  278. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/auth/__init__.py +0 -0
  279. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/auth/_jwt.py +0 -0
  280. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/auth/chatgpt_oauth.py +0 -0
  281. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/auth/constants.py +0 -0
  282. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/auth/tokens.py +0 -0
  283. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/browser_extension/__init__.py +0 -0
  284. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/browser_extension/framing.py +0 -0
  285. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/browser_extension/installer.py +0 -0
  286. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/browser_extension/manager.py +0 -0
  287. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/browser_extension/multiplex.py +0 -0
  288. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/browser_extension/native_host.py +0 -0
  289. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/browser_extension/protocol.py +0 -0
  290. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/browser_extension/registry.py +0 -0
  291. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/browser_extension/runtime.py +0 -0
  292. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/cli/__init__.py +0 -0
  293. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/cli/app.py +0 -0
  294. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/cli/ask_output.py +0 -0
  295. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/cli/atif_export.py +0 -0
  296. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/cli/browser_backend.py +0 -0
  297. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/cli/clipboard_image.py +0 -0
  298. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/cli/connection.py +0 -0
  299. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/cli/cron.py +0 -0
  300. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/cli/diagnostics.py +0 -0
  301. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/cli/file_index.py +0 -0
  302. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/cli/goal.py +0 -0
  303. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/cli/loop.py +0 -0
  304. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/cli/mentions.py +0 -0
  305. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/cli/messages.py +0 -0
  306. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/cli/model_connection.py +0 -0
  307. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/cli/plan_artifacts.py +0 -0
  308. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/cli/session_event_protocol.py +0 -0
  309. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/cli/session_event_store.py +0 -0
  310. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/cli/session_journal.py +0 -0
  311. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/cli/session_store.py +0 -0
  312. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/cli/session_usage.py +0 -0
  313. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/cli/settings.py +0 -0
  314. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/cli/skills.py +0 -0
  315. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/cli/tui/__init__.py +0 -0
  316. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/cli/tui/app_base.py +0 -0
  317. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/cli/tui/changes_screen.py +0 -0
  318. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/cli/tui/constants.py +0 -0
  319. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/cli/tui/custom_model.py +0 -0
  320. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/cli/tui/loop_runtime.py +0 -0
  321. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/cli/tui/memory_screen.py +0 -0
  322. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/cli/tui/onboarding_screen.py +0 -0
  323. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/cli/tui/pacing.py +0 -0
  324. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/cli/tui/prompt_flows.py +0 -0
  325. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/cli/tui/session_diff.py +0 -0
  326. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/cli/tui/settings_screen.py +0 -0
  327. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/cli/tui/state.py +0 -0
  328. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/cli/tui/status_dashboard.py +0 -0
  329. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/cli/tui/styles.tcss +0 -0
  330. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/cli/tui/sub_agent_screen.py +0 -0
  331. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/cli/tui/terminal_display.py +0 -0
  332. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/cli/tui/transcript.py +0 -0
  333. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/cli/tui/widgets.py +0 -0
  334. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/cli/updater.py +0 -0
  335. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/events.py +0 -0
  336. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/extensions.py +0 -0
  337. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/git_env.py +0 -0
  338. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/hooks/__init__.py +0 -0
  339. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/hooks/backends.py +0 -0
  340. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/hooks/config.py +0 -0
  341. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/hooks/dispatcher.py +0 -0
  342. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/hooks/events.py +0 -0
  343. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/hooks/matcher.py +0 -0
  344. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/hooks/outcome.py +0 -0
  345. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/llm/instrumented_client.py +0 -0
  346. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/llm/ledger.py +0 -0
  347. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/llm/providers/__init__.py +0 -0
  348. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/llm/providers/_token_encoding.py +0 -0
  349. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/llm/providers/base.py +0 -0
  350. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/llm/providers/chatgpt_oauth.py +0 -0
  351. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/llm/providers/google.py +0 -0
  352. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/llm/providers/openai_responses.py +0 -0
  353. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/llm/providers/tinker.py +0 -0
  354. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/llm/providers/tinker_trace.py +0 -0
  355. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/llm/ratelimit.py +0 -0
  356. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/llm/specs/__init__.py +0 -0
  357. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/llm/specs/accessors.py +0 -0
  358. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/llm/specs/catalog/anthropic.py +0 -0
  359. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/llm/specs/catalog/dashscope.py +0 -0
  360. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/llm/specs/catalog/fireworks.py +0 -0
  361. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/llm/specs/catalog/kimi_coding.py +0 -0
  362. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/llm/specs/catalog/moonshot.py +0 -0
  363. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/llm/specs/catalog/ollama_cloud.py +0 -0
  364. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/llm/specs/catalog/openai.py +0 -0
  365. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/llm/specs/catalog/openai_chatgpt.py +0 -0
  366. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/llm/specs/catalog/openrouter.py +0 -0
  367. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/llm/specs/catalog/thinking_machines.py +0 -0
  368. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/llm/specs/catalog/tinker.py +0 -0
  369. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/llm/specs/catalog/together.py +0 -0
  370. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/llm/specs/custom_endpoints.py +0 -0
  371. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/llm/specs/ollama_cloud_catalog.py +0 -0
  372. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/llm/specs/openrouter_catalog.py +0 -0
  373. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/llm/specs/tinker_catalog.py +0 -0
  374. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/llm/specs/types.py +0 -0
  375. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/llm/specs/validation.py +0 -0
  376. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/llm/timeouts.py +0 -0
  377. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/llm/tool_execution_ids.py +0 -0
  378. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/local_state.py +0 -0
  379. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/mcp/__init__.py +0 -0
  380. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/mcp/oauth.py +0 -0
  381. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/mcp/state.py +0 -0
  382. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/mcp/transport.py +0 -0
  383. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/memory/__init__.py +0 -0
  384. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/memory/identity.py +0 -0
  385. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/memory/manager.py +0 -0
  386. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/memory/manifest.py +0 -0
  387. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/memory/markdown.py +0 -0
  388. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/memory/models.py +0 -0
  389. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/memory/protocol.py +0 -0
  390. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/memory/registry.py +0 -0
  391. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/models/__init__.py +0 -0
  392. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/models/sandbox_terminal_state.py +0 -0
  393. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/permissions.py +0 -0
  394. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/runtime.py +0 -0
  395. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/sandbox/README.md +0 -0
  396. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/sandbox/__init__.py +0 -0
  397. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/sandbox/base.py +0 -0
  398. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/sandbox/browser.py +0 -0
  399. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/sandbox/event_loop.py +0 -0
  400. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/sandbox/local.py +0 -0
  401. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/scratchpad.py +0 -0
  402. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/security/__init__.py +0 -0
  403. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/security/secrets.py +0 -0
  404. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/services/base.py +0 -0
  405. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/services/browser.py +0 -0
  406. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/services/lsp/__init__.py +0 -0
  407. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/services/lsp/client.py +0 -0
  408. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/services/lsp/config.py +0 -0
  409. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/services/lsp/detector.py +0 -0
  410. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/services/lsp/diagnostics.py +0 -0
  411. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/services/lsp/edits.py +0 -0
  412. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/services/lsp/registry.yaml +0 -0
  413. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/services/snapshots.py +0 -0
  414. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/services/terminal.py +0 -0
  415. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/services/terminal_buffer.py +0 -0
  416. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/services/workspace_scan.py +0 -0
  417. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/session/__init__.py +0 -0
  418. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/session/control.py +0 -0
  419. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/session/inmemory.py +0 -0
  420. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/session/projection.py +0 -0
  421. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/session/recording.py +0 -0
  422. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/session/runtime.py +0 -0
  423. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/session/store.py +0 -0
  424. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/testing/__init__.py +0 -0
  425. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/testing/store_conformance.py +0 -0
  426. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/tools/__init__.py +0 -0
  427. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/tools/core.py +0 -0
  428. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/tools/definitions.py +0 -0
  429. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/tools/param_aliases.py +0 -0
  430. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/tools/registry.py +0 -0
  431. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/utils/__init__.py +0 -0
  432. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/utils/images.py +0 -0
  433. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/web/__init__.py +0 -0
  434. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/web/assets/fold.js +0 -0
  435. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/web/assets/player.css +0 -0
  436. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/web/assets/player.html +0 -0
  437. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/web/assets/player.js +0 -0
  438. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/web/bundle.py +0 -0
  439. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/web/hosting.py +0 -0
  440. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/web/redaction.py +0 -0
  441. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/web/server.py +0 -0
  442. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/web/singlefile.py +0 -0
  443. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/web/theme_css.py +0 -0
  444. {kolega_code-0.29.0 → kolega_code-0.30.1}/kolega_code/worktrees.py +0 -0
@@ -6,6 +6,53 @@ This project uses GitHub Releases for detailed generated release notes. This fil
6
6
 
7
7
  ## Unreleased
8
8
 
9
+ ## 0.30.1 - 2026-08-17
10
+
11
+ ### Fixed
12
+
13
+ - Compaction now uses the primary model's thinking setting instead of
14
+ omitting it. Empty or reasoning-only helper completions are retried,
15
+ then can still take the zero-tail recovery path instead of being
16
+ treated as a final `llm_error`.
17
+
18
+ ## 0.30.0 - 2026-08-14
19
+
20
+ ### Added
21
+
22
+ - Added Google Gemini 3.7 Flash (`gemini-3.7-flash`): 1M-token context, 64K
23
+ output, vision and function calling, and `low`/`medium`/`high` thinking
24
+ levels. It omits Google's deprecated temperature parameter and is now the
25
+ default Google model.
26
+ - DeepSeek V4-Pro now routes to the Responses API by default (joining V4-Flash),
27
+ removing the model-name carve-out. Both DeepSeek models support `none`, `low`,
28
+ `high`, and `max` reasoning effort (`low` is new; `none` disables reasoning).
29
+ Hosted web search is now available on V4-Pro as well as V4-Flash.
30
+ - Added support for xAI Grok 4.6 (`grok-4.6`): 500K-token context, vision input,
31
+ and `low`/`medium`/`high`/`xhigh` reasoning effort. Selectable in the Settings
32
+ UI, `/model` picker, CLI flags, and env vars.
33
+ - Added support for Z.AI GLM-5.3 (`glm-5.3`) on the GLM Coding Plan provider:
34
+ 1M-token context, 128K max output, and `high`/`max` thinking effort. GLM-5.3
35
+ is now the Z.AI default model.
36
+ - Added the Perplexity Agent API provider (`perplexity_agent`): one
37
+ `PERPLEXITY_API_KEY` reaches OpenAI, Anthropic, Google, xAI, and Perplexity
38
+ models through Perplexity's Responses-compatible Agent API, with optional
39
+ hosted search tools.
40
+ - `/plan` accepts an optional prompt: `/plan <task>` switches to plan mode and
41
+ starts that planning turn. Bare `/plan` still only switches mode.
42
+
43
+ ### Fixed
44
+
45
+ - Google Gemini models no longer reject builtin tool calls with a 400 about
46
+ `additionalProperties` in function-declaration schemas.
47
+ - Quitting the TUI no longer waits up to 30s for an unresponsive language
48
+ server to acknowledge shutdown.
49
+ - The Z.AI context-window gauge now counts tokens locally (Z.AI's count
50
+ endpoint reports 0 for GLM-5.3) and residual usage calibrates from
51
+ multi-provider response billing.
52
+ - MCP tools whose names contain invalid characters or exceed provider length
53
+ limits are sanitized at collection time, and provider 400 details are shown
54
+ in the turn error instead of a generic failure.
55
+
9
56
  ## 0.29.0 - 2026-08-13
10
57
 
11
58
  ### Added
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: kolega-code
3
- Version: 0.29.0
3
+ Version: 0.30.1
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/
@@ -174,4 +174,4 @@ __all__ = [
174
174
  "parse_git_status_output",
175
175
  ]
176
176
 
177
- __version__ = "0.29.0"
177
+ __version__ = "0.30.1"
@@ -51,4 +51,4 @@ __all__ = [
51
51
  "ToolExtension",
52
52
  ]
53
53
 
54
- __version__ = "0.29.0"
54
+ __version__ = "0.30.1"
@@ -521,6 +521,8 @@ class BaseAgent(LogMixin):
521
521
  # gate reads client_web_tools_enabled, the stream call reads
522
522
  # hosted_web_search_active.
523
523
  self.supports_hosted_web_search = bool(model_specs.get("supports_hosted_web_search", False))
524
+ # Spec-declared server-side tools; _apply_web_search_state derives the live list.
525
+ self._model_server_tools: List[str] = [str(tool) for tool in model_specs.get("server_tools") or []]
524
526
  self.web_search_mode = getattr(self.config, "web_search_mode", "auto") or "auto"
525
527
  self._apply_web_search_state()
526
528
 
@@ -731,22 +733,27 @@ class BaseAgent(LogMixin):
731
733
  initialize()
732
734
 
733
735
  def _apply_web_search_state(self) -> None:
734
- """Resolve web_search_mode + model capability into the two live gates.
736
+ """Resolve web_search_mode + model capability into the live gates.
735
737
 
736
738
  ``hosted_web_search_active`` — request the provider's server-side
737
739
  web_search tool on main-loop stream calls. ``client_web_tools_enabled``
738
740
  — register the client-side web_search/web_fetch tools (read by the
739
- ToolCollection gate). Hosted active always excludes the client tools:
740
- two search paths confuse the model and waste schema tokens.
741
+ ToolCollection gate). ``server_tools`` — the spec-declared server-side
742
+ tools (e.g. the Perplexity Agent API's). One setting gates all of it:
743
+ auto/hosted request the server-side tooling, client defers to the
744
+ client-side web tools, off disables web tooling entirely. Active
745
+ server-side web tooling always excludes the client tools: two search
746
+ paths confuse the model and waste schema tokens.
741
747
  """
742
748
  mode = (self.web_search_mode or "auto").lower()
743
749
  supported = self.supports_hosted_web_search
750
+ server_web_tooling = supported or "web_search" in self._model_server_tools
744
751
  if mode == "off":
745
752
  hosted, client = False, False
746
753
  elif mode == "client":
747
754
  hosted, client = False, True
748
755
  elif mode == "hosted":
749
- if not supported:
756
+ if not server_web_tooling:
750
757
  provider = self.primary_model_config.provider
751
758
  logger.warning(
752
759
  "web_search_mode=hosted, but %s/%s has no hosted web search; falling back to the client tools",
@@ -758,6 +765,9 @@ class BaseAgent(LogMixin):
758
765
  hosted, client = supported, not supported
759
766
  self.hosted_web_search_active = hosted
760
767
  self.client_web_tools_enabled = client
768
+ self.server_tools = list(self._model_server_tools) if mode in ("auto", "hosted") else []
769
+ if "web_search" in self.server_tools:
770
+ self.client_web_tools_enabled = False
761
771
 
762
772
  def apply_web_search_mode(self, mode: str) -> None:
763
773
  """Change the web tool mode mid-session (TUI ``/web-search``).
@@ -770,31 +780,36 @@ class BaseAgent(LogMixin):
770
780
  self._apply_web_search_state()
771
781
 
772
782
  async def _emit_hosted_tool_call(self, delta: Dict[str, Any]) -> None:
773
- """Render a completed hosted web_search call as a tool_call/tool_result pair.
783
+ """Render a completed hosted/server-side tool call as a tool_call/tool_result pair.
774
784
 
775
785
  The call executed on the provider's servers; there is no local tool
776
- invocation and the searched content never reaches the client (it is
777
- injected into the model's context server-side). The shared item id
778
- correlates the pair in every transcript consumer.
786
+ invocation. For OpenAI/DeepSeek web_search the searched content never
787
+ reaches the client (it is injected into the model's context
788
+ server-side); Perplexity Agent API result items (search_results /
789
+ fetch_url_results) carry their results client-side via the delta's
790
+ item_type/payload. The shared item id correlates the pair in every
791
+ transcript consumer.
779
792
  """
780
793
  block = WebSearchCallBlock(
781
794
  item_id=delta.get("id") or None,
782
795
  status=delta.get("status"),
783
796
  action=delta.get("action") or {},
797
+ item_type=str(delta.get("item_type") or "web_search_call"),
798
+ payload=delta.get("payload"),
784
799
  )
785
800
  tool_call_id = block.item_id or str(uuid.uuid4())
786
801
  await self.send_chat_message(
787
802
  message_type="tool_call",
788
- content=f"Calling {WebSearchCallBlock.TOOL_LABEL}: {block.label()}",
803
+ content=f"Calling {block.tool_label}: {block.label()}",
789
804
  is_streaming=False,
790
- tool_description=WebSearchCallBlock.TOOL_LABEL,
805
+ tool_description=block.tool_label,
791
806
  tool_call_id=tool_call_id,
792
807
  )
793
808
  await self.send_chat_message(
794
809
  message_type="tool_result",
795
810
  content=block.result_summary(),
796
811
  is_streaming=False,
797
- tool_description=WebSearchCallBlock.TOOL_LABEL,
812
+ tool_description=block.tool_label,
798
813
  tool_call_id=tool_call_id,
799
814
  )
800
815
 
@@ -1130,7 +1145,15 @@ class BaseAgent(LogMixin):
1130
1145
  if new_calls:
1131
1146
  self._context_residual_tokens += self.HOSTED_SEARCH_PROVISIONAL_TOKENS * new_calls
1132
1147
  return
1133
- billed = (assistant_message.usage_metadata or {}).get("prompt_tokens")
1148
+ billed = (
1149
+ assistant_message.usage.input_tokens
1150
+ if assistant_message.usage and assistant_message.usage.reported
1151
+ else (
1152
+ (assistant_message.usage_metadata or {}).get("prompt_tokens")
1153
+ or (assistant_message.usage_metadata or {}).get("input_tokens")
1154
+ or (assistant_message.usage_metadata or {}).get("prompt_token_count")
1155
+ )
1156
+ )
1134
1157
  counted = self._last_raw_context_count
1135
1158
  if not isinstance(billed, int) or counted is None:
1136
1159
  return
@@ -1201,9 +1224,10 @@ class BaseAgent(LogMixin):
1201
1224
  llm=self.llm,
1202
1225
  model=self.primary_model_config.model,
1203
1226
  temperature=self.model_default_temperature,
1204
- # No extended thinking: a bounded summary doesn't need it, and the
1205
- # thinking budget could otherwise exceed the small summary max_tokens.
1206
- thinking=None,
1227
+ # Same thinking setting as the primary request. Omitting it is not a
1228
+ # disable: some endpoints default to reasoning-on, and some reject a
1229
+ # missing effort. A None effort (no thinking spec) still omits the field.
1230
+ thinking=self.primary_model_config.thinking_effort,
1207
1231
  on_info=on_info,
1208
1232
  on_error=on_error,
1209
1233
  system_prompt_text=compaction_system_prompt,
@@ -2425,9 +2449,11 @@ class BaseAgent(LogMixin):
2425
2449
  # at the model (llm_error — the provider client already applied
2426
2450
  # its retry policy, so another summarization request buys
2427
2451
  # nothing) or hit the minimum-history guard (too_few — a zero
2428
- # tail must not weaken it). A nothing_to_summarize result MAY
2429
- # proceed: with no retained tail, the safe boundary can advance
2430
- # past the previous one even when the six-message tail could not.
2452
+ # tail must not weaken it). An empty_summary or
2453
+ # nothing_to_summarize result MAY proceed: empty completions
2454
+ # already exhausted in-pass retries, and with no retained tail
2455
+ # the safe boundary can advance past the previous one even
2456
+ # when the six-message tail could not.
2431
2457
  if token_count.input_tokens > self.model_max_input_tokens and result.reason not in (
2432
2458
  "llm_error",
2433
2459
  "too_few",
@@ -2488,6 +2514,7 @@ class BaseAgent(LogMixin):
2488
2514
  tools=self.tool_collection.get_tool_list(),
2489
2515
  thinking=self.primary_model_config.thinking_effort,
2490
2516
  hosted_web_search=self.hosted_web_search_active,
2517
+ server_tools=self.server_tools or None,
2491
2518
  # The strict per-run budget rechecks this request inside
2492
2519
  # the client; hand it the count already taken for the
2493
2520
  # gauge (same history) so it is not counted twice.
@@ -23,7 +23,7 @@ LogCallback = Callable[[str], Awaitable[None]]
23
23
  class CompactionResult:
24
24
  """Outcome of a compaction attempt, surfaced to callers and the UI.
25
25
 
26
- ``reason`` is a machine tag: "ok" | "too_few" | "nothing_to_summarize" | "llm_error".
26
+ ``reason`` is a machine tag: "ok" | "too_few" | "nothing_to_summarize" | "empty_summary" | "llm_error".
27
27
  ``message`` is a human-readable line for the command output / logs.
28
28
  """
29
29
 
@@ -117,6 +117,37 @@ def _bundles_tool_results(message: Message) -> bool:
117
117
  return isinstance(message.content, list) and any(isinstance(block, ToolResult) for block in message.content)
118
118
 
119
119
 
120
+ async def _stream_summary(
121
+ llm,
122
+ messages: MessageHistory,
123
+ system: Message,
124
+ temperature: float,
125
+ model: str,
126
+ thinking,
127
+ ) -> Message:
128
+ """Issue the compaction helper request and return the completed message.
129
+
130
+ Stream and consume events rather than calling ``generate()``: the Anthropic
131
+ SDK rejects non-streaming requests whose max_tokens is large enough to risk
132
+ a >10-minute response. The helper origin spans the whole request because
133
+ providers may sample and emit their trace record at context entry or
134
+ final-message time, not at ``stream()``.
135
+ """
136
+ with llm_call_origin(helper_origin("compression")):
137
+ stream_cm = await llm.stream(
138
+ messages=messages,
139
+ system=system,
140
+ temperature=temperature,
141
+ model=model,
142
+ max_completion_tokens=HistoryCompressor.SUMMARY_MAX_TOKENS,
143
+ thinking=thinking,
144
+ )
145
+ async with stream_cm as stream:
146
+ async for _event in stream:
147
+ pass
148
+ return await stream.get_final_message()
149
+
150
+
120
151
  class HistoryCompressor:
121
152
  """Summarizes a conversation non-destructively when it crosses the budget threshold."""
122
153
 
@@ -131,6 +162,9 @@ class HistoryCompressor:
131
162
  # summary. A generous ceiling gives reasoning headroom while still staying
132
163
  # well under the model's full completion budget.
133
164
  SUMMARY_MAX_TOKENS = 8192
165
+ # Completed-but-empty summaries (reasoning-only, whitespace, no text) are
166
+ # retried on the same fitted request before the pass is reported unusable.
167
+ SUMMARY_EMPTY_ATTEMPTS = 3
134
168
  # Attempts at widening the omission gap per budget rung.
135
169
  MAX_FIT_ATTEMPTS = 6
136
170
 
@@ -254,13 +288,6 @@ class HistoryCompressor:
254
288
  head_end, tail_start = new_head, new_tail
255
289
  messages = build_request(head_end, tail_start)
256
290
 
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
291
  response = None
265
292
  last_error: Optional[LLMContextWindowExceededError] = None
266
293
  dispatched_gap: Optional[tuple[int, int]] = None
@@ -273,19 +300,14 @@ class HistoryCompressor:
273
300
  # re-sending it would only be rejected again.
274
301
  continue
275
302
  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()
303
+ response = await _stream_summary(
304
+ llm,
305
+ messages=messages,
306
+ system=system_message,
307
+ temperature=temperature,
308
+ model=model,
309
+ thinking=thinking,
310
+ )
289
311
  break
290
312
  except LLMContextWindowExceededError as exc:
291
313
  if max_input_tokens is None:
@@ -297,22 +319,45 @@ class HistoryCompressor:
297
319
  assert last_error is not None
298
320
  raise last_error
299
321
 
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)
322
+ last_empty_message = "Compression produced an empty summary; history left unchanged."
323
+ for attempt in range(1, self.SUMMARY_EMPTY_ATTEMPTS + 1):
324
+ summary_text = response.get_text_content()
325
+ if summary_text and summary_text.strip():
326
+ folded = split - prior_through
327
+ conversation.apply_compaction(summary_text, split)
328
+ done = f"Compressed {folded} older message(s) into a summary; kept the latest turns verbatim."
329
+ if on_info:
330
+ await on_info(done)
331
+ return CompactionResult(ok=True, reason="ok", summarized_messages=folded, message=done)
332
+
333
+ stop = getattr(response, "stop_reason", None)
334
+ stop_note = f" (stop_reason={stop})" if stop else ""
335
+ last_empty_message = f"Compression produced an empty summary{stop_note}; history left unchanged."
336
+ if attempt >= self.SUMMARY_EMPTY_ATTEMPTS:
337
+ break
338
+ retry_msg = (
339
+ f"Compression produced an empty summary{stop_note}; "
340
+ f"retrying ({attempt + 1}/{self.SUMMARY_EMPTY_ATTEMPTS})."
341
+ )
342
+ if on_info:
343
+ await on_info(retry_msg)
305
344
  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)
345
+ logger.info(retry_msg)
346
+ # Same fitted request: empty completions are not a budget-fit failure.
347
+ response = await _stream_summary(
348
+ llm,
349
+ messages=messages,
350
+ system=system_message,
351
+ temperature=temperature,
352
+ model=model,
353
+ thinking=thinking,
354
+ )
311
355
 
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)
356
+ if on_error:
357
+ await on_error(last_empty_message)
358
+ else:
359
+ logger.error(last_empty_message)
360
+ return CompactionResult(ok=False, reason="empty_summary", message=last_empty_message)
316
361
 
317
362
  except Exception as e:
318
363
  # Never swallow into a fake success: log the full traceback and surface
@@ -399,7 +399,7 @@ class AgentTool(BaseTool):
399
399
  agent.session_recorder = scoped_recorder
400
400
 
401
401
  # Track messages and their sequence
402
- last_saved_index = -1 # Track what we've already saved
402
+ last_saved_index = -1
403
403
  streamed_messages = {} # Track messages by UUID for assembly
404
404
 
405
405
  # Process the task and stream messages
@@ -302,16 +302,13 @@ class ToolCollection(LogMixin):
302
302
  self.workspace_id = workspace_id
303
303
  self.thread_id = thread_id
304
304
 
305
- # Convert string path to Path object if needed
306
305
  self.project_path = Path(project_path) if isinstance(project_path, str) else project_path
307
306
 
308
- # Create filesystem instance if not provided
309
307
  if filesystem is None:
310
308
  self.filesystem = LocalFileSystem(root_path=self.project_path)
311
309
  else:
312
310
  self.filesystem = filesystem
313
311
 
314
- # Create terminal manager instance if not provided
315
312
  if terminal_manager is None:
316
313
  self.terminal_manager = LocalTerminalManager(
317
314
  workspace_id, thread_id, connection_manager, default_workdir=self.project_path
@@ -319,7 +316,6 @@ class ToolCollection(LogMixin):
319
316
  else:
320
317
  self.terminal_manager = terminal_manager
321
318
 
322
- # Create browser manager instance if not provided
323
319
  if browser_manager is None:
324
320
  self.browser_manager = PlaywrightBrowserManager()
325
321
  else:
@@ -388,7 +384,6 @@ class ToolCollection(LogMixin):
388
384
  }
389
385
  self.tool_exclusions.extend(tool_config.tool_exclusions)
390
386
 
391
- # Initialize tool backends
392
387
  self._initialize_tools()
393
388
  self._register_tool_extensions()
394
389
 
@@ -619,7 +614,6 @@ class ToolCollection(LogMixin):
619
614
  browser_manager=self.browser_manager,
620
615
  )
621
616
 
622
- # Build tool
623
617
  self.build_tool = BuildTool(
624
618
  self.project_path,
625
619
  self.workspace_id,
@@ -58,9 +58,9 @@ class CommandProcessor:
58
58
  f"Compressed history: {result.summarized_messages} older message(s) summarized. "
59
59
  f"Context {pct(before)}% → {pct(after)}% of the input budget."
60
60
  )
61
- if result.reason == "llm_error":
62
- return f"Compression failed: {result.message}"
63
- return f"Nothing to compress. {result.message} (context {pct(before)}% of the input budget)."
61
+ if result.reason in ("too_few", "nothing_to_summarize"):
62
+ return f"Nothing to compress. {result.message} (context {pct(before)}% of the input budget)."
63
+ return f"Compression failed: {result.message}"
64
64
 
65
65
  async def _handle_clear(self) -> str:
66
66
  """Handle the /clear command."""
@@ -74,6 +74,7 @@ API_KEY_ENV = {
74
74
  ModelProvider.THINKING_MACHINES: "TINKER_API_KEY",
75
75
  # Native Tinker sampling authenticates with the same key.
76
76
  ModelProvider.TINKER: "TINKER_API_KEY",
77
+ ModelProvider.PERPLEXITY_AGENT: "PERPLEXITY_API_KEY",
77
78
  }
78
79
 
79
80
  DEFAULT_WEB_SEARCH_BACKEND = "duckduckgo"
@@ -780,13 +781,20 @@ def _resolve_active_thinking_effort(
780
781
  settings: Optional[CliSettings],
781
782
  ) -> Optional[str]:
782
783
  explicit_effort = overrides.thinking_effort or env.get("KOLEGA_CODE_THINKING_EFFORT")
784
+ saved_effort: Optional[str] = None
783
785
  if explicit_effort is None and settings:
784
786
  settings_model_matches = settings.active_provider == provider.value and settings.active_model == model
785
787
  if settings_model_matches:
786
- explicit_effort = settings.active_thinking_effort
788
+ saved_effort = settings.active_thinking_effort
787
789
  try:
788
- return normalize_thinking_effort(provider, model, explicit_effort)
790
+ return normalize_thinking_effort(
791
+ provider, model, explicit_effort if explicit_effort is not None else saved_effort
792
+ )
789
793
  except ValueError as exc:
794
+ if saved_effort is not None and explicit_effort is None:
795
+ # A saved effort can outlive a catalog change; fall back to the default
796
+ # instead of locking startup. Explicit requests still error.
797
+ return normalize_thinking_effort(provider, model, None)
790
798
  raise CliConfigError(str(exc)) from exc
791
799
 
792
800
 
@@ -971,6 +979,7 @@ def build_agent_config(
971
979
  ollama_cloud_api_key=_api_key_for_provider(ModelProvider.OLLAMA_CLOUD, loaded_env, settings),
972
980
  openrouter_api_key=_api_key_for_provider(ModelProvider.OPENROUTER, loaded_env, settings),
973
981
  thinking_machines_api_key=_api_key_for_provider(ModelProvider.THINKING_MACHINES, loaded_env, settings),
982
+ perplexity_api_key=_api_key_for_provider(ModelProvider.PERPLEXITY_AGENT, loaded_env, settings),
974
983
  environment=overrides.environment or loaded_env.get("KOLEGA_CODE_ENVIRONMENT", "development"),
975
984
  edit_protocol=edit_protocol,
976
985
  long_context_config=_model_config(