kolega-code 0.28.3__tar.gz → 0.29.0__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 (442) hide show
  1. {kolega_code-0.28.3 → kolega_code-0.29.0}/CHANGELOG.md +32 -0
  2. {kolega_code-0.28.3 → kolega_code-0.29.0}/PKG-INFO +1 -1
  3. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/__init__.py +3 -2
  4. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/__init__.py +1 -1
  5. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/baseagent.py +4 -0
  6. kolega_code-0.29.0/kolega_code/agent/compression.py +324 -0
  7. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/context.py +5 -0
  8. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/conversation.py +5 -0
  9. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/auxiliary/compression/summary.user.md.j2 +1 -1
  10. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/tool_backend/terminal_tool.py +3 -0
  11. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/tool_backend/web_fetch_tool.py +3 -0
  12. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/cli/config.py +276 -17
  13. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/cli/main.py +51 -0
  14. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/cli/messages.py +9 -0
  15. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/cli/model_connection.py +6 -0
  16. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/cli/provider_registry.py +35 -2
  17. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/cli/settings.py +62 -1
  18. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/cli/tui/onboarding_screen.py +7 -1
  19. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/cli/tui/settings_panel.py +343 -10
  20. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/cli/tui/settings_screen.py +92 -0
  21. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/config.py +102 -2
  22. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/llm/client.py +30 -0
  23. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/llm/instrumented_client.py +6 -2
  24. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/llm/models.py +4 -0
  25. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/llm/providers/anthropic.py +1 -0
  26. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/llm/providers/openai.py +12 -3
  27. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/llm/providers/responses_common.py +9 -5
  28. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/llm/specs/__init__.py +16 -0
  29. kolega_code-0.29.0/kolega_code/llm/specs/custom_endpoints.py +156 -0
  30. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/llm/specs/thinking.py +27 -1
  31. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/llm/usage.py +20 -4
  32. {kolega_code-0.28.3 → kolega_code-0.29.0}/pyproject.toml +1 -1
  33. kolega_code-0.28.3/kolega_code/agent/compression.py +0 -166
  34. {kolega_code-0.28.3 → kolega_code-0.29.0}/.gitignore +0 -0
  35. {kolega_code-0.28.3 → kolega_code-0.29.0}/CONTRIBUTING.md +0 -0
  36. {kolega_code-0.28.3 → kolega_code-0.29.0}/LICENSE +0 -0
  37. {kolega_code-0.28.3 → kolega_code-0.29.0}/MIGRATION.md +0 -0
  38. {kolega_code-0.28.3 → kolega_code-0.29.0}/README.md +0 -0
  39. {kolega_code-0.28.3 → kolega_code-0.29.0}/RELEASING.md +0 -0
  40. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/_bundled_skills/LICENSE +0 -0
  41. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/_bundled_skills/manifest.json +0 -0
  42. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/deep-research/SKILL.md +0 -0
  43. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/deep-research/references/evidence-and-reporting.md +0 -0
  44. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/deep-research/references/gigacode-workflow.md +0 -0
  45. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/deep-research/scripts/deep-research.workflow +0 -0
  46. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/deep-research/scripts/materialize_report.py +0 -0
  47. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/docx/LICENSE +0 -0
  48. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/docx/SKILL.md +0 -0
  49. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/docx/references/examples.md +0 -0
  50. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/docx/references/limitations.md +0 -0
  51. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/docx/references/operations.md +0 -0
  52. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/docx/references/quality.md +0 -0
  53. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/docx/requirements.txt +0 -0
  54. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/docx/scripts/docx_tool.py +0 -0
  55. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/docx/scripts/smoke_test.py +0 -0
  56. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/humanizer/LICENSE +0 -0
  57. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/humanizer/SKILL.md +0 -0
  58. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/pdf/LICENSE +0 -0
  59. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/pdf/SKILL.md +0 -0
  60. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/pdf/references/examples.md +0 -0
  61. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/pdf/references/limitations.md +0 -0
  62. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/pdf/references/ocr.md +0 -0
  63. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/pdf/references/operations.md +0 -0
  64. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/pdf/references/quality.md +0 -0
  65. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/pdf/references/redaction.md +0 -0
  66. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/pdf/requirements-ocr-paddle.txt +0 -0
  67. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/pdf/requirements-ocr-surya.txt +0 -0
  68. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/pdf/requirements.txt +0 -0
  69. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/pdf/scripts/pdf_tool.py +0 -0
  70. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/pdf/scripts/smoke_test.py +0 -0
  71. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/pptx/LICENSE +0 -0
  72. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/pptx/SKILL.md +0 -0
  73. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/pptx/references/examples.md +0 -0
  74. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/pptx/references/limitations.md +0 -0
  75. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/pptx/references/operations.md +0 -0
  76. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/pptx/requirements.txt +0 -0
  77. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/pptx/scripts/pptx_tool.py +0 -0
  78. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/pptx/scripts/smoke_test.py +0 -0
  79. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/review/SKILL.md +0 -0
  80. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/review/references/github-publishing.md +0 -0
  81. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/skill-authoring/SKILL.md +0 -0
  82. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/skill-authoring/references/review-checklist.md +0 -0
  83. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/xlsx/LICENSE +0 -0
  84. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/xlsx/SKILL.md +0 -0
  85. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/xlsx/references/examples.md +0 -0
  86. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/xlsx/references/limitations.md +0 -0
  87. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/xlsx/references/operations.md +0 -0
  88. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/xlsx/references/quality.md +0 -0
  89. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/xlsx/requirements.txt +0 -0
  90. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/xlsx/scripts/smoke_test.py +0 -0
  91. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/_bundled_skills/skills/xlsx/scripts/xlsx_tool.py +0 -0
  92. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/browseragent.py +0 -0
  93. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/coder.py +0 -0
  94. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/common.py +0 -0
  95. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/custom_agents.py +0 -0
  96. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/edit_protocols.py +0 -0
  97. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/errors.py +0 -0
  98. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/eval/__init__.py +0 -0
  99. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/eval/bridge.py +0 -0
  100. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/eval/bundle-requirements.in +0 -0
  101. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/eval/bundle-requirements.txt +0 -0
  102. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/eval/env.py +0 -0
  103. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/eval/js_kernel.py +0 -0
  104. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/eval/kernel.py +0 -0
  105. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/eval/prelude.js +0 -0
  106. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/eval/prelude.py +0 -0
  107. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/eval/protocol.py +0 -0
  108. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/eval/py_kernel.py +0 -0
  109. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/eval/runner.js +0 -0
  110. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/eval/runner.py +0 -0
  111. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/generalagent.py +0 -0
  112. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/goal.py +0 -0
  113. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/investigationagent.py +0 -0
  114. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/model_routing.py +0 -0
  115. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/orchestration/__init__.py +0 -0
  116. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/orchestration/accounting.py +0 -0
  117. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/orchestration/budget.py +0 -0
  118. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/orchestration/context.py +0 -0
  119. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/orchestration/errors.py +0 -0
  120. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/orchestration/executor.py +0 -0
  121. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/orchestration/guide.py +0 -0
  122. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/orchestration/journal.py +0 -0
  123. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/orchestration/runtime.py +0 -0
  124. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/orchestration/types.py +0 -0
  125. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/planningagent.py +0 -0
  126. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/prompt_dump.py +0 -0
  127. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/prompt_overrides.py +0 -0
  128. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/prompt_provider.py +0 -0
  129. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/auxiliary/agent_loop/silent_turn_exhausted.user.md +0 -0
  130. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/auxiliary/agent_loop/silent_turn_nudge.user.md.j2 +0 -0
  131. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/auxiliary/agent_loop/truncated_turn_nudge.user.md.j2 +0 -0
  132. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/auxiliary/compression/summary.system.md +0 -0
  133. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/auxiliary/terminal/output_summary.system.md +0 -0
  134. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/auxiliary/terminal/safety.system.md +0 -0
  135. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/extensions/cli/build_questions.md +0 -0
  136. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/extensions/cli/current_plan_artifact.md.j2 +0 -0
  137. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/extensions/cli/mode_switch_notice.md.j2 +0 -0
  138. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/extensions/cli/planning_questions.md +0 -0
  139. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/extensions/cli/scratchpad.md.j2 +0 -0
  140. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/extensions/cli/shared_task_list.md +0 -0
  141. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/extensions/cli/shared_task_list_readonly.md +0 -0
  142. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/extensions/cli/worktree_control.md.j2 +0 -0
  143. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/extensions/skills/catalog.md.j2 +0 -0
  144. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/system/agents/browser.md.j2 +0 -0
  145. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/system/agents/coder_ask.md.j2 +0 -0
  146. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/system/agents/coder_base.md.j2 +0 -0
  147. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/system/agents/coder_cli.md.j2 +0 -0
  148. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/system/agents/general.md.j2 +0 -0
  149. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/system/agents/investigation.md.j2 +0 -0
  150. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/system/agents/planning.md.j2 +0 -0
  151. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/system/includes/agents_md_instructions.md +0 -0
  152. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/system/includes/context_updates.md +0 -0
  153. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/system/includes/environment_variables/workspace_env_vars.md +0 -0
  154. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/system/includes/frontend_guidance.md +0 -0
  155. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/system/includes/starter_templates/expo.md +0 -0
  156. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/system/includes/starter_templates/html_website.md +0 -0
  157. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/system/includes/starter_templates/mern_stack.md +0 -0
  158. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/system/includes/starter_templates/react_vite_shadcdn.md +0 -0
  159. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/system/includes/terminal_tools.md +0 -0
  160. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/apply_patch.md +0 -0
  161. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/ask_user_choice.md +0 -0
  162. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/browser_click.md +0 -0
  163. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/browser_close.md +0 -0
  164. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/browser_console_messages.md +0 -0
  165. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/browser_drag.md +0 -0
  166. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/browser_drop.md +0 -0
  167. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/browser_evaluate.md +0 -0
  168. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/browser_file_upload.md +0 -0
  169. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/browser_fill_form.md +0 -0
  170. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/browser_find.md +0 -0
  171. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/browser_handle_dialog.md +0 -0
  172. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/browser_hover.md +0 -0
  173. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/browser_navigate.md +0 -0
  174. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/browser_navigate_back.md +0 -0
  175. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/browser_network_request.md +0 -0
  176. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/browser_network_requests.md +0 -0
  177. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/browser_press_key.md +0 -0
  178. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/browser_resize.md +0 -0
  179. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/browser_scroll.md +0 -0
  180. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/browser_select_option.md +0 -0
  181. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/browser_snapshot.md +0 -0
  182. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/browser_tabs.md +0 -0
  183. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/browser_take_screenshot.md +0 -0
  184. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/browser_type.md +0 -0
  185. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/browser_wait_for.md +0 -0
  186. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/build_backend.md +0 -0
  187. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/build_frontend.md +0 -0
  188. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/claude_edit.md +0 -0
  189. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/claude_write.md +0 -0
  190. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/dispatch_agent.md +0 -0
  191. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/edit.md +0 -0
  192. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/eval.md +0 -0
  193. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/exec_command.md +0 -0
  194. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/get_host.md +0 -0
  195. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/get_task_list.md +0 -0
  196. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/get_task_list_readonly.md +0 -0
  197. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/hashline_edit.md +0 -0
  198. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/hashline_write.md +0 -0
  199. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/kill_command.md +0 -0
  200. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/list_sessions.md +0 -0
  201. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/list_subagent_models.md +0 -0
  202. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/list_workflow_runs.md +0 -0
  203. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/lsp.md +0 -0
  204. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/lsp_edit.md +0 -0
  205. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/multi_edit.md +0 -0
  206. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/read.md +0 -0
  207. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/read_image.md +0 -0
  208. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/resolve.md +0 -0
  209. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/run_workflow.md +0 -0
  210. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/set_goal.md +0 -0
  211. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/skill.md +0 -0
  212. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/snapshot.md +0 -0
  213. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/switch_worktree.md +0 -0
  214. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/update_task_list.md +0 -0
  215. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/web_fetch.md +0 -0
  216. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/web_search.md +0 -0
  217. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/write.md +0 -0
  218. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/write_plan.md +0 -0
  219. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/tools/write_stdin.md +0 -0
  220. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/user_tasks/cli/implement_plan.md.j2 +0 -0
  221. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/prompt_templates/user_tasks/cli/init_agents.md.j2 +0 -0
  222. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/prompts.py +0 -0
  223. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/tool_backend/agent_tool.py +0 -0
  224. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/tool_backend/base_tool.py +0 -0
  225. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/tool_backend/browser_tool.py +0 -0
  226. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/tool_backend/build_tool.py +0 -0
  227. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/tool_backend/codex_patch.py +0 -0
  228. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/tool_backend/edit_preview.py +0 -0
  229. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/tool_backend/edit_tool.py +0 -0
  230. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/tool_backend/eval_tool.py +0 -0
  231. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/tool_backend/hashline_v2.py +0 -0
  232. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/tool_backend/lsp_tool.py +0 -0
  233. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/tool_backend/memory_tool.py +0 -0
  234. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/tool_backend/network_status.py +0 -0
  235. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/tool_backend/read_file_tool.py +0 -0
  236. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/tool_backend/read_image_tool.py +0 -0
  237. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/tool_backend/search_backends/__init__.py +0 -0
  238. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/tool_backend/search_backends/base.py +0 -0
  239. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/tool_backend/search_backends/duckduckgo.py +0 -0
  240. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/tool_backend/search_backends/errors.py +0 -0
  241. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/tool_backend/search_backends/firecrawl.py +0 -0
  242. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/tool_backend/search_backends/models.py +0 -0
  243. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/tool_backend/search_backends/searxng.py +0 -0
  244. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/tool_backend/search_backends/tavily.py +0 -0
  245. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/tool_backend/snapshot_tool.py +0 -0
  246. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/tool_backend/streaming_tool.py +0 -0
  247. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/tool_backend/web_fetch/__init__.py +0 -0
  248. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/tool_backend/web_fetch/answering.py +0 -0
  249. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/tool_backend/web_fetch/documents.py +0 -0
  250. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/tool_backend/web_fetch/extractors.py +0 -0
  251. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/tool_backend/web_fetch/pipeline.py +0 -0
  252. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/tool_backend/web_fetch/retrieval.py +0 -0
  253. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/tool_backend/web_search_tool.py +0 -0
  254. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/tool_backend/workflow_tool.py +0 -0
  255. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/tool_definitions.py +0 -0
  256. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/tools.py +0 -0
  257. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/utils/commands.py +0 -0
  258. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/agent/volatile_context.py +0 -0
  259. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/auth/__init__.py +0 -0
  260. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/auth/_jwt.py +0 -0
  261. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/auth/chatgpt_oauth.py +0 -0
  262. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/auth/constants.py +0 -0
  263. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/auth/tokens.py +0 -0
  264. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/browser_extension/__init__.py +0 -0
  265. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/browser_extension/framing.py +0 -0
  266. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/browser_extension/installer.py +0 -0
  267. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/browser_extension/manager.py +0 -0
  268. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/browser_extension/multiplex.py +0 -0
  269. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/browser_extension/native_host.py +0 -0
  270. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/browser_extension/protocol.py +0 -0
  271. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/browser_extension/registry.py +0 -0
  272. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/browser_extension/runtime.py +0 -0
  273. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/cli/__init__.py +0 -0
  274. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/cli/app.py +0 -0
  275. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/cli/ask_output.py +0 -0
  276. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/cli/atif_export.py +0 -0
  277. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/cli/browser_backend.py +0 -0
  278. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/cli/clipboard_image.py +0 -0
  279. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/cli/connection.py +0 -0
  280. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/cli/cron.py +0 -0
  281. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/cli/diagnostics.py +0 -0
  282. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/cli/file_index.py +0 -0
  283. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/cli/goal.py +0 -0
  284. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/cli/loop.py +0 -0
  285. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/cli/mentions.py +0 -0
  286. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/cli/model_catalog.py +0 -0
  287. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/cli/plan_artifacts.py +0 -0
  288. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/cli/session_event_protocol.py +0 -0
  289. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/cli/session_event_store.py +0 -0
  290. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/cli/session_journal.py +0 -0
  291. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/cli/session_store.py +0 -0
  292. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/cli/session_usage.py +0 -0
  293. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/cli/skills.py +0 -0
  294. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/cli/slash_commands.py +0 -0
  295. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/cli/theme.py +0 -0
  296. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/cli/tui/__init__.py +0 -0
  297. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/cli/tui/agent_runtime.py +0 -0
  298. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/cli/tui/app_base.py +0 -0
  299. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/cli/tui/changes_screen.py +0 -0
  300. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/cli/tui/command_handlers.py +0 -0
  301. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/cli/tui/constants.py +0 -0
  302. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/cli/tui/custom_model.py +0 -0
  303. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/cli/tui/loop_runtime.py +0 -0
  304. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/cli/tui/memory_screen.py +0 -0
  305. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/cli/tui/pacing.py +0 -0
  306. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/cli/tui/prompt_flows.py +0 -0
  307. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/cli/tui/session_diff.py +0 -0
  308. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/cli/tui/state.py +0 -0
  309. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/cli/tui/status_dashboard.py +0 -0
  310. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/cli/tui/styles.tcss +0 -0
  311. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/cli/tui/sub_agent_screen.py +0 -0
  312. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/cli/tui/terminal_display.py +0 -0
  313. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/cli/tui/transcript.py +0 -0
  314. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/cli/tui/widgets.py +0 -0
  315. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/cli/updater.py +0 -0
  316. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/events.py +0 -0
  317. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/extensions.py +0 -0
  318. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/git_env.py +0 -0
  319. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/hooks/__init__.py +0 -0
  320. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/hooks/backends.py +0 -0
  321. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/hooks/config.py +0 -0
  322. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/hooks/dispatcher.py +0 -0
  323. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/hooks/events.py +0 -0
  324. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/hooks/matcher.py +0 -0
  325. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/hooks/outcome.py +0 -0
  326. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/llm/exceptions.py +0 -0
  327. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/llm/ledger.py +0 -0
  328. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/llm/providers/__init__.py +0 -0
  329. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/llm/providers/_token_encoding.py +0 -0
  330. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/llm/providers/base.py +0 -0
  331. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/llm/providers/chatgpt_oauth.py +0 -0
  332. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/llm/providers/deepseek_responses.py +0 -0
  333. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/llm/providers/google.py +0 -0
  334. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/llm/providers/models.py +0 -0
  335. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/llm/providers/openai_responses.py +0 -0
  336. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/llm/providers/tinker.py +0 -0
  337. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/llm/providers/tinker_trace.py +0 -0
  338. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/llm/ratelimit.py +0 -0
  339. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/llm/specs/accessors.py +0 -0
  340. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/llm/specs/catalog/__init__.py +0 -0
  341. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/llm/specs/catalog/anthropic.py +0 -0
  342. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/llm/specs/catalog/dashscope.py +0 -0
  343. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/llm/specs/catalog/deepseek.py +0 -0
  344. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/llm/specs/catalog/fireworks.py +0 -0
  345. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/llm/specs/catalog/google.py +0 -0
  346. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/llm/specs/catalog/kimi_coding.py +0 -0
  347. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/llm/specs/catalog/moonshot.py +0 -0
  348. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/llm/specs/catalog/ollama_cloud.py +0 -0
  349. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/llm/specs/catalog/openai.py +0 -0
  350. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/llm/specs/catalog/openai_chatgpt.py +0 -0
  351. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/llm/specs/catalog/openrouter.py +0 -0
  352. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/llm/specs/catalog/thinking_machines.py +0 -0
  353. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/llm/specs/catalog/tinker.py +0 -0
  354. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/llm/specs/catalog/together.py +0 -0
  355. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/llm/specs/catalog/xai.py +0 -0
  356. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/llm/specs/catalog/zai.py +0 -0
  357. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/llm/specs/ollama_cloud_catalog.py +0 -0
  358. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/llm/specs/openrouter_catalog.py +0 -0
  359. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/llm/specs/tinker_catalog.py +0 -0
  360. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/llm/specs/types.py +0 -0
  361. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/llm/specs/validation.py +0 -0
  362. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/llm/timeouts.py +0 -0
  363. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/llm/tool_execution_ids.py +0 -0
  364. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/local_state.py +0 -0
  365. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/mcp/__init__.py +0 -0
  366. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/mcp/config.py +0 -0
  367. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/mcp/oauth.py +0 -0
  368. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/mcp/service.py +0 -0
  369. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/mcp/state.py +0 -0
  370. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/mcp/tools.py +0 -0
  371. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/mcp/transport.py +0 -0
  372. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/memory/__init__.py +0 -0
  373. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/memory/identity.py +0 -0
  374. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/memory/manager.py +0 -0
  375. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/memory/manifest.py +0 -0
  376. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/memory/markdown.py +0 -0
  377. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/memory/models.py +0 -0
  378. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/memory/protocol.py +0 -0
  379. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/memory/registry.py +0 -0
  380. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/models/__init__.py +0 -0
  381. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/models/sandbox_terminal_state.py +0 -0
  382. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/permissions.py +0 -0
  383. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/runtime.py +0 -0
  384. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/sandbox/README.md +0 -0
  385. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/sandbox/__init__.py +0 -0
  386. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/sandbox/async_filesystem.py +0 -0
  387. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/sandbox/base.py +0 -0
  388. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/sandbox/browser.py +0 -0
  389. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/sandbox/event_loop.py +0 -0
  390. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/sandbox/filesystem.py +0 -0
  391. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/sandbox/local.py +0 -0
  392. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/sandbox/serializer.py +0 -0
  393. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/sandbox/terminal.py +0 -0
  394. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/sandbox/utils.py +0 -0
  395. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/scratchpad.py +0 -0
  396. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/security/__init__.py +0 -0
  397. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/security/secrets.py +0 -0
  398. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/services/base.py +0 -0
  399. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/services/browser.py +0 -0
  400. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/services/file_system.py +0 -0
  401. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/services/html.py +0 -0
  402. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/services/lsp/__init__.py +0 -0
  403. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/services/lsp/client.py +0 -0
  404. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/services/lsp/config.py +0 -0
  405. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/services/lsp/detector.py +0 -0
  406. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/services/lsp/diagnostics.py +0 -0
  407. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/services/lsp/edits.py +0 -0
  408. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/services/lsp/manager.py +0 -0
  409. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/services/lsp/registry.py +0 -0
  410. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/services/lsp/registry.yaml +0 -0
  411. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/services/snapshots.py +0 -0
  412. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/services/terminal.py +0 -0
  413. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/services/terminal_buffer.py +0 -0
  414. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/services/workspace_scan.py +0 -0
  415. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/session/__init__.py +0 -0
  416. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/session/control.py +0 -0
  417. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/session/inmemory.py +0 -0
  418. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/session/projection.py +0 -0
  419. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/session/recording.py +0 -0
  420. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/session/runtime.py +0 -0
  421. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/session/store.py +0 -0
  422. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/testing/__init__.py +0 -0
  423. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/testing/store_conformance.py +0 -0
  424. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/tools/__init__.py +0 -0
  425. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/tools/core.py +0 -0
  426. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/tools/definitions.py +0 -0
  427. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/tools/param_aliases.py +0 -0
  428. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/tools/registry.py +0 -0
  429. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/utils/__init__.py +0 -0
  430. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/utils/images.py +0 -0
  431. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/web/__init__.py +0 -0
  432. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/web/assets/fold.js +0 -0
  433. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/web/assets/player.css +0 -0
  434. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/web/assets/player.html +0 -0
  435. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/web/assets/player.js +0 -0
  436. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/web/bundle.py +0 -0
  437. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/web/hosting.py +0 -0
  438. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/web/redaction.py +0 -0
  439. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/web/server.py +0 -0
  440. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/web/singlefile.py +0 -0
  441. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/web/theme_css.py +0 -0
  442. {kolega_code-0.28.3 → kolega_code-0.29.0}/kolega_code/worktrees.py +0 -0
@@ -6,6 +6,38 @@ This project uses GitHub Releases for detailed generated release notes. This fil
6
6
 
7
7
  ## Unreleased
8
8
 
9
+ ## 0.29.0 - 2026-08-13
10
+
11
+ ### Added
12
+
13
+ - Custom endpoints: use models from any OpenAI Chat Completions, OpenAI
14
+ Responses, or Anthropic Messages-compatible server (LM Studio, Ollama, vLLM,
15
+ ...). Define endpoints under `custom_endpoints` in settings.json or via the
16
+ `--custom-endpoints` / `--endpoint-url` flags and `KOLEGA_CODE_CUSTOM_ENDPOINTS`
17
+ / `KOLEGA_CODE_ENDPOINT_*` environment variables (never persisted), then select
18
+ them as `custom:<id>` anywhere a provider is chosen. Supports thinking-effort
19
+ modes per wire dialect and native reasoning replay.
20
+
21
+ - Custom endpoints accept a `temperature` field (per endpoint, or per model in
22
+ its `models` map; default 1.0), exposed in the TUI endpoint editor, via
23
+ `--endpoint-temperature`, and via `KOLEGA_CODE_ENDPOINT_TEMPERATURE`. Sent on
24
+ Chat Completions and Anthropic requests; ignored by Responses-style endpoints.
25
+
26
+ ### Fixed
27
+
28
+ - Together models (e.g. Kimi K2.7-Code) now replay prior reasoning through the
29
+ native `reasoning` field instead of visible `*Thinking:*` text, avoiding a full
30
+ re-derivation of the chain-of-thought on every turn. Reasoning models without a
31
+ declared thinking-effort spec now resolve their provider's replay field.
32
+
33
+ ## 0.28.4 - 2026-08-12
34
+
35
+ ### Fixed
36
+
37
+ - Conversation compaction now keeps the summarization request within the run's
38
+ input token budget, so auto-compaction no longer fails on long conversations
39
+ and lets the run continue instead of aborting.
40
+
9
41
  ## 0.28.3 - 2026-08-12
10
42
 
11
43
  ### Changed
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: kolega-code
3
- Version: 0.28.3
3
+ Version: 0.29.0
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/
@@ -22,7 +22,7 @@ from .agent.errors import AgentError, MaxAgentIterationsExceeded
22
22
  from .events import AgentEventEmitter
23
23
 
24
24
  # Configuration
25
- from .config import AgentConfig, ModelConfig, ModelProvider, RateLimitConfig
25
+ from .config import AgentConfig, CustomEndpointConfig, ModelConfig, ModelProvider, RateLimitConfig
26
26
 
27
27
  # Events and connection management
28
28
  from .events import AgentConnectionManager
@@ -108,6 +108,7 @@ __all__ = [
108
108
  "AgentEventEmitter",
109
109
  # Configuration
110
110
  "AgentConfig",
111
+ "CustomEndpointConfig",
111
112
  "ModelConfig",
112
113
  "ModelProvider",
113
114
  "RateLimitConfig",
@@ -173,4 +174,4 @@ __all__ = [
173
174
  "parse_git_status_output",
174
175
  ]
175
176
 
176
- __version__ = "0.28.3"
177
+ __version__ = "0.29.0"
@@ -51,4 +51,4 @@ __all__ = [
51
51
  "ToolExtension",
52
52
  ]
53
53
 
54
- __version__ = "0.28.3"
54
+ __version__ = "0.29.0"
@@ -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
@@ -1740,6 +1741,7 @@ class BaseAgent(LogMixin):
1740
1741
 
1741
1742
  from kolega_code.llm.client import LLMClient
1742
1743
 
1744
+ endpoint = self.config.custom_endpoint_for(model_config)
1743
1745
  client = LLMClient(
1744
1746
  provider=model_config.provider.value,
1745
1747
  api_key=self.config.get_api_key(model_config.provider) or "",
@@ -1750,6 +1752,8 @@ class BaseAgent(LogMixin):
1750
1752
  token_manager=self.config.get_chatgpt_token_manager(),
1751
1753
  usage_ledger=self.usage_ledger,
1752
1754
  trace_sink=self.llm_trace_sink,
1755
+ base_url=endpoint.base_url if endpoint else None,
1756
+ api_style=endpoint.api_style if endpoint else None,
1753
1757
  )
1754
1758
  with llm_call_origin(helper_origin("hook_prompt")):
1755
1759
  response = await client.generate(
@@ -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)
@@ -113,6 +113,7 @@ class AgentContext:
113
113
  itself is still passed per call.
114
114
  """
115
115
  model_config = self.config.model_config_for_agent(agent_name)
116
+ endpoint = self.config.custom_endpoint_for(model_config)
116
117
 
117
118
  if self.telemetry.langfuse_client:
118
119
  return InstrumentedLLMClient(
@@ -135,6 +136,8 @@ class AgentContext:
135
136
  trace_sink=self.telemetry.llm_trace_sink,
136
137
  context_window_tokens=self.config.context_window_tokens,
137
138
  max_output_tokens=self.config.max_output_tokens,
139
+ base_url=endpoint.base_url if endpoint else None,
140
+ api_style=endpoint.api_style if endpoint else None,
138
141
  )
139
142
 
140
143
  return LLMClient(
@@ -149,4 +152,6 @@ class AgentContext:
149
152
  trace_sink=self.telemetry.llm_trace_sink,
150
153
  context_window_tokens=self.config.context_window_tokens,
151
154
  max_output_tokens=self.config.max_output_tokens,
155
+ base_url=endpoint.base_url if endpoint else None,
156
+ api_style=endpoint.api_style if endpoint else None,
152
157
  )
@@ -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.
@@ -97,6 +97,7 @@ class TerminalTool(BaseTool):
97
97
  provider = self.config.fast_config.provider
98
98
  api_key = self.config.get_api_key(provider)
99
99
  rate_limits = self.config.fast_config.rate_limits
100
+ endpoint = self.config.custom_endpoint_for(self.config.fast_config)
100
101
 
101
102
  client = LLMClient(
102
103
  provider=provider.value,
@@ -108,6 +109,8 @@ class TerminalTool(BaseTool):
108
109
  token_manager=self.config.get_chatgpt_token_manager(),
109
110
  usage_ledger=getattr(self.caller, "usage_ledger", None),
110
111
  trace_sink=getattr(self.caller, "llm_trace_sink", None),
112
+ base_url=endpoint.base_url if endpoint else None,
113
+ api_style=endpoint.api_style if endpoint else None,
111
114
  )
112
115
 
113
116
  try:
@@ -146,6 +146,7 @@ class WebFetchTool(StreamingTool):
146
146
  def _build_client(self) -> LLMClient:
147
147
  provider = self.config.fast_config.provider
148
148
  rate_limits = self.config.fast_config.rate_limits
149
+ endpoint = self.config.custom_endpoint_for(self.config.fast_config)
149
150
  client_kwargs = {
150
151
  "provider": provider.value,
151
152
  "api_key": self.config.get_api_key(provider),
@@ -156,6 +157,8 @@ class WebFetchTool(StreamingTool):
156
157
  "token_manager": self.config.get_chatgpt_token_manager(),
157
158
  "usage_ledger": getattr(self.caller, "usage_ledger", None),
158
159
  "trace_sink": getattr(self.caller, "llm_trace_sink", None),
160
+ "base_url": endpoint.base_url if endpoint else None,
161
+ "api_style": endpoint.api_style if endpoint else None,
159
162
  }
160
163
  caller_llm = getattr(self.caller, "llm", None)
161
164
  if isinstance(caller_llm, InstrumentedLLMClient):